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 &gth "GTH $1 &lth "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))