dec0b9d2974845e47622bfba14ef3c4556de8a2e
[YACASL2.git] / as / casl2lib / src / str2l.casl
1 ;;; 10進数の整数を表す文字列を数値に変換
2 ;;; 数値の範囲は、0から65535
3 ;;; 入力 GR1: 文字列を格納するメモリーの先頭アドレス
4 ;;;     GR2: 文字列の長さ。最大5けた
5 ;;; 出力 GR3: 数値
6 ;;;           文字列が最大長より大きい場合と数値以外の場合は、GR3は#FFFF、OFは1
7 ;;;           数値以外の場合、OFは1
8 ;;; 依存プログラム: MULL
9 STR2L   START
10         PUSH    0,GR1
11         PUSH    0,GR2
12         PUSH    0,GR4
13         PUSH    0,GR5
14         PUSH    0,GR6
15         PUSH    0,GR7
16         XOR     GR3,GR3         ; GR3の初期化
17         AND     GR2,GR2         ; GR2 = 0の場合、OVへジャンプ
18         JZE     OV              ; ↓
19         CPL     GR2,=5          ; GR2 > 5の場合、OVへジャンプ
20         JPL     OV              ; ↓
21         XOR     GR4,GR4         ; GR4: インデックスの初期化
22         LD      GR5,GR1         ; GR5 <- GR1
23         LD      GR6,GR2         ; GR6 <- GR2
24         XOR     GR1,GR1         ; GR1の初期化
25 STOL    LD      GR1,GR5         ; GR1に、入力文字列中の次の桁を格納
26         ADDL    GR1,GR4         ; ↓
27         LD      GR1,0,GR1       ; ↓
28         LD      GR7,ZERO        ; GR1 < '0'の場合、FINへジャンプ
29         CPL     GR1,GR7         ; ↓
30         JMI     FIN             ; ↓
31         LD      GR7,NINE        ; GR1 > '9'の場合、FINへジャンプ
32         CPL     GR7,GR1         ; ↓
33         JMI     FIN             ; ↓
34         SUBL    GR1,ZERO        ; GR1の文字を、対応する数値に変換
35         ADDL    GR3,GR1
36         JOV     FIN
37         LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
38         CPL     GR4,GR6         ; GR4 = GR6の場合、ループ脱出
39         JZE     FIN             ; ↓
40 MUL10   LAD     GR2,10          ; GR2:10進数の 10
41         LD      GR1,GR3         ; GR1 <- GR3
42         CALL    MULL            ; MULLを呼び出し、GR3 <- GR1 * GR2
43         JUMP    STOL            ; ループ終端
44 OV      LAD     GR7,1           ; オーバーフロー発生
45         SRL     GR7,1           ; ↓
46 FIN     POP     GR7
47         POP     GR6
48         POP     GR5
49         POP     GR4
50         POP     GR2
51         POP     GR1
52         RET
53 ZERO    DC      '0'
54 NINE    DC      '9'
55         END