diff --git a/lz.tal b/lz.tal new file mode 100644 index 0000000..5fe51f6 --- /dev/null +++ b/lz.tal @@ -0,0 +1,102 @@ +( decompressor ) + +|10 @Console &vector $2 &read $1 &pad $5 &write $1 &err $1 +|a0 @File1 &vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2 +|b0 @File2 &vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2 + +|0000 + + @input-size $2 + + @src $30 + @ptr $1 + +|0100 + +( +@|vectors ) + +@ready-src ( -> ) ;&await .Console/vector DEO2 BRK +&await ( -> ) .Console/read DEI .src skey ?on-ready BRK + +@on-ready ( -> ) + + ;src decompress + ;mem pstr #0a18 DEO + ( halt ) #010f DEO + +BRK + +@decompress ( str* -- ) + + ;mem .ptr STZ2 + .File1/name DEO2 + #0001 .input-size STZ2 + &stream + .input-size LDZ2 .File1/length DEO2 + ;&b + DUP2 .File1/read DEO2 + LDA decompress/run + .File1/success DEI2 ORA ?&stream + +JMP2r + &b $1 + +&run ( byte -- ) + + DUP #80 AND ?&dict + ( literal ) + #00 SWP INC2 + DUP2 .File1/length DEO2 + .ptr LDZ2 + DUP2 .File1/read DEO2 + ADD2 .ptr STZ2 + +JMP2r + +&dict ( byte -- ) + + #7f AND + DUP #40 AND ?&dict3 + ( byte ) + #00 SWP !&opc + +&dict3 ( byte -- ) + + ( hb ) + #3f AND + ( lb ) + #0001 .File1/length DEO2 + ;&b + DUP2 .File1/read DEO2 + LDA + +&opc #0004 ADD2 + + ;&b + DUP2 .File1/read DEO2 + LDA INC + +© ( length* offset -- ) + + #00 SWP #0000 SWP2 SUB2 .ptr LDZ2 ADD2 STH2 + #0000 + &l + DUP2 STH2kr ADD2 LDA .ptr LDZ2 STH2k STA + STH2r INC2 .ptr STZ2 + INC2 GTH2k ?&l + POP2 POP2 + POP2r + +JMP2r + +( +@|stdlib ) + +@pstr ( str* -- ) LDAk ?&w POP2 JMP2r &w LDAk #18 DEO INC2 LDAk ?&w POP2 JMP2r +@skey ( key buf -- proc ) OVR #21 LTH ?&eval #00 SWP sput #00 JMP2r &eval POP2 #01 JMP2r +@scap ( str* -- end* ) LDAk ?&w JMP2r &w INC2 LDAk ?&w JMP2r +@sput ( chr str* -- ) scap INC2k #00 ROT ROT STA STA JMP2r + +@mem +