+++ /dev/null
-;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