~rabbits/drifblim

e6fbc16b0a75ae46c00901a579e43420a5d714b1 — Devine Lu Linvega 2 months ago a98f901
Progress on symbolizer
1 files changed, 117 insertions(+), 1 deletions(-)

M src/symbols.tal
M src/symbols.tal => src/symbols.tal +117 -1
@@ 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 )