X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=as%2Fcasl2lib%2Fmula.casl;h=2ac0524114c0f6bda3255bfb71ce61dcabe6b531;hb=e93fac80fa9e8b7062ef77219c22f338d84387f0;hp=431486a41aa4f58c3f44303c2be9975ff306e740;hpb=f1c529569b4b1c9b03792c1ae2fd5fd670fe7f5d;p=YACASL2.git diff --git a/as/casl2lib/mula.casl b/as/casl2lib/mula.casl index 431486a..2ac0524 100644 --- a/as/casl2lib/mula.casl +++ b/as/casl2lib/mula.casl @@ -39,3 +39,29 @@ FIN RPOP ONE DC 1 ALLON DC #FFFF END +;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う +;;; 入力 GR1:被乗数 GR2:乗数 +;;; 出力 GR3:積 +;;; 積が65535より大きい場合は、オーバーフロー +MULL START + XOR GR3,GR3 ; GR3の初期化 + AND GR1,GR1 ; GR1 = 0 の場合、FINへジャンプ + JZE FIN ; ↓ + AND GR2,GR2 ; GR2 = 0 の場合、FINへジャンプ + JZE FIN ; ↓ + PUSH 0,GR1 ; GR1の退避 + PUSH 0,GR2 ; GR2の退避 +LOOP SRL GR2,1 ; ループ開始。SRLを1つ右シフト + JOV ON ; 乗数の最下位ビットが1の場合、ONへジャンプ + JUMP NEXT ; NEXTへジャンプ +ON ADDL GR3,GR1 ; GR3 <- GR3 + GR1 + JOV POST ; GR3がオーバーフローした場合、POSTへジャンプ +NEXT AND GR2,GR2 ; GR2 = 0 の場合、POSTへジャンプ + JZE POST ; ↓ + SLL GR1,1 ; GR1を1つ左シフト + JOV POST ; GR1がオーバーフローした場合、POSTへジャンプ + JUMP LOOP ; ループ終端 +POST POP GR2 ; GR2の復元 + POP GR1 ; GR1の復元 +FIN RET + END