From bebfe445a5b8c0c3cc5fe11f9988ae9bb6402dd6 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Thu, 17 Oct 2019 11:59:49 -0400 Subject: [PATCH] Implemented F_RENAME. --- SOFTCARD80.ASM#040000 | 77 +++++++++++++++++++++++++++++------------- SOFTCARD80.BIN#041000 | Bin 32771 -> 32771 bytes zapple2.po | Bin 819200 -> 819200 bytes 3 files changed, 54 insertions(+), 23 deletions(-) diff --git a/SOFTCARD80.ASM#040000 b/SOFTCARD80.ASM#040000 index bb80e11..dc43837 100644 --- a/SOFTCARD80.ASM#040000 +++ b/SOFTCARD80.ASM#040000 @@ -56,7 +56,7 @@ RVEC5 DEFW 0000H ; Restart vector 5 RVEC6 DEFW 0000H ; Restart vector 6 RVEC7 DEFW 0000H ; Restart vector 7 -; Space for private BDOS data (implementation dependent) up to 0060H +; Space for private BDOS data (implementation dependent) up to 005BH DMAADDR DEFW 0080H ; DMA address defaults to FILEBUF (0080H) LOGVEC DEFW 0000H ; Vector of logged in drives ROVEC DEFW 0000H ; Vector of read-only drives @@ -382,7 +382,8 @@ B_F_DELETE EQU 13H ; Delete file B_F_READ EQU 14H ; Read file sequentially B_F_WRITE EQU 15H ; Write file sequentially B_F_MAKE EQU 16H ; Create and open file -B_DRV_LOGVEC EQU 17H ; Return bitmap of logged-in drives +B_F_RENAME EQU 17H ; Rename file +B_DRV_LOGVEC EQU 18H ; Return bitmap of logged-in drives B_DRV_GET EQU 19H ; Return current drive B_F_DMAOFF EQU 1AH ; Set DMA address B_DRV_SRO EQU 1CH ; Software write-protect current drive @@ -446,7 +447,7 @@ BDOSVEC DEFW C_TERMCPM ; C=00H DEFW F_READ ; C=14H DEFW F_WRITE ; C=15H DEFW F_MAKE ; C=16H - DEFW UNIMP ; C=17H (F_RENAME) + DEFW F_RENAME ; C=17H DEFW DRV_LOGVEC ; C=18H DEFW DRV_GET ; C=19H DEFW F_DMAOFF ; C=1AH @@ -647,7 +648,8 @@ DSRET LD L,A ; Return code in L too ; DE is the address of the FCB describing the file to open ; Returns error codes in A and L: ; 0 through 3 for success, 0FFH is file not found -F_OPEN CALL MAKEPATH ; Populate PATHLEN and PATH +F_OPEN LD IX,PATHBUF ; Destination buffer + CALL MAKEPATH ; Populate PATHLEN and PATH PUSH DE ; Preserve pointer to FCB @@ -749,7 +751,8 @@ FCMLIN DEFB 0 ; ProDOS PB: File reference number ; Delete file ; DE is the address of the FCB describing the file to delete ; Returns error codes in A and L: -F_DELETE CALL MAKEPATH ; Populate PATHLEN and PATH +F_DELETE LD IX,PATHBUF ; Destination buffer + CALL MAKEPATH ; Populate PATHLEN and PATH LD HL,FDMLI ; Pass address of 6502 JSR instruction CALL PRODOS ; Invoke ProDOS MLI CP 0 ; See if there was an error @@ -778,10 +781,6 @@ F_READ LD H,D ; Pointer to FCB ... LD A,(HL) ; Obtain file reference num from FCB S2 LD (FRMLIN),A ; Store in parameter list -; CALL GETIOADDR ; Get I/O address -; CP 0FFH ; See if it was an error -; JP Z,FRERR ; If so, abort - LD HL,(DMAADDR) ; Read from DMA buffer address LD BC,OFFSET ; Convert to 6502 address ADD HL,BC ; ... @@ -818,10 +817,6 @@ F_WRITE LD H,D ; Pointer to FCB ... LD A,(HL) ; Obtain file reference num from FCB S2 LD (FWMLIN),A ; Store in parameter list -; CALL GETIOADDR ; Get I/O address -; CP 0FFH ; See if it was an error -; JP Z,FWERR ; If so, abort - LD HL,(DMAADDR) ; Write to DMA address LD BC,OFFSET ; Convert to 6502 address ADD HL,BC ; ... @@ -852,7 +847,8 @@ FWMLITC DEFW 0000H ; ProDOS PL: Number of bytes transferred ; DE is the address of the FCB describing the file to create ; Returns error codes in A and L: ; 0 through 3 for success, 0FFH is file could not be created -F_MAKE CALL MAKEPATH ; Populate PATHLEN and PATH +F_MAKE LD IX,PATHBUF ; Destination buffer + CALL MAKEPATH ; Populate PATHLEN and PATH LD HL,FMMLI ; Pass address of 6502 JSR instruction CALL PRODOS ; Invoke ProDOS MLI CP 0 ; See if there was an error @@ -876,6 +872,32 @@ FMMLIS DEFB 1 ; ProDOS PL: Storage type (1 for file) FMMLICD DEFW 0000H ; ProDOS PL: Create date (always 0000H) FMMLICT DEFW 0000H ; ProDOS PL: Create time (always 0000H) +; Rename file +; DE is the address of the FCB describing the file to be renamed. The new name +; is stuffed into FCB+16 (where the allocation map usually goes) +; Returns error codes in A and L - 0 to 3 for success, 0FFH for file not found +F_RENAME LD IX,PATHBUF ; Destination buffer 1 + CALL MAKEPATH ; Populate PATHLEN and PATH for first file + LD IX,PATHBUF2 ; Destination buffer 2 + CALL MAKEPATH ; Populate PATHLEN and PATH for second file + LD HL,FRNMLI ; Pass address of 6502 JSR instruction + CALL PRODOS ; Invoke ProDOS MLI + CP 0 ; See if there was an error + JP NZ,FRNERR ; Handle error + LD A,0 ; Success + LD L,A ; Return code in L also + RET +FRNERR LD A,0FFH ; 0FFH for error + LD L,A ; Return code in L also + RET + +FRNMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code + DEFB 0C2H ; ProDOS RENAME call + DEFW FRNMLIPL+OFFSET ; Pointer to parm list in 6502 addr space + DEFB 60H ; RTS in 6502 code +FRNMLIPL DEFB 2 ; ProDOS PL: Two parameters +FRNMLIP1 DEFW PATHBUF+OFFSET ; ProDOS PL: Pointer to path in 6502 addr +FRNMLIP2 DEFW PATHBUF2+OFFSET ; ProDOS PL: Pointer to path in 6502 addr ; Return bitmap of logged-in drives in HL DRV_LOGVEC LD HL,(LOGVEC) ; @@ -999,22 +1021,27 @@ PRODOS LD BC,OFFSET ; Add offset to convert Z80->6502 address ; Populate the PATH buffer (and PATHLEN) by copying from FCB ; DE contains a pointer to the FCB +; IX contains pointer to the path buffer into which to write ; Be sure not to trash DE ; TODO FINISH THIS - NEEDS TO HANDLE EXTENSION TOO!!! -MAKEPATH LD A,(DE) ; Get drive number from FCB +MAKEPATH PUSH IX ; Copy IX->IY + POP IY ; So IY keeps track of size byte at start + INC IX ; Advance past the size byte before writing + LD A,(DE) ; Get drive number from FCB CP 0 ; See if it is zero (default drive) JP NZ,MPS1 ; If drive explicit LD A,(CURDRV) ; If default drive use CURDRV INC A ; CURDRV is zero based -MPS1 ADD A,'A'+80H-1 ; Convert to drive letter (high bit set) - LD (PATH),A ; Store as first char of path - LD A,'/'+80H ; Second char of path is '/' - LD (PATH+1),A ; ... +MPS1 ADD A,'A'-1 ; Convert to drive letter + LD (IX+0),A ; Store as first char of path + LD A,'/' ; Second char of path is '/' + LD (IX+1),A ; ... LD C,2 ; Use C to count chars in filename LD H,D ; Copy address of FCB from DE ... LD L,E ; ... to HL INC HL ; HL points to filename in FCB - LD IX,PATH+2 ; IX points to next char of path to write + INC IX ; Advance IX to next char of path to write + INC IX ; ... MPL1 LD A,(HL) ; Obtain filename character CP ' ' ; See if it is a space (? or NULL maybe?) JP Z,MPS3 ; If so we are done with filename @@ -1023,7 +1050,6 @@ MPL1 LD A,(HL) ; Obtain filename character CP 10 ; Drive letter, slash and 8 char filename JP Z,MPS2 ; If so we are done with filename EX AF,AF' ; Swap back to original A reg - ADD A,80H ; Set the high bit LD (IX+0),A ; Copy to PATH buffer INC C ; Count the chars INC HL ; Next byte of filename in FCB @@ -1033,7 +1059,7 @@ MPS2 EX AF,AF' ; Swap back to original A reg MPS3 ; EXTENSION ; ... LD A,C ; Store length of string - LD (PATHLEN),A ; ... + LD (IY+0),A ; We kept size byte in IY at start RET ; Find IOBUF address for a file reference number @@ -1096,11 +1122,16 @@ N2H2 OR 0F0H ; ; Additional private scratch space for BDOS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; 64 bytes for storing a file path as a Pascal style string +; 64 byte buffer for storing a file path as a Pascal style string PATHBUF PATHLEN DEFB 0 PATH DEFS 64 +; 64 byte buffer for storing a second file path as a Pascal style string +PATHBUF2 +PATHLEN2 DEFB 0 +PATH2 DEFS 64 + ; Record file reference numbers for each I/O buffer ; Or 0 if no file is using the buffer FRN1 DEFB 0 diff --git a/SOFTCARD80.BIN#041000 b/SOFTCARD80.BIN#041000 index 48e572b91e36541c5c9a34b3bf70071babf3245b..62226a70088ed3b54e0506f7ea7b27f40a7707e3 100644 GIT binary patch delta 728 zcmYjPL1@!Z7=FpBwnb`1k zER~Q~319Y%DVDK4!G|#rXht`Eh9yp+cG*0`)1G{iwK{o*YA#EC(5Kkbsr=9Nh86G& z&-T36w*30Pty|}-CtP99Q@xwNSj*BQnz01&60B}_7tgo8D)#fvyZd-gr^>M@Dr?5P zk?2RI20I}LUk;B{hB=9#1to&)kl$(%Bb-Emh$1@y&3KR^(YPAKnk@9- z$-}ZYFCO%yqQzW1*_xKpOE^z`&->rldhW*Nh!yEnA)1@Tf9#?tLBRS%Y;cONtA}ZZfcjr zAi1ER)-XuTTfr<|p3E+NyTJxB7QqpoZPFrWMZ_i>gW9^V{K`BkPgWd-1T6Fv>1bHG_*Q&D^X0i9=dA93%4%*|;)#^Oj zYg>N$-xfq!ir5R_KQwpPbMNbHf5w_ew1ktCju20e5pQEWO}s%Hwz3+*x=kl0)+r-_BD((hdsq@_p z)fJT`ODX`USh^g5f_WYQzyee)g}Aj6Y7DkW$XeP^UR~SZt6EfBQD&&k$Mn}=g6iE5 z>X|VwIToO@B0`~_IS7U)X8Fni@Ydz}OKLo&%iS7nxfD@?Ax;U(A;h;eHcDYD0J{oc zE`HbzZmNTrF{e!`crLpr)=aS$itV7-ev!Q`vI8P}2WMOdZu_5HXP`5X%UAMS`S1B( z__u_KLWa;8unCJv-x;V%^s7m~SKWRcq|@zjTdml8R=DA!dTDX^dCxtLeZtXHI+*^5 zv)$)<4-3Q8xqDon^D)Oa(`gilI-hX1TjD6H3J_V;Mai)~vT-p){c!pBbpdm&q6JIW z-Nf2?TPClQOyiw)UjN86-e7RGQwaux;HR8$fTj$SY~=>9n3rRQ!jFrILaj2wzLC!v zPbG}q#M{~o^>w^vlL6@25Dr*~Jsq#ubo>SCJHFj^(13mOD(uR!m#`6Yt{aNi_})F- z2>;nT;Xrb&a-Ps9lGIR++pxB)Hb&5Ww+OG;bZ&GcV5(KHk~5LQgEzrA(J5R>FFKbi zI44s_*vV8Zjp@_`MS^n*5lo?CIYjs|iB7%1W>7IFX&U>d2K#0qXQwdpMtm^dW{WG+ zT~s`p`O5dYKaT`pEv~x-*rND@XM^#~$t0%N1gC{sc(FJhrChV(Q98}UH)qDlZ__a9 z`A1;Z55u0n1%@oA65;v#L~@`Xm~h&Ckb(Ozfb5e4petq3vnUl?_*K)0>Ez(9L>(Lrnip<3CcLN)T@{j`&>}=F1 zhf$z=k`9z&mDbWyuhzCM$T~5Lh^a z)r+e?ESFa;Lweyw0@)MIqVfv&3ZOxr4}q11)s;(pUcXP1mI7j)W}t!d`<$pIDx+2| zOah@u;fR&MH1z`9&;^U%)+emaXjESow{$_4w&KG5AX8T+Qx+{pOS1@Coho)*<4w!UaPS)GCuWOJOZuT69}ErOBw`dICh7fpM%10hp`1J}&C50p#7gjW!x3WyTSae*8_yHFZG;2t7HM3q~c&RZ>CaI{I6AY~(Q0%@4 zhs=2e06Q+hDOQb4ON4B1o!x=gT!OP`fcIR2S$O#wFdF}S2_D2(d!QALe8gLa@ntw| z+<%S8&(FsvF2kAwS7ELSVuVLs)dT0yc5l7iF*CPBi{1)}c-KnYc;Qnpq`5renY!-^ z446*-1?O6ljcvt+!*Eq*;T(Mn^b1qZL`4o0j}V6e{xd1z#gJTx*>5>FKU;X$4#4(*9jl}t|~j}G#%psUvY E3w)mZtpET3 delta 2404 zcmeHHZA@EL7(TbXK+kE*I)0FqR=JfarBps{;zlmBNkdzT>Bd%YLtxVT(FvJbv8@ty zgGLjHKQw8WoMc9g!4MS|hl{;SHr)gyv{20qIz@3YEX0q^5KT1ErFd>z=6?FeKZct; z=RNoRc+PX*bIy&$*jS7`Yb_}8fHz+R2P(}7fK`y4jBo{JZSLKm1Y};TZ7rgPo}bbU zPw6NE6@i+7CMX~%Bq)-nbedD45lVGo^rXg(>nhQO#GvL?jcQk&{Mrke54WL5rSvV) zu@TxH7?wsgvNQ@W>PlSxgFU|1=7a7g=sxf;g!Q}SjxpG;!KMkQFW&8C7^|np@80L! z>#mZ&o`9Jhxc>~Q#!Bz^gLZ1>W$MWfYf}$tSmWqZ0G|>{fL(jzRs!72zma7_?e&f!vg?Ilc zQ>4u2xo3s+X?~OY@@L^dkuf?$s3`(q+X0ds4U#w8NGh30~`NB|je{3>KS z%gBbrMP-G#%WRqCc#kzn#VX-w#frr&4Q80sB~kNq2Bkg{HFL3*0idf`shD|-_*kQq zZ00(p^Qr41*G0@vBG*mKy2u?S=64ZW)}VR(E2xrP%kZN16mp@oRyvX1CY?-caq}8% zm%m+uJB@f9YX)g4_;?V1H;L|jaozR75~Ap#MhIb()8~WD?)H{er_1Gsu#ssF zMwyn{R)&|Pa4-_lXS4Q0Sm*J0NkJpi77Q|dN0`1SGr&g}{x}m1heP3P-a{m>)9&%R z{e+67wj5z1Av?nhp>R~MCoZ20La)zmb?tRJ^xeha8C*y!mb6h zT3Fps=e@rk+ZK_@%vgK-9_wWU(yK@?TD92$>wagu7yB1cEv;nZ=N3^Vo%KyDqVr`+ zlUh3Lilds%wy}fh5A_|7M({IfRF2Q2QCs3qR7;hUJ%i9`Cmi{mi89gNAhWrsT>Ten zptdVSKKH&VyHg>nsi~1)zJ&s+@lTOm{w0GRps5J9skL45A8IY6&lyy|Qd`4T54O(1 M|K=KyAJyG|1OEFgwg3PC