|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 $5 &type $1 &write $1 &error $1
%dup3 ( a b c -- a b c a b c ) { ROTk ROT ROT }
%dbg ( -- ) { [ LIT2 01 -System/debug ] DEO }
|100
@on-reset ( -> )
#ffff #00 LUT/insert POP2
#ffff LIT "A LUT/insert
LIT "B LUT/insert LIT "C LUT/insert POP2
#0002 LIT "C LUT/lookup
;putc-visitor LUT/visit
BRK
@putc-visitor ( addr* sym -- )
.Console/write DEO POP2
JMP2r
( @LUT )
( visitor is a pointer to a routine of the form ( addr* sym -- ) )
@LUT/visit ( addr* visitor* -- first-byte )
,/visitor STR2 /walk-up DUP ,/visitret STR
&visitloop
[ LIT2 &visitor $2 ] JSR2
,/buf-prev LDR2
INC2k ORA ?{ POP2 [ LIT &visitret $1 ] JMP2r }
/get STH POP2 ,/buf-parent LDR2 STHr ( addr* sym )
!/visitloop
@LUT/cpybuf
&buf-prev $2 &buf-parent $2 &buf-sym $1
@LUT/walk-up ( addr* -- addr* sym ) ( routine leaves root node metadata in /cpybuf )
#ffff SWP2 ( -1* node* )
&walkloop
DUP2 />getaddr DUP2 />setaddr
;/getext .System/expansion DEO2 ( load node info )
SWP2 ,/buf-prev STR2
;/setext .System/expansion DEO2 ( save child ptr )
,/buf-parent LDR2 ( node* new-node* )
INC2k ORA ?/walkloop
POP2 ,/buf-sym LDR JMP2r
@LUT/insert ( parent* sym -- addr* )
,/size LDR2 DUP2 />setaddr
INC2k ,/size STR2 STH2
,/buf-sym STR ,/buf-parent STR2
;/setext .System/expansion DEO2
STH2r JMP2r
@LUT/get ( addr* -- parent* sym )
/>getaddr
;/getext .System/expansion DEO2
,/buf-parent LDR2 ,/buf-sym LDR
JMP2r
@LUT/lookup ( parent* sym -- addr* )
[ LIT2r 0000 ]
&lookuploop
dup3
STH2rk [ LIT2 &size 0000 ]
LTH2 ?{ POP2r POP2 POP2 POP2 #ffff JMP2r }
STH2rk /get ( parent1* sym1 parent2* sym2 )
STH ROT STH NEQ2 NEQr STHr ORA ( parent1 != parent2 || sym1 != sym2 )
INC2r ?/lookuploop
POP2 POP STH2r #0001 SUB2 JMP2r
@LUT/>getaddr ( addr* -- )
DUP2 #3334 DIV2 INC2
,/getbank STR2
#0005 MUL2
,/getaddr STR2
JMP2r
@LUT/>setaddr ( addr* -- )
DUP2 #3334 DIV2 INC2
,/setbank STR2
#0005 MUL2
,/setaddr STR2
JMP2r
@LUT/setext
01 0005 0000 =/cpybuf &setbank $2 &setaddr $2
@LUT/getext
01 0005 &getbank $2 &getaddr $2 0000 =/cpybuf