From 914c214b2a507103579c29ca6c5640c987a77c54 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Fri, 1 Nov 2019 00:51:20 -0400 Subject: [PATCH] DIR A:, DIR B: etc now works --- SOFTCARD80.ASM#040000 | 128 +++++++++++++++++++++++++----------------- SOFTCARD80.BIN#041000 | Bin 43011 -> 43011 bytes zapple2.po | Bin 819200 -> 819200 bytes 3 files changed, 77 insertions(+), 51 deletions(-) diff --git a/SOFTCARD80.ASM#040000 b/SOFTCARD80.ASM#040000 index c00464a..50dc24b 100644 --- a/SOFTCARD80.ASM#040000 +++ b/SOFTCARD80.ASM#040000 @@ -20,13 +20,13 @@ ; BDOS TODOs ; ---------- ; TODO: PIP has issues with multi file copy, and I think it is because it only -; closes the destination files, but not the source files. -; TODO: Get STAT.COM to work. Think it is picky about arg handling. +; closes the destination files, but not the source files. Maybe the +; solution is to close files after each read/write. The FCB keeps track +; of the position in any case and we always seek, so this should work. ; TODO: Need to implement the BIOS entry points and jump table (see MG's Ruby) ; TODO: Needs proper boot / warm boot entry points ; TODO: NAME2FCB needs to generate size information in some cases but not ; others. Right now this functionality is just commented out. -; TODO: Debug various failures in PIP. ; TODO: F_WRITE bug turns out to be bug in ProDOS 2.5.0a7 (SET_MARK) ; TODO: Maybe I should eliminate use of "EX AF,AF'" in BDOS since CP/M apps ; may expect exclusive use of alternate register set. @@ -1602,6 +1602,28 @@ F2PS7 LD A,C ; Store length of string LD (IY+0),A ; We kept size byte in IY at start RET ; +; Clear FCB pointed to by DMAADDR +CLRFCB LD HL,(DMAADDR) ; Set all 16 bytes to FCB to zero + LD C,0 ; ... + XOR A ; ... +CFL1 LD (HL),C ; ... + INC HL ; ... + INC A ; ... + CP 16 ; ... + JP NZ,CFL1 ; ... + + LD HL,(DMAADDR) ; Set all filename chars in FCB to space + INC HL ; ... + LD C,' ' ; ... + XOR A ; ... +CFL2 LD (HL),C ; ... + INC HL ; ... + INC A ; ... + CP 8+3 ; ... + JP NZ,CFL2 ; ... + + RET + ; This operation is almost the inverse of FCB2PATH. It takes a pointer to the ; beginning of the ProDOS dirent and converts it to FCB format (8.3 with ; spaces for any unused characters.) @@ -1610,27 +1632,8 @@ F2PS7 LD A,C ; Store length of string ; B contains the drive number (1 for A:, 2 for B: etc) ; The FCB is written to the buffer pointed to by DMAADDR ; Trashes pretty much all registers (except IX, IY) -NAME2FCB EX DE,HL ; Stash HL in DE so we can use HL here - - LD HL,(DMAADDR) ; Set all 16 bytes to FCB to zero - LD C,0 ; ... - XOR A ; ... -N2FL1 LD (HL),C ; ... - INC HL ; ... - INC A ; ... - CP 16 ; ... - JP NZ,N2FL1 ; ... - - LD HL,(DMAADDR) ; Set all filename chars in FCB to space - INC HL ; ... - LD C,' ' ; ... - XOR A ; ... -N2FL2 LD (HL),C ; ... - INC HL ; ... - INC A ; ... - CP 8+3 ; ... - JP NZ,N2FL2 ; ... - +NAME2FCB EX DE,HL ; Stash HL in DE for call to CLRFCB + CALL CLRFCB ; Clear FCB at DMAADDR EX DE,HL ; Get file entry pointer back in HL LD A,(HL) ; Obtain first char of ProDOS dirent @@ -1997,16 +2000,10 @@ PRHEX PUSH AF ; - FILENAME.COM - Load and run FILENAME.COM at 0100H ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; TODO: Sanity check / validate number of command args for builtins -; TODO: Not handling case where there are no args properly. If PIP is started -; without arguments then it should go to interactive mode. Zeroing FILEBUF -; does the trick! -; 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: For some reason ERA B:????????.??? doesn't work ; TODO: Parse * wildcard and generate FCB with ?s +; TODO: For some reason ERA B:????????.??? doesn't work ; TODO: Implement REN, SAVE commands +; TODO: Sanity check / validate number of command args for builtins ; Get a line of text from the console & handle it CCP @@ -2043,23 +2040,13 @@ CCPL1 LD A,(CURDRV) ; Get current drive & user number CALL DRV_SET ; ... JP CCPL1 ; Go again -CCPS1 ; Create FCB1 'x:????????.???' - LD A,(CURDRV) ; Get current drive - AND 0FH ; Mask out user number - INC A ; 1-based for FCB - LD (FCB1DRV),A ; - LD A,'?' ; Filename - LD (FCB1NAM),A ; - LD (FCB1NAM+1),A ; - LD (FCB1NAM+2),A ; - LD (FCB1NAM+3),A ; - LD (FCB1NAM+4),A ; - LD (FCB1NAM+5),A ; - LD (FCB1NAM+6),A ; - LD (FCB1NAM+7),A ; - LD (FCB1NAM+8),A ; - LD (FCB1NAM+9),A ; - LD (FCB1NAM+10),A ; +CCPS1 LD HL,FCB1 ; Clear FCB1 + LD (DMAADDR),HL ; + CALL CLRFCB ; + + LD HL,FCB2 ; Clear FCB2 + LD (DMAADDR),HL ; + CALL CLRFCB ; CALL PARSE ; Parse the command line CALL BUILTIN ; Check for built-in commands @@ -2472,7 +2459,11 @@ REMSG DEFM 'Read error' ; Show disk directory ; Use FCB1 for directory search -DIRECT LD HL,FILEBUF ; Reset DMAADDR to 0080H +DIRECT LD A,(FCB1NAM) ; Get first char of filename + CP ' ' ; See if it is space + CALL Z,DIRFCB ; Set up FCB to search all files + + LD HL,FILEBUF ; Reset DMAADDR to 0080H LD (DMAADDR),HL ; ... LD E,13 ; Carriage return @@ -2490,7 +2481,42 @@ DIRL1 LD DE,FCB1 ; Default FCB address 1 RET NZ ; If not found, we're done CALL PRDIRENT ; Print entry JP DIRL1 ; Loop for all files in dir - + +; Set up FCB1 to search all files +; If length of command tail is zero, or length of command tail is 3 +; and 3rd char is ':' then set up FCB for searching +DIRFCB LD HL,FILEBUF ; Take a look at command tail + PUSH HL ; HL->IX + POP IX ; ... + LD A,(HL) ; Get length of command tail + CP 0 ; If zero ... + JP Z,DFS1 ; ... Then default drive + CP 4 ; If 4 chars (w/ leading/trailing spc) + JP NZ,DFS1 ; If not, then default drive + LD A,(IX+3) ; Should be ':' + CP ':' ; See if it is + JP NZ,DFS1 ; If not, then default drive + LD A,(IX+2) ; Load drive letter from command tail + SUB 'A'-1 ; Make into 1-based drive number + JP DFS2 ; Go make the FCB +DFS1 LD A,(CURDRV) ; Get current drive + AND 0FH ; Mask out user number + INC A ; 1-based for FCB +DFS2 LD (FCB1DRV),A ; Store drive letter + LD A,'?' ; Filename + LD (FCB1NAM),A ; + LD (FCB1NAM+1),A ; + LD (FCB1NAM+2),A ; + LD (FCB1NAM+3),A ; + LD (FCB1NAM+4),A ; + LD (FCB1NAM+5),A ; + LD (FCB1NAM+6),A ; + LD (FCB1NAM+7),A ; + LD (FCB1NAM+8),A ; + LD (FCB1NAM+9),A ; + LD (FCB1NAM+10),A ; + RET + ; Print a directory entry in FILEBUF PRDIRENT PUSH HL ; LD HL,FILEBUF ; diff --git a/SOFTCARD80.BIN#041000 b/SOFTCARD80.BIN#041000 index 7441de57b965e9c10309386c968c533e6ecd7605..99cff7394119e589e8e009cc115e4554a8de415c 100644 GIT binary patch delta 2217 zcmZ`)Yitx%6u#5vZeOr16x~AU?3O4kHe@8Ethhiyggzk{9x2d93^h?8pms}v-4?X$ zw!1Ssa~Wtt3~DR*__2hBqy-b`3~FcXHC@aSQeAO_B_>TZ8vpR4gXhj}c{H&}=bn4c zckemhx#yfcHI{N}Eah?z!we7PGKDEw^)flhJ0BggY{4(37G)Y+OZ`AY>aCMYS}@y$ z$tpirEps(8S1WUMGTVV{g@{GS_8hWVkvcq3*>#0s-o}%sOFbiJNUc9Q9S;!`uRjVm zdAVZ5pt)w76SFJmO*&GVypFYa+LgzNnDtRz8OCHSKkb?mns${qiV?e6&Oi-jK)FJP zGzd+5^BpD+ncX@H_j?T>q=)^}m{1SS4BJNJ8l5`2&{+4BsgVZ+BSJ=Th%WbX6*Wo3BjQkwJ+*x38F zP|Rgd)|v4TM*er;Qva7Na8n)%9k#F5=PF}<*xB<+jBU1Z&#z6Auz%A1U{1qSV~SAFQG_=4nLhDlw7mj|AQvV}5( z&LZ3C8;b!bU-qZjifw0SBc4`-R2*7j{>`CNc7CJ*&XW%qb8`M(+$QOd(kx_OTBK6&3NDwsWQa?rH$^9v}9Zwcup8$cp9PncP*862aDfZVz@{HN3etsU)(KwwAp4&|;Ck7!y6x^eU2XU&-- z{VFss1OEtA!#RD;%t${-N?~7f%1FQYbC7S@`kJ#w`YFZ$Qo(?aywca43Wf$_7v9v@ poCb!Dgz<+R&umBc!`0LWIg}KBYy%g7rOL4npU9Emz*c-@-hc8A`1b$+ delta 2204 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 T&`P1vu@hQZZ~5`^f3Exsjx-U* delta 2306 zcmZ`)e{2&~9DldmEssh$8McYHb6KHfr?c`M+~ruh@zltF#3lY2?Q-5v{e#z z9lg8uuH`hun2d=rLF!Ki(Ft6c;mV#;pi_}1RxF8MJa}7InyimotL{c8u%Gs%jG? zAbPKFa@47FEAh-qbMB}e=&Ho0-oCR{VP`31afGW%aMcN}Cc)VgYzQ^iBNn0N2Gs0A zslkCoz4$YRxmz9Ei(7(xoUDvwC-O;R5smBVZk}sI463s=8!~%U23rQwx_J*$Cj7PB zYK47_+HYHufbEUAr)PCO6 zsuW!9=V6&DMzAZmR&lIV$O}B}t9Y_h0Om!Wbtag0WNT)`Bv&quufH9U5zwT6To7Ya#X)6OqIZa zt)cp&I@KP|KzbRPUpAM|1!}p)3TIPtfu>wX4e^W39wo^wQP>4^kBn96ufoQ%^zkqx zlM1)h7q+!ZVHs1s@`hSHDB$*mV5{N(ZO!QgThJlxzTT3p846pcR*HDx;zBB)6+`Xp zC73slp^$H&x0q~>)#Gq7b;$PQb2PW_W%Uga&tiCWpNQ{ewyS9o&!1jM>NPg^QZw0j zBPrD(;h7d1zdB#SF6L!*g@o^TX0^gSs?d#SC|-`-q?K(?DB~+U%7^0*pL=ib__7X# zeSmJjzq@pKFJuNC(#H1QlG(|EmrF3r`?;9f)JWTJ^6c4k`(I~sTbq+Pzq@$l%p);R zVvX7o#UBO7z*;RzZgwv*>a|v8S#@DBoH9Dy*p)f=&_e>_s_$4eh4r;Aa#rG8=Rz zpzz33^!x>ZBFbdIxo1cP;{pmJaQQirVk1oN3~A{r@O{meN5Xgn1xV* zAREXaBaCKAI+Dr5ur4lS@_=0cBYIMYLVHSxBA;(Wy4xLqI1Wkefsu!nLszCI6zmLsBk8ce8Fw!3?c&bIy{otj@yyA*MTg}6g0N zEy)wV&s7y9e~1r&v91$ zAc0%dOak8)ER!7@5Pjm&2~sAf{)~+RsTMsyO0s+MP*1jFX}9dHIi^|VMmxpy#(AbL zRWBFK!FoF_=m%xJ=t>8h1tmPXpb1f`*X5_K%-Y{1lNcl>8$q~)REFS8^Cb&3`m<)( z*+M`8!<9ZPcS8+l_hcZj?M6s@N6u$-y$KyZajef*$@izANEv7dpp(OWK8EiHNgL_& zmGS*Ll~4WJ=d0rTDaRzDZYom#>A(AY<)#KEY3l)>1@KTocV_x6)8V@g_!zo|+*1_3 zTXeuz23!iBedLCmd3+$I;w{tEs0BZyu6h?+d#Vp%Xcf>Zq0zYwTGc@Hq3Ubr{{diU B0rCI<