1: \ FORTH Assembler for R8C hfs 23:54 25.12.05
2: \
3: \ Autor: Heinz Schnitter (hfs)
4: \
5: \ Information:
6: \
7: \ - R8C.ASM is a table driven assembler.
8: \ - R8C.ASM supports OPCodes of Renesas R8C Microcomputer in
9: \ postfix notation.
10:
11: \ only forth definitions
12:
13: require asm/basic.fs
14:
15: also ASSEMBLER definitions
16:
17: require asm/target.fs
18:
19: \ for tests only hfs 07:47 04/24/92
20:
21: \ : TC, base @ >r hex 0 <# # # #> type r> base ! ;
22: \ : T, base @ >r hex 0 <# # # # # #> type r> base ! ;
23: : ta, base @ >r hex 0 <# # # # # # #> type r> base ! ;
24:
25:
26: HERE ( Begin )
27:
28: \ VARIABLEs and RESET hfs 10:03 04/23/92
29:
30: VARIABLE SSP \ save of SP
31: VARIABLE <,> \ two addrs
32: VARIABLE <M> \ mode searched for in table
33: VARIABLE <OPC> \ OPCode
34: VARIABLE <.B>
35: VARIABLE <S-OPND>
36: VARIABLE <D-OPND>
37:
38: : ssave SP@ SSP ! ;
39:
40: : RESET ( clears all variables )
41: 0 <M> C! $0FF <M> 1+ C!
42: 0 <OPC> C! $0FF <OPC> 1+ C!
43: <S-OPND> OFF <D-OPND> OFF
44: <,> OFF <.B> OFF ssave ;
45:
46: : opnd? ( -- N ) SSP @ SP@ - 1 cells - 1 cells / ;
47: : ,? <,> @ ;
48: : S-OPND? <S-OPND> @ ;
49: : D-OPND? <D-OPND> @ ;
50:
51: : WITHIN >R OVER > SWAP R> <= 0= OR 0= ;
52:
53: : 4B? ( n -- n f ) ( within -8 .. 7 ? )
54: DUP -$8 $7 WITHIN ;
55: : >4B? ( n -- n f ) 4B? 0= ;
56:
57: : 8B? ( n -- n f ) ( within -128 .. 127 ? )
58: DUP -$80 $7F WITHIN ;
59: : >8B? ( n -- n f ) 8B? 0= ;
60:
61: $0ff CONSTANT abs8
62: : abs8? ( n -- n f ) DUP abs8 u< ;
63: : >abs8? ( n -- n f ) abs8? 0= ;
64:
65: : >opc <M> 1+ C@ <OPC> 1+ C! ;
66:
67: : M: CREATE C, C,
68: DOES> ,?
69: IF dup C@ <M> c@ $F0 AND OR <M> c!
70: 1+ C@ <M> 1+ c@ $F0 AND OR <M> 1+ c!
71: ELSE dup C@ 4 lshift <M> c@ $0F AND OR <M> c!
72: 1+ C@ 4 lshift <M> 1+ c@ $0F AND OR <M> 1+ c!
73: THEN ;
74:
75: \ address-modes hfs
76:
77: %0000 0 M: R0 ' R0 alias R0L ' R0 alias R2R0 ' R0 alias C
78: %0001 0 M: R1 ' R1 alias R0H ' R1 alias R3R1 ' R1 alias D
79: %0010 0 M: R2 ' R2 alias R1L ' R2 alias Z
80: %0011 0 M: R3 ' R3 alias R1H ' R3 alias S
81: %0100 0 M: A0 ' A0 alias A1A0 ' A0 alias B
82: %0101 0 M: A1 ' A1 alias O
83: %0110 0 M: [A0] ' [A0] alias I
84: %0111 0 M: [A1] ' [A1] alias U
85: %1010 0 M: [SB]
86: %1011 0 M: [FB]
87: %1111 0 M: abs:16
88: %0000 1 M: #
89: %0001 1 M: INTBL
90: %0010 1 M: INTBH
91: %0011 1 M: FLG
92: %0100 1 M: ISP
93: %0101 1 M: SP
94: %0110 1 M: SB
95: %0111 1 M: FB
96:
97: \ %0000 2 M: [SP]
98:
99: \ two cells are used for each adress mode in the table:
100: \
101: \ cell 1 contains the src and dst MODE# searched for.
102: \
103: \ Cell 2 contains the xt of the action word for this address mode.
104: \
105: \ | #src#dst|src dst| |
106: \ |.....76543210 76543210 .....7654321076543210|
107: \ | MODE | xt |
108:
109: : TABLE: ( -- addr ) \ generate new table
110: CREATE HERE DUP 1 cells + , RESET ;
111:
112: : ;TABLE ( addr -- ) \ change endpoint
113: HERE SWAP ! ;
114:
115: : TAB, ( xt opcode -- )
116: <M> @ , , RESET ;
117:
118: : SEARCH.MODE.2 ( addr -- xt )
119: TRUE SWAP
120: DUP C@ <OPC> C! ( opc from GROUP2: )
121: DUP 1+ C@ <OPC> 1+ C! ( opc from GROUP2: )
122: 2 + @ DUP @ ( tableaddr )
123: SWAP 1 cells + ( end+2 begin )
124: ?DO [ forth ] I [ assembler ] @ <M> @ =
125: IF [ forth ] I [ assembler ] 1 cells + @ swap 0= LEAVE THEN
126: 2 cells +LOOP ABORT" Addressmode failed" ;
127:
128: : SEARCH.MODE.4 ( addr -- xt )
129: TRUE SWAP
130: DUP C@ <OPC> C! ( opc from GROUP4: )
131: DUP 1+ C@ <OPC> 1+ C! ( opc from GROUP4: )
132: DUP 2 + C@ <OPC> 2 + C! ( opc from GROUP4: )
133: DUP 3 + C@ <OPC> 3 + C! ( opc from GROUP4: )
134: 4 + @ DUP @ ( tableaddr )
135: SWAP 1 cells + ( end+2 begin )
136: ?DO [ forth ] I [ assembler ] @ <M> @ =
137: IF [ forth ] I [ assembler ] 1 cells + @ swap 0= LEAVE THEN
138: 2 cells +LOOP ABORT" Addressmode failed" ;
139:
140: \ GROUPS hfs 07:18 04/24/92
141:
142: : GROUP2: CREATE C, C, , ( xt opc opc -- )
143: DOES> SEARCH.MODE.2 EXECUTE RESET ;
144:
145: : GROUP4: CREATE C, C, C, C, , ( xt opc opc opc opc -- )
146: DOES> SEARCH.MODE.4 EXECUTE RESET ;
147:
148: \ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
149: : , opnd? <s-opnd> ! ssave <,> ON ;
150: \ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
151:
152: : OPC, <OPC> C@ X C, <OPC> 1+ C@ X C, ;
153:
154: : [An], <M> 1+ C@ $F0 AND
155: CASE
156: %01100000 of s-opnd? \ [A0]
157: IF abs8? IF %10000000 ELSE %11000000 THEN
158: <M> 1+ C@ $0F AND OR <M> 1+ C! THEN
159: endof
160: %01110000 of s-opnd? \ [A1]
161: IF abs8? IF %10010000 ELSE %11010000 THEN
162: <M> 1+ C@ $0F AND OR <M> 1+ C! THEN
163: endof
164: ENDCASE ;
165:
166: : ,[An] <M> 1+ C@ $0F AND
167: CASE
168: %0110 of d-opnd? \ [A0]
169: IF abs8? IF %1000 ELSE %1100 THEN
170: <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
171: endof
172: %0111 of d-opnd? \ [A1]
173: IF abs8? IF %1001 ELSE %1101 THEN
174: <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
175: endof
176: ENDCASE ;
177:
178: : [SB], s-opnd?
179: IF >abs8? IF %11100000 <M> 1+ C@ $0F AND OR <M> 1+ C! THEN
180: ELSE ." displacement expected" ABORT THEN ;
181:
182: : ,[SB] d-opnd?
183: IF >abs8? IF %1110 <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
184: ELSE ." displacement expected" ABORT THEN ;
185:
186: : [FB], s-opnd? 0= ABORT" displacement expected" ;
187:
188: : ,[FB] d-opnd? 0= ABORT" displacement expected" ;
189:
190: : abs:16, s-opnd? 0= ABORT" absolute Adr expected" ;
191:
192: : ,abs:16 d-opnd? 0= ABORT" absolute Adr expected" ;
193:
194: : #, s-opnd? 0= ABORT" operand expected"
195: <OPC> 2 + c@ %00000001 and 0= IF <.b> on THEN
196: <OPC> 2 + c@ <OPC> c!
197: <OPC> 3 + c@ <M> 1+ c@ $0F and or <M> 1+ c! ;
198:
199: : q#, s-opnd? 0= ABORT" operand expected"
200: s-opnd? d-opnd? and IF swap THEN
201: >4B? ABORT" immediate > 4 Bit"
202: 4 lshift <M> 1+ c@ $0F and or <M> 1+ c! ;
203:
204: : ctrl, <M> 1+ C@ %10000000 OR <M> 1+ C! ;
205:
206: : ,ctrl <M> 1+ C@ $0F and 4 lshift
207: <M> 1+ C@ $F0 and 4 rshift OR %10000000 or <M> 1+ C! ;
208: \ ----------------------------------------------------------------------------------------------
209: \ ----------------------------------------------------------------------------------------------
210: : GROUP.1B: CREATE C, ( opc -- )
211: DOES> c@ X C,
212: RESET ;
213: %00000100 GROUP.1B: nop
214: \ ----------------------------------------------------------------------------------------------
215: : GROUP.1B.l8: CREATE C, ( opc -- )
216: DOES> c@ X C,
217: opnd? 0= ABORT" label expected"
218: >8B? ABORT" label > 8 Bit" X C,
219: RESET ;
220: %01101000 GROUP.1B.l8: JGEU ' JGEU alias JC
221: %01101001 GROUP.1B.l8: JGTU
222: %01101010 GROUP.1B.l8: JEQ ' JEQ alias JZ
223: %01101011 GROUP.1B.l8: JN
224: %01101100 GROUP.1B.l8: JLTU ' JLTU alias JNC
225: %01101101 GROUP.1B.l8: JLEU
226: %01101110 GROUP.1B.l8: JNE ' JNE alias JNZ
227: %01101111 GROUP.1B.l8: JPZ
228: %11111110 GROUP.1B.l8: JMP.B
229: \ ----------------------------------------------------------------------------------------------
230: : GROUP.1B.l16: CREATE C, ( opc -- )
231: DOES> c@ X C,
232: opnd? 0= ABORT" label expected"
233: X ,
234: RESET ;
235: %11110100 GROUP.1B.l16: JMP.W
236: \ ----------------------------------------------------------------------------------------------
237: : GROUP.2B: CREATE C, C, ( opc opc -- )
238: DOES> dup c@ X C, 1+ c@ X C,
239: RESET ;
240: %11101001 %01111100 GROUP.2B: smovb.b
241: %11101000 %01111100 GROUP.2B: smovf.b
242: %11101010 %01111100 GROUP.2B: sstr.b
243:
244: %11101001 %01111101 GROUP.2B: smovb.w
245: %11101000 %01111101 GROUP.2B: smovf.w
246: %11101010 %01111101 GROUP.2B: sstr.w
247: \ ----------------------------------------------------------------------------------------------
248: : GROUP.2B.l8: CREATE C, C, ( opc opc -- )
249: DOES> dup c@ X C, 1+ c@ X C,
250: opnd? 0= ABORT" label expected"
251: >8B? ABORT" label > 8 Bit" X C,
252: RESET ;
253: %11001000 %01111101 GROUP.2B.l8: JLE
254: %11001001 %01111101 GROUP.2B.l8: JO
255: %11001010 %01111101 GROUP.2B.l8: JGE
256: %11001100 %01111101 GROUP.2B.l8: JGT
257: %11001101 %01111101 GROUP.2B.l8: JNO
258: %11001110 %01111101 GROUP.2B.l8: JLT
259: \ ----------------------------------------------------------------------------------------------
260: : GROUP.2B.F: CREATE C, C, ( opc opc -- )
261: DOES> dup c@ X C, 1+ c@ <M> 1+ C@ or X C,
262: RESET ;
263: %00000101 %11101011 GROUP.2B.F: FCLR
264: %00000100 %11101011 GROUP.2B.F: FSET
265: \ ----------------------------------------------------------------------------------------------
266: : ctrl,R opnd? <d-opnd> !
267: ctrl,
268: >opc OPC, ;
269:
270: : ctrl,[An] opnd? <d-opnd> !
271: ctrl, ,[An]
272: >opc OPC,
273: d-opnd?
274: IF abs8? IF X C, ELSE X , THEN THEN ;
275:
276: : ctrl,[SB] opnd? <d-opnd> !
277: ctrl, ,[SB]
278: >opc OPC,
279: abs8? IF X C, ELSE X , THEN ;
280:
281: : ctrl,[FB] opnd? <d-opnd> !
282: ctrl, ,[FB]
283: >opc OPC,
284: >8B? ABORT" displacement > 8 Bit"
285: X C, ;
286:
287: : ctrl,abs:16 opnd? <d-opnd> !
288: ctrl, ,abs:16
289: >opc OPC,
290: X , ;
291:
292: Table: st-control-reg
293: INTBL , R0 ' ctrl,R TAB, INTBL , R1 ' ctrl,R TAB,
294: INTBL , R2 ' ctrl,R TAB, INTBL , R3 ' ctrl,R TAB,
295: INTBL , A0 ' ctrl,R TAB, INTBL , A1 ' ctrl,R TAB,
296: INTBL , [A0] ' ctrl,[An] TAB, INTBL , [A1] ' ctrl,[An] TAB,
297: INTBL , [SB] ' ctrl,[SB] TAB, INTBL , [FB] ' ctrl,[FB] TAB,
298: INTBL , abs:16 ' ctrl,abs:16 TAB,
299: INTBH , R0 ' ctrl,R TAB, INTBH , R1 ' ctrl,R TAB,
300: INTBH , R2 ' ctrl,R TAB, INTBH , R3 ' ctrl,R TAB,
301: INTBH , A0 ' ctrl,R TAB, INTBH , A1 ' ctrl,R TAB,
302: INTBH , [A0] ' ctrl,[An] TAB, INTBH , [A1] ' ctrl,[An] TAB,
303: INTBH , [SB] ' ctrl,[SB] TAB, INTBH , [FB] ' ctrl,[FB] TAB,
304: INTBL , abs:16 ' ctrl,abs:16 TAB,
305: FLG , R0 ' ctrl,R TAB, FLG , R1 ' ctrl,R TAB,
306: FLG , R2 ' ctrl,R TAB, FLG , R3 ' ctrl,R TAB,
307: FLG , A0 ' ctrl,R TAB, FLG , A1 ' ctrl,R TAB,
308: FLG , [A0] ' ctrl,[An] TAB, FLG , [A1] ' ctrl,[An] TAB,
309: FLG , [SB] ' ctrl,[SB] TAB, FLG , [FB] ' ctrl,[FB] TAB,
310: FLG , abs:16 ' ctrl,abs:16 TAB,
311: ISP , R0 ' ctrl,R TAB, ISP , R1 ' ctrl,R TAB,
312: ISP , R2 ' ctrl,R TAB, ISP , R3 ' ctrl,R TAB,
313: ISP , A0 ' ctrl,R TAB, ISP , A1 ' ctrl,R TAB,
314: ISP , [A0] ' ctrl,[An] TAB, ISP , [A1] ' ctrl,[An] TAB,
315: ISP , [SB] ' ctrl,[SB] TAB, ISP , [FB] ' ctrl,[FB] TAB,
316: ISP , abs:16 ' ctrl,abs:16 TAB,
317: SP , R0 ' ctrl,R TAB, SP , R1 ' ctrl,R TAB,
318: SP , R2 ' ctrl,R TAB, SP , R3 ' ctrl,R TAB,
319: SP , A0 ' ctrl,R TAB, SP , A1 ' ctrl,R TAB,
320: SP , [A0] ' ctrl,[An] TAB, SP , [A1] ' ctrl,[An] TAB,
321: SP , [SB] ' ctrl,[SB] TAB, SP , [FB] ' ctrl,[FB] TAB,
322: SP , abs:16 ' ctrl,abs:16 TAB,
323: SB , R0 ' ctrl,R TAB, SB , R1 ' ctrl,R TAB,
324: SB , R2 ' ctrl,R TAB, SB , R3 ' ctrl,R TAB,
325: SB , A0 ' ctrl,R TAB, SB , A1 ' ctrl,R TAB,
326: SB , [A0] ' ctrl,[An] TAB, SB , [A1] ' ctrl,[An] TAB,
327: SB , [SB] ' ctrl,[SB] TAB, SB , [FB] ' ctrl,[FB] TAB,
328: SB , abs:16 ' ctrl,abs:16 TAB,
329: FB , R0 ' ctrl,R TAB, FB , R1 ' ctrl,R TAB,
330: FB , R2 ' ctrl,R TAB, FB , R3 ' ctrl,R TAB,
331: FB , A0 ' ctrl,R TAB, FB , A1 ' ctrl,R TAB,
332: FB , [A0] ' ctrl,[An] TAB, FB , [A1] ' ctrl,[An] TAB,
333: FB , [SB] ' ctrl,[SB] TAB, FB , [FB] ' ctrl,[FB] TAB,
334: FB , abs:16 ' ctrl,abs:16 TAB,
335:
336: ;TABLE
337:
338: st-control-reg %11111111 %01111011 GROUP2: stc
339:
340: \ ----------------------------------------------------------------------------------------------
341: : R,ctrl ,ctrl
342: >opc OPC, ;
343:
344: : [An],ctrl opnd? <d-opnd> !
345: [An], ,ctrl
346: >opc OPC,
347: s-opnd?
348: IF abs8? IF X C, ELSE X , THEN THEN ;
349:
350: : [SB],ctrl opnd? <d-opnd> !
351: [SB], ,ctrl
352: >opc OPC,
353: abs8? IF X C, ELSE X , THEN ;
354:
355: : [FB],ctrl opnd? <d-opnd> !
356: [FB], ,ctrl
357: >opc OPC,
358: >8B? ABORT" displacement > 8 Bit"
359: X C, ;
360:
361: : #,ctrl #, ,ctrl
362: <M> 1+ C@ %01110000 and <M> 1+ C!
363: >opc OPC,
364: X , ;
365:
366: Table: ld-control-reg
367: R0 , INTBL ' R,ctrl TAB, R0 , INTBH ' R,ctrl TAB,
368: R0 , FLG ' R,ctrl TAB, R0 , ISP ' R,ctrl TAB,
369: R0 , SP ' R,ctrl TAB, R0 , SB ' R,ctrl TAB,
370: R0 , FB ' R,ctrl TAB,
371: R1 , INTBL ' R,ctrl TAB, R1 , INTBH ' R,ctrl TAB,
372: R1 , FLG ' R,ctrl TAB, R1 , ISP ' R,ctrl TAB,
373: R1 , SP ' R,ctrl TAB, R1 , SB ' R,ctrl TAB,
374: R1 , FB ' R,ctrl TAB,
375: R2 , INTBL ' R,ctrl TAB, R2 , INTBH ' R,ctrl TAB,
376: R2 , FLG ' R,ctrl TAB, R2 , ISP ' R,ctrl TAB,
377: R2 , SP ' R,ctrl TAB, R2 , SB ' R,ctrl TAB,
378: R2 , FB ' R,ctrl TAB,
379: R3 , INTBL ' R,ctrl TAB, R3 , INTBH ' R,ctrl TAB,
380: R3 , FLG ' R,ctrl TAB, R3 , ISP ' R,ctrl TAB,
381: R3 , SP ' R,ctrl TAB, R3 , SB ' R,ctrl TAB,
382: R3 , FB ' R,ctrl TAB,
383: A0 , INTBL ' R,ctrl TAB, A0 , INTBH ' R,ctrl TAB,
384: A0 , FLG ' R,ctrl TAB, A0 , ISP ' R,ctrl TAB,
385: A0 , SP ' R,ctrl TAB, A0 , SB ' R,ctrl TAB,
386: A0 , FB ' R,ctrl TAB,
387: A1 , INTBL ' R,ctrl TAB, A1 , INTBH ' R,ctrl TAB,
388: A1 , FLG ' R,ctrl TAB, A1 , ISP ' R,ctrl TAB,
389: A1 , SP ' R,ctrl TAB, A1 , SB ' R,ctrl TAB,
390: A1 , FB ' R,ctrl TAB,
391: [A0] , INTBL ' [An],ctrl TAB, [A0] , INTBH ' [An],ctrl TAB,
392: [A0] , FLG ' [An],ctrl TAB, [A0] , ISP ' [An],ctrl TAB,
393: [A0] , SP ' [An],ctrl TAB, [A0] , SB ' [An],ctrl TAB,
394: [A0] , FB ' [An],ctrl TAB,
395: [A1] , INTBL ' [An],ctrl TAB, [A1] , INTBH ' [An],ctrl TAB,
396: [A1] , FLG ' [An],ctrl TAB, [A1] , ISP ' [An],ctrl TAB,
397: [A1] , SP ' [An],ctrl TAB, [A1] , SB ' [An],ctrl TAB,
398: [A1] , FB ' [An],ctrl TAB,
399: [SB] , INTBL ' [SB],ctrl TAB, [SB] , INTBH ' [SB],ctrl TAB,
400: [SB] , FLG ' [SB],ctrl TAB, [SB] , ISP ' [SB],ctrl TAB,
401: [SB] , SP ' [SB],ctrl TAB, [SB] , SB ' [SB],ctrl TAB,
402: [SB] , FB ' [FB],ctrl TAB,
403: [FB] , INTBL ' [FB],ctrl TAB, [FB] , INTBH ' [FB],ctrl TAB,
404: [FB] , FLG ' [FB],ctrl TAB, [FB] , ISP ' [FB],ctrl TAB,
405: [FB] , SP ' [FB],ctrl TAB, [FB] , SB ' [FB],ctrl TAB,
406: [FB] , FB ' [FB],ctrl TAB,
407: # , INTBL ' #,ctrl TAB, # , INTBH ' #,ctrl TAB,
408: # , FLG ' #,ctrl TAB, # , ISP ' #,ctrl TAB,
409: # , SP ' #,ctrl TAB, # , SB ' #,ctrl TAB,
410: # , FB ' #,ctrl TAB,
411: ;TABLE
412:
413: ld-control-reg %00000000 %11101011 %11111111 %01111010 GROUP4: ldc
414:
415: \ ----------------------------------------------------------------------------------------------
416: : (R) <OPC> 1+ c@ <M> 1+ c@ 4 rshift or <M> 1+ c!
417: >opc OPC, ;
418:
419:
420: : ([An]) <OPC> 1+ c@ <M> 1+ c@ 4 rshift or <M> 1+ c!
421: <M> 1+ C@ $0F AND
422: CASE
423: %0110 of opnd? \ [A0]
424: IF abs8? IF %1000 ELSE %1100 THEN
425: <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
426: endof
427: %0111 of opnd? \ [A1]
428: IF abs8? IF %1001 ELSE %1101 THEN
429: <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
430: endof
431: ENDCASE
432: >opc OPC,
433: <opc> c@ %01111101 = <opc> 1+ c@ %00101100 = and \ $12345 [ao] jmpi.w
434: <opc> c@ %01111101 = <opc> 1+ c@ %00101101 = and \ $12345 [a1] jmpi.w
435: or
436: IF opnd? IF 8B? IF X C, ELSE ta, THEN THEN
437: ELSE opnd? IF 8B? IF X C, ELSE X , THEN THEN THEN ;
438:
439: : ([SB]) <OPC> 1+ c@ <M> 1+ c@ 4 rshift or <M> 1+ c!
440: opnd? <d-opnd> !
441: ,[SB]
442: >opc OPC,
443: 8B? IF X C, ELSE X , THEN ;
444:
445: : ([FB]) <OPC> 1+ c@ <M> 1+ c@ 4 rshift or <M> 1+ c!
446: opnd? <d-opnd> !
447: ,[FB]
448: >opc OPC,
449: X C, ;
450:
451: : (abs:16) <OPC> 1+ c@ <M> 1+ c@ 4 rshift or <M> 1+ c!
452: opnd? <d-opnd> !
453: ,abs:16
454: >opc OPC,
455: X , ;
456:
457: : (#) opnd? 0= ABORT" operand expected"
458: <OPC> 1+ c@ %01000000 =
459: IF <OPC> c@
460: CASE
461: %01110100 OF %01111100 <OPC> c! ENDOF
462: %01110101 OF %01111101 <OPC> c! ENDOF
463: ENDCASE
464: ELSE
465: ." push.?:g only" ABORT
466: THEN %11100010 <M> 1+ c!
467: >opc OPC,
468: 8B? IF X C, ELSE X , THEN ;
469:
470: Table: 2ByteOPC(dsp8/dsp16) \ 2ByteOPC(dsp8/dsp16)
471: R0 ' (R) TAB, R1 ' (R) TAB,
472: R2 ' (R) TAB, R3 ' (R) TAB,
473: A0 ' (R) TAB, A1 ' (R) TAB,
474: [A0] ' ([An]) TAB, [A1] ' ([An]) TAB,
475: [SB] ' ([SB]) TAB, [FB] ' ([FB]) TAB,
476: abs:16 ' (abs:16) TAB, # ' (#) TAB,
477: ;TABLE
478:
479: 2ByteOPC(dsp8/dsp16) %11110000 %01110110 GROUP2: abs.b
480: 2ByteOPC(dsp8/dsp16) %11100000 %01110110 GROUP2: adcf.b
481: 2ByteOPC(dsp8/dsp16) %11010000 %01110110 GROUP2: div.b
482: 2ByteOPC(dsp8/dsp16) %11000000 %01110110 GROUP2: divu.b
483: 2ByteOPC(dsp8/dsp16) %10010000 %01110110 GROUP2: divx.b
484: 2ByteOPC(dsp8/dsp16) %01010000 %01110100 GROUP2: neg.b
485: 2ByteOPC(dsp8/dsp16) %01110000 %01110100 GROUP2: not.b:g
486: 2ByteOPC(dsp8/dsp16) %11010000 %01110100 GROUP2: pop.b:g
487: 2ByteOPC(dsp8/dsp16) %01000000 %01110100 GROUP2: push.b:g
488: 2ByteOPC(dsp8/dsp16) %10100000 %01110110 GROUP2: rolc.b
489: 2ByteOPC(dsp8/dsp16) %10110000 %01110110 GROUP2: rorc.b
490:
491: 2ByteOPC(dsp8/dsp16) %11110000 %01110111 GROUP2: abs.w
492: 2ByteOPC(dsp8/dsp16) %11100000 %01110111 GROUP2: adcf.w
493: 2ByteOPC(dsp8/dsp16) %11010000 %01110111 GROUP2: div.w
494: 2ByteOPC(dsp8/dsp16) %11000000 %01110111 GROUP2: divu.w
495: 2ByteOPC(dsp8/dsp16) %10010000 %01110111 GROUP2: divx.w
496: 2ByteOPC(dsp8/dsp16) %01010000 %01110101 GROUP2: neg.w
497: 2ByteOPC(dsp8/dsp16) %01110000 %01110101 GROUP2: not.w:g
498: 2ByteOPC(dsp8/dsp16) %11010000 %01110101 GROUP2: pop.w:g
499: 2ByteOPC(dsp8/dsp16) %01000000 %01110101 GROUP2: push.w:g
500: 2ByteOPC(dsp8/dsp16) %10100000 %01110111 GROUP2: rolc.w
501: 2ByteOPC(dsp8/dsp16) %10110000 %01110111 GROUP2: rorc.w
502:
503: 2ByteOPC(dsp8/dsp16) %00100000 %01111101 GROUP2: jmpi.w
504: 2ByteOPC(dsp8/dsp16) %00000000 %01111101 GROUP2: jmpi.a
505:
506: \ ----------------------------------------------------------------------------------------------
507: : q#,R opnd? <d-opnd> !
508: q#,
509: >opc OPC, ;
510:
511: : q#,[an] opnd? <d-opnd> !
512: q#, ,[an]
513: >opc OPC,
514: d-opnd?
515: IF abs8? IF X C, ELSE X , THEN THEN ;
516:
517: : q#,[sb] opnd? <d-opnd> !
518: q#, ,[sb]
519: >opc OPC,
520: abs8? IF X C, ELSE X , THEN ;
521:
522: : q#,[fb] opnd? <d-opnd> !
523: q#, ,[fb]
524: >opc OPC,
525: X C, ;
526:
527: : q#,abs:16 opnd? <d-opnd> !
528: q#, ,abs:16
529: >opc OPC,
530: X , ;
531: Table: quick
532: # , R0 ' q#,R TAB, # , R1 ' q#,R TAB,
533: # , R2 ' q#,R TAB, # , R3 ' q#,R TAB,
534: # , A0 ' q#,R TAB, # , A1 ' q#,R TAB,
535: # , [A0] ' q#,[An] TAB, # , [A1] ' q#,[An] TAB,
536: # , [SB] ' q#,[SB] TAB, # , [FB] ' q#,[FB] TAB,
537: # , abs:16 ' q#,abs:16 TAB,
538: ;TABLE
539:
540: quick %00000000 %11001000 GROUP2: add.b:q
541: quick %00000000 %11010000 GROUP2: cmp.b:q
542: quick %00000000 %11011000 GROUP2: mov.b:q
543:
544: quick %00000000 %11001001 GROUP2: add.w:q
545: quick %00000000 %11010001 GROUP2: cmp.w:q
546: quick %00000000 %11011001 GROUP2: mov.w:q
547:
548: \ ----------------------------------------------------------------------------------------------
549: : R,R >opc OPC, ;
550:
551: : R,[An] opnd? <d-opnd> !
552: ,[An]
553: >opc OPC,
554: d-opnd?
555: IF abs8? IF X C, ELSE X , THEN THEN ;
556:
557: : R,[SB] opnd? <d-opnd> !
558: ,[SB]
559: >opc OPC,
560: abs8? IF X C, ELSE X , THEN ;
561:
562: : R,[FB] opnd? <d-opnd> !
563: ,[FB]
564: >opc OPC,
565: >8B? ABORT" displacement > 8 Bit"
566: X C, ;
567:
568: : R,abs:16 opnd? <d-opnd> !
569: ,abs:16
570: >opc OPC,
571: X , ;
572: \ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
573: : [An],R opnd? <d-opnd> !
574: [An],
575: >opc OPC,
576: s-opnd?
577: IF abs8? IF X C, ELSE X , THEN THEN ;
578:
579: : [An],[An] opnd? <d-opnd> !
580: [An], ,[An]
581: >opc OPC,
582: s-opnd? d-opnd? and IF swap THEN
583: s-opnd?
584: IF abs8? IF X C, ELSE X , THEN THEN
585: d-opnd?
586: IF abs8? IF X C, ELSE X , THEN THEN ;
587:
588: : [An],[SB] opnd? <d-opnd> !
589: [An], ,[SB]
590: >opc OPC,
591: s-opnd? d-opnd? and IF swap THEN
592: s-opnd?
593: IF abs8? IF X C, ELSE X , THEN THEN
594: abs8? IF X C, ELSE X , THEN ;
595:
596: : [An],[FB] opnd? <d-opnd> !
597: [An], ,[FB]
598: >opc OPC,
599: s-opnd? d-opnd? and IF swap THEN
600: s-opnd?
601: IF abs8? IF X C, ELSE X , THEN THEN
602: >8B? ABORT" displacement > 8 Bit"
603: X C, ;
604:
605: : [An],abs:16 opnd? <d-opnd> !
606: [An], ,abs:16
607: >opc OPC,
608: s-opnd? d-opnd? and IF swap THEN
609: s-opnd?
610: IF abs8? IF X C, ELSE X , THEN THEN
611: X , ;
612: \ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
613: : [SB],R opnd? <d-opnd> !
614: [SB],
615: >opc OPC,
616: abs8? IF X C, ELSE X , THEN ;
617:
618: : [SB],[An] opnd? <d-opnd> !
619: [SB], ,[An]
620: >opc OPC,
621: s-opnd? d-opnd? and IF swap THEN
622: abs8? IF X C, ELSE X , THEN
623: d-opnd?
624: IF abs8? IF X C, ELSE X , THEN THEN ;
625:
626: : [SB],[SB] opnd? <d-opnd> !
627: [SB], ,[SB]
628: >opc OPC,
629: swap
630: abs8? IF X C, ELSE X , THEN
631: abs8? IF X C, ELSE X , THEN ;
632:
633: : [SB],[FB] opnd? <d-opnd> !
634: [SB], ,[FB]
635: >opc OPC,
636: swap
637: abs8? IF X C, ELSE X , THEN
638: >8B? ABORT" displacement > 8 Bit"
639: X C, ;
640:
641: : [SB],abs:16 opnd? <d-opnd> !
642: [SB], ,abs:16
643: >opc OPC,
644: swap
645: abs8? IF X C, ELSE X , THEN
646: X , ;
647: \ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
648: : [FB],R opnd? <d-opnd> !
649: [FB],
650: >opc OPC,
651: >8B? ABORT" displacement > 8 Bit"
652: X C, ;
653:
654: : [FB],[An] opnd? <d-opnd> !
655: [FB], ,[An]
656: >opc OPC,
657: s-opnd? d-opnd? and IF swap THEN
658: >8B? ABORT" displacement > 8 Bit"
659: X C,
660: d-opnd?
661: IF abs8? IF X C, ELSE X , THEN THEN ;
662:
663: : [FB],[SB] opnd? <d-opnd> !
664: [FB], ,[SB]
665: >opc OPC,
666: swap
667: >8B? ABORT" displacement > 8 Bit"
668: X C,
669: abs8? IF X C, ELSE X , THEN ;
670:
671: : [FB],[FB] opnd? <d-opnd> !
672: [FB], ,[FB]
673: >opc OPC,
674: swap
675: >8B? ABORT" displacement > 8 Bit"
676: X C,
677: d-opnd?
678: IF 8B? IF X C, ELSE X , THEN THEN ;
679:
680: : [FB],abs:16 opnd? <d-opnd> !
681: [FB], ,abs:16
682: >opc OPC,
683: swap
684: >8B? ABORT" displacement > 8 Bit"
685: X C,
686: X , ;
687: \ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
688: : abs:16,R opnd? <d-opnd> !
689: abs:16,
690: >opc OPC,
691: X , ;
692:
693: : abs:16,[An] opnd? <d-opnd> !
694: abs:16, ,[An]
695: >opc OPC,
696: s-opnd? d-opnd? and IF swap THEN
697: X ,
698: d-opnd?
699: IF abs8? IF X C, ELSE X , THEN THEN ;
700:
701: : abs:16,[SB] opnd? <d-opnd> !
702: abs:16, ,[SB]
703: >opc OPC,
704: swap
705: X ,
706: abs8? IF X C, ELSE X , THEN ;
707:
708: : abs:16,[FB] opnd? <d-opnd> !
709: abs:16, ,[FB]
710: >opc OPC,
711: swap
712: X ,
713: >8B? ABORT" displacement > 8 Bit"
714: X C, ;
715:
716: : abs:16,abs:16 opnd? <d-opnd> !
717: abs:16, ,abs:16
718: >opc OPC,
719: swap
720: X ,
721: X , ;
722: \ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
723: : #,R opnd? <d-opnd> !
724: #,
725: >opc OPC,
726: <.b> @ IF X C, ELSE X , THEN ;
727:
728: : #,[An] opnd? <d-opnd> !
729: #, ,[An]
730: >opc OPC,
731: d-opnd?
732: IF abs8? IF X C, ELSE X , THEN THEN
733: <.b> @ IF X C, ELSE X , THEN ;
734:
735: : #,[SB] opnd? <d-opnd> !
736: #, ,[SB]
737: >opc OPC,
738: abs8? IF X C, ELSE X , THEN
739: <.b> @ IF X C, ELSE X , THEN ;
740:
741: : #,[FB] opnd? <d-opnd> !
742: #, ,[FB]
743: >opc OPC,
744: >8B? ABORT" displacement > 8 Bit"
745: X C,
746: <.b> @ IF X C, ELSE X , THEN ;
747:
748: : #,abs:16 opnd? <d-opnd> !
749: #, ,abs:16
750: >opc OPC,
751: X ,
752: <.b> @ IF X C, ELSE X , THEN ;
753: \ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
754: Table: generic
755: R0 , R0 ' R,R TAB, R0 , R1 ' R,R TAB,
756: R0 , R2 ' R,R TAB, R0 , R3 ' R,R TAB,
757: R0 , A0 ' R,R TAB, R0 , A1 ' R,R TAB,
758: R0 , [A0] ' R,[An] TAB, R0 , [A1] ' R,[An] TAB,
759: R0 , [SB] ' R,[SB] TAB, R0 , [FB] ' R,[FB] TAB,
760: R0 , abs:16 ' R,abs:16 TAB,
761:
762: R1 , R0 ' R,R TAB, R1 , R1 ' R,R TAB,
763: R1 , R2 ' R,R TAB, R1 , R3 ' R,R TAB,
764: R1 , A0 ' R,R TAB, R1 , A1 ' R,R TAB,
765: R1 , [A0] ' R,[An] TAB, R1 , [A1] ' R,[An] TAB,
766: R1 , [SB] ' R,[SB] TAB, R1 , [FB] ' R,[FB] TAB,
767: R1 , abs:16 ' R,abs:16 TAB,
768:
769: R2 , R0 ' R,R TAB, R2 , R1 ' R,R TAB,
770: R2 , R2 ' R,R TAB, R2 , R3 ' R,R TAB,
771: R2 , A0 ' R,R TAB, R2 , A1 ' R,R TAB,
772: R2 , [A0] ' R,[An] TAB, R2 , [A1] ' R,[An] TAB,
773: R2 , [SB] ' R,[SB] TAB, R2 , [FB] ' R,[FB] TAB,
774: R2 , abs:16 ' R,abs:16 TAB,
775:
776: R3 , R0 ' R,R TAB, R3 , R1 ' R,R TAB,
777: R3 , R2 ' R,R TAB, R3 , R3 ' R,R TAB,
778: R3 , A0 ' R,R TAB, R3 , A1 ' R,R TAB,
779: R3 , [A0] ' R,[An] TAB, R3 , [A1] ' R,[An] TAB,
780: R3 , [SB] ' R,[SB] TAB, R3 , [FB] ' R,[FB] TAB,
781: R3 , abs:16 ' R,abs:16 TAB,
782:
783: A0 , R0 ' R,R TAB, A0 , R1 ' R,R TAB,
784: A0 , R2 ' R,R TAB, A0 , R3 ' R,R TAB,
785: A0 , A0 ' R,R TAB, A0 , A1 ' R,R TAB,
786: A0 , [A0] ' R,[An] TAB, A0 , [A1] ' R,[An] TAB,
787: A0 , [SB] ' R,[SB] TAB, A0 , [FB] ' R,[FB] TAB,
788: A0 , abs:16 ' R,abs:16 TAB,
789:
790: A1 , R0 ' R,R TAB, A1 , R1 ' R,R TAB,
791: A1 , R2 ' R,R TAB, A1 , R3 ' R,R TAB,
792: A1 , A0 ' R,R TAB, A1 , A1 ' R,R TAB,
793: A1 , [A0] ' R,[An] TAB, A1 , [A1] ' R,[An] TAB,
794: A1 , [SB] ' R,[SB] TAB, A1 , [FB] ' R,[FB] TAB,
795: A1 , abs:16 ' R,abs:16 TAB,
796:
797: [A0] , R0 ' [An],R TAB, [A0] , R1 ' [An],R TAB,
798: [A0] , R2 ' [An],R TAB, [A0] , R3 ' [An],R TAB,
799: [A0] , A0 ' [An],R TAB, [A0] , A1 ' [An],R TAB,
800: [A0] , [A0] ' [An],[An] TAB, [A0] , [A1] ' [An],[An] TAB,
801: [A0] , [SB] ' [An],[SB] TAB, [A0] , [FB] ' [An],[FB] TAB,
802: [A0] , abs:16 ' [An],abs:16 TAB,
803:
804: [A1] , R0 ' [An],R TAB, [A1] , R1 ' [An],R TAB,
805: [A1] , R2 ' [An],R TAB, [A1] , R3 ' [An],R TAB,
806: [A1] , A0 ' [An],R TAB, [A1] , A1 ' [An],R TAB,
807: [A1] , [A0] ' [An],[An] TAB, [A1] , [A1] ' [An],[An] TAB,
808: [A1] , [SB] ' [An],[SB] TAB, [A1] , [FB] ' [An],[FB] TAB,
809: [A1] , abs:16 ' [An],abs:16 TAB,
810:
811: [SB] , R0 ' [SB],R TAB, [SB] , R1 ' [SB],R TAB,
812: [SB] , R2 ' [SB],R TAB, [SB] , R3 ' [SB],R TAB,
813: [SB] , A0 ' [SB],R TAB, [SB] , A1 ' [SB],R TAB,
814: [SB] , [A0] ' [SB],[An] TAB, [SB] , [A1] ' [SB],[An] TAB,
815: [SB] , [SB] ' [SB],[SB] TAB, [SB] , [FB] ' [SB],[FB] TAB,
816: [SB] , abs:16 ' [SB],abs:16 TAB,
817:
818: [FB] , R0 ' [FB],R TAB, [FB] , R1 ' [FB],R TAB,
819: [FB] , R2 ' [FB],R TAB, [FB] , R3 ' [FB],R TAB,
820: [FB] , A0 ' [FB],R TAB, [FB] , A1 ' [FB],R TAB,
821: [FB] , [A0] ' [FB],[An] TAB, [FB] , [A1] ' [FB],[An] TAB,
822: [FB] , [SB] ' [FB],[SB] TAB, [FB] , [FB] ' [FB],[FB] TAB,
823: [FB] , abs:16 ' [FB],abs:16 TAB,
824:
825: # , R0 ' #,R TAB, # , R1 ' #,R TAB,
826: # , R2 ' #,R TAB, # , R3 ' #,R TAB,
827: # , A0 ' #,R TAB, # , A1 ' #,R TAB,
828: # , [A0] ' #,[An] TAB, # , [A1] ' #,[An] TAB,
829: # , [SB] ' #,[SB] TAB, # , [FB] ' #,[FB] TAB,
830: # , abs:16 ' #,abs:16 TAB,
831:
832: abs:16 , R0 ' abs:16,R TAB, abs:16 , R1 ' abs:16,R TAB,
833: abs:16 , R2 ' abs:16,R TAB, abs:16 , R3 ' abs:16,R TAB,
834: abs:16 , A0 ' abs:16,R TAB, abs:16 , A1 ' abs:16,R TAB,
835: abs:16 , [A0] ' abs:16,[An] TAB, abs:16 , [A1] ' abs:16,[An] TAB,
836: abs:16 , [SB] ' abs:16,[SB] TAB, abs:16 , [FB] ' abs:16,[FB] TAB,
837: abs:16 , abs:16 ' abs:16,abs:16 TAB,
838: ;TABLE
839:
840: generic %01100000 %01110110 %11111111 %10110000 GROUP4: adc.b
841: generic %01000000 %01110110 %11111111 %10100000 GROUP4: add.b:g
842: generic %00100000 %01110110 %11111111 %10010000 GROUP4: and.b:g
843: generic %10000000 %01110110 %11111111 %11000000 GROUP4: cmp.b:g
844: generic %11000000 %01110100 %11111111 %01110010 GROUP4: mov.b:g
845: generic %01010000 %01111100 %11111111 %01111000 GROUP4: mul.b:g
846: generic %01000000 %01111100 %11111111 %01110000 GROUP4: mulu.b:g
847: generic %00110000 %01110110 %11111111 %10011000 GROUP4: or.b:g
848: generic %01110000 %01110110 %11111111 %10111000 GROUP4: sbb.b
849: generic %01010000 %01110110 %11111111 %10101000 GROUP4: sub.b:g
850: generic %00000000 %01110110 %11111111 %10000000 GROUP4: tst.b
851: generic %00010000 %01110110 %11111111 %10001000 GROUP4: xor.b
852:
853: generic %01100000 %01110111 %11111111 %10110001 GROUP4: adc.w
854: generic %01000000 %01110111 %11111111 %10100001 GROUP4: add.w:g
855: generic %00100000 %01110111 %11111111 %10010001 GROUP4: and.w:g
856: generic %10000000 %01110111 %11111111 %11000001 GROUP4: cmp.w:g
857: generic %11000000 %01110101 %11111111 %01110011 GROUP4: mov.w:g
858: generic %01010000 %01111101 %11111111 %01111001 GROUP4: mul.w:g
859: generic %01000000 %01111101 %11111111 %01110001 GROUP4: mulu.w:g
860: generic %00110000 %01110111 %11111111 %10011001 GROUP4: or.w:g
861: generic %01110000 %01110111 %11111111 %10111001 GROUP4: sbb.w
862: generic %01010000 %01110111 %11111111 %10101001 GROUP4: sub.w:g
863: generic %00000000 %01110111 %11111111 %10000001 GROUP4: tst.w
864: generic %00010000 %01110111 %11111111 %10001001 GROUP4: xor.w
865:
866: \ ----------------------------------------------------------------------------------------------
867: : r1h, <OPC> 1 + c@ $F0 and <M> 1+ c@ $0F and or <M> 1+ c! ;
868:
869: : R1H,R r1h, r,r ;
870:
871: : R1H,[An] r1h, r,[An] ;
872:
873: : R1H,[SB] r1h, r,[SB] ;
874:
875: : R1H,[FB] r1h, r,[FB] ;
876:
877: : R1H,abs:16 r1h, r,abs:16 ;
878:
879: \ ----------------------------------------------------------------------------------------------
880: : rot# CASE
881: 1 of $00 endof
882: 2 of $10 endof
883: 3 of $20 endof
884: 4 of $30 endof
885: 5 of $40 endof
886: 6 of $50 endof
887: 7 of $60 endof
888: 8 of $70 endof
889: -1 of $80 endof
890: -2 of $90 endof
891: -3 of $A0 endof
892: -4 of $B0 endof
893: -5 of $C0 endof
894: -6 of $D0 endof
895: -7 of $E0 endof
896: -8 of $F0 endof
897: abort
898: ENDCASE ;
899:
900: : rot#, s-opnd? 0= ABORT" operand expected"
901: <OPC> 2 + c@ <OPC> c!
902: s-opnd? d-opnd? and IF swap THEN
903: rot# <M> 1+ c@ $0F and or <M> 1+ c! ;
904:
905: : rot#,R rot#,
906: >opc OPC, ;
907:
908: : rot#,[An] opnd? <d-opnd> !
909: rot#, ,[An]
910: >opc OPC,
911: d-opnd?
912: IF abs8? IF X C, ELSE X , THEN THEN ;
913:
914: : rot#,[SB] opnd? <d-opnd> !
915: rot#, ,[SB]
916: >opc OPC,
917: abs8? IF X C, ELSE X , THEN ;
918:
919: : rot#,[FB] opnd? <d-opnd> !
920: rot#, ,[FB]
921: >opc OPC,
922: >8B? ABORT" displacement > 8 Bit"
923: X C, ;
924:
925: : rot#,abs:16 opnd? <d-opnd> !
926: rot#, ,abs:16
927: >opc OPC,
928: X , ;
929:
930: Table: rot-group
931: R1H , R0L ' R1H,R TAB, R1H , R0H ' R1H,R TAB,
932: R1H , R1L ' R1H,R TAB, R1H , R3 ' R1H,R TAB,
933: R1H , A0 ' R1H,R TAB, R1H , A1 ' R1H,R TAB,
934: R1H , [A0] ' R1H,[An] TAB, R1H , [A1] ' R1H,[An] TAB,
935: R1H , [SB] ' R1H,[SB] TAB, R1H , [FB] ' R1H,[FB] TAB,
936: R1H , abs:16 ' R1H,abs:16 TAB,
937: # , R0L ' rot#,R TAB, # , R0H ' rot#,R TAB,
938: # , R1L ' rot#,R TAB, # , R3 ' rot#,R TAB,
939: # , A0 ' rot#,R TAB, # , A1 ' rot#,R TAB,
940: # , [A0] ' rot#,[An] TAB, # , [A1] ' rot#,[An] TAB,
941: # , [SB] ' rot#,[SB] TAB, # , [FB] ' rot#,[FB] TAB,
942: # , abs:16 ' rot#,abs:16 TAB,
943: ;TABLE
944:
945: rot-group %00001111 %11100001 %01101111 %01110101 GROUP4: rot.w
946: rot-group %00001111 %11101001 %11101111 %01110101 GROUP4: shl.w
947: rot-group %00001111 %11110001 %11111111 %01110101 GROUP4: sha.w
948:
949: rot-group %00001111 %11100000 %01101111 %01110100 GROUP4: rot.b
950: rot-group %00001111 %11101000 %11101111 %01110100 GROUP4: shl.b
951: rot-group %00001111 %11110000 %11111111 %01110100 GROUP4: sha.b
952:
953: \ ----------------------------------------------------------------------------------------------
954: ' noop alias bit
955:
956: : bit, s-opnd? 0= ABORT" operand expected"
957: <OPC> 1+ C@ $F0 AND <M> 1+ c@ $0F AND OR <M> 1+ c! ;
958:
959: : bit,R bit,
960: >opc OPC,
961: %00000111 and
962: X c, ;
963:
964: : bit[An] <OPC> 1+ c@ $F0 AND <M> 1+ c@ 4 rshift or <M> 1+ c!
965: <M> 1+ C@ $0F AND
966: CASE
967: %0110 of opnd? \ [A0]
968: IF abs8? IF %1000 ELSE %1100 THEN
969: <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
970: endof
971: %0111 of opnd? \ [A1]
972: IF abs8? IF %1001 ELSE %1101 THEN
973: <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
974: endof
975: ENDCASE
976: >opc OPC,
977: opnd?
978: IF abs8? IF X C, ELSE X , THEN THEN ;
979:
980: : bit,[SB] opnd? <d-opnd> !
981: bit, ,[SB]
982: 3 lshift swap %00000111 and or
983: >abs8? IF %1110 <M> 1+ C@ $F0 AND OR <M> 1+ C! THEN
984: >opc OPC,
985: abs8? IF X C, ELSE X , THEN ;
986:
987: : bit,[FB] opnd? <d-opnd> !
988: bit, ,[FB]
989: >opc OPC,
990: 3 lshift swap %00000111 and or
991: >8B? ABORT" displacement > 8 Bit"
992: X C, ;
993:
994: : bit,abs:16 opnd? <d-opnd> !
995: bit, ,abs:16
996: >opc OPC,
997: 3 lshift swap %00000111 and or
998: X , ;
999:
1000: Table: bit-group
1001: bit , R0 ' bit,R TAB, bit , R1 ' bit,R TAB,
1002: bit , R2 ' bit,R TAB, bit , R3 ' bit,R TAB,
1003: bit , A0 ' bit,R TAB, bit , A1 ' bit,R TAB,
1004: [A0] ' bit[An] TAB, [A1] ' bit[An] TAB,
1005: bit , [SB] ' bit,[SB] TAB, bit , [FB] ' bit,[FB] TAB,
1006: bit , abs:16 ' bit,abs:16 TAB,
1007: ;TABLE
1008:
1009: bit-group %01001111 %01111110 GROUP2: band
1010: bit-group %10001111 %01111110 GROUP2: bclr:g
1011: bit-group %01011111 %01111110 GROUP2: bnand
1012: bit-group %01111111 %01111110 GROUP2: bnor
1013: bit-group %10101111 %01111110 GROUP2: bnot:g
1014: bit-group %00111111 %01111110 GROUP2: bntst
1015: bit-group %11011111 %01111110 GROUP2: bnxor
1016: bit-group %01101111 %01111110 GROUP2: bor
1017: bit-group %10011111 %01111110 GROUP2: bset:g
1018: bit-group %10111111 %01111110 GROUP2: btst:g
1019: bit-group %00001111 %01111110 GROUP2: btstc
1020: bit-group %00011111 %01111110 GROUP2: btsts
1021: bit-group %11001111 %01111110 GROUP2: bxor
1022: \ ----------------------------------------------------------------------------------------------
1023: \ register definition
1024: ' R2 Alias rp
1025: ' R0 Alias tos
1026: ' A1 Alias ip
1027: ' A0 Alias w
1028: ' [A1] Alias [ip]
1029: ' [A0] Alias [w]
1030: \ ----------------------------------------------------------------------------------------------
1031:
1032: $68 Constant u<
1033: $69 Constant u<=
1034: $6A Constant 0<>
1035: $6B Constant 0>=
1036: $6C Constant u>=
1037: $6D Constant u>
1038: $6E Constant 0=
1039: $6F Constant 0<
1040:
1041: : IF X c, X here 0 X c, reset ;
1042: : THEN X here over - swap X c! reset ;
1043: : AHEAD $FE IF ;
1044: : ELSE AHEAD swap THEN reset ;
1045: : WHILE IF swap reset ;
1046: : BEGIN X here reset ;
1047: : UNTIL X c, X here - X c, reset ;
1048: : AGAIN $FE UNTIL reset ;
1049: : REPEAT AGAIN THEN reset ;
1050:
1051:
1052: \ include asm-test.fs
1053:
1054: HERE SWAP -
1055: CR .( Length of Assembler: ) . .( Bytes ) CR
1056:
1057:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>