09c505a5021aa5296bc1606bdb4e7ec24f2b6811
[YACASL2.git] / as / FUNC / inl.casl
1 ;;; 入力された数値をGR0で返す
2 INL     START
3         RPUSH
4         IN      IBUF,ILEN
5         LAD     GR1,0
6         LAD     GR2,10          ; 10進数の「10」
7         LAD     GR3,0           ; 値の一時格納
8         LAD     GR4,0           ; インデックス
9 ISTOL   CPL     GR4,ILEN        ; ループ先頭。(GR4 = ILEN)の場合、ループ脱出
10         JZE     ICP             ; ↓
11         LD      GR1,IBUF,GR4
12         CPL     GR1,INCHR       ; (GR1 < (INCHR = '0'))の場合、IOVへジャンプ
13         JMI     IOV             ; ↓
14         CPL     GR1,='9'        ; (GR1 > '9')の場合、IOVへジャンプ
15         JPL     IOV             ; ↓
16         SUBL    GR1,INCHR
17         ST      GR4,NLEN
18         LD      GR4,ILEN
19         SUBA    GR4,NLEN
20 MUL10   CPL     GR4,=1
21         JZE     ISNEXT
22         CALL    MULL
23         LD      GR1,GR0
24         LAD     GR4,-1,GR4
25         JUMP    MUL10
26 ISNEXT  LD      GR4,NLEN
27         ADDL    GR3,GR1
28         LAD     GR4,1,GR4
29         JUMP    ISTOL           ; ループ終端
30 IOV     LAD     GR0,1
31         ADDL    GR0,=#FFFF
32         JUMP    IFIN
33 ICP     LD      GR0,GR3
34 IFIN    RPOP
35         RET
36 INCHR   DC      '0123456789'
37 IBUF    DS      5
38 ILEN    DS      1
39 NLEN    DS      1
40         END
41 ;GR1の値とGR2の値の積をGR0に格納
42 MULL    START
43         RPUSH
44         LAD     GR3,1           ; 対象ビット
45         LAD     GR0,0           ; 積
46 MLOOP   CPL     GR3,GR2         ; ループ先頭。(GR2 = GR3)の場合、ループ脱出
47         JPL     MFIN            ; ↓
48         PUSH    0,GR3           ; GR2の、GR3が示したビットが0の場合、MNEXTへジャンプ
49         AND     GR3,GR2         ; ↓
50         POP     GR3             ; ↓
51         JZE     MNEXT           ; ↓
52         ADDL    GR0,GR1         ; GR0 <- GR0 + GR1
53         JOV     MFIN            ; オーバーフローした場合、ループ脱出
54 MNEXT   SLL     GR3,1           ; GR3を1回左シフト
55         SLL     GR1,1           ; GR1を1回左シフト
56         JOV     MFIN            ; オーバーフローした場合、ループ脱出
57         JUMP    MLOOP           ; ループ終端
58 MFIN    RPOP
59         RET
60         END