     .OUTPI ALFRES
     .ENTRY "ALL"
;EQUATES FOR ALFVIEW

ZPAG     =   $B0
         *=  $8000
ALFV  = *
IFILE    *=*+82
TITLE    .BYTE 125,"     AlfView  v1.0",$9B
CRLINE   .BYTE $9B,$9B,$9B,$9B
ASKI     .BYTE "Input File:",$9B
NOTF     .BYTE "File Not Found",$9B
TOPLIN   .BYTE 125,"Filename         True    Size Format",$9B
;The Arc type header
HDR      .BYTE $1A,$0F ;Arc and Crunched
FILEN    .BYTE "             " ;The file name
CMPSIZ .WORD 0,0  ;Compressed size
DATE     .BYTE $88,$05
TIME     .BYTE $13,$03
CRC      .WORD 0
LENGTH   .WORD 0,0
HDRL     =   *-HDR
SAVXY    .WORD 0
CRTBL    .BYTE 1
         .WORD STORED
         .BYTE 2
         .WORD STORED
         .BYTE 3
         .WORD PACKED
         .BYTE 4
         .WORD SQUZED
         .BYTE 5
         .WORD CRNCHD
         .BYTE 6
         .WORD CRNCHD
         .BYTE 7
         .WORD CRNCHD
         .BYTE 8
         .WORD CRNCHD
         .BYTE 9
         .WORD SQSHED
         .BYTE $0F
         .WORD ALFCR
         .BYTE $FF
STORED   .BYTE "Stored",$9B
PACKED   .BYTE "Packed",$9B
SQUZED   .BYTE "Squeezed",$9B
CRNCHD   .BYTE "Crunched",$9B
ALFCR    .BYTE "AlfCrunch",$9B
SQSHED   .BYTE "Squashed",$9B
UNKNWN   .BYTE "Unknown",$9B

;The viewer

START    JSR SUBIN
         LDA #0
         STA $52     ;Zero Left Margin
         LDX #.LO.TITLE
         LDY #.HI.TITLE
         JSR SCRPRT     ;Print title
         LDA $02E7
         STA BUFST   ;Calc buffer size
         LDA $02E8
         STA BUFST+1
         LDA #.LO.ALFV
         SEC
         SBC BUFST
         STA BUFLEN
         LDA #.HI.ALFV
         SBC BUFST+1
         STA BUFLEN+1
ALFV1    LDX #.LO.ASKI
         LDY #.HI.ASKI
         JSR SCRPRT     ;Ask for file
         LDA #$40     ;Force uppercase
         STA $02BE
         JSR GETLIN
         LDA LINEL
         BNE V001
VEXIT    JSR SUBXIT
         LDA $0700     ;RTS if Sparta
         CMP #$53
         BEQ VEXIT1
         JMP ($0A)
VEXIT1   RTS 
VASK     LDA #4
         STA LEN
         LDA #0
         STA LEN+1
         LDA #.LO.CRLINE
         STA ADR
         LDA #.HI.CRLINE
         STA ADR+1
         LDX #0
         JSR BPUT
         JMP ALFV1
;
V001     JSR CAPLIN     ;Uppercase line
         JSR FQUAL     ;Add D1: if need
         JSR FXTN     ;Add .ALF if need
         LDX LINEL
ALV001   LDA LINE,X
         STA IFILE,X
         DEX
         BPL ALV001
         LDX #D       ;Open file
         LDA #.LO.IFILE
         LDY #.HI.IFILE
         JSR OPIN
         BPL V002A
         LDX #.LO.NOTF
         LDY #.HI.NOTF
         JSR SCRPRT
         JMP VASK
;
V002A    LDX #.LO.TOPLIN
         LDY #.HI.TOPLIN
         JSR SCRPRT
V002     LDA #.LO.HDR
         STA ADR
         LDA #.HI.HDR
         STA ADR+1
         LDA #29
         STA LEN
         LDA #0
         STA LEN+1
         LDX #D
         JSR BGET
         BPL V003
         JMP VASK
V003     LDA HDR     ;Is it an arc ?
         CMP #$1A
         BEQ V004
         JMP VASK
V004     LDA LENGTH   ;Pretty stats
         STA HEXNUM
         LDA LENGTH+1
         STA HEXNUM+1
         LDA LENGTH+2
         STA HEXNUM+2
         JSR EHEXCV
         LDX #37
         LDA #32
V005     STA LINE,X
         DEX 
         BPL V005
         INX 
V006     LDA FILEN,X
         BEQ V007
         STA LINE,X
         INX 
         CPX #13
         BCC V006
V007     LDX #7
V008     LDA HEXNUM,X
         STA LINE+13,X
         DEX 
         BPL V008
         LDA CMPSIZ
         STA HEXNUM
         LDA CMPSIZ+1
         STA HEXNUM+1
         LDA CMPSIZ+2
         STA HEXNUM+2
         JSR EHEXCV
         LDX #7
V009     LDA HEXNUM,X
         STA LINE+21,X
         DEX 
         BPL V009
         LDA HDR+1
         JSR LOOKUP
         BCC V010
         LDX #.LO.UNKNWN
         LDY #.HI.UNKNWN
V010     STX ZPAG
         STY ZPAG+1
         LDX #30
         LDY #0
V011     LDA (ZPAG),Y
         STA LINE,X
         CMP #$9B
         BEQ V012
         INY
         INX
         BNE V011
V012     LDX DATE
         LDY DATE+1
         JSR UPKDTE
         STA HEXNUM
         LDA #0
         STA HEXNUM+1
         STX SAVXY
         STY SAVXY+1
         JSR HEXCNV
         LDA HEXNUM+7
         STA LINE+15
         LDA HEXNUM+6
         STA LINE+14
         LDY SAVXY+1
         STY HEXNUM
         LDA #0
         STA HEXNUM+1
         JSR HEXCNV
         LDA HEXNUM+7
         LDY HEXNUM+6
         STA LINE+13
         STY LINE+12
         LDA SAVXY
         CLC
         ADC #80
         STA HEXNUM
         LDA #0
         STA HEXNUM+1
         JSR HEXCNV
         LDA HEXNUM+7
         LDX HEXNUM+6
         STA LINE+11
         STX LINE+10
         LDX TIME
         LDY TIME+1
         JSR UPKTIM
         STX SAVXY
         STY HEXNUM
         LDA #0
         STA HEXNUM+1
         JSR HEXCNV
         LDA HEXNUM+7
         LDY HEXNUM+6
         STA LINE+9
         STY LINE+8
         LDA SAVXY
         STA HEXNUM
         LDA #0
         STA HEXNUM+1
         JSR HEXCNV
         LDA HEXNUM+7
         LDX HEXNUM+6
         STA LINE+7
         STX LINE+6
V020     LDX #.LO.LINE
         LDY #.HI.LINE
         JSR SCRPRT
         JSR NOTE
         LDA $0700
         CMP #$53
         BEQ V021
         JSR RDFILE
         BPL V022
         JMP VEXIT
V021     LDA SECT
         CLC
         ADC CMPSIZ
         STA SECT
         LDA SECT+1
         ADC CMPSIZ+1
         STA SECT+1
         LDA SECT+2
         ADC CMPSIZ+2
         STA SECT+2
         JSR POINT
         BPL V022
         JMP VEXIT
V022     JMP V002
;
LOOKUP   LDY #0
LOOK1    CMP CRTBL,Y
         BEQ LOOK3
         PHA 
         LDA CRTBL,Y
         CMP #$FF
         BEQ LOOK5
         PLA
         INY
         INY
         INY
         BNE LOOK1
LOOK3    INY
         LDA CRTBL,Y
         TAX 
         LDA CRTBL+1,Y
         TAY 
         CLC 
         RTS 
LOOK5    PLA 
         SEC 
         RTS 

LOCERR .BYTE "Error During Locate",$9B

RDFILE   NOP
RDAR01   LDA CMPSIZ
         ORA CMPSIZ+1
         ORA CMPSIZ+2
         BNE RDAR02
         RTS         ;All done
;
RDAR02   LDA CMPSIZ+2
         BNE RDAR05
         LDA BUFLEN+1
         CMP CMPSIZ+1
         BCC RDAR05  ;Read buffer size
         BEQ RDAR03
         BCS RDAR04
RDAR03   LDA BUFLEN
         CMP CMPSIZ
         BCC RDAR05
RDAR04   LDA CMPSIZ      ;READ CMP FILE
         STA LEN
         LDA CMPSIZ+1
         STA LEN+1
         JMP RDAR10
RDAR05   LDA BUFLEN
         STA LEN
         LDA BUFLEN+1
         STA LEN+1
;
RDAR10   LDX #D
         JSR BGET
         BPL RDAR11
         LDX #.LO.LOCERR
         LDY #.HI.LOCERR
         JSR SCRPRT
         LDY #$88
         RTS
;
RDAR11   LDA CMPSIZ
         SEC 
         SBC LEN
         STA CMPSIZ
         LDA CMPSIZ+1
         SBC LEN+1
         STA CMPSIZ+1
         LDA CMPSIZ+2
         SBC #0
         STA CMPSIZ+2
         JMP RDAR01
