X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=as%2FFUNC%2Fdivl1.casl;fp=as%2FFUNC%2Fdivl1.casl;h=1d868900704ffaa5662170b7caf95606c7c97b21;hb=fb54b1c9d2fbc3d4a62c6b4d38ff68e9d3b25c26;hp=0000000000000000000000000000000000000000;hpb=b4e48008c95b35c692827326191698c22b06124f;p=YACASL2.git diff --git a/as/FUNC/divl1.casl b/as/FUNC/divl1.casl new file mode 100644 index 0000000..1d86890 --- /dev/null +++ b/as/FUNC/divl1.casl @@ -0,0 +1,42 @@ +;;; GR1の値とGR2の値の、商をGR0、剰余をGR3に格納する +;;; 0〜65535の範囲の数値を扱う +DIVL START + PUSH 0,GR1 + PUSH 0,GR2 + PUSH 0,GR4 + AND GR2,GR2 ; (GR2 = 0)の場合、DFZへジャンプ + JZE DYZ ; ↓ + ST GR2,DY ; DYにGR2の初期値を保存 + LAD GR0,0 ; GR0の初期化 + LAD GR3,0 ; GR3の初期化 + LAD GR4,1 ; GR4の初期化。対象ビットを表す +DSL CPL GR2,GR1 ; ループ先頭。(GR2 > GR1)の場合、DLOOPへループ脱出 + JPL DLOOP ; ↓ + SLL GR4,1 ; GR4を1回左シフト + SLL GR2,1 ; GR2を1回左シフト + JOV DYOV ; オーバーフローの場合は、DYOVにジャンプ + JUMP DSL ; ループ終端 +DYOV SRL GR2,1 + LAD GR2,#8000,GR2 + SRL GR4,1 + JUMP DLPIN +DLOOP SRL GR4,1 ; ループ先頭。GR4を1回右シフト + JZE DCP ; (GR4 = 0)の場合、ループ脱出 + SRL GR2,1 ; GR2を1回右シフト + CPL GR1,DY ; (GR1 < DY)の場合、ループ脱出 + JMI DCP ; ↓ + CPL GR1,GR2 ; (GR1 < GR2)の場合、ループ先頭へジャンプ + JMI DLOOP ; ↓ +DLPIN SUBL GR1,GR2 ; GR1 <- GR1 - GR2 + ADDL GR0,GR4 ; GR0 <- GR0 + GR4 + JUMP DLOOP ; ループ終端 +DYZ LAD GR3,#FFFF ; 強制的にオーバーフローを発生させ、GR3 <- 0 + ADDL GR3,=1 ; ↓ + JUMP DFIN ; DFINへジャンプ +DCP LD GR3,GR1 +DFIN POP GR4 + POP GR2 + POP GR1 + RET +DY DS 1 + END