アセンブラファイルとテストの整理
[YACASL2.git] / as / FUNC / mula1.casl
1 ;GR1の値とGR2の値の積をGR0に格納
2 MULA    START
3         RPUSH
4         XOR     GR0,GR0         ; 積
5         LAD     GR3,1           ; 対象ビット
6         XOR     GR4,GR4         ; マイナスフラグ
7 CHK1    CALL    CHKVAL          ; (GR1 < 0)の場合は正負を反転させ、GR0 <- 1
8         JOV     MFIN
9         LD      GR4,GR0         ; マイナスフラグをオン
10 CHK2    PUSH    0,GR1           ; GR1を退避
11         LD      GR1,GR2         ; GR2をGR1へロード
12         CALL    CHKVAL          ; (GR1 < 0)の場合は正負を反転させ、GR0 <- 1
13         JOV     C2OV
14         LD      GR2,GR1         ; GR1をGR2へロード
15         XOR     GR4,GR0         ; マイナスフラグを反転
16 C2FIN   POP     GR1             ; GR1を復元
17         XOR     GR0,GR0         ; GR0を初期化
18         JUMP    MLOOP           ; MLOOPへジャンプ
19 C2OV    POP     GR1             ; GR1を復元
20         JUMP    MFIN            ; MFINへジャンプ
21 MLOOP   PUSH    0,GR3           ; ループ先頭。GR2の、GR3が示したビットが0の場合、MNEXTへジャンプ
22         AND     GR3,GR2         ; ↓
23         POP     GR3             ; ↓
24         JZE     MNEXT           ; ↓
25         ADDA    GR0,GR1         ; GR0 <- GR0 + GR1
26         JOV     MFIN            ; オーバーフローした場合、ループ脱出
27 MNEXT   SLA     GR3,1           ; GR3を1回左シフト
28         AND     GR3,GR3         ; (GR3 = 0)の場合、ループ脱出
29         JZE     MMIN            ; ↓
30         CPL     GR3,GR2         ; (GR3 > GR2)の場合、ループ脱出
31         JPL     MMIN            ; ↓
32         SLA     GR1,1           ; GR1を1回左シフト
33         JOV     MFIN            ; オーバーフローした場合、ループ脱出
34         JUMP    MLOOP           ; ループ終端
35 MMIN    AND     GR4,GR4         ; マイナスフラグがオフの場合、MFINへジャンプ
36         JZE     MFIN            ; ↓
37         LD      GR1,GR0         ; GR1にGR0をロード
38         CALL    MABS            ; GR1の正負を反転
39         JOV     MFIN            ; オーバーフロー(GR1 = -32768)の場合、MFINへジャンプ
40         LD      GR0,GR1         ; GR0にGR1をロード
41 MFIN    RPOP
42         RET
43         END
44 ;;; GR1が0未満の場合は、絶対値に変換し、GR0に1を設定
45 CHKVAL  START
46         LAD     GR0,0
47         AND     GR1,GR1         ; (GR1 >= 0)の場合は、CFINへジャンプ
48         JPL     CFIN            ; ↓
49         JZE     CFIN            ; ↓
50         LAD     GR0,1           ; GR0に1をロード
51         CALL    MABS            ; GR1を絶対値に変換
52 CFIN    RET
53         END
54 ;;; GR1の値の正負を反転させる。
55 ;;; 例: -10 -> 10、10 -> -10
56 MABS    START
57         XOR     GR1,=#FFFF       ; GR1のビット値を反転
58         ADDA    GR1,=1           ; GR1 <- GR1 + 1
59         RET
60         END