From c58c8efe74e6eec836d10334b752007322b70527 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Mon, 21 Oct 2019 20:05:58 -0400 Subject: [PATCH] F_READ/F_WRITE support multiple extents now --- SOFTCARD80.ASM#040000 | 69 +++++++++++++++++++++++++++++++----------- SOFTCARD80.BIN#041000 | Bin 32771 -> 32771 bytes zapple2.po | Bin 819200 -> 819200 bytes 3 files changed, 52 insertions(+), 17 deletions(-) diff --git a/SOFTCARD80.ASM#040000 b/SOFTCARD80.ASM#040000 index b78e6a1..a443c6f 100644 --- a/SOFTCARD80.ASM#040000 +++ b/SOFTCARD80.ASM#040000 @@ -16,7 +16,8 @@ ; ; TODO: F_WRITE bug turns out to be bug in ProDOS 2.5.0a7 (SET_MARK) -; TODO: Only handles files with one extent (16KB) for now. Improve this! +; TODO: Random read only handles files with one extent (16KB) for now. +; TODO: How does DIR / NSWEEP work out file sizes? Need to support this. ; TODO: Note that PIP uses random reads and writes. ; TODO: F_ATTRIB needs to work with FCB with wildcards and leave the FCB at ; DMAADDR @@ -996,7 +997,6 @@ FDERR LD A,0FFH ; 0FFH for error ; DE is the address of the FCB describing the file from which to read ; Returns error codes in A and L: ; 0 OK, 1 EOF, 9 invalid FCB, 10 media changed, 0FFH h/w error -; TODO Handle multiple extents F_READ PUSH DE ; Copy pointer to FCB ... POP IX ; ... into IX LD A,(IX+0EH) ; Obtain file reference num from FCB S2 @@ -1004,6 +1004,7 @@ F_READ PUSH DE ; Copy pointer to FCB ... LD (FRMLIN),A ; Store in parameter list for READ LD A,(IX+20H) ; Obtain sequential record number + LD B,(IX+0CH) ; Obtain extent from FCB CALL RECS2LEN ; Leaves the length in bytes in HL LD (SMMLIP1),HL ; Write 16 bit length in FRMLIP1,FRMLIP2 XOR A ; Set FRMLIP3 to zero @@ -1021,6 +1022,7 @@ F_READ PUSH DE ; Copy pointer to FCB ... LD BC,OFFSET ; Convert to 6502 address ADD HL,BC ; ... LD (FRMLIDB),HL ; Store I/O buffer address in parm list + LD HL,FRMLI ; Pass address of 6502 JSR instruction CALL PRODOS ; Invoke ProDOS MLI - READ CP 4CH ; See if it was EOF @@ -1030,9 +1032,15 @@ F_READ PUSH DE ; Copy pointer to FCB ... CP 0 ; See if there was some other error JP NZ,FRERR ; If so, return code 0FFH (h/w error) + LD A,(IX+20H) ; Get sequential rec num from FCB INC (IX+20H) ; Increment sequential record number + CP 129 ; Is it 129? 128 is the max + JP NZ,FRS1 ; If not, then nothing else to do + XOR A ; Set sequential rec num to zero + LD (IX+20H),A ; ... + INC (IX+0CH) ; Increment the extent - XOR A ; Zero for success +FRS1 XOR A ; Zero for success LD L,A ; Return code in L also RET ; Done FREOF LD A,1 ; EOF return code @@ -1049,7 +1057,6 @@ FRERR LD A,0FFH ; All other errors are 0FFH ; DE is the address of the FCB describing the file to which to write ; Returns error codes in A and L: ; 0 OK, 1 dir full, 2 disk full, 9 invalid FCB, 10 media changed, 0FFH h/w error -; TODO Handle multiple extents F_WRITE PUSH DE ; Copy pointer to FCB ... POP IX ; ... into IX LD A,(IX+0EH) ; Obtain file reference num from FCB S2 @@ -1057,6 +1064,7 @@ F_WRITE PUSH DE ; Copy pointer to FCB ... LD (FWMLIN),A ; Store in parameter list for WRITE LD A,(IX+20H) ; Obtain sequential record number + LD B,(IX+0CH) ; Obtain extent from FCB CALL RECS2LEN ; Leaves the length in bytes in HL ;; ; DEBUG @@ -1094,9 +1102,15 @@ F_WRITE PUSH DE ; Copy pointer to FCB ... CP 0 ; See if there was some other error JP NZ,FWERR ; If so, return code 0FFH (h/w error) + LD A,(IX+20H) ; Get sequential rec num from FCB INC (IX+20H) ; Increment sequential record number + CP 129 ; Is it 129? 128 is the max + JP NZ,FWS1 ; If not, then nothing else to do + XOR A ; Set sequential rec num to zero + LD (IX+20H),A ; ... + INC (IX+0CH) ; Increment the extent - XOR A ; Zero for success +FWS1 XOR A ; Zero for success LD L,A ; Return code in L also RET ; Done FWBFCB LD A,9 ; Invalid FCB return code @@ -1243,7 +1257,7 @@ F_READRAND PUSH DE ; Copy pointer to FCB ... LD C,(IX+22H) ; ... LD H,B ; Leave it in HL LD L,C ; ... - CALL RECS2LN2 ; Leaves the length in bytes in HL + CALL RRN2LEN ; Leaves the length in bytes in HL LD (SMMLIP1),HL ; Write 16 bit length in FRMLIP1,FRMLIP2 XOR A ; Set FRMLIP3 to zero LD (SMMLIP3),A ; ... @@ -1316,17 +1330,14 @@ FSERR LD A,0FFH ; File not found ; DE contains the pointer to the FCB to update ; Sets the random access record of the FCB to the value of the last record ; read or written sequentially -F_RANDREC LD H,D ; Copy FCB pointer into HL for arithmetic - LD L,E ; ... - LD BC,20H ; Offset 20H is the sequential rec number - ADD HL,BC ; ... - LD A,(HL) ; Put sequential record number in A +; TODO: This needs to be fixed to handle multiple extents +F_RANDREC PUSH DE ; Copy pointer to FCB ... + POP IX ; ... into IX + LD A,(IX+20H) ; Put sequential record number in A DEC A ; Remember F_READ/F_WRITE increment this - INC HL ; Offset 21H is LSB of random rec number - LD (HL),A ; Write sequential rec # to random LSB - INC HL ; Offset 22H is MSB of random rec number + LD (IX+21H),A ; Write seq rec # to LSB of random rec # XOR A ; A=0 - LD (HL),A ; Set MSB of random rec number to 0 + LD (IX+22H),A ; Set MSB of random rec number to 0 RET ; Selectively reset disk drives @@ -1684,10 +1695,34 @@ LEN2RECS LD A,H ; Most significant byte of length ; Convert number of 128 byte records to length in bytes ; Length in records is passed in A +; Extent number is passed in B ; Returns the length in bytes in HL -RECS2LEN LD L,A ; A->HL +; HL = ((B*128)+A)*128 +RECS2LEN LD L,B ; Extent number in LSB of HL LD H,0 ; ... -RECS2LN2 ADD HL,HL ; Shift left seven times + ADD HL,HL ; Shift left seven times + ADD HL,HL ; ... + ADD HL,HL ; ... + ADD HL,HL ; ... + ADD HL,HL ; ... + ADD HL,HL ; ... + ADD HL,HL ; ... + LD B,0 ; Put recs in this extent in BC + LD C,A ; ... + ADD HL,BC ; Now we have total offset in records + ADD HL,HL ; Shift left seven times + ADD HL,HL ; ... + ADD HL,HL ; ... + ADD HL,HL ; ... + ADD HL,HL ; ... + ADD HL,HL ; ... + ADD HL,HL ; ... + RET + +; Convert random record number of 128 byte records to length in bytes +; Length in records is passed in HL +; Returns the length in bytes in HL +RRN2LEN ADD HL,HL ; Shift left seven times ADD HL,HL ; ... ADD HL,HL ; ... ADD HL,HL ; ... diff --git a/SOFTCARD80.BIN#041000 b/SOFTCARD80.BIN#041000 index fd237fbcac762015999a4baf22b3111c8b07a712..7be59a6199fc341d0dee3ee0ac45592f8de4ab3b 100644 GIT binary patch delta 1462 zcmZ`(e`p(Z6#piTS<*B~yJFqiF>(p&n%OaKYVk}n%AhK`b)f$^Cnopf`|UZ{5Y$Vs zCS8Asuqo?K@DG20DASsbD-@xEQ+sjJyY2=V76x)cz!s#4`p*z0SKs$88#U;`ec$){ z-sio~_q})TrY8JT6aIyGTl*WbwVPzO&UC%GxV!DolkJl-J0-KzGCQO8<&HClg$2PB z{t_G^Acn=L_=tERHzW>=V;~LjH_=hg=eF*eCstHaFXZ=@k!&TTwMJdD=CQM7I(c>v z@}bUfa*{9wigJ+dm}ROc7 zYz5cWtrD(7$XEI5D6avJv6i00Tm`#^8d&Ds7_N7v#k)G`xmZ~q@-%syaZ_iWAZ0I0 zllQK^X4mafjJ-nGw}@Rz*dra*-#Ga-(b#VZ^M#woQFBmmj?e|^j|%A?uVQZ#X2vx? zWggmQrZFB&IA`^Pf@UkQ@1QmE!5j7n)q}#0GSI#M|8$?wc(5RS{tn#-gn7rMb1jdX zpLymxbRTV}qf~y6?sno2H(T<(U|q@&xLxyVb4zGKY-U)7Ms}j`Gta|U!aUvdxTV&F zT^TfH1Shxv+K6YI@Qr=qYUhyND{{SPf$c>`EHq0M`$et~6n)4@gOd4!7_UL~PpJ2b z{WN8$@CaicOXg&&i?r5wS%jovLHbqkKWco1n%x#$60RM)9j7_+F3~4W=GT{561gBIi;T|LUWofgt z5g+~axgJ#58APe>qJvh-1t+pnat@d`rJaFjRhOu_yZHn|)gNe#b(j;Fk7N(BuJcf% zhcHz{UTjgEYgI%}Z9{0)L7d&HgU0A~?}d7u!)Eyy9$C_##oeinY~)M*2-fJVL7p3N zn6V;WU$fqoYIP79T%!Xy4nYjffJuaTv`*rX?|ye`L6L#M4FTj+I;T!lpZ1^#p~tvM zdC9znxhW7gFgFe2Cgx`3CBONTdI=v&kKKp*y@&o?np@+x9Jlt7aq9u{I!N_*e0ON}uhl;S%PbfJ*Dh|{AcUZ}_qaww)K)P|^D`h3u<{AKHo>y`K j&`)@_)%X5&y!JVb3@~f4xw#(wic)y!+REZA;dcE4A}DJ| delta 1446 zcmZuxU1%It6u!IJrn^bAn`ALflNxt+v0+z|hq1Ieq?>}$nlxz&iHcZpc7E=4tR>i1 zXG5FarHwH{9}<^7_)xHdl_D~Qyd+Q6*`hlWC$NzeDh#*}2}&vSL5d(d@!XkJ%j$)> zKi~Pzckem(p1D%+Un%%+N19qrDpnPzccwc|E$?gk<8;fY!k$prF@+s3_VTBg0r9GM zQ@khsEdC;HiNA?YNsIhG>1pX@7{8R(r2ECI{LZcm#QIe#E@t}j<#((jLp;>=H{_$sDR~`tKoWo-QZoi?73KJ0pc_T zn{h*DI!NA&(iFU-Z`xHm7iK>q?5o7i#jJZcK2J1ufiSaf5aZ^vqVp2%ke(D%U0%9g zBh0vK9y6II%=W<;&4>@aP@}w5m(Mrq7pMSqNMHCzUnb0HSKqa~V$ONyx<1wRd-{LJ zG}KX=l?-U9U@73jUO=fg}7#`2``{9 zeU>qJmPZl*sh`RNzP93^+?PKq=bV^1EC*+t7BejeZ58cF*oo2sIS2-QL{5~3<@6wh z?L;%8ol3~dE@|PPlA6y_+}T% zb~d9#bjCsDeAa0#=bS-vS?&z9m9ERw9IdzJU`eAITTmBJ5AiN!tqYK$c1(ev8iC1o z8yQamTB#HM9aW$hQTJS^#~C*BNqlTYKZv7=J?Yj}y$@@&wjj>!2-MUR-rBUz$(1S$ zdvS#p;Oih_Xa-as)Sq=22Yvl+l>#sXg&G9PWm=a`oBp;(MF<_|MwJ!wE6kmM;Tz12 z!LW?Eab?ACt`^tu^ZDrmDCsrhlJy8*vVO<2FwS-do`LrGQUCX!uOID<8ZmU|+g&QZ zyPPe7t`9y0(0AP`?<;3vrpHy@U(SYRV19Q{G%5jNw;?m2?}$bPwxdeX>3WTL6KAmBnR)aNSFbFZ>0d2x*G| diff --git a/zapple2.po b/zapple2.po index d6ab3c3899010de798c251c19b7c816ab5f5b1b3..f68e4419a89b1630f51a6bce3cc848ff0bc8c394 100644 GIT binary patch delta 3041 zcmd5;du&tJ89#Pj_uL!X2`S-~(c^e6iAh6pTS_nlnrD+PBvHadOE((Z_Yn`UgYDEw zn}@@ro78sWQE{qm?Nn{b#z*I>qce_a;E2 zP1-+`X6Zcc_c-7A9zUNi92Uc2@kB}1qA*ft(brcQ??dPVq-~BkvWf)#JC89=I5k>}#Oc+@(vSH*zujX=Z`i$46ju?z1M+dncUA0)wUPoO-yY=nCwkLLR`OQWTSxtUD<1y6FB zy6Ltr|2xrTl>6{=`pzM)@zg>5&f4hYt6YY8Y2|HSM9e^9CKAI)-0KnddBpu5@c>hV`6C(OFJF=)!C3)jH}l3jAp;2CjYF=hAffU5OEYC z>xd^CwPBD7MSO9%e%!UwU`BW-jS}lz;&Ijbl$x!MZi#e%6?3799J~PByf&t zXK32T7if>~)m4(4T;OQJm9lESTbtEk-OYqczxz~bIyGb#-&4hx)zlD4HRdM&sT7}4 zBjP#L`j+O%mc%-Dx{ggKw!v*L)I;`N)p|fAJ##W}-Z?}z`{-cQ(pFrnDk9eb~-)>kxp8mB4oGo5|M-W&JYW44UCy?M_colDBE z+{saAm6kU>IG?%aL{ioo52P{=;jQ0qc8oiEDxc#~qny#uERyvk=9ts5_n=)(9KZ`27;;QeJgzx#U=mPKe7<+{_(fgw>K` z1rS!CxE+Yrzp3%(Ay?b!12edk1qc$-Xic>icX^We>cW(qmmowiq1Z*~-=yR{#?~@+ zQCg4y=GrrJuHBOCUbU3fK(93wEQXBPbYCrTtuRP+Dr5y}G5x~~e#jtF{2{>TusoC| z2}$Pq(|p1$bEy!@wWVz1Uz0gt#JsX?T#`4HGjht7jhOIZnd?huBo67qnM}G5^k+jT zehaQ|Mv*yk(#x9uqWpm@#*cmqfSOBQvLX^DXf+($37(w{f0>X<63Bt~MBqHPMlufs%ff6s! z?uC}8Hz$T$mB!Ptr<4L)?k3^wSe+7K-~>NsEC9-W<;GN!%9GQuY*Z#0f(PJ`cq9(c z1pp_%p>T#(8q9&P5s=P-$WIxt)27&dT@)eoxMQ#9bmFq&*ayq|ieo=4*A>SB&uL@g zk971S{II?IK~$>$*dNl|Ha@=&BumtRWSKe$EB*8%ym+`e)Rlw!$Kh}T3`Ee`^X;K7 z1L}ueY6Q39kb!BJ_kV?E1>dFLqSm#~(!IwTS|D2r+ zV#$+pn=7VYG84M=%Rndwwe7%8I=L_q#x5r4g z+``<+tGS}#NS<+=S}npV`dYpq(yR;o=k#EnkV)U3;LZ0xE(b|K-qQ;fJkDM4a=MAP zclTXm|G2OA6K3I4zHYv!+6s*k z@j|x*72qQ-8M>%Gy>;q_P7E5V-Mzblo*vlf*$9}R_G?<}I~wY!b%{`Lr~C;$JHd1G zlV!rwRd*6zIiK)teoqjZGkK3zpEhQzrL&g!6yl$6_}s)scbvpu;h<1NrWZA>5b)wr zQK*O(RtSGFQ2R9Iqr6MVU4CjvFlN)90pWhSWk9H9Qz8A{fIuH;(4hthaLImF*FDZa z02~4o)mk5GY+;Q_5BoIM%5JiaF6zRtsec1-sx_ z@BHnlb5K}9Zw?BJ=)pmuhn^V}%I*69K!vW^4xK4r67c5Ly3qMQ19qW0nmfj?daxDx z+K^1TozF5v1p&l9MF{|`K?YQPeklNGq2WOxtQnx?`vr^XZs0(G?pZ7p(Z3D|j|fdI WU-Fadm`nU!{V3?KwT+Gm*Zu{i)J?Jg delta 2353 zcmaJ?e@q+q75~~8@b?aEzzs>jWp`K!g&Ia~ZIU?&ln`7<4bFfp>$VE~#Z?iMd5HEmv>Flm1Sy+Swqi4_o-1U2Ir=W%PPX5{25J6R`Xa-IEsy+ht_X2D#KjP|*T+5Q;~YM&m(jy?S4sPKsb^|nQd-vOk`gwP}$tJF;R78bAuUazJ=FEPm7hO#jMsX&*xn7 z`~eSs!)|uKr+E_L`bi2$}zQF@_iQm`Et6vaGf&M6#<^`F*Q zCtp)dvTbe%G~>>(O6+W<7*)f}xYfHa`xVb zMbn*`RMiE3nOm#!uf~-Z)UbZ%$=iM66biAG^ep4XsG4m%o9n9|_GLf%pOl~R zLP}sliL>5sN%^m3wNjC@-ZlA_BWox`_IGd7Rtyr**sp|8`ZKt^0mWao>;&6!9!?emqa5kP6#rRd+35WIC)FriRe~(0 z@jOaJ!+AOt$+u)K@>RO>#SL&-#_PQH#R3XTMf2_2D;4O6MGj8TB{MuDfE4GkA5 z3P5EBL&Li7gCeFX=R9!!`gkn>)UuE4(Zc5XB)9;8ES#T~()aMTYBK$nemj}}1lN+I z2{5J5An>%kwZb>Vc78DAU_%$ll)hy z77f{#p*ZQwzfjk-0qE5kBbilml3{b6C4nyOx%g zRoU)NE7#hsusH=`j1Mw!WPD@rkIOS-{L4omgT8XtAtu0kn9(C6ZazR_&PrTIFkQ>voX$XYo2c6hJLd{B=5ZDMD*Y$k-HZ amFA}Cr!DY+&Pee;(myDIU3~UDee=I5Duej|