@@ 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