about summary refs log tree commit diff stats
path: root/awk/uxn/test/tal
diff options
context:
space:
mode:
Diffstat (limited to 'awk/uxn/test/tal')
-rw-r--r--awk/uxn/test/tal/brk.tal1
-rw-r--r--awk/uxn/test/tal/brk_test.tal1
-rw-r--r--awk/uxn/test/tal/brk_with_data.tal1
-rw-r--r--awk/uxn/test/tal/bunnymark.tal221
-rw-r--r--awk/uxn/test/tal/life.tal221
-rw-r--r--awk/uxn/test/tal/opctest.tal492
-rw-r--r--awk/uxn/test/tal/proper.tal1
-rw-r--r--awk/uxn/test/tal/simple.tal1
-rw-r--r--awk/uxn/test/tal/simple2.tal1
-rw-r--r--awk/uxn/test/tal/simple3.tal1
10 files changed, 941 insertions, 0 deletions
diff --git a/awk/uxn/test/tal/brk.tal b/awk/uxn/test/tal/brk.tal
new file mode 100644
index 0000000..bf83010
--- /dev/null
+++ b/awk/uxn/test/tal/brk.tal
@@ -0,0 +1 @@
+BRK
\ No newline at end of file
diff --git a/awk/uxn/test/tal/brk_test.tal b/awk/uxn/test/tal/brk_test.tal
new file mode 100644
index 0000000..487f63d
--- /dev/null
+++ b/awk/uxn/test/tal/brk_test.tal
@@ -0,0 +1 @@
+BRK 
\ No newline at end of file
diff --git a/awk/uxn/test/tal/brk_with_data.tal b/awk/uxn/test/tal/brk_with_data.tal
new file mode 100644
index 0000000..c055e74
--- /dev/null
+++ b/awk/uxn/test/tal/brk_with_data.tal
@@ -0,0 +1 @@
+#01 #02 ADD BRK 
\ No newline at end of file
diff --git a/awk/uxn/test/tal/bunnymark.tal b/awk/uxn/test/tal/bunnymark.tal
new file mode 100644
index 0000000..579d305
--- /dev/null
+++ b/awk/uxn/test/tal/bunnymark.tal
@@ -0,0 +1,221 @@
+( bunnymark.tal )
+	( November 2021, Kira Oakley )
+	( March 2022, Devine Lu Linvega )
+
+|00 @System &vector $2 &pad $6 &r $2 &g $2 &b $2 &debug $1 &halt $1
+|20 @Screen &vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1
+|80 @Controller &vector $2 &button $1 &key $1
+|90 @Mouse &vector $2 &x $2 &y $2 &state $1 &wheel $1
+|c0 @DateTime &year $2 &month $1 &day $1 &hour $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1
+
+|0000
+
+	@frames $2
+	@last $1
+
+|0100
+
+@on-reset ( -> )
+	( | theme )
+	#2ce9 .System/r DEO2
+	#01c0 .System/g DEO2
+	#2ce5 .System/b DEO2
+	( | interrupts )
+	;on-frame .Screen/vector DEO2
+	( | fps label )
+	.Screen/width DEI2 #0046 SUB2 .Screen/x DEO2
+	#0008 .Screen/y DEO2
+	;text/fps #42 <draw-str>
+	( | bunnies label )
+	#0004 .Screen/x DEO2
+	;text/bunnies #42 <draw-str>
+	( | instructions label )
+	.Screen/width DEI2 #01 SFT2 #0050 SUB2 .Screen/x DEO2
+	;text/instructions #43 <draw-str>
+	#0028 #0008 #0000 <draw-dec>
+	( | seed prng )
+	prng-init BRK
+
+@on-frame ( -> )
+	.frames LDZ2k INC2 ROT STZ2
+	.DateTime/second DEI .last LDZ EQU ?{
+		.DateTime/second DEI .last STZ
+		.Screen/width DEI2 #002b SUB2 #0008 .frames LDZ2 <draw-dec>
+		#0000 .frames STZ2 }
+	( | mouse handling )
+	.Mouse/state DEI
+	( ) DUP #01 NEQ ?{ add-bunny }
+	( ) #02 LTH ?{ remove-bunny }
+	( | controller handling )
+	.Controller/button DEI
+	( ) DUP #01 NEQ ?{ add-bunny }
+	( ) #02 LTH ?{ remove-bunny }
+	( | clear )
+	#0000 DUP2 .Screen/x DEO2
+	.Screen/y DEO2
+	[ LIT2 80 -Screen/pixel ] DEO
+	;sprite/length LDA2 #0000
+	&loop ( -- )
+		EQU2k ?&bail
+		DUP2 <draw-bunny>
+		INC2 !&loop
+	&bail ( -- )
+		POP2 POP2 BRK
+
+@add-bunny ( -- )
+	;sprite/length LDA2
+	( | cap bunny count at 65535 )
+	DUP2 #ffff EQU2 ?&bail
+	( | compute the offset to the beginning of this new bunny's data )
+	DUP2 #30 SFT2 ;sprite/array ADD2
+	( | populate the new bunny's x/y/xvel/yvel with random values )
+	#00 rand OVR2 STA2
+	rand #1f AND rand OVR2 INC2 INC2 STA2
+	#00 rand #7f AND OVR2 #0004 ADD2 STA2
+	#00 rand #7f AND OVR2 #0006 ADD2 STA2
+	( | pop ptr to bunny data )
+	POP2
+	( | write new increased array length )
+	INC2 DUP2 ;sprite/length STA2
+	( | update label )
+	STH2k #0028 #0008 STH2r <draw-dec>
+	&bail ( pop sprite/length )
+		POP2 JMP2r
+
+@remove-bunny ( -- )
+	;sprite/length LDA2
+	( don't let length go below 0 ) ORAk #00 EQU ?&bail
+	#0001 SUB2 DUP2 ;sprite/length STA2
+	( update label ) STH2k #0028 #0008 STH2r <draw-dec>
+	&bail POP2 JMP2r
+
+(
+@|drawing )
+
+@<draw-bunny> ( idx -- )
+	( | compute the offset to the beginning of this bunny's data )
+	#30 SFT2 ;sprite/array ADD2
+	( | move the sprite by its velocity )
+	LDA2k OVR2 #0004 ADD2 LDA2 ADD2 OVR2 STA2
+	INC2k INC2 LDA2 OVR2 #0006 ADD2 LDA2 ADD2 OVR2 INC2 INC2 STA2
+	( | check for right wall collision + bounce x )
+	DUP2 #0004 ADD2 LDA2 #0f SFT2 #0001 EQU2 ?&skip-max-x
+	LDA2k #05 SFT2 #0008 ADD2 .Screen/width DEI2 LTH2 ?&skip-max-x
+	DUP2 #0004 ADD2 LDA2 #ffff MUL2 OVR2 #0004 ADD2 STA2
+	&skip-max-x ( check for left wall collision + bounce x )
+		LDA2k #0f SFT2 #0000 EQU2 ?&skip-min-x
+		DUP2 #0004 ADD2 LDA2 #ffff MUL2 OVR2 #0004 ADD2 STA2
+	&skip-min-x ( check for bottom wall collision + bounce y )
+		DUP2 #0006 ADD2 LDA2 #0f SFT2 #0001 EQU2 ?&skip-max-y
+		INC2k INC2 LDA2 #05 SFT2 #0010 ADD2 .Screen/height DEI2 LTH2 ?&skip-max-y
+		DUP2 #0006 ADD2 LDA2 #ffff MUL2 OVR2 #0006 ADD2 STA2
+		!&skip-gravity
+	&skip-max-y ( check for top wall collision + bounce x )
+		INC2k INC2 LDA2 #0f SFT2 #0000 EQU2 ?&skip-min-y
+		DUP2 #0006 ADD2 LDA2 #ffff MUL2 OVR2 #0006 ADD2 STA2
+		!&skip-gravity
+	&skip-min-y ( apply gravity )
+		DUP2 #0006 ADD2 LDA2 #0004 ADD2 OVR2 #0006 ADD2 STA2
+	&skip-gravity ( draw the sprite )
+		( top ) LDA2k #05 SFT2 .Screen/x DEO2
+		INC2 INC2 LDA2 #05 SFT2 .Screen/y DEO2
+		( draw ) [ LIT2 15 -Screen/auto ] DEO
+		;bunny-chr .Screen/addr DEO2
+		[ LIT2 85 -Screen/sprite ] DEO
+		[ LIT2 00 -Screen/auto ] DEO
+		JMP2r
+
+@<draw-str> ( x* y* text* color -- )
+	,&t STR
+	[ LIT2 01 -Screen/auto ] DEO
+	&loop ( -- )
+		LDAk #20 SUB #00 SWP #30 SFT2 ;font ADD2 .Screen/addr DEO2
+		[ LIT2 &t $1 -Screen/sprite ] DEO
+		INC2 LDAk ?&loop
+	POP2 JMP2r
+
+@<draw-dec> ( x* y* num* -- )
+	[ LIT2 01 -Screen/auto ] DEO
+	SWP2 .Screen/y DEO2
+	SWP2 .Screen/x DEO2
+	#2710 DIV2k DUP <draw-digit>
+	MUL2 SUB2 #03e8 DIV2k DUP <draw-digit>
+	MUL2 SUB2 #0064 DIV2k DUP <draw-digit>
+	MUL2 SUB2 NIP #0a DIVk DUP <draw-digit>
+	MUL SUB <draw-digit>
+	[ LIT2 00 -Screen/auto ] DEO
+	JMP2r
+
+@<draw-digit> ( num -- )
+	#30 SFT #00 SWP ;font/num ADD2 .Screen/addr DEO2
+	[ LIT2 41 -Screen/sprite ] DEO
+	JMP2r
+
+(
+@|random )
+
+@prng-init ( -- )
+	[ LIT2 00 -DateTime/second ] DEI [ LIT2 00 -DateTime/minute ] DEI #60 SFT2 EOR2 [ LIT2 00 -DateTime/hour ] DEI #c0 SFT2 EOR2 ,prng/x STR2
+	[ LIT2 00 -DateTime/hour ] DEI #04 SFT2 [ LIT2 00 -DateTime/day ] DEI #10 SFT2 EOR2 [ LIT2 00 -DateTime/month ] DEI #60 SFT2 EOR2 .DateTime/year DEI2 #a0 SFT2 EOR2 ,prng/y STR2
+	JMP2r
+
+@prng ( -- number* )
+	[ LIT2 &x $2 ] DUP2 #50 SFT2 EOR2 DUP2 #03 SFT2 EOR2 [ LIT2 &y $2 ] DUP2 ,&x STR2
+	DUP2 #01 SFT2 EOR2 EOR2 ,&y STR2k POP JMP2r
+
+@rand ( -- number )
+	prng ADD JMP2r
+	( static string data )
+
+(
+@|assets )
+
+@text &fps "FPS: $1
+	&bunnies "BUNS: $1
+	&instructions "CLICK 20 "TO 20 "ADD 20 "BUNNIES! $1
+
+@font ( atari8.uf1 )
+	[
+	0000 0000 0000 0000 6060 6060 6000 6000
+	6666 6600 0000 0000 006c fe6c 6cfe 6c00
+	183e 603c 067c 1800 0066 6c18 3066 4600
+	386c 3870 decc 7600 6060 6000 0000 0000
+	0e1c 1818 181c 0e00 7038 1818 1838 7000
+	0066 3cff 3c66 0000 0018 187e 1818 0000
+	0000 0000 0030 3060 0000 007e 0000 0000
+	0000 0000 0018 1800 0206 0c18 3060 4000 ] &num [
+	3c66 6e76 6666 3c00 1838 1818 1818 7e00
+	3c66 060c 1830 7e00 7e0c 180c 0666 3c00
+	0c1c 3c6c 7e0c 0c00 7e60 7c06 0666 3c00
+	3c60 607c 6666 3c00 7e06 0c18 3030 3000
+	3c66 663c 6666 3c00 3c66 663e 060c 3800
+	0060 6000 6060 0000 0030 3000 3030 6000
+	0c18 3060 3018 0c00 0000 7e00 007e 0000
+	6030 180c 1830 6000 3c66 060c 1800 1800
+	3c66 6e6a 6e60 3e00 183c 6666 7e66 6600
+	7c66 667c 6666 7c00 3c66 6060 6066 3c00
+	786c 6666 666c 7800 7e60 607c 6060 7e00
+	7e60 607c 6060 6000 3e60 606e 6666 3e00
+	6666 667e 6666 6600 7830 3030 3030 7800
+	0606 0606 0666 3c00 666c 7870 786c 6600
+	6060 6060 6060 7e00 c6ee fed6 c6c6 c600
+	6676 7e7e 6e66 6600 3c66 6666 6666 3c00
+	7c66 667c 6060 6000 3c66 6666 766c 3600
+	7c66 667c 6c66 6600 3c66 603c 0666 3c00
+	7e18 1818 1818 1800 6666 6666 6666 3e00
+	6666 6666 663c 1800 c6c6 c6d6 feee c600
+	6666 3c18 3c66 6600 6666 663c 1818 1800
+	7e06 0c18 3060 7e00 7860 6060 6060 7800 ]
+
+@fill-icn [ ffff ffff ffff ffff ]
+
+@bunny-chr [
+	2466 6600 2424 003c 4200 007e 7e7e 7e7e
+	1818 3c3c 1800 0000 ff66 4242 667e 4242 ]
+
+(
+@|memory )
+
+@sprite &length $2
+	&array &x 0600 &y 0500 &xvel 0060 &yvel 0010
+
diff --git a/awk/uxn/test/tal/life.tal b/awk/uxn/test/tal/life.tal
new file mode 100644
index 0000000..718068b
--- /dev/null
+++ b/awk/uxn/test/tal/life.tal
@@ -0,0 +1,221 @@
+( uxnemu life.rom )
+	( Any live cell with fewer than two live neighbours dies, as if by underpopulation. )
+	( Any live cell with two or three live neighbours lives on to the next generation. )
+	( Any live cell with more than three live neighbours dies, as if by overpopulation. )
+	( Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction. )
+
+|00 @System &vector $2 &expansion $2 &wst $1 &rst $1 &metadata $2 &r $2 &g $2 &b $2 &debug $1 &state $1
+|10 @Console &vector $2 &read $1 &pad $5 &write $1 &error $1
+|20 @Screen &vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1
+|30 @Audio0 &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1
+|80 @Controller &vector $2 &button $1 &key $1
+|90 @Mouse &vector $2 &x $2 &y $2 &state $1 &wheel $1
+|000
+
+	@world &count $2
+	@anchor &x $2 &y $2 &x2 $2 &y2 $2
+
+|100
+
+@on-reset ( -> )
+	( | theme )
+	#02cf .System/r DEO2
+	#02ff .System/g DEO2
+	#024f .System/b DEO2
+	( | resize )
+	#00c0 DUP2 .Screen/width DEO2
+	.Screen/height DEO2
+	( | vectors )
+	;on-frame .Screen/vector DEO2
+	;on-mouse .Mouse/vector DEO2
+	;on-control .Controller/vector DEO2
+	( | glider )
+	#0703 <set-cell>
+	#0704 <set-cell>
+	#0504 <set-cell>
+	#0705 <set-cell>
+	#0605 <set-cell>
+	( | center )
+	.Screen/width DEI2 #01 SFT2 #0040 SUB2 DUP2 .anchor/x STZ2
+	#007e ADD2 .anchor/x2 STZ2
+	.Screen/height DEI2 #01 SFT2 #0040 SUB2 DUP2 .anchor/y STZ2
+	#007e ADD2 .anchor/y2 STZ2
+	BRK
+
+@on-frame ( -> )
+	[ LIT2 00 -Mouse/state ] DEI EQU ?{ BRK }
+	#0000 .world/count STZ2
+	[ LIT &f $1 ] INCk ,&f STR
+	( ) #03 AND #00 EQU ?{ BRK }
+	<run>
+	BRK
+
+@on-mouse ( -> )
+	[ LIT2 00 -Mouse/state ] DEI NEQ #42 ADD ;cursor-icn <update-cursor>
+	( | on touch in rect )
+	.Mouse/state DEI ?{ BRK }
+	.Mouse/x DEI2 .Mouse/y DEI2 .anchor within-rect ?{ BRK }
+	( | paint )
+	.Mouse/x DEI2 .anchor/x LDZ2 SUB2 #01 SFT NIP
+	( ) .Mouse/y DEI2 .anchor/y LDZ2 SUB2 #01 SFT NIP <set-cell>
+	<redraw>
+	BRK
+
+@on-control ( -> )
+	.Controller/key DEI
+	( ) DUP #20 NEQ ?{
+		#0000 ;on-frame .Screen/vector DEI2 ORA ?{ SWP2 }
+		POP2 .Screen/vector DEO2 }
+	( ) #1b NEQ ?{ ;MMU/clear1 .System/expansion DEO2 }
+	BRK
+
+(
+@|core )
+
+@<run> ( -- )
+	;MMU/clear2 .System/expansion DEO2
+	#4000
+	&ver ( -- )
+		DUP ,&y STR
+		#4000
+	&hor ( -- )
+		DUP [ LIT &y $1 ] <run-cell>
+		INC GTHk ?&hor
+	POP2 INC GTHk ?&ver
+	POP2
+	( move ) ;MMU/move21 .System/expansion DEO2
+	!<redraw>
+
+@<run-cell> ( x y -- )
+	( x y ) DUP2 STH2k
+	( neighbours ) get-neighbours
+	( state ) STH2r get-index LDA #00 EQU ?&dead
+	DUP #02 LTH ?&dies
+	DUP #03 GTH ?&dies
+	POP !&save
+	&dies POP POP2 JMP2r
+	&dead ( -- )
+		DUP #03 EQU ?&birth
+		POP POP2 JMP2r
+		&birth POP !&save
+	&save ( x y -- )
+		STH2
+		#01 STH2r get-index #1000 ADD2 STA
+		.world/count LDZ2 INC2 .world/count STZ2
+		JMP2r
+
+@get-index ( x y -- index* )
+	( y ) #3f AND #00 SWP #60 SFT2 ROT
+	( x ) #3f AND #00 SWP ADD2 ;bank1 ADD2 JMP2r
+
+@<set-cell> ( x y -- )
+	get-index STH2
+	#01 STH2r STA
+	JMP2r
+
+@get-neighbours ( x y -- neighbours )
+	,&y STR
+	,&x STR
+	[ LITr 00 ] #0800
+	&l ( -- )
+		#00 OVRk ADD2 ;&mask ADD2 LDA2
+		( ) [ LIT &y $1 ] ADD SWP
+		( ) [ LIT &x $1 ] ADD SWP get-index LDA [ STH ADDr ]
+		( stop at 3 ) DUPr [ LITr 03 ] GTHr [ LITr _&end ] JCNr
+		( ) INC GTHk ?&l
+	&end POP2 STHr JMP2r
+	&mask [
+	ffff 00ff 01ff ff00 0100 ff01 0001 0101 ]
+
+@within-rect ( x* y* rect -- flag )
+	STH
+	( y < rect.y1 ) DUP2 STHkr INC INC LDZ2 LTH2 ?&skip
+	( y > rect.y2 ) DUP2 STHkr #06 ADD LDZ2 GTH2 ?&skip
+	SWP2
+	( x < rect.x1 ) DUP2 STHkr LDZ2 LTH2 ?&skip
+	( x > rect.x2 ) DUP2 STHkr #04 ADD LDZ2 GTH2 ?&skip
+	POP2 POP2 POPr #01 JMP2r
+	&skip POP2 POP2 POPr #00 JMP2r
+
+(
+@|drawing )
+
+@<redraw> ( -- )
+	( | draw count )
+	.anchor/x LDZ2 .Screen/x DEO2
+	.anchor/y2 LDZ2 #0008 ADD2 .Screen/y DEO2
+	[ LIT2 01 -Screen/auto ] DEO
+	.world/count LDZ2 <draw-short>
+	( | draw grid )
+	[ LIT2 01 -Screen/auto ] DEO
+	.anchor/y LDZ2 .Screen/y DEO2
+	;bank2 ;bank1
+	&l ( -- )
+		DUP #3f AND ?{
+			.Screen/y DEI2k INC2 INC2 ROT DEO2
+			.anchor/x LDZ2 .Screen/x DEO2 }
+		LDAk INC .Screen/pixel DEO
+		[ LIT2 00 -Screen/pixel ] DEO
+		INC2 GTH2k ?&l
+	POP2 POP2 JMP2r
+
+@<draw-short> ( short* -- )
+	SWP <draw-byte>
+	( >> )
+
+@<draw-byte> ( byte color -- )
+	DUP #04 SFT <draw-hex>
+	#0f AND
+	( >> )
+
+@<draw-hex> ( char color -- )
+	#00 SWP #30 SFT2 ;font-hex ADD2 .Screen/addr DEO2
+	[ LIT2 03 -Screen/sprite ] DEO
+	JMP2r
+
+@<update-cursor> ( color addr* -- )
+	[ LIT2 00 -Screen/auto ] DEO
+	;fill-icn .Screen/addr DEO2
+	#40 <draw-cursor>
+	.Mouse/x DEI2 ,<draw-cursor>/x STR2
+	.Mouse/y DEI2 ,<draw-cursor>/y STR2
+	.Screen/addr DEO2
+	( >> )
+
+@<draw-cursor> ( color -- )
+	[ LIT2 &x $2 ] .Screen/x DEO2
+	[ LIT2 &y $2 ] .Screen/y DEO2
+	.Screen/sprite DEO
+	JMP2r
+
+(
+@|assets )
+
+@MMU ( programs )
+	&clear1 [ 01 1000 0000 =bank3 0000 =bank1 ]
+	&clear2 [ 01 1000 0000 =bank3 0000 =bank2 ]
+	&move21 [ 01 1000 0000 =bank2 0000 =bank1 ]
+
+@cursor-icn [ 80c0 e0f0 f8e0 1000 ]
+
+@fill-icn [ ffff ffff ffff ffff ]
+
+@font-hex [
+	7c82 8282 8282 7c00 3010 1010 1010 3800
+	7c82 027c 8080 fe00 7c82 021c 0282 7c00
+	2242 82fe 0202 0200 fe80 807c 0282 7c00
+	7c82 80fc 8282 7c00 fe82 0408 0810 1000
+	7c82 827c 8282 7c00 7c82 827e 0202 0200
+	7c82 82fe 8282 8200 fc82 82fc 8282 fc00
+	7c82 8080 8082 7c00 fc82 8282 8282 fc00
+	fe80 80f0 8080 fe00 fe80 80f0 8080 8000 ]
+
+(
+@|memory )
+
+|8000 @bank1 $1000
+
+@bank2 $1000
+
+@bank3 $1000
+
diff --git a/awk/uxn/test/tal/opctest.tal b/awk/uxn/test/tal/opctest.tal
new file mode 100644
index 0000000..b803de6
--- /dev/null
+++ b/awk/uxn/test/tal/opctest.tal
@@ -0,0 +1,492 @@
+( Opcode Tester )
+
+|0013
+
+	@Zeropage &byte $1 &short $2
+	@id $1
+
+|100
+
+@on-reset ( -> )
+
+	( part 1
+		> LIT2: Puts a short on the stack
+		> LIT: Puts a byte on the stack
+		> #06 DEO: Write to metadata ports
+		> #18 DEO: Write a letter in terminal )
+
+	;meta #06 DEO2
+	[ LIT2 "kO ] #18 DEO #18 DEO
+	[ LIT2 "1 18 ] DEO #0a18 DEO
+
+	( part 2
+		> LITr: Put a byte on return stack
+		> STH: Move a byte from working stack to return stack
+		> STH2r: Move a short from return stack to working stack )
+
+	[ LITr "k ] [ LIT "O ] STH STH2r #18 DEO #18 DEO
+	[ LIT2 "2 18 ] DEO #0a18 DEO
+
+	( part 3
+		> LIT2r: Put a short on return stack
+		> DUP: Duplicate byte
+		> ADDr: Add bytes on return stack )
+
+	[ LIT2r "k 4d ] #01 DUP STH ADDr STH ADDr STH2r #18 DEO #18 DEO
+	[ LIT2 "3 18 ] DEO #0a18 DEO
+
+	( part 4
+		> JSI: Subroutine to relative short address
+		> JMP2r: Jumps to absolute address on return stack )
+
+	subroutine
+	[ LIT2 "4 18 ] DEO #0a18 DEO
+
+	( part 5
+		> POP2: Removes a short from the stack
+		> INC2: Increments short on stack
+		> DUP2: Duplicate short
+		> LDA: load byte from absolute address
+		> JCI: Conditional subroutine to relative short address )
+
+	;Dict/ok pstr
+	[ LIT2 "5 18 ] DEO #0a18 DEO
+
+	( part 6
+		> JSR2: Jump to subroutine from short pointer
+		> LDAk: Non-destructive load byte from absolute address )
+
+	{ "Ok $1 } STH2r ;pstr-jcn JSR2
+	[ LIT2 "6 18 ] DEO #0a18 DEO
+
+	( part 7
+		> Relative distance bytes )
+
+	rel-distance/entry SWP #18 DEO #18 DEO
+	[ LIT2 "7 18 ] DEO #0a18 DEO
+
+	( part xx
+		> GTH2k: Non-destructive greater-than short
+		> LDA2k: Non-destructive load short from absolute address
+		> STA2: Store short at absolute address )
+
+	[ LIT2r 0000 ]
+	;tests/end ;tests
+	&l
+		run-test [ LITr 00 ] STH ADD2r
+		INC2 INC2 GTH2k ?&l
+	POP2 POP2
+	STH2r ;tests/end ;tests SUB2 #01 SFT2
+	EQU2 ;Dict/opctests test-part
+
+	( Part xx
+		> Testing that stacks are circular and wrapping
+		> Storing 12 at -1 and 34 at 0 )
+
+	POP #12 #34 ADD #46 EQU STH
+	POP #1234 ADD #46 EQU STH
+	POP2 #1111 #2222 ADD2 #3333 EQU2
+	STHr AND STHr AND
+	;Dict/stack-wrap test-part
+
+	( restore stack ) #0000 #0000
+
+	( Part xx
+		> Testing RAM wrapping
+		> Storing 12 in 0xffff, and 34 in 0x0000 )
+
+	#1234 #ffff STA2
+	( LDA ) #0000 LDA #ffff LDA ADD #46 EQU
+	( LDA2 ) #ffff LDA2 ADD #46 EQU
+	AND ;Dict/ram-wrap test-part
+
+	( Part xx
+		> Testing that zero-page is wrapping )
+
+	#5678 #ff STZ2
+	( LDZ ) #00 LDZ #ff LDZ ADD #ce EQU
+	( LDZ2 ) #ff LDZ2 ADD #ce EQU
+	AND ;Dict/zp-wrap test-part
+
+	( Part xx
+		> Testing that device page is wrapping )
+
+	#1234 #ff DEO2
+	( DEI ) #00 DEI #ff DEI ADD #46 EQU
+	( DEI2 ) #ff DEI2 ADD #46 EQU
+	AND ;Dict/dev-wrap test-part
+	#0000 DEO #00ff DEO
+
+	( end )
+
+	[ LIT &fail 80 ]
+		DUP #80 EQU ;Dict/result test-part
+		#0f DEO
+
+	#0a18 DEO
+	#010e DEO
+
+BRK
+
+(
+@|metadata )
+
+@meta 00
+	( name ) "Opctest 0a
+	( details ) "A 20 "Testing 20 "Program 0a
+	( author ) "By 20 "Devine 20 "Lu 20 "Linvega 0a
+	( date ) "24 20 "Jun 20 "2025 $2
+
+@test-part ( f name* -- )
+	pstr ?{
+		#01 ;on-reset/fail STA
+		;Dict/failed !pstr }
+	;Dict/passed !pstr
+
+@run-test ( addr* -- addr* f )
+
+	LDA2k JSR2 DUP ?&pass
+		;Dict/missed pstr
+		[ LIT2 &name $2 ] pstr
+		[ LIT2 "# 18 ] DEO
+		[ LIT2 "a -id ] LDZ ADD #18 DEO
+		#0a18 DEO
+		#01 ;on-reset/fail STA
+		&pass
+	.id LDZ INC .id STZ
+
+JMP2r
+
+@set ( name* -- f )
+
+	;run-test/name STA2 #01
+	[ LIT2 ff -id ] STZ
+
+JMP2r
+
+@pstr ( str* -- )
+	DUP2 LDA
+		DUP ?{ POP POP2 JMP2r }
+		#18 DEO
+	INC2 !pstr
+
+@pstr-jcn ( str* -- )
+	LDAk #18 DEO
+	INC2 LDAk ,pstr-jcn JCN
+	POP2
+	JMP2r
+
+@tests
+=op-equ [
+	=op-equ/a =op-equ/b =op-equ/c =op-equ/d
+	=op-equ/e =op-equ/f =op-equ/g =op-equ/h ]
+=op-neq [
+	=op-neq/a =op-neq/b =op-neq/c =op-neq/d
+	=op-neq/e =op-neq/f =op-neq/g =op-neq/h ]
+=op-gth [
+	=op-gth/a =op-gth/b =op-gth/c =op-gth/d
+	=op-gth/e =op-gth/f =op-gth/g =op-gth/h ]
+=op-lth [
+	=op-lth/a =op-lth/b =op-lth/c =op-lth/d
+	=op-lth/e =op-lth/f =op-lth/g =op-lth/h ]
+=op-add [
+	=op-add/a =op-add/b =op-add/c =op-add/d
+	=op-add/e =op-add/f =op-add/g =op-add/h ]
+=op-sub [
+	=op-sub/a =op-sub/b =op-sub/c =op-sub/d
+	=op-sub/e =op-sub/f =op-sub/g =op-sub/h ]
+=op-mul [
+	=op-mul/a =op-mul/b =op-mul/c =op-mul/d
+	=op-mul/e =op-mul/f =op-mul/g =op-mul/h ]
+=op-div [
+	=op-div/a =op-div/b =op-div/c =op-div/d =op-div/e
+	=op-div/f =op-div/g =op-div/h =op-div/i =op-div/j ]
+=op-inc [
+	=op-inc/a =op-inc/b =op-inc/c =op-inc/d
+	=op-inc/e =op-inc/f =op-inc/g =op-inc/h ]
+=op-pop [
+	=op-pop/a =op-pop/b =op-pop/c =op-pop/d
+	=op-pop/e =op-pop/f =op-pop/g =op-pop/h ]
+=op-dup [
+	=op-dup/a =op-dup/b ]
+=op-nip [
+	=op-nip/a =op-nip/b =op-nip/c =op-nip/d ]
+=op-swp [
+	=op-swp/a =op-swp/b ]
+=op-ovr [
+	=op-ovr/a =op-ovr/b ]
+=op-rot [
+	=op-rot/a =op-rot/b ]
+=op-and [
+	=op-and/a =op-and/b =op-and/c =op-and/d
+	=op-and/e =op-and/f =op-and/g =op-and/h ]
+=op-ora [
+	=op-ora/a =op-ora/b =op-ora/c =op-ora/d
+	=op-ora/e =op-ora/f =op-ora/g =op-ora/h ]
+=op-eor [
+	=op-eor/a =op-eor/b =op-eor/c =op-eor/d
+	=op-eor/e =op-eor/f =op-eor/g =op-eor/h ]
+=op-sft [
+	=op-sft/a =op-sft/b =op-sft/c =op-sft/d
+	=op-sft/e =op-sft/f =op-sft/g =op-sft/h ]
+=op-stz [
+	=op-stz/a =op-stz/b =op-stz/c =op-stz/d ]
+=op-str [
+	=op-str/a =op-str/b =op-str/c =op-str/d ]
+=op-sta [
+	=op-sta/a =op-sta/b =op-sta/c =op-sta/d ]
+=op-jmp [
+	=op-jmp/a =op-jmp/b ]
+=op-jcn [
+	=op-jcn/a =op-jcn/b =op-jcn/c =op-jcn/d ]
+=op-jsr [
+	=op-jsr/a =op-jsr/b ]
+=op-sth [
+	=op-sth/a =op-sth/b ]
+=op-jci [
+	=op-jci/a =op-jci/b =op-jci/c ]
+=op-jmi [
+	=op-jmi/a ]
+=op-jsi [
+	=op-jsi/a =op-jsi/b =op-jsi/c =op-jsi/d ]
+	&end
+
+@op-equ ;Dict/equ !set
+	&a #f8 #f8 EQU [ #01 ] EQU JMP2r
+	&b #01 #01 EQU [ #01 ] EQU JMP2r
+	&c #f8 #01 EQU [ #00 ] EQU JMP2r
+	&d #00 #ff EQU [ #00 ] EQU JMP2r
+	&e #f801 #f801 EQU2 [ #01 ] EQU JMP2r
+	&f #01f8 #01f8 EQU2 [ #01 ] EQU JMP2r
+	&g #f801 #01f8 EQU2 [ #00 ] EQU JMP2r
+	&h #01f8 #f801 EQU2 [ #00 ] EQU JMP2r
+@op-neq ;Dict/neq !set
+	&a #f8 #f8 NEQ [ #00 ] EQU JMP2r
+	&b #01 #01 NEQ [ #00 ] EQU JMP2r
+	&c #f8 #01 NEQ [ #01 ] EQU JMP2r
+	&d #01 #f8 NEQ [ #01 ] EQU JMP2r
+	&e #f801 #f801 NEQ2 [ #00 ] EQU JMP2r
+	&f #01f8 #01f8 NEQ2 [ #00 ] EQU JMP2r
+	&g #f801 #01f8 NEQ2 [ #01 ] EQU JMP2r
+	&h #01f8 #f801 NEQ2 [ #01 ] EQU JMP2r
+@op-gth ;Dict/gth !set
+	&a #f8 #f8 GTH [ #00 ] EQU JMP2r
+	&b #01 #01 GTH [ #00 ] EQU JMP2r
+	&c #f8 #01 GTH [ #01 ] EQU JMP2r
+	&d #01 #f8 GTH [ #00 ] EQU JMP2r
+	&e #f801 #f801 GTH2 [ #00 ] EQU JMP2r
+	&f #01f8 #01f8 GTH2 [ #00 ] EQU JMP2r
+	&g #f801 #01f8 GTH2 [ #01 ] EQU JMP2r
+	&h #01f8 #f801 GTH2 [ #00 ] EQU JMP2r
+@op-lth ;Dict/lth !set
+	&a #f8 #f8 LTH [ #00 ] EQU JMP2r
+	&b #01 #01 LTH [ #00 ] EQU JMP2r
+	&c #f8 #01 LTH [ #00 ] EQU JMP2r
+	&d #01 #ff LTH [ #01 ] EQU JMP2r
+	&e #f801 #f801 LTH2 [ #00 ] EQU JMP2r
+	&f #01f8 #01f8 LTH2 [ #00 ] EQU JMP2r
+	&g #f801 #01f8 LTH2 [ #00 ] EQU JMP2r
+	&h #01f8 #f801 LTH2 [ #01 ] EQU JMP2r
+@op-add ;Dict/add !set
+	&a #ff #00 ADD [ #ff ] EQU JMP2r
+	&b #01 #ff ADD [ #00 ] EQU JMP2r
+	&c #ff #ff ADD [ #fe ] EQU JMP2r
+	&d #12 #34 ADDk ADD ADD [ #8c ] EQU JMP2r
+	&e #ffff #0000 ADD2 [ #ffff ] EQU2 JMP2r
+	&f #0001 #ffff ADD2 [ #0000 ] EQU2 JMP2r
+	&g #ffff #ffff ADD2 [ #fffe ] EQU2 JMP2r
+	&h #fffe #ffff ADD2 [ #fffd ] EQU2 JMP2r
+@op-sub ;Dict/sub !set
+	&a #ff #00 SUB [ #ff ] EQU JMP2r
+	&b #01 #ff SUB [ #02 ] EQU JMP2r
+	&c #ff #ff SUB [ #00 ] EQU JMP2r
+	&d #fe #ff SUB [ #ff ] EQU JMP2r
+	&e #ffff #0000 SUB2 [ #ffff ] EQU2 JMP2r
+	&f #0001 #ffff SUB2 [ #0002 ] EQU2 JMP2r
+	&g #ffff #ffff SUB2 [ #0000 ] EQU2 JMP2r
+	&h #fffe #ffff SUB2 [ #ffff ] EQU2 JMP2r
+@op-mul ;Dict/mul !set
+	&a #00 #01 MUL [ #00 ] EQU JMP2r
+	&b #3f #e7 MUL [ #d9 ] EQU JMP2r
+	&c #37 #3f MUL [ #89 ] EQU JMP2r
+	&d #10 #02 MUL [ #20 ] EQU JMP2r
+	&e #1000 #0003 MUL2 [ #3000 ] EQU2 JMP2r
+	&f #abcd #1234 MUL2 [ #4fa4 ] EQU2 JMP2r
+	&g #8000 #0200 MUL2 [ #0000 ] EQU2 JMP2r
+	&h #2222 #0003 MUL2 [ #6666 ] EQU2 JMP2r
+@op-div ;Dict/div !set
+	&a #10 #06 DIV [ #02 ] EQU JMP2r
+	&b #20 #20 DIV [ #01 ] EQU JMP2r
+	&c #34 #01 DIV [ #34 ] EQU JMP2r
+	&d #02 #ef DIV [ #00 ] EQU JMP2r
+	&e #02 #00 DIV [ #00 ] EQU JMP2r
+	&f #03e8 #0006 DIV2 [ #00a6 ] EQU2 JMP2r
+	&g #abcd #1234 DIV2 [ #0009 ] EQU2 JMP2r
+	&h #8000 #0200 DIV2 [ #0040 ] EQU2 JMP2r
+	&i #2222 #0003 DIV2 [ #0b60 ] EQU2 JMP2r
+	&j #0202 #0000 DIV2 [ #0000 ] EQU2 JMP2r
+@op-inc ;Dict/inc !set
+	&a #01 INC [ #02 ] EQU JMP2r
+	&b #ff INC [ #00 ] EQU JMP2r
+	&c #fe INC [ #ff ] EQU JMP2r
+	&d #00 INC [ #01 ] EQU JMP2r
+	&e #0001 INC2 [ #0002 ] EQU2 JMP2r
+	&f #ffff INC2 [ #0000 ] EQU2 JMP2r
+	&g #fffe INC2 [ #ffff ] EQU2 JMP2r
+	&h #0000 INC2 [ #0001 ] EQU2 JMP2r
+@op-pop ;Dict/pop !set
+	&a #0a #0b POP [ #0a ] EQU JMP2r
+	&b #0a #0b #0c POP POP [ #0a ] EQU JMP2r
+	&c #0a #0b #0c ADD POP [ #0a ] EQU JMP2r
+	&d #0a #0b #0c POP ADD [ #15 ] EQU JMP2r
+	&e #0a0b #0c0d POP2 [ #0a0b ] EQU2 JMP2r
+	&f #0a0b #0c0d #0e0f POP2 POP2 [ #0a0b ] EQU2 JMP2r
+	&g #0a0b #0c0d #0e0f ADD2 POP2 [ #0a0b ] EQU2 JMP2r
+	&h #0a0b #0c0d #0e0f POP2 ADD2 [ #1618 ] EQU2 JMP2r
+@op-dup ;Dict/dup !set
+	&a #0a #0b DUP ADD ADD [ #20 ] EQU JMP2r
+	&b #0a0b DUP2 ADD2 [ #1416 ] EQU2 JMP2r
+@op-nip ;Dict/nip !set
+	&a #12 #34 #56 NIP ADD [ #68 ] EQU JMP2r
+	&b #12 #34 #56 NIPk ADD2 ADD [ #f2 ] EQU JMP2r
+	&c #1234 #5678 #9abc NIP2 ADD2 [ #acf0 ] EQU2 JMP2r
+	&d #1234 #5678 #9abc NIP2k ADD2 ADD2 ADD2 [ #9e24 ] EQU2 JMP2r
+@op-swp ;Dict/swp !set
+	&a #02 #10 SWP DIV [ #08 ] EQU JMP2r
+	&b #0a0b #0c0d SWP2 NIP2 [ #0a0b ] EQU2 JMP2r
+@op-ovr ;Dict/ovr !set
+	&a #02 #10 OVR DIV ADD [ #0a ] EQU JMP2r
+	&b #0a0b #0c0d OVR2 NIP2 ADD2 [ #1416 ] EQU2 JMP2r
+@op-rot ;Dict/rot !set
+	&a #02 #04 #10 ROT DIV ADD [ #0c ] EQU JMP2r
+	&b #0a0b #0c0d #0c0f ROT2 ADD2 NIP2 [ #161a ] EQU2 JMP2r
+@op-and ;Dict/and !set
+	&a #fc #3f AND [ #3c ] EQU JMP2r
+	&b #f0 #0f AND [ #00 ] EQU JMP2r
+	&c #ff #3c AND [ #3c ] EQU JMP2r
+	&d #02 #03 AND [ #02 ] EQU JMP2r
+	&e #f0f0 #00f0 AND2 [ #00f0 ] EQU2 JMP2r
+	&f #aaaa #5555 AND2 [ #0000 ] EQU2 JMP2r
+	&g #ffff #1234 AND2 [ #1234 ] EQU2 JMP2r
+	&h #abcd #0a0c AND2 [ #0a0c ] EQU2 JMP2r
+@op-ora ;Dict/ora !set
+	&a #0f #f0 ORA [ #ff ] EQU JMP2r
+	&b #ab #cd ORA [ #ef ] EQU JMP2r
+	&c #12 #34 ORA [ #36 ] EQU JMP2r
+	&d #88 #10 ORA [ #98 ] EQU JMP2r
+	&e #0f0f #f0f0 ORA2 [ #ffff ] EQU2 JMP2r
+	&f #abab #cdcd ORA2 [ #efef ] EQU2 JMP2r
+	&g #1122 #1234 ORA2 [ #1336 ] EQU2 JMP2r
+	&h #8888 #1000 ORA2 [ #9888 ] EQU2 JMP2r
+@op-eor ;Dict/eor !set
+	&a #00 #00 EOR [ #00 ] EQU JMP2r
+	&b #ff #00 EOR [ #ff ] EQU JMP2r
+	&c #aa #55 EOR [ #ff ] EQU JMP2r
+	&d #ff #ff EOR [ #00 ] EQU JMP2r
+	&e #ffff #ff00 EOR2 [ #00ff ] EQU2 JMP2r
+	&f #aaaa #5555 EOR2 [ #ffff ] EQU2 JMP2r
+	&g #1122 #1234 EOR2 [ #0316 ] EQU2 JMP2r
+	&h #8888 #1000 EOR2 [ #9888 ] EQU2 JMP2r
+@op-sft ;Dict/sft !set
+	&a #ff #08 SFT [ #00 ] EQU JMP2r
+	&b #ff #e0 SFT [ #00 ] EQU JMP2r
+	&c #ff #11 SFT [ #fe ] EQU JMP2r
+	&d #ff #12 SFT [ #7e ] EQU JMP2r
+	&e #ffff #01 SFT2 [ #7fff ] EQU2 JMP2r
+	&f #ffff #70 SFT2 [ #ff80 ] EQU2 JMP2r
+	&g #ffff #7e SFT2 [ #0180 ] EQU2 JMP2r
+	&h #ffff #e3 SFT2 [ #c000 ] EQU2 JMP2r
+@op-stz ;Dict/stz !set
+	&a #ab .Zeropage/byte STZ .Zeropage/byte LDZ [ #ab ] EQU JMP2r
+	&b #cd .Zeropage/byte STZ .Zeropage/byte LDZ [ #cd ] EQU JMP2r
+	&c #1234 .Zeropage/short STZ2 .Zeropage/short LDZ2 [ #1234 ] EQU2 JMP2r
+	&d #5678 .Zeropage/short STZ2 .Zeropage/short LDZ2 [ #5678 ] EQU2 JMP2r
+@op-str ;Dict/str !set
+	[ LIT &before1 $1 ] [ LIT2 &before2 $2 ]
+	&a #22 ,&before1 STR ,&before1 LDR [ #22 ] EQU JMP2r
+	&b #ef ,&after1 STR ,&after1 LDR [ #ef ] EQU JMP2r
+	&c #1234 ,&before2 STR2 ,&before2 LDR2 [ #1234 ] EQU2 JMP2r
+	&d #5678 ,&after2 STR2 ,&after2 LDR2 [ #5678 ] EQU2 JMP2r
+	[ LIT &after1 $1 ] [ LIT2 &after2 $2 ]
+@op-sta ;Dict/sta !set
+	&a #34 ;Absolute/byte STA ;Absolute/byte LDA [ #34 ] EQU JMP2r
+	&b #56 ;Absolute/byte STA ;Absolute/byte LDA [ #56 ] EQU JMP2r
+	&c #1234 ;Absolute/short STA2 ;Absolute/short LDA2 [ #1234 ] EQU2 JMP2r
+	&d #5678 ;Absolute/short STA2 ;Absolute/short LDA2 [ #5678 ] EQU2 JMP2r
+@op-jmp ;Dict/jmp !set
+	&a #12 #34 ,&reljmp JMP SWP &reljmp POP [ #12 ] EQU JMP2r
+	&b #56 #78 ;&absjmp JMP2 SWP &absjmp POP [ #56 ] EQU JMP2r
+@op-jcn ;Dict/jcn !set
+	&a #23 #01 ,&reljcn-y JCN INC &reljcn-y [ #23 ] EQU JMP2r
+	&b #23 #00 ,&reljcn-n JCN INC &reljcn-n [ #24 ] EQU JMP2r
+	&c #23 #01 ;&absjcn-y JCN2 INC &absjcn-y [ #23 ] EQU JMP2r
+	&d #23 #00 ;&absjcn-n JCN2 INC &absjcn-n [ #24 ] EQU JMP2r
+@op-jsr ;Dict/jsr !set
+	&a #1234 #5678 ,&routine JSR [ #68ac ] EQU2 JMP2r
+	&b #12 #34 ;routine JSR2 [ #46 ] EQU JMP2r
+	&routine ADD2 JMP2r
+@op-sth ;Dict/sth !set
+	&a #0a STH #0b STH ADDr STHr [ #15 ] EQU JMP2r
+	&b #000a STH2 #000b STH2 ADD2r STH2r [ #0015 ] EQU2 JMP2r
+@op-jci ;Dict/jci !set
+	&before #01 JMP2r
+	&a #01 ?&skip-a #00 JMP2r &skip-a #01 JMP2r
+	&b #00 ?&skip-b #01 JMP2r &skip-b #00 JMP2r
+	&c #01 ?&before #00 JMP2r
+@op-jmi ;Dict/jmi !set
+	&a !&skip-a #00 JMP2r &skip-a #01 JMP2r
+@op-jsi ;Dict/jsi !set
+	&a #02 #04 routine #06 EQU JMP2r
+	&b ;&return special &return JMP2r
+	&c ,&skip-c JMP &routine-c ADD JMP2r &skip-c #02 #04 op-jsi/routine-c #06 EQU JMP2r
+	&d ,&skip-d JMP &routine-d ADD JMP2r &skip-d #02 #04 op-jsi-far-routine-d #06 EQU JMP2r
+
+@special ( routine* -- f )
+
+	( test that the stack order is LIFO )
+	DUP2 STH2kr EQU2
+	ROT ROT DUP2r STHr STHr SWP EQU2 AND
+
+JMP2r
+
+@routine ( a b -- c ) ADD JMP2r
+@subroutine ( -- ) [ LIT2 "kO ] #18 DEO #18 DEO JMP2r
+@Absolute &byte $1 &short $2
+
+@Dict [
+	&ok "Ok $1
+	&done "Tests 20 "Complete. 0a $1
+	&opctests "Opcodes $1
+	&stack-wrap "Stack-wrap $1
+	&ram-wrap "RAM-wrap $1
+	&zp-wrap "Zeropage-wrap $1
+	&dev-wrap "Devices-wrap $1
+	&result "Result: $1
+	&passed 20 "passed! 0a $1
+	&missed "Opcode 20 "Failed 20 "-- 20 $1
+	&failed 20 "failed. 0a $1
+	&equ "EQU $1 &neq "NEQ $1 &gth "GTH $1 &lth "LTH $1
+	&add "ADD $1 &sub "SUB $1 &mul "MUL $1 &div "DIV $1
+	&inc "INC $1 &pop "POP $1 &dup "DUP $1 &nip "NIP $1
+	&swp "SWP $1 &ovr "OVR $1 &rot "ROT $1
+	&and "AND $1 &ora "ORA $1 &eor "EOR $1 &sft "SFT $1
+	&stz "STZ $1 &str "STR $1 &sta "STA $1
+	&jmp "JMP $1 &jcn "JCN $1 &jsr "JSR $1 &sth "STH $1
+	&jmi "JMI $1 &jci "JCI $1 &jsi "JSI $1
+]
+
+(
+@|Relative Distance Bytes )
+
+@rel-distance
+&back "O $7c
+&entry
+	,&back LDR
+	,&forw LDR
+	JMP2r
+$7e
+&forw "k
+
+@op-jsi-far-routine-d
+	op-jsi/routine-d JMP2r
+
diff --git a/awk/uxn/test/tal/proper.tal b/awk/uxn/test/tal/proper.tal
new file mode 100644
index 0000000..be8e04b
--- /dev/null
+++ b/awk/uxn/test/tal/proper.tal
@@ -0,0 +1 @@
+@on-reset #01 #02 ADD BRK
\ No newline at end of file
diff --git a/awk/uxn/test/tal/simple.tal b/awk/uxn/test/tal/simple.tal
new file mode 100644
index 0000000..c055e74
--- /dev/null
+++ b/awk/uxn/test/tal/simple.tal
@@ -0,0 +1 @@
+#01 #02 ADD BRK 
\ No newline at end of file
diff --git a/awk/uxn/test/tal/simple2.tal b/awk/uxn/test/tal/simple2.tal
new file mode 100644
index 0000000..6a37b65
--- /dev/null
+++ b/awk/uxn/test/tal/simple2.tal
@@ -0,0 +1 @@
+#01 #02 ADD BRK
\ No newline at end of file
diff --git a/awk/uxn/test/tal/simple3.tal b/awk/uxn/test/tal/simple3.tal
new file mode 100644
index 0000000..09086b7
--- /dev/null
+++ b/awk/uxn/test/tal/simple3.tal
@@ -0,0 +1 @@
+#01 #02 ADD
\ No newline at end of file