( ulz decoder ) |10 @Console &vector $2 &read $1 &pad $4 &type $1 &write $1 &error $1 |a0 @File &vector $2 &success $1 &success-lb $1 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2 |000 @src/buf $40 @dst/buf $40 |100 @on-reset ( -> ) ;meta #06 DEO2 [ LIT2 03 -Console/type ] DEI AND ?{ ;dict/usage str/ #010f DEO BRK } ;src/on-console .Console/vector DEO2 BRK @meta $1 ( name ) "Ulzdec 0a ( desc ) "ULZ 20 "Decoder 0a ( auth ) "By 20 "Devine 20 "Lu 20 "Linvega 0a ( date ) "28 20 "Mar 20 "2026 $2 ( @|Buffers ) @src/on-console ( -> ) [ LIT2 02 -Console/type ] DEI LTH ?{ .Console/read DEI [ LIT &ptr -&buf ] INCk ,&ptr STR STZ BRK } ;dst/on-console .Console/vector DEO2 BRK @dst/on-console ( -> ) [ LIT2 02 -Console/type ] DEI LTH ?{ .Console/read DEI [ LIT &ptr -&buf ] INCk ,&ptr STR STZ BRK } ( >> ) @run ( -> ) ;src/buf ulz/decode ( | write ) ;dst/buf .File/name DEO2 DUP2 .File/length DEO2 ;ulz/buf .File/write DEO2 ( | summary ) ;dict/decompressed str/ ;src/buf str/ ;dict/spacer str/ ;dst/buf str/ [ LIT2 "( 18 ] DEO dec/ ;dict/bytes str/ [ LIT2 ") 18 ] DEO #0a18 DEO #800f DEO BRK ( @|Core ) @ulz/decode ( src* -- length* ) .File/name DEO2 #0001 .File/length DEO2 &>stream ;&b .File/read DEO2 .File/success-lb DEI ?{ ,&ptr LDR2 ;&buf SUB2 JMP2r } [ LIT &b $1 ] / !&>stream @ulz/ ( c -- ) [ LIT2 &ptr =&buf ] INC2k ,&ptr STR2 STA JMP2r @ulz/ ( byte -- ) DUP #80 AND ?{ ( | op-lit ) INC #00 &>l-lit getc / INC GTHk ?&>l-lit POP2 JMP2r } ( | op-cpy ) #7f AND DUP #40 AND ?{ #00 SWP !& } #3f AND getc ( >> ) @ulz/ ( length* -- ) #0004 ADD2 STH2 ,&ptr LDR2 #00 getc INC2 SUB2 DUP2 STH2r ADD2 SWP2 &>l-cpy LDAk / INC2 GTH2k ?&>l-cpy POP2 POP2 JMP2r ( @|Stdlib ) @getc ( -- b ) ;&b .File/read DEO2 [ LIT &b $1 ] JMP2r @str/ ( str* -- ) LDAk DUP ?{ POP POP2 JMP2r } #18 DEO INC2 !/ @dec/ ( short* -- ) #2710 [ LIT2r 00fb ] &>w DIV2k #000a DIV2k MUL2 SUB2 SWPr EQUk OVR STHkr EQU AND ?{ DUP [ LIT "0 ] ADD #19 DEO INCr } POP2 #000a DIV2 SWPr INCr STHkr ?&>w POP2r POP2 POP2 JMP2r ( @|mem ) @dict/usage "usage: 20 "ulzdec.rom 20 "a.bin 20 "b.ulz 0a00 &decompressed "Decompressed 2000 &bytes 20 "bytes 00 &spacer 20 "-> 2000 @ulz/buf