 .PAGE 'ERPROC'
; ERROR PROCESSING 
 .SKIP
; CONTROLLER ERRORS
;  0  (1)  NO ERROR
; 20  (2)  CAN'T FIND BLOCK HEADER
; 21  (3)  NO SYNCH CHARACTER
; 22  (4)  DATA BLOCK NOT PRESENT
; 23  (5)  CHECKSUM ERROR IN DATA
; 24  (16) BYTE DECODING ERROR
; 25  (7)  WRITE-VERIFY ERROR
; 26  (8)  WRITE W/ WRITE PROTECT ON
; 27  (9)  CHECKSUM ERROR IN HEADER
; 28  (10) DATA EXTENDS INTO NEXT BLOCK
; 29  (11) DISK I.D. MISMATCH
 .SKIP
; COMMAND ERRORS
; 30  GENERAL SYNTAX
; 31  INVALID COMMAND
; 32  LONG LINE
; 33  INVALID FILNAME
; 34  NO FILE GIVEN
 .SKIP
; 50  RECORD NOT PRESENT
; 51  OVERFLOW IN RECORD
; 52  FILE TOO LARGE
 .SKIP
; 60  FILE OPEN FOR WRITE
; 61  FILE NOT OPEN
; 62  FILE NOT FOUND
; 63  FILE EXISTS
; 64  FILE TYPE MISMATCH
; 65  NO BLOCK
; 66  ILLEGAL TRACK OR SECTOR
; 67  ILLEGAL SYSTEM T OR S
 .SKIP
; 70  NO CHANNELS AVAILABLE
; 71  DIRECTORY ERROR
; 72  DISK FULL
; 73  CBM DOS V2
 .SKIP
;  1  FILES SCRATCHED RESPONSE
 .SKIP2
BADSYN =$30
BADCMD =$31
LONGLN =$32
BADFN =$33
NOFILE =$34
NOREC =$50
RECOVF =$51
BIGFIL =$52
FILOPN =$60
FILNOP =$61
FLNTFD =$62
FLEXST =$63
MISTYP =$64
NOBLK =$65
BADTS =$66
NOCHNL =$70
DIRERR =$71
DSKFUL =$72
CBMV2 =$73
 .PAGE
; ERROR MESSAGE TABLE
;   LEADING ERRROR NUMBERS,
;   TEXT WITH 1ST & LAST CHARS 
;   OR'ED WITH $80,
;   TOKENS FOR KEY WORDS ARE
;   LESS THAN $10 (AND'ED W/ $80)
 .SKIP 2
ERRTAB ;" OK"
 .BYT 0,$A0,'O',$CB
;"READ ERROR"
 .BYT $20,$21,$22,$23,$24,$27
 .BYT $D2,'EAD',$89
;" FILE TOO LARGE"
 .BYTE $52,$83,' TOO LARG',$C5
;" RECORD NOT PRESENT"
 .BYTE $50,$8B,6,' PRESEN',$D4
;"OVERFLOW IN RECORD"
 .BYTE $51,$CF,'VERFLOW '
 .BYTE 'IN',$8B
;" WRITE ERROR"
 .BYT $25,$28,$8A,$89
;" WRITE PROTECT ON"
 .BYT $26,$8A,' PROTECT O',$CE
;" DISK ID MISMATCH"
 .BYT $29,$88,' ID',$85
;"SYNTAX ERROR"
 .BYT $30,$31,$32,$33,$34
 .BYT $D3,'YNTAX',$89
;" WRITE FILE OPEN"
 .BYT $60,$8A,3,$84
;" FILE EXISTS"
 .BYT $63,$83,' EXIST',$D3
;" FILE TYPE MISMATCH"
 .BYT $64,$83,' TYPE',$85
;"NO BLOCK"
 .BYT $65,$CE,'O BLOC',$CB
;"ILLEGAL TRACK OR SECTOR"
.BYTE $66,$67,$C9,'LLEGAL TRACK'
.BYTE ' OR SECTO',$D2
;" FILE NOT OPEN"
 .BYT $61,$83,6,$84
;" FILE NOT FOUND"
 .BYT $62,$83,6,$87
;" FILES SCRATCHED"
 .BYT 1,$83,'S SCRATCHE',$C4
;"NO CHANNEL"
 .BYT $70,$CE,'O CHANNE',$CC
;"DIR ERROR"
 .BYT $71,$C4,'IR',$89
;" DISK FULL"
 .BYT $72,$88,' FUL',$CC
;"CBM DOS V2"
.BYTE $73,$C3,'BM DOS V',$B2
 .SKIP
ERRTOK =*-ERRTAB
; ERROR TOKEN KEY WORDS
;   WORDS USED MORE THAN ONCE
;"ERROR"
 .BYT 9,$C5,'RRO',$D2
;"WRITE"
 .BYT $A,$D7,'RIT',$C5
;"FILE"
 .BYT 3,$C6,'IL',$C5
;"OPEN"
 .BYT 4,$CF,'PE',$CE
;"MISMATCH"
 .BYT 5,$CD,'ISMATC',$C8
;"NOT"
 .BYT 6,$CE,'O',$D4
;"FOUND"
 .BYT 7,$C6,'OUN',$C4
;"DISK"
 .BYT 8,$C4,'IS',$CB
;"RECORD"
.BYTE $B,$D2,'ECOR',$C4
ERREND =*-ERRTAB
 .PAGE
;RECURSIVE (2) ERROR MESSAGE ROUTINE
MOVERR CMP ERRTAB,X ;.A=BCD ERROR # 
 BEQ MER5
 INX
 CPX #ERREND
 BCC MOVERR
 RTS
 .SKIP
MER5 INX ;SKIP PAST ERROR #'S
 LDA ERRTAB,X
 BPL MER5
 AND #$7F
MER6 CMP #$10
 BCC MER70 ;TOKEN
 STA (CB+2),Y ;STORE CHARACTER
 INY
MER65 INX
 LDA ERRTAB,X
 BPL MER6
 PHA ;LAST CHARACTER
 AND #$7F
 CMP #$10
 BCC MER7 ;TOKEN
 STA (CB+2),Y
 INY
 PLA
 RTS
 .SKIP
MER70 PHA ;TOKEN PROCESS
MER7 PHA
 LDA #$20
 STA (CB+2),Y ;IMPLIED LEADING SPACE
 INY
 PLA
 STX TEMP+3
 LDX #ERRTOK
 JSR MOVERR ;RECURSIVE FOR TOKENS
 LDX TEMP+3
 PLA
 BPL MER65
 RTS
 .SKIP2
; CONTROLLER ERROR ENTRY
;   .A= ERROR #
;   .X= JOB #
ERROR PHA
 STX JOBNUM
 TXA
 ASL A
 ASL A
 ASL A
 TAX
 LDA HDRS+2,X ;RECALL TRACK,SECTOR
 STA TRACK
 LDA HDRS+3,X
 STA SECTOR
 .SKIP
 PLA
 AND #$F ;CONVERT CONTROLLER...
 BNE ERR1 ;...ERRORS TO DOS ERRORS
 LDA #6 ;CODE=16-->14
ERR1 ORA #$20
 TAX
 DEX
 DEX
 TXA
 PHA
 LDA CMDNUM
 CMP #VAL
 BNE ERR2
 LDA #$FF
 STA CMDNUM
 PLA
 JSR ERRMSG
 JSR INITDR ;INIT FOR VALIDATE
 JMP CMDER3
ERR2
 PLA
CMDER2
 JSR ERRMSG
CMDER3
 JSR CLRCB ;CLEAR CMDBUF
 LDA #0
 STA ERWORD ;CLEAR AFTER ERROR
 LDA PBD2 ;SET ERROR LED
 ORA #ERRLED
 STA PBD2
 JSR FREICH ;FREE INTERNAL CHANNEL
 LDA #0 ;CLEAR POINTERS
 STA BUFTAB+CBPTR
 LDX #$FF
 TXS ; PURGE STACK
 LDA ORGSA
 AND #$1F
 STA SA
 CMP #$F
 BEQ ERR10
 SEI
 LDA LSNACT
 BNE LSNERR
 LDA TLKACT
 BEQ ERR10
 .SKIP
; TALKER ERROR RECOVERY
;  IF COMMAND CHANNEL, RELEASE DAV
;  IF DATA CHANNEL, FORCE NOT READY
;   AND RELEASE CHANNEL
TLKERR
 JSR FNDRCH
 LDA PAD2
 ORA #DAVO
 STA PAD2
 BNE TLERR ;FINISH
 .SKIP
; LISTENER ERROR RECOVERY
;  IF COMMAND CHANNEL, RELEASE RFD
;  IF DATA CHANNEL, FORCE NOT READY
;   AND RELEASE CHANNEL
LSNERR
 JSR FNDWCH
 LDA #RFDO
 ORA PAD2
 AND #$FE
 STA PAD2
TLERR
 JSR TYPFIL
 BCS ERR10
 JSR FRECHN
ERR10
 JMP IDLE
 .SKIP2
; CONVERT HEX TO BCD
HEXDEC TAX
 LDA #0
 SED
HEX0 CPX #0
 BEQ HEX5
 CLC
 ADC #1
 DEX
 JMP HEX0
HEX5 CLD
 .SKIP
; CONVERT BCD TO ASCII DEC
;  RETURN BCD IN .X
;  STORE ASCII IN (TEMP)Y
BCDDEC TAX
 LSR A
 LSR A
 LSR A
 LSR A
 JSR BCD2
 TXA
BCD2
 AND #$F
 ORA #$30
 STA (CB+2)Y
 INY
 RTS
 .SKI
; TRANSFER ERROR MESSAGE TO
;  ERROR BUFFER
OKERR
 JSR ERROFF
 LDA #0
;
ERRTS0
 LDY #0
 STY TRACK
 STY SECTOR
;
ERRMSG
 LDY #0
 LDX #<ERRBUF
 STX CB+2
 LDX #>ERRBUF
 STX CB+3
 JSR BCDDEC ;CONVERT ERROR #
 LDA #',
 STA (CB+2),Y
 INY
 LDA ERRBUF
 STA CHNDAT+ERRCHN
 TXA ;ERROR # IN .X
 LDX #0
 JSR MOVERR ;MOVE MESSAGE
 .SKIP
ERMSG2 LDA #',
 STA (CB+2),Y
 INY
 LDA TRACK
 JSR HEXDEC ;CONVERT TRACK #
 LDA #',
 STA (CB+2),Y
 INY
 LDA SECTOR ;CONVERT SECTOR #
 JSR HEXDEC
 DEY
 TYA
 CLC
 ADC #<ERRBUF
 STA LSTCHR+ERRCHN ;SET LAST CHAR
 INC CB+2
 LDA #RDYTLK
 STA CHNRDY+ERRCHN
 RTS
.END
