--- /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