アセンブラファイルとテストの整理
[YACASL2.git] / as / FUNC / mula0.casl
diff --git a/as/FUNC/mula0.casl b/as/FUNC/mula0.casl
new file mode 100644 (file)
index 0000000..e21184c
--- /dev/null
@@ -0,0 +1,53 @@
+;GR1の値とGR2の値の積をGR0に格納
+MULA    START
+        RPUSH
+        LAD     GR3,0           ; インデックス
+        LAD     GR4,0           ; マイナスフラグ
+CHK1    CALL    CHKVAL          ; (GR1 < 0)の場合は正負を反転させ、GR0 <- 1
+        JOV     MFIN
+        LD      GR4,GR0         ; マイナスフラグをオン
+CHK2    PUSH    0,GR1           ; GR1を退避
+        LD      GR1,GR2         ; GR2をGR1へロード
+        CALL    CHKVAL          ; (GR1 < 0)の場合は正負を反転させ、GR0 <- 1
+        JOV     C2OV
+        LD      GR2,GR1         ; GR1をGR2へロード
+        XOR     GR4,GR0         ; マイナスフラグを反転
+        POP     GR1             ; GR1を復元
+        LAD     GR0,0           ; 積
+        JUMP    MLOOP
+C2OV    POP     GR1             ; 
+        JUMP    MFIN
+MLOOP   CPA     GR2,GR3         ; ループ先頭。(GR2 = GR3)の場合、ループ脱出
+        JZE     MMIN            ; ↓
+        ADDA    GR0,GR1         ; GR0 <- GR0 + GR1
+        JOV     MFIN            ; オーバーフローした場合、ループ脱出
+        LAD     GR3,1,GR3       ; GR3 <- GR3 + 1
+        JUMP    MLOOP           ; ループ終端
+MMIN    AND     GR4,GR4         ; マイナスフラグがオフの場合、MFINへジャンプ
+        JZE     MFIN            ; ↓
+        PUSH    0,GR1           ; GR1を退避
+        LD      GR1,GR0         ; GR1にGR0をロード
+        CALL    MABS            ; GR1を絶対値に変換
+        JOV     MMF             ; オーバーフロー(GR1 = -32768)の場合、MMFへジャンプ
+        LD      GR0,GR1         ; GR0にGR1をロード
+MMF     POP     GR1             ; GR1を復元
+MFIN    RPOP
+        RET
+        END
+;;; GR1が0未満の場合は、絶対値に変換し、GR0に1を設定
+CHKVAL  START
+        LAD     GR0,0
+        AND     GR1,GR1         ; (GR1 >= 0)の場合は、CFINへジャンプ
+        JPL     CFIN            ; ↓
+        JZE     CFIN            ; ↓
+        LAD     GR0,1           ; GR0に1をロード
+        CALL    MABS            ; GR1を絶対値に変換
+CFIN    RET
+        END
+;;; GR1の値の正負を反転させる。
+;;; 例: -10 -> 10、10 -> -10
+MABS    START
+        XOR     GR1,=#FFFF      ; GR1のビット値を反転
+        ADDA    GR1,=1          ; GR1 <- GR1 + 1
+        RET
+        END