         .OUTPI ALFRES
         .ENTRY LZCOMP
         .VIRT8 AX,BX,PRECDE
;MAIN COMPRESS SUBROUTINE
;
LZCOMP   LDA #0                 ;INIT SOME VARIABLES
         STA BITOFF
         STA BITOFF+1
         STA CRC
         STA CRC+1
         STA INBUFL
         STA INBUFL+1
         STA IEOF
         JSR SETUP              ;BUILD INITIAL HEADER BLOCK
         JSR INITBL             ;INIT HASH TABLE AND CODES
         JSR FMTBUF             ;ALLOCATE BUFFER SPACE
         LDA #.LO.CLEAR         ;WRITE A CLEAR TABLE CODE
         STA AX
         LDA #.HI.CLEAR
         STA AX+1
         JSR WRTCDE
         JSR REACHR             ;PRELOAD AX WITH A CHAR
         BCC LZ001
         RTS                    ;FILE MUST HAVE SOME DATA
LZ001    LDA #0                 ;TURN CHARACTER INTO A CODE
         STA AX+1
LZ002    LDA AX                 ;SET THE PREFIX CODE
         STA PRECDE
         LDA AX+1
         STA PRECDE+1
         JSR REACHR             ;GET THE NEXT CHARACTER
         BCC LZ003
         JMP LZEND              ;END OF FILE
LZ003    LDA PRECDE             ;LOAD THE LOOKUP CODE
         STA BX
         LDA PRECDE+1
         STA BX+1
         LDA AX                 ;SAVE THE CHARACTER BYTE
         STA SAVK
         JSR LOOKUP             ;LOCATE CODE IN TABLE
         BCC LZ002              ;NO CARRY MEANS FOUND, NEW CODE IN AX
         JSR ADDCDE             ;ELSE ADD CODE TO TABLE
         LDA PRECDE             ;WRITE OLD PREFIX CODE TO FILE
         STA AX
         LDA PRECDE+1
         STA AX+1
         JSR WRTCDE
         LDA SAVK               ;RESTORE ORIGINAL CHARACTER
         STA AX
         LDA BX+1               ;REACHED MAX CODE SIZE FOR BIT SIZE ?
         CMP MAXCDE+1
         BCC LZ001
         LDA BX
         CMP MAXCDE
         BCC LZ001
         LDA NBITS              ;USING 12 BIT CODES YET ?
         CMP #11
         BCC LZ004
         LDA #.LO.CLEAR         ;WRITE CLEAR CODE
         STA AX
         LDA #.HI.CLEAR
         STA AX+1
         JSR WRTCDE
         JSR INITBL             ;REINITIALIZE THE TABLE
         LDA SAVK
         STA AX                 ;RESTORE OLD CHARACTER
         JMP LZ001
LZ004    INC NBITS              ;NEXT CODE SIZE
         ASL MAXCDE
         ROL MAXCDE+1           ;NEXT TABLE SIZE
         JMP LZ001
;Here we end the compression
LZEND    LDA PRECDE             ;WRITE LAST CODE
         STA AX
         LDA PRECDE+1
         STA AX+1
         JSR WRTCDE
         LDA #.LO.FILEND        ;SAY END OF FILE
         STA AX
         LDA #.HI.FILEND
         STA AX+1
         JSR WRTCDE
         LDA BITOFF
         ORA BITOFF+1           ;WAS BUFFER FLUSHED ?
         BEQ LZ012
         LDA OUTBUF             ;SET UP BUFFER TO WRITE OUT
         STA ADR
         LDA OUTBUF+1
         STA ADR+1
         LDA BITOFF
         STA LEN
         LDA BITOFF+1
         STA LEN+1
         LDX #2
LZ010    LSR LEN+1              ;CALC TRUE BUFFER SIZE
         ROR LEN
         DEX
         BPL LZ010
         LDA BITOFF
         AND #$07               ;EVEN BYTE BOUNDARY ?
         BEQ LZ011
         INC LEN                ;FLUSH EXTRA BITS
         BNE LZ011
         INC LEN+1
LZ011    LDX #D2
         LDA CMPSIZ             ;CALC FINAL FILE SIZE
         CLC
         ADC LEN
         STA CMPSIZ
         LDA CMPSIZ+1
         ADC LEN+1
         STA CMPSIZ+1
         LDA CMPSIZ+2
         ADC #0
         STA CMPSIZ+2
         JSR BPUT               ;FLUSH BUFFER
         BPL LZ012
         LDX #.LO.ERRM04        ;SAY I/O ERROR OCCURRED
         LDY #.HI.ERRM04
         JSR SCRPRT
LZ012    JSR UPDHDR             ;UPDATE HEADER BLOCK
         RTS
