From 66f6298626fbefa43b12b1ca2d06f99c6505bea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Thu, 4 Oct 2018 17:30:14 +0200 Subject: [PATCH] Kernel 0.9.2 --- .Docs/KERNEL.md | 36 +++--- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.DEV.po | Bin 143360 -> 143360 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes INC/A2osX.I.txt | 10 +- SYS/KERNEL.S.CTRL.txt | 12 +- SYS/KERNEL.S.INIT.txt | 6 +- SYS/KERNEL.S.IO.txt | 176 +++++++++++++++++++++++----- SYS/KERNEL.S.JMP.txt | 2 +- SYS/KERNEL.S.STAT.txt | 38 ++---- SYS/KERNEL.S.STDIO.txt | 243 +++++++++++++-------------------------- SYS/KERNEL.S.STDLIB.txt | 4 +- SYS/KERNEL.S.TIME.txt | 6 +- SYS/KERNEL.S.txt | 108 ++++++++--------- 14 files changed, 334 insertions(+), 307 deletions(-) diff --git a/.Docs/KERNEL.md b/.Docs/KERNEL.md index 60040d45..9773245f 100644 --- a/.Docs/KERNEL.md +++ b/.Docs/KERNEL.md @@ -240,7 +240,7 @@ Change The type of a ProDOS File # open ## C -`hFD open(const char *pathname, int flags);` +`hFD open(const char *pathname, short int flags);` ## ASM **In:** @@ -249,7 +249,7 @@ Change The type of a ProDOS File `>SYSCALL open` **Out:** A = hFD -note : if file is created on ProDOS : T=TXT,X=$0000 +REG File created on ProDOS : T=TXT,X=$0000 # close @@ -604,20 +604,22 @@ Print A (char) to hFILE ## ASM **In:** -A : character -Y : stream +`>PUSHB character` +`lda stream` +`>SYSCALL fputc` **Out:** CC = success # PutChar +Print A (char) to StdOut ## C `int putchar ( int character );` ## ASM -Print A (char) to StdOut **In:** -A : char to print +`lda caracter` +`>SYSCALL putchar` **Out:** CC = success @@ -793,20 +795,20 @@ A = Number of arguments filled. Open a file ## C -`hFILE fopen ( const char * filename, short int mode, short int ftype, int auxtype );` +`hFILE fopen ( const char * filename, short int flags, short int ftype, int auxtype );` **In:** ## ASM `>PUSHWI auxtype` `>PUSHBI ftype` -`>PUSHBI mode` +`>PUSHBI flags` + O.RDONLY : if R and exists -> ERROR + O.WRONLY : if W and exists -> CREATE + O.TRUNC : Reset Size To 0 + O.APPEND : Append + O.TEXT : Open/Append in Text mode + O.CREATE : Create if not exists -TODO: mode="w+,t=TYP,x=AUXTYPE" +TODO: replace flags/ftype/auxtype with mode="w+,t=TYP,x=AUXTYPE" + r = O_RDONLY + r+ = O_RDWR + w = O_WRONLY | O_CREAT | O_TRUNC @@ -833,8 +835,12 @@ int fclose ( hFILE stream ); **Out:** # FRead -int fread (hFILE stream, void * ptr, int count ); Read bytes from file + +## C +int fread (hFILE stream, void * ptr, int count ); + +## ASM **In:** `>PUSHWI count` `>PUSHW ptr` @@ -938,10 +944,10 @@ Rename a file # strtof Convert String to 40 bits Float -##C +## C `float strtof (const char* str, char** endptr);` -##ASM +## ASM **In:** `>PUSHWI EndPtr` `>LDYA str` @@ -1132,7 +1138,7 @@ Get System Time in Buffer ## C `time_t time (S.TIME* timer);` -##ASM +## ASM **In:** Y,A = PTR to S.TIME **Out:** @@ -1144,7 +1150,7 @@ S.TIME filled with System date/time ## C `int PTime2Time (long* ptime, S.TIME* timer);` -##ASM +## ASM **In :** `>PUSHW timer` `>LDYA ptime` @@ -1157,7 +1163,7 @@ S.TIME filled with System date/time ## C `int CTime2Time (long* ctime, S.TIME* timer);` -##ASM +## ASM **In :** `>PUSHW timer` `>LDYA ctime` diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 296a245c9a25ee488573c2b66dde5570d5cde373..12ec77afd46f303248a6512ab61967d9123a3a8c 100644 GIT binary patch delta 8562 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 RLjQ(BRYPIG;le<}{{x+#;w%6F delta 8471 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 A3jhEB diff --git a/.Floppies/A2OSX.DEV.po b/.Floppies/A2OSX.DEV.po index f05372145933d33bdb7934133d3403275a87c77c..556f2725c5be94f85fb19101bae67f73948d6445 100644 GIT binary patch delta 190 zcmZp8z|ru4W5Z!h+bi2P-dww;Y0bP3w{G3KuwY_y^Qp^Mr@#dkO`SMp=Dg__7BAX- zVcX0(Q%_xOhRZE)+N3o_G3U+0#hcG9S-*7K(sf(1Cbu>}c=7gO<)kT-AG~)_#<{qH*2dMN%i1e#ZAnB#+mOQxf`Qh5l%P$n1TevInP~zdFWj&4U alT$XVT#~qH>9WKPTQ(&(`7HBcd;$QYD1O@j delta 190 zcmZp8z|ru4W5Z!hTNO7)&DfZtm^=n8EiHwB#NuKrWz`h8Ku~I8N@iZVLU53?f?H-z zs+DRnTrRw5lhzc)93DpJU_BRq*DzPVkgnp?WCjji#+gMW#S9#Lj9LfObQ$>hK`H`6 zJwqlX=K!Szpwfa6X)Ym72 diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index 586bc732d81d51560f615941db2fe33365ef6be9..9d8c8981e2c7b49fc093b48eb3f0967b98786f58 100644 GIT binary patch delta 26719 zcmZ`?2Yg(`(cgEcC-3RhPFHp6U6$livyHn^wS;9!=ww_lU|BlZ0^1UjjBOyC&yDT? z1}}mTx(L0-CWV?nAPFs@6KY5Tfl$&Q)bBsL@7EZ|KrK8+GXwiKla_F;a73m{oVenwTyK3 z*BtgzaY9-V`?LRq=91L3`@hYymRkBY-q-k@c0;p8WCg6bYyZP0#{0IhwEwb+Q#Xx7 z$^*4k+om)93pT+#U$Q{02sAfD+PeZhEe*~1za`A~KQ=+IU~eTcHFYdC zkxD%~i|cA?YM65xO1-TS5L&&orKhu{1EjOd_cuJ{4qqNie@ zR+<6YPJcGX*529P%krEkMP_F0pYe1`S|rfj7AdZ+#h^+(23Av7PYWyYs!~~V&k2nC z&~r;S^JcP!y5X^vfrjNPcgmJEO=wx-SGfD1e|nlGzmyatJ~E!oF2Dc#r_(HHyCimF zGq8(u6?VyzZpQOe$DVwne{+ds$hr z@$GkhZ&P@7ER&A*Mpja4)KouXP_=;82QN21IoZEj)YH?jYz6*n>|9#M z$}5eo?tCW6Af~r{8JILf!FgkQCo2vZNcqnuDkR>}vxJq@7&tARC$Q35St!Yq?DW(d zB(&5h{-2ditMG3z4!1Bh9rNOGAV4&6bU0KTt`u5kply6zbMDlc7rKP-o z|Bjc+yaNnNALC33(OQWtTiQG{%6x>|DBieuQ)c5i+gHp3H8(G zuVu+Ys+N>N>Z$l`D1!)do`#aC1vU*2gs|{89;mgs*KCp%=JMZk+Q85#mj7ni*jWA< z!zeX1Mdn4uw)FRh#>QCs2tk5?ghoe)M_KaeD4R-QltC$g{Jb%7PqQ^w8y5wiPV?n3 zeG9a$`wTWgsz>pmA<(+Kql0B{6rNL7aV?mKT0VL8MN67{5)OnDGb- zQuB?CkB0g-feDWiWRW@i!ST?>jTru8vXL=-_v0vaZH|nM_w}C^Dc?A}dHr-|`&EKc zeYw9*SQ=>UMLVhbx?6h#!hgGF&+$KzFhR;t?I24+<87@&8$)t$c``vPzFqSy_)WsZ zy8f|9U@p_2N|<2wrxO%!YMA}E2@_IhH!%HoRP}qR+8!yYWBM~FXFV$_Z`Lxy_UEE_ z{P~25fzWnle*wLYY>WhInf?c$CjBuXFjtI@k1^Ye32IMCeF-Bfiu8mw4WAKW`7fiS zen+q;fXK-3XasT)>K`8--OiF;A#B=o%3j5qdGwzmup=f4dO6MY9B zxB4vaB#7smt-ck$cQJBkY`JUUZ*xnqx2J0rE9PIl<3_iuH7Y-kG5$k#XO8g`bBv$LF%pRvojNA;$FUkdQzNZN|6I;-N5=}xDU^o(PZEfK z83Iwm^natA_n!nD*? zJ9GapVWNKoB1PNYvWAu24ZUs5{uP>T4oTtp8r?d-NeIjlW8>SSEt%_EkV9i_kHIp( z11#8!@h=UeQGeYH(Br|%dgf)K;VG+Uo~FxL;TFAu33^ofxTeay?nUFgnh)4_ry9cyA+qzEjqqwG)C#i!|s-c9xt zU5y`$B^4DsO$QUUVYAjTVl-G9=tlK@TIJ-4d!DvtYx&}tr>&U@1$tnnxc9wj-oahWSE$QL>l_{k^!BaW7z%(h zRoj?egm$ULvXi|VTH8BXm|j8zlwy1v`&m+%Zm#%p$;DmFJzYOi4|yx}332RKx~ru! zN}FDVjyyBe=*vf1o2Tz4RoxuuWtjoRtEnB4@~WmbHR7JoS2x5F z17LifF=6vTrfWeQBOJelJ3#hoK(%GbzjH8SmN2Z}W53FMMl8Hj%Sn8e_O9o|+B-E@ z`1z@=Abu~P*8T^xDbxRma_WmLjtKoFfYM*4%@0e?;HdkR*k%Y02c+en{wkBRE}0Jw z>aU@t_jN|=crP_fk$8a(7%a&uwMyqG|`+ zwfAO_mnWX!mLh9&$sF+!w=6#9veA-Z#h!Yw*Yd6P z;7ZFPO9l+YHOyC(pMoAXdYemJ4$-~Z;&#~BWE$WF1YbSST#|k0jMWy4mj1s?6FO}* zk#*?26D`{w6%Vyoy<+z{mUO+Ac~>!U>08`2&$U_!0vwF4?v~C#Pj8SFtzk>yMH+yX zC4rVbh7OgYKvqHFNw5Mt?AeJBS?|eA)O6TgVb>`~_NA`{_fz}grOUgH1YjF9er4@$ zIjztXyO`e3u3-f*C$Ef?y4}sgPoBJ}cfY~=j>-A0Orf4%0pS{fsEW=FP`@GfV z8JQ};`sqNLGfGyWOC0|W_e|zm(^s{g(z$$DWL@7_Xn^Tsz;KVN^|Lh4H4@q!XzgfN z5@Z=LGuI7`M~b=vD|)&*J65qw*qm}dtgG20ozw_fz>&pF--=GMwlVSOJ3P~}oryQz z;RUnK1kigH5p*UrL!8>GW8Slm0>&oy114(U0=m2fFh| z5M!u4AWpwob7ky|@nRS1e7l*r8;u83_b@a#U|NKGsqS2WY7WrkOc`VLd2FI@^8k&p zw`FDT?%vS0@yIeYDEs-wXy-8f0`!q`p`m1o;bD6(l9qM`yz7e%a8sbEhk5r&cw#;C z{g6#e)>vIxa8nwXYg&01d_d7;@Tj&05SKOqPxZF($135W(kEKs)JQ5;|Gu; z(y+}9y)Dvx)6W6e4*tlUyPi3BQ1pccNGKg$*xoWDvM2Fei&gi7Sp%VM%nnYOM(u9& z;N2q^o4aB!)|GUSXqoMkhTpm5K2hZ4JW>LYWv5~PWaa0J88x;t?EZekn$fb{T_ZC6`_C;2`7sm5NTf!qCnv<$z*6t!c&uG%)NR=ap*x zL6tOZ93BfH+`uOc<$M)n6Uv!iJy&(bf5fD%ReTLIH4jCr&Qm*HdskC$2km>^&7)^9 z{l_3_=C$JC=k4{r>x|h^C~^V&uZJLt?t87C+#6!!xDky~Zc^CNH1*vq7QSHjh9_wd zYG;5Zrpa*pBuYfHjC%1~jf&f%6)GIYZ&wxRcSI}XzR2%1HnY3b@N9RR^L!8ZUKHsk zez2r_QJ5yJdH;Rl`xoq)<@Zx{QA8T^58$_H%%}bog;*Typg8sqc6Z?+@?Jr(??FhG zxA>P9nYQeq6l!2fJ&=uc9$QRVU+&o?jmZZKUXm?+FS!dcxi(535y-_WtHDuwt|4 zsl&jE$xj>1|E(NQl&qZJ#mdkD=Yb{Xn)?j%z);#aARc($>d1aZ39Y$l*kLzG)r)5KxM#yQsQfxCOS+gmh>t~C)w>8 zFqVkZaLG;E<#j{O-iVDrGSl&=7(nt7R#RBYYQ|f!8pXqmw_^}PO5ai4y5Eh}5C_jC z1DwBSi0GdU5lw!dWDst1-vCSci;~ACR{d8JK;=*O4U|K=L}iXOR~&zu=Cis#WHNr+ z{C7f{62JY3AjBq$-?~4R^)WxQ55Uxa09a9Bc$xlB#4mEJnM*zeFg|+wnIY=_&mroF ztPJdnH-@Dl{m*zQ*Z&1x=ly%~0c+|eieM#o8nCB!!{b}kz|tB`OI^9PO)$~z&D5vz>snCGYZa%wV9j+cQ62z!wQb6wbGM62 zU$DAPJkIdzXs?cXvP+e>LSc{&^x|HoOHX!NbWex7%R5y^v%1JjiEa12ZB^TLF6%oj z6ghCEp6xpxM4BG2vIo#Mvqu+;zM1C9;6Y=gy=tVj%f*^2^&0I2aq*RUiDiXOrks2F zO3LWoi$h#+hZA}P|k4DCak&%FP6&XZ02A?HG9O>`dxRLP_l>_Np zL!2`G38)X4m}HKnpQM~Fa~UO_9QC$NQ8ebPHD*I*HulMFh(?B(b{FG)db*m!b;ij0 z^+S$%*3-3vzqKA`O;1gS>WBvIVZwJjWAzQBWJIBz%;$uxA!pLnGjCZ#dnd*+99cKC zo~62?NU%n1Zj@RP$IbNMM{`#s8tD!M7Zp>OJH;Et?_^$|xb7LN+nt&j1yUz|*~#Ry zR!dlUJ8L!R?PRXgunWZv?S!rl8E)kLni}4KLiB`yI9FO(G8oblXz6NYd{AN8)=R8C zjBn7SdZ-=JpzK%lwD-11PwZSQP72N}4eY1|x7x6K~%S1wTHup=*ma z#e1a%n|6j~IGtEe2!Cv)_S=r2qKy<$`u3^)@iR5}nEfpCER6z*dy9g>;J!dZFj6?W zbsPS7DD@B4f0kq$zOqygY3A3+&(3#f;+VUvx&0ZMO13#cU)-+e0xe#*7E87%7SgWg z^JquSwt2h?9_6=6xA`=Y@<+SZlBtOoXy@}ErL{CNyjh2}H}<~l!@z3q%Te>2olEm; zW&*J`po*|I2*8|qXxSEw)HUsCZ10UUGzJ;ZM+S{7hTH;84Bu_dwiId7shM6pmA~E+ z2$YP$DIFpsWVOs+s)-$6>2AG_`OD-_pJloxzPsC+Gx?RZ>X5B8;Y)3Qy2W-#D^K|T zO-p3m!9*RNHPW+={ts7&m^MPlqSHf%UZDjlc1UPBixzGszUSx!SlP^ZV zwJ6d`-wx~(({IwMnv#A+JXl|!-Lp@5llm%pOOPIp>nB0l(yq#_-)#b z8I#F+&GAYoBBi9Ar7$yRg<6wKy2){DB4wRfiA5q~!&9{VY{sjU`r$K_{Nx8TvGE>j zZcg=)GFGEd3TriS%RSb7YrRx51=g8SWixHDK8qInY*Q)38Td#i>c^ncJ;xx0LbpMv zdbj{gpNks*JWX`oYxOzjYvwLhyud&fj`^Ak>TH@jX(4G;aC?$=W_~>41QA%_Ca+qAC*XY|>UW+F3@3ZDumT2PAZQL17Z;Qv;&Rp&0cw*tb zl;cdbL!0|j8g&P?GB-k6`dFk(ds+IjslDl)Ku+r-9YmU`_|XJ-Ufqh$n&YwT#S8aY ztE@dyuJW?p_?}G_zI!c$G%}>!LNAyxl_xQmBSpH#($;z&K`-V0~So+zTT#n|J@B0C0pd7&5 zJ%kk*8jB2WA=BX;Qu5nbdRQqV6QA!Or44vQkwVcbqzag0CozlE7BLIzgYUwJHui@Z z->t+~--D54?j^}M+FpCEvDcnw?6v0u@yNaQ0%NbeP+~=x?IQE|!^JpqPy|DWL^Ww2 z6=bGH`=Rjv&$=M%5(SZd`=$6D_1j&SiPQgQb%yr?xRy>oG`7S3K7C7QYmsWKLUK!Dk<+^Xv8a!r;a|vZIAY=v3xFfBTSLtiR`$_u{8D>7xeK|p*l#o&aAy-JvV-R9LkWjHxW@A~3z|V$- zH4##7&MT=9DL}Eat5<@OCI}U2T4uY-NHpbKP3cPDldUg)dy|$v!~diIFHvc~hIF+` zQ2rRI+IOu=TozmxgI^E0{f1a}@l$&LGZnVT*quK>2U63scr*d9|eSbu$-m+*$Ae@zQ8yP zXL5*jAH`^jGs#Pp)$JFG7mz<)4Xc^CvXr~6lJUKP-j%(~m90XtMsGv`^X8agPuYb* z7|YB(8n|-Ol9*a;q}MyAit|_~blO^G>mp&q34z>hnt>pI!g0IiYV{xg|4L#{R5bJ; z<};($$cZ-W*}5ULxj)4C@&svhW}hGmuGg}(6=EU&gjZ6M69!zcr3I!!XES1H$*au1 z5FuTS&eBfAXX6ajHGrj_MEO)YmJ+C~VaX@M3ZdV1a7j)ve%IIRVySB}K-o9U8|Lpr zqnZP8o@A2BgCcUgPP}`)=F$4;kF#(lvk!m@iV@FYse@)GP0M>&*7^jB`HEw2*W6_r zh*a2HknAC4*rc9jB4aenzcC?D4`d1~XKgaa#Zrbz+~tl~!}3NFCMGiy+g3I+{TkYJ zer)b8Qf zGl^R7Er)Fb$g?6sW&a5p^|bV2eeqk>Zd-nvcyfVWw(Rz)J73BjYFiqSN1*OB_Nu$4 zBBk9OL!#K|J!)&oyI0IxsORS2XKWqG_d|adMMj235EguZe$&p8|5LGTp`O=%Pyyt| zaY!n9d2S9{&x3|$Px=`&d$(-;a~c+zm$qNXZz1FLOEr$Hhr~Mzb-(toxODln{K++m z<%be?CqArY6klPT;+@s(60hw^EVCgk=bW&@TAAFNXi0$UnFM7zwkErw9TuZ()4wpev3!?b&$P0zzyhP7%YEcwO&U3NZ zNy(H>>SCRgM)A=}S(Gk1q!pvAJc@))lcuXqcQRfmLu{ zm{W#_;PLyf$15?-XxiY&mhpa=3qC;2a9V_AWTJ>2cwzKB6k-r6YMhn@<=oo6WxR=^ z#>|OHUDWNyaw7GtEGiCVN}BmV0D|G=27}i0fEn}c9-9vPK(EHmR9F-1AW$pgl2bGP%vr1Q5b`@gnPj!s8~xWZ&&;^? zt5kferiAIU(0B4|xn&015Px(XWBgu0E|Hud@$@wQaX6zzbr9SqL$5&9ThZ3DvK__NY*T2|?yO?g&~_J5-Y*nSM)OW^TGlMp7#~qtzX)ETd~mHJt(K1~K;IB{AY0 z8~0SL!k%c5Ow71Iroxt+DUuT~RWN2GHQp8CVYINXBp9j0nXAOxHeSDIwE{>PIT622 z8Od0Kf*FE_rHX}f5<#XcoRdX&5_gABk?o=)vKGauBGPAwNbWjND+!Wz^Wn4Ge+0+8 zA;Z$a&I4Z%q7La_&vFIc+1 zrh`b#y}^(K+Ss;?ZJ;`qJ7fS?sQ5|UE?Kosb?!V>B^xL@MQ5LpjI-Nt&{Ad}b2o}* z$vj8fBu-1_emfngl+3Of7MCRRYHdV3n#>nyr;Bfs`653krE1CgG08%8io17QEKlLV z_AP*^8Ccb@mf6psBHWO*EOTqL1`f`;?c<^T;Vqlt;<&fT3Kh0S1bI^*fZpxm^Azq0 zpNYDl)E=!k!^zUligqHqKbwlGdn9m8%{ire&pFWwEFH7|jIe~Nk4j1L?T`>tp^lA^ z$_m4&NspkSHI9az(GDdIyQrvW*d48zIz-Q&Xhj?ij=cm`z8#`DYbl9NV=ze=92xb1 z2J)*YL2RmZR(!t5O5;Vy5HC*SC4R~f2S-BvLxV%1(J{DCr56EG87WyO?s0J6G#o#U zu+odgH9*$(iC?AhO8BIortyGwiO5aobNHnSKO}yb&NIcc7hQ+d5?_h`bJXu~zkeS_+3O-U43!b)!x)lOd0dXxJ0z^-|bvbkkD%WCV&nD1r< ztQ*)1Xk>0#guv%A-=u=q)D7%JMU7FxvThMqIk|uSPmJo?T5vj2*3gJJZ|jma*b8OM zg+wv&y>4*tyuD@hf!dj6%yyfhMM`cLpE`MQ_zt;FDGIORoV%1nGAEM8#+FKg*Gd5+ zT8Wlp+y-iZgLhNehR{El}>DfjXb zW5;_C6nTH9_Kd>`L7tgh@VISG{{=gj<@{3k+&sG-nP#Q^M%2!sBjwC;9-*DU81Mz; zju?fe&Ew3C?DJF*_LI!V#lvpyD?{3uB_qqMT!-Dv{iJz3qg*kTcId3%h;QB8f80~@ zOd3mh8i{#|1ecYRv1A;nQwJ(>Ebe#gYMC5X4v|4aci%td`MPNE@(RZr25mE${wIKsdsCe4twvirCd#xk)7e-3m+{G%cuIqpF!S7jgK+vFjot46eE{cvPGw$;sal!)v- zqA}?|EHE2q1rfFRuW_XC3rP#(U#cSx&i^T~H9BnxHnA}OiY(mi%>FfT1Kulq?r)-u zVfwdVvhzFh_=^%;$e`nUCWAZGrlp+B5W}Rn&RnD$H087!-)Y^5EqW(Qwg7{iXker# zAW~U#pnsE}L~#v7Q8${yY1b3sot8`!)qY+)gB$K-oNU?5XeneXNqL>R9Zh`6Vuzo5 zYg3H+T6nOjlpaH>1j#QIzp7*Qbo?edpk5qkmXjf#^7HJlOCwjFq{N`RiL7(G8`z33 zIuc*Z?uC0f_rS=85#0LG;0 zg&B(&7%U?jEyA$8RpsucCI(|fo#M=;zaz|!T$U16rssnUcLBU~nW!*{g|^TOQIk|e z{;!Pt7b~|nvqX!{_yq`_>@=>_<&&$Wq$|a1~t6}BO6xlgEFN{nIamJvnu~E7g z9H|v@>KsU=#7!x3Pe`kfN9RN)h33_425E55Gx?-CIae}qzWQ3;f@mcU{YPbFNl1K> z&!>eK9*qcn5zW-%Xv0A51u{X2P}Z?DQw_v^=o7{p6}2f%N|K65nYodJA(1Jn+0!>L z5NYZg#r+Of%arj*5#_Dgv2skFB}b!zBTFNXFPa|Zov{T%X3+t+jh@vANd(>f6+-=mmLBIES@n{|lRAgX|oPe~Tiu<&+tfW&8 zI#M&tfm94_FA4@N;yM9Mu@sF-Xl|x8xdNEkD@~@gw_k|Gbne*D`puyM*#F}!ZPgSi zOSIJ@lE;g)PBh4@-7~%w2N>+U`P}5JHLVW3I;^ur_;@o7=PNxg?&7e7R zSiG6feFGy$ql2GLT5lV3jKn%voj ziUr%nsscWL`I*{<%zu`WKQ+LrZM$fbA=cwCExJPjz?iAF(6+i}gxGXsu9)o{bWH&_ z`wnW3m;rP+Qd6vYr}(gd2aZD)iV^`uG&(ynQA(_pvl`?D=Y2!m$C=O7^90=3K0l;~L zW+fM3xm<@no!4uDdYNv6rHr+JfjVwbOo#z))a;TM3L>jpJeUg(w5`M*y`y3R0lT1GAa_7|Q%{ zV2zD3{ww3}uZ_P?sK5G?KuY_K2D3*Vur97?WhqZ-6T?s`MaA_9sy?j}tyIWj&fgg$ zJ!W@b*zMkhuHt8mnA@Q)wnwb50^gyNqH24c> ziIb4emGaEoKN=m+*)6dneH*v-ZHM-G5jeA65{YGeX2#0~4tT1+0(jt6(NV@{B)*2< zp4UaVjJvzv01k~G7LxrZNq?5> zA;OB@7w?zxLhUbNS~>4+{i_7;WI2B`b!*E-q*_~tNBcvO!j{U~x;WO8Y+z+HqayU!Xnd z-?aaYZ|`IF|A5;tnXtan{;T>jjH%Qwl#XccY;IY}^e@rO@jsd;(^x{2^v18^kO0uX z)~;c$ZwL+guBU5R012Pgh9>6xR;>k`_yCk{Jusx_p>4mXVR`(FGmBy;Zm~)&HH&3h zERY28*mUl+%uf)O3O+BaTVh?eb}jE^&P0n`WbqwOvp}LbVJeMiL)npJfqo(C5%sTw zCa~KrYV|>)l7Zk#Q5_jlr}pAq3&p$n+Ns++bL@bEjWRhjS8}za?mEWZMR{2 z&#dbud>(PkE{F z{W7zrQ<-T8s(6}kRq~7(-s#aQd^M^tToqHh?+nzj{3_8|#q*kH96`D>5bXqn?33E5 z8gooqs>b+RtN!YBmQ*g@*@m3WW}ag#SPhigoHF-w z)VTa}&F=;;k^+UjbaxYO(K6>eOWdI=dFCo>eiS))p~OxuuBqAGP3Yc*7V%gfcNN+f zslj2w(-xD6_ZeYR7^fiI+o14@?2S=8M^ii=EwpCKz-%sEH3#^2rbQg-@4Fb=*UWBW;r+33q1~3FvH2{99p)yW0h=DD!5v`LpnHnQ$ zGbst_1Pm(?n>ivrtmgIM(+$oWo+?WnH7J;i$zptrl*4w$$1z(tgT%L}FFDUJxNbB9 z*E6>&2{7atp?q?9AvSy)t?cd0w%t;3r99_xW|Ww-!ipN_*`^HBub3`?7m15GzCe&7$0@-n=)-OGQ#*J zO40F4CDF`%+0mNsr@>!t2^=G6U{R{wR~$al$}r^f0I-t;O*S!_Uug*9gs~r7rI=iJ zwaH{j$$2t;wj!Rlt{+*{+Xk_m8*^TRK|oK%rBe8hRfn!?(P5bk-h$^B7^h*bv#2yn z%JmkR*@7elS>+AlzB*o^-6-CygFkwcD6fYjd$Sm>=QZ|8LZoz8{Vn3QdR`a)i2}%+ z%dPlrrn}N_L%~dUZAPZz_PFxcTIRTe%5ez>&z%w>nqYv31GKce05!7<5teedMV=qS zBN~YH-D9Z;AC?%q*P>F${`)LQjL~@FFCNh)Z`T8oadA=ZF?xgL&hRav_W&Gbhg3j9$e zV&2D;{2dm!PJSGMZWx~WuYm9PwZfB^t(yYvc&FeA6NTwd0wd!$v|SNn%?M!XQ%Z5D zEUEoz;2Yb)Z>h)MDbmc)G)w!v5?mG7WA2g=6dZ(_!P_Zz|T>-vYY4V$E!C8v>v94#cX6F7MI_0hakLiYUmCZDeqCcoUrg zXy43|-XlDcckiF^Yb_QK#dj&P8!4x=&Ee$t6^2{@f5C5a0r>t(4WbD%qZK6jZxSh* z-2DI&JteuD`k|#_7rp5~UtzYt8xo!S5hU6mSlJGg4hhQ>0HDealk&K@6oIoEaxkO3&v@N26|Ww z1Cr0eFvr&q#-vd3{?9z$O#=kaQFf0?ZWY^d6AOZnlYA^ z1;APrN5?MU&6Y)TZx|Z`_bBz81F*R{u##Ny`8-~nlxJ02KzY8%o6pNmF0iVzc!y^- z^+GFNrYN$)7(NqjJMR3ChQ^=+I)d_vBD$JWP;AuBsZrH9Cp5Y~GBP?$4>;ihePOA% zX+AHQQwD)hIyG&&RT?;k_Drrojk2hjqcXkXK)iYY-dO!+miGhqu{f@TyDiBn9oOo~{j#({5FTM^dncc8vaLGch79=JplDf?J z@=V4%tuh+PyVPHMH>&6?G;HeQ(M3v+75fBjEeH!agKCM!-%abq>|(3u%dN^sKY<#p zuqGQhNrZCpR*DTL@Z82#sIjj`_XfL8MA@;%DvyVn0T1RrN%nVGe(7YZ3|LGq;=bu- z@MUU}=@b$&vlq%SRrQI_PvDiVb)a8uT)f{Z;{@dcqGkmz3x|}1nEkP|L4zxEr7xhb z2Yq~lRXGAf#AcY@rz#GZjbM$Zou)o5g_S%JYPQKh-+Tmm&ai@VJQi#s2XH-n zTNHF~B_B=hO1IO&$_B_nD^@2`4asI%7SmJAqI%{nJvCOQcMBY8v2tsBYuBO22KeIP zuoSC6dpmP&kA6?VnsG_(%)?+E%z4&fpykYY_FuU9;l{ zXlX-sg_1mFq}I#O!Ihw#G;1A8x{4OMbeXSKWP5*PknP{x8VDk}he#hKIg)-%l+bDj zTq{~$!KJb5#Mmo1K6Jg9cm-F^9s*SzS;N~UK^Yg#jo=G z%v+A2NdE~&QhuvA=~b-I+pt0rmrc7}Eq}u@PP@ZcL3EE0s`E~CONK5^rr)I+IPQ*9 ziexY+-9u_d#*gncjEI!`ucE`$K@on9dn$hhkTNiEOl)v``v@L6bpLz`kUCq-s(v9Jc@4+4 zekneB4V-&O_+IDv{)ep8(VkjD8d1*?Rq zOu!XAto+yFlh=8f_Jr`f!ArF##lko6&EJT@HvoJ}?0W+zwVoDty}>iXzm-FxL_LOy z8z%H<98A;S0c=_n5$5_mJ^|xgz16B733EI{FkA{g2R<-_6feu@8;sG&3U z?hE6up+kg+GhUBcvhoT_7@F@5l0dSU6#?|jlKv;ivFA-CsT3vL9et#NzeRfrmiXI1 z@xFr(5(lHL2q&H6YiRm2+-0(;;ZWP;%8^y`y&9D^Qz`$kRZAA)@j!6=kEz`IKnCqvDS44L7(b6Ug zgm;Sk+qFb%R)TsLFq|E|QG{!6u+VeWMJe@K2-EWbOUgIz)7c8l7dHz*3K%30MYGHz zl+?3Z@&E;8a211!2~GNrCHS>g3hh=pNF6aQVvB`#eY(F?p-GmN;dhi}<&tH`O{d02 zm{B^G85IPHXPLKB;zU^{zXG0B$?goE!KZoCuKVl(gGqVS2?xH?vlF~E20MIMDQ4&0JuNlj7u zn~8pUhq#3ZjL3_6thyBiyx|fV-+-MDf<9wpcx-5VXqZmY4-ED9;mufa+)bK2IcW(s zqk%4N6ZzL^i@MqsKo0ac{5EIOvlNBs)~zn|VejsULOUYEgM;vJar0mq0oB|de4leI z!Rug3T5+9HZU_`SapH)fA8(Bq3dZ7ci{qb2bhhKRBsoH`8DWdlTisqD=J@EjDtSSz zZqL9FT=dZa`1gI|IOmTwW4_^oJ3ioowAxE>Y3l<-Ke7o#BV3pxKK+1K@X_%tr`~Yo z#LKwY^W}lRalYST`LdC^ic}aK$~aW6Y9|?i3qCPM&?O&JmW>9uo?LLnjzqUsC{F*7 zyL?3w-_*Uh*CU^+$}JJse25c%rQ#PK^1_@l3@fAjumj6XpAK+#g*fq>Y5st{GRCed zg3lm!#h%BJ&r`_P+#1;IYH{V?d7&8iJ9ie;;JB~6Qc3T>880~7Ytb1ga6H^yPq<}) znN!hvkfV&^*pE@id+Aiq9DLh1SN!Ae-0PaB&ZwFJU6|2%3xw|@p6g%4FUMywP}3t_jqT5f10E86>z{R1Y|+O;^tX z!S>a7v<-KD9S?_#MIQL(>4#&4z)jC zax*VSNk)&mmR8YQ;`kQ@=)EA8b_FUZh^&lO8}3C&2`>=hv|3w!;*}Uv{)D)+)|Q8B z5ck&Fa>G{xsHHykL8pfq~y-=px|Dc-8Hc{6dTK~+O^mo25|jn&(5cgwfo zvNCa>;jnu3vRUT6VsX9A7ryU^dU`g3+3~jc*wx zzfr~bVN&$r>RZe}jrRA%4mb;=HHDH+N_`lQV4zmeAthbOV4NS!$k7gKTj6Oyr$<>S(4gao3BM4(DedX=2!DkVad z24ZOyz0xOUJZ~?+P0(|hHxRdC@!oUe_D*`C-Bqnfh6fgXK3B({!&0%w72TCl z=ElZE%g3ZiJwr8L{i`nv)bop;g;Q~q^m`Ufg(~@XFP;jOjB*?+A8DW`gXhu#W#(## z0*uE^;gvKh-Cfoct7}=ZZ_zSw3f`hyUxuxW!ZMUVjeBf(XTwJF61GQLwhfKp`5qmc z9jn6TM$gp5zZUlAX|(+nw=;3ln>Z18 zoP4x3uYPBP`X?e>OVvEYzavr5A(6^w?reqO7@bpvcL z#h^iy(1J*S&MFIQK z_KcfMX-UlFVXqWgQ~d0Mug|V4vUrYunQ18&@$+rjM{{f6GnuO@@2EG=oH1(`bNz{p zpF1)fSs7R!8eJ9I-ab0a_(yEKr@x2skJ7H`d8*!V~Y@V_d!=Wi^q zV8K{_Z+FDMs--#55NK#?Wc*WwW&69t+RykuSlJWBvsuMInb>y1Qf~Pd8y8OwXc^+` z0gadZn~nGP?uz(31C8~8_U876KqpK6jDX#d(xJwB>SgxlOjMk-I1}22LIa^*R`DM; zcG6OA{z8H?&HrVh^`xaR{699%d|#eIa2p23Qoou?)AjYKBTr$b@ui(z>uVx`ikX#6 zGnqioY?|J|rcie;OSKTZJ2{Sx2U?mtyCQ9kM-!WJSH{~@Sy{yIKT>t%c~j_)>&!?{{Hg`imt7z zc@<`6wu1B8=2li1(2??9h*LE+(pzl^s!3^}p%zu^ z6;`ZjXGL@LkLHduSRKG78fZ8eXgD)c#)_9H zGDqKj(QjQg6Wgpgu)4NoWhdjkY`lA-MTfi@TD;w_{z{fUx z6!g*d5$*LBS6Eh`S;6?Z*y4jAaNel|`ia1HoxlJ-?1O6m`GbrP>GjS(wcaq*8&Lu% zVH5&JkO<;ClnlwZfUOL8J4d@m1Dzdp2LtsrQgAc}x>)gr;>4eMk$oqYRR>@Dve&fh zi0|b*^F>S~&allimtK5i>&qnzE@5TmPhbU;zDc_>vT9|0-!Sui3m-khq3+R8q&w2v zHyr929UR`p62fxpM(SAQ?jyf^Iq!~FTaTLyO<$SJYql9eN)Xn6Z3 z=D9;&*ylKbtAU4go7p`Pmhye;__^DMBBg^G4G>dlOxWPaSY85cSi#AS@L5>?Yh++Eb|BAYDZi~@eiqcJygzrWR-d@ z`6mWmLu)RP3XZxKMTMAk}@f}Q}Khj8D2)rwuye}$*0Mb{ zktO;*Nd7>Uwe1)sUbp`qg>`k2g%OtY2W#2hnkB&qQF8u~J|g+}Y;Eh3poBjWYG-62 zvwcXsjkdEtBHjl6;VG=mb>9A1^7bO;`vlAzGo{OoDg6sg4sk5g{))M=|IMm2Kj!LF zd}sb$Y`oo+KHKvTV!UoJ9<>#q<-pSNf6`j+V)lQ5%1}QTntA_i9T)lK7FX_PQOfrJ zOcMQqi2m0as1)biZt^sG{%0KzK|oBUYyT2;C2uhPmEOeHdK2gv)3Asp4NOTUTY_1e zm@rxA>uc(^YB9tP2WmSbRm`SoYN?XqG`Un=q5gihBpx3fW4D>+uj2$J$&_!yuTA}f z16w0oMuAi+MVBsVW-Qvo5)%}vlv#HCHWoQ8QPzwVOG%oz`ZklRC0U~B>+Md#SK9zc zcK4hYDW#@nFk7mo)-%UJ-KXxIR#v5H;?wuIYmLvToqj!CT68_#m?pbNBa1Bp4P^JC z3Q5!&runESor++EVn#FYotdeLv$57|v!ZxBTT|*46gr+K|M%WcOJrxh7=jD7S($4L%C<{zII&&*U-v zbK-teLL3=9S*>Cy$K*bq{g~+klQ~c~@k3MIar2v`Bup<_l&E|Of-B=#K|9IkJ^S?9;cy^-JoOayOW&YA)>1MuT z>dX_f2%e*5#1K;xpcx}uq>qJ4we?MPscrvjc&@S2{wqN3v$Y%rTmsh_1AP}_!A z3$qfBUv`#x=M&+LYGS6S(hBA|8}l3^DC=6KYF9V1)JLgbWbFhQ9;6lO|(?PDBQ=I}^Clsk62kixu6z4r331}3(z}IGN-fz2Sy{GHT|+eC z5tvcEEa7}P`4EET!(&G+fg=xGM-XE%JlD%|V=-iNz!{UI^wr1~OkDLyLT1tpfJT>NA_!k+ zduUdKIzvKNs=NqL&`~L)_edhrOoxo#i!Y-ix{Tf@LDOWkXTO9RJ=%UAd=2#IfF!2( zDD6^wks-7&GP0wmCp0p`QZFMA44z16czAG_C0>qi65qr(2Z?WB-sc{YvK#))wc?>W zO>WZ_BL8pkzHFvl2^Mf4o|KBsfto-g41AV#m1wEA_9Y&n-FC-`2Outy8zjZPeoJG23KqM{`$$+9!8_+dV$dol%xnWooBaGah2%f&W;1=7;59cet8WKB6yv z_5Swm;qL8`y1^aT6-y%3(x*jBBvB&8k!YLFN0lyL-cJ5mT{mpZ^kY~Ixf!M?nz@W0 z*QNerYBYI2pwUPfMe{4pUaX~M|M1ko|45-1{FsR=7HfHypQ^}WzUA?l5M%tg+7nn; z-;=68D_jS*-lX{?Pn--Kc)AKOr1`J!L+AQlJRq52Nfb!6^H7FFIcgCh}nM; zwMq(qsaF?{MJ5-;HRIh0zlsJgo>AQ_d6tR8OSGcwU!OXX=M+lO^GuvrqWOa_OkJql z7bU|UXxuT-Guk&e5NT8HcHcmRLR_Ac;_98;wIKDSsnuM+F~&R@-A#Jg*b(qhv{z_m zUS(ovK=TA%n_63Y9fc`x$nisK7d~O#!Z-|365hezGV#cO7O=b(Gt<1}cSK=&F!!CQ zWV7F8A~2|Bn%`4F-1nKdgg!q|LEKWZAbqePrx8*?T-c5z*olEB9S!h*kUCm2 zOB4UO!?Y+oTS25A3gEY)hdkx@FvR{q=t8o^VFCmtR5JTuf3E_1Dxy$n#Ev^mPV*c&()1Z~rCZX{vR2yIOq)kO%zWL4fz`YK-?`yx0k$`a#?H5q$wF41%^wsyys$~kl4!n&7g<2^%IK5SUHwd>kzx|*1M z8LE>132r$9WStXFTdbuuCxoj=k_|Ud)=3OOn?lO78 ztu*d78aMO{#@&wZj5BH6#3k_i16|#l`$K_kjrGtq_6~g(;N^7!lXuZn>}1Z>G;UB> z8E9>*r;#)Jn#obGCDe6jxWAh@*6Thb1wz`g+L~Cx2CeJ{ghF7uo}~t-ZA694v&D;d znKI^mgDRh+SKg%Q$(Gj8g`LQ>*t^k+ia7Ai+W6?sZl?91LUymnyT_De3W+86n9{9V zv_Q3Z=>2%lv1ctSELj<;q%7JZDhR)-rnxoHxwLQ|;>SLRh&*rc*lmdPBhK5((w*YL z=PlmNUKeZy7;bGH3lX%Bj1CS)Hur61Hn)L?sQ)BMi0sa~rG*s@2)=ux6_>Y9)}u^- zq@Qlon|Q%uZmZwRd|MS;O`m&h8^)E~CkJ^zg+R4)X>QKL+*9PD-*BV(cD3Z50TI5} zwCFsRyhPqJBv8a3h)IN4KfuG$6biSRk zUoV~H+{-}IeYx7IJF!*O_^_$@K}B}XAtE~&LnX3%R$05x3q>YgvJ@{iTxG_sCTx`+ zmads73UVMOUDws!*B@c2NJdZ)(wJ0VyvV;n^RDGoZx>5NQYOarW*o_s(Qd%)GK+@3 z!G+whg*g&U*t~>E>W0E?Q+?AmK($dew?`Sl}m4&ZO6h2zp zjMxjzA%tVH4H$y-!=dwcghoa;v6LKw65Bum0V!8pHLkf!@+37~;HTu9%JwK37zhNI zt-z#Qz)ZjR^|+QX@r7lUEdVPhKzXlY#n#VF$4#Zyuirjyj?=y}9sep`Gn;44Si~|y zh@_Is7}>mQG&B;~GCa6lX|tp)G4WUTR?&{A+171<8ER{26b^`^k07eA$WWlS=Smbq zU2W0**z+VYz4M-aL}69uYh|m{0cP8-M`Uvb#D;fyR|MSr;{pYcYWhO_ zHq^9xryO?kF2JS^`yztG4BLCLM2QajLUJsir7w}x^l_(uQ{4X^_u0Rt4>UJyok-Mz z;X;!k&^6@gSaPwEP$u_7E1`UHsYzD?F?Q(i1x%ZPLVFqTW!i%Jg!Pq=xFFd+?Q9Gq|Pm^7WZz5 zD_J#1?L1?{Ce2klbV#Op=jq#a{#2xt1(QgW09>dxUhX21dsbXd-eP@YB`yJj`y)er zLolV5(r;R#yk+9-v*L35&QJikuWIB@&^>5dtf0%G&B6(s+D?V->!b~lGT=G(D@#tDP&(ar1BrRVERKnnjVqyUEJ4DJQ5|@bYBl?2(fun+R@yDPs`<9w zsav%pw|DG5Zn{zX`W$icJ)TvVwtI4iDW|U}LfMd*-E~0x9UDJwPc#>y?L`72W1m$y zd;8^I>Fixfw4mz#|2un^A-4z5KgQX!Umk5I{U8!9r}O&~4jI`e+ZD#fPrnlT3_HKE zf5*r+#D(aKxF`22vF3fAQ+c%l$PIpt+>$CynsV)wyprvRu`{m|PrT2w&ED%}`lp?F z#-^r!8e1U985epY>jvrw<%Y*qKPXko%5TI6^m$}-TS!Wt*+YXPebN&<_CGDxYO1_G zFRt+V6>+;g^HX3k4GbcQyfD(YMIuM~My`J?Ze~Kzfj9*nVL42(8E5XE9?HBD7VsnG z+XqJ39H)*FXud)`aR?@Eq<^rdyFVJ@Cl%py!G$9!QA_fZ2;%HVeFM{A&M_xUIVo!A z>@Sqt0g)-3;voAr#sF}_f+NdQ^+!fHG}v;?n_)y~bmTJl05CO>5|-*cy5j(I;#>!L z1_q4@b6j#5Ip_$KQR4ELWon9DrsgTjl)OTg8NSa-W6@fOckB8GN67a%B~9&Hr801V z`9^|4S(LmrQKhLf+KGcj%{?a9Ec=;YMDl$Wu#8TscTuckK;{|7;_s3SEK=X$nTwdV znl{E7%1zTgm~P9au2tN=G9Y`%v~@twUQd}}@!)2YXFl_7P&;UPP3zXDAy-lb?rcSrcrknNslGH;J9g+K-&FdA1-{F-LX>m>4 zt|UVZKF?ujBnqg_W7<{F3!bY@=qAl+O-Fm+%+(DY>v29P@ft&K!J57nX!au{_@S`p zFyD3bQ%bLfuBJeJClb(gGv}}w*TYn+7&~&#J$crhEMrVm%+%6F!>=tV`HACtqZQB* zH!1_pev>rLWN`mxan0)ZK}h8vPi%}Ujf2o;t_zOsi~Fg`U2?qzCcA!kL0R&_J>tav zxRQwjapo``JF2fBe+P$^;P7Nb-ILnZl@*f?3fNUSDB#ga$ELn=vSxN{&B|!agdA0K z51mSq`Z75W5dDOgsqv`EyxU}hqvjm9U|NnHjQh+oaX8Lwn}z-~Ha6{PK6Z87XSRtO z;}UHFl}dji?$|`!XQqko#+4p7pNONgBAbuB6!-9ZX76R9dnDd{{1->#KQX!e-=oNk zK6E`pvgi2IkH*g}JN9mTzd!7Bqt7*vD?Qs_boPuQnU?ASXgxsc_y+ zp9mu_iAIra>3YxZnTeQKgq+RCQWeG( zPf}(yD9W9OrKc+igdL4WkJOnirY%P&JWZ#agXXDIkha1I8WMLP7|I+grwur9m8#;e zsA8$DMhsbbaEWa=RVJkuPV}U;Pbq}SXg^b*m`djAn9gGBSZb#}n!ti9WOlC0$QG@} znnTV}mzZ~r2-~>FzLsEQ98|9px7m2r()9`;je`yNZCL+lXW_#z`>|Cvv9yf@p?*dW zPMs|r3EaKn8?s)M*UrJ`R9@Sp^IA$b`YJngEybkl$ZqPkdp^>dU_QAP`6>GGI(;SV zTcT+Gtx>e}Fy;oyPU$2oObQa<&>f>wb`*Nj&cjD`ztLu(`H+fAPlh`jIB%zvy1|%( z1{+Am90GwvoVkPP-s(7-i)6_`+||sCPyoarvm|#J(iA zhLRfOe}M~ayLDE`iHLGL&o=E5tL!`@h0<=434$`)CjN8;?(rtJWWTt>&KH{whGmLDR&JF8pHZl7l`h;P%iKQbssh7ZwCqKG}@*IfgQnGTBzHM=e zZ+ka@UP@YSii&J0tB`+8r3_|gJ4voaNM@EoDNMzDvbk$W$m#7}8!ejJp67^oFp0au zX)>3ow<{UfH#MI*5^a?-nvF57iYRH>Dy25{Mv*r=?I1ljMhg(wpizn^lDIbiCIZt| zkyh3w=DS(q8LDcF(S_t&05_BmEBvnc$}(Mr}7NbeWERuFEV{!97=_rx?lV# zl?P1^h)+_{-h(33fjqacC zobAX)<~}Zg8#fk3fkmwNG2uw#MU6jDJ?Y)MFjBIhWKT&&WeM~BPys7@4*(ijP!b{V zrObzn7L7Pq*}De?LA`)w{#aa+#xoZEL@%zWzzjx8YHE=lYh2z0)1!pBeyY>la$wr+}Cu;mW=#YG?2@* z6YNr!eR9mjv(jIR7AW=ON6Kqb5qdOayV$H(NU7-KJQ%A+A$?vY=@X+^Nf4(a^F@Aw zUI!AEf?Fhz-vGJ9Hw_WGkGbDEjl|4+8`B`OE&D?Qy^%q9fl^|?b>qm8Q9LvWNilh5 zv!tkmCB6%MnPPz;u78i+#60h-4n(`%-rd{6l0Hz=K9H#vrz{&r{u>ol?lz@wyJ`;yLe0lZfK%(QjmCW-6L;8a_VpYSc zK=Vj_-`2iSmh@jB$kfS#Jxu!_=;VGW;=DY^^%d0Rw(bM++*#i!bt?F^nD6D~*|^<- z^X{-8ajyeE4%93e?c0t>X*HW=Hi>;+UgpH54k}S_7%(2INj&N0u5yI8p@a`?MGRmw zomK3Wz3|{h0Uhw2x=tQ0D>*H>Hj~Kk@$9hO6qqZ9wjrFIh^QXC2MTM`*?S6W)46IV z!rC-MeJvY0>llO`n%u?gh;qx5$`vdTfo^@!Omo6b^SKOfPOm7VCVN;SV%>83u+FJo zQyxxNk12NB2zK+Kkk}2!thIDdDasJmbY2+F)PsF7{E`J!={tj8vQ?OoXS#}ZVRLMI;?c(lqo)#)G zp6L4cIlXsDA8lQK6#rSO;!(9W&HQ3X=w zEIXjqYiteov>Va7vaIub{u6jNqyCSM|tgdbMeCeGX!8?9tCxWzP}! zW$-N1T=7f>G~PV%mkgesh1e;bw$iIK%`$#8vBCwSAd~yE5I&8;Xf-feTUq8J(VfXN zY>22*y1i(L*q6x*O-sf1GNGTAiJxck@)>8S>i&|ACHppRWT`dAcM-me7)LmjD(BUS z>@1!euBRy+G5S+m8|di50TP5&$$E7(PGLZt@LsMa!`Y-}UhjP^R?gjQ%!49wshp%0 zsANFxUi??biL44ffwAZ(VBsZgEIPngM)1-NoWU`z*WY6Ia75v zsY5NcpJax+Q?05$xWBu%H&WLj&RWG7FALB(^`0Q}(@xN>R$cirM#}rdn-nKM1-Gh?+d^ zjJp)S7hfheEjRQuzh22&KBjY|P>s^6-vD}r z<6?6@_uFn%Tv>gSIGoR`Y&WaVtXssh`8+f6R(-CjS<&s{@A78PZd$1D*jZZA8Ezdj2v03HBM z=Yys|m5gk{ZUwJnppJ*sBuoMxHZ{q)h(h>L>NND=BYLN+nD!{B@nia6jsq^$8Pgsk z_zx)H*vppuNCfPpCi0Yn03;bNN*HpgoTIGoBDP`*~^Jlc-0kuNrm^ zPKlu;@hQDN41+VC7QgrNWm!MR%59!*0BFAe_JUuEWrcix#xthC908qwU|nRmdthrQ z5+svq0V{k~TvN#X6~9)QaP2wNaXhbDhz?$R0Z{vk=nC07b7A_L#>LXT3E3_EBRER` z3QAL6CF7zShNizT*vOJzGmQ^IQuqt2aEt17%mr*X`Qdz1AJM#h-I0qz!-LD1_FE8W zdrPzy@z(0M_0=Mg>iHdUBpvV3`CM9;_IE&mv^V7PyQrD*o;Xp&({tX}3D4gru_N96 z7k2N0O!)vfbAB)4i+Oe0A9Nhdo%Tn-1Ah{$iuvrg5Aoack=R|#-R&O(N7;1D{s}~W zaEvx@;$QT=imLX%0)-YE#^c{mlYdH!-NWpEk4Bem|B$;N!uH=Ci_EM}-Sin!XXW@)fs zYo%yrDH?QBCOHlz5D(3*^>B2xcvN$6bBwWrDyen07$g9+1oJJ-WhXRa^D zmQIvCSD(v;2uq%r@q`a3%_1H8^LXy-6k91Zm7?D?+&ev);p|D}<>Gk(+YhPFh<{Snsr86bJSV z8C|Z5DJ`|O62(frv8pMJQBhj;B!LA7rO`DBEF0#FPnEtC%p5cnCL`Q zYPc3mZLJlKSKcDgHWPN^;!}t?mqdx6Ux!H)@ugT;`nyd3dxrX})nEa9wK4dWhbP5T z9av3?ry6Fjr*?276Jf&!o%QB2Ph$>k5OPGPu)uOP@Qfy5pT*NFn$5<^Xyevm<_e?D z&dx)UXvpERoG~z z{L2B^(af{e{HSPb<&3@kp#da+kThoYZ|Du7tLLDeeG{gs0`hVf)4K8P+)Nt{p%pbA za{lc-lT~`n;X^Pgr?8)Lw6*|A%3$W%rbxu%!9vU?))3 z0QfFlPF$pS2A0FcsGV?$Atn;ONs>YCq;DyPst${f1H3A{Tc3GDgeOPz9xT9OF}{aH z1?;rFSS=i5(wyp=?4@CoFY5WK!{vs7@~bH{La*2#&r|& zT|iElpmnA>=6CBn_+4H8e@~a2_ZagldwUs)nb?%Wy=MKS;C*J9eS+reWHY}n9;x7E zh#$A5{REl6nNcjg(aCqxdjVQUk~u z9EkGgvvlL*nMJ3>)FOZfqyM$8?zrhjOb=kbsbMx5(M=Cbg#Szuur_db>`&n@EMHuiO?p~! zjdW|$elFKee-~h1IDY^)C8D+Mztn5NHvLshE!Q)#wPsfAMK$eNVvS!b)^I(iwtDR4 zp2X+DoVvZJy#VCo7txS$-j_K}qDmM+HCd+)DJ1(#Mg^w*2KZ?&lWw6oHuydH6}9jE zb%DALW`7mR|AFOBRNZbwMo(=Yfl`DSrWn`6FNzItIYf|0-^q!@c38 zze&bZhp+6Pg6#$n^a!w&zfWPvw11#vO8zwYpJuwtzeJv5V77nh44LzPU`V|YrLQ{! zda9s#fI0rHI1q!ka5X5T~Ik#T{n{=SW zbQUTgrRtEn?Hkz297OJtz2UMwAf5IBTK}3U0HFGq@($PSuV1<~ynCEA&1QJb5 z1=?*fDllyoXwPUB=Pl-?rZ#ciVqQM`%oq|#$aLt)m9U*UV~aq%c(wR+F)#A30Ttg` z3mLXBFL1w5?hGVMC=R(!wmh+v`?ev}#Q1uPJhsO-sK55JP%g7=Oxp-LNoQLi&PfFz z2IKsOzR_bYJDh{Q0wk15LwigBV5UA_(xCP&itri$e zBs=uTgL|7KH!X?MXOYnfN}~AAl>#Ovi88AnG=gKI`=r?;>euj8*LHMS=@dR-k#2YC zpxCyCmxPBDzeM9CDd)@CKyXA_+1fDr#78X3#2%&T-Nl?c)S!(@FmzKcP@Ryf7B>Ec zRBfk@zUvh9?2B~tGJ5Z-3dROhL1ax$M+BcN>0&B{$2JE`=>Mi#)4;KHd^oW!#ZIRQ zYiJGe1Qkn7G(Ob}QmILk-%vZukv#cLuW7K<6a&ym1dc!1%a;uUOo-hDQaHf z?lYPXvXm>LBM8*v^UBFjbS>rZrKQ^qCflF!zdk>Cb)QSG{FhAJ+#{XkW4{4hphlEItsBa%PT`uwqO zO(gvUnh)px=#)Ei{1hMbD|%1&aRB0_U9s^AQTsZtveL^7;-c4i;f5!r&Qu0!;?IbT zdbYv)6n^U#MsuWl$Ij7RL%87MemV+TcE3Bbt}DG)e)kH&^r4r3PrjGBSDt_jE+##-j0XGfKfAqA@s5t&x$MFfM)r% zc=Qck)LQf$nj+g^p?qv&Nx_9PXN@lDT8|yS1eZ4PqoIJgo|nXi_biFDozqd@*4nb3 zIbTq)nXst|xVD3pz9^dCghg;doc|^-jz1|8x<%WYJVU(uCXY9lz9gO`gx`pd-b9G+ zWr=`>Dk`h0=S1)b)y^gIzPI-kIsO*;3J_hkk3^X3HPnZZuii0HZlvRN zg3)soWHHkl6>sR~O75HBX1Soovrgi%J55O$-rpJ~u3n70n7FH$`Ibdq?_TG78|A0D z_Tc;7DR7!BmidkjUkib)u1VVSs}ANoa(kVJ>+Q}PGkLU|jw3--1S&cfxu(H+AB z^iYESkcak1(6to)$s)dZ$zBltP;DFIvW9xrE>fc&0daq%Ho8Gl4mAJc(^RRBG-A0T z#KtV+&zK2X!)RBGi75C4CDN@h+7siyu{*qfQO(db&t_aa#6P&R_g9N}@;7#O+27D# z`=^8<6R6tX@$LKv$s#fx==Bfvw8uX!^t4C#U%Dyte`+>hw0S>6tC#@eQM)=gvt13$ z`T6uEV2=Mp7iz&F5)3*2jRGoy2la!I@{uQc&8FagdapVIbXcenws6YcJWjl36l89zM1bq1KRZQza%ccj`o_5Cb*2`FTOi(eb%`W;R~T_Sr2iAS zacycob0+)r+96*Cv^`itsYdz4s}qF zhU1PMB?r=Qv5v6Iqu9wAQ7lZZ16OX&&6ROV@(L(UNtbUV4>K(r?Rj$4`#oj3`iV}E zC!^7et4Xxgr|=fUYd#)j$;Z2sjsl&|@aT?n@3>+7)q8MF=d-ataZZs?0>t|GPAH?}uw>$<&s3GC zbd633I&s5Bil+_jH82e2bHjYL{`yk@{go#LnO08Zg2o#c0y%1e}YJza_ZrTVvivD2HQ zEyD=Y&H!_fO=ASxnN|aER;_sNL!RlVo8*If0yl`Hk8u8Pxd?y63&hHgxHG>Aj7JBV zz+BNMz3jNsql7gpT}ikl>szLxbujy?D2}}?y3iUf>@eS%bW0W{gr z?ip8W_u}}Eocw0Oc#_t#PpYZwdcANY-zV8!$iOD>; zW#X^geBAsg|0>=b8lL!^^G7YVFP+D~blNOgvtfvQ8;d1FvVRU@5^JhQ$q*V*8!46)@uB?}+UUmPO&a6oA++nJzQvY!_jUyYZ!bkXrd> zpp$Mi7-3K4XL#`Zmk}GB2*Q6?_e0@EFG_cQQk+C1Z`={zK;(X zwU!T0+wRw|1mr(JgQQ_xsjMEAsn}~Y#k2=8*?A9%ok3eJu0-4rwB@Wl3XtoOQzfPA zQN^h-)5f%8Ku$hBMS4C4kmCmc$-SjoWLZBHNfoxt@Q)N-Wf8@yE!U4vL;WWp<@u>v zeQ8?l)2%M1J&q#&g#N}Gz57Kml)!xX>@+?1mGKlkI7x95)s}kHFiyUQ_%yxqmf^z% z2UQMvxN0Rm3nX89^Zi1+U19U$#)Dow^-V;)@0?U=^JP3^6h~{Tciw!@ie;5HZ}`{p zYAJTqb4*Iym=>JR$AW6*-PjjmLF%Z@$Lz`dz~Gc$k2JvM=TlIXVMy13P^ua76h89SwFG_?>N^(=t#u~ zg%$CKRbV7(2|f(Xn7owg&=}}RQ_nK`ie7b-Wbmr|8M-XVtiizR$gn!)1x9=A(Z9p$HB-HHvdm*V2oJlcPypH~B3GvR+w$nb4j@)bJ(kq(x=s Mf_W!iw%_;v0H{1-Bme*a diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index 4252efe9..071277cd 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -105,11 +105,11 @@ SEEK.END .EQ $04 *-------------------------------------- * .EQ $00 * .EQ $02 -SYS.Stat .EQ $04 -SYS.MKDir .EQ $06 -SYS.MKNod .EQ $08 -SYS.MKFIFO .EQ $0A -SYS.FStat .EQ $0C +SYS.FStat .EQ $04 +SYS.Stat .EQ $06 +SYS.MKDir .EQ $08 +SYS.MKNod .EQ $0A +SYS.MKFIFO .EQ $0C * .EQ $0E SYS.OpenDir .EQ $10 diff --git a/SYS/KERNEL.S.CTRL.txt b/SYS/KERNEL.S.CTRL.txt index 438c76d6..53725dd2 100644 --- a/SYS/KERNEL.S.CTRL.txt +++ b/SYS/KERNEL.S.CTRL.txt @@ -13,23 +13,33 @@ A2osX.D1.S .EQ A2osX.D2-A2osX.D1 A2osX.D2.S .EQ A2osX.E0-A2osX.D2 A2osX.E0.S .EQ A2osX.E0.E-A2osX.E0 *-------------------------------------- + .LIST OFF .DO A2osX.MAIN.S>$700 + .LIST ON * ERROR:MAIN too big + .LIST OFF .FIN .DO A2osX.AUX.S>$C00 + .LIST ON * ERROR:AUX too big + .LIST OFF .FIN .DO A2osX.GP.SC>$1E0 + .LIST ON * ERROR:GP too big + .LIST OFF .FIN .DO A2osX.D1.S>$1000 + .LIST ON * ERROR:BNK1 too big + .LIST OFF .FIN .DO A2osX.D2.S>$1000 + .LIST ON * ERROR:BNK2 too big + .LIST OFF .FIN *-------------------------------------- - .LIST OFF MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.CTRL LOAD /A2OSX.SRC/SYS/KERNEL.S diff --git a/SYS/KERNEL.S.INIT.txt b/SYS/KERNEL.S.INIT.txt index aca3fe73..fe3b9d58 100644 --- a/SYS/KERNEL.S.INIT.txt +++ b/SYS/KERNEL.S.INIT.txt @@ -133,7 +133,7 @@ Kernel.Init3 sta SETALTZP ldy #S.PS.hPREFIX lda (pPs),y - >SYSCALL GetMemPtr + jsr K.GetMemPtr >PUSHYA @@ -166,7 +166,7 @@ Kernel.Init3 sta SETALTZP bcs .9 pla - >SYSCALL FreeMem ...discard... + jsr K.FreeMem ...discard... >LDYAI MSG.Init3.OK >SYSCALL puts @@ -914,7 +914,7 @@ TskMgrInit >LDYAI MSG.TSK >SYSCALL puts >LDYAI K.ENV.SIZE get a buffer for ENV - >SYSCALL GetMem0 make sure blank!! + jsr K.GetMem0 make sure blank!! bcs .9 txa diff --git a/SYS/KERNEL.S.IO.txt b/SYS/KERNEL.S.IO.txt index 7648aeb0..9890a82b 100644 --- a/SYS/KERNEL.S.IO.txt +++ b/SYS/KERNEL.S.IO.txt @@ -4,7 +4,7 @@ AUTO 4,1 */-------------------------------------- * # open * ## C -* `hFD open(const char *pathname, int flags);` +* `hFD open(const char *pathname, short int flags);` * ## ASM * **In:** * `>PUSHB flags` @@ -12,32 +12,149 @@ AUTO 4,1 * `>SYSCALL open` * **Out:** * A = hFD -* note : if file is created on ProDOS : T=TXT,X=$0000 +* REG File created on ProDOS : T=TXT,X=$0000 *\-------------------------------------- -K.Open jsr PFT.CheckPathYA check if not /mnt - -K.Open.I jsr STDIO.SetMLIPathYA local pathname... - >PULLB K.FOpen.MODE +K.Open.FLAGS .BS 1 +K.Open.TYPE .BS 1 +K.Open.AUXTYPE .BS 2 +*-------------------------------------- +K.Open pha + >PULLB K.Open.FLAGS + pla +IO.Open.I jsr STDIO.SetMLIPathYA + + lda #S.FI.T.TXT + sta K.Open.TYPE + stz K.Open.AUXTYPE + stz K.Open.AUXTYPE+1 + ldx #5 $/DEV/ cpx K.MLI.PATH - bcs K.Open.REG + bcs .2 .1 lda K.MLI.PATH,x cmp IO.DEVDIR,x - bne K.Open.REG + bne .2 dex bne .1 *-------------------------------------- -K.Open.DEV >LDYAI K.MLI.PATH+6 skip $/DEV/ +* CDEV,BDEV,DSOCK,SSOCK,PIPE +*-------------------------------------- +.2 >LDYAI K.MLI.PATH+6 skip $/DEV/ jsr K.GetDevByName - bcs .9 + bcs IO.OPEN.RTS >STYA pFD stx .1+1 DEVID - jsr K.IOCTL.GetPDrv + lda (pFD) #S.FD.T + tax + jmp (.3,x) + +.3 .DA STDIO.IOERR REG + .DA STDIO.IOERR DIR + .DA IO.OPEN.CDEV + .DA STDIO.IOERR BDEV + .DA STDIO.IOERR LNK + .DA IO.OPEN.DSOCK + .DA IO.OPEN.SSOCK + .DA IO.OPEN.PIPE +IO.OPEN.9 sec +IO.OPEN.RTS rts +*-------------------------------------- +IO.OPEN.REG >MLICALL MLIGETFILEINFO + bcc K.IO.OPEN.REG.E Already Exists + + bit K.Open.FLAGS Create if not exists ? + bpl IO.OPEN.9 No, return MLI error + + lda #S.FI.A.FULL Yes, Create... + sta K.MLI.PARAMS+3 Access + lda K.Open.TYPE + sta K.MLI.PARAMS+4 File type + >LDYA K.Open.AUXTYPE + >STYA K.MLI.PARAMS+5 Aux type + lda #S.FI.ST.STD + sta K.MLI.PARAMS+7 + + ldx #3 + +.1 lda DATELO,x + sta K.MLI.PARAMS+8,x + dex + bpl .1 + + >MLICALL MLICREATE + bcs IO.OPEN.RTS + +K.IO.OPEN.REG.E >LDYAI S.FD.REG + ldx #S.MEM.F.INIT0+S.MEM.F.FD + jsr MEM.GetMem.YAX + bcs IO.OPEN.RTS + + >STYA pFD + stx .8+1 save hFD + +* ldy #S.FD.T Done by GetMem0 +* lda #S.FD.T.REG +* sta (pFD),y + + jsr STDIO.SetIOBUF + bcs .9 + + >MLICALL MLIOPEN + bcs .9 + + lda K.MLI.PARAMS+5 get ref_num + ldy #S.FD.REG.REF + sta (pFD),y + + sta K.MLI.PARAMS+1 Next MLI Calls are REF_NUM based + + lda K.Open.FLAGS + bit #O.WRONLY + beq .20 Write mode ? + + and #O.APPEND Append ? + bne .11 yes, go to end of file + + stz K.MLI.PARAMS+2 + stz K.MLI.PARAMS+3 + stz K.MLI.PARAMS+4 + >MLICALL MLISETEOF no, reset size to 0 + bra .21 + +.11 >MLICALL MLIGETEOF + bcs .9 + + >MLICALL MLISETMARK +.21 bcs .9 + +.20 lda K.Open.FLAGS + and #O.TEXT Text Mode ? + beq .8 + + lda #$FF + sta K.MLI.PARAMS+2 + lda #C.CR + sta K.MLI.PARAMS+3 + >MLICALL MLINEWLINE + bcs .9 + +.8 lda #$ff + rts + +.9 pha + lda .8+1 + pha + jsr IO.Close.I + pla + sec + rts +*-------------------------------------- +IO.OPEN.CDEV jsr K.IOCTL.GetPDrv .1 lda #$ff SELF MODIFIED pass A=DEVID To Driver ldx #IOCTL.OPEN @@ -48,11 +165,13 @@ K.Open.DEV >LDYAI K.MLI.PATH+6 skip $/DEV/ lda Dev.Table.hFD,x .9 rts *-------------------------------------- -K.Open.REG lda #S.FI.T.TXT - sta K.FOpen.TYPE - stz K.FOpen.AUXTYPE - stz K.FOpen.AUXTYPE+1 - jmp K.FOpen.I +IO.OPEN.DSOCK +*-------------------------------------- +IO.OPEN.SSOCK +*-------------------------------------- +IO.OPEN.PIPE + clc + rts */-------------------------------------- * # close * ## C @@ -62,30 +181,26 @@ K.Open.REG lda #S.FI.T.TXT * `lda fd` * `>SYSCALL close` *\-------------------------------------- -K.Close jsr K.GetMemPtr - bcs .9 - +K.Close pha save hFD + jsr K.GetMemPtr >STYA pFD - lda (pFD) #S.FD.T +IO.Close.I lda (pFD) #S.FD.T tax + pla jmp (.1,x) .1 .DA IO.CLOSE.REG .DA IO.CLOSE.DIR .DA IO.CLOSE.CDEV - .DA STDIO.IOERR BDEV + .DA IO.CLOSE.BDEV .DA STDIO.IOERR LNK .DA IO.CLOSE.DSOCK .DA IO.CLOSE.SSOCK .DA IO.CLOSE.PIPE - -.9 lda #MLI.E.NODEV - sec - rts *-------------------------------------- IO.CLOSE.REG -IO.CLOSE.DIR +IO.CLOSE.DIR pha save hFD ldy #S.FD.REG.REF lda (pFD),y beq .1 @@ -94,14 +209,15 @@ IO.CLOSE.DIR .1 ldy #S.FD.REG.IOBUF lda (pFD),y - beq .8 + beq .2 + jsr K.FreeMem + +.2 pla jmp K.FreeMem - -.8 clc - rts *-------------------------------------- IO.CLOSE.CDEV +IO.CLOSE.BDEV *-------------------------------------- IO.CLOSE.DSOCK IO.CLOSE.SSOCK diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index 86f7fdcc..5c0a0044 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -8,11 +8,11 @@ AUTO 4,1 *-------------------------------------- K.SYSCALL.JMP .DA 0 $00 .DA 0 + .DA K.FStat .DA K.Stat .DA K.MKDir .DA K.MKNod .DA K.MKFIFO - .DA K.FStat .DA 0 .DA K.OpenDir $10 diff --git a/SYS/KERNEL.S.STAT.txt b/SYS/KERNEL.S.STAT.txt index e8400ec5..ff481c88 100644 --- a/SYS/KERNEL.S.STAT.txt +++ b/SYS/KERNEL.S.STAT.txt @@ -3,7 +3,7 @@ PREFIX /A2OSX.BUILD AUTO 4,1 *-------------------------------------- * # FStat -* Return information about a hfile +* Return information about a hFILE * ## C * `int fstat(short int hFILE, struct stat *statbuf);` * ## ASM @@ -14,38 +14,14 @@ AUTO 4,1 * **Out:** *-------------------------------------- K.FStat jsr PFT.CheckNodeA + jsr STDIO.GetHFile + bcs .9 + + lda Nod.Table.hPath,x jsr K.GetMemPtr + bra K.Stat.I - >STYA pFD - - lda #S.FD.REG - clc - adc pFD - tay - lda /S.FD.REG - adc pFD+1 - jsr K.Stat.I - bcs .9 - - ldy #S.FD.REG.REF - lda (pFD),y - sta K.MLI.PARAMS+1 - >MLICALL MLIGETEOF - bcs .9 - - ldy #S.STAT.SIZE+3 - lda #0 - sta (ZPPtr1),y - - ldx #2 - -.1 dey - lda K.MLI.PARAMS+2,x - sta (ZPPtr1),y - dex - bpl .1 - -.9 rts +.9 >RET 2 discard statbuf */-------------------------------------- * # Stat * Return information about a file diff --git a/SYS/KERNEL.S.STDIO.txt b/SYS/KERNEL.S.STDIO.txt index 5c2aab2a..d20ba97f 100644 --- a/SYS/KERNEL.S.STDIO.txt +++ b/SYS/KERNEL.S.STDIO.txt @@ -18,22 +18,25 @@ BCDBUF .EQ ARG * `int fputc ( hFILE stream , int character );` * ## ASM * **In:** -* A : character -* Y : stream +* `>PUSHB character` +* `lda stream` +* `>SYSCALL fputc` * **Out:** * CC = success *\-------------------------------------- -K.FPutC sta K.IOBuf - tya +K.FPutC pha + >PULLB K.IOBuf + pla bra K.PutChar.1 */-------------------------------------- * # PutChar +* Print A (char) to StdOut * ## C * `int putchar ( int character );` * ## ASM -* Print A (char) to StdOut * **In:** -* A : char to print +* `lda caracter` +* `>SYSCALL putchar` * **Out:** * CC = success *\-------------------------------------- @@ -43,14 +46,13 @@ K.PutChar sta K.IOBuf lda (pPs),y K.PutChar.1 jsr STDIO.GetHFile - bcs K.PutS.9 + bcs K.PutS.RTS - ldx #1 + ldy #1 +K.PutChar.Y lda #0 -K.PutChar.X >LDYAI K.IOBuf - >STYA K.S.IOCTL+S.IOCTL.BUFPTR - stx K.S.IOCTL+S.IOCTL.BYTECNT - stz K.S.IOCTL+S.IOCTL.BYTECNT+1 + >PUSHYA + >PUSHWI K.IOBuf jmp IO.Write.I */-------------------------------------- * # PutS @@ -64,21 +66,22 @@ K.PutChar.X >LDYAI K.IOBuf * **Out:** * CC = success *\-------------------------------------- -K.PutS >STYA K.S.IOCTL+S.IOCTL.BUFPTR - >STYA ZPPtr1 +K.PutS >PUSHYA ldy #S.PS.hStdOut lda (pPs),y - jsr K.FPutS.I - bcs K.PutS.9 + jsr K.FPutS + bcs K.PutS.RTS - lda #13 + lda #C.CR sta K.IOBuf - lda #10 + lda #C.LF sta K.IOBuf+1 - ldx #2 - bra K.PutChar.X -K.PutS.9 rts + + ldy #2 + bra K.PutChar.Y + +K.PutS.RTS rts */-------------------------------------- * # FPutS * Write Str to FILE @@ -92,34 +95,14 @@ K.PutS.9 rts * **Out:** * CC = success *\-------------------------------------- -K.FPutS pha +K.FPutS jsr STDIO.GetHFile + bcs K.PutS.RTS - >PULLA - sta K.S.IOCTL+S.IOCTL.BUFPTR - sta ZPPtr1 - >PULLA - sta K.S.IOCTL+S.IOCTL.BUFPTR+1 - sta ZPPtr1+1 - - pla - -K.FPutS.I jsr STDIO.GetHFile - bcs K.PutS.9 - - ldy #0 - ldx #0 - -.1 lda (ZPPtr1),y - beq .2 - - iny - bne .1 - inx - inc ZPPtr1+1 - bra .1 - -.2 sty K.S.IOCTL+S.IOCTL.BYTECNT - stx K.S.IOCTL+S.IOCTL.BYTECNT+1 + >PULLYA Get String + >STYA ZPPtr2 Save Buffer + >SYSCALL strlen Get String len in Y,A + >PUSHYA push len + >PUSHW ZPPtr2 push buffer jmp IO.Write.I */-------------------------------------- * # PrintF/SPrintF/FPrintF @@ -189,8 +172,8 @@ K.SPrintF >STYA pIOBuf Out Buffer >PULLW ZPPtr1 format bra K.PrintF.1 -K.FPrintF jsr K.GetMemPtr A = hFILE - >STYA pFD +K.FPrintF jsr STDIO.GetHFile + bcs K.PutS.RTS >PULLW ZPPtr1 format bra K.PrintF.0 @@ -199,15 +182,14 @@ K.PrintF >STYA ZPPtr1 format ldy #S.PS.hStdOut lda (pPs),y - jsr K.GetMemPtr - >STYA pFD + jsr STDIO.GetHFile + bcs K.PutS.RTS K.PrintF.0 >LDYAI K.IOBuf >STYA pIOBuf - >STYA K.S.IOCTL+S.IOCTL.BUFPTR -K.PrintF.1 stz K.S.IOCTL+S.IOCTL.BYTECNT - stz K.S.IOCTL+S.IOCTL.BYTECNT+1 +K.PrintF.1 stz PrintF.Cnt + stz PrintF.Cnt+1 stz PrintF.GetByte+1 @@ -269,7 +251,10 @@ K.PrintF.1 stz K.S.IOCTL+S.IOCTL.BYTECNT bcc .1 bcs .99 -.8 jsr PrintF.Flush +.8 lda pIOBuf+1 + eor /K.IOBuf + bne .99 + jsr PrintF.Flush bra .99 .10 cmp #'\' @@ -299,7 +284,11 @@ K.PrintF.1 stz K.S.IOCTL+S.IOCTL.BYTECNT sta pStack CC pla plp - rts + bcs .9 + + >LDYA PrintF.Cnt + +.9 rts *-------------------------------------- PrintF.ESC jmp (.1,x) .1 .DA PrintF.B,PrintF.BB @@ -646,9 +635,9 @@ PrintF.GetByte lda #$FF SELF MODIFIED LStack Ptr *-------------------------------------- PrintF.COut phy - ldy K.S.IOCTL+S.IOCTL.BYTECNT + ldy PrintF.Cnt sta (pIOBuf),y - inc K.S.IOCTL+S.IOCTL.BYTECNT + inc PrintF.Cnt bne .8 lda pIOBuf+1 @@ -657,25 +646,29 @@ PrintF.COut phy * we are printing to IObuf, flush! - lda K.S.IOCTL+S.IOCTL.BYTECNT+1 + lda PrintF.Cnt+1 pha lda #1 Flush $100 bytes - sta K.S.IOCTL+S.IOCTL.BYTECNT+1 + sta PrintF.Cnt+1 + jsr PrintF.Flush pla inc - sta K.S.IOCTL+S.IOCTL.BYTECNT+1 - + sta PrintF.Cnt+1 .7 inc pIOBuf+1 - inc K.S.IOCTL+S.IOCTL.BYTECNT+1 + inc PrintF.Cnt+1 .8 ply clc rts *-------------------------------------- -PrintF.Flush jmp IO.Write.I +PrintF.Flush >PUSHW PrintF.Cnt + >PUSHWI K.IOBuf + jmp IO.Write.I +*-------------------------------------- +PrintF.Cnt .BS 2 */-------------------------------------- * # FGetS * read bytes from stream into the array @@ -953,19 +946,19 @@ K.SScanF.Fwd tya Y=char count parsed * # FOpen * Open a file * ## C -* `hFILE fopen ( const char * filename, short int mode, short int ftype, int auxtype );` +* `hFILE fopen ( const char * filename, short int flags, short int ftype, int auxtype );` * **In:** * ## ASM * `>PUSHWI auxtype` * `>PUSHBI ftype` -* `>PUSHBI mode` +* `>PUSHBI flags` * + O.RDONLY : if R and !exists -> ERROR * + O.WRONLY : if W and !exists -> CREATE * + O.TRUNC : Reset Size To 0 * + O.APPEND : Append * + O.TEXT : Open/Append in Text mode * + O.CREATE : Create if not exists -* TODO: mode="w+,t=TYP,x=AUXTYPE" +* TODO: replace flags/ftype/auxtype with mode="w+,t=TYP,x=AUXTYPE" * + r = O_RDONLY * + r+ = O_RDWR * + w = O_WRONLY | O_CREAT | O_TRUNC @@ -979,110 +972,34 @@ K.SScanF.Fwd tya Y=char count parsed * CC : A = hFILE * CS : A = EC *\-------------------------------------- +K.FOpen.PATH .BS 2 +*-------------------------------------- K.FOpen jsr PFT.CheckPathYA + >STYA K.FOpen.PATH - jsr STDIO.SetMLIPathYA - >PULLB K.FOpen.MODE - >PULLB K.FOpen.TYPE - >PULLW K.FOpen.AUXTYPE + pha + >PULLB K.Open.FLAGS + >PULLB K.Open.TYPE + >PULLW K.Open.AUXTYPE -K.FOpen.I >MLICALL MLIGETFILEINFO - bcc K.FOpen.10 Already Exists + pla + jsr IO.Open.I + bcs K.FOpen.RTS - bit K.FOpen.MODE Create if not exists ? - bpl K.FOpen.9 No, return MLI error + sta .1+1 save hFD + tax - lda #S.FI.A.FULL Yes, Create... - sta K.MLI.PARAMS+3 Access - lda K.FOpen.TYPE - sta K.MLI.PARAMS+4 File type - >LDYA K.FOpen.AUXTYPE - >STYA K.MLI.PARAMS+5 Aux type - lda #S.FI.ST.STD - sta K.MLI.PARAMS+7 - - ldx #3 - -.1 lda DATELO,x - sta K.MLI.PARAMS+8,x - dex - bpl .1 - - >MLICALL MLICREATE - bcc K.FOpen.10 -K.FOpen.9 rts - -K.FOpen.10 >LDYAI S.FD.REG - ldx #S.MEM.F.INIT0+S.MEM.F.FD - jsr MEM.GetMem.YAX - bcs K.FOpen.9 - - >STYA pFD - stx .8+1 - -* ldy #S.FD.T Done by GetMem0 -* lda #S.FD.T.REG -* sta (pFD),y - - jsr STDIO.SetIOBUF - bcs .98 - - >MLICALL MLIOPEN - bcs .98 - - lda K.MLI.PARAMS+5 get ref_num - ldy #S.FD.REG.REF - sta (pFD),y - - sta K.MLI.PARAMS+1 Next MLI Calls are REF_NUM based - - lda K.FOpen.MODE - bit #O.WRONLY - beq .20 Write mode ? - - and #O.APPEND Append ? - bne .11 yes, go to end of file - - stz K.MLI.PARAMS+2 - stz K.MLI.PARAMS+3 - stz K.MLI.PARAMS+4 - >MLICALL MLISETEOF no, reset size to 0 - bra .21 - -.11 >MLICALL MLIGETEOF - bcs .98 - - >MLICALL MLISETMARK -.21 bcs .98 - -.20 lda K.FOpen.MODE - and #O.TEXT Text Mode ? - beq .22 - - lda #$FF - sta K.MLI.PARAMS+2 - lda #C.CR - sta K.MLI.PARAMS+3 - >MLICALL MLINEWLINE - -.22 >LDYA K.FOpen.PATH - -.8 ldx #$ff Self Modified, hFD + >LDYA K.FOpen.PATH jsr STDIO.NewHFileYAX - bcc .80 + bcc K.FOpen.RTS -.98 pha save MLI error - lda .8+1 + pha save MLI error +.1 lda #$ff SELF MODIFIED jsr K.Close pla get back MLI error sec -.80 rts -*-------------------------------------- -K.FOpen.PATH .BS 2 -K.FOpen.MODE .BS 1 -K.FOpen.TYPE .BS 1 -K.FOpen.AUXTYPE .BS 2 +K.FOpen.RTS rts */-------------------------------------- * # FClose * Close a file @@ -1118,8 +1035,10 @@ K.FClose jsr PFT.CheckNodeA rts */-------------------------------------- * # FRead -* int fread (hFILE stream, void * ptr, int count ); * Read bytes from file +* ## C +* int fread (hFILE stream, void * ptr, int count ); +* ## ASM * **In:** * `>PUSHWI count` * `>PUSHW ptr` diff --git a/SYS/KERNEL.S.STDLIB.txt b/SYS/KERNEL.S.STDLIB.txt index 470a37b9..b24466eb 100644 --- a/SYS/KERNEL.S.STDLIB.txt +++ b/SYS/KERNEL.S.STDLIB.txt @@ -4,9 +4,9 @@ AUTO 4,1 */-------------------------------------- * # strtof * Convert String to 40 bits Float -* ##C +* ## C * `float strtof (const char* str, char** endptr);` -* ##ASM +* ## ASM * **In:** * `>PUSHWI EndPtr` * `>LDYA str` diff --git a/SYS/KERNEL.S.TIME.txt b/SYS/KERNEL.S.TIME.txt index c822e746..ecc0d2db 100644 --- a/SYS/KERNEL.S.TIME.txt +++ b/SYS/KERNEL.S.TIME.txt @@ -13,7 +13,7 @@ DAY0 .EQ 4 day 0 was a thursday * Get System Time in Buffer * ## C * `time_t time (S.TIME* timer);` -* ##ASM +* ## ASM * **In:** * Y,A = PTR to S.TIME * **Out:** @@ -29,7 +29,7 @@ K.Time >STYA ZPPtr2 * Convert ProDOS Time To S.TIME * ## C * `int PTime2Time (long* ptime, S.TIME* timer);` -* ##ASM +* ## ASM * **In :** * `>PUSHW timer` * `>LDYA ptime` @@ -164,7 +164,7 @@ K.ComputeWDAY lda #3 Thursday : 4 (-1 for mod 7) * Convert CTime Time To S.TIME * ## C * `int CTime2Time (long* ctime, S.TIME* timer);` -* ##ASM +* ## ASM * **In :** * `>PUSHW timer` * `>LDYA ctime` diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index a3c25559..f2fb6ff6 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -1,64 +1,64 @@ NEW PREFIX /A2OSX.BUILD AUTO 4,1 - .LIST OFF - .OP 65C02 - .OR $2000 - .TF SYS/KERNEL + .LIST OFF + .OP 65C02 + .OR $2000 + .TF SYS/KERNEL - .INB INC/MACROS.I - .INB INC/KERNEL.I - .INB INC/A2OSX.I - .INB INC/IO.I - .INB INC/MLI.I - .INB INC/MLI.E.I - .INB INC/XY.MOUSE.I - .INB INC/GUI.I - - .INB /A2OSX.SRC/SYS/KERNEL.S.INIT - .INB /A2OSX.SRC/X.PRINTF.S + .INB INC/MACROS.I + .INB INC/KERNEL.I + .INB INC/A2OSX.I + .INB INC/IO.I + .INB INC/MLI.I + .INB INC/MLI.E.I + .INB INC/XY.MOUSE.I + .INB INC/GUI.I + + .INB /A2OSX.SRC/SYS/KERNEL.S.INIT + .INB /A2OSX.SRC/X.PRINTF.S -A2osX.MAIN .PH $1100 - .INB /A2OSX.SRC/SYS/KERNEL.S.CORE - .INB /A2OSX.SRC/SYS/KERNEL.S.DRV - .EP -A2osX.AUX .PH $0C00 - .INB /A2OSX.SRC/SYS/KERNEL.S.OSD - .INB /A2OSX.SRC/SYS/KERNEL.S.SLIST - .EP -A2osX.GP .PH $BD00 - .INB /A2OSX.SRC/SYS/KERNEL.S.GP - .EP -A2osX.D1 .PH $D000 - .DA #RRAMWRAMBNK1 - .INB /A2OSX.SRC/SYS/KERNEL.S.STAT - .INB /A2OSX.SRC/SYS/KERNEL.S.DIRENT - .INB /A2OSX.SRC/SYS/KERNEL.S.STDIO - .INB /A2OSX.SRC/SYS/KERNEL.S.STDLIB - .INB /A2OSX.SRC/SYS/KERNEL.S.PFT - .INB /A2OSX.SRC/SYS/KERNEL.S.DEV - .EP -A2osX.D2 .PH $D000 - .DA #RRAMWRAMBNK2 - .INB /A2OSX.SRC/SYS/KERNEL.S.STRING - .INB /A2OSX.SRC/SYS/KERNEL.S.TIME - .INB /A2OSX.SRC/SYS/KERNEL.S.BIN - .INB /A2OSX.SRC/SYS/KERNEL.S.PS - .INB /A2OSX.SRC/SYS/KERNEL.S.ARG - .INB /A2OSX.SRC/SYS/KERNEL.S.ENV - .INB /A2OSX.SRC/SYS/KERNEL.S.MATH - .EP -A2osX.E0 .PH $E000 - .INB /A2OSX.SRC/SYS/KERNEL.S.JMP - .INB /A2OSX.SRC/SYS/KERNEL.S.IRQ - .INB /A2OSX.SRC/SYS/KERNEL.S.MEM +A2osX.MAIN .PH $1100 + .INB /A2OSX.SRC/SYS/KERNEL.S.CORE + .INB /A2OSX.SRC/SYS/KERNEL.S.DRV + .EP +A2osX.AUX .PH $0C00 + .INB /A2OSX.SRC/SYS/KERNEL.S.OSD + .INB /A2OSX.SRC/SYS/KERNEL.S.SLIST + .EP +A2osX.GP .PH $BD00 + .INB /A2OSX.SRC/SYS/KERNEL.S.GP + .EP +A2osX.D1 .PH $D000 + .DA #RRAMWRAMBNK1 + .INB /A2OSX.SRC/SYS/KERNEL.S.STAT + .INB /A2OSX.SRC/SYS/KERNEL.S.DIRENT + .INB /A2OSX.SRC/SYS/KERNEL.S.STDIO + .INB /A2OSX.SRC/SYS/KERNEL.S.STDLIB + .INB /A2OSX.SRC/SYS/KERNEL.S.PFT + .INB /A2OSX.SRC/SYS/KERNEL.S.DEV + .EP +A2osX.D2 .PH $D000 + .DA #RRAMWRAMBNK2 + .INB /A2OSX.SRC/SYS/KERNEL.S.STRING + .INB /A2OSX.SRC/SYS/KERNEL.S.TIME + .INB /A2OSX.SRC/SYS/KERNEL.S.BIN + .INB /A2OSX.SRC/SYS/KERNEL.S.PS + .INB /A2OSX.SRC/SYS/KERNEL.S.ARG + .INB /A2OSX.SRC/SYS/KERNEL.S.ENV + .INB /A2OSX.SRC/SYS/KERNEL.S.MATH + .EP +A2osX.E0 .PH $E000 + .INB /A2OSX.SRC/SYS/KERNEL.S.JMP + .INB /A2OSX.SRC/SYS/KERNEL.S.IRQ + .INB /A2OSX.SRC/SYS/KERNEL.S.MEM ********* TMP ***** go to A2osX.D1 - .INB /A2OSX.SRC/SYS/KERNEL.S.IO - .INB /A2OSX.SRC/SYS/KERNEL.S.FIO + .INB /A2OSX.SRC/SYS/KERNEL.S.IO + .INB /A2OSX.SRC/SYS/KERNEL.S.FIO DevMgr.FreeMem .EQ * - .EP -A2osX.E0.E .EQ * - .INB /A2OSX.SRC/SYS/KERNEL.S.CTRL + .EP +A2osX.E0.E .EQ * + .INB /A2OSX.SRC/SYS/KERNEL.S.CTRL MAN SAVE /A2OSX.SRC/SYS/KERNEL.S ASM