From 3831017b43753aa31db19e5a513ea2846799a3e6 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sat, 19 Oct 2019 17:25:54 -0400 Subject: [PATCH] OPEN/DELETE/RENAME now call F_SFIRST to find file --- SOFTCARD80.ASM#040000 | 73 +++++++++++++++++++++++++++--------------- SOFTCARD80.BIN#041000 | Bin 32771 -> 32771 bytes zapple2.po | Bin 819200 -> 819200 bytes 3 files changed, 48 insertions(+), 25 deletions(-) diff --git a/SOFTCARD80.ASM#040000 b/SOFTCARD80.ASM#040000 index 691834a..d6c6455 100644 --- a/SOFTCARD80.ASM#040000 +++ b/SOFTCARD80.ASM#040000 @@ -16,8 +16,7 @@ ; ; TODO: Populate FCBs properly so PIP etc. work!! -; TODO: OPEN DELETE RENAME F_ATTRIB need to work with FCB with wildcards and -; leave the FCB in 0080H +; 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_RANDREC,F_WRITEZF) ; - RS232 (A_READ, A_WRITE) @@ -27,7 +26,7 @@ ; TODO: User number doesn't do anything ; TODO: Software R/O disk setting is not respected ; TODO: C_READSTR - Line editing functions -; TODO: C_WRITE - ^S,^Q, tabs etc. +; TODO: C_WRITE - handle tabs ; Other Random TODO comments in the code ; @@ -389,15 +388,15 @@ PRFNF3 LD C,B_C_WRTSTR ; ; Delete the file -; LD DE,DMSG ; Address of string -; LD C,B_C_WRTSTR ; -; CALL BDOS ; -; -; LD DE,FCB1 ; Default FCB address -; LD C,B_F_DELETE ; -; CALL BDOS ; -; -; CALL CHECKOK + LD DE,DMSG ; Address of string + LD C,B_C_WRTSTR ; + CALL BDOS ; + + LD DE,FCB1 ; Default FCB address + LD C,B_F_DELETE ; + CALL BDOS ; + + CALL CHECKOK ; Read keyboard and echo to screen C_READ, C_WRITE L2 LD C,B_C_READ ; @@ -630,7 +629,7 @@ C_READ LD HL,RDKEY ; We are going to call RDKEY RET ; Return to calling program ; Write character in E to the console -; TODO: Handle tabs, ^S and ^Q +; TODO: Handle tabs C_WRITE LD A,80H ; Set high bit OR E ; ... CP 8AH ; Check for linefeed @@ -755,13 +754,21 @@ S_BDOSVER LD B,0 ; System is 8080 CP/M ; Reset disks ; Makes A: drive the default -; TODO: Empty all disk buffers (ProDOS FLUSH) DRV_ALLRST LD A,0 ; 0 means drive A: LD (CURDRV),A ; Store in CURDRV LD BC,FILEBUF ; FILEBUF is at 0080H LD (DMAADDR),BC ; Reset DMA address + LD HL,DARMLI ; Pass address of 6502 JSR instruction + CALL PRODOS ; Invoke ProDOS MLI RET +DARMLI DEFB 20H,00H,0BFH ; JSR $BF00 in 6502 code + DEFB 0CDH ; ProDOS FLUSH call + DEFW FOMLIPL+OFFSET ; Pointer to parm list in 6502 addr space + DEFB 60H ; RTS in 6502 code +DARMLIP DEFB 1 ; ProDOS PL: One parameter +DARMLIN DEFB 0 ; ProDOS PL: File ref num (0 = all files) + ; Select disk ; Disk to select is passed in E (A: is 0, B: is 1 etc.) ; Return 00 for success, 0FFH for error in A and L @@ -778,8 +785,12 @@ DSRET LD L,A ; Return code in L too ; Open file ; DE is the address of the FCB describing the file to open ; Returns error codes in A and L: -; 0 through 3 for success, 0FFH is file not found -F_OPEN LD IX,PATHBUF ; Destination buffer +; Returns 0 for success. The FCB for the file opened is left at DMAADDR (slot 0) +; Returns 0FFH if file not found +F_OPEN CALL F_SFIRST + +; Alternative entrypoint used for opening ProDOS directory file only +_F_OPEN LD IX,PATHBUF ; Destination buffer CALL FCB2PATH ; Populate PATHLEN and PATH PUSH DE ; Preserve pointer to FCB @@ -895,7 +906,7 @@ ENTPERBLK EQU 0DH ; Number of file entries per block ; Search for first match of filename in directory ; DE is the address of the FCB describing the file to look for -; Returns error codes in A and L: 0-3 for success, 0FFH for not found +; 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 F_SFIRST PUSH DE ; Store pointer to search FCB LD A,(DE) ; Obtain drive number @@ -903,7 +914,7 @@ F_SFIRST PUSH DE ; Store pointer to search FCB LD DE,DFCB ; Use this FCB to open the directory CALL F_CLOSE ; Close the directory, if open LD DE,DFCB ; Use this FCB to open the directory - CALL F_OPEN ; Open the directory + CALL _F_OPEN ; Open the directory (avoiding recursion!) FSFL1 LD DE,DFCB ; Use this FCB to read the directory CALL RDDIRBLK ; Read first 512 byte block @@ -932,7 +943,7 @@ FSFS2 LD A,0FFH ; No match ; Search for next match of filename in directory ; DE is the address of the FCB describing the file to look for -; Returns error codes in A and L: 0-3 for success, 0FFH for not found +; 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 F_SNEXT PUSH DE ; Store pointer to search FCB LD HL,(CDBPTR) ; Pointer into current block @@ -976,7 +987,10 @@ DFCBRC DEFB 00H ; FCB RC field ; Delete file ; DE is the address of the FCB describing the file to delete ; Returns error codes in A and L: -F_DELETE LD IX,PATHBUF ; Destination buffer +F_DELETE CALL F_SFIRST ; Search for file, create FCB + CP 0FFH ; If not found ... + JP Z,FDERR ; ... Return with error + LD IX,PATHBUF ; Destination buffer CALL FCB2PATH ; Populate PATHLEN and PATH LD HL,FDMLI ; Pass address of 6502 JSR instruction CALL PRODOS ; Invoke ProDOS MLI @@ -1071,7 +1085,7 @@ FWMLITC DEFW 0000H ; ProDOS PL: Number of bytes transferred ; Create (and open) file ; DE is the address of the FCB describing the file to create ; Returns error codes in A and L: -; 0 through 3 for success, 0FFH is file could not be created +; 0 for success, 0FFH if file could not be created F_MAKE LD IX,PATHBUF ; Destination buffer CALL FCB2PATH ; Populate PATHLEN and PATH LD HL,FMMLI ; Pass address of 6502 JSR instruction @@ -1100,10 +1114,19 @@ FMMLICT DEFW 0000H ; ProDOS PL: Create time (always 0000H) ; Rename file ; DE is the address of the FCB describing the file to be renamed. The new name ; is stuffed into FCB+16 (where the allocation map usually goes) -; Returns error codes in A and L - 0 to 3 for success, 0FFH for file not found -F_RENAME LD IX,PATHBUF ; Destination buffer 1 +; Returns error codes in A and L - 0 for success, 0FFH for file not found +F_RENAME CALL F_SFIRST ; Search for file, create FCB + CP 0FFH ; If not found ... + JP Z,FRNERR ; ... Return with error + LD IX,PATHBUF ; Destination buffer 1 CALL FCB2PATH ; Populate PATHLEN and PATH for first file LD IX,PATHBUF2 ; Destination buffer 2 + LD H,D ; DE -> HL for addition + LD L,E ; ... + LD BC,16 ; Increment by 16 bytes to 2nd part of FCB + ADD HL,BC ; ... + LD D,H ; HL back to DE + LD E,L ; ... CALL FCB2PATH ; Populate PATHLEN and PATH for second file LD HL,FRNMLI ; Pass address of 6502 JSR instruction CALL PRODOS ; Invoke ProDOS MLI @@ -1443,11 +1466,11 @@ RDBS2 POP HL ; Reset DMA address as we found it ; Match FCBs ; Used by CHKDIRBLK ; DE is the address of the FCB describing the file to look for -; Compare with FCB at FILEBUF (0080H) already created by PATH2FCB +; Compare with FCB at DMAADDR already created by PATH2FCB ; Returns A=0 if entry matches, A=FFH if no match ; Trashes A,BC,DE,HL MATCHFCB INC DE ; Skip over drive byte in FCB - LD HL,(DMAADDR) ; + LD HL,(DMAADDR) ; Will write FCB using DMAADDR pointer INC HL ; Skip over drive byte in FCB LD C,0 ; Initialize character counter MFL1 LD A,(DE) ; Load byte of search pattern diff --git a/SOFTCARD80.BIN#041000 b/SOFTCARD80.BIN#041000 index 1bb817ad146ad71ccce7fbfcdb56b878d6757fee..f1f0d57a62ca786a588f20cffbe6adfc097dbb1b 100644 GIT binary patch delta 1561 zcmbVLU1%It6h1SvNq3WWveS)=&5!P6rJAkOIw+JePO4(XHd3MW2h*C_J3pIXVTq~i z*4EvXC<>wwM-;^uA4CIH3VCS+>AI^Svtb}x39z^86Z`e4r*-#Q_ZjmWIN^@n;^rt7!0_#CuK!|aQevn!;-lluAExzqb zw0ZpZHdO7d>c(IgT-bl4bEE+exp0<3ImFU<7T0NU*D7Xqn7PHtF7mJBe&FncHK0qi z_9O?xF7=3OHMtk3V$96xeGk`?5(o?kJ`i#stR;l?gs_niHjOU%$%j6RPsSNCKt3Sz zWQ`nBbj48Sm0y)brJ_`oR&_#dQ$u)8$UL6J_)y-=@*l;mQPqsVRcm8Zrr?4dy!Le* z`6VcR6PId9(;6TZKAo`MQ5Phz+I72DT8#@dp&%IOsm1wQ4uK7Y)p%K?2ziZSA&?Sj z!rx9b!-)XuQW7N1vcrX8W-$ztP5~~&-iP1}mf|rY94Gu!#HH#d;&I}J>PH@Set`k{G0Z$)EngY||;X z7#X2giG`tFub9H~ihId!#VL#DPA7C8QfY5pE~uv#MK{r`6cYYVSg&T6u%7oa>RGl8Q=Tbg3;(&!3Z9(#8R`kNU(I zR=ct{)r=h}&8YtKc1!6O)n7@$?r0@i{7&_wp)jvTi!-Wp&{0>S&ESATu@k>prRS{!` z>X|`D*6uG&X-BUVu4yHPCJ~nzUN2hxl0^fb4-Esbhlp`X|6Z+17$r zQJSDi2p-TBMO0I_7hWcQq^eSd=!7&_!X})_YLk+oJ$PCKrF5vG6@tC6gmYtesmdFc zd`@!C_kH)=<8vm{^kkZz^-@%Cb_X?;8uBoHYX@SFAtngk`kQ8ly-bLN5{=aTZVFKU z=jR6vrGTrHM)gBP_FN;!LavGm0?l6WPq%~x;u5J zq0#2*w|ej0>pmy6_Hqz8vHzCCP=I-rp~2>Vqs8WRC}WT3FZMY{Wh1#4u|FoPh%VKV z?Dd2r^OBP^S?bBTLC@7=nf)ER`)WxE2_7VPk&s5hVnQe;gi=CS%67${*!Q74EpNyo z9>bULEgV#yRmPMH$`{IvGN*j4RFq77Sy=^}iQfTxF#B=*ZpwVO8YoT4ASj{ySs4m2 zZ7!Cuj;dt|S+})nt#DHo)@2F>{E;=8`&qVz)GEr|l#AjYGCoc*$Zv@2GPjUuLPz`% zGbEHWi$o}lzWw3$$+#zGAb1??1YErv3;meu!=Tg-QaxDg$Iekbm|Mv9;0IF&PsJ%z z4hb`uox#?IOzd>s@)}Uy!Q71m^$7AuRy1hHs#aXKzR@b6J%aPkU>2f|s26km~fIQ;qhj-DSIC zzs=dB5eeA_zoj$Z?;VY|ICDZO&%UBQmU=@a$6tNiHjvFr`|6IN@o|2l8ZH!6V$Z9- zv1&`_f&d`cv3+6$^1Qd)vEP-`a^HC4imjwa?ur5Bp{6dzax+{0t#X{SM z#KpvXp+y&q-~zf>0vFW9C2(E3w5Mir=!8Up9hGRXrzH>Aamj0rTYdVtbwGd5>YF>N Kf4)1jKl(50_dc`$ diff --git a/zapple2.po b/zapple2.po index 7dc7ffafa80bd5c389b120b43302036e42c7c938..54d9d588485b6191f6e51d477db3571fef949e79 100644 GIT binary patch delta 3511 zcmcIn3v64}8NRk-=bn3GHzuV(o6zF~+9a4XH559hq)lR*1l%ShX&KMtJ`+>NH(Wb7 z86^(Ti9KLi>6!x-W5Bck6HpkVw`?#<(xE!YTZ1U8U>z%^6&fHF4YZLo&i?yIQlUwk zChf}SKK}pvpXdDN{2mzzjEn?ctaP4t2le3*s$=y9UWz(N885qo&QjL=F4h?@bIxsr zw!-@l6g_aD$Ogj>!vUiJh7*PhMxl0~h<-sKu3qQf(R*l_T)vvwyMLJ8ZO^nR{R43> zCE-X@V-okPO24GWhj3ECZ7pqBN(nVMt*G05K6f4NYz?&raipuEv$MUW5ho-`OyZPc z0B|~%>eZE)FX>oZ6gU<5TtdWgiMva}sb0eh=2AGcxuGExYIoO>2S;d$@khFDY;Wld z-y9)djL;qQya|%Hmwuh?1r>1+=lG;ncOQN065>@0sws zd2gjW%ix(q4sX1`vs@>AXOVTj#RAm-^7`nareaIe2xS-vdS6)Nd4ZRwCIfcwF~`I@ zyLZZBowS~D%40#c0)%vq(tg`9a_=Zzm0=1N!dPNiSh+}AYLY&`Wf^6{{*6PM7U3l( z++%}hm&XqGi5Yva@C^92-tm>U+eCh$tfIX6o?KL}pIfSUsa{ic%;aXh+q7yzPiz@G zP5+XRU36^!k5L;UJNBS5;$6d*u+b1gp|C&F5)G3V_n@n_Esvs?X!6)2h#|~VXa!k0 zif(mR z?KTgE(m^}#`?|+PwIZOU>nSBWrRxGShrx_vFipV)*h>IB3^Q8C2d?LRO}wdUBOkn; zH%)B>J!Hjus4R1x3ho_U9yrK*5Ar#Oaet1}-#1HO{(HR7(QCVmLgii=vQ#2Zoywh( zPJr(3@)Ni5^;EWgE_<}vD+fztgEIxJ-xyj9`PaWGKk=|7L}C5P7{~E*<8LRs?Stu8)72MJ*u|Hk%k;|k+(G=;r{ueGK8OSGM6sJ ziGe;`S&Og1Ts)5DSX@e0Y0sTNM{HN>zRe2372w+nDq9Wy`C@YRZkWw7F;EII!O+8R z5zQ$Ii`CyI%xP5WY)f@BgXFT)XoKx1q!%ceFU8?Jo_tHBhw{wi??w7}nkuR|UNP~! zNCRX1h*&Z4mRMh-laE)pC>{KzNDt;6lYckC1v>hDke^Lc*-v4Cc%bO+tk?j;HVHl} zJlOnZ$Gy_0!>5RadFc`mA=WGJ7Z4iDzp!^8QS$qmwZ1@4JelFlx%E*CwqURQDo z3IqzHd>NIS=AlgXN;={GZxS4_Zz9emz+Ui}R6lnDFxe8rGirGzzj5+qDRN-^4XLD} zsGfaw{29qCGKlr`5-6?@rBg?9UyD;G;PIq1rI+GIpd||^s6nX2+_*&BRvQ%ygbh%$ zG+;b>h34JkpITU0tk(vodk#!qDFwadJQqq-3%N<4)@+*QxrkuCEactwTZ*aV!bvy_`Dd zn8%gLxRS!PRnS8$XpBUfaZENP6Tp>~frRLebhWmHw;mpB1GD}yAF;x;$iaLZVxx18@7)$hEpbV(V zn3C{SY5mVLvcnM8Kv;8TOgAkr^~0(|;#8s6$d>Mu9}B8vbysdU&6?T}s)fjngRMoz z3xVUBni?H&9RP0jM?&HDb^`-sD`jS1C8?^S>Oj5xTgX_Jxkc z?qd6dcEfATJ_q?HVn)e|LMEUcKEymyKuVqLaj$<;HgBhoJQ=hr;;sdfXf} z@(f)-ECusJybQB6IG>xwCjZ*23~);V=AaLj4CaUM+N7Xc^mYLzR|b)zh0-vW~@1vaOu0Bp=_w7XKGFZMd98g@yAz zj8?HvkiR{S*emdjF*p>`YRvr4fCrL#l~_1zMqsSaMenqY)$Dt=u>f1Eo$qJQ+8ID& zen6HbmEbk3RIBy<)>)HY-fPz%Xai{A1JE3tJcbIGpB^5FN~7pVSAtfj;}j b<+a*TH74rZSZbs8=RWpX=Y6TMl+E=oU_X(s delta 2501 zcmbVNeQZiL-N2QeK5rUFxgX~48#8DN=mOh*rT$?6*Q(BLuJO)N#s(8WIb zgo>;lpj*hm0PQTT+q?hJ6AcYbwfpO9%Q(lOCz_l0?y4!{lz819xN#i%&fZi~ z_5l5^p~YF&@?;t3ckw<>@(UI6&!3~8${u_Lw-IBfrbI4zmA<8-Dv0(JJs8}f*5jxa z8J|M>JQ$<@QW+0u^!ZB2vz&T3odVSVbNj-wk|C|skCKzvjIS-{jF3y9h*f2LPaWE% zGG0!nV(GCR>C=#X03pqTbQ$#?85pEXf?qAGWT$7)X_i*@P%1S0-8__veX}4v1(-v6 z75LB>DqH3~C}h3*pT=*eROY;oA>$2Cw9su|@EUJ=QZoBf$*_^CmA4W))JQBR>D=MF z^jmV_wW{saV@-0TvONNg!?U7@FN3fa1kK(oc(VI zx%({siH_JuaF;wgf^nFsr)DR|6|X!YCGwvx;agg^jB9ant`3oFc~XA!GCq)b z@ngJ}lBZ77YW?cU1+N`h)yS$r)_!D-d8}g|>$t~yofO=_H5*@a4Y}rAHok|y%un)p zLW9sF3=3}w=Y$J_EKCW>=mwq-hM!Fs#s^&>X-A>cF4(7V+|=la z9uz0+DEg(8ScrV$vfgu1$bbuHU8c`m(H&v}jeg=9v;E!0AEERJ2WPKN_s+ zY^BgdzV#e$JjX}pT#6q`db0$a@AIaQJk$n+3#TR6lNo93PV{%u6o~uy&~Dz2!uEym zMCr6-n~{>4F-ZL~sg>ma>Op>}KTSfMas`u~Q|eA{hv}wLFHAkodqF(8x+`(0vN4ce znKfG|%|pqJG6<$jAq7_p%6_B?5xuWf1DgF{i>&%3mP0UYO|ycVSJFPHTc$0R<4z-a z0rq84{|`_5S~D91A&{rQ7Hf~2URK_yX(-JZTq!>KQ(vp9G4OJrbQKEQG$=gl%tO1w zrbc%-qaU8D6L>r(d|=o*Ix5)m(TFu4h4u7tC2(D^t%1NA6fT9JX`35P(?aAQg0%pY zz?3<^B@X`us|N2g8S=VY_|uHFTe#+?x+WV}|MXFR59exc=fpPO5svS2yQNMa(SC~0 zs`u76%a+e^j5^7*a~95jxYOI^Im|uIxxJm7uS*alpRbIwI2=2{|jbz_lTpj$LsI2gh+v5QgH`_NR2fd0v zV(v?Dk%*}H*G0M~!9-pYX~^o#adYT-k%q+RuxJjwF4`-UaNL}MQWUy7p^k)8V2y$v z0seddh5rVJLl0f{jJX=fe-`19_1&tMSdtbE{&d& zg1Kg$oqcDt586uUAz0SkZ0Mc0r8^VRYvR}x3;}6O>9k9r5(X5s7&Kb+v_w-y$%ceL zHMArRn9r34Ok|B-Nn_zm?y$u?mm-YYHU@*iZ5xLn&uzO7LxJ1Aej#i^N9`1Nzg-2s z+pY%RYuAK(qm}O7=qC5EXr+Ac3q1UY^4%^au^iSU*Q%L!nTx+>CRM8P$I0Y5X8W+7 zc|+#TGfs*)?lTV=#I{aJ@OwLZva%dbM?)pKcAhDeVJdF@r^xH|bAR+0G`OkarUtkemEDn!m`n3JUMGGmjEz0bU=S^K{a zD=|lzIN8mz@Q;3<=~WMZ$dr+}3U(9uc%BJr{9Z0u{v*VjU{)!mtRw3en2xub*xPEk zTf_dlz~I=`P+zmp!MXgL#ZqP2NnS9qy>vQ?30ufs!ReSrI7 TyZ!8oTG-oXpX(UzpmhHMr&V^3