From 5c26012b7f4fe1ed5689e984afbb0d1968c000c4 Mon Sep 17 00:00:00 2001 From: burniouf Date: Sat, 10 Jun 2023 12:16:06 +0200 Subject: [PATCH] ProDOS.FX:Modified SELECTOR....more to come --- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes ProDOS.FX/ProDOS.S.SEL1.txt | 585 +++++++++++++++++++----------------- ProDOS.FX/ProDOS.S.SEL2.txt | 3 + ProDOS.FX/ProDOS.S.txt | 24 -- 4 files changed, 311 insertions(+), 301 deletions(-) diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 58b8cc662d47f9cdb1296e4492daf79dfa420f7c..445f4361be1990f864f42aad89a8e23400252553 100644 GIT binary patch delta 17749 zcmaib30zcF8~3>=I0(qT&Rn=KBRj*)un6v~YO*C%wmZNe*_{-HTs}2D0tmO z|L^dF1wWP%aLi9)>tX_xF$awSWBnLgH)X`{X8eB9XpEusm4OQ02^hsEw~mo$%U3o~R$k1Ttuc==n! z65t1n+VxiP=o5`&nY*c@t;6WBH}f|(j*eATU4Cri=v~J)`oHjI^eMk1*-Q6r*`%-+ z?q@#mBe|4?p=Sl#PawJE&0 zb&Is>RK%))$c?8Xw&+%|$Sql`q{xkakxFC4_UgMwJ*(H<+a_FWuL1*l+)${T=Ozx;2k(4byFI{pPrCp!MMGEJ@iOu_^Q^rn||$ zBJ5;F=vsU4O;!3Z$a(cd#P(m5;y;wRe{P9YF8*UnRKH;pQ{p1F3@YFMbvJv~<99qj zxisRN!@o4oZ+2~NJ>Kw1^cugrqqg|Wl6;LAHPB3fzyZg(8Fg?{*@mhwjbU4 za|Akji-K-`4L#fup%KkW-@ez|uA9-4DyBU3V#M(P3x26{O_~O+@wd_Tl+0rMyC{x6qt4@9b?0RWW?4U-bZ-s^`Kf5E)_YC+sQBp-aX z*Y7~?;gg?8hezRY|AKiKsD;^H>C4Yg zJpA@^&+mTWo3A&$`{S{PUwZ3>-Oqpe`FAW-d*r>iacoqtAB&SD$#0&=PwMp>y=%vj z*jmXi_xR?cvES^fX_|hk#5cYW*S!4H3voa^kN{`_9UudVyH353G`%Jwgw@5WMxyuB z=i4tiU<}ppx(Maygp-+S>XWBF*UTbA5g3*uER3<i@bzcJG)#RHySI>U1~6y zO=dRfQhw?C+KJL-{Fe8%DbnTq>G!pXe#!HA;0IbovhvIiklM(rKhP%mnVb0`MKMV> zeo9d?rTIJ~S;>%E`QDGT*-{(tO;(bVu3&AB#?BT|gE`-1>TAn&c#zU!b251WFZo!j z^~XhY~^O?pWG>z_H9aeWM-dl@IkD+{m$;7ma*jyM}W0~F2 zw4mI%c)2$#-@>#`*5S0Zv~}T)l|#u{W=jFnxP-`XH>)fwHCC6*RYexD2z@7|xJ32k zMW`Wcv07$U`8tweVumIBXo{kjy7;LSMJIK0tzOX;U8xo-pEakV=DccZsi%-dUZp11 zH(Xd(K>|G!Sm@PiQssJjEMmHAxI?dKrEB?0y^>JXBQlNUrB$=5Ys*(rq46g3z5ukd z*PAzMWS)877!!-~s97atWfk@HYSqOodMW=&uS7*JQ?p9XtDIG?YG5`qxsN9p6y1b= zHH*aEMD>{S`z)TuZnw?Fv;%4uX(6%-hqIRRg$5;|XN6j#qP9})6pOhp&-dXky81#Ed=Gxs&hZ$` zn0oiJi|Xp!PV;JGX}!n7!tN8#7VmS^W<1YoFYRnWq3cDN===Hhf8|8!w;-#%tljM` z8u6f7wA$)ga03-IvzUkYkEu%Zvkj_M zlrzmELhJPH{JAf*G5mOz5*%P}cCzFhJScRM68k6{bh)jbi|T4S-9ou6)b|*_Gfj!k ze%zPoQ=G*;!3OQkR!?2Y?CJ_*gSF9a%Q9zovFM%rlQbo2)GoG?zY!W3!?%Y{(gcS* zNqtr8sj8h(%S*o0#;f(G*&Xv8EO0mSDreO&&C^1~&}Y~PsZ9GUUzn~W#O?8>&ZxV= zSYG0pQD;Oc7QdI@nXbeY?DOW5VY#02RSTn*c+Q(OYtFeVDF=VWtIzXecvbg;H-An^ z^<4E;`k|K4zQ~mfOsSXnB>d6s_ZDm@tD3DAq#vT-%X|?Pe1+eDKdlG61!3vUYC-xT z3LYHJviPzrYF6Z{Y*tnI9Qv&`P;X-4hp5}2F{M{k)Uc4(kWe?%V<01!@%r#ka#N-f zFySzAE9zMIn@sf1YI+%RLf;Z{kV;aDwIY+&6%1w}y{{E1hkZH~(O!I+|6Zw&__9NT%u~!i70;;4>e3B|4DeKcA zN#UcdEbFrokBuzr^AV3tEbEIAkIgLW%b~|8>8qjN;gegK=4+u)#J9{l1%?{-AE6H= ztLl8`Rj0DDxRj+I8xj*dwavMRX}%IBuBNY0{l@5 zQ!sLjM2mwb-#a}jNL?oCD}mybvEr3HxB5zu_mvQ7?%8#Y6LqTTs(?@-Aj~VEOBE3A z6%Z+voh=|r2vE~i0nw@ezAi`6mo}+y$9mt6mwc;qsN=Ai(9~Dc>Fse^B+&9R(}d5^ z2`x%pHaiTh?3I&5a?~X~Bu5#NV-eFL`3yNJLe7PdgZ)u2gz>~$8$-&Ck5-L zx+0~op=1V&NfiPOmOt=+oNhRtR*AD5_TL&lF~jkDV8I~&W}oGbaIiAr2(anMjX z)UcZOCMuZ`{=tx+9l}toqTP-6SMnd<(5MrdIKt8a2T>~>Y#)%?z*T4nPF#jmH$)nT`GGfkw} zTI49E4koFOO->bOFvFPknHMl6T4V~%oZaM>E;X3TkXvB3G%{U`$Zx^R?(PnoYd{nr zBdUuX7EJx3=6MV?G(b!fCu)y~7lrB@O6D|N-(+uQ2?=blvCZw7GpDw?v}U$tnbT%% z_TYhq>EH~x+*f*Bjuy9VG0T?m%-5_}(qbbL)hw$w3)^&R5@o)+UP&33EVgC6p~S>; zQuv?im2AntO<(KMLV{8$uZuQ>_~6%CH5W@8*EzGLAmg< zS(F(qwk;BCYKF~?8OZ!CkfX_CgP3V7C?5r!R*w-&sz6j*lvpS_uEy3yFRY+e3{Tx< z{K{LDgy0EyuiZxPB^UEew7L^jyg-o^YULHyXsq$X96J%t~+Mai6^nJT0wP7}g~ zGOJzgk+NCA^bx&M+g{byZmY{OFXhHTC8?l<4PN1LdaA2tvB*+kWc7Hct*M$-Q^BIk zM3UN}-d9;lIlp#LQ6lmxN$!=Np*7RTw+<>P(hPohP#G`HaY~y@@4O^SJMIaz+gsbX&WY(|q$_InH;tdfM7OT^Nu$(WKfAo4RWF1>fru zLqpE>j&@pZ8dK)*72oTUdg?{&-oEukzn)okGY@hgJ+Jd#Z%L{aEh7f zTSPCZHO|2jr77TYJDfJ^a9Xp>G=D@9-|9grS_dwhdm$E+r^D)8=&{4zx{S=f6_YZ$ zO?0s;cajinVX;>TJ#y7#pEY993r5r+%H}bDJH!|k@;yK5QlgFRe=CuXGv$xE_}FO2 zh?>O91uS(DpL@Gv=!tdGz_`S~;85h8|PM?eJV_b2`uy^D)CTUFwogW}mYQwlYuqLkN`FAK8mXnz|M zBb~|Bws~g-85^9*#aPgU@NGgYb{QLVz(kEqq{C7lTH!No)Q#2Dk1TrNZ(_|Xeub|) z(Yxk;rw#ge?5;)@cO4eBvr+W&aD!O#^*nf!q9m{M&QSyQm8mztw4&oh4~uu+oEv^(6{7^8M~TYD$^J@H0f_p?rx*6{6{l(fllH<6w6uFDZsCahyd z%i4d+NxPXD^VT-ox|eg)30-2!2Iv916vR>K!ZwdFpJfeV3utcgs#ay=+cqV}gjt)K zj4c0FpK8nb`*$fBLAke4g3DvH^z*|fbcO)sc4o|9%ctF~B;@AYF=9RpDQ8(~hcTka zhsV+48%raLzLWRftwbRJsrqeXi|Z>Is!Qg~W-)h-FvdPPECy%zzs-CWd+!JXLyHBD zinE&;?h^w!v_b~{{%ZF9=u57@M@h>}e?Sb?8S7;!IS(H49&&}nHZuJd?zl%u?n!tM zy7;Egh&gCx(GUN_Bn;Y$;(3Mfd`{xbGbb5OE6fEQwN=CvuR;0;~~H4v^g0&|DlapaF0FnF`tLpYGmoV*dRaj zo6c~q2B84jm1CY7(Oh4bvWTZ?xVzL>n^f;r^Q`a-Chi?E5lFJ?g2DFiOHS&NWApZn z7&DA-Wer@;xl8%#lR8~$@bjc*w?}U-V7V_cW8vQoS$6kQ{`yH>bX@LBqMmeG-Lw-z zP6p*p->k$%?I&frSwT|3s9)(7F4XI-M@eGuZsj zjt-j>6TSsAD&#XNukI=)7WswG3<@vfa(ItHUy6xgw6F-A*vY|C`>hPsG0it(_5^*4 zLc-gN`wnJ`lP`6~k%i?PqoyEr_+YS%Pu!v;1mO4%4fsV{ltk$V-n~W92AgnjZ|ZGvAoEyxn1BIXJ4TYFkVLeD$BY{43{4o;O zKBSlp8jU!076wY4a95m;C2NNUz+3ZD-g{b?5FayEQaj|#PR|IEc1LBGj~X8;@sNiVy&n$pADq%9r;m^D79TNKxCMZ9Z*jqrw9z4yHBCZO6_S5ihCJfb5GfKbZ-< zc&m~gAETpwJ6nJvQ+pEq5~Z8#3Xl!;(oWa5!nfo zB!0?Ij*FV&d$G8*-{xvU)`Y3Nce_$BC2{(QrdAF+^=0KABR2LD=C3D{f98OvSJE`_8sgzir2FjcDr$yT(RxItjSWWJ5iw<^ zcM+MF^G5>Y=$`muK>cH5G(9B3np zIak7&Rqac!9`zU2v#>cr53}!76W{QE)8o96dc<77?|fW|o;6oG>!fy}NEqtdIyUa2 zkuPRlGNRL{^Xsw-mM(NG=AXW&i|k3dlop1!OU22;ytD;&-wDSF=KgZ=vL3N2rl0q> zvUy9XoX6_+sKG3j+2}O{6fqa#3YIRhx;$`rEv4CTWtVsim6euKmfB3s<_|ofB;zLY z;1jslYvEr%q2#5_A8w&{yKEiNMDKQ)(#EIm#H&~Ec{>%Y-*`LUA0Qi~h5Wk!S&44< zXIiETQxj{KDNzYFPGlLULRC;uib- zzIwiTw<0%Ok4>x9%2HNRCY&|3fjHaD!pS8^een7r88`SQ{BTz!Lf2qfiH)01wqZAk+@{tdQxip_)?&Tt*ZHbIC)d-R*fOu( zMcA#w+JwC#YyHR~Lmp?7)!w8=P&~NZwz}IK?Kp)7ZSc0q#Kzttsi&%LmOUtX;cQP+ zH3t;aX==4Pt%$)=OKu%e8F@l|vH+|QL z5gTzJ>3tNRTs*~V{N=(4>R~SOH_|bdy2s_Du1ZjV$+B(R*i46MnnD z92dAp>?>(|`5u3Hd{pMXzfS{R_m~nBl=hr=^s#-#2FSAX0xt-VGkYRlQdj+OAd>m- zrw!|62*R0u>;cJG%+-!OC^}O2FVT^{?apZIr%_Y`ZetHoE67(1eNAXh$rKWP-D@l; z_84>+stD&jq~}diSUnDyS`@PRh~8*E6z0Y9@+FncYxQI&s5N(uSq(gB=>amVjj z=;(w)PN6a7XZ}g3oFtvt5GL!SU$}XXl34JoC{LFjzX|1%PYSuJ+_b^!LTj# zUQfmRkH7JmE;5xR|1R#YgsF!IUfS6r;w6|v^x2W_4}9FQHC&D}YW@_$Q~nad#hxy% zyUk}vmrsdzVzH7mr^Q=(=BL)-jmfW21J{=RkxFGqeuF$`uaes1=cmS!#QC&O?R>8~ zno)l04PEMJA#T_@^s5rjR3yfKSWq8*6GeVI(*y_^$zy~J)sWq&zMikPqsP}x8jUC! z5(qhnYc+UkYnVJ%yoSrk8|b5zOtDX@7ffti&``sSo*7N3o*T!Hmt{&;`|RoyDwcIIn*8M71DB1 z#mL?bk2|LU-q%q7&b1Fq9hih zXr?KOC&tUUfzcuesf*#+203oD5qEOD_ho#j6~|Y{%NbHUe==S+>9i~pJ2SbQ9Ub;I zu|qR|+_tglG9R5FPfNu08jHh?ny0qiW24BQhl2RFt~U2XmZorP0#16#d_@Ah#T33Z zLDmQ8@kWJ#zndVJ2aLz>qExPE85k#RSZB0Hzvx7QYo)alw+0he;9ya|39sg_a&l(XYhv-(YTrXHF}!G zf1#&ycwCa4CC%pLNpg-De;kfvsCFSU7 z7m6j!5wRV#E5ED{E-KwWc^nH68n5TmU&E=sf!8T=oOB*n*0U1KQ zn9GOMD=g?kvQTZFP|eCalA&4?zb;vx*khv_3JY$e%?>3OTkR~&dt2pf79osqTulvU zW6O%b-4h+zyanj$qK(8%Fb^q;?WLK8;37&jMTW8x7LMyDdY~Lqlf~fbsgaka$Pq~k zMSN=hB6WJRakz(~aHlGg#X7j>uoBbIF(j;vg)b5hYKL_|n7D#!qF0Ja`_yDKnuWQ} zl8h@UpX3TQp_6}@A{R=Fd6XWLWC@?7m-FzAr$dkB-pvQ~vLW=!p%+R@S@Ko zCh2>xH46a zkI>+B=3d_5){` z1kIg7#iUI{Y# z16G?tP-K$$U3xi+EYhPGG@OyE3h`xgUpKyP)j!6s%#>3i={Dkw48s%rkxW@H?c|>x z!IutCZpcCxJ;kTLrzDl_CXH+K&Z{?G3*;{>Qj4V zp=FaT%ljBxHH9Z@@4+%Q5+3kp%INs zI3V6`>~y;w?dHC;Icj(=jm012rX1wsMuF-T`If%43Rjc0!8qnyQiKUCrao9s3#T9tW}=j38F zzRzoCE3_#meZV~*Vo80(H+`s71$>ODbIvFHi(Jf>Pr1>AHSjsV#3ZLhd?A#>9D}1HSt>%W>Xsmd$}biG@A;XTH~rX?uc?wO}v*g`aQ1`u>&Q zY=O$Z@sBNXiS$37oF^BLLr`A?KJ&|%`48TjhxPC$AIy`pqW%(Du5Op=QDo&Y<0*b5 zPtKv(KD{)Qlg|p6#1r!6JUGn$tPpxp)>0I* z75R3=H$w37oo{NhoKXHo0eU}-pDMuFF`VlP<@EFj_3eQwZ=eGnqbD7A%~Vr!20pqH z!r`FV3!#2A-&iQ82F4&2Qz$={|Emz@I*y;FR0Q5B_>+{tjT7K2XnFMntTi3KdIC0l znLjWA4Nv6O@093K%#g&7e~GX86&_H8wV%v0iy%IQUsQxQ^}M@C9*=LH?kqx2jOQ;G z;f#{Xzb=wfi_^pri|)?D(&-e2C=(eTeEk%bAx>pj4EdL0>I7%{%34@P7OyOp)5Eie zikPTKdJgX?Mjb|ef3a+wmMad-VJ1nv`4)nUSTKU@wAoUn<1FF~4#S3hKR8dEybY+{ zoX?{s$|k=8iCf3ZTJHD;ep4a8W+FO!0>5n{cDW+{$v1F!ih0<#N{%#rDsN~O1#y&NJzcU#^X7aI9pxG>*K1EImJV%UO z?ra(#BmA;8-znwr%U+%$PmiiW^KDH76sjVtnqg#0E!R%Ppq$GmO_g&J=7@81RiP!% z+=qGE?rB!1Rpnd zNR+vhWn9Q(reQO^h)aPcW}L{;HgP&gvGLsLn5ZrM-05gwD_=BS)&{nT zg{r@T-#i^o>;nGebWCkK|9ZNd@4t|u3%umG5*^qs${8GdYKg2*>KIZnAO4bfnBUSS zHe$V#_m)7Ii|_bRiH=54nVgZ}PTx?@W%-Nwp%SdGC0r`S>geL;QaLuTTNI4DlAnvm zpsNszRD(N-*Kp5q_`N;+rc(4$FMp&IWAEXIOEJlost5E@EMXZB`w8wvAJ>&(rS%ZOAc79d;VZ*mZf~-A^epRo z{^?KH09W!;Wpb(xFGqEWETq3Un$SHI z6!y5=;5yZ8;y+a2q;(gcTq#$@+#`{z<-$K65uIniG)}#j-%%-#KmR^op2e4!&$NiQ zif@CR4tz@Qsh~@LL=6ooEaH9%&N#MuH5`=Em%<_+P$e|F+aW>3d}<%$@iXKaIB2ai zUY0%<@xkO5=@SwJ?B0~mo^zyz293y=ro0|h`KFaan6ih+r{j%7}Y z(r%tHN!naFNg9|rX<+8$ftgbVW=IUFYskyG4>I&=X3bAw+(B@fNC{%7jpvMVR{BIY2$o0GtP$4_pAu1ug_G0xkwF0WJkD11<;V z0al<9Xabr68_)vG2U>wP;0j;?U;BMd^;9lT9U^8$(@Bpv{co299co^6UYy%zvwgWqWM}fzH z$AKq+oxm>ON#H49H}Ev@4Dc+l2iObj1D*q(2VMYP1YQF611|%w00)4Bz`uZ3fkVJ+ z!0W(a;0@qS;4R>7;2q#y;NQRz;630d@ILSX@FDOK@G>_zCzg@H21%_yzbC_zgG-{15mY_yhP8_zO4%oL-sXmTm-y z{D?*ojVAIZ3LqLoq#+6<8cP&J6igICG>#~gD2ynaD1s=GD2gbWD26DOD2^zeD1k^z zq$84vut8?HlZX_eWTF%zJ&}QEJW(o98c{k?22myvViXzfY@!?@BT+7qiO5W3A<84l zCn_K+B$_}}L{v;Pk!TXpWTGiVQ;DV#O(!ZLDkUl-DkrKSswA30G?Qo+(K$r3iK>XI ziE4;yiRy^XC7MH2Pt-tk9?|(k7ZA-Qx{&B1qKkL6M~`yERYX@4T|;y& zQ4disk%wq0(K4bwqJE+QqUA&@h^`~Lo@gb}4MeMmRukPww1(&=qP0Zph}IL`OtgWB z6Wu~INOUXFZA2T1ZYR2f=uV_^@y+rpBZ6>;(=mDZFL=O@@MD#GxR-$c0 zj}UDq+ClUv(PKo96Fot+lV}&wlSEGu?IwDf=ozACiS`ifCE7>y9MSVcFA%**^b*m2 zqL+zYAv!>Gkmz4TuM!<1dX4CHqQgXQ5WPwC7SY>8?-0F9^lzdgMDGzDC3>Ie1ELR! zJ|g;<=o6w(i9RFxoahUpFNwY)`kLq)qHl@*L-ZZdF{1B@ejxgh=s3|&ME@oFndk)3 hFGRl*{YG?>=zm1N6a7K-C(&O-r=-2Ge$v0M`#&Gv5^Mkf delta 14708 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 U=^WFaOy`*{NPFP@q)%`EKYYeDS^xk5 diff --git a/ProDOS.FX/ProDOS.S.SEL1.txt b/ProDOS.FX/ProDOS.S.SEL1.txt index 9b89992f..9dad2fe7 100644 --- a/ProDOS.FX/ProDOS.S.SEL1.txt +++ b/ProDOS.FX/ProDOS.S.SEL1.txt @@ -1,16 +1,34 @@ NEW AUTO 3,1 *-------------------------------------- -* object code = sel_1 -* Bird's Better Bye at org = dispadr +VolListPtr .EQ $65 +* +SelectedIndex .EQ $67 name counter +filecount .EQ $68 # of displayable files in directory +FilenameLen .EQ $69 length of filename + +bInSubDir .EQ $6B directory level +FilenamePtr .EQ $6C filename storage pointer (16 bit) +* +DirEntLen .EQ $6E directory entry length +DirEntPerBlk .EQ $6F directory entries/block +FileCntInDir .EQ $70 directory file count (16 bit) +* +blkfl .EQ $72 block flag / file counter +ScrollIndex .EQ $73 index # of top name in display +*-------------------------------------- +SEL1.FileBuf .EQ $1800 1k +SEL1.DirEntry .EQ $1C00 512b +SEL1.filetypes .EQ $1F00 +SEL1.Filenames .EQ $2000 *-------------------------------------- SEL1.START cld bit RROMBNK2 read ROM - stz softev - lda #$10 set reset vector to 'dispadr' - sta softev+1 - jsr setpwrc create power-up byte +* stz softev +* lda #$10 set reset vector to 'dispadr' +* sta softev+1 +* jsr setpwrc create power-up byte lda #$A0 jsr $C300 initialize 80 column text card @@ -21,21 +39,19 @@ SEL1.START cld jsr GP.TOOLBOX reset MEMTABL lda #$02 - sta smparms init set mark parms pcount. + sta SEL1.SetMarkP init set mark parms pcount. *-------------------------------------- -* drive selector -*-------------------------------------- - ldx DEVCNT get device count and + ldx DEVCNT .1 lda DEVLST,x and #$F0 cmp DEVNUM - beq SEL1.VolName + beq SEL1.GetVol dex bra .1 - -SEL1.NextVol ldx lstpntr get device list pointer. +*-------------------------------------- +SEL1.NextVol ldx VolListPtr get device list pointer. bne .1 ldx DEVCNT get device count. @@ -43,232 +59,241 @@ SEL1.NextVol ldx lstpntr get device list pointer. .1 dex lda DEVLST,x get unit number from list. - -SEL1.VolName stx lstpntr - sta ol_unit store unit number for online. +*-------------------------------------- +SEL1.GetVol stx VolListPtr + sta SEL1.OnLineP+1 store unit number for online. jsr MLI .DA #MLIONLINE - .DA ol_parms + .DA SEL1.OnLineP bcs SEL1.NextVol error check. - stz dlevel haven't read root directory yet. + stz bInSubDir haven't read root directory yet. lda pbuf+1 load description byte. and #$0F mask for name length. beq SEL1.NextVol if 0, then try next unit. +* clc + adc #$02 add 2 to length. tax name length in x. -vnam1 stx pbuf save the name length - lda #$2F '/' +SEL1.OpenDir stx pbuf save the name length + lda #'/' sta pbuf+1 slash before and sta pbuf,x after name. - stz pbuf+1,x null after complete name. - -* open and read directory + stz pbuf+1,x now "/VOLNAME/0 jsr MLI .DA #MLIOPEN - .DA op_parms - bcc L5D7F good open. + .DA SEL1.OpenP + bcc SEL1.EnumDir good open. - lda dlevel trying to open root directory ? + lda bInSubDir trying to open root directory ? beq SEL1.NextVol yes, just move to next volume. jsr bell1 no, generate bell tone - jsr popdir and stay at same level. + jsr SEL1.FullPath.. and stay at same level. stx pbuf jmp keyloop +*-------------------------------------- +SEL1.EnumDir stz filecount zero file count. -L5D7F inc dlevel - stz filecount zero file count. - lda op_refn get file reference number - sta rd_refn store in read - sta sm_refn and setmark parm lists. + lda #1 File Ref Num=1 + sta SEL1.ReadP+1 store in read + sta SEL1.SetMarkP+1 and setmark parm lists. + + stz SEL1.ReadP+2 + lda /SEL1.DirEntry + sta SEL1.ReadP+3 + lda #$2B set read parm list for - sta rd_reqlen directory header length. - stz rd_reqlen+1 + sta SEL1.ReadP+4 directory header length. + stz SEL1.ReadP+5 + jsr SEL1.ReadEntry read directory - bcs L5DB3 + bcs SEL1.CloseDir1 ldx #$03 -L5D9A lda sysentry+$23,x copy directory info - sta entlen,x to zero page. +.1 lda SEL1.DirEntry+$23,x copy directory info + sta DirEntLen,x to zero page. dex - bpl L5D9A + bpl .1 - sta rd_reqlen put entry length in read parm list. + sta SEL1.ReadP+4 put entry length in read parm list. lda #$01 set block file counter to 1. sta blkfl - stz fpos_mid zero out msb's of file position - stz fpos_hi in setmark parm list. - lda filecnt any files in directory ? - ora filecnt+1 - bne L5DB5 if so, continue + stz SEL1.SetMarkP+3 zero out msb's of file position + stz SEL1.SetMarkP+4 in setmark parm list. -L5DB3 bra L5E29 else go close directory file. +SEL1.EnumDirNext + lda FileCntInDir + ora FileCntInDir+1 + beq SEL1.CloseDir -L5DB5 bit filecnt+1 check msb of file count. - bmi L5DB3 if set then done. +SEL1.EnumDirNext1 -L5DB9 lda fpos_mid get mid byte of setmark file position. - and #$FE reset lsb - sta fpos_mid and save. +.1 lda #$01 reset lsb + trb SEL1.SetMarkP+3 ldy blkfl block file counter lda #$00 - cpy entblk have we read all entries in this block ? - bcc L5DCE if not, continue. + cpy DirEntPerBlk have we read all entries in this block ? + bcc .3 if not, continue. tay if so, zero y-reg and sty blkfl reset block counter / flag - inc fpos_mid + inc SEL1.SetMarkP+3 -* set up setmark parameters for next file to be read. -* if transfer to second sector, handle it. +.2 inc SEL1.SetMarkP+3 -L5DCC inc fpos_mid - -L5DCE dey decrement file block counter +.3 dey decrement file block counter clc - bmi L5DD8 + bmi .4 - adc entlen add entry length to acc. - bcc L5DCE determine if we flopped into 2nd half of - bcs L5DCC block, if so inc mid byte position. + adc DirEntLen add entry length to acc. + bcc .3 determine if we flopped into 2nd half of + bcs .2 block, if so inc mid byte position. -L5DD8 adc #$04 add 4 and put in - sta fpos_lo low byte of setmark. +.4 adc #$04 add 4 and put in + sta SEL1.SetMarkP+2 low byte of setmark. jsr MLI call mli .DA #MLISETMARK - .DA #smparms parameters address = $0060 - .HS 00 - bcs L5DB3 error + .DA SEL1.SetMarkP + bcs SEL1.CloseDir jsr SEL1.ReadEntry - bcs L5DB3 error. +SEL1.CloseDir1 bcs SEL1.CloseDir inc blkfl increase count of files read. - lda sysentry file type/length. + lda SEL1.DirEntry file type/length. and #$F0 mask off high nibble. - beq L5DB9 deleted file, try next one. + beq SEL1.EnumDirNext1 - dec filecnt decrement low file count. - bne L5DF8 + lda FileCntInDir + bne .5 - dec filecnt+1 and high if necessary. + dec FileCntInDir+1 -L5DF8 ror sysentry+$1E check access bit. - bcc L5DB5 if no read, try next file. +.5 dec FileCntInDir - lda sysentry+$10 get file type. - cmp #$0F directory file ? - beq L5E08 then continue. + ror SEL1.DirEntry+$1E check access bit. + bcc SEL1.EnumDirNext if no read, try next file. - cmp #$FF system file ? - bne L5DB5 no, read next file. + lda SEL1.DirEntry+$10 get file type. + ldx filecount get valid files read. + inx + beq SEL1.CloseDir -L5E08 ldx filecount get valid files read. - cpx #$80 if greater than size of filename buffer - bcs L5E29 then close directory + stx filecount - sta filetyps,x else store filetype in zero page - jsr namecalc and go set up storage area. - ldy #$0F + dex -L5E15 lda sysentry,y get byte of filename - sta (fnstore),y store in directed area + sta SEL1.filetypes,x else store filetype in zero page + jsr SEL1.SetFNPtrX and go set up storage area. + + ldy #15 + +.6 lda SEL1.DirEntry,y get byte of filename + sta (FilenamePtr),y store in directed area dey - bpl L5E15 + bpl .6 - iny y = 0 and #$0F mask off low nibble (name length) - sta (fnstore),y restore in name buffer - inc filecount increment valid file counter - bne L5DB5 get next file (branch always) + sta (FilenamePtr) restore in name buffer + bra SEL1.EnumDirNext L5E26 jmp SEL1.NextVol error. try next unit. - -L5E29 jsr MLI close directory file +*-------------------------------------- +SEL1.CloseDir jsr MLI close directory file .DA #MLICLOSE - .DA cl_parms + .DA SEL1.CloseP bcs L5E26 error. jsr settxt use full screen for windows jsr home + lda #$17 cursor at bottom of screen. jsr TABV set vertical position. - ldy #$00 + lda #$14 horizontal position. - jsr sethorz print message. - jsr homecurs cursor to upper/left. + sta ch + + ldy #0 Footer + jsr SET1.MsgOutY + lda #$99 + jsr cout cursor to upper/left. ldx #$00 -L5E48 lda pbuf+1,x - beq showfiles +.1 lda pbuf+1,x + beq .2 - jsr output + jsr SEL1.COut inx - bne L5E48 + bne .1 -showfiles stz valcnt - stz topname init top filename index. - lda filecount # of valid files. +.2 stz SelectedIndex + stz ScrollIndex init top filename index. + ldx filecount # of valid files. beq keyloop if no files. - cmp #$15 more than what will fit on screen ? - bcc L5E61 no. + cpx #21 more than what will fit on screen ? + bcc .3 no. - lda #$14 limit to 20 files on the screen. + ldx #20 limit to 20 files on the screen. -L5E61 sta gp_cnt - lda #$02 set window dimensions +.3 lda #2 set window dimensions sta wndtop sta wndlft - lda #$16 + + lda #22 sta wndwdth sta wndbot -L5E6F jsr nameprnt output filename to screen - inc valcnt - dec gp_cnt file counter. - bne L5E6F continue printing names. +.4 phx + + jsr SEL1.PrintFN + inc SelectedIndex + + plx + dex + bne .4 - stz valcnt + stz SelectedIndex beq L5EAA if last file, it needs to be inverse. - -uparrow jsr nameprnt print old name in normal. - ldx valcnt get old name number. +*-------------------------------------- +uparrow jsr SEL1.PrintFN print old name in normal. + ldx SelectedIndex beq L5EAA if already at the top name - dec valcnt else fix index. + dec SelectedIndex lda cv current cursor line. cmp #$02 at top line of window ? bne L5EAA no, move up normally. - dec topname fix offset index + dec ScrollIndex fix offset index lda #$16 else sroll windows down a line. bne L5EA7 branch always. - -dnarrow jsr nameprnt print old name in normal. - ldx valcnt get old name number. +*-------------------------------------- +dnarrow jsr SEL1.PrintFN print old name in normal. + ldx SelectedIndex inx add one. cpx filecount bcs L5EAA if already at last filename - stx valcnt else update index. + stx SelectedIndex lda cv current cursor line. cmp #$15 at bottom line of window ? bne L5EAA no, move cursor normally. - inc topname update offset index + inc ScrollIndex update offset index lda #$17 else scroll up a line. L5EA7 jsr cout -L5EAA jsr setinv set inverse text mode. - jsr nameprnt output last filename. +L5EAA jsr setinv set inverse text mode. + jsr SEL1.PrintFN output last filename. +*-------------------------------------- keyloop lda kbd get keyboard input. bpl keyloop loop until key pressed. @@ -292,214 +317,220 @@ L5ECB cmp #$89 tab ? cmp #$9B esc ? bne keyloop no, try again else pop up a directory. -* pop a directory level - - jsr popdir - dec dlevel - bra L5EF1 - -popdir ldx pbuf - -L5EDD dex - lda pbuf,x - cmp #$2F slash - bne L5EDD - - cpx #$01 - bne L5EEC - - ldx pbuf -L5EEC rts - + jsr SEL1.FullPath.. CD .. + jmp SEL1.OpenDir +*-------------------------------------- L5EED jmp SEL1.NextVol set up new unit number. +*-------------------------------------- +L5EF4 ldy SelectedIndex + lda SEL1.filetypes,y get file type. + cmp #S.FI.T.DIR + bne .1 branch if directory. -L5EF0 inx - -L5EF1 jmp vnam1 get new directory info. - -* run selected file - -L5EF4 jsr MLI - .DA #MLISETPREFIX - .DA pf_parms - bcs L5EED error. - - ldx valcnt get name number. - jsr namecalc set up name storage area (on return y=0) - - ldx pbuf get prefix length. - -L5F04 iny start at y = 1. - lda (fnstore),y get character of name. + jsr SEL1.SetFullPath + bcs L5EED + inx - sta pbuf,x store in prefix buffer. - cpy namelen check length of name. - bcc L5F04 loop until all transferred. - stx pbuf put prefix length into buffer. - ldy valcnt get file number. - lda filetyps,y get file type. - bpl L5EF0 branch if directory. + jmp SEL1.OpenDir get new directory info. + +.1 cmp #S.FI.T.SYS + bne keyloop + + jsr SEL1.SetFullPath + bcs L5EED + + jsr MLI open file + .DA #MLIOPEN + .DA SEL1.OpenP + bcs L5EED + + lda SEL1.OpenP+5 move reference number + sta SEL1.ReadP+1 for read. + + lda #$20 + sta SEL1.ReadP+3 read at $2000 + + dec SEL1.ReadP+5 was $002B, now $FF2B + + jsr SEL1.Read read selected file. + php save possible error. + jsr MLI close file. ignore any error from close + .DA #MLICLOSE + .DA SEL1.CloseP + plp restore status from read. + bcs L5EED if any errors. jsr settxt reset to full window. jsr home makes for no flash. lda #$95 ctrl-u jsr cout turn off 80 columns. - jsr MLI open file - .DA #MLIOPEN - .DA op_parms - bcs L5EED if error. - - lda op_refn move reference number - sta rd_refn for read. - -* lda #$FF read the entire file. -* sta rd_reqlen -* sta rd_reqlen+1 - - dec rd_reqlen+1 was $002B, now $FF2B - - jsr SEL1.Read read selected file. - php save possible error. - jsr MLI close file. ignore any error from close - .DA #MLICLOSE - .DA cl_parms - plp restore status from read. - bcs L5EED if any errors. - jmp sysentry execute selected system file. - -* output messages. on entry: acc = horizontal position, -* y = index to message teminated by 0. - -sethorz sta ch - -msgout lda dsp2msg,y - beq L5F57 + jmp $2000 execute selected system file. +*-------------------------------------- +SET1.MsgOutY lda SEL1.Footer,y + beq .8 jsr cout iny - bne msgout + bne SET1.MsgOutY -L5F57 rts - -* name pointer calculator for name storage area - -namecalc stz fnstore+1 init high byte of 16-bit shift - txa - asl shift to high nibble - rol fnstore+1 - asl - rol fnstore+1 - asl - rol fnstore+1 - asl - rol fnstore+1 - sta fnstore low pointer - lda /iobuf - clc - adc fnstore+1 - sta fnstore+1 - - ldy #$00 - lda (fnstore),y file name length - sta namelen - rts - -* output a filename line - -nameprnt lda #$02 - sta ch80col horizontal position = 2. - ldx valcnt filename number +.8 rts +*-------------------------------------- +SEL1.PrintFN ldx SelectedIndex txa sec - sbc topname calculate line # to display name + sbc ScrollIndex calculate line # to display name inc inc jsr TABV set vertical position. - lda filetyps,x get filetype (x is unchanged by tabv). - bmi L5F99 branch if system file. + + lda SEL1.filetypes,x get filetype (x is unchanged by tabv). + cmp #S.FI.T.DIR + bne .1 branch if not a DIR stz ch80col adjust cursor position. - lda invflg ave current inverse setting + lda invflg Save current inverse setting pha - ldy #fldrmsg-dsp2msg - jsr msgout display the folder. + ldy #SEL1.DirIcon-SEL1.Footer + jsr SET1.MsgOutY display the folder. pla restore inverse setting. sta invflg -L5F99 jsr outsp output a space. - jsr namecalc calc name location. +.1 lda #$03 + sta ch80col + + jsr SEL1.SPOut output a space. + jsr SEL1.SetFNPtrX calc name location. -L5F9F iny y = 1 (first time). - lda (fnstore),y get name character. - jsr output put on screen. - cpy namelen end of name ? - bcc L5F9F no. + ldy #0 -outsp lda #$A0 - .HS 2C BIT ABS +.2 iny + lda (FilenamePtr),y get name character. + jsr SEL1.COut put on screen. + cpy FilenameLen end of name ? + bcc .2 no. -homecurs lda #$99 +SEL1.SPOut lda #' ' SPACE -output ora #$80 set high bit. +SEL1.COut ora #$80 set high bit. jmp cout output to screen. SEL1.ReadEntry jsr SEL1.Read bcs SEL1.Read.RTS - ldy #sysentry - lda /sysentry + ldy #SEL1.DirEntry + lda /SEL1.DirEntry ldx #2 jmp GP.TOOLBOX - +*-------------------------------------- SEL1.Read jsr MLI mli read call .DA #MLIREAD - .DA rd_parms + .DA SEL1.ReadP SEL1.Read.RTS rts *-------------------------------------- +SEL1.SetFullPath + jsr MLI + .DA #MLISETPREFIX + .DA SEL1.SetPrefixP + bcs .9 + + ldx SelectedIndex + jsr SEL1.SetFNPtrX set up name storage area (on return y=0) + + ldx pbuf get prefix length. + ldy #0 + +.1 iny start at y = 1. + lda (FilenamePtr),y get character of name. + inx + sta pbuf,x store in prefix buffer. + cpy FilenameLen check length of name. + bcc .1 loop until all transferred. + + stx pbuf put prefix length into buffer. + + inc bInSubDir + + clc + +.9 rts +*-------------------------------------- +SEL1.FullPath.. ldx pbuf + +.1 dex + lda pbuf,x + cmp #'/' + bne .1 + + cpx #$01 + bne .9 + + ldx pbuf + +.9 dec bInSubDir + + rts +*-------------------------------------- +SEL1.SetFNPtrX lda /SEL1.Filenames/16 + sta FilenamePtr+1 + txa + + ldx #4 + +.1 asl + rol FilenamePtr+1 + dex + bne .1 + + sta FilenamePtr + + lda (FilenamePtr) + sta FilenameLen + rts +*-------------------------------------- * data area *-------------------------------------- -dsp2msg .AS -"RETURN: Select | TAB: Chg Vol | ESC: Back" +SEL1.Footer .AS -"RETURN:Select,TAB:Chg Vol,ESC:Back" .HS 00 -fldrmsg .HS 0F inverse control code +SEL1.DirIcon .HS 0F inverse control code .HS 1B enable mousetext .AS -"XY" folder characters .HS 18 disable mousetext .HS 0E normal control code .HS 00 *-------------------------------------- -op_parms .DA #3 3 parms +SEL1.OpenP .DA #3 Param Count .DA pbuf pathname - .DA op_buf file buffer -op_refn .HS 00 reference number - -cl_parms .HS 01 1 parm - .HS 00 reference number. - -ol_parms .HS 02 2 parms -ol_unit .HS 60 unit number, default = s6, d1 + .DA SEL1.FileBuf file buffer + .HS 01 reference number +*-------------------------------------- +SEL1.CloseP .DA #1 Param Count + .HS 01 reference number. +*-------------------------------------- +SEL1.OnLineP .DA #2 Param Count + .HS 60 unit number, default = s6, d1 .DA pbuf+1 data buffer - -pf_parms .DA #01 one parm +*-------------------------------------- +SEL1.SetPrefixP .DA #1 Param Count .DA pbuf pathname - -rd_parms .DA #04 4 parms -rd_refn .HS 01 reference number - .DA sysentry data buffer +*-------------------------------------- +SEL1.ReadP .DA #4 Param Count *-------------------------------------- .LIST ON SEL1.LEN .EQ *-SEL1.START .LIST OFF -*-------------------------------------- -* these last 2 parms (4 bytes) may extend past $300 length limit since -* the request count is set prior to using the parm block and the transfer -* count isn't used at all (except by prodos) *-------------------------------------- .DUMMY -rd_reqlen .BS 2 requested length + .BS 1 RefNum + .BS 2 MemPtr + .BS 2 requested length .BS 2 actual length + +SEL1.SetMarkP .BS 1 Param Count + .BS 1 RefNum + .BS 3 FPos .ED *-------------------------------------- MAN diff --git a/ProDOS.FX/ProDOS.S.SEL2.txt b/ProDOS.FX/ProDOS.S.SEL2.txt index 3562ec25..72128a3c 100644 --- a/ProDOS.FX/ProDOS.S.SEL2.txt +++ b/ProDOS.FX/ProDOS.S.SEL2.txt @@ -13,6 +13,9 @@ NEW * (as other replacement quit code is supposed to do) because GQuit checks * this to see if this version of quit code is available. +op_buf .EQ $1C00 open file buffer (selector) + + SEL2.START GQdisp lda RRAMWRAMBNK1 read/write LC bank 1 clc diff --git a/ProDOS.FX/ProDOS.S.txt b/ProDOS.FX/ProDOS.S.txt index 8566a368..c3c5274c 100644 --- a/ProDOS.FX/ProDOS.S.txt +++ b/ProDOS.FX/ProDOS.S.txt @@ -88,29 +88,6 @@ zpt .EQ $48 highly used zero page index pointer datptr .EQ $4A ptr to data area of buffer. sos .EQ $4C sos buffer pointer. usrbuf .EQ $4E data ptr in user buffer. - -* zero page variables for Bird's Better Bye - -smparms .EQ $60 set mark parms -sm_refn .EQ $61 file reference number -fpos_lo .EQ $62 new file position (3 bytes) -fpos_mid .EQ $63 -fpos_hi .EQ $64 -lstpntr .EQ $65 device list pointer (16 bit) -valcnt .EQ $67 name counter - -filecount .EQ $68 # of displayable files in directory -namelen .EQ $69 length of filename -gp_cnt .EQ $6A general purpose counter -dlevel .EQ $6B directory level -fnstore .EQ $6C filename storage pointer (16 bit) -entlen .EQ $6E directory entry length -entblk .EQ $6F directory entries/block -filecnt .EQ $70 directory file count (16 bit) -blkfl .EQ $72 block flag / file counter -topname .EQ $73 index # of top name in display -filetyps .EQ $74 128 byte table of filetypes -errnum .EQ $DE *-------------------------------------- auxsp .EQ $0101 RAMXDRV .EQ $0200 load address for aux bank /RAM driver @@ -128,7 +105,6 @@ vblock1 .EQ $0E00 ramdisk directory block volbuf .EQ $0F00 volume buffer iobuf .EQ $1400 i/o buffer fbuf .EQ $1800 FCB buffer -op_buf .EQ $1C00 open file buffer (selector) sysentry .EQ $2000 .SYS file load address xfer .EQ $C314