//------------------------------------------------------------- // RLL unpacker // // USAGE: Point out where the indata is located in memory // and call the rllunpack subroutine. // // EXAMPLE: // POINTER indata TO $5000 //location of RLL-data // GOSUB rllunpack // //------------------------------------------------------------- //RLL decoder a la siders evil hack! WORD indata WORD outdata BYTE inbyte BYTE loop BYTE cmdflg WORD fillbyte WORD fillrng BYTE fillchr LABEL rllunpack GETASWORD@ indata GIVING outdata //read output address from the stream!!! INCREMENT indata INCREMENT indata LET loop GET 1 WHILE loop PEEK indata GIVING inbyte LET cmdflg GET 0 IF inbyte = $EA THEN LET cmdflg GET 1 INCREMENT indata PEEK indata GIVING fillchr INCREMENT indata PEEK indata GIVING fillrng DECREMENT fillrng FILLMEM outdata RANGE fillrng WITH fillchr INCREMENT fillrng ADD fillrng TO outdata GIVING outdata ENDIF IF inbyte = $EB THEN LET cmdflg GET 1 INCREMENT indata PEEK indata GIVING fillchr INCREMENT indata GETASWORD@ indata GIVING fillrng INCREMENT indata //go to hibyte DECREMENT fillrng FILLMEM outdata RANGE fillrng WITH fillchr INCREMENT fillrng ADD fillrng TO outdata GIVING outdata ENDIF IF inbyte = $EC THEN LET cmdflg GET 1 LET loop GET 0 ENDIF IF inbyte = $ED THEN LET cmdflg GET 1 INCREMENT indata PEEK indata GIVING fillchr POKE outdata WITH fillchr INCREMENT outdata ENDIF IF cmdflg = 0 THEN POKE outdata WITH inbyte INCREMENT outdata ENDIF INCREMENT indata WEND SUBEND