Merge PR #120 'Updated BGET, BPUT, ARGS, EOF'

This commit is contained in:
Bobbi Webber-Manners 2021-10-13 12:44:43 -04:00
parent 70ff049987
commit 6b0c3fa327
3 changed files with 148 additions and 127 deletions

Binary file not shown.

View File

@ -9,31 +9,24 @@
* Command line set by *RUN, and read by OSARGS * Command line set by *RUN, and read by OSARGS
* 20-Sep-2021 *FREE uses new PRDECIMAL routine * 20-Sep-2021 *FREE uses new PRDECIMAL routine
* 12-Oct-2021 OSFIND checks return value from calling maincode. * 12-Oct-2021 OSFIND checks return value from calling maincode.
* 12-Oct-2021 BGET and BPUT check for returned error.
* 13-Oct-2021 FIND, BGET, BPUT optimised passing registers to main.
* 13-Oct-2021 ARGS, EOF returns errors, optimised passing registers.
* $B0-$BF Temporary filing system workspace * $B0-$BF Temporary filing system workspace
FSXREG EQU $B0
FSYREG EQU $B1
FSAREG EQU $B2
FSCTRL EQU FSXREG
FSPTR1 EQU $B4
FSPTR2 EQU $B6
* $C0-$CF Persistant filing system workspace * $C0-$CF Persistant filing system workspace
FSNUM EQU $C8 ; *TEMP* FSXREG EQU $C0
FSYREG EQU $C1
FSAREG EQU $C2
FSZPC3 EQU $C3
FSCTRL EQU FSXREG
FSPTR1 EQU $C4
FSPTR2 EQU $C6
FSNUM EQU $C8
FSZPCC EQU $CC
FSCMDLINE EQU $CE FSCMDLINE EQU $CE
; B0-B3 addr
; B4-B7 sect
; B8-BB
; BC-BF
; C0-C3 num
; C4-C5 cblk
; C6-C7
; C8-CB
; CC-CD
; CE-CF cmd
* OSFIND - open/close a file for byte access * OSFIND - open/close a file for byte access
FINDHND PHX FINDHND PHX
@ -45,16 +38,16 @@ FINDHND PHX
JSR PARSNAME ; Copy filename->MOSFILE JSR PARSNAME ; Copy filename->MOSFILE
PLA ; Recover options PLA ; Recover options
>>> XF2MAIN,OFILE >>> XF2MAIN,OFILE
:CLOSE >>> WRTMAIN :CLOSE
STY MOSFILE ; Write file number * >>> WRTMAIN
>>> WRTAUX * STY MOSFILE ; Write file number
>>> XF2MAIN,CFILE * >>> WRTAUX
OSFINDRET >>> XF2MAIN,CFILE ; Pass A,Y to main code
>>> ENTAUX
OSFINDRET >>> ENTAUX
JSR CHKERROR ; Check if error returned JSR CHKERROR ; Check if error returned
PLY ; Value of A on entry PLY ; Value of A on entry
CPY #$00 ; Was it close? BNE :S1 ; It wasn't close
BNE :S1
TYA ; Preserve A for close TYA ; Preserve A for close
:S1 PLY :S1 PLY
PLX PLX
@ -71,12 +64,12 @@ OSGBPBM ASC 'OSGBPB.'
BPUTHND PHX BPUTHND PHX
PHY PHY
PHA ; Stash char to write PHA ; Stash char to write
>>> WRTMAIN * >>> WRTMAIN
STY MOSFILE ; File reference number * STY MOSFILE ; File reference number
>>> WRTAUX * >>> WRTAUX
>>> XF2MAIN,FILEPUT >>> XF2MAIN,FILEPUT ; Pass A,Y to main code
OSBPUTRET OSBPUTRET >>> ENTAUX
>>> ENTAUX JSR CHKERROR
CLC ; Means no error CLC ; Means no error
PLA PLA
PLY PLY
@ -86,18 +79,18 @@ OSBPUTRET
* OSBGET - read one byte from an open file * OSBGET - read one byte from an open file
BGETHND PHX BGETHND PHX
PHY PHY
>>> WRTMAIN * >>> WRTMAIN
STY MOSFILE ; File ref number * STY MOSFILE ; File ref number
>>> WRTAUX * >>> WRTAUX
>>> XF2MAIN,FILEGET >>> XF2MAIN,FILEGET ; Pass A,Y to main code
OSBGETRET OSBGETRET >>> ENTAUX
>>> ENTAUX CPY #$01
CLC ; Means no error BCC :EXIT ; If no error, return CC
CPY #$00 ; Check error status LDA #$FE
BEQ :NOERR CPY #$4C
SEC ; Set carry for error BEQ :EXIT ; If at EOF, return CS
BRA :EXIT TYA
:NOERR CLC JSR CHKERROR
:EXIT PLY :EXIT PLY
PLX PLX
RTS RTS
@ -146,41 +139,45 @@ ARGSHND PHX
:S2 CMP #$FF ; Y=0,A=FF => flush all files :S2 CMP #$FF ; Y=0,A=FF => flush all files
BNE :IEXIT BNE :IEXIT
>>> WRTMAIN * >>> WRTMAIN
STZ MOSFILE ; Zero means flush all * STZ MOSFILE ; Zero means flush all
>>> WRTAUX * >>> WRTAUX
JMP :FLUSH JMP :FLUSH
:IEXIT JMP :EXIT ; Exit preserved :IEXIT JMP :EXIT ; Exit preserved
:HASFILE >>> WRTMAIN :HASFILE
STY MOSFILE ; File ref num * >>> WRTMAIN
STX MOSFILE+1 ; Pointer to ZP control block * STY MOSFILE ; File ref num
>>> WRTAUX * STX MOSFILE+1 ; Pointer to ZP control block
* >>> WRTAUX
CMP #$00 ; Y!=0,A=0 => read seq ptr CMP #$00 ; Y!=0,A=0 => read seq ptr
BNE :S3 BNE :S3
>>> WRTMAIN * >>> WRTMAIN
STZ MOSFILE+2 ; 0 means get pos * STZ MOSFILE+2 ; 0 means get pos
>>> WRTAUX * >>> WRTAUX
>>> XF2MAIN,TELL TXA
>>> XF2MAIN,TELL ; A=ZP, Y=channel
:S3 CMP #$01 ; Y!=0,A=1 => write seq ptr :S3 CMP #$01 ; Y!=0,A=1 => write seq ptr
BNE :S4 BNE :S4
>>> WRTMAIN >>> WRTMAIN
STY GMARKPL+1 ; Write to MLI control block
LDA $00,X LDA $00,X
STA MOSFILE+2 STA GMARKPL+2
LDA $01,X LDA $01,X
STA MOSFILE+3 STA GMARKPL+3
LDA $02,X LDA $02,X
STA MOSFILE+4 STA GMARKPL+4
>>> WRTAUX >>> WRTAUX
>>> XF2MAIN,SEEK >>> XF2MAIN,SEEK ; A=???, Y=channel
:S4 CMP #$02 ; Y!=0,A=2 => read file len :S4 CMP #$02 ; Y!=0,A=2 => read file len
BNE :S5 BNE :S5
>>> WRTMAIN * >>> WRTMAIN
STA MOSFILE+2 ; Non-zero means get len * STA MOSFILE+2 ; Non-zero means get len
>>> WRTAUX * >>> WRTAUX
>>> XF2MAIN,TELL TXA
>>> XF2MAIN,SIZE ; A=ZP, Y=channel
:S5 CMP #$FF ; Y!=0,A=FF => flush file :S5 CMP #$FF ; Y!=0,A=FF => flush file
BNE :EXIT BNE :EXIT
@ -192,6 +189,7 @@ ARGSHND PHX
RTS RTS
OSARGSRET >>> ENTAUX OSARGSRET >>> ENTAUX
JSR CHKERROR
OSARGSDONE PLA OSARGSDONE PLA
LDA #0 ; Implemented LDA #0 ; Implemented
PLY PLY
@ -425,14 +423,17 @@ FSCCHDIR JMP CHDIR
* Performs OSFSC Read EOF function * Performs OSFSC Read EOF function
* File ref number is in X * File ref number is in X
CHKEOF >>> WRTMAIN CHKEOF
STX MOSFILE ; File reference number * >>> WRTMAIN
>>> WRTAUX * STX MOSFILE ; File reference number
* >>> WRTAUX
TXA ; A=channel
>>> XF2MAIN,FILEEOF >>> XF2MAIN,FILEEOF
CHKEOFRET CHKEOFRET >>> ENTAUX
>>> ENTAUX
TAX ; Return code -> X TAX ; Return code -> X
RTS TYA ; Y=any ProDOS error
JMP CHKERROR
* Perform CAT * Perform CAT
* A=5 *CAT, A=9 *EX, A=10 *INFO * A=5 *CAT, A=9 *EX, A=10 *INFO
@ -867,7 +868,7 @@ ERRHEX1
ERRMSG ERRMSG
BRK BRK
DB $FF DB $FF
ASC 'TEST: $00' ASC 'ERR: $00'
BRK BRK
MKERROR1 MKERROR1
CMP #$40 CMP #$40

View File

@ -13,6 +13,8 @@
* exits with MFI error, returns error if no more buffers, * exits with MFI error, returns error if no more buffers,
* OPENOUT doesn't try to delete if nothing to delete. * OPENOUT doesn't try to delete if nothing to delete.
* 13-Oct-2021 OSFIND implementes CLOSE#0. * 13-Oct-2021 OSFIND implementes CLOSE#0.
* 13-Oct-2021 FIND, BGET, BPUT optimised passing registers to main.
* 13-Oct-2021 ARGS, EOF returns errors, optimised.
INFOFILE >>> ENTMAIN INFOFILE >>> ENTMAIN
@ -283,6 +285,7 @@ COPY1FILE LDA #<MOSFILE
:BUFIDX1 DB $00 :BUFIDX1 DB $00
:BUFIDX2 DB $00 :BUFIDX2 DB $00
* ProDOS file handling for MOS OSFIND OPEN call * ProDOS file handling for MOS OSFIND OPEN call
* Options in A: $40 'r', $80 'w', $C0 'rw' * Options in A: $40 'r', $80 'w', $C0 'rw'
OFILE >>> ENTMAIN OFILE >>> ENTMAIN
@ -356,7 +359,8 @@ BUFIDX DB $00
* ProDOS file handling for MOS OSFIND CLOSE call * ProDOS file handling for MOS OSFIND CLOSE call
CFILE >>> ENTMAIN CFILE >>> ENTMAIN
LDX #$00 ; Prepare for one file LDX #$00 ; Prepare for one file
LDA MOSFILE ; File ref number * LDA MOSFILE ; File ref number
TYA ; File ref number
BNE :CFILE1 ; Close one file BNE :CFILE1 ; Close one file
LDX #$03 ; Loop through all files LDX #$03 ; Loop through all files
:CFILE0 LDA FILEREFS,X :CFILE0 LDA FILEREFS,X
@ -383,15 +387,15 @@ CFILE >>> ENTMAIN
* ProDOS file handling for MOS OSBGET call * ProDOS file handling for MOS OSBGET call
* Returns with char read in A and error num in Y (or 0) * Returns with char read in A and error num in Y (or 0)
FILEGET >>> ENTMAIN FILEGET >>> ENTMAIN
LDA MOSFILE ; File ref number * LDA MOSFILE ; File ref number
STA READPL2+1 * STA READPL2+1
STY READPL2+1 ; File ref number
JSR MLI JSR MLI
DB READCMD DB READCMD
DW READPL2 DW READPL2
BCC :NOERR
TAY ; Error number in Y TAY ; Error number in Y
BRA :EXIT BCS :EXIT
:NOERR LDY #$00 LDY #$00 ; 0=Ok
LDA BLKBUF LDA BLKBUF
:EXIT >>> XF2AUX,OSBGETRET :EXIT >>> XF2AUX,OSBGETRET
@ -399,87 +403,101 @@ FILEGET >>> ENTMAIN
* Enters with char to write in A * Enters with char to write in A
FILEPUT >>> ENTMAIN FILEPUT >>> ENTMAIN
STA BLKBUF ; Char to write STA BLKBUF ; Char to write
* LDA MOSFILE ; File ref number
LDA MOSFILE ; File ref number * STA WRITEPL+1
STA WRITEPL+1 STY WRITEPL+1 ; File ref number
LDA #$01 ; Bytes to write LDA #$01 ; Bytes to write
STA WRITEPL+4 STA WRITEPL+4
LDA #$00 LDA #$00
STA WRITEPL+5 STA WRITEPL+5
JSR WRTFILE JSR WRTFILE
>>> XF2AUX,OSBPUTRET BCS :FILEPUT2
LDA #$00 ; 0=Ok
:FILEPUT2 >>> XF2AUX,OSBPUTRET
* ProDOS file handling for OSBYTE $7F EOF * ProDOS file handling for OSBYTE $7F EOF
* Returns EOF status in A ($FF for EOF, $00 otherwise) * Returns EOF status in A ($FF for EOF, $00 otherwise)
* A=channel to test
FILEEOF >>> ENTMAIN FILEEOF >>> ENTMAIN
* LDA MOSFILE ; File ref number
LDA MOSFILE ; File ref number
STA GEOFPL+1 STA GEOFPL+1
STA GMARKPL+1 STA GMARKPL+1
JSR MLI JSR MLI
DB GEOFCMD DB GEOFCMD
DW GEOFPL DW GEOFPL
BCS :ISEOF ; If error, just say EOF TAY
BCS :EXIT ; Abort with any error
JSR MLI JSR MLI
DB GMARKCMD DB GMARKCMD
DW GMARKPL DW GMARKPL
BCS :ISEOF ; If error, just say EOF TAY
BCS :EXIT ; Abort with any error
LDA GEOFPL+2 ; Subtract Mark from EOF
SEC SEC
LDA GEOFPL+2 ; Subtract Mark from EOF
SBC GMARKPL+2 SBC GMARKPL+2
STA :REMAIN STA GEOFPL+2
LDA GEOFPL+3 LDA GEOFPL+3
SBC GMARKPL+3 SBC GMARKPL+3
STA :REMAIN+1 STA GEOFPL+3
LDA GEOFPL+4 LDA GEOFPL+4
SBC GMARKPL+4 SBC GMARKPL+4
STA :REMAIN+2 STA GEOFPL+4
LDA :REMAIN ; Check bytes remaining LDA GEOFPL+2 ; Check bytes remaining
BNE :NOTEOF ORA GEOFPL+3
LDA :REMAIN+1 ORA GEOFPL+4
BNE :NOTEOF BEQ :ISEOF ; EOF -> $00
LDA :REMAIN+2 LDA #$FF ; Not EOF -> $FF
BNE :NOTEOF :ISEOF EOR #$FF ; EOF -> $FF, Not EOF ->$00
:ISEOF LDA #$FF LDY #$00 ; 0=No error
BRA :EXIT
:NOTEOF LDA #$00
:EXIT >>> XF2AUX,CHKEOFRET :EXIT >>> XF2AUX,CHKEOFRET
:REMAIN DS 3 ; Remaining bytes
* ProDOS file handling for OSARGS flush commands * ProDOS file handling for OSARGS flush commands
FLUSH >>> ENTMAIN FLUSH >>> ENTMAIN
LDA MOSFILE ; File ref number * LDA MOSFILE ; File ref number
STA FLSHPL+1 * STA FLSHPL+1
STY FLSHPL+1 ; File ref number
JSR MLI JSR MLI
DB FLSHCMD DB FLSHCMD
DW FLSHPL DW FLSHPL
>>> XF2AUX,OSARGSRET >>> XF2AUX,OSARGSRET
* ProDOS file handling for OSARGS set ptr command * ProDOS file handling for OSARGS set ptr command
* GMARKPL+1=channel, GMARKPL+2,+3,+4=offset already set
SEEK >>> ENTMAIN SEEK >>> ENTMAIN
LDA MOSFILE ; File ref number * LDA MOSFILE ; File ref number
STA GMARKPL+1 ; GET_MARK has same params * STA GMARKPL+1 ; GET_MARK has same params
LDA MOSFILE+2 ; Desired offset in MOSFILE[2..4] * LDA MOSFILE+2 ; Desired offset in MOSFILE[2..4]
STA GMARKPL+2 * STA GMARKPL+2
LDA MOSFILE+3 * LDA MOSFILE+3
STA GMARKPL+3 * STA GMARKPL+3
LDA MOSFILE+4 * LDA MOSFILE+4
STA GMARKPL+4 * STA GMARKPL+4
JSR MLI JSR MLI
DB SMARKCMD DB SMARKCMD
DW GMARKPL DW GMARKPL
>>> XF2AUX,OSARGSRET JMP TELLEXIT
* >>> XF2AUX,OSARGSRET
* ProDOS file handling for OSARGS get ptr command * ProDOS file handling for OSARGS get ptr command
* and for OSARGs get length command * and for OSARGs get length command
TELL >>> ENTMAIN * A=ZP, Y=channel
LDA MOSFILE ; File ref number SIZE LDX #$02 ; $02=SIZE, Read EXT
STA GMARKPL+1 BNE TELL2
LDA MOSFILE+2 ; Mode (0=pos, otherwise len) TELL LDX #$00 ; $00=TELL, Read PTR
CMP #$00 TELL2
* >>> ENTMAIN
* LDA MOSFILE ; File ref number
* STA GMARKPL+1
* LDA MOSFILE+2 ; Mode (0=pos, otherwise len)
* CMP #$00
STY GMARKPL+1 ; File ref number
PHA ; Pointer to zero page
CPX #$00 ; OSARGS parameter
BEQ :POS BEQ :POS
JSR MLI JSR MLI
DB GEOFCMD DB GEOFCMD
@ -488,8 +506,9 @@ TELL >>> ENTMAIN
:POS JSR MLI :POS JSR MLI
DB GMARKCMD DB GMARKCMD
DW GMARKPL DW GMARKPL
:S1 LDX MOSFILE+1 ; Pointer to ZP control block :S1 PLX ; Pointer to ZP control block
BCS :ERR BCS TELLEXIT ; Exit with error
* LDX MOSFILE+1 ; Pointer to ZP control block
>>> ALTZP ; Alt ZP & Alt LC on >>> ALTZP ; Alt ZP & Alt LC on
LDA GMARKPL+2 LDA GMARKPL+2
STA $00,X STA $00,X
@ -497,17 +516,18 @@ TELL >>> ENTMAIN
STA $01,X STA $01,X
LDA GMARKPL+4 LDA GMARKPL+4
STA $02,X STA $02,X
STZ $03,X STZ $03,X ; Sizes are $00xxxxxx
>>> MAINZP ; Alt ZP off, ROM back in >>> MAINZP ; Alt ZP off, ROM back in
:EXIT >>> XF2AUX,OSARGSRET LDA #$00 ; 0=Ok
:ERR LDX MOSFILE+1 ; Address of ZP control block TELLEXIT >>> XF2AUX,OSARGSRET
>>> ALTZP ; Alt ZP & Alt LC on *:ERR LDX MOSFILE+1 ; Address of ZP control block
STZ $00,X * >>> ALTZP ; Alt ZP & Alt LC on
STZ $01,X * STZ $00,X
STZ $02,X * STZ $01,X
STZ $03,X * STZ $02,X
>>> MAINZP ; Alt ZP off, ROM back in * STZ $03,X
BRA :EXIT * >>> MAINZP ; Alt ZP off, ROM back in
* BRA :EXIT
* ProDOS file handling for MOS OSFILE LOAD call * ProDOS file handling for MOS OSFILE LOAD call