         .OUTPI ALFRES
         .ENTRY XALF,MAXCDE,NBITS
         .ENTRY HTABLE,FIRSTF,FRECDE,SAVK
         .ENTRY OLDCDE,HNEXT,HCHAR,MAXMAX
         .VIRT8 AX,BX,SPTR,HPTR,BITOFF,BYTOFF,STKCNT
;Decompress does all the work. Just like me...
;
XALF     LDA #0
         STA STKCNT
         STA STKCNT+1
         STA BITOFF
         STA BITOFF+1
         LDA #9
         STA NBITS
         LDA #.LO.512
         STA MAXCDE
         LDA #.HI.512
         STA MAXCDE+1
         JSR FMTBUF       ALLOCATE RAM
         LDA IBUFF
         STA ADR
         LDA IBUFF+1
         STA ADR+1
         LDA IBMAX
         STA LEN
         LDA IBMAX+1
         STA LEN+1
         LDX #D
         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 OFLUSH   ;Flush output
         JSR CHKFIL
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
         LDX CURCDE+1
         STX AX+1
         JSR PUSH
DZ010    JSR PULL
         BCS DZ012
         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 #12
         BEQ DZ019
         INC NBITS   ;Up one bit
         ASL MAXCDE
         ROL MAXCDE+1 ;means double the codes
DZ019    JMP DZ001

CLEAR    =   256
FILEND   =   257
FIRSTF   =   258
MAXMAX   =   4096
HNEXT    =   0
HCHAR    =   2
;
INCODE   .WORD 0
SAVK     .BYTE 0
FINCHR   .BYTE 0
OLDCDE   .WORD 0
FRECDE   .WORD 0
CURCDE   .WORD 0
HTABLE   .WORD 0
NBITS    .BYTE 9
MAXCDE   .WORD 512

