;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