gitの設定を変更
[YACASL2.git] / as / FUNC / divl1.casl
1 ;;; GR1の値とGR2の値の、商をGR0、剰余をGR3に格納する
2 ;;; 0〜65535の範囲の数値を扱う
3 DIVL    START
4         PUSH    0,GR1
5         PUSH    0,GR2
6         PUSH    0,GR4
7         AND     GR2,GR2         ; (GR2 = 0)の場合、DFZへジャンプ
8         JZE     DYZ             ; ↓
9         ST      GR2,DY          ; DYにGR2の初期値を保存
10         LAD     GR0,0           ; GR0の初期化
11         LAD     GR3,0           ; GR3の初期化
12         LAD     GR4,1           ; GR4の初期化。対象ビットを表す
13 DSL     CPL     GR2,GR1         ; ループ先頭。(GR2 > GR1)の場合、DLOOPへループ脱出
14         JPL     DLOOP           ; ↓
15         SLL     GR4,1           ; GR4を1回左シフト
16         SLL     GR2,1           ; GR2を1回左シフト
17         JOV     DYOV            ; オーバーフローの場合は、DYOVにジャンプ
18         JUMP    DSL             ; ループ終端
19 DYOV    SRL     GR2,1
20         LAD     GR2,#8000,GR2
21         SRL     GR4,1
22         JUMP    DLPIN
23 DLOOP   SRL     GR4,1           ; ループ先頭。GR4を1回右シフト
24         JZE     DCP             ; (GR4 = 0)の場合、ループ脱出
25         SRL     GR2,1           ; GR2を1回右シフト
26         CPL     GR1,DY          ; (GR1 < DY)の場合、ループ脱出
27         JMI     DCP             ; ↓
28         CPL     GR1,GR2         ; (GR1 < GR2)の場合、ループ先頭へジャンプ
29         JMI     DLOOP           ; ↓
30 DLPIN   SUBL    GR1,GR2         ; GR1 <- GR1 - GR2
31         ADDL    GR0,GR4         ; GR0 <- GR0 + GR4
32         JUMP    DLOOP           ; ループ終端
33 DYZ     LAD     GR3,#FFFF       ; 強制的にオーバーフローを発生させ、GR3 <- 0
34         ADDL    GR3,=1          ; ↓
35         JUMP    DFIN            ; DFINへジャンプ
36 DCP     LD      GR3,GR1
37 DFIN    POP     GR4
38         POP     GR2
39         POP     GR1
40         RET
41 DY      DS      1
42         END