From 087c9fc4e10faaf301256dc8c04fd130f0c44bfa Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Thu, 4 Nov 2021 18:59:04 -0400 Subject: [PATCH] Merge PR 144 'Updated Access Cat/Info Destroy' --- applecorn.po | Bin 819200 -> 819200 bytes auxmem.hostfs.s | 71 +++++++++------- auxmem.init.s | 2 +- mainmem.path.s | 4 + mainmem.svc.s | 209 +++++++++++++++++++++++++----------------------- mainmem.wild.s | 6 +- 6 files changed, 157 insertions(+), 135 deletions(-) diff --git a/applecorn.po b/applecorn.po index f75dee1b87607c7d8858d8271f1b1a9442fc5efb..78409c319b2260a32ae1d87236e8c93df69493a5 100644 GIT binary patch delta 6309 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 z z+;ZfMkf`Yi$E#5;F_LC5n@#5Vm>LLw74C*Ja$!;Cb zr*$CwpH7H8ZXgUB6<5{8g}Mj~S8^Z6^l?-A0G>NC!hPDub)4nq^>e8Y^l?x2ar=6? oHu=J%Xl7z}I5F~)Jnk{{Ir(DTY(txEDVuGnn{7AkvE8iuH~$uwuK)l5 delta 6443 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 diff --git a/auxmem.hostfs.s b/auxmem.hostfs.s index df29c7d..20253b4 100644 --- a/auxmem.hostfs.s +++ b/auxmem.hostfs.s @@ -21,7 +21,7 @@ * 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. +* 03-Oct-2021 PARSNAME checks filename length<64. * $B0-$BF Temporary filing system workspace @@ -29,14 +29,14 @@ FSXREG EQU $C0 FSYREG EQU $C1 FSAREG EQU $C2 -FSZPC3 EQU $C3 -FSCTRL EQU FSXREG -FSPTR1 EQU $C4 -FSPTR2 EQU $C6 -FSNUM EQU $C8 -FSACCBYTE EQU FSNUM+1 -FSZPCC EQU $CC -FSCMDLINE EQU $CE +FSZPC3 EQU $C3 ; (unused so far) +FSCTRL EQU FSXREG ; =>control block +FSPTR1 EQU $C4 ; =>directory entry +FSPTR2 EQU $C6 ; (unused so far) +FSNUM EQU $C8 ; 32-bit number, cat file count +FSACCBYTE EQU FSNUM+1 ; access bits +FSZPCC EQU $CC ; (unused so far) +FSCMDLINE EQU $CE ; command line address * OSFIND - open/close a file for byte access @@ -319,11 +319,16 @@ FSCHND CMP #13 FSCNULL LDA FSAREG LDY FSYREG LDX FSXREG ; Set EQ/NE from X - RTS +FSCUKN +FSCRET RTS * OSFSC 00 - *OPT function * Entered with A=$00 and EQ/NE from X FSCOPT BEQ :OPT0 + CPX #$05 + BCS :OPTNULL + CPY #$04 + BCS :OPTNULL LDA FSFLAG2 AND :OPTMSK-1,X EOR :OPTSET-0,Y @@ -334,19 +339,19 @@ FSCOPT BEQ :OPT0 :OPTMSK DB $3F,$CF,$F3,$FC :OPTSET DB $00,$55,$AA,$FF -FSCUKN - DO DEBUG - PHA - LDA #OSFSCM - JSR PRSTR - PLA - FIN -FSCRET RTS - DO DEBUG -OSFSCM ASC 'OSFSC.' - DB $00 - FIN +*FSCUKN +* DO DEBUG +* PHA +* LDA #OSFSCM +* JSR PRSTR +* PLA +* FIN +* RTS +* DO DEBUG +*OSFSCM ASC 'OSFSC.' +* DB $00 +* FIN * OSFSC 01 - Read EOF function @@ -447,8 +452,8 @@ PRONEBLK >>> ENTAUX LDY #>:DIRM JSR PRSTR SEC -:NOTKEY JSR PRONEENT ; CC=entry, CS=header - CLC ; Step to next entry +:NOTKEY JSR PRONEENT ; CC=entry, CS=header + CLC ; Step to next entry LDA FSPTR1+0 ADC #$27 STA FSPTR1+0 @@ -456,7 +461,7 @@ PRONEBLK >>> ENTAUX ADC #$00 STA FSPTR1+1 DEC FSNUM - BNE :CATLP ; Loop for all entries + BNE :CATLP ; Loop for all entries >>> XF2MAIN,CATALOGRET :DIRM ASC 'Directory: ' DB $00 @@ -817,7 +822,10 @@ PARSLPTR CLC ; Means parsing a filename STA MOSFILE+1,X STA $C005 ; Write to aux mem INX - BNE :L1 + CPX #$40 + BNE :L1 ; Name not too long + TXA ; $40=Bad filename + JMP MKERROR :DONE STA $C004 ; Write to main mem STX MOSFILE ; Length byte (Pascal) STA $C005 ; Back to aux @@ -840,7 +848,10 @@ PARSLPTR2 CLC ; Means parsing a filename STA MOSFILE2+1,X STA $C005 ; Write to aux mem INX - BNE :L1 + CPX #$40 + BNE :L1 ; Name not too long + TXA ; $40=Bad filename + JMP MKERROR :DONE STA $C004 ; Write to main mem STX MOSFILE2 ; Length byte (Pascal) STA $C005 ; Back to aux @@ -857,7 +868,7 @@ ERRNOTFND LDA #$46 ; File not found CHKERROR CMP #$20 BCC NOTERROR MKERROR -* IF FALSE + DO DEBUG BIT $E0 BPL MKERROR1 ; *DEBUG* PHA @@ -888,7 +899,7 @@ ERRMSG BRK DB $FF ASC 'ERR: $00' BRK -* FIN + FIN * Translate ProDOS error code into BBC error MKERROR1 CMP #$40 diff --git a/auxmem.init.s b/auxmem.init.s index 57397ef..1129e9e 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-11-03' +HELLO ASC 'Applecorn MOS 2021-11-04' DB $00 ; Unify MOS messages diff --git a/mainmem.path.s b/mainmem.path.s index 8c5827b..7e48e16 100644 --- a/mainmem.path.s +++ b/mainmem.path.s @@ -4,6 +4,10 @@ * Code for handling Applecorn paths and converting them to * ProDOS paths. Runs in main memory. * TO DO: check range in :sd +* TO DO: need separate reference to current root and drive by name +* TO DO: check for pathname too long +* ie /filename should be filename in root + * Preprocess path in MOSFILE, handles: * 1) ':sd' type slot and drive prefix (s,d are digits) diff --git a/mainmem.svc.s b/mainmem.svc.s index d636ac8..1cdc621 100644 --- a/mainmem.svc.s +++ b/mainmem.svc.s @@ -20,6 +20,9 @@ * 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. +* 02-Nov-2021 SETPERMS passed parsed access byte. +* 03-Nov-2021 Optimised CAT/EX/INFO, DESTROY. +* *BUG* RENAME won't rename between directories, eg RENAME CHARS VDU/CHARS. * ProDOS file handling to rename a file @@ -868,77 +871,74 @@ CATALOG >>> ENTMAIN JSR PREPATH ; Preprocess pathname JSR WILDONE ; Handle any wildcards JSR EXISTS ; See if path exists ... - CMP #$01 ; ... and is a file - BNE :NOTFILE - LDA #$46 ; Not found (TO DO: err code?) - BRA CATEXIT -:NOTFILE LDA #MOSFILE - STA OPENPL+2 - BRA :OPEN + BEQ :NOTFND ; Not found + CMP #$02 + BEQ :DIRFOUND + LDA #$0D ; Becomes Not a directory +:NOTFND EOR #$46 ; $00->$46, $xx->$4B + BNE CATEXIT + :NOPATH JSR GETPREF ; Fetch prefix into PREFIX - LDA #PREFIX - STA OPENPL+2 -:OPEN JSR OPENFILE + LDX #prefix + LDY #>PREFIX + BRA :OPEN +:DIRFOUND LDX #specified directory + LDY #>MOSFILE + +:OPEN STX OPENPL+1 ; Open the specified directory + STY OPENPL+2 + JSR OPENFILE BCS CATEXIT ; Can't open dir -CATREENTRY - LDA OPENPL+5 ; File ref num +CATREENTRY LDA OPENPL+5 ; File ref num STA READPL+1 JSR RDFILE - BCC :S1 - CMP #$4C ; EOF - BEQ :EOF - BRA :READERR -:S1 JSR COPYAUXBLK + BCS :CATERR + JSR COPYAUXBLK >>> XF2AUX,PRONEBLK -:READERR -:EOF LDA OPENPL+5 ; File ref num + +:CATERR CMP #$4C ; EOF + BNE :NOTEOF + LDA #$00 +:NOTEOF PHA + LDA OPENPL+5 ; File ref num STA CLSPL+1 JSR CLSFILE + PLA CATEXIT >>> XF2AUX,STARCATRET -* PRONEBLK call returns here ... -CATALOGRET - >>> ENTMAIN - LDA CATARG - CMP #$80 ; Is this an *INFO call? - BEQ INFOREENTRY - BRA CATREENTRY - -CATARG DB $00 - * Handle *INFO INFO JSR PREPATH ; Preprocess pathname SEC JSR WILDCARD ; Handle any wildcards JSR EXISTS ; Check matches something - CMP #$00 - BNE INFOFIRST - JSR CLSDIR - LDA #$46 ; Not found (TO DO: err code?) + BNE INFOFIRST ; Match found, start listing + LDA #$46 ; No match, error Not found +INFOEXIT CMP #$4C ; EOF + BNE INFOCLS + LDA #$00 ; EOF is not an error +INFOCLS PHA + JSR CLSDIR ; Be sure to close it! + PLA BRA CATEXIT -INFOREENTRY - JSR WILDNEXT2 ; Start of new block +* PRONEBLK call returns here ... +CATALOGRET >>> ENTMAIN + LDA CATARG + CMP #$80 ; Is this an *INFO call? + BNE CATREENTRY ; No, go back and do another CAT/EX + +INFOREENTRY JSR WILDNEXT2 ; Start of new block BCS INFOEXIT ; No more matches INFOFIRST LDA WILDIDX CMP #$FF ; Is WILDNEXT about to read new blk? BEQ :DONEBLK ; If so, print this blk first JSR WILDNEXT2 - BCS :DONEBLK ; If no more matches - BRA INFOFIRST + BCC INFOFIRST ; Find more entries :DONEBLK JSR COPYAUXBLK >>> XF2AUX,PRONEBLK -INFOEXIT CMP #$4C ; EOF - BNE INFOCLS - LDA #$00 ; EOF is not an error -INFOCLS JSR CLSDIR ; Be sure to close it! - BRA CATEXIT +CATARG DB $00 * Set prefix. Used by *CHDIR/*DRIVE to change directory @@ -1004,34 +1004,38 @@ DRVINFO >>> ENTMAIN * Change file permissions, for *ACCESS -* Filename in MOSFILE, flags in MOSFILE2 +* Filename in MOSFILE, access mask in A +* SETPERM >>> ENTMAIN + PHA ; Save access mask JSR PREPATH ; Preprocess pathname BCS :SYNERR CLC JSR WILDCARD ; Handle any wildcards BCS :NONE - STZ :LFLAG - STZ :WFLAG - STZ :RFLAG - LDX MOSFILE2 ; Length of arg2 - INX -:L1 DEX - CPX #$00 - BEQ :MAINLOOP - LDA MOSFILE2,X ; Read arg2 char - CMP #'L' ; L=Locked - BNE :S1 - STA :LFLAG - BRA :L1 -:S1 CMP #'R' ; R=Readable - BNE :S2 - STA :RFLAG - BRA :L1 -:S2 CMP #'W' ; W=Writable - BNE :ERR2 ; Bad attribute - STA :WFLAG - BRA :L1 + BCC :MAINLOOP +* STZ :LFLAG +* STZ :WFLAG +* STZ :RFLAG +* LDX MOSFILE2 ; Length of arg2 +* INX +*:L1 DEX +* CPX #$00 +* BEQ :MAINLOOP +* LDA MOSFILE2,X ; Read arg2 char +* CMP #'L' ; L=Locked +* BNE :S1 +* STA :LFLAG +* BRA :L1 +*:S1 CMP #'R' ; R=Readable +* BNE :S2 +* STA :RFLAG +* BRA :L1 +*:S2 CMP #'W' ; W=Writable +* BNE :ERR2 ; Bad attribute +* STA :WFLAG +* BRA :L1 + :SYNERR LDA #$40 ; Invalid pathname syn BRA :EXIT :NONE JSR CLSDIR @@ -1043,60 +1047,61 @@ SETPERM >>> ENTMAIN STA GINFOPL+2 JSR GETINFO ; GET_FILE_INFO BCS :EXIT - LDA GINFOPL+3 ; Access byte - AND #$03 ; Start with R, W off - ORA #$C0 ; Start with dest/ren on - LDX :RFLAG - BEQ :S3 - ORA #$01 ; Turn on read enable -:S3 LDX :WFLAG - BEQ :S4 - ORA #$02 ; Turn on write enable -:S4 LDX :LFLAG - BEQ :S5 - AND #$3D ; Turn off destroy/ren/write + PLA ; Access byte + PHA + +* LDA GINFOPL+3 ; Access byte +* AND #$03 ; Start with R, W off +* ORA #$C0 ; Start with dest/ren on +* LDX :RFLAG +* BEQ :S3 +* ORA #$01 ; Turn on read enable +*:S3 LDX :WFLAG +* BEQ :S4 +* ORA #$02 ; Turn on write enable +*:S4 LDX :LFLAG +* BEQ :S5 +* AND #$3D ; Turn off destroy/ren/write + :S5 STA GINFOPL+3 ; Access byte JSR SETINFO ; SET_FILE_INFO JSR WILDNEXT - BCS :NOMORE - BRA :MAINLOOP -:EXIT >>> XF2AUX,ACCRET + BCC :MAINLOOP +* BCS :NOMORE :NOMORE JSR CLSDIR LDA #$00 - BRA :EXIT +* BRA :EXIT +:EXIT PLX ; Drop access byte + >>> XF2AUX,ACCRET :ERR2 LDA #$53 ; Invalid parameter BRA :EXIT -:LFLAG DB $00 ; 'L' attribute -:WFLAG DB $00 ; 'W' attribute -:RFLAG DB $00 ; 'R' attribute + +*:LFLAG DB $00 ; 'L' attribute +*:WFLAG DB $00 ; 'W' attribute +*:RFLAG DB $00 ; 'R' attribute + * Multi file delete, for *DESTROY * Filename in MOSFILE +* MULTIDEL >>> ENTMAIN JSR PREPATH ; Preprocess pathname - BCS :SYNERR - CLC + BCS :EXIT +* CLC ; CC already set JSR WILDCARD ; Handle any wildcards - BCS :NONE - BRA :MAINLOOP -:SYNERR LDA #$40 ; Invalid pathname syn - BRA :EXIT -:NONE JSR CLSDIR + BCC :MAINLOOP LDA #$46 ; 'File not found' - BRA :EXIT + BRA :DELERR :MAINLOOP JSR DODELETE BCS :DELERR JSR WILDNEXT - BCS :NOMORE - BRA :MAINLOOP -:EXIT >>> XF2AUX,DESTRET + BCC :MAINLOOP ; More to do + LDA #$00 ; $00=Done :DELERR PHA JSR CLSDIR PLA - BRA :EXIT -:NOMORE JSR CLSDIR - LDA #$00 - BRA :EXIT +:EXIT >>> XF2AUX,DESTRET + * Read machid from auxmem MACHRD LDA $C081 diff --git a/mainmem.wild.s b/mainmem.wild.s index 052dfc9..dce1fd5 100644 --- a/mainmem.wild.s +++ b/mainmem.wild.s @@ -237,14 +237,16 @@ SRCHBLK LDA WILDIDX RTS * Close directory, if it was open -* Preserves flags +* Preserves A and flags CLSDIR PHP + PHA LDA WILDFILE ; File ref num for open dir BEQ :ALREADY ; Already been closed STA CLSPL+1 JSR CLSFILE STZ WILDFILE ; Not strictly necessary -:ALREADY PLP +:ALREADY PLA + PLP RTS * Apply wildcard match to a directory block