SRLコマンドテストパターンを追加
[YACASL2.git] / as / casl2lib / 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
56 ;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
57 ;;; 入力 GR1:被乗数 GR2:乗数
58 ;;; 出力 GR3:積
59 ;;; 積が65535より大きい場合は、オーバーフロー
60 MULL    START
61         XOR     GR3,GR3         ; GR3の初期化
62         AND     GR1,GR1         ; GR1 = 0 の場合、FINへジャンプ
63         JZE     FIN             ; ↓
64         AND     GR2,GR2         ; GR2 = 0 の場合、FINへジャンプ
65         JZE     FIN             ; ↓
66         PUSH    0,GR1           ; GR1の退避
67         PUSH    0,GR2           ; GR2の退避
68 LOOP    SRL     GR2,1           ; ループ開始。SRLを1つ右シフト
69         JOV     ON              ; 乗数の最下位ビットが1の場合、ONへジャンプ
70         JUMP    NEXT            ; NEXTへジャンプ
71 ON      ADDL    GR3,GR1         ; GR3 <- GR3 + GR1
72         JOV     POST            ; GR3がオーバーフローした場合、POSTへジャンプ
73 NEXT    AND     GR2,GR2         ; GR2 = 0 の場合、POSTへジャンプ
74         JZE     POST            ; ↓
75         SLL     GR1,1           ; GR1を1つ左シフト
76         JOV     POST            ; GR1がオーバーフローした場合、POSTへジャンプ
77         JUMP    LOOP            ; ループ終端
78 POST    POP     GR2             ; GR2の復元
79         POP     GR1             ; GR1の復元
80 FIN     RET
81         END