CASLファイルのフォルダを変更
[YACASL2.git] / as / misc / divl0.casl
diff --git a/as/misc/divl0.casl b/as/misc/divl0.casl
new file mode 100644 (file)
index 0000000..28357a9
--- /dev/null
@@ -0,0 +1,22 @@
+;;; 0〜65535の範囲にある正数の割算を行う
+;;; 入力 GR1:被除数 GR2:除数
+;;; 出力 GR0:商 GR3:剰余
+;;; GR2が0の場合は、GR0、GR3とも0になり、オーバーフロー
+DIVL    START
+        PUSH    0,GR1
+        AND     GR2,GR2         ; (GR2 = 0)の場合、DYZへジャンプ
+        JZE     DIVZERO         ; ↓
+        LAD     GR0,0           ; GR0を初期化
+        LD      GR3,GR1         ; GR3 <- GR1
+LOOP    CPL     GR3,GR2         ; ループ先頭。(GR3 < GR2)の場合、終了
+        JMI     FIN             ; ↓
+        SUBL    GR3,GR2         ; GR3 <- GR3 - GR2
+        ADDL    GR0,ONE         ; ↓
+        JUMP    LOOP            ; ループ終端
+DIVZERO LAD     GR3,#8000       ; 強制的にオーバーフローを発生させ、GR3 <- 0
+        SLL     GR3,1           ; ↓
+        JUMP    FIN             ; FIN へジャンプ
+FIN     POP     GR1
+        RET
+ONE     DC      1
+        END