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
* 20-Sep-2021 *FREE uses new PRDECIMAL routine
* 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
FSXREG EQU $B0
FSYREG EQU $B1
FSAREG EQU $B2
FSCTRL EQU FSXREG
FSPTR1 EQU $B4
FSPTR2 EQU $B6
* $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
; 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
FINDHND PHX
@ -45,16 +38,16 @@ FINDHND PHX
JSR PARSNAME ; Copy filename->MOSFILE
PLA ; Recover options
>>> XF2MAIN,OFILE
:CLOSE >>> WRTMAIN
STY MOSFILE ; Write file number
>>> WRTAUX
>>> XF2MAIN,CFILE
OSFINDRET
>>> ENTAUX
:CLOSE
* >>> WRTMAIN
* STY MOSFILE ; Write file number
* >>> WRTAUX
>>> XF2MAIN,CFILE ; Pass A,Y to main code
OSFINDRET >>> ENTAUX
JSR CHKERROR ; Check if error returned
PLY ; Value of A on entry
CPY #$00 ; Was it close?
BNE :S1
BNE :S1 ; It wasn't close
TYA ; Preserve A for close
:S1 PLY
PLX
@ -71,12 +64,12 @@ OSGBPBM ASC 'OSGBPB.'
BPUTHND PHX
PHY
PHA ; Stash char to write
>>> WRTMAIN
STY MOSFILE ; File reference number
>>> WRTAUX
>>> XF2MAIN,FILEPUT
OSBPUTRET
>>> ENTAUX
* >>> WRTMAIN
* STY MOSFILE ; File reference number
* >>> WRTAUX
>>> XF2MAIN,FILEPUT ; Pass A,Y to main code
OSBPUTRET >>> ENTAUX
JSR CHKERROR
CLC ; Means no error
PLA
PLY
@ -86,18 +79,18 @@ OSBPUTRET
* OSBGET - read one byte from an open file
BGETHND PHX
PHY
>>> WRTMAIN
STY MOSFILE ; File ref number
>>> WRTAUX
>>> XF2MAIN,FILEGET
OSBGETRET
>>> ENTAUX
CLC ; Means no error
CPY #$00 ; Check error status
BEQ :NOERR
SEC ; Set carry for error
BRA :EXIT
:NOERR CLC
* >>> WRTMAIN
* STY MOSFILE ; File ref number
* >>> WRTAUX
>>> XF2MAIN,FILEGET ; Pass A,Y to main code
OSBGETRET >>> ENTAUX
CPY #$01
BCC :EXIT ; If no error, return CC
LDA #$FE
CPY #$4C
BEQ :EXIT ; If at EOF, return CS
TYA
JSR CHKERROR
:EXIT PLY
PLX
RTS
@ -146,41 +139,45 @@ ARGSHND PHX
:S2 CMP #$FF ; Y=0,A=FF => flush all files
BNE :IEXIT
>>> WRTMAIN
STZ MOSFILE ; Zero means flush all
>>> WRTAUX
* >>> WRTMAIN
* STZ MOSFILE ; Zero means flush all
* >>> WRTAUX
JMP :FLUSH
:IEXIT JMP :EXIT ; Exit preserved
:HASFILE >>> WRTMAIN
STY MOSFILE ; File ref num
STX MOSFILE+1 ; Pointer to ZP control block
>>> WRTAUX
:HASFILE
* >>> WRTMAIN
* STY MOSFILE ; File ref num
* STX MOSFILE+1 ; Pointer to ZP control block
* >>> WRTAUX
CMP #$00 ; Y!=0,A=0 => read seq ptr
BNE :S3
>>> WRTMAIN
STZ MOSFILE+2 ; 0 means get pos
>>> WRTAUX
>>> XF2MAIN,TELL
* >>> WRTMAIN
* STZ MOSFILE+2 ; 0 means get pos
* >>> WRTAUX
TXA
>>> XF2MAIN,TELL ; A=ZP, Y=channel
:S3 CMP #$01 ; Y!=0,A=1 => write seq ptr
BNE :S4
>>> WRTMAIN
STY GMARKPL+1 ; Write to MLI control block
LDA $00,X
STA MOSFILE+2
STA GMARKPL+2
LDA $01,X
STA MOSFILE+3
STA GMARKPL+3
LDA $02,X
STA MOSFILE+4
STA GMARKPL+4
>>> WRTAUX
>>> XF2MAIN,SEEK
>>> XF2MAIN,SEEK ; A=???, Y=channel
:S4 CMP #$02 ; Y!=0,A=2 => read file len
BNE :S5
>>> WRTMAIN
STA MOSFILE+2 ; Non-zero means get len
>>> WRTAUX
>>> XF2MAIN,TELL
* >>> WRTMAIN
* STA MOSFILE+2 ; Non-zero means get len
* >>> WRTAUX
TXA
>>> XF2MAIN,SIZE ; A=ZP, Y=channel
:S5 CMP #$FF ; Y!=0,A=FF => flush file
BNE :EXIT
@ -192,6 +189,7 @@ ARGSHND PHX
RTS
OSARGSRET >>> ENTAUX
JSR CHKERROR
OSARGSDONE PLA
LDA #0 ; Implemented
PLY
@ -425,14 +423,17 @@ FSCCHDIR JMP CHDIR
* Performs OSFSC Read EOF function
* File ref number is in X
CHKEOF >>> WRTMAIN
STX MOSFILE ; File reference number
>>> WRTAUX
CHKEOF
* >>> WRTMAIN
* STX MOSFILE ; File reference number
* >>> WRTAUX
TXA ; A=channel
>>> XF2MAIN,FILEEOF
CHKEOFRET
>>> ENTAUX
CHKEOFRET >>> ENTAUX
TAX ; Return code -> X
RTS
TYA ; Y=any ProDOS error
JMP CHKERROR
* Perform CAT
* A=5 *CAT, A=9 *EX, A=10 *INFO
@ -867,7 +868,7 @@ ERRHEX1
ERRMSG
BRK
DB $FF
ASC 'TEST: $00'
ASC 'ERR: $00'
BRK
MKERROR1
CMP #$40

View File

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