mirror of
https://github.com/bobbimanners/Applecorn.git
synced 2025-02-09 06:31:16 +00:00
Merge PR #120 'Updated BGET, BPUT, ARGS, EOF'
This commit is contained in:
parent
70ff049987
commit
6b0c3fa327
BIN
applecorn.po
BIN
applecorn.po
Binary file not shown.
143
auxmem.hostfs.s
143
auxmem.hostfs.s
@ -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
|
||||
|
132
mainmem.svc.s
132
mainmem.svc.s
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user