X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=as%2FFUNC%2Fmull1.casl;h=7de759bdc84ff3ae4b61d38636ac1089bdbf34a3;hp=86a655794cfe79cc7b9e54918277cde8a50b43fe;hb=d58121c34669a809d4199741cb03fe53df309d9c;hpb=6a9e7118e7f1a32304a1ffba0cb7a4b44f90d9fe diff --git a/as/FUNC/mull1.casl b/as/FUNC/mull1.casl index 86a6557..7de759b 100644 --- a/as/FUNC/mull1.casl +++ b/as/FUNC/mull1.casl @@ -1,24 +1,31 @@ -;;; GR1の値とGR2の値の積をGR0に格納 +;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う +;;; 入力 GR1:被乗数 GR2:乗数 +;;; 出力 GR0:積 +;;; 積が65535より大きい場合は、GR0は積の下位16ビットになり、オーバーフロー MULL START - RPUSH + PUSH 0,GR1 + PUSH 0,GR3 XOR GR0,GR0 ; 積 - LAD GR4,1 ; 対象ビット -LOOP PUSH 0,GR4 ; ループ先頭。GR2の、GR4が示したビットが0の場合、NEXTへジャンプ - AND GR4,GR2 ; ↓ - POP GR4 ; ↓ + AND GR1,GR1 ; (GR1 = 0)の場合、終了 + JZE FIN ; ↓ + AND GR2,GR2 ; (GR2 = 0)の場合、終了 + JZE FIN ; ↓ + LAD GR3,1 ; 対象ビット +LOOP PUSH 0,GR3 ; ループ先頭。GR2のビット中でGR3が示すビットが0の場合、NEXTへジャンプ + AND GR3,GR2 ; ↓ + POP GR3 ; ↓ JZE NEXT ; ↓ ADDL GR0,GR1 ; GR0 <- GR0 + GR1 - JOV FIN ; オーバーフローした場合、OVPへジャンプ -NEXT SLL GR4,1 ; GR4を1回左シフト - AND GR4,GR4 ; (GR4 = 0)の場合、ループ脱出 + JOV FIN ; GR0がオーバーフローした場合、ループ脱出 +NEXT SLL GR3,1 ; GR3を1回左シフト + AND GR3,GR3 ; (GR3 = 0)の場合、ループ脱出 JZE FIN ; ↓ - CPL GR4,GR2 ; (GR4 > GR2)の場合、ループ脱出 + CPL GR3,GR2 ; (GR3 > GR2)の場合、ループ脱出 JPL FIN ; ↓ SLL GR1,1 ; GR1を1回左シフト - JOV FIN ; オーバーフローした場合、ループ脱出 + JOV FIN ; GR1がオーバーフローした場合、ループ脱出 JUMP LOOP ; ループ終端 -OVP ADDL GR3,=1 - JUMP NEXT -FIN RPOP +FIN POP GR3 + POP GR1 RET END