From bae3f91aab8b2aa26d9cbcc10c49624d616f92ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Thu, 12 Jan 2017 18:43:45 +0100 Subject: [PATCH] 0.9 --- A2OSX.BOOT.po | Bin 143360 -> 143360 bytes A2OSX.DEV.po | Bin 143360 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes A2osX.S.QC.txt | 2 +- A2osX.STARTUP.txt | 10 +- BIN/ARP.S.txt | 2 +- BIN/ASM.S.FIO.txt | 4 +- BIN/ASM.S.SRC.txt | 14 +- BIN/ASM.S.SYM.txt | 2 +- BIN/ASM.S.txt | 2 +- BIN/CAT.S.txt | 8 +- BIN/CHTYP.S.txt | 2 +- BIN/DEVDUMP.S.txt | 8 +- BIN/EDIT.S.CTRL.txt | 2 +- BIN/EDIT.S.SCRN.txt | 12 +- BIN/EDIT.S.txt | 8 +- BIN/FORMAT.S.txt | 2 +- BIN/IPCONFIG.S.txt | 2 +- BIN/LS.S.txt | 6 +- BIN/LSDEV.S.txt | 242 +++---------------- BIN/MEMDUMP.S.txt | 2 +- BIN/NSCUTIL.S.txt | 14 +- BIN/PING.S.txt | 2 +- BIN/RM.S.txt | 2 +- BIN/RPCDUMP.S.txt | 2 +- BIN/X.CPMV.S.txt | 2 +- DRV/CONSOLE.DRV.S.txt | 102 ++++---- DRV/UTHERNET.DRV.S.txt | 168 +++++++------ INC/A2osX.I.txt | 320 ++++++++++++++----------- INC/APPLESOFT.I.txt | 2 + INC/IO.I.txt | 48 ++-- INC/MACROS.I.txt | 2 +- INC/MONITOR.I.txt | 4 +- INC/PRODOS.I.txt | 25 +- INC/ZP.I.txt | 10 - SBIN/DHCPCLNT.S.txt | 2 +- SBIN/GETTY.S.txt | 36 +-- SBIN/LOGIN.S.txt | 35 +-- SBIN/SHELL.S.CMD.txt | 6 +- SBIN/SHELL.S.TXT.txt | 6 +- SBIN/SHELL.S.txt | 59 ++--- SBIN/TCPIP.S.CFG.txt | 6 +- SYS/KERNEL.S.ARG.txt | 16 +- SYS/KERNEL.S.BIN.txt | 141 ++++++----- SYS/KERNEL.S.CHR.txt | 203 ++++++++++++++++ SYS/KERNEL.S.CIO.txt | 360 +++++++++------------------- SYS/KERNEL.S.CNV.txt | 28 +-- SYS/KERNEL.S.D01.txt | 65 +++-- SYS/KERNEL.S.DAT.txt | 12 +- SYS/KERNEL.S.DEV.txt | 132 ++++++---- SYS/KERNEL.S.DIR.txt | 156 ++++++------ SYS/KERNEL.S.DRV.txt | 16 +- SYS/KERNEL.S.ENV.txt | 166 ++++++------- SYS/KERNEL.S.EVT.txt | 64 +++-- SYS/KERNEL.S.FILE.txt | 134 ++++++----- SYS/KERNEL.S.FIO.txt | 40 ++-- SYS/KERNEL.S.GP.txt | 15 +- SYS/KERNEL.S.INIT2.txt | 48 ++-- SYS/KERNEL.S.INIT3.txt | 289 +++++++++++++--------- SYS/KERNEL.S.IRQ.txt | 2 +- SYS/KERNEL.S.JMP.txt | 67 ++++-- SYS/KERNEL.S.LIB.txt | 10 +- SYS/KERNEL.S.MEM.txt | 10 +- SYS/KERNEL.S.PFT.txt | 32 +-- SYS/KERNEL.S.PS.txt | 154 ++++++------ SYS/KERNEL.S.RUN.txt | 22 +- SYS/KERNEL.S.STR.txt | 140 +++++------ SYS/KERNEL.S.TIME.txt | 46 ++-- SYS/KERNEL.S.TSK.txt | 20 +- SYS/KERNEL.S.txt | 25 +- BIN/HWINFO.S.txt => SYS/KM.ATLK.txt | 0 SYS/KM.VSDRIVE.S.txt | 141 +++++------ _Docs/KERNEL.md | 99 +++++--- 73 files changed, 1940 insertions(+), 1896 deletions(-) create mode 100644 SYS/KERNEL.S.CHR.txt rename BIN/HWINFO.S.txt => SYS/KM.ATLK.txt (100%) diff --git a/A2OSX.BOOT.po b/A2OSX.BOOT.po index feb8860e536e8a35b0ae748b3a28027f81c15b23..c2916fe472e84be13e701580e1e01f3b3cac7648 100644 GIT binary patch delta 11620 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 U*AIhbq~XEQL(TY1bJ@cG1LCwD^Z)<= delta 10876 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 diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index c7eddb71c93199bb6fc0e705c5dd2c6e0862ddaa..36ce459d9ed974eb5a694d6911fde36421cce30a 100644 GIT binary patch delta 92930 zcmafc2Y6J+)%M&gR;>1_t+uImAt8xX1w?1nK&T>#j*E~MkP(uQ1O^;?y%ZO)0kgKo zxSJ&IHa51AZ_|CKQ<%zNh>>(8=p|Xe$~F?Om0!alXuOSoO#k_I5f7Lsedo4zg#;pb687y@|F1S zXf?iEk&22h_0X@GthlYGv1zSWd{N4$Gjt1kC6<0N6kE3Q$yX8snsGy_nKBV-P0ln1 z=9u4iJUNzpEapj@^B-C$S+_l@yO-*QW2Tw?L8vt~vt~xT`Tf~8`W4TLdsa5JwMDi2 zyq3&%WSYfpSr@u3b;`IZldZ~0bO4b9q0MQp&dOstvlf@MHg$J2MJj*lM@L!=v+h)= zH9dVn3OkZ(rtA^jOJL<@MKAh{%ujD;RyH$?+dlUu3b&Yc-2~f5-X7np>#mr(b4q>^DhlB*&S8j%5s-U#zXAo{Ig9 z&0sfKD3cY$uwRXYHfLlScNfS6_N%_o!HfpuZ;9-&+`2fxv4!5qNKZ^-drbA zj;wg{pBXcA6M_vrEPf62G{x2LR%#jQhEw)X{@W4&xClFO_cL>`OV z$WDz-j2~jwO|10gS#y|kGwT`~9G>ts`a{nywP_cHzP2={>|%Cmd}2Sq*EclQ@7}uA zKgQgbT#$w~-Is=vmbn~#=#6y?HL;Ib`tgx75SqU%d#)dK`~%Frm3gaq-}n$9uJrFU zA#MXMBh%6VanAP8k!9uE2dNADf(4b#b{X^5@X?`B=H6lUD~uL~-aW)l^$qk#BTK0} z30)eY=(5&f!f}*YN90tNjE1t06))bUhPH-T$4~%GS;yI_0smfROsK4CX4y@h+=Iy- z8eo>o@nP%*KBt$*=IFq6Z?K?-IdWA|ESwaeU$6n4tn z(or8oV#RuIM^mr2Zb40{Km$Q%(1vbf#1aG zg&CpX6E6Pp9801j6JQ#BL1LFHn|zH;-E$gFU#j!>=2)_|tjS7CrIyXBDlHW}SJ$&_ z);!sIPCkG9t9q7RRKRzgwiRlHe7N0Os1@;#D=j73EZ+5|o*7px%chlt7Wb!WvqQnH z&QR5lQ%fvm81RI0A^?nZVO1q_%wZVorEQHHd@aGQE^kXCOZT#qW2st2X!WkNWl5Eo zs!@;-&_te56`skYYPmuyR89?YXzkW8OD$T-oJ-WoU%x-j(=d;nn%E02F`uTrpC!~u zS`!FZ7a+55FH2ZR4G~sY#Kt1k45oK6fTb_tt7|N2{0p%bcfhk;5^w?L+1u3J?d|9! z_G|UgGU;d5da*c}r2!S4jYRh26MJcxd)hjC_f|4X6Ec#T*(uTMps#yH4|9NNE$!*u z;KN+YiD!4(8BHt^>`P@} zX+}6$jgKXQgPB>?%(FTa@Vm9{(0hJI9ZT$qrd<)gb@(TuVkMd7DeSjL(^8$;QvPQ2VwlZ3o{q&*JqA zF`B0n-uj+kHM8!N0J4Wek8jHgjL5H?QHDuYYw3tsT4)X}^z{0=ds#L36D1b(&~EMR z@z%F>Hnf(RU+cPCdYi&uU>{frV^ILT9lrLa!va7pbAqvXeLcbarrwo%1Nnz2k69-q z9`@a=G}JgYxW_*hY{2jmyA!)a#^sC#z{Kb}0tVcA*YvOyFhTmHb_HI{u}`K5ykt`H zewkG7Ya~9$lCKcofnYe{bJGhXTq(ahyP7&!;#Kmap{=v0i6sZ77frr;`gdB8wb3{c zen$y2^_yiLkOeCb`-caDAjmQPy_aVgtp{Zva}P0v%}GK3<{C9ov>sMeb&VpHYh}IS z>zEvhV?zU>Cw8U!z?+=cODb+_>1d@%6a#fsGA}|$E@#&bY9$N))iyZn@9AafHwqqh z3_L8o;W#+VzCMCmMR&SUMM&+)CVZVd^P~LIqGz1-#9T>zQ$zLZF&CZ~tEqxI-Y2 z6S(t#Y5XoMOZVNxY$ZPnPaCt|qZa19YOGHyI{Z8f)7eql2_l2({zCL%cJFQ4;~$=2 z>0gxGF=QEYX!lW1^o93_Qitl&JP%03!|=S_dofCB5Au&Lj`ajw4@Fw?HjRy4D;Ubd z5}ndVqcW-5H8eXkG^$;1{n$W%-}nTJe+;eA-U6aXI3veL>=S8^W6&!ng^UAEvbGnL z+Ur}{!kkagNF_tO92H%Fba{Xko(&c6EQoy)1D5+#sB33V;AuIYJ%juG;H1`bQoOTI z$tJpc2^yr2gl8hTH9dz}zRm7r39rd+(`Ycq zcT|zc?w9agxdRmxZr#d~Uzhm}BfEzuAlMq;qsovIs#ww+5jYrC*Z27wOD&E-!VjXV zr~GhQbriGw2;*b@v6Lt+Kfy=JPYF&mb*8*YYYd|azABrI|GA_;Z&fu*c}tA6nFpB0 zFBIKi<4b=VAf4|3KsD&4FBqO&*SmzDGw_~l+W4h{Sj`;2k^s#iAS{1Pi2a6E+cY$O zYgVdaDZje_jo(Mm_yg*@|A_ikQCO5!mG6yVu0Kgc-dBixpkP)p$A=dnVtf?NwR{Yi zwogdK5!>*e)oTBXT#( z@m7LQWgLuP->gB+VboObFdH zk$#aYQ5KGjIdl{wNmhd*W=Tf#HoFE28h~_Vq$t=>jU33aIyERbP*hzi9V6mKdZtH% zw#xgSjq?5i)|JS+O#!LY+{TxP@)mji(ZPekxMKb zOR*IArk0_8)nsVKo|Hg2`UAN+ydtf0s5ZvHs~}=2R!D%+OR*AQQmSYmqncvz)n+B2 zQF8$rwGlMt5*qU~Z$PcZh@cOmb9T5;-b&?DlG~!nBRQj8*629DMlDP4lr_4d zYt*ug)l|c3=|*qeJz7ZH;naEs%3W);P}PnOZ7m90FX z>v_EW4Pd7<$$Ds;`! z{f^P#T3_3mCT9O@1YGLbwKEI;t(9H_K>N=ww9RK^kLkls5&Fv6Icq$cPD}^609q49 zewMBavyp79X7+);fdSF2vZ~<32r5%)mLG%4SmENc_Tc!$$e2GkI1xN~!{5D*G`Ryr znc3pfg%}lNu8i~ZLa8_I*J?wd8!ruz1p}6XeQNWW%Pjk`aim^Bx-B6dZL`|TtWb?$ z)?=g+2_>MgvY91Z#ZF1XVSOb_g+@e3uJ<+$ZX2AC<~48vD>NhG$W|ymB-~jKqQ&vC zRAxOSelSvLkie`^Y4A7nm1CvZgTrX@h^%NpWf43TMg!<7%ynbv(&Ns+F(nj0KZk-s z7#GZAR_G`sBfFrHjBg=xoIpm4d^A@PWDt`^8spiCm7{%$1D#!-hI9(sr958>dtmjsjZ46?>)mWYy*g3Es%7?1M*7HO#=&x!lv z?J%!}7tre`j)#tYk`x-dDaWv9Nw7rf_uka(bmWD&dr1$jZ*iEiHRAWdHNOW@z}w zwGFnvg^bC5BQrnTUg)aHCL^;*5)9$8~#@K9stV^ z4ontm1*dP-12q2z^eyh3`B6JC=OD~;^GAR z2{OAan&H&WW=V#ADmTJhm=O=lu+Y7jJwX>z$i^<7`(0aFLa|+s@J8PHU0b^0NRcRE z4*Bly+LmY7-DVx)T!gg8OyF;R*ESlT0XwxxP<+$tww&DTe7&h-t+&I!ccN){4^=xX z87KW@)`GK7y{iXYPSP1@8LVttU%#f=+uhm53^!2>2AfqKj%v{RAx)IiQ&@(d%!YCMp z^b=fl0keR#nPZm8N+WF*D=rFBk8si1CKs*2q?bzcd_4`+0dT=GLL-15<%)mKK{LcI zz3Oj;`itd4=?PWQ;9z8?-bTRH$lh9ORqwE#yp%P_l%qmW?xJ#nV&TAOQt1MGyBqM2^i*OG=R&2w%m&>K71F~la5Mr zC;^w%92|#t316YIFC_*V<24k20Us}HJG(UCYQ8IZ&!q> z4$7aw(qJ`h)2e%^ZLIXxE&YLUIM)u3z%;paXyo#|ygX)U2ht@S|2LG{XegZm$^}4X ztp+wjebLIT4`qP zoR$gV9LBubM~Lf?TSel@){{ z5#K!~{dUqpUslV~oK)oAS1$>@pO+L$dd+hBTl$mE*G4VckcRC#j{Yr&4?yHk!(DEIwv2Fs`n6 zNE_0**50#1!eE{R{>f*WJ1r3f97)p)bgyQfWOA$2IN@%*m6~fA+hsOqgKQ+gGlz3p zJ!mq_aIu(_ye*iNGGp+Eyqx~zt6gsL^|nFv>-9fdl>9N0^u zsx`NvT8^xS9fhhj4@IhBe^J%2xkOd#?P+D6LQyRn8w^$J9p4ddZI)ThUBWe==15?J zJF1?0{)HD`dik~6A&31s=5O(uMgEJ4jg1Xy`kzyhvH1`qEg9_^CkZgMl&|(_?%D8k z-p1mwzjbgg^LR1VZj#hQxpgh%km>GS)8&PA2|j=(=BeUU{koI) z-5-;hm4RJH0Xe^1`dps#fu3rVViy|SzV{l06ijZ>bG7+AZ;PJktdpJdE@0&Fq%~H! zkgwjN7i2F26{KSGi9$}0niqC-&k{i?vDkT7>axi%$GWo;vENAf13hL5_4sORs$a9B z)5lzm{JkweHGR9)In#-aBotAKK-U1%6{ubuN`}N zR3>0zFP{#RhS$`coxdoGw_`BF39Ei_Zf%S5e>Mpeu!)+v5=m^LCP0)RZn8pgla){h z+D7^Y8prl{8+H!(#>V>g9gqTYR!iunw==a>p~v3#Xsv?BJejP=XlLK`$K)FW<;b(CIUDX>5sQ7 zl=JuZEW#3Y_8&vWj5_pVYBWYWp$EvV+tuAmmVa-<@B~CB&vkN}FjKpH-M;o7mT&R@O4>aXEy`POuf7-mbBc#?BsijrxL;rl(wEZ)9<3heNl-Um<1Xs%e#la6RYLM-izObr#WoD1tp)S^|y~%zaV#R zYroSbSH`5BOV!F_;tPle zD{|#aGPF6f9N@iz8;MOw#57sKdtsj>*54=3AT<6L#e8sJCEgNvm1|} zxQYGl_kZ}~pWgqVZ0Nu}uY$e(Wzu1pVVQw{7OvfE`^)4W&B{I5+7Dw!{lilqW@{%k zPbv6^i3BZzL!?upjeB#oOSEdP8+y_z030Kgz3T zYm2fUQ^~M@ok4QKiK{OH)hFPq!qnRZ;i2L+iBa|()ZFPb6#)p^{OOpOx zL<^CAxUmq4C<_$G-o7nEerAPWM3yy6I>vxhYGLYw03rlH{gLkMMQ1@*>N7(HMeePoeh@kNm_E1HGz*icTR26`f^>41OF zV81^&jIzO!uAYgp*(@FrT^M8pGcIIlCA_0n^Ase_M#c3s*djE`Q5uHR*mT<+caDti zIt?E3nP!>%hV8R?B3y#Sm8n5?mPZY;!pcq}lHzBys#va<&#BWg1K8N1q(^1Jk^qrO zM1z^SFE)4Ps4;b4b8#>iwsb*EGR~&i+lEjS`&>zWvQ!lUtFX@t9t^!@K21QKnhnTG z%vH6J_PFzSmjirH*|gO%WCo-t35CaAsb>e0ppR26xll!580|Cm2CQhfgKVn zQN=`5E2({0(VYaROY9UX8_ipwRWn;RSz$=UbU|GvRc_i+hze+}UK^fLEQn)60d#$O zjNE~Sp5WH8k)1(+sQ`BpiZt~jZoQ&b=Y|Ni_Du9m>>dZPZj2CX5&~YM7x?BVvb+dc z4Go~j&en3o2nYE^wVE}Md2yI56?u!nXz6I~WO0`$YAm`mjJj&|Flh(o`j(8w*>~Zp zw}anD(IujK`)ST$#KNLzU(xLikl3{b0agP-91eR$utE{0CRS+TR_a9ij*gK5EX_Fx zP799tCw7kw2O+z8n_JqNf?HuR?+b22NY^k8KdnyTyNTZ(85*eWVjV9*0a{Qj{xW37 znTvLZShP!$hSUIVC%`NYk!*tLl@DVC6b?tH_g$_|Vh;B$)@E?aa_z*7uH6$2Q>T_| z+hQ#H_Eqflo@>+=&j{EH&KnI&At)%RC~6r%$bp_EmO-&3&hR2kDv2Ub_^fBsa8nSA zFzS(yRS+(1<06jKQBJE}$lEf9|7@kUy1;_P%{*Ap)C=!|`G*^Z{C&f_N5zIli@Ugv z^A>H^PONQOO9oc=f(4UeIblt+_{I31KM7ub2>OpiJtDhrr-&E__H{W%&0~H)QhX`` zy^mR-9?ZYzLP9`4zGFg~wQV-TEQ7ZPxM)2X;c$p{d22wfkdjMPo!wdqEle z&s#LF%|2mL7q95omKqM&h|D3lvS0gpg5%mKF3;BtXrqP$iiug~M*~`wkqH$;;Wp*= zYoBTec(!lTTp2Vt2WUwyQJ&3bA~jpLX_X1(FGOukQ#WqYD)e>fKPQy-E3!UN5Ru1| z-lCj+G6&HIZ%b$ukrMWI%%27d326t+60!en0z6j+=Tni`TT?#U zFfX!uBpu6yn%T^Xpcf&ZA?Ss<(lyAaiZaj~)=L5ukc@C0zI<3)(rHI9OQcZsY}hQq zB?w7CMTm=l3T=V8iZta^m8}YoqGMLL3V(N4>on{LN-_0;Wh2@T-5EhUw{1?ZwpcE|gv~3?)sJzb;(<#4c@gvP0W8(}`dQ#0&884sBp^ zmgX5rG(~RT*tQ0?fW+-?u|JIm`^L8I-iZj!U_Zsf1>uI9*zOOGj*ayD$H$Slb0^7O zLx_p>GMFZXoIbpe8Ia2%f>UZjyh!cbJpu83UINm2-k6r2A1rAZ?jPDcFgUy|STWi+ zvAv>y=fG?h2jN}pS9wXic}&Z#g(PlDfGMCpha+m4iJ8G{V;@nGKaj~;s+-?Erg;Jo z$4RO&AdV~b+X5M!+0w~hERG9gNFggO)7+@D2v=wZ7ziITvcvsJ%Tb$ZcsvG&pFoy4VuK@3f>b8E03 zBMc=4(!A)uyGTkbgvwE(2X8ef`@RWHpR(=I{-)U|BCX9!LF*?UUplpPuXbEFglSdk zF#Mqk&B9Av*rL9sw zPhO>!sGl!grB$e(f4NFKm4d?rg3&cefGq=i`8@$G%>vtF>8<<){LF#{68<5WX-ugY z(X>q+y)1JH75OBfc?#2);b*jLwW6t47809oxsOT?T&)#vcGVLwSdP8bq}KXH5V5OK zREM`yM(S=So3*n^B=#w@vlpl_ST0L%6-z7}yUWC(vW%6;;FST*ZL^Tz4Lb$CV}e>~ z01`Jz+e%Fsg$Ty1khX?E=B3YOS=IP61QS=k&$DL zURf|I$yK*T?n|f(bGFh_jkOWVUI%C^)=NgLDhgGWzaP|U0~^!|fvEtN4`$nB#&X&= zllz}UBP*n9p-x`RD9jm)K*TkVdwl}~tQ4V}rph`+{I?4Ws*n%hLqib5yH09MGQ3gfAY|-cEAv6e2x^ zqf?CV6u&{M*2vh%U%OH36F(}CX$xZf{vCYinAQ{H9~$CcKBm1RQoe9pI}+pX8MdGM{=ek*T~JtEbqHpnU?X^B#ROt{Sk7mW3aJ4^tr1bW|AVcy8|^m^j`?U^5L0C- z|0O7b>yRoq2ULd0Hs;jKGlr1qC<79=1Ho*9?+EF+mV|ICBG*K41;Sc{?2qaQYhg(U zWucLyk{cnlSrN%Xt0)=4ENT@IP?kh-E2hd{i#=Ecr_?b!;#R^^Q7t%*EndgQC)Rp` zE<2RSlTK-_KoYeDl~(!?s0Yc^14Oe_;b_}_vLlNgAjSgWEaJeWBaE)qsg6LpB+xXs zK7Ev$J9)L zEn;vfhlC1d)F4ajx-6kqD?R92QWUo2c@M2wb&}dqIpo3btNEN)N>-FwbIB`GOM%t@^y} zzHV}>kqoyN_Jv3yLSHQi&}E)weE9~$owhs-#DbVy7>`f|#-p?bKC;0`Er4K00&z41 zW;7|ewvMGCJeS{ex6Lu5hIv--R{)U$bA_OT+!iypmU&iDuA`%x*;>s=VOyJ~*uJ|R zG#x=w1ZCB*xDHL4E|NNFpu7D$5zztLMVbz27Ln-bI?t*%(!7=o(20>rEz(;oGS*l=0$pUn*dyr~cR1Qa|%&I%omMA($S zPRl1A18pySz=y0jKB@89{%P*{aZvTZ1rR3wFS*%fea0FZdb|xQecde`-iF@pwrj`? zSWs1SxS^ZHL*J7VRLQJR^{83Le=lex9lf&YX#q`B5wAF9n~cL0g5QlQ>|<2e^$Zy| zZGmFQoUt%gR8EQ(3#;l6`N#WNJdRMvHbGN3Nx@R$6qDW3G~VA%XC4!5CiBK&p%hXd z!39f3FB2^hW5q!VVwlzh*_JB_%~Z)|(65QHp*aoAz*z}Jd~TeRpmh%4tqer;Hnep! zD^yDX1sbI=Adxzm1$7cZ(UXl@-c;V>+J}~SGVGc=B+oskWf+Sh&M@A3PU|%s%IAeO z!Oxu278(wShUVV*&vRtrfZS&$lucTVqesL>`Kp=Cp)FYMns-KbR33AH8l0tA80pQ z>QipS@+Y@-&%}<-Etg@5TaU@jF8MfeAO*?{q@R%K_M3=dz$&IP_|JZ(6{o~aDu&_U z#4u2g``*+pH?mB@2z&iE-_+`~$%T4z0B2(xR$_2r2^GTLcGg9b2BZr7ubMUoW`%4= z>@evv>Em5cc^GmubMBZ{^g5cG6v%hcUUMAFfS4DZf=H%e5HZ=Q7O<2Nh)B`7HOw{| zmV$Rll*-5WBX4PCapUqceIiu#y31P$<0b?^Z&Mdb-J|^66evJPjIW`1pi*W<7!&o$ zvzPITfjC$8KKY%nANAT=dU}JM9n5-#Of35xUyFcz?Mfc}g;uFu#n0kTaUdEp8Db6- zXz7kNTbtvnzVB_#mPbB)5vqV7a?x&LFx*aaGs`%@OMkDWHyjKncChS2L_~3UL7Z&w z>|VH{3!?i-aLeGf;LEl=mUuW^6!qh-!B=w&DqYL3{k@jebX_>NgXLa74N!eYD~04M zP>2CdJQ6NUppKfLZs30asMZ_9xd3(Sd{EWXK^+elCQv67sJNR%rw_qY_)Jm)coLl> z7UwqIjKB9s4M(N4s5G6@oEg>_MakeoW`#qA^DCL#A}hs4(wTdvOal`#%QAPIOaljs zq!|ME3=7x}_xwpKOiI9!tVnjUtO6TWBrQdzfyG49oB~XS)unL6(JV9b5M5m0_Q*=G zR+;I{ohH+8Oe>O>A<{B3qtmj~M>oPe)^$(4_`X)J@q0he9Nh7Y@o+;BhMuu~@J;OO z8yqIP%ra)c!X+5wTxNxBi#BdIOj^?MTnF77MtA>S#Hm>d!5DLk_~DPVoOB%BlGd{* zL9nT-o~0J^Wsex{xv4m-MVzjn>Tok0AF%&YYn3bm2e*igM^yta7RTw8L zykeG3lww1J3ooS#(Zw3%?LBwJq_C}dY)6g_ zCZ}KB*3F?Zq}3*{k31|dufl~i1V5ZtwR=qmQa(LunZZt4*yFh~-6%H9H^=D>$$yAp zf6q;#dY)0L$Iry+u0R6Bd-ji9JrU_2DR^_jw-*Ul6#KLeS0?>B3(b0|dM4dy1dJKU z8g+;3dx9lH{;i1P85_b zfYwEAIDE5_?8G@l+TK^T^w6$GvGk12B#O-)L@w%s!dYekS)Qf*Q+0T4Z?I(dXc#3B zxc~|)dJzGI?KTQ1LjGVC!YM@nO=i{-1r@~3a!dIQ@p?|6OaXwHN0dwl5d{XY`3ek( zW^I+Gm~O3-$yTU4w5fo=Ag8Tf)6#p=Y65TZTt>Pf#=&O99CWX+p|g zkcf==+8UG2U7+2tl-S%bG%}9JrLG6N>X+;s^9BixFjz_*Sba+=%O%z-bHQVK1Ji z6RF}bZ=09mWxKjN+q)2J+Qsuen&EQVR-1Z}wOclw-@{)`)bpBq<)>$j77-9TM#gp` zpazH8lh>MH#b`4-jv|`!Ac-~1vK|wgzkydK>3MY~<8%8srO;^~}`EOu^Zdn=LyC?hqeN)^oi(6yZC)fi1^Cq^*bfc1bpcARuD z%0&bX{*b~QZneYFInWm!*U(riL7XOUHnUwzXb6hDPSQd8^-*+y717aqc!)1e(P#D_ zq1v=hrW`dFggLa18=^>3s%F+3fik+6d`u2RiPDse<6#6Lc+16blWe-+B!3`9&o2(i z5)pC~`pV6!@GY`%)+GNVMb8}IYD5+=<5r1QK^=3Px&WW#+omDSthdwn!R&O$wBcvA zJI&Fz-laz5ZobQ*r)l@lA1A-tpOI?NrTc&ENa}Gl*W1=dXe!muXs5o zJ@5*R_N0h)MyP4>m$k@EO89nsMWa57GtWI<`iZMWG_ohEBw@!)`I@%9qiG$@wmL7E z@^x)Hh?_3bQ7N8p(4zA;?e+J2$p#>f3Rbbzj&Ew)O;fcxXzh4a+un;kp0+}jWc`-x zj`3}hg4eXSZ(z39@UycUk|*w(Y&7q2n*Cj#_DW32rq?yo*r3`^{+_m_s}DABamJDE zAwdZUzsE&%G)wwEKKr+is88n)WNzm$?1JL_B(5s?q3F}fb8h|jiN%=?nAto0ms14Z z2H&x$4Fl&_;M6pY0cl10mGN{q)hxm9FVYL+!x8i3HGc~!lO?)yauyb!^YqO3CyRAw z$oTpD+*zVOo@uWNgCi9ip6Y64I6~b&mgw2Ju6ffPtI|0=KT@iCw*K$gcEqJcSR>%j zF)=a;irdQU@RFHGZz(sYOh=$1rb z+5w{fDb-62`$ge|sk$=V(ClR}07N5okZ&m0yX;lFs7K*Ost@s(%JuT16u5IDi8utx zigush>h(N*j=srWzMq{?&J?i`T+ffr(XX_Z1g5ulJ1m&b3c)Q!@VlhHYZq9w#0U~_IZ4`rL9b3K2pQh(20 ze*5_i0M88mc9p(tS^3@PAxn1lzHQL(g8d|Q;4i%IhzA}HvdVj=!ztf)XliS<{#f#ifi@dW%g&I;bN0C?km1D8?xLeK>``Ql~F6 z959KR^b@~8-)z`n-ZZ^gdl%>>h8?y`GvVQtBf8`2^R)QPe*5+eP}a8HVE@;X+e$m+PIH;c%#3543l)PhUFQ0i8q*m9^Mgm^2gr*I#68z+190X=mV9~sv?-6gVD!htV>-c+zcDF(_Yqf973ko3xF z1&HesBh*Z>t6pUrhWEAtMR1siYfG&ew5Ej|3F!>08QOt}d)QP<#DlnpxyYuVYzT#L z`QgG5G5|+K)4`ZkhtY%ujZO>+^<><)7UH6TrmY^02&yQFzmtd4^|XjPsCCT#LWt^4W@2!>?V6kYt%2->s<-52l8;3 z@}@fy<@BpW3KXy;VLWn@iB!lb8_791^+L1Wpv82yHQu*U*Qa7u>7Qs?CI4%yp2O4H z^d&|S2E`=ht!?@V!$G0GWTJ*8G`3y;mma8r1DT3MV{xEk_s%W2)^B8Mu&;k&ci)g1 zYvUiM@W$DfpO51~B*XPik)z5HKQxF7&2skrFG!E?7#t0DLC9bRtdUa(yYwry$yJ(* zADoI!nM&!_Kh*d@uYSMbC=ZkQRK^;;KsW5rs!T52u}-gq^*WMpY@I$fxzQNs!GkfG zQ<>}ae`_^Y&SaT+Ub+bR;E+`Fymm>r4Wl$B%?Gc4x-E(;oF%jwo`dBth9UA_B2BKg@2HWU1mvUv%?oa|70Cc z+N6K$zRmiKsgz4Glr{1cXU|waD0enXds91wB_hvycJCgR5hn?_#&`i23bK!-x6nzz zG#nJe@l3sJPno7v0;zB3in)S?r-I%3e2c8aK{mMZBV4ZAdy=X_< zz@Oi5q-q-_)J+7nIBhckIMvP!MI;Q_dTv0Ew{piu%Lnjh!1Nju!?iCOpW&X|KMHsK z2g7=)_>n%Mmt`Rm!0SUyly4Nj5O?B2_!N09nmZ{*V9SU;Ta-OEqF=2I!|eOX3ANiDx>jUkJAk@i*791s}nzzJE z;6I+wJ3LeloE-d-*%3NyGD*ICx1P4z4ZcUb)bv8PbmEc&77yMb9nN6&a4azwxL)*a z#Nz(Vc<{e)DR`S$5yUa!Bj!skHIno;#w&jj<4Sk5hdGhpskDh9go!Qel-+u3k6u^_ zVq&h`GfJ@&5y7Gp~OI3nT}4SL?;y|N^jEL19U)lT7eV@Eh+(?ft?7i5hr)Zb63OM z5LeD`1kt|`UZ%mYLW&X6%p#hp#r!d}6rjsCrk7f(gc}4M5`T3sXBdM<|AfDPqUs10 z1;H=}mZ|Wm;G?rcoYzjlqNOC1Rw)o^q=g0nhy)5Thv7_dwQWK5e3pqdEWI-|m4|wU zMkaza<>C%sTnmZ@`O8_$H09|;NGKL$F|*4V}Z~Gc~78H%Mu{RMS8GTmVm&Dm_b#-3JFb&_7y6r zhE;x!zjTXU5ql*Dz2qwXKey<`fvZU)q=N*}!^m6*psg|c&9Vq&2T8%!TjbG4`(zkg*NO%N3>zG1N%OhoR@AhfQcBEi zYS}{>rfbEd5`*J5cdFHSmn5c~yJ;0E9(Dwn@~?9}iCYfnY1Pit)EKm}?seiOaXJN& z`FUDCvPYCyPY3P05$A_Bk@^Lmd#mmVd{NyMbe|eAERFlAQxBYnyY)dN;0hx5L$bHB znReg$l`W*NJS>Z2C0QQ<(jzGN=y?U(I#JN_7y&<{fOmH;YA5GAvpkMu=M%EVH1X~% zGF(qmd9!c0+KW1u^%Vc)Ry|XDnkSypQwPtfeoU!;!1MVG!TeHqa>9b0B}in5Thgn&z4bI%uPHP!S>KV9<@zqa_cq-bcpc#4zbE$_+C-dhL^ctK9>N4_ z`@T$r6z~HSH-1RaFgZ2M`6H9w$WBd7Kk%h@=+)Yv z_^vxZgYQ$*)%>;F^*UD#B7i^lXR9zaV0suwVyGbewSYD`ZszZ1TqobMm%@^e;Mz) zOP?EH+RZFgGtUlT44dm)AQ5&Et;g%irBVxF9&v5VJwv!ki0?%e^H`*d*qi_w1?*Y| z1-OxM2B+$+XeAvdqG}hMH(ps{z$^$eK`^g0FaeB2e@;BFzFRL(OF;Mm9YRl3f0N|j z++=?F-Fl82@g@{5n1J9m>b=-8XF2#Ick4v~gtUoUfYo;BrbAMdlWN}=Q${2Pix-Va zJj`5jYXZf>+Qp1?c&zB%4ooTh?qUe%vh+*f3d(Ix68mxksMF5)!3R(7#P}sBK@>Aj#S!N(&er7Wn2_O(XyQX}!9Di8AQM?#Wn@AWbmkrIZq36v~(7?xSSEWfF+Zs7o^4Tlf=S&|NwGl&eH?c_k+tY}NtU$Q(ca%@_1? zZ7YwxF)lk$w$1E(^V~y)%}dtezBC+M2(H8d2LD)jaPE?DqlIzTSVmy;`5;SPZ|y?0U#6F6bbAN``9q7Ctvzo^%` zcS=+$50gI*7rWprAzL`iZTIO5jFCuH{@)wpaBgojl0x3$YgJ_BE;Z?6;cPLMbE~lZ zjLW?A3Ca^{GF{5*TOU-9e=%cscpY01e}IEKM2fV`ro9igS37mF5-t<=MMW|v>{k&; z^xBv83b`Z=#3Tq7Q^k@+Gy<-}3O00$B3DU-mInwSXx7Js=e4C{1^@PadU+t9Ex20c z;2N%@W@a$ILXI~AcIgfP-_RIlYhO@FtNsBm&JzYB6|1Bt7+{0>xH5j5e;l_5kOnJC z79TK6wsuCB>=-GSh%Q%q&@9*4S{;VS-??8;%MgI-4w(g@)lVyso0`vR4x721tu>L{ z)eq>NOo_<6Ys?a@ozqKXC%^}NtsJYu>ok7iDLu_b;fKMt1_YS$dmn&D8`jPTz}JuR zw;#~wYBzA_gLwYAqV&&~Xu2X%Leil?woq9;*W0E6-Il(%ao z9)oL!a8rFN&w5C&LI`N*L-4`h#z!C0J#@rg9IF@GWesb*li&Ifya#vjw;s~H&U+-c z7eL!uJJz(bS@-hnhxMZJ)92?v>~wz~+!E(PrfUv$U*IDT>+@s3h?a`)bzD7X5&VLS|j&D$L z$k^fHbH2&r&VXaS%IBQ{_TT20o&nmg@xU3~o%vl=y83W6JfyU=!1(${aLg_9dpNTJ zB;VlQ!JoMAOK#x$0srKT?u`8rS}gi8Hy#I({)AUPuIHEkOiG4kyXb84n~@}6^-5;_ zxs(kcnFEL;;CfpQ+BCJ^@s1n`=*Z?sINuE?g*CId_h@qHb-Z8F9zMvNzt+0jsc{O5 zLEOcfo*UTW-zY+c^4ZpjH<2(dpy5OEViKPG1lHYedF2zjC-!&fQ10(}JCfXgkWzv5 zk8&fn{0Vtg@ACss=#?oSsLlC9Nh8@GX}scTJ>7sLFH^EU;eU8S&&>EUD!Kj=o>dd^ zgRJ?lJol{Ll=(N4H%lsC-|p>R(;;NQjKA~XSv|e^A2eM1nDNgr2ey1lQ2!-Ft!u_` z4q^mXz}NdaT5)Ruavc8-w`Y!B{eSp-XLVn}f3?!PWVgrRd1z=@A`qe*W|mM7wFze*7sc?gYN^Sv{}3%eSIQ z(qwL;UK%XKy?WvXS^Q{jR444m;ToLH%941@(|W0v%)L(|+5-W0WU2I|=z=oVdwbiv zjtE9r4K|kM;6qRAsk5E3REkTYgj>F)?Sm!a5^KTrs6kfg;g3G8SH$5sA6e7N()e$v zsdS!v4oonESDgd*&g32E^x{}LAl8)4uQ;bSR^Xy*X2)?blCRCR!5lajM$~8~5NE&< zF;-c?KRl;b;Ig^wDLpf`h(>ik|6~er4x6U*c-)4ueG1vd{MIRb_H3L7lLk*Q7a$-I zJ{$`M4u=UL8d1Te06M3P|8WXhRQdVEd%7D?ynGI?ct*!VB7D;`x;GXF!mR-YNct+1!QY)wV0*bZHRR=uhsUvDQ%ZWo_BABpFj&IEZ?)j2l9k)<^ zHZ9`aU(y>_EjEwQ37G4>=mm*>VjZL{`M;W5s+wCCK2}$?oWJ`ey)w-wkGomxRqGA1 zxvEA!`&qE?CL*aNCC#8Ca}D62WYP-ymMa0D)|Il7r-i@ttnN-*1vKa~#a8_&9#@q! z2aPbJoqzbOo*vtw-^?!VnyzFLQ5@y^9)|?gnPr2(b1|vR>Gb*twb7$>LW(kB#|a ze)f62DE1N*?7EcFt9jB3h!*cV4++Z_l*sKj=^jI01s(~bW;8aL15x=Puxn|ZfCxhrl99-gy;4sJY&gbKld{J#0z>Y9wfw{EFSZs?wK;foBu-HAt6$Rd;)1e3(El@!pWEQr$cAHIa|+6<}bahXUw;=rk;kLrqwv1yB>GM39X_E+Ea=&FS+Sr z=lZ^Je;d?1$d2+!)>J3AzoL71>rZAZ(hJhm!>j4y;Z<<9;2cYi8=g4Q3!w#N$zLL< z^}a9bIuBksBNdOVzCH(Ut>%aqS98USt8wbBRd+sLonUj(U4F!la|-F{)olK&)3zpF zZ?SkXt%wm45jthk7-lOsU$mS%hX<^dG=9m~AcA;h{p<>QuJW=<1+6OTb;%2#t1PUR z*cQmU=X$(i+nfGCrBS2G;LY4x{G=Bt8#+7Gdz3|U`8#`zf`E0NY|uXc{C6qU9r?}$ z)8D0}#{rTS!axdrsl*FII^q!#byUS^9HoT9k{8RS&37G>mz?(v{~Z;t_XX5rl?Y3s z1mM?8ZyzKh0!J2*`3cIEC*P{9SB1q}l?e^LklZ4_R(7^G9fE#}8~h}0q#Pcqs$og3G65uc7|ubf z3i8Nq=YenNS##iy7tQrUSReAP89ms}k~?J@clAcVW#Cd8{dh6%d(#ui1#q;ZHeoK#oY*wWL* z9HTM?`%Yb@6#cU8yTWNCsX_i2Q^s#7a^pPtRUM}hC)5gupHK(|>MhsI%NhUdhkCk? zyn`^rS>YQL`THfVX;+BHEydGb6r1hEP|(RHHs^E7EMIrHr8(F?Ud{ur;<(6_@G`is z;(-SYS0Dh8bUdW$@ZdPD7m785l(>w!u2!Ca1+baEJVPDr3sThs5_5SBm0TFzV4j%= zRk#D@ucxyc4ifQ_YFATJBTIyrk$jwTY7Mv-g<%D{PZ1o9Bq<}Oz6}Dp^E%VxLGS}9Zv#;lyzNME0j>=|R>+v)+T#UlYfit}DG18168G-Pf^-V0{xWc4xelxS20LIRn zs4DJY@bAO@1$_u88epk-;7DFP7L^LQ!hj1>V27&@ZWd0FAQNvJrApVa0Vkx88xem4 z_an==m8X9jW=^;s#qD0VQQGb1YbH^!d$$b1avgr;2%gkCRo~4i!#NOUy^GvvD0jDN z21eL>=*d?+Z8T2=Y(&rSA!a#^+iq;1N7RLSk?{+XHpGiQ>GyHpjWZlGD7u%wQ(#F8 zz}qO8*>T$0!)ps6u&1`{9K`&u>GhhY>Mig)GAo>pWHU&Dn^DbEC-!>l8F?R0{Nsvz zYVb-Qyp7}o5o>4OcpYg+Xzmdfv}Yup!}k~lj$6T{!{J#uwU9Jz&(n<3;5lEAXb~0!bDReL zMW7c@-W@m>Np`ftzes;m;8G-uOt?HVzKqgx!mVFHCat=!s*#23kfnc}Zfg>omSFs< z8SGxxZ%AZwzbTPb!+D(;aK7)mdVB!x#q&p-xLE?cjAAVoZ^DtPZz}{KBff?QQ=M=u zQsAjMXH+5SyF~i?iP87a1*@+sM8BsHg|Cr0zE2Bk8Yc}zxf$gc{wOkrKQYJ90Y@TX z1K@P~wiv>n0Vg$rZ>kaex%_K?3#BoFW@-5xsv5wz6<+U1yh<$Z0&KCjXt`w= zal6d&3A*V1vpKGZW!rSGDog(#03zp_IdNTmV|_beoMvf%wYLSK_ zPb`1=`?_13$t&+ zr)6I;DuY!umUtGm33q5@qRkOz={fw7AK*x1?ggU*uI7Q4 z^t=v{)MLpfJC``V9DxYZNr1mpvY181xELG=&~k>9YQgbk<}8l%hGG4W3!={{ zFO-SNi!>oS9~a6iUY}ho$F>I^o3^&z&Mx6%6`9p|ziuhz1|al_?E22$@T;osq=mirRoq zr+mTC;e_$dHJ=y{c8DHtSC4ml&%{8>FiWnJ{MUQ~$GzbELJ&S#^1|~;@0W-)hMnGxupOLWcw$J;+sJd@)^ji3WMXN%$h^bJda>M&thnHu^epI7usSq$it93ukR}$_CrTWk z3m8R_w0p4tX6g=`;YZH|LGfHY-cxPa24qvW(|#n@IW#G{?OZ&hOOJ@j zm!s$|%T?IKEYPhc_gD+`vJpP}9R$r+j57WoCjyCfyrZYoi<746W*t(2%;T5i_$iKG zCQLB%_~l8KvYVN>DQ9`&9{%b(`g|N9`0}}Tbx(X>3TP%w&7hG6abve2hbp=dlw@B) zNMg(E=z@eRZ?|IRVWk$4NCCaL-Nt}vKtwWuDZ?;8cd#veUr*($XT`b$2B=FBnuQ1~ zK@b>XX^KmWnG>`XX+!WACaw;3fwZc57{{I=zkigav|fOAn*uKGF_mb8_97q~TEwkf z%mtG`B-O-QkRwH4F-sRvBRUie3>F3l31p!OHN(&iMQ&aNS9f+qh+GsL6d%Q%RP~J(vC3w3dTC5R)7l7 zO&A7Eri3r2K%6dBDj4O%AL;qcyUu3;VND!Y>VOQzijXvc8)ryjOMzZKool#v^U9BP zSHYh1GjQjV^JhUVo(l7g~z9DnQWhAyqta*>Ita+5-i!W9uv8R(21x;S-4)h3tGBIl|jeuC6rIgj?p_i)9HZTbt0k` z+O{3<=bG2WR32_aWZwe{PAzjkDB7C+(D`k}lj==_Sc9l_Xxw7W;&vzg#xG|$7FnTo z3;1W)QD%J{@T+cRmM8Er^DLPdnB_^}2gO=0Bm`zXEr~t<9MAoWp2r{jvu@XCJ;Qtd zq8BarlA_ILWf|LZw2H_MpZz?e6CZ7zD_S~a07@`_^YGBfw!z_r`RxBO_8;(VRpp;r0XSXd(Sw-QEX=i65@$XoY+{I5QgJ8BxKtTB(z1yPQpkC+lMepX~Au2%PJ%t z>`^FCptPmzQ79BzC>`|EQVPHK^PF?9t{uLw|Nk?Hb?({Y*`w-ydG|lkD%}qVh7*^` zZ(eIes}ZQ+!4&v@$OPY64_n|{OnyWb{xhxStVe~qf^kmrq3xI=kLl9x-oZg)()TOZ zdH>^LBLXb+P=I~YgZ~#|V|QabPPvnHk@pE2hII%}Vra;i+`lxlsr5O={*^XK28*0O z@&|q*Qm&fH^Zw{dMb60%Adtvdi8C)kkhHrENMU1t-)4$%8(+Re6m3Q@tT!Ct5CX_; zq4*5&8lxb!fCdesXsf*OHD}?HZJ@A}^;~GXG6`Z=E!dznkYrQ1cPP5gyHnfE3HN}a z{OSiC<-?qTNC((nn2b0@}I9cD+2imEY6mNXRnA{AZNVp z3`P7&#f;dxi4LRZu{vkQQP&*je;qEw=}Ybyo9A>V6v)#+Jez?yQy&LK?#A(uT0wH* z)_~m0fSitT#umDQb(ia?6df(Y>b8tf-tfV_M7<>uW*6H0K_Vflw^H?bRlPA;QC&B4 zeX@ET|KF^5vZ}hB2@N0u0{wa0S^d$`qN6qB@8I8b#gyF`!YMCy9CbB0Kc|b4?s&z# zOJ_R9+MH=eqwUW3=}Yuv8hf2>?EmM`eR}Bi6Nc_TcIZ1CSDqI>8t!!ddm8&O?s4YI z%n#E3cH}(gXnI<~sfvnR%Ty#eR*D>ud;}<%ZWfczxN66$nttG01)LCci4v6E$nmxb zKN@{0_^@70%hylm0#gcBWrB6f+h8_l${31CjN>PwuO1u-LN$~>TD+r)$cylh(J10{=WAYdhk zfp|I($k&Eags~r$72Af4j6hw~Hv;9vD8?NJ^U4BBrkNPXX|K?6$$`y|MPvAZhIx59 z*vcC4UxbH=MwqAYFl@?=!zdyo2AMdpFG2+=f-wIE)mk5G0+I=G!68{q);HBMD3K*+ zPxO6@=t6bXS`l+cYG34Z`W8iNlaej%V zgrCBi;n>vR1UHQW$@6B70Po@(wU@gS=WMCc_9Ja^QTgR?3DR{JlTr>d3GO&G(0nT7GLXf=n)g_8}W)3gOub2kX%eLWet(=_~{y^y6wm#H?~8ZW^MH6%{{|y|+8di*PgHsFD=u76K`k0K|;Vel&b2Crw*odo*8%U?_#tmf08QefRj{K+8jxpY7gNRPJpQiBu z=boW6VM#JOdf`3fJ%^1)$ZFD|)~tn4l`bFaJs?!2+gHuE59gw~TQ2Xt15o)loVarZ zE+0R40JI4CdNpuIx@J>n14Oo2FX}pAgDxZ8HDCi=MN#~!Jnl|s zQN!!N9(4=~m&6ofWW0fzYWBvP4ASV`x!+Q7s`PDn@tw{RkJi3SdPm-Qr?YzTyTY1H zJ=5ETe@vA$TmmzY;fi(r8@8<(yiMJ4i+av_pH>t`&K>ed>2L zepicv59OJ6Iiv9YI`1xL0ldGixyxBO=Oa}~jUQ{R)qfzA@yFx7w3}br+eOu1<;Q4S z^vSpy%gh?fmWjf@$?11H3p{^U%P#nb?7rI>O?;|ggq20!{Vx;@4hYkU%>8fu`#<{M z&(vkf`>$$9(IDbDuDs9H<*_#Xf3)eGAi(tnj>q_t>a(=m1+9z7g-;peYMei@W_pdt zg_;H9n%V6QCz1Zlko%xuA$-`_+}s+cp*UoEK0>A|D#02tGsP`H$s*hyC1N+AUSR++ z4>_4oMX}Npq*&x;CmcHYOeIai2Zc&%5|9xX(5&z@W(i;3#A(2>OyuX2I$C@kw!{i zWY`-)vtlcNG?4Tvsm@kVU(l}z#5mUduTb-`7+wQjYfMT2+rn{8AYv@bg28|&mN-G_ zOMLSc?>KRp$b*K3>Co2I4K1zB!gm6G<1TSs zD)21kJ=-e^8qE$`ZIet8TTW^g-rr`uzb$6fHd|G$*{W-{shWWk&6@4)*2RR*g>Hhc zW8A%jdHzZ2p#7wF(c739YKygFAKjg*L;q5%Lp5}x$X{j^Vdd0wple*u%a&0G-MVu) zx>+007UNGk3T;8$?5IQajcem>T}`oJPFOBaKk8hRSfS(&23+1)wupY=;YRdpbTz9B z_cw6DwjEpgDI6@J=G-;*!xOGkamwV8{?nman^@|=#kWoKBk>X3!& z(u37!I&@eAC z)%0@e8j-b{zE^f^gQ;|Ajr?TP5$u8+;jqeggv7O5)+bpfm3=B#gxU->J!|!>%1?7p zU~}sIAj8FDL{z6M5tXZ66rG{|oQwP~*mnE$RS$ds^fo-}^z4m38Z=Hxi>lYl2c)BF zMt^F)6&q|5g>aeNT~tD#A9Dljk#0bheqFU&ddl@-1-#Qqkv&_d=j%pZ?i^U7s@y>E<`4z2Ni~ySt2Hf;FNt?T zo$G;dDree*bt+5Ubk`TrJB=)WFrZVWKa!CjgK6qGd6{q>51fvmcnteVbE(yYo;% z1iaz6;ur@Y6QLur@gL5>(T0CGN77WX-k*NzJTYzbGiP9Qz!8+c0lo~>3{$Q8O zi|P}CA8Gn?Nj5-%s1t-w&~RG>jF{20dbmk4em)!RuR$=r*2{06cO>8O*(rAhdSU3 zN)#moPyy9tI4CG!FkA%80KoVYae+frJOc?gn#^+i30K3gY8HryR!D~SP>5j_p$A&Ar5!{FX zWIS}4p(>>q71PLP-KRx8N-F}a?t`p{_!BOmjE=4g(KP!aaAw3!R5jO&=@-l2e&MY3 zUqT-aSRdwz=?A6%OJ{8c>0PQ1$<{BORT)sbh~~@X_Ai}HF$j8CcA^F&^jrXe5A_@0 z+B-1Ry?tN^Q9n-P5D>Lj$v3}rmREw0s%qZW1{+xDVVHQi2KSlBMBshMfy68+EA!K* z+NC_B7%p`;-rpb+m<0pSGc@)-IgQi>CSY= zw;=2MeAJVUxG%dLpO1Re2l@*q!NQshbxAU-%+&P{;YCk$;5eMg>fmyxkYI%Z2wuqo zim6)ef~@l-^9{3kJV`iBb7PV(i|}-csF#S$uqLLT1x>6UnVxLRAgx+%JslEU7TJ7Q zMb`ub()5p6Ity!!&Zeeo;*2=}p3tv?PbzE`SOCPOoU6J|G-~~uaLq&0;C$<8Q;$gM zfZGrvxI@^YiODQXhLgkr0ufOa0^m9JD;rSw0EYB^rQVSK48UmoZAh^4TZLxh4R4DP zUrmuZ=|)mBIs%T=Nh~piwIahxR}0Oyl?0RHI~0X&JaNS zkE~(^hnDEIP%;2(Y*#17@-3aPme8`VTz41M?H*S*E*F2~DVmxew;E8_zzVMARCxu8 zQ_=q+WLe13H`mFO_gSxq=sQpuqNw`l{vXk7kO59M%OBK1N*`704rqeBM+joZQ z(|Y*^Wc5Tw5%tuI0bJ|wpE^kC=Q*T&_yOnCjA_u4&zG|NXvUiMCOg((`E4R`2Q=&}B^p>vAkwE%u5#yN{uT786P7v+h zr)X@%U|=y)ZolFo6+a}hH`oZ`=vn_SI(*|eI^5U|-@?z0se@7t`X@?MKugn}|b z1{#{>13kDcMT{TA4sNFbEdCJeAheV=lD?Df1M9Z{ z0>u<3bO)s+!IBg^2-PLCgS#=HVh3I4p?Uag)&s$>%#b z$pYBIgLGS1*eCCM#R!x`nW=>5d$(;Dt_#q2meyicLWVeh*dhP+iZM4lf{DRxUP}pG zdr@!NK1Xb9eR|e+y*tt!Ohd_>o#|JozrM3G{WQo)b;1YXXSiC*bi?>L zt`2Z3?cII2N?wG#p08|$AJACoL4}o~4+#)~pfy16(SKINIipvdD1TVq^sV$V$0GtAEG^2eZdy`pvk%kITvQ&o5->&FK}6C*<~<)5{%C$}4V8 zFN2-AH5T3j!U^zL0Ci8LJ`k8^|F>Bp@^q@0#93Snvj91I9uko>|AVd(^%;)b-I3`*P( zlhVJQ-|@fuMa7Hqz_-)O7eQPvqA%Hj^R)UApkAV5L^cGYbO8}-8;X)wP&NBi0Bo3u zBgZIo)vw79znwlM{yI*PjotR`QGu0RZ&1}Y704!HRAj$p|M9l%M*u>4GQZ{MjktBh zO4q$3H+(03M(w-kCh|w36zILhkZ5pe%R&vCbKX;v=60g^efjWr(u*n~B^9|Jm|8!0 zk8Th(ACgT8?Mr-VcdWa2w8|AB({vVe{6%f)%#Y-hDp%#$E$MZM>@I>1w5jl{Fd$7} z=mFsf1PV+g^(Z#h1vXdYEGO9^-|M;ag#obv?H7zkvmiMjh}XOl;pQPa5V@-@`Ct`v z6C^FLJ9eBxuY>$L62gGwKo1{StArSK#}4;tNpuZ7LNG zK{wKDqj6wB^$K4wtJf?*O{>FQw6kB)A;2d?OF&JAmXQAMp(1!F0ct7$D$9C2!Lb+9 z7i5qdW%b8$`TO3=MAcvQ<)SbTDzM22IH=m5h4rJVONF1zf&91 z9)UDa5fG5cndyk^f6yoWN^{`6p!xK=eZu{zqJ&6TPB+r^f4ISE;eX59|KttTLsHI# zpV52zFFgb%K45tDxqfr=DCZj@yC&gZCJO&2AAa8(T}cT==~yZo_R(y6Fk3|S=h=aw zi>&~`4^TEN42QW5f_xKLLff#fxjDH3s{W)YbBFv~l&2#K%iDkQmMm~-9J~^mw52V= zpP_zJzY0Q%Af)Hys+KCk-KlfKxaI?|KQW99N;`H9^&{i8iYmcYLveEW@L(XnMiZ&V zA_`GEoh}tYumwsc*0g1F=XMdyR#!1q7Xw8hct5swJG|<1(Y-IBW$)aEf}G^}QuQ0_ zJB2^r)~Sl6LTO9cDlcHK+MX1?5M(!l2(6vOR!nP-i%DU9EobeEQ}Jx1^M-mC`q;iL zyErXhf>%n84~0<^bl4V#uR#2P0)@EgLmY0_6ujGAsBbg*JgC0*_a*)fL|1rr;abR-R+w&uW$v% z1}#OkTe|4{DZh;sO3tX#Qv=wk#tM(0g!vIJf#pa`SDX`q%h&$wtqLX)@hSlMJ^>P5 zJ-xB9fGaPk5xc%hE~u$Q_^-0J$`xwEd!za@G&PG@U0HwAj0tQiTzG!Mhli$FI)xYV z{%I939xD1&-e2V^oQl_G*6TlqoLcGO;Xwb5@)S!0Vc>s=rRj0w0W!YOIexv!@yoV9 z0zN_b%QV&cf_|`3IAaPtLvAG$#P&MO3{53za#OXdc)rtNp>dKWTu2eX8XijLI3R`T zj+RY>n;{_XYKvdO>5S^}VK(k;flEGE?TXaT$e?^g|NmQjWlF~+S114*uatpTy_@=I zkZ)8YPWGZnuAsvsmrrs{c6jACCLyArA#bFAvgG}fT$P?|wUY82`N1StSwEf>%eMCI zLKuCOY(e<(!br?u9n*-Qz=2A>SYE=xK9KNKVZX^N zP_?YY1H#S)aZ98NhZzIIIm{28@V6TzE}fwVv@OmMmInLOYyCP5Hb6N%DlbM2)B%VPY$~g>gU+x>C3gY7*m8tzFUCg9|T{ zC-=Jw5|`sq&%CP}?4LiUWxuO43kP||&kVukWXQ&pKRkmIU0h`ei4 z6;^U*hsW0-y5Ks@E9-iyNPuU)2;89R*y#ZOjaHc%GRXB!vuS?_a0M6~(EL>o7 zMfH#5Rhf>ejN9?|>^tQBnT}bGJLMF7aSP@b3!1NOLr>7&jek#{Jwbb) z;B5$5VWV`M<_Gn>U@J6XUQ0#r;bZ2tTDW1cLGyx-Eeq{Jj}dp!y1E=fJ=!I`ACbqE zEy<2ugBz3Gh})SQlqbAuOg`>H6ALxQo1p=#-90RV7vUO`{IsU7W~4WHUjM*$h&gbH znaT%n#~l{!2ORR-uNrL~xU+ojs4VhuacNL6hGecKj6-NdQW{vxU4}*lmlML_*EfIf z7RaEL*$KItUg5Z^{^L+4?y`to<+y6u$F=#mwmjk-;lgzl6{C);4t`t)Aa+>HxYlvi zk3XKCjmyZ$aJHCno#U#HKAv96*AS!+Dd8#49z9c2p+4nC$5r$HT9d%NBSo|8CiIm5 zEeE;4*=iZMgPQj7eg_dr*@cvDAKM9ke^)(Q@AoWy{r45H@ZV-K z=F3biX7~q=gjU``CwYlxrrJc{hv*brWqw?R5B zpQ?ow{LJh%4iSQ)Z1++cJ>ma3U_GI+=6!VCd)L9>?LMn=oSe=R#6H&TC3OMJ>MTglLbU*W$++cFHS0q8tXl(5F~mzmI3`dV(4~$xgNVd2)rnR9mEV^ixJKkRqgn z@su76ci?HXGoC@$^`k7|{S|)upB=vdP*28lsV2`m5Q`!2*W<6J@d7F+Lzmp&s^(h4 zV*E}w1+aY)z32X(ZX>@l5;_|%;j@-;y{x&@S5VFOs`omf$fS(W z8uI9Kt{mqFU@I=iX~;L8b7d8OXf9(|a4fvYUu>H=_JZs5L@NR+(Gg?U+Yk;Z>qH$S zt6`SNYDYvaf?D|7=s-Q%Nz_A7EhMZ$Ff}q0L{Kf^U77|4l-a;#6mJPs!Ajxk!j~|j zY7x_}JYm^=m|TI4ll7?cV6jZWwv4zQ7Agh=+@gzWYXXdDtk5m6BP-D$3*onzH$=|y zEJWSndE##uB5w%;fwp+EsElx1@CnnCJq6m8@?;Tai-nY+FI;ERr`|NZ&2Gfk zVnVY|1#=3lPop>?ZEb9tu0nAW zW^L4yg|2N=+Tl662da&$cs82nY*rhfM?r`!x{10+kgjcF`c^r2i@Ua*!fS=Ln}gM} z=ux-Y!L7y`G8&dJ_740)A@dXlULyieOvHYxMc_#)Gbc^x8}?AJK_qXvNl(e^pLSIz zo>q7<_>4&P)~HF%;IC|jtIfh^ZG~%ep(%U|JTICCHn#(8Z|NVngaGzb;r_K6BJhIf z7}z=C8|)N&-*?;u`gP~nhK$KaU57H@_%Q>#Q*!L`4DV6bb@ZF_aE{%O0mqPUgMRwRcQ*s7W#f_X?+&!qI62=g7F#DUKfY^mG3eJ%~I@5@R0_Q40 zKeF|xY}XLm7Veg>;~NO?J?NdH7oDfspRZ}kNfofgz{fi`K#Ns^rcW^>Z^L0p3TVf^H&!I~CvmitB4h-Km+a`$Qr z2esPleJL9U;n}YZ8Okn{-@PZJBsT+@ZvH)Ss0{*E=Sb-KO2FJE6}+3N}0Gf zqi~u3Ds@P<#(}F<&(aw5&|stbCp%X;bxqH5?+q8&3G43R4)~s_Z$eH#Pe@ z-c%AKG>YQu@q=XwUCUZoilD?qYIkq2?e2}^cNdvLObZg>ze#^b)wYLavn9)@Z$2FUdmeM8G?%6K_4a{Pa>{5Pq zUq-W0G%wX|>HQhIIfdElw|R@@AMej79Np~>W!FIEtE380UyePH0n6`)GXCXA!0*=w z)(M|*yc!{)SF8r1H%$ki%jUCDsj z*ff1@S7LVc1ta-SYM;11VJty?k}Uxfk?NQn_nEq5FC;Pt@-MSiOVc1NRY{jDeKeyu z(XB2bRP?Ts(Kg&;x^mhxG6Hp?nj%$Li5y))dL9OCFeM_Vcu16%Ap)3trGg@!RSZRv z!oP;(rq(|4CY+)+fz-)`gaAEAhBSjr7m&9Mmrl7N)t@e3c{HOg0q1_p#tF&FrVdZu zhV%tfL{4w&f+j^49Q@5M9(bU!QB!n1ZYKA3B^U=bn(uB-c6JGOznW#v2K)<+*bWNx zBYbC#+c$V`Z4`%B5)d)NG~}Pn_D*I`?HwWy5Z>wm=YuF}Ol#$BMY*kI4q!cPmvUSS zZI^F8mJv(<%v+U2KEONf#{Om7ll=qG2G)u&pgZI%UckLUvFUI+_E@jo7pqr0m zOzP$blUNSiGREJdVSU~3qRCvST1$l#Xq-7^MBe$ZBj7N`evy$rS4$v#Jv}rmL@WfgcmTpHTgHS10!lldY_us_M-U zL%V*48hJmb8i^ zkJV*nBsx0avpHX{0T5{cCh0#8acuNqcXX|Q^@Z>suZvojHLXOrJuca~k#LH1X!NiPC0=GS}h+qolsHS#R|VcZ+Vdq4#>YA&(q&v?y{235(BF(J)+Bb}7BH6#YuYU(5>T#$L+krcjEeM;wbztIwljvM= zp&;^zQ*74hAk&xNLr$l8LX~w%k+)P|HtL$HEJKx2C_a^9j`XI;R*lql8_02vO-R|W zI>Gw1ld-Q_Ki7kH*>UQOFc@vfa<#CW6C-J7-LA@u?>-yzYCy6 zkV=twIp4$2HTX%Q17Uoh>cL!ifr#EF&zzqbN&G-V`tlzV4Wc{b#D$h;yP`tEu$!Sr zrVX4a)HfN9=ijcu7s^$v(@A%j)Ql!f_LGpwbXwoFqkCYe9$9MdWZEFKrm}gKvGFVDz-=05(bGY zm5?F)6Vlg9Vg<3rw@tj`h2>xw$)OdW+9@j2@rqlfIsee;Vn+LI0D6|DmL`pUCK< z%o?MpIt2u}7iFGl%mw9ULWPGGWu9R8>n&&?b5F=TE+;Stqzi0HiWHbJCNzuvQG1a`&+U4jxEG-43(K^L4Y zKWWU2B5by|DYJY!Lb)={v;ZL+=mpg>@>izc-SMG;8O`{QXhe{Jk?LNV(~=pLJDV~q z9NXp9O_`M$JE**g%QKn~8ffZH`C3!v6vu$fXwIz70QoUey-VKIl36NOHD{J*fDRd{ z?x%vVe7-p|J3OsE)-ZF{>^XDi&F`O9-yj-5m5fwxuxbPy=g9Y(G2pq<(~?=~*e$2G zWX^Q#k-aUM^AIxTx|Ym#$JgXLEt%6DUzfht%$VaFa&c>Bt>b*T75^Z3>(r68>tNf? za@S-{Q@kcQxo+MRQ3}p-WNm-y3%nTdsj9xIwqfoRQ38H*WbKC3=e9QbTGw1#-+-@R zKS$Prcrv?f?%}U3we>Tn2tQcSk%!XP;&YW6cCE+D(~SP27>qaC{v;C)7!HsnG2XjWy74g`_5s?g{_3~5&2zMdan0e!h3m=sx%MlwM{ z3Z387s!HQDI*?IP&nUBKC&($0UQcOse$N`6F32VsYd|omu}0Rbww@u8q)tG)SjHWG zNG5fe)$tqD@tcGj8cuM}F9lHsNn?sA!i9h4J zmJdU)C<;C@QKC(F$L8F|$GRtkWc{m>hH@|}ictr<4}1i17K2ge-_T9=-wAE9L=SGu z|IjVxiQIqED$X-Q*ttF>8pMla9CH6Hg~IzEQ)ue`Ow$DaRnsr~+#&zB z*j-ZkKeSNucYmP{+xXHNF5r+m>oWXP(zL*Cjxdl_gCQ8`A7s-I*)AoitHd1^!3_C! zquZaGooN=%MxmPu1G7C^qz8?pmjdtiiGZQfakTXJZQ9zqg~B6?>@3~129Xeh+1zwa zj&2GKYOZP;%sZwjd`x_1+a9#d=ed--{FtRTU`aKDTB;dRQqA(PJfqEB=0akOb=&0e zP440ZWHlqz>qizOYv$Js*VH%Eh|q;p)UbX(%98V8qlCf>1!OoVt!r36jN&?7ETR`v zX?^`5l{Pjtx3spM*gjH|6or>?b$r2lw7x)(S0nNdaQ_?jFW6r*vpQBk3;xOn8AviY zfl$g*hhadoAUU|J4{;O+Mad!gKTLJ&WtzY!z8t{3TWNXLG%9kws;*vXL;R5TOi-Q_ zUy1t76YJM0Ws462p>eXNVu*tv(U!ly!|5-;OU@c4R0t*nViAtDTzoCTe);Sj&Tu08 zutrt$=i@}KGtovhmUO*|svw8BL0m6#Z&b8~)+1zpQ_~}41eSM`!lYV*AY8D57BvXA zOonkFMb+GwH+9wnLSD_FuWLY4B9Hg|AM zmC6X=s;2sr=;kp*<0zE`Q}Sy_L$Jrj`gtd(nTDxIf5K>bs=A+L)6xJ)VjKqkfUH~W z4kV`Q838ND@Cv}X0M3!cfJ{jG0FW^1Es?v?pxZ<4In!znE>L98CLIO?9W2~T zhB9B|AsLDu2FztitMJaZrn^8-_c%4((&J@rT}DX@a-V2A$3V6df>>Z)4J16_KLG+3 zV?M#=x*VRND->jyNcR>!;T*tRsaVL=@{q$y5dR zY=%gyhR@obJeNd(!mZtdTWeu|qzKh5+hP2)02%udgMGaN>w%WpB8j3SpvS&VAivft zab~=KfJm{)vlMlUFsRcN7_N#rY{T^^v)ft9%1T#O9>u{r!Yf31Q+?QPkyTZ=L0MJF zRUdfs(q^(TT%e1hvNCdJ(%#c@FR!Q4(9Vu3vQ18*pC z+%bDYMp~}p3FR#Wzl%6>``2JInQq7EGjROEwFsYsClD%|&}|SbEM7TMnXR~ z_+8Qja{fya=Rpk9Og*%~ko_2wvH-YTs|y&}aSv^}hZFVE!3~0;6%nwp<_uu!XITgO z!P%PSdQX|L4R=m3SCeOc;LSwJOup5&6QfNiM#@ZPZ4fY{u6ClKV;6=Gb=yxFZT1tL z96H%v3f0+ue)!s-I6safVKK4c%9|y(u7yo8?I891};>qOwwcAt_Hvk+t#S; z{+K()PM>035q2#O!L?Ys5YZy_u99~#^^nk4Pjzv+-s&@S7dWglX{&ov!`Zi*e2gbf zW7>L6v*{aeS~gDZ@7uUtU8O;OIS8E9?>HP0!3{*L*}9=uuy7+?(LkaWk|(xDw7LP2 zp)DlW@ms}}pCZDWzVZ~wkAq*$W_(uSYWEgRGi_D-K4Tm2yS86MXUf+ZuN9AbFwvjf zK7h2H$qg`5MNe>S-EOZB^V0TBdzIH_!Hx-EI=AaDk)8H07)p&HN(SuZt=rDo&$e&c zV3v|=W)N3bFeIm6Y($stB3~Eyg`I;F37<>%f{bU!-;3Sqj&q^;e)i}?J*Y$2_hmXklJR@yNir@xXSmR32m>0-z-CzXMYLfDqi;e0;{xCWOnMpTjoF3QM zNr+hG9vDzK8REmhpd#;Zyv>lUaPEOTq)DPdpxtFNplqZ|Qid*&g&OCix7IQ0U)lR;8#JhZqXz3`&vxX}0MeV%%Ic z3-rr{m^Yi&z~<&6joYhcw~4Ha=>u`*_;882Lo<90Z1~8{Kg>{HNWQs$6jH zLs-nOi@##4r@?7dsg{qf-S57oFriEz_XxinzgA+D4^xJ(Ug5t^eZnx> z3qb^~S4DPa)N=!qJxPRJQ*@L6n`ySYeu%>#-K5XuW_>OR=-0lj`m%G!-=TB4#X6T; zC!EXJ__>O_@2YdL7W2LF6|flpZK{fG5&j>f9q!@Rmr88u`JuUpAE`wIZco#>53b~k zO2&J}9r~ieF7{4+Pr+AVl%l)R4$JOexg$m1yNR4+?f#E7IeCxjvHV`?zQtXZI6`xT zv#(+lfmRUf0A09_(w+VZ%@#BxVt)M;^^ilx^)r;ae@+%JfPweX2Hj5^G_(iT{sC+d zrDK0keGWaO7CWwQ5qel{qbl`oQA3K*BS`Y>4n`mSiZ+-}>#@jj5g_(ifBbCFT`;O08_29=?uv;K~65|d#j%U-9 zX9ii|1)o#qM(bMS#kab%9M3Zwoay>CMvJ^4@4VF=KJ_=~A1~hhTmA3v^uI5ve~sVk z$-=|qCHzS#Y3%beUPd9I$XO!y6|y8^w-6ruRUYm5$ZKgFTLFgn_9GM7uiI9T{f2GY z?l<)vdQ0wH>+z3`xsN2?#&qyxu_X|73ilrr%aHqyIvNy{9aZ+bwl3X&R8~&z_tbL? zyss`d>Z%ij&1~+UScE{`QhWCY`pSK%C-CPqLOBpdBsf{qMRYH7|6)yrZMQzsdyh-~ zvD$9kTkc<};%;-!flsV<*7)wfVQvI}|E}ThKa@x#`=7Rj^a$ES$)Dy_8cHy(X4qe+E^6vpu8VThoosZa z4QPBW`bk*&N;N_t!)YCXYEm^v4jrk#m@d~))co=Qi) z>^##`=J3m{DD(tWhb2LI{h6NP$swm1(NIUY4~DH0B;e3<3`OKyXL^E(s8ey2ngJG@ry z$pNVbN{C+;zEY?1lc=k$r2iAeWls31z{E9K(YP$$k(^ftkHYQS2DfkNuMkGLSz8zt z)}Psx>d(6Q$R+Epa>~1AId7JoeVzix0(n-Sry>Ua5NRVU^&Cw=_!k~ywaXmg^b_RK zK2L2ic)$sADHk|E(cDB#$mngxBCl3x7PdNM_g*8K*5;6#@ozS@^B2 zNm1!NiP!^DI2%w;GQ6e4eTt?%ZmE3YHe`!W38Pc7aB=B6$0HP5AVK6J-zV7GPd3m@?4^RMh?iO>pfxPAZ5esjJJy7OXc?U zo}zM4TCp~0EW(%JkCrZ#-4j~JQ(6~Q&2JLLm&+fbS_P;tt`-5wWmQ|P>md$E$yM^h z^`2rcNHDHfc#ZV+<0wXDZNI0?3+jZ6-Pg)HXE~o8+u+%F^ps~kw>YN;AtfV-YL7T0 z{NK|ux+NUr0qR{*@qIb#1y6b6Hjr51A84r@+-bBWO;;BLv2cYT$moIQlEIMccEl2h z-eDQu*sH_Q0UAk0@OLRWoeR205&1F1hIKG+hNEu(ITVG2gU+xHk|K5#9}}`;8vG?p zvQB>af(MiV`YD3;k%f8fG3bLR(oC!!H@~$f)&&~}P513+890YU1V2@zX7wRik3&h4!tYZXDso@424X|3m-Q*U zGNEzqtEom9XwqwDGdhIu@y#@yvNu#Cx)2@PaJE~v(7nK6clK{XBXT4smY99q5o?oC za>?6r^^2b3X@9VPdq?l&yVwfjkJKwkzJ=>O{4RK3e(Oa~^teB1$u^vUKVTay;r@`7 zvBLN>J`tG)2>ur}it8h^41TN~$ffaaM!`~b1wK&=HvXo&LzKY3b2n;N$>o5Y5$VAw zxP^kOf1)x;uNxqY|5V%{O8zCc|K3yV_&<5+?>$ozx&JnI2WN(>{U5dQzR%PiBBhOb z7rFnn)q^bOb4=3xKQ*Dy7iu&0E7jM|_ob}`&rK-cY4us>a3oUi3YHvum-cSf=3EW1 zo8U#%C#M1ZtnbIU2v-__bHu46MRasM{Se&1d<qKMRAi0H#5dW>HDW2JMs>&Vd-tK9e)fI0J?V z-dsdt;}~)UdH72&1SV`l1N1D|V6VVuexbEua>*|En~*7=>7-cXmp8raDRczn&tLXL zCj}k$fnr@7HsGmgTEPvkU=r}ugym;1d#Z!}h*G$k{4B($MNxU?E1rN{`idtrt3b(H z07Z%lskm@akyXN3%_1eLgGvBe4c9v`yZ{HSAa$AADOWjmy{1C`^c7EaF;bT?{IQMd zu2MT&R4waQd82?vleAn`Z3@HO$qEJgrySF~WGXc)3i_uV)9R$@@{(6Q9n)hZnVxYB zt>CHS9oZ*p>uvisy3$)lp*8WkENLi&33FC@D=Hut2Ta`G*_DI|BAnbHA15eZI!9Tt zVNo)%(i?Qlm1mxnR+2Lhy|^I}U*Eq+1Qy7LS9<*(kU1o$C_3I;EJz$e9QF-4K`$2M zjRyMk@@OAQ8hNo^f0Nm2>^0AM)7bcy_X+e43&0`9<~Ln0JSXxh_lha)L>0;ZZcMAp zbP=&L`6PMQDsN3AC>@at8i%AYYRg3~1l2ZlmIabWkxNNPOlSzR=CpcTT{-U zAW?EM(NFeC51$2K-_^|^)c_R)wsHRq$ZJ3W5qhazE-!e=JI%2|{_rJlp$7(8#8-w^ z$>(441}8!A%xorv&Gc^`tgvQDlYs@aIu%0}ua(Bj-l8x>%nT;ysI0asdS&?;a?#7) zG76qZ9Fq&8Wnn;$%pka4jIH*jB@l>f6`mI(BJ8s$e2^@JbSW8x4|ugWN#Fd;z;SRdId%=K3=sZjj#-59 zE9wBe6D-f3Wy`YwqPp;$%b%w?bIXJBp;NuV)_h=dbFRv!Ec$}EF0L1=->a8y7-@5&r{xyvwBv0^7H7lrqnetTB$bfVX zl)2nL>Rs*4nWbvf?K}GMsQ1>i6_HcSCJ?9r2gEsAMx*easw;|oSWpr7v?R843C!={ z=1TL}svEi?<-I@-GA^M}17jp2=EY3KId_3@$2UF*(9>)#rTwUpuY82CTmZ&A*U}n$Z9fu;~f5ah&5dBJUitL_M!uRrvoVICViWlC%nB?)Bb`2n?ZYP24biBJ36!mea5Ih6`ZJ zL_aAf7VQ*;ciIc@P7&HClh=ELIr~%PFwRhA7um}$R%Msi%MMUkAl-EkX&&CX!CRF} z38~HQ;TxlxTwyP}QkB6VB318dnY_^(EVxEb5w;NKx4l&mx`(7{b8V_zgbu5+>+EIM ztFjyHWj9h8rua=v(R0wKT9|#a`mEpz4B!D_)T>1b1lDFuFvJAStPL>>Uy<3%jd1%M z;eFLKm-M`*0Z`8C1TxyRUK|nV@e7e!VdDBGz)Q-+)$^7K{N9%DpW-czf;1-JHxVR+ z-jSt%E(s9Hq`vU{k;bWp%fx#;PMlu5@xC<*k{_f1oT78uH;K>($CM%p1;sMtJ9~8vXA7^Q@y2$kHIM_=jI6F?tImpBOtfAN)y3pnj)Zk*HTdc z@|(+7S>;dzLF6uqK#hOp7m8#B!dwJFj1wSSbn?-(Z+XA)$hOIL&O4QqsiQF(ZjN5TLR~2`x|QKKj9P-p3tRo{k`& zlN_Ezj+-}F1A!tBektp}#^hu&OP)gHDCb%+yw>)I4QyZ|Oc$sIRoF3r|1fr&Jfab4U>%COv-gpxIy0evbP{(BS_pGyJda4;V%&do4&FmxE2+k z?U0L~^MqaCL1%8373oGp0rce}uoVOB?%hx0v1bqljc$|M(v9$3D8#>NTIj8C2Pjs! zI*nt1z%rrp`knIObfd0efI1&Mw)4mk%uhg+!=F@{3^4qgBj)U48eJamGK%t{2PZOq z+PNm--7UAfjDjN@5#C@D3rhOIItMqJEpSMg|b_Ng>-sK^=TE|gc?=Q<3wYjN)jQ;_G6RDtsDx*j!xt^ zZR?7uPq8+nMi9n@AcwU>+eKLSoQrAWx3pBGFy}wJzZGEWvCXpTwWG)h8q1>Sla-SnPm^gRa75Zv<4Bqn*QYb%yQ&zj)OxW z?i%zlZIpO~%Wv`q0bzAufw#oNyYVgt8Tc;@uP}F{X!0B zYk&^YSSuHVkdp9G;#!dnYKWvtD%=7HBH;rqq-RF~en6HCnePk@=%Ix{8nb8)C@p z^L1^?#hQ(7byMuw1!!87q;M*|`zfWOj$lhrw`*xPyy1hx)ERbOOH8|{&=^rT3t}S! zM3CMbP6-+Y@dG3TwxWh_34n{ z*2j6ximxI`=w%8E3d7zM8O8{bl7BFHk;XdUpZRTc0{rd%j>1KG zw@?IMvXCSnC-^^j7$yc@-2I1j-rkRw&~w&3XK=e1T)&cWn0djT zDeHR*c`XCl&HX-MuZ0`UPq!(owPHC~y&uSBvmD_>?hhHknOGYFdBytW-44v9#y-fi zy+dQpJI&c46B^dFgcuxAdADtL=Hzfkdz0Jx&jq=MDp@~H%`593b0X=O$-R0e$c$#E z9gpgnM1Ddu;c+Nn4d2`bL|V)FslLfg9bkrhKbvrIvwm(~Ts+wOaJQoOGn!PXt7uAQ z)&tiA_!@~mc+A7#c^5pSUk0S}<6Z_!=Z#0rQH1L;bmIdrZ>ktbZX;a3KxzIH$GnRt zC%y|F%nu2D>UOf!$MqD={b@i2x}*9TQRUc1xc9@y0;?j^5lHDLv~)vC&o}cqP5eBs zj*t^rmA*jNbjOz6sdQWRJt5{DLKC%F32oNDw0l%`oFtcum!i99Cgf>Y#~_h$qWVApNH+ck~COV>`^InZo?F#sI| z;aThzgDjd%GG<_IkSYc0%(*dD7dwg4m)B!5?gpA6!k*8he?b(^Qv2aXatR_t69scj zYKNqXZ>_3ZJl+$k#gIq_W%89c6TE z#*c?Jmp;#gKG5tAs~X}>ouoe7=S7j_?Kn@dv@rI<8PR+>#;$v*nkn+Cn`g$`bRk2t zE`9Xfs#4|2sFYBfN!vDVJ^a`}DfE~V)$^>68UV-?TnSj_2DU zW`h0p9?-Ev8~c+xHtpyaCCl*;F+UT}sE$=a%k^T?sugB`_73~DAbQAp?xdSKajnEv zE?7l#VIqssD)+?jz_)tBEQ4#*<2uEBT-bdO7N=4#YrmqGcD9B;Z9*^Z(+U3ciNZ5j z8ED~W9(Z~0CglC|ovBu5JnX3NCk%Oc zzZ%|t=)MhfyaeKuE3j~bvL=K}`Q%Az;DR7c6rN3BZ5+y7+0_ZEIMK;DZTaxG=muNS zAcDlU6OnXlR~thADlp~&MXA8oPJN#S^nKztVj6M`nuYY5RN;v5K-{J<`7V(Fvecrq z2!a=I3{vKw+2mcZ*ob6c%25!;z=jJ!ThbTJOCxr{cwRaO(QG&b0(B@nU)P8;o5R?E zlWJ}}C=wos*?2Mr1Z^i+`OcIq%irHF}a2-Z^5pnx^w zSo$1z2d1V`AD>2y5Cvpi2CtQZd>jv*9v3brH$d0f*#GEeA#eK78#=*{Q?b4;ZQ)Fs zI3U6{u5GAD2g1j#4n$=bo-si58EGWs7t7q$GxC|d?@cb>x`VJUk<&x^%~dte6In#t zGh+mn1_Zr4W0SLRYTkKbWt_9_#JV?aJ4?7huk%P>*FZuGDr?V|{b#$Ud9Z(kE~Z`} z51;LxQZ!8Wl5QN}Af<(=-95sAUh4%SKD=?ZdvZIG;L0H(uuolVT@@K*keCt_IY9-h z4E&qbpa}H1)%Vz6ypgHv2Z#}O?^e2=0+?LW_ml>SS#|KlCFilW$e8vui^C$Owb+Yq zE*N8rs&7bRu~F$r$Qg@`f<*2G3)lBPzC=4kJljaH^_*J_ONN}wEqJ3l&LppJ8 z(ZCnMYz%&tH((}(CFS|5FE}3`7*uN2rJA9n0Nkpoy>DCpZi1wJcvBQhnu9!g50FzL zJ$QsB<%95F3MK2D+0AtgTGte(QUDtnusWK9XTP zZX6dH(Xq9QNd0~$ns8{Ob~12cbS+^h>Bd13fl-9xp*?SGIFfJ7P4jp?I4&4X zPnC@UBW#4T)X&(geMh$hjH?}95d>vJEn3GyMw;|S5DP9`Cwn7C(8vO1LZ6m2wH)0Q zLCnKME@L;7z!BMkSd0n)4`V`ki~+wh1Kh7fl(J$Rd1~A z?Bai9ZlMu%oGPaj8Z#Vg$q#=hfpgGOfLxpdZ5iJf*i7I!=(*Nwfy;<(WH&xwp*UhHz_Q7>9F^!L!!Zbq zst8}HW>T4o6U5d{S7B`8@UB(>Bs^+Dsd4dQ=3FaR6dSV>htVn9ctCkcYA(4l zb+?_3@#SEGgV&pz4Ulc7N#lGlw6Iws9~`JA3NT>`jTE}+tNQW78ImrFW@6_N5$(E} z_5hqI4Ga5}d@!e}zBVF`xa$_wn0YHDi_wkck`|+;V2l})q{#U$j)5Wy^Y$Cx6Nkr2 zj0$R*(N};{Tl~CSR{UCBNd+jq1~{@hM8JVEOwKEQRcq!7tLkB|k$LvwMwzoY8E! z!{7|r0RTZf2DSmg5@%U>KS#NUWHM)1^q}0@Y!s$Fq?>)S*~rd*gsv0(B;Y(!_b6*h zOL<QPU^=s?) zR{TbOy4)x$=F1FFaGO4OI=fgKMKci#e;^y%jY9cYi&0+oLw!X_zfRdOTtC7@Yj3yi zk@U726&ZJ+aMGR9(Fl{2wpPQ}bC>GYj4&0v+jfD?*mQv(n}y5z&!zYcPz@UQ=9sqG5$4aV_`*w5r^t;Tc;bW9i79N3RjCNPD?wd~pf_a_Vi zX#k%fh9Lgm5BA@7;b{k;@Siw{0U-dJR>0X8S3tyIoHqx^-xA+<_q4Wktd^Iy8IdWt z3*#p7_%YqFa3J=Cn)8zrs^cz9T;fw0GK{S0;Ur)lCoo!#=%@prR=-m+=2{{MxXm;eWB*Wq%KB zDYp-R2VLGnFO)J|laM3!Z-PiVe;pYfwC;v^1lg%9r1&_yNV@U2ww#>MMl@2>mI}0~wgl3*>*`TTqo?x$I04)r0~POk32~fR-;BL zm3AZp?+VGC>0e+!IF{7EzD9Vu=w+^E%|^2_w9^c}qXkoGo#YZz#(` zQ#QU=7+FLW0}TL(WTQKG4l9^Mey&~}!_$puJ1x(m!bxgQOOmCXMs&6h%`%Z@yFnu5 zr7{nL4Vih5wAo%x7!)o+W(eC5pD7}@qNyjUsM@Io^0H2&;Iv`fZfrB37angRIu65X zFZC*|TNEr-3o(0)bq}r)MX=msaHTq!GIAF9LWK`ROPO4|)M#D=V?N$WbYFq)l|7#Y zhzMpW}RY)_#x-j$a$< zPXDU9G1LVW$!h~)V@#^EPC}M-8AZsl&B!&-;IQ@sev}t6hcQ!aap|noH|!OpL*_kW z5p9rM<#EOA?S&t9fm(QGiAdo`Pn=`kJawE1X4c=A7=ppje8<$04vNjAL5X{Tsu?_v z2IhK0bx3c{v{~u#slrB%2WHQ1E4(l&q)Rzfgy6*!hLkW z(9o3d_6{KlFMQusUMqzW2oZq>6M0<|dV+Z&_XM;H7Yh;Ukt)>o>bVWqh%I=emh({;1Dm`89 zJlQBt_|7m#($9-CGHYdo8U5{)R>bW@Jt|f@2^bqH?g#`s3G0!c*@PFA?Mls^dql*H z4SGLe9DWvU`^J<7YQnPd^h2YbLaIvl3fFUUb2g))2YPf!*OJ13E}aQHaM{}?@a(?r zwgRFN4XDty(I{uQ@($2uGABIf@bL@r4q0$%7xb^6_E8GlImphy;toV{0?TC+WC-TD zl-wf-o{Mg;CF7V&f)DUrw)!*)V!~7lX2K$u$-6eY!wIlmv}oNLO@rXRY$ZGm5z*Y( z3^LVk1)sX7dpjAX1c)6=HD{qq5Ukm_GMbR<8p6P%3dgynRx4a9CMo^GVO5aJ%-J5A z4H6>@H@GqqW)|Eax4z|#hHlh(u3&T~+~COg+fDKYd`mFnWwiv)bscL1d6$XdA}$4N z7GL38wU840mGFL-m{Iafa)Ym;e<{f(GpAq$3{da-oP$5$RumvYSu-?u!%`V4J_0)h z8-HX8y0lZnK9&*87tzAs3KfXbM4uxtpMWq7%qY`$;S_zRbjBS$2-_^OK;tn~!ZaFR zQd^21Do@zkwOqZ7Ym|IiTwZTL(eYDWIrc1aKiVN3bTN`5pHLgs7I|6cj1L zviEgoK;~RxgdA_l>Pw9ICxO_ry)RIDE3ge;zkZ^XpkYN++i|Rki|6O8KtR83e1>Xq>pZ`T|Sin!d z-)s{GGmv24%;Z2og^B1F zBz~MQDBLH70WwR!rHGJkt}?=lKvrpkFruCaK)OIZiD){J9}~JDFVHM_OK=zS=ZSEJ zT)f5z<%4Q6DIU;HqR``zhi>vlqh8bVO)XoSydh7T>>WxAWME;SmDrM{1To@4ERm?j z+(K0w005cNRDIL|4W;TMtR$$Xuc(hseX71|mZ->g$n7hQvV!Z<5X z4e9{|eeG%pkGkZgtBg!9(wwmccWI6M<|?DaF7c(oBJnQm^8C#L6=HG}5_wMe5lI(Uk4sbh517#v+|gkduFAxy};(m2h?lEG6Q zAAC1(y5TrEG(){i)6lb{ivp68tW%8(Jl=rI8=Q&fY&#}4Udftet2G<7s^>sbPc~3; z;h9G6^tl%AVL>7=-6Am00zV}B2Zg;?6fBVEpJ_xx$7z^)yoRX@(QCmX${P?3pJ2ie z4nog9oA7#BOo;;u6OHH-f;C5(?OnK%U!c*sH{ z8*zEUIwKN>ICwhc0PpBYHuoZZU-F>{aWkn%L*XQa$(TToKs8Au zl5OohU0usXxEG@VUZ=`yX>BTVcd*Ys?`7MUg1Z*RdX4bl2;DEg-)9s-FR5PsS!z8e zZImze8B<4xjgndZO~*{7;A{n!Q$xmd*RIWU*SE-3!$wucR{R~@CX>TPAZ@$CRm6w7?mv0(tT-;|`d_?ykrEVNiaiI?%FSfzZ|@ zH&SuY**kY?1KHo!0vU*C-&KoWi1grMFhQwYkvTRu2kxYB{A|XEd!muQu~A>52KN52 zHB%nUtQc+BJo-pRQ0_e+Eb12XkiedaylvE4vv2ScCi6$8!En~NAEIcdbsCDB+uO9I zciU$0KOjhPG02kDz@=bq3dC$fXyf075jtBa;xowF7%eM!4h_nJqeN$tEx|}KdoJB9 zmUsmB*yh19#ExwOx>U8}nvo2BZDJ+n@4h~v);A{BY8`;b*ZI0uLU-oAK*4cu(h{^m zIZdQv#fX3kiG09uDwmM$P3kAy!eKN%bFVUv0i($)w8uNpu?`@sSDy$CwIUVxKHVgY zbeFUhyhF#-$5PvVf8L=*u&DPGmC9m%D=o3?c}BO36`wpN5g zyIf2q4c1gK?Mk_Dw=oqOnvJ`S*vzX{!~AO~YY?`RL%#1oQV`;b2KzUOJa9!SU{Y0E z8-fWGUMrv8Z4_jIH`158@H+W7lq9Z435(rC(Tzl+Dk!rgraJE0vYy))gF`a)FZ4-g zDr(%dyAwV}H_;Vb4sTsG7)SBU+cuK_HSaF3B3 zbca0kushlxy-lAAugebPz&G(5Vju@?2faxP$YuXXf32xUG*_+lhA_iwva^BKRj_s?|w(dHEp``l&*!>Rr(K z6UbPv(%qB)_gqm%@zg23YqF!GmVB-_a3EsQowKR0AL$Td_mLJ8plm-vUhbw`ciXpZ z*@H|*@HR+do;v>yY=K~|r1UE^8IXDpU~jS?)K8qV!b7vNB{5!zR{F4BR(m<;6_-@>{3Fs{AVnTWX8H-vnB zXKf?A?tYT?uus4M6As%P?oTcJpa?_jLR@BQ=P0W*QtV+QxKr9Afv~~JuOKEc!z{50 zCivcL=v~zPf>a>%Jm0T`nc=guYdJ0jB3x64Fw30BIMBRb!uOjAs5Jk#sx$L`BJTR{ z)V%?Yo+peK^+p0a{~les!I!f{;bo22UQv%cQShqmHQ+K_$XJEX=QTBg?P`Ka=U%3~ zp>>cm_nBFc_-Bh$eXtt1f<@-XfhFTUC$G8<7uYKb9cZz`A{Ll@C1( zzMlXs`fFa^(-|Y>?TWZCKE!4!d7k$0v<6Y{PA~--pHUcy#as z$%Twoq2{VvPeVYq>`zpel?+(^X0J7E?nr!h3l;-vOceivp5Fg!F`&s9MObSIeQK?R z5t?4gzw}b(iqikXxb*(4wKOQ?M+<{fL>PjK)PzmEC|v)+TwJ6ca{ZV7^Ev(JfApU( z@E>G&$6Fv`O09F+T;Ye72d^qM45$?nLa+%%LU^4ftLaWxTywt5VS8ruw%t(QFg2E` zYq;$-=pnj2x`qzQ5H##H8rQE!k0J=^1KljuJ4cF13~{!0ny{^ONQ9uov7}1)(zK_e z1tNNgBTPb>E~juqCczU!oCYF6O7d-qvjOHgadzF@I!=%+iv6~)Dy?=Ro~*0m%-W>+ z;Xa~42lmc(|5TVxkO3jcB>27xe^~u#9UUH2#QeHXdkDlCHp8f$`b*t`3pFX>MSO=? zRZ~2Pcni=I@x6D01SDP;jxL(l-6zV=mF^MnX1nE-5u>fg_%ISL{?6^pF?S+}e#qwGPA(Y9;!yCTmZkVy#eNUzntD3N`wZAnZl5ot7U9!rnertAh;)C7UUjSTDAl!qQ* z$|fZnv=DV!Su>+X1iqzD!ZcYShUjLhfUO10_%>z{{0<>O`z*i^g>E^fAxeutD5)DS ztC|dd4@f4GT2oYX=3Ksq1=5p6#$VcqygR1UX7Rf1EEsXD4stCVY&!AgK>~xTfV(6E#SC^{_!W+!X%$MW_vm4 z4oD3x@{gJj933+!m-iDjP*sacpG^iu-2cz?{@{xKoYsFIe#1DR2Xa61Ul*KL+YKs+ z(J%-hh8qtlG+Yt@;S=jv)|6Zw>+b1Tw!94h7#Xw`P3oI|2y6pj$g`a-tjJQJSCrh$9tmVX&HIfyV&!L>ZkEn zvX_27tA18KCvSV#TS3tsu>*NIpgb74U|~RNFGxy9J{@ES&lA)}thHOXf2Z1Jy+~x@ z09=lstoXeui@qf5|LBe6y^K#?VhXS#9SB(c83&9~@05?M-=`fg%F4<1!3~tiXA2C- zMtgPtUwc;`A7yp5?>jIsnLAk~vm}#+>A$))}F{z8XTn7pxi?UMH%*R3+PGRXR?# zxQY>{m>Bz&TD)D32?vb+!6DL={tGL4yDYAvb1W6-7|TD^i^gEX#fhfp13dk{MRL7J zSmQd?h#hit2nQK;&+LW-G9bdcIV%5lb0TZn9ZbU-)4Q*x^)m_pV!G()@MD45X}$C^ zT6iy)!9ug?BD{}jSX>F(T};E3Btg4}Xg~qL>{m4#C4dTW(MTje$VITG610bzhDDX2 zJ)*maYXf%?bKFkrEv{9EHpQG{PqpKg+&l$V^e-!qNoI~}$9L;Znh=`j}AnUJCr$$#M@uR3Y3F%9x^ zBHtUjnrzRTrh^cN?Zn>VdVKJ=xe(-En=Sx~p!*1^H$i)kX^?Oev=4OU!`%>S)o->? zA0eqGl0V@hScD1MVWwdbCTK@>HQAm|O&_uR?8M&Uap>b`TnJ0hri<_wO#9MF`zO<| z`V#rR(v=6b@R$tYF_H2O=f?6&(Eg)ytHWDmvASWaOjQNj;167*PTnTVRK;$YYV97d zCJpgVYma?n?B4~qIHB?vO~7`$bQ9V+36njvmJ7BijWW> z_4Tn%WJ#5B*ou&?O6&cTwcUrdK{upAk)5h09k#MEAo`ij;S{*;#Ls$l>0zr1fS^@7 zWJUojP`W=M`WO9y1gHCh4FwXM$jnr49!C5nj73}kAzo%q(G$Jm4;J{f*H ziOfLYBH3hAK4~y7Ti38+O(%>9wXhS=v3%u%i!Oy^h`Sz~;z6$io!Jq^6Gc_J--r z>ver~PnwOW`U+%73E5?TV}=j2UC<6CS*1Lf!L?wZLksYpd|Ua!9n)6D)qKlJre@ z&j*-myL5H1OVm{34>~|wW_1&STy<5q+V%sPzX(28IukcDWsboJw-MaKr0L zq{7RJYHV+4nnEt}Cz^rt-x_*AM8+Gq1P8HFoqvN24wT*?UnN`>fB!39SGI;5f)Iz5 zC6eI|m)MZ<)!QFgp%nUF@uQ)TX+=(2G1KsE68TDr7W8_`m?!z=>XnbJyy$4o0~jY5 zDJVC7fx+h2cjCX`)MjX~U6@}mTJSFqII8CcoY*v_uebsA0Kv}Wtd0Mwi~j=ODx0Ia zL2%Dx1mnyvaEpHdy^bqC$x!-=8&UbmcDnbJ_%FDenbL4MGrs_2XMRnJ|7x&*d8|gb z5KY>-!WDMqdQ|1DuyO!>hQ^ZNHEJo+7&SZ|n=iTcu!VT5_$-e?|2 zY#!V8h`#w}5R~vtPks z;7d3RBq`5NbNZ!_Gjk}O675Ia8geGpd`C$&HBuOL1|r4 zjHm;#x+1r5P=Z~E*`8T6D3KbYLsmqJkD)Wpo~MKvT~=x{+Elns?|<-l&~Olq4Ls|F zrwo@JXkR?#=0lC<@`xNW405nOYm9A#8Ip$0*jzHlnrbS!n%WbFR?|mI2ga}{o4hpJ zZAG6!{;uM&Y1nU#{9TP^4f1!*%GI-D=u)g}KD=930QtMd&MjnZ{AY3<|77HE6K6kW zoTD>pa=*+2X69{&WN=}4JYD(dr3O7G^fv`^>jYfD0Q4%bTR$>X)O+8(7By&koyg;-S z1K$l=lHm>qSFr8zR8H&UOE4Umx?5%g6#b0&-wkcu`X!t68FAA1D!d@wDFR(g!J8rD ztGc>7W&mHgJD#btVRB22m?CGIE+_cdN0Gs9XpceXuC-${mxC&@stCz2Y>1Oq^rK?0TTxwa=X{{1j z3)Ic~WyH4-`ANu!oV!T*?}FQ!TnrMKh{g%`610-DRDHBxX8SHMIcr7cGRm2up4>0P z7gn*-PKD>*)Ro@ za|@b|Tt`*}=KYv>rA=)BBi@QyX;aPBA~ zcYK|6y(+y|=BsJ<%DkC3IE(^z=$ik=AvOW`O=v*gOan*gEqoY%Oh2(-*vJ_0nr&%= zddYnYGPd5TetoZO9v8Tc2k%f#d3KxItpDrET`KZt5`&EvfanRTzJ3b_>ADvI#S7I-gV66(9W`fyX|2oa9-{K zoG!GoN%v}|u7wVlYYv6)cUBGmEm{}t52%9sWt;0k9Zgf9w%jkhXFp`uYWu}MOy663 zm1GYPGX}fu8oxOIBZJsoC%iw4+m9aQK9oPEzP?|UO*;TN6OpDhO?{+@?U}b)1Rr;H zuA#XZF;ZDSH(#oz&%{D4oLE>>Sy_nZeK?S(_!pMSZIqe0F|skV0a`2hN#;~hS!EfF z(qR9XU#Z(3kQLEin~VN$Fc#W;@TGoBU*{=%u!*^8Ys(K(`qTQpLpQIQ`reCI0&D&} z{oWk<{EWE@**gc$v%F``d>s;C+NdUV%Mp1=ze6%9?}N`BTejeNwdO&YUvh|imafD2dVAMCAACwFhOU^)gX&Jh^}1C8*N2TOqIK6~p{Ls__rO zFY8Z~DL49O8r)wDhr#exM0jMGYc%NSrvq@UX9(bMk>lkwA4I-I*REI`Q zc#{{6VFNhhdCPo&xAj^{p)cThhr5>fu1ehwZOdP|COkLX(rez^Y?!a##0|W6OuO#) zF#`Dk(XpDL0Q(RXV>*FBcpH~r>x7^6-#}#nBl9DZ7eX=_Qrq#AK;?`M;r@H>n=pa;T7t|y)ra;CFd_^ z1Ojpn46V{aT_0XNn$-{CnaQ7R5X`W5}__k28jpH}*26^F^y8J^T512;f99 z83qpjQl<^d@xPql2`Z}=W!ObbbE^2a@@F~zcLwEv*QZ{ux)n9-DLJbFD-5fGO!k^5 z)dVn4E>IFH%&2w!pV+LSMj*Z9<4yIrAyn;sN?svHe-ZDTns88-dQ1LkGhVGYD6@-G z|Hr|3#AbbEIA1UPU)$BIfrIi~84wJ*3r47tr{(2xv?oEh|7ofl@0F9pgA80Z-YqB2 z=n0Q+4nIc zNz(a&S>M0_qDw{aa_9OsSJNMn85SDzDE$lc$t%oSr-!ov{A16t@RhU_5Uu36j7@z%qg#rZb`Y($hu>$K&@Tm@2LT8NSKB**wyHD%6i%X^acY>pd(H!yy2J{ z+Ta6lEjne2Z=~Xz=#s|8VXE7VR61}^fxxxpnDTfxn|g3vqKd7kA{AJY_RDj0&)aTB zu;ZBWJOXXl_rkD09+-JJYj%JiRu(4jLG!C{yx}GDti5XavobOfR!4_Z3}3?WP~1M#x``$W-8HCnZX|rS zo*fhKF}o;fBg6L|Zyu%Gr>6j2rZIAPKMx!?w!8=QmHYGu%>^BXN+V8rAEwW)ZPLJo zq_Kn^arObKh?PJWlQ7Hc6T4dEK1z+Kb6$Y`?=jx9=X63tEwT?N>p7W4kdV9-LBv); zHhPM#%YH)jJTD{ZX}@r$!`}R)F4p`@C%IPme$68+s+}N$zu`1o*tJfjVdiWR_-&j< ziaH{NpHk;NCqvPLoPym0J)l#`1AC|T(0&HvrlS+s9=~%`{~Q-^J_j0rxsyf#TD8e_?2A1)dj8b1#|ZFq)SWQ{p>+P{HTr7%y!8#P7%-h5GIx8Fpp=i5QfX z3S(%Te-!ISOpU(kAcCnH$07N38UqQJm=V4=69aO;h1D2-nuy>AAEFZ-dHy?^78WPjwGIi#rJP)IBT_s8f_{wHebA(hUC)9`dse{b8348#fsD}cw3KngNEs7E$C|wbSRo z=@PY-ey!ep!Ceylmu?1|@i*pP^KYyBtj?CM%{nk(?1Fjom#<#Es!(M8$6`S6O*-MC z?_I|KFBB=?T5vy{zJ>XhCS08j&A8VZ97DfFe>|hrS+}3FL6E$LtMW!z;#sJTemO z1_rCdfzJZ9hVgc9#41YPWHt>ONm}@E@N=!0Dthn4>93JsaoCd`JryUt!(`;%hE@^y zjqgIrZ|*E~-2igMvCkw1a*YDXbu9&g1$WvBG_Xnra#c1hj{3Tmfm|UJIBTIwG>$8T zgrRiCaScIiaCC)XT!S}?sFO+%o5FJw?;R;O8z$?1BfeZOqWoKID)mr5IbMVxWLDLd zq0Czc^Nw`>+TR)y#UKtQ@7CWWiv5N*h}-!L_Cu%`oDI%QwC`&u(bRt8DDjzbSB+Cs z+8(=4JS@*%?rZ8#ZMq&<(mn%A>4RK>z*k_fb^(bOFx2KH3LrvJ96Ht_1(OPSH)Ycy zv4MLK7^yKB;K9&@B@+_?pi^s7BS_{Q3XM~3V`l=VdN62Z5@4xy=p-shm!-~L#*pfVdbaU_jJ^s+u^FHtlp`jAIorNu=6-|p5dw(h)RTnr2gH}Ir$&6h7YZ`)<9`L6R_Dz?+g zEXwcUx2~ZoKkl0rqvyFaG621Uk!0S%$eq9K->o^W1@RQWwQyU*sr)0Y^gLE+QVJ+&R=r69`-1|pxxXI;aw{F(+nJS=N1w?4ZD@{h{5ES1+fOe%S$ zH^tppS=CsnI$n||NP)-N^%4zd4&3$6$^n|nR7k=aBq(hb~F-nAA)x=MiPVnfh?K!m5u zJ`X5Uwo(0Vy)224)kI$;k=OJERufUaMGf2}OQZCHhn>t-;e`dH2Vf|nE>WGP7X;d< zJFtU0;NPh`petQR@}Ebs!Y8(bPd5rMF*4|tdV@Zllxiy}p6(as^Trgv|rA}Co6e_r#{|?=OTzDH-&HDtfcb^!6i}-ca`3Ne+asTiJ73^dp5m<}m>Mq5=U~Rh+907Uj|NNGE0R z)4+4se%8X|jYmaeOIh`FK6q(NoIUi#=CMvUFrWAl7lf$Jv;{^~Heyg{5$fis+nK8` zg0)10PcF8VU>X=fZQN=3#%3)6(E*e&xuu(t2B8y8G=Bk_4==OSsw)sRzT8qrmJJI< zE=;7apzf{Y?uAzo99PKy-N9WdS*-p9N>LZm5jbs4X!WD)@dpUkH{~s*7XoJu7+^FQkjXT=+kfZ`4`Qop@GAr4%_iIA7T&oewJKc)k|A-Z8YglFi80 zHo3C3Es?LY2UvqZ3P%S_qorGPWkA-8SJvHw0M5Zp7G6iWc8(jFYi(7d#*J)3wC}ue iBP*=!YU8+()z%JL3g21}q`Cg_|Nr?v@Bq7g#eV@EaLy+H delta 89312 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
hK@RM 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 diff --git a/A2osX.S.QC.txt b/A2osX.S.QC.txt index d3e30125..faf944f7 100644 --- a/A2osX.S.QC.txt +++ b/A2osX.S.QC.txt @@ -151,7 +151,7 @@ MLIOPEN00 .DA #3 MLIREAD00 .DA #4 .BS 1 .DA MLIREAD00.ADDR - .DA $2FFA + .DA $8000 .BS 2 MLICLOSE00 .DA #1 .BS 1 diff --git a/A2osX.STARTUP.txt b/A2osX.STARTUP.txt index 3da4b2fb..59dafc51 100644 --- a/A2osX.STARTUP.txt +++ b/A2osX.STARTUP.txt @@ -17,20 +17,20 @@ STARTPROC GETTY CON ${A2OSX}SBIN/LOGIN #STARTPROC GETTY COM2 ${A2OSX}SBIN/LOGIN #INSDRV PIC.DRV # Network Section -INSDRV UTHERNET.DRV 000E3A123456 +#INSDRV UTHERNET.DRV 000E3A123456 #INSDRV UTHERNET2.DRV 0008DC123456 #INSDRV UTHER2.AI.DRV 0008DC123456 #INSDRV LANCEGS.DRV -STARTPROC TCPIP -STARTPROC DHCPCLNT +#STARTPROC TCPIP +#STARTPROC DHCPCLNT #STARTPROC HTTPD #TELNETD #NFSMOUNT 192.168.1.5:/A2OSX /MNT/A2OSX #CIFSMOUNT 192.168.1.5:/MSSHARE /MNT/MSSHARE # End Network Section # GUI Section -INSDRV MOUSE.DRV -INSDRV DHGR.DRV +#INSDRV MOUSE.DRV +#INSDRV DHGR.DRV #STARTPROC DESKTOP # End GUI Section ECHO *** End A2osX Startup file *** diff --git a/BIN/ARP.S.txt b/BIN/ARP.S.txt index 9d1f8250..2480d1e3 100644 --- a/BIN/ARP.S.txt +++ b/BIN/ARP.S.txt @@ -170,7 +170,7 @@ CS.DOEVENT lda (pEvent) ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 diff --git a/BIN/ASM.S.FIO.txt b/BIN/ASM.S.FIO.txt index df10c127..93075833 100644 --- a/BIN/ASM.S.FIO.txt +++ b/BIN/ASM.S.FIO.txt @@ -71,7 +71,7 @@ FIO.OpenFileA sta FIO.hFileName .10 >PUSHWI 0 >PUSHBI 4 - >PUSHBI SYS.FOPEN.R+SYS.FOPEN.T + >PUSHBI SYS.FOpen.R+SYS.FOpen.T lda FIO.hFileName >SYSCALL GetMemPtrA >PUSHYA @@ -270,7 +270,7 @@ FIO.LOAD.ASM.T ldy #ASM.T.hMem >PUSHWI 0 Aux type >PUSHBI 6 S.FILEINFO.TYPE.BIN - >PUSHBI SYS.FOPEN.R + >PUSHBI SYS.FOpen.R >PUSHW L.ASM.T.FILENAME >SYSCALL LoadFile bcs .9 diff --git a/BIN/ASM.S.SRC.txt b/BIN/ASM.S.SRC.txt index 6f760bf8..37b1c675 100644 --- a/BIN/ASM.S.SRC.txt +++ b/BIN/ASM.S.SRC.txt @@ -32,14 +32,14 @@ SRC.PrintLineErr ldx #0 .1 lda UsrBuf256,x beq .2 phx - >SYSCALL COutA + >SYSCALL PutCA plx inx bcc .1 rts .2 lda #13 - >SYSCALL COutA + >SYSCALL PutCA bcs .9 ldx #0 @@ -50,19 +50,19 @@ SRC.PrintLineErr ldx #0 beq .4 phx lda #'-' - >SYSCALL COutA + >SYSCALL PutCA plx bcs .9 bra .3 .4 lda #'^' phx - >SYSCALL COutA + >SYSCALL PutCA plx bcs .9 .5 lda #13 - >SYSCALL COutA + >SYSCALL PutCA .9 rts *--------------------------------------- SRC.ParseLine ldx UsrBuf256 @@ -326,12 +326,12 @@ SRC.ParseLine.OpCode .21 inx lda SRC.AM.StrBuf,x phx - >SYSCALL COutA + >SYSCALL PutCA plx cpx SRC.AM.StrBuf bne .21 lda #13 - >SYSCALL COutA + >SYSCALL PutCA .20 ldy #ASM.PC diff --git a/BIN/ASM.S.SYM.txt b/BIN/ASM.S.SYM.txt index 989f5a35..dd1405a3 100644 --- a/BIN/ASM.S.SYM.txt +++ b/BIN/ASM.S.SYM.txt @@ -121,7 +121,7 @@ SYM.Dump >LDYA L.MSG.SYMBOLS rts .5 lda #13 - >SYSCALL COutA + >SYSCALL PutCA ldy #SYM.DumpCount lda (pData),y diff --git a/BIN/ASM.S.txt b/BIN/ASM.S.txt index bbcefee7..951a42e7 100644 --- a/BIN/ASM.S.txt +++ b/BIN/ASM.S.txt @@ -258,7 +258,7 @@ CS.RUN ldy #bCANCEL *-------------------------------------- CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 lda (pEvent) diff --git a/BIN/CAT.S.txt b/BIN/CAT.S.txt index 89bbfe0e..5ec9595c 100644 --- a/BIN/CAT.S.txt +++ b/BIN/CAT.S.txt @@ -236,7 +236,7 @@ CS.RUN.PRINT sty BytesRead Y,A = Bytes read bra .7 -.6 >SYSCALL COutA +.6 >SYSCALL PutCA bcs .9 .7 inc ByteIndex @@ -272,11 +272,11 @@ CS.RUN.OPEN >SYSCALL GetFullPathYA >PUSHWI 0 Aux type >PUSHBI 4 S.FILEINFO.TYPE.TXT - >PUSHBI SYS.FOPEN.R+SYS.FOPEN.T + >PUSHBI SYS.FOpen.R+SYS.FOpen.T pla >PUSHYA - >SYSCALL FOPEN + >SYSCALL FOpen bcs .99 jsr .99 @@ -299,7 +299,7 @@ CS.RUN.OPEN >SYSCALL GetFullPathYA *-------------------------------------- CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 diff --git a/BIN/CHTYP.S.txt b/BIN/CHTYP.S.txt index 0f779e7c..48f585fe 100644 --- a/BIN/CHTYP.S.txt +++ b/BIN/CHTYP.S.txt @@ -187,7 +187,7 @@ CS.RUN ldy #bCANCEL *-------------------------------------- CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 diff --git a/BIN/DEVDUMP.S.txt b/BIN/DEVDUMP.S.txt index ee6cca4d..c7a75caf 100644 --- a/BIN/DEVDUMP.S.txt +++ b/BIN/DEVDUMP.S.txt @@ -48,11 +48,11 @@ CS.INIT >SYSCALL GetArgC >STYA pDev txa - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn sta (pPs),y -* ldy #S.PS.hOUTDEV +* ldy #S.PS.hStdOut * sta (pPs),y -* ldy #S.PS.hERRDEV +* ldy #S.PS.hStdErr * sta (pPs),y ldx #DEVMGR.OPEN @@ -76,7 +76,7 @@ CS.RUN clc *-------------------------------------- CS.DOEVENT ldy #S.EVT.hDEV lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .99 diff --git a/BIN/EDIT.S.CTRL.txt b/BIN/EDIT.S.CTRL.txt index ee18f121..114b9bec 100644 --- a/BIN/EDIT.S.CTRL.txt +++ b/BIN/EDIT.S.CTRL.txt @@ -56,7 +56,7 @@ Ctrl.A ldy #PromptMode >SYSCALL CPrintFYA bcs .9 lda #13 - >SYSCALL COutA + >SYSCALL PutCA sec lda (ZPPTR1) diff --git a/BIN/EDIT.S.SCRN.txt b/BIN/EDIT.S.SCRN.txt index 14c038f9..02ac9823 100644 --- a/BIN/EDIT.S.SCRN.txt +++ b/BIN/EDIT.S.SCRN.txt @@ -13,7 +13,7 @@ SCRN.Init ldy #ScreenH >SYSCALL CPrintFYA bcs .9 lda #12 - >SYSCALL COutA + >SYSCALL PutCA bcs .9 lda #0 @@ -160,7 +160,7 @@ SCRN.UpdateLineAtALenY pla bcs .11 - >SYSCALL COutA + >SYSCALL PutCA .11 ply plx bcs .9 @@ -412,10 +412,10 @@ SCRN.UpdateViewPort .9 jmp Ctrl.Q *-------------------------------------- SCRN.scrollUp lda #$1B - >SYSCALL COutA + >SYSCALL PutCA bcs .9 lda #'M' - >SYSCALL COutA + >SYSCALL PutCA bcs .9 ldy #ScreenY+1 @@ -439,10 +439,10 @@ SCRN.scrollUp lda #$1B .9 jmp Ctrl.Q *-------------------------------------- SCRN.scrollDn lda #$1B - >SYSCALL COutA + >SYSCALL PutCA bcs .9 lda #'D' - >SYSCALL COutA + >SYSCALL PutCA bcs .9 ldy #ScreenY+1 diff --git a/BIN/EDIT.S.txt b/BIN/EDIT.S.txt index 1608c01b..f30cd89b 100644 --- a/BIN/EDIT.S.txt +++ b/BIN/EDIT.S.txt @@ -168,7 +168,7 @@ CS.RUN ldy #bCancel *-------------------------------------- CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 @@ -345,12 +345,12 @@ CS.QUIT ldy #hBuffer >SYSCALL CPrintFYA bcs .9 lda #12 - >SYSCALL COutA + >SYSCALL PutCA .9 rts *-------------------------------------- LoadFile >PUSHWI 0 Aux type >PUSHBI 4 S.FILEINFO.TYPE.TXT - >PUSHBI SYS.FOPEN.R + >PUSHBI SYS.FOpen.R ldy #hFileName lda (pData),y @@ -426,7 +426,7 @@ SaveFile ldy #hBuffer >PUSHWI 0 Aux type >PUSHBI 4 S.FILEINFO.TYPE.TXT - >PUSHBI SYS.FOPEN.X+SYS.FOPEN.W + >PUSHBI SYS.FOpen.X+SYS.FOpen.W ldy #hFileName lda (pData),y diff --git a/BIN/FORMAT.S.txt b/BIN/FORMAT.S.txt index 74c15e7e..d83fb405 100644 --- a/BIN/FORMAT.S.txt +++ b/BIN/FORMAT.S.txt @@ -141,7 +141,7 @@ CS.RUN ldy #bCANCEL *-------------------------------------- CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 diff --git a/BIN/IPCONFIG.S.txt b/BIN/IPCONFIG.S.txt index c3d5653c..abada5f0 100644 --- a/BIN/IPCONFIG.S.txt +++ b/BIN/IPCONFIG.S.txt @@ -146,7 +146,7 @@ CS.INIT.LINK >PUSHW L.MSG1.LINK.OK .4 phx lda #'0' - >SYSCALL COutA + >SYSCALL PutCA plx dex bne .4 diff --git a/BIN/LS.S.txt b/BIN/LS.S.txt index 897fe058..071a1deb 100644 --- a/BIN/LS.S.txt +++ b/BIN/LS.S.txt @@ -227,7 +227,7 @@ CS.RUN.DIR ldy #bAllmostAll .1 lda #' ' phx - >SYSCALL COutA + >SYSCALL PutCA plx bcs .9 dex @@ -377,7 +377,7 @@ CS.RUN.NewLine ldy #ColCount beq CS.RUN.NewLine.8 CS.RUN.NewLine.1 lda #13 - >SYSCALL COutA + >SYSCALL PutCA rts CS.RUN.NewLine.8 clc @@ -394,7 +394,7 @@ CS.RUN.ENTER.MSG *-------------------------------------- CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 diff --git a/BIN/LSDEV.S.txt b/BIN/LSDEV.S.txt index d8b3b0f9..2e0a34b9 100644 --- a/BIN/LSDEV.S.txt +++ b/BIN/LSDEV.S.txt @@ -35,251 +35,81 @@ CS.START cld .DA CS.QUIT L.MSG0 .DA MSG0 L.MSG1 .DA MSG1 -L.MSG2 .DA MSG2 -L.MSG3 .DA MSG3 -L.RAM .DA RAM -L.DISK2 .DA DISK2 -L.GENERIC .DA GENERIC +L.DEV.NAME .DA DEV.NAME .DA 0 *-------------------------------------- -CS.INIT jsr DumpA2osXDev - bcs .9 - - jsr DumpProDOSDev - bcs .9 - - lda #0 tell TSKMGR that all done ok, but -.9 sec we do not want to stay in memory +CS.INIT clc rts *-------------------------------------- -DumpA2osXDev >LDYA L.MSG0 +CS.RUN >LDYA L.MSG0 >SYSCALL CPrintFYA >LDYAI DevMgr.Table >STYA ZPPTR1 stz DEV.ID -.2 lda (ZPPTR1) - cmp #$D8 - bne .8 +.1 lda DEV.ID + + >SYSCALL GetDevByIDA + bcs .8 + >STYA ZPPTR1 ldy #S.DEV.JMP+1 >PUSHB (ZPPTR1),y dey >PUSHB (ZPPTR1),y - lda ZPPTR1 - clc - adc #S.DEV.NAME - tay - lda ZPPTR1+1 - adc #0 - >PUSHYA + ldy #S.DEV.F + lda (ZPPTR1),y + and #S.DEV.F.LEN + sta DEV.NAME + tax + iny + +.2 lda (ZPPTR1),y + sta DEV.NAME-S.DEV.F,y + iny + dex + bne .2 + + >PUSHW L.DEV.NAME ldy #S.DEV.F >PUSHB (ZPPTR1),y - ldy #S.DEV.ID + + ldy #S.DEV.S >PUSHB (ZPPTR1),y + + >PUSHB DEV.ID + >LDYA L.MSG1 >SYSCALL CPrintFYA + inc DEV.ID + lda ZPPTR1 clc adc #S.DEV sta ZPPTR1 - bcc .3 + bcc .1 inc ZPPTR1+1 + bra .1 -.3 inc DEV.ID - lda DEV.ID - cmp #K.DEV.MAX - bne .2 -.8 clc +.8 lda #0 tell TSKMGR that all done ok, but +.9 sec we do not want to stay in memory rts *-------------------------------------- -DumpProDOSDev >LDYA L.MSG2 - >SYSCALL CPrintFYA - - stz BLKCALL.PARAMS CmdNum = 0, STATUS Call - stz BLKCALL.PARAMS+4 ask for Block 0 - stz BLKCALL.PARAMS+5 (in case driver check block validity before checking CmdNum) - - ldx DEVCNT - stx DEV.ID - -.1 ldx DEV.ID - - ldy #1 - - lda DEVLST,x - bpl .2 - - iny - -.2 sty Drive - - and #$F0 - sta BLKCALL.PARAMS+1 UnitNum for BLKCALL, if needed - lsr - lsr - lsr - tay Y = DSSS*2 - - lsr - and #$7 - sta Slot - - stz ZPPTR1 make Ptr1 = Cn00 - lda DEVPTRS,y - sta ZPPTR2 make Ptr2 = Cnxx (prodos BLK entry point) - - lda DEVPTRS+1,y - sta ZPPTR1+1 - sta ZPPTR2+1 - - cmp #$C1 - bcc .6 3rd Party Driver loaded in RAM... - - cmp #$C8 - bcs .4 In ProDOS Space.../RAM or DisK II - - ldx #SmartPort.SIG-SmartPort.OFS - -.3 ldy SmartPort.OFS-1,x Check if there is a smartport firmware - lda (ZPPTR1),y - cmp SmartPort.SIG-1,x - bne .6 not a smartport...go check $CnFE - dex - bne .3 - - jsr GO.SmartPort Perform a Smartpot STATUS call - bcs .8 - - jsr PrintDevStatus - - bra .8 - -.4 cmp #$ff RAM ? - bne .5 - >LDYA L.RAM - bra .7 - -.5 >LDYA L.DISK2 - bra .7 - -.6 >LDYA L.GENERIC - -.7 >STYA .71+1 - ldy #16 -.71 lda $ffff,y - sta UsrBuf256+S.SPSTAT.NAME,y - dey - bpl .71 - - >LDYA ZPPTR2 Get Block device PTR - jsr A2osX.BLKCALL - - bcs .8 - stx UsrBuf256+S.SPSTAT.BLKNUM - sty UsrBuf256+S.SPSTAT.BLKNUM+1 - stz UsrBuf256+S.SPSTAT.BLKNUM+2 - - jsr PrintDevStatus - -.8 dec DEV.ID - bmi .9 - jmp .1 - -.9 clc - rts -*-------------------------------------- -S.SPSTAT.STATUS .EQ 0 -S.SPSTAT.STATUS.BLK .EQ %10000000 -S.SPSTAT.STATUS.WRT .EQ %01000000 -S.SPSTAT.STATUS.RD .EQ %00100000 -S.SPSTAT.STATUS.ONL .EQ %00010000 -S.SPSTAT.STATUS.FMT .EQ %00001000 -S.SPSTAT.STATUS.WRP .EQ %00000100 -S.SPSTAT.STATUS.IRQ .EQ %00000010 -S.SPSTAT.STATUS.OPN .EQ %00000001 -S.SPSTAT.BLKNUM .EQ 1 -S.SPSTAT.NAME .EQ 4 -S.SPSTAT.TYPE .EQ 21 -S.SPSTAT.SUBTYP .EQ 22 -S.SPSTAT.VER .EQ 23 -S.SPSTAT .EQ 25 -*-------------------------------------- -GO.SmartPort ldy #$ff - lda (ZPPTR1),y - - inc - inc - inc - sta .2+1 Entrypoint Offset=+3 - - lda ZPPTR1+1 Get $Cn - sta .2+2 - - and #$0f - cmp Slot Driver Slot match Dev Slot ? - beq .1 yes... - - inc Slot - inc Slot - inc Slot - inc Drive no... - inc Drive Must have been remapped by ProDOS - -.1 stz .3 CMD=Status - lda Drive - sta SMP.Params+1 UnitNum - -.2 jsr $ffff -.3 lda SMP.Params will be relocated - rts -*-------------------------------------- -PrintDevStatus >PUSHW UsrBuf256+S.SPSTAT.BLKNUM - - ldy #S.SPSTAT.NAME - lda /UsrBuf256 - >PUSHYA - - >PUSHB Drive - >PUSHB Slot - >PUSHB UsrBuf256 STATUS - >PUSHB Dev.ID - - >LDYA L.MSG3 - >SYSCALL CPrintFYA - rts -*-------------------------------------- -CS.RUN CS.EVENT CS.QUIT clc rts *-------------------------------------- CS.END -SmartPort.OFS .HS 01030507 -SmartPort.SIG .HS 20000300 -DiskII.OFS .HS 010305FF -DiskII.SIG .HS 20000300 -MSG0 >CSTR "ID Flags Name Address\n" -MSG1 >CSTR "%03d %b %4S $%H\n" -MSG2 >CSTR "ID Flags Name Description Size\n" -MSG3 >CSTR "%03d %b S%dD%d %S %05D\n" -RAM >PSTR "ProDOS Ram Disk " -DISK2 >PSTR "Apple Disk ][ " -GENERIC >PSTR "Generic Blk Dev " -*-------------------------------------- -SMP.Params .DA #3 Param Count - .BS 1 unitNumber - .DA UsrBuf256 - .DA #3 Return DIB +MSG0 >CSTR "ID Status Flags Name Address\n" +MSG1 >CSTR "%03d %b %b %4S $%H\n" *-------------------------------------- DEV.ID .BS 1 -Slot .BS 1 -Drive .BS 1 +DEV.NAME .BS 5 MAN SAVE BIN/LSDEV.S ASM diff --git a/BIN/MEMDUMP.S.txt b/BIN/MEMDUMP.S.txt index 1d6984bb..191fc757 100644 --- a/BIN/MEMDUMP.S.txt +++ b/BIN/MEMDUMP.S.txt @@ -248,7 +248,7 @@ CS.RUN.PRINTMEM ldy #S.MEM.LEN *-------------------------------------- CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 diff --git a/BIN/NSCUTIL.S.txt b/BIN/NSCUTIL.S.txt index 1466c6ef..5c18f106 100644 --- a/BIN/NSCUTIL.S.txt +++ b/BIN/NSCUTIL.S.txt @@ -287,11 +287,11 @@ NSC.Dump ldx #1 lda DS1216E.DATA+2 jsr PrintBCD lda #'/' - >SYSCALL COutA + >SYSCALL PutCA lda DS1216E.DATA+1 jsr PrintBCD lda #'/' - >SYSCALL COutA + >SYSCALL PutCA lda DS1216E.DATA jsr PrintBCD @@ -304,15 +304,15 @@ NSC.Dump ldx #1 .4 and #$3F jsr PrintBCD lda #':' - >SYSCALL COutA + >SYSCALL PutCA lda DS1216E.DATA+5 jsr PrintBCD lda #':' - >SYSCALL COutA + >SYSCALL PutCA lda DS1216E.DATA+6 jsr PrintBCD lda #'.' - >SYSCALL COutA + >SYSCALL PutCA lda DS1216E.DATA+7 jsr PrintBCD rts @@ -323,12 +323,12 @@ PrintBCD pha lsr lsr ora #$30 - >SYSCALL COutA + >SYSCALL PutCA bcs .9 pla and #$0f ora #$30 - >SYSCALL COutA + >SYSCALL PutCA .9 rts *-------------------------------------- GetBCD lda (ZPPtr1),y diff --git a/BIN/PING.S.txt b/BIN/PING.S.txt index e5d4ad11..f4e0c166 100644 --- a/BIN/PING.S.txt +++ b/BIN/PING.S.txt @@ -272,7 +272,7 @@ CS.DOEVENT lda (pEvent) ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 diff --git a/BIN/RM.S.txt b/BIN/RM.S.txt index ad4e5185..dcc4fec0 100644 --- a/BIN/RM.S.txt +++ b/BIN/RM.S.txt @@ -269,7 +269,7 @@ CS.RUN.PRINT.RC pha *-------------------------------------- CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 diff --git a/BIN/RPCDUMP.S.txt b/BIN/RPCDUMP.S.txt index 1e049bfa..9f399bdf 100644 --- a/BIN/RPCDUMP.S.txt +++ b/BIN/RPCDUMP.S.txt @@ -171,7 +171,7 @@ CS.DOEVENT lda (pEvent) ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 diff --git a/BIN/X.CPMV.S.txt b/BIN/X.CPMV.S.txt index 1d21e1eb..cb83b96e 100644 --- a/BIN/X.CPMV.S.txt +++ b/BIN/X.CPMV.S.txt @@ -346,7 +346,7 @@ CS.RUN.PRINT.RC pha *-------------------------------------- CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 diff --git a/DRV/CONSOLE.DRV.S.txt b/DRV/CONSOLE.DRV.S.txt index 39427967..f9b63018 100644 --- a/DRV/CONSOLE.DRV.S.txt +++ b/DRV/CONSOLE.DRV.S.txt @@ -11,6 +11,7 @@ AUTO 6 .INB /A2OSX.DEV/INC/MACROS.I .INB /A2OSX.DEV/INC/A2OSX.I .INB /A2OSX.DEV/INC/IO.I + .INB /A2OSX.DEV/INC/PRODOS.I *-------------------------------------- CURSOR.BLINK.SPEED .EQ 8 ESCSEQ.MAXLEN .EQ 16 @@ -45,25 +46,27 @@ MSG.DETECT >CSTR "Apple IIe/IIc 80 Col Driver.\n" *-------------------------------------- * Device Header (16 Bytes) *-------------------------------------- -DEV.HEADER cld - jmp (DRV.CS.START,x) - .HS 00 DevID - .DA #S.DEV.F.EVENT+S.DEV.F.COUT+S.DEV.F.CHAR - >PSTR "CON" NAME +DEV.HEADER .DA DRV.CS.START + .DA #S.DEV.S.WRITE+S.DEV.S.READ + .DA #3 + .AS "CON" NAME .HS 00 NAME must Be 5 bytes long - .HS 00 - .HS 00.00.00.00 *-------------------------------------- * Driver Code *-------------------------------------- -DRV.CS.START .DA OPEN - .DA GETEVENT - .DA COUT +DRV.CS.START cld + jmp (.1,x) +.1 .DA STATUS + .DA BADCALL + .DA BADCALL + .DA BADCALL + .DA CONTROL + .DA BADCALL + .DA OPEN .DA CLOSE - .DA GETINFO - .DA IRQ - .DA SELECT -L.DEVINFO .DA DEVINFO + .DA READ + .DA WRITE +L.STAT .DA STAT *-------------------------------------- J.CtrlChars .DA BS 8 .DA LF 10 @@ -82,6 +85,14 @@ J.EscSequences .DA Esc.DispAttr m .DA Esc.Home H .DA 0 end of relocation *-------------------------------------- +BADCALL lda #MLI.ERR.BADCALL + sec + rts +*-------------------------------------- +STATUS >LDYA L.STAT + clc + rts +*-------------------------------------- OPEN stz CURON stz bEscMode @@ -90,20 +101,27 @@ OPEN stz CURON stz OutPtr stz OutCnt - ldy #S.DEV.ID - lda (pDev),y - sta A2osX.SCRNDEVS + sta A2osX.SCRNDEVS DEV.ID in A - jsr SELECT - lda #1 - sta A2osX.ASCREEN jsr RESET jsr HOME +*-------------------------------------- +CONTROL sta SETTEXT + sta SETALTCHAR + sta SET80DISP + sta CLR80STORE + sta CLRPAGE2 + lda #1 + sta A2osX.ASCREEN clc rts *-------------------------------------- -GETEVENT jsr Char.Out.Get - bcc .7 no char in output buffer... +CLOSE stz A2osX.SCRNDEVS + clc + rts +*-------------------------------------- +READ jsr Char.Out.Get + bcc .8 IF cs,no char in output buffer... lda A2osX.ASCREEN cmp #1 is CON active? @@ -129,7 +147,7 @@ GETEVENT jsr Char.Out.Get beq .3 dex bne .2 - bra .7 + bra .8 .3 lda KeyRemappedIdx,x tay @@ -141,23 +159,15 @@ GETEVENT jsr Char.Out.Get bra .4 .6 jsr Char.Out.Get - -.7 ldy #S.EVT.DATALO - sta (pEvent),y - iny S.EVT.DATAHI - lda #0 - sta (pEvent),y - lda #S.EVT.F.KEY - sta (pEvent) .8 clc rts -.9 lda #0 Error = no event +.9 lda #0 Error = char sec rts *-------------------------------------- -COUT bit bEscMode +WRITE bit bEscMode bmi COUT.EscMode pha @@ -172,14 +182,6 @@ COUT bit bEscMode jsr SetCharAtXY jmp FSOUT *-------------------------------------- -SELECT sta SETTEXT - sta SETALTCHAR - sta SET80DISP - sta CLR80STORE - sta CLRPAGE2 - clc - rts -*-------------------------------------- COUT.Ctrl ldy #0 ldx #0 @@ -308,14 +310,6 @@ COUT.ExecEscSeq stz EscSeqParamCnt .5 jmp (J.EscSequences,x) *-------------------------------------- -CLOSE stz A2osX.SCRNDEVS - clc - rts -*-------------------------------------- -GETINFO >LDYA L.DEVINFO -IRQ clc - rts -*-------------------------------------- * PRIVATE *-------------------------------------- RESET lda #0 @@ -394,9 +388,6 @@ FSOUT ldx CH rts *-------------------------------------- CROUT jsr CLREOL - stz CH - clc - rts CROUT1 stz CH LF ldy CV cpy #23 @@ -804,7 +795,12 @@ EscSeqParamTmp .BS 2 EscSeqParamCnt .BS 1 EscSeqParam .BS 4 *-------------------------------------- -DEVINFO .DA #S.DEVINFO.TYPE.CHAR +STAT .DA #S.DEVSTAT.S.WRITE+S.DEVSTAT.S.READ + .DA #0,#0,#0 + >PSTR "ANSI 80c Console" + .DA #0 + .DA #0 + .DA 0900 *-------------------------------------- MAN SAVE DRV/CONSOLE.DRV.S diff --git a/DRV/UTHERNET.DRV.S.txt b/DRV/UTHERNET.DRV.S.txt index 93e9fe60..f4d9d462 100644 --- a/DRV/UTHERNET.DRV.S.txt +++ b/DRV/UTHERNET.DRV.S.txt @@ -11,8 +11,19 @@ AUTO 6 .INB /A2OSX.DEV/INC/MACROS.I .INB /A2OSX.DEV/INC/A2OSX.I .INB /A2OSX.DEV/INC/LIBTCPIP.I + .INB /A2OSX.DEV/INC/PRODOS.I *-------------------------------------- ZPTmpPTR .EQ ZPDRV +*-------------------------------------- +*S.DEVINFO.NET.FLAGS.ARPOFFLOAD .EQ %00000001 +*S.DEVINFO.NET.FLAGS.IPOFFLOAD .EQ %00000010 +*S.DEVINFO.NET.MAC .EQ 2 +*S.DEVINFO.NET.STATUS .EQ 8 +*S.DEVINFO.NET.STATUS.OK .EQ $80 +*S.DEVINFO.NET.STATUS.FD .EQ $40 +*S.DEVINFO.NET.STATUS.10 .EQ $01 +*S.DEVINFO.NET.STATUS.100 .EQ $02 +*S.DEVINFO.NET.STATUS.1000 .EQ $03 *-------------------------------------- .INB DRV/X.NET.8900A.S *-------------------------------------- @@ -60,7 +71,7 @@ Dev.Detect >STYA ARGS >LDYA L.MSG.DETECT.KO >SYSCALL CPrintFYA - lda #DEVMGR.ERRNOHW + lda #MLI.ERR.NODEV sec rts @@ -108,67 +119,68 @@ ARGS .BS 2 *-------------------------------------- * Device Header (16 Bytes) *-------------------------------------- -DEV.HEADER cld - jmp (DRV.CS.START,x) - .HS 00 - .DA #S.DEV.F.SHARE+S.DEV.F.EVENT -DEV.HEADER.NAME >PSTR "ETH1" NAME - .HS 00 - .HS 00.00.00.00 +DEV.HEADER .DA DRV.CS.START + .DA #S.DEV.S.BLOCK+S.DEV.S.WRITE+S.DEV.S.READ +DEV.HEADER.NAME .DA #4 + .AS "ETHx" NAME *-------------------------------------- * Driver Code *-------------------------------------- -DRV.CS.START .DA OPEN - .DA GETEVENT - .DA COUT +DRV.CS.START .DA STATUS + .DA READBLOCK + .DA WRITEBLOCK + .DA BADCALL + .DA BADCALL + .DA BADCALL + .DA OPEN .DA CLOSE - .DA GETINFO - .DA IRQ - .DA SEND - .DA SETIPCFG -L.DEVINFO .DA DEVINFO + .DA BADCALL + .DA BADCALL +L.DEVSTAT .DA DEVSTAT .DA 0 end or relocation *-------------------------------------- -OPEN jsr Reset - >LDYAI PP.RxCTL - >STYA PacketPagePTR,x - >LDYAI PP.RxCTL.LID+PP.RxCTL.RxOKA+PP.RxCTL.IA+PP.RxCTL.BroadcastA - >STYA PacketPageDATA,x +BADCALL lda #MLI.ERR.BADCALL + sec + rts +*-------------------------------------- +STATUS lda #S.DEVINFO.NET.STATUS.10 + sta LINK.STATUS - >LDYAI PP.MAC + ldx DEVSLOTx0 + >LDYAI PP.LineST >STYA PacketPagePTR,x - >LDYA MAC - >STYA PacketPageDATA,x - >LDYAI PP.MAC+2 + >LDYA PacketPageDATA,x + tya + and #PP.LineST.LinkOK + bne .1 + lda LINK.STATUS + ora #S.DEVINFO.NET.STATUS.OK + sta LINK.STATUS + +.1 >LDYAI PP.TestCTL >STYA PacketPagePTR,x - >LDYA MAC+2 - >STYA PacketPageDATA,x - >LDYAI PP.MAC+4 - >STYA PacketPagePTR,x - >LDYA MAC+4 - >STYA PacketPageDATA,x + >LDYA PacketPageDATA,x + and /PP.TestCTL.FDX + bne .2 + lda LINK.STATUS + ora #S.DEVINFO.NET.STATUS.FD + sta LINK.STATUS - >LDYAI PP.LineCTL - >STYA PacketPagePTR,x - >LDYAI PP.LineCTL.LID+PP.LineCTL.SerRxOn+PP.LineCTL.SerTxOn+PP.LineCTL.Auto - >STYA PacketPageDATA,x +.2 >LDYA L.DEVSTAT clc rts *-------------------------------------- -GETEVENT ldx DEVSLOTx0 +READBLOCK ldx DEVSLOTx0 >LDYAI PP.RxEvent >STYA PacketPagePTR,x >LDYA PacketPageDATA,x and /PP.RxEvent.RxOK+PP.RxEvent.Brdcast+PP.RxEvent.IA - bne GETEVENT.RxOK + bne READBLOCK.RxOK lda #ERR.DEV.NOFRAME -COUT -IRQ -SETIPCFG -GETEVENT.Err sec +READBLOCK.Err sec rts -GETEVENT.RxOK and /PP.RxEvent.Brdcast +READBLOCK.RxOK and /PP.RxEvent.Brdcast beq .10 lda #$80 .10 ldy #S.EVT.DATAHI @@ -190,7 +202,7 @@ GETEVENT.RxOK and /PP.RxEvent.Brdcast .11 >PUSHYA Size+2 >PUSHBI 0 >SYSCALL GetMem - bcs GETEVENT.Err + bcs READBLOCK.Err >STYA ZPTmpPTR txa ldy #S.EVT.DATALO @@ -239,38 +251,7 @@ GETEVENT.RxOK and /PP.RxEvent.Brdcast .8 clc rts *-------------------------------------- -CLOSE jsr Reset - clc - rts -*-------------------------------------- -GETINFO lda #S.DEVINFO.NET.STATUS.10 - sta LINK.STATUS - - ldx DEVSLOTx0 - >LDYAI PP.LineST - >STYA PacketPagePTR,x - >LDYA PacketPageDATA,x - tya - and #PP.LineST.LinkOK - bne .1 - lda LINK.STATUS - ora #S.DEVINFO.NET.STATUS.OK - sta LINK.STATUS - -.1 >LDYAI PP.TestCTL - >STYA PacketPagePTR,x - >LDYA PacketPageDATA,x - and /PP.TestCTL.FDX - bne .2 - lda LINK.STATUS - ora #S.DEVINFO.NET.STATUS.FD - sta LINK.STATUS - -.2 >LDYA L.DEVINFO - clc - rts -*-------------------------------------- -SEND >PULLW ZPTmpPTR +WRITEBLOCK >PULLW ZPTmpPTR lda (ZPTmpPTR) sta Size @@ -296,7 +277,7 @@ SEND >PULLW ZPTmpPTR bne .9 lda PacketPageDATA+1,x and /PP.BusST.Rdy4TxNOW - bne SENDPREADY + bne WRITEBLOCK.1 lda #0 .2 dec @@ -309,7 +290,7 @@ SEND >PULLW ZPTmpPTR sec rts -SENDPREADY ldy #S.ETH.SRCMAC+5 +WRITEBLOCK.1 ldy #S.ETH.SRCMAC+5 ldx #5 .10 lda MAC,x sta (ZPTmpPTR),y @@ -346,6 +327,36 @@ SENDPREADY ldy #S.ETH.SRCMAC+5 .8 clc rts *-------------------------------------- +OPEN jsr Reset + >LDYAI PP.RxCTL + >STYA PacketPagePTR,x + >LDYAI PP.RxCTL.LID+PP.RxCTL.RxOKA+PP.RxCTL.IA+PP.RxCTL.BroadcastA + >STYA PacketPageDATA,x + + >LDYAI PP.MAC + >STYA PacketPagePTR,x + >LDYA MAC + >STYA PacketPageDATA,x + >LDYAI PP.MAC+2 + >STYA PacketPagePTR,x + >LDYA MAC+2 + >STYA PacketPageDATA,x + >LDYAI PP.MAC+4 + >STYA PacketPagePTR,x + >LDYA MAC+4 + >STYA PacketPageDATA,x + + >LDYAI PP.LineCTL + >STYA PacketPagePTR,x + >LDYAI PP.LineCTL.LID+PP.LineCTL.SerRxOn+PP.LineCTL.SerTxOn+PP.LineCTL.Auto + >STYA PacketPageDATA,x + clc + rts +*-------------------------------------- +CLOSE jsr Reset + clc + rts +*-------------------------------------- Reset ldx DEVSLOTx0 >LDYAI PP.SelfCTL >STYA PacketPagePTR,x @@ -357,8 +368,7 @@ DRV.CS.END DEVSLOTx0 .BS 1 Size .BS 2 Counter .BS 2 -DEVINFO .DA #S.DEVINFO.TYPE.NET -DEVFLAGS .DA #0 +DEVSTAT .BS S.DEVSTAT MAC .BS 6 LINK.STATUS .BS 1 OK/DUPLEX/SPEED MAN diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index 08f38e69..8ed2d344 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -33,7 +33,7 @@ pEvent .EQ $2E ZPDRV .EQ $30 ZPBIN .EQ $40 *-------------------------------------- -* $3A-$3F ProDOS Block Device Drivers Main +* $42-$47 ProDOS Block Device Drivers Main *-------------------------------------- * $5E-$C8 RESERVED APPLESOFT Main/Aux (ROM Call, no need to switch back MainZP) *-------------------------------------- @@ -77,7 +77,7 @@ Z80JMP .EQ $1000 (00000h) Up To $10FF *-------------------------------------- EvtMgr.Table .EQ $1100 K.EVT.MAX*S.EVT.SIZE=32*8=256b *-------------------------------------- -DevMgr.Table .EQ $1200 K.DEV.MAX*S.DEV.SIZE=16*16=256b +DevMgr.Table .EQ $1200 K.DEV.MAX*S.DEV.SIZE=32*8=256b *-------------------------------------- FltMgr.Table .EQ $1300 K.FLT.MAX*S.FLT.SIZE=8*32=256b *-------------------------------------- @@ -129,7 +129,7 @@ A2osX.RANDOM16 .EQ $BEEE * $BEF0->$BEFF : Kernel Config Block *-------------------------------------- A2osX.HZ .EQ $BEF0 -A2osX.RAMDRVDIS .EQ $BEF8 If $80, prevent CHrooting to /RAMx +A2osX.RAMDRVDIS .EQ $BEF8 If $80, prevent ChRooting to /RAMx A2osX.SLOTS .EQ $BEF8 $BEF9->$BEFF, 7 slots *-------------------------------------- H.BIN.HEADER .EQ 0 @@ -149,7 +149,7 @@ H.BIN.EXE.REL.TABLE .EQ 16 H.BIN.DRV.HEADER.O .EQ 10 H.BIN.DRV.CODE.O .EQ 12 H.BIN.DRV.CODE.LEN .EQ 14 -H.BIN.DRV.REL.TABLE .EQ 0 +H.BIN.DRV.REL.TABLE .EQ 2 *-------------------------------------- * A2osX.SYSCALL Functions Indexes *-------------------------------------- @@ -167,56 +167,49 @@ SYS.LoadDrvYA .EQ $10 SYS.LoadLibYA .EQ $12 SYS.UnloadLibA .EQ $14 SYS.LoadExeYA .EQ $16 - SYS.TimeYA .EQ $18 SYS.CTime2Time .EQ $1A SYS.PTime2Time .EQ $1C * .EQ $1E *-------------------------------------- -SYS.FOPEN .EQ $20 -SYS.FOPEN.R .EQ $01 Open For Read -SYS.FOPEN.W .EQ $02 Open For Write -SYS.FOPEN.A .EQ $04 Append -SYS.FOPEN.T .EQ $08 Open/Append in Text mode -SYS.FOPEN.X .EQ $80 Create if not exists - +SYS.FOpen .EQ $20 +SYS.FOpen.R .EQ $01 Open For Read +SYS.FOpen.W .EQ $02 Open For Write +SYS.FOpen.A .EQ $04 Append +SYS.FOpen.T .EQ $08 Open/Append in Text mode +SYS.FOpen.X .EQ $80 Create if not exists SYS.FCloseA .EQ $22 -SYS.FREAD .EQ $24 -SYS.FWRITE .EQ $26 - -SYS.FFLUSH .EQ $28 -SYS.FSEEK .EQ $2A -SYS.FSEEK.SET .EQ $00 -SYS.FSEEK.CUR .EQ $01 -SYS.FSEEK.END .EQ $02 -SYS.FTELL .EQ $2C +SYS.FRead .EQ $24 +SYS.FWrite .EQ $26 +SYS.FFlush .EQ $28 +SYS.FSeek .EQ $2A +SYS.FSeek.SET .EQ $00 +SYS.FSeek.CUR .EQ $01 +SYS.FSeek.END .EQ $02 +SYS.FTell .EQ $2C SYS.FEOF .EQ $2E - SYS.RemoveYA .EQ $30 SYS.Rename .EQ $32 SYS.STAT .EQ $34 * .EQ $36 - -SYS.OPENDIRYA .EQ $38 +SYS.OpenDirYA .EQ $38 SYS.ReadDirA .EQ $3A SYS.CloseDirA .EQ $3C SYS.MKDirYA .EQ $3E *-------------------------------------- -SYS.COutA .EQ $40 +* .EQ $40 SYS.SScanF .EQ $42 SYS.PPrintFYA .EQ $44 SYS.CPrintFYA .EQ $46 - -SYS.FPUTCA .EQ $48 -SYS.FGETC .EQ $4A -SYS.FPUTSYA .EQ $4C -SYS.FGETS .EQ $4E +* .EQ $48 +* .EQ $4A +* .EQ $4C +* .EQ $4E *-------------------------------------- SYS.NewPStrYA .EQ $50 SYS.PStrCpy .EQ $52 SYS.PStrCat .EQ $54 SYS.PStrMatch .EQ $56 - SYS.PStrUprYA .EQ $58 SYS.PStrLwrYA .EQ $5A SYS.PStrFTime .EQ $5C @@ -226,7 +219,6 @@ SYS.ExecProcessNewEnvYA .EQ $60 SYS.ExecProcessYA .EQ $62 SYS.CreateProcessNewEnvYA .EQ $64 SYS.CreateProcessYA .EQ $66 - SYS.GetPSByIDA .EQ $68 * .EQ $6A SYS.Sleep .EQ $6C @@ -236,7 +228,6 @@ SYS.GetArgC .EQ $70 SYS.GetArgA .EQ $72 SYS.ExpandPStrYA .EQ $74 * .EQ $76 - SYS.PutEnvYA .EQ $78 SYS.SetEnv .EQ $7A SYS.GetEnvYA .EQ $7C @@ -244,9 +235,8 @@ SYS.UnsetEnvYA .EQ $7E *-------------------------------------- SYS.GetDevByIDA .EQ $80 SYS.GetDevByNameYA .EQ $82 -SYS.GetDevInfoA .EQ $84 +SYS.GetDevStatusA .EQ $84 * .EQ $86 -*-------------------------------------- SYS.MKNodYA .EQ $88 SYS.MKNodA .EQ $8A SYS.MKFIFO .EQ $8C @@ -256,14 +246,28 @@ SYS.GetMem .EQ $90 SYS.FreeMemA .EQ $92 SYS.GetMemPtrA .EQ $94 SYS.GetMemByIDA .EQ $96 - * .EQ $98 -SYS.LoadStockObjectYA .EQ $9A -SYS.GetStockObjectA .EQ $9C -SYS.FreeStockObject .EQ $9E +SYS.LoadStkObjYA .EQ $9A +SYS.GetStkObjA .EQ $9C +SYS.FreeStkObjA .EQ $9E *-------------------------------------- SYS.SetLoMem .EQ $A0 SYS.GetMemStatYA .EQ $A2 +* .EQ $A4 +* .EQ $A6 +* .EQ $A8 +* .EQ $AA +* .EQ $AC +* .EQ $AE +*-------------------------------------- +SYS.FPutCAY .EQ $B0 +SYS.PutCA .EQ $B2 +SYS.FGetCA .EQ $B4 +SYS.GetC .EQ $B6 +SYS.FPutS .EQ $B8 +SYS.PutSYA .EQ $BA +SYS.FGetS .EQ $BC +SYS.GetSYA .EQ $BE *-------------------------------------- * ProDOS ERROR CODES : $00->$5F * Lib ERROR CODES : $80->$BF @@ -275,9 +279,6 @@ MEMMGR.ERROOH .EQ $FE Out Of Handle Error DEVMGR.ERROOM .EQ $EF Out Of Memory Error DEVMGR.ERROOH .EQ $EE Out Of Handle Error DEVMGR.ERRICL .EQ $ED Invalid Command Line -DEVMGR.ERRNOHW .EQ $EC No Hardware -DEVMGR.ERRDNF .EQ $EB Device Not Found Error -DEVMGR.ERRUNSUP .EQ $EA Unsupported Function *-------------------------------------- TSKMGR.ERROOH .EQ $DF Out Of Handle Error TSKMGR.ERRNSP .EQ $DD No Such Process Error @@ -319,107 +320,140 @@ S.MEMSTAT.DH .EQ 20 * S.MEMSTAT .EQ 24 *-------------------------------------- -S.DEVINFO.TYPE .EQ 0 -S.DEVINFO.TYPE.CHAR .EQ %00000001 -S.DEVINFO.TYPE.XY .EQ %00000010 -S.DEVINFO.TYPE.NET .EQ %00000011 -S.DEVINFO.TYPE.GFX .EQ %00000100 -S.DEVINFO.FLAGS .EQ 1 -S.DEVINFO.NET.FLAGS.ARPOFFLOAD .EQ %00000001 -S.DEVINFO.NET.FLAGS.IPOFFLOAD .EQ %00000010 -S.DEVINFO.NET.MAC .EQ 2 -S.DEVINFO.NET.STATUS .EQ 8 -S.DEVINFO.NET.STATUS.OK .EQ $80 -S.DEVINFO.NET.STATUS.FD .EQ $40 -S.DEVINFO.NET.STATUS.10 .EQ $01 -S.DEVINFO.NET.STATUS.100 .EQ $02 -S.DEVINFO.NET.STATUS.1000 .EQ $03 +* DEVMGR (old API) +*-------------------------------------- +*S.DEV.CODE .EQ 0 cld,jmp... +*S.DEV.JMP .EQ 2 ...(code,x) +*S.DEV.ID .EQ 4 +*S.DEV.F .EQ 5 +*S.DEV.F.INUSE .EQ %10000000 +*S.DEV.F.BUSY .EQ %01000000 +*S.DEV.F.SHARE .EQ %00100000 Device is shareable +*S.DEV.F.IRQ .EQ %00010000 Device is irq driven +*S.DEV.F.EVENT .EQ %00001000 Device is event driven +*S.DEV.F.COUT .EQ %00000100 Device supports Char OUT +*S.DEV.F.BLOCK .EQ %00000010 +*S.DEV.F.CHAR .EQ %00000001 +*S.DEV.NAME .EQ 6 5 Bytes : LEN+NUL KBD CON COMx LPTx ETHx +* +*S.DEV .EQ 16 +*-------------------------------------- +*S.DEVINFO.TYPE .EQ 0 +*S.DEVINFO.TYPE.CHAR .EQ %00000001 +*S.DEVINFO.TYPE.XY .EQ %00000010 +*S.DEVINFO.TYPE.NET .EQ %00000011 +*S.DEVINFO.TYPE.GFX .EQ %00000100 +*S.DEVINFO.FLAGS .EQ 1 +*S.DEVINFO.NET.FLAGS.ARPOFFLOAD .EQ %00000001 +*S.DEVINFO.NET.FLAGS.IPOFFLOAD .EQ %00000010 +*S.DEVINFO.NET.MAC .EQ 2 +*S.DEVINFO.NET.STATUS .EQ 8 +*S.DEVINFO.NET.STATUS.OK .EQ $80 +*S.DEVINFO.NET.STATUS.FD .EQ $40 +*S.DEVINFO.NET.STATUS.10 .EQ $01 +*S.DEVINFO.NET.STATUS.100 .EQ $02 +*S.DEVINFO.NET.STATUS.1000 .EQ $03 *-------------------------------------- * Generic Driver Functions *-------------------------------------- -DEVMGR.OPEN .EQ 0 -DEVMGR.GETEVENT .EQ 2 -DEVMGR.COUT .EQ 4 -DEVMGR.CLOSE .EQ 6 -DEVMGR.GETINFO .EQ 8 -DEVMGR.IRQ .EQ 10 +*DEVMGR.OPEN .EQ 0 +*DEVMGR.GETEVENT .EQ 2 +*DEVMGR.COUT .EQ 4 +*DEVMGR.CLOSE .EQ 6 +*DEVMGR.GETINFO .EQ 8 +*DEVMGR.IRQ .EQ 10 *-------------------------------------- -DEVMGR.SELECT .EQ 12 +*DEVMGR.SELECT .EQ 12 *-------------------------------------- * 'NET' Class Driver Functions *-------------------------------------- -DEVMGR.NET.SEND .EQ 12 -DEVMGR.SETIPCFG .EQ 14 +*DEVMGR.NET.SEND .EQ 12 +*DEVMGR.SETIPCFG .EQ 14 *-------------------------------------- * 'GFX' Class Driver Functions *-------------------------------------- -DEVMGR.GFX.SETPIXEL .EQ 14 -DEVMGR.GFX.GETPIXEL .EQ 16 -DEVMGR.GFX.HLINE .EQ 18 -DEVMGR.GFX.VLINE .EQ 20 -DEVMGR.GFX.BITBLT .EQ 22 -*-------------------------------------- -* DEVMGR (old API) -*-------------------------------------- -S.DEV.CODE .EQ 0 cld,jmp... -S.DEV.JMP .EQ 2 ...(code,x) -S.DEV.ID .EQ 4 -S.DEV.F .EQ 5 -S.DEV.F.INUSE .EQ %10000000 -S.DEV.F.BUSY .EQ %01000000 -S.DEV.F.SHARE .EQ %00100000 Device is shareable -S.DEV.F.IRQ .EQ %00010000 Device is irq driven -S.DEV.F.EVENT .EQ %00001000 Device is event driven -S.DEV.F.COUT .EQ %00000100 Device supports Char OUT -S.DEV.F.BLOCK .EQ %00000010 -S.DEV.F.CHAR .EQ %00000001 -S.DEV.NAME .EQ 6 5 Bytes : LEN+NUL KBD CON COMx LPTx ETHx -* -S.DEV .EQ 16 +*DEVMGR.GFX.SETPIXEL .EQ 14 +*DEVMGR.GFX.GETPIXEL .EQ 16 +*DEVMGR.GFX.HLINE .EQ 18 +*DEVMGR.GFX.VLINE .EQ 20 +*DEVMGR.GFX.BITBLT .EQ 22 *-------------------------------------- * DEVMGR (new API) = Smartport *-------------------------------------- -* JMP : -* DEVID : +* JMP : (A=Device) +* DRV : AUXLC entry point +* BLK : ROM Entry point Cn($Cnff) +* PRT : ROM Entry point Cn($Cnff)+3 +* ID : * 00->0F : NUL,SYS & loadable drivers -* X0 : X=Slot : Controller -* XY : X=Slot, Y=Device (<$80) -* > $80 : IDs for PIPE,SOCK.... +* X0 : X=Slot (Controller board) +* XY : X=Slot, Y=Device +* NAME: +* *-------------------------------------- -*S.DEV.JMP .EQ 0 -*S.DEV.DEVID .EQ 2 -*S.DEV.F .EQ 3 -*S.DEV.F.BLOCK .EQ %10000000 -*S.DEV.F.WRITE .EQ %01000000 -*S.DEV.F.READ .EQ %00100000 -*S.DEV.F.ONLINE .EQ %00010000 -*S.DEV.F.NOFMT .EQ %00001000 -*S.DEV.F.WENABL .EQ %00000100 -*S.DEV.F.IRQ .EQ %00000010 -*S.DEV.F.OPENED .EQ %00000001 - -*S.DEV.NAME .EQ 4 -*S.DEV .EQ 8 +S.DEV.JMP .EQ 0 +S.DEV.S .EQ 2 +S.DEV.S.BLOCK .EQ %10000000 +S.DEV.S.WRITE .EQ %01000000 +S.DEV.S.READ .EQ %00100000 +S.DEV.S.ONLINE .EQ %00010000 +S.DEV.S.NOFMT .EQ %00001000 +S.DEV.S.WENABL .EQ %00000100 +S.DEV.S.IRQ .EQ %00000010 +S.DEV.S.OPENED .EQ %00000001 +S.DEV.F .EQ 3 +S.DEV.F.IRQ .EQ %10000000 Device is irq driven +S.DEV.F.EVENT .EQ %01000000 Device is event driven +S.DEV.F.LEN .EQ %00000111 Len +S.DEV.NAME .EQ 4 4 MAX +* +S.DEV .EQ 8 +*----------- Smartport ---------------- +DEVMGR.STATUS .EQ 0 +DEVMGR.READBLOCK .EQ 2 +DEVMGR.WRITEBLOCK .EQ 4 +DEVMGR.FORMAT .EQ 6 +DEVMGR.CONTROL .EQ 8 +DEVMGR.INIT .EQ 10 +DEVMGR.OPEN .EQ 12 +DEVMGR.CLOSE .EQ 14 +DEVMGR.READ .EQ 16 +DEVMGR.WRITE .EQ 18 *-------------------------------------- -*DEVMGR..STATUS .EQ 0 -*DEVMGR..READBLOCK .EQ 1 -*DEVMGR..WRITEBLOCK .EQ 2 -*DEVMGR..FORMAT .EQ 3 -*DEVMGR..CONTROL .EQ 4 -*DEVMGR..INIT .EQ 5 -*DEVMGR..OPEN .EQ 6 -*DEVMGR..CLOSE .EQ 7 -*DEVMGR..READ .EQ 8 -*DEVMGR..WRITE .EQ 9 -*-------------------------------------- -*S.DEVSTAT.F .EQ 0 same as S.DEV.F.* bitmasks -*S.DEVSTAT.SIZE .EQ 1 3 bytes -*S.DEVSTAT.IDSTRING .EQ 4 1 (LEN) + 16 MAX -*S.DEVSTAT.TYPE .EQ 21 -*S.DEVSTAT.SUBTYPE .EQ 22 -*S.DEVSTAT.VERSION .EQ 23 -*-------------------------------------- - +S.DEVSTAT.S .EQ 0 +S.DEVSTAT.S.BLOCK .EQ %10000000 +S.DEVSTAT.S.WRITE .EQ %01000000 +S.DEVSTAT.S.READ .EQ %00100000 +S.DEVSTAT.S.ONLINE .EQ %00010000 +S.DEVSTAT.S.NOFMT .EQ %00001000 +S.DEVSTAT.S.WENABL .EQ %00000100 +S.DEVSTAT.S.IRQ .EQ %00000010 +S.DEVSTAT.S.OPENED .EQ %00000001 +S.DEVSTAT.SIZE .EQ 1 3 bytes +S.DEVSTAT.IDSTRING .EQ 4 1 (LEN) + 16 MAX +S.DEVSTAT.TYPE .EQ 21 +* $00: Memory Expansion Card (RAM disk) +* $01: 3.5" disk +* $02: ProFile-type hard disk +* $03: Generic SCSI +* $04: ROM disk +* $05: SCSI CD-ROM +* $06: SCSI tape or other SCSI sequential device +* $07: SCSI hard disk +* $08: Reserved +* $09: SCSI printer +* $0A: 5-1/4" disk +* $0B: Reserved +* $0C: Reserved +* $0D: Printer +* $0E: Clock +* $0F: Modem +S.DEVSTAT.SUBTYPE .EQ 22 +S.DEVSTAT.SUBTYPE.EXT .EQ $80 +S.DEVSTAT.SUBTYPE.DSKSW .EQ $40 +S.DEVSTAT.SUBTYPE.NOREM .EQ $20 +S.DEVSTAT.VERSION .EQ 23 +S.DEVSTAT .EQ 25 *-------------------------------------- * PS STRUCT *-------------------------------------- @@ -430,21 +464,18 @@ S.PS.F.HOLD .EQ %00100000 S.PS.F.SLEEP .EQ %00010000 S.PS.F.EVENT .EQ %00001000 S.PS.F.ENV .EQ %00000100 -S.PS.PID .EQ 1 -S.PS.PPID .EQ 2 -S.PS.hCS .EQ 3 -S.PS.hDS .EQ 4 -S.PS.hPREFIX .EQ 5 -S.PS.hENV .EQ 6 -S.PS.hCMDLINE .EQ 7 -S.PS.UID .EQ 8 -S.PS.hINDEV .EQ 9 -S.PS.hStdIn .EQ 9 -S.PS.hOUTDEV .EQ 10 -S.PS.hStdOut .EQ 10 -S.PS.hERRDEV .EQ 11 -S.PS.hStdErr .EQ 11 -S.PS.CPID .EQ 12 +S.PS.PPID .EQ 1 +S.PS.PID .EQ 2 +S.PS.CPID .EQ 3 +S.PS.hCS .EQ 4 +S.PS.hDS .EQ 5 +S.PS.hPREFIX .EQ 6 +S.PS.hENV .EQ 7 +S.PS.hCMDLINE .EQ 8 +S.PS.UID .EQ 9 +S.PS.hStdIn .EQ 10 +S.PS.hStdOut .EQ 11 +S.PS.hStdErr .EQ 12 S.PS.RC .EQ 13 S.PS.PC .EQ 14 * @@ -572,8 +603,9 @@ S.NODE.DIR.FC .EQ 6 word S.NODE.DIR .EQ 8 *-------------------------------------- S.NODE.DEV.ID .EQ 2 +S.NODE.DEV.JMP .EQ 3 word * -S.NODE.DEV .EQ 3 +S.NODE.DEV .EQ 5 *-------------------------------------- * S.NODE.LNK *-------------------------------------- @@ -584,7 +616,7 @@ S.NODE.FIFO.hMem .EQ 3 S.NODE.FIFO.Tail .EQ 4 S.NODE.FIFO.Head .EQ 5 * -S.NODE.FIFO .EQ 5 +S.NODE.FIFO .EQ 6 *-------------------------------------- MAN SAVE /A2OSX.DEV/INC/A2OSX.I diff --git a/INC/APPLESOFT.I.txt b/INC/APPLESOFT.I.txt index 29270ff9..ab5cdaba 100644 --- a/INC/APPLESOFT.I.txt +++ b/INC/APPLESOFT.I.txt @@ -11,11 +11,13 @@ AUTO 6 SIGNFLG .EQ $16 FLAGS SIGN IN TAN INDEX .EQ $5E Ptr Used by Math routines RESULT .EQ $62 -> $66, RESULT OF LAST * OR / +EXPSGN .EQ $9C FAC .EQ $9D -> $A1 (5 bytes) FAC.SIGN .EQ $A2 ARG .EQ $A5 -> $A9 (5 bytes) ARG.SIGN .EQ $AA SGNCPR .EQ $AB FLAGS OPP SIGN IN FP ROUT +FAC.EXTENSION .EQ $AC FAC EXTENSION BYTE CHRGET .EQ $B1 -> $C8 CHRGOT .EQ $B7 TXTPTR .EQ $B8 diff --git a/INC/IO.I.txt b/INC/IO.I.txt index b0a94ee1..0d5e5503 100644 --- a/INC/IO.I.txt +++ b/INC/IO.I.txt @@ -14,12 +14,12 @@ CLRREADAUX .EQ $C002 W SETREADAUX .EQ $C003 W CLRWRITEAUX .EQ $C004 W SETWRITEAUX .EQ $C005 W -CLRCXROM .EQ $C006 W -SETCXROM .EQ $C007 W +*CLRCXROM .EQ $C006 W +*SETCXROM .EQ $C007 W CLRALTZP .EQ $C008 W SETALTZP .EQ $C009 W -CLRC3ROM .EQ $C00A W -SETC3ROM .EQ $C00B W +*CLRC3ROM .EQ $C00A W +*SETC3ROM .EQ $C00B W CLR80DISP .EQ $C00C W SET80DISP .EQ $C00D W CLRALTCHAR .EQ $C00E W @@ -29,9 +29,9 @@ RDLCBNK2 .EQ $C011 R RDLCRAM .EQ $C012 R RDREADAUX .EQ $C013 R RDWRITEAUX .EQ $C014 R -RDCXROM .EQ $C015 R +*RDCXROM .EQ $C015 R RDALTZP .EQ $C016 R -RDC3ROM .EQ $C017 R +*RDC3ROM .EQ $C017 R RD80STORE .EQ $C018 R VBL .EQ $C019 R RDTEXT .EQ $C01A R @@ -40,9 +40,9 @@ RDPAGE2 .EQ $C01C R RDHIRES .EQ $C01D R RDALTCHAR .EQ $C01E R RD80DISP .EQ $C01F R -TAPEOUT .EQ $C020 W +*TAPEOUT .EQ $C020 W SPEAKER .EQ $C030 W, toggle speaker diaphragm -STROBE .EQ $C040 R, generate .5 uS low pulse @ Game pin 5 +*STROBE .EQ $C040 R, generate .5 uS low pulse @ Game pin 5 EMUBYTE .EQ $C04F WRR, Write once then Read EMUL, Read Version @@ -55,29 +55,29 @@ SETPAGE2 .EQ $C055 W CLRHIRES .EQ $C056 W SETHIRES .EQ $C057 W -SETAN0 .EQ $C058 W, Set annunciator-0 output to 0 -CLRAN0 .EQ $C059 W, Set annunciator-0 output to 1 -SETAN1 .EQ $C05A W, Set annunciator-1 output to 0 -CLRAN1 .EQ $C05B W, Set annunciator-1 output to 1 +*SETAN0 .EQ $C058 W, Set annunciator-0 output to 0 +*CLRAN0 .EQ $C059 W, Set annunciator-0 output to 1 +*SETAN1 .EQ $C05A W, Set annunciator-1 output to 0 +*CLRAN1 .EQ $C05B W, Set annunciator-1 output to 1 ENBVBLIIC .EQ $C05B W, Enable VBL switch (IIc) -SETAN2 .EQ $C05C W, Set annunciator-2 output to 0 -CLRAN2 .EQ $C05D W, Set annunciator-2 output to 1 -SETAN3 .EQ $C05E W, Set annunciator-3 output to 0 +*SETAN2 .EQ $C05C W, Set annunciator-2 output to 0 +*CLRAN2 .EQ $C05D W, Set annunciator-2 output to 1 +*SETAN3 .EQ $C05E W, Set annunciator-3 output to 0 SETDHIRES .EQ $C05E W, if IOUDIS Set, turn on double-hires -CLRAN3 .EQ $C05F W, Set annunciator-3 output to 1 +*CLRAN3 .EQ $C05F W, Set annunciator-3 output to 1 CLRDHIRES .EQ $C05F W, if IOUDIS Set, turn off double-hires -TAPEIN .EQ $C060 R +*TAPEIN .EQ $C060 R OPENAPPLE .EQ $C061 R SOLIDAPPLE .EQ $C062 R -PB2 .EQ $C063 R +*PB2 .EQ $C063 R -PADDLE0 .EQ $C064 R, bit 7 = status of pdl-0 timer -PADDLE1 .EQ $C065 R, bit 7 = status of pdl-1 timer -PADDLE2 .EQ $C066 R, bit 7 = status of pdl-2 timer -PADDLE3 .EQ $C067 R, bit 7 = status of pdl-3 timer -PDLTRIG .EQ $C070 W, trigger paddles +*PADDLE0 .EQ $C064 R, bit 7 = status of pdl-0 timer +*PADDLE1 .EQ $C065 R, bit 7 = status of pdl-1 timer +*PADDLE2 .EQ $C066 R, bit 7 = status of pdl-2 timer +*PADDLE3 .EQ $C067 R, bit 7 = status of pdl-3 timer +*PDLTRIG .EQ $C070 W, trigger paddles SETIOUDIS .EQ $C07E W, enable DHIRES & disable $C058-5F RDIOUDIS .EQ $C07E R, bit 7 = IOUDIS status @@ -92,6 +92,6 @@ RROMWRAMBNK1 .EQ $C089 RR RROMBNK1 .EQ $C08A R RRAMWRAMBNK1 .EQ $C08B RR *-------------------------------------- -CLRC8ROM .EQ $CFFF R, Release C800-CFFF Rom Space for all cards +*CLRC8ROM .EQ $CFFF R, Release C800-CFFF Rom Space for all cards MAN SAVE /A2OSX.DEV/INC/IO.I diff --git a/INC/MACROS.I.txt b/INC/MACROS.I.txt index e84a18e3..d1ae3312 100644 --- a/INC/MACROS.I.txt +++ b/INC/MACROS.I.txt @@ -47,7 +47,7 @@ AUTO 6 .DO ]1=MLIDESTROY lda #1 .FIN - .DO ]1=MLIRENAME + .DO ]1=MLIRename lda #2 .FIN .DO ]1=MLISETFILEINFO diff --git a/INC/MONITOR.I.txt b/INC/MONITOR.I.txt index 0bc143d0..93a0b5bd 100644 --- a/INC/MONITOR.I.txt +++ b/INC/MONITOR.I.txt @@ -10,8 +10,8 @@ AUTO 1000 BRKVECT .EQ $3F0 POWERUP .EQ $3F2 POWERUPBYTE .EQ $3F4 -USRJMP .EQ $3F8 jmp $xxxx -NMIJMP .EQ $3FB jmp $xxxx +*USRJMP .EQ $3F8 jmp $xxxx +*NMIJMP .EQ $3FB jmp $xxxx IRQVECT .EQ $3FE *-------------------------------------- COL80FIRM .EQ $C300 diff --git a/INC/PRODOS.I.txt b/INC/PRODOS.I.txt index a8a0e8f1..ebea88c0 100644 --- a/INC/PRODOS.I.txt +++ b/INC/PRODOS.I.txt @@ -20,7 +20,7 @@ MLIWRITEBLOCK .EQ $81 MLIGETTIME .EQ $82 MLICREATE .EQ $C0 MLIDESTROY .EQ $C1 -MLIRENAME .EQ $C2 +MLIRename .EQ $C2 MLISETFILEINFO .EQ $C3 MLIGETFILEINFO .EQ $C4 MLIONLINE .EQ $C5 @@ -71,6 +71,7 @@ S.FILEINFO .EQ $12 *$28 - No Device Connected *$2B - Write Protected *$2E - Disk Switched +*$2F - Device Offline *$40 - Invalid Pathname *$42 - Maximum Number of Files Open *$43 - Invalid Reference Number @@ -94,8 +95,8 @@ S.FILEINFO .EQ $12 *$5A - File Structure Damaged *-------------------------------------- MLI.ERR.BADCALL .EQ $01 -MLI.ERR.BADCNT .EQ $04 -MLI.ERR.IRQFULL .EQ $25 +*MLI.ERR.BADCNT .EQ $04 +*MLI.ERR.IRQFULL .EQ $25 MLI.ERR.IO .EQ $27 MLI.ERR.NODEV .EQ $28 MLI.ERR.WRTPROT .EQ $2B @@ -152,15 +153,15 @@ TIMELO .EQ $BF92 *SPARE1 .EQ $BF96 MACHID .EQ $BF98 MACHID.TYPE .EQ %11001000 -MACHID.TYPE.II .EQ %00000000 -MACHID.TYPE.IIp .EQ %01000000 +*MACHID.TYPE.II .EQ %00000000 +*MACHID.TYPE.IIp .EQ %01000000 MACHID.TYPE.IIe .EQ %10000000 MACHID.TYPE.IIc .EQ %10001000 -MACHID.TYPE.III .EQ %11000000 +*MACHID.TYPE.III .EQ %11000000 MACHID.RAM .EQ %00110000 MACHID.RAM.128 .EQ %00110000 -MACHID.RAM.64 .EQ %00100000 -MACHID.RAM.48 .EQ %00010000 +*MACHID.RAM.64 .EQ %00100000 +*MACHID.RAM.48 .EQ %00010000 *MACHID.SPARE .EQ %00000100 MACHID.COL80 .EQ %00000010 MACHID.CLK .EQ %00000001 @@ -176,10 +177,10 @@ MACHID.CLK .EQ %00000001 *BNKBYT1 .EQ $BFF4 *BNKBYT2 .EQ $BFF5 *SYS.RTS .EQ $BFF6 code -> $BFFB -IBAKVER .EQ $BFFC -IVERSION .EQ $BFFD -KBAKVER .EQ $BFFE -KVERSION .EQ $BFFF +*IBAKVER .EQ $BFFC +*IVERSION .EQ $BFFD +*KBAKVER .EQ $BFFE +*KVERSION .EQ $BFFF *-------------------------------------- MAN SAVE /A2OSX.DEV/INC/PRODOS.I diff --git a/INC/ZP.I.txt b/INC/ZP.I.txt index 0df1ae6f..5ae53226 100644 --- a/INC/ZP.I.txt +++ b/INC/ZP.I.txt @@ -28,15 +28,5 @@ KSWH .EQ $39 INPUT CHARACTER HOOK HIGH RNDL .EQ $4E RANDOM NUMBER LOW RNDH .EQ $4F RANDOM NUMBER HIGH *-------------------------------------- -* Applesoft FP Registers -*-------------------------------------- -EXPSGN .EQ $9C -FAC .EQ $9D -> A1, MAIN FLT PT ACCUMULATOR -FAC.SIGN .EQ $A2 HOLDS UNPACKED SIGN -ARG .EQ $A5 -> A9, SECONDARY FP ACC -ARG.SIGN .EQ $AA -SGNCPR .EQ $AB FLAGS OPP SIGN IN FP ROUT. -FAC.EXTENSION .EQ $AC FAC EXTENSION BYTE -*-------------------------------------- MAN SAVE /A2OSX.DEV/INC/ZP.I diff --git a/SBIN/DHCPCLNT.S.txt b/SBIN/DHCPCLNT.S.txt index 3ebd8f8f..47991b99 100644 --- a/SBIN/DHCPCLNT.S.txt +++ b/SBIN/DHCPCLNT.S.txt @@ -236,7 +236,7 @@ CS.DOEVENT lda (pEvent) ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn cmp (pPs),y bne .9 diff --git a/SBIN/GETTY.S.txt b/SBIN/GETTY.S.txt index 05165747..80605df2 100644 --- a/SBIN/GETTY.S.txt +++ b/SBIN/GETTY.S.txt @@ -47,51 +47,37 @@ CS.INIT >SYSCALL GetArgC .1 lda #1 >SYSCALL GetArgA - >SYSCALL GetDevByNameYA - bcs .98 + + >SYSCALL MkNodYA + bcs .9 - >STYA pDev - txa - ldy #S.PS.hINDEV + ldy #S.PS.hStdIn sta (pPs),y - ldy #S.PS.hOUTDEV + ldy #S.PS.hStdOut sta (pPs),y - ldy #S.PS.hERRDEV + ldy #S.PS.hStdErr sta (pPs),y - ldx #DEVMGR.OPEN - jsr pDevJmp - bcs .99 - lda #2 >SYSCALL GetArgA - bcs .99 + bcs .9 >SYSCALL ExpandPStrYA - bcs .99 + bcs .9 txa ldy #hBinName sta (pData),y clc - rts - -.98 sec -.99 rts +.9 rts *-------------------------------------- CS.RUN lda #13 try send a CR... - >SYSCALL COutA Device Is Ready ? + >SYSCALL PutCA Device Is Ready ? bcs .8 no..loop... - lda pDev - clc - adc #S.DEV.NAME - tay - lda pDev+1 - adc /S.DEV.NAME >PUSHYA >LDYA L.MSG.GREETINGS >SYSCALL CPrintFYA @@ -123,7 +109,7 @@ CS.QUIT ldy #hBinName *-------------------------------------- CS.END MSG.USAGE >CSTR "GETTY " -MSG.GREETINGS >CSTR "\e[12h\nA2osX-GeTTY on Dev=%S\n" +MSG.GREETINGS >CSTR "\e[12h\nA2osX-GeTTY\n" *-------------------------------------- .DUMMY .OR 0 diff --git a/SBIN/LOGIN.S.txt b/SBIN/LOGIN.S.txt index 7c1daf94..af97a6ff 100644 --- a/SBIN/LOGIN.S.txt +++ b/SBIN/LOGIN.S.txt @@ -58,6 +58,9 @@ CS.RUN lda #0 jsr INPUT.RESET .1 >SYSCALL Sleep + >SYSCALL GetC + bcs .1 no char + jsr INPUT.CHARIN jsr INPUT.LINEIN bcc .1 @@ -69,11 +72,14 @@ CS.RUN lda #0 jsr INPUT.RESET .2 >SYSCALL Sleep + >SYSCALL GetC + bcs .2 no char + jsr INPUT.CHARIN jsr INPUT.LINEIN bcc .2 lda #13 - >SYSCALL COutA + >SYSCALL PutCA bcs .9 >LDYA L.SHELL @@ -94,27 +100,8 @@ CS.RUN lda #0 .8 clc .9 rts *-------------------------------------- -CS.DOEVENT ldy #S.EVT.hDEV - lda (pEvent),y - ldy #S.PS.hINDEV - cmp (pPs),y - bne .99 - - lda (pEvent) - and #S.EVT.F.KEY - beq .99 - - ldy #S.EVT.DATAHI - lda (pEvent),y - bne .99 - - ldy #S.EVT.DATALO - lda (pEvent),y - jsr INPUT.CHARIN - clc - rts - -.99 sec +CS.DOEVENT + sec rts *-------------------------------------- CS.QUIT clc @@ -131,7 +118,7 @@ INPUT.RESET ldy #INPUT.PassChar sta (pData),y rts *-------------------------------------- -INPUT.CHARIN tax saver char... +INPUT.CHARIN tax save char... ldy #INPUT.Status lda (pData),y bmi .9 @@ -163,7 +150,7 @@ INPUT.CHARIN tax saver char... lda (pData),y bne .1 txa -.1 >SYSCALL COutA +.1 >SYSCALL PutCA rts .2 cpx #13 CR diff --git a/SBIN/SHELL.S.CMD.txt b/SBIN/SHELL.S.CMD.txt index 2304c552..c4df4365 100644 --- a/SBIN/SHELL.S.CMD.txt +++ b/SBIN/SHELL.S.CMD.txt @@ -197,7 +197,7 @@ Cmd.Exec.PWD ldy #S.PS.hPREFIX >SYSCALL PPrintFYA bcs .9 lda #13 - >SYSCALL COutA + >SYSCALL PutCA .9 rts Cmd.Exec.CD1 stz UsrBuf256 @@ -424,7 +424,7 @@ Cmd.Exec.TIME clc >SYSCALL PPrintFYA bcs .9 lda #13 - >SYSCALL COutA + >SYSCALL PutCA .9 rts *-------------------------------------- Cmd.Exec.ECHO lda ARGS @@ -435,7 +435,7 @@ Cmd.Exec.ECHO lda ARGS bcs .9 .1 lda #13 - >SYSCALL COutA + >SYSCALL PutCA .9 rts *-------------------------------------- diff --git a/SBIN/SHELL.S.TXT.txt b/SBIN/SHELL.S.TXT.txt index f119f869..e07414a5 100644 --- a/SBIN/SHELL.S.TXT.txt +++ b/SBIN/SHELL.S.TXT.txt @@ -8,11 +8,11 @@ AUTO 6 TXT.OpenFileYA pha >PUSHWI 0 Aux type >PUSHBI 4 S.FILEINFO.TYPE.TXT - >PUSHBI SYS.FOPEN.R+SYS.FOPEN.T + >PUSHBI SYS.FOpen.R+SYS.FOpen.T pla >PUSHYA - >SYSCALL FOPEN + >SYSCALL FOpen bcs .9 ldy #hInputFile @@ -24,7 +24,7 @@ TXT.ReadFile >PUSHWI UsrBuf256+1 ldy #hInputFile lda (pData),y >PUSHA - >SYSCALL FREAD + >SYSCALL FRead bcs .9 tya diff --git a/SBIN/SHELL.S.txt b/SBIN/SHELL.S.txt index 582826c0..846e53bd 100644 --- a/SBIN/SHELL.S.txt +++ b/SBIN/SHELL.S.txt @@ -88,9 +88,6 @@ CS.INIT.INTERACTIVE jsr HIS.Init bcs .9 - ldy #S.PS.hINDEV - lda (pPs),y - >PUSHA >LDYA L.MSG.GREETINGS >SYSCALL CPrintFYA @@ -124,9 +121,14 @@ CS.RUN lda #0 bcs .99 .1 >SYSCALL Sleep + >SYSCALL GetC + bcs .1 no char + + jsr CS.CHARIN + lda (pData) bpl .1 - + and #$7F sta (pData) bra .3 @@ -170,37 +172,11 @@ CS.RUN lda #0 .99 sec rts *-------------------------------------- -CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? - lda (pEvent),y - ldy #S.PS.hINDEV - cmp (pPs),y - bne .9 - - lda (pEvent) - and #S.EVT.F.KEY is it a KEY event? - beq .9 - - ldy #S.EVT.DATAHI is it an O or SAPPLE key ? - lda (pEvent),y - bne .9 - - ldy #S.EVT.DATALO - lda (pEvent),y - tax - - ldy #bPause - lda (pData),y - bpl .11 - - lda #0 - sta (pData),y - clc +CS.DOEVENT sec rts - -.9 sec - rts - -.11 ldy #hInputFile Batch mode ? +*-------------------------------------- +CS.CHARIN tax + ldy #hInputFile Batch mode ? lda (pData),y beq .10 * Batch Mode @@ -248,7 +224,7 @@ CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? .13 cpx #$20 bcs .1 - jsr CS.EVENT.CTRL.CHAR + jsr CS.CHARIN.CTRL bra .8 .1 cpx #$7f @@ -268,16 +244,15 @@ CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? txa sta (pData),y - >SYSCALL COutA + >SYSCALL PutCA .8 clc rts *-------------------------------------- -CS.EVENT.CTRL.CHAR - cpx #13 CR +CS.CHARIN.CTRL cpx #13 CR bne .10 txa - >SYSCALL COutA + >SYSCALL PutCA lda (pData) CmdBuffer ora #$80 sta (pData) @@ -418,7 +393,7 @@ CmdBuffer.Normalize.Next CmdBuffer.PRINT ldy #0 .1 iny lda (pData),y - >SYSCALL COutA + >SYSCALL PutCA tya cmp (pData) bne .1 @@ -431,7 +406,7 @@ CmdBuffer.CLR jsr CmdBuffer.DEL CmdBuffer.DEL lda (pData) beq .9 lda #8 - >SYSCALL COutA + >SYSCALL PutCA lda (pData) dec sta (pData) @@ -459,7 +434,7 @@ CMDS >PSTR "CD" >PSTR "TIME" .HS 00 *-------------------------------------- -MSG.GREETINGS >CSTR "\nA2osX-Shell on Dev=%h\n\n" +MSG.GREETINGS >CSTR "\nA2osX-Shell\n\n" MSG.PROMPT >CSTR "%S$ " MSG.ECHO >CSTR ">%S\n" MSG.ERROR >CSTR "%S ($%h)\n" diff --git a/SBIN/TCPIP.S.CFG.txt b/SBIN/TCPIP.S.CFG.txt index 845ea47e..0b29f7f6 100644 --- a/SBIN/TCPIP.S.CFG.txt +++ b/SBIN/TCPIP.S.CFG.txt @@ -56,7 +56,7 @@ CFG.Read.HOSTNAME >PUSHWI 0 Aux type >PUSHBI 4 S.FILEINFO.TYPE.TXT - >PUSHBI SYS.FOPEN.R + >PUSHBI SYS.FOpen.R pla >PUSHYA >SYSCALL LoadFile @@ -111,7 +111,7 @@ CFG.Read.TCPIP.CONF >PUSHWI 0 Aux type >PUSHBI 4 S.FILEINFO.TYPE.TXT - >PUSHBI SYS.FOPEN.R + >PUSHBI SYS.FOpen.R pla >PUSHYA >SYSCALL LoadFile @@ -179,7 +179,7 @@ CFG.Read.TCPIP.CONF *-------------------------------------- CFG.Read.HOSTS >PUSHWI 0 Aux type >PUSHBI 4 S.FILEINFO.TYPE.TXT - >PUSHBI SYS.FOPEN.R + >PUSHBI SYS.FOpen.R >PUSHW L.HOSTS >SYSCALL LoadFile bcs .99 diff --git a/SYS/KERNEL.S.ARG.txt b/SYS/KERNEL.S.ARG.txt index 6ddf5735..cbe8bca3 100644 --- a/SYS/KERNEL.S.ARG.txt +++ b/SYS/KERNEL.S.ARG.txt @@ -16,7 +16,7 @@ K.GetArgC jsr ARG.InitArgPtr1 ldx #0 -.1 lda (ZPQuickPtr1) +.1 lda (ZPPtr1) beq .8 jsr ARG.NextArgPtr1 @@ -42,7 +42,7 @@ K.GetArgA sta .2+1 ldx #0 -.1 lda (ZPQuickPtr1) +.1 lda (ZPPtr1) beq .9 .2 cpx #$ff Self Modified @@ -52,7 +52,7 @@ K.GetArgA sta .2+1 inx bra .1 -.8 >LDYA ZPQuickPtr1 +.8 >LDYA ZPPtr1 clc rts @@ -62,15 +62,15 @@ K.GetArgA sta .2+1 ARG.InitArgPtr1 ldy #S.PS.hCMDLINE lda (pPs),y jsr K.GetMemPtrA - >STYA ZPQuickPtr1 + >STYA ZPPtr1 rts *-------------------------------------- -ARG.NextArgPtr1 lda ZPQuickPtr1 +ARG.NextArgPtr1 lda ZPPtr1 sec - adc (ZPQuickPtr1) - sta ZPQuickPtr1 + adc (ZPPtr1) + sta ZPPtr1 bcc .8 - inc ZPQuickPtr1+1 + inc ZPPtr1+1 .8 rts *-------------------------------------- MAN diff --git a/SYS/KERNEL.S.BIN.txt b/SYS/KERNEL.S.BIN.txt index 25669cd4..4d8d9489 100644 --- a/SYS/KERNEL.S.BIN.txt +++ b/SYS/KERNEL.S.BIN.txt @@ -17,11 +17,11 @@ K.LoadEXEYA >STYA K.LoadEXEYA.Filename jsr MEM.GetMemByNameYA bcs K.LoadEXEYA.1 not already loaded - >STYA ZPQuickPtr1 Save base address + >STYA ZPPtr1 Save base address ldy #S.MEM.REFCNT - lda (ZPQuickPtr1),y + lda (ZPPtr1),y inc - sta (ZPQuickPtr1),y + sta (ZPPtr1),y txa jmp K.GetMemPtrA X=hMem from K.GetMemByNameA @@ -36,7 +36,7 @@ K.LoadEXEYA.1 >PUSHWI KrnBuf256 >PUSHYA Push AUXTYPE >PUSHBI 6 S.FILEINFO.TYPE.BIN - >PUSHBI SYS.FOPEN.R + >PUSHBI SYS.FOpen.R >PUSHW K.LoadEXEYA.Filename jsr K.LoadFile @@ -56,26 +56,26 @@ K.LoadEXEYA.1 >PUSHWI KrnBuf256 txa jsr K.GetMemPtrA - >STYA ZPQuickPtr1 set ZPQuickPtr1 -> Code start + >STYA ZPPtr1 set ZPPtr1 -> Code start pha YA = actual load address tya sec sbc BIN.Relocate.Start - sta BIN.Relocate.Offset Offset=ZPQuickPtr1-AUXTYPE + sta BIN.Relocate.Offset Offset=ZPPtr1-AUXTYPE pla sbc BIN.Relocate.Start+1 sta BIN.Relocate.Offset+1 ldy #H.BIN.CODE.LEN get Code Len - lda (ZPQuickPtr1),y + lda (ZPPtr1),y clc - adc ZPQuickPtr1 - sta ZPQuickPtr2 Make ZPQuickPtr2 = ZPQuickPtr1 + CodeLen + adc ZPPtr1 + sta ZPPtr2 Make ZPPtr2 = ZPPtr1 + CodeLen iny - lda (ZPQuickPtr1),y - adc ZPQuickPtr1+1 - sta ZPQuickPtr2+1 + lda (ZPPtr1),y + adc ZPPtr1+1 + sta ZPPtr2+1 jsr BIN.RelocateEXE @@ -85,15 +85,15 @@ K.LoadEXEYA.1 >PUSHWI KrnBuf256 lda K.LoadEXEYA.hMem Keep X=hMem jsr K.GetMemByIDA X unmodified - >STYA ZPQuickPtr1 + >STYA ZPPtr1 - lda (ZPQuickPtr1) + lda (ZPPtr1) ora #S.MEM.F.CODE This is a code segment - sta (ZPQuickPtr1) + sta (ZPPtr1) txa Get Back hMem ldy #S.MEM.BIN - sta (ZPQuickPtr1),y + sta (ZPPtr1),y lda K.LoadEXEYA.hMem tax return hMEM to Caller... @@ -164,8 +164,7 @@ BIN.InstallDRV ldy #H.BIN.DRV.CODE.O sbc /DevMgr.HiMem bcs .9 No More Room to load Driver.... - lda DevMgr.LastDevID - inc + lda DevMgr.Count cmp #K.DEV.MAX bne .10 No Device Handle Left @@ -177,53 +176,48 @@ BIN.InstallDRV ldy #H.BIN.DRV.CODE.O sec rts -.10 sta DevMgr.LastDevID - +.10 inc DevMgr.Count >SYSCALL GetDevByIDA - >STYA ZPQuickPtr2 setup Ptr2 to dest HEADER + >STYA ZPPtr2 setup Ptr2 to dest HEADER ldy #H.BIN.DRV.HEADER.O lda (pDrv),y clc adc pDrv - sta ZPQuickPtr1 + sta ZPPtr1 iny lda (pDrv),y adc pDrv+1 - sta ZPQuickPtr1+1 set Ptr1 to Src HEADER + sta ZPPtr1+1 set Ptr1 to Src HEADER ldy #S.DEV-1 -.1 lda (ZPQuickPtr1),y copy header to DevMgr.Table - sta (ZPQuickPtr2),y +.1 lda (ZPPtr1),y copy header to DevMgr.Table + sta (ZPPtr2),y dey bpl .1 - ldy #S.DEV.ID - lda DevMgr.LastDevID - sta (ZPQuickPtr2),y - - dey #S.DEV.JMP+1 Setup Main JMP + ldy #S.DEV.JMP+1 Setup Main JMP lda DevMgr.Free+1 - sta (ZPQuickPtr2),y + sta (ZPPtr2),y tax - dey #S.DEV.JMP + dey #S.DEV.JMP lda DevMgr.Free - sta (ZPQuickPtr2),y + sta (ZPPtr2),y - sta ZPQuickPtr2 set Ptr2 to Dest CODE - stx ZPQuickPtr2+1 + sta ZPPtr2 set Ptr2 to Dest CODE + stx ZPPtr2+1 ldy #H.BIN.DRV.CODE.O lda (pDrv),y clc adc pDrv - sta ZPQuickPtr1 + sta ZPPtr1 iny lda (pDrv),y adc pDrv+1 - sta ZPQuickPtr1+1 set Ptr1 to Src CODE + sta ZPPtr1+1 set Ptr1 to Src CODE lda BIN.InstallDRV.DrvLen+1 eor #$ff @@ -241,31 +235,32 @@ BIN.InstallDRV ldy #H.BIN.DRV.CODE.O beq .4 pha -.3 lda (ZPQuickPtr1),y - sta (ZPQuickPtr2),y +.3 lda (ZPPtr1),y + sta (ZPPtr2),y iny bne .2 - inc ZPQuickPtr1+1 - inc ZPQuickPtr2+1 + inc ZPPtr1+1 + inc ZPPtr2+1 bra .2 .4 ldy #H.BIN.DRV.CODE.LEN lda DevMgr.Free Make Ptr1 = code start - sta ZPQuickPtr1 + sta ZPPtr1 clc adc (pDrv),y - sta ZPQuickPtr2 + sta ZPPtr2 iny lda DevMgr.Free+1 - sta ZPQuickPtr1+1 + sta ZPPtr1+1 adc (pDrv),y - sta ZPQuickPtr2+1 Make ZPQuickPtr2 = ZPQuickPtr1 + CodeLen + sta ZPPtr2+1 Make ZPPtr2 = ZPPtr1 + CodeLen jsr BIN.RelocateDRV >LDYA BIN.InstallDRV.DrvEnd >STYA DevMgr.Free + clc rts *-------------------------------------- @@ -274,15 +269,15 @@ BIN.InstallDRV.DrvEnd .BS 2 *-------------------------------------- * BIN.Relocate___ : * In : -* ZPQuickPtr1 = Ptr to Code -* ZPQuickPtr2 = End Of Code +* ZPPtr1 = Ptr to Code +* ZPPtr2 = End Of Code *-------------------------------------- BIN.Relocate.Start .BS 2 BIN.Relocate.End .BS 2 BIN.Relocate.Offset .BS 2 *-------------------------------------- BIN.RelocateEXE ldy #H.BIN.HEADER+1 - lda (ZPQuickPtr1),y + lda (ZPPtr1),y cmp /H.BIN.HEADER.BIN65 beq .1 cmp /H.BIN.HEADER.DRV65 @@ -293,15 +288,15 @@ BIN.RelocateEXE ldy #H.BIN.HEADER+1 rts .1 ldy #H.BIN.JMP relocate Main JMP - lda (ZPQuickPtr1),y + lda (ZPPtr1),y clc adc BIN.Relocate.Offset - sta (ZPQuickPtr1),y + sta (ZPPtr1),y iny - lda (ZPQuickPtr1),y + lda (ZPPtr1),y adc BIN.Relocate.Offset+1 - sta (ZPQuickPtr1),y + sta (ZPPtr1),y ldy #H.BIN.EXE.REL.TABLE skip Header, CS.SIZE & DS.SIZE... (16 bytes) @@ -309,22 +304,22 @@ BIN.RelocateEXE ldy #H.BIN.HEADER+1 *-------------------------------------- BIN.RelocateDRV ldy #H.BIN.DRV.REL.TABLE -.1 lda (ZPQuickPtr1),y Start Relocate JMP table +.1 lda (ZPPtr1),y Start Relocate JMP table tax LO in X iny - ora (ZPQuickPtr1),y ORA with HI + ora (ZPPtr1),y ORA with HI beq .2 $0000 = end of table dey txa get back LO clc adc BIN.Relocate.Offset - sta (ZPQuickPtr1),y + sta (ZPPtr1),y iny - lda (ZPQuickPtr1),y + lda (ZPPtr1),y adc BIN.Relocate.Offset+1 - sta (ZPQuickPtr1),y + sta (ZPPtr1),y iny @@ -334,12 +329,12 @@ BIN.RelocateDRV ldy #H.BIN.DRV.REL.TABLE sec + 1 to skip last 00 from beq .2 - adc ZPQuickPtr1 - sta ZPQuickPtr1 + adc ZPPtr1 + sta ZPPtr1 bcc .3 - inc ZPQuickPtr1+1 ZPQuickPtr1=Current Code PTR + inc ZPPtr1+1 ZPPtr1=Current Code PTR -.3 lda (ZPQuickPtr1) get OPCODE +.3 lda (ZPPtr1) get OPCODE lsr /2 tax lda BIN.OPCODES,x get OPCODE definition @@ -357,19 +352,19 @@ BIN.RelocateDRV ldy #H.BIN.DRV.REL.TABLE pha ldy #1 - lda (ZPQuickPtr1),y Get LO + lda (ZPPtr1),y Get LO tax save LO in X iny make Y point to HI cpx BIN.Relocate.Start - lda (ZPQuickPtr1),y Get HI + lda (ZPPtr1),y Get HI sbc BIN.Relocate.Start+1 bcc .5 addr < BIN.Relocate.Start, out of range txa Get back LO cpx BIN.Relocate.End - lda (ZPQuickPtr1),y Get HI + lda (ZPPtr1),y Get HI sbc BIN.Relocate.End+1 bcs .5 addr > BIN.Relocate.End, out of range @@ -377,24 +372,24 @@ BIN.RelocateDRV ldy #H.BIN.DRV.REL.TABLE * clc CC from bcs .6 adc BIN.Relocate.Offset add Offset to abs address dey - sta (ZPQuickPtr1),y store relocated addr LO + sta (ZPPtr1),y store relocated addr LO iny - lda (ZPQuickPtr1),y Get HI + lda (ZPPtr1),y Get HI adc BIN.Relocate.Offset+1 - sta (ZPQuickPtr1),y store relocated addr HI + sta (ZPPtr1),y store relocated addr HI .5 pla get back Opcode length... .6 clc A = OPCODE length - adc ZPQuickPtr1 - sta ZPQuickPtr1 + adc ZPPtr1 + sta ZPPtr1 bcc .7 - inc ZPQuickPtr1+1 + inc ZPPtr1+1 -.7 eor ZPQuickPtr2 A = ZPQuickPtr1 +.7 eor ZPPtr2 A = ZPPtr1 bne .3 - lda ZPQuickPtr1+1 - eor ZPQuickPtr2+1 + lda ZPPtr1+1 + eor ZPPtr2+1 bne .3 next opcode.... .8 rts diff --git a/SYS/KERNEL.S.CHR.txt b/SYS/KERNEL.S.CHR.txt new file mode 100644 index 00000000..038c5780 --- /dev/null +++ b/SYS/KERNEL.S.CHR.txt @@ -0,0 +1,203 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF +*/-------------------------------------- +* #FPutCAY +* Print A (char) to File +* ##In: +* A : char to print +* Y = hFILE +* ##Out: +* CC = success +*\-------------------------------------- +K.FPutCAY sta K.PutC.Char + sty K.PutC.Node + tya + phy + bne K.PutCA.1 +K.PutCA.8 ply + clc + rts +*/-------------------------------------- +* #PutCA +* Print A (char) to StdOut +* ##In: +* A : char to print +* ##Out: +* CC = success +*\-------------------------------------- +K.PutCA sta K.PutC.Char + phy + ldy #S.PS.hStdOut + lda (pPs),y + beq K.PutCA.8 NUL + + phx + +K.PutCA.1 sta K.PutC.Node + jsr K.GetMemPtrA + >STYA pDev + + ldy #S.NODE.T + lda (pDev),y + asl + tax + jsr K.PutCA.Jmp + + plx + ply + rts +*-------------------------------------- +K.PutCA.Jmp jmp (.1,x) +.1 .DA K.PutCA.REG + .DA K.CHR.IOERR DIR + .DA K.PutCA.CDEV + .DA K.CHR.IOERR BDEV + .DA K.CHR.IOERR LNK + .DA K.CHR.IOERR DSOCK + .DA K.PutCA.SSOCK + .DA K.PutCA.FIFO +*-------------------------------------- +K.PutCA.REG lda K.PutC.Node + ldy K.PutC.Char + jmp K.FWriteAY +*-------------------------------------- +K.PutCA.CDEV ldy #S.NODE.DEV.JMP + lda (pDev),y + sta .1+1 + iny + lda (pDev),y + sta .1+2 + lda K.PutC.Char + ldx #DEVMGR.WRITE +.1 jmp $ffff +*-------------------------------------- +K.PutCA.SSOCK sec + rts +*-------------------------------------- +K.PutCA.FIFO ldy #S.NODE.FIFO.S + lda (pDev),y + beq .9 Remote PS did not opened yet the pipe + cmp #S.NODE.FIFO.S.Closed + beq .99 Remote PS closed the Pipe + + ldy #S.NODE.FIFO.hMem + lda (pDev),y + jsr K.GetMemPtrA + >STYA .1+2 + + ldy #S.NODE.FIFO.Head + lda (pDev),y + inc + dey #S.NODE.FIFO.Tail + cmp (pDev),y + beq .9 FIFO is full + iny + sta (pDev),y + tay + lda K.PutC.Char +.1 sta $ffff,y + clc + rts + +.9 lda #MLI.ERR.VOLFULL + sec + rts + +.99 lda #MLI.ERR.EOF + sec + rts +*-------------------------------------- +K.PutC.Char .BS 1 +K.PutC.Node .BS 1 +*/-------------------------------------- +* #FGetCA +* Get char from File +* ##In: +* A = hFILE +* ##Out: +* CC = success +* A = char +*\-------------------------------------- +K.FGetCA +*/-------------------------------------- +* #GetC +* Get char from StdIn +* ##In: +* none. +* ##Out: +* CC = success +* A = char +*\-------------------------------------- +K.GetC ldy #S.PS.hStdIn + lda (pPs),y + + sta K.PutC.Node + jsr K.GetMemPtrA + >STYA pDev + + ldy #S.NODE.T + lda (pDev),y + asl + tax + jmp (.1,x) + +.1 .DA K.GetC.REG + .DA K.CHR.IOERR DIR + .DA K.GetC.CDEV + .DA K.CHR.IOERR BDEV + .DA K.CHR.IOERR LNK + .DA K.CHR.IOERR DSOCK + .DA K.GetC.SSOCK + .DA K.GetC.FIFO +*-------------------------------------- +K.GetC.REG +*-------------------------------------- +K.GetC.CDEV ldx #DEVMGR.READ + ldy #S.NODE.DEV.JMP + lda (pDev),y + sta .1+1 + iny + lda (pDev),y + sta .1+2 +.1 jmp $ffff +*-------------------------------------- +K.GetC.SSOCK +*-------------------------------------- +K.GetC.FIFO +*/-------------------------------------- +* #FPutS +* Print String to FILE +* ##In: +* PUSHW : CPtr +* PUSHB : hFILE +* ##Out: +* CC = success +*\-------------------------------------- +K.FPutS +*/-------------------------------------- +* #PutSYA +* Print String to StdOut +* ##In: +* Y,A : CPtr +* ##Out: +* CC = success +*\-------------------------------------- +K.PutSYA +*-------------------------------------- +K.FGetS +*-------------------------------------- +K.GetSYA + bra * +*-------------------------------------- +K.CHR.IOERR lda #MLI.ERR.IO + sec + rts +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.CHR +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.CIO.txt b/SYS/KERNEL.S.CIO.txt index 5212e6aa..e871b52e 100644 --- a/SYS/KERNEL.S.CIO.txt +++ b/SYS/KERNEL.S.CIO.txt @@ -18,23 +18,23 @@ K.SScanF jsr PullPtr1Ptr2Ptr3 ldy #0 Y = PTR in pattern - lda (ZPQuickPtr1) + lda (ZPPtr1) beq .9 tax X = COUNT to scan - inc ZPQuickPtr1 + inc ZPPtr1 bne .1 - inc ZPQuickPtr1+1 + inc ZPPtr1+1 .1 txa End Of String? beq .8 tya - cmp (ZPQuickPtr2) End of pattern? + cmp (ZPPtr2) End of pattern? beq .8 iny - lda (ZPQuickPtr2),y + lda (ZPPtr2),y cmp #'%' Escape? beq .2 - cmp (ZPQuickPtr1) Same char? + cmp (ZPPtr1) Same char? bne .9 jsr K.SScanF.IncPtr1 bne .1 @@ -42,16 +42,16 @@ K.SScanF jsr PullPtr1Ptr2Ptr3 rts .2 tya - cmp (ZPQuickPtr2) unexpected End of pattern after "%" ? + cmp (ZPPtr2) unexpected End of pattern after "%" ? beq .9 iny - lda (ZPQuickPtr2),y + lda (ZPPtr2),y cmp #'d' BYTE ? bne .3 stz ASCBUF -.20 lda (ZPQuickPtr1) +.20 lda (ZPPtr1) jsr K.SScanF.IsDigit bcs .21 phx @@ -64,10 +64,10 @@ K.SScanF jsr PullPtr1Ptr2Ptr3 .21 jsr DEC2HEX lda HEXBUF - sta (ZPQuickPtr3) - inc ZPQuickPtr3 + sta (ZPPtr3) + inc ZPPtr3 bne .1 - inc ZPQuickPtr3+1 + inc ZPPtr3+1 bra .1 .3 cmp #'D' WORD ? @@ -89,9 +89,9 @@ K.SScanF jsr PullPtr1Ptr2Ptr3 K.SScanF.IncPtr1 dex beq .1 - inc ZPQuickPtr1 + inc ZPPtr1 bne .1 - inc ZPQuickPtr1+1 never Zero + inc ZPPtr1+1 never Zero .1 rts *-------------------------------------- K.SScanF.IsDigit @@ -144,7 +144,7 @@ K.SScanF.IsDigit K.PPrintFYA ldx #$01 PSTR .HS 2C bit abs K.CPrintFYA ldx #$00 CSTR - >STYA ZPQuickPtr1 + >STYA ZPPtr1 stx CIO.GetCharAtPtr1Y+1 ldy #0 @@ -218,7 +218,7 @@ K.CPrintFYA ldx #$00 CSTR .13 lda PrintFTBL2.OUT,x -.20 jsr K.COutA +.20 jsr K.PutCA bcc .1 .99 rts *-------------------------------------- @@ -249,7 +249,7 @@ PrintF.A >PULLW HEXBUF lsr tax lda TYPES,x - jsr K.COutA + jsr K.PutCA bcs .9 ldx #0 @@ -259,7 +259,7 @@ PrintF.A >PULLW HEXBUF bcc .2 lda ACCESS,x -.2 jsr K.COutA +.2 jsr K.PutCA bcs .9 inx @@ -271,7 +271,7 @@ PrintF.A >PULLW HEXBUF bcc .4 lda ACCESS,x -.4 jmp K.COutA +.4 jmp K.PutCA .9 rts *-------------------------------------- @@ -290,7 +290,7 @@ PrintF.B.1 ldx #8 pha lda #'0' adc #0 add Carry - jsr K.COutA + jsr K.PutCA pla bcs PrintF.BB.RTS dex @@ -306,10 +306,10 @@ PrintF.DD.1 stz HEXBUF+2 stz HEXBUF+3 bra PrintF.U.1 -PrintF.U >PULLW ZPQuickPtr2 +PrintF.U >PULLW ZPPtr2 ldy #3 -.1 lda (ZPQuickPtr2),y +.1 lda (ZPPtr2),y sta HEXBUF,y dey bpl .1 @@ -318,10 +318,10 @@ PrintF.U.1 stz SIGN jsr HEX2DEC jmp PrintDEC *-------------------------------------- -PrintF.E >PULLW ZPQuickPtr2 +PrintF.E >PULLW ZPPtr2 rts *-------------------------------------- -PrintF.F >PULLW ZPQuickPtr2 +PrintF.F >PULLW ZPPtr2 rts *-------------------------------------- PrintF.HH >PULLA @@ -367,10 +367,10 @@ PrintF.II.1 stz HEXBUF+2 stz HEXBUF+3 bra PrintF.L.1 -PrintF.L >PULLW ZPQuickPtr2 +PrintF.L >PULLW ZPPtr2 ldy #3 -.1 lda (ZPQuickPtr2),y +.1 lda (ZPPtr2),y sta HEXBUF,y dey bpl .1 @@ -378,227 +378,6 @@ PrintF.L >PULLW ZPQuickPtr2 PrintF.L.1 ror SIGN jsr HEX2DEC - jmp PrintDEC -*-------------------------------------- -PrintF.N >PULLA -PrintF.N.1 and #$0F - bra PrintF.NN.2 - -PrintF.NN >PULLA -PrintF.NN.1 lsr - lsr - lsr - lsr - -PrintF.NN.2 ora #$30 - cmp #$3A - bcc .1 - adc #6 -.1 jmp K.COutA -*-------------------------------------- -* CStr -*-------------------------------------- -PrintF.S >PULLW ZPQuickPtr2 - - ldy #0 - -.1 lda (ZPQuickPtr2),y - beq .2 - - jsr K.COutA - bcs .9 - iny - lda PADLEN - - beq .1 - cpy PADLEN - bne .1 - rts - -.2 lda PADLEN - beq .8 - -.3 lda PADCHAR - jsr K.COutA - bcs .9 - iny - cpy PADLEN - bne .3 - -.8 clc -.9 rts -*-------------------------------------- -* PStr -*-------------------------------------- -PrintF.SS >PULLW ZPQuickPtr2 - - ldy #0 - lda (ZPQuickPtr2),y - tax - beq .8 - -.1 iny - lda (ZPQuickPtr2),y - jsr K.COutA - bcs .9 - lda PADLEN - - beq .2 - cpy PADLEN - beq .8 - -.2 dex - bne .1 - - lda PADLEN - beq .8 - -.3 lda PADCHAR - jsr K.COutA - bcs .9 - iny - cpy PADLEN - bne .3 - -.8 clc -.9 rts -*-------------------------------------- -CIO.GetCharAtPtr1Y - lda #$ff Self Modified PSTR/CSTR - bne .1 - - lda (ZPQuickPtr1),y CSTR - beq .9 - iny advance to next char... - bne .9 - inc ZPQuickPtr1+1 Allow >256 CStrings - rts - - -.1 tya PSTR - cmp (ZPQuickPtr1) - beq .9 - iny - lda (ZPQuickPtr1),y NZ - -.9 clc no error, but end of string - rts -*-------------------------------------- -K.COutA phx - phy - cmp #13 - bne .1 - ldx #DEVMGR.COUT - jsr pDevJmp - bcs .2 - lda #10 -.1 ldx #DEVMGR.COUT - jsr pDevJmp -.2 ply - plx - rts -*/-------------------------------------- -* #FPutCAY -* Print A (char) to File -* ##In: -* A : char to print -* Y = hFILE -* none. -* ##Out: -* CC = success -*\-------------------------------------- -K.FPutCAY sta K.PutC.Char - sty K.PutC.Node - tya - bne K.PutCA.1 -K.PutCA.8 clc - rts -*/-------------------------------------- -* #PutCA -* Print A (char) to StdOut -* ##In: -* A : char to print -* none. -* ##Out: -* CC = success -*\-------------------------------------- -K.PutCA sta K.PutC.Char - ldy #S.PS.hStdOut - lda (pPs),y - beq K.PutCA.8 NUL - -K.PutCA.1 sta K.PutC.Node - jsr K.GetMemPtrA - >STYA pNode - - ldy #S.NODE.T - lda (pNode),y - asl - tax - jmp (K.PutCA.Jmp,x) -*-------------------------------------- -K.PutCA.Jmp .DA K.PutCA.REG - .DA K.PutCA.IOERR DIR - .DA K.PutCA.CDEV - .DA K.PutCA.IOERR BDEV - .DA K.PutCA.IOERR LNK - .DA K.PutCA.IOERR DSOCK - .DA K.PutCA.SSOCK - .DA K.PutCA.FIFO -*-------------------------------------- -K.PutCA.REG lda K.PutC.Node - ldy K.PutC.Char - jmp K.FWriteAY -*-------------------------------------- -K.PutCA.CDEV -*-------------------------------------- -K.PutCA.SSOCK -*-------------------------------------- -K.PutCA.FIFO ldy #S.NODE.FIFO.S - lda (pNode),y - beq .9 Remote PS did not opened yet the pipe - cmp #S.NODE.FIFO.S.Closed - beq .99 Remote PS closed the Pipe - - ldy #S.NODE.FIFO.hMem - lda (pNode),y - jsr K.GetMemPtrA - >STYA .1+2 - - ldy #S.NODE.FIFO.Head - lda (pNode),y - inc - iny - cmp (pNode),y - beq .9 FIFO is full - dey - sta (pNode),y - tay - lda K.PutC.Char -.1 sta $ffff,y - clc - rts - -.9 lda #MLI.ERR.VOLFULL - sec - rts - -.99 lda #MLI.ERR.EOF - sec - rts -*-------------------------------------- -K.PutCA.IOERR lda #MLI.ERR.IO - sec - rts -*-------------------------------------- -K.PutC.Char .BS 1 -K.PutC.Node .BS 1 -*-------------------------------------- -K.FGetC -*-------------------------------------- -K.FPutSYA -*-------------------------------------- -K.FGetS *-------------------------------------- PRINTDEC lda PADLEN any Len format ? beq .1 no @@ -630,11 +409,11 @@ PRINTDEC lda PADLEN any Len format ? bpl .5 pha yes, save whatever we have to print.... lda #'-' - jsr K.COutA + jsr K.PutCA stz SIGN reset flag for next char... pla -.5 jsr K.COutA +.5 jsr K.PutCA bcs .9 .6 inx @@ -644,6 +423,89 @@ PRINTDEC lda PADLEN any Len format ? clc .9 rts *-------------------------------------- +PrintF.N >PULLA +PrintF.N.1 and #$0F + bra PrintF.NN.2 + +PrintF.NN >PULLA +PrintF.NN.1 lsr + lsr + lsr + lsr + +PrintF.NN.2 ora #$30 + cmp #$3A + bcc .1 + adc #6 +.1 jmp K.PutCA +*-------------------------------------- +PrintF.S ldy #$ff CSTR + .HS 2C bit abs +PrintF.SS ldy #$00 PSTR + + >PULLW ZPPtr2 + + lda (ZPPtr2) if CSTR:last char=0, if PSTR:len=0 + beq .8 + + sty .1+1 + +.1 lda #$ff Self Modified + bne .11 CSTR + + tya PSTR + cmp (ZPPtr2) len check + beq .2 + +.11 iny + + lda (ZPPtr2),y + beq .2 + + jsr K.PutCA + bcs .9 + + lda PADLEN + beq .1 + + cpy PADLEN + bne .1 + rts + +.2 lda PADLEN + beq .8 + +.3 lda PADCHAR + jsr K.PutCA + bcs .9 + iny + cpy PADLEN + bne .3 + +.8 clc +.9 rts +*-------------------------------------- +CIO.GetCharAtPtr1Y + lda #$ff Self Modified PSTR/CSTR + bne .1 + + lda (ZPPtr1),y CSTR + beq .9 + iny advance to next char... + bne .9 + inc ZPPtr1+1 Allow >256 CStrings + rts + + +.1 tya PSTR + cmp (ZPPtr1) + beq .9 + iny + lda (ZPPtr1),y NZ + +.9 clc no error, but end of string + rts +*-------------------------------------- TYPES .AS "-dbclssp" ACCESS .AS "rwxrwxrwx" SIGN .BS 1 diff --git a/SYS/KERNEL.S.CNV.txt b/SYS/KERNEL.S.CNV.txt index f10c0598..a31ada79 100644 --- a/SYS/KERNEL.S.CNV.txt +++ b/SYS/KERNEL.S.CNV.txt @@ -17,10 +17,7 @@ HEX2DEC ldx #4 ldx #32 let's roll 32 bits -.2 asl HEXBUF - rol HEXBUF+1 - rol HEXBUF+2 - rol HEXBUF+3 +.2 jsr HEXBUF.ROL ldy #4 @@ -75,19 +72,13 @@ DEC2HEX stz HEXBUF lda HEXBUF pha - asl HEXBUF HEXBUF * 2 -> HEXBUF - rol HEXBUF+1 - rol HEXBUF+2 - rol HEXBUF+3 + jsr HEXBUF.ROL HEXBUF * 2 -> HEXBUF * bcs .9 overflow!!! - asl HEXBUF HEXBUF * 4 -> HEXBUF - rol HEXBUF+1 - rol HEXBUF+2 - rol HEXBUF+3 + jsr HEXBUF.ROL HEXBUF * 4 -> HEXBUF * bcs .9 overflow!!! - pla HEXBUF * 4 + HEXBUF -> HEXBUF + pla HEXBUF * 4 + HEXBUF -> HEXBUF adc HEXBUF sta HEXBUF pla @@ -101,10 +92,7 @@ DEC2HEX stz HEXBUF sta HEXBUF+3 * bcs .99 overflow!!! - asl HEXBUF HEXBUF * 10 -> HEXBUF - rol HEXBUF+1 - rol HEXBUF+2 - rol HEXBUF+3 + jsr HEXBUF.ROL HEXBUF * 10 -> HEXBUF * bcs .99 overflow!!! inx @@ -130,6 +118,12 @@ DEC2HEX stz HEXBUF * pla *.99 rts *-------------------------------------- +HEXBUF.ROL asl HEXBUF + rol HEXBUF+1 + rol HEXBUF+2 + rol HEXBUF+3 + rts +*-------------------------------------- HEXBUF .BS 4 32 bits max BCDBUF .BS 5 5, enough to handle 10 digits (32bits) ASCBUF .BS 12 LEN + sign + 10 digits ($FFFFFFFF=4.294.967.295) diff --git a/SYS/KERNEL.S.D01.txt b/SYS/KERNEL.S.D01.txt index 3f81d2ab..b8b5d616 100644 --- a/SYS/KERNEL.S.D01.txt +++ b/SYS/KERNEL.S.D01.txt @@ -5,31 +5,52 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -DevMgr.Count .EQ 2 DevMgr.SYS.BASL0 .EQ $800 *-------------------------------------- -DevMgr.NUL.Code .DA DevMgr.Unsup OPEN - .DA DevMgr.Unsup GETEVENT - .DA .8 COUT - .DA DevMgr.Unsup CLOSE - .DA DevMgr.Unsup GETINFO - .DA DevMgr.Unsup IRQ - .DA DevMgr.Unsup SELECT +DevMgr.NUL.Code cld + jmp (.1,x) +.1 .DA DevMgr.BADCALL STATUS + .DA DevMgr.BADCALL READBLOCK + .DA DevMgr.BADCALL WRITEBLOCK + .DA DevMgr.BADCALL FORMAT + .DA DevMgr.BADCALL CONTROL + .DA DevMgr.BADCALL INIT + .DA DevMgr.BADCALL OPEN + .DA DevMgr.BADCALL CLOSE + .DA DevMgr.BADCALL READ + .DA .8 WRITE .8 clc rts *-------------------------------------- -DevMgr.SYS.Code .DA DevMgr.SYS.Open - .DA DevMgr.SYS.GetEvent - .DA DevMgr.SYS.COut - .DA DevMgr.Unsup CLOSE - .DA DevMgr.Unsup GETINFO - .DA DevMgr.Unsup IRQ - .DA DevMgr.SYS.Select +DevMgr.SYS.Code cld + jmp (.1,x) +.1 .DA DevMgr.SYS.Status + .DA DevMgr.BADCALL READBLOCK + .DA DevMgr.BADCALL WRITEBLOCK + .DA DevMgr.BADCALL FORMAT + .DA DevMgr.SYS.Control + .DA DevMgr.BADCALL INIT + .DA DevMgr.SYS.Open + .DA DevMgr.BADCALL CLOSE + .DA DevMgr.SYS.Read + .DA DevMgr.SYS.Write *-------------------------------------- -DevMgr.Unsup lda #DEVMGR.ERRUNSUP +DevMgr.BADCALL lda #MLI.ERR.BADCALL sec rts *-------------------------------------- +DevMgr.SYS.Status + >LDYA DevMgr.SYS.Stat + clc + rts +*-------------------------------------- +DevMgr.SYS.Stat .DA #S.DEV.S.WRITE+S.DEV.S.READ + .DA #0,#0,#0 + >PSTR "A2osX SYS Screen" + .DA #0 + .DA #0 + .DA 0900 +*-------------------------------------- DevMgr.SYS.Open stz DevMgr.SYS.CPULOADI stz DevMgr.SYS.CH stz DevMgr.SYS.CV @@ -53,9 +74,9 @@ DevMgr.SYS.Open stz DevMgr.SYS.CPULOADI jsr DevMgr.SYS.Home lda #1 - sta A2osX.SCRNDEVS+1 fall in SELECT + sta A2osX.SCRNDEVS+1 fall in Control *-------------------------------------- -DevMgr.SYS.Select +DevMgr.SYS.Control sta SETTEXT sta SETALTCHAR sta SET80DISP @@ -66,8 +87,7 @@ DevMgr.SYS.Select clc rts *-------------------------------------- -DevMgr.SYS.GetEvent - lda A2osX.ASCREEN +DevMgr.SYS.Read lda A2osX.ASCREEN cmp #2 is SYS active? bne .9 @@ -102,7 +122,8 @@ DevMgr.SYS.GetEvent sec rts *-------------------------------------- -DevMgr.SYS.COut phx +DevMgr.SYS.Write + phx phy cmp #' ' bcc .1 @@ -141,8 +162,6 @@ DevMgr.SYS.FSOut *-------------------------------------- DevMgr.SYS.CROut jsr DevMgr.SYS.ClrEOL - stz DevMgr.SYS.CH - rts *-------------------------------------- DevMgr.SYS.LF1 stz DevMgr.SYS.CH DevMgr.SYS.LF ldx DevMgr.SYS.CV diff --git a/SYS/KERNEL.S.DAT.txt b/SYS/KERNEL.S.DAT.txt index 6d9eef24..b4d0cc58 100644 --- a/SYS/KERNEL.S.DAT.txt +++ b/SYS/KERNEL.S.DAT.txt @@ -8,9 +8,15 @@ AUTO 6 DevMgr.Stat .DA DevMgr.LoMem Lomem DevMgr.Free .DA DevMgr.LoMem Free .DA DevMgr.HiMem -DevMgr.LastDevID .DA #DevMgr.Count-1 -TSKMGR.SIZE .BS 1 -TSKMGR.LASTID .BS 1 +DevMgr.Count .DA #2 NUL,SYS +*-------------------------------------- +EvtMgr.VBLState .BS 1 +EvtMgr.10TH.CNT .BS 1 +EvtMgr.HZ.CNT .BS 1 +EvtMgr.Count .BS 1 +*-------------------------------------- +TskMgr.Count .DA #1 One Slot Busy (Kernel PS=0) +TskMgr.LastID .DA #0 *-------------------------------------- ENV.DRV >PSTR "DRV" ENV.LIB >PSTR "LIB" diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt index 5505b80b..6d5fdb92 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -13,29 +13,27 @@ AUTO 6 * Y,A = DEVSLOT * note: X Unmodified *\-------------------------------------- -K.GetDevByIDA cmp DevMgr.LastDevID - beq .1 +K.GetDevByIDA cmp DevMgr.Count bcs K.GetDevDNF -.1 pha save ID + pha save ID asl asl asl - asl adc #DevMgr.Table tay + pla php lsr lsr lsr - lsr plp adc /DevMgr.Table rts CC */-------------------------------------- -* #GetDevIDByNameYA +* #GetDevByNameYA * ##IN: * Y,A = Ptr to device name (PStr) * ##OUT: @@ -44,71 +42,93 @@ K.GetDevByIDA cmp DevMgr.LastDevID * Y,A = DEVSLOT *\-------------------------------------- K.GetDevByNameYA - >STYA ZPQuickPtr1 - >LDYAI DevMgr.Table+S.DEV.NAME - >STYA ZPQuickPtr2 + >STYA ZPPtr1 + >LDYAI DevMgr.Table+S.DEV.F + >STYA ZPPtr2 ldx #0 -.1 lda (ZPQuickPtr1) - cmp (ZPQuickPtr2) +.1 lda (ZPPtr2) + and #S.DEV.F.LEN + cmp (ZPPtr1) bne .3 tay -.2 lda (ZPQuickPtr1),y - cmp (ZPQuickPtr2),y +.2 lda (ZPPtr1),y + cmp (ZPPtr2),y bne .3 dey bne .2 - lda ZPQuickPtr2 + lda ZPPtr2 sec - sbc #S.DEV.NAME + sbc #S.DEV.F tay - lda ZPQuickPtr2+1 - sbc /S.DEV.NAME + lda ZPPtr2+1 + sbc /S.DEV.F clc rts -.3 lda ZPQuickPtr2 +.3 lda ZPPtr2 clc adc #S.DEV - sta ZPQuickPtr2 + sta ZPPtr2 bcc .4 - inc ZPQuickPtr2+1 + inc ZPPtr2+1 -.4 cpx DevMgr.LastDevID - inx - bcc .1 +.4 inx + cpx DevMgr.Count + bne .1 -K.GetDevDNF lda #DEVMGR.ERRDNF +K.GetDevDNF lda #MLI.ERR.NODEV CS from cpx/beq rts */-------------------------------------- -* #GetDevInfoA +* #GetDevStatusA * ##IN: * A = DevID * ##OUT: * CC = OK, CS = ERROR * Y,A = Ptr to S.DEVINFO *\-------------------------------------- -K.GetDevInfoA jsr K.GetDevByIDA +K.GetDevStatusA jsr K.GetDevByIDA bcs K.GetDevDNF - >STYA ZPQuickPtr1 - ldx #DEVMGR.GETINFO - jmp (ZPQuickPtr1) + >STYA ZPPtr1 + ldx #DEVMGR.STATUS + jmp (ZPPtr1) */-------------------------------------- * #MkNodYA -* return a S.FILE from a given Device +* return a S.FILE for a given Device NAME * ##IN: * Y,A=DevName * ##OUT: * CC = OK, CS = ERROR * A = hFILE *\-------------------------------------- -K.MkNodYA jsr K.GetDevByNameYA Ptr1=NAME,Ptr2=DEVSLOT +K.MkNodYA jsr K.GetDevByNameYA Ptr1=NAME + bcs .9 + >STYA pDev + stx .1+1 + + ldy #S.DEV.S + lda (pDev),y + bit #S.DEV.S.BLOCK + bne .99 + + lda (pDev) + sta .2+1 + sta .4+1 + + ldy #1 + lda (pDev),y + sta .3+1 + sta .4+2 + + txa Pass DEV.ID to OPEN + ldx #DEVMGR.OPEN + jsr .4 bcs .9 >PUSHWI S.NODE.DEV @@ -116,27 +136,43 @@ K.MkNodYA jsr K.GetDevByNameYA Ptr1=NAME,Ptr2=DEVSLOT jsr K.GetMem bcs .9 - >STYA ZPQuickPtr3 Ptr3=S.NODE - - ldy #S.DEV.DEVID - lda (ZPQuickPtr2),y - pha - - iny #S.DEV.F - lda (ZPQuickPtr2),y - asl CS if Block device + >STYA ZPPtr3 Ptr3=S.NODE ldy #S.NODE.T lda #S.NODE.T.CDEV - adc #0 add CS if blok - sta (ZPQuickPtr3),y + sta (ZPPtr3),y iny #S.NODE.DEV.ID - pla - sta (ZPQuickPtr3),y +.1 lda #$ff Self Modified + sta (ZPPtr3),y + + iny #S.NODE.DEV.JMP +.2 lda #$ff + sta (ZPPtr3),y + + iny ##S.NODE.DEV.JMP+1 +.3 lda #$ff + sta (ZPPtr3),y + txa clc .9 rts + +.99 lda #MLI.ERR.IO + sec + rts +.4 jmp $ffff +*/-------------------------------------- +* #MkNodA +* return a S.FILE for a given Socket +* ##IN: +* A=hSocket +* ##OUT: +* CC = OK, CS = ERROR +* A = hFILE +*\-------------------------------------- +K.MkNodA sec + rts */-------------------------------------- * #MKFIFO * return a S.FILE to a new FIFO @@ -146,7 +182,7 @@ K.MkNodYA jsr K.GetDevByNameYA Ptr1=NAME,Ptr2=DEVSLOT * A = hFILE *\-------------------------------------- K.MKFIFO >PUSHWI 256 - >PUSHBI S.MEM.F.INIT0 + >PUSHBI 0 jsr K.GetMem bcs .99 @@ -158,15 +194,15 @@ K.MKFIFO >PUSHWI 256 bcs .9 - >STYA ZPQuickPtr1 + >STYA ZPPtr1 ldy #S.NODE.T lda #S.NODE.T.FIFO - sta (ZPQuickPtr1),y + sta (ZPPtr1),y iny S.NODE.FIFO.hMem pla - sta (ZPQuickPtr1),y + sta (ZPPtr1),y txa clc rts diff --git a/SYS/KERNEL.S.DIR.txt b/SYS/KERNEL.S.DIR.txt index 77fbb2ec..c05ff97e 100644 --- a/SYS/KERNEL.S.DIR.txt +++ b/SYS/KERNEL.S.DIR.txt @@ -15,7 +15,7 @@ AUTO 6 * A = EC *\-------------------------------------- K.OpenDirYA jsr PFT.CheckPathYA - >STYA ZPQuickPtr2 + >STYA ZPPtr2 >STYA MLICALL.PARAMS+1 For GETFILEINFO,MLIOPEN >PUSHWI S.NODE.DIR @@ -23,14 +23,14 @@ K.OpenDirYA jsr PFT.CheckPathYA jsr K.GetMem bcs .9 - >STYA ZPQuickPtr1 + >STYA ZPPtr1 stx K.ReadDirA.hDir - lda (ZPQuickPtr2) + lda (ZPPtr2) cmp #1 One char ? bne .7 No, Go open dir.... tay Y=1 - lda (ZPQuickPtr2),y + lda (ZPPtr2),y cmp #'/' Root required ? beq .8 Yes, Go for ONLINE Call (S.DIR.PRODOS.REF=0) @@ -44,22 +44,16 @@ K.OpenDirYA jsr PFT.CheckPathYA cmp #$0F Directory ? bne .98 - >PUSHWI 1024 get a ProDOS IOBUF - >PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOVE - jsr K.GetMem + jsr FILE.SetIOBUF + bcs .98 - >STYA MLICALL.PARAMS+3 Save Ptr to IOBUF for MLIOPEN call - txa - ldy #S.NODE.DIR.IOBUF - sta (ZPQuickPtr1),y - >MLICALL MLIOPEN bcs .98 lda MLICALL.PARAMS+5 get ref_num ldy #S.NODE.DIR.REF - sta (ZPQuickPtr1),y + sta (ZPPtr1),y .8 lda K.ReadDirA.hDir clc @@ -95,10 +89,10 @@ K.ReadDirA.EC .BS 2 K.ReadDirA jsr PFT.CheckNodeA sta K.ReadDirA.hDir jsr K.GetMemPtrA - >STYA ZPQuickPtr1 + >STYA ZPPtr1 ldy #S.NODE.DIR.REF - lda (ZPQuickPtr1),y + lda (ZPPtr1),y beq K.ReadDirA.ROOT jmp K.ReadDirA.DIR @@ -108,14 +102,14 @@ K.ReadDirA.NoMore rts *-------------------------------------- K.ReadDirA.ROOT ldy #S.NODE.DIR.FC did we already returned something ? - lda (ZPQuickPtr1),y + lda (ZPPtr1),y bne K.ReadDirA.NoMore stz MLICALL.PARAMS+1 All Volumes >LDYAI KrnBuf256 >STYA MLICALL.PARAMS+2 - >STYA ZPQuickPtr2 + >STYA ZPPtr2 >MLICALL MLIONLINE bcc .10 @@ -131,7 +125,7 @@ K.ReadDirA.ROOT ldy #S.NODE.DIR.FC did we already returned something ? ldy #0 -.1 lda (ZPQuickPtr2),y +.1 lda (ZPPtr2),y and #$0F beq .2 @@ -154,7 +148,7 @@ K.ReadDirA.ROOT ldy #S.NODE.DIR.FC did we already returned something ? jsr K.ReadDirA.GetBuf bcs .99 -.3 lda (ZPQuickPtr2) +.3 lda (ZPPtr2) and #$0F beq .88 @@ -166,7 +160,7 @@ K.ReadDirA.ROOT ldy #S.NODE.DIR.FC did we already returned something ? sta KrnOut256+1 ldy #1 -.4 lda (ZPQuickPtr2),y +.4 lda (ZPPtr2),y sta KrnOut256+1,y jsr K.ReadDirA.AddToBuf iny @@ -175,7 +169,7 @@ K.ReadDirA.ROOT ldy #S.NODE.DIR.FC did we already returned something ? jsr K.ReadDirA.ClrStat - lda (ZPQuickPtr2) + lda (ZPPtr2) asl DRIVE in Carry pha @@ -205,21 +199,21 @@ K.ReadDirA.ROOT ldy #S.NODE.DIR.FC did we already returned something ? .80 jsr K.ReadDirA.ADDSTAT -.88 lda ZPQuickPtr2 +.88 lda ZPPtr2 clc adc #16 - sta ZPQuickPtr2 + sta ZPPtr2 bcc .89 - inc ZPQuickPtr2+1 + inc ZPPtr2+1 .89 dec K.ReadDirA.EC bne .3 * lda #0 done by S.MEM.F.INIT0 -* sta (ZPQuickPtr4) Ending 0 +* sta (ZPPtr4) Ending 0 ldy #S.NODE.DIR.FC lda #16 - sta (ZPQuickPtr1),y Flag that we returned somthing for next time + sta (ZPPtr1),y Flag that we returned somthing for next time lda K.ReadDirA.hDIRENT tax @@ -239,13 +233,13 @@ K.ReadDirA.DIR sta MLICALL.PARAMS+1 A=#S.DIR.PRODOS.REF tya * clc CC from K.GetMem adc #4 Skip 4 bytes linked list - sta ZPQuickPtr2 PTR to Buffer for PASS #1 - sta ZPQuickPtr3 PTR to Buffer for PASS #2 + sta ZPPtr2 PTR to Buffer for PASS #1 + sta ZPPtr3 PTR to Buffer for PASS #2 pla adc #0 - sta ZPQuickPtr2+1 PTR to Buffer for PASS #1 - sta ZPQuickPtr3+1 PTR to Buffer for PASS #2 + sta ZPPtr2+1 PTR to Buffer for PASS #1 + sta ZPPtr3+1 PTR to Buffer for PASS #2 >LDYAI 512 >STYA MLICALL.PARAMS+4 @@ -253,13 +247,13 @@ K.ReadDirA.DIR sta MLICALL.PARAMS+1 A=#S.DIR.PRODOS.REF bcs .98 ldy #S.NODE.DIR.EL Check if first run.... - lda (ZPQuickPtr1),y + lda (ZPPtr1),y bne .2 no, we have all we need.... ldy #$1f+3 ldx #3 -.1 lda (ZPQuickPtr2),y Get K.ReadDirA.EL.... From Block +.1 lda (ZPPtr2),y Get K.ReadDirA.EL.... From Block sta K.ReadDirA.EL,x dey dex @@ -277,7 +271,7 @@ K.ReadDirA.DIR sta MLICALL.PARAMS+1 A=#S.DIR.PRODOS.REF .2 ldy #S.NODE.DIR.EL+3 ldx #3 -.3 lda (ZPQuickPtr1),y get this session parameters from S.DIR +.3 lda (ZPPtr1),y get this session parameters from S.DIR sta K.ReadDirA.EL,x dey dex @@ -304,7 +298,7 @@ K.ReadDirA.DIR sta MLICALL.PARAMS+1 A=#S.DIR.PRODOS.REF sta K.ReadDirA.BufSize stz K.ReadDirA.BufSize+1 -K.ReadDirA.DIR1 lda (ZPQuickPtr2) X = EntryCount In This Block +K.ReadDirA.DIR1 lda (ZPPtr2) X = EntryCount In This Block beq .7 Free slot....goto next and #$F0 get storage_type @@ -314,7 +308,7 @@ K.ReadDirA.DIR1 lda (ZPQuickPtr2) X = EntryCount In This Block cmp #$E0 directory header ? beq .2 - lda (ZPQuickPtr2) regular DIR or File, get LEN + lda (ZPPtr2) regular DIR or File, get LEN and #$F compute filename len sec add "#" + S.STAT @@ -338,24 +332,24 @@ K.ReadDirA.DIR1 lda (ZPQuickPtr2) X = EntryCount In This Block iny bra K.ReadDirA.DIR2 we reached last entry in whole DIR -.7 lda ZPQuickPtr2 +.7 lda ZPPtr2 clc adc K.ReadDirA.EL - sta ZPQuickPtr2 + sta ZPPtr2 bcc .8 - inc ZPQuickPtr2+1 + inc ZPPtr2+1 .8 dec K.ReadDirA.ECIB bne K.ReadDirA.DIR1 -* pass #2 Fill Buffer...(ZPQuickPtr1 & Ptr2 can now be trashed) +* pass #2 Fill Buffer...(ZPPtr1 & Ptr2 can now be trashed) K.ReadDirA.DIR2 jsr K.ReadDirA.GetBuf bcs .9 lda K.ReadDirA.EPB sta K.ReadDirA.ECIB -.1 lda (ZPQuickPtr3) +.1 lda (ZPPtr3) beq .7 Empty slot, skip and #$F0 @@ -373,7 +367,7 @@ K.ReadDirA.DIR2 jsr K.ReadDirA.GetBuf .3 jsr K.ReadDirA.AddFNToBuf jsr K.ReadDirA.ClrStat - lda (ZPQuickPtr3) + lda (ZPPtr3) and #$F0 cmp #$D0 Directory ? bne .5 @@ -396,12 +390,12 @@ K.ReadDirA.DIR2 jsr K.ReadDirA.GetBuf .7 dec K.ReadDirA.ECIB 0! no more file in block beq .8 - lda ZPQuickPtr3 + lda ZPPtr3 clc adc K.ReadDirA.EL - sta ZPQuickPtr3 + sta ZPPtr3 bcc .1 - inc ZPQuickPtr3+1 + inc ZPPtr3+1 bra .1 .9 jsr K.ReadDirA.CLN @@ -410,17 +404,17 @@ K.ReadDirA.DIR2 jsr K.ReadDirA.GetBuf .8 * lda #0 S.MEM.F.INIT0 already did this -* sta (ZPQuickPtr4) Ending 0 +* sta (ZPPtr4) Ending 0 - lda K.ReadDirA.hDir Restore ZPQuickPtr1 trashed by STR API calls + lda K.ReadDirA.hDir Restore ZPPtr1 trashed by STR API calls jsr K.GetMemPtrA - >STYA ZPQuickPtr1 + >STYA ZPPtr1 ldx #3 ldy #S.NODE.DIR.EL+3 .81 lda K.ReadDirA.EL,x Store back this session prameters to S.DIR - sta (ZPQuickPtr1),y + sta (ZPPtr1),y dey dex bpl .81 @@ -443,7 +437,7 @@ K.ReadDirA.GetBuf jsr K.GetMem bcs .9 stx K.ReadDirA.hDIRENT - >STYA ZPQuickPtr4 + >STYA ZPPtr4 .9 rts *-------------------------------------- K.ReadDirA.ADD. ldx #1 filename="1." @@ -461,10 +455,10 @@ K.ReadDirA.ADD.. jsr K.ReadDirA.ClrStat * ldy #$25 total_blocks -* lda (ZPQuickPtr3),y +* lda (ZPPtr3),y * sta KrnSTAT+S.STAT.BLOCKS * iny -* lda (ZPQuickPtr3),y +* lda (ZPPtr3),y * sta KrnSTAT+S.STAT.BLOCKS+1 *-------------------------------------- K.ReadDirA.ADDD lda #$0F @@ -480,7 +474,7 @@ K.ReadDirA.ADDF lda /S.STAT.MODE.REG ldx #ADDF.DST-ADDF.SRC .1 ldy ADDF.SRC-1,x - lda (ZPQuickPtr3),y + lda (ZPPtr3),y ldy ADDF.DST-1,x sta KrnSTAT,y dex @@ -488,7 +482,7 @@ K.ReadDirA.ADDF lda /S.STAT.MODE.REG *-------------------------------------- K.ReadDirA.AddAccess ldy #$1E ProDOS Access - lda (ZPQuickPtr3),y + lda (ZPPtr3),y ldx #0 bit #$01 ProDOS R @@ -517,16 +511,16 @@ K.ReadDirA.AddStat ldy #S.STAT-1 .1 lda KrnSTAT,y - sta (ZPQuickPtr4),y + sta (ZPPtr4),y dey bpl .1 - lda ZPQuickPtr4 + lda ZPPtr4 clc adc #S.STAT - sta ZPQuickPtr4 + sta ZPPtr4 bcc .8 - inc ZPQuickPtr4+1 + inc ZPPtr4+1 .8 rts *-------------------------------------- K.ReadDirA.ClrStat @@ -538,14 +532,14 @@ K.ReadDirA.ClrStat rts *-------------------------------------- K.ReadDirA.AddFNToBuf - lda (ZPQuickPtr3) + lda (ZPPtr3) and #$0F get filename len tax jsr K.ReadDirA.AddToBuf ldy #1 -.1 lda (ZPQuickPtr3),y +.1 lda (ZPPtr3),y jsr K.ReadDirA.AddToBuf iny dex @@ -553,17 +547,17 @@ K.ReadDirA.AddFNToBuf rts *-------------------------------------- K.ReadDirA.AddToBuf - sta (ZPQuickPtr4) - inc ZPQuickPtr4 + sta (ZPPtr4) + inc ZPPtr4 bne .8 - inc ZPQuickPtr4+1 + inc ZPPtr4+1 .8 rts *-------------------------------------- K.ReadDirA.ConvertTime clc - adc ZPQuickPtr3 + adc ZPPtr3 tay - lda ZPQuickPtr3+1 + lda ZPPtr3+1 adc #0 >PUSHYA jmp K.PTime2Time Will destroy Ptr1 & Ptr2 !!!! @@ -579,24 +573,28 @@ ADDF.DST .DA #S.STAT.P.TYPE,#S.STAT.BLOCKS,#S.STAT.BLOCKS+1 * ##Out: * none, always succeed. *\------------------------------------- -K.CloseDirA jsr PFT.CheckNodeA - sta K.ReadDirA.hDir - jsr K.GetMemPtrA - >STYA ZPQuickPtr1 +K.CloseDirA .EQ K.FCloseA + +* jsr PFT.CheckNodeA +* sta K.ReadDirA.hDir +* jsr K.GetMemPtrA +* >STYA ZPPtr1 -K.CloseDirA.1 ldy #S.NODE.DIR.REF - lda (ZPQuickPtr1),y - beq .1 - sta MLICALL.PARAMS+1 - >MLICALL MLICLOSE +K.CloseDirA.1 .EQ K.FCloseA.1 -.1 ldy #S.NODE.DIR.IOBUF - lda (ZPQuickPtr1),y - beq .2 - jsr K.FreeMemA +* ldy #S.NODE.DIR.REF +* lda (ZPPtr1),y +* beq .1 +* sta MLICALL.PARAMS+1 +* >MLICALL MLICLOSE -.2 ldaK.ReadDirA.hDir - jmp K.FreeMemA +*.1 ldy #S.NODE.DIR.IOBUF +* lda (ZPPtr1),y +* beq .2 +* jsr K.FreeMemA +* +*.2 lda K.ReadDirA.hDir +* jmp K.FreeMemA */------------------------------------- * #MKDirYA * ##In: diff --git a/SYS/KERNEL.S.DRV.txt b/SYS/KERNEL.S.DRV.txt index 8e82137e..5299a2fb 100644 --- a/SYS/KERNEL.S.DRV.txt +++ b/SYS/KERNEL.S.DRV.txt @@ -32,16 +32,16 @@ K.LoadDrvYA >STYA K.LoadDrv.CmdArray stx K.LoadDrv.hMem >LDYA K.LoadDrv.CmdArray Advance to ARG[1] - >STYA ZPQuickPtr1 + >STYA ZPPtr1 - lda ZPQuickPtr1 + lda ZPPtr1 sec - adc (ZPQuickPtr1) - sta ZPQuickPtr1 + adc (ZPPtr1) + sta ZPPtr1 bcc .1 - inc ZPQuickPtr1+1 + inc ZPPtr1+1 -.1 >LDYA ZPQuickPtr1 +.1 >LDYA ZPPtr1 jsr pDrvJmp call Dev.Detect @@ -50,10 +50,6 @@ K.LoadDrvYA >STYA K.LoadDrv.CmdArray jsr BIN.InstallDRV bcs .97 - ldy #S.DEV.F - lda (pDev),y - ora #S.DEV.F.INUSE - sta (pDev),y jsr .97 Cleanup... diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt index abc40878..2ec1ccee 100644 --- a/SYS/KERNEL.S.ENV.txt +++ b/SYS/KERNEL.S.ENV.txt @@ -14,7 +14,7 @@ AUTO 6 *\-------------------------------------- K.ExpandPStrYA stz K.ExpandPStr.hPStr Reset Intermediate string... -.11 >STYA ZPQuickPtr2 +.11 >STYA ZPPtr2 stz KrnBuf256 init Expanded String len=0 stz K.ExpandPStr.bFound No var found yet @@ -25,11 +25,11 @@ K.ExpandPStrYA stz K.ExpandPStr.hPStr Reset Intermediate string... .10 stz K.ExpandPStr.Start .1 tya - cmp (ZPQuickPtr2) End of PSTR? + cmp (ZPPtr2) End of PSTR? beq .6 iny - lda (ZPQuickPtr2),y + lda (ZPPtr2),y cmp #''' bne .21 @@ -111,15 +111,15 @@ K.ExpandPStr.AV lda K.ExpandPStr.End inx sta KrnBuf256,x - stx ZPQuickPtr1 Make Ptr1 -> Var NAME + stx ZPPtr1 Make Ptr1 -> Var NAME lda /KrnBuf256 - sta ZPQuickPtr1+1 + sta ZPPtr1+1 ldy K.ExpandPStr.Start .1 iny inx - lda (ZPQuickPtr2),y + lda (ZPPtr2),y sta KrnBuf256,x cpy K.ExpandPStr.End bne .1 @@ -132,19 +132,19 @@ K.ExpandPStr.AV lda K.ExpandPStr.End jsr ENV.NextEnvPtr3 Skip NAME -.2 lda (ZPQuickPtr3) +.2 lda (ZPPtr3) beq .9 in case CheckSysVarPtr1 returned a NUL string ldy #0 ldx KrnBuf256 .3 iny - lda (ZPQuickPtr3),y + lda (ZPPtr3),y inx sta KrnBuf256,x tya - cmp (ZPQuickPtr3) last char? + cmp (ZPPtr3) last char? bne .3 stx KrnBuf256 @@ -179,14 +179,14 @@ K.ExpandPStr.hPStr .BS 1 * Y,A = PTR to String NAME=VALUE (PSTR) * ##Out: *\-------------------------------------- -K.PutEnvYA >STYA ZPQuickPtr1 NAME=VALUE +K.PutEnvYA >STYA ZPPtr1 NAME=VALUE - lda (ZPQuickPtr1) + lda (ZPPtr1) beq .9 sta KrnBuf256 tay -.1 lda (ZPQuickPtr1),y copy PSTR to KrnBuf256 +.1 lda (ZPPtr1),y copy PSTR to KrnBuf256 sta KrnBuf256,y dey bne .1 @@ -216,12 +216,12 @@ K.PutEnvYA >STYA ZPQuickPtr1 NAME=VALUE sbc KrnBuf256 VALUE len sta KrnBuf256,y save it at "=" POS - stz ZPQuickPtr1 #KrnBuf256 - sty ZPQuickPtr2 + stz ZPPtr1 #KrnBuf256 + sty ZPPtr2 lda /KrnBuf256 - sta ZPQuickPtr1+1 - sta ZPQuickPtr2+1 + sta ZPPtr1+1 + sta ZPPtr2+1 bra K.SetEnvPtr1Ptr2 @@ -239,59 +239,59 @@ K.SetEnv jsr PullPtr1Ptr2 Ptr1=NAME,Ptr2=VALUE K.SetEnvPtr1Ptr2 jsr S.UnsetEnvPtr1 - jsr ENV.InitEnvPtr3 ZPQuickPtr3 -> Env + jsr ENV.InitEnvPtr3 ZPPtr3 -> Env - lda ZPQuickPtr3 Compute ENV UPPER LIMIT in Ptr4 + lda ZPPtr3 Compute ENV UPPER LIMIT in Ptr4 clc adc #K.ENV.SIZE - sta ZPQuickPtr4 + sta ZPPtr4 - lda ZPQuickPtr3+1 + lda ZPPtr3+1 adc /K.ENV.SIZE - sta ZPQuickPtr4+1 + sta ZPPtr4+1 - ldy ZPQuickPtr3+1 - lda ZPQuickPtr3 Compute New Env Upper limit in A,Y + ldy ZPPtr3+1 + lda ZPPtr3 Compute New Env Upper limit in A,Y sec - adc (ZPQuickPtr1) add NAME len +1 + adc (ZPPtr1) add NAME len +1 bcc .1 iny .1 sec - adc (ZPQuickPtr2) add VALUE len +1 + adc (ZPPtr2) add VALUE len +1 bcc .2 iny -.2 cmp ZPQuickPtr4 GE than hMem Upper limit ? +.2 cmp ZPPtr4 GE than hMem Upper limit ? tya - sbc ZPQuickPtr4+1 + sbc ZPPtr4+1 bcs .99 -.3 lda (ZPQuickPtr3) Scan until ending 0... +.3 lda (ZPPtr3) Scan until ending 0... beq .4 - inc ZPQuickPtr3 + inc ZPPtr3 bne .3 - inc ZPQuickPtr3+1 + inc ZPPtr3+1 bne .3 -.4 lda (ZPQuickPtr1) - sta (ZPQuickPtr3) +.4 lda (ZPPtr1) + sta (ZPPtr3) tay -.5 lda (ZPQuickPtr1),y - sta (ZPQuickPtr3),y +.5 lda (ZPPtr1),y + sta (ZPPtr3),y dey bne .5 jsr ENV.NextEnvPtr3 - lda (ZPQuickPtr2) - sta (ZPQuickPtr3) + lda (ZPPtr2) + sta (ZPPtr3) tay -.6 lda (ZPQuickPtr2),y - sta (ZPQuickPtr3),y +.6 lda (ZPPtr2),y + sta (ZPPtr3),y dey bne .6 @@ -299,7 +299,7 @@ K.SetEnvPtr1Ptr2 .8 lda #0 - sta (ZPQuickPtr3) + sta (ZPPtr3) clc rts @@ -314,14 +314,14 @@ K.SetEnvPtr1Ptr2 * CC : Y,A = PTR to VALUE (PSTR) * CS : not found *\-------------------------------------- -K.GetEnvYA >STYA ZPQuickPtr1 +K.GetEnvYA >STYA ZPPtr1 jsr ENV.CheckSysVarPtr1 bcc .8 jsr ENV.FindVarPtr1 bcs .9 jsr ENV.NextEnvPtr3 Skip NAME - >LDYA ZPQuickPtr3 + >LDYA ZPPtr3 clc just in case ADC in NextEnvPtr1 disturb CC .8 rts @@ -333,7 +333,7 @@ K.GetEnvYA >STYA ZPQuickPtr1 * Y,A = PTR To Name (PSTR) * ##Out: *\-------------------------------------- -K.UnsetEnvYA >STYA ZPQuickPtr1 Store VAR Name +K.UnsetEnvYA >STYA ZPPtr1 Store VAR Name S.UnsetEnvPtr1 jsr ENV.FindVarPtr1 bcs .8 not found, quit @@ -346,26 +346,26 @@ S.UnsetEnvPtr1 jsr ENV.FindVarPtr1 *-------------------------------------- * ENV.CheckSysVarPtr1 * In: -* ZPQuickPtr1 -> NAME +* ZPPtr1 -> NAME * Out: * CC: Found * YA -> VALUE * CS: Not Found *-------------------------------------- ENV.CheckSysVarPtr1 - lda (ZPQuickPtr1) + lda (ZPPtr1) cmp #1 is name 1 char? bne .9 ldy #1 - lda (ZPQuickPtr1),y + lda (ZPPtr1),y cmp #'0'-1 $0...$9 ?? bcc .1 cmp #'9'+1 bcs .1 and #$0F jsr K.GetArgA - >STYA ZPQuickPtr3 + >STYA ZPPtr3 rts .1 ldx #ENV.SysVarsJmp-ENV.SysVars-1 @@ -398,23 +398,23 @@ ENV.SysVarsArgs lda #1 ldx #0 -.1 lda (ZPQuickPtr1) +.1 lda (ZPPtr1) beq ENV.SysVarsExit ldy #0 .2 iny inx - lda (ZPQuickPtr1),y + lda (ZPPtr1),y sta KrnOut256,x tya - cmp (ZPQuickPtr1) + cmp (ZPPtr1) bne .2 - adc ZPQuickPtr1 CS from beq .2 - sta ZPQuickPtr1 + adc ZPPtr1 CS from beq .2 + sta ZPPtr1 bcc .3 - inc ZPQuickPtr1+1 + inc ZPPtr1+1 .3 lda #' ' inx beq ENV.SysVarsExit make sure not overlapping buf 256 @@ -462,34 +462,34 @@ ENV.SysVarsA sta HEXBUF ENV.SysVarsExit stx KrnOut256 >LDYAI KrnOut256 - >STYA ZPQuickPtr3 + >STYA ZPPtr3 clc rts *-------------------------------------- * ENV.FindVarPtr1 * In: -* ZPQuickPtr1 -> NAME +* ZPPtr1 -> NAME * Out: * CC: Found -* ZPQuickPtr1 -> NAME -* ZPQuickPtr3 -> ENV.NAME +* ZPPtr1 -> NAME +* ZPPtr3 -> ENV.NAME * CS: Not Found -* ZPQuickPtr1 -> NAME -* ZPQuickPtr3 -> PTR to Ending 0 +* ZPPtr1 -> NAME +* ZPPtr3 -> PTR to Ending 0 *-------------------------------------- ENV.FindVarPtr1 jsr ENV.InitEnvPtr3 Store ENV bcs .99 - lda (ZPQuickPtr3) + lda (ZPPtr3) beq .9 end of ENV -.1 cmp (ZPQuickPtr1) Same len as NAME? +.1 cmp (ZPPtr1) Same len as NAME? bne .3 tay -.2 lda (ZPQuickPtr1),y - cmp (ZPQuickPtr3),y +.2 lda (ZPPtr1),y + cmp (ZPPtr3),y bne .3 dey bne .2 @@ -498,7 +498,7 @@ ENV.FindVarPtr1 jsr ENV.InitEnvPtr3 Store ENV .3 jsr ENV.NextEnvPtr3 Skip NAME jsr ENV.NextEnvPtr3 Skip VALUE - lda (ZPQuickPtr3) + lda (ZPPtr3) bne .1 .9 sec @@ -506,33 +506,33 @@ ENV.FindVarPtr1 jsr ENV.InitEnvPtr3 Store ENV *-------------------------------------- * ENV.DiscardVarPtr3 * In: -* ZPQuickPtr3 -> ENV.NAME to Discard +* ZPPtr3 -> ENV.NAME to Discard *-------------------------------------- ENV.DiscardVarPtr3 - lda ZPQuickPtr3 Discard current NAME & VALUE definition - sec ZPQuickPtr3 -> NAME - adc (ZPQuickPtr3) add NAME+1 to ZPQuickPtr3 - sta ZPQuickPtr4 store it in ZPQuickPtr4 + lda ZPPtr3 Discard current NAME & VALUE definition + sec ZPPtr3 -> NAME + adc (ZPPtr3) add NAME+1 to ZPPtr3 + sta ZPPtr4 store it in ZPPtr4 lda #0 - adc ZPQuickPtr3+1 - sta ZPQuickPtr4+1 + adc ZPPtr3+1 + sta ZPPtr4+1 - lda ZPQuickPtr4 add VALUE+1 to ZPQuickPtr4 + lda ZPPtr4 add VALUE+1 to ZPPtr4 sec - adc (ZPQuickPtr4) - sta ZPQuickPtr4 + adc (ZPPtr4) + sta ZPPtr4 bcc .1 - inc ZPQuickPtr4+1 + inc ZPPtr4+1 .1 ldy #0 -.2 lda (ZPQuickPtr4),y Move back tail... - sta (ZPQuickPtr3),y +.2 lda (ZPPtr4),y Move back tail... + sta (ZPPtr3),y beq .8 ...until we move ending 0 iny bne .2 - inc ZPQuickPtr3+1 - inc ZPQuickPtr4+1 + inc ZPPtr3+1 + inc ZPPtr4+1 bra .2 .8 rts @@ -540,15 +540,15 @@ ENV.DiscardVarPtr3 ENV.InitEnvPtr3 ldy #S.PS.hENV lda (pPs),y jsr K.GetMemPtrA - >STYA ZPQuickPtr3 Store ENV + >STYA ZPPtr3 Store ENV rts *-------------------------------------- -ENV.NextEnvPtr3 lda ZPQuickPtr3 +ENV.NextEnvPtr3 lda ZPPtr3 sec - adc (ZPQuickPtr3) - sta ZPQuickPtr3 + adc (ZPPtr3) + sta ZPPtr3 bcc .8 - inc ZPQuickPtr3+1 + inc ZPPtr3+1 .8 rts *-------------------------------------- MAN diff --git a/SYS/KERNEL.S.EVT.txt b/SYS/KERNEL.S.EVT.txt index da10b7aa..3e2561dd 100644 --- a/SYS/KERNEL.S.EVT.txt +++ b/SYS/KERNEL.S.EVT.txt @@ -13,15 +13,15 @@ AUTO 6 * (pEvent) *-------------------------------------- EVT.GetEvents stz pEvent point to start of event list - stz EVTMGR.COUNT reset Size + stz EvtMgr.Count reset Size lda VBL get VLINE status tax - eor EVTMGR.VBLSTATE - bpl EVT.GetEvents.DEV no change,no tick + eor EvtMgr.VBLState + bpl EVT.GetEvents.DEV no change,no tick txa - sta EVTMGR.VBLSTATE save new - bpl EVT.GetEvents.DEV Up2down transition,no tick + sta EvtMgr.VBLState save new + bpl EVT.GetEvents.DEV Up2down transition,no tick * sta PDLTRIG clr VBL (IIc) * lda RDIOUDIS clr VBL (IIc) @@ -30,19 +30,19 @@ EVT.GetEvents stz pEvent point to start of event list bne .1 inc A2osX.TIMER16+1 -.1 dec EVTMGR.HZ.CNT +.1 dec EvtMgr.HZ.CNT bne EVT.GetEvents.DEV not yet 100ms ldx A2osX.HZ - stx EVTMGR.HZ.CNT + stx EvtMgr.HZ.CNT lda #S.EVT.F.T10TH - dec EVTMGR.10TH.CNT + dec EvtMgr.10TH.CNT bne .2 ldx #10 - stx EVTMGR.10TH.CNT + stx EvtMgr.10TH.CNT ora #S.EVT.F.T1SEC @@ -53,29 +53,25 @@ EVT.GetEvents.DEV >LDYAI DevMgr.Table >STYA pDev - stz EvtMgr.DevID + stz EvtMgr.Idx .1 ldy #S.DEV.F - lda (pDev),y get S.DEV.F - bit #S.DEV.F.EVENT - beq .2 EVENT enabled ? +* lda (pDev),y get S.DEV.F +* bit #S.DEV.F.EVENT +* beq .2 EVENT enabled ? - lda (pDev) - cmp #H.BIN.HEADER.DRV65 - bne * +* ldx #DEVMGR.GETEVENT - ldx #DEVMGR.GETEVENT - - jsr pDevJmp Call DRV GetEvent function - bcs .2 no event +* jsr pDevJmp Call DRV GetEvent function +* bcs .2 no event - ldy #S.EVT.hDEV - lda EvtMgr.DevID - sta (pEvent),y +* ldy #S.EVT.hDEV +* lda EvtMgr.Idx +* sta (pEvent),y - jsr EVT.GetEvents.Add +* jsr EVT.GetEvents.Add - bcs .8 Event Q is full, exit now with CC +* bcs .8 Event Q is full, exit now with CC .2 lda pDev clc @@ -84,19 +80,19 @@ EVT.GetEvents.DEV bcc .3 inc pDev+1 -.3 lda EvtMgr.DevID - inc EvtMgr.DevID - cmp DevMgr.LastDevID +.3 lda EvtMgr.Idx + inc EvtMgr.Idx + cmp DevMgr.Count bne .1 - lda EVTMGR.COUNT if 0, exit with CS (from cmp), and A=0 "no event" + lda EvtMgr.Count if 0, exit with CS (from cmp), and A=0 "no event" beq .9 .8 clc .9 rts *-------------------------------------- EVT.GetEvents.Add - inc EVTMGR.COUNT Add one event to Queue + inc EvtMgr.Count Add one event to Queue lda pEvent clc @@ -126,14 +122,10 @@ EVT.DestroyEvent .2 lda #0 sta (pEvent) - dec EVTMGR.COUNT + dec EvtMgr.Count .9 rts *-------------------------------------- -EVTMGR.VBLSTATE .BS 1 -EVTMGR.10TH.CNT .BS 1 -EVTMGR.HZ.CNT .BS 1 -EVTMGR.COUNT .BS 1 -EvtMgr.DevID .BS 1 +EvtMgr.Idx .BS 1 *-------------------------------------- MAN SAVE SYS/KERNEL.S.EVT diff --git a/SYS/KERNEL.S.FILE.txt b/SYS/KERNEL.S.FILE.txt index 04159ee9..418c10ff 100644 --- a/SYS/KERNEL.S.FILE.txt +++ b/SYS/KERNEL.S.FILE.txt @@ -15,33 +15,33 @@ AUTO 6 * PUSHW = AUXTYPE * PUSHB = TYPE * PUSHB = MODE -* SYS.FOPEN.R : if R and !exists -> ERROR -* SYS.FOPEN.W : if W and !exists -> CREATE -* SYS.FOPEN.A : Append -* SYS.FOPEN.T : Open/Append in Text mode -* SYS.FOPEN.X : Create if not exists +* SYS.FOpen.R : if R and !exists -> ERROR +* SYS.FOpen.W : if W and !exists -> CREATE +* SYS.FOpen.A : Append +* SYS.FOpen.T : Open/Append in Text mode +* SYS.FOpen.X : Create if not exists * PUSHW = PATH (PSTR) * ##Out : * CC : A = hFILE * CS : A = EC *\-------------------------------------- -K.FOPEN jsr PFT.CheckPathSTK +K.FOpen jsr PFT.CheckPathSTK >PULLW MLICALL.PARAMS+1 - >PULLB K.FOPEN.MODE - >PULLB K.FOPEN.TYPE - >PULLW K.FOPEN.AUXTYPE + >PULLB K.FOpen.MODE + >PULLB K.FOpen.TYPE + >PULLW K.FOpen.AUXTYPE >MLICALL MLIGETFILEINFO - bcc K.FOPEN.10 Already Exists + bcc K.FOpen.10 Already Exists - bit K.FOPEN.MODE Create if not exists ? - bpl K.FOPEN.9 No, return MLI error + bit K.FOpen.MODE Create if not exists ? + bpl K.FOpen.9 No, return MLI error lda #S.FILEINFO.ACCESS.FULL Yes, Create... sta MLICALL.PARAMS+3 Access - lda K.FOPEN.TYPE + lda K.FOpen.TYPE sta MLICALL.PARAMS+4 File type - >LDYA K.FOPEN.AUXTYPE + >LDYA K.FOpen.AUXTYPE >STYA MLICALL.PARAMS+5 Aux type lda #S.FILEINFO.STORETYPE.STD sta MLICALL.PARAMS+7 @@ -55,41 +55,34 @@ K.FOPEN jsr PFT.CheckPathSTK bpl .1 >MLICALL MLICREATE - bcc K.FOPEN.10 -K.FOPEN.9 rts + bcc K.FOpen.10 +K.FOpen.9 rts -K.FOPEN.10 >PUSHWI S.NODE.REG +K.FOpen.10 >PUSHWI S.NODE.REG >PUSHBI S.MEM.F.INIT0 jsr K.GetMem - bcs K.FOPEN.9 + bcs K.FOpen.9 - >STYA ZPQuickPtr1 + >STYA ZPPtr1 stx hFILE - >PUSHWI 1024 get a ProDOS IOBUF - >PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOVE - jsr K.GetMem + jsr FILE.SetIOBUF bcs .98 - >STYA MLICALL.PARAMS+3 Save Ptr to IOBUF for MLIOPEN call - txa - ldy #S.NODE.REG.IOBUF - sta (ZPQuickPtr1),y - >MLICALL MLIOPEN bcs .98 lda MLICALL.PARAMS+5 get ref_num ldy #S.NODE.REG.REF - sta (ZPQuickPtr1),y + sta (ZPPtr1),y sta MLICALL.PARAMS+1 Next MLI Calls are REF_NUM based - lda K.FOPEN.MODE - bit #SYS.FOPEN.W + lda K.FOpen.MODE + bit #SYS.FOpen.W beq .20 Write mode ? - and #SYS.FOPEN.A Append ? + and #SYS.FOpen.A Append ? bne .11 yes, go to end of file stz MLICALL.PARAMS+2 @@ -105,8 +98,8 @@ K.FOPEN.10 >PUSHWI S.NODE.REG >MLICALL MLISETMARK bcs .98 -.20 lda K.FOPEN.MODE - and #SYS.FOPEN.T Text Mode ? +.20 lda K.FOpen.MODE + and #SYS.FOpen.T Text Mode ? beq .30 lda #$FF @@ -117,7 +110,7 @@ K.FOPEN.10 >PUSHWI S.NODE.REG .30 ldy #S.NODE.T lda #S.NODE.T.REG - sta (ZPQuickPtr1),y + sta (ZPPtr1),y lda hFILE clc rts CC @@ -128,9 +121,9 @@ K.FOPEN.10 >PUSHWI S.NODE.REG sec rts *-------------------------------------- -K.FOPEN.MODE .BS 1 -K.FOPEN.TYPE .BS 1 -K.FOPEN.AUXTYPE .BS 2 +K.FOpen.MODE .BS 1 +K.FOpen.TYPE .BS 1 +K.FOpen.AUXTYPE .BS 2 hFILE .BS 1 */-------------------------------------- * #FCloseA @@ -140,24 +133,23 @@ hFILE .BS 1 * ##Out : *\-------------------------------------- K.FCloseA jsr PFT.CheckNodeA - sta hFILE + sta K.FCloseA.2+1 jsr K.GetMemPtrA - >STYA ZPQuickPtr1 + >STYA ZPPtr1 K.FCloseA.1 ldy #S.NODE.REG.REF - lda (ZPQuickPtr1),y + lda (ZPPtr1),y beq .1 sta MLICALL.PARAMS+1 >MLICALL MLICLOSE .1 ldy #S.NODE.REG.IOBUF - lda (ZPQuickPtr1),y - beq .2 + lda (ZPPtr1),y + beq K.FCloseA.2 jsr K.FreeMemA -.2 lda hFILE - jsr K.FreeMemA - rts +K.FCloseA.2 lda #$ff Self Modified + jmp K.FreeMemA */-------------------------------------- * #FReadA * Read ONE byte from file @@ -245,13 +237,13 @@ K.FFlushA jsr PFT.CheckNodeA K.FSeek jsr PFT.CheckNodeSTK >PULLA jsr FILE.SetupPrt1A - >PULLB K.FSEEK.FROM - >PULLW K.FSEEK.OFFSET - >PULLW K.FSEEK.OFFSET+2 + >PULLB K.FSeek.FROM + >PULLW K.FSeek.OFFSET + >PULLW K.FSeek.OFFSET+2 - lda K.FSEEK.FROM + lda K.FSeek.FROM -* cmp #SYS.FSEEK.SET =0 +* cmp #SYS.FSeek.SET =0 bne .1 stz MLICALL.PARAMS+2 @@ -259,25 +251,25 @@ K.FSeek jsr PFT.CheckNodeSTK stz MLICALL.PARAMS+4 bra .8 -.1 cmp #SYS.FSEEK.CUR +.1 cmp #SYS.FSeek.CUR bne .2 >MLICALL MLIGETMARK bcc .8 rts -.2 cmp #SYS.FSEEK.END +.2 cmp #SYS.FSeek.END bne .98 >MLICALL MLIGETEOF bcs .9 .8 lda MLICALL.PARAMS+2 - adc K.FSEEK.OFFSET + adc K.FSeek.OFFSET sta MLICALL.PARAMS+2 lda MLICALL.PARAMS+3 - adc K.FSEEK.OFFSET+1 + adc K.FSeek.OFFSET+1 sta MLICALL.PARAMS+3 lda MLICALL.PARAMS+4 - adc K.FSEEK.OFFSET+2 + adc K.FSeek.OFFSET+2 sta MLICALL.PARAMS+4 bcs .99 Offset out of range! @@ -291,8 +283,8 @@ K.FSeek jsr PFT.CheckNodeSTK sec rts *-------------------------------------- -K.FSEEK.FROM .BS 1 -K.FSEEK.OFFSET .BS 4 +K.FSeek.FROM .BS 1 +K.FSeek.OFFSET .BS 4 */-------------------------------------- * #FTellA * ##In: @@ -319,7 +311,7 @@ K.FTellA.1 jsr FILE.SetupPrt1A *\-------------------------------------- K.FEOFA jsr PFT.CheckNodeA jsr FILE.SetupPrt1A - jsr K.FTELLA.1 + jsr K.FTellA.1 bcs .9 >STYA K.FEOFA.MARK stx K.FEOFA.MARK+2 @@ -357,7 +349,7 @@ K.RemoveYA jsr PFT.CheckPathYA K.Rename jsr PFT.CheckPathSTK >PULLW MLICALL.PARAMS+1 >PULLW MLICALL.PARAMS+3 - >MLICALL MLIRENAME + >MLICALL MLIRename rts */-------------------------------------- * #Stat @@ -369,22 +361,32 @@ K.Rename jsr PFT.CheckPathSTK *\-------------------------------------- K.Stat jsr PFT.CheckPathSTK >PULLW MLICALL.PARAMS+1 - >PULLW ZPQuickPtr2 + >PULLW ZPPtr2 >MLICALL MLIGETFILEINFO bcs .9 jsr FILE.MLI2STAT clc .9 rts *-------------------------------------- +FILE.SetIOBUF >PUSHWI 1024 get a ProDOS IOBUF + >PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOVE + jsr K.GetMem + bcs .9 + + >STYA MLICALL.PARAMS+3 Save Ptr to IOBUF for MLIOPEN call + txa + ldy #S.NODE.REG.IOBUF + sta (ZPPtr1),y +.9 rts +*-------------------------------------- FILE.SetupPrt1A jsr K.GetMemPtrA - >STYA ZPQuickPtr1 + >STYA ZPPtr1 ldy #S.NODE.REG.REF - lda (ZPQuickPtr1),y + lda (ZPPtr1),y sta MLICALL.PARAMS+1 rts *-------------------------------------- -FILE.MLI2STAT - lda MLICALL.PARAMS+S.FILEINFO.ACCESS +FILE.MLI2STAT lda MLICALL.PARAMS+S.FILEINFO.ACCESS cmp #S.FILEINFO.ACCESS.FULL bne .1 @@ -396,13 +398,13 @@ FILE.MLI2STAT lda #S.STAT.MODE.XO+S.STAT.MODE.RO .2 ldy #S.STAT.MODE - sta (ZPQuickPtr2),y + sta (ZPPtr2),y ldx #2 ldy #S.STAT.P.TYPE+2 .3 lda MLICALL.PARAMS+S.FILEINFO.TYPE,x - sta (ZPQuickPtr2),y + sta (ZPPtr2),y dey dex bpl .3 diff --git a/SYS/KERNEL.S.FIO.txt b/SYS/KERNEL.S.FIO.txt index 13a136af..9dd9c1ee 100644 --- a/SYS/KERNEL.S.FIO.txt +++ b/SYS/KERNEL.S.FIO.txt @@ -17,13 +17,13 @@ AUTO 6 * X = hMem to FilePath * CS : not found *\-------------------------------------- -K.FileSearch >PULLW ZPQuickPtr4 ZPQuickPtr1 trashed by ExpandPStrYA +K.FileSearch >PULLW ZPPtr4 ZPPtr1 trashed by ExpandPStrYA >PULLYA Get Search list >SYSCALL ExpandPStrYA Expand it (SYSCALL to BNK1) bcs .99 stx K.FileSearch.hSrch - >STYA ZPQuickPtr3 ZPQuickPtr2 trashed by K.STAT !!! expanded search list ; + >STYA ZPPtr3 ZPPtr2 trashed by K.STAT !!! expanded search list ; stz K.FileSearch.Index @@ -33,10 +33,10 @@ K.FileSearch >PULLW ZPQuickPtr4 ZPQuickPtr1 trashed by ExpandPStrYA ldy K.FileSearch.Index .2 tya - cmp (ZPQuickPtr3) end of src string ? + cmp (ZPPtr3) end of src string ? beq .3 end of string, try it.... iny - lda (ZPQuickPtr3),y + lda (ZPPtr3),y cmp #';' beq .3 inx @@ -51,11 +51,11 @@ K.FileSearch >PULLW ZPQuickPtr4 ZPQuickPtr1 trashed by ExpandPStrYA ldy #0 .4 iny - lda (ZPQuickPtr4),y Append Fiename... + lda (ZPPtr4),y Append Fiename... inx sta KrnBuf256,x tya - cmp (ZPQuickPtr4) + cmp (ZPPtr4) bne .4 stx KrnBuf256 set string length @@ -88,14 +88,14 @@ K.FileSearch.Index .BS 1 * X = hMem of FullPath * CS : A = Error Code *\-------------------------------------- -K.GetFullPathYA >STYA ZPQuickPtr3 Ptr1 & 2 used by StrCpy - lda (ZPQuickPtr3) +K.GetFullPathYA >STYA ZPPtr3 Ptr1 & 2 used by StrCpy + lda (ZPPtr3) beq K.GetFullPathYA.9 stz KrnBuf256 ldy #1 - lda (ZPQuickPtr3),y + lda (ZPPtr3),y cmp #'/' full path starting with '/'? beq .1 yes, do not append to current prefix @@ -106,7 +106,7 @@ K.GetFullPathYA >STYA ZPQuickPtr3 Ptr1 & 2 used by StrCpy >PUSHWI KrnBuf256 >SYSCALL PStrCpy -.1 >PUSHW ZPQuickPtr3 +.1 >PUSHW ZPPtr3 >PUSHWI KrnBuf256 >SYSCALL PStrCat K.GetFullPathYA.NewStr @@ -123,22 +123,22 @@ K.GetFullPathYA.9 * PUSHW = AUXTYPE (Handled by.... * PUSHB = TYPE ... * PUSHB = MODE ... -* PUSHW = PATH ...FOPEN) +* PUSHW = PATH ...FOpen) * ##Out: * Y,A = File Length * X = hMem of Loaded File *\-------------------------------------- -K.LoadFile jsr K.FOPEN +K.LoadFile jsr K.FOpen bcs .9 sta K.LoadFile.hFile - ldx #SYS.FSEEK.END + ldx #SYS.FSeek.END jsr K.LoadFile.Seek bcs .99 lda K.LoadFile.hFile - jsr K.FTELLA + jsr K.FTellA bcs .99 >STYA K.LoadFile.Len phx @@ -152,14 +152,14 @@ K.LoadFile jsr K.FOPEN >STYA K.LoadFile.Mem stx K.LoadFile.hMem - ldx #SYS.FSEEK.SET + ldx #SYS.FSeek.SET jsr K.LoadFile.Seek bcs .97 >PUSHW K.LoadFile.Mem >PUSHW K.LoadFile.Len >PUSHB K.LoadFile.hFile - jsr K.FREAD + jsr K.FRead bcs .97 jsr .99 @@ -189,7 +189,7 @@ K.LoadFile.Seek >PUSHWI 0 txa >PUSHA >PUSHB K.LoadFile.hFile - jmp K.FSEEK + jmp K.FSeek */-------------------------------------- * #SaveFile * ##In: @@ -198,15 +198,15 @@ K.LoadFile.Seek >PUSHWI 0 * PUSHW = AUXTYPE (Handled by.... * PUSHB = TYPE ... * PUSHB = MODE ... -* PUSHW = PATH ...FOPEN) +* PUSHW = PATH ...FOpen) *\-------------------------------------- -K.SaveFile jsr K.FOPEN +K.SaveFile jsr K.FOpen bcs .9 sta K.LoadFile.hFile >PUSHB K.LoadFile.hFile - jsr K.FWRITE + jsr K.FWrite bcs .99 jsr .99 diff --git a/SYS/KERNEL.S.GP.txt b/SYS/KERNEL.S.GP.txt index 367d3d2f..390a0c19 100644 --- a/SYS/KERNEL.S.GP.txt +++ b/SYS/KERNEL.S.GP.txt @@ -128,10 +128,19 @@ A2osX.BLKCALL1 >STYA .2+1 setup device entry point $Cnxx *-------------------------------------- * Smartport Call *-------------------------------------- -A2osX.PRTCALL1 - - clc +A2osX.PRTCALL1 >STYA .1+1 + txa + lsr + sta .2 + tax + lda A2osX.PRTCALL.Cnt,x + sta PRTCALL.PARAMS +.1 jsr $ffff +.2 .BS 1 CMD + .DA PRTCALL.PARAMS rts +A2osX.PRTCALL.Cnt + .HS 03030301030101010404 *-------------------------------------- GO.ProDOS lda $D000 We re coming from AUXLC, saving bank... sta GO.A2osX.BNK+1 diff --git a/SYS/KERNEL.S.INIT2.txt b/SYS/KERNEL.S.INIT2.txt index f7d004b6..d2cfc7fc 100644 --- a/SYS/KERNEL.S.INIT2.txt +++ b/SYS/KERNEL.S.INIT2.txt @@ -11,11 +11,11 @@ Kernel.Init2 sei jsr PrintCStrAX >LDYAI A2osX.GP - >STYA ZPQuickPtr1 + >STYA ZPPtr1 >LDYAI A2osX.SYSCALL - >STYA ZPQuickPtr2 + >STYA ZPPtr2 >LDYAI A2osX.GP.SIZE^$FFFF - >STYA ZPQuickPtr3 + >STYA ZPPtr3 jsr Kernel.Move sta CLRALTZP @@ -29,11 +29,11 @@ Kernel.Init2 sei lda RRAMWRAMBNK2 >LDYAI A2osX.D002 - >STYA ZPQuickPtr1 + >STYA ZPPtr1 >LDYAI $D000 - >STYA ZPQuickPtr2 + >STYA ZPPtr2 >LDYAI A2osX.D002.SIZE^$FFFF - >STYA ZPQuickPtr3 + >STYA ZPPtr3 jsr Kernel.Move sta CLRALTZP @@ -47,11 +47,11 @@ Kernel.Init2 sei lda RRAMWRAMBNK1 >LDYAI A2osX.D001 - >STYA ZPQuickPtr1 + >STYA ZPPtr1 >LDYAI $D000 - >STYA ZPQuickPtr2 + >STYA ZPPtr2 >LDYAI A2osX.D001.SIZE^$FFFF - >STYA ZPQuickPtr3 + >STYA ZPPtr3 jsr Kernel.Move sta CLRALTZP @@ -65,11 +65,11 @@ Kernel.Init2 sei lda RRAMWRAMBNK1 >LDYAI A2osX.E000 - >STYA ZPQuickPtr1 + >STYA ZPPtr1 >LDYAI $E000 - >STYA ZPQuickPtr2 + >STYA ZPPtr2 >LDYAI A2osX.E000.SIZE^$FFFF - >STYA ZPQuickPtr3 + >STYA ZPPtr3 jsr Kernel.Move >LDYAI D.STACK.TOP @@ -239,15 +239,15 @@ DetectZ80 ldx #Z80Code.Size dex bne .1 - stz ZPQuickPtr1 + stz ZPPtr1 lda #$C1 - sta ZPQuickPtr1+1 + sta ZPPtr1+1 -.2 sta (ZPQuickPtr1) +.2 sta (ZPPtr1) lda $100D bmi .8 - inc ZPQuickPtr1+1 - lda ZPQuickPtr1+1 + inc ZPPtr1+1 + lda ZPPtr1+1 cmp #$C8 beq .9 CS clc @@ -255,7 +255,7 @@ DetectZ80 ldx #Z80Code.Size sta $100A bra .2 -.8 lda ZPQuickPtr1+1 +.8 lda ZPPtr1+1 and #$0F clc .9 rts @@ -289,18 +289,18 @@ MSG.Z80.OK >CSTR "Detected In Slot %d.\n" MSG.Z80.KO >CSTR "Not Detected.\n" *-------------------------------------- Kernel.Move ldy #0 -.1 inc ZPQuickPtr3 +.1 inc ZPPtr3 bne .2 - inc ZPQuickPtr3+1 + inc ZPPtr3+1 beq .9 -.2 lda (ZPQuickPtr1),y - sta (ZPQuickPtr2),y +.2 lda (ZPPtr1),y + sta (ZPPtr2),y iny bne .1 - inc ZPQuickPtr1+1 - inc ZPQuickPtr2+1 + inc ZPPtr1+1 + inc ZPPtr2+1 bne .1 .9 rts MAN diff --git a/SYS/KERNEL.S.INIT3.txt b/SYS/KERNEL.S.INIT3.txt index 3aa38f3d..2c6dd661 100644 --- a/SYS/KERNEL.S.INIT3.txt +++ b/SYS/KERNEL.S.INIT3.txt @@ -5,52 +5,36 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -Kernel.Init3 ldx #S.DEV*DevMgr.Count - -.1 lda DevMgr.NUL-1,x - sta DevMgr.Table-1,x - dex - bne .1 - - stz DevMgr.Table+S.DEV*DevMgr.Count +Kernel.Init3 jsr MemMgrInit + jsr PS0Init + bcs * - lda #1 SYS device - >SYSCALL GetDevByIDA - >STYA pDev - ldx #DEVMGR.OPEN - jsr pDevJmp - >LDYAI MSG.Init3 >SYSCALL CPrintFYA >LDYAI MSG.IRQ >SYSCALL CPrintFYA - jsr K.IrqMgrInit - bcs * - - >LDYAI MSG.MEM - >SYSCALL CPrintFYA - jsr K.MemMgrInit +* jsr IrqMgrInit bcs * >LDYAI MSG.DEV >SYSCALL CPrintFYA - jsr K.DevMgrInit + jsr DevMgrInit bcs * >LDYAI MSG.EVT >SYSCALL CPrintFYA - jsr K.EvtMgrInit + jsr EvtMgrInit bcs * >LDYAI MSG.FLT >SYSCALL CPrintFYA - jsr K.FltMgrInit + jsr FltMgrInit bcs * >LDYAI MSG.TSK >SYSCALL CPrintFYA - jsr K.TskMgrInit + jsr TskMgrInit bcs * ldy #S.PS.hPREFIX @@ -80,6 +64,7 @@ Kernel.Init3 ldx #S.DEV*DevMgr.Count >STYA pPs >DEBUGOA + bit RRAMWRAMBNK2 bit RRAMWRAMBNK2 jmp K.KernelRun @@ -89,23 +74,71 @@ Kernel.Init3 ldx #S.DEV*DevMgr.Count >SYSCALL CPrintFYA bra * No need to discard Expanded CMDLINE *-------------------------------------- -DevMgr.NUL cld - jmp (DevMgr.NUL.Code,x) - .DA #0 DevID=0 - .DA #S.DEV.F.INUSE+S.DEV.F.SHARE+S.DEV.F.COUT+S.DEV.F.CHAR - >PSTR "NUL" NAME - .HS 00 NAME must Be 5 bytes long - .HS 00 - .HS 00.00.00.00 +MemMgrInit >LDYAI MemMgr.MHiMem + >STYA MemMgr.HiMem + >STYA MemMgr.Free + >LDYAI MemMgr.MLoMem + >STYA MemMgr.LoMem + stz MemMgr.LastSlot Reserve Slot #0 + + sta SETWRITEAUX + + >LDYAI MemMgr.XHiMem + >STYA MemMgr.HiMem + >STYA MemMgr.Free + >LDYAI MemMgr.XLoMem + >STYA MemMgr.LoMem + stz MemMgr.LastSlot Reserve Slot #0 + + sta CLRWRITEAUX + + rts *-------------------------------------- -DevMgr.SYS cld - jmp (DevMgr.SYS.Code,x) - .DA #1 DevID=1 - .DA #S.DEV.F.INUSE+S.DEV.F.EVENT+S.DEV.F.SHARE+S.DEV.F.COUT+S.DEV.F.CHAR - >PSTR "SYS" NAME - .HS 00 NAME must Be 5 bytes long - .HS 00 - .HS 00.00.00.00 +PS0Init ldx #S.DEV*2 NUL,SYS + +.1 lda DevMgr.NUL-1,x + sta DevMgr.Table-1,x + dex + bne .1 + + lda #2 + sta DevMgr.Count + + >LDYAI TskMgr.Table Select Process 0 (Kernel) + >STYA pPs + + ldy #S.PS-1 + lda #0 + +.2 sta (pPs),y Blank PS0 + dey + bpl .2 + + >LDYAI DEV.SYS + >SYSCALL MkNodYA + bcs .9 + + ldy #S.PS.hStdIn + sta (pPs),y + ldy #S.PS.hStdOut + sta (pPs),y + ldy #S.PS.hStdErr + sta (pPs),y + + clc +.9 rts +*-------------------------------------- +DevMgr.NUL .DA DevMgr.NUL.Code + .DA #S.DEV.S.WRITE+S.DEV.S.READ+S.DEV.S.OPENED + .DA #3 + .AS "NUL" NAME + .HS 00 NAME must Be 4 bytes long +*-------------------------------------- +DevMgr.SYS .DA DevMgr.SYS.Code + .DA #S.DEV.S.WRITE+S.DEV.S.READ+3 + .DA #3 + .AS "SYS" NAME + .HS 00 NAME must Be 4 bytes long *-------------------------------------- * Setup MainLC ($3FE) * @@ -113,7 +146,7 @@ DevMgr.SYS cld * Setup AuxLC $FFFE->Kernel IRQ Handler * if irq not handled, jmp (S.IrqMgrOldFFFE) *-------------------------------------- -K.IrqMgrInit php +IrqMgrInit php sei >LDYA $FFFE cpy #K.IrqHandlerAuxLC @@ -134,83 +167,140 @@ K.IrqMgrInit php clc rts *-------------------------------------- -K.MemMgrInit >LDYAI MemMgr.MHiMem - >STYA MemMgr.HiMem - >STYA MemMgr.Free - >LDYAI MemMgr.MLoMem - >STYA MemMgr.LoMem - stz MemMgr.LastSlot Reserve Slot #0 - - sta SETWRITEAUX - - >LDYAI MemMgr.XHiMem - >STYA MemMgr.HiMem - >STYA MemMgr.Free - >LDYAI MemMgr.XLoMem - >STYA MemMgr.LoMem - stz MemMgr.LastSlot Reserve Slot #0 - - sta CLRWRITEAUX - - clc - rts -*-------------------------------------- -K.DevMgrInit stz ZPQuickPtr1 +DevMgrInit stz ZPPtr1 lda #$C1 - sta ZPQuickPtr1+1 + sta ZPPtr1+1 + lda #'1' + sta SP.DEV+5 S1Dy .1 ldx #SmartPort.SIG-SmartPort.OFS-1 .2 ldy SmartPort.OFS,x Check if there is a smartport firmware - lda (ZPQuickPtr1),y + lda (ZPPtr1),y cmp SmartPort.SIG,x bne .3 not a smartport... dex bpl .2 *SmartPort!!! - jsr K.DevMgrInit.AddDev - - + jsr DevMgrInit.SP bra .7 - * Disk II, or Block device ? .3 dex if x=0, only first SIG byte failed bpl .8 ldy #$ff - lda (ZPQuickPtr1),y - beq .4 $0, Disk II, 16sect + lda (ZPPtr1),y + bne .4 $0, Disk II, 16sect - inc - beq .8 $ff, Disk II, 13sect + jsr DevMgrInit.DII + bra .7 + +.4 inc + beq .7 $ff, Disk II, 13sect, ignore dec - -.4 +* Block device + jsr DevMgrInit.BLK -.7 lda ZPQuickPtr1+1 +.7 lda ZPPtr1+1 and #$0f tax lda #$80 sta A2osX.SLOTS,x -.8 inc ZPQuickPtr1+1 - lda ZPQuickPtr1+1 +.8 inc SP.DEV+5 + inc ZPPtr1+1 + lda ZPPtr1+1 cmp #$C8 bne .1 clc rts *-------------------------------------- -K.DevMgrInit.AddCtrl +DevMgrInit.SP ldy #$ff + lda (ZPPtr1),y + clc + adc #3 Compute smartport entry point + sta .1+1 + sta .3+1 + sta SP.DEV+S.DEV.JMP + lda ZPPtr1+1 + sta .1+2 + sta .3+2 + sta SP.DEV+S.DEV.JMP+1 + +.1 jsr $ffff Self Modified + .DA #0 Status + .DA SP.CTRL.STATUS + bcs .9 + lda SP.STATUS1 + beq .9 no device + +.2 lda #1 + sta SP.DEV.STATUS+1 + lda #'1' + sta SP.DEV+7 SxD1 + +.3 jsr $ffff Self Modified + .DA #0 Status + .DA SP.DEV.STATUS + bcs .7 + lda SP.STATUS2+S.DEVSTAT.S + sta SP.DEV+S.DEV.S + + + + + + +.7 inc SP.DEV+7 + dec SP.STATUS1 + bne .3 + +.9 rts +*-------------------------------------- +DevMgrInit.DII rts *-------------------------------------- -K.DevMgrInit.AddDev +DevMgrInit.BLK + rts +*-------------------------------------- +DevMgrInit.AddDev + lda DevMgr.Count + inc DevMgr.Count + jsr K.GetDevByIDA + >STYA ZPPtr1 rts *-------------------------------------- SmartPort.OFS .HS 07010305 SmartPort.SIG .HS 00200003 *-------------------------------------- -K.EvtMgrInit +SP.CTRL.STATUS .DA #3 + .DA #0 + .DA SP.STATUS1 + .DA #0 return S only +SP.DEV.STATUS .DA #3 + .BS 1 + .DA SP.STATUS2 + .DA #3 return DIB +SP.STATUS1 .BS 4 +SP.STATUS2 .BS S.DEVSTAT +*-------------------------------------- +SP.DEV .BS 2 JMP + .BS 1 S + >PSTR "S1D1" 5 bytes +*-------------------------------------- +SP.DRV cld + ldy #7 + lda (pDev),y + and #$f + sta PRTCALL.PARAMS+1 dev +SP.DRV.lo ldy #$ff +SP.DRV.hi lda #$ff + jmp A2osX.PRTCALL +*-------------------------------------- +BLK.DRV +*-------------------------------------- +EvtMgrInit * lda #10 * sta EVTMGR.10TH.CNT WARNING!!!! WRONG BANK!!! @@ -230,50 +320,35 @@ K.EvtMgrInit clc rts *-------------------------------------- -K.FltMgrInit stz FltMgr.Table +FltMgrInit stz FltMgr.Table clc rts *-------------------------------------- -K.TskMgrInit stz TSKMGR.LASTID - lda #1 - sta TSKMGR.SIZE One Slot Busy (Kernel PS=0) - - >LDYAI TskMgr.Table Clear whole process table - >STYA pPs +TskMgrInit >LDYAI TskMgr.Table+S.PS Clear whole process table except PS0 + >STYA .2+1 - ldx #K.PS.MAX + ldx #K.PS.MAX-1 .1 lda #0 ldy #S.PS-1 -.2 sta (pPs),y +.2 sta $ffff,y Self Modified dey bpl .2 - lda pPs + lda .2+1 clc adc #S.PS - sta pPs + sta .2+1 bcc .3 - inc pPs+1 + inc .2+2 .3 dex bne .1 - >LDYAI TskMgr.Table Select Process 0 (Kernel) - >STYA pPs - - lda #1 - ldy #S.PS.hINDEV - sta (pPs),y Make In DEV = SYS - ldy #S.PS.hOUTDEV - sta (pPs),y Make OUT DEV = SYS - ldy #S.PS.hERRDEV - sta (pPs),y Make ERR DEV = SYS - >PUSHWI K.ENV.SIZE get a buffer for ENV >PUSHBI S.MEM.F.INIT0 make sure blank - >SYSCALL GetMem create it... + >SYSCALL GetMem create it... bcs .9 txa @@ -293,7 +368,7 @@ K.TskMgrInit stz TSKMGR.LASTID ldy #S.PS.hPREFIX sta (pPs),y - >PUSHWI UsrBuf256 push ENV value + >PUSHWI UsrBuf256 push ENV value >PUSHWI I.ENV.A2osX push ENV name >SYSCALL SetEnv bcs .9 @@ -310,6 +385,7 @@ K.TskMgrInit stz TSKMGR.LASTID >SYSCALL PutEnvYA .9 rts *-------------------------------------- +DEV.SYS >PSTR "SYS" I.ENV.A2osX >PSTR "A2OSX" I.ENV.PATH >PSTR "PATH=${A2OSX}SBIN/;${A2OSX}BIN/" I.ENV.LIB >PSTR "LIB=${A2OSX}LIB/" @@ -318,7 +394,6 @@ STARTUP.CMDLINE >PSTR "${A2OSX}SBIN/SHELL ${A2OSX}A2osX.STARTUP" *-------------------------------------- MSG.Init3 >CSTR "A2osX[Stage3]:Init\n" MSG.IRQ >CSTR "-Interrupt Manager...\n" -MSG.MEM >CSTR "-Memory Manager...\n" MSG.DEV >CSTR "-Device Manager...\n" MSG.EVT >CSTR "-Event Manager...\n" MSG.FLT >CSTR "-Path Filter...\n" diff --git a/SYS/KERNEL.S.IRQ.txt b/SYS/KERNEL.S.IRQ.txt index 505e8a0b..c25ede25 100644 --- a/SYS/KERNEL.S.IRQ.txt +++ b/SYS/KERNEL.S.IRQ.txt @@ -74,7 +74,7 @@ K.IrqHandlerAuxLC bcs .82 rti -K.IrqHandlerJMP ldx #DEVMGR.IRQ +K.IrqHandlerJMP ldx #DEVMGR.READ jmp ($fe) *-------------------------------------- K.IrqMgrOldFFFE .BS 2 diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index 61b5d71d..a610d622 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -29,27 +29,27 @@ KERNEL.SYSCALL .DA K.PTime2Time .DA 0 *-------------------------------------- - .DA K.FOPEN $20 + .DA K.FOpen $20 .DA K.FCloseA - .DA K.FREAD - .DA K.FWRITE - .DA K.FFLUSHA - .DA K.FSEEK - .DA K.FTELLA + .DA K.FRead + .DA K.FWrite + .DA K.FFlushA + .DA K.FSeek + .DA K.FTellA .DA K.FEOFA *-------------------------------------- - .DA K.REMOVEYA $30 - .DA K.RENAME + .DA K.RemoveYA $30 + .DA K.Rename .DA K.STAT .DA 0 - .DA K.OPENDIRYA + .DA K.OpenDirYA .DA K.ReadDirA .DA K.CloseDirA .DA K.MKDirYA *-------------------------------------- * Bank 2 *-------------------------------------- - .DA K.COutA $40 + .DA 0 $40 .DA K.SScanF .DA K.PPrintFYA .DA K.CPrintFYA @@ -87,11 +87,11 @@ KERNEL.SYSCALL *-------------------------------------- .DA K.GetDevByIDA $80 .DA K.GetDevByNameYA - .DA K.GetDevInfoA - .DA 0 - .DA 0 - .DA 0 + .DA K.GetDevStatusA .DA 0 + .DA K.MKNodYA + .DA K.MKNodA + .DA K.MKFIFO .DA 0 *-------------------------------------- * $E000 @@ -101,12 +101,27 @@ KERNEL.SYSCALL .DA K.GetMemPtrA .DA K.GetMemByIDA .DA 0 - .DA K.LoadStockObjectYA - .DA K.GetStockObjectA - .DA K.FreeStockObject + .DA K.LoadStkObjYA + .DA K.GetStkObjA + .DA K.FreeStkObjA *-------------------------------------- .DA K.SetLoMem $A0 .DA K.GetMemStatYA + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA K.FPutCAY + .DA K.PutCA + .DA K.FGetCA + .DA K.GetC + .DA K.FPutS + .DA K.PutSYA + .DA K.FGetS + .DA K.GetSYA *-------------------------------------- * LO Byte : * #RRAMWRAMBNK1 or #RRAMWRAMBNK2 @@ -286,11 +301,25 @@ KERNEL.SYSCALL.FLAGS .DA 0 .DA 0 .DA 0 - +*-------------------------------------- .DA 0 $A0 .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA 0 $B0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 *-------------------------------------- - MAN SAVE SYS/KERNEL.S.JMP LOAD SYS/KERNEL.S diff --git a/SYS/KERNEL.S.LIB.txt b/SYS/KERNEL.S.LIB.txt index 8be5af09..19537003 100644 --- a/SYS/KERNEL.S.LIB.txt +++ b/SYS/KERNEL.S.LIB.txt @@ -66,22 +66,22 @@ K.LoadLib.hMem .BS 1 *-------------------------------------- K.UnloadLibA pha jsr K.GetMemByIDA - >STYA ZPQuickPtr1 + >STYA ZPPtr1 ldy #S.MEM.REFCNT - lda (ZPQuickPtr1),y Get count of those referencing this lib + lda (ZPPtr1),y Get count of those referencing this lib dec only one left ? beq .1 - sta (ZPQuickPtr1),y + sta (ZPPtr1),y pla clc rts .1 ldy #S.MEM.PTR - lda (ZPQuickPtr1),y + lda (ZPPtr1),y sta pLib iny - lda (ZPQuickPtr1),y + lda (ZPPtr1),y sta pLib+1 ldx #LIBMGR.UNLOAD diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index 0f3cb940..047f53ec 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -5,7 +5,7 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -* !!!!!! DO NOT USE ZPQuickPTRs !!!!! +* !!!!!! DO NOT USE ZPPtrs !!!!! *-------------------------------------- ZPMemMgrSPtr .EQ ZPMEMMGR Pointer To Slot selected ZPMemMgrTmp1 .EQ ZPMEMMGR+2 @@ -307,7 +307,7 @@ K.FreeMemA phy bit RRAMWRAMBNK2 jsr PS.Select0 - jsr DevMgr.SYS.Select + jsr DevMgr.SYS.Control pla Get PC and sub 2 for calling address sec @@ -394,11 +394,11 @@ K.GetMemByIDA sta ZPMemMgrSPtr * sta ZPMemMgrSPtr+1 * rts *-------------------------------------- -K.LoadStockObjectYA +K.LoadStkObjYA *-------------------------------------- -K.GetStockObjectA +K.GetStkObjA *-------------------------------------- -K.FreeStockObject +K.FreeStkObjA *-------------------------------------- K.SetLoMem clc diff --git a/SYS/KERNEL.S.PFT.txt b/SYS/KERNEL.S.PFT.txt index 546e620d..27583d5f 100644 --- a/SYS/KERNEL.S.PFT.txt +++ b/SYS/KERNEL.S.PFT.txt @@ -34,49 +34,49 @@ PFT.CheckPathSTK ply PFT.CheckPathYA stx S.PFT.SYSCALL save #SYSCALL - >STYA ZPQuickPtr1 + >STYA ZPPtr1 >LDYAI FltMgr.Table - >STYA ZPQuickPtr2 + >STYA ZPPtr2 -.1 lda (ZPQuickPtr2) Get Filter Len +.1 lda (ZPPtr2) Get Filter Len beq .9 End Of Table, Exit tay - lda (ZPQuickPtr1),y is there a "/" at this point in SRC path? + lda (ZPPtr1),y is there a "/" at this point in SRC path? cmp #'/' bne .8 -.2 lda (ZPQuickPtr1),y - cmp (ZPQuickPtr2),y +.2 lda (ZPPtr1),y + cmp (ZPPtr2),y bne .8 dey bne .2 ldy #S.PFT.HANDLER - lda (ZPQuickPtr2),y get hLib + lda (ZPPtr2),y get hLib jsr K.GetMemPtrA >STYA .3+1 lda S.PFT.SYSCALL getback #SYSCALL sec - sbc #SYS.FOPEN-4 0=Lib.load, 2=Lib.Unload + sbc #SYS.FOpen-4 0=Lib.load, 2=Lib.Unload tax pla discard JSR return @ pla - >LDYA ZPQuickPtr1 restore passed params + >LDYA ZPPtr1 restore passed params .3 jmp $ffff -.8 lda ZPQuickPtr2 +.8 lda ZPPtr2 clc - adc (ZPQuickPtr2) Add STR len + adc (ZPPtr2) Add STR len adc #S.PFT - sta ZPQuickPtr2 + sta ZPPtr2 bcc .1 -.9 >LDYA ZPQuickPtr1 restore passed params +.9 >LDYA ZPPtr1 restore passed params ldx S.PFT.SYSCALL rts *-------------------------------------- @@ -90,8 +90,8 @@ PFT.CheckNodeSTK PFT.CheckNodeA stx S.PFT.SYSCALL save #SYSCALL sta S.PFT.hFILE jsr K.GetMemPtrA X = unmidified - >STYA ZPQuickPtr1 - lda (ZPQuickPtr1) + >STYA ZPPtr1 + lda (ZPPtr1) beq .9 Handler is 0, back to kernel.... jsr K.GetMemPtrA @@ -99,7 +99,7 @@ PFT.CheckNodeA stx S.PFT.SYSCALL save #SYSCALL lda S.PFT.SYSCALL getback #SYSCALL sec - sbc #SYS.FOPEN-4 0=Lib.load, 2=Lib.Unload + sbc #SYS.FOpen-4 0=Lib.load, 2=Lib.Unload tax pla discard JSR return @ diff --git a/SYS/KERNEL.S.PS.txt b/SYS/KERNEL.S.PS.txt index 072eea53..c812f561 100644 --- a/SYS/KERNEL.S.PS.txt +++ b/SYS/KERNEL.S.PS.txt @@ -30,24 +30,23 @@ K.CreateProcessYA jsr PS.CreateChild bcs .9 - sta K.CreateProcess.CPSID + sta .8+1 jsr PS.Init bcc .8 pha save error code - lda K.CreateProcess.CPSID + lda .8+1 jsr PS.FreeA pla get back error code sec rts -.8 lda K.CreateProcess.CPSID +.8 lda #$ff self modified .9 rts *-------------------------------------- K.CreateProcess.Flags .BS 1 K.CreateProcess.CmdLine .BS 2 -K.CreateProcess.CPSID .BS 1 */-------------------------------------- * #GetPSByIDA * ##In : @@ -57,7 +56,7 @@ K.CreateProcess.CPSID .BS 1 *\-------------------------------------- K.GetPSByIDA pha >LDYAI TskMgr.Table - >STYA ZPQuickPtr1 + >STYA ZPPtr1 pla beq .8 @@ -65,29 +64,29 @@ K.GetPSByIDA pha ldx #0 .1 inx - lda ZPQuickPtr1 + lda ZPPtr1 clc adc #S.PS - sta ZPQuickPtr1 + sta ZPPtr1 bcc .2 - inc ZPQuickPtr1+1 + inc ZPPtr1+1 -.2 lda (ZPQuickPtr1) +.2 lda (ZPPtr1) bpl .3 ldy #S.PS.PID - lda (ZPQuickPtr1),y + lda (ZPPtr1),y .20 cmp #$ff Self Modified beq .8 -.3 cpx TSKMGR.SIZE +.3 cpx TskMgr.Count bne .1 .9 lda #TSKMGR.ERRNSP sec rts -.8 >LDYA ZPQuickPtr1 +.8 >LDYA ZPPtr1 clc rts */-------------------------------------- @@ -118,26 +117,26 @@ K.Sleep pla get PC LO * in : * out : * A = PSID -* we cannot use ZPQuickPtrs1 & 2 +* we cannot use ZPPtrs1 & 2 * because of calling K.NewPStrYA & S.DupEnvA *-------------------------------------- PS.CreateChild >LDYAI TskMgr.Table+S.PS - >STYA ZPQuickPtr3 + >STYA ZPPtr3 ldx #0 .1 inx - cpx TSKMGR.SIZE + cpx TskMgr.Count beq .2 - lda (ZPQuickPtr3) Found an empty slot + lda (ZPPtr3) Found an empty slot bpl .3 - lda ZPQuickPtr3 + lda ZPPtr3 clc adc #S.PS - sta ZPQuickPtr3 + sta ZPPtr3 bcc .1 - inc ZPQuickPtr3+1 + inc ZPPtr3+1 bra .1 @@ -148,7 +147,7 @@ PS.CreateChild >LDYAI TskMgr.Table+S.PS sec rts -.3 inc TSKMGR.SIZE +.3 inc TskMgr.Count .4 inc TSKMGR.LASTID Get a PSID not alredy running beq .4 not = 0 @@ -158,12 +157,12 @@ PS.CreateChild >LDYAI TskMgr.Table+S.PS ldy #S.PS.PID lda TSKMGR.LASTID - sta (ZPQuickPtr3),y + sta (ZPPtr3),y lda #0 ldy #S.PS.hCS -.5 sta (ZPQuickPtr3),y Blank Everything in this S.PS +.5 sta (ZPPtr3),y Blank Everything in this S.PS iny cpy #S.PS bne .5 @@ -172,7 +171,7 @@ PS.CreateChild >LDYAI TskMgr.Table+S.PS bit K.CreateProcess.Flags need to create ENV & Prefix ? beq .6 no... - sta (ZPQuickPtr3) Mark this PS with ENV flag + sta (ZPPtr3) Mark this PS with ENV flag ldy #S.PS.hPREFIX copy hPREFIX... lda (pPs),y @@ -182,7 +181,7 @@ PS.CreateChild >LDYAI TskMgr.Table+S.PS txa ldy #S.PS.hPREFIX - sta (ZPQuickPtr3),y + sta (ZPPtr3),y ldy #S.PS.hENV ...and hENV from parent PS lda (pPs),y @@ -190,34 +189,30 @@ PS.CreateChild >LDYAI TskMgr.Table+S.PS bcs .9 ldy #S.PS.hENV - sta (ZPQuickPtr3),y + sta (ZPPtr3),y bra .8 .6 ldy #S.PS.hPREFIX reuse same hPREFIX... lda (pPs),y - sta (ZPQuickPtr3),y + sta (ZPPtr3),y ldy #S.PS.hENV ...and hENV from parent PS lda (pPs),y - sta (ZPQuickPtr3),y + sta (ZPPtr3),y -.8 ldy #S.PS.hINDEV +.8 ldy #S.PS.hStdIn .81 lda (pPs),y - sta (ZPQuickPtr3),y + sta (ZPPtr3),y iny - cpy #S.PS.hERRDEV+1 + cpy #S.PS.hStdErr+1 bne .81 ldy #S.PS.PID lda (pPs),y ldy #S.PS.PPID - sta (ZPQuickPtr3),y - - ldy #S.PS.CPID - lda TSKMGR.LASTID - sta (pPs),y + sta (ZPPtr3),y lda #S.PS.F.HOLD bit K.CreateProcess.Flags @@ -227,9 +222,13 @@ PS.CreateChild >LDYAI TskMgr.Table+S.PS sta (pPs) HOLD parent PS if ExecProcess .82 lda #S.PS.F.INUSE+S.PS.F.INIT - ora (ZPQuickPtr3) - sta (ZPQuickPtr3) Make this PS Init.... + ora (ZPPtr3) + sta (ZPPtr3) Make this PS Init.... + + ldy #S.PS.CPID lda TSKMGR.LASTID + sta (pPs),y + clc Exit with A=PSID .9 rts *-------------------------------------- @@ -242,27 +241,27 @@ PS.Init >LDYA K.CreateProcess.CmdLine txa ldy #S.PS.hCMDLINE - sta (ZPQuickPtr3),y + sta (ZPPtr3),y pla Restore PTR... ply - >SYSCALL LoadExeYA Y,A=filename full path + >SYSCALL LoadExeYA Y,A=filename full path bcs .9 - >STYA ZPQuickPtr4 save PTR to Code Segment + >STYA ZPPtr4 save PTR to Code Segment txa ldy #S.PS.hCS - sta (ZPQuickPtr3),y save CS hMem in TSKSLOT + sta (ZPPtr3),y save CS hMem in TSKSLOT ldy #H.BIN.EXE.DS.SIZE+1 - lda (ZPQuickPtr4),y Load DS.SIZE HI + lda (ZPPtr4),y Load DS.SIZE HI tax dey - ora (ZPQuickPtr4),y + ora (ZPPtr4),y beq .2 DS.SIZE=0... - lda (ZPQuickPtr4),y + lda (ZPPtr4),y >PUSHAX Push DS.SIZE >PUSHBI S.MEM.F.INIT0 Clear DS jsr K.GetMem @@ -270,7 +269,7 @@ PS.Init >LDYA K.CreateProcess.CmdLine txa ldy #S.PS.hDS - sta (ZPQuickPtr3),y save DS hMem in TSKSLOT + sta (ZPPtr3),y save DS hMem in TSKSLOT .2 @@ -280,48 +279,35 @@ PS.Init >LDYA K.CreateProcess.CmdLine * PS.FreeA * In : A = PID to free *-------------------------------------- -PS.FreeA jsr K.GetPSByIDA - bcs * -* >STYA ZPQuickPtr1 Already in ZPQuickPtr1 +PS.FreeA jsr K.GetPSByIDA PS in ZPPtr1 ldy #S.PS.hCMDLINE - lda (ZPQuickPtr1),y - beq .2 - - jsr K.FreeMemA + jsr PS.FreeA.PsY - lda (ZPQuickPtr1) get S.PS.F + lda (ZPPtr1) get S.PS.F and #S.PS.F.ENV do we have to discard duplicated env & prefix ? - beq .4 + beq .1 -.2 ldy #S.PS.hENV - lda (ZPQuickPtr1),y - beq .3 + ldy #S.PS.hENV + jsr PS.FreeA.PsY - jsr K.FreeMemA + ldy #S.PS.hPREFIX + jsr PS.FreeA.PsY -.3 ldy #S.PS.hPREFIX - lda (ZPQuickPtr1),y - beq .4 +.1 ldy #S.PS.hDS + jsr PS.FreeA.PsY - jsr K.FreeMemA + ldy #S.PS.hCS + jsr PS.FreeA.PsY -.4 ldy #S.PS.hDS - lda (ZPQuickPtr1),y - beq .5 - - jsr K.FreeMemA - -.5 ldy #S.PS.hCS - lda (ZPQuickPtr1),y - beq .8 - - jsr K.FreeMemA - -.8 lda #0 - sta (ZPQuickPtr1) Mark TSKSLOT as free + lda #0 + sta (ZPPtr1) Mark TSKSLOT as free clc - rts +PS.FreeA.RTS rts +*-------------------------------------- +PS.FreeA.PsY lda (ZPPtr1),y + beq PS.FreeA.RTS + jmp K.FreeMemA *-------------------------------------- * PS.SelectA * In : A=PSID @@ -345,7 +331,7 @@ PS.Select ldy #S.PS.hCS jsr K.GetMemPtrA >STYA pData -.1 ldy #S.PS.hOUTDEV +.1 ldy #S.PS.hStdOut lda (pPs),y beq .8 @@ -362,23 +348,23 @@ PS.Select ldy #S.PS.hCS * A = hMem to new ENV *-------------------------------------- PS.DupEnvA jsr K.GetMemPtrA - >STYA ZPQuickPtr1 + >STYA ZPPtr1 >PUSHWI K.ENV.SIZE >PUSHBI 0 jsr K.GetMem bcs .9 - >STYA ZPQuickPtr2 + >STYA ZPPtr2 ldy #0 -.1 lda (ZPQuickPtr1),y - sta (ZPQuickPtr2),y +.1 lda (ZPPtr1),y + sta (ZPPtr2),y beq .8 iny bne .1 - inc ZPQuickPtr1+1 - inc ZPQuickPtr2+1 + inc ZPPtr1+1 + inc ZPPtr2+1 bra .1 .8 txa diff --git a/SYS/KERNEL.S.RUN.txt b/SYS/KERNEL.S.RUN.txt index 68cee14a..5f387437 100644 --- a/SYS/KERNEL.S.RUN.txt +++ b/SYS/KERNEL.S.RUN.txt @@ -6,10 +6,10 @@ AUTO 6 .LIST OFF *-------------------------------------- K.KernelRun jsr TSK.TskMgrRun - bcs .9 + bcs * jsr EVT.GetEvents - bcs K.KernelRun CS=no event + bcs .4 CS=no event jsr TSK.DispatchEvents bcc .4 CC=All Events Dispatched @@ -45,8 +45,8 @@ K.KernelRun jsr TSK.TskMgrRun .4 bit OPENAPPLE bpl K.KernelRun - lda KBD inc A2osX.RANDOM16 + lda KBD sta A2osX.RANDOM16+1 bpl K.KernelRun @@ -72,16 +72,22 @@ K.KernelRun jsr TSK.TskMgrRun stx A2osX.ASCREEN >STYA pDev - ldx #DEVMGR.SELECT - jsr pDevJmp - bra K.KernelRun + lda (pDev) + sta .5+1 + ldy #1 + lda (pDev),y + sta .5+2 + ldx #DEVMGR.CONTROL + jsr .5 + jmp K.KernelRun +.5 jmp $ffff *-------------------------------------- -.9 jsr DevMgr.SYS.Select +.9 jsr DevMgr.SYS.Control >LDYAI MSG.KRNLPANIC jsr K.CPrintFYA bra * *-------------------------------------- -MSG.DumpEvent >CSTR "!Unhandled Evt:F=%b,DevID=$%h,DATALO=$%h,DATAHI=$%h,W1=$%H,W2=$%H\n" +MSG.DumpEvent >CSTR "!Evt:F=%b,Dev=$%h,LO=$%h,HI=$%h,W1=$%H,W2=$%H\n" MSG.KRNLPANIC >CSTR "\n!!!Kernel Panic!!!\n" *-------------------------------------- MAN diff --git a/SYS/KERNEL.S.STR.txt b/SYS/KERNEL.S.STR.txt index 647f627b..989d9650 100644 --- a/SYS/KERNEL.S.STR.txt +++ b/SYS/KERNEL.S.STR.txt @@ -16,8 +16,8 @@ AUTO 6 * CS : error * A = SYS error code *\-------------------------------------- -K.NewPStrYA >STYA ZPQuickPtr2 - lda (ZPQuickPtr2) +K.NewPStrYA >STYA ZPPtr2 + lda (ZPPtr2) inc tay lda #0 Y,A = len of new string @@ -26,11 +26,11 @@ K.NewPStrYA >STYA ZPQuickPtr2 jsr K.GetMem bcs .9 - >STYA ZPQuickPtr1 + >STYA ZPPtr1 jsr K.PStrCpyPtr2Ptr1 - >LDYA ZPQuickPtr1 + >LDYA ZPPtr1 clc .9 rts @@ -46,13 +46,13 @@ K.NewPStrYA >STYA ZPQuickPtr2 K.PStrCpy jsr PullPtr1Ptr2 K.PStrCpyPtr2Ptr1 - lda (ZPQuickPtr2) - sta (ZPQuickPtr1) + lda (ZPPtr2) + sta (ZPPtr1) tay beq .2 -.1 lda (ZPQuickPtr2),y - sta (ZPQuickPtr1),y +.1 lda (ZPPtr2),y + sta (ZPPtr1),y dey bne .1 @@ -69,10 +69,10 @@ K.PStrCpyPtr2Ptr1 *\-------------------------------------- K.PStrCat jsr PullPtr1Ptr2 - lda (ZPQuickPtr2) + lda (ZPPtr2) tax - lda (ZPQuickPtr1) + lda (ZPPtr1) tay .1 cpy #255 @@ -80,17 +80,17 @@ K.PStrCat jsr PullPtr1Ptr2 iny - inc ZPQuickPtr2 + inc ZPPtr2 bne .2 - inc ZPQuickPtr1+1 + inc ZPPtr1+1 -.2 lda (ZPQuickPtr2) - sta (ZPQuickPtr1),y +.2 lda (ZPPtr2) + sta (ZPPtr1),y dex bne .1 .8 tya - sta (ZPQuickPtr1) + sta (ZPPtr1) clc rts */-------------------------------------- @@ -105,59 +105,59 @@ K.PStrCat jsr PullPtr1Ptr2 *\-------------------------------------- K.PStrMatch jsr PullPtr1Ptr2 - lda (ZPQuickPTR2) Keep Pattern Length in X + lda (ZPPtr2) Keep Pattern Length in X tax beq .8 Match always if empty ldy #0 -.1 inc ZPQuickPTR2 Make PTR1 advance to next char +.1 inc ZPPtr2 Make PTR1 advance to next char bne .2 - inc ZPQuickPTR2+1 + inc ZPPtr2+1 -.2 lda (ZPQuickPTR2) get pattern char +.2 lda (ZPPtr2) get pattern char cmp #'*' beq .5 .3 tya we must match ? or regular char - cmp (ZPQuickPTR1) check if at end of string + cmp (ZPPtr1) check if at end of string beq .9 yes, no char left, exit with error iny advance to next char to compare - lda (ZPQuickPTR2) get back pattern char + lda (ZPPtr2) get back pattern char cmp #'?' beq .4 no need to compare, any char will match - cmp (ZPQuickPTR1),y Regular Char, compare with string at Y + cmp (ZPPtr1),y Regular Char, compare with string at Y bne .9 no match, exit .4 dex char matched, check if end of pattern bne .1 continue if remaining char in pattern tya end of pattern, but end of string ? - cmp (ZPQuickPTR1) end of string ? + cmp (ZPPtr1) end of string ? beq .8 yes, string matched entirely bra .9 no, remaining char in string, no match .5 dex we have '*', last char of pattern ? beq .8 yes, match everything, including empty string - inc ZPQuickPTR2 Make PTR1 advance to next char + inc ZPPtr2 Make PTR1 advance to next char bne .6 - inc ZPQuickPTR2+1 + inc ZPPtr2+1 -.6 lda (ZPQuickPTR2) get next char of pattern +.6 lda (ZPPtr2) get next char of pattern cmp #'*' another '*' ? beq .5 yes, '**' = '*', go next char cmp #'?' '*?' ??? we must match a least one char beq .3 .7 tya we need at least one remaining char in string, - cmp (ZPQuickPTR1) check if at end of string + cmp (ZPPtr1) check if at end of string beq .9 no chance to match ? or regular char iny - lda (ZPQuickPTR2) get again char in pattern - cmp (ZPQuickPTR1),y compare with char in string + lda (ZPPtr2) get again char in pattern + cmp (ZPPtr1),y compare with char in string bne .7 not equal to next non wildcard in pattern bra .4 go check remaining char in pattern... @@ -178,21 +178,21 @@ K.PStrMatch jsr PullPtr1Ptr2 K.PStrUprYA ldx #0 .HS 2C bit abs K.PStrLwrYA ldx #2 - >STYA ZPQuickPtr1 + >STYA ZPPtr1 pha save Y,A to restore them at exit phy - lda (ZPQuickPtr1) + lda (ZPPtr1) tay -.1 lda (ZPQuickPtr1),y +.1 lda (ZPPtr1),y cmp K.PStrUprLwr,x bcc .2 cmp K.PStrUprLwr+1,x bcs .2 eor #$20 - sta (ZPQuickPtr1),y + sta (ZPPtr1),y .2 dey bne .1 @@ -229,12 +229,12 @@ K.PStrUprLwr .AS "azAZ" K.PStrFTime jsr PullPtr1Ptr2Ptr3 lda #0 - sta (ZPQuickPtr3) Reset target PSTR length + sta (ZPPtr3) Reset target PSTR length tay .1 iny - lda (ZPQuickPtr2),y + lda (ZPPtr2),y cmp #'%' beq .2 @@ -242,18 +242,18 @@ K.PStrFTime jsr PullPtr1Ptr2Ptr3 jsr K.PStrFTime.addChar ply .10 tya - cmp (ZPQuickPtr2) + cmp (ZPPtr2) bne .1 rts .2 tya - cmp (ZPQuickPtr2) + cmp (ZPPtr2) beq .8 iny ldx #K.PStrFTime.JMPL-K.PStrFTime.Tbl-1 -.3 lda (ZPQuickPtr2),y +.3 lda (ZPPtr2),y cmp K.PStrFTime.Tbl,x beq .4 dex @@ -307,7 +307,7 @@ K.PStrFTime.A ldx #3 Short day of week, 3 chars... K.PStrFTime.AA ldx #15 full DoW >LDYAI K.PStrFTime.DAY - >STYA ZPQuickPtr4 + >STYA ZPPtr4 ldy #S.Time.WDAY bra K.PStrFTime.STR @@ -316,31 +316,31 @@ K.PStrFTime.B ldx #3 Short Month, 3 chars.... K.PStrFTime.BB ldx #15 full Month.... >LDYAI K.PStrFTime.MON - >STYA ZPQuickPtr4 + >STYA ZPPtr4 ldy #S.Time.MONTH -K.PStrFTime.STR lda (ZPQuickPtr1),y get required S.Time field value +K.PStrFTime.STR lda (ZPPtr1),y get required S.Time field value tay beq .9 Illegal value .1 dey range 0..x beq .2 - lda (ZPQuickPtr4) + lda (ZPPtr4) sec - adc ZPQuickPtr4 - sta ZPQuickPtr4 + adc ZPPtr4 + sta ZPPtr4 bcc .1 - inc ZPQuickPtr4+1 + inc ZPPtr4+1 bra .1 .2 ldy #0 .3 iny - lda (ZPQuickPtr4),y + lda (ZPPtr4),y phy jsr K.PStrFTime.addChar pla - cmp (ZPQuickPtr4) + cmp (ZPPtr4) beq .8 tay @@ -360,7 +360,7 @@ K.PStrFTime.D ldy #S.Time.DAY K.PStrFTime.HH ldy #S.Time.HOUR bra K.PStrFTime.addDecPtr1Y K.PStrFTime.II ldy #S.Time.HOUR - lda (ZPQuickPtr1),y + lda (ZPPtr1),y cmp #12 bcc .1 sbc #12 @@ -370,7 +370,7 @@ K.PStrFTime.M ldy #S.Time.MONTH K.PStrFTime.MM ldy #S.Time.MINUTE bra K.PStrFTime.addDecPtr1Y K.PStrFTime.P ldy #S.Time.HOUR - lda (ZPQuickPtr1),y + lda (ZPPtr1),y cmp #12 bcc .1 lda #'p' @@ -388,7 +388,7 @@ K.PStrFTime.YY ldy #S.Time.CENTURY K.PStrFTime.Y ldy #S.Time.YEAR *-------------------------------------- K.PStrFTime.addDecPtr1Y - lda (ZPQuickPtr1),y + lda (ZPPtr1),y K.PStrFTime.addDecA sta K.PStrFTime.BIN stz K.PStrFTime.DEC @@ -421,12 +421,12 @@ K.PStrFTime.addDecA *-------------------------------------- K.PStrFTime.addChar pha - lda (ZPQuickPtr3) + lda (ZPPtr3) inc - sta (ZPQuickPtr3) + sta (ZPPtr3) tay pla - sta (ZPQuickPtr3),y + sta (ZPPtr3),y rts *-------------------------------------- K.PStrFTime.DAY >PSTR "Monday" @@ -465,8 +465,8 @@ K.PStrFTime.DEC .BS 1 always < 100 * A = SYS error code *\-------------------------------------- K.PStr2StrArrayYA - >STYA ZPQuickPtr1 - lda (ZPQuickPtr1) Get mem size STRLEN+1 + >STYA ZPPtr1 + lda (ZPPtr1) Get mem size STRLEN+1 ldx #0 inc bne .1 @@ -479,18 +479,18 @@ K.PStr2StrArrayYA phx save hMem phy save PTR.LO pha save PTR.HI - >STYA ZPQuickPtr2 + >STYA ZPPtr2 - lda (ZPQuickPtr1) + lda (ZPPtr1) tax count in src string beq .8 ldy #0 reset index in dst token -.3 inc ZPQuickPtr1 get... +.3 inc ZPPtr1 get... bne .4 - inc ZPQuickPtr1+1 -.4 lda (ZPQuickPtr1) ...next char + inc ZPPtr1+1 +.4 lda (ZPPtr1) ...next char cmp #' ' found a space ? bne .6 @@ -498,18 +498,18 @@ K.PStr2StrArrayYA tya in a token ? beq .7 no, skip & go to next char - sta (ZPQuickPtr2) yes, set this token len + sta (ZPPtr2) yes, set this token len sec - adc ZPQuickPtr2 advance to next token - sta ZPQuickPtr2 + adc ZPPtr2 advance to next token + sta ZPPtr2 bcc .5 - inc ZPQuickPtr2+1 + inc ZPPtr2+1 .5 ldy #0 reset index in dst token bra .7 .6 iny add char to token - sta (ZPQuickPtr2),y + sta (ZPPtr2),y .7 dex end of src string? bne .3 no...next char... @@ -517,15 +517,15 @@ K.PStr2StrArrayYA tya yes, are we in a token ? beq .8 - sta (ZPQuickPtr2) yes, set last token len + sta (ZPPtr2) yes, set last token len sec - adc ZPQuickPtr2 advance to next token - sta ZPQuickPtr2 + adc ZPPtr2 advance to next token + sta ZPPtr2 bcc .8 - inc ZPQuickPtr2+1 + inc ZPPtr2+1 .8 lda #0 - sta (ZPQuickPtr2) set Array Ending 0 + sta (ZPPtr2) set Array Ending 0 pla get back PTR.HI ply get back PTR.LO diff --git a/SYS/KERNEL.S.TIME.txt b/SYS/KERNEL.S.TIME.txt index 423acd30..2ca7ae37 100644 --- a/SYS/KERNEL.S.TIME.txt +++ b/SYS/KERNEL.S.TIME.txt @@ -18,10 +18,10 @@ DAY0 .EQ 4 day 0 was a thursday * Out : * S.TIME filled with System date/time *-------------------------------------- -K.TimeYA >STYA ZPQuickPtr2 +K.TimeYA >STYA ZPPtr2 >MLICALL MLIGETTIME >LDYAI DATELO - >STYA ZPQuickPtr1 + >STYA ZPPtr1 bra K.PTime2Time.1 *-------------------------------------- * In : @@ -31,13 +31,13 @@ K.TimeYA >STYA ZPQuickPtr2 K.PTime2Time jsr PullPtr1Ptr2 K.PTime2Time.1 ldy #1 - lda (ZPQuickPtr1),y Get Year + lda (ZPPtr1),y Get Year lsr C is high bit of month ldy #S.Time.YEAR - sta (ZPQuickPtr2),y set year + sta (ZPPtr2),y set year sta K.CTime.Year for conputing Century/WDAY later - lda (ZPQuickPtr1) Get Month/day + lda (ZPPtr1) Get Month/day pha save Day ror lsr @@ -45,12 +45,12 @@ K.PTime2Time.1 ldy #1 lsr lsr ldy #S.Time.MONTH - sta (ZPQuickPtr2),y set month + sta (ZPPtr2),y set month pla get back day and #$1F iny - sta (ZPQuickPtr2),y set day + sta (ZPPtr2),y set day lda K.CTime.Year get back year @@ -59,23 +59,23 @@ K.PTime2Time.1 ldy #1 rol get back C in bit 0 eor #1 toggle C adc #19 set date before 1970 -> 20xx - sta (ZPQuickPtr2) set Century + sta (ZPPtr2) set Century sta K.CTime.Century for conputing WDAY later ldy #2 - lda (ZPQuickPtr1),y Get Min + lda (ZPPtr1),y Get Min tax iny - lda (ZPQuickPtr1),y Get Hour + lda (ZPPtr1),y Get Hour ldy #S.Time.HOUR - sta (ZPQuickPtr2),y set hour + sta (ZPPtr2),y set hour iny txa - sta (ZPQuickPtr2),y set min + sta (ZPPtr2),y set min iny lda #0 - sta (ZPQuickPtr2),y set seconds (ProDOS does not provide it) + sta (ZPPtr2),y set seconds (ProDOS does not provide it) * 1/1/1970 was Thursday...if not leap, add one, if leap add 2 @@ -117,7 +117,7 @@ K.ComputeWDAY lda #3 Thursday : 4 (-1 for mod 7) bra .1 .4 ldy #S.Time.MONTH - lda (ZPQuickPtr2),y get month + lda (ZPPtr2),y get month tax .5 lda K.StrFTime.MDAY-1,x get day count in this month @@ -144,7 +144,7 @@ K.ComputeWDAY lda #3 Thursday : 4 (-1 for mod 7) pla ldy #S.Time.DAY - adc (ZPQuickPtr2),y get month (1..31) + adc (ZPPtr2),y get month (1..31) dec adjust range 0.31 for MOD 7 .8 cmp #7 MOD 7 @@ -154,7 +154,7 @@ K.ComputeWDAY lda #3 Thursday : 4 (-1 for mod 7) .80 inc adjust range 1..7 ldy #S.Time.WDAY - sta (ZPQuickPtr2),y + sta (ZPPtr2),y clc rts @@ -168,7 +168,7 @@ K.CTime2Time jsr PullPtr1Ptr2 ldy #3 -.1 lda (ZPQuickPtr1),y +.1 lda (ZPPtr1),y sta K.CTime.DWORD,y dey bpl .1 @@ -245,7 +245,7 @@ K.CTime2Time jsr PullPtr1Ptr2 pla lda K.CTime.Mod ldy #S.Time.SECOND - sta (ZPQuickPtr2),y + sta (ZPPtr2),y stz K.CTime.Div3600 @@ -272,11 +272,11 @@ K.CTime2Time jsr PullPtr1Ptr2 lda K.CTime.Mod dey ldy #S.Time.MINUTE - sta (ZPQuickPtr2),y + sta (ZPPtr2),y lda K.CTime.Div3600 dey ldy #S.Time.HOUR - sta (ZPQuickPtr2),y + sta (ZPPtr2),y lda K.CTime.DivDay WDAY computation : (DivDay + DAY0) mod 7 clc @@ -297,7 +297,7 @@ K.CTime2Time jsr PullPtr1Ptr2 lda K.CTime.Mod ldy #S.Time.WDAY - sta (ZPQuickPtr2),y + sta (ZPPtr2),y lda #CENTURY0 sta K.CTime.Century @@ -330,10 +330,10 @@ K.CTime2Time.Year .2 pla lda K.CTime.Century * ldy #S.Time.CENTURY - sta (ZPQuickPtr2) + sta (ZPPtr2) ldy #S.Time.YEAR lda K.CTime.Year - sta (ZPQuickPtr2),y + sta (ZPPtr2),y clc rts diff --git a/SYS/KERNEL.S.TSK.txt b/SYS/KERNEL.S.TSK.txt index 420d911e..b4561bf7 100644 --- a/SYS/KERNEL.S.TSK.txt +++ b/SYS/KERNEL.S.TSK.txt @@ -10,10 +10,10 @@ AUTO 6 TSK.TskMgrRun >LDYAI TskMgr.Table+S.PS skip PS 0 >STYA pPs - lda TSKMGR.SIZE - sta TSKMGR.COUNT + lda TskMgr.Count + sta TskMgr.Idx -.1 dec TSKMGR.COUNT skip PS 0 +.1 dec TskMgr.Idx skip PS 0 beq .8 lda (pPs) get S.PS.F @@ -58,16 +58,16 @@ TSK.TskMgrRun >LDYAI TskMgr.Table+S.PS skip PS 0 pha save RC ldy #S.PS.PPID Notify Parent Process for exit code... lda (pPs),y - jsr K.GetPSByIDA will set ZPQuickPtr1 if success + jsr K.GetPSByIDA will set ZPPtr1 if success bcs .5 parent is dead.....skipping... - lda (ZPQuickPtr1) Parent PS is HOLD? + lda (ZPPtr1) Parent PS is HOLD? and #S.PS.F.HOLD beq .5 no... pla yes, probably waiting for this PS to terminate.... ldy #S.PS.RC - sta (ZPQuickPtr1),y + sta (ZPPtr1),y .HS B0 BCS .5 pla @@ -115,10 +115,10 @@ TSK.DispatchEvents >LDYAI TskMgr.Table+S.PS >STYA pPs - lda TSKMGR.SIZE Number of actual processes... - sta TSKMGR.COUNT ...to give event list + lda TskMgr.Count Number of actual processes... + sta TskMgr.Idx ...to give event list -.1 dec TSKMGR.COUNT skip PS 0 +.1 dec TskMgr.Idx skip PS 0 beq .9 lda (pPs) get S.PS.F @@ -181,7 +181,7 @@ TSK.DispatchEvents TSK.TskMgrQuit clc rts *-------------------------------------- -TSKMGR.COUNT .BS 1 +TskMgr.Idx .BS 1 TSKMGR.EVENTCNT .BS 1 *-------------------------------------- MAN diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index c4e9d3ec..d9e305ca 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -1,6 +1,6 @@ PR#3 PREFIX /A2OSX.SRC -NEW +LOMEM $A00 INC 1 AUTO 6 .LIST OFF @@ -14,10 +14,10 @@ AUTO 6 .INB /A2OSX.DEV/INC/PRODOS.I *-------------------------------------- TmpPtr1 .EQ $0 for X.PRINTF.S -ZPQuickPtr1 .EQ ZPKERNEL Temp Ptrs for use in very limited scope -ZPQuickPtr2 .EQ ZPKERNEL+2 (could be trashed by any JSR) -ZPQuickPtr3 .EQ ZPKERNEL+4 -ZPQuickPtr4 .EQ ZPKERNEL+6 +ZPPtr1 .EQ ZPKERNEL Temp Ptrs for use in very limited scope +ZPPtr2 .EQ ZPKERNEL+2 (could be trashed by any JSR) +ZPPtr3 .EQ ZPKERNEL+4 +ZPPtr4 .EQ ZPKERNEL+6 *-------------------------------------- * Kernel Init Stage 2 *-------------------------------------- @@ -93,21 +93,22 @@ A2osX.D002.END .EQ * *-------------------------------------- * LC AUX $E000 API Calls $80-$FE *-------------------------------------- -A2osX.E000 .EQ * +A2osX.E000 .EQ * .PH $E000 .INB SYS/KERNEL.S.JMP .INB SYS/KERNEL.S.DAT .INB SYS/KERNEL.S.IRQ .INB SYS/KERNEL.S.MEM + .INB SYS/KERNEL.S.CHR *-------------------------------------- PullPtr1Ptr2Ptr3 sec .HS 90 bcc PullPtr1Ptr2 clc - >PULLW ZPQuickPtr1 - >PULLW ZPQuickPtr2 + >PULLW ZPPtr1 + >PULLW ZPPtr2 bcc .9 - >PULLW ZPQuickPtr3 + >PULLW ZPPtr3 .9 rts *-------------------------------------- * Make sure KERNEL.S.D01 is the last one @@ -128,17 +129,17 @@ A2osX.E000.SIZE .EQ A2osX.E000.END-A2osX.E000 .LIST OFF .DO A2osX.GP.SIZE>$1E0 .LIST ON -* !!!!!!!!!!!!! ERROR:GP too big !!!!!!!!!!!! +* !!!!!!!!! ERROR:GP too big !!!!!!!!!! .LIST OFF .FIN .DO A2osX.D001.SIZE>$1000 .LIST ON -* !!!!!!!!!!!!! ERROR:BNK1 too big !!!!!!!!!! +* !!!!!!!!! ERROR:BNK1 too big !!!!!!!! .LIST OFF .FIN .DO A2osX.D002.SIZE>$1000 .LIST ON -* !!!!!!!!!!!!! ERROR:BNK2 too big !!!!!!!!!! +* !!!!!!!!! ERROR:BNK2 too big !!!!!!!! .LIST OFF .FIN *-------------------------------------- diff --git a/BIN/HWINFO.S.txt b/SYS/KM.ATLK.txt similarity index 100% rename from BIN/HWINFO.S.txt rename to SYS/KM.ATLK.txt diff --git a/SYS/KM.VSDRIVE.S.txt b/SYS/KM.VSDRIVE.S.txt index a68efe24..5c3e7524 100644 --- a/SYS/KM.VSDRIVE.S.txt +++ b/SYS/KM.VSDRIVE.S.txt @@ -237,9 +237,19 @@ DRV .EQ * cld DRV.Slotn0 ldx #$ff Self Modified lda DRV.COMMAND S=0,R=1,W=2,F=3 - beq .8 Status - cmp #3 - beq .81 Format .... + bne .1 + + ldx #$ff return Status + ldy #$ff +.8 lda #0 + clc + rts + +.9 lda #MLI.ERR.IO + rts + +.1 cmp #3 + beq .8 Format .... bcs .9 more....IO error ora #2 W=2,R=3 @@ -247,19 +257,7 @@ DRV.Slotn0 ldx #$ff Self Modified bpl .1 adc #2 CC from bcs .9 -.1 jsr DRV.DO.CMD - bcs .9 - -.8 ldx #$ff return Status - ldy #$ff -.81 lda #0 - clc - rts - -.9 lda #MLI.ERR.IO - rts -*-------------------------------------- -DRV.DO.CMD sta DRV.CmdBuf.Cmd store cmd + sta DRV.CmdBuf.Cmd store cmd eor #VS.CMD eor DRV.BLKNUM eor DRV.BLKNUM+1 @@ -280,103 +278,89 @@ DRV.DO.CMD sta DRV.CmdBuf.Cmd store cmd * send CMD+CS ldy #4 Send 5 bytes including Sum -.1 lda DRV.CmdBuf.Sum,y +.2 lda DRV.CmdBuf.Sum,y jsr DRV.SSCSend - bcs .9 dey - bpl .1 + bpl .2 * read back CMD ldy #3 Read Back and check 4 bytes -.2 jsr DRV.SSCGet - bcs .9 - cmp DRV.CmdBuf.BlkHi,y - bne .9 +.3 jsr DRV.SSCGet + eor DRV.CmdBuf.BlkHi,y + bne DRV.DO.CMD.ERR dey - bpl .2 + bpl .3 * Get ProDOS Date/time send from server if READ (3 or 5) lda DRV.COMMAND dec 1-1=0 if read - bne .6 go write - + bne DRV.DO.CMD.W go write +*-------------------------------------- * Read block : Discard ProDOS time recieved from Server (4 bytes) - - ldy #4 Read 4 bytes +*-------------------------------------- +DRV.DO.CMD.R ldy #4 Read 4 bytes -.3 jsr DRV.SSCGet - bcs .9 +.1 jsr DRV.SSCGet eor DRV.CmdBuf.Sum sta DRV.CmdBuf.Sum dey - bne .3 + bne .1 * recieve Header Sum and check jsr DRV.SSCGet - bcs .9 eor DRV.CmdBuf.Sum - bne .9 + bne DRV.DO.CMD.ERR * tay Y=0 from dey/bne -.4 jsr DRV.SSCGet - bcs .9 +.2 jsr DRV.SSCGet sta (DRV.BUFF),y iny - bne .4 + bne .2 -.5 jsr DRV.SSCGet - bcs .9 +.3 jsr DRV.SSCGet sta (DRV.A1L),y iny - bne .5 + bne .3 jsr DRV.BufCheckSum - sta DRV.CmdBuf.Sum jsr DRV.SSCGet - bcs .9 eor DRV.CmdBuf.Sum - bne .9 - rts A=0,CC from bcs .9 - -* Write Block -.6 ldy #0 - -.7 lda (DRV.BUFF),y - jsr DRV.SSCSend - bcs .9 - iny - bne .7 + bne DRV.DO.CMD.ERR +.9 rts A=0,CC from bcs .9 -.8 lda (DRV.A1L),y +DRV.DO.CMD.ERR sec +DRV.DO.CMD.RTS rts +*-------------------------------------- +* Write Block +*-------------------------------------- +DRV.DO.CMD.W ldy #0 + +.1 lda (DRV.BUFF),y jsr DRV.SSCSend - bcs .9 iny - bne .8 + bne .1 + +.2 lda (DRV.A1L),y + jsr DRV.SSCSend + iny + bne .2 jsr DRV.BufCheckSum - sta DRV.CmdBuf.Sum Save Block CheckSum for comparing later jsr DRV.SSCSend - bcs .9 ldy #4 Read 5 bytes (echo from server) -.81 jsr DRV.SSCGet - bcs .9 +.3 jsr DRV.SSCGet eor DRV.CmdBuf.Sum,y Check 5 bytes (including block Sum) - bne .9 + bne DRV.DO.CMD.ERR dey - bpl .81 - - rts - -.9 -DRV.CS sec + bpl .3 rts *-------------------------------------- DRV.CmdBuf.Sum .BS 1 Reverse order for dey @@ -389,37 +373,42 @@ DRV.BufCheckSum lda #0 tay .1 eor (DRV.BUFF),y - eor (DRV.A2L),y + eor (DRV.A1L),y iny bne .1 + sta DRV.CmdBuf.Sum rts *-------------------------------------- DRV.SSCSend sta .2+1 + .1 lda SSC.STATUS,x bit #SSC.STATUS.DCD+SSC.STATUS.DSR - beq DRV.CS - + beq DRV.IOERR + and #SSC.STATUS.TDRE Outgoing char? beq .1 .2 lda #$ff sta SSC.DATA,x - clc rts *-------------------------------------- -DRV.SSCGet -.1 lda SSC.STATUS,x +DRV.SSCGet lda SSC.STATUS,x bit #SSC.STATUS.DCD+SSC.STATUS.DSR - beq DRV.CS + beq DRV.IOERR and #SSC.STATUS.RDRF incoming char? - beq .1 + beq DRV.SSCGet lda SSC.DATA,x - clc rts -*-------------------------------------- +*-------------------------------------- +DRV.IOERR pla + pla + lda #MLI.ERR.IO + sec + rts +*-------------------------------------- .EP *-------------------------------------- .LIST ON diff --git a/_Docs/KERNEL.md b/_Docs/KERNEL.md index 1dac1699..5bfa4606 100644 --- a/_Docs/KERNEL.md +++ b/_Docs/KERNEL.md @@ -19,6 +19,64 @@ Returns argument count in the process command line. + Y,A = PStr To Arg[A] + CS : Out Of Bound +#FPutCAY +Print A (char) to File + +##In: ++ A : char to print ++ Y = hFILE + +##Out: ++ CC = success + +#PutCA +Print A (char) to StdOut + +##In: ++ A : char to print + +##Out: ++ CC = success + +#FGetCA +Get char from File + +##In: ++ A = hFILE + +##Out: ++ CC = success + + A = char + +#GetC +Get char from StdIn + +##In: ++ none. + +##Out: ++ CC = success + + A = char + +#FPutCS +Print String to FILE + +##In: ++ PUSHW : CPtr ++ PUSHB : hFILE + +##Out: ++ CC = success + +#PutCSYA +Print String to StdOut + +##In: ++ Y,A : CPtr + +##Out: ++ CC = success + #SScanF Scan a PStr (in progress) @@ -70,27 +128,6 @@ Prints Pascal/C-Style String + CC : success + CS : I/O error from COut -#FPutCAY -Print A (char) to File - -##In: -+ A : char to print -+ Y = hFILE -+ none. - -##Out: -+ CC = success - -#PutCA -Print A (char) to StdOut - -##In: -+ A : char to print -+ none. - -##Out: -+ CC = success - #GetDevByIDA ##IN: @@ -101,7 +138,7 @@ Print A (char) to StdOut + Y,A = DEVSLOT + note: X Unmodified -#GetDevIDByNameYA +#GetDevByNameYA ##IN: + Y,A = Ptr to device name (PStr) @@ -111,7 +148,7 @@ Print A (char) to StdOut + X = DEVID + Y,A = DEVSLOT -#GetDevInfoA +#GetDevStatusA ##IN: + A = DevID @@ -121,7 +158,7 @@ Print A (char) to StdOut + Y,A = Ptr to S.DEVINFO #MkNodYA -return a S.FILE from a given Device +return a S.FILE for a given Device NAME ##IN: + Y,A=DevName @@ -228,11 +265,11 @@ Open a file + PUSHW = AUXTYPE + PUSHB = TYPE + PUSHB = MODE - + SYS.FOPEN.R : if R and exists -> ERROR - + SYS.FOPEN.W : if W and exists -> CREATE - + SYS.FOPEN.A : Append - + SYS.FOPEN.T : Open/Append in Text mode - + SYS.FOPEN.X : Create if not exists + + SYS.FOpen.R : if R and exists -> ERROR + + SYS.FOpen.W : if W and exists -> CREATE + + SYS.FOpen.A : Append + + SYS.FOpen.T : Open/Append in Text mode + + SYS.FOpen.X : Create if not exists + PUSHW = PATH (PSTR) ##Out : @@ -369,7 +406,7 @@ And return, if found, the full path to it. + PUSHW = AUXTYPE (Handled by.... + PUSHB = TYPE ... + PUSHB = MODE ... -+ PUSHW = PATH ...FOPEN) ++ PUSHW = PATH ...FOpen) ##Out: + Y,A = File Length @@ -383,7 +420,7 @@ And return, if found, the full path to it. + PUSHW = AUXTYPE (Handled by.... + PUSHB = TYPE ... + PUSHB = MODE ... -+ PUSHW = PATH ...FOPEN) ++ PUSHW = PATH ...FOpen) #GetMem