アセンブラファイルとテストの整理
[YACASL2.git] / as / FUNC / divl1.casl
diff --git a/as/FUNC/divl1.casl b/as/FUNC/divl1.casl
new file mode 100644 (file)
index 0000000..1d86890
--- /dev/null
@@ -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