     .OUTPI ALFRES
     .ENTRY ADDCRC,GETHDR,WRTHDR
     .ENTRY CHKFIL
     .VIRT8 CRCVAL

;CRC computation logic. The logic for this method of calculating the
;CRC 16 bit polynomial is taken from an article by David Schwaderer in the
;April 1985 issue of PC Tech Journal.

;/* CRC lookup table */
CRCTBL .WORD $0000,$C0C1,$C181,$0140,$C301,$03C0,$0280,$C241
   .WORD $C601,$06C0,$0780,$C741,$0500,$C5C1,$C481,$0440
   .WORD $CC01,$0CC0,$0D80,$CD41,$0F00,$CFC1,$CE81,$0E40
   .WORD $0A00,$CAC1,$CB81,$0B40,$C901,$09C0,$0880,$C841
   .WORD $D801,$18C0,$1980,$D941,$1B00,$DBC1,$DA81,$1A40
   .WORD $1E00,$DEC1,$DF81,$1F40,$DD01,$1DC0,$1C80,$DC41
   .WORD $1400,$D4C1,$D581,$1540,$D701,$17C0,$1680,$D641
   .WORD $D201,$12C0,$1380,$D341,$1100,$D1C1,$D081,$1040
   .WORD $F001,$30C0,$3180,$F141,$3300,$F3C1,$F281,$3240
   .WORD $3600,$F6C1,$F781,$3740,$F501,$35C0,$3480,$F441
   .WORD $3C00,$FCC1,$FD81,$3D40,$FF01,$3FC0,$3E80,$FE41
   .WORD $FA01,$3AC0,$3B80,$FB41,$3900,$F9C1,$F881,$3840
   .WORD $2800,$E8C1,$E981,$2940,$EB01,$2BC0,$2A80,$EA41
   .WORD $EE01,$2EC0,$2F80,$EF41,$2D00,$EDC1,$EC81,$2C40
   .WORD $E401,$24C0,$2580,$E541,$2700,$E7C1,$E681,$2640
   .WORD $2200,$E2C1,$E381,$2340,$E101,$21C0,$2080,$E041
   .WORD $A001,$60C0,$6180,$A141,$6300,$A3C1,$A281,$6240
   .WORD $6600,$A6C1,$A781,$6740,$A501,$65C0,$6480,$A441
   .WORD $6C00,$ACC1,$AD81,$6D40,$AF01,$6FC0,$6E80,$AE41
   .WORD $AA01,$6AC0,$6B80,$AB41,$6900,$A9C1,$A881,$6840
   .WORD $7800,$B8C1,$B981,$7940,$BB01,$7BC0,$7A80,$BA41
   .WORD $BE01,$7EC0,$7F80,$BF41,$7D00,$BDC1,$BC81,$7C40
   .WORD $B401,$74C0,$7580,$B541,$7700,$B7C1,$B681,$7640
   .WORD $7200,$B2C1,$B381,$7340,$B101,$71C0,$7080,$B041
   .WORD $5000,$90C1,$9181,$5140,$9301,$53C0,$5280,$9241
   .WORD $9601,$56C0,$5780,$9741,$5500,$95C1,$9481,$5440
   .WORD $9C01,$5CC0,$5D80,$9D41,$5F00,$9FC1,$9E81,$5E40
   .WORD $5A00,$9AC1,$9B81,$5B40,$9901,$59C0,$5880,$9841
   .WORD $8801,$48C0,$4980,$8941,$4B00,$8BC1,$8A81,$4A40
   .WORD $4E00,$8EC1,$8F81,$4F40,$8D01,$4DC0,$4C80,$8C41
   .WORD $4400,$84C1,$8581,$4540,$8701,$47C0,$4680,$8641
   .WORD $8201,$42C0,$4380,$8341,$4100,$81C1,$8081,$4040

;On Entry, Acc=Char, XY=CRC value
;On Exit, XY is new CRC value,Acc=chr

CRCK *=*+1    The character

ADDCRC STA CRCK
       LDX CRCVAL
       LDY CRCVAL+1
       STY $D0    CRC>>8&0X00FF
       LDA #0
       STA $D1
       STA $D3
       TXA
       EOR CRCK
       STA $D2    CRC^C&0X00FF
       ASL $D2    OFFSET TO TABLE
       ROL $D3
       LDA #.LO.CRCTBL
       CLC
       ADC $D2
       STA $D2
       LDA #.HI.CRCTBL
       ADC $D3
       STA $D3
       LDY #0
       LDA $D0
       EOR ($D2),Y
       TAX
       INY
       LDA $D1
       EOR ($D2),Y
       TAY
       STX CRCVAL
       STY CRCVAL+1
       LDA CRCK
       RTS

;The following code blocks are for
;reading and writing the header block

GETHDR LDA #.LO.HDRVER
       STA ADR
       LDA #.HI.HDRVER
       STA ADR+1
       LDA #29
       STA LEN
       LDA #0
       STA LEN+1
       LDX #D
       JSR BGET
       BPL GETH1
       SEC
       RTS
GETH1  CLC
       RTS

WRTHDR LDA #.LO.HDRVER
       STA ADR
       LDA #.HI.HDRVER
       STA ADR+1
       LDA #29
       STA LEN
       LDA #0
       STA LEN+1
       LDX #D
       JSR BPUT
       BPL WRTH1
       SEC
       RTS
WRTH1  CLC
       RTS

CHKFIL LDX #2
CHK001 LDA TMPSIZ,X
       CMP LENGTH,X
       BNE CHK003
       DEX
       BPL CHK001
CHK002 LDA CRCVAL
       CMP CRC
       BNE CHK004
       LDA CRCVAL+1
       CMP CRC+1
       BNE CHK004
       RTS
CHK003 LDX #.LO.BADLEN
       LDY #.HI.BADLEN
       JSR SCRPRT
       JMP CHK002
CHK004 LDX #.LO.BADCRC
       LDY #.HI.BADCRC
       JSR SCRPRT
       RTS
BADLEN .BYTE "Output File Not Correct Length",$9B,0
BADCRC .BYTE "File Fails Crc Check",$9B,0