From abd1b27047a1eb8753a272468b0b45846b8ff071 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Tue, 22 Oct 2019 10:46:30 -0400 Subject: [PATCH] F_WRITERAND now uses GET_EOF/SET_EOF to extend file --- SOFTCARD80.ASM#040000 | 125 +++++++++++++++++++++++++++++++++++------- SOFTCARD80.BIN#041000 | Bin 32771 -> 32771 bytes zapple2.po | Bin 819200 -> 819200 bytes 3 files changed, 105 insertions(+), 20 deletions(-) diff --git a/SOFTCARD80.ASM#040000 b/SOFTCARD80.ASM#040000 index c20062e..c64402a 100644 --- a/SOFTCARD80.ASM#040000 +++ b/SOFTCARD80.ASM#040000 @@ -17,14 +17,12 @@ ; ; TODO: F_WRITE bug turns out to be bug in ProDOS 2.5.0a7 (SET_MARK) ; 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 ; TODO: Implement missing system calls: -; - Random write (F_WRITERAND,F_WRITEZF) +; - F_ATTRIB ; - RS232 (A_READ, A_WRITE) ; - Printer (LWRITE) -; - Other (F_ATTRIB) +; TODO: F_ATTRIB needs to work with FCB with wildcards and leave the FCB at +; DMAADDR ; TODO: IOBYTE doesn't do anything ; TODO: User number doesn't do anything ; TODO: Software R/O disk setting is not respected @@ -525,6 +523,7 @@ B_DRV_ROVEC EQU 1DH ; Return bitmap of read-only drives B_DRV_DPB EQU 1FH ; Get Drive Parameter Block address B_F_USERNUM EQU 20H ; Get/set user number B_F_RDRAND EQU 21H ; Random access read record +B_F_WRTRAND EQU 22H ; Random access write record B_F_SIZE EQU 23H ; Compute file size B_F_RANDREC EQU 24H ; Update random access pointer B_DRV_RESET EQU 25H ; Selectively reset disk drives @@ -595,13 +594,13 @@ BDOSVEC DEFW C_TERMCPM ; C=00H DEFW DRV_DPB ; C=1FH DEFW F_USERNUM ; C=20H DEFW F_READRAND ; C=21H - DEFW UNIMP ; C=22H (F_WRITERAND) + DEFW F_WRITERAND ; C=22H DEFW F_SIZE ; C=23H DEFW F_RANDREC ; C=24H DEFW DRV_RESET ; C=25H DEFW UNIMP ; C=26H (*nothing* in CP/M 2.2) DEFW UNIMP ; C=27H (*nothing* in CP/M 2.2) - DEFW UNIMP ; C=28H (F_WRITEZF) + DEFW F_WRITERAND ; C=28H (F_WRITEZF) ; Unimplemented BDOS call, just ring the bell UNIMP LD HL,BELL ; We are going to call BELL @@ -825,12 +824,12 @@ _F_OPEN LD IX,PATHBUF ; Destination buffer ; ProDOS GET_EOF call ; Assumes no files > 64K on ProDOS filesystem - LD (FO2MLIN),A ; Store file ref num in param list - LD HL,FO2MLI ; Pass address of 6502 JSR instruction + LD (GEMLIN),A ; Store file ref num in param list + LD HL,GEMLI ; Pass address of 6502 JSR instruction CALL PRODOS ; Invoke ProDOS MLI (GET_EOF) ; Convert length in bytes to length in records - LD HL,(FO2MLIE2) ; Load 16 bit length + LD HL,(GEMLIE2) ; Load 16 bit length CALL LEN2RECS ; Leaves number of records in A ; Store records used @@ -1093,7 +1092,7 @@ F_WRITE PUSH DE ; Copy pointer to FCB ... LD (FWMLIDB),HL ; Store I/O buffer address in parm list LD HL,FWMLI ; Pass address of 6502 JSR instruction - CALL PRODOS ; Invoke ProDOS MLI + CALL PRODOS ; Invoke ProDOS MLI - WRITE CP 43H ; See if it is a bad reference number JP Z,FWBFCB ; If so, return invalid FCB code (9) CP 48H ; See if it was an overrun error @@ -1298,6 +1297,81 @@ FRRERR LD A,0FFH ; All other errors are 0FFH LD L,A ; Return code in L aslo RET ; Done (error) +; Random access write record +; DE contains address of FCB describing the file to write +; Return code in A and L: +; 0 success, 1 reading unwritten data, 4 reading unwritten extent, +; 6 rec number out of range, 9 invalid FCB, 10 media changed, 0FFH h/w err +F_WRITERAND PUSH DE ; Copy pointer to FCB ... + POP IX ; ... + LD A,(IX+0EH) ; Obtain file reference num from FCB S2 + LD (GEMLIN),A ; Store in parameter list for GET_EOF + LD (SEMLIN),A ; Store in parameter list for SET_EOF + LD (SMMLIN),A ; Store in parameter list for SET_MARK + LD (FWMLIN),A ; Store in parameter list for WRITE + + LD HL,GEMLI ; Pass address of 6502 JSR instruction + CALL PRODOS ; Invoke ProDOS MLI - GET_EOF + + LD H,(IX+21H) ; Load LSB of random record number + LD L,(IX+22H) ; ... + CALL RRN2LEN ; Leaves the length in bytes in HL + LD (SMMLIP1),HL ; 16 bit len in SMMLIP1,2 for SET_MARK + XOR A ; Set SMMLIP3 to zero + LD (SMMLIP3),A ; ... + + LD HL,(GEMLIE1) ; Load current EOF into HL + LD BC,(SMMLIP1) ; Load requested offset into BC + AND A ; Clear carry + SBC HL,BC ; Subtract requested byte offset from EOF + JP NC,FWRS1 ; If >=0 no need to SET_EOF + + LD (SEMLIE1),BC ; Requested offset for SET_EOF + LD HL,SEMLI ; Pass address of 6502 JSR instruction + CALL PRODOS ; Invoke ProDOS MLI - SET_EOF + +FWRS1 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,FWRBFCB ; If so, return invalid FCB code (9) + CP 43H ; See if it was a bad file ref number + JP Z,FWRBFCB ; If so, return invalid FCB code (9) + CP 0 ; See if there was some other error + JP NZ,FWRERR ; If so, return code 0FFH (h/w error) + + LD HL,(DMAADDR) ; Get DMA buffer address + LD BC,OFFSET ; Convert to 6502 address + ADD HL,BC ; ... + LD (FWMLIDB),HL ; Store I/O buffer address in parm list + LD HL,FWMLI ; Pass address of 6502 JSR instruction + CALL PRODOS ; Invoke ProDOS MLI - WRITE + CP 43H ; See if it was a bad file ref number + JP Z,FWRBFCB ; If so, return invalid FCB code (9) + CP 48H ; See if it was a bad file ref number + JP Z,FWRDF ; If so, return invalid FCB code (9) + CP 0 ; See if there was some other error + JP NZ,FWRERR ; If so, return code 0FFH (h/w error) + + LD H,(IX+21H) ; Load LSB of random record number + LD L,(IX+22H) ; ... + CALL RECS2EXRC ; Puts extent in B, recs in A + LD A,(IX+20H),A ; Update sequential record number + LD B,(IX+0CH),B ; Update sequential extent number + + XOR A ; Zero for success + LD L,A ; Return code in L also + RET ; Done +FWRBFCB LD A,9 ; Invalid FCB return code + LD L,A ; Return code in L also + RET ; Done (Disk Full) +FWRDF LD A,2 ; Disk fill return code + LD L,A ; Return code in L also + RET ; Done (Bad FCB) +FWRERR LD A,0FFH ; All other errors are 0FFH + LD L,A ; Return code in L aslo + RET ; Done (error) + + ; Compute file size ; DE contains address of FCB describing the file ; Error codes are returned in A and L (0 for success, 0FFH if file not found) @@ -1880,16 +1954,27 @@ SMMLIP1 DEFB 0 ; ProDOS PL: Position (LSB) SMMLIP2 DEFB 0 ; ProDOS PL: Position SMMLIP3 DEFB 0 ; ProDOS PL: Position (MSB) +; Parameter list for ProDOS SET_EOF call +SEMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code + DEFB 0D0H ; ProDOS SET_EOF call + DEFW SEMLIPL+OFFSET ; Pointer to parm list in 6502 addr space + DEFB 60H ; RTS in 6502 code +SEMLIPL DEFB 2 ; ProDOS PL: Two parameters +SEMLIN DEFB 0 ; ProDOS PL: File reference number +SEMLIE1 DEFB 0 ; ProDOS PL: EOF position (LS-byte) +SEMLIE2 DEFB 0 ; ProDOS PL: EOF position +SEMLIE3 DEFB 0 ; ProDOS PL: EOF position (MS-byte) + ; 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 - DEFB 60H ; RTS in 6502 code -FO2MLIPL DEFB 2 ; ProDOS PL: Two parameters -FO2MLIN DEFB 0 ; ProDOS PL: File reference number -FO2MLIE1 DEFB 0 ; ProDOS PL: EOF position (LS-byte) -FO2MLIE2 DEFB 0 ; ProDOS PL: EOF position -FO2MLIE3 DEFB 0 ; ProDOS PL: EOF position (MS-byte) +GEMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code + DEFB 0D1H ; ProDOS GET_EOF call + DEFW GEMLIPL+OFFSET ; Pointer to parm list in 6502 addr space + DEFB 60H ; RTS in 6502 code +GEMLIPL DEFB 2 ; ProDOS PL: Two parameters +GEMLIN DEFB 0 ; ProDOS PL: File reference number +GEMLIE1 DEFB 0 ; ProDOS PL: EOF position (LS-byte) +GEMLIE2 DEFB 0 ; ProDOS PL: EOF position +GEMLIE3 DEFB 0 ; ProDOS PL: EOF position (MS-byte) ; FCB used for opening ProDOS directory corresponding to drive DFCB ; File control block for directory diff --git a/SOFTCARD80.BIN#041000 b/SOFTCARD80.BIN#041000 index 3441fc9c4d953c80cb1f229d0371e28cbcb5ac9c..5aedf9f73f6257aceb50d01fe8b11e1a4ebec121 100644 GIT binary patch delta 1396 zcmZ`(eP|nH7=JGbX_9v7+F(~}U2}<0iTJ^7WqNk$$I7Z()(ZNEn2G5nckkOwTla_N z;+CXt&QX{+xc`TOFouo{hA<&x^CG%Cy0<5_Mj%Z+EbiL5f1nh)N}VDUZi zL-B0tZ0c4&^8VaVsWNX=#agRgHfFK4u3K~5AY#yVe}p6K!vGR3q*`3ak&N!aJx zu6Th@5+@Wd08M#R*il+0J`y)+ImQ-sSC+Lc86 z60}(xVPfx+=D`JWzBzgGKC!v)Ey5n9&Dv;LQhX6YCh3Jri}!lgu3B^~&*-l>=Ksiu zX5(@)qUCo}-{5LljO`@K&zT|SoDvX6n3^&!?ktT+MJud#NWQ!k(7lq+%%QHR8Lj>z z`oN&}NYQGC6n~7W&8Qbq@QCD-Ew{eg0edL=0pPcCNV@~s22uHFbQHJ~5}cyJuzl=Q zpOfws8{MZ#*@Dv@p7My_rjORPt2_z`%<@^*NGLOeGIHH6W*4m3)itzvz=wfl8iYY#`m( z@EecIDYtC^lzw1TPINuFw*VK%Bv6puvGc2{Lg;%9r^N4xUl1I DapX%q delta 1242 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 delta 2289 zcmaJ?eQ*;+6yHlixV>xAmMTIm=F-#&EzoI?5hZHX+NM-X+bLxjKWdZEyK4Xw4UrJF zY3c{g_yyV-mccKe73D+2P=`}0BB>uFdN^fT@hd_{35q)M7cy#7ckdd7&fsR=?%Vf% zzxVd-y}LxCd^F1Mn>%er5BOsOEVt)g3BV6PReBxM3Qbu{9#IC|)9#v1QS$jCOda*O z&is_lOkvSs(PJ@SnTExPWxA|0(-9wHw(6ssyXYvYurtvE5&A1#Rg2r#;lG~?2<{Hf z?^_e*ITrps=9m1;-K*RnRZaNw z-|)(Xh)!QXOJAS|4s3!WRvGSx{WQ8`5SsG&CEO(`OVN>o@Sy6GpBsedpgg>V)|+Qn zPWWTI9`FXhM*+Xx%kS{=eO|ubi;6~|*SyK~WyjwgdBP?a`Jvtsc){?Qq*&0#QE2J5 zcokk49UqG+ABdTWWX8=G0Se^7;_Z?ZVU&;o@r>KiCyj^9{7;hg6tR_^m6Y@1cqlhE z9^xEDz`D(A1Wgd5LNR{=SC;Usrpy3FG9Y=qhfhk@_+%)D$B~q@R1OcOp#@*UtGa)c z@_&^Sorlc3++_ZXTH?!G$J0DXUt$wNq-;%1nB+vyZ06QV}!%oy6~zQV}lY%uy<( z;*=EQPfFGiwUDLB>sMxOCliR@xUy`fc4co#)_&|p`6u8Fi!puh^7MW}#}kO}{g?i} zWE~*%$4rh7zS%qgTiftsvj(tRK6e7<=}_0l@bLrRz%JID za2P;3H}TuDnIK`cAafcnr1DU88del)C5hIQuUIL%q$Kog8qRV~79eCAlF5#2eaAae z8lz;g9P)@MEKs{Ha*zl<2zg=`I?A4t&?9G{g)*U+&cN%a8Z>+cUenz#L^51*oj`{( zO!6UtPK7{@EoB>O6KL#+M+Mu^I-#nZm{T?*AmDz1UZ2q?`!ukDpr6M4@eoM-f^Xam zVh`GG!rXlV-r3BYx@F^sgLrsD)znjaxq3a7Z;h%#U1;MczRUXB@B<@rBNIv?fpCsl87a6U*qmpd?HQR z)pr0JZo;ntjUn%muFsg_n>8o^pw6+~`)=}k(Xj(BKZ=e%yqpys{dhS?KvsZ)Kg0U& z`BF(uSGqf)m?Yc-iAR+>=~3lQsSB@NvkVqI&Y!b?vhCQdGYS$MIQ-$gA=h+EcnD{p zumEg2;t#nfOBieMaLA>zgk41c=*f_av4jam1rkMtAAL3C(yI=PN>=R&xeVA5)tsLl zykz@%0*59!l;e}iv2Sq-j3vh5Ga-4yS@`gk=+qYa6?Eiz_G+}{H0*qbdD^IVHu30L zBjZq&qekXUqR4^i3~k(LW?n@Po0tvg&?+`Z&e_ZO3e<0>PS(enacXk`+m60I%-GR} z0(J*l^#QXG-TW7`RrY_(u=LJj%zV^-4O@&}R+u)V=vi8Ze=^?{$sZQ8x8@%3ux;#4 zo~@AE?q~b*Q15=mF591A7qOco?6pP!^nkSwP`a-v*$`#_*2`@h+1KWvlW()85`4m? z4fWa|M@_A>nrM8*lKB-xs-5`z&v7V!8#}ArMAYoaLMv)2RY=x;Bi9`8*EB8T>S|lt zYnz