Deriving a new dialect of Very Tiny Language from VTL-2 6800 version
Revision | b8e195c4ec493b879649ac61a6026c666d1fb784 (tree) |
---|---|
Time | 2022-09-25 22:00:21 |
Author | Joel Matthew Rees <joel.rees@gmai...> |
Commiter | Joel Matthew Rees |
starting on better 6809/coco version
@@ -1,130 +1,111 @@ | ||
1 | -* VTL-2 for 6809 | |
2 | -* derived from VTL-2 for 6801 | |
1 | + OPT 6809 | |
2 | +* VTL-2 for 6809 | |
3 | +* A transliteration of VTL-2 for 6801 | |
3 | 4 | * V-3.6 |
4 | 5 | * 9-23-76 |
5 | 6 | * BY GARY SHANNON |
6 | 7 | * & FRANK MCCOY |
7 | 8 | * COPYWRIGHT 1976, THE COMPUTER STORE |
8 | 9 | * |
9 | -* Transliterations and modifications | |
10 | +* Transliteration and modifications for Color Computer | |
11 | +* including original modifications for MC-10 | |
10 | 12 | * by Joel Matthew Rees |
11 | 13 | * Copyright 2022, Joel Matthew Rees |
12 | 14 | * |
13 | 15 | * Modifications explained at |
14 | -* (URL) | |
16 | +* https://joels-programming-fun.blogspot.com/2022/09/vtl-2-part-5-transliterating-to-6809.html | |
17 | +* | |
18 | +* Note that this is a travesty of a program, | |
19 | +* since it is 6809 code, but does not make any use of the 6809's added resources. | |
20 | +* | |
15 | 21 | * |
16 | 22 | * DEFINE LOCATIONS IN MONITOR |
17 | -* These are defined for the Color Computer target at the end of the source. | |
18 | 23 | * INCH EQU $FF00 ; per VTL.ASM |
24 | +* EINCH EQU $F012 ; exorsim mdos Input byte with echo unless AECHO is set | |
25 | +* INCH EQU $F015 ; exorsim mdos Input char with echo (F012 -> strip bit 7) | |
19 | 26 | * POLCAT EQU $FF24 ; from VTL.ASM |
20 | 27 | * OUTCH EQU $FF81 ; from VTL.ASM |
28 | +* EOUTCH EQU $F018 ; exorsim mdos Output character with NULs | |
21 | 29 | * OUTS EQU $FF82 ; from VTL.ASM |
30 | +* EPCRLF EQU $F021 ; Primarily for forced initialization in exorsim. | |
22 | 31 | * |
23 | 32 | * FOR SBC6800: |
24 | 33 | *BREAK EQU $1B ; BREAK KEY |
25 | -* For MC-10: | |
34 | +* For MC-10 and Color Computer: | |
26 | 35 | BREAK EQU $03 |
27 | -* | |
28 | -* In the 6809, there are several ways to approach the VTL trick of | |
29 | -* aliasing the variable names to their ASCII codes as addresses | |
30 | -* | |
31 | -* A way that would completely ignore the features (and benefits) of the 6809 | |
32 | -* might be to just follow the original VTL-2 source in putting the variables all | |
33 | -* down at the bottom of the address space (and setting the DP register register to zero). | |
34 | -* This approach would conflict with some hardware and a lot of system software. | |
35 | -* | |
36 | -* A similar method would be to use the DP as the base of the variable area. | |
37 | -* In some ways, this would allow a greater flexibility, although I understand | |
38 | -* you would still find conflicts. It would also require a bit of glue code, | |
39 | -* since Motorola did not mirror the direct page mode in the index modes. | |
40 | -* And there would be system conflicts in system/BIOS/monitors that | |
41 | -* don't save and switch DP on interrupts. | |
42 | -* | |
43 | -* A third way would be similar to what I did to move the variables | |
44 | -* out of the direct page on the 6800 source -- | |
45 | -* the variables would still be at absolute addresses, but by keeping those addresses | |
46 | -* free from entanglement with the code there would give greater host flexibility. | |
47 | -* | |
48 | -* A fourth approach would be to use the Y or U register as the base of the variable space. | |
49 | -* The base itself could be kept in a direct page variable, allowing the index to be used | |
50 | -* for other things, as well. | |
51 | -* (A similar approach could be taken with the 6801, with a lot of shuffling X. | |
52 | -* Because the 6809 has several index regisers, shuffling is not so much of a problem here.) | |
53 | -* | |
54 | -* If Motorola had only mirrored the DP mode in the index modes (like they mirrored the | |
55 | -* extended mode to get absolute memory indirect), the DP would be the slam-dunk. | |
56 | -* (But Microsoft would have ignored the DP register anyway, making for conflicts with BASIC.) | |
57 | -* | |
58 | -* I'm inclined to use the DP as the base, just to show how to do it. | |
59 | -* But I know there will be a lot of designs where that will cause problems, | |
60 | -* particularly the Tandy/RS Color Computer, the most available target I have at present. | |
61 | -* | |
62 | -* So I'm going to go with using Y as the base, which means saving and restoring it | |
63 | -* when I use it for something else. | |
64 | -* | |
65 | -* Some of the interpreter variables belong conceptually in the direct page, | |
66 | -* but I'm going to essentially ignore the direct page in this transliteration, | |
67 | -* so I'll move the interpreter variables back to mixed in with the programmer variables. | |
68 | -* | |
69 | -* ORG $C0 ; Move this according to your environment's needs. | |
70 | -* DPBASE EQU $C0 ; Change this to move the registers. | |
36 | +* For exorsim | |
37 | +*ACIACS EQU $FCF4 ; exorcisor | |
38 | +*ACIADA EQU $FCF5 ; exorcisor | |
39 | +* | |
40 | +* A few interpreter variables in the direct page won't hurt, said the spider to the fly. | |
41 | +* (See SNDDUR and PLYTMR in particular.) | |
42 | +* (Really need to move these. Use DP after all? IRQ, at least, uses extended mode addressing.) | |
43 | +* (Yes, I can hear voices of complaint that it's not as "tight" as it could be.) | |
44 | +* (This allows us to save more ROM space and uses DP that would otherwise go wasted.) | |
45 | +* (Trade-offs.) | |
46 | +* (It also helps us understand the code, so we can do a better 6809 transliteration.) | |
47 | +* (I hope the names are meaningful.) | |
48 | +* | |
49 | +* In .c10 format, the following as ORG and RMBs caused object code output, | |
50 | +* which will prevent the code from loading on the MC-10. | |
51 | +* Changed to EQU for the MC10 and left this way for the initial CoCo code. | |
52 | +* | |
53 | +* Does not really make specific use of the DP register. | |
54 | +* ORG $C0 ; Move this according to your environment's needs, but not on CoCo. | |
55 | +* Change this to move the registers: | |
56 | +DPBASE EQU $C4 ; PIA mask at $C2? Avoid it, anyway. | |
71 | 57 | * PARSET RMB 2 ; Instead of SAVE0 in TERM/NXTRM |
72 | -* PARSET EQU DPBASE+2 | |
58 | +PARSET EQU DPBASE+2 | |
73 | 59 | * CVTSUM RMB 2 ; Instead of SAVE1 in CBLOOP |
74 | -* CVTSUM EQU PARSET+2 | |
60 | +CVTSUM EQU PARSET+2 | |
75 | 61 | * MLDVCT EQU CVTSUM ; Instead of SAVE1 in mul/div (1 byte only) |
76 | -* MLDVCT EQU CVTSUM | |
62 | +MLDVCT EQU CVTSUM | |
77 | 63 | * DIVQUO RMB 2 ; Instead of SAVE2 in DIV |
78 | -* DIVQUO EQU MLDVCT+2 | |
64 | +DIVQUO EQU MLDVCT+2 | |
79 | 65 | * MPLIER EQU DIVQUO ; Instead of SAVE2 in MULTIP |
80 | -* MPLIER EQU DIVQUO | |
66 | +MPLIER EQU DIVQUO | |
81 | 67 | * EVALPT RMB 2 ; Instead of SAVE3 |
82 | -* EVALPT EQU MPLIER+2 | |
68 | +EVALPT EQU MPLIER+2 | |
83 | 69 | * CNVPTR RMB 2 ; Instead of SAVE4 |
84 | -* CNVPTR EQU EVALPT+2 | |
70 | +CNVPTR EQU EVALPT+2 | |
85 | 71 | * VARADR RMB 2 ; Instead of SAVE6 |
86 | -* VARADR EQU CNVPTR+2 | |
72 | +VARADR EQU CNVPTR+2 | |
87 | 73 | * OPRLIN RMB 2 ; Instead of SAVE7 |
88 | -* OPRLIN EQU VARADR+2 | |
74 | +OPRLIN EQU VARADR+2 | |
89 | 75 | * EDTLIN RMB 2 ; Instead of SAVE8 |
90 | -* EDTLIN EQU OPRLIN+2 | |
76 | +EDTLIN EQU OPRLIN+2 | |
91 | 77 | * INSPTR RMB 2 ; Instead of SAVE10 (maybe? Will some VTL programs want it back?) |
92 | -* INSPTR EQU EDTLIN+2 | |
78 | +INSPTR EQU EDTLIN+2 | |
93 | 79 | * SAVLIN RMB 2 ; Instead of SAVE11 |
94 | -* SAVLIN EQU INSPTR+2 | |
95 | -* SRC RMB 2 ; For copy routine, register in 6809 | |
96 | -* SRC EQU SAVLIN+2 | |
80 | +SAVLIN EQU INSPTR+2 | |
81 | +* SRC RMB 2 ; For copy routine | |
82 | +SRC EQU SAVLIN+2 | |
97 | 83 | * DST RMB 2 ; ditto |
98 | -* DST EQU SRC+2 | |
99 | - SETDP 0 | |
100 | -* Just these DP variables: | |
101 | -* STKMRK EQU DST+2 | |
102 | -USTKMK EQU $F8 ; to restore the stack on each pass. | |
103 | -SSTKMK EQU USTKMK+2 | |
104 | -ZEROMK EQU SSTKMK+2 | |
105 | - | |
106 | -* DPALLOC EQU STKMRK+2 ; total storage declared in the direct page | |
84 | +DST EQU SRC+2 | |
85 | +STKMRK EQU DST+2 ; to restore the stack on each pass. | |
86 | +DPALLOC EQU STKMRK+2 ; total storage declared in the direct page | |
107 | 87 | * |
88 | +*******!!!!!! CoCo: Check that we have avoided $00E2, as well, since it is used as PLYTMR by an interrupt routine. | |
89 | +* CoCo: Also, $008D is used as SNDDUR by BASIC. | |
108 | 90 | * |
109 | 91 | * SET ASIDE FOUR BYTES FOR USER |
110 | -* DEFINED INTERUPT ROUTINE IF NEEDED (not needed, but ...) | |
111 | - ORG $1600 ; Dodge BASIC and video use RAM. | |
112 | -* ZERO probably should be set at even $100 boundary for address math to work. | |
113 | -ZERO RMB 4 ; INTERUPT VECTOR in original | |
92 | +* DEFINED INTERUPT ROUTINE IF NEEDED | |
93 | +ZERO EQU $1600 ; Dodge BASIC and video use RAM. | |
94 | + ORG ZERO | |
95 | +* ZERO probably no longer needs to be at even $100, but we'll put it there for good luck. | |
96 | + RMB 4 ; INTERUPT VECTOR (probably not unnecessary? Implicit non-use in interpreter.) | |
114 | 97 | AT RMB 2 ; CANCEL & C-R |
115 | 98 | * |
116 | 99 | * GENERAL PURPOSE STORRGE |
117 | 100 | VARS RMB 52 ; VARIABLES(A-Z) |
118 | 101 | BRAK RMB 2 ; [ |
119 | -* SAVE10 has me worried about implicit linkage in VTL programs. Might need to just be here. | |
102 | +* SAVE10 has me worried about implicit linkage in VTL programs. Might need to leave it here. | |
120 | 103 | SAVE10 RMB 2 ; BACK SLASH |
121 | -INSPTR EQU SAVE10 ; (Will some VTL programs want it here regardless?) | |
122 | 104 | BRIK RMB 2 ; ] |
123 | 105 | UP RMB 2 ; ^ |
124 | 106 | SAVE11 RMB 2 ; Need something in each SAVE to reserve space |
125 | -SAVLIN EQU SAVE11 | |
126 | -* ; To keep the address math straight. | |
127 | -* ; always leave the SAVEs declared as they are. | |
107 | +* ; to keep the math straight. | |
108 | +* ; Leave the SAVEs declared as they are. | |
128 | 109 | * |
129 | 110 | SAVE14 RMB 2 ; SPACE (originally unused) |
130 | 111 | EXCL RMB 2 ; ! |
@@ -143,26 +124,16 @@ MINS RMB 2 ; - | ||
143 | 124 | PERD RMB 2 ; . |
144 | 125 | SLASH RMB 2 ; / |
145 | 126 | * |
146 | -SAVE0 RMB 2 | |
147 | -PARSET EQU SAVE0 ; in TERM/NXTRM | |
148 | -SAVE1 RMB 2 | |
149 | -CVTSUM EQU SAVE1 ; in CBLOOP | |
150 | -MLDVCT EQU CVTSUM ; in mul/div (1 byte only) | |
151 | -SAVE2 RMB 2 | |
152 | -DIVQUO EQU SAVE2 ; in DIV | |
153 | -MPLIER EQU DIVQUO ; in MULTIP | |
154 | -SAVE3 RMB 2 | |
155 | -EVALPT EQU SAVE3 | |
156 | -SAVE4 RMB 2 | |
157 | -CNVPTR EQU SAVE4 | |
158 | -SAVE5 RMB 2 ; unused (stacked) | |
159 | -SAVE6 RMB 2 | |
160 | -VARADR EQU SAVE6 | |
161 | -SAVE7 RMB 2 | |
162 | -OPRLIN EQU SAVE7 | |
163 | -SAVE8 RMB 2 | |
164 | -EDTLIN EQU SAVE8 | |
165 | -SAVE9 RMB 2 ; unused (stacked) | |
127 | +SAVE0 RMB 2 ; unused | |
128 | +SAVE1 RMB 2 ; unused | |
129 | +SAVE2 RMB 2 ; unused | |
130 | +SAVE3 RMB 2 ; unused | |
131 | +SAVE4 RMB 2 ; unused | |
132 | +SAVE5 RMB 2 ; unused (PSH/PULX) | |
133 | +SAVE6 RMB 2 ; unused | |
134 | +SAVE7 RMB 2 ; unused | |
135 | +SAVE8 RMB 2 ; unused | |
136 | +SAVE9 RMB 2 ; unused (PSH/PULX) | |
166 | 137 | COLN RMB 2 ; : |
167 | 138 | SEMI RMB 2 ; ; |
168 | 139 | LESS RMB 2 ; < |
@@ -177,67 +148,63 @@ LINLEN EQU 72 | ||
177 | 148 | LINBUF RMB LINLEN+1 |
178 | 149 | BUFOFF EQU LINBUF-ZERO ; Unmagic 87. Some assemblers will cough at this. |
179 | 150 | * |
180 | - ORG $16F0 ; parameter/temp stack below here | |
181 | -USTACK RMB 1 | |
151 | +STACK EQU ZERO+$F0 | |
152 | + ORG STACK | |
153 | + RMB 1 ; 6809 stack pointer points to last item pushed. | |
182 | 154 | * |
183 | - ORG $1700 ; leave some buffer space | |
184 | -MI RMB 4 ; INTERUPT VECTORS (not for 6809) | |
155 | +VPRGM EQU STACK+$10 ; buffer zone, really | |
156 | + ORG VPRGM | |
157 | +MI RMB 4 ; INTERUPT VECTORS ; again, probably not relevant here. | |
185 | 158 | NMI RMB 4 |
186 | -PRGM EQU * ; VTL PROGRAM STARTS HERE | |
159 | +PRGM EQU * ; PROGRAM STARTS HERE | |
187 | 160 | * Must have some RAM here. |
188 | 161 | * |
189 | - ORG $4000 ; for 16K system | |
162 | +CODESG EQU $3800 ; 16K-2K for breathing room in 16K system (2K for now, adjust later.) | |
163 | + ORG CODESG | |
190 | 164 | * |
191 | 165 | * The COLD boot can be removed or ignored to restore the original behavior, |
192 | 166 | * but if you do that don't forget to set & (AMPR) and * (STAR) values |
193 | -* by hand immediately after STARTing, | |
194 | -* and ' (QUITE) before trying to get a pseudo-random number. | |
167 | +* by hand immediately after STARTing. | |
195 | 168 | * |
196 | 169 | * Also, instead of PROBEing, if you know the limits for a particular ROM |
197 | -* application, you can set STAR directly, too: | |
170 | +* application, you can set STAR directly: | |
198 | 171 | * LDX #PRGM |
199 | 172 | * STX AMPR |
200 | 173 | * LDX #RAMLIM |
201 | 174 | * STX STAR |
202 | 175 | * START ... |
203 | 176 | * |
204 | -COLD STS SSTKMK ; Mark the stacks, | |
205 | - STU USTKMK ; but use BASIC's return stack. | |
206 | -* LDS #SSTACK ; (S/U on 6809 point to most recently pushed.) | |
207 | - LDU #USTACK | |
177 | +COLD STS STKMRK ; Mark the stack, | |
178 | +* LDS #STACK ; Maybe use BASIC's stack. (S on 6809 points to last pushed.) | |
208 | 179 | * JSR TRMINI |
209 | - LEAX COLD,PCR | |
210 | - PSHU X ; probe termination address | |
211 | - LDY #ZERO | |
212 | - STY ZEROMK | |
213 | - LDD #PRGM-ZERO ; initialize program area base | |
214 | - STD AMPR,Y | |
215 | - LEAX D,Y | |
180 | + LDX #PRGM ; initialize program area base | |
181 | + STX AMPR | |
216 | 182 | LDA #$5A ; Probe RAM limit |
217 | 183 | LDB #$A5 |
218 | 184 | BRA PROBET |
219 | -PROBE STA ,X | |
220 | - CMPA ,X | |
185 | +PROBE STA 0,X | |
186 | + CMPA 0,X | |
221 | 187 | BNE NOTRAM |
222 | - STB ,X | |
223 | - CMPB ,X+ | |
224 | - BNE NOTRAM | |
225 | -PROBET CMPX ,U ; all bits seem to be R/W. | |
188 | + STB 0,X | |
189 | + CMPB 0,X | |
190 | + BNE NOTRAM ; all bits seem to be R/W. | |
191 | + LEAX 1,X | |
192 | +PROBET CMPX #COLD | |
226 | 193 | BLO PROBE ; CMPX on 6809 works right. |
227 | 194 | NOTRAM LEAX -1,X |
228 | 195 | STX STAR |
229 | 196 | START |
230 | - LDS SSTKMK ; re-initialize at beginning of each evaluate | |
231 | - LDU USTKMK ; from mark instead of constant | |
197 | +* LDS #STACK ; re-initialize at beginning of each evaluate | |
198 | + LDS STKMRK ; from mark instead of constant | |
232 | 199 | STS SEMI ; DBG Comment this out when we no longer need to see the stack pointer BASIC gives us. |
233 | 200 | CLRA ; NUL delimiter |
234 | - LEAX OKM,PCR | |
235 | - BSR STRGT | |
201 | + LDX #OKM | |
202 | + LBSR STRING | |
236 | 203 | * |
237 | 204 | LOOP CLRA |
238 | - STAA DOLR | |
239 | - STAA DOLR+1 | |
240 | - JSR CVTLN | |
205 | + STA DOLR | |
206 | + STA DOLR+1 | |
207 | + LBSR CVTLN | |
241 | 208 | BCC STMNT ; NO LINE# THEN EXEC |
242 | 209 | BSR EXEC |
243 | 210 | BEQ START |
@@ -247,17 +214,15 @@ EQSTRT BEQ START ; IF END THEN STOP | ||
247 | 214 | LDX 0,X ; LOAD REAL LINE # |
248 | 215 | STX DOLR ; SAVE IT |
249 | 216 | LDX SAVLIN ; GET LINE |
250 | - INX ; BUMP PAST LINE # | |
251 | - INX ; BUMP PAST LINE # | |
252 | - INX ; BUMP PAST SPACE | |
217 | + LEAX 3,X ; BUMP PAST LINE # and SPACE | |
253 | 218 | BSR EXEC ; EXECUTE IT |
254 | 219 | BEQ LOOP3 ; IF ZERO, CONTINUE |
255 | - LDX SAVLIN ; FIND LINE | |
256 | - LDX 0,X ; GET IT | |
257 | - CPX DOLR ; HAS IT CHANGED? | |
220 | + LDX [SAVLIN] ; FIND LINE | |
221 | +* LDX 0,X ; GET IT | |
222 | + CMPX DOLR ; HAS IT CHANGED? | |
258 | 223 | BEQ LOOP3 ; IF NOT GET NEXT |
259 | 224 | * |
260 | - INX ; INCREMENT OLD LINE# | |
225 | + LEAX 1,X ; INCREMENT OLD LINE# | |
261 | 226 | STX EXCL ; SAVE FOR RETURN |
262 | 227 | BRA LOOP2 ; CONTINUE |
263 | 228 | * |
@@ -265,18 +230,18 @@ LOOP3 BSR FND3 ; FIND NEXT LINE | ||
265 | 230 | BRA EQSTRT ; CONTINUE |
266 | 231 | * |
267 | 232 | EXEC STX OPRLIN ; EXECUTE LINE |
268 | - JSR VAR2 | |
269 | - INX | |
233 | + LBSR VAR2 | |
234 | + LEAX 1,X | |
270 | 235 | * |
271 | -SKIP LDAA 0,X ; GET FIRST TERM | |
236 | +SKIP LDA 0,X ; GET FIRST TERM | |
272 | 237 | BSR EVIL ; EVALUATE EXPRESSION |
273 | 238 | OUTX LDX DOLR ; GET LINE # |
274 | 239 | RTS |
275 | 240 | * |
276 | 241 | EVIL CMPA #$22 ; IF " THEN BRANCH |
277 | 242 | BNE EVALU |
278 | - INX | |
279 | -STRGT JMP STRING ; TO PRINT IT | |
243 | + LEAX 1,X | |
244 | +STRGT LBRA STRING ; TO PRINT IT | |
280 | 245 | * |
281 | 246 | STMNT STX EDTLIN ; SAVE LINE # |
282 | 247 | STD DOLR |
@@ -284,63 +249,60 @@ STMNT STX EDTLIN ; SAVE LINE # | ||
284 | 249 | BNE SKP2 ; IF LINE# <> 0 |
285 | 250 | * |
286 | 251 | LDX #PRGM ; LIST PROGRAM |
287 | -LST2 CPX AMPR ; END OF PROGRAM | |
252 | +LST2 CMPX AMPR ; END OF PROGRAM | |
288 | 253 | BEQ EQSTRT |
289 | 254 | STX SAVLIN ; LINE # FOR CVDEC |
290 | 255 | LDD 0,X |
291 | - JSR PRNT2 | |
256 | + LBSR PRNT2 | |
292 | 257 | LDX SAVLIN |
293 | - INX | |
294 | - INX | |
295 | - JSR PNTMSG | |
296 | - JSR CRLF | |
258 | + LEAX 2,X | |
259 | + LBSR PNTMSG | |
260 | + LBSR CRLF | |
297 | 261 | BRA LST2 |
298 | 262 | * |
299 | 263 | NXTXT LDX SAVLIN ; GET POINTER |
300 | - INX ; BUMP PAST LINE# | |
301 | -LOOKAG INX ; FIND END OF LINE | |
264 | + LEAX 1,X ; BUMP PAST LINE# | |
265 | +LOOKAG LEAX 1,X ; FIND END OF LINE | |
302 | 266 | TST 0,X |
303 | 267 | BNE LOOKAG |
304 | - INX | |
268 | + LEAX 1,X | |
305 | 269 | RTS |
306 | 270 | * |
307 | 271 | FIND LDX #PRGM ; FIND LINE |
308 | 272 | FND2 STX SAVLIN |
309 | - CPX AMPR | |
273 | + CMPX AMPR | |
310 | 274 | BEQ RTS1 |
311 | -* LDAA 1,X ; almost missed this. | |
275 | +* LDA 1,X ; almost missed this. | |
312 | 276 | * SUBA DOLR+1 ; This was necessary because no SUBD |
313 | -* LDAA 0,X ; and CPX does not affect C flag on 6800 | |
277 | +* LDA 0,X ; and CPX does not affect C flag on 6800 | |
314 | 278 | * SBCA DOLR |
315 | -* PSHB ; B does not seem to be in use. | |
279 | +* PSHS B ; B does not seem to be in use. | |
316 | 280 | LDD 0,X ; Use D because we think we want to keep X. |
317 | 281 | SUBD DOLR |
318 | -* PULB | |
282 | +* PULS B | |
319 | 283 | BCC SET |
320 | 284 | FND3 BSR NXTXT |
321 | 285 | BRA FND2 |
322 | 286 | * |
323 | -SET LDAA #$FF ; SET NOT EQUAL | |
324 | -RTS1 RTS | |
287 | +SET LDA #$FF ; SET NOT EQUAL | |
288 | +RTS1 | |
289 | + RTS | |
325 | 290 | * |
326 | -EVALU JSR EVAL ; EVALUATE LINE | |
327 | - PSHB | |
328 | - PSHA | |
291 | +EVALU LBSR EVAL ; EVALUATE LINE | |
292 | + PSHS A,B ; A is pushed after B | |
329 | 293 | LDX OPRLIN |
330 | - JSR CONVP | |
331 | - PULA | |
294 | + LBSR CONVP | |
295 | + PULS A | |
332 | 296 | CMPB #'$ ; STRING? |
333 | 297 | BNE AR1 |
334 | - PULB | |
335 | - JMP OUTCH ; THEN PRINT IT | |
298 | + PULS B | |
299 | + LBRA OUTCH ; THEN PRINT IT | |
336 | 300 | AR1 SUBB #'? ; PRINT? |
337 | - BNE AR11 ; was out of range. | |
338 | - JMP PRNT ; THEN DO IT | |
339 | -* BEQ PRNT ; When we bring it back within range. | |
301 | + LBEQ PRNT | |
340 | 302 | AR11 INCB ; MACHINE LANGUAGE? |
341 | - PULB | |
303 | + PULS B | |
342 | 304 | BNE AR2 |
343 | - SWI ; THEN INTERUPT | |
305 | + SWI ; THEN INTERUPT (Need to fix this for CoCo -- and for MC-10.) | |
344 | 306 | * |
345 | 307 | AR2 STD 0,X ; STORE NEW VALUE |
346 | 308 | BNE AR2RND ; Initialize/don't get stuck on zero. |
@@ -351,31 +313,30 @@ AR2RND ADDB QUITE ; RANDOMIZER ; Adding the low byte to the high byte | ||
351 | 313 | STD QUITE |
352 | 314 | RTS |
353 | 315 | * |
354 | -SKP2 BSR FIND ; FIND LINE | |
316 | +SKP2 | |
317 | + BSR FIND ; FIND LINE | |
355 | 318 | BEQ INSRT ; IF NOT THERE |
356 | 319 | LDX 0,X ; THEN INSERT |
357 | - CPX DOLR ; NEW LINE | |
320 | + CMPX DOLR ; NEW LINE | |
358 | 321 | BNE INSRT |
359 | 322 | * |
360 | 323 | BSR NXTXT ; SETUP REGISTERS |
361 | 324 | * LDS SAVLIN ; FOR DELETE |
362 | - STX SRC | |
325 | + STX SRC ; Patience! we can use Y here after we make sure this runs. | |
363 | 326 | LDX SAVLIN |
364 | 327 | STX DST |
365 | 328 | * |
366 | 329 | DELT LDX SRC |
367 | - CPX AMPR ; DELETE OLD LINE | |
330 | + CMPX AMPR ; DELETE OLD LINE | |
368 | 331 | BEQ FITIT |
369 | - LDAA 0,X | |
370 | - INX | |
332 | + LDA ,X+ | |
371 | 333 | STX SRC |
372 | 334 | * PSHA |
373 | 335 | * INX |
374 | 336 | * INS |
375 | 337 | * INS |
376 | 338 | LDX DST |
377 | - STA 0,X | |
378 | - INX | |
339 | + STA ,X+ | |
379 | 340 | STX DST |
380 | 341 | BRA DELT |
381 | 342 | * |
@@ -383,12 +344,13 @@ DELT LDX SRC | ||
383 | 344 | FITIT LDX DST |
384 | 345 | STX AMPR ; STORE NEW END |
385 | 346 | * |
386 | -INSRT LDX EDTLIN ; COUNT NEW LINE LENGTH | |
387 | - LDAB #$03 | |
347 | +INSRT | |
348 | + LDX EDTLIN ; COUNT NEW LINE LENGTH | |
349 | + LDB #$03 | |
388 | 350 | TST 0,X |
389 | 351 | BEQ GOTIT ; IF NO LINE THEN STOP |
390 | 352 | CNTLN INCB ; count bytes |
391 | - INX | |
353 | + LEAX 1,X | |
392 | 354 | TST 0,X ; Find trailing NUL |
393 | 355 | BNE CNTLN |
394 | 356 | * |
@@ -396,33 +358,32 @@ OPEN CLRA ; CALCULATE NEW END | ||
396 | 358 | ADDD AMPR |
397 | 359 | STD INSPTR |
398 | 360 | SUBD STAR |
399 | - BCC RSTRT ; IF TOO BIG THEN STOP | |
361 | + LBCC START ; IF TOO BIG THEN STOP | |
400 | 362 | LDX AMPR |
401 | -* LDS INSPTR ; remember that the 6800/6801 stack is postdecrement push. | |
363 | +* LDS INSPTR ; Remember that the 6800/6801 stack is postdecrement push. | |
402 | 364 | * STS AMPR |
403 | - LDD INSPTR ; remember that the 6800/6801 stack is postdecrement push. | |
365 | + LDD INSPTR ; The 6809 stack is predecrement push, but that doesn't matter here. | |
404 | 366 | STD AMPR |
405 | -* | |
406 | -* LDS AMPR | |
407 | 367 | STD DST |
408 | - INX ; SLIDE OPEN GAP | |
409 | -SLIDE DEX ; going down | |
368 | + LEAX 1,X ; SLIDE OPEN GAP | |
369 | +SLIDE LEAX -1,X ; going down | |
410 | 370 | STX SRC |
411 | - LDAB 0,X | |
371 | + LDB 0,X | |
412 | 372 | * PSHB ; stack blast it |
413 | 373 | LDX DST |
414 | - STAB 0,X ; mimic 6800 push | |
415 | - DEX | |
374 | + STB 0,X ; mimic 6800 push | |
375 | + LEAX -1,X | |
416 | 376 | STX DST |
417 | 377 | LDX SRC |
418 | - CPX SAVLIN | |
378 | + CMPX SAVLIN | |
419 | 379 | BHI SLIDE |
420 | 380 | * |
421 | 381 | * DON LDS DOLR ; STORE LINE # |
422 | 382 | * STS 0,X |
423 | -DON LDD DOLR ; STORE LINE # | |
424 | - STD 0,X | |
425 | - STX DST ; will skip by offset store | |
383 | +DON | |
384 | + LDD DOLR ; STORE LINE # | |
385 | + STD 0,X ; Note MSB1st byte order implicit dependency here. | |
386 | + STX DST ; will skip by offset on store | |
426 | 387 | * LDS EDTLIN ; GET NEW LINE |
427 | 388 | * DES ; pre-increment |
428 | 389 | LDD EDTLIN ; GET NEW LINE |
@@ -432,107 +393,105 @@ DON LDD DOLR ; STORE LINE # | ||
432 | 393 | * PULB |
433 | 394 | * STAB 1,X ; (skips over low byte, BTW) |
434 | 395 | MOVL LDX SRC |
435 | - LDAB 0,X | |
436 | - INX | |
396 | + LDB ,X+ | |
437 | 397 | STX SRC |
438 | 398 | LDX DST |
439 | - INX ; skip over what was already stored (too tricky for words). | |
399 | + LEAX 1,X ; skip over what was already stored (too tricky for words). | |
440 | 400 | STX DST |
441 | - STAB 1,X ; note offset store | |
401 | + STB 1,X ; note offset store | |
442 | 402 | BNE MOVL ; until NUL stored |
443 | 403 | * |
444 | 404 | GOTIT |
445 | 405 | * LDS #STACK ; Ready for a new line of input. |
446 | - LDS USTKMK ; restore from mark | |
447 | - JMP LOOP | |
406 | + LDS STKMRK ; restore from mark | |
407 | + LBRA LOOP | |
448 | 408 | * |
449 | -RSTRT JMP START ; warm start over | |
409 | +* RSTRT LBRA START ; warm start over | |
450 | 410 | * |
451 | -PRNT PULB ; PRINT DECIMAL | |
411 | +PRNT PULS B ; PRINT DECIMAL | |
452 | 412 | PRNT2 LDX #DECBUF ; CONVERT TO DECIMAL |
453 | 413 | STX CNVPTR |
454 | 414 | LDX #PWRS10 |
455 | -CVD1 PSHX | |
415 | +CVD1 PSHS X | |
456 | 416 | LDX 0,X |
457 | 417 | STX VARADR |
458 | 418 | LDX #VARADR |
459 | - JSR DIVIDE | |
460 | - PSHA | |
419 | + LBSR DIVIDE | |
420 | + PSHS A | |
461 | 421 | LDX CNVPTR |
462 | - LDAA DIVQUO+1 | |
422 | + LDA DIVQUO+1 | |
463 | 423 | ADDA #'0 |
464 | - STAA 0,X | |
465 | - PULA | |
466 | - INX | |
424 | + STA 0,X | |
425 | + PULS A | |
426 | + LEAX 1,X | |
467 | 427 | STX CNVPTR |
468 | - PULX | |
469 | - INX | |
470 | - INX | |
428 | + PULS X | |
429 | + LEAX 2,X | |
471 | 430 | TST 1,X |
472 | 431 | BNE CVD1 |
473 | 432 | * |
474 | 433 | LDX #DECB_1 |
475 | 434 | COM 5,X ; ZERO SUPPRESS |
476 | -ZRSUP INX | |
477 | - LDAB 0,X | |
435 | +ZRSUP LEAX 1,X | |
436 | + LDB 0,X | |
478 | 437 | CMPB #'0 |
479 | 438 | BEQ ZRSUP |
480 | 439 | COM LASTD |
481 | 440 | * |
482 | 441 | PNTMSG CLRA ; ZERO FOR DELIM |
483 | -STRTMS STAA DELIM ; STORE DELIMTER | |
442 | +STRTMS STA DELIM ; STORE DELIMTER | |
484 | 443 | * |
485 | -OUTMSG LDAB 0,X ; GENERAL PURPOSE PRINT | |
486 | - INX | |
444 | +OUTMSG LDB ,X+ ; GENERAL PURPOSE PRINT | |
487 | 445 | CMPB DELIM |
488 | 446 | BEQ CTLC |
489 | - JSR OUTCH | |
447 | + LBSR OUTCH | |
490 | 448 | BRA OUTMSG |
491 | 449 | * |
492 | -CTLC JSR POLCAT ; POL FOR CHARACTER | |
493 | - BCC RTS2 | |
494 | - BSR INCH2 | |
450 | +CTLC | |
451 | + LBSR POLCAT ; POL FOR CHARACTER | |
452 | + BCC RTS2 ; return wherever we came from | |
453 | + LBSR INCH | |
495 | 454 | CMPB #BREAK ; BREAK KEY? |
496 | - BEQ RSTRT | |
455 | + LBEQ START | |
497 | 456 | * |
498 | -INCH2 JMP INCH | |
457 | +INCH2 LBRA INCH | |
499 | 458 | * |
500 | 459 | STRING BSR STRTMS ; PRINT STRING LITERAL |
501 | - LDAA 0,X | |
460 | + LDA 0,X | |
502 | 461 | CMPA #'; |
503 | 462 | BEQ OUTD |
504 | - JMP CRLF | |
463 | + LBRA CRLF | |
505 | 464 | * |
506 | 465 | EVAL BSR GETVAL ; EVALUATE EXPRESSION |
507 | 466 | * |
508 | -NXTRM PSHA | |
509 | - LDAA 0,X ; END OF LINE? | |
467 | +NXTRM PSHS A | |
468 | + LDA 0,X ; END OF LINE? | |
510 | 469 | BEQ OUTN |
511 | 470 | CMPA #') |
512 | -OUTN PULA | |
471 | +OUTN PULS A | |
513 | 472 | BEQ OUTD |
514 | 473 | BSR TERM |
515 | 474 | LDX PARSET |
516 | 475 | BRA NXTRM |
517 | 476 | * |
518 | -TERM PSHA ; GET VALUE | |
519 | - PSHB | |
520 | - LDAA 0,X | |
521 | - PSHA | |
522 | - INX | |
477 | +TERM PSHS A ; GET VALUE | |
478 | + PSHS B | |
479 | + LDA 0,X | |
480 | + PSHS A | |
481 | + LEAX 1,X | |
523 | 482 | BSR GETVAL |
524 | 483 | STD EVALPT |
525 | 484 | STX PARSET |
526 | 485 | LDX #EVALPT |
527 | - PULA | |
528 | - PULB | |
486 | + PULS A | |
487 | + PULS B | |
529 | 488 | * |
530 | 489 | CMPA #'* ; SEE IF * |
531 | 490 | BNE EVAL2 |
532 | - PULA ; MULTIPLY | |
491 | + PULS A ; MULTIPLY | |
533 | 492 | MULTIP STD MPLIER ; 2'S COMPLEMENT |
534 | - LDAB #$10 | |
535 | - STAB MLDVCT | |
493 | + LDB #$10 | |
494 | + STB MLDVCT | |
536 | 495 | CLRA |
537 | 496 | CLRB |
538 | 497 | * |
@@ -546,27 +505,27 @@ NOAD ASL 1,X | ||
546 | 505 | BNE MULT ; LOOP TIL DONE |
547 | 506 | RTS2 RTS |
548 | 507 | * |
549 | -GETVAL JSR CVBIN ; GET VALUE | |
508 | +GETVAL LBSR CVBIN ; GET VALUE | |
550 | 509 | BCC OUTV |
551 | 510 | CMPB #'? ; OF LITERAL |
552 | 511 | BNE VAR |
553 | - PSHX ; OR INPUT | |
554 | - JSR INLN | |
512 | + PSHS X ; OR INPUT | |
513 | + LBSR INLN | |
555 | 514 | BSR EVAL |
556 | - PULX | |
557 | -OUTD INX | |
515 | + PULS X | |
516 | +OUTD LEAX 1,X | |
558 | 517 | OUTV RTS |
559 | 518 | * |
560 | 519 | VAR CMPB #'$ ; OR STRING |
561 | 520 | BNE VAR1 |
562 | - BSR INCH2 | |
521 | + LBSR INCH | |
563 | 522 | CLRA |
564 | - INX | |
523 | + LEAX 1,X | |
565 | 524 | RTS |
566 | 525 | * |
567 | 526 | VAR1 CMPB #'( |
568 | 527 | BNE VAR2 |
569 | - INX | |
528 | + LEAX 1,X | |
570 | 529 | BRA EVAL |
571 | 530 | * |
572 | 531 | VAR2 BSR CONVP ; OR VARIABLE |
@@ -574,14 +533,14 @@ VAR2 BSR CONVP ; OR VARIABLE | ||
574 | 533 | LDX VARADR ; LOAD OLD INDEX |
575 | 534 | RTS |
576 | 535 | * |
577 | -ARRAY JSR EVAL ; LOCATE ARRAY ELEMENT | |
578 | - ASLD | |
536 | +ARRAY LBSR EVAL ; LOCATE ARRAY ELEMENT | |
537 | + ASLB | |
538 | + ROLA | |
579 | 539 | ADDD AMPR |
580 | 540 | BRA PACK |
581 | 541 | * |
582 | -CONVP LDAB 0,X ; GET LOCATION | |
583 | - INX | |
584 | - PSHB | |
542 | +CONVP LDB ,X+ ; GET LOCATION | |
543 | + PSHS B | |
585 | 544 | CMPB #': |
586 | 545 | BEQ ARRAY ; OF VARIABLE OR |
587 | 546 | CLRA ; ARRAY ELEMENT |
@@ -593,24 +552,24 @@ CONVP LDAB 0,X ; GET LOCATION | ||
593 | 552 | PACK STX VARADR ; STORE OLD INDEX |
594 | 553 | STD CNVPTR |
595 | 554 | LDX CNVPTR ; LOAD NEW INDEX |
596 | - PULB | |
555 | + PULS B | |
597 | 556 | RTS |
598 | 557 | * |
599 | 558 | EVAL2 CMPA #'+ ; ADDITION |
600 | 559 | BNE EVAL3 |
601 | - PULA | |
560 | + PULS A | |
602 | 561 | ADD ADDD 0,X |
603 | 562 | RTS |
604 | 563 | * |
605 | 564 | EVAL3 CMPA #'- ; SUBTRACTION |
606 | 565 | BNE EVAL4 |
607 | - PULA | |
566 | + PULS A | |
608 | 567 | SUBTR SUBD 0,X |
609 | 568 | RTS |
610 | 569 | * |
611 | 570 | EVAL4 CMPA #'/ ; SEE IF IT'S DIVIDE |
612 | 571 | BNE EVAL5 |
613 | - PULA | |
572 | + PULS A | |
614 | 573 | BSR DIVIDE |
615 | 574 | STD REMN |
616 | 575 | LDD DIVQUO |
@@ -618,19 +577,19 @@ EVAL4 CMPA #'/ ; SEE IF IT'S DIVIDE | ||
618 | 577 | * |
619 | 578 | EVAL5 SUBA #'= ; SEE IF EQUAL TEST |
620 | 579 | BNE EVAL6 |
621 | - PULA | |
622 | - BSR SUBTR | |
580 | + PULS A | |
581 | + SUBD 0,X ; missed this in the 6801 code! | |
623 | 582 | BNE NOTEQ |
624 | 583 | TSTB |
625 | 584 | BEQ EQL |
626 | -NOTEQ LDAB #$FF | |
585 | +NOTEQ LDB #$FF | |
627 | 586 | EQL BRA COMBOUT |
628 | 587 | * |
629 | 588 | EVAL6 DECA ; SEE IF LESS THAN TEST |
630 | - PULA | |
589 | + PULS A | |
631 | 590 | BEQ EVAL7 |
632 | 591 | * |
633 | -SUB2 BSR SUBTR | |
592 | +SUB2 SUBD 0,X | |
634 | 593 | ROLB |
635 | 594 | COMOUT CLRA |
636 | 595 | ANDB #$01 |
@@ -660,14 +619,15 @@ GOT INC MLDVCT | ||
660 | 619 | ROR 1,X |
661 | 620 | CLR DIVQUO |
662 | 621 | CLR DIVQUO+1 |
663 | -DIV2 BSR SUBTR | |
622 | +DIV2 SUBD 0,X | |
664 | 623 | BCC OK |
665 | 624 | ADDD 0,X |
666 | - CLC | |
625 | + ANDCC #$FE | |
667 | 626 | BRA DIVNOC ; instead of the trick |
668 | -* The 6801 CPX affects all relevant flags, can't use this trick. | |
669 | -* FCB $9C ; CPX | |
670 | -OK SEC ; $0D | |
627 | +* The 6809 CMPX affects all relevant flags, can't use this trick. | |
628 | +* And the op-codes are different in the 6809, too. | |
629 | +* FCB $9C ; CMPX | |
630 | +OK ORCC #$01 | |
671 | 631 | DIVNOC ROL DIVQUO+1 |
672 | 632 | ROL DIVQUO |
673 | 633 | DEC MLDVCT |
@@ -676,14 +636,14 @@ DIVNOC ROL DIVQUO+1 | ||
676 | 636 | ROR 1,X |
677 | 637 | BRA DIV2 |
678 | 638 | * |
679 | -TSTN LDAB 0,X ; TEST FOR NUMERIC | |
639 | +TSTN LDB 0,X ; TEST FOR NUMERIC | |
680 | 640 | CMPB #$3A |
681 | 641 | BPL NOTDEC |
682 | 642 | CMPB #'0 |
683 | 643 | BGE DONE |
684 | -NOTDEC SEC | |
644 | +NOTDEC ORCC #$01 | |
685 | 645 | RTS |
686 | -DONE CLC | |
646 | +DONE ANDCC #$FE | |
687 | 647 | DUN RTS |
688 | 648 | * |
689 | 649 | CVTLN BSR INLN |
@@ -697,30 +657,33 @@ CBLOOP ADDB 0,X | ||
697 | 657 | SUBB #'0 |
698 | 658 | SBCA #$00 |
699 | 659 | STD CVTSUM |
700 | - INX | |
701 | - PSHB | |
660 | + LEAX 1,X | |
661 | + PSHS B | |
702 | 662 | BSR TSTN |
703 | - PULB | |
663 | + PULS B | |
704 | 664 | BCS DONE |
705 | - ASLD | |
706 | - ASLD | |
665 | + ASLB | |
666 | + ROLA | |
667 | + ASLB | |
668 | + ROLA | |
707 | 669 | ADDD CVTSUM |
708 | - ASLD | |
670 | + ASLB | |
671 | + ROLA | |
709 | 672 | BRA CBLOOP |
710 | 673 | * |
711 | 674 | INLN6 CMPB #'@ ; CANCEL |
712 | 675 | BEQ NEWLIN |
713 | - INX ; '.' | |
714 | - CPX #ZERO+LINLEN+2 ; (Here's part of what we had to fix for moving the variables.) | |
676 | + LEAX 1,X ; '.' | |
677 | + CMPX #ZERO+LINLEN+2 ; (Here's part of what we had to fix for moving the variables.) | |
715 | 678 | BNE INLN2 |
716 | 679 | NEWLIN BSR CRLF |
717 | 680 | * |
718 | 681 | INLN LDX #ZERO+2 ; INPUT LINE FROM TERMINAL |
719 | -INLN5 DEX | |
720 | - CPX #ZERO ; Make this explicit to enable variables moved out of DP. | |
682 | +INLN5 LEAX -1,X | |
683 | + CMPX #ZERO ; Make this explicit to enable variables moved out of DP. | |
721 | 684 | BEQ NEWLIN ; (Was implicit zero compare X from DEX, now explicit.) |
722 | -INLN2 JSR INCH ; INPUT CHARACTER | |
723 | - STAB BUFOFF-1,X ; STORE IT | |
685 | +INLN2 LBSR INCH ; INPUT CHARACTER | |
686 | + STB BUFOFF-1,X ; STORE IT | |
724 | 687 | CMPB #$5F ; BACKSPACE? |
725 | 688 | BEQ INLN5 |
726 | 689 | * |
@@ -733,9 +696,9 @@ INLIN4 CLR BUFOFF-1,X ; CLEAR LAST CHAR | ||
733 | 696 | BRA LF |
734 | 697 | * |
735 | 698 | * CRLF JSR EPCRLF |
736 | -CRLF LDAB #$0D ; CARR-RET | |
699 | +CRLF LDB #$0D ; CARR-RET | |
737 | 700 | BSR OUTCH2 |
738 | -LF LDAB #$0A ; LINE FEED | |
701 | +LF LDB #$0A ; LINE FEED | |
739 | 702 | OUTCH2 BRA OUTCH |
740 | 703 | * |
741 | 704 | OKM FCB $0D |
@@ -749,21 +712,18 @@ OKM FCB $0D | ||
749 | 712 | * BNE TRMILP |
750 | 713 | * RTS |
751 | 714 | * |
752 | -* MC-10 BASIC ROM vectors | |
753 | -INCHV EQU $FFDC ; Scan keyboard | |
754 | -OUTCHV EQU $FFDE ; Write char to screen | |
715 | +* Color Computer BASIC ROM vectors | |
716 | +INCHV EQU $A000 ; Scan keyboard | |
717 | +OUTCHV EQU $A002 ; Write char to screen | |
755 | 718 | * |
756 | 719 | * RECEIVER POLLING |
757 | -POLCAT PSHA | |
758 | - PSHX | |
759 | - LDX INCHV ; at any rate, don't wait. | |
760 | - JSR 0,X ; | |
761 | - TAB ; MC-10 ROM says NUL is not input. | |
762 | - SEC | |
720 | +POLCAT PSHS A | |
721 | + JSR [INCHV] ; at any rate, don't wait. | |
722 | + TFR A,B ; because the source I'm working with expects it in B | |
723 | + ORCC #$01 | |
763 | 724 | BNE POLCATR ; Don't wait. |
764 | - CLC | |
765 | -POLCATR PULX | |
766 | - PULA | |
725 | + ANDCC #$FE | |
726 | +POLCATR PULS A | |
767 | 727 | RTS |
768 | 728 | *POLCAT LDAB ACIACS |
769 | 729 | * ASRB |
@@ -772,17 +732,14 @@ POLCATR PULX | ||
772 | 732 | * INPUT ONE CHAR INTO B ACCUMULATOR |
773 | 733 | INCH BSR POLCAT |
774 | 734 | BCC INCH ; Wait here. |
775 | - BSR OUTCH | |
735 | + BSR OUTCH ; echo | |
776 | 736 | RTS |
777 | 737 | * |
778 | 738 | * OUTPUT ONE CHAR |
779 | -OUTCH PSHA | |
780 | - PSHX | |
781 | - LDX OUTCHV | |
782 | - TBA | |
783 | - JSR 0,X | |
784 | - PULX | |
785 | - PULA | |
739 | +OUTCH PSHS B,A | |
740 | + TFR B,A | |
741 | + JSR [OUTCHV] | |
742 | + PULS A,B | |
786 | 743 | RTS |
787 | 744 | * |
788 | 745 | ORG COLD |