@@ 8,6 8,7 @@
@src $30
@dst $30
+ @program &ptr $2
|0100 ( -> )
@@ 59,15 60,112 @@ JMP2r
LDAk LIT "( EQU ,&on-parens JCN
LDAk LIT ") EQU ,&on-parens JCN
[ LIT &sleep $1 ] ,&on-sleep JCN
- ;pstr JSR2 #0a18 DEO
+ [ LIT2 &action =symbolize ] JSR2
JMP2r
&on-parens ( t* -- ) LDA LIT "( EQU ,&sleep STR JMP2r
&on-sleep ( t* -- ) POP2 JMP2r
(
+@|symbols )
+
+@symbolize ( t* -- )
+
+ LDAk LIT "| NEQ ,&no-padabs JCN
+ INC2 ;shex JSR2 .program/ptr STZ2 JMP2r
+ &no-padabs
+ LDAk LIT "$ NEQ ,&no-padrel JCN
+ INC2 ;shex JSR2 .program/ptr STHk LDZ2 ADD2 STHr STZ2 JMP2r
+ &no-padrel
+ LDAk LIT "" EQU ,&str JCN
+ LDAk LIT "@ EQU ,&l0 JCN
+ LDAk LIT "& EQU ,&l0 JCN
+ LDAk LIT "_ EQU ,&l1 JCN
+ LDAk LIT "- EQU ,&l1 JCN
+ LDAk LIT "= EQU ,&l2 JCN
+ LDAk LIT ", EQU ,&l2 JCN
+ LDAk LIT ". EQU ,&l2 JCN
+ LDAk LIT "; EQU ,&l3 JCN
+ LDAk LIT "# EQU ,&lithex JCN
+ DUP2 ;is-opcode JSR2 ,&l1 JCN
+
+ ;pstr JSR2 #0a18 DEO
+
+JMP2r
+ &lithex
+ ;slen JSR2 DUP2 #0003 EQU2 ,&l2 JCN
+ DUP2 #0005 EQU2 ,&l3 JCN
+ ;err/number ;crash JMP2
+ &str INC2 ;slen JSR2 .program/ptr LDZ2 ADD2 .program/ptr STZ2 JMP2r
+ &l0 POP2 JMP2r
+ &l1 POP2 .program/ptr LDZ2k #0001 ADD2 ROT STZ2 JMP2r
+ &l2 POP2 .program/ptr LDZ2k #0002 ADD2 ROT STZ2 JMP2r
+ &l3 POP2 .program/ptr LDZ2k #0003 ADD2 ROT STZ2 JMP2r
+
+(
+@helpers )
+
+@is-opcode ( string* -- flag )
+
+ DUP2 ;opcodes/brk ;scmp3 JSR2 ,find-opcode/on-brk JCN
+
+@find-opcode ( name* -- byte )
+
+ STH2
+ #2000
+ &l
+ #00 OVR #03 MUL ;opcodes ADD2 STH2kr ;scmp3 JSR2 ,&on-found JCN
+ INC GTHk ,&l JCN
+ POP2 POP2r #00
+
+JMP2r
+ &on-found
+ NIP ( LITk ) DUP #00 EQU #70 SFT ADD
+ STH2r INC2 INC2 INC2 ,find-modes JSR ADD JMP2r
+ &on-brk POP2 #01 JMP2r
+
+@find-modes ( mode* -- byte )
+
+ LITr 00
+ &w
+ LDAk #20
+ OVR LIT "2 EQU ,&end JCN DUP ADD
+ OVR LIT "r EQU ,&end JCN DUP ADD
+ OVR LIT "k EQU ,&end JCN DUP ADD
+ OVR #21 LTH ,&end JCN
+ ;token ;err/mode ;crash JMP2
+ &end NIP STH ORAr
+ INC2 LDAk ,&w JCN
+ POP2 STHr
+
+JMP2r
+
+@crash ( id* name* -- )
+
+ ;err ;perr JSR2
+ ;perr JSR2
+ LIT ": #19 DEO
+ #2019 DEO
+ ;perr JSR2
+ #0a19 DEO
+ #010f DEO
+
+BRK
+
+@scmp3 ( a* b* -- flag )
+
+ LDA2k ROT2 LDA2k ROT2 EQU2 STH
+ INC2 LDA2 SWP2 INC2 LDA2 EQU2 STHr
+ AND
+
+JMP2r
+
+(
@|stdlib )
+@perr ( src* str* -- ) &w LDAk #19 DEO INC2 LDAk ,&w JCN POP2 JMP2r
+
+
@pstr ( str* -- ) LDAk ,&w JCN POP2 JMP2r &w LDAk #18 DEO INC2 LDAk ,&w JCN POP2 JMP2r
@scap ( str* -- end* ) LDAk ,&w JCN JMP2r &w INC2 LDAk ,&w JCN JMP2r
@sput ( chr str* -- ) ,scap JSR INC2k #00 ROT ROT STA STA JMP2r
@@ 79,11 177,29 @@ JMP2r
@scmp ( a* b* -- f ) STH2 &l LDAk LDAkr STHr ANDk #00 EQU ,&e JCN NEQk ,&e JCN POP2 INC2 INC2r ,&l JMP &e NIP2 POP2r EQU JMP2r
@mcpy ( src* dst* len* -- ) SWP2 STH2 OVR2 ADD2 SWP2 &loop LDAk STH2kr STA INC2r INC2 GTH2k ,&loop JCN POP2 POP2 POP2r JMP2r
@chex ( c -- val|ff ) LIT "0 SUB DUP #09 GTH JMP JMP2r #27 SUB DUP #0f GTH JMP JMP2r POP #ff JMP2r
+@shex ( str* -- val* ) LIT2r 0000 &w LITr 40 SFT2r LITr 00 LDAk ,chex JSR STH ADD2r INC2 LDAk ,&w JCN POP2 STH2r JMP2r
@dict
&input "Input(.tal): 20 $1
&output "Output(.rom): 20 $1
+@err
+ "!! 20 "Error 20 $1
+ &duplicate "Duplicate $1
+ &token "Token $1
+ &number "Number $1
+ &reference "Reference $1
+ &source "Source $1
+ &mode "Mode $1
+ &distance "Distance $1
+
+@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
+
(
@|buffers )