From 1ddef3001a5ec34769358f54e0c9b39b2083ae0d Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sun, 3 Nov 2019 14:38:02 -0500 Subject: [PATCH] F_SFIRST/F_SNEXT can now return all file extents --- SOFTCARD80.ASM#040000 | 69 ++++++++++++++++++++++++++++++++++-------- SOFTCARD80.BIN#041000 | Bin 43011 -> 43011 bytes zapple2.po | Bin 819200 -> 819200 bytes 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/SOFTCARD80.ASM#040000 b/SOFTCARD80.ASM#040000 index f56dbed..49c8e06 100644 --- a/SOFTCARD80.ASM#040000 +++ b/SOFTCARD80.ASM#040000 @@ -19,6 +19,7 @@ ; ; BDOS TODOs ; ---------- +; TODO: STAT B:*.* leaves current drive set to B! Probably other progs too. ; TODO: Size information from NAME2FCB seems to be a bit fishy! I think the ; issue here is that STAT needs to see all the extents, whereas NSWEEP ; uses the highest extent number it sees, and doesn't really care about @@ -972,7 +973,6 @@ ENTPERBLK EQU 0DH ; Number of file entries per block ; DE is the address of the FCB describing the file to look for ; Returns error codes in A and L: 0 for success, 0FFH for not found ; The matching FCB is always in slot 0, so success return code always 0 -; TODO: Should handle '?' in extent field also F_SFIRST LD (TEMPWORD),DE ; Store pointer to search FCB LD A,(DE) ; Obtain drive number LD (DFCBDRV),A ; Copy to directory FCB @@ -981,7 +981,9 @@ F_SFIRST LD (TEMPWORD),DE ; Store pointer to search FCB LD DE,DFCB ; Use this FCB to open the directory CALL _F_OPEN ; Open the directory (avoiding recursion!) -FSFL1 CALL RDDIRBLK ; Read first 512 byte block +FSFL1 LD A,0FFH ; Init CDBEXT to 0FFH (see CHKDIRBLK) + LD (CDBEXT),A ; ... + CALL RDDIRBLK ; Read first 512 byte block CP 0 ; See if it was an error JP NZ,FSFS2 ; If error, assume EOF & just return @@ -1011,7 +1013,6 @@ FSFS2 LD A,0FFH ; No match ; The address of the FCB describing the file to look for is in TEMPWORD ; Returns error codes in A and L: 0 for success, 0FFH for not found ; The matching FCB is always in slot 0, so success return code always 0 -; TODO: Should handle '?' in extent field also F_SNEXT LD HL,(CDBPTR) ; Pointer into current block LD A,(CDBCOUNT) ; File count for current block FSNL1 LD DE,(TEMPWORD) ; Get ptr to search FCB back @@ -1019,6 +1020,8 @@ FSNL1 LD DE,(TEMPWORD) ; Get ptr to search FCB back CP 0 ; See if it was a match JP Z,FSNS1 ; If so, return + LD A,0FFH ; Init CDBEXT to 0FFH (see CHKDIRBLK) + LD (CDBEXT),A ; ... CALL RDDIRBLK ; Read next 512 byte block CP 0 ; See if it was an error JP NZ,FSNS2 ; If error, assume EOF & just return @@ -1851,12 +1854,12 @@ CHKDIRENT LD B,0 ; Hardcode drive A: MATCHFCB ignores it LD C,1 ; Do check file sizes and put in FCB CALL NAME2FCB ; Create FCB in DMA buffer POP DE ; Recover DE - POP HL - PUSH HL - PUSH DE + POP HL ; Recover HL + PUSH HL ; Preserve HL + PUSH DE ; Preserve DE CALL MATCHFCB ; Compare search FCB w/ FCB in DMA buffer - POP DE - POP HL ; Restore HL + POP DE ; Recover DE + POP HL ; Recover HL CP 0 ; Does it match? JP Z,CDES2 ; If so, return CDES1 LD A,0FFH ; No match @@ -1867,33 +1870,73 @@ CDES2 XOR A ; Match ; Search a 512 byte block of a ProDOS directory for a matching file entry ; Used by F_SFIRST and F_SNEXT ; DE is the address of the FCB describing the file to look for +; If the extent field of this FCB is '?' then all extents are returned ; CDBPTR points to the next ProDOS file entry to parse ; CDBCOUNT is set to the number of file entries already parsed in this block ; Returns A=0 if entry matches, A=FFH if no match CHKDIRBLK LD A,(CDBCOUNT) ; File entry counter LD HL,(CDBPTR) ; Pointer to next file entry -CDBL1 CALL CHKDIRENT ; Match the file entry at HL - EX AF,AF' ; Stash return code for now +CDBL1 CALL CHKDIRENT ; Match the file entry at HL, build FCB + PUSH AF ; Stash return code for now + PUSH DE ; Copy pointer to search FCB ... + POP IX ; ... into IX + LD A,(IX+0CH) ; Get extent field of search FCB + CP '?' ; Is it '?' + JP NZ,CDBS1 ; If not, we can advance to next entry + + LD A,(CDBEXT) ; Load CDBEXT + CP 0FFH ; If it is 0FFH, means this is first ... + JP Z,CDBS0 ; ... time we have looked at this dirent + JP CDBS01 ; Not the first extent for this dirent + + ; First extent for directory entry (highest numbered extent) + ; This extent may contain 1-128 records +CDBS0 LD HL,(DMAADDR) ; Address of FCB created by CHKDIRENT + PUSH HL ; Copy address of FCB ... + POP IY ; ... into IY + LD A,(IY+0CH) ; Get num extents for this entry minus one + LD (CDBEXT),A ; Store it for next time + LD (IY+0CH),A ; Store it in the FCB returned to caller + CP 0 ; If CDBEXT will be zero next time + JP Z,CDBS1 ; ... we can advance to next entry + JP CDBS2 ; Return FCB for this extent (it match) + + ; Not the first extent for directory entry + ; Always has 128 records +CDBS01 LD B,080H ; 128 records + LD (IY+0FH),B ; Store in num recs field + DEC A ; Decrement extent counter + LD (CDBEXT),A ; Store it for next time + LD (IY+0CH),A ; Store it in the FCB returned to caller + CP 0 ; If CDBEXT will be zero next time + JP Z,CDBS1 ; ... we can advance to next entry + JP CDBS2 ; Return FCB for this extent (it match) + +CDBS1 LD HL,(CDBPTR) ; Pointer to file entry LD BC,FILEENTSZ ; Advance to next file entry ADD HL,BC ; ... LD (CDBPTR),HL ; Store the pointer LD A,(CDBCOUNT) ; File entry counter INC A ; Increment count of file entries LD (CDBCOUNT),A ; Store the counter - EX AF,AF' ; Get return code back in A + LD A,0FFH ; Initialize CDBEXT to 0FFH ... + LD (CDBEXT),A ; ... to start processing next dirent + +CDBS2 POP AF ; Get return code back in A CP 0 ; Was it a match? - JP Z,CDBS1 ; If so, we are done + JP Z,CDBS3 ; If so, we are done LD A,(CDBCOUNT) ; Get the counter back CP ENTPERBLK ; Done all of them in this block? JP NZ,CDBL1 ; If not, loop LD A,0FFH ; No match RET ; -CDBS1 XOR A ; Match +CDBS3 XOR A ; Match RET ; The following variables are used to preserve state between calls CDBPTR DEFW 0000H ; Stores pointer to next file entry CDBCOUNT DEFB 0 ; Stores file entry counter +CDBEXT DEFB 0 ; Stores extent number ; Find IOBUF address for a file reference number ; Scan through FRN1, FRN2, FRN3, FRN4 to find the file reference number in A diff --git a/SOFTCARD80.BIN#041000 b/SOFTCARD80.BIN#041000 index 26a82ec1b2de4f2a3c064856b8b8db4a243b8fe7..8c8da16df52620ca67c0a1396fe68b542c0f7291 100644 GIT binary patch delta 2917 zcmZ`*e{2)i9e;KlV<&ck$>vdqX1SPl#0bc)oyuI|w521o<44u8sw->>Olw&OVTqLcSde^*?uo+q=tGJz`N;FLT(P^ymW#4ya zhlFaDeDC|d-|zc=-uLsq?|XM_%6M$bc*bTh@MCs^(^z#bjeijH%^h%z3u`LsmuOSR zxv}jP?}YBT$Wwpi@ef)0Y?>ZR({H5dH`7!IH8~N5P}6eMbC@5MPf(T`wCz5*U-0k>L$^7zT~kZR`l0qivC7# z1ENOLX0+W3UjEDh8S;_${K8O!tN|4%C&F|&69_dF_Fm+5sG%?{6XIc4u*f@#JpO5z zJgdUKIr>8mD^c+NEKI$XHmpY0rYx7CuW++FS0KEbgQ&T%G!`aPm&b|x8Nif1S1OjO}hruj*o?=C9$Y!iOqD|~kiLW(_ukbUo9Ir{~4Yi8{@dIxiQjJBBYlff0i zTRc6>lf#@S)qcr558?SQKl}Yp_&?4*a_Riw?8X~BRUkRepY$9-h6fUtuw`VOca3(i zY*s4BEnC9QBkN^D7!qy`+G>HfVPiu_zV((qwL-b3uQ8ED6A-58 z2a27j24%Y48`P!Z=Va^dnnrC}Eq=+$?_S3`BQ=VCr-l(*< z6wz%z2=_h`m3pHWKzfe^DwiR!Q>%5V@u-LAo0~Bl-l^z4&{*KsL&L;9Eb_^Mx$Fo14yqwgbY*85vp>G%DQ6eWCRUo7yIhaNZ9|?>)*%Cpf?;6!XP^ z4VqxlZ-a#+oFsDQQ1O?wt&4RK$M7w!H$u=2&>ppZcN3QUjdViQ-Yh<+gCh8~d(WoF zm0O&542C(*`vwe^G4Go&RL6vuxoxiY*vdzb%mih;Dh4-5K8*Lo4&!HINAMoO9{XnL zwGQNN=Kiq+5k4t=v+C^SfP$bm8l7Q`Td^Vx2 z!u3gT*+$OMZ4apZm#lHM^Qtv|xzR8EJBHii)KOH(<(@TR#%AE?p&=UxL~#J zZW3p}y;7`A+y)D3Xc`Y+@i&XhHBT8XA`*z^SM-uo1oQn9D z1RhOFcO{ALg_7=S0zaK9=^`cFjl^VkS;v)h#^mI`$~wNJb0#N$#KT&x>>b@trFFXD z4G&kon#ud<^KHIv5!m>^M81&tyj^iCd4$^JYg>Xi7f% z*vCoTuDLpPA@UMJ6L?LE$nf6QWNC_cK~<5j5|je=P%0OwfEppA@$y5GIVEJ0ZNY6R zpY6POUrLLXmmAg=U;}yS;gk+SVm6b0@_eeiA24jQnUUMncV5Y-0&1(mq@=!7-(@3w zDby`%TA`a>N=X7JP2lc+(X#^i^{YXqAlAEI|5K-8ge7kNK_2Drb` zcyOH3hk1J?;dT`d-aeO~Y*cG}-{A3gc?t1A?K&a?eOhki?UPThs1_+(ph7`_4yZ2W zDZT@`S9V}J@3tLOL*hexep;3r(c2TdhdY&PjzrMh-#azjS)m!gOF1*#X##ynx4rLud(nLI0|-qp@RgGA!8L#Y TXQG_?{I)#(pRt$us;~bKZEi<8 delta 2773 zcmZ`*4{Q_H8Gm-1)Cq~f@oG`$55738#jI>{vo-VJXbZ|{DP*Eln?(K?h*qR#E9;~> z{Id-t_T_vR+jpMC8g*5jQdEuA-Lh_=X&T%SwRh!hnBlONc#~HplSW->Vw*;#T=u=Y zbCyyqQtrL?eZTkn-uHX&eb1+_Sx;ZHzTIfC(9=y8x3%Fw7B6x1(hJTZ@!^`5`}Cpn zz;tiTmDu`Y0`)@y?_>i5*}z~n5XuJjXQ>$Ka3cz#jO1xb)D99}L(*V8xK~&VI|63~>J?)1pA+zJxyA76{9@P} zY)4dowhr~y11g+<|>}y5%+Z+)7DK1aP$qi`O=DgIMja3#c< zFi2VxpCyq$zGq?)zZ%z~OX|UdGloi(E(Z00nfAd%p@GEnPB~|=GqWu{l9{&HtGy}x&K~fJ>CH|g34e7kPXNUTP;a=wbhWHrsfU*Bn zotbio!L@OH1Boz8YML=cDN$`%*wZzres4b!!DmiLGv%;GW#@!&uJXk7{CH*C%L0`l$u4i=zer^GAZc+q@(QiNvqQaWxR)avCxS@TQV$=i zaY=}fUp9s8Wc{?*&QjJJocK7~WjQRq#I{FovJuUz=2-g?twDW_wU@%E(O2@xfgHoI&Ff&8uN$gU12_DMBU&Jo1PzLL> zK%?XpC`3?>@FSev@}OS5z_1w#m>nQ7Ql_*fso#JiguWRZ$X-y-a=}4pe#!+y(EOYW z?uX{roOqYp?YYBsZa=XQRqzcCu7PqKJNV@bw5QPQuZ&=Rp_zq8c}3U{NlyZ=x-_enJ6M|AZa4q>crk_}<~?XNpj1V2Pv_YrF%2%JjCt z7qfJ4;K3}tEAUXZaJg(#Ai;w$yGG*fovkOhVzvRdNdmxYrQfW8NA+mB4xhu&ORppA}!Wrw)TITrW-Fxe@W|XWu<-7Jg}DKiW!7(t|Rx| zol(s70PpTbC{(tQiz=UqXj{~-jNF+SnYF^B?P~65HC#_-i@?d5m#x^}?XRpyL`)i40H!^^xJz=say$Hz}JfD%zXF#!Aqzh8% zc~qB5e&<9V)v1c}FxLT9+oM{AL8v6f(L&kRctndyA7{!1Me(BFU24jO?wgyEp;lPn zAA#wzHy5(ZO+ioc=R(%GskYalf8}erP{Z65!RSEJ(c$m)=0Y{P15j#TE@VU75sDek p_n#-@<>A$%Kuu!c(`M)Q9E1P>FAOP1{h9RM{{oNs_-OzD diff --git a/zapple2.po b/zapple2.po index a8748335f8d6017545ea5a383ea0393377c36783..a1742c43bddbdf5f059f96bd0885e2a77c4aa37b 100644 GIT binary patch delta 3009 zcmZ`*e{2)i9e+-Ij-A*^Oty?BG|k1dB}PDY?NsIxr!5^}8$YIwRb63Apjyj12un1@ zA%JZPwJ-Mh*Tv%ySvM)rtLcOde^){=nO5BRb1w%5)Bi7bQ-IC+4tSq zA)%V3=l6Zz@ArK_?|t6)ec$>0jNi|k9yi)vc-U${=mx4L!jVa1aMEaiRsyXQno*cE zQtbwQ%tleQCFSRm_=geq+&=rbu&RuzFVn{Mb7Nb}sCWGjUgYV&@%Tp}=1h_~n`GWh zGH)emKWeH)G(t^FQBxg~cwsF|tzC69&>ZXu-Ux1EyV&2d!|WUEpV?71!wwzIvN_f| z&_7TSVnQ22Lq~^>_K&^BQkxCNOAuSQH9*n6mL%RCO6RjF{4uA_DIEc(0U1!WrRn!P z{Ts3Z6^R`I*BgA^Q_0-n>Dxr-{F2A^NZwPG%6l4J4Tv61n$T7YczII$WZ0Cv>lcPf zWbvvU??Lp6Brk0rFoSaL+Lxaaak1`)2|A?WAEP zvNWZ+6mylE-M$Rrog9SC1f;V8GOTmfB2NlHWoMdmEp(|5E{OC{aB(E*_TAY&ZF(C2 zE&vSd4ch%ELuG+Jn=u^=Y#AbS9heRx(+h8RawH z#>@sQ-V|y2lut4LHCYng!Y-#EJipxRC`!_(S3k*dpKso*w714^CM#ZB#bt_IbqbunQ0gT8WNW zBanH;{F#9u9>w1=^e=EG1?-+Pb1Va-yNQr<;i(Y6!O1dpT}_i zm!JLqr~DsgpSpa0V0Qg2p3aeN&L8$1frdXMmW7JYI`ta!VA-gYlABf*nupdihma)P ziBQ%m;O zLmCX3!62RsIi!)0do@vK9417Zvmtf4h(qqR=03GlxvtMKl1UQ~Chq~FYf&XibvxFn z)#B%5`Hsp)ZCD|G8ImV&;+fD*?@ZO!+3kWQMp=EqaGzSC1jAl+wX!~}I+bnVCF)wy z4Qlf>ci6priP0w2hG)0eqME|bWR}`A^X{;_ZApz$4fhscp&{Zo|0f;%XdLcg1;eIhP`p2&kQ@f<^A&a_LF~HimuE z*<2dm&rN4R+W}$Zlnk{BDi&_#zR(JWRc#YTIM+v{3LoaA;~Ze*^4YxC3e_<0vBJa= zP7*njKmW_B*2OxAV|Z9Ak`Qzq)Jd)I-G(V2l9H&}n#GrNPz1kr*O}zFa))!Bg>H^> zy$Kx^alHjyMMQW#PHm}ck1T)s(2P&UDkW61~#sk^UXQ?NRzL%4M>($b^WK@~tRwYgE=m@qIC=eq|JQN2U6x zyAk?+)gV3Xe&7D63~r-QGu{_Fz(A#MkLD)R zP^e&yr0_oztweBW?)6N6(!G^AkaTZm4ko8BWQ{WHa13Ubir4R*t?h8ZY~9@`&VV~5 zR>kgu`7|_*h_CpY#HE_24A&8f4}shp15|_9qKO3Gtx2$S(3gteD~?p7_*_v23nl)n zIFeP9*ad@qF&S=t#vwQcDW`8FwxMoZOvM~EHt9snjY!_wdy@2_7(Nc?BK|doN8{3c zaiV*rpt}~s&m{`FU_o~)Hq~9!aRpsTeCl6C9beGZ#;1PF!(1)*?cL8Nb-v-f2e6%S z8X5Gv25E2bLoU~nlw#tr_1$s!G|)eOFfugQaQdh|lI{LDZhcjrH`~KPQ<8f6yPw2$ z2hG>M1CcigP2g1tBEvJT$Cq}qI25^n2x z@sWfUE-N>z&cPD0(vt}tg#>LTW##2WaYbO*Vl^R$vG2T+O?cH-g-u9(iM}f(@a0gm zq-mLMdMzOhg3<`?j$_Vc$fI8mGAt$`+#DZp0Y)t+U3(C-0|BBAjl0Nu{Tbj28WZ-D zdN*&U2)iqI@OIaE$U?RH_YEF@o0kv|ow_W`J delta 2873 zcmZ`*4{Q_H8Gm+si4$TIC#yxBKltJ>idos@W^3lb(H4}_GRQ=!Hi`T(5UohfR@O;% z_-7jkwqxJL_F;OgQCBr7L)Egn`_lz9O@lk4_O85brZ}u6-sGWV(x@vfg;T2JOCcJpC%sdC&9sx9nnYWo|L(_O~IrFI$azY5^6@y&ywU^1kOy zc2pZuk#aWbt0V)i#-sitydG*i3e$wK1mz09$vfWU@%||J)F2Vh^{BS} z1e^1Xu;o212!ERekAI3vzl@Th%j-nJ9K@5oCs_Y-h$E&uX^DN-iS+S(6ASpYs2aYf z?2kDjs7PyU&<`4U?~mmRcp*w?i4hw>fUIR^X;Ul@3Fk@1g<`1~vimsR*T)w_?qYX6 z{tw$e#^-!#o<5~{+@au@x<$#yAiY8i7OxTA&#$JR)$HH=jGZ{?bgRcjMfgLKYI_De z5B-17OdLGJ2Z`PBis$d~^q}TgvusnI(9KJZzac!vQV;4!fUY)@4#Y7P)%K83b5BXf z4O)tHYZkV(0oCsABQ$u73F)}8=iXIF_FK@xO1b=u6Up=(FIPu2#YVOEnizk-VUzf) zxZj1|_PLO3w`Pc9CjNlG88ppE_JWqiynFoO#FOjL4HL{0Bi@J~7tZ;y%TEgde-;a2*S3|~$Htb6=yg%W~+sF9x|iHl32m(dNDZOUEUycAkL6@;wjTKJgtn?k7kvO#4>!pjJ4 zV-#(^&I*r@QJtoP!b@XRTlhvIq`H-fg!PbGr@Wr97K5nXQ}jrq2`d=Hsf0(GNH80S zy6CA!1bic*c8F4f>9P*1Rm!YB$3iCk8r&=ffo~_WqudWX8`TE!uL&4=>~3wiLi|TU zp1Fg>CZGGb=8NE> z9h4?Ge21ftqxoXViK-C+DJ71;+{#T3&x}d$uIF$obR6S`{;+BiKjGl%il7(edAfLd zez8<)L$b#cf<-k6y*$+#UNa^GtZ&SUn^Q-8P>Anv^D_mgIj}}jmsQS=fN5rn?~7Tc z$G0}i?C?F5&0j8AWXNzo%&rpI`)6wzE}N~xEg}zaO8m_-cvy?35%D>EwRlBC%5asC zcn#$C6ht+NbDBuv|6P+{>7cI?|6LiW7SWO-aNRB;b+oR}>U_f^48d$^8kzJPL#k^84zZIQsXwP6^)Cq9 zvy{v6r8M4jN`|Lf|8wGaRCp;%ZG9@4*2ir&To`fmBJz}=OZdYyk>N$vWa%hD!671l z6QdvSeD_73YQ6~o0QIs)R7sUHNzv`)Y#slo1V%@n}yfTP^-em@zU>vw*@LA z95(+D^7SHcuV;e?$pe~&AX~Jw9X)!tWTyyi*E4`-TtTubtr|%gJfD%KGQiqRA_7}l zB9*n0KR)3{HCKgsm}`gn?NZGA0F;!%NWSE$Kcq&)k29sbEW6R~F4-mmHFJ{^6b<(n*>SpP6W(zldW%neC2Bsfx5X#g3*9P(BSX&Oa!Vl1E7@NiGT%dMJS>h z-+!KrmxfmlgKH84pEQKuvk(FRMES?F|C94?Oy7N(s(V04Td3WFTc9klnkfoeHMAON QR%o@*>ZWU^R^0vIzi6ZotN;K2