~rabbits/uxnlin

e0fc8a6bc64ee6ca7ad386f7a8c96b547f79adb2 — Devine Lu Linvega 19 days ago 4fd10e5
Added templates support
2 files changed, 184 insertions(+), 148 deletions(-)

M etc/example.tal
M src/uxnlin.tal
M etc/example.tal => etc/example.tal +13 -0
@@ 90,5 90,18 @@ BRK

JMP2r

( bad unkept )

DUP2 ADD
DUP2k EOR2

STH2 ADDr

#34 #12 ADD
#1234 ;help ADD2

DEI2 STH2
SWP2 ADD2

~etc/include.tal


M src/uxnlin.tal => src/uxnlin.tal +171 -148
@@ 33,6 33,7 @@ BRK
	;dict/default-scope ;scope scpy
	#0a18 DEO
	;src lint

	( halt )
	#800f DEO



@@ 131,20 132,6 @@ JMP2r
		INC2 INC2 GTH2k ?&loop3
	POP2 POP2

	( short static arithmetic sequence: #1234 #0001 ADD2 )
	;token is-arithmetic #00 EQU ?&no-ari
	;token/last is-static #00 EQU ?&no-ari
	;token/last2 is-static #00 EQU ?&no-ari
		;static print-warn3
		&no-ari

	( byte static arithmetic sequence: #1201 ADD )
	;token is-arithmetic #00 EQU ?&no-ari2
	;token slen #0003 NEQ2 ?&no-ari2
	;token/last is-litshort #00 EQU ?&no-ari2
		;static print-warn2
		&no-ari2

	( literal duplicates: #1234 #1234 )
	;token is-static #00 EQU ?&no-lit
	;token ;token/last scmp #00 EQU ?&no-lit


@@ 176,17 163,17 @@ JMP2r
	;token ;token/last scpy

	&ignore
	;token !sclr
	;token

( .. )
!sclr

@reset ( -- )

	;token sclr
	;token/last sclr
	;token/last2 !sclr
	;token/last2

( .. )
!sclr

(
@|helpers )


@@ 218,32 205,36 @@ JMP2r

@is-litbyte ( str* -- flag )

	LDAk LIT "# EQU ?&continue
		POP2 #00 JMP2r
	LDAk LIT "# NEQ ?&continue
		slen #0003 EQU2 JMP2r
		&continue
	slen #0003 EQU2
	LDAk LIT ", NEQ ?&no-rel
		POP2 #01 JMP2r
		&no-rel
	LDAk LIT ". NEQ ?&no-zep
		POP2 #01 JMP2r
		&no-zep
	POP2 #00

JMP2r

@is-litshort ( str* -- flag )

	LDAk LIT "# EQU ?&continue
		POP2 #00 JMP2r
	LDAk LIT "# NEQ ?&continue
		slen #0005 EQU2 JMP2r
		&continue
	slen #0005 EQU2
	LDAk LIT "; NEQ ?&no-abs
		POP2 #01 JMP2r
		&no-abs
	POP2 #00

JMP2r

@is-static ( token* -- flag )

	LDAk LIT "; EQU ?&pass
	LDAk LIT ". EQU ?&pass
	LDAk LIT ", EQU ?&pass
	LDAk LIT "# EQU ?&pass
	POP2 #00
	STH2k is-litshort STH2r is-litbyte ORA

JMP2r
	&pass POP2 #01 JMP2r

@is-opcode ( string* -- f )



@@ 335,6 326,56 @@ JMP2r

	OVR2 OVR2 scmp ?&pass

	( luts )
	OVR2 ;&anyr-2x scmp #00 EQU ?&no-anyr-2x
	;anyr-2x-lut OVR2 afnd #ffff EQU2 ?&no-anyr-2x
		POP2 POP2 #01 JMP2r
		&no-anyr-2x
	OVR2 ;&any-1x scmp #00 EQU ?&no-any-1x
	;any-1x-lut OVR2 afnd #ffff EQU2 ?&no-any-1x
		POP2 POP2 #01 JMP2r
		&no-any-1x
	OVR2 ;&any2-1x scmp #00 EQU ?&no-any2-1x
	;any2-1x-lut OVR2 afnd #ffff EQU2 ?&no-any2-1x
		POP2 POP2 #01 JMP2r
		&no-any2-1x
	OVR2 ;&any-2x scmp #00 EQU ?&no-any-2x
	;any-2x-lut OVR2 afnd #ffff EQU2 ?&no-any-2x
		POP2 POP2 #01 JMP2r
		&no-any-2x
	OVR2 ;&any2-2x scmp #00 EQU ?&no-any2-2x
	;any2-2x-lut OVR2 afnd #ffff EQU2 ?&no-any2-2x
		POP2 POP2 #01 JMP2r
		&no-any2-2x
	OVR2 ;&any-12 scmp #00 EQU ?&no-any-12
	;any-12-lut OVR2 afnd #ffff EQU2 ?&no-any-12
		POP2 POP2 #01 JMP2r
		&no-any-12
	OVR2 ;&noswp scmp #00 EQU ?&no-noswp
	;noswp-lut OVR2 afnd #ffff EQU2 ?&no-noswp
		POP2 POP2 #01 JMP2r
		&no-noswp
	OVR2 ;&noswp2 scmp #00 EQU ?&no-noswp2
	;noswp2-lut OVR2 afnd #ffff EQU2 ?&no-noswp2
		POP2 POP2 #01 JMP2r
		&no-noswp2
	OVR2 ;&ari1-2x scmp #00 EQU ?&no-ari1-2x
	;ari1-2x-lut OVR2 afnd #ffff EQU2 ?&no-ari1-2x
		POP2 POP2 #01 JMP2r
		&no-ari1-2x
	OVR2 ;&ari2-2x scmp #00 EQU ?&no-ari2-2x
	;ari2-2x-lut OVR2 afnd #ffff EQU2 ?&no-ari2-2x
		POP2 POP2 #01 JMP2r
		&no-ari2-2x
	( templates )
	OVR2 ;&static1 scmp #00 EQU ?&no-static1
	DUP2 is-litbyte #00 EQU ?&no-static1
		POP2 POP2 #01 JMP2r
		&no-static1
	OVR2 ;&static2 scmp #00 EQU ?&no-static2
	DUP2 is-litshort #00 EQU ?&no-static2
		POP2 POP2 #01 JMP2r
		&no-static2
	SWP2
	( literals )
	LDA2k [ LIT2 "#_ ] NEQ2 ?&no-lit


@@ 369,6 410,18 @@ JMP2r

JMP2r
	&pass POP2 POP2 #01 JMP2r
	&ari1-2x "<ari1-2x> $1
	&ari2-2x "<ari2-2x> $1
	&static1 "<static1> $1
	&static2 "<static2> $1
	&any-1x "<any-1x> $1
	&any2-1x "<any2-1x> $1
	&any-2x "<any-2x> $1
	&anyr-2x "<anyr-2x> $1
	&any2-2x "<any2-2x> $1
	&any-12 "<any-12> $1
	&noswp "<noswp> $1
	&noswp2 "<noswp2> $1

@scmp3 ( a* b* -- flag )



@@ 378,11 431,21 @@ JMP2r

JMP2r

@afnd ( array* target* -- index* )

	,&t STR2
	&w
		DUP2 [ LIT2 &t $2 ] scmp ?&end
		scap INC2 LDAk ?&w
	POP2 #ffff &end

JMP2r

@phex ( short* -- )

	SWP ,&byte JSR
	&byte ( byte -- ) DUP #04 SFT ,&char JSR
	&char ( char -- ) #0f AND DUP #09 GTH #27 MUL ADD #30 ADD #18 DEO
	SWP ,&b JSR
	&b ( byte -- ) DUP #04 SFT ,&c JSR
	&c ( char -- ) #0f AND DUP #09 GTH #27 MUL ADD #30 ADD #18 DEO

JMP2r



@@ 406,20 469,68 @@ JMP2r
	JMP2r

(
@|assets )
@|luts )

@opcodes
@any-1x-lut [ ( consume 1 byte )
	"INC $1 "DUP $1 "POP $1 ] $1

@any-2x-lut [ ( consume 2 bytes )
	"ADD $1 "SUB $1 "MUL $1 "DIV $1
	"GTH $1 "LTH $1 "EQU $1 "NEQ $1
	"AND $1 "ORA $1 "EOR $1 "SWP $1
	"SFT $1 "LDA $1 "JCN $1 "STZ $1 "NIP $1
	"STR $1 "DEO $1 "JMP2 $1 "STH2 $1 ] $1

@anyr-2x-lut [ ( consume 2 bytes, from return stack )
	"ADDr $1 "SUBr $1 "MULr $1 "DIVr $1
	"GTHr $1 "LTHr $1 "EQUr $1 "NEQr $1
	"ANDr $1 "ORAr $1 "EORr $1 "SWPr $1
	"SFTr $1 "LDAr $1 "JCNr $1 "STZr $1 "NIPr $1
	"STRr $1 "DEOr $1 "JMP2r $1 "STH2r $1 ] $1

@any2-1x-lut [ ( consume 1 short )
	"INC2 $1 "DUP2 $1 "POP2 $1 ] $1

@any2-2x-lut [ ( consume 2 shorts )
	"ADD2 $1 "SUB2 $1 "MUL2 $1 "DIV2 $1
	"GTH2 $1 "LTH2 $1 "EQU2 $1 "NEQ2 $1
	"AND2 $1 "ORA2 $1 "EOR2 $1 "SWP2 $1
	"STA2 $1 "OVR2 $1 "NIP2 $1 ] $1

@any-12-lut [ ( consume 1 byte, make 2 bytes )
	"DUPk $1 "LDZ2 $1 "DEI2 $1 "LDR2 $1 ] $1

@noswp-lut [ ( consume 2 bytes, any order )
	"ADD $1 "MUL $1 "EQU $1 "NEQ $1
	"ORA $1 "AND $1 "EOR $1 ] $1

@noswp2-lut [ ( consume 2 bytes, any order )
	"ADD2 $1 "MUL2 $1 "EQU2 $1 "NEQ2 $1
	"ORA2 $1 "AND2 $1 "EOR2 $1 ] $1

@ari1-2x-lut [ ( consume 2 bytes )
	"ADD $1 "SUB $1 "MUL $1 "DIV $1
	"GTH $1 "LTH $1 "EQU $1 "NEQ $1
	"AND $1 "ORA $1 "EOR $1 "NIP $1
	"SWP $1 ] $1

@ari2-2x-lut [ ( consume 2 shorts )
	"ADD2 $1 "SUB2 $1 "MUL2 $1 "DIV2 $1
	"GTH2 $1 "LTH2 $1 "EQU2 $1 "NEQ2 $1
	"AND2 $1 "ORA2 $1 "EOR2 $1 "NIP2 $1
	"SWP2 $1 ] $1

@ariopcodes [
	"ADD $1 "SUB $1 "MUL $1 "DIV $1
	"GTH $1 "LTH $1 "EQU $1 "NEQ $1
	"AND $1 "ORA $1 "EOR $1 "INC $1 ] &end

@opcodes [
	"LIT "INC "POP "NIP "SWP "ROT "DUP "OVR
	"EQU "NEQ "GTH "LTH "JMP "JCN "JSR "STH
	"LDZ "STZ "LDR "STR "LDA "STA "DEI "DEO
	"ADD "SUB "MUL "DIV "AND "ORA "EOR "SFT
	&brk "BRK

@ariopcodes
	"ADD $1 "SUB $1 "MUL $1 "DIV $1
	"GTH $1 "LTH $1 "EQU $1 "NEQ $1
	"AND $1 "ORA $1 "EOR $1 "INC $1
	&end
	&brk "BRK ]

@dict
	&input "Input(.tal): 20 $1


@@ 460,19 571,6 @@ JMP2r
	@pop2r "POP2r $1
	@ovrk "OVRk $1
	@ovr2k "OVR2k $1
	@swpk "SWPk $1
	@equk "EQUk $1
	@neqk "NEQk $1
	@gthk "GTHk $1
	@lthk "LTHk $1
	@addk "ADDk $1
	@subk "SUBk $1
	@mulk "MULk $1
	@divk "DIVk $1
	@andk "ANDk $1
	@orak "ORAk $1
	@eork "EORk $1
	@sftk "SFTk $1
	@inck "INCk $1
	@inc2k "INC2k $1
	@brk "BRK $1


@@ 577,14 675,6 @@ JMP2r
	"!_ $1 "JMP $1 =redundance
	"!_ $1 "BRK $1 =redundance
	"BRK $1 "BRK $1 =redundance
	"SWP $1 "ADD $1 =redundance
	"SWP2 $1 "ADD2 $1 =redundance
	"SWP $1 "MUL $1 =redundance
	"SWP2 $1 "MUL2 $1 =redundance
	"SWP $1 "EQU $1 =redundance
	"SWP2 $1 "EQU2 $1 =redundance
	"SWP $1 "NEQ $1 =redundance
	"SWP2 $1 "NEQ2 $1 =redundance
	"#ff $1 "GTH $1 =redundance
	"#ffff $1 "GTH2 $1 =redundance
	"#00 $1 "LTH $1 =redundance


@@ 605,68 695,14 @@ JMP2r
	"#0000 $1 "EOR2 $1 =redundance
	"#00 $1 "SFT $1 =redundance
	"#00 $1 "SFT2 $1 =redundance
	"SWP $1 "POP2 $1 =redundance
	"AND $1 "JMP $1 =unsafe
	"ORA $1 "JMP $1 =unsafe
	"EOR $1 "JMP $1 =unsafe
	"LDZ $1 "STH $1 =latestack
	"LDZ2 $1 "STH2 $1 =latestack
	"DEIk $1 "STH $1 =latestack
	"DEI2k $1 "STH2 $1 =latestack
	"LDZk $1 "STH $1 =latestack
	"LDZ2k $1 "STH2 $1 =latestack
	"DEI $1 "STH $1 =latestack
	"DEI2 $1 "STH2 $1 =latestack
	"STH2r $1 "ADD $1 =eagerstack
	"STH2r $1 "SUB $1 =eagerstack
	"STH2r $1 "MUL $1 =eagerstack
	"STH2r $1 "DIV $1 =eagerstack
	"STH2r $1 "EQU $1 =eagerstack
	"STH2r $1 "NEQ $1 =eagerstack
	"STH2r $1 "GTH $1 =eagerstack
	"STH2r $1 "LTH $1 =eagerstack
	"STH2r $1 "LDA $1 =eagerstack
	"STH2 $1 "ADDr $1 =eagerstack
	"STH2 $1 "SUBr $1 =eagerstack
	"STH2 $1 "MULr $1 =eagerstack
	"STH2 $1 "DIVr $1 =eagerstack
	"STH2 $1 "EQUr $1 =eagerstack
	"STH2 $1 "NEQr $1 =eagerstack
	"STH2 $1 "GTHr $1 =eagerstack
	"STH2 $1 "LTHr $1 =eagerstack
	"STH2 $1 "LDAr $1 =eagerstack
	"DUP $1 "DUP $1 =keep
	"DUP2 $1 "DUP2 $1 =keep
	"DUP $1 "INC $1 =keep
	"DUP2 $1 "INC2 $1 =keep
	"DUP $1 "STH $1 =keep
	"DUP2 $1 "STH2 $1 =keep
	"DUP $1 "LDA $1 =keep
	"DUP2 $1 "LDA2 $1 =keep
	"DUP $1 "LDR $1 =keep
	"DUP2 $1 "LDR2 $1 =keep
	"DUP $1 "LDZ $1 =keep
	"DUP2 $1 "LDZ2 $1 =keep
	"DUP $1 "DEI $1 =keep
	"DUP2 $1 "DEI2 $1 =keep
	"#__ $1 "INC $1 =static
	"#____ $1 "INC2 $1 =static
	";__ $1 "INC2 $1 =static
	".__ $1 "INC $1 =static
	"DUP2 $1 "SWP2 $1 =swpk
	"DUP2 $1 "OVR $1 =ovrk
	"OVR $1 "DUP2 $1 =ovrk
	"DUP2 $1 "EQU $1 =equk
	"DUP2 $1 "NEQ $1 =neqk
	"DUP2 $1 "GTH $1 =gthk
	"DUP2 $1 "LTH $1 =lthk
	"DUP2 $1 "ADD $1 =addk
	"DUP2 $1 "SUB $1 =subk
	"DUP2 $1 "MUL $1 =mulk
	"DUP2 $1 "DIV $1 =divk
	"DUP2 $1 "AND $1 =andk
	"DUP2 $1 "ORA $1 =orak
	"DUP2 $1 "EOR $1 =eork
	"DUP2 $1 "SFT $1 =sftk
	"SWP $1 "POP $1 =nip
	"SWP2 $1 "POP2 $1 =nip2
	"#01 $1 "ADD $1 =inc


@@ 740,13 776,18 @@ JMP2r
	",__ $1 "JCN $1 =uncalled
	";__ $1 "JSR2 $1 =uncalled
	",__ $1 "JSR $1 =uncalled

&end
	( unkept )
	"DUP2 $1 "<any-2x> $1 =keep
	"DUP2k $1 "<any2-2x> $1 =keep
	"STH2 $1 "<anyr-2x> $1 =eagerstack
	"STH2r $1 "<any-2x> $1 =eagerstack
	"<any-12> $1 "STH2 $1 =latestack
	"SWP $1 "<noswp> $1 =redundance
	"SWP2 $1 "<noswp2> $1 =redundance
	"<static2> $1 "<ari1-2x> $1 =static
	&end

@rules3

	"DUP $1 "#__ $1 "SWP $1 =00ovr
	"DUP2 $1 "#____ $1 "SWP2 $1 =0000ovr2
	"ROT $1 "ROT $1 "ROT $1 =redundance
	"ROT2 $1 "ROT2 $1 "ROT2 $1 =redundance
	"SFT $1 "#__ $1 "SFT $1 =combine


@@ 759,30 800,6 @@ JMP2r
	"#____ $1 "ADD2 $1 "INC2 $1 =combine
	"INC $1 "#__ $1 "ADD $1 =combine
	"INC2 $1 "#____ $1 "ADD2 $1 =combine
	"OVR $1 "OVR $1 "EQU $1 =keep
	"OVR2 $1 "OVR2 $1 "EQU2 $1 =keep
	"OVR $1 "OVR $1 "NEQ $1 =keep
	"OVR2 $1 "OVR2 $1 "NEQ2 $1 =keep
	"OVR $1 "OVR $1 "GTH $1 =keep
	"OVR2 $1 "OVR2 $1 "GTH2 $1 =keep
	"OVR $1 "OVR $1 "LTH $1 =keep
	"OVR2 $1 "OVR2 $1 "LTH2 $1 =keep
	"OVR $1 "OVR $1 "ADD $1 =keep
	"OVR2 $1 "OVR2 $1 "ADD2 $1 =keep
	"OVR $1 "OVR $1 "SUB $1 =keep
	"OVR2 $1 "OVR2 $1 "SUB2 $1 =keep
	"OVR $1 "OVR $1 "MUL $1 =keep
	"OVR2 $1 "OVR2 $1 "MUL2 $1 =keep
	"OVR $1 "OVR $1 "DIV $1 =keep
	"OVR2 $1 "OVR2 $1 "DIV2 $1 =keep
	"OVR $1 "OVR $1 "AND $1 =keep
	"OVR2 $1 "OVR2 $1 "AND2 $1 =keep
	"OVR $1 "OVR $1 "ORA $1 =keep
	"OVR2 $1 "OVR2 $1 "ORA2 $1 =keep
	"OVR $1 "OVR $1 "EOR $1 =keep
	"OVR2 $1 "OVR2 $1 "EOR2 $1 =keep
	"OVR $1 "OVR $1 "SWP $1 =keep
	"OVR2 $1 "OVR2 $1 "SWP2 $1 =keep
	"DUP2 $1 "#0000 $1 "EQU2 $1 =orak00equ
	"OVR $1 "OVR $1 "OVR $1 =ovrk
	"OVR2 $1 "OVR2 $1 "OVR2 $1 =ovr2k


@@ 803,5 820,11 @@ JMP2r
	"#00 $1 "GTH $1 "JMP $1 =1jcn
	"#80 $1 "SFT2 $1 "POP $1 =nip
	"#08 $1 "SFT2 $1 "NIP $1 =pop
	"OVR $1 "OVR $1 "<any-2x> $1 =keep
	"OVR2 $1 "OVR2 $1 "<any2-2x> $1 =keep
	"<static1> $1 "<static1> $1 "<ari1-2x> $1 =static
	"<static2> $1 "<static2> $1 "<ari2-2x> $1 =static
	"DUP $1 "<static1> $1 "SWP $1 =00ovr
	"DUP2 $1 "<static2> $1 "SWP2 $1 =0000ovr2
	&end

&end