Improved LOADFILE error handling

This commit is contained in:
Bobbi Webber-Manners 2021-07-17 13:15:28 -04:00
parent 28f7d31491
commit 7bb65cdca8
2 changed files with 48 additions and 34 deletions

Binary file not shown.

View File

@ -203,8 +203,9 @@ RESET TSX
RTS RTS
* ProDOS file handling for MOS OSFILE LOAD call * ProDOS file handling for MOS OSFILE LOAD call
* Return A=0 if file not found * Return A=0 if successful
* A=1 if file found * A=1 if file not found
* A=2 if read error
LOADFILE LDX $0100 ; Recover SP LOADFILE LDX $0100 ; Recover SP
TXS TXS
LDA $C081 ; Gimme the ROM! LDA $C081 ; Gimme the ROM!
@ -216,14 +217,16 @@ LOADFILE LDX $0100 ; Recover SP
LDA #>MOSFILE LDA #>MOSFILE
STA OPENPL+2 STA OPENPL+2
JSR OPENFILE JSR OPENFILE
BCS :NOTFOUND ; File not found error BCS :NOTFND ; File not found
:L1 LDA OPENPL+5 ; File ref number :L1 LDA OPENPL+5 ; File ref number
STA READPL+1 STA READPL+1
JSR RDBLK JSR RDBLK
BCS :EOF ; Assume only poss error is EOF BCC :S1
CMP #$4C ; EOF
BEQ :EOF
BRA :READERR
LDA #<RDBUF :S1 LDA #<RDBUF
STA A1L STA A1L
LDA #>RDBUF LDA #>RDBUF
STA A1H STA A1H
@ -238,12 +241,12 @@ LOADFILE LDX $0100 ; Recover SP
LDA FBEXEC+1 LDA FBEXEC+1
LDX BLOCKS LDX BLOCKS
:L2 CPX #$00 :L2 CPX #$00
BEQ :S1 BEQ :S2
INC INC
INC INC
DEX DEX
BRA :L2 BRA :L2
:S1 STA A4H :S2 STA A4H
SEC ; Main -> AUX SEC ; Main -> AUX
JSR AUXMOVE JSR AUXMOVE
@ -251,18 +254,17 @@ LOADFILE LDX $0100 ; Recover SP
INC BLOCKS INC BLOCKS
BRA :L1 BRA :L1
:NOTFOUND :NOTFND LDA #$01 ; Nothing found
LDA #$00 ; Nothing found
PHA PHA
BRA :EXIT BRA :EXIT
:EOF :READERR LDA #$02 ; Read error
LDA #$01 ; File found
PHA PHA
BRA :EOF2
LDA OPENPL+1 ; File ref num :EOF LDA #$00 ; Success
PHA
:EOF2 LDA OPENPL+1 ; File ref num
STA CLSPL+5 STA CLSPL+5
JSR CLSFILE JSR CLSFILE
:EXIT LDA $C08B ; R/W RAM, bank 1 :EXIT LDA $C08B ; R/W RAM, bank 1
LDA $C08B LDA $C08B
LDA #<OSFILERET ; Return to caller in aux LDA #<OSFILERET ; Return to caller in aux
@ -315,10 +317,10 @@ SAVEFILE LDX $0100 ; Recover SP
SEC ; Compute file length SEC ; Compute file length
LDA FBEND LDA FBEND
SBC FBSTRT SBC FBSTRT
STA LEN STA :LEN
LDA FBEND+1 LDA FBEND+1
SBC FBSTRT+1 SBC FBSTRT+1
STA LEN+1 STA :LEN+1
:L1 LDA FBSTRT ; Setup for first block :L1 LDA FBSTRT ; Setup for first block
STA A1L STA A1L
@ -344,13 +346,13 @@ SAVEFILE LDX $0100 ; Recover SP
:FWD1 BRA :CANTOPEN ; Forwarding call from above :FWD1 BRA :CANTOPEN ; Forwarding call from above
:S1 LDA LEN+1 ; MSB of length remaining :S1 LDA :LEN+1 ; MSB of length remaining
CMP #$02 CMP #$02
BCS :S2 ; MSB of len >= 2 (not last) BCS :S2 ; MSB of len >= 2 (not last)
CMP #$00 ; If no bytes left ... CMP #$00 ; If no bytes left ...
BNE :S3 BNE :S3
LDA LEN LDA :LEN
BNE :S3 BNE :S3
BRA :NORMALEND BRA :NORMALEND
@ -358,9 +360,9 @@ SAVEFILE LDX $0100 ; Recover SP
STA A2L STA A2L
LDA FBEND+1 LDA FBEND+1
STA A2H STA A2H
LDA LEN LDA :LEN
STA WRITEPL+4 ; Remaining bytes to write STA WRITEPL+4 ; Remaining bytes to write
LDA LEN+1 LDA :LEN+1
STA WRITEPL+5 STA WRITEPL+5
:S2 LDA #<RDBUF :S2 LDA #<RDBUF
@ -383,12 +385,12 @@ SAVEFILE LDX $0100 ; Recover SP
:UPDLEN :UPDLEN
SEC ; Update length remaining SEC ; Update length remaining
LDA LEN LDA :LEN
SBC WRITEPL+4 SBC WRITEPL+4
STA LEN STA :LEN
LDA LEN+1 LDA :LEN+1
SBC WRITEPL+5 SBC WRITEPL+5
STA LEN+1 STA :LEN+1
BRA :ENDLOOP BRA :ENDLOOP
:CANTOPEN :CANTOPEN
@ -398,14 +400,15 @@ SAVEFILE LDX $0100 ; Recover SP
LDA OPENPL+1 ; File ref num LDA OPENPL+1 ; File ref num
STA CLSPL+5 STA CLSPL+5
JSR CLSFILE JSR CLSFILE
:WERR2 LDA #$02 ; Write error LDA #$02 ; Write error
BRA :EXIT BRA :EXIT
:NORMALEND :NORMALEND
LDA OPENPL+1 ; File ref num LDA OPENPL+1 ; File ref num
STA CLSPL+5 STA CLSPL+5
JSR CLSFILE JSR CLSFILE
BCS :WERR2 ; Catch error during close
LDA #$00 ; Success! LDA #$00 ; Success!
BCC :EXIT ; If close OK
LDA #$02 ; Write error
:EXIT PHA :EXIT PHA
LDA $C08B ; R/W RAM, bank 1 LDA $C08B ; R/W RAM, bank 1
LDA $C08B LDA $C08B
@ -417,7 +420,7 @@ SAVEFILE LDX $0100 ; Recover SP
SEC SEC
BIT $FF58 BIT $FF58
JMP XFER JMP XFER
LEN DW $0000 :LEN DW $0000
* Create disk file * Create disk file
CRTFILE JSR MLI CRTFILE JSR MLI
@ -910,24 +913,35 @@ OSFILERET
CPY #$FF ; LOAD CPY #$FF ; LOAD
BNE :S4 BNE :S4
CMP #$00 ; No file found CMP #$01 ; No file found
BNE :EXIT BNE :SL1
BRK BRK
DB $D6 ; Error number DB $D6 ; Error number ?? TBD
ASC 'File not found' ASC 'File not found'
BRK BRK
LDA #$00 ; Return code - no file
BRA :EXIT
:SL1 CMP #$02 ; Read error
BNE :SL2
BRK
DB $D6 ; Error number
ASC 'Read error'
BRK
LDA #$01 ; Return code - file found
BRA :EXIT
:SL2 LDA #$01 ; Return code - file found
BRA :EXIT BRA :EXIT
:S4 CPY #$00 ; SAVE :S4 CPY #$00 ; SAVE
BNE :EXIT BNE :S6
CMP #$01 ; Unable to create or open CMP #$01 ; Unable to create or open
BNE :S5 BNE :SS1
BRK BRK
DB $D5 ; Error number ?? TBD DB $D5 ; Error number ?? TBD
ASC 'Create error' ASC 'Create error'
BRK BRK
BRA :S6 BRA :S6
:S5 CMP #$02 ; Unable to write :SS1 CMP #$02 ; Unable to write
BNE :S6 BNE :S6
BRK BRK
DB $D5 ; Error number ?? TBD DB $D5 ; Error number ?? TBD