From 0d08904fc91042fbdeb47c3afdb1ae2d822575c4 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Fri, 5 Nov 2021 19:16:22 -0400 Subject: [PATCH] Updated disk image. Builds on Merlin-16 again. --- applecorn.po | Bin 819200 -> 819200 bytes applecorn.s | 2 + auxmem.bytwrd.s | 2 + auxmem.chario.s | 2 + auxmem.gfx.s | 2 + auxmem.hostfs.s | 1435 +++++++++++++++++++------------------- auxmem.init.s | 36 +- auxmem.misc.s | 2 + auxmem.mosequ.s | 86 +-- auxmem.oscli.s | 2 + auxmem.vdu.s | 2 + mainmem.fsequ.s | 2 + mainmem.gfx.s | 2 + mainmem.init.s | 2 + mainmem.ldr.s | 4 + mainmem.lists.s | 2 + mainmem.menu.s | 2 + mainmem.misc.s | 278 ++++---- mainmem.path.s | 2 + mainmem.svc.s | 1754 ++++++++++++++++++++++++----------------------- mainmem.wild.s | 2 + 21 files changed, 1831 insertions(+), 1790 deletions(-) diff --git a/applecorn.po b/applecorn.po index 78409c319b2260a32ae1d87236e8c93df69493a5..05bc24d13ac273ea01ab520d0a56d4bde4270058 100644 GIT binary patch delta 22215 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 I9|P0=2Nj0FX#fBK delta 16331 zcmeHud0bP+_IU2SxydES;)3EnR-e1Lwo=6f1qB;LmY{8I8(%lN>+5S@w^!1>Vq5iE zTnszt8XU3n6#r z%$c*znKNf*5|wI(N;N~jS=?{9=vb)enMn`#6RGM%3rS)7Uh$x0QD4zxlScTA5!H#H z(9ee!O$}G9ULLtTWYMDutKuR;;>8uBA)<}b{|IeyRCru;44_%4fud{Ud!tQuQ(L-Z zbx6EOBob@sKB6%}9<(XFxkkmrCoG8vawq6nqDP+f;JMJYuVwouH`6|%IsV=av}lT( z&+_Q_#e|W#jUFl5FsC<~N4e!O@sY6#VAGe8h&FM((L&tRV&WIeqk)`w5HnEp!32UP z>$cVQdu(v>6lSVu$YZ?;OkExxy@FVAiJQ+FMl3oe?u|CZgXT7mSjosl0|EhUWH%dH z6yiaPUJ;!@#CefnMF%7VEx9LN7dd%EoM4347*3Slr#HDS;pEZr3B=a_V5Fh|S#Pv1 zuFE4=fT={{_d$nOS#PuzJ*0EnUi=|&{pdcfUF24VCqxl)8yP=Q!$5Cx+t*6_&)o$k zEq>g)p$D5)(Q0 z_*284!y$gM%I$%4znyPT!!Y_vS`8I(`kT~W4plTrsGKw^n;LQDiuw$yuwMAC%7_rs zBONNMscUMs+fb9Ey#rs}Lyh$*ysRee`fNkz9*Uw3GBtH{D7K!a2H?~0v;N7v+FF&b zuCP`auT&lR4(RERWTD)1sKa)(6oT2MGbp3VSZ2vUP^xRHX{)L0u(hEZ_ImiNyV2I}XoKzr6_)S1`uFIb z-PN6e{`iq6BqI!K4={6RgC?Dk1Z_CWq@NXUFdTlxr=Sn6+f5BKfXt()oR#dDL3o&6 z@dM*4Kd>N>sZrdP_M`9+_`g5 zyIfgSmTxNeZn9Q=hu8Z14)g=1FSj*!*ib`riw%F^?;GUT)h+*M299YjrQ22R?uiuC+{6A)czovbC@ti#}fBdPxuV0_8F2Dje{*65~ z>CXy|ulxEUFFJ;=UT145eC-YPJ;U8M*%kDkpm|j=#&j^oRa=__wc2Xz?Wm#UMtc*g zX=(8`otNxUZ?mC)-s;300r=8Zn31yref#4jfxaX0mcG7zy=<>~n+^F>TEzD89XJ`Z z(7RP=v~?h-qy3K+FzDW9qo|4hz4h_RKE8uy0*i8oU3aJ3ScFrH&Hf)ab-crdij#Y| z=LO>>sGYXve@kLn&(|50pR0%9b`Ft7Z<+;V7C_y9ps2_j?xtq0$S>?k3d)39Q4yhL zu87Mo^zP;%r_b?*yU7(A%|;>AcGDDu%OT`kjW~G^8Q^GQNYXyh}xJ4y+T#rz!}b&DOGT<+*V&8^NBTdU39 zVXHra+H4&++UyVsAu8G%ZS~z9UHz_j11hVmg!t(mNE-} zyo!=dW*D^7J%+*?i8K_saC+F+8wVQPC_T*TjY1mSI6aI7IQ>9Uk3ePlrA9C$9-qwW z7kg=GF3bl!2tXIirANLacJRE;z@pl0Z?(08M>l{a;ca&#@`fwPtW7dfZ7#gx3FA=C zhjKm%>1tv+J_FnReFsq)IF|D5pKPtLRC!3dpTbBYSiLi#%}XlOEK`w7 z5QssOcPAnYgd@mmPI)){XKJSeYQ|nOrc1N@KSL{PG|AvHT$8G&A-l*GxD7QL3p{B>5eas$7F03@ULal2u3so}D zp-WMv(G`SUO{D5>$uB4{TCKp?)#9qU+X{`=s>%wOJ8pumDrp2j*I2koTAwK(V?a`u zZ%WJ6mSPZ)%$)saA-RBbhSVTkJm;yESS!_*N?^dNE#`dEt^6CaS(soh6m`C}Kz&Fk zXCC6!g%{KZ^m-iqDLa3t_aL~!hC2^(ExXV7!?Nq0lz6YbhL1mG2T)?d67Su}hSD$) zew)}CeXLbiAa^Elr{Dtqph*&pU);pj4HYzjMM+K4bJB`h955RjT51~cBRo3}|H!jp z*cmJF^&yI#F31PM$9Z;?SSU^2!an&>1_C9!hS_B{sKU?^laj`QV)vrpY80x5PqwhP zCxD>|dR|W_^A+ zSxxsJFzUPexJo2QwqJ+MK$-PIuLQ&6y+(b{aTtcsg>vF#r^_pF!nWWC<(gcPh9*5NiV6IMP0Zgq@k8svM<)4>hrj(rV5pXh$; z1L>$Ct~hks+G`;wFc*;SgD3-DdyMKow)u_?IT}!Xa~mx7-b&;b7J$94T1d$5W;}2> zF>%lF?7}1b1EokNA(JGrLF#zZ8W`l9&C#+;)h4pe}L9w@B_c4XtsW*m4ifkUA-Oh$lykMK; zUJ70?k#)hnMtiA#!D1#_ShLL*Z^HL+`Y!XHYqwvNS6udpaoHt?pT~Rg_UYh2qL=>QgGj0 z>`0azA++O{b^*hHovhTq$8knMQw<)vogJ18u?`MK3iZ5N2N?{oo)naBhej*#5Vu9U!)WI((1$Q7X@p-fJu zKssTNgh)ZKhFYxz&6NsNUN(cxA^mo{-WR)J$rY!u!Tw+&m^@%281f3iC&A6lhp^9H zIL~-%FMHIN7KePrP8{npzi_H$w%Hpynn;kXX=}`Kr&ZSP%B%9P;D`3HT!Dw3HP_?MJt-V7yh4h&ISiWG*7Kh!<+E`i1&-NLK4%-?}BUfU7Iwwo(wxgH8GF~uP zmt9wS1R~xgY!OHVgd%vMkVV5>JA*Dj_DXV!I>-%wjyE+I2W z*f)@m|MT`(Dr{lS*0m`nP};KCMvHWqxENPgk=Z8 zS7sk%C*pSxLjJl3N`L8|++gMm;h;MM)n?`BYO{}#Ak)xhv+=kkon45RrnA$dz?N6k z?o^Q+rC(@)Y_%QTXoqtgVbA1lgUI9x&cYnOpD=DrXAh6P+*H$XsGXdtqt=?+&8;_D zk^M$%Eu4@8>so>Ic}N0RUSUTYvJSC#DJky?$HY^E@U3-h|8f6uQjtApkKl;Ue$B38 zfCM=_9`4^IqARfVJ;J{JUz6K&gpC)IJ?HO{GT4u>?UYoQ)8;J0O3lpmLS2$^}bKJ0ZXz^_WI}(SUWUCo1 z*xQ`Xjxo$X#XdmeyQf$me5Zhw8D2ZX&ZP0-Ty`ez$Yobz#W}V#0v#qNK=n5ud1!QP zG97KGz2>G(i%?-rM-9N*$v)t~2_w=SE^ypvska~MKn^El9B_vsVB%lu*`cz68qz=j zc-47!0p5L{{RfWCW0x7OtlaQgAv>3m0StVw-C5IyH5b`6 z%L>(S-*liLp9B+OL*6CBA;3Fuq7V)!dI&5W3WC7G!LDG|6Gj&WJ=Pl85u=GXuAU%1 zEIvKOZ*XafBa7MjIK@}`F5HlX<&?026rNMc7VRu&Cvr_cUvFu(JDl4o`gVF5OBp7X zvojjI5*ZFxvsZ^v zSMa~?v2obvH}*Jn9H0A*J>VxCdRU4f=dl!jhkxvZZPLFx*=IkuN)~?pv}DW-*8=i2 zndO!?xb$j++bqft2U*pA*G$w6CSzy1S)z&Ll)M@lHeawIuVa}`z) z2QId7-_epGuwOS^9W6;`498ANmJ{<%Odl_ysewEHP7Q#L*K;OGJ{XUgAAFM26C^Y@ zIb`az=`&`|+L<673(b`|t0Y4nHT3yV)ffwq6=T#_7MyV@q@q{=K5-bS{n zzCTEYNnc&J{%^1U{SCnUHRpQ?MKLuuZVTHA!-5|qTV!1wC!{w?Xvv#zz5UL+?*a0i zoa>SRpRU%t^qU~=Ka*9^bT8*u$*W>K_IY+&`binheDJT2c5>{!bfBJdR+cTsS$VSl zST2#SoZ%Imx=ytq{C8)6a46W)0b70qhpz}u3ci#`XAJb}2baHq4xR8tiF6E{8_nwH zJ1USY_>gx%fUrB-T5DPiKTD*0#D)Q8$@^4#k&O2Jbkk;j%V()uw{73Cz2@y3=>bwI zy+k%(KSk3!f0F%#ox3TH=r@E)A1kFPjM?$hNp#Ug(6BOn73eZix`#5X|5^4xKg0L) zrQ!bR2~rxb5AZ!|C|xdHNt3gihx~oV$GJ1QN~0yes<>M*lGehUaJD(>Z0+sHSpylI zmtO8v@Ec2E(S@Gf;D~2!u4R5TL&Sl*4N=fDp ziIL&x_C`GO8R@w6SEaP!u^gWaU&E9M zz8_MCFJG75qzr+ReYeuM`EBV4!}$>3TYflllQcAavy|>vTvBQ-D-RktOTACC|G>fY zLx;gZ?K>w)B)IPzlmp_0Z+fa!mcCc|$;zXm<)Y={gvj`WA4M}nfuca4wnOCG9DxCC zUz6uOHZX{#SlP*CBHy6?LHDHhq*C?;^up^XFrc3_jRh#)agRGSNp#OgFBWxf|6ur# zV}bNeDrY=L(*|1Z`x}!J!injm`b8*cu@((`Fb}N=*M7z)DzppvRSNA6jVKuHU#Q*P z1<|@8R7#k3Rmwaql`>!ZamoU%C}oirr7R9beG9ZN^KFcFG2hNaALKh2t(kW++C}^? z3_65go5nqyJU4vHoba@;aC9{>b*4s?J3rhhL9O?iR5x^qij*+jDn-gXwJ0l$pBHYP z7w+VWv%;WR)sD8@LqFbC{ib_N!M~}{W&#j3CF*Ab^Du2H2qOYvwxul4%?VFgq?;R_ z85UkGaD-7}XMsp~$~>eCCw#Wt z)0%q$00zR=ho^)!k_vX!vP)P^rC@_CM=q_Xw{+@7j4Ejr*mgy z#fvgG<-uF?Ej}}Y8#@1uEv<~kzQxYG6*_r!r+h$x_9EZ12#L;%4k|L|(-x$gcAnQL z0ASpw&@G@R1Y|UAnNMq{@(bwl7Cc}kw{7Cx81!x|Dvd=@FvOzIVznZEy+X_Ie^Y3~ z`PWJ5?}WmIb=WeKdm!0`ykEe7BMvDN`9l$I3IZ?`{WDJgCVDwO)kk+I!bDrvt3m=% z6Q`f9I~>7>GpyX(5^0DRRAe2plU|B6B@UM13It zq+;_^q`mlYg`QT?p~_^PQo(OfWPTaB=UyTZ7Fa!@aP>+PdOhRSE0J{AsmM$t9e`3v ziXv5Fk~@P{;kr!<{tJa}vx47Ec$9vw&`(kQ5X@;sQM#Qj$4Z2Ld+#OcHh8M+m!yuj zKFAGy_HK-RP*RjhdaQSyCXU4UbBa_gRu;Qd#mzZ_3q3M^5DIC^ZP`dl7HgAKg3P(-=fe`{8q3KzfFN0_~=92*ty3Q{855) z>6qfM{vjw-WI|y|sP2TKRj=SrD0DfB)+_~|qtF=?t=S6RpnxX79EG0&2hQdu#;Qs0 zvab~KFP3_^0-!vT05r6P)`&JARYbwuL6sn4ruS>QX|gIV?Li&5_p?THyEj_(I%w#F;Px#Vl?|gxO`XC z!C6k3E{{o>rpsqirXx$DJ{Up^`XVaI6JZjQEG$}=oT#Og5V=UunoNS$EAJ{YNZ@+q zJ;mXT7V49d4f8)*aBy16qJz^@7B@_9m`=i}JT1y3x6oRVGE`?~T8kO}e6+5NX*Dr? zUbL>9X)R$aoUVdtEoC6iPF4~zVcJqo-_)VtQnWT)E{_(JPKJ5q(ON$#Gmklv&k(Pw zCL(`NM2?T{DKh6WftE6@05UO39-Ki$oPh>s(B*;E^!}uDJ{o|2+Z4{|P$;)leMm5`%6gYG$e9RATTTW=o=C^C|@_aQfMV zvTMwTA}5y4(11<+|aPQF(m%NkXc4+m$*jS6%flj+;sx?kCA`8{+g~R-qZM|soimlQ>U zGM@-5Kx(}Z;qM5sf08y{Rp(I&ET|s>q*BGO9P}YEPD=1^LhvMufzScp4&xq>bO;M3 z&VPvO@2@M0;n^K1a0eQ=LubU{^SH&6i(@7*Cd$IbDCe4EQWiHgKG=p zd3uJ9hQ~CdUx{knZ{k>wndsED1b?dKF=$XNLpO26LT*wrAnhV}1St@Z2Dy*|3DPNa zZzZ}Gi-KZ7@M*fCB-VW?T~iG3d!6eEz=7Id0iKbBz+J}AZP1_L2f3%NH*%}I}2cO zUi7xdE*J@k_A|-EnZezZY1MJ5OnG%&+BHydOMC3qJ7`usaa|{06b~)e;;!nf3E*Sb z;+*x6C+P!p)p1Tzg|Pl3f|ahx+HfZnLR@BhELb-% zw>=g{S5g98RLM+ag=T;?{COZ90qn$pc1x~g})f}u0RUT=Nh5W7~ zmgIMUCIc*}3B%nU>(%PX{<>R5BBHYs;$o+Bpz49{Fc?I_pfTPR2~&L_&M|2bMe)H( zl2qIAZ1r;jT^Ni)VLjaOzC#aBDQfd=ZtsS~PA)fTaaQbA&H6@@0;(Q{4JewGeR zXYiIH{BQ&}a~4kE4u)CiqIpGO<5Ppl=3znrKR|If4|0gCurCHEK2ddq!fK)xZ4C&KGRRYvQ2r3Yeww7M z&nR@M=lK^Dx~=E=7Zti~=lPcuy6xxrmr2~tTMHyaWXr|CCJX?@3W0=qkMJmYLwJ<( z!sFs$1$dW8r0Lwvvw6G-_gTuxeU^gLF94^{#%q^yD`xa{>=Dr=fwz#h73DRfja4Y% zl2(fBov5)h{nua)zGb{+Go%WwJySC_#)W!^x(1lmxaW zUCjXGI~$c+q`rje41=S%6%n2O_qIHhJBsl^DjVM?8r zmSwyJ8xaUL;W)$gb8rA+(?v zF2Ij09x#A}4sXO^G2B|J81IeYf+-Uq4Ts8zmE1&Xf6vNX9KDiz(7#ydI^niymvfND zK}bq9LEZA=+?AXucn<+YlC9n8Efke0qJmGt{!TL)?~Uaq1k_!RiC?;C<)RSL)yJYV z+X!&DPjJ#Zca&Ej)2t=cA$VXMx0G6ikH&EWM^cvQL{dnEPl$NE;snKKDNfKlCFxr;8|_OrcwG|KSARf&>TD?ftv^45L%bOjR?DS9n#KBirT$eo0C$gb)*=z zeksK;y$Vg$shswE^^d6TdMIlAG5BEN3*%A>4;o((r5KBfEkA%t$%#aq1nzdQwB?f$ z%PnvjIe6S})y`pPY7H22H+Cqvg@9InjRDssigzAnvTC*J) zx)YApV~)eH2^v|gNmN&(+UuFwjw8n$F31{nwY>KF2Gd6+DWyo)sfiRYo+*}?#+HmN z)fB5aG^Rzff?(mORooIV^=GTVS~<946*r5D#NyT56nM;7&23uVQa8AEOzr&ImO457 zKUSMm`&RA8wO`a~;r~=^QSGJLn%bMS(z*e46YA#I$?Kk~tEpXI_fg#!bzj%z*0sQ2 zh49%@S5w!5Wsh>R#FKt%X*JA$lsiWy&$h)WR(v$u7Pcz%R_^Frb9}TYGm8p`~H*{`j_^1&A zp=e*jw5hRe6Rue#sG+{t;>>C@g*f{{Iq)ugxZZ(Rlz`?GfW;P>fbyd$T>l+1)q{tC zP|Ga0al-1 z0n%oA&uNDxED$;nKfSH413$IMlz`&AqoplAS}|&|I2~FhiqM>pjNZUuYq-e^(`+gR zdZd5{q&QQ4L8!qw0HxVdoTMZprC&fei~hhb>CS@=)X}-_Adwa>3-nqLwh$j)!%Z4r zXiN2i<=)RhGnVJrk?>p6Sm0|y@#gvFf^*fch_*EsYmh1C%BL)kqr<; zHLt4cK~$YYHO&uVsn$oWf*AoNwMgqDZ?TXm2TRv&{LT~H&@o`scDN<8cYb2I?J_K} z=ucXXL}GiV{ML2NelqcbhLJoN7))!h_-Q-&4m!!XTAM7N->88xz&}61A<5VV&A*`> z_#`)Iz_u{ZYmI|1 zEoolV90h+%;P2U{-ha0*9lYKR+jm`aJ@xwQ&4;hQ^7G@(%I0U`@3i$F)_FqD7lqFf zORJ^3$As=;&(h$_%bNeyRNdryH8%}wUVxdWxQO6)8&mF{dZ#hv&OrwmF+B^R#u%9>Qo-QbKtHRd z;h8*uq7Xbn$*mcT)y>sXr&z02H^Uf#H%MEwT2jW_mE5#`In8@sB5R~3Z_5^XvZ@J< z$KNQqRd97SWi1yGQs11hYnntYN~P69mDQ9+qz^)Se$E(Ey)HmA`LL7IgiHu<(wd2C z5#$#)@KpkF;fD)G~NY2tWgH;M1^tj>Atq%|*cD zz|-8A{;H;Rj5hgXF>4D}9_)zP1?w&T{%LNwG}6x7>D(o_^Jz|>d~gvcCkuYz*_1Y| z9fEE7u3cL0lK8BQ5+O-jUtX=EZ%E#HYp?o|6Cg8cxauWkWTO(Ry zTGzC`*!oWE$E~~Y-=F0c`PQ@~WhAYBnWi=AIR9Dh!DLSDATy-N4wD4la@OG&85b85 zHwTG2>^JO<@aL!>*(7c{()?3%>-VF-@3>la_1x7ruBQLcVgJ29m}T+~I|P1tnoZtd zBV~9?TjX?$d`t_JAL{FnSGCA%F3D%N%4LtY$X{-eA8D5Vgp;4+rm&56*6}Yx)^jip zc;7cN_(teBZls}PEcXzFUx@X^=`V8M=EV6%_7!fJFx)U5%Zc+r;{OYOB=}@d&Z|Bz zdHp!>J)b>H_odguzW>vAKL7ug>;JJ^F2l?mpG*J6control block -FSPTR1 EQU $C4 ; =>directory entry -FSPTR2 EQU $C6 ; (unused so far) -FSNUM EQU $C8 ; 32-bit number, cat file count -FSACCBYTE EQU FSNUM+1 ; access bits -FSZPCC EQU $CC ; (unused so far) -FSCMDLINE EQU $CE ; command line address +FSXREG EQU $C0 +FSYREG EQU $C1 +FSAREG EQU $C2 +FSZPC3 EQU $C3 ; (unused so far) +FSCTRL EQU FSXREG ; =>control block +FSPTR1 EQU $C4 ; =>directory entry +FSPTR2 EQU $C6 ; (unused so far) +FSNUM EQU $C8 ; 32-bit number, cat file count +FSACCBYTE EQU FSNUM+1 ; access bits +FSZPCC EQU $CC ; (unused so far) +FSCMDLINE EQU $CE ; command line address * OSFIND - open/close a file for byte access -FINDHND PHX - PHY - PHA - CMP #$00 ; A=$00 = close - BEQ :CLOSE - PHA - JSR PARSNAME ; Copy filename->MOSFILE - PLA ; Recover options - >>> XF2MAIN,OFILE -:CLOSE >>> XF2MAIN,CFILE ; Pass A,Y to main code -OSFINDRET >>> ENTAUX - JSR CHKERROR ; Check if error returned - PLY ; Value of A on entry - BNE :S1 ; It wasn't close - TYA ; Preserve A for close -:S1 PLY - PLX - RTS +FINDHND PHX + PHY + PHA + CMP #$00 ; A=$00 = close + BEQ :CLOSE + PHA + JSR PARSNAME ; Copy filename->MOSFILE + PLA ; Recover options + >>> XF2MAIN,OFILE +:CLOSE >>> XF2MAIN,CFILE ; Pass A,Y to main code +OSFINDRET >>> ENTAUX + JSR CHKERROR ; Check if error returned + PLY ; Value of A on entry + BNE :S1 ; It wasn't close + TYA ; Preserve A for close +:S1 PLY + PLX + RTS * OSGBPB - Get/Put a block of bytes to/from an open file -GBPBHND LDA #OSGBPBM - JMP PRSTR -OSGBPBM ASC 'OSGBPB.' - DB $00 +GBPBHND LDA #OSGBPBM + JMP PRSTR +OSGBPBM ASC 'OSGBPB.' + DB $00 * OSBPUT - write one byte to an open file -BPUTHND PHX - PHY - PHA ; Stash char to write - >>> XF2MAIN,FILEPUT ; Pass A,Y to main code -OSBPUTRET >>> ENTAUX - JSR CHKERROR - CLC ; Means no error - PLA - PLY - PLX - RTS +BPUTHND PHX + PHY + PHA ; Stash char to write + >>> XF2MAIN,FILEPUT ; Pass A,Y to main code +OSBPUTRET >>> ENTAUX + JSR CHKERROR + CLC ; Means no error + PLA + PLY + PLX + RTS * OSBGET - read one byte from an open file -BGETHND PHX - PHY - >>> XF2MAIN,FILEGET ; Pass A,Y to main code -OSBGETRET >>> ENTAUX - CPY #$01 - BCC :EXIT ; If no error, return CC - LDA #$FE - CPY #$4C - BEQ :EXIT ; If at EOF, return CS - TYA - JSR CHKERROR -:EXIT PLY - PLX - RTS +BGETHND PHX + PHY + >>> XF2MAIN,FILEGET ; Pass A,Y to main code +OSBGETRET >>> ENTAUX + CPY #$01 + BCC :EXIT ; If no error, return CC + LDA #$FE + CPY #$4C + BEQ :EXIT ; If at EOF, return CS + TYA + JSR CHKERROR +:EXIT PLY + PLX + RTS * OSARGS - adjust file arguments * On entry, A=action @@ -120,74 +120,74 @@ OSBGETRET >>> ENTAUX * control block updated for 'read' calls * control block preserved otherwise * -ARGSHND PHX - PHY - PHA - CPY #$00 - BNE :HASFILE - CMP #$00 ; Y=0,A=0 => current file sys - BNE :S1 - PLA - LDA #105 ; 105=AppleFS filing system - PLY - PLX - RTS +ARGSHND PHX + PHY + PHA + CPY #$00 + BNE :HASFILE + CMP #$00 ; Y=0,A=0 => current file sys + BNE :S1 + PLA + LDA #105 ; 105=AppleFS filing system + PLY + PLX + RTS -:S1 CMP #$01 ; Y=0,A=1 => addr of CLI - BNE :S2 - LDA FSCMDLINE+0 - STA $00,X - LDA FSCMDLINE+1 - STA $01,X - LDA #$FF - STA $02,X - STA $03,X - JMP OSARGSDONE ; Implemented +:S1 CMP #$01 ; Y=0,A=1 => addr of CLI + BNE :S2 + LDA FSCMDLINE+0 + STA $00,X + LDA FSCMDLINE+1 + STA $01,X + LDA #$FF + STA $02,X + STA $03,X + JMP OSARGSDONE ; Implemented -:S2 CMP #$FF ; Y=0,A=FF => flush all files - BNE :IEXIT - JMP :FLUSH -:IEXIT JMP :EXIT ; Exit preserved +:S2 CMP #$FF ; Y=0,A=FF => flush all files + BNE :IEXIT + JMP :FLUSH +:IEXIT JMP :EXIT ; Exit preserved -:HASFILE CMP #$00 ; Y!=0,A=0 => read seq ptr - BNE :S3 - TXA - >>> XF2MAIN,TELL ; A=ZP, Y=channel +:HASFILE CMP #$00 ; Y!=0,A=0 => read seq ptr + BNE :S3 + TXA + >>> XF2MAIN,TELL ; A=ZP, Y=channel -:S3 CMP #$01 ; Y!=0,A=1 => write seq ptr - BNE :S4 - >>> WRTMAIN - STY GMARKPL+1 ; Write to MLI control block - LDA $00,X - STA GMARKPL+2 - LDA $01,X - STA GMARKPL+3 - LDA $02,X - STA GMARKPL+4 - >>> WRTAUX - >>> XF2MAIN,SEEK ; A=???, Y=channel +:S3 CMP #$01 ; Y!=0,A=1 => write seq ptr + BNE :S4 + >>> WRTMAIN + STY GMARKPL+1 ; Write to MLI control block + LDA $00,X + STA GMARKPL+2 + LDA $01,X + STA GMARKPL+3 + LDA $02,X + STA GMARKPL+4 + >>> WRTAUX + >>> XF2MAIN,SEEK ; A=???, Y=channel -:S4 CMP #$02 ; Y!=0,A=2 => read file len - BNE :S5 - TXA - >>> XF2MAIN,SIZE ; A=ZP, Y=channel +:S4 CMP #$02 ; Y!=0,A=2 => read file len + BNE :S5 + TXA + >>> XF2MAIN,SIZE ; A=ZP, Y=channel -:S5 CMP #$FF ; Y!=0,A=FF => flush file - BNE :EXIT -:FLUSH >>> XF2MAIN,FLUSH +:S5 CMP #$FF ; Y!=0,A=FF => flush file + BNE :EXIT +:FLUSH >>> XF2MAIN,FLUSH -:EXIT PLA ; Unimplemented - PLY - PLX - RTS +:EXIT PLA ; Unimplemented + PLY + PLX + RTS -OSARGSRET >>> ENTAUX - JSR CHKERROR -OSARGSDONE PLA - LDA #0 ; Implemented - PLY - PLX - RTS +OSARGSRET >>> ENTAUX + JSR CHKERROR +OSARGSDONE PLA + LDA #0 ; Implemented + PLY + PLX + RTS * OSFILE - perform actions on entire files/objects @@ -200,50 +200,50 @@ OSARGSDONE PLA * XY preserved * control block updated * -OSFILEMIN EQU $FF ; $FF=LOAD -OSFILEMAX EQU $08 ; $08=MKDIR +OSFILEMIN EQU $FF ; $FF=LOAD +OSFILEMAX EQU $08 ; $08=MKDIR -FILEHND PHX - PHY - PHA - CLC - ADC #256-OSFILEMIN - CMP #OSFILEMAX+257-OSFILEMIN ; NB: LtoR evaluation - BCS FILEIGNORE +FILEHND PHX + PHY + PHA + CLC + ADC #256-OSFILEMIN + CMP #OSFILEMAX+257-OSFILEMIN ; NB: LtoR evaluation + BCS FILEIGNORE - STX FSCTRL+0 ; FSCTRL=>control block - STY FSCTRL+1 - LDA (FSCTRL) ; XY=>filename - TAX - LDY #$01 - LDA (FSCTRL),Y - TAY - JSR PARSNAME ; Copy filename->MOSFILE + STX FSCTRL+0 ; FSCTRL=>control block + STY FSCTRL+1 + LDA (FSCTRL) ; XY=>filename + TAX + LDY #$01 + LDA (FSCTRL),Y + TAY + JSR PARSNAME ; Copy filename->MOSFILE - LDY #$11 - >>> WRTMAIN -:L1 LDA (FSCTRL),Y ; Copy control block to auxmem - STA FILEBLK,Y - DEY - BPL :L1 - >>> WRTAUX - PLA ; Get action back - >>> XF2MAIN,CALLFILE + LDY #$11 + >>> WRTMAIN +:L1 LDA (FSCTRL),Y ; Copy control block to auxmem + STA FILEBLK,Y + DEY + BPL :L1 + >>> WRTAUX + PLA ; Get action back + >>> XF2MAIN,CALLFILE * On return here, A<$20 return to caller, A>$1F ProDOS error -OSFILERET >>> ENTAUX - JSR CHKERROR ; Check if error returned - PHA - LDY #$11 ; Copy updated control block back -:L3 LDA OSFILECB,Y ; Mainmem left it in OSFILECB - STA (FSCTRL),Y - DEY - BPL :L3 +OSFILERET >>> ENTAUX + JSR CHKERROR ; Check if error returned + PHA + LDY #$11 ; Copy updated control block back +:L3 LDA OSFILECB,Y ; Mainmem left it in OSFILECB + STA (FSCTRL),Y + DEY + BPL :L3 -FILEIGNORE PLA ; Returned object type - PLY ; No error, return to caller - PLX - RTS +FILEIGNORE PLA ; Returned object type + PLY ; No error, return to caller + PLX + RTS * FSC Command Table @@ -251,51 +251,51 @@ FILEIGNORE PLA ; Returned object type * These are commands specific to the filing system that can't be * called via OSFILE, OSFSC, etc. * -FSCCOMMAND ASC 'CHDIR' - DB $80 - DW FSCCHDIR-1 ; Change directory, LPTR=>params - ASC 'CD' - DB $80 - DW FSCCHDIR-1 ; Change directory, LPTR=>params - ASC 'DIR' - DB $80 - DW FSCCHDIR-1 ; Change directory, LPTR=>params - ASC 'DRIVE' - DB $80 - DW FSCDRIVE-1 ; Select drive, LPTR=>params - ASC 'FREE' - DB $80 - DW FSCFREE-1 ; FREE , LPTR=>params - ASC 'ACCESS' - DB $80 - DW FSCACCESS-1 ; ACCESS , LPTR=>params - ASC 'TITLE' - DB $80 - DW FSCTITLE-1 ; TITLE () , LPTR=>params - ASC 'DESTROY' - DB $80 - DW FSCDESTROY-1 ; DESTROY <objlist>, LPTR=>params - ASC 'COPY' - DB $80 - DW FSCCOPY-1 ; COPY <source> <dest>, LPTR=>params +FSCCOMMAND ASC 'CHDIR' + DB $80 + DW FSCCHDIR-1 ; Change directory, LPTR=>params + ASC 'CD' + DB $80 + DW FSCCHDIR-1 ; Change directory, LPTR=>params + ASC 'DIR' + DB $80 + DW FSCCHDIR-1 ; Change directory, LPTR=>params + ASC 'DRIVE' + DB $80 + DW FSCDRIVE-1 ; Select drive, LPTR=>params + ASC 'FREE' + DB $80 + DW FSCFREE-1 ; FREE <drive>, LPTR=>params + ASC 'ACCESS' + DB $80 + DW FSCACCESS-1 ; ACCESS <objlist> <access>, LPTR=>params + ASC 'TITLE' + DB $80 + DW FSCTITLE-1 ; TITLE (<drive>) <title>, LPTR=>params + ASC 'DESTROY' + DB $80 + DW FSCDESTROY-1 ; DESTROY <objlist>, LPTR=>params + ASC 'COPY' + DB $80 + DW FSCCOPY-1 ; COPY <source> <dest>, LPTR=>params * - DB $FF ; Terminator + DB $FF ; Terminator * FSC Dispatch Table ******************** -FSCDISPATCH DW FSCOPT-1 ; A=0 - *OPT - DW CHKEOF-1 ; A=1 - Read EOF - DW FSCRUN-1 ; A=2 - */filename - DW FSC03-1 ; A=3 - *command - DW FSCRUN-1 ; A=4 - *RUN - DW FSCCAT-1 ; A=5 - *CAT - DW FSCUKN-1 ; A=6 - DW FSCUKN-1 ; A=7 - DW FSCUKN-1 ; A=8 - DW FSCCAT-1 ; A=9 - *EX - DW FSCCAT-1 ; A=10 - *INFO - DW FSCUKN-1 ; A=11 - DW FSCRENAME-1 ; A=12 - *RENAME +FSCDISPATCH DW FSCOPT-1 ; A=0 - *OPT + DW CHKEOF-1 ; A=1 - Read EOF + DW FSCRUN-1 ; A=2 - */filename + DW FSC03-1 ; A=3 - *command + DW FSCRUN-1 ; A=4 - *RUN + DW FSCCAT-1 ; A=5 - *CAT + DW FSCUKN-1 ; A=6 + DW FSCUKN-1 ; A=7 + DW FSCUKN-1 ; A=8 + DW FSCCAT-1 ; A=9 - *EX + DW FSCCAT-1 ; A=10 - *INFO + DW FSCUKN-1 ; A=11 + DW FSCRENAME-1 ; A=12 - *RENAME * OSFSC - miscellanous file system calls ***************************************** @@ -305,39 +305,39 @@ FSCDISPATCH DW FSCOPT-1 ; A=0 - *OPT * A=0 if implemented * X,Y=any return values * -FSCHND CMP #13 - BCS FSCUKN - STA FSAREG - STX FSXREG - STY FSYREG - ASL A - TAX - LDA FSCDISPATCH+1,X - PHA - LDA FSCDISPATCH+0,X - PHA -FSCNULL LDA FSAREG - LDY FSYREG - LDX FSXREG ; Set EQ/NE from X +FSCHND CMP #13 + BCS FSCUKN + STA FSAREG + STX FSXREG + STY FSYREG + ASL A + TAX + LDA FSCDISPATCH+1,X + PHA + LDA FSCDISPATCH+0,X + PHA +FSCNULL LDA FSAREG + LDY FSYREG + LDX FSXREG ; Set EQ/NE from X FSCUKN -FSCRET RTS +FSCRET RTS * OSFSC 00 - *OPT function * Entered with A=$00 and EQ/NE from X -FSCOPT BEQ :OPT0 - CPX #$05 - BCS :OPTNULL - CPY #$04 - BCS :OPTNULL - LDA FSFLAG2 - AND :OPTMSK-1,X - EOR :OPTSET-0,Y - AND :OPTMSK-1,X - EOR :OPTSET-0,Y -:OPT0 STA FSFLAG2 -:OPTNULL RTS -:OPTMSK DB $3F,$CF,$F3,$FC -:OPTSET DB $00,$55,$AA,$FF +FSCOPT BEQ :OPT0 + CPX #$05 + BCS :OPTNULL + CPY #$04 + BCS :OPTNULL + LDA FSFLAG2 + AND :OPTMSK-1,X + EOR :OPTSET-0,Y + AND :OPTMSK-1,X + EOR :OPTSET-0,Y +:OPT0 STA FSFLAG2 +:OPTNULL RTS +:OPTMSK DB $3F,$CF,$F3,$FC +:OPTSET DB $00,$55,$AA,$FF *FSCUKN * DO DEBUG @@ -357,236 +357,236 @@ FSCOPT BEQ :OPT0 * OSFSC 01 - Read EOF function * X=File ref number * -CHKEOF TXA ; A=channel - >>> XF2MAIN,FILEEOF -CHKEOFRET >>> ENTAUX - TAX ; Return code -> X - TYA ; Y=any ProDOS error - JMP CHKERROR +CHKEOF TXA ; A=channel + >>> XF2MAIN,FILEEOF +CHKEOFRET >>> ENTAUX + TAX ; Return code -> X + TYA ; Y=any ProDOS error + JMP CHKERROR * OSFSC 03 - *command, fall back to *RUN command * XY=>command line * -FSC03 JSR XYtoLPTR - LDX #<FSCCOMMAND - LDY #>FSCCOMMAND - JSR CLILOOKUP - BEQ FSCRET ; Matched, return - JSR LPTRtoXY ; Fall through to *RUN - LDA #$FE ; Will become A=$05 +FSC03 JSR XYtoLPTR + LDX #<FSCCOMMAND + LDY #>FSCCOMMAND + JSR CLILOOKUP + BEQ FSCRET ; Matched, return + JSR LPTRtoXY ; Fall through to *RUN + LDA #$FE ; Will become A=$05 * OSFSC 02 - */filename, OSFSC 04 - *RUN filename * XY=>pathname * -FSCRUN PHA - STX OSFILECB+0 ; Pointer to filename - STY OSFILECB+1 - JSR XYtoLPTR -FSCRUNLP LDA (OSLPTR),Y ; Look for command line - INY - CMP #'!' - BCS FSCRUNLP - DEY - JSR SKIPSPC - JSR LPTRtoXY - STX FSCMDLINE+0 ; Set CMDLINE=>command line - STY FSCMDLINE+1 ; Collected by OSARGS 1,0 - PLA - EOR #$FB ; Convert $FE->$05, $02/$04->$Fx - BMI :FSCRUN2 ; *RUN, go direct to LOAD - JSR :FSCCALL ; Do an initial INFO - DEC A ; $01->$00 - BEQ :FSCRUN2 ; A file, load and run it - JMP FSCNULL ; Not a file, return all preserved -:FSCRUN2 LDA #$FF ; A=LOAD - STA OSFILECB+6 ; Use file's address - JSR :FSCCALL ; LOAD the file - JSR :CALLCODE ; Call the loaded code - LDA #$00 ; A=0 on return - RTS -:FSCCALL LDX #<OSFILECB ; Pointer to control block - LDY #>OSFILECB - JMP OSFILE -:CALLCODE LDA #$01 ; A=1 - entering code - SEC ; Not from RESET - JMP (OSFILECB+6) ; Jump to EXEC addr +FSCRUN PHA + STX OSFILECB+0 ; Pointer to filename + STY OSFILECB+1 + JSR XYtoLPTR +FSCRUNLP LDA (OSLPTR),Y ; Look for command line + INY + CMP #'!' + BCS FSCRUNLP + DEY + JSR SKIPSPC + JSR LPTRtoXY + STX FSCMDLINE+0 ; Set CMDLINE=>command line + STY FSCMDLINE+1 ; Collected by OSARGS 1,0 + PLA + EOR #$FB ; Convert $FE->$05, $02/$04->$Fx + BMI :FSCRUN2 ; *RUN, go direct to LOAD + JSR :FSCCALL ; Do an initial INFO + DEC A ; $01->$00 + BEQ :FSCRUN2 ; A file, load and run it + JMP FSCNULL ; Not a file, return all preserved +:FSCRUN2 LDA #$FF ; A=LOAD + STA OSFILECB+6 ; Use file's address + JSR :FSCCALL ; LOAD the file + JSR :CALLCODE ; Call the loaded code + LDA #$00 ; A=0 on return + RTS +:FSCCALL LDX #<OSFILECB ; Pointer to control block + LDY #>OSFILECB + JMP OSFILE +:CALLCODE LDA #$01 ; A=1 - entering code + SEC ; Not from RESET + JMP (OSFILECB+6) ; Jump to EXEC addr * Display catalog entries and info * A=5 *CAT, A=9 *EX, A=10 *INFO * XY=>pathname * -FSCCAT EOR #$06 - CLC - ROR A ; 01100000=*CAT - ROR A ; 11100000=*EX - ROR A ; 10000000=*INFO - ROR A ; b7=long info - STA FSAREG ; b6=multiple items - JSR PARSNAME ; Copy filename->MOSFILE - LDA FSAREG ; Get ARG back - >>> XF2MAIN,CATALOG -STARCATRET >>> ENTAUX - JSR CHKERROR ; See if error occurred - JSR FORCENL - LDA #0 ; 0=OK - RTS +FSCCAT EOR #$06 + CLC + ROR A ; 01100000=*CAT + ROR A ; 11100000=*EX + ROR A ; 10000000=*INFO + ROR A ; b7=long info + STA FSAREG ; b6=multiple items + JSR PARSNAME ; Copy filename->MOSFILE + LDA FSAREG ; Get ARG back + >>> XF2MAIN,CATALOG +STARCATRET >>> ENTAUX + JSR CHKERROR ; See if error occurred + JSR FORCENL + LDA #0 ; 0=OK + RTS * Print one block of a catalog. Called by CATALOG * Block is in AUXBLK -PRONEBLK >>> ENTAUX - LDA #<AUXBLK+4 ; FSPTR1=>first entry - STA FSPTR1+0 - LDA #>AUXBLK+4 - STA FSPTR1+1 - LDA #13 ; Max 13 entries per block - STA FSNUM -:CATLP LDY #$00 - LDA (FSPTR1),Y ; Get storage type - CMP #$E0 - BCC :NOTKEY ; Not a key block +PRONEBLK >>> ENTAUX + LDA #<AUXBLK+4 ; FSPTR1=>first entry + STA FSPTR1+0 + LDA #>AUXBLK+4 + STA FSPTR1+1 + LDA #13 ; Max 13 entries per block + STA FSNUM +:CATLP LDY #$00 + LDA (FSPTR1),Y ; Get storage type + CMP #$E0 + BCC :NOTKEY ; Not a key block * Print directory name - LDA #<:DIRM - LDY #>:DIRM - JSR PRSTR - SEC -:NOTKEY JSR PRONEENT ; CC=entry, CS=header - CLC ; Step to next entry - LDA FSPTR1+0 - ADC #$27 - STA FSPTR1+0 - LDA FSPTR1+1 - ADC #$00 - STA FSPTR1+1 - DEC FSNUM - BNE :CATLP ; Loop for all entries - >>> XF2MAIN,CATALOGRET -:DIRM ASC 'Directory: ' - DB $00 + LDA #<:DIRM + LDY #>:DIRM + JSR PRSTR + SEC +:NOTKEY JSR PRONEENT ; CC=entry, CS=header + CLC ; Step to next entry + LDA FSPTR1+0 + ADC #$27 + STA FSPTR1+0 + LDA FSPTR1+1 + ADC #$00 + STA FSPTR1+1 + DEC FSNUM + BNE :CATLP ; Loop for all entries + >>> XF2MAIN,CATALOGRET +:DIRM ASC 'Directory: ' + DB $00 * Print a single directory entry * On entry: A = dirent index in AUXBLK * CC=entry, CS=header -PRONEENT LDY #$00 ; Characters printed - LDA (FSPTR1),Y - AND #$0F ; Len of filename - BEQ NULLENT ; Inactive entry - PHP - TAX -:L2 INY - LDA (FSPTR1),Y - JSR OSWRCH ; Print filename - DEX - BNE :L2 -:S2 PLP - BCS :EXITHDR ; Header entry, no info - JSR PRSPACES ; Pad after filename - BIT FSAREG - BMI :CATINFO ; Display object info - JMP PRACCESS -:EXITHDR JMP OSNEWL +PRONEENT LDY #$00 ; Characters printed + LDA (FSPTR1),Y + AND #$0F ; Len of filename + BEQ NULLENT ; Inactive entry + PHP + TAX +:L2 INY + LDA (FSPTR1),Y + JSR OSWRCH ; Print filename + DEX + BNE :L2 +:S2 PLP + BCS :EXITHDR ; Header entry, no info + JSR PRSPACES ; Pad after filename + BIT FSAREG + BMI :CATINFO ; Display object info + JMP PRACCESS +:EXITHDR JMP OSNEWL * Print object catalog info -:CATINFO LDY #$21 - LDX #3 - LDA #0 - JSR PRADDR0 - LDA #'+' - JSR OSWRCH - LDY #$17 - JSR PRADDR - JSR PRSPACE - JSR PRACCESS - BIT FSFLAG2 - BMI CATLONG ; *OPT 1,2 - detailed EX display - LDY #$0A -PRSPACES JSR PRSPACE - INY - CPY #$10 - BCC PRSPACES -NULLENT RTS +:CATINFO LDY #$21 + LDX #3 + LDA #0 + JSR PRADDR0 + LDA #'+' + JSR OSWRCH + LDY #$17 + JSR PRADDR + JSR PRSPACE + JSR PRACCESS + BIT FSFLAG2 + BMI CATLONG ; *OPT 1,2 - detailed EX display + LDY #$0A +PRSPACES JSR PRSPACE + INY + CPY #$10 + BCC PRSPACES +NULLENT RTS * Print extended catalog info -CATLONG LDY #$21 - JSR PRDATETIME - LDY #$18 - JSR PRDATETIME - JMP OSNEWL -PRDATETIME JSR PRSPACE - JSR PRSPACE - LDA (FSPTR1),Y - PHA - AND #$1F - JSR PRDECSLH ; Day - INY - LDA (FSPTR1),Y - ASL A - PLA - ROL A - ROL A - ROL A - ROL A - AND #$0F - JSR PRDECSLH ; Month - LDA (FSPTR1),Y - PHA - CMP #80 - LDA #$19 - BCS :CENTURY - LDA #$20 -:CENTURY JSR PRHEX ; Century - PLA - LSR A - JSR PRDEC ; Year - JSR PRSPACE - INY - INY - LDA (FSPTR1),Y - JSR PRDEC ; Hour - LDA #$3A - JSR OSWRCH - DEY - LDA (FSPTR1),Y ; Minute -PRDEC TAX - LDA #$99 - SED -:PRDECLP CLC - ADC #$01 - DEX - BPL :PRDECLP - CLD - JMP PRHEX -PRDECSLH JSR PRDEC - LDA #'/' - JMP OSWRCH +CATLONG LDY #$21 + JSR PRDATETIME + LDY #$18 + JSR PRDATETIME + JMP OSNEWL +PRDATETIME JSR PRSPACE + JSR PRSPACE + LDA (FSPTR1),Y + PHA + AND #$1F + JSR PRDECSLH ; Day + INY + LDA (FSPTR1),Y + ASL A + PLA + ROL A + ROL A + ROL A + ROL A + AND #$0F + JSR PRDECSLH ; Month + LDA (FSPTR1),Y + PHA + CMP #80 + LDA #$19 + BCS :CENTURY + LDA #$20 +:CENTURY JSR PRHEX ; Century + PLA + LSR A + JSR PRDEC ; Year + JSR PRSPACE + INY + INY + LDA (FSPTR1),Y + JSR PRDEC ; Hour + LDA #$3A + JSR OSWRCH + DEY + LDA (FSPTR1),Y ; Minute +PRDEC TAX + LDA #$99 + SED +:PRDECLP CLC + ADC #$01 + DEX + BPL :PRDECLP + CLD + JMP PRHEX +PRDECSLH JSR PRDEC + LDA #'/' + JMP OSWRCH * Print object access string -PRACCESS LDX #$04 ; Offset to 'D' char - LDY #$00 - LDA (FSPTR1),Y - CMP #$D0 ; CS=Directory - LDY #$1E - LDA (FSPTR1),Y ; Permission byte - LDY #$0C ; Char counter - EOR #$C0 +PRACCESS LDX #$04 ; Offset to 'D' char + LDY #$00 + LDA (FSPTR1),Y + CMP #$D0 ; CS=Directory + LDY #$1E + LDA (FSPTR1),Y ; Permission byte + LDY #$0C ; Char counter + EOR #$C0 * AND #$E3 ; Keep LLB---WR - AND #$C3 ; Keep LL----WR - BCC :PRACC1 ; Not a directory - AND #$FC ; Drop 'WR' bits -:PRACC1 STA FSACCBYTE - BCS :PRACC2 ; Jump to print 'D' -:PRACCLP LDA FSACCBYTE - AND ACCESSBITS,X ; Is bit set? - BEQ :PRACC3 -:PRACC2 LDA ACCESSCHRS,X ; If so, print character - JSR OSWRCH - INY ; Inc. char counter -:PRACC3 DEX - BPL :PRACCLP ; Loop for all chars - JMP PRSPACES ; Pad - + AND #$C3 ; Keep LL----WR + BCC :PRACC1 ; Not a directory + AND #$FC ; Drop 'WR' bits +:PRACC1 STA FSACCBYTE + BCS :PRACC2 ; Jump to print 'D' +:PRACCLP LDA FSACCBYTE + AND ACCESSBITS,X ; Is bit set? + BEQ :PRACC3 +:PRACC2 LDA ACCESSCHRS,X ; If so, print character + JSR OSWRCH + INY ; Inc. char counter +:PRACC3 DEX + BPL :PRACCLP ; Loop for all chars + JMP PRSPACES ; Pad + * LDX #$04 ; Offset to chars * LDY #$1E * LDA (FSPTR1),Y @@ -622,307 +622,307 @@ PRACCESS LDX #$04 ; Offset to 'D' char *:PRSPACE INY * JMP OSWRCH -ACCESSCHRS ASC 'RWBLD' -ACCESSBITS DB $01,$02,$20,$C0,$00 +ACCESSCHRS ASC 'RWBLD' +ACCESSBITS DB $01,$02,$20,$C0,$00 * Print object addresses -PRADDR LDX #3 -PRADDRLP LDA (FSPTR1),Y -PRADDR0 JSR OUTHEX - DEY - DEX - BNE PRADDRLP -PRADDROK RTS -PRSPACE LDA #' ' -PRCHAR JMP OSWRCH +PRADDR LDX #3 +PRADDRLP LDA (FSPTR1),Y +PRADDR0 JSR OUTHEX + DEY + DEX + BNE PRADDRLP +PRADDROK RTS +PRSPACE LDA #' ' +PRCHAR JMP OSWRCH * OSFSC $0C - RENAME function * XY=>pathnames * -FSCRENAME JSR PARSNAME ; Copy Arg1->MOSFILE - BEQ :SYNTAX ; No <oldname> - JSR PARSLPTR2 ; Copy Arg2->MOSFILE2 - BEQ :SYNTAX ; No <newname> - >>> XF2MAIN,RENFILE -:SYNTAX BRK - DB $DC - ASC 'Syntax: RENAME <oldspec> <newspec>' - BRK +FSCRENAME JSR PARSNAME ; Copy Arg1->MOSFILE + BEQ :SYNTAX ; No <oldname> + JSR PARSLPTR2 ; Copy Arg2->MOSFILE2 + BEQ :SYNTAX ; No <newname> + >>> XF2MAIN,RENFILE +:SYNTAX BRK + DB $DC + ASC 'Syntax: RENAME <oldspec> <newspec>' + BRK * ProDOS returns $40 (Bad filename) for bad renames. * Not easy to seperate out, so leave as Bad filename error. ACCRET RENRET COPYRET DESTRET -CHDIRRET >>> ENTAUX - JMP CHKERROR +CHDIRRET >>> ENTAUX + JMP CHKERROR * Handle *COPY command * LPTR=>parameters string * -FSCCOPY JSR PARSLPTR ; Copy Arg1->MOSFILE - BEQ :SYNTAX ; No <source> - JSR PARSLPTR2 ; Copy Arg2->MOSFILE2 - BEQ :SYNTAX ; No <dest> - >>> XF2MAIN,COPYFILE ; Do the heavy lifting -:SYNTAX BRK - DB $DC - ASC 'Syntax: COPY <srcspec> <destspec>' - BRK +FSCCOPY JSR PARSLPTR ; Copy Arg1->MOSFILE + BEQ :SYNTAX ; No <source> + JSR PARSLPTR2 ; Copy Arg2->MOSFILE2 + BEQ :SYNTAX ; No <dest> + >>> XF2MAIN,COPYFILE ; Do the heavy lifting +:SYNTAX BRK + DB $DC + ASC 'Syntax: COPY <srcspec> <destspec>' + BRK * Handle *DIR/*CHDIR/*CD (directory change) command * LPTR=>parameters string * -FSCCHDIR JSR PARSLPTR ; Copy filename->MOSFILE - BEQ ERRCHDIR ; No <dir> - LDY #$00 ; Y=$00 - CHDIR -FSCCHDIR2 >>> XF2MAIN,SETPFX -ERRCHDIR BRK - DB $DC - ASC 'Syntax: DIR <dir>' - BRK +FSCCHDIR JSR PARSLPTR ; Copy filename->MOSFILE + BEQ ERRCHDIR ; No <dir> + LDY #$00 ; Y=$00 - CHDIR +FSCCHDIR2 >>> XF2MAIN,SETPFX +ERRCHDIR BRK + DB $DC + ASC 'Syntax: DIR <dir>' + BRK * Handle *DRIVE command, which is similar to CHDIR * LPTR=>parameters string * -FSCDRIVE JSR PARSLPTR ; Copy arg->MOSFILE - TAY ; Y<>$00 - DRIVE - BNE FSCCHDIR2 ; Pass on as CHDIR -:SYNTAX BRK - DB $DC - ASC 'Syntax: DRIVE <drv> (eg: DRIVE :61)' - BRK +FSCDRIVE JSR PARSLPTR ; Copy arg->MOSFILE + TAY ; Y<>$00 - DRIVE + BNE FSCCHDIR2 ; Pass on as CHDIR +:SYNTAX BRK + DB $DC + ASC 'Syntax: DRIVE <drv> (eg: DRIVE :61)' + BRK * Handle *FREE command * LPTR=>parameters string * Syntax is FREE (<drv>) * -FSCFREE JSR PARSLPTR ; Copy arg->MOSFILE - >>> XF2MAIN,DRVINFO -FREERET >>> ENTAUX - JSR CHKERROR +FSCFREE JSR PARSLPTR ; Copy arg->MOSFILE + >>> XF2MAIN,DRVINFO +FREERET >>> ENTAUX + JSR CHKERROR * * Disk size is two-byte 512-byte block count * Maximum disk size is $FFFF blocks = 1FFFF00 bytes = 33554176 bytes = 32M-512 -:NOERR SEC - LDA AUXBLK+2 ; LSB of total blocks - SBC AUXBLK+0 ; LSB of blocks used - TAX ; X=b0-b7 of blocks free - LDA AUXBLK+3 ; MSB of total blocks - SBC AUXBLK+1 ; MSB of blocks used - TAY ; Y=b8-b15 of blocks free - LDA #$00 ; A=b16-b23 of blocks free - JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes ' - LDX #<:FREE - LDY #>:FREE - JSR OUTSTR ; Print 'free'<nl> +:NOERR SEC + LDA AUXBLK+2 ; LSB of total blocks + SBC AUXBLK+0 ; LSB of blocks used + TAX ; X=b0-b7 of blocks free + LDA AUXBLK+3 ; MSB of total blocks + SBC AUXBLK+1 ; MSB of blocks used + TAY ; Y=b8-b15 of blocks free + LDA #$00 ; A=b16-b23 of blocks free + JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes ' + LDX #<:FREE + LDY #>:FREE + JSR OUTSTR ; Print 'free'<nl> - LDX AUXBLK+0 ; X=b0-b7 of blocks used - LDY AUXBLK+1 ; Y=b8-b15 of blocks used - LDA #$00 ; A=b16-b23 of blocks used - JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes ' - LDX #<:USED - LDY #>:USED - JMP OUTSTR ; Print 'used'<nl> + LDX AUXBLK+0 ; X=b0-b7 of blocks used + LDY AUXBLK+1 ; Y=b8-b15 of blocks used + LDA #$00 ; A=b16-b23 of blocks used + JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes ' + LDX #<:USED + LDY #>:USED + JMP OUTSTR ; Print 'used'<nl> -:FREEDEC STX FSNUM+1 - STY FSNUM+2 - STA FSNUM+3 +:FREEDEC STX FSNUM+1 + STY FSNUM+2 + STA FSNUM+3 * JSR PRHEX ; Blocks b16-b23 in hex - JSR PR2HEX ; Blocks b0-b15 in hex - LDX #<:BLOCKS - LDY #>:BLOCKS - JSR OUTSTR ; ' blocks ' - STZ FSNUM+0 ; FSNUM=blocks*512 - ASL FSNUM+1 - ROL FSNUM+2 - ROL FSNUM+3 - LDX #FSNUM ; X=>number to print - LDY #8 ; Y=pad up to 8 digits - JSR PRINTDEC ; Print it in decimal - LDX #<:BYTES - LDY #>:BYTES - JMP OUTSTR ; ' bytes ' -:BLOCKS ASC ' blocks ' - DB 0 -:BYTES ASC ' bytes ' - DB 0 -:FREE ASC 'free' - DB 13,0 -:USED ASC 'used' - DB 13,0 + JSR PR2HEX ; Blocks b0-b15 in hex + LDX #<:BLOCKS + LDY #>:BLOCKS + JSR OUTSTR ; ' blocks ' + STZ FSNUM+0 ; FSNUM=blocks*512 + ASL FSNUM+1 + ROL FSNUM+2 + ROL FSNUM+3 + LDX #FSNUM ; X=>number to print + LDY #8 ; Y=pad up to 8 digits + JSR PRINTDEC ; Print it in decimal + LDX #<:BYTES + LDY #>:BYTES + JMP OUTSTR ; ' bytes ' +:BLOCKS ASC ' blocks ' + DB 0 +:BYTES ASC ' bytes ' + DB 0 +:FREE ASC 'free' + DB 13,0 +:USED ASC 'used' + DB 13,0 * Handle *ACCESS command * LPTR=>parameters string * -FSCACCESS JSR PARSLPTR ; Copy filename->MOSFILE - BEQ :SYNTAX ; No filename - STZ FSACCBYTE ; Initialise access to "" -:ACCESSLP1 LDA (OSLPTR),Y ; Get access character - CMP #$0D - BEQ :ACCESSGO ; End of line, action it - INY - AND #$DF ; Upper case - LDX #$04 ; Check five chars 'DLBWR' -:ACCESSLP2 CMP ACCESSCHRS,X - BNE :ACCESSNXT - LDA ACCESSBITS,X ; Add this to access mask - ORA FSACCBYTE - STA FSACCBYTE -:ACCESSNXT DEX - BPL :ACCESSLP2 - BMI :ACCESSLP1 ; Check next character -:ACCESSGO LDA FSACCBYTE - EOR #$C0 ; MOSFILE=filename, A=access mask - >>> XF2MAIN,SETPERM -:SYNTAX BRK - DB $DC - ASC 'Syntax: ACCESS <listspec> <L|W|R>' - BRK +FSCACCESS JSR PARSLPTR ; Copy filename->MOSFILE + BEQ :SYNTAX ; No filename + STZ FSACCBYTE ; Initialise access to "" +:ACCESSLP1 LDA (OSLPTR),Y ; Get access character + CMP #$0D + BEQ :ACCESSGO ; End of line, action it + INY + AND #$DF ; Upper case + LDX #$04 ; Check five chars 'DLBWR' +:ACCESSLP2 CMP ACCESSCHRS,X + BNE :ACCESSNXT + LDA ACCESSBITS,X ; Add this to access mask + ORA FSACCBYTE + STA FSACCBYTE +:ACCESSNXT DEX + BPL :ACCESSLP2 + BMI :ACCESSLP1 ; Check next character +:ACCESSGO LDA FSACCBYTE + EOR #$C0 ; MOSFILE=filename, A=access mask + >>> XF2MAIN,SETPERM +:SYNTAX BRK + DB $DC + ASC 'Syntax: ACCESS <listspec> <L|W|R>' + BRK * Handle *DESTROY command * LPTR=>parameters string * FSCDESTROY -DESTROY JSR PARSLPTR ; Copy filename->MOSFILE - BEQ :SYNTAX ; No filename - >>> XF2MAIN,MULTIDEL -:SYNTAX BRK - DB $DC - ASC 'Syntax: DESTROY <listspec>' - BRK +DESTROY JSR PARSLPTR ; Copy filename->MOSFILE + BEQ :SYNTAX ; No filename + >>> XF2MAIN,MULTIDEL +:SYNTAX BRK + DB $DC + ASC 'Syntax: DESTROY <listspec>' + BRK * Handle *TITLE command * LPTR=>parameters string * Syntax: *TITLE (<drive>) <title> * -FSCTITLE RTS +FSCTITLE RTS * Parse filename pointed to by XY * Write filename to MOSFILE in main memory * Returns length in A with EQ/NE set -PARSNAME JSR XYtoLPTR -PARSLPTR CLC ; Means parsing a filename - JSR GSINIT ; Init general string handling - PHP - SEI ; Disable IRQs - LDX #$00 ; Length -:L1 JSR GSREAD ; Handle next char - BCS :DONE - STA $C004 ; Write to main mem - STA MOSFILE+1,X - STA $C005 ; Write to aux mem - INX - CPX #$40 - BNE :L1 ; Name not too long - TXA ; $40=Bad filename - JMP MKERROR -:DONE STA $C004 ; Write to main mem - STX MOSFILE ; Length byte (Pascal) - STA $C005 ; Back to aux - PLP ; IRQs back as they were - TXA ; Return len in A - RTS +PARSNAME JSR XYtoLPTR +PARSLPTR CLC ; Means parsing a filename + JSR GSINIT ; Init general string handling + PHP + SEI ; Disable IRQs + LDX #$00 ; Length +:L1 JSR GSREAD ; Handle next char + BCS :DONE + STA $C004 ; Write to main mem + STA MOSFILE+1,X + STA $C005 ; Write to aux mem + INX + CPX #$40 + BNE :L1 ; Name not too long + TXA ; $40=Bad filename + JMP MKERROR +:DONE STA $C004 ; Write to main mem + STX MOSFILE ; Length byte (Pascal) + STA $C005 ; Back to aux + PLP ; IRQs back as they were + TXA ; Return len in A + RTS * Parse filename pointed to by (OSLPTR),Y * Write filename to MOSFILE2 in main memory * Returns length in A with EQ/NE set -PARSNAME2 JSR XYtoLPTR -PARSLPTR2 CLC ; Means parsing a filename - JSR GSINIT ; Init gen string handling - PHP - SEI ; Disable IRQs - LDX #$00 ; Length -:L1 JSR GSREAD ; Handle next char - BCS :DONE - STA $C004 ; Write to main mem - STA MOSFILE2+1,X - STA $C005 ; Write to aux mem - INX - CPX #$40 - BNE :L1 ; Name not too long - TXA ; $40=Bad filename - JMP MKERROR -:DONE STA $C004 ; Write to main mem - STX MOSFILE2 ; Length byte (Pascal) - STA $C005 ; Back to aux - PLP ; IRQs back as they were - TXA ; Return len in A -NOTERROR RTS +PARSNAME2 JSR XYtoLPTR +PARSLPTR2 CLC ; Means parsing a filename + JSR GSINIT ; Init gen string handling + PHP + SEI ; Disable IRQs + LDX #$00 ; Length +:L1 JSR GSREAD ; Handle next char + BCS :DONE + STA $C004 ; Write to main mem + STA MOSFILE2+1,X + STA $C005 ; Write to aux mem + INX + CPX #$40 + BNE :L1 ; Name not too long + TXA ; $40=Bad filename + JMP MKERROR +:DONE STA $C004 ; Write to main mem + STX MOSFILE2 ; Length byte (Pascal) + STA $C005 ; Back to aux + PLP ; IRQs back as they were + TXA ; Return len in A +NOTERROR RTS -ERRNOTFND LDA #$46 ; File not found +ERRNOTFND LDA #$46 ; File not found * Check returned code for return code or error code * A<$20 - return to user, A>$1F - generate error * -CHKERROR CMP #$20 - BCC NOTERROR +CHKERROR CMP #$20 + BCC NOTERROR MKERROR - DO DEBUG - BIT $E0 - BPL MKERROR1 ; *DEBUG* - PHA - LDX #15 -MKERRLP LDA ERRMSG,X - STA $100,X - DEX - BPL MKERRLP - PLA - PHA - LSR A - LSR A - LSR A - LSR A - JSR ERRHEX - STA $108 - PLA - JSR ERRHEX - STA $109 - JMP $100 -ERRHEX AND #15 - CMP #10 - BCC ERRHEX1 - ADC #6 -ERRHEX1 ADC #48 - RTS -ERRMSG BRK - DB $FF - ASC 'ERR: $00' - BRK - FIN + DO DEBUG + BIT $E0 + BPL MKERROR1 ; *DEBUG* + PHA + LDX #15 +MKERRLP LDA ERRMSG,X + STA $100,X + DEX + BPL MKERRLP + PLA + PHA + LSR A + LSR A + LSR A + LSR A + JSR ERRHEX + STA $108 + PLA + JSR ERRHEX + STA $109 + JMP $100 +ERRHEX AND #15 + CMP #10 + BCC ERRHEX1 + ADC #6 +ERRHEX1 ADC #48 + RTS +ERRMSG BRK + DB $FF + ASC 'ERR: $00' + BRK + FIN * Translate ProDOS error code into BBC error -MKERROR1 CMP #$40 - BCS MKERROR2 - ORA #$30 ; <$40 -> $30-$3F -MKERROR2 SEC - SBC #$38 - CMP #$28 - BCC MKERROR3 ; $28-$30, $40-$5F - LDA #$27 ; Otherwise I/O error -MKERROR3 ASL A - TAX - LDA MKERROR4+1,X - PHA - LDA MKERROR4+0,X - PHA - PHP - RTI -MKERROR4 DW ERROR28,ERROR27,ERROR2A,ERROR2B,ERROR2C,ERROR27,ERROR2E,ERROR27 - DW ERROR40,ERROR41,ERROR42,ERROR43,ERROR44,ERROR45,ERROR46,ERROR47 - DW ERROR48,ERROR49,ERROR4A,ERROR4B,ERROR4C,ERROR4D,ERROR4E,ERROR4F - DW ERROR50,ERROR51,ERROR52,ERROR53,ERROR54,ERROR55,ERROR56,ERROR57 - DW ERROR27,ERROR27,ERROR5A,ERROR27,ERROR27,ERROR27,ERROR5E,ERROR27 +MKERROR1 CMP #$40 + BCS MKERROR2 + ORA #$30 ; <$40 -> $30-$3F +MKERROR2 SEC + SBC #$38 + CMP #$28 + BCC MKERROR3 ; $28-$30, $40-$5F + LDA #$27 ; Otherwise I/O error +MKERROR3 ASL A + TAX + LDA MKERROR4+1,X + PHA + LDA MKERROR4+0,X + PHA + PHP + RTI +MKERROR4 DW ERROR28,ERROR27,ERROR2A,ERROR2B,ERROR2C,ERROR27,ERROR2E,ERROR27 + DW ERROR40,ERROR41,ERROR42,ERROR43,ERROR44,ERROR45,ERROR46,ERROR47 + DW ERROR48,ERROR49,ERROR4A,ERROR4B,ERROR4C,ERROR4D,ERROR4E,ERROR4F + DW ERROR50,ERROR51,ERROR52,ERROR53,ERROR54,ERROR55,ERROR56,ERROR57 + DW ERROR27,ERROR27,ERROR5A,ERROR27,ERROR27,ERROR27,ERROR5E,ERROR27 * $27 - I/O error (disk not formatted) * $28 - No device con'd (drive not present) Drive not present @@ -970,68 +970,69 @@ MKERROR4 DW ERROR28,ERROR27,ERROR2A,ERROR2B,ERROR2C,ERROR27,ERROR2E,ERROR2 * AcornOS ProDOS -ERROR28 DW $D200 - ASC 'Disk not present' ; $28 - No device detected/connected -ERROR2A DW $CD00 - ASC 'Bad drive' ; $2A - Not a drive specifier -ERROR2B DW $C900 - ASC 'Disk write protected'; $2B - Disk write protected -ERROR2C DW $C600 - ASC 'File too big' ; $2C - Too big to save -ERROR2E DW $C800 - ASC 'Disk changed' ; $2E - Disk switched -ERROR40 DW $CC00 - ASC 'Bad filename' ; $40 - Invalid pathname syntax -ERROR41 DW $C400 - ASC 'Is a directory' ; $41 - Duplicate filename (split from $47) -ERROR42 DW $C000 - ASC 'Too many open' ; $42 - File Control Block table full -ERROR43 DW $DE00 - ASC 'Channel not open' ; $43 - Invalid reference number -ERROR44 ; $44 - Path not found -ERROR46 DW $D600 - ASC 'File not found' ; $46 - File not found -ERROR45 DW $D600 - ASC 'Disk not found' ; $45 - Volume directory not found -ERROR47 DW $C400 - ASC 'File exists' ; $47 - Duplicate filename (see also $41) -ERROR48 DW $C600 - ASC 'Disk full' ; $48 - Overrun error -ERROR49 DW $B300 - ASC 'Directory full' ; $49 - Volume directory full -ERROR4A ; $4A - Incompatible file format -ERROR52 DW $C800 - ASC 'Disk not recognised' ; $52 - Not a ProDOS disk -ERROR4B DW $BE00 ; $4B - Unsupported storage_type - ASC 'Not a directory' -ERROR4C DW $DF00 - ASC 'End of file' ; $4C - End of file has been encountered -ERROR4D DW $C100 - ASC 'Not open for update' ; $4D - Position out of range -ERROR4E DW $BD00 - ASC 'Insufficient access' ; $4E - Access error (see also $4F) -ERROR4F DW $C300 - ASC 'Entry locked' ; $4F - Access error (split from $4E) -ERROR50 DW $C200 - ASC 'Can' - DB $27 - ASC 't - file open' ; $50 - File is open -ERROR51 DW $A800 - ASC 'Broken directory' ; $51 - Directory count error -ERROR53 DW $DC00 - ASC 'Invalid parameter' ; $53 - Invalid parameter -ERROR54 DW $D400 - ASC 'Directory not empty' ; $54 - Directory not empty (split from $4E) -ERROR55 DW $FF00 - ASC 'ProDOS: VCB full' ; $55 - Volume Control Block table full -ERROR56 DW $FF00 - ASC 'ProDOS: Bad addr' ; $56 - Bad buffer address -ERROR57 DW $FF00 - ASC 'ProDOS: Dup volm' ; $57 - Duplicate volume -ERROR5A DW $FF00 - ASC 'Sector not found' ; $5A - Bit map disk address is impossible -ERROR5E DW $FD00 - ASC 'Wildcards' ; $5E - Can't use wildcards in dest filename -ERROR27 DW $FF00 - ASC 'I/O error' ; $27 - I/O error - DB $00 +ERROR28 DW $D200 + ASC 'Disk not present' ; $28 - No device detected/connected +ERROR2A DW $CD00 + ASC 'Bad drive' ; $2A - Not a drive specifier +ERROR2B DW $C900 + ASC 'Disk write protected' ; $2B - Disk write protected +ERROR2C DW $C600 + ASC 'File too big' ; $2C - Too big to save +ERROR2E DW $C800 + ASC 'Disk changed' ; $2E - Disk switched +ERROR40 DW $CC00 + ASC 'Bad filename' ; $40 - Invalid pathname syntax +ERROR41 DW $C400 + ASC 'Is a directory' ; $41 - Duplicate filename (split from $47) +ERROR42 DW $C000 + ASC 'Too many open' ; $42 - File Control Block table full +ERROR43 DW $DE00 + ASC 'Channel not open' ; $43 - Invalid reference number +ERROR44 ; $44 - Path not found +ERROR46 DW $D600 + ASC 'File not found' ; $46 - File not found +ERROR45 DW $D600 + ASC 'Disk not found' ; $45 - Volume directory not found +ERROR47 DW $C400 + ASC 'File exists' ; $47 - Duplicate filename (see also $41) +ERROR48 DW $C600 + ASC 'Disk full' ; $48 - Overrun error +ERROR49 DW $B300 + ASC 'Directory full' ; $49 - Volume directory full +ERROR4A ; $4A - Incompatible file format +ERROR52 DW $C800 + ASC 'Disk not recognised' ; $52 - Not a ProDOS disk +ERROR4B DW $BE00 ; $4B - Unsupported storage_type + ASC 'Not a directory' +ERROR4C DW $DF00 + ASC 'End of file' ; $4C - End of file has been encountered +ERROR4D DW $C100 + ASC 'Not open for update' ; $4D - Position out of range +ERROR4E DW $BD00 + ASC 'Insufficient access' ; $4E - Access error (see also $4F) +ERROR4F DW $C300 + ASC 'Entry locked' ; $4F - Access error (split from $4E) +ERROR50 DW $C200 + ASC 'Can' + DB $27 + ASC 't - file open' ; $50 - File is open +ERROR51 DW $A800 + ASC 'Broken directory' ; $51 - Directory count error +ERROR53 DW $DC00 + ASC 'Invalid parameter' ; $53 - Invalid parameter +ERROR54 DW $D400 + ASC 'Directory not empty' ; $54 - Directory not empty (split from $4E) +ERROR55 DW $FF00 + ASC 'ProDOS: VCB full' ; $55 - Volume Control Block table full +ERROR56 DW $FF00 + ASC 'ProDOS: Bad addr' ; $56 - Bad buffer address +ERROR57 DW $FF00 + ASC 'ProDOS: Dup volm' ; $57 - Duplicate volume +ERROR5A DW $FF00 + ASC 'Sector not found' ; $5A - Bit map disk address is impossible +ERROR5E DW $FD00 + ASC 'Wildcards' ; $5E - Can't use wildcards in dest filename +ERROR27 DW $FF00 + ASC 'I/O error' ; $27 - I/O error + DB $00 + diff --git a/auxmem.init.s b/auxmem.init.s index 1129e9e..8fbf24f 100644 --- a/auxmem.init.s +++ b/auxmem.init.s @@ -132,15 +132,15 @@ MOSHIGH SEI LDA #7 JSR OSWRCH JSR OSNEWL - LDX MAXROM ; TEMP X=language to enter + LDX MAXROM ; TEMP X=language to enter CLC * OSBYTE $8E - Enter language ROM * X=ROM number to select * BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET - JSR ROMSELECT ; Bring ROM X into memory - STX BYTEVARBASE+$FC ; Set current language ROM + JSR ROMSELECT ; Bring ROM X into memory + STX BYTEVARBASE+$FC ; Set current language ROM LDA #$00 STA FAULT+0 LDA #$80 @@ -157,10 +157,10 @@ BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET * OSBYTE $8F - Issue service call * X=service call, Y=parameter * -SERVICE TAX ; Enter here with A=Service Num +SERVICE TAX ; Enter here with A=Service Num BYTE8F SERVICEX LDA $F4 - PHA ; Save current ROM + PHA ; Save current ROM * LDA $E0 ; *DEBUG* * AND #$20 @@ -174,22 +174,22 @@ SERVICEX LDA $F4 *:SERVDEBUG TXA - LDX MAXROM ; Start at highest ROM -:SERVLP JSR ROMSELECT ; Bring it into memory + LDX MAXROM ; Start at highest ROM +:SERVLP JSR ROMSELECT ; Bring it into memory BIT $8006 - BPL :SERVSKIP ; No service entry - JSR $8003 ; Call service entry + BPL :SERVSKIP ; No service entry + JSR $8003 ; Call service entry TAX BEQ :SERVDONE -:SERVSKIP LDX $F4 ; Restore X=current ROM - DEX ; Step down to next - BPL :SERVLP ; Loop until ROM 0 done -:SERVDONE PLA ; Get caller's ROM back - PHX ; Save return from service call +:SERVSKIP LDX $F4 ; Restore X=current ROM + DEX ; Step down to next + BPL :SERVLP ; Loop until ROM 0 done +:SERVDONE PLA ; Get caller's ROM back + PHX ; Save return from service call TAX - JSR ROMSELECT ; Restore caller's ROM - PLX ; Get return value back - TXA ; Return in A and X and set EQ/NE + JSR ROMSELECT ; Restore caller's ROM + PLX ; Get return value back + TXA ; Return in A and X and set EQ/NE RTS @@ -208,3 +208,5 @@ HELLO ASC 'Applecorn MOS 2021-11-04' DB $00 ; Unify MOS messages + + diff --git a/auxmem.misc.s b/auxmem.misc.s index 2bce254..2767f73 100644 --- a/auxmem.misc.s +++ b/auxmem.misc.s @@ -689,3 +689,5 @@ AUXBLK ASC '**ENDOFCODE**' + + diff --git a/auxmem.mosequ.s b/auxmem.mosequ.s index 4078e53..e02aed9 100644 --- a/auxmem.mosequ.s +++ b/auxmem.mosequ.s @@ -17,34 +17,34 @@ * $EF-$FF MOS API workspace * DEBUG EQU $00 ; $00=*OPT 255 debug code removed -DEBUG EQU $E0 ; $E0=*OPT 255 debug code included +DEBUG EQU $E0 ; $E0=*OPT 255 debug code included * ; $E1 -FSFLAG1 EQU $E2 ; $E2 -FSFLAG2 EQU $E3 ; $E3 HOSTFS *OPT settings -GSFLAG EQU $E4 ; $E4 GSREAD processing flags -GSCHAR EQU $E5 ; $E5 GSREAD accumulator -OSTEXT EQU $E6 ; $E6 => text string $E6 OSNUM+0 -MAXLEN EQU OSTEXT+2 ; $E8 $E8 OSNUM+2 -MINCHAR EQU OSTEXT+3 ; $E9 $E9 OSNUM+3 -MAXCHAR EQU OSTEXT+4 ; $EA $EA OSPAD -OSTEMP EQU $EB ; $EB $EB OSTEMP -OSKBD1 EQU $EC ; $EC kbd ws -OSKBD2 EQU OSKBD1+1 ; $ED kbd ws -OSKBD3 EQU OSKBD1+2 ; $EE kbd ws -OSAREG EQU $EF ; $EF A register -OSXREG EQU OSAREG+1 ; $F0 X register -OSYREG EQU OSXREG+1 ; $F1 Y register -OSCTRL EQU OSXREG ; $F0 (XY)=>control block -OSLPTR EQU $F2 ; $F2 => command line -ROMID EQU $F4 ; $F4 current ROM -ROMTMP EQU $F5 ; $F5 -ROMPTR EQU $F6 ; $F6 => +FSFLAG1 EQU $E2 ; $E2 +FSFLAG2 EQU $E3 ; $E3 HOSTFS *OPT settings +GSFLAG EQU $E4 ; $E4 GSREAD processing flags +GSCHAR EQU $E5 ; $E5 GSREAD accumulator +OSTEXT EQU $E6 ; $E6 => text string $E6 OSNUM+0 +MAXLEN EQU OSTEXT+2 ; $E8 $E8 OSNUM+2 +MINCHAR EQU OSTEXT+3 ; $E9 $E9 OSNUM+3 +MAXCHAR EQU OSTEXT+4 ; $EA $EA OSPAD +OSTEMP EQU $EB ; $EB $EB OSTEMP +OSKBD1 EQU $EC ; $EC kbd ws +OSKBD2 EQU OSKBD1+1 ; $ED kbd ws +OSKBD3 EQU OSKBD1+2 ; $EE kbd ws +OSAREG EQU $EF ; $EF A register +OSXREG EQU OSAREG+1 ; $F0 X register +OSYREG EQU OSXREG+1 ; $F1 Y register +OSCTRL EQU OSXREG ; $F0 (XY)=>control block +OSLPTR EQU $F2 ; $F2 => command line +ROMID EQU $F4 ; $F4 current ROM +ROMTMP EQU $F5 ; $F5 +ROMPTR EQU $F6 ; $F6 => * ; $F8 *TEMP* pseudo-SROM settings * ; $F9 *TEMP* pseudo-SROM settings -OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off -OSINTA EQU $FC ; $FC IRQ register A store -FAULT EQU $FD ; $FD Error message pointer -ESCFLAG EQU $FF ; $FF Escape status +OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off +OSINTA EQU $FC ; $FC IRQ register A store +FAULT EQU $FD ; $FD Error message pointer +ESCFLAG EQU $FF ; $FF Escape status * $0200-$0235 Vectors @@ -52,25 +52,27 @@ ESCFLAG EQU $FF ; $FF Escape status * $0290-$02ED * $02EE-$02FF MOS control block -USERV EQU $200 ; USER vector -BRKV EQU $202 ; BRK vector -CLIV EQU $208 ; OSCLI vector -BYTEV EQU $20A ; OSBYTE vector -WORDV EQU $20C ; OSWORD vector -WRCHV EQU $20E ; OSWRCH vector -RDCHV EQU $210 ; OSRDCH vector -FILEV EQU $212 ; OSFILE vector -ARGSV EQU $214 ; OSARGS vector -BGETV EQU $216 ; OSBGET vector -BPUTV EQU $218 ; OSBPUT vector -GBPBV EQU $21A ; OSGBPB vector -FINDV EQU $21C ; OSFIND vector -FSCV EQU $21E ; FSCV misc file ops +USERV EQU $200 ; USER vector +BRKV EQU $202 ; BRK vector +CLIV EQU $208 ; OSCLI vector +BYTEV EQU $20A ; OSBYTE vector +WORDV EQU $20C ; OSWORD vector +WRCHV EQU $20E ; OSWRCH vector +RDCHV EQU $210 ; OSRDCH vector +FILEV EQU $212 ; OSFILE vector +ARGSV EQU $214 ; OSARGS vector +BGETV EQU $216 ; OSBGET vector +BPUTV EQU $218 ; OSBPUT vector +GBPBV EQU $21A ; OSGBPB vector +FINDV EQU $21C ; OSFIND vector +FSCV EQU $21E ; FSCV misc file ops -BYTEVARBASE EQU $190 ; Base of OSBYTE variables -OSFILECB EQU $2EE ; OSFILE control block -OSGBPBCB EQU OSFILECB+1 ; OSGBPB control block +BYTEVARBASE EQU $190 ; Base of OSBYTE variables +OSFILECB EQU $2EE ; OSFILE control block +OSGBPBCB EQU OSFILECB+1 ; OSGBPB control block * $0300-$03DF * $03E0-$03FF Used for interfacing with ProDOS XFER + + diff --git a/auxmem.oscli.s b/auxmem.oscli.s index 6de9808..416fba2 100644 --- a/auxmem.oscli.s +++ b/auxmem.oscli.s @@ -513,3 +513,5 @@ ECHOLP1 JSR GSREAD + + diff --git a/auxmem.vdu.s b/auxmem.vdu.s index 1125b8e..0a213ee 100644 --- a/auxmem.vdu.s +++ b/auxmem.vdu.s @@ -1008,3 +1008,5 @@ VDU01 RTS + + diff --git a/mainmem.fsequ.s b/mainmem.fsequ.s index f0c2f4d..0375ee1 100644 --- a/mainmem.fsequ.s +++ b/mainmem.fsequ.s @@ -89,6 +89,8 @@ GEOFCMD EQU $D1 + + diff --git a/mainmem.gfx.s b/mainmem.gfx.s index 9a21dab..a286def 100644 --- a/mainmem.gfx.s +++ b/mainmem.gfx.s @@ -228,6 +228,8 @@ MHGRTAB DW $2000,$2080,$2100,$2180,$2200,$2280,$2300,$2380 + + diff --git a/mainmem.init.s b/mainmem.init.s index 5865ee6..0875d37 100644 --- a/mainmem.init.s +++ b/mainmem.init.s @@ -135,6 +135,8 @@ RESET TSX + + diff --git a/mainmem.ldr.s b/mainmem.ldr.s index 43177a9..302e9d6 100644 --- a/mainmem.ldr.s +++ b/mainmem.ldr.s @@ -16,6 +16,8 @@ START JSR CROUT LDA #$20 ; PAGE2 shadow on ROM3 GS TRB $C035 + STZ $C073 ; Force RamWorks bank zero + JSR ROMMENU * LDA #>AUXADDR ; Address in aux * LDX #<AUXADDR @@ -176,4 +178,6 @@ LOADCODE PHP ; Save carry flag + + diff --git a/mainmem.lists.s b/mainmem.lists.s index 375edee..b1ced8b 100644 --- a/mainmem.lists.s +++ b/mainmem.lists.s @@ -131,6 +131,8 @@ QUITPL HEX 04 ; Number of parameters + + diff --git a/mainmem.menu.s b/mainmem.menu.s index 4db7054..b690661 100644 --- a/mainmem.menu.s +++ b/mainmem.menu.s @@ -103,3 +103,5 @@ USERSEL DB $00 + + diff --git a/mainmem.misc.s b/mainmem.misc.s index 10716ce..b4b2c46 100644 --- a/mainmem.misc.s +++ b/mainmem.misc.s @@ -7,179 +7,181 @@ * A1L/A1H: Start address * A2L/A2H: End address * A4L/A4H: Destination start address -MEMCPY LDA (A1L) - STA (A4L) - LDA A1H - CMP A2H - BNE :S1 - LDA A1L - CMP A2L - BNE :S1 -:DONE RTS -:S1 INC A1L - BNE :S2 - INC A1H -:S2 INC A4L - BNE :S3 - INC A4H -:S3 BRA MEMCPY +MEMCPY LDA (A1L) + STA (A4L) + LDA A1H + CMP A2H + BNE :S1 + LDA A1L + CMP A2L + BNE :S1 +:DONE RTS +:S1 INC A1L + BNE :S2 + INC A1H +:S2 INC A4L + BNE :S3 + INC A4H +:S3 BRA MEMCPY * Copy 512 bytes from BLKBUF to AUXBLK in aux LC -COPYAUXBLK >>> ALTZP ; Alt ZP & Alt LC on - LDY #$00 - STA $C005 ; Write aux mem -:L1 LDA BLKBUF+$000,Y - STA AUXBLK+$000,Y - LDA BLKBUF+$100,Y - STA AUXBLK+$100,Y - INY - BNE :L1 - STA $C004 ; Write main mem -:S2 >>> MAINZP ; Alt ZP off, ROM back in - RTS +COPYAUXBLK >>> ALTZP ; Alt ZP & Alt LC on + LDY #$00 + STA $C005 ; Write aux mem +:L1 LDA BLKBUF+$000,Y + STA AUXBLK+$000,Y + LDA BLKBUF+$100,Y + STA AUXBLK+$100,Y + INY + BNE :L1 + STA $C004 ; Write main mem +:S2 >>> MAINZP ; Alt ZP off, ROM back in + RTS * Search FILEREFS for value in A * On return, buffer number is in X (or $FF if no bufs) -FINDBUF LDX #$00 -:L1 CMP FILEREFS,X - BEQ :END - INX - CPX #$04 - BNE :L1 - LDX #$FF ; $FF for not found -:END RTS +FINDBUF LDX #$00 +:L1 CMP FILEREFS,X + BEQ :END + INX + CPX #$04 + BNE :L1 + LDX #$FF ; $FF for not found +:END RTS * Obtain I/O buffer address * On entry: buffer number in X * On exit: buffer address in AY * Carry set if no bufs, clear otherwise -BUFADDR CPX #$00 - BNE :S1 - LDA #<IOBUF1 - LDY #>IOBUF1 - BRA :EXIT -:S1 CPX #$01 - BNE :S2 - LDA #<IOBUF2 - LDY #>IOBUF2 - BRA :EXIT -:S2 CPX #$02 - BNE :S3 - LDA #<IOBUF3 - LDY #>IOBUF3 - BRA :EXIT -:S3 CPX #$03 - BNE :NOBUFS - LDA #<IOBUF4 - LDY #>IOBUF4 -:EXIT CLC - RTS -:NOBUFS SEC - RTS +BUFADDR CPX #$00 + BNE :S1 + LDA #<IOBUF1 + LDY #>IOBUF1 + BRA :EXIT +:S1 CPX #$01 + BNE :S2 + LDA #<IOBUF2 + LDY #>IOBUF2 + BRA :EXIT +:S2 CPX #$02 + BNE :S3 + LDA #<IOBUF3 + LDY #>IOBUF3 + BRA :EXIT +:S3 CPX #$03 + BNE :NOBUFS + LDA #<IOBUF4 + LDY #>IOBUF4 +:EXIT CLC + RTS +:NOBUFS SEC + RTS * Check if file exists * Returns A=0 if doesn't exist, A=1 file, A=2 dir -EXISTS LDA #<MOSFILE - STA GINFOPL+1 - LDA #>MOSFILE - STA GINFOPL+2 - JSR GETINFO ; GET_FILE_INFO - LDA #$00 - BCS :EXIT ; Any error -> $00 - LDA GINFOPL+7 ; Storage type - CMP #$0D - LDA #$01 ; File -> $01 - ADC #$00 ; Dir. -> $02 -:EXIT RTS +EXISTS LDA #<MOSFILE + STA GINFOPL+1 + LDA #>MOSFILE + STA GINFOPL+2 + JSR GETINFO ; GET_FILE_INFO + LDA #$00 + BCS :EXIT ; Any error -> $00 + LDA GINFOPL+7 ; Storage type + CMP #$0D + LDA #$01 ; File -> $01 + ADC #$00 ; Dir. -> $02 +:EXIT RTS * Copy FILEBLK to OSFILECB in aux memory * Preserves A -COPYFB PHA - LDX #$11 ; 18 bytes in FILEBLK - >>> WRTAUX ; Write to Aux mem -:L1 LDA FILEBLK,X - STA OSFILECB,X - DEX - BPL :L1 - >>> WRTMAIN ; Back to Main mem - PLA - RTS +COPYFB PHA + LDX #$11 ; 18 bytes in FILEBLK + >>> WRTAUX ; Write to Aux mem +:L1 LDA FILEBLK,X + STA OSFILECB,X + DEX + BPL :L1 + >>> WRTMAIN ; Back to Main mem + PLA + RTS * Get file info -GETINFO JSR MLI - DB GINFOCMD - DW GINFOPL - RTS +GETINFO JSR MLI + DB GINFOCMD + DW GINFOPL + RTS * Set file info -SETINFO LDA #$07 ; SET_FILE_INFO 7 parms - STA GINFOPL - JSR MLI - DB SINFOCMD - DW GINFOPL ; Re-use PL from GFI - LDA #$0A ; GET_FILE_INFO 10 parms - STA GINFOPL - RTS +SETINFO LDA #$07 ; SET_FILE_INFO 7 parms + STA GINFOPL + JSR MLI + DB SINFOCMD + DW GINFOPL ; Re-use PL from GFI + LDA #$0A ; GET_FILE_INFO 10 parms + STA GINFOPL + RTS * Create disk file * Uses filename in MOSFILE -CRTFILE JSR MLI ; GET_TIME - DB GTIMECMD - LDA #<MOSFILE - STA CREATEPL+1 - LDA #>MOSFILE - STA CREATEPL+2 - LDA #$C3 ; Open permissions - STA CREATEPL+3 - LDA $BF90 ; Current date - STA CREATEPL+8 - LDA $BF91 - STA CREATEPL+9 - LDA $BF92 ; Current time - STA CREATEPL+10 - LDA $BF93 - STA CREATEPL+11 - JSR MLI - DB CREATCMD - DW CREATEPL - RTS +CRTFILE JSR MLI ; GET_TIME + DB GTIMECMD + LDA #<MOSFILE + STA CREATEPL+1 + LDA #>MOSFILE + STA CREATEPL+2 + LDA #$C3 ; Open permissions + STA CREATEPL+3 + LDA $BF90 ; Current date + STA CREATEPL+8 + LDA $BF91 + STA CREATEPL+9 + LDA $BF92 ; Current time + STA CREATEPL+10 + LDA $BF93 + STA CREATEPL+11 + JSR MLI + DB CREATCMD + DW CREATEPL + RTS * Open disk file -OPENMOSFILE LDA #<MOSFILE ; Open filename in MOSFILE - STA OPENPL+1 - LDA #>MOSFILE - STA OPENPL+2 -OPENFILE JSR MLI - DB OPENCMD - DW OPENPL - RTS +OPENMOSFILE LDA #<MOSFILE ; Open filename in MOSFILE + STA OPENPL+1 + LDA #>MOSFILE + STA OPENPL+2 +OPENFILE JSR MLI + DB OPENCMD + DW OPENPL + RTS * Close disk file -CLSFILE JSR MLI - DB CLSCMD - DW CLSPL - RTS +CLSFILE JSR MLI + DB CLSCMD + DW CLSPL + RTS * Read 512 bytes into BLKBUF -RDFILE JSR MLI - DB READCMD - DW READPL - RTS +RDFILE JSR MLI + DB READCMD + DW READPL + RTS * Write data in BLKBUF to disk -WRTFILE JSR MLI - DB WRITECMD - DW WRITEPL - RTS +WRTFILE JSR MLI + DB WRITECMD + DW WRITEPL + RTS * Put ProDOS prefix in PREFIX -GETPREF JSR MLI - DB GPFXCMD - DW GPFXPL - RTS +GETPREF JSR MLI + DB GPFXCMD + DW GPFXPL + RTS * Map of file reference numbers to IOBUF1..4 -FILEREFS DB $00,$00,$00,$00 +FILEREFS DB $00,$00,$00,$00 + + diff --git a/mainmem.path.s b/mainmem.path.s index 7e48e16..d2c25b9 100644 --- a/mainmem.path.s +++ b/mainmem.path.s @@ -314,4 +314,6 @@ PREFIX DS 65 ; Buffer for ProDOS prefix + + diff --git a/mainmem.svc.s b/mainmem.svc.s index 1cdc621..43c5a9d 100644 --- a/mainmem.svc.s +++ b/mainmem.svc.s @@ -26,100 +26,100 @@ * ProDOS file handling to rename a file -RENFILE >>> ENTMAIN - JSR PREPATH ; Preprocess arg1 - JSR MFtoTMP ; Stash arg1 - JSR COPYMF21 ; Copy arg2 - JSR PREPATH ; Preprocess arg2 - JSR COPYMF12 ; Put it back in MOSFILE2 - JSR TMPtoMF ; Recover arg1->MOSFILE - LDA #<MOSFILE - STA RENPL+1 - LDA #>MOSFILE - STA RENPL+2 - LDA #<MOSFILE2 - STA RENPL+3 - LDA #>MOSFILE2 - STA RENPL+4 - JSR MLI - DB RENCMD - DW RENPL - >>> XF2AUX,RENRET +RENFILE >>> ENTMAIN + JSR PREPATH ; Preprocess arg1 + JSR MFtoTMP ; Stash arg1 + JSR COPYMF21 ; Copy arg2 + JSR PREPATH ; Preprocess arg2 + JSR COPYMF12 ; Put it back in MOSFILE2 + JSR TMPtoMF ; Recover arg1->MOSFILE + LDA #<MOSFILE + STA RENPL+1 + LDA #>MOSFILE + STA RENPL+2 + LDA #<MOSFILE2 + STA RENPL+3 + LDA #>MOSFILE2 + STA RENPL+4 + JSR MLI + DB RENCMD + DW RENPL + >>> XF2AUX,RENRET * ProDOS file handling for file copying * Returns with ProDOS error code in A -COPYFILE >>> ENTMAIN - JSR MFtoTMP ; Swap MOSFILE & MOSFILE2 - JSR COPYMF21 - JSR TMPtoMF2 - JSR PREPATH ; Preprocess arg2 (in MOSFILE) - JSR WILDONE ; Handle any wildcards - JSR EXISTS ; See if destination exists - STA :DESTTYPE ; Stash for later - JSR MFtoTMP ; Swap MOSFILE & MOSFILE2 again - JSR COPYMF21 - JSR TMPtoMF2 - JSR PREPATH ; Preprocess arg1 - SEC ; Force wildcard lookup - JSR WILDCARD ; Handle any wildcards in arg1 - BCS :NONE - JSR HASWILD - BCC :MAINLOOP ; No wildcards in final segment - LDA :DESTTYPE ; Wildcards, check dest type - CMP #$02 ; Existing directory? - BNE :BADDEST ; If not, error - BRA :MAINLOOP ; Source: wildcard, dest: dir +COPYFILE >>> ENTMAIN + JSR MFtoTMP ; Swap MOSFILE & MOSFILE2 + JSR COPYMF21 + JSR TMPtoMF2 + JSR PREPATH ; Preprocess arg2 (in MOSFILE) + JSR WILDONE ; Handle any wildcards + JSR EXISTS ; See if destination exists + STA :DESTTYPE ; Stash for later + JSR MFtoTMP ; Swap MOSFILE & MOSFILE2 again + JSR COPYMF21 + JSR TMPtoMF2 + JSR PREPATH ; Preprocess arg1 + SEC ; Force wildcard lookup + JSR WILDCARD ; Handle any wildcards in arg1 + BCS :NONE + JSR HASWILD + BCC :MAINLOOP ; No wildcards in final segment + LDA :DESTTYPE ; Wildcards, check dest type + CMP #$02 ; Existing directory? + BNE :BADDEST ; If not, error + BRA :MAINLOOP ; Source: wildcard, dest: dir :NOWILD :MAINLOOP - LDA MOSFILE2 ; Length - STA :OLDLEN - JSR EXISTS ; See if source is file or dir - CMP #$02 ; Directory - BEQ :SKIP ; Skip directories - LDA :DESTTYPE ; Check dest type - CMP #$02 ; Existing directory? - BNE :NOTDIR - LDY MOSFILE2 ; Dest idx = length - LDA MOSFILE2,Y ; Get last char - CMP #'/' ; Is it slash? - BEQ :HASSLSH - LDA #'/' ; Add a '/' separator - STA MOSFILE2+1,Y - INY -:HASSLSH LDX #$00 ; Source id -:APPLOOP CPX MATCHBUF ; At end? - BEQ :DONEAPP - LDA MATCHBUF+1,X ; Appending MATCHBUF to MOSFILE2 - STA MOSFILE2+1,Y - INX - INY - BRA :APPLOOP -:DONEAPP STY MOSFILE2 ; Update length -:NOTDIR LDA :DESTTYPE ; Recover destination type - JSR COPY1FILE ; Copy an individual file - BCS :COPYERR -:SKIP JSR WILDNEXT - BCS :NOMORE - LDA :OLDLEN ; Restore MOSFILE2 - STA MOSFILE2 - BRA :MAINLOOP - JSR CLSDIR -:EXIT >>> XF2AUX,COPYRET -:NONE JSR CLSDIR - LDA #$46 ; 'File not found' - BRA :EXIT -:BADDEST JSR CLSDIR - LDA #$5E ; 'Wildcards' error - BRA :EXIT -:NOMORE JSR CLSDIR - LDA #$00 - BRA :EXIT -:COPYERR PHA - JSR CLSDIR - PLA - BRA :EXIT -:DESTTYPE DB $00 -:OLDLEN DB $00 + LDA MOSFILE2 ; Length + STA :OLDLEN + JSR EXISTS ; See if source is file or dir + CMP #$02 ; Directory + BEQ :SKIP ; Skip directories + LDA :DESTTYPE ; Check dest type + CMP #$02 ; Existing directory? + BNE :NOTDIR + LDY MOSFILE2 ; Dest idx = length + LDA MOSFILE2,Y ; Get last char + CMP #'/' ; Is it slash? + BEQ :HASSLSH + LDA #'/' ; Add a '/' separator + STA MOSFILE2+1,Y + INY +:HASSLSH LDX #$00 ; Source id +:APPLOOP CPX MATCHBUF ; At end? + BEQ :DONEAPP + LDA MATCHBUF+1,X ; Appending MATCHBUF to MOSFILE2 + STA MOSFILE2+1,Y + INX + INY + BRA :APPLOOP +:DONEAPP STY MOSFILE2 ; Update length +:NOTDIR LDA :DESTTYPE ; Recover destination type + JSR COPY1FILE ; Copy an individual file + BCS :COPYERR +:SKIP JSR WILDNEXT + BCS :NOMORE + LDA :OLDLEN ; Restore MOSFILE2 + STA MOSFILE2 + BRA :MAINLOOP + JSR CLSDIR +:EXIT >>> XF2AUX,COPYRET +:NONE JSR CLSDIR + LDA #$46 ; 'File not found' + BRA :EXIT +:BADDEST JSR CLSDIR + LDA #$5E ; 'Wildcards' error + BRA :EXIT +:NOMORE JSR CLSDIR + LDA #$00 + BRA :EXIT +:COPYERR PHA + JSR CLSDIR + PLA + BRA :EXIT +:DESTTYPE DB $00 +:OLDLEN DB $00 * Copy a single file * Source is in MOSFILE, DEST in MOSFILE2 @@ -127,733 +127,733 @@ COPYFILE >>> ENTMAIN * Returns with ProDOS error code in A * Buffer COPYBUF is used for the file copy, to avoid trashing * directory block in RDBUF (when doing wilcard search) -COPY1FILE LDA #<MOSFILE - STA GINFOPL+1 - STA OPENPL2+1 - LDA #>MOSFILE - STA GINFOPL+2 - STA OPENPL2+2 - JSR GETINFO ; GET_FILE_INFO - BCS :ERR - LDA #<MOSFILE2 - STA GINFOPL+1 - STA DESTPL+1 - LDA #>MOSFILE2 - STA GINFOPL+2 - STA DESTPL+2 - JSR MLI ; DESTROY - DB DESTCMD - DW DESTPL - LDA #$07 ; Fix num parms in PL - STA GINFOPL - LDA #$C3 ; Default permissions - STA GINFOPL+3 - JSR MLI ; Call CREATE with .. - DB CREATCMD ; .. PL from GET_FILE_INFO - DW GINFOPL - LDX #$0A ; Num parms back as we found it - STX GINFOPL - BCS :ERR ; Error creating dest file - LDA #$00 ; Look for empty slot - JSR FINDBUF - STX :BUFIDX1 - JSR BUFADDR - BCS :ERR ; No I/O bufs available - STA OPENPL2+3 - STY OPENPL2+4 - JSR MLI - DB OPENCMD - DW OPENPL2 - BCS :ERR ; Open error - BRA :S1 -:ERR SEC ; Report error - RTS -:S1 LDA OPENPL2+5 ; File ref num - STA RDPLCP+1 - LDX :BUFIDX1 - STA FILEREFS,X ; Record the ref number - LDA #<MOSFILE2 - STA OPENPL2+1 - LDA #>MOSFILE2 - STA OPENPL2+2 - LDA #$00 ; Look for empty slot - JSR FINDBUF - STX :BUFIDX2 - JSR BUFADDR - BCS :ERRCLS1 ; No I/O bufs available - STA OPENPL2+3 - STY OPENPL2+4 - JSR MLI - DB OPENCMD - DW OPENPL2 - BCS :ERRCLS1 - LDA OPENPL2+5 ; File ref num - STA WRTPLCP+1 - LDX :BUFIDX2 - STA FILEREFS,X ; Record the ref number -:MAINLOOP JSR MLI ; Read a block - DB READCMD - DW RDPLCP - BCC :RDOKAY - CMP #$4C ; Is it EOF? - BEQ :EOFEXIT - BRA :ERRCLS2 ; Any other error -:RDOKAY LDA RDPLCP+6 ; Trans count MSB - STA WRTPLCP+4 ; Request count MSB - LDA RDPLCP+7 ; Trans count MSB - STA WRTPLCP+5 ; Request count MSB - JSR MLI ; Write a block - DB WRITECMD - DW WRTPLCP - BCS :ERRCLS2 ; Write error - BRA :MAINLOOP -:EOFEXIT CLC ; No error - PHP - LDA #$00 - PHA -:CLOSE2 LDA WRTPLCP+1 ; Close output file - STA CLSPL+1 - JSR CLSFILE - LDX :BUFIDX2 - STZ FILEREFS,X -:CLOSE1 LDA RDPLCP+1 ; Close input file - STA CLSPL+1 - JSR CLSFILE - LDX :BUFIDX1 - STZ FILEREFS,X - PLA - PLP - RTS -:ERRCLS1 SEC - PHP - PHA - BRA :CLOSE1 -:ERRCLS2 SEC - PHP - PHA - BRA :CLOSE2 -:BUFIDX1 DB $00 -:BUFIDX2 DB $00 +COPY1FILE LDA #<MOSFILE + STA GINFOPL+1 + STA OPENPL2+1 + LDA #>MOSFILE + STA GINFOPL+2 + STA OPENPL2+2 + JSR GETINFO ; GET_FILE_INFO + BCS :ERR + LDA #<MOSFILE2 + STA GINFOPL+1 + STA DESTPL+1 + LDA #>MOSFILE2 + STA GINFOPL+2 + STA DESTPL+2 + JSR MLI ; DESTROY + DB DESTCMD + DW DESTPL + LDA #$07 ; Fix num parms in PL + STA GINFOPL + LDA #$C3 ; Default permissions + STA GINFOPL+3 + JSR MLI ; Call CREATE with .. + DB CREATCMD ; .. PL from GET_FILE_INFO + DW GINFOPL + LDX #$0A ; Num parms back as we found it + STX GINFOPL + BCS :ERR ; Error creating dest file + LDA #$00 ; Look for empty slot + JSR FINDBUF + STX :BUFIDX1 + JSR BUFADDR + BCS :ERR ; No I/O bufs available + STA OPENPL2+3 + STY OPENPL2+4 + JSR MLI + DB OPENCMD + DW OPENPL2 + BCS :ERR ; Open error + BRA :S1 +:ERR SEC ; Report error + RTS +:S1 LDA OPENPL2+5 ; File ref num + STA RDPLCP+1 + LDX :BUFIDX1 + STA FILEREFS,X ; Record the ref number + LDA #<MOSFILE2 + STA OPENPL2+1 + LDA #>MOSFILE2 + STA OPENPL2+2 + LDA #$00 ; Look for empty slot + JSR FINDBUF + STX :BUFIDX2 + JSR BUFADDR + BCS :ERRCLS1 ; No I/O bufs available + STA OPENPL2+3 + STY OPENPL2+4 + JSR MLI + DB OPENCMD + DW OPENPL2 + BCS :ERRCLS1 + LDA OPENPL2+5 ; File ref num + STA WRTPLCP+1 + LDX :BUFIDX2 + STA FILEREFS,X ; Record the ref number +:MAINLOOP JSR MLI ; Read a block + DB READCMD + DW RDPLCP + BCC :RDOKAY + CMP #$4C ; Is it EOF? + BEQ :EOFEXIT + BRA :ERRCLS2 ; Any other error +:RDOKAY LDA RDPLCP+6 ; Trans count MSB + STA WRTPLCP+4 ; Request count MSB + LDA RDPLCP+7 ; Trans count MSB + STA WRTPLCP+5 ; Request count MSB + JSR MLI ; Write a block + DB WRITECMD + DW WRTPLCP + BCS :ERRCLS2 ; Write error + BRA :MAINLOOP +:EOFEXIT CLC ; No error + PHP + LDA #$00 + PHA +:CLOSE2 LDA WRTPLCP+1 ; Close output file + STA CLSPL+1 + JSR CLSFILE + LDX :BUFIDX2 + STZ FILEREFS,X +:CLOSE1 LDA RDPLCP+1 ; Close input file + STA CLSPL+1 + JSR CLSFILE + LDX :BUFIDX1 + STZ FILEREFS,X + PLA + PLP + RTS +:ERRCLS1 SEC + PHP + PHA + BRA :CLOSE1 +:ERRCLS2 SEC + PHP + PHA + BRA :CLOSE2 +:BUFIDX1 DB $00 +:BUFIDX2 DB $00 * ProDOS file handling for MOS OSFIND OPEN call * Options in A: $40 'r', $80 'w', $C0 'rw' -OFILE >>> ENTMAIN - AND #$C0 ; Keep just action bits - PHA ; Preserve arg for later - JSR PREPATH ; Preprocess pathname - BCS :JMPEXIT1 ; Bad filename - PLA - PHA - CMP #$80 ; Is it "w"? - BEQ :NOWILD ; If so, no wildcards - JSR WILDONE ; Handle any wildcards -:NOWILD JSR EXISTS ; See if file exists ... - TAX - CMP #$02 ; ... and is a directory - BNE :NOTDIR - PLA ; Get action back - BPL :NOTDIR2 ; OPENIN(dir) allowed - LDA #$41 ; $41=Directory exists - PHA ; Balance PLA -:JMPEXIT1 PLA -:JMPEXIT JMP FINDEXIT -:NOTDIR PLA -:NOTDIR2 CMP #$80 ; Write mode - BNE :S1 - TXA - BEQ :S0 ; No file, don't try to delete - JSR DODELETE - BCS FINDEXIT ; Abort if error -:S0 LDX #$00 ; LOAD=$0000 - LDY #$00 - JSR CREATEFILE - BCS FINDEXIT ; Abort if error +OFILE >>> ENTMAIN + AND #$C0 ; Keep just action bits + PHA ; Preserve arg for later + JSR PREPATH ; Preprocess pathname + BCS :JMPEXIT1 ; Bad filename + PLA + PHA + CMP #$80 ; Is it "w"? + BEQ :NOWILD ; If so, no wildcards + JSR WILDONE ; Handle any wildcards +:NOWILD JSR EXISTS ; See if file exists ... + TAX + CMP #$02 ; ... and is a directory + BNE :NOTDIR + PLA ; Get action back + BPL :NOTDIR2 ; OPENIN(dir) allowed + LDA #$41 ; $41=Directory exists + PHA ; Balance PLA +:JMPEXIT1 PLA +:JMPEXIT JMP FINDEXIT +:NOTDIR PLA +:NOTDIR2 CMP #$80 ; Write mode + BNE :S1 + TXA + BEQ :S0 ; No file, don't try to delete + JSR DODELETE + BCS FINDEXIT ; Abort if error +:S0 LDX #$00 ; LOAD=$0000 + LDY #$00 + JSR CREATEFILE + BCS FINDEXIT ; Abort if error * Looking for a buffer should be done before creating a file -:S1 LDA #$00 ; Look for empty slot - JSR FINDBUF - STX BUFIDX - JSR BUFADDR - BCS NOBUFFS ; No empty slot (BUFIDX=FF) - STA OPENPL2+3 - STY OPENPL2+4 - LDA #<MOSFILE - STA OPENPL2+1 - LDA #>MOSFILE - STA OPENPL2+2 - JSR MLI - DB OPENCMD - DW OPENPL2 - BCS FINDEXIT - LDA OPENPL2+5 ; File ref number - LDX BUFIDX - STA FILEREFS,X ; Record the ref number -FINDEXIT JSR CHKNOTFND ; Convert NotFound to $00 - >>> XF2AUX,OSFINDRET -NOBUFFS LDA #$42 ; $42=File buffers full - BNE FINDEXIT -BUFIDX DB $00 +:S1 LDA #$00 ; Look for empty slot + JSR FINDBUF + STX BUFIDX + JSR BUFADDR + BCS NOBUFFS ; No empty slot (BUFIDX=FF) + STA OPENPL2+3 + STY OPENPL2+4 + LDA #<MOSFILE + STA OPENPL2+1 + LDA #>MOSFILE + STA OPENPL2+2 + JSR MLI + DB OPENCMD + DW OPENPL2 + BCS FINDEXIT + LDA OPENPL2+5 ; File ref number + LDX BUFIDX + STA FILEREFS,X ; Record the ref number +FINDEXIT JSR CHKNOTFND ; Convert NotFound to $00 + >>> XF2AUX,OSFINDRET +NOBUFFS LDA #$42 ; $42=File buffers full + BNE FINDEXIT +BUFIDX DB $00 * ProDOS file handling for MOS OSFIND CLOSE call * ProDOS can do CLOSE#0 but we need to manually update FILEREFS -CFILE >>> ENTMAIN - LDX #$00 ; Prepare for one file - TYA ; File ref number - BNE :CFILE1 ; Close one file - LDX #$03 ; Loop through all files -:CFILE0 LDA FILEREFS,X - BEQ :CFILE3 ; Not open, try next -:CFILE1 PHX - PHA - STA CLSPL+1 - JSR CLSFILE - BCS :CFILEERR ; Error occured during closing - PLA - JSR FINDBUF - BNE :CFILE2 - LDA #$00 - STA FILEREFS,X ; Release buffer -:CFILE2 PLX -:CFILE3 DEX - BPL :CFILE0 ; Loop to close all files - LDA #$00 - BEQ FINDEXIT -:CFILEERR PLX ; Balance stack - PLX - BCS FINDEXIT +CFILE >>> ENTMAIN + LDX #$00 ; Prepare for one file + TYA ; File ref number + BNE :CFILE1 ; Close one file + LDX #$03 ; Loop through all files +:CFILE0 LDA FILEREFS,X + BEQ :CFILE3 ; Not open, try next +:CFILE1 PHX + PHA + STA CLSPL+1 + JSR CLSFILE + BCS :CFILEERR ; Error occured during closing + PLA + JSR FINDBUF + BNE :CFILE2 + LDA #$00 + STA FILEREFS,X ; Release buffer +:CFILE2 PLX +:CFILE3 DEX + BPL :CFILE0 ; Loop to close all files + LDA #$00 + BEQ FINDEXIT +:CFILEERR PLX ; Balance stack + PLX + BCS FINDEXIT * ProDOS file handling for MOS OSBGET call * Returns with char read in A and error num in Y (or 0) -FILEGET >>> ENTMAIN - STY READPL2+1 ; File ref number - JSR MLI - DB READCMD - DW READPL2 - TAY ; Error number in Y - BCS :EXIT - LDY #$00 ; 0=Ok - LDA BLKBUF -:EXIT >>> XF2AUX,OSBGETRET +FILEGET >>> ENTMAIN + STY READPL2+1 ; File ref number + JSR MLI + DB READCMD + DW READPL2 + TAY ; Error number in Y + BCS :EXIT + LDY #$00 ; 0=Ok + LDA BLKBUF +:EXIT >>> XF2AUX,OSBGETRET * ProDOS file handling for MOS OSBPUT call * Enters with char to write in A -FILEPUT >>> ENTMAIN - STA BLKBUF ; Byte to write - STY WRITEPL+1 ; File ref number - LDA #$01 ; Bytes to write - STA WRITEPL+4 - LDA #$00 - STA WRITEPL+5 - JSR WRTFILE - BCS :FILEPUT2 - LDA #$00 ; 0=Ok -:FILEPUT2 >>> XF2AUX,OSBPUTRET +FILEPUT >>> ENTMAIN + STA BLKBUF ; Byte to write + STY WRITEPL+1 ; File ref number + LDA #$01 ; Bytes to write + STA WRITEPL+4 + LDA #$00 + STA WRITEPL+5 + JSR WRTFILE + BCS :FILEPUT2 + LDA #$00 ; 0=Ok +:FILEPUT2 >>> XF2AUX,OSBPUTRET * ProDOS file handling for FSC $01 called by OSBYTE $7F EOF * Returns EOF status in A ($FF for EOF, $00 otherwise) * A=channel to test -FILEEOF >>> ENTMAIN - STA GEOFPL+1 - STA GMARKPL+1 - JSR MLI - DB GEOFCMD - DW GEOFPL - TAY - BCS :EXIT ; Abort with any error - JSR MLI - DB GMARKCMD - DW GMARKPL - TAY - BCS :EXIT ; Abort with any error +FILEEOF >>> ENTMAIN + STA GEOFPL+1 + STA GMARKPL+1 + JSR MLI + DB GEOFCMD + DW GEOFPL + TAY + BCS :EXIT ; Abort with any error + JSR MLI + DB GMARKCMD + DW GMARKPL + TAY + BCS :EXIT ; Abort with any error - SEC - LDA GEOFPL+2 ; Subtract Mark from EOF - SBC GMARKPL+2 - STA GEOFPL+2 - LDA GEOFPL+3 - SBC GMARKPL+3 - STA GEOFPL+3 - LDA GEOFPL+4 - SBC GMARKPL+4 - STA GEOFPL+4 + SEC + LDA GEOFPL+2 ; Subtract Mark from EOF + SBC GMARKPL+2 + STA GEOFPL+2 + LDA GEOFPL+3 + SBC GMARKPL+3 + STA GEOFPL+3 + LDA GEOFPL+4 + SBC GMARKPL+4 + STA GEOFPL+4 - LDA GEOFPL+2 ; Check bytes remaining - ORA GEOFPL+3 - ORA GEOFPL+4 - BEQ :ISEOF ; EOF -> $00 - LDA #$FF ; Not EOF -> $FF -:ISEOF EOR #$FF ; EOF -> $FF, Not EOF ->$00 - LDY #$00 ; 0=No error -:EXIT >>> XF2AUX,CHKEOFRET + LDA GEOFPL+2 ; Check bytes remaining + ORA GEOFPL+3 + ORA GEOFPL+4 + BEQ :ISEOF ; EOF -> $00 + LDA #$FF ; Not EOF -> $FF +:ISEOF EOR #$FF ; EOF -> $FF, Not EOF ->$00 + LDY #$00 ; 0=No error +:EXIT >>> XF2AUX,CHKEOFRET * ProDOS file handling for OSARGS flush commands -FLUSH >>> ENTMAIN - STY FLSHPL+1 ; File ref number - JSR MLI - DB FLSHCMD - DW FLSHPL - JMP TELLEXIT +FLUSH >>> ENTMAIN + STY FLSHPL+1 ; File ref number + JSR MLI + DB FLSHCMD + DW FLSHPL + JMP TELLEXIT * ProDOS file handling for OSARGS set ptr command * GMARKPL+1=channel, GMARKPL+2,+3,+4=offset already set -SEEK >>> ENTMAIN - JSR MLI - DB SMARKCMD - DW GMARKPL - JMP TELLEXIT +SEEK >>> ENTMAIN + JSR MLI + DB SMARKCMD + DW GMARKPL + JMP TELLEXIT * ProDOS file handling for OSARGS get ptr command * and for OSARGs get length command * A=ZP, Y=channel -SIZE LDX #$02 ; $02=SIZE, Read EXT - BNE TELL2 -TELL LDX #$00 ; $00=TELL, Read PTR -TELL2 STY GMARKPL+1 ; File ref number - PHA ; Pointer to zero page - CPX #$00 ; OSARGS parameter - BEQ :POS - JSR MLI - DB GEOFCMD - DW GMARKPL ; MARK parms same as EOF parms - BRA :S1 -:POS JSR MLI - DB GMARKCMD - DW GMARKPL -:S1 PLX ; Pointer to ZP control block - BCS TELLEXIT ; Exit with error - >>> ALTZP ; Alt ZP & Alt LC on - LDA GMARKPL+2 - STA $00,X - LDA GMARKPL+3 - STA $01,X - LDA GMARKPL+4 - STA $02,X - STZ $03,X ; Sizes are $00xxxxxx - >>> MAINZP ; Alt ZP off, ROM back in - LDA #$00 ; 0=Ok -TELLEXIT >>> XF2AUX,OSARGSRET +SIZE LDX #$02 ; $02=SIZE, Read EXT + BNE TELL2 +TELL LDX #$00 ; $00=TELL, Read PTR +TELL2 STY GMARKPL+1 ; File ref number + PHA ; Pointer to zero page + CPX #$00 ; OSARGS parameter + BEQ :POS + JSR MLI + DB GEOFCMD + DW GMARKPL ; MARK parms same as EOF parms + BRA :S1 +:POS JSR MLI + DB GMARKCMD + DW GMARKPL +:S1 PLX ; Pointer to ZP control block + BCS TELLEXIT ; Exit with error + >>> ALTZP ; Alt ZP & Alt LC on + LDA GMARKPL+2 + STA $00,X + LDA GMARKPL+3 + STA $01,X + LDA GMARKPL+4 + STA $02,X + STZ $03,X ; Sizes are $00xxxxxx + >>> MAINZP ; Alt ZP off, ROM back in + LDA #$00 ; 0=Ok +TELLEXIT >>> XF2AUX,OSARGSRET -ZPMOS EQU $30 +ZPMOS EQU $30 * ProDOS file MOS OSFILE calls -CALLFILE >>> ENTMAIN - JSR FILEDISPATCH - >>> XF2AUX,OSFILERET -FILEDISPATCH CMP #$00 - BEQ SVCSAVE ; A=00 -> SAVE - CMP #$FF - BEQ SVCLOAD ; A=FF -> LOAD - CMP #$06 - BEQ DELFILE ; A=06 -> DELETE - BCC INFOFILE ; A=01-05 -> INFO - CMP #$08 - BEQ MAKEDIR ; A=08 -> MKDIR - RTS -SVCSAVE JMP SAVEFILE -SVCLOAD JMP LOADFILE +CALLFILE >>> ENTMAIN + JSR FILEDISPATCH + >>> XF2AUX,OSFILERET +FILEDISPATCH CMP #$00 + BEQ SVCSAVE ; A=00 -> SAVE + CMP #$FF + BEQ SVCLOAD ; A=FF -> LOAD + CMP #$06 + BEQ DELFILE ; A=06 -> DELETE + BCC INFOFILE ; A=01-05 -> INFO + CMP #$08 + BEQ MAKEDIR ; A=08 -> MKDIR + RTS +SVCSAVE JMP SAVEFILE +SVCLOAD JMP LOADFILE -INFOFILE JSR UPDPATH ; Process path and get info - JMP COPYFB ; Copy back to aux mem +INFOFILE JSR UPDPATH ; Process path and get info + JMP COPYFB ; Copy back to aux mem * ProDOS file handling to delete a file * Called by AppleMOS OSFILE * Return A=0 no object, A=1 file deleted, A=2 dir deleted * A>$1F ProDOS error -DELFILE JSR UPDPATH ; Process path and get info - JSR COPYFB ; Copy back to aux mem - PHA ; Save object type - JSR DODELETE - BCC :DELETED ; Success +DELFILE JSR UPDPATH ; Process path and get info + JSR COPYFB ; Copy back to aux mem + PHA ; Save object type + JSR DODELETE + BCC :DELETED ; Success - TAX ; X=error code - PLA ; Get object back - CPX #$4E - BNE :DELERROR ; Not 'Insuff. access', return it - LDX #$4F ; Change to 'Locked' + TAX ; X=error code + PLA ; Get object back + CPX #$4E + BNE :DELERROR ; Not 'Insuff. access', return it + LDX #$4F ; Change to 'Locked' - CMP #$02 - BNE :DELERROR ; Wasn't a directory, return 'Locked' - LDA FBATTR+0 - AND #$08 - BNE :DELERROR ; Dir locked, return 'Locked' - LDX #$54 ; Change to 'Dir not empty' + CMP #$02 + BNE :DELERROR ; Wasn't a directory, return 'Locked' + LDA FBATTR+0 + AND #$08 + BNE :DELERROR ; Dir locked, return 'Locked' + LDX #$54 ; Change to 'Dir not empty' -:DELERROR TXA - JSR CHKNOTFND - PHA -:DELETED PLA ; Get object back -:EXIT RTS +:DELERROR TXA + JSR CHKNOTFND + PHA +:DELETED PLA ; Get object back +:EXIT RTS -DODELETE LDA #<MOSFILE ; Attempt to destroy file - STA DESTPL+1 - LDA #>MOSFILE - STA DESTPL+2 - JSR MLI - DB DESTCMD - DW DESTPL - RTS +DODELETE LDA #<MOSFILE ; Attempt to destroy file + STA DESTPL+1 + LDA #>MOSFILE + STA DESTPL+2 + JSR MLI + DB DESTCMD + DW DESTPL + RTS * ProDOS file handling to create a directory * Invoked by AppleMOS OSFILE * Return A=$02 on success (ie: 'directory') * A>$1F ProDOS error, translated by OSFILE handler -MAKEDIR JSR UPDPATH ; Process path and get info - CMP #$02 - BEQ :EXIT1 ; Dir already exists +MAKEDIR JSR UPDPATH ; Process path and get info + CMP #$02 + BEQ :EXIT1 ; Dir already exists - LDA #$0D ; OBJT='Directory' - STA CREATEPL+7 ; ->Storage type - LDA #$0F ; TYPE='Directory' - LDX #$00 ; LOAD=$0000 - LDY #$00 - JSR CREATEOBJ - BCS :EXIT ; Failed, exit with ProDOS result - JSR UPDFB ; Update FILEBLK, returns A=$02 -:EXIT1 JSR COPYFB ; Copy FILEBLK to aux mem -:EXIT RTS + LDA #$0D ; OBJT='Directory' + STA CREATEPL+7 ; ->Storage type + LDA #$0F ; TYPE='Directory' + LDX #$00 ; LOAD=$0000 + LDY #$00 + JSR CREATEOBJ + BCS :EXIT ; Failed, exit with ProDOS result + JSR UPDFB ; Update FILEBLK, returns A=$02 +:EXIT1 JSR COPYFB ; Copy FILEBLK to aux mem +:EXIT RTS * ProDOS file handling for MOS OSFILE LOAD call * Invoked by AppleMOS OSFILE * Return A=01 if successful (meaning 'file') * A>$1F ProDOS error, translated by FILERET -LOADFILE LDX #4 -:LP LDA FBLOAD,X ; Get address to load to - STA ZPMOS,X - DEX - BPL :LP - JSR PREPATH ; Preprocess pathname - JSR WILDONE ; Handle any wildcards - JSR UPDFB ; Get object info - CMP #$20 - BCS :JMPEXIT ; Error occured - CMP #$01 ; Is it a file - BEQ :ISFILE - ROL A ; 0->0, 2->5 - EOR #$05 ; 0->5, 2->0 - ADC #$41 ; 0->$46, 2->$41 -:JMPEXIT JMP :EXIT2 ; Return error +LOADFILE LDX #4 +:LP LDA FBLOAD,X ; Get address to load to + STA ZPMOS,X + DEX + BPL :LP + JSR PREPATH ; Preprocess pathname + JSR WILDONE ; Handle any wildcards + JSR UPDFB ; Get object info + CMP #$20 + BCS :JMPEXIT ; Error occured + CMP #$01 ; Is it a file + BEQ :ISFILE + ROL A ; 0->0, 2->5 + EOR #$05 ; 0->5, 2->0 + ADC #$41 ; 0->$46, 2->$41 +:JMPEXIT JMP :EXIT2 ; Return error -:ISFILE LDA ZPMOS+4 ; If FBEXEC is zero, use addr - BEQ :CBADDR ; in the control block - LDA FBLOAD+0 ; Otherwise, use file's address - STA ZPMOS+0 - LDA FBLOAD+1 - STA ZPMOS+1 +:ISFILE LDA ZPMOS+4 ; If FBEXEC is zero, use addr + BEQ :CBADDR ; in the control block + LDA FBLOAD+0 ; Otherwise, use file's address + STA ZPMOS+0 + LDA FBLOAD+1 + STA ZPMOS+1 -:CBADDR JSR OPENMOSFILE - BCS :EXIT2 ; File not opened +:CBADDR JSR OPENMOSFILE + BCS :EXIT2 ; File not opened -:L1 LDA OPENPL+5 ; File ref number - JSR READDATA ; Read data from open file +:L1 LDA OPENPL+5 ; File ref number + JSR READDATA ; Read data from open file - PHA ; Save result - LDA OPENPL+5 ; File ref num - STA CLSPL+1 - JSR CLSFILE - PLA - BNE :EXIT2 - JSR COPYFB ; Copy FILEBLK to auxmem - LDA #$01 ; $01=File -:EXIT2 RTS + PHA ; Save result + LDA OPENPL+5 ; File ref num + STA CLSPL+1 + JSR CLSFILE + PLA + BNE :EXIT2 + JSR COPYFB ; Copy FILEBLK to auxmem + LDA #$01 ; $01=File +:EXIT2 RTS * A=channel, MOSZP+0/1=address to load to, TO DO: MOS+4/5=length to read -READDATA STA READPL+1 -:RDLP JSR RDFILE - BCS :READERR ; Close file and return any error +READDATA STA READPL+1 +:RDLP JSR RDFILE + BCS :READERR ; Close file and return any error - LDA #<BLKBUF ; LSB of start of data buffer - STA A1L ; A1=>start of data buffer - ADC READPL+6 ; LSB of trans count - TAX ; X=>LSB end of data buffer + LDA #<BLKBUF ; LSB of start of data buffer + STA A1L ; A1=>start of data buffer + ADC READPL+6 ; LSB of trans count + TAX ; X=>LSB end of data buffer - LDA #>BLKBUF ; MSB of start of data buffer - STA A1H ; A1=>start of data buffer - ADC READPL+7 ; MSB of trans count - TAY ; Y=>MSB end of data buffer + LDA #>BLKBUF ; MSB of start of data buffer + STA A1H ; A1=>start of data buffer + ADC READPL+7 ; MSB of trans count + TAY ; Y=>MSB end of data buffer - TXA - BNE :L2 - DEY -:L2 DEX ; XY=XY-1, end address is start+len-1 - STX A2L ; A2=>end of data buffer - STY A2H + TXA + BNE :L2 + DEY +:L2 DEX ; XY=XY-1, end address is start+len-1 + STX A2L ; A2=>end of data buffer + STY A2H - LDA ZPMOS+0 ; A4=>address to load to - STA A4L - LDA ZPMOS+1 - STA A4H - INC ZPMOS+1 ; Step to next block - INC ZPMOS+1 + LDA ZPMOS+0 ; A4=>address to load to + STA A4L + LDA ZPMOS+1 + STA A4H + INC ZPMOS+1 ; Step to next block + INC ZPMOS+1 - SEC ; Main -> AUX - JSR AUXMOVE ; A4 updated to next address - JMP :RDLP + SEC ; Main -> AUX + JSR AUXMOVE ; A4 updated to next address + JMP :RDLP -:READERR CMP #$4C - BNE :EXITERR -:EXITOK LDA #$00 ; $00=Success -:EXITERR RTS +:READERR CMP #$4C + BNE :EXITERR +:EXITOK LDA #$00 ; $00=Success +:EXITERR RTS * ProDOS file handling for MOS OSFILE SAVE call * Invoked by AppleMOS OSFILE * Return A=01 if successful (ie: 'file') * A>$1F ProDOS error translated by FILERET -SAVEFILE SEC ; Compute file length - LDA FBEND+0 - SBC FBSTRT+0 - STA LENREM+0 - LDA FBEND+1 - SBC FBSTRT+1 - STA LENREM+1 - LDA FBEND+2 - SBC FBSTRT+2 - BNE :TOOBIG ; >64K - LDA FBEND+3 - SBC FBSTRT+3 - BEQ :L0 ; >16M -:TOOBIG LDA #$2C ; Bad byte count - file too long - RTS +SAVEFILE SEC ; Compute file length + LDA FBEND+0 + SBC FBSTRT+0 + STA LENREM+0 + LDA FBEND+1 + SBC FBSTRT+1 + STA LENREM+1 + LDA FBEND+2 + SBC FBSTRT+2 + BNE :TOOBIG ; >64K + LDA FBEND+3 + SBC FBSTRT+3 + BEQ :L0 ; >16M +:TOOBIG LDA #$2C ; Bad byte count - file too long + RTS -:L0 JSR PREPATH ; Preprocess pathname - JSR EXISTS ; See if file exists ... - CMP #$01 - BEQ :NOTDIR ; Overwrite file - BCC :NOFILE ; Create new file - CMP #$02 - BNE :JMPEXIT2 - LDA #$41 ; Dir exists, return $41 -:JMPEXIT2 JMP :EXIT2 +:L0 JSR PREPATH ; Preprocess pathname + JSR EXISTS ; See if file exists ... + CMP #$01 + BEQ :NOTDIR ; Overwrite file + BCC :NOFILE ; Create new file + CMP #$02 + BNE :JMPEXIT2 + LDA #$41 ; Dir exists, return $41 +:JMPEXIT2 JMP :EXIT2 -:NOTDIR LDA #<MOSFILE ; Attempt to destroy file - STA DESTPL+1 - LDA #>MOSFILE - STA DESTPL+2 - JSR MLI - DB DESTCMD - DW DESTPL - BCS :EXIT2 ; Error trying to delete +:NOTDIR LDA #<MOSFILE ; Attempt to destroy file + STA DESTPL+1 + LDA #>MOSFILE + STA DESTPL+2 + JSR MLI + DB DESTCMD + DW DESTPL + BCS :EXIT2 ; Error trying to delete -:NOFILE LDX FBLOAD+0 ; Auxtype = load address - LDY FBLOAD+1 - JSR CREATEFILE - BCS :JMPEXIT2 ; Error trying to create - JSR OPENMOSFILE - BCS :JMPEXIT2 ; Error trying to open - LDA OPENPL+5 ; File ref number - JSR WRITEDATA +:NOFILE LDX FBLOAD+0 ; Auxtype = load address + LDY FBLOAD+1 + JSR CREATEFILE + BCS :JMPEXIT2 ; Error trying to create + JSR OPENMOSFILE + BCS :JMPEXIT2 ; Error trying to open + LDA OPENPL+5 ; File ref number + JSR WRITEDATA -:EXIT1 PHA ; Save result - LDA OPENPL+5 ; File ref num - STA CLSPL+1 - JSR CLSFILE - PLA - BNE :EXIT2 ; Error returned - JSR UPDFB ; Update FILEBLK - JSR COPYFB ; Copy FILEBLK to aux mem - LDA #$01 ; Return A='File' -:EXIT2 CMP #$4E - BNE :EXIT3 ; Change 'Insuff. access' - LDA #$4F ; to 'Locked' -:EXIT3 RTS +:EXIT1 PHA ; Save result + LDA OPENPL+5 ; File ref num + STA CLSPL+1 + JSR CLSFILE + PLA + BNE :EXIT2 ; Error returned + JSR UPDFB ; Update FILEBLK + JSR COPYFB ; Copy FILEBLK to aux mem + LDA #$01 ; Return A='File' +:EXIT2 CMP #$4E + BNE :EXIT3 ; Change 'Insuff. access' + LDA #$4F ; to 'Locked' +:EXIT3 RTS * A=channel, FBSTRT+0/1=address to save from * LENREM+0/1=length to write -WRITEDATA STA WRITEPL+1 -:L1 LDA #$00 ; 512 bytes request count - STA WRITEPL+4 - LDA #$02 - STA WRITEPL+5 +WRITEDATA STA WRITEPL+1 +:L1 LDA #$00 ; 512 bytes request count + STA WRITEPL+4 + LDA #$02 + STA WRITEPL+5 - LDA LENREM+1 - CMP #$02 - BCS :L15 ; More than 511 bytes remaining - STA WRITEPL+5 - LDA LENREM+0 - STA WRITEPL+4 - ORA WRITEPL+5 - BEQ :SAVEOK ; Zero bytes remaining + LDA LENREM+1 + CMP #$02 + BCS :L15 ; More than 511 bytes remaining + STA WRITEPL+5 + LDA LENREM+0 + STA WRITEPL+4 + ORA WRITEPL+5 + BEQ :SAVEOK ; Zero bytes remaining -:L15 SEC - LDA LENREM+0 ; LENREM=LENREM-count - SBC WRITEPL+4 - STA LENREM+0 - LDA LENREM+1 - SBC WRITEPL+5 - STA LENREM+1 +:L15 SEC + LDA LENREM+0 ; LENREM=LENREM-count + SBC WRITEPL+4 + STA LENREM+0 + LDA LENREM+1 + SBC WRITEPL+5 + STA LENREM+1 - CLC - LDA FBSTRT+0 - STA A1L ; A1=>start of this block - ADC WRITEPL+4 - STA FBSTRT+0 ; Update FBSTRT=>start of next block - TAX ; X=>end of this block + CLC + LDA FBSTRT+0 + STA A1L ; A1=>start of this block + ADC WRITEPL+4 + STA FBSTRT+0 ; Update FBSTRT=>start of next block + TAX ; X=>end of this block - LDA FBSTRT+1 - STA A1H - ADC WRITEPL+5 - STA FBSTRT+1 - TAY + LDA FBSTRT+1 + STA A1H + ADC WRITEPL+5 + STA FBSTRT+1 + TAY - TXA - BNE :L2 - DEY -:L2 DEX ; XY=XY-1, end address is start+len-1 - STX A2L ; A2=>end of data buffer - STY A2H + TXA + BNE :L2 + DEY +:L2 DEX ; XY=XY-1, end address is start+len-1 + STX A2L ; A2=>end of data buffer + STY A2H -:S2 LDA #<BLKBUF - STA A4L - LDA #>BLKBUF - STA A4H - CLC ; Aux -> Main - JSR AUXMOVE ; Copy data from aux to local buffer +:S2 LDA #<BLKBUF + STA A4L + LDA #>BLKBUF + STA A4H + CLC ; Aux -> Main + JSR AUXMOVE ; Copy data from aux to local buffer - JSR WRTFILE ; Write the data - BCS :WRITEERR - JMP :L1 ; Loop back for next block -:SAVEOK ; Enter here with A=$00 -:WRITEERR RTS -LENREM DW $0000 ; Remaining length + JSR WRTFILE ; Write the data + BCS :WRITEERR + JMP :L1 ; Loop back for next block +:SAVEOK ; Enter here with A=$00 +:WRITEERR RTS +LENREM DW $0000 ; Remaining length -CREATEFILE LDA #$01 ; Storage type - file - STA CREATEPL+7 - LDA #$06 ; Filetype BIN +CREATEFILE LDA #$01 ; Storage type - file + STA CREATEPL+7 + LDA #$06 ; Filetype BIN -CREATEOBJ STA CREATEPL+4 ; Type = BIN or DIR - STX CREATEPL+5 ; Auxtype = load address - STY CREATEPL+6 - JMP CRTFILE +CREATEOBJ STA CREATEPL+4 ; Type = BIN or DIR + STX CREATEPL+5 ; Auxtype = load address + STY CREATEPL+6 + JMP CRTFILE * Process pathname and read object info -UPDPATH JSR PREPATH ; Process pathname - BCC UPDFB ; If no error, update control block - RTS +UPDPATH JSR PREPATH ; Process pathname + BCC UPDFB ; If no error, update control block + RTS * Update FILEBLK before returning to aux memory * Returns A=object type or ProDOS error -UPDFB LDA #<MOSFILE - STA GINFOPL+1 - LDA #>MOSFILE - STA GINFOPL+2 - JSR GETINFO ; Call GET_FILE_INFO - BCC :UPDFB1 - JMP CHKNOTFND +UPDFB LDA #<MOSFILE + STA GINFOPL+1 + LDA #>MOSFILE + STA GINFOPL+2 + JSR GETINFO ; Call GET_FILE_INFO + BCC :UPDFB1 + JMP CHKNOTFND -:UPDFB1 LDA GINFOPL+5 ; Aux type LSB - STA FBLOAD - STA FBEXEC - LDA GINFOPL+6 ; Aux type MSB - STA FBLOAD+1 - STA FBEXEC+1 - STZ FBLOAD+2 - STZ FBEXEC+2 - STZ FBLOAD+3 - STZ FBEXEC+3 +:UPDFB1 LDA GINFOPL+5 ; Aux type LSB + STA FBLOAD + STA FBEXEC + LDA GINFOPL+6 ; Aux type MSB + STA FBLOAD+1 + STA FBEXEC+1 + STZ FBLOAD+2 + STZ FBEXEC+2 + STZ FBLOAD+3 + STZ FBEXEC+3 * - LDA GINFOPL+3 ; Access byte - CMP #$40 ; Locked? - AND #$03 ; ------wr - PHP - STA FBATTR+0 - ASL A ; -----wr- - ASL A ; ----wr-- - ASL A ; ---wr--- - ASL A ; --wr---- - PLP - BCS :UPDFB2 - ORA #$08 ; --wrl--- -:UPDFB2 ORA FBATTR+0 ; --wrl-wr - STA FBATTR+0 + LDA GINFOPL+3 ; Access byte + CMP #$40 ; Locked? + AND #$03 ; ------wr + PHP + STA FBATTR+0 + ASL A ; -----wr- + ASL A ; ----wr-- + ASL A ; ---wr--- + ASL A ; --wr---- + PLP + BCS :UPDFB2 + ORA #$08 ; --wrl--- +:UPDFB2 ORA FBATTR+0 ; --wrl-wr + STA FBATTR+0 * - LDA GINFOPL+11 ; yyyyyyym - PHA - ROR A ; ?yyyyyyy m - LDA GINFOPL+10 ; mmmddddd m - PHA - ROR A ; mmmmdddd - LSR A ; -mmmmddd - LSR A ; --mmmmdd - LSR A ; ---mmmmd - LSR A ; ----mmmm - STA FBATTR+2 - PLA ; mmmddddd - AND #31 ; ---ddddd - STA FBATTR+1 - PLA ; yyyyyyym - SEC - SBC #81*2 ; Offset from 1981 - BCS :UPDFB3 ; 1981-1999 -> 00-18 - ADC #100*2 ; 2000-2080 -> 19-99 -:UPDFB3 PHA ; yyyyyyym - AND #$E0 ; yyy----- - ORA FBATTR+1 ; yyyddddd - STA FBATTR+1 - PLA ; yyyyyyym - AND #$FE ; yyyyyyy0 - ASL A ; yyyyyy00 - ASL A ; yyyyy000 - ASL A ; yyyy0000 - ORA FBATTR+2 ; yyyymmmm - STA FBATTR+2 - STZ FBATTR+3 + LDA GINFOPL+11 ; yyyyyyym + PHA + ROR A ; ?yyyyyyy m + LDA GINFOPL+10 ; mmmddddd m + PHA + ROR A ; mmmmdddd + LSR A ; -mmmmddd + LSR A ; --mmmmdd + LSR A ; ---mmmmd + LSR A ; ----mmmm + STA FBATTR+2 + PLA ; mmmddddd + AND #31 ; ---ddddd + STA FBATTR+1 + PLA ; yyyyyyym + SEC + SBC #81*2 ; Offset from 1981 + BCS :UPDFB3 ; 1981-1999 -> 00-18 + ADC #100*2 ; 2000-2080 -> 19-99 +:UPDFB3 PHA ; yyyyyyym + AND #$E0 ; yyy----- + ORA FBATTR+1 ; yyyddddd + STA FBATTR+1 + PLA ; yyyyyyym + AND #$FE ; yyyyyyy0 + ASL A ; yyyyyy00 + ASL A ; yyyyy000 + ASL A ; yyyy0000 + ORA FBATTR+2 ; yyyymmmm + STA FBATTR+2 + STZ FBATTR+3 - JSR OPENMOSFILE ; Open file - BCS :ERR - LDA OPENPL+5 ; File ref number - STA GMARKPL+1 - JSR MLI ; Call GET_EOF MLI - DB GEOFCMD - DW GMARKPL ; MARK parms same as EOF - LDA GMARKPL+2 - STA FBSIZE+0 - LDA GMARKPL+3 - STA FBSIZE+1 - LDA GMARKPL+4 - STA FBSIZE+2 - STZ FBSIZE+3 - LDA OPENPL+5 ; File ref number - STA CLSPL+1 - JSR CLSFILE - LDA #$01 ; Prepare A=file - LDX GINFOPL+7 - CPX #$0D ; Is it a directory? - ADC #$00 ; Becomes A=2 for directory -:UPDFB5 RTS + JSR OPENMOSFILE ; Open file + BCS :ERR + LDA OPENPL+5 ; File ref number + STA GMARKPL+1 + JSR MLI ; Call GET_EOF MLI + DB GEOFCMD + DW GMARKPL ; MARK parms same as EOF + LDA GMARKPL+2 + STA FBSIZE+0 + LDA GMARKPL+3 + STA FBSIZE+1 + LDA GMARKPL+4 + STA FBSIZE+2 + STZ FBSIZE+3 + LDA OPENPL+5 ; File ref number + STA CLSPL+1 + JSR CLSFILE + LDA #$01 ; Prepare A=file + LDX GINFOPL+7 + CPX #$0D ; Is it a directory? + ADC #$00 ; Becomes A=2 for directory +:UPDFB5 RTS :ERR -CHKNOTFND CMP #$44 ; Convert ProDOS 'not found' - BEQ :NOTFND ; into result=$00 - CMP #$45 - BEQ :NOTFND - CMP #$46 - BNE :CHKNOTFND2 -:NOTFND LDA #$00 -:CHKNOTFND2 RTS +CHKNOTFND CMP #$44 ; Convert ProDOS 'not found' + BEQ :NOTFND ; into result=$00 + CMP #$45 + BEQ :NOTFND + CMP #$46 + BNE :CHKNOTFND2 +:NOTFND LDA #$00 +:CHKNOTFND2 RTS * Quit to ProDOS -QUIT INC $03F4 ; Invalidate powerup byte - STA $C054 ; PAGE2 off - STA $C00E ; Alt font off - JSR MLI - DB QUITCMD - DW QUITPL - RTS +QUIT INC $03F4 ; Invalidate powerup byte + STA $C054 ; PAGE2 off + STA $C00E ; Alt font off + JSR MLI + DB QUITCMD + DW QUITPL + RTS * Used for *CAT, *EX and *INFO * On entry: b7=0 - short info (*CAT) @@ -861,159 +861,159 @@ QUIT INC $03F4 ; Invalidate powerup byte * b6=0 - single entry, parameter is object (*INFO) * b6=1 - multiple items, parameter is dir (*CAT, *EX) * -CATALOG >>> ENTMAIN - STA CATARG ; Stash argument - CMP #$80 ; Is it *INFO? - BNE :NOTINFO - JMP INFO ; Handle entry for *INFO -:NOTINFO LDA MOSFILE ; Length of pathname - BEQ :NOPATH ; If zero use prefix - JSR PREPATH ; Preprocess pathname - JSR WILDONE ; Handle any wildcards - JSR EXISTS ; See if path exists ... - BEQ :NOTFND ; Not found - CMP #$02 - BEQ :DIRFOUND - LDA #$0D ; Becomes Not a directory -:NOTFND EOR #$46 ; $00->$46, $xx->$4B - BNE CATEXIT +CATALOG >>> ENTMAIN + STA CATARG ; Stash argument + CMP #$80 ; Is it *INFO? + BNE :NOTINFO + JMP INFO ; Handle entry for *INFO +:NOTINFO LDA MOSFILE ; Length of pathname + BEQ :NOPATH ; If zero use prefix + JSR PREPATH ; Preprocess pathname + JSR WILDONE ; Handle any wildcards + JSR EXISTS ; See if path exists ... + BEQ :NOTFND ; Not found + CMP #$02 + BEQ :DIRFOUND + LDA #$0D ; Becomes Not a directory +:NOTFND EOR #$46 ; $00->$46, $xx->$4B + BNE CATEXIT -:NOPATH JSR GETPREF ; Fetch prefix into PREFIX - LDX #<PREFIX ; XY=>prefix - LDY #>PREFIX - BRA :OPEN -:DIRFOUND LDX #<MOSFILE ; XY=>specified directory - LDY #>MOSFILE +:NOPATH JSR GETPREF ; Fetch prefix into PREFIX + LDX #<PREFIX ; XY=>prefix + LDY #>PREFIX + BRA :OPEN +:DIRFOUND LDX #<MOSFILE ; XY=>specified directory + LDY #>MOSFILE -:OPEN STX OPENPL+1 ; Open the specified directory - STY OPENPL+2 - JSR OPENFILE - BCS CATEXIT ; Can't open dir +:OPEN STX OPENPL+1 ; Open the specified directory + STY OPENPL+2 + JSR OPENFILE + BCS CATEXIT ; Can't open dir -CATREENTRY LDA OPENPL+5 ; File ref num - STA READPL+1 - JSR RDFILE - BCS :CATERR - JSR COPYAUXBLK - >>> XF2AUX,PRONEBLK +CATREENTRY LDA OPENPL+5 ; File ref num + STA READPL+1 + JSR RDFILE + BCS :CATERR + JSR COPYAUXBLK + >>> XF2AUX,PRONEBLK -:CATERR CMP #$4C ; EOF - BNE :NOTEOF - LDA #$00 -:NOTEOF PHA - LDA OPENPL+5 ; File ref num - STA CLSPL+1 - JSR CLSFILE - PLA -CATEXIT >>> XF2AUX,STARCATRET +:CATERR CMP #$4C ; EOF + BNE :NOTEOF + LDA #$00 +:NOTEOF PHA + LDA OPENPL+5 ; File ref num + STA CLSPL+1 + JSR CLSFILE + PLA +CATEXIT >>> XF2AUX,STARCATRET * Handle *INFO -INFO JSR PREPATH ; Preprocess pathname - SEC - JSR WILDCARD ; Handle any wildcards - JSR EXISTS ; Check matches something - BNE INFOFIRST ; Match found, start listing - LDA #$46 ; No match, error Not found -INFOEXIT CMP #$4C ; EOF - BNE INFOCLS - LDA #$00 ; EOF is not an error -INFOCLS PHA - JSR CLSDIR ; Be sure to close it! - PLA - BRA CATEXIT +INFO JSR PREPATH ; Preprocess pathname + SEC + JSR WILDCARD ; Handle any wildcards + JSR EXISTS ; Check matches something + BNE INFOFIRST ; Match found, start listing + LDA #$46 ; No match, error Not found +INFOEXIT CMP #$4C ; EOF + BNE INFOCLS + LDA #$00 ; EOF is not an error +INFOCLS PHA + JSR CLSDIR ; Be sure to close it! + PLA + BRA CATEXIT * PRONEBLK call returns here ... -CATALOGRET >>> ENTMAIN - LDA CATARG - CMP #$80 ; Is this an *INFO call? - BNE CATREENTRY ; No, go back and do another CAT/EX +CATALOGRET >>> ENTMAIN + LDA CATARG + CMP #$80 ; Is this an *INFO call? + BNE CATREENTRY ; No, go back and do another CAT/EX -INFOREENTRY JSR WILDNEXT2 ; Start of new block - BCS INFOEXIT ; No more matches -INFOFIRST LDA WILDIDX - CMP #$FF ; Is WILDNEXT about to read new blk? - BEQ :DONEBLK ; If so, print this blk first - JSR WILDNEXT2 - BCC INFOFIRST ; Find more entries -:DONEBLK JSR COPYAUXBLK - >>> XF2AUX,PRONEBLK +INFOREENTRY JSR WILDNEXT2 ; Start of new block + BCS INFOEXIT ; No more matches +INFOFIRST LDA WILDIDX + CMP #$FF ; Is WILDNEXT about to read new blk? + BEQ :DONEBLK ; If so, print this blk first + JSR WILDNEXT2 + BCC INFOFIRST ; Find more entries +:DONEBLK JSR COPYAUXBLK + >>> XF2AUX,PRONEBLK -CATARG DB $00 +CATARG DB $00 * Set prefix. Used by *CHDIR/*DRIVE to change directory * Y= $00 - CHDIR, select any directory * Y<>$00 - DRIVE, must select root * -SETPFX >>> ENTMAIN - PHY ; Save CHDIR/DRIVE flag - JSR PREPATH ; Preprocess pathname - BCS :EXIT - JSR WILDONE ; Handle any wildcards - LDA #$2E - BCS :EXIT ; Exit with wildcard path +SETPFX >>> ENTMAIN + PHY ; Save CHDIR/DRIVE flag + JSR PREPATH ; Preprocess pathname + BCS :EXIT + JSR WILDONE ; Handle any wildcards + LDA #$2E + BCS :EXIT ; Exit with wildcard path * TO DO: If DRIVE disallow selecting a directory * - LDA #<MOSFILE - STA SPFXPL+1 - LDA #>MOSFILE - STA SPFXPL+2 - JSR MLI ; SET_PREFIX - DB SPFXCMD - DW SPFXPL + LDA #<MOSFILE + STA SPFXPL+1 + LDA #>MOSFILE + STA SPFXPL+2 + JSR MLI ; SET_PREFIX + DB SPFXCMD + DW SPFXPL -:EXIT PLY ; Drop CHDIR/DRIVE flag - >>> XF2AUX,CHDIRRET +:EXIT PLY ; Drop CHDIR/DRIVE flag + >>> XF2AUX,CHDIRRET * Obtain info on total/used blocks -DRVINFO >>> ENTMAIN - LDA MOSFILE - BNE :DRVINF2 - INC MOSFILE - LDA #'@' - STA MOSFILE+1 ; Convert "" to "@" -:DRVINF2 JSR PREPATH - BCS :EXIT - LDA #<MOSFILE - STA GINFOPL+1 - LDA #>MOSFILE - STA GINFOPL+2 - JSR GETINFO ; GET_FILE_INFO - BCS :EXIT - LDA GINFOPL+7 - CMP #$0F - BNE :EXIT1 ; Not a drive, exit with 'Bad drive' +DRVINFO >>> ENTMAIN + LDA MOSFILE + BNE :DRVINF2 + INC MOSFILE + LDA #'@' + STA MOSFILE+1 ; Convert "" to "@" +:DRVINF2 JSR PREPATH + BCS :EXIT + LDA #<MOSFILE + STA GINFOPL+1 + LDA #>MOSFILE + STA GINFOPL+2 + JSR GETINFO ; GET_FILE_INFO + BCS :EXIT + LDA GINFOPL+7 + CMP #$0F + BNE :EXIT1 ; Not a drive, exit with 'Bad drive' - >>> ALTZP ; Alt ZP & Alt LC on - LDA GINFOPL+8 ; Blocks used LSB - STA AUXBLK+0 - LDA GINFOPL+9 ; Blocks used MSB - STA AUXBLK+1 - LDA GINFOPL+5 ; Total blocks LSB - STA AUXBLK+2 - LDA GINFOPL+6 ; Total blocks MSB - STA AUXBLK+3 - >>> MAINZP ; ALt ZP off, ROM back in - LDA #$00 ; $00=Ok + >>> ALTZP ; Alt ZP & Alt LC on + LDA GINFOPL+8 ; Blocks used LSB + STA AUXBLK+0 + LDA GINFOPL+9 ; Blocks used MSB + STA AUXBLK+1 + LDA GINFOPL+5 ; Total blocks LSB + STA AUXBLK+2 + LDA GINFOPL+6 ; Total blocks MSB + STA AUXBLK+3 + >>> MAINZP ; ALt ZP off, ROM back in + LDA #$00 ; $00=Ok -:EXIT CMP #$46 - BNE :EXIT2 -:EXIT1 LDA #$2A ; Change 'Not found' to 'Bad drive' -:EXIT2 >>> XF2AUX,FREERET +:EXIT CMP #$46 + BNE :EXIT2 +:EXIT1 LDA #$2A ; Change 'Not found' to 'Bad drive' +:EXIT2 >>> XF2AUX,FREERET * Change file permissions, for *ACCESS * Filename in MOSFILE, access mask in A * -SETPERM >>> ENTMAIN - PHA ; Save access mask - JSR PREPATH ; Preprocess pathname - BCS :SYNERR - CLC - JSR WILDCARD ; Handle any wildcards - BCS :NONE - BCC :MAINLOOP +SETPERM >>> ENTMAIN + PHA ; Save access mask + JSR PREPATH ; Preprocess pathname + BCS :SYNERR + CLC + JSR WILDCARD ; Handle any wildcards + BCS :NONE + BCC :MAINLOOP * STZ :LFLAG * STZ :WFLAG * STZ :RFLAG @@ -1036,19 +1036,19 @@ SETPERM >>> ENTMAIN * STA :WFLAG * BRA :L1 -:SYNERR LDA #$40 ; Invalid pathname syn - BRA :EXIT -:NONE JSR CLSDIR - LDA #$46 ; 'File not found' - BRA :EXIT -:MAINLOOP LDA #<MOSFILE - STA GINFOPL+1 - LDA #>MOSFILE - STA GINFOPL+2 - JSR GETINFO ; GET_FILE_INFO - BCS :EXIT - PLA ; Access byte - PHA +:SYNERR LDA #$40 ; Invalid pathname syn + BRA :EXIT +:NONE JSR CLSDIR + LDA #$46 ; 'File not found' + BRA :EXIT +:MAINLOOP LDA #<MOSFILE + STA GINFOPL+1 + LDA #>MOSFILE + STA GINFOPL+2 + JSR GETINFO ; GET_FILE_INFO + BCS :EXIT + PLA ; Access byte + PHA * LDA GINFOPL+3 ; Access byte * AND #$03 ; Start with R, W off @@ -1063,18 +1063,18 @@ SETPERM >>> ENTMAIN * BEQ :S5 * AND #$3D ; Turn off destroy/ren/write -:S5 STA GINFOPL+3 ; Access byte - JSR SETINFO ; SET_FILE_INFO - JSR WILDNEXT - BCC :MAINLOOP +:S5 STA GINFOPL+3 ; Access byte + JSR SETINFO ; SET_FILE_INFO + JSR WILDNEXT + BCC :MAINLOOP * BCS :NOMORE -:NOMORE JSR CLSDIR - LDA #$00 +:NOMORE JSR CLSDIR + LDA #$00 * BRA :EXIT -:EXIT PLX ; Drop access byte - >>> XF2AUX,ACCRET -:ERR2 LDA #$53 ; Invalid parameter - BRA :EXIT +:EXIT PLX ; Drop access byte + >>> XF2AUX,ACCRET +:ERR2 LDA #$53 ; Invalid parameter + BRA :EXIT *:LFLAG DB $00 ; 'L' attribute *:WFLAG DB $00 ; 'W' attribute @@ -1084,38 +1084,40 @@ SETPERM >>> ENTMAIN * Multi file delete, for *DESTROY * Filename in MOSFILE * -MULTIDEL >>> ENTMAIN - JSR PREPATH ; Preprocess pathname - BCS :EXIT +MULTIDEL >>> ENTMAIN + JSR PREPATH ; Preprocess pathname + BCS :EXIT * CLC ; CC already set - JSR WILDCARD ; Handle any wildcards - BCC :MAINLOOP - LDA #$46 ; 'File not found' - BRA :DELERR -:MAINLOOP JSR DODELETE - BCS :DELERR - JSR WILDNEXT - BCC :MAINLOOP ; More to do - LDA #$00 ; $00=Done -:DELERR PHA - JSR CLSDIR - PLA -:EXIT >>> XF2AUX,DESTRET + JSR WILDCARD ; Handle any wildcards + BCC :MAINLOOP + LDA #$46 ; 'File not found' + BRA :DELERR +:MAINLOOP JSR DODELETE + BCS :DELERR + JSR WILDNEXT + BCC :MAINLOOP ; More to do + LDA #$00 ; $00=Done +:DELERR PHA + JSR CLSDIR + PLA +:EXIT >>> XF2AUX,DESTRET * Read machid from auxmem -MACHRD LDA $C081 - LDA $C081 - LDA $FBC0 - SEC - JSR $FE1F - BRA MAINRDEXIT +MACHRD LDA $C081 + LDA $C081 + LDA $FBC0 + SEC + JSR $FE1F + BRA MAINRDEXIT * Read mainmem from auxmem -MAINRDMEM STA A1L - STY A1H - LDA $C081 - LDA $C081 - LDA (A1L) -MAINRDEXIT >>> XF2AUX,NULLRTS ; Back to an RTS +MAINRDMEM STA A1L + STY A1H + LDA $C081 + LDA $C081 + LDA (A1L) +MAINRDEXIT >>> XF2AUX,NULLRTS ; Back to an RTS + + diff --git a/mainmem.wild.s b/mainmem.wild.s index dce1fd5..17ee426 100644 --- a/mainmem.wild.s +++ b/mainmem.wild.s @@ -422,6 +422,8 @@ MATCHBUF DS 65 ; For storing match results (Pascal str) + +