X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=as%2Fcasl2lib%2Foutl_q15.casl;h=0355a6f284d53d32cae98442da925a88fc9d9808;hb=7ac339dcd755848e9820142422752fbdc8186b5c;hp=2ae4b25e6d7c387ece7e88078929e12a9238cc11;hpb=03832f246ce06d0dae29f96c087b94c7086bb993;p=YACASL2.git diff --git a/as/casl2lib/outl_q15.casl b/as/casl2lib/outl_q15.casl index 2ae4b25..0355a6f 100644 --- a/as/casl2lib/outl_q15.casl +++ b/as/casl2lib/outl_q15.casl @@ -27,3 +27,45 @@ PRT ST GR4,LEN ; LEN <- GR4 STR DS 20 LEN DS 1 END +;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う +;;; 入力 GR1:被乗数 GR2:乗数 +;;; 出力 GR0:積の下位WORD GR3:積の上位WORD +;;; 積が65535より大きい場合は、オーバーフロー +MULL START + PUSH 0,GR4 + PUSH 0,GR5 + XOR GR0,GR0 ; 積 + XOR GR3,GR3 ; 上位word + XOR GR5,GR5 ; 上位wordの一時値 + AND GR1,GR1 ; (GR1 = 0)の場合、終了 + JZE CHKOV ; ↓ + AND GR2,GR2 ; (GR2 = 0)の場合、終了 + JZE CHKOV ; ↓ + LAD GR4,1 ; 対象ビット +LOOP PUSH 0,GR4 ; ループ先頭。GR2のビット中でGR4が示すビットが0の場合、NEXTへジャンプ + AND GR4,GR2 ; ↓ + POP GR4 ; ↓ + JZE NEXT1 ; ↓ + ADDL GR3,GR5 ; GR3 <- GR3 + GR5 + ADDL GR0,GR1 ; GR0 <- GR0 + GR1 + JOV AHB1 ; GR0がオーバーフローした場合、AHB1へジャンプ + JUMP NEXT1 ; ↓ +AHB1 LAD GR3,1,GR3 ; GR3 <- GR3 + 1 +NEXT1 SLL GR4,1 ; GR4を1回左シフト + JOV CHKOV ; ↓ + SLL GR5,1 ; GR5を1回左シフト + CPL GR4,GR2 ; (GR4 > GR2)の場合、CHKOVへジャンプ + JPL CHKOV ; ↓ + SLL GR1,1 ; GR1を1回左シフト + JOV AHB2 ; GR1がオーバーフローした場合、AHBへジャンプ + JUMP NEXT2 ; ↓ +AHB2 LAD GR5,1,GR5 ; GR5 <- GR5 + 1 +NEXT2 JUMP LOOP ; ループ終端 +CHKOV AND GR3,GR3 ; GR3 = 0の場合、終了 + JZE FIN ; ↓ + LAD GR4,#FFFF ; GR3 <> 0の場合、オーバーフロー + SLL GR4,1 ; ↓ +FIN POP GR5 + POP GR4 + RET + END