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