From 6bdfb4bc9d5d7015efb816ac9aa0e2aead215a8a Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sat, 2 Nov 2019 00:04:54 -0400 Subject: [PATCH] Implemented REN command in CCP --- README.md | 2 ++ SOFTCARD80.ASM#040000 | 80 +++++++++++++++++++++++++++++++++++++++--- SOFTCARD80.BIN#041000 | Bin 43011 -> 43011 bytes zapple2.po | Bin 819200 -> 819200 bytes 4 files changed, 77 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 323fa51..775a314 100644 --- a/README.md +++ b/README.md @@ -263,6 +263,7 @@ The following commands are implemented: - `DIR` - `TYPE` - `ERA` +- `REN` - Changing drives using `A:`, `B:`, etc. - Launching a `.COM` file (just type the name and any arguments) @@ -278,6 +279,7 @@ Wildcards using `*` are not yet supported. - `TYPE TEST.TXT` - view a text file - `A:PIP B:MY.TXT=A:TEST.TXT` copy `TEST.TXT` from A: to B:, renaming it as `MY.TXT` - `ERA MY.TXT` erase file `MY.TXT` +- `REN B:NEWNAME.TXT=OLDNAME.TXT` - `STAT DRV` - show info on the virtual drive - `DDT MYPROG.COM` - debug `MYPROG.COM` using DDT (8800 debugger) - `ZSID MYPROG.COM` - debug `MYPROG.COM` using ZSID (Z80 debugger) diff --git a/SOFTCARD80.ASM#040000 b/SOFTCARD80.ASM#040000 index f92e8fd..f56dbed 100644 --- a/SOFTCARD80.ASM#040000 +++ b/SOFTCARD80.ASM#040000 @@ -43,7 +43,7 @@ ; Other Random TODO comments in the code ; -BDOSADDR EQU 08600H ; +BDOSADDR EQU 08400H ; STCKTOP EQU 097FFH ; Top of Z80 stack (below IOBUFs) SOFTCARD EQU 0E400H ; Softcard in slot 4 ($C400) @@ -2055,7 +2055,7 @@ PRHEX PUSH AF ; - FILENAME.COM - Load and run FILENAME.COM at 0100H ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; TODO: Implement REN, SAVE commands +; TODO: Implement SAVE command ; TODO: Sanity check / validate number of command args for builtins ??? ; Get a line of text from the console & handle it @@ -2511,6 +2511,12 @@ NFMSG DEFM 'Not found' REMSG DEFM 'Read error' DEFB 13,'$' +BFMSG DEFM 'Bad format' + DEFB 13,'$' + +RNEMSG DEFM 'Rename error' + DEFB 13,'$' + ; Show disk directory ; Use FCB1 for directory search DIRECT LD A,(FCB1NAM) ; Get first char of filename @@ -2614,9 +2620,73 @@ ERER LD DE,NFMSG ; 'Not found' message RET ; ; Rename a file -; Here we need to build our own 'special' FCB using the dest=src command line -; TODO: Write this -RENAME +; Here we need to build our own 'special' FCB using the x:dest=src command line +; Maniplate the command tail to replace the leading space with char count of +; first string and the = with char count of second string. Then use NAME2FCB +; twice to build the 'special' FCB used by F_RENAME. +RENAME LD HL,FILEBUF ; Command tail is in filebuf + LD C,(HL) ; Read length of string + INC C ; Makes length compare easier + LD B,0 ; Use B to count chars +RENL1 INC HL ; Advance to next char + INC B ; Increase char count + LD A,B ; Copy to A for compare + CP C ; Compare with string length + JP Z,RENS4 ; If at end then bad format + LD A,(HL) ; Fetch char + CP '=' ; See if it is equals sign + JP Z,RENS1 ; Handle '=' sign + JP RENL1 ; Loop +RENS1 LD A,B ; Get char count + SUB 2 ; For initial space and '=' + LD DE,FILEBUF ; Will write through ptr DE + INC DE ; Advance to initial space + LD (DE),A ; Store length of first string + LD (TEMPWORD),HL ; Store address of '=' sign +RENL2 INC HL ; Advance to next char + INC B ; Increase char count + LD A,B ; Copy to A for compare + CP C ; Compare with string length + JP Z,RENS3 ; If at end then jump out + JP RENL2 ; Loop +RENS3 LD A,B ; Get overall char count into A + SUB 4 ; Compensate for extra chars + LD HL,FILEBUF ; Get char count of first string + INC HL ; ... + SUB (HL) ; Subtract from char count + LD HL,(TEMPWORD) ; Address of '=' sign + LD (HL),A ; Store length of second string + + LD HL,FCB2 ; Set DMAADDR for destination + LD (DMAADDR),HL ; ... + LD HL,FILEBUF ; Set HL to dest file string + INC HL ; ... + CALL DRVLETTER ; Handle any x: drive letter prefix + LD C,0 ; NAME2FCB should not do size lookup + CALL NAME2FCB ; Make FCB for source file + + LD HL,FCB1 ; Set DMAADDR for source + LD (DMAADDR),HL ; ... + LD HL,(TEMPWORD) ; Set HL to source file string + LD C,0 ; NAME2FCB should not do size lookup + CALL NAME2FCB ; Make FCB for source file + LD A,(FCB2) ; Get drive number of destination + LD (FCB1),A ; Store it for source too + + LD DE,FCB1 ; Pass address of FCB to F_RENAME + LD HL,FILEBUF ; Set DMAADDR to point to FILEBUF + LD (DMAADDR),HL ; ... + CALL F_RENAME ; Perform the rename + + CP 0 ; See if it was successful + JP NZ,RENS5 ; If not, display message + RET ; + +RENS4 LD DE,BFMSG ; 'Bad format' message + CALL C_WRITESTR ; ... + RET +RENS5 LD DE,RNEMSG ; 'Rename error' message + CALL C_WRITESTR ; ... RET ; Show a test file on the console diff --git a/SOFTCARD80.BIN#041000 b/SOFTCARD80.BIN#041000 index a4219553aa8c55cc3ae05ac80a229d9f43916375..26a82ec1b2de4f2a3c064856b8b8db4a243b8fe7 100644 GIT binary patch delta 3242 zcmZ`*4QvzV8UD_3QU_uuj=O9%iR+8QpF6SjfR=gW*q{PhRx+WsQw4Dh2^2&qES=== zX9uv)j(v{pv)9o^ZPlajs*p!5s|l;3k~au$Fj}*E!QhGY!#IYo%QFes||I zrCNTzpZE9sp7;IU_l{jR9J_9qJB^TlLNGiMdUvjYAQERRM7?2U_|D!1$hs{nPqXy& zUTaTQZVy|J8etULtE|0vG5JC>ayRQjSQI3pm~rOWs<#G$cORbqS&phglo3$_C`TRS z$QL+yLyYofsje*L%Timj-w}&@`h4A(8&G2Nnn(1aM4pKDM6=Q3(O09*qtTPm zKSqZ`H>0qnNNf=7nz5NaOP8HA&icQI~dB_g!b^Z-7Z(5 zSjrXsL|Hx+Dkq!VeXfV=Wqi8;2PbL^^Xh;tC$Z7>Ng!hB1O!=P{y*f4>6= z=7cH+;vg2}*O+{f9M8z!SYfJ^lf$esEp;)J0}-g9wsjLnuEz!x#CI{Cr?@GQvTdt5nJE3o0xAwwE+c5$C;UcfvsW2bCA<~ z4KtvZ8H(D2Z*tZ*Ik}s`;~Yjl9|ysY81lI+@erzQJ<8^&5IecK8Oc9l!Qh`5;S7Vf zc6Sr<=fI!nKFWG#i&!I?k><#kjR+s#qli&Zg40rW#5#al|dFDh3vYP>Ow(^4v`OBBhLETljKs(q>x zL*~*IQqfE*_VxC0POKTg8CkzlsU72^R~y>-Uq(H4^bTc5qQ#WPgiBG+JRrEdJa&q-pZg6tV%N&`;SDOj&f3Rm55I;5Jc^2Hj zSucI2v1dGM*@AXwAnI?dK`z^Vc!`JO{mNVz z1IiNVJ8{J=JrQqIR`AP!Z2E9noNjA0nuWSJXd#>aQ)3dAt88zaUe#zbY6gTKR(2+- zH!gT}i!QU~Md*!RfYlXj$X-dp3QBLs0j0%@WeDMDVm{Ooc=FH+9J@*`MXLGpl0KgOVfW#)YT(A)G z=P_@-R4&LiHeUkj(_lu-iBOuLK*>v46R}XOXFym9CCvmP1GsQ0X1-GsMF_3)c(Z4v z6Rf8Trc2d3nK~n zZh}05%EeL>szDoZTuTWo=9F$FglMBLVtgatuB=rz=WEZspZ%+gO% zi?aC(C8G!z>;~;Bp1oIFz2GcuP29+HAYRS?X0~_`dsA`vihK=!QI!>_nx8x5H*$QiQi%blsn6OS^-~wf3|8 z=A_GJ7S<+dgj3S$$dZeb@?#JczAq_vri4pLOk1MUn51k>>$Igh?d9aPmI`f!PJ26f zZMZ_CbsC?%R?UH~n%35q?6Vr&(6qssIYlBudsn#V4nV3m;e`5g5^jEf3i`YDktQSU zGez5p)^DcZOHZ6(TOY;y%mU6CT)nl&xnpnNo~=JIw{6<~{MJ3&o!k5R_V$_EJe^2! zUW=zR8|qh&bqm5>2%VQdNZ~a!Zgnjj!cvfU_+#XB3J^Y>Dh8?`kML}`@jc-eDXkY# zTM)g9>O_QMqT~OZ&p*+B{Um4&(PM7kc=tRFeZyxd8H$Eyr z1tZ`e0qKHs#7B&e!isl~_zdHtEpNd3;v*xzIpd>PMis;hRs2fFh_6azfRwal#AgKh vngNY@b+@+Hx7QAUY3xHjrZ4`$f(wwv#OueuSm)muIa8ng#CE2kdKd9OeIUlp delta 3067 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 IeE#A80Nr5OyZ`_I delta 3162 zcmZ`*0c;c38GaZ0j2#juj%mhBn)+fWC6!Qnz{!^_s`$o)>5ic(sKl_HrWlNxHIC|Ylg4fX>#-tV)BPA zsJ*2EB2YkZL@@l_IrKZBBaJq?CV2b7>1>WQA=Zr85X!MPMCL;gckwLFuop7y`x*9P zh6$mzX2c-WHXpUQknBtB)Rv4L3^PxL&odTeTjzQ4rH|eT9}O462ld}%cv)m+q%+bL zks}u)mm`xAn(O7>;3l|xqFbULMAyb%h^1o(VuxZagRvvAORRsYv!Sj$RC1Ym{yehVxFjGxGdakEc*9<%)i)jE{y(TKze# z_MB!_Uyo=(bzektsV5?9iUCyIPig4fc299RC2xo*$gyFx{UFj?1Qd#Hd;$i^i zl++E8`->~cEFS_ht@SWL@nz3OX;1Jbag_3!);LCSYrJMO@yT&;V@@`4a3o3rzrp2; zOjibX^M$EW4*yiprq#_H+lnaEXlpwyGQ&iHhNR7$R~D!Ic6MHxsY?T|y*Z74CrtSp za#Mb{w-qs?84Fr(1C&3vO(EK!-%2gABU?a2>H%)%)Iirk&U-^NY#roaURH?FuHgK% zV}2U`#QrjV%a&M*xj~=Hy>-Waw&dM*bWaRND6n z-q{dG)KJnA{h|{2Z+A>2ZqS0$YH!pLLKSx~TxH|E(R=||0A-aVlm(@uCBxX6xyc596K#CpXwT)R&i8YrRJlsy+RZguX`GcLFSAu zf9eZzqGY*S+asw_2qB>Bh;u1uHp9sfTNR5}|G!0F3@pM2NvmU3i`PWvl5S9!JfUuV z)R50u{6=h+MPjYSuvm4_k1G!9iD8=451hDhS{;a05JiU1Knye@+q0X9%TkpI1F`G? zPk*JeE3H^UBqkd=G~1XIJKxwT{W|7#q2sIzDRyg;Fh*kD1;AKT*cyQ%tFq}pT#P#(8b+x-@{E#v!Ou#R&``m z`{HtUMWd(Qup;-xPXl$1C~{R}vFfOI#_atpIz z{~e6+I~g0Yvk*Di4&|!^9L1?S1G%(^)kVVU6Vd~M(^Kc0ds1=T{ndeB+g?M24Dg-{6z}-oG7CxH<$hw`qa8{oBfcEOxdkL-Q%6o}% zw_iS-z_%039#k%tnvn&qBS%|G5SUxNn!qCi^4SEwn|yt4=wH<+>Ei^{_YitTDKk%H z%2TCMD^fh304&NmkhP`gyMqG?z%~t7@q*-QEY!5yiSkGRauBSMlsGM6M{p*-Rct2X zThH##_?~97nf&RJS%Dq)!fcbo-#J^~;jGyP+$^O4PD{U?4G$7)x+A`Xw@7Dnqym=? zNn=2_CBZ5sUDHWo|AtP%(t&T1KC6y2vt&*ZxFMk>M|GrV7Rd#J1xW?&chNI1yHJEz zM{>36gtRf~an{SLlRiYk(h<)vOOp68I2Y-aBz`g_k0c3iX@wU~;!mo)Wfk7flcP4V zf?HYPy_+1Zt@3;oo|GK@5#i~f?cg(;4Sz!c2V>3@gDB%Fk@OpaaBn6d^_L`U-IXG> zzC8txJ>&6)k@0jfMv8+aA_YJO!_i5`*?ZHpd%brP(%hr|lp)a{JdWoODL?2G9!U`z zDz;9`TL=o`On-)?z@GSomWwxDECsMw;lhXN=uC}DK zE-jP$B7ab^MwH(}vPq3tU84d#V<}JxL9$AOk