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