mirror of
https://github.com/bobbimanners/Applecorn.git
synced 2024-06-28 03:29:32 +00:00
Merge PR 134 'Updated FSC and Catalog'
This commit is contained in:
parent
8e5ca206f5
commit
00208b0248
BIN
applecorn.po
BIN
applecorn.po
Binary file not shown.
646
auxmem.hostfs.s
646
auxmem.hostfs.s
|
@ -14,6 +14,8 @@
|
|||
* 13-Oct-2021 ARGS, EOF returns errors, optimised passing registers.
|
||||
* 14-Oct-2021 Tidied FILE handler.
|
||||
* 23-Oct-2021 Uses single dispatch to mainmem FILE handler.
|
||||
* 24-Oct-2021 Tidied FSC handler. Optimised CATALOG, CAT shows access.
|
||||
* *EX can use two columns. *OPT stored.
|
||||
|
||||
|
||||
* $B0-$BF Temporary filing system workspace
|
||||
|
@ -99,6 +101,8 @@ OSBGETRET >>> ENTAUX
|
|||
|
||||
* OSARGS - adjust file arguments
|
||||
* On entry, A=action
|
||||
* X=>4 byte ZP control block
|
||||
* Y=file handle
|
||||
* Y<>0 A=FF Flush channel Y
|
||||
* A=00 Read PTR#Y
|
||||
* A=01 Write PTR#Y
|
||||
|
@ -107,8 +111,6 @@ OSBGETRET >>> ENTAUX
|
|||
* Y=0 A=FF Flush all channels
|
||||
* A=00 Return filing system number in A
|
||||
* A=01 Read command line address
|
||||
* X=>4 byte ZP control block
|
||||
* Y=file handle
|
||||
* On exit, A=0 - implemented (except ARGS 0,0)
|
||||
* A - preserved=unimplemented
|
||||
* X,Y - preserved
|
||||
|
@ -199,15 +201,16 @@ OSARGSDONE PLA
|
|||
RTS
|
||||
|
||||
|
||||
* OSFILE - perform actions on entire files
|
||||
* OSFILE - perform actions on entire files/objects
|
||||
* On entry, A=action
|
||||
* XY=>control block
|
||||
* On exit, A=preserved if unimplemented
|
||||
* A=0 object not found (not load/save)
|
||||
* A=1 file found
|
||||
* A=2 directory found
|
||||
* A=2 directory found (not load/save)
|
||||
* XY preserved
|
||||
* control block updated
|
||||
*
|
||||
OSFILEMIN EQU $FF ; $FF=LOAD
|
||||
OSFILEMAX EQU $08 ; $08=MKDIR
|
||||
|
||||
|
@ -216,7 +219,7 @@ FILEHND PHX
|
|||
PHA
|
||||
CLC
|
||||
ADC #256-OSFILEMIN
|
||||
CMP #OSFILEMAX+257-OSFILEMIN ; NB: LTR evaluation
|
||||
CMP #OSFILEMAX+257-OSFILEMIN ; NB: LtoR evaluation
|
||||
BCS FILEIGNORE
|
||||
|
||||
STX FSCTRL+0 ; FSCTRL=>control block
|
||||
|
@ -276,24 +279,20 @@ FILEIGNORE PLA ; Returned object type
|
|||
RTS
|
||||
|
||||
|
||||
OSFSCM ASC 'OSFSC.'
|
||||
DB $00
|
||||
|
||||
* FSC Command Table
|
||||
*******************
|
||||
* These are commands specific to the filing system that can't be
|
||||
* called via OSFILE, OSFSC, etc.
|
||||
*
|
||||
FSCCOMMAND ASC 'CHDIR'
|
||||
DB $C0
|
||||
DW FSCCHDIR-1 ; Change directory, XY=>params
|
||||
DB $80
|
||||
DW FSCCHDIR-1 ; Change directory, LPTR=>params
|
||||
ASC 'CD'
|
||||
DB $C0
|
||||
DW FSCCHDIR-1 ; Change directory, XY=>params
|
||||
DB $80
|
||||
DW FSCCHDIR-1 ; Change directory, LPTR=>params
|
||||
ASC 'DIR'
|
||||
DB $C0
|
||||
DW FSCCHDIR-1 ; Change directory, XY=>params
|
||||
* TO DO, CHDIR should be $80 for LPTR=>params
|
||||
DB $80
|
||||
DW FSCCHDIR-1 ; Change directory, LPTR=>params
|
||||
ASC 'DRIVE'
|
||||
DB $80
|
||||
DW FSCDRIVE-1 ; Select drive, LPTR=>params
|
||||
|
@ -310,52 +309,91 @@ FSCCOMMAND ASC 'CHDIR'
|
|||
DB $80
|
||||
DW FSCDESTROY-1 ; DESTROY <objlist>, LPTR=>params
|
||||
ASC 'COPY'
|
||||
DB $C0
|
||||
DW COPY-1 ; COPY <source> <dest>, XY=>params
|
||||
DB $80
|
||||
DW FSCCOPY-1 ; COPY <source> <dest>, LPTR=>params
|
||||
*
|
||||
DB $FF ; Terminator
|
||||
|
||||
* FSC Dispatch Table
|
||||
********************
|
||||
FSCDISPATCH DW FSCOPT-1 ; A=0 - *OPT
|
||||
DW CHKEOF-1 ; A=1 - Read EOF
|
||||
DW FSCRUN-1 ; A=2 - */filename
|
||||
DW FSC03-1 ; A=3 - *command
|
||||
DW FSCRUN-1 ; A=4 - *RUN
|
||||
DW FSCCAT-1 ; A=5 - *CAT
|
||||
DW FSCUKN-1 ; A=6
|
||||
DW FSCUKN-1 ; A=7
|
||||
DW FSCUKN-1 ; A=8
|
||||
DW FSCCAT-1 ; A=9 - *EX
|
||||
DW FSCCAT-1 ; A=10 - *INFO
|
||||
DW FSCUKN-1 ; A=11
|
||||
DW FSCRENAME-1 ; A=12 - *RENAME
|
||||
|
||||
* OSFSC - miscellanous file system calls
|
||||
*****************************************
|
||||
* On entry, A=action, XY=>command line
|
||||
* or A=action, X=param1, Y=param2
|
||||
* On exit, A=preserved if unimplemented
|
||||
* A=modified if implemented
|
||||
* A=0 if implemented
|
||||
* X,Y=any return values
|
||||
*
|
||||
FSCHND
|
||||
CMP #$00
|
||||
BEQ FSOPT ; A=0 - *OPT
|
||||
CMP #$01
|
||||
BEQ CHKEOF ; A=1 - Read EOF
|
||||
CMP #$02
|
||||
BEQ FSCRUN ; A=2 - */filename
|
||||
CMP #$03
|
||||
BEQ FSC03 ; A=3 - *command
|
||||
CMP #$04
|
||||
BEQ FSCRUN ; A=4 - *RUN
|
||||
CMP #$05
|
||||
BEQ JMPCAT ; A=5 - *CAT
|
||||
CMP #$09
|
||||
BEQ JMPCAT ; A=9 - *EX
|
||||
CMP #$0A
|
||||
BEQ JMPCAT ; A=10 - *INFO
|
||||
CMP #$0C
|
||||
BEQ FSCREN ; A=12 - *RENAME
|
||||
FSCHND CMP #13
|
||||
BCS FSCUKN
|
||||
STA FSAREG
|
||||
STX FSXREG
|
||||
STY FSYREG
|
||||
ASL A
|
||||
TAX
|
||||
LDA FSCDISPATCH+1,X
|
||||
PHA
|
||||
LDA FSCDISPATCH+0,X
|
||||
PHA
|
||||
LDX FSXREG
|
||||
LDA FSAREG
|
||||
RTS
|
||||
|
||||
* Performs OSFSC *OPT function
|
||||
FSOPT RTS ; No FS options for now
|
||||
* CMP #$00
|
||||
* BEQ FSOPT ; A=0 - *OPT
|
||||
* CMP #$01
|
||||
* BEQ CHKEOF ; A=1 - Read EOF
|
||||
* CMP #$02
|
||||
* BEQ FSCRUN ; A=2 - */filename
|
||||
* CMP #$03
|
||||
* BEQ FSC03 ; A=3 - *command
|
||||
* CMP #$04
|
||||
* BEQ FSCRUN ; A=4 - *RUN
|
||||
* CMP #$05
|
||||
* BEQ JMPCAT ; A=5 - *CAT
|
||||
* CMP #$09
|
||||
* BEQ JMPCAT ; A=9 - *EX
|
||||
* CMP #$0A
|
||||
* BEQ JMPCAT ; A=10 - *INFO
|
||||
* CMP #$0C
|
||||
* BEQ FSCREN ; A=12 - *RENAME
|
||||
|
||||
FSCDRIVE JMP DRIVE
|
||||
* OSFSC 00 - *OPT function
|
||||
FSCOPT TXA
|
||||
BEQ :OPT0
|
||||
LDA FSFLAG2
|
||||
AND :OPTMSK-1,X
|
||||
EOR :OPTSET-0,Y
|
||||
AND :OPTMSK-1,X
|
||||
EOR :OPTSET-0,Y
|
||||
:OPT0 STA FSFLAG2
|
||||
:OPTNULL RTS
|
||||
:OPTMSK DB $3F,$CF,$F3,$FC
|
||||
:OPTSET DB $00,$55,$AA,$FF
|
||||
|
||||
FSCFREE JMP FREE
|
||||
|
||||
FSCACCESS JMP ACCESS
|
||||
|
||||
FSCDESTROY JMP DESTROY
|
||||
|
||||
FSCTITLE
|
||||
*FSCDRIVE JMP DRIVE
|
||||
*
|
||||
*FSCFREE JMP FREE
|
||||
*
|
||||
*FSCACCESS JMP ACCESS
|
||||
*
|
||||
*FSCDESTROY JMP DESTROY
|
||||
*
|
||||
*JMPCAT JMP FSCCAT
|
||||
|
||||
FSCUKN PHA
|
||||
LDA #<OSFSCM
|
||||
|
@ -363,15 +401,37 @@ FSCUKN PHA
|
|||
JSR PRSTR
|
||||
PLA
|
||||
FSCNULL RTS
|
||||
OSFSCM ASC 'OSFSC.'
|
||||
DB $00
|
||||
|
||||
JMPCAT JMP FSCCAT
|
||||
|
||||
* OSFSC 01 - Read EOF function
|
||||
* X=File ref number
|
||||
*
|
||||
CHKEOF
|
||||
* >>> WRTMAIN
|
||||
* STX MOSFILE ; File reference number
|
||||
* >>> WRTAUX
|
||||
TXA ; A=channel
|
||||
>>> XF2MAIN,FILEEOF
|
||||
CHKEOFRET >>> ENTAUX
|
||||
TAX ; Return code -> X
|
||||
TYA ; Y=any ProDOS error
|
||||
JMP CHKERROR
|
||||
|
||||
|
||||
* OSFSC 03 - *command, fall back to *RUN command
|
||||
* XY=>command line
|
||||
*
|
||||
FSC03 JSR XYtoLPTR
|
||||
LDX #<FSCCOMMAND
|
||||
LDY #>FSCCOMMAND
|
||||
JSR CLILOOKUP
|
||||
BEQ FSCNULL
|
||||
JSR LPTRtoXY
|
||||
BEQ FSCNULL ; Matched, return
|
||||
JSR LPTRtoXY ; Fall through to *RUN
|
||||
|
||||
* OSFSC 04 - *RUN filename
|
||||
* XY=>pathname
|
||||
*
|
||||
FSCRUN STX OSFILECB ; Pointer to filename
|
||||
STY OSFILECB+1
|
||||
|
@ -397,26 +457,15 @@ FSCRUNLP LDA (OSLPTR),Y ; Look for command line
|
|||
SEC ; Not from RESET
|
||||
JMP (OSFILECB+6) ; Jump to EXEC addr
|
||||
|
||||
FSCREN JMP RENAME
|
||||
|
||||
FSCCHDIR JMP CHDIR
|
||||
|
||||
* Performs OSFSC Read EOF function
|
||||
* File ref number is in X
|
||||
CHKEOF
|
||||
* >>> WRTMAIN
|
||||
* STX MOSFILE ; File reference number
|
||||
* >>> WRTAUX
|
||||
TXA ; A=channel
|
||||
>>> XF2MAIN,FILEEOF
|
||||
CHKEOFRET >>> ENTAUX
|
||||
TAX ; Return code -> X
|
||||
TYA ; Y=any ProDOS error
|
||||
JMP CHKERROR
|
||||
* FSCREN JMP RENAME
|
||||
*
|
||||
* FSCCHDIR JMP CHDIR
|
||||
|
||||
|
||||
* Display catalog entries and info
|
||||
* A=5 *CAT, A=9 *EX, A=10 *INFO
|
||||
* XY=>pathname
|
||||
*
|
||||
FSCCAT EOR #$06
|
||||
CLC
|
||||
ROR A ; 01100000=*CAT
|
||||
|
@ -430,85 +479,132 @@ FSCCAT EOR #$06
|
|||
STARCATRET >>> ENTAUX
|
||||
JSR CHKERROR ; See if error occurred
|
||||
JSR FORCENL
|
||||
* CATDONE
|
||||
LDA #0 ; 0=OK
|
||||
RTS
|
||||
|
||||
* Print one block of a catalog. Called by CATALOG
|
||||
* Block is in AUXBLK
|
||||
PRONEBLK >>> ENTAUX
|
||||
LDA AUXBLK+4 ; Get storage type
|
||||
AND #$E0 ; Mask 3 MSBs
|
||||
*
|
||||
LDA #<AUXBLK+4 ; FSPTR1=>first entry
|
||||
STA FSPTR1+0
|
||||
LDA #>AUXBLK+4
|
||||
STA FSPTR1+1
|
||||
LDA #13 ; Max 13 entries per block
|
||||
STA FSNUM
|
||||
:CATLP LDY #$00
|
||||
LDA (FSPTR1),Y ; Get storage type
|
||||
CMP #$E0
|
||||
BNE :NOTKEY ; Not a key block
|
||||
* PHP
|
||||
BCC :NOTKEY ; Not a key block
|
||||
|
||||
* LDA AUXBLK+4 ; Get storage type
|
||||
* AND #$E0 ; Mask 3 MSBs
|
||||
* CMP #$E0
|
||||
* BNE :NOTKEY ; Not a key block
|
||||
|
||||
* Print directory name
|
||||
LDA #<:DIRM
|
||||
LDY #>:DIRM
|
||||
JSR PRSTR
|
||||
SEC
|
||||
:NOTKEY LDA #$00
|
||||
:L1 PHA
|
||||
PHP
|
||||
JSR PRONEENT
|
||||
PLP
|
||||
BCC :L1X
|
||||
JSR OSNEWL
|
||||
:L1X PLA
|
||||
INC
|
||||
CMP #13 ; Number of dirents in block
|
||||
CLC
|
||||
BNE :L1
|
||||
:NOTKEY
|
||||
* LDA #$00
|
||||
*:L1 PHA
|
||||
* PHP
|
||||
JSR PRONEENT ; CC=entry, CS=header
|
||||
* PLP
|
||||
* BCC :L1X
|
||||
* JSR OSNEWL
|
||||
*:L1X
|
||||
CLC ; Step to next entry
|
||||
LDA FSPTR1+0
|
||||
ADC #$27
|
||||
STA FSPTR1+0
|
||||
LDA FSPTR1+1
|
||||
ADC #$00
|
||||
STA FSPTR1+1
|
||||
DEC FSNUM
|
||||
BNE :CATLP ; Loop for all entries
|
||||
|
||||
* PLA
|
||||
* INC
|
||||
* CMP #13 ; Number of dirents in block
|
||||
* CLC
|
||||
* BNE :L1
|
||||
|
||||
>>> XF2MAIN,CATALOGRET
|
||||
:DIRM ASC 'Directory: '
|
||||
DB $00
|
||||
|
||||
* Print a single directory entry
|
||||
* On entry: A = dirent index in AUXBLK
|
||||
PRONEENT PHP
|
||||
TAX
|
||||
LDA #<AUXBLK+4 ; Skip pointers
|
||||
STA ZP3
|
||||
LDA #>AUXBLK+4
|
||||
STA ZP3+1
|
||||
:L1 CPX #$00
|
||||
BEQ :S1
|
||||
CLC
|
||||
LDA #$27 ; Size of dirent
|
||||
ADC ZP3
|
||||
STA ZP3
|
||||
LDA #$00
|
||||
ADC ZP3+1
|
||||
STA ZP3+1
|
||||
DEX
|
||||
BRA :L1
|
||||
:S1 LDY #$00
|
||||
LDA (ZP3),Y
|
||||
BEQ :EXIT1 ; Inactive entry
|
||||
* CC=entry, CS=header
|
||||
PRONEENT
|
||||
* PHP
|
||||
* TAX
|
||||
* LDA #<AUXBLK+4 ; Skip pointers
|
||||
* STA ZP3
|
||||
* LDA #>AUXBLK+4
|
||||
* STA ZP3+1
|
||||
*:L1 CPX #$00
|
||||
* BEQ :S1
|
||||
* CLC
|
||||
* LDA #$27 ; Size of dirent
|
||||
* ADC ZP3
|
||||
* STA ZP3
|
||||
* LDA #$00
|
||||
* ADC ZP3+1
|
||||
* STA ZP3+1
|
||||
* DEX
|
||||
* BRA :L1
|
||||
:S1 LDY #$00 ; Characters printed
|
||||
LDA (FSPTR1),Y
|
||||
AND #$0F ; Len of filename
|
||||
BEQ :CATEXIT ; Inactive entry
|
||||
PHP
|
||||
TAX
|
||||
LDY #$01
|
||||
:L2 CPX #$00
|
||||
BEQ :S2
|
||||
LDA (ZP3),Y
|
||||
JSR OSWRCH
|
||||
|
||||
:L2 INY
|
||||
LDA (FSPTR1),Y
|
||||
JSR OSWRCH ; Print filename
|
||||
DEX
|
||||
INY
|
||||
BRA :L2
|
||||
BNE :L2
|
||||
|
||||
* LDY #$01
|
||||
*:L2 CPX #$00
|
||||
* BEQ :S2
|
||||
* LDA (FSPTR1),Y
|
||||
* JSR OSWRCH
|
||||
* DEX
|
||||
* INY
|
||||
* BRA :L2
|
||||
|
||||
:S2 PLP
|
||||
BCS :EXIT
|
||||
LDA #$20
|
||||
BCS :EXITHDR ; Header entry, no info
|
||||
JSR PRSPACES
|
||||
|
||||
* LDA #$20
|
||||
* BIT FSAREG
|
||||
* BPL :S2LP
|
||||
* INY
|
||||
* INY
|
||||
* INY
|
||||
* INY
|
||||
*:S2LP JSR OSWRCH
|
||||
* INY
|
||||
* CPY #$10
|
||||
* BCC :S2LP
|
||||
|
||||
BIT FSAREG
|
||||
BPL :S2LP
|
||||
INY
|
||||
INY
|
||||
INY
|
||||
INY
|
||||
:S2LP JSR OSWRCH
|
||||
INY
|
||||
CPY #$15
|
||||
BNE :S2LP
|
||||
BIT FSAREG
|
||||
BPL :EXIT
|
||||
LDY #$21
|
||||
BMI :CATINFO ; Display object info
|
||||
JMP PRACCESS
|
||||
:EXITHDR JMP OSNEWL
|
||||
PLP
|
||||
:CATEXIT RTS
|
||||
|
||||
* BPL :EXIT
|
||||
:CATINFO LDY #$21
|
||||
LDX #3
|
||||
LDA #0
|
||||
JSR PRADDR0
|
||||
|
@ -517,55 +613,155 @@ PRONEENT PHP
|
|||
LDY #$17
|
||||
JSR PRADDR
|
||||
JSR PRSPACE
|
||||
LDY #$00
|
||||
LDA (ZP3),Y
|
||||
AND #$F0
|
||||
CMP #$D0
|
||||
BNE :NOTDIR
|
||||
LDA #'D'
|
||||
JSR OSWRCH
|
||||
JSR PRLOCK
|
||||
JSR PRACCESS
|
||||
BIT FSFLAG2
|
||||
BVS CATLONG
|
||||
LDY #$0A
|
||||
PRSPACES JSR PRSPACE
|
||||
INY
|
||||
CPY #$10
|
||||
BCC PRSPACES
|
||||
RTS
|
||||
|
||||
CATLONG LDY #$21
|
||||
JSR PRDATETIME
|
||||
LDY #$18
|
||||
JSR PRDATETIME
|
||||
JMP OSNEWL
|
||||
:NOTDIR JSR PRLOCK
|
||||
LDA (ZP3),Y
|
||||
PRDATETIME JSR PRSPACE
|
||||
JSR PRSPACE
|
||||
LDA (FSPTR1),Y
|
||||
PHA
|
||||
AND #$1F
|
||||
JSR PRDECSLH ; Day
|
||||
INY
|
||||
LDA (FSPTR1),Y
|
||||
ASL A
|
||||
PLA
|
||||
ROL A
|
||||
ROL A
|
||||
ROL A
|
||||
ROL A
|
||||
AND #$0F
|
||||
JSR PRDECSLH ; Month
|
||||
LDA (FSPTR1),Y
|
||||
PHA
|
||||
CMP #80
|
||||
LDA #$19
|
||||
BCS :CENTURY
|
||||
LDA #$20
|
||||
:CENTURY JSR PRHEX ; Century
|
||||
PLA
|
||||
LSR A
|
||||
PHP
|
||||
AND #1
|
||||
BEQ :NOWR
|
||||
LDA #'W'
|
||||
JSR PRDEC ; Year
|
||||
JSR PRSPACE
|
||||
INY
|
||||
INY
|
||||
LDA (FSPTR1),Y
|
||||
JSR PRDEC ; Hour
|
||||
LDA #$3A
|
||||
JSR OSWRCH
|
||||
:NOWR PLP
|
||||
BCC :NOWR
|
||||
LDA #'R'
|
||||
JSR OSWRCH
|
||||
:NORD
|
||||
DEY
|
||||
LDA (FSPTR1),Y ; Minute
|
||||
PRDEC TAX
|
||||
LDA #$99
|
||||
SED
|
||||
:PRDECLP CLC
|
||||
ADC #$01
|
||||
DEX
|
||||
BPL :PRDECLP
|
||||
CLD
|
||||
JMP PRHEX
|
||||
PRDECSLH JSR PRDEC
|
||||
LDA #'/'
|
||||
JMP OSWRCH
|
||||
|
||||
* LDY #$00
|
||||
* LDA (FSPTR1),Y
|
||||
* AND #$F0
|
||||
* CMP #$D0
|
||||
* BNE :NOTDIR
|
||||
* LDA #'D'
|
||||
* JSR OSWRCH
|
||||
* JSR PRLOCK
|
||||
* JMP OSNEWL
|
||||
*:NOTDIR JSR PRLOCK
|
||||
* LDA (FSPTR1),Y
|
||||
* LSR A
|
||||
* PHP
|
||||
* AND #1
|
||||
* BEQ :NOWR
|
||||
* LDA #'W'
|
||||
* JSR OSWRCH
|
||||
*:NOWR PLP
|
||||
* BCC :NOWR
|
||||
* LDA #'R'
|
||||
* JSR OSWRCH
|
||||
*:NORD
|
||||
* JSR PRSPACE
|
||||
* LDY #$22
|
||||
* LDX #2
|
||||
* JSR PRADDRLP
|
||||
JMP OSNEWL
|
||||
:EXIT1 PLP
|
||||
:EXIT RTS
|
||||
:EXITHDR JMP OSNEWL
|
||||
|
||||
PRLOCK LDY #$1E
|
||||
LDA (ZP3),Y
|
||||
PRACCESS LDX #$04 ; Offset to chars
|
||||
LDY #$1E
|
||||
LDA (FSPTR1),Y
|
||||
PHA
|
||||
LDY #$00 ; Chars printed
|
||||
LDA (FSPTR1),Y
|
||||
CMP #$D0
|
||||
JSR :PRACCCHR ; 'D'
|
||||
PLA
|
||||
CPY #$01 ; Has 'D' been printed?
|
||||
PHP
|
||||
PHA
|
||||
EOR #$C0
|
||||
CMP #$40
|
||||
BCS PRADDROK
|
||||
LDA #'L'
|
||||
JSR :PRACCCHR ; 'L'
|
||||
PLA
|
||||
PLP
|
||||
BCS :PRACCDONE ; Dir, skip 'WR'
|
||||
ROR A
|
||||
PHP
|
||||
ROR A
|
||||
JSR :PRACCCHR ; 'W'
|
||||
PLP
|
||||
JSR :PRACCCHR ; 'R'
|
||||
:PRACCDONE LDA #$20
|
||||
:PRACCLP JSR :PRSPACE
|
||||
CPY #$04
|
||||
BCC :PRACCLP
|
||||
:PRSKIP RTS
|
||||
:PRACCCHR DEX
|
||||
BCC :PRSKIP
|
||||
LDA ACCESSCHRS,X
|
||||
:PRSPACE INY
|
||||
JMP OSWRCH
|
||||
ACCESSCHRS ASC 'RWLD'
|
||||
|
||||
|
||||
*PRLOCK LDY #$1E
|
||||
* LDA (FSPTR1),Y
|
||||
* CMP #$40
|
||||
* BCS PRADDROK
|
||||
* LDA #'L'
|
||||
* JMP OSWRCH
|
||||
|
||||
PRADDR LDX #3
|
||||
PRADDRLP LDA (ZP3),Y
|
||||
PRADDRLP LDA (FSPTR1),Y
|
||||
PRADDR0 JSR OUTHEX
|
||||
DEY
|
||||
DEX
|
||||
BNE PRADDRLP
|
||||
PRADDROK RTS
|
||||
PRSPACE LDA #' '
|
||||
JMP OSWRCH
|
||||
PRCHAR JMP OSWRCH
|
||||
|
||||
* Perform FSCV $0C RENAME function
|
||||
* Parameter string in XY
|
||||
|
||||
* OSFSC $0C - RENAME function
|
||||
* XY=>pathname
|
||||
FSCRENAME
|
||||
RENAME JSR PARSNAME ; Copy Arg1->MOSFILE
|
||||
CMP #$00 ; Length of arg1
|
||||
BEQ :SYNTAX
|
||||
|
@ -583,9 +779,12 @@ RENRET
|
|||
LDA #$00
|
||||
RTS
|
||||
|
||||
* Perform *COPY function
|
||||
* Parameter string in XY
|
||||
COPY JSR PARSNAME ; Copy Arg1->MOSFILE
|
||||
|
||||
* Handle *COPY command
|
||||
* LPTR=>parameters string
|
||||
*
|
||||
FSCCOPY JSR PARSLPTR
|
||||
* COPY JSR PARSNAME ; Copy Arg1->MOSFILE
|
||||
CMP #$00 ; Length of arg1
|
||||
BEQ :SYNTAX
|
||||
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
|
||||
|
@ -602,9 +801,12 @@ COPYRET
|
|||
LDA #$00
|
||||
RTS
|
||||
|
||||
* Handle *DIR (directory change) command
|
||||
* On entry, XY points to command line
|
||||
CHDIR JSR PARSNAME ; Copy filename->MOSFILE
|
||||
|
||||
* Handle *DIR/*CHDIR/*CD (directory change) command
|
||||
* LPTR=>parameters string
|
||||
*
|
||||
FSCCHDIR JSR PARSLPTR
|
||||
* CHDIR JSR PARSNAME ; Copy filename->MOSFILE
|
||||
CMP #$00 ; Filename length
|
||||
BNE :HASPARM
|
||||
BRK
|
||||
|
@ -613,8 +815,11 @@ CHDIR JSR PARSNAME ; Copy filename->MOSFILE
|
|||
BRK
|
||||
:HASPARM >>> XF2MAIN,SETPFX
|
||||
|
||||
|
||||
* Handle *DRIVE command, which is similar
|
||||
* On entry, (OSLPTR),Y points to command line
|
||||
* LPTR=>parameters string
|
||||
*
|
||||
FSCDRIVE
|
||||
DRIVE LDA (OSLPTR),Y ; First char
|
||||
CMP #$3A ; Colon
|
||||
BNE :ERR
|
||||
|
@ -638,7 +843,11 @@ CHDIRRET
|
|||
BRK
|
||||
:EXIT RTS
|
||||
|
||||
|
||||
* Handle *FREE command
|
||||
* LPTR=>parameters string
|
||||
*
|
||||
FSCFREE
|
||||
FREE LDA (OSLPTR),Y ; First char
|
||||
CMP #$3A ; Colon
|
||||
BNE :ERR
|
||||
|
@ -668,7 +877,7 @@ FREERET
|
|||
SBC AUXBLK+1 ; MSB of blocks used
|
||||
TAY
|
||||
LDA #$00 ; *TO DO* b16-b23 of free
|
||||
* NEW
|
||||
|
||||
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
|
||||
LDX #<:FREE
|
||||
LDY #>:FREE
|
||||
|
@ -681,22 +890,6 @@ FREERET
|
|||
LDY #>:USED
|
||||
JMP OUTSTR ; Print 'used'<nl>
|
||||
|
||||
* OLD
|
||||
* JSR PRDECXY ; Print in decimal
|
||||
* LDX #<:FREEM
|
||||
* LDY #>:FREEM
|
||||
* JSR OUTSTR
|
||||
* JSR FORCENL
|
||||
* LDX AUXBLK+0 ; Blocks used
|
||||
* LDY AUXBLK+1
|
||||
* JSR PRDECXY ; Print in decimal
|
||||
* LDX #<:USEDM
|
||||
* LDY #>:USEDM
|
||||
* JSR OUTSTR
|
||||
* JSR FORCENL
|
||||
* RTS
|
||||
*
|
||||
* NEW
|
||||
:FREEDEC STX FSNUM+1
|
||||
STY FSNUM+2
|
||||
STA FSNUM+3
|
||||
|
@ -724,13 +917,12 @@ FREERET
|
|||
DB 13,0
|
||||
:USED ASC 'used'
|
||||
DB 13,0
|
||||
*
|
||||
* OLD
|
||||
*:FREEM ASC ' 512-byte Blocks Free'
|
||||
* DB $00
|
||||
*:USEDM ASC ' 512-byte Blocks Used'
|
||||
* DB $00
|
||||
|
||||
|
||||
* Handle *ACCESS command
|
||||
* LPTR=>parameters string
|
||||
*
|
||||
FSCACCESS
|
||||
ACCESS JSR PARSLPTR ; Copy filename->MOSFILE
|
||||
CMP #$00 ; Filename length
|
||||
BEQ :SYNTAX
|
||||
|
@ -738,7 +930,7 @@ ACCESS JSR PARSLPTR ; Copy filename->MOSFILE
|
|||
>>> XF2MAIN,SETPERM
|
||||
:SYNTAX BRK
|
||||
DB $DC
|
||||
ASC 'Syntax: ACCESS <listspec> <L|R|W>'
|
||||
ASC 'Syntax: ACCESS <listspec> <L|W|R>'
|
||||
BRK
|
||||
|
||||
ACCRET >>> ENTAUX
|
||||
|
@ -746,6 +938,11 @@ ACCRET >>> ENTAUX
|
|||
LDA #$00
|
||||
RTS
|
||||
|
||||
|
||||
* Handle *DESTROY command
|
||||
* LPTR=>parameters string
|
||||
*
|
||||
FSCDESTROY
|
||||
DESTROY JSR PARSLPTR ; Copy filename->MOSFILE
|
||||
CMP #$00 ; Filename length
|
||||
BEQ :SYNTAX
|
||||
|
@ -760,12 +957,20 @@ DESTRET >>> ENTAUX
|
|||
LDA #$00
|
||||
RTS
|
||||
|
||||
|
||||
* Handle *TITLE command
|
||||
* LPTR=>parameters string
|
||||
* Syntax: *TITLE (<drive>) <title>
|
||||
*
|
||||
FSCTITLE RTS
|
||||
|
||||
|
||||
* Parse filename pointed to by XY
|
||||
* Write filename to MOSFILE in main memory
|
||||
* Returns length in A
|
||||
* Returns length in A with EQ/NE set
|
||||
PARSNAME JSR XYtoLPTR
|
||||
PARSLPTR CLC ; Means parsing a filename
|
||||
JSR GSINIT ; Init gen string handling
|
||||
JSR GSINIT ; Init general string handling
|
||||
PHP
|
||||
SEI ; Disable IRQs
|
||||
LDX #$00 ; Length
|
||||
|
@ -785,7 +990,7 @@ PARSLPTR CLC ; Means parsing a filename
|
|||
|
||||
* Parse filename pointed to by (OSLPTR),Y
|
||||
* Write filename to MOSFILE2 in main memory
|
||||
* Returns length in A
|
||||
* Returns length in A with EQ/NE set
|
||||
PARSNAME2 JSR XYtoLPTR
|
||||
PARSLPTR2 CLC ; Means parsing a filename
|
||||
JSR GSINIT ; Init gen string handling
|
||||
|
@ -804,23 +1009,23 @@ PARSLPTR2 CLC ; Means parsing a filename
|
|||
STA $C005 ; Back to aux
|
||||
PLP ; IRQs back as they were
|
||||
TXA ; Return len in A
|
||||
RTS
|
||||
NOTERROR RTS
|
||||
|
||||
* Move this somewhere
|
||||
CHKERROR CMP #$20
|
||||
BCS MKERROR
|
||||
RTS
|
||||
|
||||
*ERREXISTS LDA #$47 ; File exists
|
||||
ERRNOTFND LDA #$46 ; File not found
|
||||
|
||||
* Check returned code for return code or error code
|
||||
* A<$20 - return to user, A>$1F - generate error
|
||||
*
|
||||
CHKERROR CMP #$20
|
||||
BCC NOTERROR
|
||||
MKERROR
|
||||
* IF FALSE
|
||||
BIT $E0
|
||||
BPL MKERROR1 ; *TEST*
|
||||
BPL MKERROR1 ; *DEBUG*
|
||||
PHA
|
||||
LDX #15
|
||||
MKERRLP
|
||||
LDA ERRMSG,X
|
||||
MKERRLP LDA ERRMSG,X
|
||||
STA $100,X
|
||||
DEX
|
||||
BPL MKERRLP
|
||||
|
@ -836,31 +1041,28 @@ MKERRLP
|
|||
JSR ERRHEX
|
||||
STA $109
|
||||
JMP $100
|
||||
ERRHEX
|
||||
AND #15
|
||||
ERRHEX AND #15
|
||||
CMP #10
|
||||
BCC ERRHEX1
|
||||
ADC #6
|
||||
ERRHEX1
|
||||
ADC #48
|
||||
ERRHEX1 ADC #48
|
||||
RTS
|
||||
ERRMSG
|
||||
BRK
|
||||
ERRMSG BRK
|
||||
DB $FF
|
||||
ASC 'ERR: $00'
|
||||
BRK
|
||||
MKERROR1
|
||||
CMP #$40
|
||||
* FIN
|
||||
|
||||
* Translate ProDOS error code into BBC error
|
||||
MKERROR1 CMP #$40
|
||||
BCS MKERROR2
|
||||
ORA #$30 ; <$40 -> $30-$3F
|
||||
MKERROR2
|
||||
SEC
|
||||
SBC #$37
|
||||
MKERROR2 SEC
|
||||
SBC #$38
|
||||
CMP #$28
|
||||
BCC MKERROR3
|
||||
LDA #$00 ; I/O error
|
||||
MKERROR3
|
||||
ASL A
|
||||
BCC MKERROR3 ; $28-$30, $40-$5F
|
||||
LDA #$27 ; Otherwise I/O error
|
||||
MKERROR3 ASL A
|
||||
TAX
|
||||
LDA MKERROR4+1,X
|
||||
PHA
|
||||
|
@ -868,8 +1070,7 @@ MKERROR3
|
|||
PHA
|
||||
PHP
|
||||
RTI
|
||||
MKERROR4 DW ERROR27
|
||||
DW ERROR28,ERROR27,ERROR27,ERROR2B,ERROR27,ERROR27,ERROR2E,ERROR27
|
||||
MKERROR4 DW ERROR28,ERROR27,ERROR27,ERROR2B,ERROR27,ERROR27,ERROR2E,ERROR27
|
||||
DW ERROR40,ERROR41,ERROR42,ERROR43,ERROR44,ERROR45,ERROR46,ERROR47
|
||||
DW ERROR48,ERROR49,ERROR4A,ERROR4B,ERROR4C,ERROR4D,ERROR4E,ERROR4F
|
||||
DW ERROR50,ERROR51,ERROR52,ERROR53,ERROR54,ERROR55,ERROR56,ERROR57
|
||||
|
@ -921,6 +1122,12 @@ MKERROR4 DW ERROR27
|
|||
|
||||
|
||||
* AcornOS ProDOS
|
||||
ERROR28 DW $D200
|
||||
ASC 'Disk not present' ; $28 - No device detected/connected
|
||||
ERROR2B DW $C900
|
||||
ASC 'Disk write protected'; $2B - Disk write protected
|
||||
ERROR2E DW $C800
|
||||
ASC 'Disk changed' ; $2E - Disk switched
|
||||
ERROR40 DW $CC00
|
||||
ASC 'Bad filename' ; $40 - Invalid pathname syntax
|
||||
ERROR41 DW $C400
|
||||
|
@ -961,7 +1168,7 @@ ERROR51 DW $A800
|
|||
ERROR53 DW $DC00
|
||||
ASC 'Invalid parameter' ; $53 - Invalid parameter
|
||||
ERROR54 DW $D400
|
||||
ASC 'Directory not empty' ; $54 - Directory not empty
|
||||
ASC 'Directory not empty' ; $54 - Directory not empty (split from $4E)
|
||||
ERROR55 DW $FF00
|
||||
ASC 'ProDOS: VCB full' ; $55 - Volume Control Block table full
|
||||
ERROR56 DW $FF00
|
||||
|
@ -969,21 +1176,14 @@ ERROR56 DW $FF00
|
|||
ERROR57 DW $FF00
|
||||
ASC 'ProDOS: Dup volm' ; $57 - Duplicate volume
|
||||
ERROR5B ; spare
|
||||
ERROR27 DW $FF00
|
||||
ASC 'I/O error' ; $27 - I/O error
|
||||
ERROR28 DW $D200
|
||||
ASC 'Disk not present' ; $28 - No device detected/connected
|
||||
ERROR5A DW $FF00
|
||||
ASC 'Sector not found' ; $5A - Bit map disk address is impossible
|
||||
ERROR2B DW $C900
|
||||
ASC 'Disk write protected' ; $2B - Disk write protected
|
||||
ERROR5D DW $CA00
|
||||
ASC 'Data lost' ; $5D - EOF during LOAD or SAVE
|
||||
ERROR5E DW $C000
|
||||
ASC 'Can'
|
||||
DB $27
|
||||
ASC 't save' ; $5E - Couldn't open for save
|
||||
ERROR2E DW $C800
|
||||
ASC 'Disk changed' ; $2E - Disk switched
|
||||
ERROR27 DW $FF00
|
||||
ASC 'I/O error' ; $27 - I/O error
|
||||
DB $00
|
||||
|
||||
|
|
|
@ -16,8 +16,10 @@
|
|||
* $E0-$EE Internal MOS workspace
|
||||
* $EF-$FF MOS API workspace
|
||||
|
||||
FSFLAG1 EQU $E2
|
||||
FSFLAG2 EQU $E3
|
||||
DEBUG EQU $E0 ; $E0 *TEST* Debug flag
|
||||
* ; $E1
|
||||
FSFLAG1 EQU $E2 ; $E2
|
||||
FSFLAG2 EQU $E3 ; $E3 HOSTFS *OPT settings
|
||||
GSFLAG EQU $E4 ; $E4 GSREAD processing flags
|
||||
GSCHAR EQU $E5 ; $E5 GSREAD accumulator
|
||||
OSTEXT EQU $E6 ; $E6 => text string $E6 OSNUM+0
|
||||
|
@ -68,5 +70,3 @@ OSGBPBCB EQU OSFILECB+1 ; OSGBPB control block
|
|||
|
||||
* $0300-$03DF
|
||||
* $03E0-$03FF Used for interfacing with ProDOS XFER
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user