From 9347de80591601708ad7d07de074124bcd01eb02 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Wed, 3 Nov 2021 22:55:05 -0400 Subject: [PATCH] Merge PR 143 'Updated CHDIR, FREE' --- applecorn.po | Bin 819200 -> 819200 bytes auxmem.hostfs.s | 201 ++++++++++++++++++-------------- auxmem.init.s | 2 +- auxmem.misc.s | 20 +++- mainmem.misc.s | 299 +++++++++++++++++++++++------------------------- mainmem.path.s | 11 +- mainmem.svc.s | 48 +++++--- 7 files changed, 302 insertions(+), 279 deletions(-) diff --git a/applecorn.po b/applecorn.po index d40b221db94cc199a6efc12f026db08a1ccc3de7..f75dee1b87607c7d8858d8271f1b1a9442fc5efb 100644 GIT binary patch delta 6338 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 T(bnqdt<^DGt4Hsvj!pSL&Myn7 diff --git a/auxmem.hostfs.s b/auxmem.hostfs.s index 092ece2..df29c7d 100644 --- a/auxmem.hostfs.s +++ b/auxmem.hostfs.s @@ -18,6 +18,10 @@ * *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 allowed. +* 01-Oct-2021 DRIVE, CHDIR shares same code, checking moved to maincode. +* 02-Oct-2021 ACCESS uses generic access byte parsing. +* PRACCESS shares code with ACCESS. +* *BUG* PARSNAME should check len<64. * $B0-$BF Temporary filing system workspace @@ -30,6 +34,7 @@ FSCTRL EQU FSXREG FSPTR1 EQU $C4 FSPTR2 EQU $C6 FSNUM EQU $C8 +FSACCBYTE EQU FSNUM+1 FSZPCC EQU $CC FSCMDLINE EQU $CE @@ -99,9 +104,16 @@ OSBGETRET >>> ENTAUX * A=01 Write PTR#Y * A=02 Read EXT#Y * A=03 Write EXT#Y +* (A=04 Read alloc#Y) +* (A=05 Read EOF#Y) +* (A=06 Write alloc#Y) * Y=0 A=FF Flush all channels * A=00 Return filing system number in A * A=01 Read command line address +* (A=02 Read NFS bugfix flag) +* (A=03 Read LIBFS filing system) +* (A=04 Read used disk space) +* (A=05 Read free disk space) * On exit, A=0 - implemented (except ARGS 0,0) * A - preserved=unimplemented * X,Y - preserved @@ -546,41 +558,67 @@ PRDECSLH JSR PRDEC JMP OSWRCH * Print object access string -PRACCESS LDX #$04 ; Offset to chars +PRACCESS LDX #$04 ; Offset to 'D' char + LDY #$00 + LDA (FSPTR1),Y + CMP #$D0 ; CS=Directory 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 + LDA (FSPTR1),Y ; Permission byte + LDY #$0C ; Char counter EOR #$C0 - CMP #$40 - 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' +* AND #$E3 ; Keep LLB---WR + AND #$C3 ; Keep LL----WR + BCC :PRACC1 ; Not a directory + AND #$FC ; Drop 'WR' bits +:PRACC1 STA FSACCBYTE + BCS :PRACC2 ; Jump to print 'D' +:PRACCLP LDA FSACCBYTE + AND ACCESSBITS,X ; Is bit set? + BEQ :PRACC3 +:PRACC2 LDA ACCESSCHRS,X ; If so, print character + JSR OSWRCH + INY ; Inc. char counter +:PRACC3 DEX + BPL :PRACCLP ; Loop for all chars + JMP PRSPACES ; Pad + +* 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 +* 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 'RWBLD' +ACCESSBITS DB $01,$02,$20,$C0,$00 * Print object addresses PRADDR LDX #3 @@ -608,8 +646,10 @@ FSCRENAME JSR PARSNAME ; Copy Arg1->MOSFILE BRK * ProDOS returns $40 (Bad filename) for bad renames. * Not easy to seperate out, so leave as Bad filename error. +ACCRET RENRET COPYRET +DESTRET CHDIRRET >>> ENTAUX JMP CHKERROR @@ -624,7 +664,7 @@ FSCCOPY JSR PARSLPTR ; Copy Arg1->MOSFILE >>> XF2MAIN,COPYFILE ; Do the heavy lifting :SYNTAX BRK DB $DC - ASC 'Syntax: COPY ' + ASC 'Syntax: COPY ' BRK @@ -633,6 +673,7 @@ FSCCOPY JSR PARSLPTR ; Copy Arg1->MOSFILE * FSCCHDIR JSR PARSLPTR ; Copy filename->MOSFILE BEQ ERRCHDIR ; No + LDY #$00 ; Y=$00 - CHDIR FSCCHDIR2 >>> XF2MAIN,SETPFX ERRCHDIR BRK DB $DC @@ -643,12 +684,9 @@ ERRCHDIR BRK * Handle *DRIVE command, which is similar to CHDIR * LPTR=>parameters string * -FSCDRIVE LDA (OSLPTR),Y ; First char - CMP #$3A ; Colon - BNE :SYNTAX - JSR PARSLPTR ; Copy arg->MOSFILE - CMP #$03 ; Check 3 char arg - BEQ FSCCHDIR2 ; Pass on as CHDIR +FSCDRIVE JSR PARSLPTR ; Copy arg->MOSFILE + TAY ; Y<>$00 - DRIVE + BNE FSCCHDIR2 ; Pass on as CHDIR :SYNTAX BRK DB $DC ASC 'Syntax: DRIVE (eg: DRIVE :61)' @@ -657,32 +695,13 @@ FSCDRIVE LDA (OSLPTR),Y ; First char * Handle *FREE command * LPTR=>parameters string -* Also allows *FREE for current drive +* Syntax is FREE () * -FSCFREE -* LDA (OSLPTR),Y ; First char -* CMP #$3A ; Colon -* BNE :ERR - JSR PARSLPTR ; Copy arg->MOSFILE - BEQ :HASPARM ; *FREE - CMP #$03 ; Check 3 char arg - BEQ :HASPARM -:ERR BRK - DB $DC - ASC 'Syntax: FREE () (eg: FREE :61)' - BRK -:HASPARM >>> XF2MAIN,DRVINFO - -FREERET - >>> ENTAUX +FSCFREE JSR PARSLPTR ; Copy arg->MOSFILE + >>> XF2MAIN,DRVINFO +FREERET >>> ENTAUX JSR CHKERROR - CMP #$00 - BEQ :NOERR - BRK - DB $CE ; Bad directory - ASC 'Bad dir' - BRK - +* * Disk size is two-byte 512-byte block count * Maximum disk size is $FFFF blocks = 1FFFF00 bytes = 33554176 bytes = 32M-512 :NOERR SEC @@ -737,41 +756,44 @@ FREERET * Handle *ACCESS command * LPTR=>parameters string * -ACCESS FSCACCESS JSR PARSLPTR ; Copy filename->MOSFILE - CMP #$00 ; Filename length - BEQ :SYNTAX - JSR PARSLPTR2 ; Copy Arg2->MOSFILE2 + BEQ :SYNTAX ; No filename + STZ FSACCBYTE ; Initialise access to "" +:ACCESSLP1 LDA (OSLPTR),Y ; Get access character + CMP #$0D + BEQ :ACCESSGO ; End of line, action it + INY + AND #$DF ; Upper case + LDX #$04 ; Check five chars 'DLBWR' +:ACCESSLP2 CMP ACCESSCHRS,X + BNE :ACCESSNXT + LDA ACCESSBITS,X ; Add this to access mask + ORA FSACCBYTE + STA FSACCBYTE +:ACCESSNXT DEX + BPL :ACCESSLP2 + BMI :ACCESSLP1 ; Check next character +:ACCESSGO LDA FSACCBYTE + EOR #$C0 ; MOSFILE=filename, A=access mask >>> XF2MAIN,SETPERM :SYNTAX BRK DB $DC ASC 'Syntax: ACCESS ' BRK -ACCRET >>> ENTAUX - JSR CHKERROR - LDA #$00 - RTS - * Handle *DESTROY command * LPTR=>parameters string * FSCDESTROY DESTROY JSR PARSLPTR ; Copy filename->MOSFILE - CMP #$00 ; Filename length - BEQ :SYNTAX + BEQ :SYNTAX ; No filename >>> XF2MAIN,MULTIDEL :SYNTAX BRK DB $DC ASC 'Syntax: DESTROY ' BRK -DESTRET >>> ENTAUX - JSR CHKERROR - LDA #$00 - RTS - * Handle *TITLE command * LPTR=>parameters string @@ -885,19 +907,19 @@ MKERROR3 ASL A PHA PHP RTI -MKERROR4 DW ERROR28,ERROR27,ERROR27,ERROR2B,ERROR2C,ERROR27,ERROR2E,ERROR27 +MKERROR4 DW ERROR28,ERROR27,ERROR2A,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,ERROR27,ERROR27,ERROR27,ERROR5E,ERROR27 * $27 - I/O error (disk not formatted) -* $28 - No device con'd (drive not present) Disk not present +* $28 - No device con'd (drive not present) Drive not present * $29 -(GSOS Driver is busy) -* $2A - +* $2A -(Not a drive specifier) DRIVE/FREE: Bad drive * $2B - Disk write protected. Disk write protected * $2C - Bad byte count - file too long File too long -* $2D -(GSOS bad block number) +* $2D -(GSOS bad block number) (Sector not found?) * $2E - Disk switched Disk changed * $2F - Device is offline (drive empty/absent) @@ -912,7 +934,7 @@ MKERROR4 DW ERROR28,ERROR27,ERROR27,ERROR2B,ERROR2C,ERROR27,ERROR2E,ERROR2 * $48 - Overrun error. Disk full * $49 - Volume directory full. Directory full * $4A - Incompatible file format. Disk not recognised -* $4B - Unsupported storage_type. Disk not recognised +* $4B - Unsupported storage_type. Not a directory * $4C - End of file has been encountered. End of file * $4D - Position out of range. Past end of file * $4E - Access error. (see also $4F) RD/WR: Insufficient access @@ -921,7 +943,7 @@ MKERROR4 DW ERROR28,ERROR27,ERROR27,ERROR2B,ERROR2C,ERROR27,ERROR2E,ERROR2 * $51 - Directory count error. Broken directory * $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 +* $54 -(Dir not empty when deleting, cf $4E) DEL: Directory not empty * $55 - Volume Control Block table full. (Too many disks mounted) * $56 - Bad buffer address. * $57 - Duplicate volume. @@ -936,9 +958,11 @@ MKERROR4 DW ERROR28,ERROR27,ERROR27,ERROR2B,ERROR2C,ERROR27,ERROR2E,ERROR2 * $60+ - (GSOS) -* AcornOS ProDOS +* AcornOS ProDOS ERROR28 DW $D200 ASC 'Disk not present' ; $28 - No device detected/connected +ERROR2A DW $CD00 + ASC 'Bad drive' ; $2A - Not a drive specifier ERROR2B DW $C900 ASC 'Disk write protected'; $2B - Disk write protected ERROR2C DW $C600 @@ -965,9 +989,10 @@ ERROR48 DW $C600 ERROR49 DW $B300 ASC 'Directory full' ; $49 - Volume directory full ERROR4A ; $4A - Incompatible file format -ERROR4B ; $4B - Unsupported storage_type ERROR52 DW $C800 ASC 'Disk not recognised' ; $52 - Not a ProDOS disk +ERROR4B DW $BE00 ; $4B - Unsupported storage_type + ASC 'Not a directory' ERROR4C DW $DF00 ASC 'End of file' ; $4C - End of file has been encountered ERROR4D DW $C100 diff --git a/auxmem.init.s b/auxmem.init.s index a868acc..57397ef 100644 --- a/auxmem.init.s +++ b/auxmem.init.s @@ -204,7 +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-28' +HELLO ASC 'Applecorn MOS 2021-11-03' DB $00 ; Unify MOS messages diff --git a/auxmem.misc.s b/auxmem.misc.s index 38b9389..2bce254 100644 --- a/auxmem.misc.s +++ b/auxmem.misc.s @@ -7,6 +7,7 @@ * 20-Sep-2021 Updated PRDECIMAL routine, prints up to 32 bits. * 25-Oct-2021 Initial pseudo-sideways ROM selection code. * 26-Oct-2021 Corrected entry parameters to OSRDRM. +* 03-Nov-2021 Temp'y fix, if can't find SROM, ignores it. * OSBYTE $80 - ADVAL @@ -341,6 +342,12 @@ ROMSELECT CPX $F8 :ROMSEL PHA PHX PHY + + LDA OSLPTR+0 + PHA + LDA OSLPTR+1 + PHA + TXA ASL A TAX @@ -348,6 +355,14 @@ ROMSELECT CPX $F8 STA OSFILECB+0 LDA ROMTAB+1,X ; MSB of pointer to name STA OSFILECB+1 + + LDX #OSFILECB + LDA #$05 ; Means 'INFO' + JSR OSFILE + CMP #$01 + BNE :ROMNOTFND ; File not found + STZ OSFILECB+2 ; Dest address $8000 LDA #$80 STA OSFILECB+3 @@ -356,12 +371,9 @@ ROMSELECT CPX $F8 STZ OSFILECB+6 ; Load to specified address LDX #OSFILECB - LDA OSLPTR+0 - PHA - LDA OSLPTR+1 - PHA LDA #$FF ; Means 'LOAD' JSR OSFILE +:ROMNOTFND PLA STA OSLPTR+1 PLA diff --git a/mainmem.misc.s b/mainmem.misc.s index 42a9a7a..10716ce 100644 --- a/mainmem.misc.s +++ b/mainmem.misc.s @@ -7,198 +7,179 @@ * A1L/A1H: Start address * A2L/A2H: End address * A4L/A4H: Destination start address -MEMCPY LDA (A1L) - STA (A4L) - LDA A1H - CMP A2H - BNE :S1 - LDA A1L - CMP A2L - BNE :S1 - BRA :DONE -:S1 INC A1L - BNE :S2 - INC A1H -:S2 INC A4L - BNE :S3 - INC A4H -:S3 BRA MEMCPY -:DONE RTS +MEMCPY LDA (A1L) + STA (A4L) + LDA A1H + CMP A2H + BNE :S1 + LDA A1L + CMP A2L + BNE :S1 +:DONE RTS +:S1 INC A1L + BNE :S2 + INC A1H +:S2 INC A4L + BNE :S3 + INC A4H +:S3 BRA MEMCPY * Copy 512 bytes from BLKBUF to AUXBLK in aux LC -COPYAUXBLK >>> ALTZP ; Alt ZP & Alt LC on - LDY #$00 -:L1 LDA BLKBUF,Y - STA $C005 ; Write aux mem - STA AUXBLK,Y - STA $C004 ; Write main mem - CPY #$FF - BEQ :S1 - INY - BRA :L1 -:S1 LDY #$00 -:L2 LDA BLKBUF+$100,Y - STA $C005 ; Write aux mem - STA AUXBLK+$100,Y - STA $C004 ; Write main mem - CPY #$FF - BEQ :S2 - INY - BRA :L2 -:S2 >>> MAINZP ; Alt ZP off, ROM back in - RTS +COPYAUXBLK >>> ALTZP ; Alt ZP & Alt LC on + LDY #$00 + STA $C005 ; Write aux mem +:L1 LDA BLKBUF+$000,Y + STA AUXBLK+$000,Y + LDA BLKBUF+$100,Y + STA AUXBLK+$100,Y + INY + BNE :L1 + STA $C004 ; Write main mem +:S2 >>> MAINZP ; Alt ZP off, ROM back in + RTS * Search FILEREFS for value in A * On return, buffer number is in X (or $FF if no bufs) -FINDBUF LDX #$00 -:L1 CMP FILEREFS,X - BEQ :END - INX - CPX #$04 - BNE :L1 - LDX #$FF ; $FF for not found -:END RTS +FINDBUF LDX #$00 +:L1 CMP FILEREFS,X + BEQ :END + INX + CPX #$04 + BNE :L1 + LDX #$FF ; $FF for not found +:END RTS * Obtain I/O buffer address * On entry: buffer number in X * On exit: buffer address in AY * Carry set if no bufs, clear otherwise -BUFADDR CPX #$00 - BNE :S1 - LDA #IOBUF1 - BRA :EXIT -:S1 CPX #$01 - BNE :S2 - LDA #IOBUF2 - BRA :EXIT -:S2 CPX #$02 - BNE :S3 - LDA #IOBUF3 - BRA :EXIT -:S3 CPX #$03 - BNE :NOBUFS - LDA #IOBUF4 -:EXIT CLC - RTS -:NOBUFS SEC - RTS +BUFADDR CPX #$00 + BNE :S1 + LDA #IOBUF1 + BRA :EXIT +:S1 CPX #$01 + BNE :S2 + LDA #IOBUF2 + BRA :EXIT +:S2 CPX #$02 + BNE :S3 + LDA #IOBUF3 + BRA :EXIT +:S3 CPX #$03 + BNE :NOBUFS + LDA #IOBUF4 +:EXIT CLC + RTS +:NOBUFS SEC + RTS + * Check if file exists -* Return A=0 if doesn't exist, A=1 file, A=2 dir -EXISTS LDA #MOSFILE - STA GINFOPL+2 - JSR GETINFO ; GET_FILE_INFO - BCS :NOEXIST - LDA GINFOPL+7 ; Storage type - CMP #$0D - BCS :DIR ; >= $0D - LDA #$01 ; File - RTS -:DIR LDA #$02 - RTS -:NOEXIST LDA #$00 - RTS +* Returns A=0 if doesn't exist, A=1 file, A=2 dir +EXISTS LDA #MOSFILE + STA GINFOPL+2 + JSR GETINFO ; GET_FILE_INFO + LDA #$00 + BCS :EXIT ; Any error -> $00 + LDA GINFOPL+7 ; Storage type + CMP #$0D + LDA #$01 ; File -> $01 + ADC #$00 ; Dir. -> $02 +:EXIT RTS * Copy FILEBLK to OSFILECB in aux memory * Preserves A -COPYFB PHA - LDX #$11 ; 18 bytes in FILEBLK -* >>> WRTAUX ; Alt ZP and LC - >>> WRTAUX ; Write to Aux mem -:L1 LDA FILEBLK,X -* STA AUXBLK,X - STA OSFILECB,X - DEX - BPL :L1 -* >>> MAINZP ; Back to normal - >>> WRTMAIN ; Back to Main mem - PLA - RTS +COPYFB PHA + LDX #$11 ; 18 bytes in FILEBLK + >>> WRTAUX ; Write to Aux mem +:L1 LDA FILEBLK,X + STA OSFILECB,X + DEX + BPL :L1 + >>> WRTMAIN ; Back to Main mem + PLA + RTS * Get file info -GETINFO JSR MLI - DB GINFOCMD - DW GINFOPL - RTS +GETINFO JSR MLI + DB GINFOCMD + DW GINFOPL + RTS * Set file info -SETINFO LDA #$07 ; SET_FILE_INFO 7 parms - STA GINFOPL - JSR MLI - DB SINFOCMD - DW GINFOPL ; Re-use PL from GFI - LDA #$0A ; GET_FILE_INFO 10 parms - STA GINFOPL - RTS +SETINFO LDA #$07 ; SET_FILE_INFO 7 parms + STA GINFOPL + JSR MLI + DB SINFOCMD + DW GINFOPL ; Re-use PL from GFI + LDA #$0A ; GET_FILE_INFO 10 parms + STA GINFOPL + RTS * Create disk file * Uses filename in MOSFILE -CRTFILE JSR MLI ; GET_TIME - DB GTIMECMD - LDA #MOSFILE - STA CREATEPL+2 - LDA #$C3 ; Open permissions - STA CREATEPL+3 - LDA $BF90 ; Current date - STA CREATEPL+8 - LDA $BF91 - STA CREATEPL+9 - LDA $BF92 ; Current time - STA CREATEPL+10 - LDA $BF93 - STA CREATEPL+11 - JSR MLI - DB CREATCMD - DW CREATEPL - RTS +CRTFILE JSR MLI ; GET_TIME + DB GTIMECMD + LDA #MOSFILE + STA CREATEPL+2 + LDA #$C3 ; Open permissions + STA CREATEPL+3 + LDA $BF90 ; Current date + STA CREATEPL+8 + LDA $BF91 + STA CREATEPL+9 + LDA $BF92 ; Current time + STA CREATEPL+10 + LDA $BF93 + STA CREATEPL+11 + JSR MLI + DB CREATCMD + DW CREATEPL + RTS * Open disk file -OPENMOSFILE LDA #MOSFILE - STA OPENPL+2 -OPENFILE JSR MLI - DB OPENCMD - DW OPENPL - RTS +OPENMOSFILE LDA #MOSFILE + STA OPENPL+2 +OPENFILE JSR MLI + DB OPENCMD + DW OPENPL + RTS * Close disk file -CLSFILE JSR MLI - DB CLSCMD - DW CLSPL - RTS +CLSFILE JSR MLI + DB CLSCMD + DW CLSPL + RTS * Read 512 bytes into BLKBUF -RDFILE JSR MLI - DB READCMD - DW READPL - RTS +RDFILE JSR MLI + DB READCMD + DW READPL + RTS * Write data in BLKBUF to disk -WRTFILE JSR MLI - DB WRITECMD - DW WRITEPL - RTS +WRTFILE JSR MLI + DB WRITECMD + DW WRITEPL + RTS * Put ProDOS prefix in PREFIX -GETPREF JSR MLI - DB GPFXCMD - DW GPFXPL - RTS +GETPREF JSR MLI + DB GPFXCMD + DW GPFXPL + RTS * Map of file reference numbers to IOBUF1..4 -FILEREFS DB $00,$00,$00,$00 - - - - +FILEREFS DB $00,$00,$00,$00 diff --git a/mainmem.path.s b/mainmem.path.s index 80e33b6..8c5827b 100644 --- a/mainmem.path.s +++ b/mainmem.path.s @@ -3,6 +3,7 @@ * * Code for handling Applecorn paths and converting them to * ProDOS paths. Runs in main memory. +* TO DO: check range in :sd * Preprocess path in MOSFILE, handles: * 1) ':sd' type slot and drive prefix (s,d are digits) @@ -301,16 +302,6 @@ PREFIX DS 65 ; Buffer for ProDOS prefix - - - - - - - - - - diff --git a/mainmem.svc.s b/mainmem.svc.s index 0e0fb26..d636ac8 100644 --- a/mainmem.svc.s +++ b/mainmem.svc.s @@ -19,6 +19,7 @@ * Optimised entry and return from OSFILE routines. * DELETE returns 'Dir not empty' when appropriate. * 29-Oct-2021 DRVINFO reads current drive if "". +* 01-Nov-2021 DRVINFO checks reading info on a root directory. * ProDOS file handling to rename a file @@ -941,11 +942,18 @@ INFOCLS JSR CLSDIR ; Be sure to close it! * Set prefix. Used by *CHDIR/*DRIVE to change directory +* Y= $00 - CHDIR, select any directory +* Y<>$00 - DRIVE, must select root * SETPFX >>> ENTMAIN + PHY ; Save CHDIR/DRIVE flag JSR PREPATH ; Preprocess pathname + BCS :EXIT JSR WILDONE ; Handle any wildcards - BCS :ERR + LDA #$2E + BCS :EXIT ; Exit with wildcard path +* TO DO: If DRIVE disallow selecting a directory +* LDA #MOSFILE @@ -953,12 +961,12 @@ SETPFX >>> ENTMAIN JSR MLI ; SET_PREFIX DB SPFXCMD DW SPFXPL -* Returns $4B 'Unknown storage' if *CD -:EXIT >>> XF2AUX,CHDIRRET -:ERR LDA #$40 ; Invalid pathname syn - BRA :EXIT -* Obtain info on blocks used/total blocks +:EXIT PLY ; Drop CHDIR/DRIVE flag + >>> XF2AUX,CHDIRRET + + +* Obtain info on total/used blocks DRVINFO >>> ENTMAIN LDA MOSFILE BNE :DRVINF2 @@ -966,28 +974,34 @@ DRVINFO >>> ENTMAIN LDA #'@' STA MOSFILE+1 ; Convert "" to "@" :DRVINF2 JSR PREPATH - BCS :ERR + BCS :EXIT LDA #MOSFILE STA GINFOPL+2 JSR GETINFO ; GET_FILE_INFO BCS :EXIT - PHA + LDA GINFOPL+7 + CMP #$0F + BNE :EXIT1 ; Not a drive, exit with 'Bad drive' + >>> ALTZP ; Alt ZP & Alt LC on - LDA GINFOPL+8 ; Blcks used LSB - STA AUXBLK - LDA GINFOPL+9 ; Blks used MSB + LDA GINFOPL+8 ; Blocks used LSB + STA AUXBLK+0 + LDA GINFOPL+9 ; Blocks used MSB STA AUXBLK+1 - LDA GINFOPL+5 ; Tot blks LSB + LDA GINFOPL+5 ; Total blocks LSB STA AUXBLK+2 - LDA GINFOPL+6 ; Tot blks MSB + LDA GINFOPL+6 ; Total blocks MSB STA AUXBLK+3 >>> MAINZP ; ALt ZP off, ROM back in - PLA -:EXIT >>> XF2AUX,FREERET -:ERR LDA #$40 ; Invalid pathname syn - BRA :EXIT + LDA #$00 ; $00=Ok + +:EXIT CMP #$46 + BNE :EXIT2 +:EXIT1 LDA #$2A ; Change 'Not found' to 'Bad drive' +:EXIT2 >>> XF2AUX,FREERET + * Change file permissions, for *ACCESS * Filename in MOSFILE, flags in MOSFILE2