YACAL2: CASL2処理系
[YACASL2.git] / as / outi2.casl
1 ; 数値を表示
2 ; 入力:
3 ;   GR1: 開始アドレス
4 ;   GR2: 語数
5 OUTI START
6         RPUSH
7     ST GR1,TMP
8     LAD GR5,0   ; 語数のカウンタ
9     LAD GR6,0   ; 全体の桁数
10 WLOOP CPL GR5,GR2    ; GR5がGR2より大きい場合は終了
11     JZE IEND
12         JPL     IEND
13     LD  GR1,TMP    ; GR1をリセット
14     ADDL GR1,GR5    ; GR1に(GR1+GR5)の内容をロード
15     LD  GR1,0,GR1
16     LAD GR5,1,GR5    ; GR5をインクリメント
17 ILOOP   CPL     GR1,TEN    ; GR1が10未満の場合は次の語
18         JMI     WLOOP
19         CALL DIV10    ; GR1を10で割り、商をGR3、剰余をGR4に格納
20     LAD  GR4,ZCHAR,GR4
21     ST  GR4,STR,GR6 ; GR4を(STR+GR6)に格納
22     LAD GR6,1,GR6    ; GR6をインクリメント
23     LD  GR1,GR3
24     JUMP ILOOP
25 INEXT ADDL GR1,ZCHAR
26         ST      GR1,STR,GR6
27     JUMP WLOOP
28 IEND LAD GR6,1,GR6
29     LAD GR1,ZCHAR,GR1
30     ST GR1,STR,GR6
31         ST      GR6,LEN
32         LAD     GR1,STR
33     LD  GR2,LEN
34     CALL REV
35         OUT     STR,LEN
36     RPOP
37         RET
38 TEN     DC      10
39 ZCHAR DC '0'
40 TMP DS  1
41 STR     DS      10
42 LEN     DS      1
43     END
44 ;GR1を10で割ったときの商をGR3、剰余をGR4に格納
45 DIV10   LD      GR4,GR1
46         LAD     GR3,0
47 DLOOP   CPL     GR4,TEN
48         JMI     DFIN
49     SUBL GR4,TEN
50     LAD GR3,1,GR3
51     JUMP        DLOOP
52 DFIN RET
53         END
54 ;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
55 ;例: 12345 -> 54321
56 REV     START
57         PUSH    0,GR3
58     PUSH        0,GR4
59     PUSH        0,GR5
60         LAD     GR3,1
61 RPU     CPL     GR2,GR3
62         JMI     RNEXT
63     LD  GR4,GR1
64     ADDL        GR4,GR3
65     LD  GR4,-1,GR4
66         PUSH 0,GR4
67     LAD GR3,1,GR3
68     JUMP        RPU
69 RNEXT    LAD    GR3,1
70 RPO     CPL     GR2,GR3
71         JMI     RFIN
72     POP GR4
73     LD GR5,GR1
74     ADDL GR5,GR3
75     ST GR4,-1,GR5
76     LAD GR3,1,GR3
77     JUMP RPO
78 RFIN POP GR5
79         POP     GR4
80     POP GR3
81         RET
82         END