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.