|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 LIT "W LUT/insert POP2
#ffff LIT "A LUT/insert POP2
#ffff LIT "X LUT/insert POP2
#ffff LIT "X LUT/insert POP2
#ffff LIT "C LUT/insert POP2
#ffff LIT "E LUT/insert POP2
( LUT/width dbg POP )
#0c Bitstream/shift-byte
LUT/width Bitstream/take-bits POP2 ( ignore the initial clear code )
;LZW/testdata
&decodeloop
LDAk LZW/push-byte
INC2
DUP2 ;LZW/endtestdata LTH2 ?/decodeloop
POP2
BRK
@putc-visitor ( id* -- )
LUT/get .Console/write DEO POP2
JMP2r
( @LZW )
@LZW/push-byte ( b1 -- )
Bitstream/shift-byte
&loop
LUT/width Bitstream/take-bits
INC2k ORA ?{ POP2 JMP2r }
LUT/step
!/loop
( @LUT )
@LUT/toaddr ( id* -- addr* )
#0005 MUL2 ;/workspace ADD2
JMP2r
@LUT/id-ok? ( id* -- id* ok? )
DUP2 #1000 LTH2 JMP2r
( visitor is a pointer to a routine of the form ( sym -- ) )
@LUT/visit ( id* -- first-sym )
/walk-up DUP2 /get ,/visitret STR POP2
&visitloop
DUP2 /visitor
/toaddr LDA2 INC2k ORA
?{ POP2 [ LIT &visitret $1 ] JMP2r }
!/visitloop
@LUT/walk-up ( id* -- root-id* )
#ffff SWP2 ( -1* node* )
&walkloop
STH2k /toaddr STA2k ( save child ptr )
NIP2 INC2 INC2 LDA2 ( new-node* `node* )
STH2r SWP2 ( node* new-node* )
INC2k ORA ?/walkloop
POP2 JMP2r
@LUT/insert ( parent* sym -- id* )
ROT ROT
,/size LDR2 /id-ok? ?{ POP2 POP2 POP #ffff JMP2r }
STH2k /toaddr
INC2 INC2 STA2k ( parent* )
NIP2 INC2 INC2 STA ( sym )
STH2rk INC2 ,/size STR2
STH2r JMP2r
@LUT/get ( id* -- parent* sym )
/toaddr INC2 INC2 LDA2k ( parent* )
SWP2 INC2 INC2 LDA ( sym )
JMP2r
@LUT/lookup ( parent* sym -- id* )
[ 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/width ( -- n )
,/size LDR2
[ LIT2r 1001 ]
&widthloop INCr DUP2
#0001 MULrk STHr SFT2 #0001 SUB2 ( creates a short with the left N bits set )
GTH2 ?/widthloop
POP2 NIPr STHr JMP2r
@LUT/step ( c* -- )
[ LIT2 &last ffff ]
OVR2 ,/size LDR2 LTH2 ?/step-in-dict
( >> )
@LUT/step-no-dict ( c* last* -- )
NIP2 DUP2 /visit
DUP .Console/write DEO
/insert ,/last STR2
JMP2r
@LUT/step-in-dict ( c* last* -- )
OVR2 /visit ROT ROT
INC2k ORA #00 EQU ?{ ROT /insert #00 } POP2 POP
,/last STR2
JMP2r
@LUT/visitor ( id* -- )
/get .Console/write DEO POP2
JMP2r
( @Bitstream )
@Bitstream/shift-byte ( b -- )
#00 SWP
[ LIT &offset 00 ] DUP #08 ADD ,/offset STR
#40 SFT SFT2
[ LIT2 &stream $2 ] ORA2 ,/stream STR2
JMP2r
@Bitstream/take-bits ( n -- b* )
,/offset LDR SWPk LTH #00 EQU ?{ POP2 #ffff JMP2r }
OVR SUB ,/offset STR
,/stream LDR2 ROTk SFT2 ,/stream STR2 ( stream = stream>>n )
ROT #0f00 ROT SUB AND STHk ( save >>(16-n) )
#40 SFT SFT2 ( stream<<(16-n) )
STHr SFT2 ( stream>>(16-n) )
JMP2r
@LZW/testdata
8ca7 c9eb f662 9b8f 5a19 f1dd 87fb fc85
9d46 5ee5 3989 22ca 222a dbb6 ef17 87f3
59a3 3797 7b3b d92b fd4c 4349 9112 dc1c
4149 6313 b964 441d 4fe7 1472 3d14 00
@LZW/endtestdata
@LUT/workspace $5000