YACAL2: CASL2処理系
[YACASL2.git] / as / outi.casl
1 ;GR1に格納された数値を表示
2 OUTI    START
3         PUSH 0,GR2
4         PUSH 0,GR3
5         PUSH 0,GR4
6     LAD GR0,0
7     LAD GR2,0
8     AND GR1,GR1
9     JZE INEXT
10     JPL ILOOP
11     LAD GR0,1
12     CALL INV
13 ILOOP   CPL     GR1,TEN
14         JMI     INEXT
15         CALL    DIV10
16     ADDL        GR4,ZCHAR
17     ST  GR4,STR,GR2
18     LAD GR2,1,GR2
19     LD  GR1,GR3
20     JUMP        ILOOP
21 INEXT   ADDL    GR1,ZCHAR
22         ST      GR1,STR,GR2
23         LAD     GR2,1,GR2
24     CPL GR0,=1
25     JNZ PRT
26     LD  GR1,MINUS
27         ST      GR1,STR,GR2
28         LAD     GR2,1,GR2
29 PRT     ST      GR2,LEN
30         LAD     GR1,STR
31     LD  GR2,LEN
32     CALL REV
33         OUT     STR,LEN
34         POP GR4
35         POP GR3
36         POP GR2
37         RET
38 TEN     DC      10
39 ZCHAR DC '0'
40 MINUS DC '-'
41 STR     DS      6
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
83 ;GR1の内容をマイナス値にする
84 ;例: 10 -> -10, -20 -> 20
85 INV     START
86         XOR     GR1,=#FFFF
87     LAD GR1,1,GR1
88     RET
89         END
90 ;GR1に格納された数値を表示
91 OUTI    START
92         PUSH 0,GR2
93         PUSH 0,GR3
94         PUSH 0,GR4
95     LAD GR0,0
96     LAD GR2,0
97     AND GR1,GR1
98     JZE INEXT
99     JPL ILOOP
100     LAD GR0,1
101     CALL INV
102 ILOOP   CPL     GR1,TEN
103         JMI     INEXT
104         CALL    DIV10
105     ADDL        GR4,ZCHAR
106     ST  GR4,STR,GR2
107     LAD GR2,1,GR2
108     LD  GR1,GR3
109     JUMP        ILOOP
110 INEXT   ADDL    GR1,ZCHAR
111         ST      GR1,STR,GR2
112         LAD     GR2,1,GR2
113     CPL GR0,=1
114     JNZ PRT
115     LD  GR1,MINUS
116         ST      GR1,STR,GR2
117         LAD     GR2,1,GR2
118 PRT     ST      GR2,LEN
119         LAD     GR1,STR
120     LD  GR2,LEN
121     CALL REV
122         OUT     STR,LEN
123         POP GR4
124         POP GR3
125         POP GR2
126         RET
127 TEN     DC      10
128 ZCHAR DC '0'
129 MINUS DC '-'
130 STR     DS      6
131 LEN     DS      1
132     END
133 ;GR1を10で割ったときの商をGR3、剰余をGR4に格納
134 DIV10   LD      GR4,GR1
135         LAD     GR3,0
136 DLOOP   CPL     GR4,TEN
137         JMI     DFIN
138     SUBL GR4,TEN
139     LAD GR3,1,GR3
140     JUMP        DLOOP
141 DFIN RET
142         END
143 ;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
144 ;例: 12345 -> 54321
145 REV     START
146         PUSH    0,GR3
147     PUSH        0,GR4
148     PUSH        0,GR5
149         LAD     GR3,1
150 RPU     CPL     GR2,GR3
151         JMI     RNEXT
152     LD  GR4,GR1
153     ADDL        GR4,GR3
154     LD  GR4,-1,GR4
155         PUSH 0,GR4
156     LAD GR3,1,GR3
157     JUMP        RPU
158 RNEXT    LAD    GR3,1
159 RPO     CPL     GR2,GR3
160         JMI     RFIN
161     POP GR4
162     LD GR5,GR1
163     ADDL GR5,GR3
164     ST GR4,-1,GR5
165     LAD GR3,1,GR3
166     JUMP RPO
167 RFIN POP GR5
168         POP     GR4
169     POP GR3
170         RET
171         END
172 ;GR1の内容をマイナス値にする
173 ;例: 10 -> -10, -20 -> 20
174 INV     START
175         XOR     GR1,=#FFFF
176     LAD GR1,1,GR1
177     RET
178         END