Mercurial > hg > Members > kono > os9 > sbc09
comparison examples_forth/asm6309.4 @ 57:2088fd998865
sbc09 directry clean up
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 23 Jul 2018 16:07:12 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
56:4fa2bdb0c457 | 57:2088fd998865 |
---|---|
1 \ 6309 assembler | |
2 | |
3 BASE @ HEX | |
4 | |
5 : DEFER CREATE 0 , DOES> @ EXECUTE ; | |
6 : IS ' >BODY ! ; | |
7 | |
8 VOCABULARY ASSEMBLER | |
9 ASSEMBLER ALSO DEFINITIONS | |
10 | |
11 ' C! DEFER VC! IS VC! \ Vectorize the important words so we can cross | |
12 ' C@ DEFER VC@ IS VC@ \ assemble and self-assemble using the same code. | |
13 ' ! DEFER V! IS V! | |
14 ' @ DEFER V@ IS V@ | |
15 ' C, DEFER C, IS C, | |
16 ' , DEFER , IS , | |
17 ' HERE DEFER HERE IS HERE | |
18 ' ALLOT DEFER ALLOT IS ALLOT | |
19 | |
20 VARIABLE VDP | |
21 : VHERE ( --- addr) | |
22 VDP @ ; | |
23 : VALLOT VDP +! ; | |
24 : VC, ( c --- ) | |
25 VHERE VC! 1 VALLOT ; | |
26 : V, ( n ---) | |
27 VHERE V! 2 VALLOT ; | |
28 : ORG VDP ! ; | |
29 | |
30 : <MARK ( --- addr ) | |
31 HERE ; | |
32 : <RESOLVE ( addr ---) | |
33 HERE 1+ - C, ; | |
34 : >MARK ( --- addr ) | |
35 HERE 0 C, ; | |
36 : >RESOLVE ( addr --- ) | |
37 HERE OVER 1+ - SWAP VC! ; | |
38 | |
39 VARIABLE ?MEMIMM \ Memory + immediate (AIM, OIM, EOIM) | |
40 VARIABLE ?OPCODE VARIABLE OPCODE \ Opcode byte | |
41 VARIABLE ?POSTBYTE VARIABLE POSTBYTE \ Byte after opcode indicating mode. | |
42 VARIABLE ?OPERAND \ Address or data after instruction. | |
43 VARIABLE MODE \ True is direct addressing false is other. | |
44 VARIABLE DPAGE \ Direct page address. | |
45 : SETDP ( n ---) \ Set direct page. | |
46 100 * DPAGE ! ; | |
47 0 SETDP | |
48 | |
49 : NOINSTR \ Reset all the instruction flags so there will be no instruction. | |
50 ?OPCODE OFF ?POSTBYTE OFF ?OPERAND OFF MODE OFF ?MEMIMM OFF ; | |
51 : A; \ Assemble current instruction and reset instruction flags. | |
52 MODE @ IF \ direct addresiing? | |
53 DUP DPAGE @ - 0FF U> IF \ Is address 16 bits? | |
54 2 ?OPERAND ! \ Indicate 16 bits address. | |
55 OPCODE @ 0F0 AND 0= \ Change opcode byte. | |
56 IF 70 OPCODE +! | |
57 ELSE 20 OPCODE +! | |
58 THEN | |
59 ELSE 1 ?OPERAND ! \ Indicate 8 bis address. | |
60 THEN | |
61 THEN | |
62 ?OPCODE @ IF | |
63 OPCODE @ DUP 100 > IF | |
64 DUP 8 RSHIFT C, \ assemble prebyte | |
65 THEN | |
66 C, | |
67 THEN | |
68 ?MEMIMM @ IF | |
69 ?OPERAND @ IF SWAP THEN \ move immediate byte from under operand. | |
70 C, | |
71 THEN | |
72 ?POSTBYTE @ IF POSTBYTE @ C, THEN | |
73 ?OPERAND @ IF | |
74 CASE ?OPERAND @ | |
75 1 OF C, ENDOF \ 8 bits data/address. | |
76 2 OF , ENDOF \ 16 bits data/address. | |
77 3 OF HERE 1+ - C, ENDOF \ 8 bits relative address. | |
78 4 OF HERE 2 + - , ENDOF \ 16 bits relative address. | |
79 5 OF , , ENDOF \ 32 bits immediate (LDQ) | |
80 6 OF \ single-bit operations. | |
81 >R \ Save DP address. | |
82 SWAP 3 LSHIFT OR \ or the bit numbers together. | |
83 SWAP 6 AND 5 LSHIFT OR \ Add register number. | |
84 C, \ Store post-byte (reg-srcbit-dstbit) | |
85 R> C, \ Store direct address. | |
86 ENDOF \ LDBT etc. | |
87 ENDCASE | |
88 THEN NOINSTR ; | |
89 | |
90 | |
91 : LABEL A; HERE CONSTANT ; | |
92 | |
93 | |
94 HEX | |
95 | |
96 : # \ Signal immediate mode. | |
97 MODE OFF -10 OPCODE +! | |
98 ?OPERAND @ 5 = IF \ Special case is LDQ immediate. | |
99 0CD OPCODE ! | |
100 THEN | |
101 ; | |
102 | |
103 : USE-POSTBYTE \ Signal that postbyte must be used. | |
104 MODE OFF | |
105 ?POSTBYTE ON | |
106 OPCODE @ 0F0 AND 0= IF | |
107 60 OPCODE +! | |
108 ELSE | |
109 OPCODE @ 80 AND IF | |
110 10 OPCODE +! | |
111 THEN | |
112 THEN ; | |
113 | |
114 : [] \ Signal indirect mode. | |
115 MODE @ IF \ Indirect addressing with 16-bits addres, no postbyte made yet. | |
116 USE-POSTBYTE | |
117 9F POSTBYTE ! \ Make postbyte. | |
118 2 ?OPERAND ! \ Indicate 16-bits address. | |
119 ELSE | |
120 POSTBYTE @ 80 AND 0= IF \ 5-bits address format already assembled? | |
121 POSTBYTE @ 1F AND DUP 10 AND 0<> 0E0 AND OR | |
122 1 ?OPERAND ! \ Signal operand. | |
123 POSTBYTE @ 60 AND 98 OR POSTBYTE ! \ Change postbyte. | |
124 ELSE | |
125 POSTBYTE @ 9F AND 8F = | |
126 IF | |
127 POSTBYTE @ 1+ POSTBYTE ! \ special case for ,W indexing | |
128 ELSE | |
129 POSTBYTE @ 10 OR POSTBYTE ! \ Indicate indirect addressing. | |
130 THEN | |
131 THEN | |
132 THEN ; | |
133 | |
134 : ,R \ Modes with a constant offset from a register. | |
135 CREATE C, | |
136 DOES> USE-POSTBYTE | |
137 C@ POSTBYTE ! \ Make register field in postbyte. | |
138 DUP 0= IF | |
139 84 POSTBYTE +! DROP \ Zero offset. | |
140 ?OPERAND OFF | |
141 ELSE | |
142 DUP -10 >= OVER 0F <= AND IF \ 5-bit offset. | |
143 1F AND POSTBYTE +! | |
144 ?OPERAND OFF | |
145 ELSE | |
146 DUP 80 + 100 U< IF \ 8-bit offset. | |
147 88 POSTBYTE +! | |
148 1 ?OPERAND ! | |
149 ELSE | |
150 89 POSTBYTE +! \ 16-bit offset. | |
151 2 ?OPERAND ! | |
152 THEN | |
153 THEN | |
154 THEN ; | |
155 00 ,R ,X | |
156 20 ,R ,Y | |
157 40 ,R ,U | |
158 60 ,R ,S | |
159 | |
160 : ,W \ Addressing with constant offset from W register. | |
161 USE-POSTBYTE | |
162 DUP 0= IF | |
163 8F POSTBYTE ! DROP \ offset = 0 | |
164 ?OPERAND OFF | |
165 ELSE | |
166 0AF POSTBYTE ! \ 16-bit offset | |
167 2 ?OPERAND ! | |
168 THEN | |
169 ; | |
170 | |
171 : AMODE \ addressing modes with no operands. | |
172 CREATE C, | |
173 DOES> USE-POSTBYTE | |
174 C@ POSTBYTE ! | |
175 ?OPERAND OFF ; | |
176 080 AMODE ,X+ 081 AMODE ,X++ 082 AMODE ,-X 083 AMODE ,--X | |
177 085 AMODE B,X 086 AMODE A,X 08B AMODE D,X | |
178 087 AMODE E,X 08A AMODE F,X 08E AMODE W,X | |
179 0A0 AMODE ,Y+ 0A1 AMODE ,Y++ 0A2 AMODE ,-Y 0A3 AMODE ,--Y | |
180 0A5 AMODE B,Y 0A6 AMODE A,Y 0AB AMODE D,Y | |
181 0A7 AMODE E,Y 0AA AMODE F,Y 0AE AMODE W,Y | |
182 0C0 AMODE ,U+ 0C1 AMODE ,U++ 0C2 AMODE ,-U 0C3 AMODE ,--U | |
183 0C5 AMODE B,U 0C6 AMODE A,U 0CB AMODE D,U | |
184 0C7 AMODE E,U 0CA AMODE F,U 0CE AMODE W,U | |
185 0E0 AMODE ,S+ 0E1 AMODE ,S++ 0E2 AMODE ,-S 0E3 AMODE ,--S | |
186 0E5 AMODE B,S 0E6 AMODE A,S 0EB AMODE D,S | |
187 0E7 AMODE E,S 0EA AMODE F,S 0EE AMODE W,S | |
188 0CF AMODE ,W++ 0EF AMODE ,--W | |
189 | |
190 : ,PCR \ Signal program counter relative. | |
191 USE-POSTBYTE | |
192 DUP | |
193 HERE OPCODE @ 0FF U> - 3 + - \ Subtract address after instruction | |
194 80 + 100 U< IF \ 8-bits offset good? | |
195 3 ?OPERAND ! | |
196 8C POSTBYTE ! | |
197 ELSE | |
198 4 ?OPERAND ! | |
199 8D POSTBYTE ! | |
200 THEN ; | |
201 | |
202 : USE-OPCODE ( w ---) | |
203 ?OPCODE ON | |
204 OPCODE ! ; | |
205 | |
206 : GET-OPCODE ( addr -- )\ | |
207 >R A; R> @ USE-OPCODE ; | |
208 | |
209 : IN1 \ Simple instructions with only opcode, possibly prebyte | |
210 CREATE , | |
211 DOES> GET-OPCODE ; | |
212 12 IN1 NOP 13 IN1 SYNC | |
213 14 IN1 SEXW | |
214 19 IN1 DAA 1D IN1 SEX | |
215 39 IN1 RTS 3A IN1 ABX | |
216 3B IN1 RTI 3D IN1 MUL | |
217 1038 IN1 PSHSW 1039 IN1 PULSW | |
218 103A IN1 PSHUW 103B IN1 PULUW | |
219 3F IN1 SWI 103F IN1 SWI2 113F IN1 SWI3 | |
220 40 IN1 NEGA 50 IN1 NEGB | |
221 43 IN1 COMA 53 IN1 COMB | |
222 44 IN1 LSRA 54 IN1 LSRB | |
223 46 IN1 RORA 56 IN1 RORB | |
224 47 IN1 ASRA 57 IN1 ASRB | |
225 48 IN1 ASLA 58 IN1 ASLB | |
226 48 IN1 LSLA 58 IN1 LSLB | |
227 49 IN1 ROLA 59 IN1 ROLB | |
228 4A IN1 DECA 5A IN1 DECB | |
229 4C IN1 INCA 5C IN1 INCB | |
230 4D IN1 TSTA 5D IN1 TSTB | |
231 4F IN1 CLRA 5F IN1 CLRB | |
232 1040 IN1 NEGD 1050 IN1 NEGW | |
233 1043 IN1 COMD 1051 IN1 COMW | |
234 1044 IN1 LSRD 1054 IN1 LSRW | |
235 1046 IN1 RORD 1056 IN1 RORW | |
236 1047 IN1 ASRD \ what were they smoking when they decided to leave out ASRW/ASLW | |
237 1048 IN1 ASLD | |
238 1048 IN1 LSRD | |
239 1049 IN1 ROLD 1059 IN1 ROLW | |
240 104A IN1 DECD 105A IN1 DECW | |
241 104C IN1 INCD 105C IN1 INCW | |
242 104D IN1 TSTD 105D IN1 TSTW | |
243 104F IN1 CLRD 105F IN1 CLRW | |
244 1143 IN1 COME 1153 IN1 COMF | |
245 114A IN1 DECE 115A IN1 DECF | |
246 114C IN1 INCE 115C IN1 INCF | |
247 114D IN1 TSTE 115D IN1 TSTF | |
248 114F IN1 CLRE 115F IN1 CLRF | |
249 | |
250 \ Though not no-operand instructions the LEA instructions | |
251 \ are treated correctly as the postbyte is added by the mode words. | |
252 30 IN1 LEAX 31 IN1 LEAY | |
253 32 IN1 LEAS 33 IN1 LEAU | |
254 | |
255 : BR-8 \ relative branches with 8-bit offset | |
256 CREATE , | |
257 DOES> GET-OPCODE 3 ?OPERAND ! ; | |
258 20 BR-8 BRA 21 BR-8 BRN | |
259 22 BR-8 BHI 23 BR-8 BLS | |
260 24 BR-8 BCC 25 BR-8 BCS | |
261 24 BR-8 BHS 25 BR-8 BLO | |
262 26 BR-8 BNE 27 BR-8 BEQ | |
263 28 BR-8 BVC 29 BR-8 BVS | |
264 2A BR-8 BPL 2B BR-8 BMI | |
265 2C BR-8 BGE 2D BR-8 BLT | |
266 2E BR-8 BGT 2F BR-8 BLE | |
267 8D BR-8 BSR | |
268 | |
269 : LBRA | |
270 A; 16 USE-OPCODE 4 ?OPERAND ! ; | |
271 : LBSR | |
272 A; 17 USE-OPCODE 4 ?OPERAND ! ; | |
273 | |
274 : BR16 \ Relative branches with 16-bit offset. | |
275 CREATE , | |
276 DOES> GET-OPCODE 4 ?OPERAND ! ; | |
277 1021 BR16 LBRN | |
278 1022 BR16 LBHI 1023 BR16 LBLS | |
279 1024 BR16 LBCC 1025 BR16 LBCS | |
280 1024 BR16 LBHS 1025 BR16 LBLO | |
281 1026 BR16 LBNE 1027 BR16 LBEQ | |
282 1028 BR16 LBVC 1029 BR16 LBVS | |
283 102A BR16 LBPL 102B BR16 LBMI | |
284 102C BR16 LBGE 102D BR16 LBLT | |
285 102E BR16 LBGT 102F BR16 LBLE | |
286 | |
287 : IN2 \ Instructions with one immediate data byte. | |
288 CREATE , | |
289 DOES> GET-OPCODE 1 ?OPERAND ! ; | |
290 1A IN2 ORCC 1C IN2 ANDCC 3C IN2 CWAI | |
291 113C IN2 BITMD 113D IN2 LDMD | |
292 : % ( --- n) \ Interpret next word as a binary number. | |
293 BASE @ 2 BASE ! BL WORD NUMBER? drop DROP SWAP BASE ! ; | |
294 | |
295 : REG \ Registers as used in PUSH PULL TFR and EXG instructions. | |
296 CREATE C, C, | |
297 DOES> ?OPERAND @ IF \ Is a PUSH/PULL instruction meant? | |
298 1+ C@ OR | |
299 ELSE | |
300 C@ POSTBYTE +! \ It's a TFR,EXG instruction. | |
301 THEN ; | |
302 06 00 REG D, 06 00 REG D | |
303 10 10 REG X, 10 01 REG X | |
304 20 20 REG Y, 20 02 REG Y | |
305 40 30 REG U, 40 03 REG U | |
306 40 40 REG S, 40 04 REG S | |
307 80 50 REG PC, 80 05 REG PC | |
308 00 60 REG W, 00 06 REG W | |
309 00 70 REG V, 00 07 REG V | |
310 02 80 REG A, 02 08 REG A | |
311 04 90 REG B, 04 09 REG B | |
312 01 A0 REG CC, 01 0A REG CC | |
313 08 B0 REG DP, 08 0B REG DP | |
314 00 C0 REG Z, 08 0C REG Z \ Zero register. | |
315 00 E0 REG E, 00 0E REG E | |
316 00 F0 REG F, 00 0F REG F | |
317 | |
318 : R2R \ Reg to reg instructions | |
319 CREATE , DOES> GET-OPCODE ?POSTBYTE ON 0 POSTBYTE ! ; | |
320 1E R2R EXG | |
321 1F R2R TFR | |
322 1030 R2R ADDR | |
323 1031 R2R ADCR | |
324 1032 R2R SUBR | |
325 1033 R2R SBCR | |
326 1034 R2R ANDR | |
327 1035 R2R ORR | |
328 1036 R2R EORR | |
329 1037 R2R CMPR | |
330 | |
331 1138 R2R TFM++ \ TFM++ X, Y for tfm x+,y+ | |
332 1139 R2R TFM-- \ TFM-- X, Y for tfm x-,y- | |
333 113A R2R TFM+0 \ TFM+0 X, Y for tfm x+,y | |
334 113B R2R TFM0+ \ TFM0+ X, Y for tfm x,y+ | |
335 | |
336 | |
337 : STK \ Stack instructions. | |
338 CREATE , | |
339 DOES> GET-OPCODE | |
340 1 ?OPERAND ! 0 ; | |
341 34 STK PSHS 35 STK PULS | |
342 36 STK PSHU 37 STK PULU | |
343 | |
344 : OP-8 \ Instructions with 8-bits data. | |
345 CREATE , | |
346 DOES> GET-OPCODE | |
347 MODE ON | |
348 1 ?OPERAND ! ; | |
349 00 OP-8 NEG 03 OP-8 COM | |
350 04 OP-8 LSR 06 OP-8 ROR | |
351 07 OP-8 ASR 08 OP-8 ASL | |
352 08 OP-8 LSL 09 OP-8 ROL | |
353 0A OP-8 DEC 0C OP-8 INC | |
354 0D OP-8 TST 0E OP-8 JMP | |
355 0F OP-8 CLR | |
356 90 OP-8 SUBA 0D0 OP-8 SUBB | |
357 91 OP-8 CMPA 0D1 OP-8 CMPB | |
358 92 OP-8 SBCA 0D2 OP-8 SBCB | |
359 94 OP-8 ANDA 0D4 OP-8 ANDB | |
360 95 OP-8 BITA 0D5 OP-8 BITB | |
361 96 OP-8 LDA 0D6 OP-8 LDB | |
362 97 OP-8 STA 0D7 OP-8 STB | |
363 98 OP-8 EORA 0D8 OP-8 EORB | |
364 99 OP-8 ADCA 0D9 OP-8 ADCB | |
365 9A OP-8 ORA 0DA OP-8 ORB | |
366 9B OP-8 ADDA 0DB OP-8 ADDB | |
367 9D OP-8 JSR | |
368 1190 OP-8 SUBE 11D0 OP-8 SUBF | |
369 1191 OP-8 CMPE 11D1 OP-8 CMPF | |
370 1196 OP-8 LDE 11D6 OP-8 LDF | |
371 1197 OP-8 STE 11D7 OP-8 STF | |
372 119B OP-8 ADDE 11DB OP-8 ADDF | |
373 119D OP-8 DIVD | |
374 | |
375 : OP16 \ Instructions with 16-bits daia. | |
376 CREATE , | |
377 DOES> GET-OPCODE | |
378 MODE ON | |
379 2 ?OPERAND ! ; | |
380 93 OP16 SUBD 0D3 OP16 ADDD | |
381 9C OP16 CMPX 0DC OP16 LDD 0DD OP16 STD | |
382 9E OP16 LDX 0DE OP16 LDU | |
383 9F OP16 STX 0DF OP16 STU | |
384 1090 OP16 SUBW 1091 OP16 CMPW | |
385 1092 OP16 SBCD 1093 OP16 CMPD | |
386 1094 OP16 ANDD 1095 OP16 BITD | |
387 1096 OP16 LDW 1097 OP16 STW | |
388 1098 OP16 EORD 1099 OP16 ADCD | |
389 109A OP16 ORD 109B OP16 ADDW | |
390 109C OP16 CMPY | |
391 109E OP16 LDY 109F OP16 STY | |
392 10DE OP16 LDS 10DF OP16 STS | |
393 1193 OP16 CMPU 119C OP16 CMPS | |
394 119E OP16 DIVQ 119F OP16 MULD | |
395 | |
396 : OP32 \ Instructions with 32-bits daia. | |
397 CREATE , | |
398 DOES> GET-OPCODE | |
399 MODE ON | |
400 5 ?OPERAND ! ; | |
401 10DC OP32 LDQ 10DD OP32 STQ | |
402 | |
403 : OP-MEMIMM \ Instructions with memory addressing and 8-bit immediate | |
404 CREATE , | |
405 DOES> GET-OPCODE | |
406 MODE ON ?MEMIMM ON | |
407 1 ?OPERAND ! ; | |
408 01 OP-MEMIMM OIM | |
409 02 OP-MEMIMM AIM | |
410 05 OP-MEMIMM EIM | |
411 0B OP-MEMIMM TIM | |
412 | |
413 : OP-BIT \ Instructions for single bit in A,B,CC register and direct page. | |
414 CREATE , | |
415 DOES> GET-OPCODE | |
416 6 ?OPERAND ! 0 ; | |
417 1130 OP-BIT BAND | |
418 1131 OP-BIT BIAND | |
419 1132 OP-BIT BOR | |
420 1133 OP-BIT BIOR | |
421 1134 OP-BIT BEOR | |
422 1135 OP-BIT BIEOR | |
423 1136 OP-BIT LDBT | |
424 1137 OP-BIT STBT | |
425 | |
426 \ Structured assembler constructs. | |
427 : IF >R A; R> C, >MARK ; | |
428 : THEN A; >RESOLVE ; | |
429 : ELSE A; 20 C, >MARK SWAP >RESOLVE ; | |
430 : BEGIN A; <MARK ; | |
431 : UNTIL >R A; R> C, <RESOLVE ; | |
432 : WHILE >R A; R> C, >MARK ; | |
433 : REPEAT A; 20 C, SWAP <RESOLVE >RESOLVE ; | |
434 : AGAIN 20 UNTIL ; | |
435 22 CONSTANT U<= 23 CONSTANT U> | |
436 24 CONSTANT U< 25 CONSTANT U>= | |
437 26 CONSTANT 0= 27 CONSTANT 0<> | |
438 28 CONSTANT VS 29 CONSTANT VC | |
439 2A CONSTANT 0< 2B CONSTANT 0>= | |
440 2C CONSTANT < 2D CONSTANT >= | |
441 2E CONSTANT <= 2F CONSTANT > | |
442 | |
443 : ENDASM \ End assembly. | |
444 A; PREVIOUS ; | |
445 FORTH DEFINITIONS | |
446 : ASSEMBLE \ Start assembly. | |
447 ALSO ASSEMBLER NOINSTR ; | |
448 | |
449 : CODE CREATE -3 ALLOT ASSEMBLE ; | |
450 : END-CODE [ ASSEMBLER ] ENDASM [ FORTH ] ; | |
451 | |
452 PREVIOUS FORTH DEFINITIONS | |
453 | |
454 BASE ! \ Restore the original base. |