casl2_libの作成、整理、修正
[YACASL2.git] / as / casl2lib / inl.casl
1 ;;; 0から65535の範囲にある整数の入力を受け付ける
2 ;;; 入力 (SVC)
3 ;;; 出力 GR1: 入力された数値
4 ;;;     GR2: 文字列の長さ。
5 ;;;          入力が数字以外の場合は、SFフラグを設定
6 ;;;          65535を超える数値の場合は、OFフラグを設定
7 INL     START
8         PUSH    0,GR3
9         IN      IBUF,ILEN       ; 入力文字列を格納
10         LAD     GR1,IBUF
11         LD      GR2,ILEN
12         CALL    STR2L
13         JOV     FIN
14         JMI     FIN
15         LD      GR1,GR3
16 FIN     POP     GR3
17         RET
18 IBUF    DS      5
19 ILEN    DS      1
20 MAXLEN  DC      5
21         END
22 ;;; 10進数の整数を表す文字列を数値に変換
23 ;;; 数値の範囲は、0から65535
24 ;;; 入力 GR1: 文字列を格納するメモリーの先頭アドレス
25 ;;;     GR2: 文字列の長さ。最大5けた
26 ;;; 出力 GR3: 数値
27 ;;;           文字列が最大長より大きい場合と数値以外の場合は、GR3は#FFFF、OFは1
28 ;;;           数値以外の場合、OFは1
29 ;;; 依存プログラム: MULL
30 STR2L   START
31         PUSH    0,GR1
32         PUSH    0,GR2
33         PUSH    0,GR4
34         PUSH    0,GR5
35         PUSH    0,GR6
36         PUSH    0,GR7
37         XOR     GR3,GR3         ; GR3の初期化
38         AND     GR2,GR2         ; GR2 = 0の場合、OVへジャンプ
39         JZE     OV              ; ↓
40         CPL     GR2,=5          ; GR2 > 5の場合、OVへジャンプ
41         JPL     OV              ; ↓
42         XOR     GR4,GR4         ; GR4: インデックスの初期化
43         LD      GR5,GR1         ; GR5 <- GR1
44         LD      GR6,GR2         ; GR6 <- GR2
45         XOR     GR1,GR1         ; GR1の初期化
46 STOL    LD      GR1,GR5         ; GR1に、入力文字列中の次の桁を格納
47         ADDL    GR1,GR4         ; ↓
48         LD      GR1,0,GR1       ; ↓
49         LD      GR7,ZERO        ; GR1 < '0'の場合、FINへジャンプ
50         CPL     GR1,GR7         ; ↓
51         JMI     FIN             ; ↓
52         LD      GR7,NINE        ; GR1 > '9'の場合、FINへジャンプ
53         CPL     GR7,GR1         ; ↓
54         JMI     FIN             ; ↓
55         SUBL    GR1,ZERO        ; GR1の文字を、対応する数値に変換
56         ADDL    GR3,GR1
57         JOV     FIN
58         LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
59         CPL     GR4,GR6         ; GR4 = GR6の場合、ループ脱出
60         JZE     FIN             ; ↓
61 MUL10   LAD     GR2,10          ; GR2:10進数の 10
62         LD      GR1,GR3         ; GR1 <- GR3
63         CALL    MULL            ; MULLを呼び出し、GR3 <- GR1 * GR2
64         JUMP    STOL            ; ループ終端
65 OV      LAD     GR7,1           ; オーバーフロー発生
66         SRL     GR7,1           ; ↓
67 FIN     POP     GR7
68         POP     GR6
69         POP     GR5
70         POP     GR4
71         POP     GR2
72         POP     GR1
73         RET
74 ZERO    DC      '0'
75 NINE    DC      '9'
76         END
77 ;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
78 ;;; 入力 GR1:被乗数 GR2:乗数
79 ;;; 出力 GR3:積
80 ;;; 積が65535より大きい場合は、オーバーフロー
81 MULL    START
82         XOR     GR3,GR3         ; GR3の初期化
83         AND     GR1,GR1         ; GR1 = 0 の場合、FINへジャンプ
84         JZE     FIN             ; ↓
85         AND     GR2,GR2         ; GR2 = 0 の場合、FINへジャンプ
86         JZE     FIN             ; ↓
87         PUSH    0,GR1           ; GR1の退避
88         PUSH    0,GR2           ; GR2の退避
89 LOOP    SRL     GR2,1           ; ループ開始。SRLを1つ右シフト
90         JOV     ON              ; 乗数の最下位ビットが1の場合、ONへジャンプ
91         JUMP    NEXT            ; NEXTへジャンプ
92 ON      ADDL    GR3,GR1         ; GR3 <- GR3 + GR1
93         JOV     POST            ; GR3がオーバーフローした場合、POSTへジャンプ
94 NEXT    AND     GR2,GR2         ; GR2 = 0 の場合、POSTへジャンプ
95         JZE     POST            ; ↓
96         SLL     GR1,1           ; GR1を1つ左シフト
97         JOV     POST            ; GR1がオーバーフローした場合、POSTへジャンプ
98         JUMP    LOOP            ; ループ終端
99 POST    POP     GR2             ; GR2の復元
100         POP     GR1             ; GR1の復元
101 FIN     RET
102         END