From 73b16ac3490c46b10ada12773f63827e776bc6c0 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sun, 27 Oct 2019 15:31:45 -0400 Subject: [PATCH] Implementation of ERA command --- SOFTCARD80.ASM#040000 | 84 +++++++++++++++++++++++++++++------------- SOFTCARD80.BIN#041000 | Bin 43011 -> 43011 bytes zapple2.po | Bin 819200 -> 819200 bytes 3 files changed, 58 insertions(+), 26 deletions(-) diff --git a/SOFTCARD80.ASM#040000 b/SOFTCARD80.ASM#040000 index 73754bd..d2e8c2b 100644 --- a/SOFTCARD80.ASM#040000 +++ b/SOFTCARD80.ASM#040000 @@ -806,8 +806,6 @@ DSRET LD L,A ; Return code in L too ; Returns error codes in A and L: ; Returns 0 for success. The FCB for the file opened is left at DMAADDR (slot 0) ; Returns 0FFH if file not found -; TODO: F_OPEN should use the record count field of the FCB and (if non zero) seek -; to appropriate point in the file F_OPEN PUSH DE ; Preserve pointer to FCB CALL F_SFIRST ; Find first matching directory entry POP DE ; Restore pointer to FCB @@ -988,6 +986,7 @@ FSNS2 LD A,0FFH ; No match ; Delete file ; DE is the address of the FCB describing the file to delete ; Returns error codes in A and L: +; TODO: This only deletes the first file ... need to do F_SNEXT too F_DELETE CALL F_SFIRST ; Search for file, create FCB CP 0FFH ; If not found ... JP Z,FDERR ; ... Return with error @@ -1896,19 +1895,21 @@ N2H2 OR 0F0H ; ; Very simple CCP ; ; Commands: -; - A:, B: ... - Change default drive -; - DIR - Show directory -; - ERA - Erase file(s) -; - REN - Rename file -; - SAVE - Save memory to disk -; - TYPE - Show text file on console +; - d - Change default drive (A:, B: etc.) +; - DIR - Show directory (DIR, DIR A:, DIR FOO.TXT, DIR F???????.???) +; - ERA - Erase file(s) (ERA FOO.TXT, ERA F???????.???) +; - REN - Rename file (REN BAR.TXT=FOO.TXT) +; - SAVE - Save memory to disk (SAVE 7 FOO.COM) +; - TYPE - Show text file on console (TYPE TEST.TXT) ; - FILENAME.COM - Load and run FILENAME.COM at 0100H ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; TODO: Sanity check / validate number of command args for builtins ; TODO: Make unadorned drives expand to x:????????.??? or something so ; DIR A: works. Or just special case it in DIRECT ... +; Need to handle this differently for eg: ERA A: vs DIR A: !! ; TODO: Parse * wildcard and generate FCB with ?s -; TODO: Implement TYPE, REN, ERA, SAVE commands +; TODO: Implement REN, SAVE commands ; TODO: Implement support for ^C in C_READ ; Get a line of text from the console & handle it @@ -2278,33 +2279,46 @@ BUILTIN LD DE,PATHBUF2+1 ; Skip over drive byte in FCB LD HL,DIRCMD ; See if 'DIR' CALL COMPSTR ; ... CP 0 ; ... - JP Z,DIRECT ; If so, call function for DIR + JP NZ,BIS1 ; If not, skip + CALL DIRECT ; Perform DIR + JP BIS6 ; Done - LD DE,PATHBUF2+1 ; Skip over drive byte in FCB +BIS1 LD DE,PATHBUF2+1 ; Skip over drive byte in FCB LD HL,ERACMD ; See if 'ERA' CALL COMPSTR ; ... CP 0 ; ... - JP Z,ERASE ; If so, call function for ERA + JP NZ,BIS2 ; If not, skip + CALL ERASE ; Perform ERA + JP BIS6 ; Done - LD DE,PATHBUF2+1 ; Skip over drive byte in FCB +BIS2 LD DE,PATHBUF2+1 ; Skip over drive byte in FCB LD HL,RENCMD ; See if 'REN' CALL COMPSTR ; ... CP 0 ; ... - JP Z,RENAME ; If so, call function for REN + JP NZ,BIS3 ; If not, skip + CALL Z,RENAME ; If so, call function for REN + JP BIS6 ; Done - LD DE,PATHBUF2+1 ; Skip over drive byte in FCB +BIS3 LD DE,PATHBUF2+1 ; Skip over drive byte in FCB LD HL,TYPCMD ; See if 'TYPE' CALL COMPSTR ; ... CP 0 ; ... - JP Z,TYPEFILE ; If so, call function for TYPE + JP NZ,BIS4 ; If not, skip + CALL Z,TYPEFILE ; If so, call function for TYPE + JP BIS6 ; Done - LD DE,PATHBUF2+1 ; Skip over drive byte in FCB +BIS4 LD DE,PATHBUF2+1 ; Skip over drive byte in FCB LD HL,SAVCMD ; See if 'SAVE' CALL COMPSTR ; ... CP 0 ; ... - JP Z,SAVEFILE ; If so, call function for SAVE + JP NZ,BIS5 ; If not, skip + CALL Z,SAVEFILE ; If so, call function for SAVE + JP BIS6 ; Done + +BIS5 LD A,0FFH ; Not a builtin + RET - LD A,0FFH ; Not a builtin +BIS6 XOR A ; Is a builtin RET ; Load and run a .COM file to 0100H @@ -2337,7 +2351,7 @@ RCL1 CALL F_READ ; Read records until done LD HL,0080H ; Reset DMAADDR to 0080H LD (DMAADDR),HL ; ... RET ; -RCOERR LD DE,OEMSG ; 'Open error' message +RCOERR LD DE,NFMSG ; 'Not found' message CALL C_WRITESTR ; ... RET ; RCLERR CALL F_CLOSE ; Close the file @@ -2350,7 +2364,7 @@ RCLERR CALL F_CLOSE ; Close the file LMSG DEFM 'Loaded' DEFB 13,'$' -OEMSG DEFM 'Not found' +NFMSG DEFM 'Not found' DEFB 13,'$' REMSG DEFM 'Read error' @@ -2386,9 +2400,26 @@ PRDIRENT LD A,13 ; Terminate string CALL C_WRITESTR ; RET -ERASE +; Erase file(s) +; Pattern for erase is in FCB1 +; TODO: Should prompt Y/N if wildcards used +; TODO: Not working with wildcards for some reason!! +ERASE LD HL,0080H ; Reset DMAADDR to 0080H + LD (DMAADDR),HL ; ... + + LD DE,FCB1 ; Pass address of FCB1 + CALL F_DELETE ; Do the delete operation + CP 0 ; Check return code + JP NZ,ERER ; If non zero print error RET +ERER LD DE,NFMSG ; 'Not found' message + CALL C_WRITESTR ; ... + RET ; + +; Rename a file +; Here we need to build our own 'special' FCB using the dest=src command line +; TODO: Write this RENAME RET @@ -2410,16 +2441,15 @@ TFS1 CP 1 ; Check return code from F_READ JP NZ,TFLERR ; If not EOF (1), then error CALL TYPEBLK ; Display last block on screen CALL F_CLOSE ; Close the file - XOR A ; Return zero (was a builtin) + LD E,13 ; Carriage return + CALL C_WRITE ; RET ; -TFOERR LD DE,OEMSG ; 'Open error' message +TFOERR LD DE,NFMSG ; 'Not found' message CALL C_WRITESTR ; ... - XOR A ; Return zero (was a builtin) RET ; TFLERR CALL F_CLOSE ; Close the file LD DE,REMSG ; 'Read error' message CALL C_WRITESTR ; ... - XOR A ; Return zero (was a builtin) RET ; Helper function for TYPEFILE @@ -2446,6 +2476,8 @@ TBS1 POP HL ; Restore HL, DE RET ; Save memory to disk file +; Use the FCB already constructed in FCB2 +; TODO Write this SAVEFILE RET diff --git a/SOFTCARD80.BIN#041000 b/SOFTCARD80.BIN#041000 index 4cc35e39f3924c7b52c1eaba3678f1bdef0f54df..a9b1ac0cd0a3be7d4efadf601388e84d70646644 100644 GIT binary patch delta 1339 zcmZuxe`p(39Dmoe+p@J?BW}}%g}&?ulA+9N+JSqm8-{L7WU?rNQ9GOJ zV7>gf_U^qKOoYjj!C(lP34&0D+f~KO`dlky2wRXa>OWE(c2os(_51Fw+Xy?jyYKtF z&-eTNe81m!cWS=r)O^$B9j=Wbjr}D@SL2>AecI*SU@bi%tu*4&Kid@4#2!uT)xuNBybvbkCoB+-Wi)Zz9&MX--BJ!2wWkir2{Pqd3;1i#O* zz$b)Vmg|Ylg?geZ>_fO)TZe|-z#`HX?*W2ec040e_yDmZMtxo&UNNH=rz|Qms|T+r=Y9>?YOmuIfvz><`(0 zloZ5c1iwM=O5T0Jpm_#K5CMyq)qk4-y=vQmQv(i@5EG zxRGKPCoLJQUxH4prmEOtRPiz$JuY-0_p67Ym-t`0lIjwQbX&Sx$kTo4y?wUe6S#WJ z&u%^tZ1re=`M0z=$R9|*lMZaPn{SsT>zo|!h1Uf++^11ZUJ)+P%+!cbqPM5QNoe2Asl^{E z&_Ia8yIGrJL)qw{_#cf9i**{^FPe1WTCLeIoAei_4b!C`pWeX!nI04G`yN6M``YAY z{XHPJ=w}tPVXQnSD?@_!?VOW78hZVM4oy{p8z&1J95rrLI!#W%+q0D`-hHY`M zj53#4!@Lgmr80MmW6@QkV0f0PT_zlP$aPo2NC4s6p}&0S6UYrK6P0HaQ_%lb_~)@+ zr8CNtk8M`jGm{1Yc!I0B>~yuZU>IHKyQ_E3$JQ6~vk1Yth6|u;E9YZEF%OoGaFYs8``|q#$a&9CS6S%=%cZ{D$ TA%zoZ{=@@&;p0+2{Hp#37`9+{ delta 1270 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 Iy1x4TztSOIod5s;