Sorted HOSTFS commands into order

Sorted HOSTFS commands into order, and slight tweek so I can concentrate on oscli.s
This commit is contained in:
jgharston 2022-10-09 15:24:36 +01:00 committed by GitHub
parent 0011b9f6de
commit 901ad6678c
2 changed files with 183 additions and 161 deletions

View File

@ -22,6 +22,7 @@
* 02-Oct-2021 ACCESS uses generic access byte parsing.
* PRACCESS shares code with ACCESS.
* 03-Oct-2021 PARSNAME checks filename length<64.
* 09-Oct-2022 Sorted commands into order.
* $B0-$BF Temporary filing system workspace
@ -282,34 +283,43 @@ FILEIGNORE PLA ; Returned object type
*******************
* These are commands specific to the filing system that can't be
* called via OSFILE, OSFSC, etc.
* Syntax is:
* <afsp> - ambiguous file specifier, acts on a single file, error if not file, wildcards allowed
* <fsp> - unambiguous file specifier, acts on a single file, error if not file, wildcards not allowed
* <dir> - directory, error if not directory
* <drv> - drive, eg :1 :2 :61, error if not drive
* <*objspec*> - able to act on multiple objects, any object type, wildcards allowed
* <access> - access string
* <title> - disk title
* (<...>) - optional
*
FSCCOMMAND ASC 'CHDIR'
DB $80
DW FSCCHDIR-1 ; CHDIR <*objspec*>, LPTR=>params
FSCCOMMAND ASC 'ACCESS'
DB $FF
DW FSCACCESS-1 ; ACCESS <*objspec*> <access>, LPTR=>params
ASC 'CD'
DB $80
DW FSCCHDIR-1 ; CD <*objspec*> , LPTR=>params
ASC 'DIR'
DB $80
DW FSCCHDIR-1 ; DIR <*objspec*>, LPTR=>params
ASC 'DRIVE'
DB $80
DW FSCDRIVE-1 ; DRIVE <drive>, LPTR=>params
ASC 'FREE'
DB $80
DW FSCFREE-1 ; FREE <drive>, LPTR=>params
ASC 'ACCESS'
DB $80
DW FSCACCESS-1 ; ACCESS <listspec> <access>, LPTR=>params
ASC 'TITLE'
DB $80
DW FSCTITLE-1 ; TITLE (<drive>) <title>, LPTR=>params
ASC 'DESTROY'
DB $80
DW FSCDESTROY-1 ; DESTROY <listspec>, LPTR=>params
DB $FF
DW FSCCHDIR-1 ; CD <dir> , LPTR=>params
ASC 'CHDIR'
DB $FF
DW FSCCHDIR-1 ; CHDIR <dir>, LPTR=>params
ASC 'COPY'
DB $80
DW FSCCOPY-1 ; COPY <listspec> <*objspec*>, LPTR=>params
DB $FF
DW FSCCOPY-1 ; COPY <*objspec*> <dest>, LPTR=>params
ASC 'DIR'
DB $FF
DW FSCCHDIR-1 ; DIR <*objspec*>, LPTR=>params
ASC 'DESTROY'
DB $FF
DW FSCDESTROY-1 ; DESTROY <*objspec*> (Y), LPTR=>params
ASC 'DRIVE'
DB $FF
DW FSCDRIVE-1 ; DRIVE <drv>, LPTR=>params
ASC 'FREE'
DB $FF
DW FSCFREE-1 ; FREE (<drv>), LPTR=>params
ASC 'TITLE'
DB $FF
DW FSCTITLE-1 ; TITLE (<drv>) <title>, LPTR=>params
*
DB $FF ; Terminator
@ -679,7 +689,7 @@ FSCRENAME JSR PARSNAME ; Copy Arg1->MOSFILE
>>> XF2MAIN,RENFILE
:SYNTAX BRK
DB $DC
ASC 'Syntax: RENAME <objspec> <objspec>'
ASC 'Syntax: RENAME <oldspec> <newspec>'
BRK
* ProDOS returns $40 (Bad filename) for bad renames.
* Not easy to seperate out, so leave as Bad filename error.
@ -701,7 +711,7 @@ FSCCOPY JSR PARSLPTR ; Copy Arg1->MOSFILE
>>> XF2MAIN,COPYFILE ; Do the heavy lifting
:SYNTAX BRK
DB $DC
ASC 'Syntax: COPY <listspec> <*objspec*>'
ASC 'Syntax: COPY <*objspec*> <dest>'
BRK
@ -714,7 +724,7 @@ FSCCHDIR JSR PARSLPTR ; Copy filename->MOSFILE
FSCCHDIR2 >>> XF2MAIN,SETPFX
ERRCHDIR BRK
DB $DC
ASC 'Syntax: DIR <*objspec*>'
ASC 'Syntax: DIR <dir>'
BRK
@ -726,7 +736,7 @@ FSCDRIVE JSR PARSLPTR ; Copy arg->MOSFILE
BNE FSCCHDIR2 ; Pass on as CHDIR
:SYNTAX BRK
DB $DC
ASC 'Syntax: DRIVE <drv> (eg: DRIVE :61)'
ASC 'Syntax: DRIVE <drv>'
BRK
@ -815,7 +825,7 @@ FSCACCESS JSR PARSLPTR ; Copy filename->MOSFILE
>>> XF2MAIN,SETPERM
:SYNTAX BRK
DB $DC
ASC 'Syntax: ACCESS <listspec> <L|W|R>'
ASC 'Syntax: ACCESS <*objspec*> <L|W|R>'
BRK
@ -828,12 +838,13 @@ DESTROY JSR PARSLPTR ; Copy filename->MOSFILE
>>> XF2MAIN,MULTIDEL
:SYNTAX BRK
DB $DC
ASC 'Syntax: DESTROY <listspec>'
ASC 'Syntax: DESTROY <*objspec*>'
BRK
* Handle *TITLE command
* LPTR=>parameters string
* Syntax: *TITLE (<drive>) <title>
*
FSCTITLE RTS

View File

@ -1,5 +1,5 @@
* AUXMEM.OSCLI.S
* (c) BOBBI 2021 GPLv3
* (c) BOBBI 2021-2022 GPLv3
*
* Handle OSCLI system calls
@ -12,12 +12,16 @@
* 07-Oct-2022 *CLOSE is a host command, fixed *EXEC.
* 08-Oct-2022 Rewrote *TYPE, *DUMP, *SPOOL, shares code with *EXEC.
* Sorted command table, added *HELP FILE.
* Optimised CLILOOK dispatcher.
* COMMAND TABLE
***************
* Table structure is: { string, byte OR $80, destword-1 } $00
* Commands are entered with A=command byte with b7=1
* EQ=no parameter
* b6=0 - Enter with XY=>parameters
* b6=1 - Enter with LPTR,Y=>parameters
*
* Ok, let's get around to sorting these
CMDTABLE
@ -28,17 +32,17 @@ CMDFILE ASC 'CAT' ; Must be first command so matches '*.'
DB $88
DW STARFILE-1 ; CDIR -> OSFILE 08, CBLK=>filename
ASC 'CLOSE'
DB $80
DB $FF
DW CMDCLOSE-1 ; CLOSE -> (LPTR)=>params
ASC 'DELETE'
DB $86
DW STARFILE-1 ; DELETE -> OSFILE 06, CBLK=>filename
ASC 'DUMP'
DB $80
DW CMDDUMP-1 ; DUMP -> (LPTR)=>params
DB $81 ; TO DO
DW CMDDUMP-1 ; DUMP -> XY=>params
ASC 'EXEC'
DB $80
DW CMDEXEC-1 ; EXEC -> (LPTR)=>params
DB $81 ; TO DO
DW CMDEXEC-1 ; EXEC -> XY=>params
ASC 'EX'
DB $89
DW STARFSC-1 ; EX -> FSC 9, XY=>params
@ -46,7 +50,7 @@ CMDFILE ASC 'CAT' ; Must be first command so matches '*.'
DB $8A
DW STARFSC-1 ; INFO -> FSC 10, XY=>params
ASC 'LOAD'
DB $FF
DB $81
DW STARLOAD-1 ; LOAD -> OSFILE FF, CBLK=>filename
ASC 'MKDIR'
DB $88
@ -61,41 +65,42 @@ CMDFILE ASC 'CAT' ; Must be first command so matches '*.'
DB $8C
DW STARFSC-1 ; RENAME -> FSC 12, XY=>params
ASC 'SAVE'
DB $FF
DB $81
DW STARSAVE-1 ; SAVE -> OSFILE 00, CBLK=>filename
ASC 'SPOOL'
DB $80
DW CMDSPOOL-1 ; SPOOL -> (LPTR)=>params
DB $81 ; TO DO
DW CMDSPOOL-1 ; SPOOL -> XY=>params
ASC 'TYPE'
DB $80
DW CMDTYPE-1 ; TYPE -> (LPTR)=>params
DB $00 ; Split between HELP lists
DB $81 ; TO DO
DW CMDTYPE-1 ; TYPE -> XY=>params
* Split between HELP lists
DB $00
*
CMDMOS ASC 'BASIC'
DB $80
DB $FF
DW STARBASIC-1 ; BASIC -> (LPTR)=>params
ASC 'ECHO'
DB $80
DW ECHO-1 ; ECHO -> (LPTR)=>params
DB $FF
DW CMDECHO-1 ; ECHO -> (LPTR)=>params
ASC 'FX'
DB $80
DB $FF
DW STARFX-1 ; FX -> OSBYTE A,X,Y (LPTR)=>params
ASC 'FAST'
DB $80
DW FAST-1 ; FAST -> (LPTR)=>params
ASC 'HELP'
DB $FF
DW CMDFAST-1 ; FAST -> (LPTR)=>params
ASC 'HELP'
DB $81
DW STARHELP-1 ; HELP -> XY=>params
ASC 'KEY'
DB $80
DB $FF
DW STARKEY-1 ; KEY -> (LPTR)=>params
ASC 'QUIT'
DB $80
DB $FF
DW STARQUIT-1 ; QUIT -> (LPTR)=>params
ASC 'SLOW'
DB $80
DW SLOW-1 ; SLOW -> (LPTR)=>params
* terminator
DB $FF
DW CMDSLOW-1 ; SLOW -> (LPTR)=>params
* Table terminator
DB $FF
@ -163,21 +168,28 @@ CLIMATCH2 JSR CLIMATCH3 ; Call the routine
RTS ; Return A=0 to claim
CLIMATCH3 JSR SKIPSPC ; (OSLPTR),Y=>parameters
PHP ; Save EQ=end of line
LDA (OSTEXT,X) ; Command byte
PHA
JSR CLISTEP ; Address low byte
STA OSTEMP
JSR CLISTEP ; Address high byte
PLX ; Get command byte
PHA ; Push address high
LDA OSTEMP
PHA ; Push address low
TXA ; Command byte
JSR CLISTEP ; Address low byte
PHA
JSR CLISTEP ; Address high byte
TAX ; X=high
PLA ; A=low
PLP ; EQ=end of line
PHX ; SP->high
PHA ; SP->low, high
PHP ; SP->flg, low, high
* BIT OSTEMP
* BVS CLICALL
LDA OSTEMP
ASL A ; Move bit 6 into bit 7
BEQ CLICALL ; If $80-&BF don't convert LPTR
BMI CLICALL ; If b6=1 don't convert LPTR
BEQ CLICALL ; *TEMP* If $80, skip - remove when HOSTFS updated
*
JSR LPTRtoXY ; XY=>parameters
CLICALL PLA ; A=command parameter
CLICALL LDA OSTEMP ; A=command parameter
PLP ; EQ=no parameters
RTS ; Call command routine
CLISTEP INC OSTEXT+0,X ; Point to next table byte
@ -220,7 +232,7 @@ CLISLASH JSR SKIPSPC1
BEQ CLIDONE ; */<cr>
LDA #$02
BNE STARFSC2 ; FSC 2 = */filename
*
CLIUNKNOWN LDA #$04
JSR SERVICE ; Offer to sideways ROM(s)
BEQ CLIDONE ; Claimed
@ -244,13 +256,16 @@ ERRBADADD BRK
BRK
* MOS COMMANDS
**************
* *FX num(,num(,num))
*********************
* -------------------
STARFX JSR SCANDEC
BRA STARBYTE1
* Commands passed to OSBYTE
***************************
* -------------------------
STARBYTE JSR XYtoLPTR
STARBYTE1 STA OSAREG ; Save OSBYTE number
LDA #$00 ; Default X and Y
@ -273,6 +288,9 @@ STARBYTE2 LDY OSYREG
BVS ERRBADCMD
RTS
* Line scanning
* -------------
* Scan decimal number
SCANDEC JSR SKIPSPC
JSR SCANDIGIT ; Check first digit
@ -381,8 +399,29 @@ XYtoLPTR STX OSLPTR+0
LDY #0
STARHELP9 RTS
* Print *HELP text
STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters
* *BASIC
* ------
STARBASIC LDX MAXROM
:BASICLP JSR ROMSELECT
BIT $8006
BPL :BASICGO ; No service, must be BASIC
DEX
BPL :BASICLP
JMP ERRBADCMD ; No BASIC, give an error
:BASICGO JMP BYTE8E
* *ECHO <GSTRANS string>
* ----------------------
CMDECHO SEC
ECHO0 JSR GSINIT
:ECHOLP1 JSR GSREAD
BCS STARHELP9
JSR OSWRCH
JMP :ECHOLP1
* *HELP (<options>)
* -----------------
STARHELP JSR XYtoLPTR ; Update OSLPTR=>parameters
JSR PRHELLO ; Unify version message
LDX #<HLPTABLE ; XY=>command table
LDY #>HLPTABLE
@ -391,14 +430,15 @@ STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters
LDA $8006 ; Does ROM have service entry?
BMI STARHELP6 ; Yes, skip to send service call
JSR OSNEWL
LDA #$09 ; Language name
LDX #$09 ; Language name
LDY #$80 ; *TO DO* make this and BYTE8E
JSR PRSTR ; use same code
JSR OSPRSTR ; use same code
JSR OSNEWL
STARHELP6 LDY #0 ; (OSLPTR),Y=>parameters
LDA #9
JMP SERVICE ; Pass to sideways ROM(s)
* Print *HELP text
HELPHOSTFS LDX #<FSCCOMMAND ; *HELP HOSTFS
LDY #>FSCCOMMAND
BNE HELPLIST
@ -435,14 +475,25 @@ STARHELP4 LDA #$08
JSR OSWRCH
JMP FORCENL
* *KEY <num> <GSTRANS string>
* ---------------------------
STARKEY RTS
* Handle *QUIT command
* *QUIT command
* -------------
STARQUIT >>> XF2MAIN,QUIT
STARSAVE LDA #$00 ; Set A=0 - SAVE
STARLOAD PHA ; Entered with A=$FF - LOAD
JSR XYtoLPTR ; OSLPTR=>filename
* FILING COMMANDS
* ***************
* *LOAD and *SAVE
* ---------------
STARLOAD LDA #$7E ; Set here to A=$7E -> $FF, LOAD
STARSAVE EOR #$81 ; Entered with A=$81 -> $00, SAVE
* Can tweek this after HOSTFS command table updated
PHA
JSR XYtoLPTR ; Update OSLPTR=>filename
JSR SKIPWORD ; Step past filename
BNE STARLDSV3 ; filename followed by addr
*
@ -508,7 +559,7 @@ STARLDSVGO LDX OSLPTR+0
*
* Commands passed to OSFILE
***************************
* -------------------------
STARFILE EOR #$80
STX OSFILECB+0
STY OSFILECB+1
@ -519,53 +570,20 @@ STARFILE EOR #$80
BNE STARDONE
JMP ERRNOTFND
STARKEY
STARDONE RTS
* *BASIC
********
STARBASIC LDX MAXROM
:BASICLP JSR ROMSELECT
BIT $8006
BPL :BASICGO ; No service, must be BASIC
DEX
BPL :BASICLP
JMP ERRBADCMD ; No BASIC, give an error
:BASICGO JMP BYTE8E
* *ECHO <GSTRANS string>
************************
ECHO SEC
ECHO0 JSR GSINIT
ECHOLP1 JSR GSREAD
BCS STARDONE
JSR OSWRCH
JMP ECHOLP1
* FILING UTILITIES
* ================
* *CLOSE
********
* ------
CMDCLOSE LDA #$00
TAY
JSR OSFIND ; Close all files
STA FXEXEC ; Ensure Spool/Exec handles cleared
STA FXSPOOL
RTS
STARDONE RTS
* *TYPE <afsp>
**************
* LPTR=>parameters string
*
CMDTYPE
LDA (OSLPTR),Y ; TEMP
CMP #$0D ; TEMP
BEQ ERRTYPE ; No filename
JSR LPTRtoXY ; TEMP
* ------------
* XY=>parameters string, EQ=no parameters
*
CMDTYPE BEQ ERRTYPE ; No filename
JSR OPENINFILE ; Try to open file
:LOOP JSR OSBGET ; Read a byte
BCS TYPDMPEND ; EOF
@ -593,16 +611,11 @@ ERRDUMP BRK
ASC 'Syntax: DUMP <afsp>'
BRK
* Handle *DUMP command
* LPTR=>parameters string
*
CMDDUMP
LDA (OSLPTR),Y ; TEMP
CMP #$0D ; TEMP
BEQ ERRDUMP ; No filename
JSR LPTRtoXY ; TEMP
* --------------------
* XY=>parameters string, EQ=no parameters
*
CMDDUMP BEQ ERRDUMP ; No filename
JSR OPENINFILE ; Try to open file
STZ OSNUM+0 ; Offset = zero
STZ OSNUM+1
@ -670,16 +683,11 @@ CMDDUMP
BCC :LOOP1
JMP TYPCLOSE ; Close and finish
* Handle *SPOOL command
* LPTR=>parameters string
*
CMDSPOOL
LDA (OSLPTR),Y ; TEMP
CMP #$0D ; TEMP
PHP ; TEMP
JSR LPTRtoXY ; TEMP
* *SPOOL (<afsp>)
* ---------------
* XY=>parameters string, EQ=no parameters
*
CMDSPOOL PHP ; Save EQ/NE
PHY ; Save Y
LDY FXSPOOL ; Get SPOOL handle
BEQ :SPOOL1 ; Wasn't open, skip closing
@ -690,20 +698,16 @@ CMDSPOOL
PLP ; Get NE=filename, EQ=no filename
BEQ :DONE ; No filename, all done
LDA #$80 ; A=OPENOUT, for writing
JSR OUTPUTFILE ; Try to open file
JSR OPENAFILE ; Try to open file
STA FXSPOOL ; Store SPOOL handle
:DONE RTS
* Handle *EXEC command
* LPTR=>parameters string
*
CMDEXEC
LDA (OSLPTR),Y ; TEMP
CMP #$0D ; TEMP
PHP ; TEMP
JSR LPTRtoXY ; TEMP
* *EXEC (<afsp>)
* --------------
* XY=>parameters string, EQ=no parameters
*
CMDEXEC0 LDA #$00 ; Close EXEC file
CMDEXEC PHP ; Save EQ/NE
PHY ; Save Y
LDY FXEXEC ; Get EXEC handle
BEQ :EXEC1 ; Wasn't open, skip closing it
@ -718,43 +722,47 @@ CMDEXEC
EXECDONE RTS
OPENINFILE LDA #$40 ; Open for input
OUTPUTFILE JSR OSFIND ; Try to open file
OPENAFILE JSR OSFIND ; Try to open file
TAY ; Was file opened?
BNE EXECDONE ; File opened
EXECNOTFND JMP ERRNOTFND ; File not found
*
* ZIP SPEED COMMANDS
* ==================
* Handle *FAST command
* --------------------
* Turn Apple II accelerators on
FAST LDA #$80 ; Apple IIgs
CMDFAST LDA #$80 ; Apple IIgs
TSB $C036
STA GSSPEED
JSR UNLOCKZIP ; ZipChip
JSR DETECTZIP
JSR ZIPUNLOCK ; ZipChip
JSR ZIPDETECT
BCC :NOZIP
STA $C05B ; Enable
JMP LOCKZIP
BCS ZIPLOCK
:NOZIP STA $C05C ; Ultrawarp fast
RTS
*
* Handle *SLOW command
* --------------------
* Turn Apple II accelerators off
SLOW LDA #$80 ; Apple IIgs
CMDSLOW LDA #$80 ; Apple IIgs
TRB $C036
STZ GSSPEED
JSR UNLOCKZIP ; ZipChip
JSR DETECTZIP
JSR ZIPUNLOCK ; ZipChip
JSR ZIPDETECT
BCC :NOZIP
STZ $C05A ; Disable
JMP LOCKZIP
BCS ZIPLOCK
:NOZIP STA $C05D ; Ultrawarp slow
RTS
* Detect a ZipChip
* Set carry is ZipChip found
DETECTZIP LDA $C05C ; ZipChip manual p25
DETECTZIP
ZIPDETECT LDA $C05C ; ZipChip manual p25
EOR #$FF
STA $C05C
CMP $C05C
@ -762,14 +770,16 @@ DETECTZIP LDA $C05C ; ZipChip manual p25
EOR #$FF
STA $C05C
CMP $C05C
BNE :NOZIP
SEC
RTS
BEQ :ZIPOK ; BEQ already has SEC
* BNE :NOZIP
* SEC
* RTS
:NOZIP CLC
RTS
:ZIPOK RTS
* Unlock ZipChip registers
UNLOCKZIP PHP
UNLOCKZIP
ZIPUNLOCK PHP
SEI ; Timing sensitive
LDA #$5A
STA $C05A
@ -780,7 +790,8 @@ UNLOCKZIP PHP
RTS
* Lock ZipChip registers
LOCKZIP LDA #$A5
LOCKZIP
ZIPLOCK LDA #$A5
STA $C05A
RTS