         .OUTPI ALFRES
         .ENTRY DZCOMP
         .VIRT8 AX,BX,SPTR,HPTR
;Decompress does all the work. Just like me...
;
DZCOMP   LDA #0
         STA STKCNT
         STA STKCNT+1
         STA OBUFL
         STA OBUFL+1
         STA BITOFF
         STA BITOFF+1
         STA IEOF
         STA TCRC
         STA TCRC+1
         LDA #9
         STA NBITS
         LDA #.LO.512
         STA MAXCDE
         LDA #.HI.512
         STA MAXCDE+1
         LDA #0                 ;STACK AT $6000
         STA SPTR
         LDA #$60
         STA SPTR+1
         JSR FMTBUF         ;Allocate the I/O buffers
         LDX #D
         LDA INBUFF
         STA ADR
         LDA INBUFF+1
         STA ADR+1
         LDA MAXBUF
         STA LEN
         LDA MAXBUF+1
         STA LEN+1
         JSR RELOAD             ;LOAD UP THE BUFFER
         STY IEOF
         JSR ZERBUF             ;ZERO THE OUTPUT
         LDA LEN
         ORA LEN+1
         BNE DZ001
         RTS
DZ001    JSR REACDE ;Get a data code
         LDA AX+1    ;Is it eof ?
         CMP #.HI.FILEND
         BNE DZ003
         LDA AX
         CMP #.LO.FILEND
         BNE DZ003
         JSR FLUSH   ;Flush the output buffer
         LDA CRC
         CMP TCRC
         BNE DZ004
         LDA CRC+1
         CMP TCRC+1
         BEQ DZ002
DZ004    LDX #.LO.ERRM09
         LDY #.HI.ERRM09
         JSR SCRPRT
DZ002    RTS         ;All done
DZ003    LDA AX
         CMP #.LO.CLEAR ;Clear code ?
         BNE DZ005
         LDA AX+1
         CMP #.HI.CLEAR
         BNE DZ005
         JSR INITBL  ;INIT THE TABLE
         JSR REACDE
         LDA AX      ;Init some vars
         STA CURCDE
         STA OLDCDE
         LDA AX+1
         STA CURCDE+1
         STA OLDCDE+1
         LDA AX
         STA SAVK
         STA FINCHR
         JSR WRTCHR ;Output the character
         JMP DZ001      ;Get next code
;
DZ005    LDA AX
         STA CURCDE ;Save new code
         STA INCODE
         LDA AX+1
         STA CURCDE+1
         STA INCODE+1
         LDA AX+1
         CMP FRECDE+1 ;Code in table ?
         BCC DZ008
         LDA AX
         CMP FRECDE
         BCC DZ008
         LDA OLDCDE
         STA AX
         STA CURCDE
         LDA OLDCDE+1
         STA AX+1
         STA CURCDE+1
         LDA FINCHR ;Get old last char
         STA AX
         JSR PUSH    ;Push onto pseudo stack
DZ008    LDA CURCDE+1 ;Code or character ?
         BEQ DZ009     ;Character
         LDA CURCDE
         STA BX
         LDA CURCDE+1
         STA BX+1
         JSR INDEX
         LDY #HCHAR
         LDA (HPTR),Y
         STA AX      ;Get suffix char
         JSR PUSH    ;Push it
         LDY #HNEXT  ;Get prefix code
         LDA (HPTR),Y
         STA AX
         STA CURCDE
         INY
         LDA (HPTR),Y
         STA AX+1
         STA CURCDE+1
         JMP DZ008
;
DZ009    LDA CURCDE
         STA AX
         STA FINCHR ;Save final char
         STA SAVK
         LDA CURCDE+1
         STA AX+1
         JSR PUSH
DZ010    LDA STKCNT
         ORA STKCNT+1
         BEQ DZ012
         JSR PULL
         JSR WRTCHR
         JMP DZ010
DZ012    JSR ADDCDE
         LDA INCODE ;Save input code
         STA AX
         STA OLDCDE
         LDA INCODE+1
         STA AX+1
         STA OLDCDE+1
         LDA FRECDE
         STA BX
         LDA FRECDE+1
         STA BX+1
         CMP MAXCDE+1
         BCC DZ019
         LDA BX
         CMP MAXCDE
         BCC DZ019
         LDA NBITS   ;Still within 12 bits ?
         CMP #11
         BEQ DZ019
         INC NBITS   ;Up one bit
         ASL MAXCDE
         ROL MAXCDE+1 ;means double the codes
DZ019    JMP DZ001
