commit f42d51a
Devine Lu Linvega
·
2026-05-19 19:27:35 +0000 UTC
parent e312964
Updated core and tests
2 files changed,
+1418,
-567
+1351,
-504
1@@ -1,570 +1,1417 @@
2 ( Opcode Tester )
3
4-|0013
5-
6- @zeropage/hb $1 &lb $1
7- @id $1
8-
9 |100
10
11 @on-reset ( -> )
12+ ( |
13+ | PART 1:
14+ |
15+ | LIT2: Puts a short on the stack
16+ | LIT: Puts a byte on the stack
17+ | #06 DEO: Write to metadata ports
18+ | #18 DEO: Write a letter in terminal )
19+ ;meta #06 DEO2
20+ [ LIT2 "kO ] #18 DEO
21+ #18 DEO
22+ #2018 DEO
23+ ( |
24+ | PART 2:
25+ |
26+ | LITr: Put a byte on return stack
27+ | STH: Move a byte from working stack to return stack
28+ | STH2r: Move a short from return stack to working stack )
29+ [ LITr "k ] [ LIT "O ] STH
30+ STH2r #18 DEO
31+ #18 DEO
32+ #2018 DEO
33+ ( |
34+ | PART 3:
35+ |
36+ | LIT2r: Put a short on return stack
37+ | DUP: Duplicate byte
38+ | ADDr: Add bytes on return stack )
39+ [ LIT2r "k 4d ] #01 DUP STH
40+ ADDr STH
41+ ADDr STH2r #18 DEO
42+ #18 DEO
43+ #2018 DEO
44+ ( |
45+ | PART 4:
46+ |
47+ | JSI: Subroutine to relative short address
48+ | JMP2r: Jumps to absolute address on return stack )
49+ tests/<print-ok>
50+ #2018 DEO
51+ ( |
52+ | PART 5:
53+ |
54+ | POP2: Removes a short from the stack
55+ | INC2: Increments short on stack
56+ | DUP2: Duplicate short
57+ | LDA: load byte from absolute address
58+ | JCI: Conditional subroutine to relative short address )
59+ ;dict/ok str/<print>
60+ #2018 DEO
61+ ( |
62+ | PART 6:
63+ |
64+ | JSR2: Jump to subroutine from short pointer
65+ | LDAk: Non-destructive load byte from absolute address )
66+ { "Ok $1 }
67+ STH2r ;str/<print> JSR2 #2018 DEO
68+ ( |
69+ | PART 7:
70+ |
71+ | Relative distance bytes )
72+ tests/<rel>
73+ SWP #18 DEO
74+ #18 DEO
75+ ( |
76+ | PART 8:
77+ |
78+ | Test every opcode )
79+ #1234 #00 STZ2
80+ tests/<run>
81+ ( |
82+ | PART 9:
83+ |
84+ | Testing that stacks are circular and wrapping
85+ | Storing 12 at -1 and 34 at 0 )
86+ POP #12 #34 ADD #46 EQU STH
87+ POP #1234 ADD #46 EQU STH
88+ POP2 #1111 #2222 ADD2 #3333 EQU2 STHr AND STHr AND ;dict/stack-wrap tests/<print>
89+ ( restore stack ) #0000 #0000
90+ ( |
91+ | PART 10:
92+ |
93+ | Testing RAM wrapping
94+ | Storing 12 in 0xffff, and 34 in 0x0000 )
95+ #1234 #ffff STA2
96+ ( LDA ) #0000 LDA #ffff LDA ADD #46 EQU
97+ ( LDA2 ) #ffff LDA2 ADD #46 EQU AND ;dict/ram-wrap tests/<print>
98+ ( |
99+ | PART 11:
100+ |
101+ | Testing PC wrapping: split instruction
102+ | Storing 80[LIT] in 0xffff, and 55[val8] in 0x0000
103+ | Storing 6c[JMP2r] in 0x0001 )
104+ #8055 #ffff STA2
105+ #6c #01 STZ
106+ #ffff JSR2 #55 EQU ;dict/pc-wrap tests/<print>
107+ ( |
108+ | PART 12:
109+ |
110+ | Testing PC wrapping: split value after instruction
111+ | Storing a0[LIT2] in 0xfffe,
112+ | and 0x55[hi-byte] in 0xffff, and 0xaa[lo-byte] in 0x0000
113+ | Storing 6c[JMP2r] in 0x0001 )
114+ #a055 #fffe STA2
115+ #aa6c #0000 STA2
116+ #fffe JSR2 #55aa EQU2 ;dict/pc2-wrap tests/<print>
117+ ( |
118+ | PART 13:
119+ |
120+ | Testing that zero-page is wrapping )
121+ #5678 #ff STZ2
122+ ( LDZ ) #00 LDZ #ff LDZ ADD #ce EQU
123+ ( LDZ2 ) #ff LDZ2 ADD #ce EQU AND ;dict/zp-wrap tests/<print>
124+ ( |
125+ | PART 14:
126+ |
127+ | Testing that device page is wrapping )
128+ #1234 #ff DEO2
129+ ( DEI ) #00 DEI #ff DEI ADD #46 EQU
130+ ( DEI2 ) #ff DEI2 ADD #46 EQU AND ;dict/dev-wrap tests/<print>
131+ #0000 DEO
132+ #00ff DEO
133+ ( | You have a working uxn! )
134+ #800f DEO
135+ BRK
136+
137+@str/<print> ( str* -- )
138+ LDAk DUP ?{ POP POP2 JMP2r }
139+ #18 DEO
140+ INC2 !/<print>
141+
142+@dict/ok "Ok 00
143+ &fail "fail 0a 00
144+ &pass "pass 0a 00
145+ &stack-wrap "Stk-wrap: 20 $1
146+ &ram-wrap "Ram-wrap: 20 $1
147+ &pc-wrap "Pc1-wrap: 20 $1
148+ &pc2-wrap "Pc2-wrap: 20 $1
149+ &zp-wrap "Zer-wrap: 20 $1
150+ &dev-wrap "Dev-wrap: 20 $1
151+ &opc-test "Opc-test: 20 $1
152
153- ( part 1
154- > LIT2: Puts a short on the stack
155- > LIT: Puts a byte on the stack
156- > #06 DEO: Write to metadata ports
157- > #18 DEO: Write a letter in terminal )
158+(
159+@|Relative Distance Bytes )
160
161- ;meta #06 DEO2
162- [ LIT2 "kO ] #18 DEO #18 DEO
163- [ LIT2 "1 18 ] DEO #0a18 DEO
164+@meta 00
165+ ( name ) "Opctest 0a
166+ ( details ) "A 20 "Testing 20 "Program 0a
167+ ( author ) "By 20 "Devine 20 "Lu 20 "Linvega 0a
168+ ( date ) "18 20 "May 20 "2026 $2
169
170- ( part 2
171- > LITr: Put a byte on return stack
172- > STH: Move a byte from working stack to return stack
173- > STH2r: Move a short from return stack to working stack )
174+(
175+@|Tests )
176+
177+@tests/<run> ( -- )
178+ [ LITr 00 ] ;&lut-end ;&lut
179+ &>l
180+ STHkr #0f AND ?{ #0a18 DEO }
181+ STHkr u8/<print>
182+ #2018 DEO
183+ LDA2k JSR2 #01 EQU ?{ #010f DEO
184+ BRK }
185+ INC2 INC2 INCr GTH2k ?&>l
186+ POP2 POP2 POPr #0a18 DEO
187+ #01 ;dict/opc-test !tests/<print>
188+
189+@tests/<print> ( f name* -- )
190+ str/<print>
191+ ?{ #010f DEO
192+ ;dict/fail !str/<print> }
193+ ;dict/pass !str/<print>
194+
195+@tests/back "O $7c &<rel> ,&back LDR ,&forw LDR JMP2r
196+ $7e
197+ &forw "k
198+
199+@tests/<print-ok> ( -- )
200+ [ LIT2 "kO ] #18 DEO
201+ #18 DEO
202+ JMP2r
203
204- [ LITr "k ] [ LIT "O ] STH STH2r #18 DEO #18 DEO
205- [ LIT2 "2 18 ] DEO #0a18 DEO
206+@u8/<print> ( byte -- )
207+ DUP #04 SFT /<print-nibble>
208+ ( >> )
209+ &<print-nibble> ( byte -- )
210+ #0f AND DUP #09 GTH #27 MUL ADD [ LIT "0 ] ADD #18 DEO
211+ JMP2r
212
213- ( part 3
214- > LIT2r: Put a short on return stack
215- > DUP: Duplicate byte
216- > ADDr: Add bytes on return stack )
217+(
218+@|imm )
219
220- [ LIT2r "k 4d ] #01 DUP STH ADDr STH ADDr STH2r #18 DEO #18 DEO
221- [ LIT2 "3 18 ] DEO #0a18 DEO
222+@op-brk ( -- pass )
223+ ( skip ) #01 JMP2r
224
225- ( part 4
226- > JSI: Subroutine to relative short address
227- > JMP2r: Jumps to absolute address on return stack )
228+@op-jci ( -- pass )
229+ ( - ) #12 #01 ?{ INC }
230+ #12 EQU
231+ ( - ) #34 #00 ?{ INC }
232+ #35 EQU AND JMP2r
233
234- subroutine
235- [ LIT2 "4 18 ] DEO #0a18 DEO
236+@op-jmi ( -- pass )
237+ ( - ) #12 !{
238+ INC }
239+ #12 EQU JMP2r
240
241- ( part 5
242- > POP2: Removes a short from the stack
243- > INC2: Increments short on stack
244- > DUP2: Duplicate short
245- > LDA: load byte from absolute address
246- > JCI: Conditional subroutine to relative short address )
247+@op-jsi ( -- pass )
248+ #12 /t #24 EQU JMP2r
249+ &t DUP ADD JMP2r
250
251- ;Dict/ok pstr
252- [ LIT2 "5 18 ] DEO #0a18 DEO
253+@op-lit ( -- pass )
254+ LIT 12 #12 EQU JMP2r
255
256- ( part 6
257- > JSR2: Jump to subroutine from short pointer
258- > LDAk: Non-destructive load byte from absolute address )
259+@op-lit2 ( -- pass )
260+ LIT2 1234 #12 #34 EQU2 JMP2r
261
262- { "Ok $1 } STH2r ;pstr-jcn JSR2
263- [ LIT2 "6 18 ] DEO #0a18 DEO
264+@op-litr ( -- pass )
265+ LITr 12 STHr #12 EQU JMP2r
266
267- ( part 7
268- > Relative distance bytes )
269+@op-lit2r ( -- pass )
270+ LIT2r 1234 STH2r #1234 EQU2 JMP2r
271
272- rel-distance/entry SWP #18 DEO #18 DEO
273- [ LIT2 "7 18 ] DEO #0a18 DEO
274+(
275+@|m )
276+
277+@op-inc ( -- pass )
278+ ( - ) #01 INC [ #02 ] EQU
279+ ( - ) #ff INC #00 EQU AND
280+ ( - ) #fe INC #ff EQU AND
281+ ( - ) #00 INC #01 EQU AND JMP2r
282+
283+@op-pop ( -- pass )
284+ ( - ) #0a #0b POP [ #0a ] EQU
285+ ( - ) #0a #0b #0c POP POP [ #0a ] EQU AND
286+ ( - ) #0a #0b #0c ADD POP [ #0a ] EQU AND
287+ ( - ) #0a #0b #0c POP ADD [ #15 ] EQU AND JMP2r
288+
289+@op-nip ( -- pass )
290+ ( - ) #12 #34 #56 NIP ADD [ #68 ] EQU JMP2r
291+
292+@op-swp ( -- pass )
293+ ( - ) #02 #10 SWP DIV [ #08 ] EQU JMP2r
294+
295+@op-rot ( -- pass )
296+ ( - ) #02 #04 #10 ROT DIV ADD [ #0c ] EQU JMP2r
297+
298+@op-dup ( -- pass )
299+ ( - ) #0a #0b DUP ADD ADD [ #20 ] EQU JMP2r
300+
301+@op-ovr ( -- pass )
302+ ( - ) #02 #10 OVR DIV ADD [ #0a ] EQU JMP2r
303+
304+@op-equ ( -- pass )
305+ ( - ) #f8 #f8 EQU #01 EQU
306+ ( - ) #01 #01 EQU #01 EQU AND
307+ ( - ) #f8 #01 EQU #00 EQU AND
308+ ( - ) #00 #ff EQU #00 EQU AND JMP2r
309+
310+@op-neq ( -- pass )
311+ ( - ) #f8 #f8 NEQ #00 EQU
312+ ( - ) #01 #01 NEQ #00 EQU AND
313+ ( - ) #f8 #01 NEQ #01 EQU AND
314+ ( - ) #01 #f8 NEQ #01 EQU AND JMP2r
315+
316+@op-gth ( -- pass )
317+ ( - ) #f8 #f8 GTH #00 EQU
318+ ( - ) #01 #01 GTH #00 EQU AND
319+ ( - ) #f8 #01 GTH #01 EQU AND
320+ ( - ) #01 #f8 GTH #00 EQU AND JMP2r
321+
322+@op-lth ( -- pass )
323+ ( - ) #f8 #f8 LTH #00 EQU
324+ ( - ) #01 #01 LTH #00 EQU AND
325+ ( - ) #f8 #01 LTH #00 EQU AND
326+ ( - ) #01 #ff LTH #01 EQU AND JMP2r
327+
328+@op-jmp ( -- pass )
329+ ( - ) #12 #34 ,&x [ JMP SWP &x ] POP [ #12 ] EQU
330+ ( - ) #12 #34 ,&t [ JMP &back ] POP [ #34 ] EQU AND JMP2r
331+ &t SWP ,&back JMP
332+
333+@op-jcn ( -- pass )
334+ ( - ) #23 #01 ,&x [ JCN INC &x ] [ #23 ] EQU
335+ ( - ) #23 #00 ,&y [ JCN INC &y ] [ #24 ] EQU AND
336+ ( - ) #12 #34 #01 ,&t [ JCN &back ] POP [ #34 ] EQU AND
337+ ( - ) #12 #34 #00 ,&t [ JCN ] POP [ #12 ] EQU AND JMP2r
338+ &t SWP ,&back JMP
339+
340+@op-jsr ( -- pass )
341+ ( - ) #12 #34 ,&routine JSR [ #46 ] EQU JMP2r
342+ &routine ADD JMP2r
343+
344+@op-sth ( -- pass )
345+ ( - ) #0a [ STH ] #0b [ STH ] ADDr STHr [ #15 ] EQU JMP2r
346+
347+@op-ldz ( -- pass )
348+ ( - ) #00 LDZ #12 EQU JMP2r
349+
350+@op-stz ( -- pass )
351+ ( - ) #5602 [ STZ ] #02 LDZ #56 EQU JMP2r
352+
353+@op-ldr ( -- pass )
354+ ( - ) ,&t LDR #12 EQU JMP2r
355+ &t 12
356+
357+@op-str ( -- pass )
358+ ( - ) #34 ,&t [ STR ] ,&t LDR #34 EQU JMP2r
359+ &t $1
360+
361+@op-lda ( -- pass )
362+ ( - ) ;&value LDA #ef EQU JMP2r
363+ &value ef
364+
365+@op-sta ( -- pass )
366+ ( - ) #12 ;&value [ STA ] ;&value LDA #12 EQU JMP2r
367+ &value 00
368+
369+@op-dei ( -- pass )
370+ ( skip ) #01 JMP2r
371+
372+@op-deo ( -- pass )
373+ ( skip ) #01 JMP2r
374+
375+@op-add ( -- pass )
376+ ( - ) #ff #00 ADD #ff EQU
377+ ( - ) #01 #ff ADD #00 EQU AND
378+ ( - ) #ff #ff ADD [ #fe ] EQU AND JMP2r
379+
380+@op-sub ( -- pass )
381+ ( - ) #ff #00 SUB #ff EQU
382+ ( - ) #01 #ff SUB [ #02 ] EQU AND
383+ ( - ) #ff #ff SUB #00 EQU AND
384+ ( - ) #fe #ff SUB #ff EQU AND JMP2r
385+
386+@op-mul ( -- pass )
387+ ( - ) #00 #01 MUL #00 EQU
388+ ( - ) #3f #e7 MUL [ #d9 ] EQU AND
389+ ( - ) #37 #3f MUL [ #89 ] EQU AND
390+ ( - ) #10 #02 MUL [ #20 ] EQU AND JMP2r
391+
392+@op-div ( -- pass )
393+ ( - ) #10 #06 DIV [ #02 ] EQU
394+ ( - ) #20 #20 DIV #01 EQU AND
395+ ( - ) #34 #01 DIV [ #34 ] EQU AND
396+ ( - ) #02 #ef DIV #00 EQU AND
397+ ( - ) #02 #00 DIV #00 EQU AND JMP2r
398+
399+@op-and ( -- pass )
400+ ( - ) #fc #3f AND [ #3c ] EQU
401+ ( - ) #f0 #0f AND #00 EQU AND
402+ ( - ) #ff #3c AND [ #3c ] EQU AND
403+ ( - ) #02 #03 AND [ #02 ] EQU AND JMP2r
404+
405+@op-ora ( -- pass )
406+ ( - ) #0f #f0 ORA #ff EQU
407+ ( - ) #ab #cd ORA [ #ef ] EQU AND
408+ ( - ) #12 #34 ORA [ #36 ] EQU AND
409+ ( - ) #88 #10 ORA [ #98 ] EQU AND JMP2r
410+
411+@op-eor ( -- pass )
412+ ( - ) #00 #00 EOR #00 EQU
413+ ( - ) #ff #00 EOR #ff EQU AND
414+ ( - ) #aa #55 EOR #ff EQU AND
415+ ( - ) #ff #ff EOR #00 EQU AND JMP2r
416+
417+@op-sft ( -- pass )
418+ ( - ) #ff #08 SFT #00 EQU
419+ ( - ) #ff #e0 SFT #00 EQU AND
420+ ( - ) #ff #11 SFT [ #fe ] EQU AND
421+ ( - ) #ff #12 SFT [ #7e ] EQU AND
422+ ( - ) #ff #00 SFT [ #ff ] EQU AND
423+ ( - ) #ff #77 SFT [ #80 ] EQU AND
424+ ( - ) #ff #88 SFT [ #00 ] EQU AND
425+ ( - ) #ff #ff SFT [ #00 ] EQU AND JMP2r
426
427- ( part xx
428- > GTH2k: Non-destructive greater-than short
429- > LDA2k: Non-destructive load short from absolute address
430- > STA2: Store short at absolute address )
431+(
432+@|m2 )
433
434- [ LIT2r 0000 ]
435- ;tests/end ;tests
436- &l
437- run-test [ LITr 00 ] STH ADD2r
438- INC2 INC2 GTH2k ?&l
439- POP2 POP2
440- STH2r ;tests/end ;tests SUB2 #01 SFT2
441- EQU2 ;Dict/opctests test-part
442+@op-inc2 ( -- pass )
443+ ( - ) #00ff INC2 [ #0100 ] EQU2
444+ ( - ) #ffff INC2 [ #0000 ] EQU2 AND
445+ ( - ) #fffe INC2 [ #ffff ] EQU2 AND
446+ ( - ) #0000 INC2 [ #0001 ] EQU2 AND JMP2r
447+
448+@op-pop2 ( -- pass )
449+ ( - ) #0a0b #0c0d POP2 [ #0a0b ] EQU2
450+ ( - ) #0a0b #0c0d #0e0f POP2 POP2 #0a0b EQU2 AND
451+ ( - ) #0a0b #0c0d #0e0f ADD2 POP2 #0a0b EQU2 AND
452+ ( - ) #0a0b #0c0d #0e0f POP2 ADD2 #1618 EQU2 AND JMP2r
453+
454+@op-nip2 ( -- pass )
455+ ( - ) #1234 #5678 #9abc NIP2 ADD2 #acf0 EQU2 JMP2r
456+
457+@op-swp2 ( -- pass )
458+ ( - ) #0a0b #0c0d SWP2 NIP2 #0a0b EQU2 JMP2r
459+
460+@op-rot2 ( -- pass )
461+ ( - ) #0a0b #0c0d #0c0f ROT2 ADD2 NIP2 #161a EQU2 JMP2r
462+
463+@op-dup2 ( -- pass )
464+ ( - ) #0a0b DUP2 ADD2 #1416 EQU2 JMP2r
465+
466+@op-ovr2 ( -- pass )
467+ ( - ) #0a0b #0c0d OVR2 NIP2 ADD2 #1416 EQU2 JMP2r
468+
469+@op-equ2 ( -- pass )
470+ ( - ) #f801 #f801 EQU2 #01 EQU
471+ ( - ) #01f8 #01f8 EQU2 #01 EQU AND
472+ ( - ) #f801 #01f8 EQU2 #00 EQU AND
473+ ( - ) #01f8 #f801 EQU2 #00 EQU AND JMP2r
474+
475+@op-neq2 ( -- pass )
476+ ( - ) #f801 #f801 NEQ2 #00 EQU
477+ ( - ) #01f8 #01f8 NEQ2 #00 EQU AND
478+ ( - ) #f801 #01f8 NEQ2 #01 EQU AND
479+ ( - ) #01f8 #f801 NEQ2 #01 EQU AND JMP2r
480+
481+@op-gth2 ( -- pass )
482+ ( - ) #f801 #f801 GTH2 #00 EQU
483+ ( - ) #01f8 #01f8 GTH2 #00 EQU AND
484+ ( - ) #f801 #01f8 GTH2 #01 EQU AND
485+ ( - ) #01f8 #f801 GTH2 #00 EQU AND JMP2r
486+
487+@op-lth2 ( -- pass )
488+ ( - ) #f801 #f801 LTH2 #00 EQU
489+ ( - ) #01f8 #01f8 LTH2 #00 EQU AND
490+ ( - ) #f801 #01f8 LTH2 #00 EQU AND
491+ ( - ) #01f8 #f801 LTH2 #01 EQU AND JMP2r
492+
493+@op-jmp2 ( -- pass )
494+ ( - ) #56 #78 ;&t [ JMP2 SWP &t ] POP #56 EQU JMP2r
495+
496+@op-jcn2 ( -- pass )
497+ ( - ) #23 #01 ;&abs-x [ JCN2 INC &abs-x ] #23 EQU
498+ ( - ) #23 #00 ;&abs-y [ JCN2 INC &abs-y ] #24 EQU AND JMP2r
499+
500+@op-jsr2 ( -- pass )
501+ ( - ) #12 ;&t JSR2 #24 EQU JMP2r
502+ &t DUP ADD JMP2r
503+
504+@op-sth2 ( -- pass )
505+ ( - ) #1234 [ STH2 ] ADDr STHr #46 EQU JMP2r
506+
507+@op-ldz2 ( -- pass )
508+ ( - ) #00 LDZ2 #1234 EQU2 JMP2r
509+
510+@op-stz2 ( -- pass )
511+ ( - ) #5678 #04 [ STZ2 ] #04 LDZ2 #5678 EQU2 JMP2r
512+
513+@op-ldr2 ( -- pass )
514+ ( - ) ,&t LDR2 #1234 EQU2 JMP2r
515+ &t 1234
516+
517+@op-str2 ( -- pass )
518+ ( - ) #1234 ,&t [ STR2 ] ,&t LDR2 #1234 EQU2 JMP2r
519+ &t $2
520+
521+@op-lda2 ( -- pass )
522+ ( - ) ;&t LDA2 #1234 EQU2 JMP2r
523+ &t 1234
524+
525+@op-sta2 ( -- pass )
526+ ( - ) #1234 ;&t [ STA2 ] ;&t LDA2 #1234 EQU2 JMP2r
527+ &t $2
528+
529+@op-dei2 ( -- pass )
530+ ( skip ) #01 JMP2r
531+
532+@op-deo2 ( -- pass )
533+ ( skip ) #01 JMP2r
534+
535+@op-add2 ( -- pass )
536+ ( - ) #ffff #0000 ADD2 [ #ffff ] EQU2
537+ ( - ) #0001 #ffff ADD2 [ #0000 ] EQU2 AND
538+ ( - ) #ffff #ffff ADD2 [ #fffe ] EQU2 AND
539+ ( - ) #fffe #ffff ADD2 [ #fffd ] EQU2 AND JMP2r
540+
541+@op-sub2 ( -- pass )
542+ ( - ) #ffff #0000 SUB2 [ #ffff ] EQU2
543+ ( - ) #0001 #ffff SUB2 [ #0002 ] EQU2 AND
544+ ( - ) #ffff #ffff SUB2 [ #0000 ] EQU2 AND
545+ ( - ) #fffe #ffff SUB2 [ #ffff ] EQU2 AND JMP2r
546+
547+@op-mul2 ( -- pass )
548+ ( - ) #1000 #0003 MUL2 [ #3000 ] EQU2
549+ ( - ) #abcd #1234 MUL2 [ #4fa4 ] EQU2 AND
550+ ( - ) #8000 #0200 MUL2 [ #0000 ] EQU2 AND
551+ ( - ) #2222 #0003 MUL2 [ #6666 ] EQU2 AND JMP2r
552+
553+@op-div2 ( -- pass )
554+ ( - ) #03e8 #0006 DIV2 [ #00a6 ] EQU2
555+ ( - ) #abcd #1234 DIV2 [ #0009 ] EQU2 AND
556+ ( - ) #8000 #0200 DIV2 [ #0040 ] EQU2 AND
557+ ( - ) #2222 #0003 DIV2 [ #0b60 ] EQU2 AND
558+ ( - ) #0202 #0000 DIV2 [ #0000 ] EQU2 AND JMP2r
559+
560+@op-and2 ( -- pass )
561+ ( - ) #f0f0 #00f0 AND2 [ #00f0 ] EQU2
562+ ( - ) #aaaa #5555 AND2 [ #0000 ] EQU2 AND
563+ ( - ) #ffff #1234 AND2 [ #1234 ] EQU2 AND
564+ ( - ) #abcd #0a0c AND2 [ #0a0c ] EQU2 AND JMP2r
565+
566+@op-ora2 ( -- pass )
567+ ( - ) #0f0f #f0f0 ORA2 [ #ffff ] EQU2
568+ ( - ) #abab #cdcd ORA2 [ #efef ] EQU2 AND
569+ ( - ) #1122 #1234 ORA2 [ #1336 ] EQU2 AND
570+ ( - ) #8888 #1000 ORA2 [ #9888 ] EQU2 AND JMP2r
571+
572+@op-eor2 ( -- pass )
573+ ( - ) #ffff #ff00 EOR2 [ #00ff ] EQU2
574+ ( - ) #aaaa #5555 EOR2 [ #ffff ] EQU2 AND
575+ ( - ) #1122 #1234 EOR2 [ #0316 ] EQU2 AND
576+ ( - ) #8888 #1000 EOR2 [ #9888 ] EQU2 AND JMP2r
577+
578+@op-sft2 ( -- pass )
579+ ( - ) #ffff #01 SFT2 [ #7fff ] EQU2
580+ ( - ) #ffff #70 SFT2 [ #ff80 ] EQU2 AND
581+ ( - ) #ffff #7e SFT2 [ #0180 ] EQU2 AND
582+ ( - ) #ffff #e3 SFT2 [ #c000 ] EQU2 AND JMP2r
583
584- ( Part xx
585- > Testing that stacks are circular and wrapping
586- > Storing 12 at -1 and 34 at 0 )
587+(
588+@|mr )
589
590- POP #12 #34 ADD #46 EQU STH
591- POP #1234 ADD #46 EQU STH
592- POP2 #1111 #2222 ADD2 #3333 EQU2
593- STHr AND STHr AND
594- ;Dict/stack-wrap test-part
595+@op-incr ( -- pass )
596+ ( - ) LITr 01 INCr STHr #02 EQU JMP2r
597
598- ( restore stack ) #0000 #0000
599+@op-popr ( -- pass )
600+ ( - ) LITr 0a LITr 0b POPr STHr #0a EQU JMP2r
601
602- ( Part xx
603- > Testing RAM wrapping
604- > Storing 12 in 0xffff, and 34 in 0x0000 )
605+@op-nipr ( -- pass )
606+ ( - ) LITr 12 LITr 34 LITr 56 NIPr ADDr STHr #68 EQU JMP2r
607
608- #1234 #ffff STA2
609- ( LDA ) #0000 LDA #ffff LDA ADD #46 EQU
610- ( LDA2 ) #ffff LDA2 ADD #46 EQU
611- AND ;Dict/ram-wrap test-part
612+@op-swpr ( -- pass )
613+ ( - ) LITr 02 LITr 03 SWPr POPr STHr #03 EQU JMP2r
614
615- ( Part xx
616- > Testing PC wrapping: split instruction
617- > Storing 80[LIT] in 0xffff, and 55[val8] in 0x0000
618- > Storing 6c[JMP2r] in 0x0001 )
619+@op-rotr ( -- pass )
620+ ( - ) LITr 0a LITr 0b LITr 0c ROTr POPr POPr STHr #0b EQU JMP2r
621
622- #8055 #ffff STA2 #6c #01 STZ #ffff JSR2 #55 EQU
623- ;Dict/pc-wrap test-part
624+@op-dupr ( -- pass )
625+ ( - ) LITr 0a DUPr STHr STHr #0a0a EQU2 JMP2r
626
627- ( Part xx
628- > Testing PC wrapping: split value after instruction
629- > Storing a0[LIT2] in 0xfffe,
630- > and 0x55[hi-byte] in 0xffff, and 0xaa[lo-byte] in 0x0000
631- > Storing 6c[JMP2r] in 0x0001 )
632+@op-ovrr ( -- pass )
633+ ( - ) LITr 0a LITr 0b OVRr STHr POPr POPr #0a EQU JMP2r
634
635- #a055 #fffe STA2 #aa6c #0000 STA2 #fffe JSR2 #55aa EQU2
636- ;Dict/pc2-wrap test-part
637+@op-equr ( -- pass )
638+ ( - ) LITr f8 LITr f8 EQUr STHr #01 EQU JMP2r
639
640- ( Part xx
641- > Testing that zero-page is wrapping )
642+@op-neqr ( -- pass )
643+ ( - ) LITr f8 LITr f8 NEQr STHr #00 EQU JMP2r
644
645- #5678 #ff STZ2
646- ( LDZ ) #00 LDZ #ff LDZ ADD #ce EQU
647- ( LDZ2 ) #ff LDZ2 ADD #ce EQU
648- AND ;Dict/zp-wrap test-part
649+@op-gthr ( -- pass )
650+ ( - ) LITr f8 LITr f8 GTHr STHr #00 EQU JMP2r
651
652- ( Part xx
653- > Testing that device page is wrapping )
654+@op-lthr ( -- pass )
655+ ( - ) LITr f8 LITr f8 LTHr STHr #00 EQU JMP2r
656
657- #1234 #ff DEO2
658- ( DEI ) #00 DEI #ff DEI ADD #46 EQU
659- ( DEI2 ) #ff DEI2 ADD #46 EQU
660- AND ;Dict/dev-wrap test-part
661- #0000 DEO #00ff DEO
662+@op-jmpr ( -- pass )
663+ ( - ) LITr _&t [ JMPr ] #01 EQU JMP2r
664+ &t #01 JMP2r
665
666- ( end )
667+@op-jcnr ( -- pass )
668+ ( - ) #23 LIT2r 01 _&x [ JCNr INC &x ] [ #23 ] EQU
669+ ( - ) #23 LIT2r 00 _&y [ JCNr INC &y ] [ #24 ] EQU AND
670+ ( - ) #1234 LIT2r 01 _&t [ JCNr &back ] POP [ #34 ] EQU AND
671+ ( - ) #1234 LIT2r 00 _&t [ JCNr ] POP [ #12 ] EQU AND JMP2r
672+ &t SWP ,&back JMP
673
674- [ LIT &fail 80 ]
675- DUP #80 EQU ;Dict/result test-part
676- #0f DEO
677+@op-jsrr ( -- pass )
678+ LITr 0a LITr _&t JSRr STHr #14 EQU JMP2r
679+ &t DUPr ADDr JMP2
680
681- #0a18 DEO
682- #010e DEO
683+@op-sthr ( -- pass )
684+ ( - ) LITr 55 [ STHr ] #55 EQU JMP2r
685
686-BRK
687+@op-ldzr ( -- pass )
688+ ( - ) LITr 00 LDZr STHr #12 EQU JMP2r
689
690-(
691-@|metadata )
692+@op-stzr ( -- pass )
693+ ( - ) LIT2r 5606 [ STZr ] #06 LDZ #56 EQU JMP2r
694
695-@meta 00
696- ( name ) "Opctest 0a
697- ( details ) "A 20 "Testing 20 "Program 0a
698- ( author ) "By 20 "Devine 20 "Lu 20 "Linvega 0a
699- ( date ) "6 20 "May 20 "2026 $2
700+@op-ldrr ( -- pass )
701+ ( - ) LITr _&t LDRr STHr #12 EQU JMP2r
702+ &t 12
703
704-@test-part ( f name* -- )
705- pstr ?{
706- #01 ;on-reset/fail STA
707- ;Dict/failed !pstr }
708- ;Dict/passed !pstr
709+@op-strr ( -- pass )
710+ ( - ) LITr 34 LITr _&t [ STRr ] ,&t LDR #34 EQU JMP2r
711+ &t $1
712
713-@run-test ( addr* -- addr* f )
714+@op-ldar ( -- pass )
715+ ( - ) LIT2r =&value LDAr STHr #ef EQU JMP2r
716+ &value ef
717
718- LDA2k JSR2 DUP ?&pass
719- ;Dict/missed pstr
720- [ LIT2 &name $2 ] pstr
721- [ LIT2 "# 18 ] DEO
722- [ LIT2 "a -id ] LDZ ADD #18 DEO
723- #0a18 DEO
724- #01 ;on-reset/fail STA
725- &pass
726- .id LDZ INC .id STZ
727+@op-star ( -- pass )
728+ ( - ) LITr 12 LIT2r =&value [ STAr ] ;&value LDA #12 EQU JMP2r
729+ &value 00
730
731-JMP2r
732+@op-deir ( -- pass )
733+ ( skip ) #01 JMP2r
734
735-@set ( name* -- f )
736+@op-deor ( -- pass )
737+ ( skip ) #01 JMP2r
738
739- ;run-test/name STA2 #01
740- [ LIT2 ff -id ] STZ
741+@op-addr ( -- pass )
742+ ( - ) LITr ff LITr 00 ADDr STHr #ff EQU JMP2r
743
744-JMP2r
745+@op-subr ( -- pass )
746+ ( - ) LITr ff LITr 00 SUBr STHr #ff EQU JMP2r
747
748-@pstr ( str* -- )
749- DUP2 LDA
750- DUP ?{ POP POP2 JMP2r }
751- #18 DEO
752- INC2 !pstr
753+@op-mulr ( -- pass )
754+ ( - ) LITr 00 LITr 01 MULr STHr #00 EQU JMP2r
755
756-@pstr-jcn ( str* -- )
757- LDAk #18 DEO
758- INC2 LDAk ,pstr-jcn JCN
759- POP2
760- JMP2r
761+@op-divr ( -- pass )
762+ ( - ) LITr 10 LITr 06 DIVr STHr [ #02 ] EQU JMP2r
763
764-@tests
765-=op-equ [
766- =op-equ/a =op-equ/b =op-equ/c =op-equ/d
767- =op-equ/e =op-equ/f =op-equ/g =op-equ/h ]
768-=op-neq [
769- =op-neq/a =op-neq/b =op-neq/c =op-neq/d
770- =op-neq/e =op-neq/f =op-neq/g =op-neq/h ]
771-=op-gth [
772- =op-gth/a =op-gth/b =op-gth/c =op-gth/d
773- =op-gth/e =op-gth/f =op-gth/g =op-gth/h ]
774-=op-lth [
775- =op-lth/a =op-lth/b =op-lth/c =op-lth/d
776- =op-lth/e =op-lth/f =op-lth/g =op-lth/h ]
777-=op-add [
778- =op-add/a =op-add/b =op-add/c =op-add/d
779- =op-add/e =op-add/f =op-add/g =op-add/h ]
780-=op-sub [
781- =op-sub/a =op-sub/b =op-sub/c =op-sub/d
782- =op-sub/e =op-sub/f =op-sub/g =op-sub/h ]
783-=op-mul [
784- =op-mul/a =op-mul/b =op-mul/c =op-mul/d
785- =op-mul/e =op-mul/f =op-mul/g =op-mul/h ]
786-=op-div [
787- =op-div/a =op-div/b =op-div/c =op-div/d
788- =op-div/e =op-div/f =op-div/g =op-div/h
789- =op-div/i =op-div/j ]
790-=op-inc [
791- =op-inc/a =op-inc/b =op-inc/c =op-inc/d
792- =op-inc/e =op-inc/f =op-inc/g =op-inc/h
793- =op-inc/i =op-inc/j ]
794-=op-pop [
795- =op-pop/a =op-pop/b =op-pop/c =op-pop/d
796- =op-pop/e =op-pop/f =op-pop/g =op-pop/h
797- =op-pop/i =op-pop/j ]
798-=op-dup [
799- =op-dup/a =op-dup/b =op-dup/c =op-dup/d ]
800-=op-nip [
801- =op-nip/a =op-nip/b =op-nip/c =op-nip/d ]
802-=op-swp [
803- =op-swp/a =op-swp/b =op-swp/c =op-swp/d ]
804-=op-ovr [
805- =op-ovr/a =op-ovr/b =op-ovr/c =op-ovr/d ]
806-=op-rot [
807- =op-rot/a =op-rot/b =op-rot/c =op-rot/d ]
808-=op-and [
809- =op-and/a =op-and/b =op-and/c =op-and/d
810- =op-and/e =op-and/f =op-and/g =op-and/h ]
811-=op-ora [
812- =op-ora/a =op-ora/b =op-ora/c =op-ora/d
813- =op-ora/e =op-ora/f =op-ora/g =op-ora/h ]
814-=op-eor [
815- =op-eor/a =op-eor/b =op-eor/c =op-eor/d
816- =op-eor/e =op-eor/f =op-eor/g =op-eor/h ]
817-=op-sft [
818- =op-sft/a =op-sft/b =op-sft/c =op-sft/d
819- =op-sft/e =op-sft/f =op-sft/g =op-sft/h ]
820-=op-stz [
821- =op-stz/a =op-stz/b =op-stz/c =op-stz/d ]
822-=op-str [
823- =op-str/a =op-str/b =op-str/c =op-str/d
824- =op-str/e =op-str/f =op-str/g =op-str/h ]
825-=op-sta [
826- =op-sta/a =op-sta/b =op-sta/c =op-sta/d ]
827-=op-jmp [
828- =op-jmp/a =op-jmp/b =op-jmp/c ]
829-=op-jcn [
830- =op-jcn/a =op-jcn/b =op-jcn/c =op-jcn/d
831- =op-jcn/e =op-jcn/f ]
832-=op-jsr [
833- =op-jsr/a =op-jsr/b =op-jsr/c ]
834-=op-sth [
835- =op-sth/a =op-sth/b =op-sth/c =op-sth/d
836- =op-sth/e =op-sth/f ]
837-=op-jci [
838- =op-jci/a =op-jci/b =op-jci/c ]
839-=op-jmi [
840- =op-jmi/a ]
841-=op-jsi [
842- =op-jsi/a =op-jsi/b =op-jsi/c =op-jsi/d ]
843- &end
844+@op-andr ( -- pass )
845+ ( - ) LITr fc LITr 3f ANDr STHr [ #3c ] EQU JMP2r
846
847-(
848-@|StackI )
849-
850-@op-inc ;Dict/inc !set
851- &a #01 INC [ #02 ] EQU JMP2r
852- &b #ff INC [ #00 ] EQU JMP2r
853- &c #fe INC [ #ff ] EQU JMP2r
854- &d #00 INC [ #01 ] EQU JMP2r
855- &e #00ff INC2 [ #0100 ] EQU2 JMP2r
856- &f #ffff INC2 [ #0000 ] EQU2 JMP2r
857- &g #fffe INC2 [ #ffff ] EQU2 JMP2r
858- &h #0000 INC2 [ #0001 ] EQU2 JMP2r
859- &i #00ff INCk NIP EQU JMP2r
860- &j #00ff INC2k POP ADD EQU JMP2r
861-@op-pop ;Dict/pop !set
862- &a #0a #0b POP [ #0a ] EQU JMP2r
863- &b #0a #0b #0c POP POP [ #0a ] EQU JMP2r
864- &c #0a #0b #0c ADD POP [ #0a ] EQU JMP2r
865- &d #0a #0b #0c POP ADD [ #15 ] EQU JMP2r
866- &e #0a0b #0c0d POP2 [ #0a0b ] EQU2 JMP2r
867- &f #0a0b #0c0d #0e0f POP2 POP2 [ #0a0b ] EQU2 JMP2r
868- &g #0a0b #0c0d #0e0f ADD2 POP2 [ #0a0b ] EQU2 JMP2r
869- &h #0a0b #0c0d #0e0f POP2 ADD2 [ #1618 ] EQU2 JMP2r
870- &i #0a POPk [ #0a ] EQU JMP2r
871- &j #0a0b POP2k [ #0a0b ] EQU2 JMP2r
872-@op-nip ;Dict/nip !set
873- &a #12 #34 #56 NIP ADD [ #68 ] EQU JMP2r
874- &b #12 #34 #56 NIPk ADD2 ADD [ #f2 ] EQU JMP2r
875- &c #1234 #5678 #9abc NIP2 ADD2 [ #acf0 ] EQU2 JMP2r
876- &d #1234 #5678 #9abc NIP2k ADD2 ADD2 ADD2 [ #9e24 ] EQU2 JMP2r
877+@op-orar ( -- pass )
878+ ( - ) LITr 0f LITr f0 ORAr STHr #ff EQU JMP2r
879
880-(
881-@|StackII )
882-
883-@op-swp ;Dict/swp !set
884- &a #02 #10 SWP DIV [ #08 ] EQU JMP2r
885- &b #0a0b #0c0d SWP2 NIP2 [ #0a0b ] EQU2 JMP2r
886- &c #abcd SWPk SWP EQU2 JMP2r
887- &d #abcd #1234 SWP2k ADD2 ADD2 ADD2 #7c02 EQU2 JMP2r
888-@op-rot ;Dict/rot !set
889- &a #02 #04 #10 ROT DIV ADD [ #0c ] EQU JMP2r
890- &b #0a0b #0c0d #0c0f ROT2 ADD2 NIP2 [ #161a ] EQU2 JMP2r
891- &c #0a0b #0c ROTk ADD2 ADD2 [ #2220 ] EQU2 JMP2r
892- &d #1234 #5678 #9abc ROT2k ADD2 ADD2 ADD2 ADD2 ADD2 #06d0 EQU2 JMP2r
893-@op-dup ;Dict/dup !set
894- &a #0a #0b DUP ADD ADD [ #20 ] EQU JMP2r
895- &b #0a0b DUP2 ADD2 [ #1416 ] EQU2 JMP2r
896- &c #12 DUPk ADD ADD [ #36 ] EQU JMP2r
897- &d #1234 DUP2k ADD2 ADD2 [ #369c ] EQU2 JMP2r
898-@op-ovr ;Dict/ovr !set
899- &a #02 #10 OVR DIV ADD [ #0a ] EQU JMP2r
900- &b #0a0b #0c0d OVR2 NIP2 ADD2 [ #1416 ] EQU2 JMP2r
901- &c #abcd OVRk EQU2 #ab01 EQU2 JMP2r
902- &d #abcd #1234 OVR2k ROT2 ADD2 ADD2 ADD2 SUB2 #2fcb EQU2 JMP2r
903+@op-eorr ( -- pass )
904+ ( - ) LITr 00 LITr 00 EORr STHr #00 EQU JMP2r
905
906-(
907-@|Log )
908-
909-@op-equ ;Dict/equ !set
910- &a #f8 #f8 EQU [ #01 ] EQU JMP2r
911- &b #01 #01 EQU [ #01 ] EQU JMP2r
912- &c #f8 #01 EQU [ #00 ] EQU JMP2r
913- &d #00 #ff EQU [ #00 ] EQU JMP2r
914- &e #f801 #f801 EQU2 [ #01 ] EQU JMP2r
915- &f #01f8 #01f8 EQU2 [ #01 ] EQU JMP2r
916- &g #f801 #01f8 EQU2 [ #00 ] EQU JMP2r
917- &h #01f8 #f801 EQU2 [ #00 ] EQU JMP2r
918-@op-neq ;Dict/neq !set
919- &a #f8 #f8 NEQ [ #00 ] EQU JMP2r
920- &b #01 #01 NEQ [ #00 ] EQU JMP2r
921- &c #f8 #01 NEQ [ #01 ] EQU JMP2r
922- &d #01 #f8 NEQ [ #01 ] EQU JMP2r
923- &e #f801 #f801 NEQ2 [ #00 ] EQU JMP2r
924- &f #01f8 #01f8 NEQ2 [ #00 ] EQU JMP2r
925- &g #f801 #01f8 NEQ2 [ #01 ] EQU JMP2r
926- &h #01f8 #f801 NEQ2 [ #01 ] EQU JMP2r
927-@op-gth ;Dict/gth !set
928- &a #f8 #f8 GTH [ #00 ] EQU JMP2r
929- &b #01 #01 GTH [ #00 ] EQU JMP2r
930- &c #f8 #01 GTH [ #01 ] EQU JMP2r
931- &d #01 #f8 GTH [ #00 ] EQU JMP2r
932- &e #f801 #f801 GTH2 [ #00 ] EQU JMP2r
933- &f #01f8 #01f8 GTH2 [ #00 ] EQU JMP2r
934- &g #f801 #01f8 GTH2 [ #01 ] EQU JMP2r
935- &h #01f8 #f801 GTH2 [ #00 ] EQU JMP2r
936-@op-lth ;Dict/lth !set
937- &a #f8 #f8 LTH [ #00 ] EQU JMP2r
938- &b #01 #01 LTH [ #00 ] EQU JMP2r
939- &c #f8 #01 LTH [ #00 ] EQU JMP2r
940- &d #01 #ff LTH [ #01 ] EQU JMP2r
941- &e #f801 #f801 LTH2 [ #00 ] EQU JMP2r
942- &f #01f8 #01f8 LTH2 [ #00 ] EQU JMP2r
943- &g #f801 #01f8 LTH2 [ #00 ] EQU JMP2r
944- &h #01f8 #f801 LTH2 [ #01 ] EQU JMP2r
945+@op-sftr ( -- pass )
946+ ( - ) LITr ff LITr 08 SFTr STHr #00 EQU JMP2r
947
948 (
949-@|Sth )
950-
951-@op-jmp ;Dict/jmp !set
952- &a #12 #34 ,&reljmp JMP SWP &reljmp POP [ #12 ] EQU JMP2r
953- &b #56 #78 ;&absjmp JMP2 SWP &absjmp POP [ #56 ] EQU JMP2r
954- &c #12 #34 ,&skip1 JMP &back1 POP [ #34 ] EQU JMP2r &skip1 SWP ,&back1 JMP
955-@op-jcn ;Dict/jcn !set
956- &a #23 #01 ,&reljcn-y JCN INC &reljcn-y [ #23 ] EQU JMP2r
957- &b #23 #00 ,&reljcn-n JCN INC &reljcn-n [ #24 ] EQU JMP2r
958- &c #23 #01 ;&absjcn-y JCN2 INC &absjcn-y [ #23 ] EQU JMP2r
959- &d #23 #00 ;&absjcn-n JCN2 INC &absjcn-n [ #24 ] EQU JMP2r
960- &bwdjcn-y [ #23 ] EQU JMP2r &e #23 #01 ,&bwdjcn-y JCN POP #00 JMP2r
961- &bwdjcn-n POP #00 JMP2r &f #23 #00 ,&bwdjcn-n JCN [ #23 ] EQU JMP2r
962-@op-jsr ;Dict/jsr !set
963- &a #1234 #5678 ,&routine JSR [ #68ac ] EQU2 JMP2r
964- &b #12 #34 ;routine JSR2 [ #46 ] EQU JMP2r
965- &bwdjsr ADD JMP2r &c #12 #34 ,&bwdjsr JSR [ #46 ] EQU JMP2r
966- &routine ADD2 JMP2r
967-@op-sth ;Dict/sth !set
968- &a #0a STH #0b STH ADDr STHr [ #15 ] EQU JMP2r
969- &b #000a STH2 #000b STH2 ADD2r STH2r [ #0015 ] EQU2 JMP2r
970- &c #abcd STH STH STH2r [ #cdab ] EQU2 JMP2r
971- &d #abcd STH2k STH2r EQU2 JMP2r
972- &e #abcd STH2k STHr STHr SWP EQU2 JMP2r
973- &f [ LIT2r abcd ] STHr STHr [ #cdab ] EQU2 JMP2r
974+@|m2r )
975
976-(
977-@|Mem )
978-
979-@op-stz ;Dict/stz !set
980- &a #ab .zeropage/hb STZ .zeropage/hb LDZ [ #ab ] EQU JMP2r
981- &b #cd .zeropage/lb STZ .zeropage/lb LDZ [ #cd ] EQU JMP2r
982- &c .zeropage/hb LDZ2 [ #abcd ] EQU2 JMP2r
983- &d #1234 .zeropage/hb STZ2 .zeropage/hb LDZ2 [ #1234 ] EQU2 JMP2r
984-@op-str ;Dict/str !set
985- [ LIT2 &before-hb $1 &before-lb $1 ]
986- &a #ab ,&before-hb STR ,&before-hb LDR [ #ab ] EQU JMP2r
987- &b #cd ,&before-lb STR ,&before-lb LDR [ #cd ] EQU JMP2r
988- &c ,&before-hb LDR2 [ #abcd ] EQU2 JMP2r
989- &d #1234 ,&before-hb STR2 ,&before-hb LDR2 [ #1234 ] EQU2 JMP2r
990- &e #ab ,&after-hb STR ,&after-hb LDR [ #ab ] EQU JMP2r
991- &f #cd ,&after-lb STR ,&after-lb LDR [ #cd ] EQU JMP2r
992- &g ,&after-hb LDR2 [ #abcd ] EQU2 JMP2r
993- &h #1234 ,&after-hb STR2 ,&after-hb LDR2 [ #1234 ] EQU2 JMP2r
994- [ LIT2 &after-hb $1 &after-lb $1 ]
995-@op-sta ;Dict/sta !set
996- &a #ab ;absolute/hb STA ;absolute/hb LDA [ #ab ] EQU JMP2r
997- &b #cd ;absolute/lb STA ;absolute/lb LDA [ #cd ] EQU JMP2r
998- &c ;absolute/hb LDA2 [ #abcd ] EQU2 JMP2r
999- &d #1234 ;absolute/hb STA2 ;absolute/hb LDA2 [ #1234 ] EQU2 JMP2r
1000+@op-inc2r ( -- pass )
1001+ ( - ) LIT2r 00ff INC2r
1002+ ( . ) STH2r [ #0100 ] EQU2 JMP2r
1003
1004-(
1005-@|Ari )
1006-
1007-@op-add ;Dict/add !set
1008- &a #ff #00 ADD [ #ff ] EQU JMP2r
1009- &b #01 #ff ADD [ #00 ] EQU JMP2r
1010- &c #ff #ff ADD [ #fe ] EQU JMP2r
1011- &d #12 #34 ADDk ADD ADD [ #8c ] EQU JMP2r
1012- &e #ffff #0000 ADD2 [ #ffff ] EQU2 JMP2r
1013- &f #0001 #ffff ADD2 [ #0000 ] EQU2 JMP2r
1014- &g #ffff #ffff ADD2 [ #fffe ] EQU2 JMP2r
1015- &h #fffe #ffff ADD2 [ #fffd ] EQU2 JMP2r
1016-@op-sub ;Dict/sub !set
1017- &a #ff #00 SUB [ #ff ] EQU JMP2r
1018- &b #01 #ff SUB [ #02 ] EQU JMP2r
1019- &c #ff #ff SUB [ #00 ] EQU JMP2r
1020- &d #fe #ff SUB [ #ff ] EQU JMP2r
1021- &e #ffff #0000 SUB2 [ #ffff ] EQU2 JMP2r
1022- &f #0001 #ffff SUB2 [ #0002 ] EQU2 JMP2r
1023- &g #ffff #ffff SUB2 [ #0000 ] EQU2 JMP2r
1024- &h #fffe #ffff SUB2 [ #ffff ] EQU2 JMP2r
1025-@op-mul ;Dict/mul !set
1026- &a #00 #01 MUL [ #00 ] EQU JMP2r
1027- &b #3f #e7 MUL [ #d9 ] EQU JMP2r
1028- &c #37 #3f MUL [ #89 ] EQU JMP2r
1029- &d #10 #02 MUL [ #20 ] EQU JMP2r
1030- &e #1000 #0003 MUL2 [ #3000 ] EQU2 JMP2r
1031- &f #abcd #1234 MUL2 [ #4fa4 ] EQU2 JMP2r
1032- &g #8000 #0200 MUL2 [ #0000 ] EQU2 JMP2r
1033- &h #2222 #0003 MUL2 [ #6666 ] EQU2 JMP2r
1034-@op-div ;Dict/div !set
1035- &a #10 #06 DIV [ #02 ] EQU JMP2r
1036- &b #20 #20 DIV [ #01 ] EQU JMP2r
1037- &c #34 #01 DIV [ #34 ] EQU JMP2r
1038- &d #02 #ef DIV [ #00 ] EQU JMP2r
1039- &e #02 #00 DIV [ #00 ] EQU JMP2r
1040- &f #03e8 #0006 DIV2 [ #00a6 ] EQU2 JMP2r
1041- &g #abcd #1234 DIV2 [ #0009 ] EQU2 JMP2r
1042- &h #8000 #0200 DIV2 [ #0040 ] EQU2 JMP2r
1043- &i #2222 #0003 DIV2 [ #0b60 ] EQU2 JMP2r
1044- &j #0202 #0000 DIV2 [ #0000 ] EQU2 JMP2r
1045+@op-pop2r ( -- pass )
1046+ ( - ) LIT2r 0a0b LIT2r 0c0d POP2r
1047+ ( . ) STH2r [ #0a0b ] EQU2 JMP2r
1048+
1049+@op-nip2r ( -- pass )
1050+ ( - ) LIT2r 1234 LIT2r 5678 NIP2r
1051+ ( . ) STH2r #5678 EQU2 JMP2r
1052+
1053+@op-swp2r ( -- pass )
1054+ ( - ) LIT2r 0a0b LIT2r 0c0d SWP2r
1055+ ( . ) STH2r POP2r #0a0b EQU2 JMP2r
1056+
1057+@op-rot2r ( -- pass )
1058+ ( - ) LIT2r 0a0b LIT2r 0c0d LIT2r 0c0f ROT2r POP2r POP2r
1059+ ( . ) STH2r #0c0d EQU2 JMP2r
1060+
1061+@op-dup2r ( -- pass )
1062+ ( - ) LIT2r 0a0b DUP2r
1063+ ( . ) STH2r STH2r ADD2 #1416 EQU2 JMP2r
1064+
1065+@op-ovr2r ( -- pass )
1066+ ( - ) LIT2r 0a0b LIT2r 0c0d OVR2r
1067+ ( . ) STH2r STH2r
1068+ ( . ) STH2r ADD2 ADD2 #2023 EQU2 JMP2r
1069+
1070+@op-equ2r ( -- pass )
1071+ ( - ) LIT2r 0a0b LIT2r 0a0b EQU2r STHr #01 EQU
1072+ ( - ) LIT2r 0a0b LIT2r 0c0d EQU2r STHr #00 EQU AND JMP2r
1073+
1074+@op-neq2r ( -- pass )
1075+ ( - ) LIT2r 0a0b LIT2r 0a0b NEQ2r STHr #00 EQU
1076+ ( - ) LIT2r 0a0b LIT2r 0c0d NEQ2r STHr #01 EQU AND JMP2r
1077+
1078+@op-gth2r ( -- pass )
1079+ ( - ) LIT2r f801 LIT2r f801 GTH2r STHr #00 EQU
1080+ ( - ) LIT2r f801 LIT2r 01f8 GTH2r STHr #01 EQU AND JMP2r
1081+
1082+@op-lth2r ( -- pass )
1083+ ( - ) LIT2r f801 LIT2r f801 LTH2r STHr #00 EQU
1084+ ( - ) LIT2r 01f8 LIT2r f801 LTH2r STHr #01 EQU AND JMP2r
1085+
1086+@op-jmp2r ( -- pass )
1087+ ( - ) #5678 LIT2r =&t [ JMP2r ] SWP &t POP #56 EQU JMP2r
1088+
1089+@op-jcn2r ( -- pass )
1090+ ( - ) #23 LITr 01 LIT2r =&x [ JCN2r INC &x ] #23 EQU
1091+ ( - ) #23 LITr 00 LIT2r =&y [ JCN2r INC &y ] #24 EQU AND JMP2r
1092+
1093+@op-jsr2r ( -- pass )
1094+ ( - ) LITr 12 LIT2r =&t JSR2r STHr #24 EQU JMP2r
1095+ &t DUPr ADDr JMP2
1096+
1097+@op-sth2r ( -- pass )
1098+ ( - ) LIT2r 0a0b
1099+ ( . ) STH2r #0a0b EQU2 JMP2r
1100+
1101+@op-ldz2r ( -- pass )
1102+ ( - ) LITr 00 [ LDZ2r ]
1103+ ( . ) STH2r #1234 EQU2 JMP2r
1104+
1105+@op-stz2r ( -- pass )
1106+ ( - ) LIT2r 5678 LITr 08 [ STZ2r ] #08 LDZ2 #5678 EQU2 JMP2r
1107+
1108+@op-ldr2r ( -- pass )
1109+ ( - ) LITr _&t [ LDR2r ]
1110+ ( . ) STH2r #1234 EQU2 JMP2r
1111+ &t 1234
1112+
1113+@op-str2r ( -- pass )
1114+ ( - ) LIT2r 1234 LITr _&t [ STR2r ] ,&t LDR2 #1234 EQU2 JMP2r
1115+ &t $2
1116+
1117+@op-lda2r ( -- pass )
1118+ ( - ) LIT2r =&t [ LDA2r ]
1119+ ( . ) STH2r #1234 EQU2 JMP2r
1120+ &t 1234
1121+
1122+@op-sta2r ( -- pass )
1123+ ( - ) LIT2r 1234 LIT2r =&t [ STA2r ] ;&t LDA2 #1234 EQU2 JMP2r
1124+ &t $2
1125+
1126+@op-dei2r ( -- pass )
1127+ ( skip ) #01 JMP2r
1128+
1129+@op-deo2r ( -- pass )
1130+ ( skip ) #01 JMP2r
1131+
1132+@op-add2r ( -- pass )
1133+ ( - ) LIT2r ffff LIT2r 0000 ADD2r STH2r [ #ffff ] EQU2
1134+ ( - ) LIT2r 0001 LIT2r ffff ADD2r STH2r [ #0000 ] EQU2 AND
1135+ ( - ) LIT2r ffff LIT2r ffff ADD2r STH2r [ #fffe ] EQU2 AND
1136+ ( - ) LIT2r fffe LIT2r ffff ADD2r STH2r [ #fffd ] EQU2 AND JMP2r
1137+
1138+@op-sub2r ( -- pass )
1139+ ( - ) LIT2r ffff LIT2r 0000 SUB2r STH2r [ #ffff ] EQU2
1140+ ( - ) LIT2r 0001 LIT2r ffff SUB2r STH2r [ #0002 ] EQU2 AND
1141+ ( - ) LIT2r ffff LIT2r ffff SUB2r STH2r [ #0000 ] EQU2 AND
1142+ ( - ) LIT2r fffe LIT2r ffff SUB2r STH2r [ #ffff ] EQU2 AND JMP2r
1143+
1144+@op-mul2r ( -- pass )
1145+ ( - ) LIT2r 1000 LIT2r 0003 MUL2r STH2r [ #3000 ] EQU2
1146+ ( - ) LIT2r abcd LIT2r 1234 MUL2r STH2r [ #4fa4 ] EQU2 AND
1147+ ( - ) LIT2r 8000 LIT2r 0200 MUL2r STH2r [ #0000 ] EQU2 AND
1148+ ( - ) LIT2r 2222 LIT2r 0003 MUL2r STH2r [ #6666 ] EQU2 AND JMP2r
1149+
1150+@op-div2r ( -- pass )
1151+ ( - ) LIT2r 03e8 LIT2r 0006 DIV2r STH2r [ #00a6 ] EQU2
1152+ ( - ) LIT2r abcd LIT2r 1234 DIV2r STH2r [ #0009 ] EQU2 AND
1153+ ( - ) LIT2r 8000 LIT2r 0200 DIV2r STH2r [ #0040 ] EQU2 AND
1154+ ( - ) LIT2r 2222 LIT2r 0003 DIV2r STH2r [ #0b60 ] EQU2 AND
1155+ ( - ) LIT2r 0202 LIT2r 0000 DIV2r STH2r [ #0000 ] EQU2 AND JMP2r
1156+
1157+@op-and2r ( -- pass )
1158+ ( - ) LIT2r f0f0 LIT2r 00f0 AND2r STH2r [ #00f0 ] EQU2
1159+ ( - ) LIT2r aaaa LIT2r 5555 AND2r STH2r [ #0000 ] EQU2 AND
1160+ ( - ) LIT2r ffff LIT2r 1234 AND2r STH2r [ #1234 ] EQU2 AND
1161+ ( - ) LIT2r abcd LIT2r 0a0c AND2r STH2r [ #0a0c ] EQU2 AND JMP2r
1162+
1163+@op-ora2r ( -- pass )
1164+ ( - ) LIT2r 0f0f LIT2r f0f0 ORA2r STH2r [ #ffff ] EQU2
1165+ ( - ) LIT2r abab LIT2r cdcd ORA2r STH2r [ #efef ] EQU2 AND
1166+ ( - ) LIT2r 1122 LIT2r 1234 ORA2r STH2r [ #1336 ] EQU2 AND
1167+ ( - ) LIT2r 8888 LIT2r 1000 ORA2r STH2r [ #9888 ] EQU2 AND JMP2r
1168+
1169+@op-eor2r ( -- pass )
1170+ ( - ) LIT2r ffff LIT2r ff00 EOR2r STH2r [ #00ff ] EQU2
1171+ ( - ) LIT2r aaaa LIT2r 5555 EOR2r STH2r [ #ffff ] EQU2 AND
1172+ ( - ) LIT2r 1122 LIT2r 1234 EOR2r STH2r [ #0316 ] EQU2 AND
1173+ ( - ) LIT2r 8888 LIT2r 1000 EOR2r STH2r [ #9888 ] EQU2 AND JMP2r
1174+
1175+@op-sft2r ( -- pass )
1176+ ( - ) LIT2r ffff LITr 01 SFT2r STH2r [ #7fff ] EQU2
1177+ ( - ) LIT2r ffff LITr 70 SFT2r STH2r [ #ff80 ] EQU2 AND
1178+ ( - ) LIT2r ffff LITr 7e SFT2r STH2r [ #0180 ] EQU2 AND
1179+ ( - ) LIT2r ffff LITr e3 SFT2r STH2r [ #c000 ] EQU2 AND JMP2r
1180
1181 (
1182-@|Bit )
1183-
1184-@op-and ;Dict/and !set
1185- &a #fc #3f AND [ #3c ] EQU JMP2r
1186- &b #f0 #0f AND [ #00 ] EQU JMP2r
1187- &c #ff #3c AND [ #3c ] EQU JMP2r
1188- &d #02 #03 AND [ #02 ] EQU JMP2r
1189- &e #f0f0 #00f0 AND2 [ #00f0 ] EQU2 JMP2r
1190- &f #aaaa #5555 AND2 [ #0000 ] EQU2 JMP2r
1191- &g #ffff #1234 AND2 [ #1234 ] EQU2 JMP2r
1192- &h #abcd #0a0c AND2 [ #0a0c ] EQU2 JMP2r
1193-@op-ora ;Dict/ora !set
1194- &a #0f #f0 ORA [ #ff ] EQU JMP2r
1195- &b #ab #cd ORA [ #ef ] EQU JMP2r
1196- &c #12 #34 ORA [ #36 ] EQU JMP2r
1197- &d #88 #10 ORA [ #98 ] EQU JMP2r
1198- &e #0f0f #f0f0 ORA2 [ #ffff ] EQU2 JMP2r
1199- &f #abab #cdcd ORA2 [ #efef ] EQU2 JMP2r
1200- &g #1122 #1234 ORA2 [ #1336 ] EQU2 JMP2r
1201- &h #8888 #1000 ORA2 [ #9888 ] EQU2 JMP2r
1202-@op-eor ;Dict/eor !set
1203- &a #00 #00 EOR [ #00 ] EQU JMP2r
1204- &b #ff #00 EOR [ #ff ] EQU JMP2r
1205- &c #aa #55 EOR [ #ff ] EQU JMP2r
1206- &d #ff #ff EOR [ #00 ] EQU JMP2r
1207- &e #ffff #ff00 EOR2 [ #00ff ] EQU2 JMP2r
1208- &f #aaaa #5555 EOR2 [ #ffff ] EQU2 JMP2r
1209- &g #1122 #1234 EOR2 [ #0316 ] EQU2 JMP2r
1210- &h #8888 #1000 EOR2 [ #9888 ] EQU2 JMP2r
1211-@op-sft ;Dict/sft !set
1212- &a #ff #08 SFT [ #00 ] EQU JMP2r
1213- &b #ff #e0 SFT [ #00 ] EQU JMP2r
1214- &c #ff #11 SFT [ #fe ] EQU JMP2r
1215- &d #ff #12 SFT [ #7e ] EQU JMP2r
1216- &e #ffff #01 SFT2 [ #7fff ] EQU2 JMP2r
1217- &f #ffff #70 SFT2 [ #ff80 ] EQU2 JMP2r
1218- &g #ffff #7e SFT2 [ #0180 ] EQU2 JMP2r
1219- &h #ffff #e3 SFT2 [ #c000 ] EQU2 JMP2r
1220+@|mk )
1221+
1222+@op-inck ( -- pass )
1223+ ( - ) #01 INCk #0102 EQU2
1224+ ( - ) #ff INCk #ff00 EQU2 AND JMP2r
1225+
1226+@op-popk ( -- pass )
1227+ ( - ) #0a #0b POPk #0a0b EQU2 JMP2r
1228+
1229+@op-nipk ( -- pass )
1230+ ( - ) #12 #34 NIPk NIP NIP #34 EQU
1231+ ( - ) #12 #34 NIPk NIP #1234 EQU2 AND JMP2r
1232+
1233+@op-swpk ( -- pass )
1234+ ( - ) #12 #34 SWPk NIP2 #3412 EQU2
1235+ ( - ) #12 #34 SWPk POP2 #1234 EQU2 AND JMP2r
1236+
1237+@op-rotk ( -- pass )
1238+ ( - ) #02 #04 #10 ROTk POP POP POP ROT DIV ADD #0c EQU
1239+ ( - ) #02 #04 #10 ROTk [ STH STH STH ] POP POP POP STHr STHr STHr DIV ADD [ #0c ] EQU AND JMP2r
1240+
1241+@op-dupk ( -- pass )
1242+ ( - ) #0a DUPk EQU SWP [ #0a ] EQU AND
1243+ ( - ) #ff DUPk EQU SWP #ff EQU AND AND JMP2r
1244+
1245+@op-ovrk ( -- pass )
1246+ ( - ) #02 #10 OVRk POP POP POP #0210 EQU2
1247+ ( check result ) #02 #10 OVRk NIP NIP DIV ADD [ #0a ] EQU AND JMP2r
1248+
1249+@op-equk ( -- pass )
1250+ ( - ) #0a #0a EQUk ROT [ #0a ] EQU ROT [ #0a ] EQU AND SWP #01 EQU AND
1251+ ( - ) #0a #0b EQUk ROT [ #0a ] EQU ROT [ #0b ] EQU AND SWP #00 EQU AND AND JMP2r
1252+
1253+@op-neqk ( -- pass )
1254+ ( - ) #0a #0b NEQk ROT [ #0a ] EQU ROT [ #0b ] EQU AND SWP #01 EQU AND
1255+ ( - ) #0a #0a NEQk ROT [ #0a ] EQU ROT [ #0a ] EQU AND SWP #00 EQU AND AND JMP2r
1256+
1257+@op-gthk ( -- pass )
1258+ ( - ) #f8 #01 GTHk ROT [ #f8 ] EQU ROT #01 EQU AND SWP #01 EQU AND
1259+ ( - ) #01 #f8 GTHk ROT #01 EQU ROT [ #f8 ] EQU AND SWP #00 EQU AND AND JMP2r
1260+
1261+@op-lthk ( -- pass )
1262+ ( - ) #01 #ff LTHk ROT #01 EQU ROT #ff EQU AND SWP #01 EQU AND
1263+ ( - ) #f8 #01 LTHk ROT [ #f8 ] EQU ROT #01 EQU AND SWP #00 EQU AND AND JMP2r
1264+
1265+@op-jmpk ( -- pass )
1266+ ( - ) #1234 ,&x [ JMPk SWP &x ] POP2 [ #12 ] EQU
1267+ ( - ) #1234 ,&t [ JMPk &back ] POP2 [ #34 ] EQU AND JMP2r
1268+ &t POP SWP ,&back JMPk
1269+
1270+@op-jcnk ( -- pass )
1271+ ( - ) LITr 0a #00 ,&x JCNk INCr &x POP2 STHr #0b EQU
1272+ ( - ) LITr 0a #01 ,&y JCNk INCr &y POP2 STHr #0a EQU AND JMP2r
1273+
1274+@op-jsrk ( -- pass )
1275+ ( - ) #0a ,&t JSRk #0b EQU JMP2r
1276+ &t POP INC JMP2r
1277+
1278+@op-sthk ( -- pass )
1279+ ( - ) #08 STHk STHr ADD #10 EQU JMP2r
1280+
1281+@op-ldzk ( -- pass )
1282+ ( - ) #00 LDZk [ #12 ] EQU SWP #00 EQU AND JMP2r
1283+
1284+@op-stzk ( -- pass )
1285+ ( - ) #56 #0a STZk POP2 #0a LDZ [ #56 ] EQU
1286+ ( - ) #ab #0b STZk #ab0b EQU2 AND JMP2r
1287+
1288+@op-ldrk ( -- pass )
1289+ ( - ) ,&t LDRk [ #12 ] EQU NIP JMP2r
1290+ &t 12
1291+
1292+@op-strk ( -- pass )
1293+ ( - ) #34 ,&t STRk POP2 ,&t LDR [ #34 ] EQU
1294+ ( - ) #34 ,&t STRk SWP [ #34 ] EQU NIP AND JMP2r
1295+ &t $1
1296+
1297+@op-ldak ( -- pass )
1298+ ( - ) ;&t LDAk [ STH ] ;&t EQU2 STHr [ #ef ] EQU AND JMP2r
1299+ &t ef
1300+
1301+@op-stak ( -- pass )
1302+ ( - ) #12 ;&t STAk POP2 POP ;&t LDA [ #12 ] EQU
1303+ ( - ) #34 ;&t STAk [ STH2 ] [ #34 ] EQU STH2r ;&t EQU2 AND AND JMP2r
1304+ &t 00
1305+
1306+@op-deik ( -- pass )
1307+ ( skip ) #01 JMP2r
1308+
1309+@op-deok ( -- pass )
1310+ ( skip ) #01 JMP2r
1311+
1312+@op-addk ( -- pass )
1313+ ( - ) #03 #05 ADDk ROT [ #03 ] EQU ROT [ #05 ] EQU AND SWP [ #08 ] EQU AND
1314+ ( - ) #ff #01 ADDk ROT #ff EQU ROT #01 EQU AND SWP #00 EQU AND AND JMP2r
1315+
1316+@op-subk ( -- pass )
1317+ ( - ) #ff #00 SUBk ROT #ff EQU ROT #00 EQU AND SWP #ff EQU AND
1318+ ( - ) #01 #ff SUBk ROT #01 EQU ROT #ff EQU AND SWP [ #02 ] EQU AND AND JMP2r
1319+
1320+@op-mulk ( -- pass )
1321+ ( - ) #03 #04 MULk ROT [ #03 ] EQU ROT [ #04 ] EQU AND SWP [ #0c ] EQU AND
1322+ ( - ) #10 #02 MULk ROT [ #10 ] EQU ROT [ #02 ] EQU AND SWP [ #20 ] EQU AND AND JMP2r
1323+
1324+@op-divk ( -- pass )
1325+ ( - ) #10 #02 DIVk ROT [ #10 ] EQU ROT [ #02 ] EQU AND SWP [ #08 ] EQU AND
1326+ ( - ) #34 #01 DIVk ROT [ #34 ] EQU ROT #01 EQU AND SWP [ #34 ] EQU AND AND JMP2r
1327+
1328+@op-andk ( -- pass )
1329+ ( - ) #fc #3f ANDk ROT [ #fc ] EQU ROT [ #3f ] EQU AND SWP [ #3c ] EQU AND
1330+ ( - ) #ff #aa ANDk ROT #ff EQU ROT [ #aa ] EQU AND SWP [ #aa ] EQU AND AND JMP2r
1331+
1332+@op-orak ( -- pass )
1333+ ( - ) #0f #f0 ORAk ROT [ #0f ] EQU ROT [ #f0 ] EQU AND SWP #ff EQU AND
1334+ ( - ) #12 #34 ORAk ROT [ #12 ] EQU ROT [ #34 ] EQU AND SWP [ #36 ] EQU AND AND JMP2r
1335+
1336+@op-eork ( -- pass )
1337+ ( - ) #aa #55 EORk ROT [ #aa ] EQU ROT [ #55 ] EQU AND SWP #ff EQU AND
1338+ ( - ) #ff #ff EORk ROT #ff EQU ROT #ff EQU AND SWP #00 EQU AND AND JMP2r
1339+
1340+@op-sftk ( -- pass )
1341+ ( - ) #ff #11 SFTk ROT #ff EQU ROT [ #11 ] EQU AND SWP [ #fe ] EQU AND
1342+ ( - ) #ff #12 SFTk ROT #ff EQU ROT [ #12 ] EQU AND SWP [ #7e ] EQU AND AND JMP2r
1343
1344 (
1345-@|Imm )
1346-
1347-@op-jci ;Dict/jci !set
1348- &before #01 JMP2r
1349- &a #01 ?&skip-a #00 JMP2r &skip-a #01 JMP2r
1350- &b #00 ?&skip-b #01 JMP2r &skip-b #00 JMP2r
1351- &c #01 ?&before #00 JMP2r
1352-@op-jmi ;Dict/jmi !set
1353- &a !&skip-a #00 JMP2r &skip-a #01 JMP2r
1354-@op-jsi ;Dict/jsi !set
1355- &a #02 #04 routine #06 EQU JMP2r
1356- &b ;&return special &return JMP2r
1357- &c ,&skip-c JMP &routine-c ADD JMP2r &skip-c #02 #04 op-jsi/routine-c #06 EQU JMP2r
1358- &d ,&skip-d JMP &routine-d ADD JMP2r &skip-d #02 #04 op-jsi-far-routine-d #06 EQU JMP2r
1359-
1360-@special ( routine* -- f )
1361-
1362- ( test that the stack order is LIFO )
1363- DUP2 STH2kr EQU2
1364- ROT ROT DUP2r STHr STHr SWP EQU2 AND
1365-
1366-JMP2r
1367-
1368-@routine ( a b -- c ) ADD JMP2r
1369-@subroutine ( -- ) [ LIT2 "kO ] #18 DEO #18 DEO JMP2r
1370-@absolute/hb $1 &lb $2
1371-
1372-@Dict [
1373- &ok "Ok $1
1374- &done "Tests 20 "Complete. 0a $1
1375- &opctests "Opcodes $1
1376- &stack-wrap "Stack-wrap $1
1377- &ram-wrap "RAM-wrap $1
1378- &pc-wrap "PC-wrap $1
1379- &pc2-wrap "PC2-wrap $1
1380- &zp-wrap "Zeropage-wrap $1
1381- &dev-wrap "Devices-wrap $1
1382- &result "Result: $1
1383- &passed 20 "passed! 0a $1
1384- &missed "Opcode 20 "Failed 20 "-- 20 $1
1385- &failed 20 "failed. 0a $1
1386- &equ "EQU $1 &neq "NEQ $1 >h "GTH $1 <h "LTH $1
1387- &add "ADD $1 &sub "SUB $1 &mul "MUL $1 &div "DIV $1
1388- &inc "INC $1 &pop "POP $1 &dup "DUP $1 &nip "NIP $1
1389- &swp "SWP $1 &ovr "OVR $1 &rot "ROT $1
1390- &and "AND $1 &ora "ORA $1 &eor "EOR $1 &sft "SFT $1
1391- &stz "STZ $1 &str "STR $1 &sta "STA $1
1392- &jmp "JMP $1 &jcn "JCN $1 &jsr "JSR $1 &sth "STH $1
1393- &jmi "JMI $1 &jci "JCI $1 &jsi "JSI $1 ]
1394+@|m2k )
1395+
1396+@op-inc2k ( -- pass )
1397+ ( - ) #00ff INC2k ADD2 #01ff EQU2 JMP2r
1398+
1399+@op-pop2k ( -- pass )
1400+ ( - ) #0a0b POP2k #0a0b EQU2 JMP2r
1401+
1402+@op-nip2k ( -- pass )
1403+ ( - ) #1234 #5678 NIP2k #5678 EQU2 STH
1404+ ( - ) #5678 EQU2 STH
1405+ ANDr
1406+ ( - ) #1234 EQU2 STHr AND JMP2r
1407+
1408+@op-swp2k ( -- pass )
1409+ ( - ) #1234 #5678 SWP2k
1410+ ( | tests )
1411+ #1234 EQU2 STH
1412+ #5678 EQU2 STH
1413+ #5678 EQU2 STH
1414+ #1234 EQU2 STH
1415+ ANDr ANDr ANDr STHr JMP2r
1416+
1417+@op-rot2k ( -- pass )
1418+ ( - ) #000a #000b #000c ROT2k
1419+ ( | tests )
1420+ #000a EQU2 STH
1421+ #000c EQU2 STH
1422+ #000b EQU2 STH
1423+ #000c EQU2 STH
1424+ #000b EQU2 STH
1425+ #000a EQU2 STH
1426+ ANDr ANDr ANDr ANDr ANDr STHr JMP2r
1427+
1428+@op-dup2k ( -- pass )
1429+ ( - ) #0a0b DUP2k
1430+ ( | tests )
1431+ #0a0b EQU2 STH
1432+ #0a0b EQU2 STH
1433+ #0a0b EQU2 STH
1434+ ANDr ANDr STHr JMP2r
1435+
1436+@op-ovr2k ( -- pass )
1437+ ( - ) #0a0b #0c0d OVR2k
1438+ ( | tests )
1439+ #0a0b EQU2 STH
1440+ #0c0d EQU2 STH
1441+ #0a0b EQU2 STH
1442+ #0c0d EQU2 STH
1443+ #0a0b EQU2 STH
1444+ ANDr ANDr ANDr ANDr STHr JMP2r
1445+
1446+@op-equ2k ( -- pass )
1447+ ( - ) #0a0b #0a0b EQU2k STH
1448+ EQU2 STHr AND
1449+ ( - ) #0a0b #0e0f EQU2k #00 EQU STH
1450+ EQU2 #00 EQU STHr AND AND JMP2r
1451+
1452+@op-neq2k ( -- pass )
1453+ ( - ) #0a0b #0a0b NEQ2k #00 EQU STH
1454+ NEQ2 #00 EQU STHr AND
1455+ ( - ) #0a0b #0e0f NEQ2k STH
1456+ NEQ2 STHr AND AND JMP2r
1457+
1458+@op-gth2k ( -- pass )
1459+ ( - ) #000a #000b GTH2k #00 EQU STH
1460+ GTH2 #00 EQU STHr AND
1461+ ( - ) #000b #000a GTH2k STH
1462+ GTH2 STHr AND AND JMP2r
1463+
1464+@op-lth2k ( -- pass )
1465+ ( - ) #000b #000a LTH2k #00 EQU STH
1466+ LTH2 #00 EQU STHr AND
1467+ ( - ) #000a #000b LTH2k STH
1468+ LTH2 STHr AND AND JMP2r
1469+
1470+@op-jmp2k ( -- pass )
1471+ ( - ) LIT2r 1234 ;&x [ JMP2k SWPr &x ] POP2 STHr POPr #34 EQU
1472+ ( - ) LIT2r 1234 ;&t [ JMP2k &back ] POP2 POPr STHr #34 EQU AND JMP2r
1473+ &t POP2 SWPr ;&back JMP2k
1474+
1475+@op-jcn2k ( -- pass )
1476+ ( - ) LITr 0a #00 ;&x JCN2k INCr &x POP2 POP STHr #0b EQU
1477+ ( - ) LITr 0a #01 ;&y JCN2k INCr &y POP2 POP STHr #0a EQU AND JMP2r
1478+
1479+@op-jsr2k ( -- pass )
1480+ ( - ) #0a ;&t JSR2k #0b EQU JMP2r
1481+ &t POP2 INC JMP2r
1482+
1483+@op-sth2k ( -- pass )
1484+ ( - ) #0a0b STH2k STH2r EQU2 JMP2r
1485+
1486+@op-ldz2k ( -- pass )
1487+ ( - ) #00 LDZ2k #1234 EQU2 SWP #00 EQU AND JMP2r
1488+
1489+@op-stz2k ( -- pass )
1490+ ( - ) #5678 #05 [ STZ2k ] #05 EQU STH
1491+ #5678 EQU2 STHr AND #05 LDZ2 #5678 EQU2 AND JMP2r
1492+
1493+@op-ldr2k ( -- pass )
1494+ ( - ) ,&t LDR2k [ LIT2 &t 1234 ] EQU2 NIP JMP2r
1495+
1496+@op-str2k ( -- pass )
1497+ ( - ) #1234 ,&t STR2k POP [ LIT2 &t $2 ] EQU2 JMP2r
1498+
1499+@op-lda2k ( -- pass )
1500+ ( - ) ;&t LDA2k [ LIT2 &t 1234 ] EQU2 NIP NIP JMP2r
1501+
1502+@op-sta2k ( -- pass )
1503+ ( - ) #1234 ;&t STA2k POP2 [ LIT2 &t $2 ] EQU2 JMP2r
1504+
1505+@op-dei2k ( -- pass )
1506+ ( skip ) #01 JMP2r
1507+
1508+@op-deo2k ( -- pass )
1509+ ( skip ) #01 JMP2r
1510+
1511+@op-add2k ( -- pass )
1512+ #0a0b #0c0d ADD2k
1513+ ( | tests )
1514+ #1618 EQU2 STH
1515+ #0c0d EQU2 STH
1516+ #0a0b EQU2 STH
1517+ ANDr ANDr STHr JMP2r
1518+
1519+@op-sub2k ( -- pass )
1520+ #0a0b #0c0d SUB2k
1521+ ( | tests )
1522+ #fdfe EQU2 STH
1523+ #0c0d EQU2 STH
1524+ #0a0b EQU2 STH
1525+ ANDr ANDr STHr JMP2r
1526+
1527+@op-mul2k ( -- pass )
1528+ #0a0b #0c0d MUL2k
1529+ ( | tests )
1530+ #068f EQU2 STH
1531+ #0c0d EQU2 STH
1532+ #0a0b EQU2 STH
1533+ ANDr ANDr STHr JMP2r
1534+
1535+@op-div2k ( -- pass )
1536+ #0c0d #0003 DIV2k
1537+ ( | tests )
1538+ #0404 EQU2 STH
1539+ #0003 EQU2 STH
1540+ #0c0d EQU2 STH
1541+ ANDr ANDr STHr JMP2r
1542+
1543+@op-and2k ( -- pass )
1544+ #0c0d #a5a5 AND2k
1545+ ( | tests )
1546+ #0405 EQU2 STH
1547+ #a5a5 EQU2 STH
1548+ #0c0d EQU2 STH
1549+ ANDr ANDr STHr JMP2r
1550+
1551+@op-ora2k ( -- pass )
1552+ #0c0d #a5a5 ORA2k
1553+ ( | tests )
1554+ #adad EQU2 STH
1555+ #a5a5 EQU2 STH
1556+ #0c0d EQU2 STH
1557+ ANDr ANDr STHr JMP2r
1558+
1559+@op-eor2k ( -- pass )
1560+ #0c0d #a5a5 EOR2k
1561+ ( | tests )
1562+ #a9a8 EQU2 STH
1563+ #a5a5 EQU2 STH
1564+ #0c0d EQU2 STH
1565+ ANDr ANDr STHr JMP2r
1566+
1567+@op-sft2k ( -- pass )
1568+ ( - ) #1234 #32 SFT2k
1569+ ( | test )
1570+ #2468 EQU2 STH
1571+ #32 EQU STH
1572+ #1234 EQU2 STH
1573+ ANDr ANDr STHr JMP2r
1574
1575 (
1576-@|Relative Distance Bytes )
1577+@|mkr )
1578+
1579+@op-inckr ( -- pass )
1580+ ( - ) LITr 01 INCkr LIT2r 0102 EQU2r
1581+ ( - ) LITr ff INCkr LIT2r ff00 EQU2r ANDr STHr JMP2r
1582+
1583+@op-popkr ( -- pass )
1584+ ( - ) LIT2r 0a0b POPkr LIT2r 0a0b EQU2r STHr JMP2r
1585+
1586+@op-nipkr ( -- pass )
1587+ ( - ) LIT2r 1234 NIPkr NIPr NIPr LITr 34 EQUr
1588+ ( - ) LIT2r 1234 NIPkr NIPr LIT2r 1234 EQU2r ANDr STHr JMP2r
1589+
1590+@op-swpkr ( -- pass )
1591+ ( - ) LIT2r 1234 SWPkr NIP2r LIT2r 3412 EQU2r
1592+ ( - ) LIT2r 1234 SWPkr POP2r LIT2r 1234 EQU2r ANDr STHr JMP2r
1593+
1594+@op-rotkr ( -- pass )
1595+ LITr 0a LITr 0b LITr 0c ROTkr STH2r #0c0a EQU2 STH2r #0c0b EQU2 STH2r #0a0b EQU2 AND AND JMP2r
1596+
1597+@op-dupkr ( -- pass )
1598+ ( - ) LITr 0a DUPkr
1599+ ( . ) STH2r #0a0a EQU2
1600+ ( . ) STHr #0a EQU AND JMP2r
1601+
1602+@op-ovrkr ( -- pass )
1603+ ( - ) LIT2r 0a0b OVRkr
1604+ ( . ) STH2r #0b0a EQU2
1605+ ( . ) STH2r #0b0a EQU2 AND
1606+ ( . ) STHr #0a EQU AND JMP2r
1607+
1608+@op-equkr ( -- pass )
1609+ ( - ) LIT2r 0a0a EQUkr ROTr LITr 0a EQUr ROTr LITr 0a EQUr ANDr SWPr LITr 01 EQUr ANDr
1610+ ( - ) LIT2r 0a0b EQUkr ROTr LITr 0a EQUr ROTr LITr 0b EQUr ANDr SWPr LITr 00 EQUr ANDr ANDr STHr JMP2r
1611+
1612+@op-neqkr ( -- pass )
1613+ ( - ) LIT2r 0a0b NEQkr ROTr LITr 0a EQUr ROTr LITr 0b EQUr ANDr SWPr LITr 01 EQUr ANDr
1614+ ( - ) LIT2r 0a0a NEQkr ROTr LITr 0a EQUr ROTr LITr 0a EQUr ANDr SWPr LITr 00 EQUr ANDr ANDr STHr JMP2r
1615+
1616+@op-gthkr ( -- pass )
1617+ ( - ) LIT2r f801 GTHkr ROTr LITr f8 EQUr ROTr LITr 01 EQUr ANDr SWPr LITr 01 EQUr ANDr
1618+ ( - ) LIT2r 01f8 GTHkr ROTr LITr 01 EQUr ROTr LITr f8 EQUr ANDr SWPr LITr 00 EQUr ANDr ANDr STHr JMP2r
1619+
1620+@op-lthkr ( -- pass )
1621+ ( - ) LIT2r 01ff LTHkr ROTr LITr 01 EQUr ROTr LITr ff EQUr ANDr SWPr LITr 01 EQUr ANDr
1622+ ( - ) LIT2r f801 LTHkr ROTr LITr f8 EQUr ROTr LITr 01 EQUr ANDr SWPr LITr 00 EQUr ANDr ANDr STHr JMP2r
1623+
1624+@op-jmpkr ( -- pass )
1625+ ( - ) #1234 LITr _&x [ JMPkr SWP &x ] POP POPr [ #12 ] EQU
1626+ ( - ) #1234 LITr _&t [ JMPkr &back ] POP POPr [ #34 ] EQU AND JMP2r
1627+ &t POPr SWP LITr _&back JMPkr
1628+
1629+@op-jcnkr ( -- pass )
1630+ ( - ) #0a LIT2r 00 _&x JCNkr
1631+ INC &x POP2r #0b EQU
1632+ ( - ) #0a LIT2r 01 _&y JCNkr
1633+ INC &y POP2r #0a EQU AND JMP2r
1634+
1635+@op-jsrkr ( -- pass )
1636+ ( - ) LITr 0a LITr _&t JSRkr STHr #0b EQU JMP2r
1637+ &t POPr INCr JMP2
1638+
1639+@op-sthkr ( -- pass )
1640+ ( - ) LIT2r 0a0b STH2kr STH2r EQU2 JMP2r
1641+
1642+@op-ldzkr ( -- pass )
1643+ ( - ) LITr 00 LDZkr STH2r #0012 EQU2 JMP2r
1644+
1645+@op-stzkr ( -- pass )
1646+ ( - ) LITr 56 LITr 0a STZkr
1647+ POP2r LITr 0a LDZr LITr 56 EQUr
1648+ ( - ) LITr ab LITr 0b STZkr
1649+ LIT2r ab0b EQU2r ANDr STHr JMP2r
1650+
1651+@op-ldrkr ( -- pass )
1652+ ( - ) LITr _&t LDRkr [ LITr 12 ] EQUr NIPr STHr JMP2r
1653+ &t 12
1654+
1655+@op-strkr ( -- pass )
1656+ ( - ) LITr 34 LITr _&t STRkr
1657+ POP2r LITr _&t LDRr [ LITr 34 ] EQUr
1658+ ( - ) LITr 34 LITr _&t STRkr
1659+ SWPr [ LITr 34 ] EQUr NIPr ANDr STHr JMP2r
1660+ &t $1
1661+
1662+@op-ldakr ( -- pass )
1663+ ( - ) LIT2r =&t LDAkr [ STHr ] LIT2r =&t EQU2r STH
1664+ [ LITr ef ] EQUr ANDr STHr JMP2r
1665+ &t ef
1666+
1667+@op-stakr ( -- pass )
1668+ ( - ) LITr 12 LIT2r =&t STAkr
1669+ POP2r POPr LIT2r =&t LDAr [ LITr 12 ] EQUr
1670+ ( - ) LITr 34 LIT2r =&t STAkr
1671+ [ STH2r ] [ LITr 34 ] EQUr STH2
1672+ LIT2r =&t EQU2r ANDr ANDr STHr JMP2r
1673+ &t 00
1674+
1675+@op-deikr ( -- pass )
1676+ ( skip ) #01 JMP2r
1677+
1678+@op-deokr ( -- pass )
1679+ ( skip ) #01 JMP2r
1680+
1681+@op-addkr ( -- pass )
1682+ ( - ) LITr 03 LITr 05 ADDkr ROTr LITr 03 EQUr ROTr LITr 05 EQUr ANDr SWPr LITr 08 EQUr ANDr
1683+ ( - ) LITr ff LITr 01 ADDkr ROTr LITr ff EQUr ROTr LITr 01 EQUr ANDr SWPr LITr 00 EQUr ANDr ANDr STHr JMP2r
1684+
1685+@op-subkr ( -- pass )
1686+ ( - ) LITr ff LITr 00 SUBkr ROTr LITr ff EQUr ROTr LITr 00 EQUr ANDr SWPr LITr ff EQUr ANDr
1687+ ( - ) LITr 01 LITr ff SUBkr ROTr LITr 01 EQUr ROTr LITr ff EQUr ANDr SWPr LITr 02 EQUr ANDr ANDr STHr JMP2r
1688+
1689+@op-mulkr ( -- pass )
1690+ ( - ) LITr 03 LITr 04 MULkr ROTr LITr 03 EQUr ROTr LITr 04 EQUr ANDr SWPr LITr 0c EQUr ANDr
1691+ ( - ) LITr 10 LITr 02 MULkr ROTr LITr 10 EQUr ROTr LITr 02 EQUr ANDr SWPr LITr 20 EQUr ANDr ANDr STHr JMP2r
1692+
1693+@op-divkr ( -- pass )
1694+ ( - ) LITr 10 LITr 02 DIVkr ROTr LITr 10 EQUr ROTr LITr 02 EQUr ANDr SWPr LITr 08 EQUr ANDr
1695+ ( - ) LITr 34 LITr 01 DIVkr ROTr LITr 34 EQUr ROTr LITr 01 EQUr ANDr SWPr LITr 34 EQUr ANDr ANDr STHr JMP2r
1696+
1697+@op-andkr ( -- pass )
1698+ ( - ) LITr fc LITr 3f ANDkr ROTr LITr fc EQUr ROTr LITr 3f EQUr ANDr SWPr LITr 3c EQUr ANDr
1699+ ( - ) LITr ff LITr aa ANDkr ROTr LITr ff EQUr ROTr LITr aa EQUr ANDr SWPr LITr aa EQUr ANDr ANDr STHr JMP2r
1700+
1701+@op-orakr ( -- pass )
1702+ ( - ) LITr 0f LITr f0 ORAkr ROTr LITr 0f EQUr ROTr LITr f0 EQUr ANDr SWPr LITr ff EQUr ANDr
1703+ ( - ) LITr 12 LITr 34 ORAkr ROTr LITr 12 EQUr ROTr LITr 34 EQUr ANDr SWPr LITr 36 EQUr ANDr ANDr STHr JMP2r
1704+
1705+@op-eorkr ( -- pass )
1706+ ( - ) LITr aa LITr 55 EORkr ROTr LITr aa EQUr ROTr LITr 55 EQUr ANDr SWPr LITr ff EQUr ANDr
1707+ ( - ) LITr ff LITr ff EORkr ROTr LITr ff EQUr ROTr LITr ff EQUr ANDr SWPr LITr 00 EQUr ANDr ANDr STHr JMP2r
1708+
1709+@op-sftkr ( -- pass )
1710+ ( - ) LITr ff LITr 11 SFTkr ROTr LITr ff EQUr ROTr LITr 11 EQUr ANDr SWPr LITr fe EQUr ANDr
1711+ ( - ) LITr ff LITr 12 SFTkr ROTr LITr ff EQUr ROTr LITr 12 EQUr ANDr SWPr LITr 7e EQUr ANDr ANDr STHr JMP2r
1712
1713-@rel-distance/back "O $7c
1714-&entry
1715- ,&back LDR
1716- ,&forw LDR
1717- JMP2r
1718-$7e
1719-&forw "k
1720+(
1721+@|m2kr )
1722
1723-@op-jsi-far-routine-d
1724- op-jsi/routine-d JMP2r
1725+@op-inc2kr ( -- pass )
1726+ ( - ) LIT2r 00ff INC2kr ADD2r LIT2r 01ff EQU2r STHr JMP2r
1727+
1728+@op-pop2kr ( -- pass )
1729+ ( - ) LIT2r 0a0b POP2kr LIT2r 0a0b EQU2r STHr JMP2r
1730+
1731+@op-nip2kr ( -- pass )
1732+ ( - ) LIT2r 1234 LIT2r 5678 NIP2kr LIT2r 5678 EQU2r STHr
1733+ ( - ) LIT2r 5678 EQU2r STHr AND
1734+ ( - ) LIT2r 1234 EQU2r STH
1735+ ANDr STHr JMP2r
1736+
1737+@op-swp2kr ( -- pass )
1738+ ( - ) LIT2r 1234 LIT2r 5678 SWP2kr
1739+ ( | tests )
1740+ LIT2r 1234 EQU2r STHr LIT2r 5678 EQU2r STHr LIT2r 5678 EQU2r STHr LIT2r 1234 EQU2r STHr AND AND AND JMP2r
1741+
1742+@op-rot2kr ( -- pass )
1743+ ( - ) LIT2r 1234 LIT2r 5678 LIT2r 9abc ROT2kr STH2r #1234 EQU2 STH2r #9abc EQU2 STH2r #5678 EQU2 STH2r #9abc EQU2 STH2r #5678 EQU2 STH2r #1234 EQU2 AND AND AND AND AND JMP2r
1744+
1745+@op-dup2kr ( -- pass )
1746+ ( - ) LIT2r 1234 DUP2kr ADD2r ADD2r STH2r #369c EQU2 JMP2r
1747+
1748+@op-ovr2kr ( -- pass )
1749+ ( - ) LIT2r 0a0b LIT2r 0c0d OVR2kr STH2r #0a0b EQU2 STH2r #0c0d EQU2 STH2r #0a0b EQU2 STH2r #0c0d EQU2 STH2r #0a0b EQU2 AND AND AND AND JMP2r
1750+
1751+@op-equ2kr ( -- pass )
1752+ ( - ) LIT2r 0a0b LIT2r 0a0b EQU2kr STHr EQU2r STH
1753+ ANDr
1754+ ( - ) LIT2r 0a0b LIT2r 0e0f EQU2kr LITr 00 EQUr STHr EQU2r LITr 00 EQUr STH
1755+ ANDr ANDr STHr JMP2r
1756+
1757+@op-neq2kr ( -- pass )
1758+ ( - ) LIT2r 0a0b LIT2r 0a0b NEQ2kr LITr 00 EQUr STHr NEQ2r LITr 00 EQUr STH
1759+ ANDr
1760+ ( - ) LIT2r 0a0b LIT2r 0e0f NEQ2kr STHr NEQ2r STH
1761+ ANDr ANDr STHr JMP2r
1762+
1763+@op-gth2kr ( -- pass )
1764+ ( - ) LIT2r 000a LIT2r 000b GTH2kr LITr 00 EQUr STHr GTH2r LITr 00 EQUr STH
1765+ ANDr
1766+ ( - ) LIT2r 000b LIT2r 000a GTH2kr STHr GTH2r STH
1767+ ANDr ANDr STHr JMP2r
1768+
1769+@op-lth2kr ( -- pass )
1770+ ( - ) LIT2r 000b LIT2r 000a LTH2kr LITr 00 EQUr STHr LTH2r LITr 00 EQUr STH
1771+ ANDr
1772+ ( - ) LIT2r 000a LIT2r 000b LTH2kr STHr LTH2r STH
1773+ ANDr ANDr STHr JMP2r
1774+
1775+@op-jmp2kr ( -- pass )
1776+ ( - ) #1234 LIT2r =&x [ JMP2kr SWP &x ] POP2r POP #12 EQU
1777+ ( - ) #1234 LIT2r =&t [ JMP2kr &back ] POP2r POP #34 EQU AND JMP2r
1778+ &t POP2r SWP LIT2r =&back JMP2kr
1779+
1780+@op-jcn2kr ( -- pass )
1781+ ( - ) #0a LITr 00 LIT2r =&x JCN2kr
1782+ INC &x POP2r POPr #0b EQU
1783+ ( - ) #0a LITr 01 LIT2r =&y JCN2kr
1784+ INC &y POP2r POPr #0a EQU AND JMP2r
1785+
1786+@op-jsr2kr ( -- pass )
1787+ ( - ) LITr 0a LIT2r =&t JSR2kr STHr #0b EQU JMP2r
1788+ &t POP2r INCr JMP2
1789+
1790+@op-sth2kr ( -- pass )
1791+ ( - ) LIT2r 0a0b STH2kr #0a0b EQU2 #0a0b STH2r EQU2 AND JMP2r
1792+
1793+@op-ldz2kr ( -- pass )
1794+ ( - ) LITr 00 LDZ2kr STH2r #1234 EQU2 STHr #00 EQU AND JMP2r
1795+
1796+@op-stz2kr ( -- pass )
1797+ ( - ) LIT2r 5678 LITr 09 [ STZ2kr ] STHr #09 EQU STH2r #5678 EQU2 AND #09 LDZ2 #5678 EQU2 AND JMP2r
1798+
1799+@op-ldr2kr ( -- pass )
1800+ ( - ) LITr _&t LDR2kr [ LIT2r &t 1234 ] EQU2r NIPr STHr JMP2r
1801+
1802+@op-str2kr ( -- pass )
1803+ ( - ) LIT2r 1234 LITr _&t STR2kr
1804+ POPr [ LIT2r &t $2 ] EQU2r STHr JMP2r
1805+
1806+@op-lda2kr ( -- pass )
1807+ ( - ) LIT2r =&t LDA2kr [ LIT2r &t 1234 ] EQU2r NIPr NIPr STHr JMP2r
1808+
1809+@op-sta2kr ( -- pass )
1810+ ( - ) LIT2r 1234 LIT2r =&t STA2kr
1811+ POP2r [ LIT2r &t $2 ] EQU2r STHr JMP2r
1812+
1813+@op-dei2kr ( -- pass )
1814+ ( skip ) #01 JMP2r
1815+
1816+@op-deo2kr ( -- pass )
1817+ ( skip ) #01 JMP2r
1818+
1819+@op-add2kr ( -- pass )
1820+ LIT2r 0a0b LIT2r 0c0d ADD2kr
1821+ ( | tests )
1822+ LIT2r 1618 EQU2r STHr LIT2r 0c0d EQU2r STHr LIT2r 0a0b EQU2r STHr AND AND JMP2r
1823+
1824+@op-sub2kr ( -- pass )
1825+ LIT2r 0a0b LIT2r 0c0d SUB2kr
1826+ ( | tests )
1827+ LIT2r fdfe EQU2r STHr LIT2r 0c0d EQU2r STHr LIT2r 0a0b EQU2r STHr AND AND JMP2r
1828+
1829+@op-mul2kr ( -- pass )
1830+ LIT2r 0a0b LIT2r 0c0d MUL2kr
1831+ ( | tests )
1832+ LIT2r 068f EQU2r STHr LIT2r 0c0d EQU2r STHr LIT2r 0a0b EQU2r STHr AND AND JMP2r
1833+
1834+@op-div2kr ( -- pass )
1835+ LIT2r 0c0d LIT2r 0003 DIV2kr
1836+ ( | tests )
1837+ LIT2r 0404 EQU2r STHr LIT2r 0003 EQU2r STHr LIT2r 0c0d EQU2r STHr AND AND JMP2r
1838+
1839+@op-and2kr ( -- pass )
1840+ LIT2r 0c0d LIT2r a5a5 AND2kr
1841+ ( | tests )
1842+ LIT2r 0405 EQU2r STHr LIT2r a5a5 EQU2r STHr LIT2r 0c0d EQU2r STHr AND AND JMP2r
1843+
1844+@op-ora2kr ( -- pass )
1845+ LIT2r 0c0d LIT2r a5a5 ORA2kr
1846+ ( | tests )
1847+ LIT2r adad EQU2r STHr LIT2r a5a5 EQU2r STHr LIT2r 0c0d EQU2r STHr AND AND JMP2r
1848+
1849+@op-eor2kr ( -- pass )
1850+ LIT2r 0c0d LIT2r a5a5 EOR2kr
1851+ ( | tests )
1852+ LIT2r a9a8 EQU2r STHr LIT2r a5a5 EQU2r STHr LIT2r 0c0d EQU2r STHr AND AND JMP2r
1853+
1854+@op-sft2kr ( -- pass )
1855+ ( - ) LIT2r 1234 LITr 32 SFT2kr LIT2r 2468 EQU2r SWP2r LIT2r 1234 EQU2r ANDr LIT2r 3201 EQU2r STHr JMP2r
1856+
1857+@tests/lut [
1858+ =op-brk =op-inc =op-pop =op-nip
1859+ =op-swp =op-rot =op-dup =op-ovr
1860+ =op-equ =op-neq =op-gth =op-lth
1861+ =op-jmp =op-jcn =op-jsr =op-sth
1862+ =op-ldz =op-stz =op-ldr =op-str
1863+ =op-lda =op-sta =op-dei =op-deo
1864+ =op-add =op-sub =op-mul =op-div
1865+ =op-and =op-ora =op-eor =op-sft
1866+ =op-jci =op-inc2 =op-pop2 =op-nip2
1867+ =op-swp2 =op-rot2 =op-dup2 =op-ovr2
1868+ =op-equ2 =op-neq2 =op-gth2 =op-lth2
1869+ =op-jmp2 =op-jcn2 =op-jsr2 =op-sth2
1870+ =op-ldz2 =op-stz2 =op-ldr2 =op-str2
1871+ =op-lda2 =op-sta2 =op-dei2 =op-deo2
1872+ =op-add2 =op-sub2 =op-mul2 =op-div2
1873+ =op-and2 =op-ora2 =op-eor2 =op-sft2
1874+ =op-jmi =op-incr =op-popr =op-nipr
1875+ =op-swpr =op-rotr =op-dupr =op-ovrr
1876+ =op-equr =op-neqr =op-gthr =op-lthr
1877+ =op-jmpr =op-jcnr =op-jsrr =op-sthr
1878+ =op-ldzr =op-stzr =op-ldrr =op-strr
1879+ =op-ldar =op-star =op-deir =op-deor
1880+ =op-addr =op-subr =op-mulr =op-divr
1881+ =op-andr =op-orar =op-eorr =op-sftr
1882+ =op-jsi =op-inc2r =op-pop2r =op-nip2r
1883+ =op-swp2r =op-rot2r =op-dup2r =op-ovr2r
1884+ =op-equ2r =op-neq2r =op-gth2r =op-lth2r
1885+ =op-jmp2r =op-jcn2r =op-jsr2r =op-sth2r
1886+ =op-ldz2r =op-stz2r =op-ldr2r =op-str2r
1887+ =op-lda2r =op-sta2r =op-dei2r =op-deo2r
1888+ =op-add2r =op-sub2r =op-mul2r =op-div2r
1889+ =op-and2r =op-ora2r =op-eor2r =op-sft2r
1890+ =op-lit =op-inck =op-popk =op-nipk
1891+ =op-swpk =op-rotk =op-dupk =op-ovrk
1892+ =op-equk =op-neqk =op-gthk =op-lthk
1893+ =op-jmpk =op-jcnk =op-jsrk =op-sthk
1894+ =op-ldzk =op-stzk =op-ldrk =op-strk
1895+ =op-ldak =op-stak =op-deik =op-deok
1896+ =op-addk =op-subk =op-mulk =op-divk
1897+ =op-andk =op-orak =op-eork =op-sftk
1898+ =op-lit2 =op-inc2k =op-pop2k =op-nip2k
1899+ =op-swp2k =op-rot2k =op-dup2k =op-ovr2k
1900+ =op-equ2k =op-neq2k =op-gth2k =op-lth2k
1901+ =op-jmp2k =op-jcn2k =op-jsr2k =op-sth2k
1902+ =op-ldz2k =op-stz2k =op-ldr2k =op-str2k
1903+ =op-lda2k =op-sta2k =op-dei2k =op-deo2k
1904+ =op-add2k =op-sub2k =op-mul2k =op-div2k
1905+ =op-and2k =op-ora2k =op-eor2k =op-sft2k
1906+ =op-litr =op-inckr =op-popkr =op-nipkr
1907+ =op-swpkr =op-rotkr =op-dupkr =op-ovrkr
1908+ =op-equkr =op-neqkr =op-gthkr =op-lthkr
1909+ =op-jmpkr =op-jcnkr =op-jsrkr =op-sthkr
1910+ =op-ldzkr =op-stzkr =op-ldrkr =op-strkr
1911+ =op-ldakr =op-stakr =op-deikr =op-deokr
1912+ =op-addkr =op-subkr =op-mulkr =op-divkr
1913+ =op-andkr =op-orakr =op-eorkr =op-sftkr
1914+ =op-lit2r =op-inc2kr =op-pop2kr =op-nip2kr
1915+ =op-swp2kr =op-rot2kr =op-dup2kr =op-ovr2kr
1916+ =op-equ2kr =op-neq2kr =op-gth2kr =op-lth2kr
1917+ =op-jmp2kr =op-jcn2kr =op-jsr2kr =op-sth2kr
1918+ =op-ldz2kr =op-stz2kr =op-ldr2kr =op-str2kr
1919+ =op-lda2kr =op-sta2kr =op-dei2kr =op-deo2kr
1920+ =op-add2kr =op-sub2kr =op-mul2kr =op-div2kr
1921+ =op-and2kr =op-ora2kr =op-eor2kr =op-sft2kr ] &lut-end
1922
+67,
-63
1@@ -993,74 +993,78 @@ emu_deo(const Uint8 port, const Uint8 value)
2
3 /* clang-format off */
4
5-#define OPC(opc, A, B) {\
6- case 0x00|opc: {const Uint8 d=0,r=0;A B} break;\
7- case 0x20|opc: {const Uint8 d=1,r=0;A B} break;\
8- case 0x40|opc: {const Uint8 d=0,r=1;A B} break;\
9- case 0x60|opc: {const Uint8 d=1,r=1;A B} break;\
10- case 0x80|opc: {const Uint8 d=0,r=0,k=ptr[0];A ptr[0]=k;B} break;\
11- case 0xa0|opc: {const Uint8 d=1,r=0,k=ptr[0];A ptr[0]=k;B} break;\
12- case 0xc0|opc: {const Uint8 d=0,r=1,k=ptr[1];A ptr[1]=k;B} break;\
13- case 0xe0|opc: {const Uint8 d=1,r=1,k=ptr[1];A ptr[1]=k;B} break;}
14-#define DEC(m) stk[m][--ptr[m]]
15-#define INC(m) stk[m][ptr[m]++]
16-#define IMM a = ram[pc++] << 8, a |= ram[pc++];
17-#define MOV pc = d ? (Uint16)a : pc + (Sint8)a;
18-#define POx(o,m) o = DEC(r); if(m) o |= DEC(r) << 8;
19-#define PUx(i,m,s) if(m) c = (i), INC(s) = c >> 8, INC(s) = c; else INC(s) = i;
20-#define GOT(o) if(d) o[1] = DEC(r); o[0] = DEC(r);
21-#define PUT(i,s) INC(s) = i[0]; if(d) INC(s) = i[1];
22-#define DEO(o,v) emu_deo(o, v[0]); if(d) emu_deo(o + 1, v[1]);
23-#define DEI(i,v) v[0] = emu_dei(i); if(d) v[1] = emu_dei(i + 1); PUT(v,r)
24-#define POK(o,v,m) ram[o] = v[0]; if(d) ram[(o + 1) & m] = v[1];
25-#define PEK(i,v,m) v[0] = ram[i]; if(d) v[1] = ram[(i + 1) & m]; PUT(v,r)
26+#define Ld1(o) stk[r][(Uint8)(ptr[r]-(o))]
27+#define Ld2(o) (Ld1(o) << 8 | stk[r][(Uint8)(ptr[r]-(o)+1)])
28+#define Ldx(o8,o16) d ? Ld2(o16) : Ld1(o8)
29+#define Re1(m) ptr[r] -= m;
30+#define Rex(m1,m2) ptr[r] -= d ? m2 : m1;
31+#define Pu1(s,v) stk[s][ptr[s]++] = v;
32+#define Pu2(s,v) Pu1(s,v>>8) Pu1(s,v)
33+#define Pux(s,v) if(d) Pu1(s,(v)>>8) Pu1(s,v)
34+#define Lda(s,o) Pu1(r,ram[o]) if(d) Pu1(r,ram[(s)(o+1)])
35+#define Sta(s,o,u) if(d) ram[o]=u>>8, ram[(s)(o+1)]=u; else ram[o]=u;
36+#define Dei Uint16 tt; Uint16 t=emu_dei(x); if(d) tt=emu_dei(x+1); Pu1(r,t) if(d) Pu1(r,tt)
37+#define Deo if(d) emu_deo(x,y>>8), emu_deo(x+1,y); else emu_deo(x,y);
38+
39+#define MUTE (void)x;(void)y;(void)z;(void)r;(void)d;
40+
41+#define OP(opc,X,Y,Z,K,P) \
42+ case (opc)|0x00: { const int d=0,r=0,x=X,y=Y,z=Z; K P MUTE } break; \
43+ case (opc)|0x20: { const int d=1,r=0,x=X,y=Y,z=Z; K P MUTE } break; \
44+ case (opc)|0x40: { const int d=0,r=1,x=X,y=Y,z=Z; K P MUTE } break; \
45+ case (opc)|0x60: { const int d=1,r=1,x=X,y=Y,z=Z; K P MUTE } break; \
46+ case (opc)|0x80: { const int d=0,r=0,x=X,y=Y,z=Z; P MUTE } break; \
47+ case (opc)|0xa0: { const int d=1,r=0,x=X,y=Y,z=Z; P MUTE } break; \
48+ case (opc)|0xc0: { const int d=0,r=1,x=X,y=Y,z=Z; P MUTE } break; \
49+ case (opc)|0xe0: { const int d=1,r=1,x=X,y=Y,z=Z; P MUTE } break;
50
51 static unsigned int
52-uxn_eval(Uint16 pc)
53+uxn_eval(Uint16 start_pc)
54 {
55- unsigned int a, b, c, x[2], y[2], z[2];
56+ Uint16 pc = start_pc;
57 for(;;)
58 switch(ram[pc++]) {
59 /* BRK */ case 0x00: return 1;
60- /* JCI */ case 0x20: if(DEC(0)) { IMM pc += a; } else pc += 2; break;
61- /* JMI */ case 0x40: IMM pc += a; break;
62- /* JSI */ case 0x60: IMM PUx(pc, 1, 1) pc += a; break;
63- /* LI2 */ case 0xa0: INC(0) = ram[pc++]; /* fall-through */
64- /* LIT */ case 0x80: INC(0) = ram[pc++]; break;
65- /* L2r */ case 0xe0: INC(1) = ram[pc++]; /* fall-through */
66- /* LIr */ case 0xc0: INC(1) = ram[pc++]; break;
67- /* INC */ OPC(0x01,POx(a,d),PUx(a + 1,d,r))
68- /* POP */ OPC(0x02,ptr[r] -= 1 + d;,{})
69- /* NIP */ OPC(0x03,GOT(x) ptr[r] -= 1 + d;,PUT(x,r))
70- /* SWP */ OPC(0x04,GOT(x) GOT(y),PUT(x,r) PUT(y,r))
71- /* ROT */ OPC(0x05,GOT(x) GOT(y) GOT(z),PUT(y,r) PUT(x,r) PUT(z,r))
72- /* DUP */ OPC(0x06,GOT(x),PUT(x,r) PUT(x,r))
73- /* OVR */ OPC(0x07,GOT(x) GOT(y),PUT(y,r) PUT(x,r) PUT(y,r))
74- /* EQU */ OPC(0x08,POx(a,d) POx(b,d),PUx(b == a,0,r))
75- /* NEQ */ OPC(0x09,POx(a,d) POx(b,d),PUx(b != a,0,r))
76- /* GTH */ OPC(0x0a,POx(a,d) POx(b,d),PUx(b > a,0,r))
77- /* LTH */ OPC(0x0b,POx(a,d) POx(b,d),PUx(b < a,0,r))
78- /* JMP */ OPC(0x0c,POx(a,d),MOV)
79- /* JCN */ OPC(0x0d,POx(a,d) POx(b,0),if(b) MOV)
80- /* JSR */ OPC(0x0e,POx(a,d),PUx(pc,1,!r) MOV)
81- /* STH */ OPC(0x0f,GOT(x),PUT(x,!r))
82- /* LDZ */ OPC(0x10,POx(a,0),PEK(a, x, 0xff))
83- /* STZ */ OPC(0x11,POx(a,0) GOT(y),POK(a, y, 0xff))
84- /* LDR */ OPC(0x12,POx(a,0),PEK(pc + (Sint8)a, x, 0xffff))
85- /* STR */ OPC(0x13,POx(a,0) GOT(y),POK(pc + (Sint8)a, y, 0xffff))
86- /* LDA */ OPC(0x14,POx(a,1),PEK(a, x, 0xffff))
87- /* STA */ OPC(0x15,POx(a,1) GOT(y),POK(a, y, 0xffff))
88- /* DEI */ OPC(0x16,POx(a,0),DEI(a, x))
89- /* DEO */ OPC(0x17,POx(a,0) GOT(y),DEO(a, y))
90- /* ADD */ OPC(0x18,POx(a,d) POx(b,d),PUx(b + a, d,r))
91- /* SUB */ OPC(0x19,POx(a,d) POx(b,d),PUx(b - a, d,r))
92- /* MUL */ OPC(0x1a,POx(a,d) POx(b,d),PUx(b * a, d,r))
93- /* DIV */ OPC(0x1b,POx(a,d) POx(b,d),PUx(a ? b / a : 0, d,r))
94- /* AND */ OPC(0x1c,POx(a,d) POx(b,d),PUx(b & a, d,r))
95- /* ORA */ OPC(0x1d,POx(a,d) POx(b,d),PUx(b | a, d,r))
96- /* EOR */ OPC(0x1e,POx(a,d) POx(b,d),PUx(b ^ a, d,r))
97- /* SFT */ OPC(0x1f,POx(a,0) POx(b,d),PUx(b >> (a & 0xf) << (a >> 4), d,r))
98- } return 0;
99+ /* JCI */ case 0x20: { Uint16 a=ram[pc]<<8|ram[pc+1]; pc+=2; if(stk[0][--ptr[0]]) pc+=a; } break;
100+ /* JMI */ case 0x40: { Uint16 a=ram[pc]<<8|ram[pc+1]; pc+=2+a; } break;
101+ /* JSI */ case 0x60: { const Uint8 d=1; Uint16 a=ram[pc]<<8|ram[pc+1]; pc+=2; Pux(1,pc); pc+=a; } break;
102+ /* LIT */ case 0x80: { const Uint8 r=0,d=0; Lda(Uint16,pc); pc+=1; } break;
103+ /* LI2 */ case 0xa0: { const Uint8 r=0,d=1; Lda(Uint16,pc); pc+=2; } break;
104+ /* LIr */ case 0xc0: { const Uint8 r=1,d=0; Lda(Uint16,pc); pc+=1; } break;
105+ /* L2r */ case 0xe0: { const Uint8 r=1,d=1; Lda(Uint16,pc); pc+=2; } break;
106+ /* INC */ OP(0x01, Ldx(1,2),0, 0, Rex(1,2),Pux(r,x+1))
107+ /* POP */ OP(0x02, 0, 0, 0, Rex(1,2),{})
108+ /* NIP */ OP(0x03, Ldx(1,2),0, 0, Rex(2,4),Pux(r,x))
109+ /* SWP */ OP(0x04, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pux(r,x) Pux(r,y))
110+ /* ROT */ OP(0x05, Ldx(1,2),Ldx(2,4),Ldx(3,6),Rex(3,6),Pux(r,y) Pux(r,x) Pux(r,z))
111+ /* DUP */ OP(0x06, Ldx(1,2),0, 0, Rex(1,2),Pux(r,x) Pux(r,x))
112+ /* OVR */ OP(0x07, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pux(r,y) Pux(r,x) Pux(r,y))
113+ /* EQU */ OP(0x08, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pu1(r,x==y))
114+ /* NEQ */ OP(0x09, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pu1(r,y!=x))
115+ /* GTH */ OP(0x0a, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pu1(r,y>x))
116+ /* LTH */ OP(0x0b, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pu1(r,y<x))
117+ /* JMP */ OP(0x0c, Ldx(1,2),0, 0, Rex(1,2),pc=d?x:(pc+(Sint8)x);)
118+ /* JCN */ OP(0x0d, Ldx(1,2),Ld1(d+2),0, Rex(2,3),if(y) pc=d?x:(pc+(Sint8)x);)
119+ /* JSR */ OP(0x0e, Ldx(1,2),0, 0, Rex(1,2),Pu2(!r,pc) pc=d?x:(pc+(Sint8)x);)
120+ /* STH */ OP(0x0f, Ldx(1,2),0, 0, Rex(1,2),Pux(!r,x))
121+ /* LDZ */ OP(0x10, Ld1(1), 0, 0, Re1(1), Lda(Uint8,x))
122+ /* STZ */ OP(0x11, Ld1(1), Ldx(2,3),0, Rex(2,3),Sta(Uint8,x,y))
123+ /* LDR */ OP(0x12, Ld1(1), 0, 0, Re1(1), Uint16 t=pc+(Sint8)x; Lda(Uint16,t))
124+ /* STR */ OP(0x13, Ld1(1), Ldx(2,3),0, Rex(2,3),Uint16 t=pc+(Sint8)x; Sta(Uint16,t,y))
125+ /* LDA */ OP(0x14, Ld2(2), 0, 0, Re1(2), Lda(Uint16,x))
126+ /* STA */ OP(0x15, Ld2(2), Ldx(3,4),0, Rex(3,4),Sta(Uint16,x,y))
127+ /* DEI */ OP(0x16, Ld1(1), 0, 0, Re1(1), Dei)
128+ /* DEO */ OP(0x17, Ld1(1), Ldx(2,3),0, Rex(2,3),Deo)
129+ /* ADD */ OP(0x18, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pux(r,y+x))
130+ /* SUB */ OP(0x19, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pux(r,y-x))
131+ /* MUL */ OP(0x1a, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pux(r,y*x))
132+ /* DIV */ OP(0x1b, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pux(r,x?y/x:0))
133+ /* AND */ OP(0x1c, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pux(r,y&x))
134+ /* ORA */ OP(0x1d, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pux(r,y|x))
135+ /* EOR */ OP(0x1e, Ldx(1,2),Ldx(2,4),0, Rex(2,4),Pux(r,y^x))
136+ /* SFT */ OP(0x1f, Ld1(1) ,Ldx(2,3),0, Rex(2,3),Pux(r,(y>>(x&0xf))<<(x>>4)))
137+ }
138+ return 0;
139 }
140
141 /* clang-format on */
142@@ -1280,7 +1284,7 @@ main(int argc, char **argv)
143 {
144 int i = 1;
145 if(argc == 2 && argv[1][0] == '-' && argv[1][1] == 'v')
146- return !fprintf(stdout, "%s - Varvara Emulator, 10 May 2026.\n", argv[0]);
147+ return !fprintf(stdout, "%s - Varvara Emulator, 12 May 2026.\n", argv[0]);
148 else if(argc == 1)
149 return !fprintf(stdout, "usage: %s [-v] file.rom [args..]\n", argv[0]);
150 else if(!system_boot(argv[i++], argc > 2))