From 6a279a10257127a9e394768dd71f77b65ac308e0 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sun, 20 Oct 2019 22:26:23 -0400 Subject: [PATCH] F_WRITE uses sequential record number now too --- SOFTCARD80.ASM#040000 | 103 ++++++++++++++++++++++++++++-------------- SOFTCARD80.BIN#041000 | Bin 32771 -> 32771 bytes zapple2.po | Bin 819200 -> 819200 bytes 3 files changed, 70 insertions(+), 33 deletions(-) diff --git a/SOFTCARD80.ASM#040000 b/SOFTCARD80.ASM#040000 index b352a18..8dd3792 100644 --- a/SOFTCARD80.ASM#040000 +++ b/SOFTCARD80.ASM#040000 @@ -15,9 +15,11 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; -; TODO: Populate FCBs properly so PIP etc. work!! Do this in PATH2FCB. +; TODO: F_WRITE bug - getting the offset wrong -> attempt to seek past EOF. +; TODO: Only handles files with one extent (16KB) for now. Improve 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 +; TODO: F_ATTRIB needs to work with FCB with wildcards and leave the FCB at +; DMAADDR ; TODO: Implement missing system calls: ; - Random read/write (F_READRAND,F_WRITERAND,F_WRITEZF) ; - RS232 (A_READ, A_WRITE) @@ -869,6 +871,7 @@ FOERR POP DE ; Restore the stack LD L,A ; Copy to L RET ; Done (error) +; Parameter list for ProDOS OPEN call FOMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code DEFB 0C8H ; ProDOS OPEN call DEFW FOMLIPL+OFFSET ; Pointer to parm list in 6502 addr space @@ -878,6 +881,7 @@ FOMLIP DEFW PATHBUF+OFFSET ; ProDOS PL: pointer to path in 6502 addr FOMLII DEFW 0000H ; ProDOS PL: pointer to IO buffer FOMLIN DEFB 0 ; ProDOS PL: File reference number +; Parameter list for ProDOS GET_EOF call FO2MLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code DEFB 0D1H ; ProDOS GET_EOF call DEFW FO2MLIPL+OFFSET ; Pointer to parm list in 6502 addr space @@ -933,6 +937,7 @@ FCERR LD A,0FFH ; 0FFH for error LD L,A ; Return code in L also RET +; Parameter list for ProDOS CLOSE call FCMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code DEFB 0CCH ; ProDOS CLOSE call DEFW FCMLIPL+OFFSET ; Pointer to parm list in 6502 addr space @@ -1044,6 +1049,7 @@ FDERR LD A,0FFH ; 0FFH for error LD L,A ; Return code in L also RET +; Parameter list for ProDOS DESTROY call FDMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code DEFB 0C1H ; ProDOS DESTROY call DEFW FDMLIPL+OFFSET ; Pointer to parm list in 6502 addr space @@ -1061,17 +1067,17 @@ F_READ PUSH DE ; Preserve pointer to FCB LD BC,0EH ; Offset to S2 field (reserved field) ADD HL,BC ; Compute address LD A,(HL) ; Obtain file reference num from FCB S2 - LD (FRMLIN),A ; Store in parameter list for SET_MARK - LD (FR2MLIN),A ; Store in parameter list for READ + LD (SMMLIN),A ; Store in parameter list for SET_MARK + LD (FRMLIN),A ; Store in parameter list for READ LD BC,20H-0EH ; Skip ahead to seq record num in FCB ADD HL,BC ; ... LD A,(HL) ; Obtain sequential record number CALL RECS2LEN ; Leaves the length in bytes in HL - LD (FRMLIP1),HL ; Write 16 bit length in FRMLIP1,FRMLIP2 + LD (SMMLIP1),HL ; Write 16 bit length in FRMLIP1,FRMLIP2 XOR A ; Set FRMLIP3 to zero - LD (FRMLIP3),A ; ... - LD HL,FRMLI ; Pass address of 6502 JSR instruction + LD (SMMLIP3),A ; ... + LD HL,SMMLI ; Pass address of 6502 JSR instruction CALL PRODOS ; Invoke ProDOS MLI - SET_MARK CP 4DH ; See if position was out of range JP Z,FRBFCB ; If so, return invalid FCB code (9) @@ -1083,8 +1089,8 @@ F_READ PUSH DE ; Preserve pointer to FCB LD HL,(DMAADDR) ; Read from DMA buffer address LD BC,OFFSET ; Convert to 6502 address ADD HL,BC ; ... - LD (FR2MLIDB),HL ; Store I/O buffer address in parm list - LD HL,FR2MLI ; Pass address of 6502 JSR instruction + 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 JP Z,FREOF ; If so, return EOF code (1) @@ -1116,39 +1122,57 @@ FRERR POP DE ; Fix up stack LD L,A ; Return code in L aslo RET ; Done (error) -FRMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code +; ProDOS parameter block for SET_MARK call +SMMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code DEFB 0CEH ; ProDOS SET_MARK call + DEFW SMMLIPL+OFFSET ; Pointer to parm list in 6502 addr space + DEFB 60H ; RTS in 6502 code +SMMLIPL DEFB 2 ; ProDOS PL: Two parameters +SMMLIN DEFB 0 ; ProDOS PL: File reference number +SMMLIP1 DEFB 0 ; ProDOS PL: Position (LSB) +SMMLIP2 DEFB 0 ; ProDOS PL: Position +SMMLIP3 DEFB 0 ; ProDOS PL: Position (MSB) + +; ProDOS parameter block for READ call +FRMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code + DEFB 0CAH ; ProDOS READ call DEFW FRMLIPL+OFFSET ; Pointer to parm list in 6502 addr space DEFB 60H ; RTS in 6502 code -FRMLIPL DEFB 2 ; ProDOS PL: Two parameters +FRMLIPL DEFB 4 ; ProDOS PL: Four parameters FRMLIN DEFB 0 ; ProDOS PL: File reference number -FRMLIP1 DEFB 0 ; ProDOS PL: Position (LSB) -FRMLIP2 DEFB 0 ; ProDOS PL: Position -FRMLIP3 DEFB 0 ; ProDOS PL: Position (MSB) - -FR2MLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code - DEFB 0CAH ; ProDOS READ call - DEFW FR2MLIPL+OFFSET ; Pointer to parm list in 6502 addr space - DEFB 60H ; RTS in 6502 code -FR2MLIPL DEFB 4 ; ProDOS PL: Four parameters -FR2MLIN DEFB 0 ; ProDOS PL: File reference number -FR2MLIDB DEFW 0000H ; ProDOS PL: Data buffer -FR2MLIRC DEFW 128 ; ProDOS PL: Request count (bytes to read) -FR2MLITC DEFW 0000H ; ProDOS PL: Number of bytes transferred +FRMLIDB DEFW 0000H ; ProDOS PL: Data buffer +FRMLIRC DEFW 128 ; ProDOS PL: Request count (bytes to read) +FRMLITC DEFW 0000H ; ProDOS PL: Number of bytes transferred ; Write next record ; 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: Use Sequential Record field of FCB to determine from where to begin -; writing. Increment it so next write advances to next record. -F_WRITE LD H,D ; Pointer to FCB ... +F_WRITE PUSH DE ; Preserve pointer to FCB + LD H,D ; Pointer to FCB ... LD L,E ; ... into HL LD BC,0EH ; Offset to S2 field (reserved field) ADD HL,BC ; Compute address LD A,(HL) ; Obtain file reference num from FCB S2 + LD (SMMLIN),A ; Store in parameter list for SET_MARK LD (FWMLIN),A ; Store in parameter list + LD BC,20H-0EH ; Skip ahead to seq record num in FCB + ADD HL,BC ; ... + LD A,(HL) ; Obtain sequential record number + 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 + LD (SMMLIP3),A ; ... + LD HL,SMMLI ; Pass address of 6502 JSR instruction + CALL PRODOS ; Invoke ProDOS MLI - SET_MARK + CP 4DH ; See if position was out of range + JP Z,FWBFCB ; If so, return invalid FCB code (9) + CP 43H ; See if it was a bad file ref number + JP Z,FWBFCB ; If so, return invalid FCB code (9) + CP 0 ; See if there was some other error + JP NZ,FWERR ; If so, return code 0FFH (h/w error) + LD HL,(DMAADDR) ; Write to DMA address LD BC,OFFSET ; Convert to 6502 address ADD HL,BC ; ... @@ -1162,19 +1186,31 @@ F_WRITE LD H,D ; Pointer to FCB ... JP Z,FWDF ; If so, return disk full code (2) CP 0 ; See if there was some other error JP NZ,FWERR ; If so, return code 0FFH (h/w error) + + POP DE ; Get pointer to FCB back + LD H,D ; Pointer to FCB ... + LD L,E ; ... into HL + LD BC,20H ; Advance to sequential rec number field + ADD HL,BC ; ... + INC (HL) ; Increment sequential record number + XOR A ; Zero for success LD L,A ; Return code in L also RET ; Done -FWBFCB LD A,9 ; Invalid FCB return code +FWBFCB POP DE ; Clean up the stack + LD A,9 ; Invalid FCB return code LD L,A ; Return code in L also RET ; Done (EOF) -FWDF LD A,2 ; Disk full return code +FWDF POP DE ; Clean up the stack + LD A,2 ; Disk full return code LD L,A ; Return code in L also RET ; Done (EOF) -FWERR LD A,0FFH ; All other errors are 0FFH +FWERR POP DE ; Clean up the stack + LD A,0FFH ; All other errors are 0FFH LD L,A ; Return code in L aslo RET ; Done (error) +; Parameter list for ProDOS WRITE call FWMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code DEFB 0CBH ; ProDOS WRITE call DEFW FWMLIPL+OFFSET ; Pointer to parm list in 6502 addr space @@ -1201,6 +1237,7 @@ FMERR LD A,0FFH ; 0FFH for error LD L,A ; Return code in L also RET +; Parameter list for ProDOS CREATE call FMMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code DEFB 0C0H ; ProDOS CREATE call DEFW FMMLIPL+OFFSET ; Pointer to parm list in 6502 addr space @@ -1242,6 +1279,7 @@ FRNERR LD A,0FFH ; 0FFH for error LD L,A ; Return code in L also RET +; Parameter list for ProDOS RENAME call 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 @@ -1351,6 +1389,7 @@ FSERR LD A,0FFH ; File not found LD L,A ; Return in L also RET +; Parameter list for ProDOS GET_FILE_INFO call FSMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code DEFB 0C4H ; ProDOS GET_FILE_INFO call DEFW FSMLIPL+OFFSET ; Pointer to parm list in 6502 addr space @@ -1722,8 +1761,7 @@ GIOAS4 LD HL,IOBUF4 ; Address of I/O buf 4 -> HL ; Convert length in bytes to the number of 128 byte records ; Length in bytes is passed in HL ; Length in records is returned in A -; TODO This function returns one record more than it should if length is an -; exact multiple of 128 +; Only works for files whose size in multiple of 128 bytes LEN2RECS LD A,H ; Most significant byte of length SLA A ; Shift left to make space LD B,A ; Stash in B for now @@ -1737,7 +1775,6 @@ LEN2RECS LD A,H ; Most significant byte of length SRA A ; ... SRA A ; ... OR B ; Leaves file length in records in A - INC A ; Round up RET ; Convert number of 128 byte records to length in bytes diff --git a/SOFTCARD80.BIN#041000 b/SOFTCARD80.BIN#041000 index 4bf263d4893da5dbb76f2e4bb8123dd3b4dea34c..9b5fc9745477b931d898d22bc206318bbfe86c8d 100644 GIT binary patch delta 1183 zcmZ`(U1-}@6uz>9YuT~$W0q!VNh7PYvAc#&3uB1PeHhC|V3g3p9@c_#b+1${52l?P zJFJTXd2!jw+Gz~J*u!Yq#waK(44S@ll?&@tQHRS6V^p**BrBBcsWA3Xc}H?eOJD-s zi@x)n@BG|*w6qvmT8ympM3ZU5J+2qp#lBu+btwAJ@nph~l7`f6NGZeItxWGZL{5-p z@(sB}ejr!KALN2^k34|&g0h27(qpTiDG`oS&Ch2>6Sb4>9Bo=|L^p5DWTsT=BRho~ z@-W7;TpID^b!k5q_Fz|~`5bm-y(N~pKEzvP`2ZGpBZiLfKrUNF)_|1Q2)cgj<oZ|J!af!9g#cN#2qIxtHx7QJaJ5RaQ`UlX zNtG;>>qq>8JFRCgtCsYgDtsOKz2{t1{kMVz*QtlV>Vl*^|VzW}X%K%XCTEQLEH}$ia);(-^vbj)Y!w)DzfA2-J)CV<+I)h4Wh)=Lp2z z>XZFtNr}`dtdbu@OzuJ(J#6#n0AfN-XR*Z)n0VFa@BT_|_r7Vb5qSu$NJEIF;}-+K zA@VK&b|IDrP?*=*$B@Cl=FdbNgNO%d=U{R)KS6U%ujQQ)yi(Tk%Hs1BZjPT(5;ZeM zr?{FqO^2(G=z>4uT%+-MKjEy=xK~Eqq9@kBrExIWH>p^^MhjyB?1?cHkRQ=_#g96F zb;w--`wsX&EhF|A&LWMhQ{n{pKB4d>rboihq#e~BFKqN2+5BJtRr+H{%*^}fmiaf0 zSI4yeu2g+c3rv}sXHNH z_a`mR?GNV*fC(6}I8dGj6XmDuKRZ;oC-2A!T(<1{^yda{89Bnp z1bLGjAxFt)WI_LedWmg<(U2Z`Bp%u&v>YQz7S)dS?6!j*aK z@cbrU%bjEDc@{aU;Hly6E7*_Ne{N&jHT+m1I*+u=0KHHkYfM6tNY&~?hjl?Kt;NTh zRX#Bk#}IZRan>I&v!5D{^0^_MhUCwUp3&fZ99~*YTCzY#7ZRU;6}HlWtt1)=i^hj`3)6Z+D=n3By@;#L zXuXqP+uwt@q?x>BE&@ga@t60=*{;3rF`{PBvXVhOm0S#gC8G8L(1&;qKxy3MZ-Ig{ zWZb?=q)sUL?^ekhBq!P#nz>6jqPJ@H2;EnHfyUX-JW(s6nw)pnscQ$ua8uZ%BJt)03T9TEGFuDOf1)Z4fLH=-f zZ!fVBD7?N6sBZ@f6aR~FDhF78vknMPLryt`GQs2C6npBlJHygtxjoUKI4y=GyY!lZGU8C!u+6j HaY6YH8d}tf diff --git a/zapple2.po b/zapple2.po index baed25205ac8887ac18c47b72e3f9055a50c3b77..7e36f761a31c642f01f9bd5bf8df4d80de2dde68 100644 GIT binary patch delta 2645 zcmaJ@4{Q_H8GmOx&fR;q2{8-JpTTp2NaB(ROoo_AgCL0+6zcqwQnUfFeRs|+CJxR8 zC$vpcbrtEq4NBp)o2a(ZhGjxB8dF@NX$*(0oYMoPBDAXJjcg)NRcxAurfn7W-ra?^ zLWQ%w_wIi0`+nc|zW2W8H#+JW9rc{8$}2nsdjAPJDvOH%_#4n)j(PLSknvrh4V(+) zJ)O^h7p827r)&%r6BRQR3za-7Rx0_)DI5FSs9C*o^%!G1eBwFwAgQT@FHa7$$4n!> zeVuLFJDPEDAdG8pSde9@H;m^vk%} z@2jJDBC%Cgq!$Ia`sKu>?mHBizYl~;IRPDDDXhZgCvhl^4KL(c8zOYxt8C=ROCF0)4gDy_80zXHU0g7YZvB@BtV!lNw;`a<$+bE}L#7_e zLs8122X?Whzl#|goHJ%N>^T+kBtlFf;D*)KaQVBTgl9bD`k8LGD}6MSZPXf&IuUXg z0R|Ls8l*iRLNZy0Kh1fjLVqu4xJOEe7u?n+@JIBTjj3& zvB7Do$4~)kEJ&B(C4SK;<5Ie*p8~*j?4disHS*db$xA%-yO_7s8*-OvY)~0=KL!-9 z1uQI4?z9&H#WfaItfM+mpXEOKfS)ONB6XhkmVmRK5}-KPqZ*Lry`>Z=1&W)3uA#8< z42|Hw{I(fv{B(k|bURaSGPA(hYiS@gg0Xzng1cU*p3BT<23#4rJduf4d==QGx`8e@ zMy$8E9n2VMy~V8k zsPT0mG5wm@kejC}ic=2?lw>!j-xYoDrxK!bq{7yK&ZpiI_4=WcTv$Tu=BjvePQ4?{ z&eQI7aaJp`k0^@(#mG{Xds^*f?Ws=7pi{O#D^()<(-1tJl<&rg1S4%R1k+n}2ncfhw9 zKPhF<`f7TRKHPp=bH_eX@}b<&%n3yS3k<6ai_n%SvN?YJO@u8{meC;yKM6^ z#|li-Wc>xGlFkdzk#t;wb>>Hg-_+dR(dOT6uxx-)-$f3jVI|pVe5w0_+mVGD782LPK&7O`ipt0{U%<6Ql#r9Ws6vU%S&)ZZ znSuL~&;JjaEj4s*M(+B)%xW+a4fW`0ZKwIzwWaMzBd64fmQ#|-!d05bvo5roZQr$P z=k}JJ+=*qVQUkRl=NsTUvXVi?$G?prxtfD{i>T*5%9`y|KbM2G)sGCKt$9n65rD7l z_*%4=+|I)A@qeRLB$k64O-)-#s~wh+Ar9G@HgcFlo2_j$rjAAfzrmo-@)!To$!4>b zO9g(cg?c}+h2*;yw1&KwhDi;6SYo%4Q+cS4y!Rp8puMdp4i(msh?Sc5s&IKywxCs} z}f*igFqpLfce2>t<{c<4GW9LX9 zAN3SJoN7rH4rm$ta{V5x3gb3oltrge76UB0Yj!`%sF9|f-hm7&W8sshZRic_vTw2? zqfWHU>}z|Dt zdC~YVvL?$1(Vz1se}wAUjrw&e9*ym9#S2w;v|qse(jfs$y?FmXM3(v@+GP!| f^K8VyAzA28zVj;j2a}xmG3rFLEW6+N>5cyb2P(=; delta 2208 zcmZ8ieNY?66~8+`+}=v!D^MF!vqDKQgiw5*q(xv_8!Uqd+Z3?y#BG9fwqo6HhbE6vvotCT%+I2dO)Bt#~P(`inv?EP;~U4LHLjY`#U;CZBJB zwKE{LDpva(mA+I1uC4K<^8G8$7+b`Ec+B;%&+$&c!t4XoI2Kp+MVhsam_NO>G2EZy zA)A)L1Er=v>~kIV(GZ#SBsMstZy9Xuu_`pwtk1C$U>{~c)g>h^URD-YQ>T@c43qq= zZ|+%NTyI&|mufF5uFHz4SfrY?ujm6`%4Glb9yUoYgU7t)nj8;FG-Vp0N>Zs8GqDSg zjP$df(WUIl#>8JrVq9X288DWr^jG~#iiGoaF)h`WF)ULEs?JJ| zSE-sr-T^yzedXoTyXwy*$3IPWYw`mr)1F*2*f%6vnifEXyPL@TCnNp248u%NnYju$ zt?wE*1E++(@w6kG{nzAd_9b#E?)@tNKW~ck=X*xyD2t`Sq{2R0QjdIxly;B+O{$Oq zz2B$1>UjK)507kQkS#&N8|mjfqhz#p1EafgnY9A_R!rc@P-XtHb0cQaX`T3oYpUSm>lz#}y z^Vn#=;3174g5Bf$u^F)W&F`dROxoG<4Rf$_z5(Z01|?s^#``$tk7k7AbC{=Et26DK z3t^rr5+|^8?l^9#H{i6>!elA@XeK9lK5Lw7Siem9U&a{yCfzeT6F=;1rrZmd&a6&5 zGUqU{fQkJhP%(ZR7w6jMR`IQaWlYJP$HLEjW|*(iE~C9!RmP+mjD0+y7=Sl;53q7C z;63zz7V){qm6r7tis&WOr_;`qXTF_0thnDu98*fhoz@okhlHZUjXtMKS}UOa{ZnOi zDfLIZxI%{~l||z){G2+`<2pSB^em*t6`rj&PYeZ`>7n7NNzynY8C&AjtSRk|U9PKv zH*~l`!g-F!^Fj@2%!9>Tw@B*dg=+G` zyl|0ocasJSe8LzfEwG$a-WK+gbqj1G`CkZI$xA80Pty7Dn{3U9k)Rr)DET@I>vO0_b3x=R3#(X> z?A-_tT8w16I>`Y$tT7hG&I((3YG|fNPM5$6a@7uP`6klcO8#MojoC?WYgWCh09KOi zIWRfignIY2?Q^01BN+AI!%-ZH1igc(8%t_fMoJJ5%1Bj=y9h;8B;yDU4+TRQDPeU8 z#R52t4cv$Q!H}&9WuI7>t|8>FN2ntth4B#eiGmU11`FZQ2r|?ddF3PCkW`LG48Dnn z&6xEz_mh3y9lblrrQZuLky}Y&8`+%)AJN)*xRoQmbHaV(DG2wFn-Cr%qgEIsM>fC$ zQn4<4k8}5BcmIkF{wGKKcM*KsqTSd4t#;1clhsJo@Mps7K6pKEMuZL8bw8{sBhvez zR4e@f)bnP>phdg>L)grZ8+Adw#{H^9Lz1y6D2yY~aA*Xnv;f&`(GcwfdJB6)<_ZI9 zl-4V#pg|n+M*@hFy?5(^N4-)64Mhhd!Qnw{RCSB^EnDZ#y<+#y)*jkI+3IbtYo`qb ow1F4lGJ9Xg-c|s%8$c84R-+*qMTg1hQ?Nwqnu6`{7gKBh1LE^IivR!s