Merge PR 140 'More fsc updates'

This commit is contained in:
Bobbi Webber-Manners 2021-10-28 23:13:47 -04:00
parent 5d7f8cd0c6
commit 38bcf9b4dd
7 changed files with 1767 additions and 2033 deletions

Binary file not shown.

View File

@ -14,7 +14,7 @@
*************************
* OSBYTE DISPATCH TABLE *
*************************
BYTWRDADDR DW BYTE00XX ; OSBYTE 0 - Machine host
BYTWRDADDR DW BYTE00 ; OSBYTE 0 - Machine host - INIT.s
DW BYTE01 ; OSBYTE 1 - User flag
DW BYTE02 ; OSBYTE 2 - OSRDCH source
DW BYTE03 ; OSBYTE 3 - OSWRCH dest
@ -248,12 +248,12 @@ WORD00 IF MAXLEN-OSTEXT-2
BPL :WORD00LP2
INY ; Initial line length = zero
ELSE
LDA (OSCTRL),Y ; Copy control block
STA OSTEXT,Y ; 0,1 => text
INY ; 2 = MAXLEN
CPY #$05 ; 3 = MINCHAR
BCC WORD00 ; 4 = MAXCHAR
LDY #$00 ; Initial line length = zero
LDY #$04 ; Copy control block
:WORD00LP3 LDA (OSCTRL),Y ; 0,1 => text
STA OSTEXT,Y ; 2 = MAXLEN
DEY ; 3 = MINCHAR
BPL :WORD00LP3 ; 4 = MAXCHAR
INY ; Initial line length = zero
FIN
* STY FXLINES ; Reset line counter
CLI
@ -467,38 +467,3 @@ OSWORDM ASC 'OSWORD($'
DB $00
OSBM2 ASC ').'
DB $00

View File

@ -26,10 +26,8 @@
* 09-Sep-2021 Moved keyboard OSBYTEs to here.
* 12-Sep-2021 COPY calls new VDU entry point.
* 15-Sep-2021 INKEY(0) tests once and returns immediately.
* TO DO: CHKESC should go through translations before testing.
* TO DO: move these to VDU
* OLDCHAR EQU OSKBD1 ; *TEMP* ; character under cursor
* COPYCHAR EQU OSKBD2 ; *TEMP* ; character under copy cursor
FLASHER EQU BYTEVARBASE+176 ; VSync counter for flashing cursor
FXEXEC EQU BYTEVARBASE+198
@ -56,6 +54,7 @@ WRCHHND PHA
PHX
PHY
* TO DO Check any output redirections
* PHA
JSR OUTCHAR
* TO DO Check any printer output
@ -444,33 +443,3 @@ BYTE7DOK RTS
BYTE76 LDX #$00 ; Update LEDs and return X=SHIFT
RTS ; Not possible with Apple

View File

@ -16,6 +16,8 @@
* 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.
* 29-Oct-2021 Bad *command->Bad command, bad *RUN->File not found.
* Optimised RENAME, COPY, CHDIR, DRIVE. FREE<cr> allowed.
* $B0-$BF Temporary filing system workspace
@ -42,12 +44,7 @@ FINDHND PHX
JSR PARSNAME ; Copy filename->MOSFILE
PLA ; Recover options
>>> XF2MAIN,OFILE
:CLOSE
* >>> WRTMAIN
* STY MOSFILE ; Write file number
* >>> WRTAUX
>>> XF2MAIN,CFILE ; Pass A,Y to main code
:CLOSE >>> XF2MAIN,CFILE ; Pass A,Y to main code
OSFINDRET >>> ENTAUX
JSR CHKERROR ; Check if error returned
PLY ; Value of A on entry
@ -68,9 +65,6 @@ OSGBPBM ASC 'OSGBPB.'
BPUTHND PHX
PHY
PHA ; Stash char to write
* >>> WRTMAIN
* STY MOSFILE ; File reference number
* >>> WRTAUX
>>> XF2MAIN,FILEPUT ; Pass A,Y to main code
OSBPUTRET >>> ENTAUX
JSR CHKERROR
@ -83,9 +77,6 @@ OSBPUTRET >>> ENTAUX
* OSBGET - read one byte from an open file
BGETHND PHX
PHY
* >>> WRTMAIN
* STY MOSFILE ; File ref number
* >>> WRTAUX
>>> XF2MAIN,FILEGET ; Pass A,Y to main code
OSBGETRET >>> ENTAUX
CPY #$01
@ -143,22 +134,11 @@ ARGSHND PHX
:S2 CMP #$FF ; Y=0,A=FF => flush all files
BNE :IEXIT
* >>> 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
CMP #$00 ; Y!=0,A=0 => read seq ptr
:HASFILE CMP #$00 ; Y!=0,A=0 => read seq ptr
BNE :S3
* >>> WRTMAIN
* STZ MOSFILE+2 ; 0 means get pos
* >>> WRTAUX
TXA
>>> XF2MAIN,TELL ; A=ZP, Y=channel
@ -177,9 +157,6 @@ ARGSHND PHX
:S4 CMP #$02 ; Y!=0,A=2 => read file len
BNE :S5
* >>> WRTMAIN
* STA MOSFILE+2 ; Non-zero means get len
* >>> WRTAUX
TXA
>>> XF2MAIN,SIZE ; A=ZP, Y=channel
@ -241,34 +218,12 @@ FILEHND PHX
PLA ; Get action back
>>> XF2MAIN,CALLFILE
* BEQ :SAVE ; A=00 -> SAVE
* CMP #$FF
* BEQ :LOAD ; A=FF -> LOAD
* CMP #$06
* BEQ :DELETE ; A=06 -> DELETE
* BCC :JMPINFO ; A=01-05 -> INFO
* CMP #$08
* BEQ :MKDIR ; A=08 -> MKDIR
*
* PLY ; Not implemented, return unchanged
* PLX
* RTS
*
*:JMPINFO JMP :INFO
*:SAVE >>> XF2MAIN,SAVEFILE
*:LOAD >>> XF2MAIN,LOADFILE
*:DELETE >>> XF2MAIN,DELFILE
*:INFO >>> XF2MAIN,INFOFILE
*:MKDIR >>> XF2MAIN,MAKEDIR
* On return here, A<$20 return to caller, A>$1F ProDOS error
OSFILERET >>> ENTAUX
JSR CHKERROR ; Check if error returned
PHA
LDY #$11 ; Copy updated control block back
:L3
* LDA AUXBLK,Y ; Mainmem left it in AUXBLK
LDA OSFILECB,Y ; Mainmem left it in OSFILECB
:L3 LDA OSFILECB,Y ; Mainmem left it in OSFILECB
STA (FSCTRL),Y
DEY
BPL :L3
@ -349,32 +304,14 @@ FSCHND CMP #13
PHA
LDA FSCDISPATCH+0,X
PHA
LDX FSXREG
LDA FSAREG
FSCNULL LDA FSAREG
LDY FSYREG
LDX FSXREG ; Set EQ/NE from X
RTS
* 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
* OSFSC 00 - *OPT function
FSCOPT TXA
BEQ :OPT0
* Entered with A=$00 and EQ/NE from X
FSCOPT BEQ :OPT0
LDA FSFLAG2
AND :OPTMSK-1,X
EOR :OPTSET-0,Y
@ -385,34 +322,25 @@ FSCOPT TXA
:OPTMSK DB $3F,$CF,$F3,$FC
:OPTSET DB $00,$55,$AA,$FF
*FSCDRIVE JMP DRIVE
*
*FSCFREE JMP FREE
*
*FSCACCESS JMP ACCESS
*
*FSCDESTROY JMP DESTROY
*
*JMPCAT JMP FSCCAT
FSCUKN PHA
FSCUKN
DO DEBUG
PHA
LDA #<OSFSCM
LDY #>OSFSCM
JSR PRSTR
PLA
FSCNULL RTS
FIN
FSCRET RTS
DO DEBUG
OSFSCM ASC 'OSFSC.'
DB $00
FIN
* OSFSC 01 - Read EOF function
* X=File ref number
*
CHKEOF
* >>> WRTMAIN
* STX MOSFILE ; File reference number
* >>> WRTAUX
TXA ; A=channel
CHKEOF TXA ; A=channel
>>> XF2MAIN,FILEEOF
CHKEOFRET >>> ENTAUX
TAX ; Return code -> X
@ -427,13 +355,15 @@ FSC03 JSR XYtoLPTR
LDX #<FSCCOMMAND
LDY #>FSCCOMMAND
JSR CLILOOKUP
BEQ FSCNULL ; Matched, return
BEQ FSCRET ; Matched, return
JSR LPTRtoXY ; Fall through to *RUN
LDA #$FE ; Will become A=$05
* OSFSC 04 - *RUN filename
* OSFSC 02 - */filename, OSFSC 04 - *RUN filename
* XY=>pathname
*
FSCRUN STX OSFILECB ; Pointer to filename
FSCRUN PHA
STX OSFILECB+0 ; Pointer to filename
STY OSFILECB+1
JSR XYtoLPTR
FSCRUNLP LDA (OSLPTR),Y ; Look for command line
@ -445,22 +375,26 @@ FSCRUNLP LDA (OSLPTR),Y ; Look for command line
JSR LPTRtoXY
STX FSCMDLINE+0 ; Set CMDLINE=>command line
STY FSCMDLINE+1 ; Collected by OSARGS 1,0
LDA #$FF ; OSFILE load flag
PLA
EOR #$FB ; Convert $FE->$05, $02/$04->$Fx
BMI :FSCRUN2 ; *RUN, go direct to LOAD
JSR :FSCCALL ; Do an initial INFO
DEC A ; $01->$00
BEQ :FSCRUN2 ; A file, load and run it
JMP FSCNULL ; Not a file, return all preserved
:FSCRUN2 LDA #$FF ; A=LOAD
STA OSFILECB+6 ; Use file's address
LDX #<OSFILECB ; Pointer to control block
LDY #>OSFILECB
JSR OSFILE
JSR :CALL
JSR :FSCCALL ; LOAD the file
JSR :CALLCODE ; Call the loaded code
LDA #$00 ; A=0 on return
RTS
:CALL LDA #$01 ; A=1 - entering code
:FSCCALL LDX #<OSFILECB ; Pointer to control block
LDY #>OSFILECB
JMP OSFILE
:CALLCODE LDA #$01 ; A=1 - entering code
SEC ; Not from RESET
JMP (OSFILECB+6) ; Jump to EXEC addr
* FSCREN JMP RENAME
*
* FSCCHDIR JMP CHDIR
* Display catalog entries and info
* A=5 *CAT, A=9 *EX, A=10 *INFO
@ -485,7 +419,6 @@ STARCATRET >>> ENTAUX
* Print one block of a catalog. Called by CATALOG
* Block is in AUXBLK
PRONEBLK >>> ENTAUX
*
LDA #<AUXBLK+4 ; FSPTR1=>first entry
STA FSPTR1+0
LDA #>AUXBLK+4
@ -495,28 +428,14 @@ PRONEBLK >>> ENTAUX
:CATLP LDY #$00
LDA (FSPTR1),Y ; Get storage type
CMP #$E0
* 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 ; CC=entry, CS=header
* PLP
* BCC :L1X
* JSR OSNEWL
*:L1X
:NOTKEY JSR PRONEENT ; CC=entry, CS=header
CLC ; Step to next entry
LDA FSPTR1+0
ADC #$27
@ -526,13 +445,6 @@ PRONEBLK >>> ENTAUX
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
@ -540,70 +452,26 @@ PRONEBLK >>> ENTAUX
* Print a single directory entry
* On entry: A = dirent index in AUXBLK
* 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
PRONEENT LDY #$00 ; Characters printed
LDA (FSPTR1),Y
AND #$0F ; Len of filename
BEQ :CATEXIT ; Inactive entry
BEQ NULLENT ; Inactive entry
PHP
TAX
:L2 INY
LDA (FSPTR1),Y
JSR OSWRCH ; Print filename
DEX
BNE :L2
* LDY #$01
*:L2 CPX #$00
* BEQ :S2
* LDA (FSPTR1),Y
* JSR OSWRCH
* DEX
* INY
* BRA :L2
:S2 PLP
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
JSR PRSPACES ; Pad after filename
BIT FSAREG
BMI :CATINFO ; Display object info
JMP PRACCESS
:EXITHDR JMP OSNEWL
PLP
:CATEXIT RTS
* BPL :EXIT
* Print object catalog info
:CATINFO LDY #$21
LDX #3
LDA #0
@ -615,14 +483,15 @@ PRONEENT
JSR PRSPACE
JSR PRACCESS
BIT FSFLAG2
BVS CATLONG
BMI CATLONG ; *OPT 1,2 - detailed EX display
LDY #$0A
PRSPACES JSR PRSPACE
INY
CPY #$10
BCC PRSPACES
RTS
NULLENT RTS
* Print extended catalog info
CATLONG LDY #$21
JSR PRDATETIME
LDY #$18
@ -676,34 +545,7 @@ 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
:EXITHDR JMP OSNEWL
* Print object access string
PRACCESS LDX #$04 ; Offset to chars
LDY #$1E
LDA (FSPTR1),Y
@ -740,14 +582,7 @@ PRACCESS LDX #$04 ; Offset to chars
JMP OSWRCH
ACCESSCHRS ASC 'RWLD'
*PRLOCK LDY #$1E
* LDA (FSPTR1),Y
* CMP #$40
* BCS PRADDROK
* LDA #'L'
* JMP OSWRCH
* Print object addresses
PRADDR LDX #3
PRADDRLP LDA (FSPTR1),Y
PRADDR0 JSR OUTHEX
@ -760,103 +595,81 @@ PRCHAR JMP OSWRCH
* OSFSC $0C - RENAME function
* XY=>pathname
FSCRENAME
RENAME JSR PARSNAME ; Copy Arg1->MOSFILE
CMP #$00 ; Length of arg1
BEQ :SYNTAX
* XY=>pathnames
*
FSCRENAME JSR PARSNAME ; Copy Arg1->MOSFILE
BEQ :SYNTAX ; No <oldname>
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
CMP #$00 ; Length of arg2
BEQ :SYNTAX
BEQ :SYNTAX ; No <newname>
>>> 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.
RENRET
>>> ENTAUX
JSR CHKERROR
LDA #$00
RTS
COPYRET
CHDIRRET >>> ENTAUX
JMP CHKERROR
* Handle *COPY command
* LPTR=>parameters string
*
FSCCOPY JSR PARSLPTR
* COPY JSR PARSNAME ; Copy Arg1->MOSFILE
CMP #$00 ; Length of arg1
BEQ :SYNTAX
FSCCOPY JSR PARSLPTR ; Copy Arg1->MOSFILE
BEQ :SYNTAX ; No <source>
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
CMP #$00 ; Length of arg2
BEQ :SYNTAX
>>> XF2MAIN,COPYFILE
BEQ :SYNTAX ; No <dest>
>>> XF2MAIN,COPYFILE ; Do the heavy lifting
:SYNTAX BRK
DB $DC
ASC 'Syntax: COPY <listspec> <*objspec*>'
ASC 'Syntax: COPY <sourcespec> <destspec>'
BRK
COPYRET
>>> ENTAUX
JSR CHKERROR
LDA #$00
RTS
* 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
FSCCHDIR JSR PARSLPTR ; Copy filename->MOSFILE
BEQ ERRCHDIR ; No <dir>
FSCCHDIR2 >>> XF2MAIN,SETPFX
ERRCHDIR BRK
DB $DC
ASC 'Syntax: DIR <*objspec*>'
ASC 'Syntax: DIR <dir>'
BRK
:HASPARM >>> XF2MAIN,SETPFX
* Handle *DRIVE command, which is similar
* Handle *DRIVE command, which is similar to CHDIR
* LPTR=>parameters string
*
FSCDRIVE
DRIVE LDA (OSLPTR),Y ; First char
FSCDRIVE LDA (OSLPTR),Y ; First char
CMP #$3A ; Colon
BNE :ERR
BNE :SYNTAX
JSR PARSLPTR ; Copy arg->MOSFILE
CMP #$03 ; Check 3 char arg
BEQ :HASPARM
:ERR BRK
BEQ FSCCHDIR2 ; Pass on as CHDIR
:SYNTAX BRK
DB $DC
ASC 'Syntax: DRIVE <drv> (eg: DRIVE :61)'
BRK
:HASPARM >>> XF2MAIN,SETPFX
CHDIRRET
>>> ENTAUX
JSR CHKERROR
CMP #$00
BEQ :EXIT
BRK
DB $CE ; Bad directory
ASC 'Bad dir'
BRK
:EXIT RTS
* Handle *FREE command
* LPTR=>parameters string
* Also allows *FREE<cr> for current drive
*
FSCFREE
FREE LDA (OSLPTR),Y ; First char
CMP #$3A ; Colon
BNE :ERR
* LDA (OSLPTR),Y ; First char
* CMP #$3A ; Colon
* BNE :ERR
JSR PARSLPTR ; Copy arg->MOSFILE
BEQ :HASPARM ; *FREE <cr>
CMP #$03 ; Check 3 char arg
BEQ :HASPARM
:ERR BRK
DB $DC
ASC 'Syntax: FREE <drv> (eg: FREE :61)'
ASC 'Syntax: FREE (<drv>) (eg: FREE :61)'
BRK
:HASPARM >>> XF2MAIN,DRVINFO
@ -869,22 +682,25 @@ FREERET
DB $CE ; Bad directory
ASC 'Bad dir'
BRK
:NOERR SEC
LDA AUXBLK+2 ; LSB of total blks
SBC AUXBLK+0 ; LSB of blocks used
TAX
LDA AUXBLK+3 ; MSB of total blks
SBC AUXBLK+1 ; MSB of blocks used
TAY
LDA #$00 ; *TO DO* b16-b23 of free
* Disk size is two-byte 512-byte block count
* Maximum disk size is $FFFF blocks = 1FFFF00 bytes = 33554176 bytes = 32M-512
:NOERR SEC
LDA AUXBLK+2 ; LSB of total blocks
SBC AUXBLK+0 ; LSB of blocks used
TAX ; X=b0-b7 of blocks free
LDA AUXBLK+3 ; MSB of total blocks
SBC AUXBLK+1 ; MSB of blocks used
TAY ; Y=b8-b15 of blocks free
LDA #$00 ; A=b16-b23 of blocks free
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
LDX #<:FREE
LDY #>:FREE
JSR OUTSTR ; Print 'free'<nl>
LDX AUXBLK+0 ; Blocks used
LDY AUXBLK+1
LDA #$00 ; *TO DO* b16-b23 of used
LDX AUXBLK+0 ; X=b0-b7 of blocks used
LDY AUXBLK+1 ; Y=b8-b15 of blocks used
LDA #$00 ; A=b16-b23 of blocks used
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
LDX #<:USED
LDY #>:USED
@ -893,7 +709,6 @@ FREERET
:FREEDEC STX FSNUM+1
STY FSNUM+2
STA FSNUM+3
* What's the maximum number of blocks?
* JSR PRHEX ; Blocks b16-b23 in hex
JSR PR2HEX ; Blocks b0-b15 in hex
LDX #<:BLOCKS
@ -922,8 +737,8 @@ FREERET
* Handle *ACCESS command
* LPTR=>parameters string
*
FSCACCESS
ACCESS JSR PARSLPTR ; Copy filename->MOSFILE
ACCESS
FSCACCESS JSR PARSLPTR ; Copy filename->MOSFILE
CMP #$00 ; Filename length
BEQ :SYNTAX
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
@ -1070,24 +885,24 @@ MKERROR3 ASL A
PHA
PHP
RTI
MKERROR4 DW ERROR28,ERROR27,ERROR27,ERROR2B,ERROR27,ERROR27,ERROR2E,ERROR27
MKERROR4 DW ERROR28,ERROR27,ERROR27,ERROR2B,ERROR2C,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
DW ERROR27,ERROR27,ERROR5A,ERROR5B,ERROR27,ERROR5D,ERROR5E,ERROR27
DW ERROR27,ERROR27,ERROR5A,ERROR27,ERROR27,ERROR27,ERROR5E,ERROR27
* $27 - I/O error (disk not formatted)
* $28 - No device con'd (drive not present) Disk not present
* $29 -(GSOS Driver is busy)
* $2A -
* $2B - Disk write protected. Disk write protected
* $2C -(GSOS bad byte count)
* $2C - Bad byte count - file too long File too long
* $2D -(GSOS bad block number)
* $2E - Disk switched Disk changed
* $2F - Device is offline (drive empty/absent)
* $40 - Invalid pathname syntax. Bad filename
* $41 -(Duplicate filename. split from $47) Is a directory)
* $41 -(Duplicate filename. split from $47) Is a directory
* $42 - File Control Block table full. Too many open
* $43 - Invalid reference number. Channel not open
* $44 - Path not found. (Dir not found) File not found
@ -1107,16 +922,16 @@ MKERROR4 DW ERROR28,ERROR27,ERROR27,ERROR2B,ERROR27,ERROR27,ERROR2E,ERROR
* $52 - Not a ProDOS disk. Disk not recognised
* $53 - Invalid parameter. Invalid parameter
* $54 -(Dir not empty when deleting, cf $4E) DEL: Dir not empty
* $55 - Volume Control Block table full.
* $55 - Volume Control Block table full. (Too many disks mounted)
* $56 - Bad buffer address.
* $57 - Duplicate volume.
* $58 - Bad volume bitmap.
* $58 - Bad volume bitmap/Not block device.
* $59 -(GSOS File level out of range)
* $5A - Bit map disk address is impossible. Sector not found
* $5B -(GSOS Bad ChangePath pathname)
* $5C -(GSOS Not executable file)
* $5D -(GSOS OS/FS not found) (EOF during load or save) Data lost
* $5E -(Couldn't open to save) Can't save
* $5D -(GSOS OS/FS not found)
* $5E -(Destination filename has wildcards) Wildcards
* $5F -(GSOS Too many applications)
* $60+ - (GSOS)
@ -1126,6 +941,8 @@ ERROR28 DW $D200
ASC 'Disk not present' ; $28 - No device detected/connected
ERROR2B DW $C900
ASC 'Disk write protected'; $2B - Disk write protected
ERROR2C DW $C600
ASC 'File too big' ; $2C - Too big to save
ERROR2E DW $C800
ASC 'Disk changed' ; $2E - Disk switched
ERROR40 DW $CC00
@ -1175,18 +992,10 @@ ERROR56 DW $FF00
ASC 'ProDOS: Bad addr' ; $56 - Bad buffer address
ERROR57 DW $FF00
ASC 'ProDOS: Dup volm' ; $57 - Duplicate volume
ERROR5B ; spare
ERROR5A DW $FF00
ASC 'Sector not found' ; $5A - Bit map disk address is impossible
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
ERROR5E DW $FD00
ASC 'Wildcards' ; $5E - Can't use wildcards in dest filename
ERROR27 DW $FF00
ASC 'I/O error' ; $27 - I/O error
DB $00

View File

@ -7,6 +7,8 @@
* BBC Micro 'virtual machine' in Apple //e aux memory
***********************************************************
MAXROM EQU $F9 ; Max sideways ROM number
ZP1 EQU $90 ; $90-$9f are spare Econet space
; so safe to use
ZP2 EQU $92
@ -123,8 +125,7 @@ MOSHIGH SEI
DEX
BPL :INITPG2
JSR ROMINIT ; Initialize sideways ROM table
JSR ROMINIT ; Build list of sideways ROMs
JSR KBDINIT ; Returns A=startup MODE
JSR VDUINIT ; Initialise VDU driver
JSR PRHELLO
@ -160,6 +161,18 @@ SERVICE TAX ; Enter here with A=Service Num
BYTE8F
SERVICEX LDA $F4
PHA ; Save current ROM
* LDA $E0 ; *DEBUG*
* AND #$20
* BEQ :SERVDEBUG
* TXA
* JSR PRHEX
* LDA OSLPTR+1
* JSR PRHEX
* LDA OSLPTR+0
* JSR PRHEX ; *DEBUG*
*:SERVDEBUG
TXA
LDX MAXROM ; Start at highest ROM
:SERVLP JSR ROMSELECT ; Bring it into memory
@ -191,12 +204,7 @@ BYTE00 BEQ BYTE00A ; OSBYTE 0,0 - generate error
RTS ; %000x1xxx host type, 'A'pple
BYTE00A BRK
DB $F7
HELLO ASC 'Applecorn MOS 2021-10-27'
HELLO ASC 'Applecorn MOS 2021-10-28'
DB $00 ; Unify MOS messages
MAXROM DB $00 ; Index of highest sideways ROM

View File

@ -16,7 +16,8 @@
* $E0-$EE Internal MOS workspace
* $EF-$FF MOS API workspace
DEBUG EQU $E0 ; $E0 *TEST* Debug flag
* DEBUG EQU $00 ; $00=*OPT 255 debug code removed
DEBUG EQU $E0 ; $E0=*OPT 255 debug code included
* ; $E1
FSFLAG1 EQU $E2 ; $E2
FSFLAG2 EQU $E3 ; $E3 HOSTFS *OPT settings
@ -35,8 +36,11 @@ OSXREG EQU OSAREG+1 ; $F0 X register
OSYREG EQU OSXREG+1 ; $F1 Y register
OSCTRL EQU OSXREG ; $F0 (XY)=>control block
OSLPTR EQU $F2 ; $F2 => command line
OSROMNUM EQU $F4 ; $F4 current ROM
*
ROMID EQU $F4 ; $F4 current ROM
ROMTMP EQU $F5 ; $F5
ROMPTR EQU $F6 ; $F6 =>
* ; $F8 *TEMP* pseudo-SROM settings
* ; $F9 *TEMP* pseudo-SROM settings
OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off
OSINTA EQU $FC ; $FC IRQ register A store
FAULT EQU $FD ; $FD Error message pointer
@ -70,7 +74,3 @@ OSGBPBCB EQU OSFILECB+1 ; OSGBPB control block
* $0300-$03DF
* $03E0-$03FF Used for interfacing with ProDOS XFER

View File

@ -18,6 +18,7 @@
* 23-Oct-2021 Moved all the OSFILE routines together.
* Optimised entry and return from OSFILE routines.
* DELETE returns 'Dir not empty' when appropriate.
* 29-Oct-2021 DRVINFO reads current drive if "".
* ProDOS file handling to rename a file
@ -104,7 +105,7 @@ COPYFILE >>> ENTMAIN
LDA #$46 ; 'File not found'
BRA :EXIT
:BADDEST JSR CLSDIR
LDA #$FD ; 'Wildcards' error
LDA #$5E ; 'Wildcards' error
BRA :EXIT
:NOMORE JSR CLSDIR
LDA #$00
@ -454,24 +455,15 @@ FILEDISPATCH CMP #$00
SVCSAVE JMP SAVEFILE
SVCLOAD JMP LOADFILE
INFOFILE
* >>> ENTMAIN
* JSR PREPATH ; Preprocess path
* JSR UPDFB ; Update FILEBLK
JSR UPDPATH ; Process path and get info
INFOFILE JSR UPDPATH ; Process path and get info
JMP COPYFB ; Copy back to aux mem
* >>> XF2AUX,OSFILERET
* ProDOS file handling to delete a file
* Called by AppleMOS OSFILE
* Return A=0 no object, A=1 file deleted, A=2 dir deleted
* A>$1F ProDOS error
DELFILE
* >>> ENTMAIN
* JSR PREPATH ; Preprocess path
* JSR UPDFB ; Update FILEBLK
JSR UPDPATH ; Process path and get info
DELFILE JSR UPDPATH ; Process path and get info
JSR COPYFB ; Copy back to aux mem
PHA ; Save object type
JSR DODELETE
@ -495,7 +487,6 @@ DELFILE
PHA
:DELETED PLA ; Get object back
:EXIT RTS
* >>> XF2AUX,OSFILERET
DODELETE LDA #<MOSFILE ; Attempt to destroy file
STA DESTPL+1
@ -511,11 +502,7 @@ DODELETE LDA #<MOSFILE ; Attempt to destroy file
* Invoked by AppleMOS OSFILE
* Return A=$02 on success (ie: 'directory')
* A>$1F ProDOS error, translated by OSFILE handler
MAKEDIR
* >>> ENTMAIN
* JSR PREPATH ; Preprocess path
* JSR UPDFB ; Update FILEBLK
JSR UPDPATH ; Process path and get info
MAKEDIR JSR UPDPATH ; Process path and get info
CMP #$02
BEQ :EXIT1 ; Dir already exists
@ -529,16 +516,13 @@ MAKEDIR
JSR UPDFB ; Update FILEBLK, returns A=$02
:EXIT1 JSR COPYFB ; Copy FILEBLK to aux mem
:EXIT RTS
* >>> XF2AUX,OSFILERET
* ProDOS file handling for MOS OSFILE LOAD call
* Invoked by AppleMOS OSFILE
* Return A=01 if successful (meaning 'file')
* A>$1F ProDOS error, translated by FILERET
LOADFILE
* >>> ENTMAIN
LDX #4
LOADFILE LDX #4
:LP LDA FBLOAD,X ; Get address to load to
STA ZPMOS,X
DEX
@ -577,7 +561,6 @@ LOADFILE
JSR COPYFB ; Copy FILEBLK to auxmem
LDA #$01 ; $01=File
:EXIT2 RTS
* >>> XF2AUX,OSFILERET
* A=channel, MOSZP+0/1=address to load to, TO DO: MOS+4/5=length to read
@ -623,9 +606,7 @@ READDATA STA READPL+1
* Invoked by AppleMOS OSFILE
* Return A=01 if successful (ie: 'file')
* A>$1F ProDOS error translated by FILERET
SAVEFILE
* >>> ENTMAIN
SEC ; Compute file length
SAVEFILE SEC ; Compute file length
LDA FBEND+0
SBC FBSTRT+0
STA LENREM+0
@ -638,7 +619,8 @@ SAVEFILE
LDA FBEND+3
SBC FBSTRT+3
BEQ :L0 ; >16M
:TOOBIG JMP :CANTSAVE
:TOOBIG LDA #$2C ; Bad byte count - file too long
RTS
:L0 JSR PREPATH ; Preprocess pathname
JSR EXISTS ; See if file exists ...
@ -681,9 +663,6 @@ SAVEFILE
BNE :EXIT3 ; Change 'Insuff. access'
LDA #$4F ; to 'Locked'
:EXIT3 RTS
* >>> XF2AUX,OSFILERET
:CANTSAVE LDA #$5E ; Can't open/create
BRA :EXIT3 ; TO DO: Error=File too long
* A=channel, FBSTRT+0/1=address to save from
@ -849,8 +828,7 @@ UPDFB LDA #<MOSFILE
LDA #$01 ; Prepare A=file
LDX GINFOPL+7
CPX #$0D ; Is it a directory?
BNE :UPDFB5
LDA #$02 ; Return A=directory
ADC #$00 ; Becomes A=2 for directory
:UPDFB5 RTS
:ERR
@ -865,9 +843,9 @@ CHKNOTFND CMP #$44 ; Convert ProDOS 'not found'
* Quit to ProDOS
QUIT INC $3F4 ; Invalidate powerup byte
QUIT INC $03F4 ; Invalidate powerup byte
STA $C054 ; PAGE2 off
STA $C00E ; Turn off alt charset
STA $C00E ; Alt font off
JSR MLI
DB QUITCMD
DW QUITPL
@ -962,7 +940,8 @@ INFOCLS JSR CLSDIR ; Be sure to close it!
BRA CATEXIT
* Set prefix. Used by *CHDIR to change directory
* Set prefix. Used by *CHDIR/*DRIVE to change directory
*
SETPFX >>> ENTMAIN
JSR PREPATH ; Preprocess pathname
JSR WILDONE ; Handle any wildcards
@ -974,13 +953,19 @@ SETPFX >>> ENTMAIN
JSR MLI ; SET_PREFIX
DB SPFXCMD
DW SPFXPL
* Returns $4B 'Unknown storage' if *CD <notdir>
:EXIT >>> XF2AUX,CHDIRRET
:ERR LDA #$40 ; Invalid pathname syn
BRA :EXIT
* Obtain info on blocks used/total blocks
DRVINFO >>> ENTMAIN
JSR PREPATH
LDA MOSFILE
BNE :DRVINF2
INC MOSFILE
LDA #'@'
STA MOSFILE+1 ; Convert "" to "@"
:DRVINF2 JSR PREPATH
BCS :ERR
LDA #<MOSFILE
STA GINFOPL+1
@ -1115,5 +1100,3 @@ MAINRDMEM STA A1L
LDA (A1L)
MAINRDEXIT >>> XF2AUX,NULLRTS ; Back to an RTS