From f052f2294e21f9a1f5bbc76896f360809aa087b0 Mon Sep 17 00:00:00 2001 From: Tiberiu Chibici Date: Tue, 14 Sep 2021 18:35:13 +0300 Subject: [PATCH] CTAOS v4 --- SysCore/debug/BIOS-bochs-latest | Bin 131072 -> 0 bytes SysCore/debug/OSDev.log | 292 --------------------- SysCore/debug/VGABIOS-lgpl-latest | Bin 40448 -> 0 bytes SysCore/debug/bochs_config.bxrc | 14 - SysCore/debug/ctaos.img | Bin 1474560 -> 0 bytes SysCore/include/conio.h | 14 +- SysCore/main.c | 13 +- SysCore/memory/compile.bat | 15 +- SysCore/memory/lib/pde.c | 36 +++ SysCore/memory/lib/pde.h | 30 +++ SysCore/memory/{ => lib}/pte.c | 11 +- SysCore/memory/{ => lib}/pte.h | 0 SysCore/memory/{mmngr_cr.asm => mmngr.asm} | 8 + SysCore/memory/mmngr_ph.c | 269 ++++++++++++++----- SysCore/memory/mmngr_ph.h | 58 ++-- SysCore/memory/mmngr_vi.c | 140 ++++++++++ SysCore/memory/mmngr_vi.h | 25 ++ SysCore/memory/pde.c | 26 -- SysCore/memory/pde.h | 27 -- SysCore/objects/KERNEL.BIN | Bin 20480 -> 20480 bytes SysCore/objects/MAIN.O | Bin 8176 -> 6778 bytes SysCore/objects/MMNGR.O | Bin 0 -> 202 bytes SysCore/objects/MMNGR_CR.O | Bin 158 -> 0 bytes SysCore/objects/MMNGR_PH.O | Bin 2818 -> 3601 bytes SysCore/objects/link.ld | 5 +- SysCore/objects/mmngr_de.o | Bin 0 -> 826 bytes SysCore/objects/mmngr_qs.o | Bin 0 -> 986 bytes SysCore/objects/mmngr_te.o | Bin 0 -> 697 bytes SysCore/objects/mmngr_vi.o | Bin 0 -> 2191 bytes SysCore/shell/apps.h | 55 +--- SysCore/shell/shell.c | 6 +- buildOS.bat | 3 +- 32 files changed, 525 insertions(+), 522 deletions(-) delete mode 100644 SysCore/debug/BIOS-bochs-latest delete mode 100644 SysCore/debug/OSDev.log delete mode 100644 SysCore/debug/VGABIOS-lgpl-latest delete mode 100644 SysCore/debug/bochs_config.bxrc delete mode 100644 SysCore/debug/ctaos.img create mode 100644 SysCore/memory/lib/pde.c create mode 100644 SysCore/memory/lib/pde.h rename SysCore/memory/{ => lib}/pte.c (64%) rename SysCore/memory/{ => lib}/pte.h (100%) rename SysCore/memory/{mmngr_cr.asm => mmngr.asm} (75%) create mode 100644 SysCore/memory/mmngr_vi.c create mode 100644 SysCore/memory/mmngr_vi.h delete mode 100644 SysCore/memory/pde.c delete mode 100644 SysCore/memory/pde.h create mode 100644 SysCore/objects/MMNGR.O delete mode 100644 SysCore/objects/MMNGR_CR.O create mode 100644 SysCore/objects/mmngr_de.o create mode 100644 SysCore/objects/mmngr_qs.o create mode 100644 SysCore/objects/mmngr_te.o create mode 100644 SysCore/objects/mmngr_vi.o diff --git a/SysCore/debug/BIOS-bochs-latest b/SysCore/debug/BIOS-bochs-latest deleted file mode 100644 index 5e94170b38809d3ee4e020410e582db5e83a4b0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131072 zcmeFZd3;nw);C_gB7X-$flgv> z+ID!JS)SP*M%>16HipN+hB%NArUQry$RL7C1jO5RfDkYVAxXdAQ+02r6VRFGeSe?d zUl&bx)j6k5opb8csZ&+=c6#-0YaC-c9>T|{E0^Bd)i6GZ?Pdfr3(#x9NkbWHORs+E zxU0$a{7cl-{^eC@nzNS zb1Jc5q{^4RKhmSy>|JP8`YAhEG{~~cnB)oREW1)Ho*Lb#J<_2fS?w>qnwK^eq*s%M zrjp4_I#86j34)bOVeVGx(5QV2Yh9a!KAr} zT1r1e!RI{W%}epL#nc+#L&IqIu>`U%t*0wn+un;-%iaeV*3g0p0K-gS61<$=#>(Jatg#+fF@ra}Pqa zvTDnZ_2F>XTd>cYyKi)^NrI^gOaVRf?6q@4V*o7Mbs57grA?jTaA~#syl5XhjVi`} zlVZPc>fi0RBr$J6iZ?gKdxNLiDCHhX4@<{Orm~_W*CtQ3u4EF8Pu-|5%9_{5PVQW% zms-39{<0(M)4aLtT|@a7)U$NJNe(ltS--MfVTyIOeC;3{Ga=^ zL+`28!>`lO3%PSyItU;F8k2ln&s=if;B+A12O(X+FgExldC${EP)Y6-Z#v;`C(e2Q zY&ouK47<|!1RnuydUbFq;ft9XKX~-;G#C-G%EIgKNI$u23FtRTO$}0w=Syo{Zex~G z_taY_*A&Hio@&%dHQwCDvg+r9=y>uM&mZyZHF7WK@q&UYj}}(x6HA&m(S&tC$~5{i z&C)>WUQ=DB84TI01V*F{C2orTSK!Ye@~;9gL$z+&EL7Z=qT{ijtMgU9<&_1mI*GLJ zNcv2igwKVw6t6rDgSK$k!pjmS%DVREz1F%IT6yT7rF147_D!3mG!x%DItetswAxZS z9@XZ(aKuq4c&Cj4zw{$@xee3^R-iAK4e?PrR0B)Yt&R!g^bN&&+Dz_mytxfKoYbtK z5gOmbHO@Br)|mawZemit$yd-&XCR913|*VR#}LrR#xOe+-lLnw>3yS2&=~VSWIlUAV_1xYRnwfXBMwo`~Sm z>Kv($cf&my!DZAr(w^vsTOPs9sB>gI*$wwp1UIkFF=Kf*+=>Wpah+q{Q{8YYBe>;t zj>RiDjv{z9hCry9wm(AhOr2x-N`=JKMN<7&ol3H~6m9Dq&oDt13y%|wK>pWoglZE} zl@qOw6Z*=3!yyC@1A?xpsY1^^wvLkk&y@JT@Uqw4>Rs0^HSl$u)=R1GzWl0IG^A-Y z!zi8bvYIbVaGLlUXN6Nx1R7S7#to|`Yd)z71`R8JWAm?_o(ys@V{{58p)tk-HRwZX?w|i$Hf%RM03LK!CWg;RBLtTf5XKG;>kHmR7xO+xcz(qr}GsEQMDg zNrGZeMV>2RMV?+H&#Q_&Bv+R_R3mv3xI72k4VL(wBoC=b!5%hJ<5G`!w~NT~(@!E& z_|`RqQfOWyf@Y+K3rriXGFY%^x^!G>g546qs6?5x(!xe5xBkLT8avlHsYYt@Qniy; zU0C7WJ6s4_?*9QZ!N$GAvv-h4v=n`Ld@|J;Q(x|v#1NG*K&%=r7L!6Hl;sDptN`Db zoW$hWDDSTop61(4coa(Y|f_zANHCCHGF34r1 z#9LQ0`Qzs=N&8xkS7gU?gLT;p`7|by<(-&`FcA`Q*R(LRybwaSmUoW(j0=1j9^Z7M zr}YN`M?CZ0H$31-wOW4M1Uv?#!ZF$iIL+!^{a^6Wc9zkuIKA4!d) zF6~T$nWaxK>|`FfKUQkEE_NccJK*`VqFYrMcv5i3OceYd!apjqbUuuILa;w7z8QMY zmlogjSkHcYjcg2^DiBiwi=r8xAPq{Dic*czbEzipB=0JtbVX`}lh=HS(6nJcIF=xq zY-@*e*KTX2VyEkzYs1y@k|K+DP^uSAy=Y3I&Nc1MWOqoqog$1hjlxanGrs@fA%PZQ zGj(<#(j9Vw3E1w{oaK=sz(Yd`0>f^aO;Q`WtOIqU(q$N3ru68N+rc%h&(rR+(s3>e zL=xfz%i55ODf_Sd4GmVTj8NB8ALnU}D_Y>owMsduFo4e2Gh;)o3%tXmhEMPDy=RWv_lV^;(wURmR;4-f%BH_2861{4SR_<@)iZ3R=raP!1>Ux#Vn=y zN&Y(0+m|v3A7X1bJPqs_LWiZi7OTn@N@{%DP6OdNTkZQ*8VbJq?7n9#p068y(^FsN z`0_j~>QaF$uK{7AZEPn>ilCGpzZwg@GFg-l2sqV`=`@s7YeY(Yo8v%Ep^UaCpA%)ww z8(zc_1VM@+(sV0dC-~-8SL10*aW}Pml3rag#{@WJ3K+2+qAt_i7qL3*NF$*hOqH@m zB7Ksw#_Sw~?vyD2o^o#tM|!m)SHOs6hZ+~TFMA8*9Ytsy$R48$WRGQAY%pjbd*a1F z_U(;Q{z#XUJ#Nc(-|2u%0i7<8sWaDQ!c(d{>oR#lsg6b784Q=a@d^c{kvt@kDoeXu zOD>0ZsyJo9qV^Zahp=8@vGugYN_h=@;ENJ{=AT(1%Z4x8@#&4@aSAz-lq*w0fs7?r z-jF8)R}!BmdvoOrRXkFhI0xt7)=B^*R=EuqXl5hIaP!_1W!@&ZkJrN462mWf+(DFs zh7{$b6RvZf&e)>Z=G;b|+a}d|-qVX%x$lDIomvFJ3+mcUafR@@(C3>9l=#Lc`6R>` zL{aY~2`4#_z2=lD9;Yl)!EqYC66wH&DoPHhE6Y0wA_xKA+~Yi@z_jLpR)NF9&_tnw z1#;`5)&Mv8wlZYe!Q zW-c(LH$!ObXUO*6WbZRZso>M#k5N(b*}PAsR%I;2x`444OT%y)C`w^3__5N2x3ynT z?X|7_98S}wNqan}8l{h0zIYS6sHy053#B(z^x>Nohuy4c=wVo@m;5z6pG;R^(oOX; z?+fquNXpGsGRL`o99VLw6#jiDdWjN}Ne!MBiq z!@4u&C73!lZCEE;SCQVYKoC@VKMg66$Cmyl>gaq&Bfis*$P0ulJ1*lSYbQWVo~b}q zp|%qiWb&N~q=;zn$K>Gz!5I&fP;BU37;U)IR!X=tNX+9GwskaEwpYVK18c&DZLPjp zlR5$Qd}-L$ZrQ%!9L_?{D`FQ7@a&z$XV@0X2dn5KSPd;VL4!Wf!2N~rzvFc=6yO*v zB^{`XNu@G23d+8Mb_f!75eLu>HuC8FRSJ=iR(=ReU0uvP)JRvgHy8MydD04Vm5qQY zJ?rHDMZNGjY?Gy|FCPQb4(L(>dyU3a59*@rox`LDSnr0;#oNv^%LJ#+ce0j%U2R6J%n;|h?G!nZz zc&5{^i#n7J3=Poev`LNUcf#%wJBj_+Wp)2!#r_A!v)+N;Oryf8YeUC3Tkxb0(zbO7 zK87BA%+dQg;?o;^q`s7|y-KN@s$C$riS1epx#;N5vVF4;PRVBjwn3lNv>H5L#(i|k zG%p4x-8>BN`550yBXHbv%CKP%#pd%ghdYQTC(E`)C2OiVfvYjSL{Gk|{%~*h5rJQpM zeUMZuyQJbG)n5*WcTlhX1=QVv^SgMrIO#*`?SF`Oi%Kmj3zbUz7gC#PkEP6qy5Ji# z2;Ax4s{>H*_ND3;DpHRdx_Y$y@lZ<5H!0LH&paPN=bpVO!XCwpYwu439|}~8X6dL> zrJH7Oqni2zu32zsB<}3)(xdG>9ah##ZCxtVprWc!k$cIqy+#U1b(Zb5Agief52?92 z#PZsER?BNG1LD81Y+rb(=Ij8e4LO3;7{4$6gr}N$j_A085?3&of{xYwg{Q&l%O%CI zp`d*QRsqWIj0i21sUJ8?dv^6apZqyJOgn-Z+@LT2eB=XeUkyq;I(UF z{5OHw)ZD#N-5P^;-Cmbx8s+KO-tVG(!BW~EZcKTkuN-%oZ0BC&`T+xuXlzgke;B*$ z7z0$ocO1h8M!&_0_TZk(KU4T;KQPQT@xyIkZU~11*;c638&ESe%!GzIAO_)rpe}nb zmR35qiyDvj&@1+Hj&T&i!nagpr~2->WlhZPTS&xr`jW&xN2m1O|$RXSf z(mKSxeXhDJJ+tDoS10&qSs056--XH9nuIH=0FFhnbe2Gt(GbXjCRwpMG_kyscL-*wjE^;q7>bTFT^QH9h-L1pzU(MGEQl5;R6%3>6V|gd{lq-hy zaY>naT)nxZTx?+EnlA_V9-18X{V+LTPr~ro&CDv{)OfxLMz%t?tmKrybkSOxgLAOF z3Z-y5tt5DrbCtK$#9+NNnq-d=9qnV-vSQ9aWCIEHMbFNiPM3$(FOA4 zLu>Tdq#PL4Hu(_tQfmxSL8AvZg3<@xf`gL_4q1NuUzDm99P%0GN(Xeg4FSE)cefF9 zG)vbD9QDlR!uf$t?1N+7mwj1@fh-*0uI>}aN_-v^z4*K`B3|*SMIa1#K(`26<9A`o z3K(R2%-?y5w#&Ov3S`C%31r6V1DSEgicACaY7As1K%Y!pIv>S4T+=JkXAEN4!lOH? z(ackelS_U&XP{HpEB^q@ea>5ORBCjMrjU8YBM)&&S^emY;qC$H`vX~nQ{kl$UJvjf z(yA}R{b<2az1hl77_9Cl%k~FjT0W_O())3DdDXhUcLYDV7Uz@)T24TyihKKx`hb!e z-R*Q_Lk8l+vnx1gGq#)5sp8*#LN*@XjU#0M7q zIi2#nJp#o@zMz~Z4Wh(#of+Fk>gLO+ZW7RqWqTZfzwH9kx+Gs{2#4j$mT;KgD_C9; zcV*(*j9-|^@1Frh1#&Q+gNFLxT+&L{09G}RESj`oN>bLuYx ziJULRB=t>$`n1Zcsu!c;OD!WA{Q~jp8|K!+=4%P=!pn*g z)JbKq&(g(4sf-3OdIW9g5ywJ^`?{TXlI7@>8Q}}Vpxn!294at*alg*TL+Kr>vko&? z-#d_L&`GtJ-@Z&!0EbDK)%c68#;oq-;}gg^jLanGFf5vLIDtNT(TAB;%sZS|@zCKU zd|Q+y{3D;g1pOm!rSBiTu2H&Lft?%fmRg0uaOg;v2m?7^@4`l0CES3P{3@Z5t`b0t zk-~At51@)6h99f0viKL#;GAug_@qTr!q4@3>a~4gWBQSbf#}=!fO*s<>M;{5T4PPC zwF1$bf)m#4%oroI!xA_EA&YV?qzyPb3uHn)1g}75FP6T)?Bx1ny5|@#g!@Rj=Wrz8 zK*tJBx|>KcI>J(x8{J0Lsl+;JiTCo! z#rKN*{tq`BU-PrCx(y%l4P)ztD!vmv(Xb0^I5J4=L|d_mwBjzY@jRcX>IBb*;nX?( z3bykcIW>l+``SeHc#PY>F4ugJq|T+gZ)_|1tygdb+6cM9<>f@&Xg!C3^Z$*E*kV8H zokpVgR#`BflRMWu?%E_>+Cit;mR)`L$vv$Mc&KaUhAaFmTlPAv-n<5{J(d4&#)C|{ zq6}5rxF~Jk{u<{bxh8880+XUl&1rhxBVe7}vi6r?QU_}z=;xZ33cV?StE9zfEnmb( za5hd8rmrkNJan3-eFJd|KCEy~Q9%S?+3X6EQji=1=kB~R}=Ai0;Z7YsIQ_B}aF zlyxX)vSc&C6ZEKLsTBh%*(^EHXby)l7J^QxQ7aH82^?<+QngAg!JpG2dla-vjasUt zdd6FVl($5cT0$C5i?vJ8Dm7}Uk{U!ykn)zOQcFn0Y2hk@R;ejEa#EvcsS1y3w4T@` zqNOSUw*7)DZy6(6s=}ix^fWEXo}1r0D=uM0MIzJVoCg26PwJ-YTFtFyoe6NA8R{_B z0(7f6QcvX0d+CM#j0rqFdl?QRzvKV(jAQsj0H8V?-c8TbQ1J)PGHc%GaWwQa>k}5kw>FNQJ1-lI zgd6pO1Ce$E68cWptzxT~RX>bDuhncd)5kswUOC2lvT`Ey2182xqWpQ8?6m|-$|!2e zO!M-biv)wkY%$ZJ^-{JJ-^29mS@s%X7i^r6H>V)N#L_2<$-pQkri7Sb%o=Gl-RQ{4 zj(B_=i)uASw8|=Qr1icrVZd}{oV|d13G7T%~ zVxAeBJtr?+HE0axBF)I_bdjxeVfq(cv>I9s%rwl})kPL{F}_C^3HtBp<6o)Ks&Cb! z4^vkk_878+a4=Yqd?tMYeCDBq)CC(RP}x9cvf(3(KC)-*; zvXmRdxFz&j{Bq)t5=w~Gl2r-ui(gxu(tADLOJ&IL~YcLYxVzY{oJ5jeZ2z*t58mB8b#6?i-sc>KR3@c92bfyXNX z=kyfV_^$#N>#rKL&OCLXB z;_Y|bIcf5ehaXwG%*C?iWY5UAAu&LDkWab6-25DybKYDV73MKVX10?)@|olD)laQm zvU-_q?UE-SU-77|c-bRGD_7fwuS#H<&Y9V4^|D7FU%A3IeCZTh+B3t`COwnD94p-` zmI7jXWR-j5no$XC^^&I+t$F;1%cgOP$i&%bM*33EiwxT5uFJER`vUKU{ zF8=vNOI8<=xT{w__3+~>*Gw3n!15n+7cE`6c7@Hge95D>;gBMKf^GG(HSVXDMQi2E z&T|U$Aj4v5mS_!=Aj?=tek?jrJ{W$sm~y@8%xFl!dK zSDy1aBWcTXW?v5+Wr8SqAORl;+sfi)t6j@it{n=_*gW%p^eC}f*1k0hXco{cpjkk( zfMx;B0-6Oh3uqS5ETCCHvw&s+%>tSQGz(}J&@7-?K(l~m0nGxM1vCq27SJr9SwORZ zW&zCtnguiqXco{cpjkk(fMx;B0-6Oh3uqS5ETCCHvw&s+%>tSQGz(}J&@7-?K(l~m z0nGxM1vCq27SJr9SwORZW&zCtnguiqXco{cpjkk(fMx;B0-6Oh3uqS5ETCCHvw&s+ z%>tSQGz(}J&@7-?K(l~m0nGxM1vCq27SJr9SwORZW&zCtnguiqXco{cpjkk(fMx;B z0-6Oh3uqS5ETCCHvw&s+%>tSQGz(}J&@7-?K(l~m0nGxM1vCq27SJr9SwORZW&zCt znguiqXco{cpjkk(fMx;B0-6Oh3uqS5ETCCHvw&s+%>tSQGz(}J&@7-?K(l~m0nGxM z1vCq27SJr9SwORZW&zCtnguiqXco{cpjkk(fMx;B0-6Oh3uqS5ETCCHvw&s+%>tSQ zGz(}J&@7-?K(l~m0nGxM1vCq27SJr9SwORZW&zCtnguiqXco{cpjkk(fMx;B0-6Oh z3uqSj|IY#i(pS!VWAFFQPAJ=7Wc50XFI9UTu~J>7!_-8x5{J}(Y+*=syjq}v%z5RzQ5Zy*0943k5 z&|BP)1rY0wn`7>{d7-}c4nxcxeemrX9u70+syS_S#UFRogsgYCrpDCXF*@ds8+&5! zaJ39~Nwq{&dxtA*slB6D%pJXmmn$51EhAT1b**&e^uX>t9F|XARhe7|Ti=EKWy{st z^dl{odT>rZa))=Jo&>(bdy}i>lFBS~?y};?*F3&*#S~lmxbYM3w58fobCwh>n_?TE zmY#N7+C=-U~H^;k$H%jZDed(;^;)cJdBx=Oi9ltq0Hhf%tGIcJ#D?$+S|&kcDAp(Wp&KBJ8qZ@9#fqGkb!`Lu8 zd+g>JH=Ax|H{010sduL)q_R{ydvf?a!+Q;9!|iPOh*=}dBiIN#n|jNXTSPy%j2t#n zlopR#KdP&5QF>_fbE5~1rt%NRJUHftF>H*TJu`Ox*a2hNSUY=UT=qD_I5y7Cif_B` zwtly<+wAP&w5&9J8cVaY73s6nlhRqbojo-^Z+zl-Hr~$0OvsoZIFFn7gNdSa+wFJV zE=paWx88Z{on19ivP~BMb%Rf3^H?E!46qDVz!tH`QJTi?V~g1nDE)xl&z7(!QM!xG zXAiUGDB0Nq>=E`9N}23Iwv??vDT^&&%h*bkve`q-#a5w|!xpkf+0!Up@89%0r?a(; z*%+HKX$BFXG;{JyR!XI@caOcBVEA{>#CzBpj-7S;ECSdV%ey0w6;WyQ?9sCchJSO? z=P)$Q+U}Nmw3HP#MUYeUWSApe^%U4SD)#Kko_dR!?0xDxKFo}6lD`yp~lD)_n zBI8`|ea40dd9{xzZ7P{y`;vQXPTyf>N(^7|*T({_NAdC9j?lW&a4~^d~T< z{Bc-n@as|Og~|b{m{B-Hg+vtUP~eSc&GNswL~?Y7`toLf3FqXbmXubzW7DgN!t3aq z0c=^dyWX#3N}H~@T8UuF*>r)tD#+Od!+KC5!Y-`_U2v=bN;rOTU+s&BXsyV9I|=%v zpM2jc7^9MEDy=TEK;N`8PQStEluvd_4Foqv!S#UGDsVmEH-bJR!5z=FeFNHx_VTa0 z6o*Bt5*WfO6oj5-)kXcn#R-sUhBI8;87?-$h@QQs(6~^d-^Ktl%1;4+kubp~rn2hi zWvpIkmgpZV(6a@)Q`&R5{&2nS(BXO~IvMR~&&i2N6C|UFBw~9Zf;^<{Ux;v9Fp;S; z1UtW1h64iqeKP!xNE8`7d)qPa=_m6^Qg5Njx4u>W*%iV&+NDC+rQKWDDUZ5RG%#Fj zhPsMv+Q}Nbp-V!vd1i~g6JQ?Lh0J4)HqUK@=DqpWx65y}M)&#CR^alT{xn6FR&QaO zZ~bMt5O7mIH-2M>XK!r8bfJEgjxaoe1UUu_4T~Ma5-!I7vGV-{s&Iti${$BmZT!tu zqzdULg>L@kMrV4pQ?6=}J_51ixGWVmUsj>7tI$TNu*vJV>@95et#6c%wX7N8bu@Yl zn@GCPTO>!TRM;lWM7BE!2pKM9>uU2#OL4MF(I~&APzWxf*YxW2lVp=;S}ZR<7jFA+ zlGx95@AoS*ZqZhyJAiZ_ju|T-fu2SBkOgiG8<00ob;K6e zM->0YR~Rc5w#vV1mmJNQ*^YMl;FBmWBhGyz%;48y25qXAe=dF@a>C^3h^aHoc@X<%^3IXUPss5f{ETeGtv zOSl;SH_LmdM;L*cKT{M(U-R9?XpE2(>o-DANC}kNnZ4Uyj%%ib>r@?8V?#F7ZtyM%vcnAJ( zq|sTy8{JHe9&slrj*~@Xp`@yBKFRmTVKNnCT#S6`g|L>Xk!uiFtIMUDTb=T6C=~M0 zWhwKt(?X}i>^8Pt4s}GLpFbR?2#^S^{3YPNuLW)VOHq2W1uHnMfW5lb?oa&8M&zSa z@?S>CpCxkQZ}Bfi>nBhZ#9gfq_}@YvLA)R4&3bg57vVMbdR>DLrm_h=%O)e3i`EoO zgycz)=I5J*DDEi9u|K5d@kB1~GoU?5xfhff1x4}xFAPq38$th|NLbxWc2N7UDt)}g zp`<}2_0hvRkv=GIT1wp1_Pv$%Pej_^{e3c0s+FqBXagn88t<=%j7bFjvm)al&h1U5 zmLw!bjWlDT#s@cvR(w9X-_Ts;BXHo`?~y+R3|`Ym$v;$S|5l`ZCAG(JU)RQcNq=fj zk}L*gMjPb+67tWE=9;c>ofqLc@%y+A0kb5PYXWh73tUfuYpV`@eXD35%ekqRw<~=# zQt;rKA42r_&XF65KHeg3YWqy3{nkkPP1OFoG#`cbPf&Z(+yzRm`Dw^FPk{>m=iJmj zoJt?FB7KbcJ{iY@bu4jPqG+7bjT?IAW8Ha4)%f#E-=lE`xcM2lT~@dScso_LRSLJQ z5pJ8lkDG(^CvIx{raZ_R#0%z67 zN^E?vMFAq%A*HL@rogjQc-1cyNLmE)Q(b=5lb_^Q6#+xZNb1YxE zY84JKusd9`8awvK*F4FxbH>hHN!v~~ds)%im8)r2itNg>_dG@E^Rs5j%P%4O@Ru{n z5-D;v{?;k?I){}5W^(#Vp%g(zL#bHAC#)3Iu!)xMuB=YvhXO`9~^Z&-IGMbs;|B>0WC}!c}^W>yl?+Hz$H(6q%0vSq>NY2?V zk7+`p8KFOZkp`cVQ{z-e=jzxrzQH7W01`0-@~UugySy(1b8OW`nC+9lxF|XH&6-6f z4ulNy`OETWml4OBtA;6K-j@fE7|23#_!vztc_&CLrGM4QyDwKb4pur2W|UjXUeTfb zpD)Y*E!vxv_W$J5QPu8NA?^9J>I%nu!FEP+Ryy8GI}?#qjN(4|CK8pS?9Qqi&KDAH&@i&l$gg&Q0s@jf=3Gyxc)Kt}~)V`*v z7#bWJG*-tfr4NSrSHAd~6&|||z{kSS$`19pa#J1WEgM@gdfY`rGch|9lj#8G@WP@#@rRyuhs#Kw`YLs#%dNFDgiQ_MVW>UXUCoyoE;Z z5WXMnoL0h=odNB0&=fg-=QJZLPO3T!7L;ox5DV;Ed)ob&(#1FAsG^no39yE>o9}aa zr<=Ts5`62A$rpn@*NGx0SsU2!+Jx|0n)77#qw?M$m=j#k3*&zVOH0Q1Zrv=g!2m>jMEIPII*fq(ZSJ#c=i{i!DLiG2rbtj&5VWLTdIDk z;BEpglvwpcrJ6+T)+!YpD*SwgqV4?v#=<%c7ZqStHXvlL6A{Qb1+p&!p*VXhphnPb zQ=!;`{wL}g=W=pr@55C{K~`(l)9@1NPQ*!LC>gNS4i$DY!3aVLn6k0OW=%*)8J_>s zPN&?_pg<_(5}-i^c=opWw}Q$J{%eU>h2yG!n*#XuYh@QtQI?mnTj`P=IvX9(o4u8X`| zAeUViIZGfHUl%!BAhWNFbPD8%>muh0Wc+oJ^8~U10sC4D-6xPA3M8!sm5yi&&KLLr zNLR46x)%SCz_*?O9xXAPm<{b2CdpJM-S%+S00atMN=5>p8G496MVH>tQpD$q%C z7g1;)wKrZ%6U8W$Ml>-!Xzbnjm_dW?W5}}KRyw`~7DGw~5D@@t1TEOVI$eYlI*J_t zh{TYDqTP2KW!{_~=gLJmVKj;LpNK2!D?Y8bIx@W5z~sN3rbEbkPy1Y#i}fKx@Pp1O zS&1rrF%S9H_nL@OD2s@)VQ+f}joL6BAGHSoj`cU{oc>e+SRw!hr+s783>FBnM#E?7u?* z4sZajFZ`1PV2jFPim3kwCwL4jG6dik9IzNHejorZZ~*c`zg++d3BV@;0v&x{4Zfb} z*^6UHEE$L8it=v}{!mQSRg_=us6@3Z{3;>V1QtfAytM~b39{du<=Ey9x>oU)H+RI) z(mRx(mEg$zXKP5m^<}J3UNGTkJ)!*t)S$J)Zggh)Q%0HsX~ zk-QrXA(B5tx8WqeB#7Ec@mE;I%bPkPeJtaEi%_hoBcs4lHb+-kez7CtElXLhj+SX| znV!pl8L}fn(26Vn#hjD#-C7Qc?)=J`9-Ye^pmeUYlpSHbbCmWmE+Hi%wVbF?h>Vn9 z-o^nJ1b`yS77jQM9U40_Qrsge%P(|fgxoeiEOcG@XF;mi&@!UOR8Av$e52iY8Y~;_ zF|XS$g|{2a`w6>;^M1naoA_!8WArrBSBS{MOg%BL1A~mFt&TaXe}*3?i$i7lRQ~7LR)fOaDc@)I>>Yr>lT@`E(S+<* zN8T-XEW?PJNI1F}jD*kfPdj{@AMDJR9Y6<9109V#38WFoQ9yn{NU8jDfZ8EaKY$Jj z&>4Ujs0;w@5TH{4#RAlL+9|&wK=lB<4A5r){e(cn8KukApQ(Qy^1&sgxnDt?%TW?sGk7!4;3Za@HMJjkbS4sN22%GN@xxz@9qprMiVCp zPF_o(49(e7;1J&axri>ndVxLF1FNJFdj$4O53G_$ye6>qJ+Mk5Q7*6z9pUZY z^q^2uiT6K6su12TgW_xt3MHBNgP^Df#VPzj4g@l?1doo+s$VG!(TkW7NdkCSj+qQ+ zdf-c%ktzrDzKjU^56o1x&mz2~DJgBElX9SJJtkf5}JWvyMeDP%&e&!`V+jXo%e(Y08aXa+lXSiKN-XBdc9cF|3pF(Up)q%}xaXkEs z>Y-^If`>KYaY(`;qdCMz5W9d35D*Q8=na(+N0A*F8>o6zU=L zZX!0JA=Kw#naU&v?&t8y1$v$#afv7NG-h0TJTxHGZww9_e%U!jXDR(TK8yBHDKo5) zKr{yPoq@-7d0thKGIlmhxCHXY?$c4p=Qn-9XIsx1qa^gJ1-9pmQ8M~@gyme}dGNoe zEP1Fv@lBFvFZR7{83s#PiH`QCSd6-hq6F-7pM%|Z1?)qF6v4Lj^Y01RTOtAb^;k7v z&x9o?VE4leN5H;{2>bTuPWgVYG^P%zC_jgANGri_0nFmSZc&_~B}MTPpl>F0bQBMD z_!-7i#uPkv?G#ir>qEj4y*1jYAwbDmg4wkyi6 zMzn+4}*;BG?O;wb3iD65x)0%omC1Z2HmTw6BV$RYKjHg7&X5AJx;{>@I(Y zJn%T5S?UV&E7)w-XSn~R+3oag{x#|usDDBAv@;cZ)2b87cXr^`8|K?;sVM)dBQ&fM zpX5oj@BieZ`kR5mLZ%P(CIq72S1|Nf6#b4NCBnq%|K;dx8dK>umsqdYC}79P8>2)EE|6mhTHl!p8?SV z5Tz2))?2uE4$+Gcj=G-$g3l-fW!T(<$=kUUUHBV-KMj0rh%0@TlomZf>218n)Z!Vu zzk09>opj1?6ZzJgd4D7P<1hny@C<*WQhK3-BFf#JJc1`6=(x}_NG@?>6mZVHy!fJ|17?due{s=oK=YmwwDG{klN$Pc7QhOD;d7#5ZJ=S5q{#r`s z@ioC3_Us*x12f2iV~nf#qGOD?O*|?`jv#yxiVi4XFZC4ShXO<<^t);6hp}}Ltm;Qf zkEdulTzdjHjugZR9QK1a+C+ZhxPotN1s$!Gjw{z}1j9Ts&;d&nPT2;Y7PvM#-NVxh ze3v(fV18WI;-Z7{aQXOo2*vk_3Psz;pg@ti~k#mP!L-}+VXY6}h?aF#N@($Rvi(KxffIZ7WtTgQc>9aT0773!^m zXkw&sITacL4B-HrBdMxoQoo8p)2r174Aqm(V;mc8*A~UD&5+|7yZ%m)!>&;{#jaj~ z!^1mWMp9Ojg@mebT=FwL&R8lPm!Ke?Tx+FF6MztoZ&5}GVa7jC99TVyHdvi`l60Q{ z{r#|r0(kNZmZKGR_AxRfo$v6CP#i^ZoV7#`T;?%8a7lPFs_ao6PI0C&-Rj6m_b;W7 zftVT+<uHq(gCjO$W!#5lD_(H)-uQ>^l~sG>{Z`L9vE z(vcwS#!c`a1j18|WHfFUQvEqW*W5L;5*%g)Plq@U3BIt3@QYbgSLX>Gz?kT~SH%uE z8u1!B=!>VzU3g8%N`8d%NOv5LBnWa9m(Skyw|X5Ty|Yal!mPD8Zo>s;iYZ}utKvR$ zrOQy#t}8NLdMaeNi!Hn&LQ#09f{YU?rsP+1F#qYW5ESsIviGKd;UjIT%2=?#}d_v zevS~`0_gWn^j(7dx)c2sfxF&BFCx_ca-y$Cn;sMW==(h<`m!UDA){RRdJ}#A5%leK ze9uI0em^qNL+?jTbl>~endl|&_nhc02tVkc$3*{9K(9N|{{dXrL?4W9XsBtT|A8>y zHPK%Z$nT%%hYo(%MBfff&x!sDVE=leKX>roo9Oe1uKPqkfw>*LGdsvc^i>@|$;cGt z5$`cI@L-ExnBxBvWS)B>AwDgVcb-3s? z_#?e|Ugy-TSzgB}EHlH@mBSz?R1PHfM|5=BJ>RS*5L#l9Kc$Yx{)1d2R4MVP;M?BYcX21@*7L@XeuBLq3jYI&B`GMZ=uz<{!_UK#DvH21Bb`VDjnzXkPqD- z8sI7X>JhcpZnewZYOUN1gV7uYg%+1__5eq?EUbe%@&#lP=a4UxkV?Mnbu^0-b`Y0E z>2hcQ$8#>gaw`Cb=9I(SH`qIS!0En~E(;|rG3Rj7X>vJT=T5b|=6h$~aJs*D{UopB zj+d$x3N@wi&hGaetrlXK40s^M0h>3GCC|u?fSByz;N15h-k$H0%`Mmq&IjZ;!Qj1Xq7@;=HrbctwmfkP7L?SYd7i4x*iEeoptEp9KHFe1#49^799TdZupbJr1a%-nUn{dTt!Ev7ir)PUQOvPvZXP0N4I+ z*e+8lnOW&LnK1=ft+>#pn$bO`(s2TAHN4XC2_nbfDxD(y5+1$M+^TF_vB&-dkJ<{~ z|I}Ofxo`au`N6%CgXD$kUPryR@DxpmyuFqea>J2cE{R=FrK5=o6<<`GrXx5y-or}6 z->{%^BS!+k-?%s+=fFTl-}(>asiJU19!~|yAxnkd;OtY#A$tqIAvsRe`dr6~CSYUP z9lnRdZwwcI6E2pkzWS#)ttq3tMUhXSqQ{dTZXT2GuLTiz3u4JVrn~g#qNH!=A$>U- zbLrQK!V$TM3SwehBmE$f(v269&Ug#Y?#2nz3$=nWS}cB6dQ5(E4?ioViT2f=qEyjF z-L%nj2xDvUJky7YroVmrdZeJq) z@bi!CoV2ubmOINfZ_eDA^XAy{ow?aF9W%2t=gpimn;tWc>T5S|PjztGq?z&_OCc+X4>BxYlc_`Wr@! z7P%l&oY+XTXv&v21aQ1lje*)avI0{Gf#C|x#WpHkrjKvwqj_uZ3P+1?b5l#cJSQOH zg_tBf9D>heKoKug@oT z1YjfX(c~689k5ou(9|-e{8WqYjWaEg{iwi#gbLGQ*y?u`Ueg3Go5E{Wgcpu+uER~_ z#of8}XRCKsmQQY_8HagUJ_V&6OxF?=)u{@CpYURtE(&s^e~;+>y)Kk z*A5e%9EE+m&bP=Tb}L6F7&kz}IDZDzx*Ja%VG#X{9%3a(=Pq?RV_3xz4S~Pj6&c_a zd#^XZ^8t+-;QC9^11xqEG{6~nC>Sd)9VOsGSB!VOQnj|?-JLjO&;r}L6)%KzRg+sY zDp2jEVEe#`PX7Wiz1~E4!!ds!9D3rgvL1`EGVgv&h|p+4Wf<4cyIv~B%`v_CQ|Jou z!-5MH`E1}>Gisw|8->5baem6)#T+ip30M!k@A)MdH+ z1g6=im}bXXWCzL2AA9i?B0BxLrknHLd@7F7jPP;7z>EKNNfp;hhok+o?)-i-+s=2(5f~V~?m-z?;@8 zP2&YE(2AmW5IS^2XaL=;o#6L031KQv;h#87P^RpM6v`0p=c*HOmjGbl?P6LOL(=5<%C5Sy?J`Btm_n3W7R(I7VUWer=WxN z*R!`3?}8`c4Sg=dRHDGS20$^-DRQL{jNknv;lX>0CsohiH?Wl6hzsUE!K*mm@8o;> z+jr&Um`fnP3YdZrjV*j~S~bKP?C($egHAb>ptSsg413qUR1HlASt_Oru9{_B46|5V z3}bsoPl16UH9JQW6&q*ejGCIBAP_Yi64mKH1YIXTM0n-zv`y|q0@0E6Pk0q4x;LbD zRyb}5-mmj7SG3F|F>ve>8W91F6Cipsda9$nC=uWMT;>X1;lNFp=)n$_sf#lf)5{-M z5RYs4SCNg>7J^TV7O1xnC=|1`1ad_L`G7@w^%Hq_L0%W2?-%5qcOeKi`0nn43{nOC zFW}K7nes(mOzt5>=x&vCxgb@owos6(!s7nkaf2CI5xG4cSqbxN<-c*~p9Hrr@`pYT zA((+I4skpBvSgQmZ90*s&u*FFmpGcI>uMhQKJRKgoqWi^b>sQAqK04oIUP6_%Ou2Tea0vNpP zmE!+}Li(iunEk&}0EYx1$^RP#uv-AE{>=*D&je6~@Na>|-rPyUjiZorsh!Z6!`|8n z8Te~q9|B7cnxDrdo7pa275gJ$L-6uwYs`Zt*s)HgHC$C?RJYFPEwhp+cB#7syM>$` z&Vi!Xff?pbaAWN zgp=WYK7!c#3^ z0M~Kp&FSIxORp33_)FEGOzkAfK6$K>8vh5bmVp3IFL=7<(+iFJ59H)r7c|KMb*F-Pxh|4AUpK96lbhMhrJ>_9Vq{u-S1uzW7qL)PSkBWd8j556quW%HR85u$2YB zWx*y^A1*Z_gs8VV{Tt+@K#ggiV@nJQ4+e$Et1vE6fsE ze=RGC;dgAp#mQCQ9u-^R&*79f@s8>)GCU(RTA_f`$UosL!`RY~0IBHj}uxP|#|p&{>-Z=tTmTSENzpQyQ59AXq=`DeZ9 zWpnw9{-}_m{Tu?xZ(Feu zcFLW-yA-sPy?~QWY#k=3S~ubKL7eOh;tWZ*U1#On_q%n_QjH32*Q(7dfF^p!`) zHtr_%n*H$NeP1?GYzS6huqpw@ZB9}uqk7297&4^t)FyhG{-dlRF_ul`!_m}s+ zeDCk>{qwz{V~_y(>;3*q&?ji^GK%|lF1}3_pPoIC_Xz@yi4~Y`>hxS-yRWywyA1N} z7HsTjh>aGHkNIWvx+c2UC%GNpQbBMsvO0BMwOO%x?{~P>6G@;uRe^A(@4jB6)k>pJ z;rfvrg1hSX%gUce!jGYVXRtyquTSzfLDYSgC}T*u=(I%zMjOJR=wu?Dg!?_psn@8~3A<%hi-)>$vws>R%v=0Rtcq0fO(mx?T@Nq z=2&nS))CwYBAvqh9sN3$pC>$>@;!e=Bjg~oJEurFmFjB5Y1}Fz4(`Kn5_A)GO8CMr zleP2PV!W!@p87nZko=3G84AH~~N<b^AVYb3 zv$rtGx85Z0c?*lQR0uc0hVWL0wd7NVG$&k)A4o#{RMJ?Z-0&Cblp3j>ifq;>9|49p z=DqS{)+qlS!05cyDE|QvB%#C-#|I?GFS}@P4nvR^08zI6-~Bc!PtPvRs&otu7GPsD zh^MIoaH)BflA!5ES4};BYjwKbRYgBd>PkPte|5Fy%#u`V#a>tZ{-Pu*PO2|zMRlgT zDR>iBE?e-J(eKQx%F8E%4)7M7`HQ z21~&F6G7HTAtOdaLX14W7X6?``~7|mGAF7joRv3LA{_g4 zwW1?CI=GJD4!;@cjpK;nKi;%#^e~>iuKv@%)PoY95jp;s$^ z&QR6yt}dMaA@IKNM^yyzvwZaX8C|9%n12Dt_9=h{7clR-mcpCT3Z z3y#p!!JudXWfRaqZ3sW6CNp^xeOHr9x^7L#K7LkGm4t7lNk3}BO-BQk^1IcE_#Ftf z%TO;I5vY~m8~g>&NdG!8QHNia8{dGN@u%0Q6NUMXtE56q7mG)_%hR33pCT-x;b-KZ z3Amrxgb&jlrEh(`ybf?2;3|FP_3W#K(fgc2T*PK^=4@bH@(FXOfP}BUBhrL0+96 zu+wB2;K0MoA30_Kk4!J~@<1L8Z3tiR(oi2_ZN-}vx}q&(hFD5%S3~DQ6A*#J#kMNH zviMZ|i7!4QX$vuu&X4cOY7H#=GUrsyx|D^yn z2>>1nYfp`XO_9gb0ZD4ycn5xKi+>Xd<)uG zoHQrXAxF?)Ab;=`cH+^AaK4;n01^p9Qq@mkH`+Eh{|Jfk6Di2Mv2b=~G`iy`Bkc@f zBhZ;qFMeVGH|F^LK>msmZGDr2&3a6M2-gO^;EGi?g`S&CAw&Ofd7^FVZnO>lN*@^= z1L=+J6tto3RR?wbBV?;0F|hIjYB|9SBItzPK}F-A9KyrgRK}8%9K0K+=u}Cg$~65} z?BTBB-qz7dSu{6yJIz>naKh2t^#g}rbKp{#sO}Brycbikc?O8k*(WIClKUy%{tXad za2NMv@mhpM>36djg85B~kU%u{4}etIx)(imh4%@r;w0}XlIWK~i3}(BEDxCx>#xwM zW4cNi)92obj42<*#_t%#H2R5^2%ixOpX-d`_i>4g+bI?qw|hwO?&F4IEHUG5BV6hl zVEsQ=K!Z5Qi~&}+&g5#Ce8}T^(X^wH^I$WMdLk>K0WJ;|p_*Z$ALrmuyn2D%KX-a( z)eI#ltifcC4c$!v?)0=|w)Qq9z|CAdVPWOMvkM0=9=tfFkUj@5zN0W(DN!wMk#o`J zMPpa8qF;=?nH80ewX&iYLz^QJC*pA3(P}C6FmQoiQO-{s%!J2@3-ESfw6@ncZ+q6c2|XtQH3Dpwh+0mjV5vd|Wh>oid#Jdjc$oaNCs{S99;#rEW~XCGck zzg+kDidF6++rw^`YuRd>%e{Pgg7Pp4&5S?2ikU&bt(06f?W6pvWlKa%Y5yHDwn1AW z+WabH4>4YTjvDB2%zcsj`ctSP)*#a0N1Zsqf-a8Zqd2}r9O;Lg;34>tu&~)i4Hhds zWKa)0M2Y!4M%3}+-0I^qBnRtaJu-^*oNmHie5Fg+4`1mfY&EK?m~RtGC_Xrfmq8KJ zj2J^=rhXAE=Fff-llu8W2?@?9uKe$=MBaLJZ#IWS53rECm@nb#-Kop4@eMt|B3u>q^3P5`#P+Z!= zDfqsL)}&xLHar~@?P}O?MtEHSB^;*R3>>ZHWGj{JM}!N$f~M`MyRSvR&Cwp>Oyj7Y z<@Ja4X>$IIqn8qzys;;`n4@!fYiz1}qVMPE5xg~=z9)JTN5=tumESNfA|c2o_$C!p zA*@74MC5~mQ6M6EQ;~?&uo`+9M4>@s1xV7<3hxs(_!~H6S68W5ukGq}qKoc|hTw}dtkhW4-GUZE!Xz&BvZVT!o>EuezullG9m54c zyT#r25cG&1N{a%HoJIBg=~=<+2~iKl3(3Hnd{!z+9rV@S>Sfdm_rUj*DCJ+r?VWg5 z+8lG#aug;dNn3c_5uB& zEwEb|MHta4YquZ6#Km2sjmQxc9h1V8ic;W&sZS9Th{w_zuGM;Q?o(JKpoNdC zVG$pb$bJ?6fR&Xt^^wP!dWYx+LG)QT%o>gnI*!g*tWOYrPYGtuhmemtx^d=Am?H8F zjPo3fbvw24rAoX9aV0@c>_F25n%Q7i9fx74Dtgq(h>EHl1c^}2SdTl_8%f_Cv7Rbq zf>gMefV(M_E#I9PN=x*6TSkcpOq3*q4&>1z0`hbRzjF}H=T8Q~xOBDcFf0NsL(vao zk`M)h!I;eA?TKl#SvS4o>4qgFu-!Xl436I0IAtSkD^T z$s-EjkQ`kOiS;}MTZ?FbKtb4kRh#!bBnMVRX^oWS z)g-{t4z%Ddm*HsXmpB70C2M08F05){YvH6^zmw~W0fP9;4%3{9D}%#)ufrZsrR|`1 z{P!fm0=SlB*Bdg4youPRx*tVJQ9>L5)BB?AdSkh#Qix=qEUg8Sz-SP~=!F9X_N)?! z^n#mYxY^?w&~S|wuZuc71@UAcOu^-oU%op z&TLZ;kzeDDV_2a%#+9PwAE-6Q0!#;H(JG1!vzDZ*QA3<)!b}**oR(JNCwK`wc5v6tPR4`T%OI6*xjG@c07If^b-k!pfdO49k@t! zLya`H$D1YLorSF@wW)W=7-aJFziJ#oaW+KjkavRDSy0TP^2qaSk?KSpFY#oLcn1aX zE~s%$4UfY&m)g{m8?~EDUFxMZ%Yu1-wnvK6FVK-W?_IPv%3^D#aAJ{7x@T!3>|h{t zdXHiNqlElFTnxlE^ezU%k_5%T_SeG2z$Ow{7*>E7#L*h-EdaHFsJk?HMXT6QRIIx+ zI2}a|9~ovQhJg;HgF>?pFLgsy>+IA%MeBod^)ghF8ace$< z)*dQ1*zjPRDrBM);endW|Lo^no1SI<4jI@Qo>FVbQ5&>w)@yf&&|{G34#&Z_>)KSi z%-{g6vFUYO0T@=_coQdmg9~s~jts5xBX<_Js}F9_c=3L6Uk?Pm$8A@AF1RWw7`-p@dAP`n!i2awyG8{=wL}NRQ?!+L`W>FAy zYKje|nPN{Qkb9<)s|NZK%tA1339=0E5pH{8yGAowuF2u|rDWR^7RI;y+tgQN*n44N zqsfwWn|eQmRoXrbZ)Z071A!w0abPL5f3k_lHg%p1{M&ll-!Ol|${eij;(`yC%hp_N zYc}IJX!Cm8eyoEAZq03q`diBY8|+vh;BTP;GzRSr35r0P2zsGS4r_XlzibcDhDtsF z`J=Pm*l=q z0yYu=ea}5t`d8}ydD6d>{Qk0L_k8Jh>EUV8Zzn%-`gFXh>ZXT}(q+Iz3c$U5^d=p2 z0fA@&@d5qp^Cqpg?SuBN)%W9#XesM4qwND+DM1_rVotFSpOm;#_&%^6`(_Wr;YxF7 z$ZXz4DlPxGHCGvX=|pV#zD>QGvZ%Bj2;tWZ-_-L!@X|gn&j$P%?qm+YX>NUGJVF5daUxj$))462=FiBh{}U zKj_gq&YWk4k?JP|(=y^Ch>>bDfv{ApMdX=Xr1}aczCkADxm~1M8;X!;cadsM2*OKc zS?(c_Eant{**;=jj5<`xOX7H#ec7iva2Ec&^@A>pSAiRUHYyJ5cqf^EA z7``puRzCTqsn*N1!SrqF;gsZkK`*%Ins=%e{Hz|lPIxMWch%bMr)g8`!_)+^>?&L`|4Q}_5K>o%D@`XwS{Lj zv}&5{TX?dsS@Qft6>~JLsq`?}e{Z)`-X`ccQn91VP3C#AKc=Cc%oxu_K+Bqq)Q8QU zq!`cOm;e=K$qeM;tu~QB^Z_>5dg?}r>4=Itb;()3+4E(8n)RDK{{Egf@Hir8g8fa* z63m|0`+HvKUFkM^cJ=qvgecwnDw&EZ^;u2n-X=k<1k#l57bFPNrohmC?pjS7I#IP4 z=ielso~T~@`Nmay)ah$CD*K#4UH3_liw+Y+5c5$fV?*`q<~1RxbiMa%9oX#Y*FSLE z^NS2Ms}j$+tw9^o5#ukQlYoCQ>BsHi^)?LlxRFU$kYTj$nKgmyonHco8^{1Yu!e7U zo|YGo0a&#rc)9Z{%|zS@HGd7xCc~Zwj0w;|2~G0}m@;^$dU5l{RXfyTDu;Hh6Ghv8 zzr5DTD`)CFoB_sR=q}wR$l=voUp+grUQoOS79L=$0R+|*Y~}tyn?u2-{VAP~8t&3M z-^=Lg;R?3d(+IuV>^U6e`6KDoDaJA;_iy0AB3@wLsJ&>ieI564td=HtK7e%UO!3oU zdG1e}CFjZm6Wp`xK*9zuQI;OjJppv!Yb+NKXD4`QC7sSC=qT$0C~4wNFgB*>ZY?7 z5{#)qI{PQ#z3|^2*wNIVHaUgf3QteYG6Cj{e`_$38pOtE#nm~T&R#K_{A~m zoYb+WqhpiijE;SFQ?lmlQ>RiEm9`^c&BdCtPn|?zcxx?GbDmGgyJ^nJ3=7wsX=Kn9 z+6!cF?OYuMX_~X3SnF*^deEHTrP%Ip&3OyMpxaRw)->neg<#b*=Z6S%mgc;I6WEW)HLTCLJ(@2^E3j3B8G`69wgedlA+oDXZ7^I=_c&OsvXK_7Du0_Pn@4?0ZT#F{gD zJM|#Isozt@KwZ+D=TmMZt>X=zk5OzMlyEDR$Bk3M^ESaqn>Kq+3eu*{o-I9V(;@2e z0&V2HhuDCU1k~lP&r+A?t^3)E+7(0B)oA~Qt{V!7{O$hzYK4THr7l0TE^6gPD{EF< zw9x2u3wMp@=OR>u+#Uc%Rknl^`b7*oB+H8;meyt zp4SZivY`!$nqqbb@d4?=ZyG#r7~F%Ylg6MOOzIA#3m7(dn2>Ng#Z2YUKX9mK#>5p8 zDub&yShHtxQ!to}6cF+P4%f_iyjjj_5e;B5asV@_ZwSJ+ap2Ibx z7Ar%-u}(o1dyvC5(-ezB!nNxkB^18iHWYFvp2WFkBjOeUqZzz~c#1j?x?f5H<7y1^P3foQ)GThV%(G}?#!Onc4krcAxT)p zqy1ZLTk4c{f>qzz zm9|4FJQ;w*(?NE=`cL?z6-wYdjlCdZO3nTwb~wq`AwSp)rTxxg7iv!Xol~V_yShj^ zcBv}*COYTJpV2yM6SB;h}ydYnD%n4Wf` zn0~K~sk5nxVno(@dP%pbXO+Dg35X~2{%zC7Ham&V4N7d(g!d*_d^$F$Q zf{|DC6!|)ej1@&}5mzr(3FnoF#`8}im0qsl6fH0neJ>b$fQ&5-mg})kQc-!1x;q&2 zQwQoxCbL5EZl{>~Y_ig}Cm8)jicXf+L!&>!(QSL7yh4|dvs#du5Nl=x->6=^edDUv z)W<0%B|W@F7{Br0C^*QdmWR%5@A`wB+k$f^>C;q=K_Ao@G!~4EX)5y}Rw+mz$)oqo zk!}OA(LRIc8H3J7Qz7(2*~m(M?AiwSXoLp9*<~FSI;=z*4+Eru4c(B9S+Yb*yB=&i zG`OLQ-CAu!7hAU-p~uR3mzR!=11}vO*Nyu;uneW~UMMp}K)miok>kDROE`EEw@dg+ z%6?2ckKkV`(fe91309J5v+Ae$@K1^*`c&J8E{+yt*-ZJ$<9scmKW!7=@6o@@VMN-joLj{9XTf z>^P;%#qDumd7|tG4J=MATDO7abVQoE(#1!p=~x#n3AhP%F9`-f%rpcuWGO-1Un6W@ zFn(i7h07Z_6V&B~;Rrr&)k2ZA)7H57O2>=|j~;v+!I6yB09;9kiOVGPm|Il61xNE> zm?xf3==sbr-VEi*6hmjxu^Y^$T&R4XfU8YzEUi;^oaMuelgjtJGf*EcAGB|b_>(&W z*-sBC9i4k>6?4f!F4S_5)RveLv=2}!wGQ~q*WC`t_61yM7)V52j zAolSwvF)NaKj_@@U#K2Bf%r<(*~#Ty0CZ#+t0FZg!$77T1K6=zp!ywDW!x{KD>qmM zMmrKRfatz)XA-W|cjAk=^kAAbbdWLFGj!6;=JRX=H+0goA7_R97l%aXA?F6uY~&DA z4E{|$-%R;@7)ayIq--Kx;A{%GC>St}0-|~d7)=4uJp{xt4*EGmXLYEDpx)7v z(B4S*&xzpDbe6kX>mLq?)ktYDMkjtYf#?PX8i~n^X2FH#Z(&vi>!$91qAx8gMf(8C zo;%1B>_(mBr6*`*b30q9K>m(EH#P3E@{M2x=$T*@%%`Zy1#|N4pC}i{dsrmiX{92dPEU&h( z0(E>9q?1$t-(%hIA-|wU2)(OyJ*>LKVhGjU1OKK^q>B9#r zs=k!jWs@6ztc@KH5MOtv+9p^*2pv2_3&2$x!)9JxmuLwC(iIRGL8i{pn~vfVl|wH!-(^pN!ARWyDsKnnC!9!Qad6@4`8J8&>dj>+HRTC2FG5|uCW(_emzmy$UNiddvr2o=DH0d8E{d^0C zWX%BbbKd0pb}5$(p+=hz)416(Q7eI|#uVox@{q9__U$5HXJA0QjnLs?2JY{!vFgC~ z?%nEwfxR|{K2o1cNJz#>G|s0<#(f!-ao31%;w6@kn}mKE#cbR(g5z z_y2C@{W7Mv!UmXk)}1J*&XCFE(V2HFdBT`?SZLf>8CNo|LBiTQLnfD+8 zLzwp+@&}mruQHU`HS3>X*Ei83#5Hv?pgX&6kl+Bjt_Vbv$qJ=Ez^=EEKftc@1EFE; zI*GtKyI#U6baow1z973kPhQC(7$L{1i@)y9uBH8ZCBM$D`Gn*<*mZU=lb+ah0fHsF z78G=2*N-)JeFa@yva5}wNOnzTw`A9G?3V00lHHPBhq7C;YYe+3yZZ7etM2T&z2Izi zt(UMcc70O9!q~M^!ot|qDPdvknk`{r>^fJ%B)j4&(+R%JH^ePyF)LJO@WwW{HJa3d z#nBI`=V$})C)g0~g5E7LNq(%SoG)LE!4f|K@)kRxC*=UOFt-Jn9ItC4` zKS;&6uGf46QtD|1MAxO%FUX@ysr$(jCZ$}Var0$dDWz_eaYLlk9D;P0QWFUnBBheZ zACOW*WhhIjEvF!*=4n#uTRSJ~E~Q!t9FRH(WF(#zlW5yXeqG!&aMU&p-}B@Pikm5v zZ$RAqMEwE`$Q>o1bVl?Gb`)y;z`Q1cl78B zhPob1D22?Yc|o1v19nRx^ESJska?BeQpjv#w-hqJW49DCkF&eGkjbK=bkhm0ldv!$ zGfBe2gv?JQEKJD6Nm!VW>CEFi!i3Cm3Hw1prc|RzYCdQZ6cA`+H78=`Onf!AyfXq3 zbV(xFH85)_yMpG)*lEBD8T|~Q9~hp&4KVt_WC+vp7~63+*ASeR@U*Tjmzsdi`Ph!r zG>%@Rf?zrh?VtT|VgB!&`^C#iT|6(>#o%=nTYRuaq0@puX^^3Z-o4~|4ufR!L7u(B z-Txv9(l%TMd0rLnxCPx{e?+|Qut$V@Phoe#9XS3ZmGOigY?_O zNdMe3A3S{TFShZ2nNMXull{zNPmeh#?!I5K6+mgZ9+p{gCH79gw~FY1W?9eIM(IE< z&m%6)3Bs{7GO!_1YwsuX$ksw6D*;$F?e_~UK}R+vkPA#5(%3xRbzx+?ve8GdfCV$J z(BRib!j^n&Y6OhTcVRi&hv#GO`wEWOe&t&HN{TNR+IfX*Fxpy?TXeJ=`*s$K03S}X zssEKl{ef2f%<{;t21Seq0c5M#$b+IjM9I9k;L(Kv7Rw$!!19qiX(}#85g5t=ZZZwV z^5G;c$(#UoUNa6rHSD}>tN|zLg@Wn2K&pwe*|Z^H#@f(eS^x`JgQwM^-i)XJijeUJ z=rK187psxLNSjt&Zk$I}+ZUtIr+D?EWdJVq@v18+4pp#v+Xa*QkT|sOD0kVq-1mX3 zr+$;B&XicO2Y5Qw?{|*Dmr%k8bs)-IM8OpfK-Or9k_qBHN0KMD;mc+@pM7KrN(dm4 zk{%4h%ANX8QV`Kp=fKnO0U}Z-E<{9LT;^xR5{ikZj(W~R7dV<~6fRSJ1>Gk=6VkgP z^h_~UVbC4ZGOkZwf737=$g9Em&&{~R@UqxsctyNB*dg!l4#~Xb)`buu^sXDfh2Sqc zsy<1JD%1}NyFs|(m|i;<>-$rWq!PLca( ze8H_Qrwj2L``Z#I zFc^etOH2sXUQ2LAVCyTst_ZCgTUUsakrYZT6zI90^ayp+ZJ;~EsqDd?sSz|%XWd53 z7)N@Wn!)aP?gO*f{UctAx(aUEJc!j$;*BNT;M4LxV^kLs;t17p+j?6ZgbblQb1O(F zZ&fpDkM#eD)*q;geMEjne&kjl&o&#OEW{=mVr*Sh9$MX{r~?r71&XTW><`WPUhag0 zfh(+D`9@yPTL-+Awsu$YeSV~`~##P_hiyIkIqc4J=d1<@sgh_b1D;!{CDyskeYM1Zxu5R|`BX@p6WCI;5j&ahH2<1f7KFP>*MnVQHi*@I=L6 zN(`wNc%s560jI&0fp;PdfMIswPnx8++?<6-<}ag*^y;hR=I3HG!21A10_L@HwsZoZ zqk3`I##N`)RT(f6hVpP~Y*KXuikp}LL5Kg;(zj?gIp#+i7VWO+y0$dFqHEr=0ojp>Lr3J#f5Bt@ zh=v>0^I(c_UaI#0d1m_LJ+3$!U;+bX$Z@QUqwY^c{ ziX?;&{k@{2r8G|2=8ex#>)yRp+4fnycc8LOjZag5|LQ`rtvezrXSdtuuiB2+6ZSNm z`c2KD>cll-MiqW)4rF-GMR~)6>nI>i{otE-6L!;!3-zLQimCQ$Q|(k!?KD&EbW`mN zQ|(Ms?KP%ao2hn|sdl!hw%Sx5-&%6)uFCC=s>x}3DavbnNmRBZ#W^D?c9m2nK41ct z2Tip#xqSnKWu69#hQt*4v6sKY}Ca3_nV z`k1Y45qOKZ=0L5}RJ+VnyTMeu(NtT5i-olq*&A!Iqv-prZZ5~4FWgtYSa*Q&95g_! zsWTbejlZdjG+;5HE`irKG?A4-j z=yk%IRh4LiZ#I0>7*hY++NlB&qnAbQ_3ru9I}+~rWzpNb#>P*L-XZW=$QRN0X@oa& zo7dF%sYyq;DekpYQ7?=po9}JcnYKN?#!8b`#WGY%SqRVd3_wNG{@WFm_)yV#-7DI}jkP0E2-te8Iq+6wtf}!gP4ab(`e?kWQF7Mn z8g4)z02J?U;Gcz(`N!RkwVs*-^tuSWGQyo-_w4$sFHXHNN_|gxNnFr~7m&NgsejGZ zlQ&g1ReTnQuK$;qw&UVJlQO=sUJy0Zzx$P~m+n5tpnP*wX_z`aE@N=~s1c!Ys$w?z9X{ zl5bxh1%YEaIm7$)tqYqn@?Fln;$=l5!{sQk7v+fzXHHSxlI22q5^u`(!|N47r1Wz| zb$;!6l$=qnbY*QPo*c&ONyvBYnFwbrevQua@M~};xf~tJR#Bz6vtCp;`u+Z|z2Bxw zK>myB3IH;_*K2^17u7o%Fcs$zjNasw7}ub`7+&(fT(JrD^ZS+8gzzS%3~-q?S9mQc zv98F?hI*rSP)ZzPn^WRl=9h%B1#yJ(RQoRFsWZFq(oBYeDsm0`om5aoJ=b!on3?J|gsPS3%I`p}+%sQNe??VN(#bdPC3S;e$@I>Z-Wy+1 zSCTiCt1}7JiPx)x+E8VFqE#j_P?;ZbWd@)!F)s2mI7bxH_bMr>9u`(bnmHgb?IXk?8pp5M1Wb;k2_JNjM7U)JRlvaBz|TD(DJ z=#!~QX*1@yE_TCLp=@n8f1zycGXEoWUB#q9uE7mL#1TFrwwAms1YcCIcxo4?ls`{) z+;lT2H$-WOH&XA~3T&2ogJ+llz2E4XyzSF?rE0G-{*dyz5ULqa#((8b*Fa^hPk?2< z1R`a=GDCrgHn{2n zl(k1Al+|x^nLp30+{P@J(%*Hy`mQ(3s#f2Ii^(EfZ(a6x?# zUt#JKrQ^iwB`>!(DK{xMqZKA9Xojl2;}20ATxO7{K*|2p0ui2b4D)9&@jt72N7?3y zcN^DvI;jOFAO-0Et&k}|ekGXd6QQO0L`xO1&hw@KGY?UlMS4{SNFSj5O9FHsqHdOO zBf*KdIO)g~e^R7#4%7%}B~W~@S{Z_aiCqF>4_5CALBSNg1yqhxGbIK|cpKzJ@`YpCw>u$L~nu_G?5o@czU<{DGg?k(Bkt7ozn-x4+AsRjXKI~;X$ zmDjj=wUVVQKGS49M&I@(ZiNa_bpRS+G&K^n5w}TZlSoRNlP(MuLPQI(u43FEw07v< zBoUq6ek7;;$ddLWx$Q>~6d&*)0PK(;Lu4$Y5EeuWB*9oUI^aQo2|O5@zMnYuP@37; z`Vfu1`io)mu`v7&{rMLC$7t|h*!obDRXm2A zyZ`z9fIP8V@b_W)jeA09elYLaH;kVreR49h{@IhCr#$N#n6dY>s>h;Dw^lw-Zko}Q zKE2)uIA(&=>38t8*2a^W97Rx+6^N4Al$|&pt5W0N9{>LOaYnKCQ%65%#QpEgF-FZe z+WE8hoj)>0RqfqyuwqAi&B5{Sk3ZyXP4bV(Y3f$eq_m>6_zQ%%oOr4n0{^b9}Cua1Bnpxn{AsdR2_uV5sVsHDY|DHv)@w%A#FqH6LL) zWc3swu&@>3`L$4Q_T&4g_^na=A;M`&>N1&VT`2A5>+gubh*Q(JaZ1`&yo$0|bgbQO zyrt%&>csO!bri(5D;qC=q!y*Q7FN$1nkt0z-0LytJyp{bp2B-&^{n$LczpG}@!A}w zLagnKc3QT5W_l|MJ$pf9)hyFmzi>uYEr_YQ7izKzbDRp1wQyTYKf|_#S8iJt;hBl` zh?)aGNHc62e+Unox-)2itcqIOWUM+DKS#fIzyC$uZ9LCdEZpfY)Mc}KiEy88t;=J# zBHZg=s4HQ2DJ)O4*Ue`4wZc8Gy>2GEZJ6t{*WJMGo3J0VC04v%Vd(nmIrP}NW0<;# zx>keUj?-s$KC7PH|GKqupSOq-z%7qq9k*?qGD%HahK%eaYkj>1S&4I%$aGS*fGLYfGJN`+1sQl1 zt0>o5P+X+tFLR=hWX3^Rl$6>X_9ADDm|k4$EGW9&qLdadwTwa`fOJk#Sx#X=o@EKb z^s0?UUCJ+x5%Y@~oU^3Rt_6*Y5e~aEE3d$Dr`_qaXXUy|OMyBocX{FHi<2#Rr3Gbn z%M{D_7*SB<9DjKrVzMQ)@Y80e60Kr{QdnG4vOF1dLgZu%Ra}BB&gCWc?ntuqx+Yte zl@>Vd7JF%FacTEh$(CGaX`zKGUTV+DTi!i91Pg`#Ye>E?lVr~OGA`z2W%kkn1+^^6 zDa~1Gcj76tV!UcrtXN8Oif#|oGB?k@)D>(_jYgq#8v~?HS80*MqU03dDKtr9PL~`^ zNR%BTYlVI@q1k zOKwhKq2!Ti3(?vW%g0&L3hg-#J1RkaSjU>1htAjwO1**{LvMU8(-@1xnd5Xh&Z^husf&JZn@iD zT6}ek=p~t}=*}V>HwY#tahR-)BdB69nMKPi*)nZzs+EU;JD23;7B5|j(V!@AX)$<9 z*o$(ObaxdLekW{!L*|7dcCd<-i|k!x)j{%*iTnWU(p`Qdh{EQF-&G zTbA1M3S3Je=biRk$WOd48lq%50E6Ur6x?mMjB>?@n{x`J{sf>lGB}I1v>K*ya^JrRBTr_st4b#$e{ZW=IcWGW$3EJB3Ot#EKaMpqwZ(uS6YG6U1j1e(nX^sP$ zgRnRXbIR;gt5N7Qcq{crjf-V@VuXb=8H>=Ftfz)TX3QL$UcB_OnK$tl6v*urE#o09 zvoT_gok`Mq^r(q0%dF|kopuMhCgsyZ_&h!QyKtlQVAV!(C8N^-Qv`yMc9Tjp`_5doCWT5o z^BRk@V5yyC4xXgH9Nos@g7*&B(h@4Dra1=#NY_CfMwOHBEQDS=3ga#$!1&3@mgx%? z++eXyn=|*u^lP9|&zl2^vg8hodoyOHFPJCwZ_?{r5Zo-mlXX<0o*J=P3pB64y8c<&-R4Qc&!$l;jr3Z&3+<0}3NF zHv(Kf!GhS@?v^^rcD2b^2?=Je^1;MyG;gm6SsED5RRoaZ+k7F~Wu(Iv3gY{q<3x zj{kQ;KwRNideotKzLoXEWacbQ{c4y*5 z6s~%lYpP8!)t+any~|Yl7%rI9K5A-66jh1m8vm{OaWw#Nu4t0>3CE95UNmJ zyb0&F>QWfj6vj3F(54|<%Olh~4s0zqs(A;teHM%8qx@I*KcL07a_kAXJ94}(jos-m zIl3ukYkP#6abRn^QJr^Ss~Vxs!mm-C1`Pcf!TdV?=j-;c_kDx=t)q4O*uCH2wx6n-%E_k-HT$D2qS0OPmip)c^-inWvR^H4 zR=b+jag)@QSE*}nQ~zw;B6hk(i|RU{PMXm9E*;PP5BpQwChl%Mr5<_jUE}Wmu%i8^ z7ss>X?f>*5_LZ-X0{>en;934wwCEBB=hXiZ+Qe)cH`KDMoDu*3NS)5aC$lTMFm6|L z#XCpP;ps!F&yn-g2&Z-@^>zJD>eNNM8*o4DPzN2qzAAAzj3RVC=>1YA*+ohI|DoCs z=w}^i_0PBF)emU39J3@Dol}lwcP3_UUU25!a~xw*T3oTz*M9q`$!vsP;ypj*(;&n^ zkZ4KQmgPAkI@FKes(+z1Z($#Oe*oS4qWrrk;MuzE--WslZyyEz!zqxKzV+*f&)HmV z;?{pg)JLDx{jN6nKi7TE)3|g6HDc5oznub$5-@%+BJ*F7+3??BTlaY|EBWvq3xqU9|ig-&_{tj3iMIn-%9~$2IlF( z0uy@89Z&8jE4nhA!xJMby4E>=T+yXE6R>jdhI63$r?ecH5b#WX+4F3Jy6q!E_i`EiH8@9+O{3ancFyVb8gzIxRv{~>?VasR49pU<~qa=eJ2yn?@zS4<|r zig*cF0kaP&DKN$0_aARUe7{IhrcYN=gum(WS6_X+$sZRLx3ampxjaQtl$3;330Gf! zwbfd3s^#9?dvkMdZ*6=$Gv)a4l+4E~TH1Z>EfvBTJH~dq6~{v~KgUl<5DEB$AH_2J%=idvwlCXCu^Ss3efT6P zekBQCBw&*bem_U281!c?FSlBSRTLH$vcIse#;v$M0U2?GBT;D!a06n~0>Agi?t2<4xZ0`$yx|)Fic*@}+KYmu26G|xG z(0|#K3zd(vM+xAjoGG6Ks_%*&M~)n6EJyvDo4cBuMVF$iP?Rn-C+LRuY%fGR6t)ZB zlKk@gB|iDhKE>hhDN_X67|EIisE5CDk!VISQJz+%u)I)d6{kR+C5lh%IO+54-?2mN zXl*<49=?+cckI|vIGOXy20mope7Jl#`zc*{b4$r^s^?~j7s2@JqWpl~Dv)}=?g(N^rHW8qep;Rs*nu!4T zwo?rlAJIvO!=N}JWPFM6mnn>&JD!NQuCQ7sQu|RdDhEEOKRV=opO5+~2*6bW9OXef z|I(V*C5BtAEmrGr;tT#q9)Ls{RgM0L5IcOLqH7b(+T7?ajd;f>DnHx2DKUG)o|*&R zNNv)3@w1q;CMt4i{mthUZEd|%N#kkqZ>O4~8=djKoiGpR>Yu*#G^W_QPi87G{Hjb< zQtL&6D2;+0GhbwhNvSI|y*s=^-Sy%KwrKPJ7PMak7em-`zAFUNoln>2M(C S{{hE|TU*4bz)7^O2mcpn#^cif diff --git a/SysCore/debug/OSDev.log b/SysCore/debug/OSDev.log deleted file mode 100644 index ae243d1..0000000 --- a/SysCore/debug/OSDev.log +++ /dev/null @@ -1,292 +0,0 @@ -00000000000i[ ] Bochs x86 Emulator 2.4.5 -00000000000i[ ] Build from CVS snapshot, on April 25, 2010 -00000000000i[ ] System configuration -00000000000i[ ] processors: 1 (cores=1, HT threads=1) -00000000000i[ ] A20 line support: yes -00000000000i[ ] CPU configuration -00000000000i[ ] level: 6 -00000000000i[ ] SMP support: no -00000000000i[ ] APIC support: yes -00000000000i[ ] FPU support: yes -00000000000i[ ] MMX support: yes -00000000000i[ ] 3dnow! support: no -00000000000i[ ] SEP support: yes -00000000000i[ ] SSE support: sse2 -00000000000i[ ] XSAVE support: no -00000000000i[ ] AES support: no -00000000000i[ ] MOVBE support: no -00000000000i[ ] x86-64 support: yes -00000000000i[ ] 1G paging support: no -00000000000i[ ] MWAIT support: no -00000000000i[ ] VMX support: no -00000000000i[ ] Optimization configuration -00000000000i[ ] RepeatSpeedups support: yes -00000000000i[ ] Trace cache support: yes -00000000000i[ ] Fast function calls: yes -00000000000i[ ] Devices configuration -00000000000i[ ] ACPI support: yes -00000000000i[ ] NE2000 support: yes -00000000000i[ ] PCI support: yes, enabled=yes -00000000000i[ ] SB16 support: yes -00000000000i[ ] USB support: yes -00000000000i[ ] VGA extension support: vbe cirrus -00000000000i[MEM0 ] allocated memory at 027B0020. after alignment, vector=027B1000 -00000000000i[MEM0 ] 32.00MB -00000000000i[MEM0 ] mem block size = 0x00100000, blocks=32 -00000000000i[MEM0 ] rom at 0xe0000/131072 ('BIOS-bochs-latest') -00000000000i[MEM0 ] rom at 0xc0000/40448 ('VGABIOS-lgpl-latest') -00000000000i[CMOS ] Using local time for initial clock -00000000000i[CMOS ] Setting initial clock to: Sat Jul 03 09:26:48 2010 (time0=1278138408) -00000000000i[DMA ] channel 4 used by cascade -00000000000i[DMA ] channel 2 used by Floppy Drive -00000000000i[FDD ] fd0: 'ctaos.img' ro=0, h=2,t=80,spt=18 -00000000000i[PCI ] 440FX Host bridge present at device 0, function 0 -00000000000i[PCI ] PIIX3 PCI-to-ISA bridge present at device 1, function 0 -00000000000i[MEM0 ] Register memory access handlers: 0x000a0000 - 0x000bffff -00000000000i[WGUI ] Desktop Window dimensions: 1366 x 768 -00000000000i[WGUI ] Number of Mouse Buttons = 5 -00000000000i[WGUI ] IME disabled -00000000000i[MEM0 ] Register memory access handlers: 0xe0000000 - 0xe0ffffff -00000000000i[CLVGA] VBE Bochs Display Extension Enabled -00000000000i[CLVGA] interval=50000 -00000000000i[ ] init_dev of 'unmapped' plugin device by virtual method -00000000000i[ ] init_dev of 'biosdev' plugin device by virtual method -00000000000i[ ] init_dev of 'speaker' plugin device by virtual method -00000000000i[ ] init_dev of 'extfpuirq' plugin device by virtual method -00000000000i[ ] init_dev of 'gameport' plugin device by virtual method -00000000000i[ ] init_dev of 'pci_ide' plugin device by virtual method -00000000000i[PCI ] PIIX3 PCI IDE controller present at device 1, function 1 -00000000000i[ ] init_dev of 'acpi' plugin device by virtual method -00000000000i[PCI ] ACPI Controller present at device 1, function 3 -00000000000i[ ] init_dev of 'ioapic' plugin device by virtual method -00000000000i[IOAP ] initializing I/O APIC -00000000000i[MEM0 ] Register memory access handlers: 0xfec00000 - 0xfec00fff -00000000000i[ ] init_dev of 'keyboard' plugin device by virtual method -00000000000i[KBD ] will paste characters every 1000 keyboard ticks -00000000000i[ ] init_dev of 'harddrv' plugin device by virtual method -00000000000i[HD ] Using boot sequence floppy, none, none -00000000000i[HD ] Floppy boot signature check is enabled -00000000000i[ ] init_dev of 'serial' plugin device by virtual method -00000000000i[SER ] com1 at 0x03f8 irq 4 -00000000000i[ ] init_dev of 'parallel' plugin device by virtual method -00000000000i[PAR ] parallel port 1 at 0x0378 irq 7 -00000000000i[ ] register state of 'unmapped' plugin device by virtual method -00000000000i[ ] register state of 'biosdev' plugin device by virtual method -00000000000i[ ] register state of 'speaker' plugin device by virtual method -00000000000i[ ] register state of 'extfpuirq' plugin device by virtual method -00000000000i[ ] register state of 'gameport' plugin device by virtual method -00000000000i[ ] register state of 'pci_ide' plugin device by virtual method -00000000000i[ ] register state of 'acpi' plugin device by virtual method -00000000000i[ ] register state of 'ioapic' plugin device by virtual method -00000000000i[ ] register state of 'keyboard' plugin device by virtual method -00000000000i[ ] register state of 'harddrv' plugin device by virtual method -00000000000i[ ] register state of 'serial' plugin device by virtual method -00000000000i[ ] register state of 'parallel' plugin device by virtual method -00000000000i[SYS ] bx_pc_system_c::Reset(HARDWARE) called -00000000000i[CPU0 ] cpu hardware reset -00000000000i[APIC0] allocate APIC id=0 (MMIO enabled) to 0xfee00000 -00000000000i[CPU0 ] CPUID[0x00000000]: 00000003 756e6547 6c65746e 49656e69 -00000000000i[CPU0 ] CPUID[0x00000001]: 00000f20 00000800 00002000 078bfbff -00000000000i[CPU0 ] CPUID[0x00000002]: 00410601 00000000 00000000 00000000 -00000000000i[CPU0 ] CPUID[0x00000003]: 00000000 00000000 00000000 00000000 -00000000000i[CPU0 ] CPUID[0x00000004]: 00000000 00000000 00000000 00000000 -00000000000i[CPU0 ] CPUID[0x80000000]: 80000008 00000000 00000000 00000000 -00000000000i[CPU0 ] CPUID[0x80000001]: 00000000 00000000 00000101 2a100800 -00000000000i[CPU0 ] CPUID[0x80000002]: 20202020 20202020 20202020 6e492020 -00000000000i[CPU0 ] CPUID[0x80000003]: 286c6574 50202952 69746e65 52286d75 -00000000000i[CPU0 ] CPUID[0x80000004]: 20342029 20555043 20202020 00202020 -00000000000i[CPU0 ] CPUID[0x80000006]: 00000000 42004200 02008140 00000000 -00000000000i[CPU0 ] CPUID[0x80000007]: 00000000 00000000 00000000 00000000 -00000000000i[CPU0 ] CPUID[0x80000008]: 00003020 00000000 00000000 00000000 -00000000000i[ ] reset of 'unmapped' plugin device by virtual method -00000000000i[ ] reset of 'biosdev' plugin device by virtual method -00000000000i[ ] reset of 'speaker' plugin device by virtual method -00000000000i[ ] reset of 'extfpuirq' plugin device by virtual method -00000000000i[ ] reset of 'gameport' plugin device by virtual method -00000000000i[ ] reset of 'pci_ide' plugin device by virtual method -00000000000i[ ] reset of 'acpi' plugin device by virtual method -00000000000i[ ] reset of 'ioapic' plugin device by virtual method -00000000000i[ ] reset of 'keyboard' plugin device by virtual method -00000000000i[ ] reset of 'harddrv' plugin device by virtual method -00000000000i[ ] reset of 'serial' plugin device by virtual method -00000000000i[ ] reset of 'parallel' plugin device by virtual method -00000003305i[BIOS ] $Revision: 1.247 $ $Date: 2010/04/04 19:33:50 $ -00000200000i[WGUI ] dimension update x=720 y=400 fontheight=16 fontwidth=9 bpp=8 -00000318042i[KBD ] reset-disable command received -00000444800i[VBIOS] VGABios $Id: vgabios.c,v 1.69 2009/04/07 18:18:20 vruppert Exp $ -00000444871i[CLVGA] VBE known Display Interface b0c0 -00000444903i[CLVGA] VBE known Display Interface b0c5 -00000447828i[VBIOS] VBE Bios $Id: vbe.c,v 1.62 2009/01/25 15:46:25 vruppert Exp $ -00000760517i[BIOS ] Starting rombios32 -00000761014i[BIOS ] Shutdown flag 0 -00000761695i[BIOS ] ram_size=0x02000000 -00000762173i[BIOS ] ram_end=32MB -00000802745i[BIOS ] Found 1 cpu(s) -00000822014i[BIOS ] bios_table_addr: 0x000fbc18 end=0x000fcc00 -00000822117i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) -00001149814i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) -00001477742i[P2I ] PCI IRQ routing: PIRQA# set to 0x0b -00001477763i[P2I ] PCI IRQ routing: PIRQB# set to 0x09 -00001477784i[P2I ] PCI IRQ routing: PIRQC# set to 0x0b -00001477805i[P2I ] PCI IRQ routing: PIRQD# set to 0x09 -00001477815i[P2I ] write: ELCR2 = 0x0a -00001478700i[BIOS ] PIIX3/PIIX4 init: elcr=00 0a -00001486658i[BIOS ] PCI: bus=0 devfn=0x00: vendor_id=0x8086 device_id=0x1237 class=0x0600 -00001489220i[BIOS ] PCI: bus=0 devfn=0x08: vendor_id=0x8086 device_id=0x7000 class=0x0601 -00001491621i[BIOS ] PCI: bus=0 devfn=0x09: vendor_id=0x8086 device_id=0x7010 class=0x0101 -00001491851i[PIDE ] new BM-DMA address: 0xc000 -00001492555i[BIOS ] region 4: 0x0000c000 -00001494865i[BIOS ] PCI: bus=0 devfn=0x0b: vendor_id=0x8086 device_id=0x7113 class=0x0680 -00001495103i[ACPI ] new irq line = 11 -00001495117i[ACPI ] new irq line = 9 -00001495147i[ACPI ] new PM base address: 0xb000 -00001495161i[ACPI ] new SM base address: 0xb100 -00001495189i[PCI ] setting SMRAM control register to 0x4a -00001659283i[CPU0 ] Enter to System Management Mode -00001659293i[CPU0 ] RSM: Resuming from System Management Mode -00001823313i[PCI ] setting SMRAM control register to 0x0a -00001832484i[BIOS ] MP table addr=0x000fbcf0 MPC table addr=0x000fbc20 size=0xd0 -00001834543i[BIOS ] SMBIOS table addr=0x000fbd00 -00001836931i[BIOS ] ACPI tables: RSDP addr=0x000fbe20 ACPI DATA addr=0x01ff0000 size=0x988 -00001840169i[BIOS ] Firmware waking vector 0x1ff00cc -00001851282i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) -00001852126i[BIOS ] bios_table_cur_addr: 0x000fbe44 -00014041543i[BIOS ] Booting from 0000:7c00 -00019105039i[KBD ] setting typematic info -00019105052i[KBD ] setting delay to 500 mS (unused) -00019105052i[KBD ] setting repeat rate to 10.9 cps (unused) -00019105085i[KBD ] Switched to scancode set 2 -00019105160i[KBD ] keyboard: scan convert turned off -00019184168e[CPU0 ] interrupt(): gate.type(1) != {5,6,7,14,15} -00019184168e[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x0d) -00019184168e[CPU0 ] interrupt(): gate.type(1) != {5,6,7,14,15} -00019184168i[CPU0 ] CPU is in protected mode (active) -00019184168i[CPU0 ] CS.d_b = 32 bit -00019184168i[CPU0 ] SS.d_b = 32 bit -00019184168i[CPU0 ] EFER = 0x00000000 -00019184168i[CPU0 ] | RAX=00000000000011a5 RBX=0000000000001116 -00019184168i[CPU0 ] | RCX=000000000010a977 RDX=0000000000000eea -00019184168i[CPU0 ] | RSP=000000000008ffc8 RBP=0000000000003000 -00019184168i[CPU0 ] | RSI=00000000000000ff RDI=0000000000105001 -00019184168i[CPU0 ] | R8=0000000000000000 R9=0000000000000000 -00019184168i[CPU0 ] | R10=0000000000000000 R11=0000000000000000 -00019184168i[CPU0 ] | R12=0000000000000000 R13=0000000000000000 -00019184168i[CPU0 ] | R14=0000000000000000 R15=0000000000000000 -00019184168i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df IF tf sf zf AF PF cf -00019184168i[CPU0 ] | SEG selector base limit G D -00019184168i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D -00019184168i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 ffffffff 1 1 -00019184168i[CPU0 ] | DS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00019184168i[CPU0 ] | SS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00019184168i[CPU0 ] | ES:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00019184168i[CPU0 ] | FS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00019184168i[CPU0 ] | GS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00019184168i[CPU0 ] | MSR_FS_BASE:0000000000000000 -00019184168i[CPU0 ] | MSR_GS_BASE:0000000000000000 -00019184168i[CPU0 ] | RIP=00000000001030d7 (00000000001030d7) -00019184168i[CPU0 ] | CR0=0x60000011 CR2=0x0000000000000000 -00019184168i[CPU0 ] | CR3=0x00000000 CR4=0x00000000 -00019184168i[CPU0 ] 0x00000000001030d7>> jnz .-25 (0x001030c0) : 75E7 -00019184168e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting -00019184168i[SYS ] bx_pc_system_c::Reset(HARDWARE) called -00019184168i[CPU0 ] cpu hardware reset -00019184168i[APIC0] allocate APIC id=0 (MMIO enabled) to 0xfee00000 -00019184168i[CPU0 ] CPUID[0x00000000]: 00000003 756e6547 6c65746e 49656e69 -00019184168i[CPU0 ] CPUID[0x00000001]: 00000f20 00000800 00002000 078bfbff -00019184168i[CPU0 ] CPUID[0x00000002]: 00410601 00000000 00000000 00000000 -00019184168i[CPU0 ] CPUID[0x00000003]: 00000000 00000000 00000000 00000000 -00019184168i[CPU0 ] CPUID[0x00000004]: 00000000 00000000 00000000 00000000 -00019184168i[CPU0 ] CPUID[0x80000000]: 80000008 00000000 00000000 00000000 -00019184168i[CPU0 ] CPUID[0x80000001]: 00000000 00000000 00000101 2a100800 -00019184168i[CPU0 ] CPUID[0x80000002]: 20202020 20202020 20202020 6e492020 -00019184168i[CPU0 ] CPUID[0x80000003]: 286c6574 50202952 69746e65 52286d75 -00019184168i[CPU0 ] CPUID[0x80000004]: 20342029 20555043 20202020 00202020 -00019184168i[CPU0 ] CPUID[0x80000006]: 00000000 42004200 02008140 00000000 -00019184168i[CPU0 ] CPUID[0x80000007]: 00000000 00000000 00000000 00000000 -00019184168i[CPU0 ] CPUID[0x80000008]: 00003020 00000000 00000000 00000000 -00019184168i[ ] reset of 'unmapped' plugin device by virtual method -00019184168i[ ] reset of 'biosdev' plugin device by virtual method -00019184168i[ ] reset of 'speaker' plugin device by virtual method -00019184168i[ ] reset of 'extfpuirq' plugin device by virtual method -00019184168i[ ] reset of 'gameport' plugin device by virtual method -00019184168i[ ] reset of 'pci_ide' plugin device by virtual method -00019184168i[ ] reset of 'acpi' plugin device by virtual method -00019184168i[ ] reset of 'ioapic' plugin device by virtual method -00019184168i[ ] reset of 'keyboard' plugin device by virtual method -00019184168i[ ] reset of 'harddrv' plugin device by virtual method -00019184168i[ ] reset of 'serial' plugin device by virtual method -00019184168i[ ] reset of 'parallel' plugin device by virtual method -00019187474i[BIOS ] $Revision: 1.247 $ $Date: 2010/04/04 19:33:50 $ -00019502059i[KBD ] reset-disable command received -00019628817i[VBIOS] VGABios $Id: vgabios.c,v 1.69 2009/04/07 18:18:20 vruppert Exp $ -00019628888i[CLVGA] VBE known Display Interface b0c0 -00019628920i[CLVGA] VBE known Display Interface b0c5 -00019631845i[VBIOS] VBE Bios $Id: vbe.c,v 1.62 2009/01/25 15:46:25 vruppert Exp $ -00019944534i[BIOS ] Starting rombios32 -00019945031i[BIOS ] Shutdown flag 0 -00019945712i[BIOS ] ram_size=0x02000000 -00019946190i[BIOS ] ram_end=32MB -00019986786i[BIOS ] Found 1 cpu(s) -00020006055i[BIOS ] bios_table_addr: 0x000fbc18 end=0x000fcc00 -00020006158i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) -00020333855i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) -00020661783i[P2I ] PCI IRQ routing: PIRQA# set to 0x0b -00020661804i[P2I ] PCI IRQ routing: PIRQB# set to 0x09 -00020661825i[P2I ] PCI IRQ routing: PIRQC# set to 0x0b -00020661846i[P2I ] PCI IRQ routing: PIRQD# set to 0x09 -00020661856i[P2I ] write: ELCR2 = 0x0a -00020662741i[BIOS ] PIIX3/PIIX4 init: elcr=00 0a -00020670699i[BIOS ] PCI: bus=0 devfn=0x00: vendor_id=0x8086 device_id=0x1237 class=0x0600 -00020673261i[BIOS ] PCI: bus=0 devfn=0x08: vendor_id=0x8086 device_id=0x7000 class=0x0601 -00020675662i[BIOS ] PCI: bus=0 devfn=0x09: vendor_id=0x8086 device_id=0x7010 class=0x0101 -00020676596i[BIOS ] region 4: 0x0000c000 -00020678906i[BIOS ] PCI: bus=0 devfn=0x0b: vendor_id=0x8086 device_id=0x7113 class=0x0680 -00020679144i[ACPI ] new irq line = 11 -00020679158i[ACPI ] new irq line = 9 -00020679230i[PCI ] setting SMRAM control register to 0x4a -00020843324i[CPU0 ] Enter to System Management Mode -00020843334i[CPU0 ] RSM: Resuming from System Management Mode -00021007354i[PCI ] setting SMRAM control register to 0x0a -00021016525i[BIOS ] MP table addr=0x000fbcf0 MPC table addr=0x000fbc20 size=0xd0 -00021018584i[BIOS ] SMBIOS table addr=0x000fbd00 -00021020972i[BIOS ] ACPI tables: RSDP addr=0x000fbe20 ACPI DATA addr=0x01ff0000 size=0x988 -00021024210i[BIOS ] Firmware waking vector 0x1ff00cc -00021035323i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) -00021036167i[BIOS ] bios_table_cur_addr: 0x000fbe44 -00033225716i[BIOS ] Booting from 0000:7c00 -00038289036i[KBD ] setting typematic info -00038289049i[KBD ] setting delay to 500 mS (unused) -00038289049i[KBD ] setting repeat rate to 10.9 cps (unused) -00038289082i[KBD ] Switched to scancode set 2 -00038289157i[KBD ] keyboard: scan convert turned off -00220440000p[WGUI ] >>PANIC<< POWER button turned off. -00220440000i[CPU0 ] CPU is in protected mode (active) -00220440000i[CPU0 ] CS.d_b = 32 bit -00220440000i[CPU0 ] SS.d_b = 32 bit -00220440000i[CPU0 ] EFER = 0x00000000 -00220440000i[CPU0 ] | RAX=0000000000000700 RBX=000000000008ffa0 -00220440000i[CPU0 ] | RCX=00000000000b8000 RDX=00000000000bf01c -00220440000i[CPU0 ] | RSP=000000000008ff20 RBP=0000000000003000 -00220440000i[CPU0 ] | RSI=0000000000008000 RDI=0000000000000028 -00220440000i[CPU0 ] | R8=0000000000000000 R9=0000000000000000 -00220440000i[CPU0 ] | R10=0000000000000000 R11=0000000000000000 -00220440000i[CPU0 ] | R12=0000000000000000 R13=0000000000000000 -00220440000i[CPU0 ] | R14=0000000000000000 R15=0000000000000000 -00220440000i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf zf af pf cf -00220440000i[CPU0 ] | SEG selector base limit G D -00220440000i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D -00220440000i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 ffffffff 1 1 -00220440000i[CPU0 ] | DS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00220440000i[CPU0 ] | SS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00220440000i[CPU0 ] | ES:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00220440000i[CPU0 ] | FS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00220440000i[CPU0 ] | GS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00220440000i[CPU0 ] | MSR_FS_BASE:0000000000000000 -00220440000i[CPU0 ] | MSR_GS_BASE:0000000000000000 -00220440000i[CPU0 ] | RIP=0000000000102a49 (0000000000102a49) -00220440000i[CPU0 ] | CR0=0x60000011 CR2=0x0000000000000000 -00220440000i[CPU0 ] | CR3=0x00000000 CR4=0x00000000 -00220440000i[CPU0 ] 0x0000000000102a49>> jmp .-2 (0x00102a49) : EBFE -00220440000i[CMOS ] Last time is 1278138462 (Sat Jul 03 09:27:42 2010) -00220440000i[ ] restoring default signal behavior -00220440000i[CTRL ] quit_sim called with exit code 1 diff --git a/SysCore/debug/VGABIOS-lgpl-latest b/SysCore/debug/VGABIOS-lgpl-latest deleted file mode 100644 index a6c56a569ef143742fc019b059f1602564f9463b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40448 zcmd_Te_)i=l{bFpM+Fh<4X^yKDQd>#ObCZr!&pwyut(bq9h`UsDBbEiKfIKPt~S7!WapFwA^E=iK`| z^E{cvAKm@F?;ralndiCZo_p@O=bn4+IrrXYa`R7bNM*!m*ELJNCL#@MTC3;HUb24G z-5Ue9EWKjMJ?l3HMDXHys{+C5z!e)B19OAH1tsIe^eZo<$Lc`S-D?8ZEsb1fV6R@& zvZi7EhBb{F17BZr$A1Ct*YCcEiOs%c$yEWSh;-wchBbF=T(dgRyl(ZHMkcfL`kR?l z$v6}OC&&)8+_UkXroh6Iae<2icQ-X{SU7w3oy6S58`n2Cu38ga-+0%Wi`T7bG9zr- zwCUn?>(|}2uK8kQ&u+Qvjyur|rmEd~srHLYwdCJSos)d%Kw_rt$y$*R$tRbHO6};S z35WQ#Ptz{dUi+I@|9dRsZFXtpccgwPVwtn?IKLtFG#i?o=Y2nYVW=1n zcYQw{2)Xg_;P=y$LnV0V`hL39HMPD=Bp*7ct-kb*%Hn@`9sTVTiJaZ0?sj!|sJqi< zwI(NO#kjhv45=;yJg$|`$G?x ziSIrCL{3aBpKN!!ihbiJOe`y(G}$K5VRQw(-rT>pd<6CTY&PLq^%plp?*F>A{^_WH zPfkp>UN!**;%l5Y7xDXq4-DC(RQ~4s!2b>7N+}ooPxpTB`6qM2Eia#6UZuk8=Hk8* z?|=IKXF>csKB)f#W4!1;Lw}NzoYJ57a>8bJ(6Gzvk5^S#ME&O$wKghm^nboQ_5bIT zSCsyr-6H-{5hMPeH2ANT%xu~A&FS7%yTCuR&F=@0v<~;Y{&M?2zdXyYthjo?!bPFQ zm)F>YNq(}f|Gb~mG5+0djQ_h>{~ouD|FTLR|HI_xF~)zX$$s25lKuD+<^N3k6Zwh{ z8Ug)zPwLOu%SEm1%?}^^x9Q@r6Z%tQ{jv1_7b!oi{g(1HeyRS_{P?><)=&1cHZMO{ zv3pF(SkJgp?-jcK)k1$)SLyuUyK2>zZ%t`DChBGR+jiVKSKPW$AHQExe`kEj3v>C1 zm*l1J^GlMSF(PpQneq%VLkLjB2X5u^5ji8k%jv4YPdN(n6K?!CGW`DmeQE=mQZAr& z)R>wXqI`y^LBnRus39<=kjX7&7^9SnawuxKsHvGzUOuC|W=2gpq(?nCudJz|-}yC_vui3ZsIg|4pd)9@npHDrR?WOwH4A6e)X?w3npyK|X3eRwW|*KO zX9!VIEGkMxMY*V`px^QeQCcC2E36qN=*StRr4{2#E6PhN{G}BY^y{xEEw3mYUt!HK zK}XIgE324PR^czJIJ>N(f_~4gDDzj8O{%bFn4lwP2;p-IAACxW@WC_m2@mE6pK!uT znKMk#ku%(GUy0l2ar;W$J|F#-`rIC$yToVBFhNJo7(3SI8S5K2*5@7T^U<%@H+GzF ztjA}~FhNJoU^_6vN3M^ZfnvM+u*aOe`Mw|B_p3+m+q^kV}5u-d5sy^XAQr2ecgH!&@R(9ci%T$$D@T!TM}{kg$`4t_Zei}ruE!pZB1fiZ@e=yo3svD|X4)wN( z`uZf}`GfWK^+CVDpC8XcL_@hy6j{Mw1_b35qzsW?z(9t}1MFl>wDr99_P_^iBDf)l zDZumu zkE;g^8x-%hrQAP8i7dqpN1ZHq=T=uXHD{W;ixerOmJ**ouUz5C9r zyw@M&{MVwF3-mFH^$JK2SF4!n0h{3GgJ?r*L-Yf24C1*nniW0$+3Z_AJ)-A>fwy17 zy}F^Nr>CKs>#GMnRNs53wSv=BuC=#sLj|?-8A%t}xH429$Oi>Vzm@F=JrDscf`f%t zk?ncVKNt12qTc%YRzZ#Txa^{p6vW>OeFk#=$^}_A1ZefNp(Ty0lTn-4bQ`ta!o~Yzqc2rT(L0#0PF@KNRwvOZoJm+AR8?RX5X%`ZD#c^)xi@_1xQguecoQ z-rM^csNk36qu+@z(ttCcASmyYM!UQHAu=?w8Nh=zNG4%QsvA}xtN(!XrZqz&64D>) zdA;YQ(kcFs-+y2O+RN>!R{XI5sNM=ie~>#2gSYoc=1{K)H8flJ1cz`|z~YH)75{JHt3^5@{DgZ=ae zp&8d8KMnfnJ`dLb{-~lX-*xzai{Sc&T$LVhk@+Jy-Tj~fCE-ib_4_Ls?)Q^fq$|hu z0ggMT@j)O7uVgsUn@=C}<_BvCNz?>o`lOI_a^j@QCpf4weBQj145!)%k5F`cqED1^ zTyEYxqDx#<5>Uu`>8VEL6CQD;^Q*Uu_|B<|@agfGy1eQl80BHy9eVi?##L+YVDBJ$ zFw+aemxTB*6Ttpwdh3H^k1^{UIB;MC>^rWu`Xq{xNJNGVXKOISY7Ld3QPt4UkMZY+ z-Dst92M#Iqb>4LWK55@zO6OS-gu+ABQPgtgmD4jBe>X8>1U?j5f z7|1l1Sr1VQE-5^Ez@Hap=tx7TqLo`A#0C%~ZiEQo;)fAG$PZvgfOE+kV0S>`l2gFm z04H_VfD`Zr4j(>DBb_duWHI`TilnoE9Fn_o8B`A_$3f*O_kr`KmYzMA}&?UVG-4UR!C8s0G zdGI{g^_W7bww`+K*=kQu8|Tsogu%}S74)-C6CEb=xaag5kgMDi&dfV0GO1h@nV1g$ zW4e4KYhB&ermCZg+uEw(oQ-fn(6DPt7tk7VdGw2X8vX;o?{DkblWcQs?`czv6e4E|dx#1y z#%v?Fkw;IPT`rH*LCK-fB!18v#GH_`!Bp@8ZNM*I?1Z3>dQO3+2SpVbq~L-bN=jbj zw2Vp_GlL$4I|6@vZiQ^5oso#ce>zW1J#+_Pq6W zn}^rjIS(GDtO0rT7+|VbHg8^G;*5&XC8Z>v8`Kb>)LU<5+ZwnA_6TXPatgwO)zB>w zd56LJJxX6f)aSTl+hHd*R9BQL%MfBocs!Ih%x7e}@*{`AA;-B1NDhS@Ipj^k3q~L6 z*=;?^q-p~^OZfIWCJ@?svU(o87IHI{%#a7?5MB;jLeM0aQ^^cUR83-%ZE(3nsS6j{ zj6%RvUN}|HXa*(#N3w6d#U3f;k{gPPAMwH6WN=M+Z3Z`z7d5WfUCr~^*0Z5Pwa>>> zT5w*4P7_TqwU%n5cuij1fwKPqP(HnpM?;WYTe`Bnuu@XXOVOGQ_+wQf%fha%q{(o~ z=R$_p%PGV8@2FjrJ%>?X_~C_DFlh86sU%x^;7|M z3Q;ljG^pfLL?xf1iKv=dMa3{xnNx(B&+F;Y%?1#ua#DZtvQZ2+CmXGAt5-5Z3tQ&F zm03qL$=fD(8~!#f$(d=4ffqd`Inz_{c}!BGyu8d1k>QtntQ9>;{yr{g3sjaG#b{U* z8cNd@E?wo}tJ5XtdNq5%X&>C%`*v?Hk7>B>Jg<=ZE*qGaJoQ*!F4XvZ8z^Ps6FOn& zJf3wEMwRPMK0PZJi*!R?m?khG>XwLLG`Gk+PGS6UDw*u*JrJxvwB6&sTnL$pzV_JV zoXxsQbG0fsui-!gJN2B#bHf3C8eeDr(W3-;|Kld}4}?;94Vpl3{AEhH&ja$V7@%MR z7pJV4*1$rd>6m(uA)zwV011U8hbfOt)IF$bk~cGFe&ymzObQLmm+sz6=E=For4SUR zgc*SVC1tpP2gQpFPGmw4StJoXaFKa>_#*T4AVx2zsBoqXVDQM9GOWQP^J2}@LmZu^ zYLQGD;f}1MMnaj29{Na-(IQn&4})Ym6*S4(Et2pLlf053Tx`>&^CCfdv?T9(%p~us zkSf5pmO}>)Pz=RaTTiB^2eEK1Qm{c78@TXHmkg?;ozM2ba9|)QC6NIZjcC4Tdcc&E zlqnf($xh!)kv>HNoTV(C@-^7lz{l<9ys7ZUE+!VF&`8nUylk^Scth*s)H^~85tU(p^&km z5gd{@hlPj7umpXqFCQRIy*zvQRNWCA79+|90Mw|5iL^p3<3tV=G2hga7B*NSMQD&7 zEavGcdCKUK6hz8TsY*U%1jm-35kZ%}wypOgMp#yV#$8|QRv>HeNW6?1KB9z-AdT<@ zO*O}mKrn}q5T=YHO@XA~NV2|XyR2T1C6(I*f4g30s85Um@K&eR=Z6=@pz zdaSAABibZ_xFkPhZ1PTubiEOA8X>3RJkP#tNxr$v9$6y2ePn=)!77*h8ONv((WlYB zT%jodR1|82p>l@++1MoDOGcu+=xZSCL(+3ac^k9p#FsJGKBAJ*2~q+IE^) zc6UqLDD5iaqk4{6$xG4ume$i^EBfj$}MngU%JWtikaU2gP0$|Fe%VDLkk zPyiz>^~W0X8jg}4^{TL!44;g9m44}wuL^y6mDr%n4;(D&<}AOeBm-dVpjh~a?xDT; z{-h|;q94FFrzsjVr;S)RFAo{^$#7Ujoq75KX24t@(KDy9Cv4FV2+oowe5n#re|qu; zjT&!?j!_Y8s~#Wc17soAEt<0Vz@bf)pO2AckgWKn9#Z}0aEGcYu}TBHO-C~5vI@@0h%SaCSO?(uZ20fre|w}ee+Mv5jH)8 z^hnpB1!%<2M)Wx#gESRi!v(XXhvSbDaZ?!#v{uEs!&3u8r6rS;E<=3yr z-|R+F5jEEs_|_O4_)Hfc3d6uxa4WtMxf=2?N8|Y|M7=s|L{3|V27N}cM&(rApr`T; ze3pk1n-7o9jg<-mUoStreM+wStwv{+@vL#WzE#Ot3eOs=V?978#7OxqOugFS{bk6T zVkGmW=o=twD%$Eq%CXpfy(j_r-$ z-mtGQyz;_ek-sW!3GsQ0i`-|!rN%RixE|(PcWCwgL!_^V`s}}(gMDM~ma7{f-Ur+m zSc)ay)8%J9>c`$Lr>${6HhK>Xi~KR2erE8$YmZ}RcmJ-vj-Af_T`xLz+WWg&FI%Ra z4%gLn>n~DOU9);&K)sH1@v50EfjJk?TflEr%?@5VJ2*cur+OiN=LQ2Ujm;bI3RP3! zs@4sGs&OS^YNA#=bfC*8I*X^ho*Nes@#3y+VyCaYxa$G2vmUp0vGWveak2A8+}4Pl zW7>-=yF2V6sW*Q3y*q)|gbuuLuFxim7pjFePQ0*5XvN}%e-@febU%3Dp=A8zoL5fn z4<<9me|B>JH8&=Nqf6i&soN5^iCtqw{L^3ix^IsEsWUvGy)XEF>UYkL@Py#|5v{7I zt`3h?_ol0m7fgC;;^7JD#qv2w&vWE+fS#w#6phD1#ha!C-{0RC@4h(q^9tr!VhhR@QcdRU3wqvDlnUPU9Zp&U* zD(;+y%ZK4~^fl*O$5w z^uKJ$C%EKM$BvZ~^6Wn1r*{0ok!$gFggwlJY@wch;?A{9QY_nMZ`oU#^4KJT0=5I_Oq~=KU`ddG?^=P6F!0wx($vc55Y7w0p)S%Z z1z%L7HVEXB)Z>bR_F)j+`Zs#&kCfV~r}j~*Md%8%W2GC4Gb!H_PZO#1E$Oe%6yB|8 zqaMle_q*K{%lI6UvBkZh- zwTE+C_NKMT%eN()+%O>8A8sc5>8!f9Jq*j_go11HYwGIS!`Y5-Hk502#*cin8;`;F z6G}u=_9*bS$+I_;>-Bv5zGlfYGZJ5iL=J zPHqqPC)yR@#}e>SBCY`6lYpZg;iFaVtx4~;tDq*}=4l7je_!{2tz)T+Y)6kHqWzYT z$t=E%#LJW@z%5Rn+f`B$UpbVX(e;1$er{LCSW2JWb*+c)6Vg5?)E}TsZ{zP>{Cz;C zdm!}`)M!}E#ZoNW(X2(`fyQrih6mz%_V?NLIl@Db4zeSOSHMe%crh|-hviPS<_^!! zU5>)(3#eU0>lh{V#Czt%Ta-X8wcr-F#dz)K{;%dpa`uqDc^s51LR}uZ0BDInfYig6 z*VS>`($%?^fkYCZzabjKx(&2!-5pEMqt+14x?%N96fMa_89IzIZ`3)WM4g`4i^P0N z;Kk=i;zgt`iBVF~s5?u$T*>mPA0w_hU{`@9huK(9O}H*j=ca zwynwL^An;rk_Z%2w-0MnZj)2{mqj$mZbMmTXxzpsLI&c`T7o7{0Y^7V)eO-sk`pP| zODdv+CNqK?MLHDeB7$^%a@n%PPZVS<~Tsu2qAebQrtKmTN@tunPh2Tsld)6*2KTjh!VwfsLPeOQ>DH|HDe^A%);;)@3w?62G1&; zDSa%|5C8&*har6zyn;>$B1y4_ocV+AcV0hqGDS>vUO#v;<;h_>BauB)8~^>uls%k7 z$2h{r>*`>?jkagzgDSj%L@BlIgmx9x0!5URLF@#zpMYd72;)3TbO3|ePq`Bapj6|! z>yVGGWVMDd$Z9>PfQAfvo>}cVN}5Du=*UK51Xx_?uN4+~Vut8$R2cB#v)X#XF!T{# ziy?Hw9+eV)d-#)%@F(C^n>de*9x#vVKGKerS$OlAWh|wLR+D4aj$1ty8f@!~UitMr zYHN7Vuu%U*0PYpc--Dgk51dTx?;9q1h?mUb^{UgKK@m9b61fmHT?H0(-%a=0*h8bv z?7YEoGDZER+ss9hqoIUHs^?ZpqhpK?Bn4hizy!WGh1B~_N^}52SKu2Z0MsLfW}dtZ zOhV8~Hs_r|8AIGd99NNgVHA*Z(IdjaN2H=T*#e*_q72G$kB*c{6xkvPn)wf*LMNCG zpH5%d5vGZkNmBXKvb-aljU>e5Bfv8Z*M5a?qXg)+AcEV%aB1VeB#Iz)qTfdJjTU4K z;-(g$QfmtmMRr-ZMrZC!dJeY-OvuO*Wr#&gjMR3WMNLDbMDrzB!Qei#Fzji3$zbJU zijxdhK2wt2ZT2_)?GAdOmf)R;1!qia-_>4ru(ox>~ug@70`OMDAH#JL5J(F&Re7U97 z)}BF^$oA^pTF_o?2_jr~de-NZ(_5rXBy?-1ZZVjKVR56IrQwHkpndY$ut%Fw9QFv_ zeU9wWmN~;?Hp8fVoiL?QF)YtAg0b!Q!G4W52I_Q4)yE1=5lt~UDvMAvbsXbU%Iw1!LC>b?27Ne5PFE=fi&&g1)6qOfu`MTnD91QOVssFnQXT9Qa?tCp#m2}VusFI^}W~z*N z?;tRTY0kzisfWOc)SGlGkB$Ph`8*ahB3!@%YLYr)Vm5OUn4j6tZMoD(g-bq;_Am@P zjmu5aU~G`xcuzq$-dfO&SB=zh)QK52Wq)QT-j1bccd8C7Ww5AH!9w5P*B+)Rh&)WV z3#bu`cjQ^KjrkAj*^9q$&mJeS{{PXlPkrH@UH=7oHeHsUKr7poSz5JTm7&jXX4EVQ z?|<4%c>i1W9yeya_KSGdBZrJsea8%%_2Bai<-PFZ@WPMjUikB$NG}}Lpc8(u3UD&U z+*nQYhRu!h3C6uQROq}TiiDOZBX@>vK0E>Iqy~a=Qgej+DLx{99W0uO(MdXDkQ!rN_F1!0A$6yCe7aJCvq*KZh?T zl*R%qz!8yd>mXu6%FU*~tqgP`CgQ(;b5Q!PGPd`)CG9yxi`M_(jB7u+5DB(ZGQQ+R z)N{jUz|CZ0%gdHd;ywXfSK24nJh=3C34$7H)#|m|d;ex~kdUSuoG9=8k=(A=90_;s zDD3c2H0WqvDr#lVYC0jfW%q)O0i+b}h{=75m=V^!kydu~aV|z(UZBa27K! zS*&gO$N7o3PxS0UG* z(rWT>uH_6?(1%~uxjq+?mt61fW4;~3`3{VZ@fn;u8@F3I{|>lAc+5-UXe-V5A(Kjk zpdxkILKUFtFF&YguLE4d^Po;2T?_6j7z+}gw1N9x4vMeQEi-bzLVd9sgQ*Qx28Lz8 zj;{R;f=(J7Ph(FM`5cN2@34Q)t2wo)B_IDBGmPg~QJ#8A64xTr$as<|Ei|6A9;LPQ zbA87#noP#?jA1-aPXoPS#&d{ZY&>D0d5EYz8d~{S%gig|N$o=C4>z8u*=jsl?s73u z#;(V5EhV`Ye8NUrDj}o#E^jJ-f{s8Ix^N`N5dCi{*Rd4d#1LDuVQ_mI-UY>1>}HX_ z#r90<0zT3Dh<5!DIXicGfDnG`V6q zTT^X!WZ8{3?fQe`$gZSgr|54#Q04uJyUFf!_djimz2^h8{pJ2$yB$ZWj=B#Z)t}uR zJLPOXyfe_h;? z&a)e<6+a@vo!6J}dbAq^G+t(6rE^#D9_(j082hNS;oJgX}U4GN+h< z9}a*Yw${U9S_f(i!$wv)B0OUbz!RveGta66{Y3hSG3|5Eszw=5b1Q_*|l->*u3W zk%0RvWd|p?jPVVjvotZE55aTeD9G9Pvy_H)ENC2iqEJ4UR6d;>_b3W>F;z91f=#1V zCvOJ; zh70z=<#FU?U3ZF(;@jI_T82Z&9T&vjk9A!GfV;2jS|o3;><)=$d-@KX)3K+UF(txt z$G}QQUteIah^5EKE()~QH zK0@{XHrGA~8A(4b{w5fZuAp-I&TlVPd>q!xj^|pDp#yYB@TOfaJJ7scuQ--R+WY$3 zwSEvmGugr9tQ9w*nXfpwb@`8LnsrZdSj*6^=5bZ`CJz_82g&nHpB2&TEbCuh6>D}R z58Gphy-J|ujNY{CCE{Uu`(D&@WP4xaNc)RN+IQ<*aHito2(>N$VQ_KNt{x&mMd~z(mx-TeuC1SVJGG)+y-$Q z#BEX7<-NZ;$A<*hPO7UjPM>WgbQ+d;{Q&0)k0$KSqX}p6Q5@GlO1`nvE*I8Z&ZBu0 z2T<@wD7^?hY{@>mr=)%FPV%Oag>|?h-_hXJrHjtwP#&{c zQ6`7&6UyOa#5hxQ14y_M6C@8C@;uxC9;hz{i7xT?^?cqX%pX<(2dZl2QV1#;sG@zU zVzr1=%L|2aIWgW1v1>!w_VA}2;ZI@HBgQ(*^JP@Keh%*Mk%CCz^#QB%`V1Wri5REg zenhy2|2wGNN(U#Z&^9u*G=G4J(kiUBaT@DdDw4t(8z@n_j$b?=UWVjSF8SU#ZjS@2 zPZtq#mTRVWBjBy^+I5D5qlYJABBT>cQZW~WOB$ci&d^b$kgpK|0hQ3s$-*Vpk2Vcz zUC4F~;|*@+XuMrPOzojIT)2<7SCGy#MMsW0R}S9Sy<+k*98Lp!lCgma7RGQUw(&V_ zwPI`xmC`!SSlFuia%?RkHfUldL75rCaX`tC*TT@6LWX{&y@~E5NsURMly)j38G^~$ z>u5i;({U6=OWGZ6J21b5(3m^t2;BK}?xtC|dkJrdnEH{#^(*Z%gFBScZdcsVJJQ4z z_G!L@_XeP7&eWB*M4KRALHihljNJ_{+U!bfmN~yuIehZ!QzTreIktpHo=x6mE_Q%2 z6QwfeadWX3xY!UKPef1i4$4ym!iEW69$?BpV3gmPQQ9SnS4U}OlxNH+Yb44<9pz?5 z`D-)E5{Yt|jxv|h>GdX70up1Ij^SgBubD8iK4SKEgGN84(-+a;;CGY;Ebl1Y@U2t# z1lQiRwqx!8TDx!U@wH{&O8?fdP0c7OJ#mCSS?z~J$uJ$ujZC~nk<}icOsZrm9kPAs zK=32H%hlnHz2og#h1b2h9Afb^j%NFFw&j)G-BXv{)V@c)3l@i~MVJ@FhHOpcjbDik z*_-U?8CCase6jbB#d^mymsPD-PbF1HJu!ZE;|(!>Tde(p#Dobe;G{9h*t@pmyN*2J zs*~=0?ZpZMb#}v3h<#$)_a09cXW$9#arASxQ9gFuw(ngNg)=4!dL6(qVPs7hthG3H zN~iU9tQ^8#A$y!Veh1-TGYg^O1O$ROBE1DetglAzVde z>09WI^bL3o1*UMq)zD6#_C_gS{NjYO%8pR1+>-l@%ynZa2F98EYe|aFI!ClcA0yZ^ zt#keeJ6U~YMPAH*M7#v+Ly0KC2U zb_QYucU|knOGs`SN!set_z_Z6q-$##auY$OVh`dP{NZRea*CXSvmPCXEIQDyj+Ii@ zxiV`rW$CA(_anjcvAbxR%>EM~FcVbZdjL$j=Cg3@eZ>l%O9F z2&d8sG(&>g^W`p*kd{1Tri84fVql$$&5@uR^GI_gq=t}i&{1)EiG<$fQIptp*U_v= zhEHEq$rgo$f>1|e>n{tY6a=RgB*ck#2uOVlGFoUHAaLQdpX6{fPFb|yd(>!EE~kD- z^Lv291Hgh0*X!LHweyku-5&BrP#X5nrEQ_oXdToL=^^b&OYRy|E}v-JYRL|pv&q$6 zgKU1i;~R{J$&TlLuIVf@^8W#HwT0FY-ksDLK|qLxrZ2&GVV0{<)XA@NI4xy*Ol2S_ zw1MQc81HzzNDeo>Dv|<g-+@9M;lZi^`I$I9N-wyqVlH;$=}HU9qLE4BO_^tyRynZq+;I>1nH0T~GFW16 z(5{la{7l^8Nc)RumFn&Pr6W;yLqrO^SqEF7caI3YX+&tq1SN%oT6?!{uR|rR!&0!rw z_9Cg?Y;?Kl*!uU)=m|5rMKu~IGoR>&*wOLwWY}UrXnW63rFJ{`N3ziAi0&b-?A4m zp)%Y*wX-pBgEq}Wm|V$nKkGu>h_e9Vpu$~LB&cE1c3!I6PL0siINw0e=s`B6uTw%< zeiL&ro_lrU`Ol`Zmzv8yVk#@&a?5BB6HFSb5a=x)FPhE=6L3GY)h0SeiX;#4nqXnC zH4!o~0h{{EL@xwf=Blf!!b%6`F@C2mLocMlID7CmEsWX_zxh@~M07R=i9U(xRF1{e zW~uKFGIy{Db2&aAUY+r)I|7oClINF$i81ZGGSQsz0_?qs;He#>U9}rYY*$?Y3l2z zgj%do`Ri3abqd#I&5r2BiLd`{DsDx)P@$mSZ zI3E&D#FzR}I$Li) zV?qZ_GeMUb-K3s)+3yuq?7zqg^jC%A<`N2JKB17<^q0u4(~EI_Rs-Dl<}U-CqGfH=|45ggd_{@c-;iXxcLKTp<$ua48x4uq$ zhM{01PR!>*3pSmD8WjZz0OZ>c6>w=<}1+0R0~KDL1n#hTNEB@{4qB@_QM1r4w9Y zigQw6uhkI@>PcI_AF$Tp%uqBE@1FC@&xLl0po3)-@N}VAaG+`2mfi0AP6>Ns|C~3{ zzMuQ>{XPHmajyAzbhqYy8~^GXVAItnpJR3t43D-EY4kA-%#oK_u=`|cI1Rh4 zau^@0@vho(yW8h<+8mptTrM@+T zOGl^SlQhP2C;d(R20ytb=A6d!UoygQ=Kr^=1cKGI%dAU zQa~f-Q8c`Zh>sEE5ra(4;Hjh2@JSk`hATdph6!9*KqEOp@!?MJrWJ*hYlthOGc!@b}TT_ z1&!2^&3p`_ab*FGm`9D5M>g}}v(mV#kVcu( z(?G-}>?6{^462hRKEeewYHg}t+%_lmfa&U!&$Tua43A3-Xo$0vegsi@D`)!QfUv0?N6H3c-p7)8TdN&R9T7>Wigqy>EK=rnwihG}4! zX_&xYEuaw_r}*$+obOxN2t^|{PM3!SUspgwOi(lei}N`~f6y(M)_w&kx1X+TezMxbW2whYtL|5```ZAo%l z&gZ$o#Pld_X)C0GwlEF+ketDpPhVaIU z+5hk@B|gkdn{?d_ZZDt_o1|#?*XH@K^h;hpBsg9`LrhgP0z1gx(I+GGJU2BDCMq3; zG|EItt&4Q*JH&^X={_of3--ed?kuD+RnhSOGS7!B+b3_r;6tV#ETl1A(FhFXX;^JC z{%5M*M53bqn_pGKpLJWZe%0L@XGa>=v{ugx+_L1V=~rGDm>UdU61cmmX~V+Vvp3$+ za>u%LciesPy7lYsTGxE>`o_CvZ)jY`ehT%&*E@?5HP!R+9i*>f)o%(-mgrSlfz!TOEMk{U4?sJmz5hK4)7 zt&C`>@eaod}Z@`d}T9QaZdx`oWnRoW63@1HwOM3K2QfV z;;SNq*ylCd>-gDcqpu#1ZaIxZC0OCHbw}g-qF5=4?t0A@O%#df(dhE%uGek2e-vF2 zU9hJaXgA>B86<9?gVM34l9*96a^p?6+`9W+-+k{;_m0`W`yG4yWktzFl!(qp-sfJH z#2qHkvE^H`&Zfy*dWv`VJG}q;9Mq$x6rA=_Pxm?j-M1a*|U35_cHAU5$_&n7utN0 zuk)iw{D5}8SbjTW%u*QTjG@R7hErlN|2SW(_~*)yG`9|K!JBiDl)3kv7Ph9TV-7Y? zkMFxFg5CxX67!=K=;;aQ=vNh#3dHxkie7(JiOg*!iln*9G1gopWo~5IP4RB+NH*l$ zWZ$3Oop$W{4V`|Rc$Ch-<7~a`4wtnwl8QD7saQ{$`{|*J&2cpj9-}4N zckx94HuM`8znV~xG2!U)oyGl2j#T|>V6Uyo?y(Q-#Ys0$Z9h=}qdO<}@A|Fdh{w^d zp9z;I$UXG3B%SJ~GtjQ0qjWmj?!}2{8~UDW2)P?;L1ZV6mlFX{v>ZYA)anHGs;_lF z;&BtTokjh-UdN&7e?*ZL%b{x5UDs8-IleNRzOr*=wzG24N@sHr3*lICrqf2Gap|eZ z!P_wWB@PB~41im@>!@V@kxATlI+ttyITnxUV4yr9*7ZEjjnS70;Lu(oxl=ol(ca4} zPVQ`;ltaHO2Ze>Yro84CwDAXn(=+_7d@Oh?+N*Mq+Xv6=yrmt4c3#yE zGCP;GgUHS++Cc)<#<$yX1Glbh*S!zLA9H3QmF;fY|Jgoi$HB_4g3j$Nc-u#e~0B9qMS|$wPWd&;QMn9E{jm2b7`67amNeV8I8V# z#ku2!BWJV_JyG`@Kcn4#nhGphTGseA?JxN`!lV{$??1ESe;zxtXusW5;yc$Neb%Swk%gjn-DVZDK zl3dsBzm7lV&QYtek0`%79IR&--yoV*KTEdwWk|Pn;yu*Q=QS{PGTIiflb4OQ2U}0* zQ*2QciiBSU0c*~kwIrl=`c`RR#TJVg1Q(OAlLTX_;Q{BxH=akwA|u*;r|7gCzRW_t z&k)i6>PZ|SB&KnGoQ~b9lM5H&<#)XONw2ezaN~js*P(Fd$|0yz$k{w5u@+|$7NNKV zVY^!U$snh4o65Ai^~XtC6CSDfd0h8NkFA8iSycNJa4mfby_wjBQHOIjS{tN-)4nG? z^|bq~@Ah9$P|0MvjP(Yma9oQW0^51aIwYucY!RWd$>cM&+W#1wW)n?gx_03pb-cTI z48Na7M{iNEl3WM8Kf>MstQocj<=DRzMC91_zDL`ObdVTaq6+QcyP%KCF)HXAaaj}O zx3SAz%=AL+U*be$(?#Hk4as4Yki_=9tDhouYLA%d(AgYx0F@jgT3%2?1RSYK7ZC}t zF}&WX2FLdk2DoH{)l7-hp9DCP?O82zxdBJtK_(8oz{Guxz&cICSDJ4^-jhcTSdej? zhZ|R7LjK!4@+b6YP}arzM}q21?xO@;6||dcdl9psGyQc{?va9WKm7g3yGc!UjI}(^yz|q_!@b*_}czY<9q0V zT>bdVvD3Dus@Q3JldJJ;LXT+Ye;UlSzvn*KT(rB-@eA9WHqrav;8& zGc{zMd=GA44Zb*^2vXcImgtqKnqSs_`YEdK{*>$e*{AW{+DoXM#}%;Qq)J3B@M$dP zLd=nKH%}QC5Y3Kh|CZBEpLoutxjvm15KZ>y+&ahITMssm|5vyuFa7JY4?q9hcP~7p c=cw2Zq1Wn-fxFiPSpn#O@Tw{P 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 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk w1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBoL|GmKf3kFKQm;e9( diff --git a/SysCore/include/conio.h b/SysCore/include/conio.h index ecae7b6..24d36ab 100644 --- a/SysCore/include/conio.h +++ b/SysCore/include/conio.h @@ -2,7 +2,7 @@ #define __CONIO_H #define _ATTRIB 0x0F -extern byte default_background, default_foreground; +extern unsigned char default_background, default_foreground; extern char hex[16]; extern void itoa (int value, char *string, unsigned int radix); @@ -10,21 +10,21 @@ extern int printf(const char* str, ...); extern int abs(int x); extern void graphics_init(); extern void text_mode_cursor(int x, int y); -extern void set_default_colors(byte back, byte fore); +extern void set_default_colors(unsigned char back, unsigned char fore); extern void clrscr(); extern void scroll(int n); extern void prev_line(); extern void next_line(); -extern void putc_pos_font(int x, int y, char c, byte back, byte fore); +extern void putc_pos_font(int x, int y, char c, unsigned char back, unsigned char fore); extern void putc_pos(int x, int y, char c); -extern void putc_font(char c, byte back, byte fore); +extern void putc_font(char c, unsigned char back, unsigned char fore); extern void putc(char c); -extern void puts_pos_font(int x, int y, const char *str, byte back, byte fore); +extern void puts_pos_font(int x, int y, const char *str, unsigned char back, unsigned char fore); extern void puts_pos(int x, int y, const char *str); extern void puts(const char *str); -extern void puts_font(const char *str, byte back, byte fore); +extern void puts_font(const char *str, unsigned char back, unsigned char fore); extern void put_hex(unsigned int alpha); extern void put_hex_pos(int x, int y, unsigned int alpha); -extern void put_bin (int x, int y, byte xz); +extern void put_bin (int x, int y, unsigned char xz); #endif \ No newline at end of file diff --git a/SysCore/main.c b/SysCore/main.c index 7848e40..ff074b6 100644 --- a/SysCore/main.c +++ b/SysCore/main.c @@ -5,6 +5,7 @@ #include #include #include "memory/mmngr_ph.h" +#include "memory/mmngr_vi.h" #include "shell/shell.c" //! format of a memory region @@ -47,7 +48,6 @@ void k_init(multiboot_info* bootinfo) set_default_colors (0x07, 0x04); clrscr(); - // Start memory manager uint32_t memSize = 1024 + bootinfo->m_memoryLo + bootinfo->m_memoryHi*64; memory_region* memMap = (memory_region*)0x1000; @@ -55,9 +55,18 @@ void k_init(multiboot_info* bootinfo) unsigned int i; - for (i=0; (memMap[i].sizeHi != 0 || memMap[i].sizeLo != 0) && i<3; ++i) + for (i=0; (memMap[i].sizeHi != 0 || memMap[i].sizeLo != 0) && i<15; ++i) if (memMap[i].type==1) pmmngr_init_region (memMap[i].startLo, memMap[i].sizeLo); + // Protect kernel, bios data area etc + _end += (memSize / 4) * 3; + pmmngr_deinit_region (0x100000, _end - 0x100000); + pmmngr_deinit_region (0x0, 0x500); + pmmngr_deinit_region (0x9FC00, 0x400); + pmmngr_deinit_region (0xA0000, 0x60000); + + // Start Virtual Memory Manager & Enable paging + vmmngr_initialize(); } void k_main(uint32_t kernel_size, multiboot_info* bootinfo) diff --git a/SysCore/memory/compile.bat b/SysCore/memory/compile.bat index 606c418..4652bd2 100644 --- a/SysCore/memory/compile.bat +++ b/SysCore/memory/compile.bat @@ -16,13 +16,20 @@ goto build :build @echo Building Memory Manager... - del %objpath%\mmngr_cr.o + del %objpath%\mmngr.o del %objpath%\mmngr_ph.o @echo * Compiling Physical Memory Manager... - %nasm_path%\nasm.exe -f aout -o %objpath%/mmngr_cr.o mmngr_cr.asm + %nasm_path%\nasm.exe -f aout -o %objpath%/mmngr.o mmngr.asm %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/mmngr_ph.o mmngr_ph.c - + + @echo * Compiling Virtual Memory Manager... + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/mmngr_vi.o mmngr_vi.c + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/mmngr_de.o lib/pde.c + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/mmngr_te.o lib/pte.c :check - if not exist %objpath%\mmngr_cr.o goto error + if not exist %objpath%\mmngr_vi.o goto error + if not exist %objpath%\mmngr_de.o goto error + if not exist %objpath%\mmngr_te.o goto error + if not exist %objpath%\mmngr.o goto error if not exist %objpath%\mmngr_ph.o goto error diff --git a/SysCore/memory/lib/pde.c b/SysCore/memory/lib/pde.c new file mode 100644 index 0000000..0e07272 --- /dev/null +++ b/SysCore/memory/lib/pde.c @@ -0,0 +1,36 @@ +#include "pde.h" + +void pd_entry_add_attrib (pd_entry* entry, unsigned mask) { + *entry |= mask; +} + +void pd_entry_del_attrib (pd_entry* entry, unsigned mask) { + *entry &= ~mask; +} + +void pd_entry_set_frame (pd_entry* entry, unsigned address) { + *entry = (*entry & ~_I86_PDE_FRAME) | address; +} + +unsigned pd_entry_get_frame (pd_entry entry) { + return entry&_I86_PDE_FRAME; +} + +unsigned char pd_entry_is_present (pd_entry entry) { + return (entry & _I86_PDE_PRESENT); +} + +unsigned char pd_entry_is_user (pd_entry entry) { + return (entry & _I86_PDE_USER); +} + +unsigned char pd_entry_is_4mb (pd_entry entry) { + return (entry & _I86_PDE_4MB); +} + +unsigned char pd_entry_is_writable (pd_entry entry) { + return (entry & _I86_PDE_WRITABLE); +} + +void pd_entry_enable_global (pd_entry entry) { +} \ No newline at end of file diff --git a/SysCore/memory/lib/pde.h b/SysCore/memory/lib/pde.h new file mode 100644 index 0000000..fe77351 --- /dev/null +++ b/SysCore/memory/lib/pde.h @@ -0,0 +1,30 @@ +#ifndef __PAGE_DIRECTORY_ENTRY_ +#define __PAGE_DIRECTORY_ENTRY_ + +enum __PAGE_PDE_FLAGS { + _I86_PDE_PRESENT = 1, + _I86_PDE_WRITABLE = 2, + _I86_PDE_USER = 4, + _I86_PDE_PWT = 8, + _I86_PDE_PCD = 0x10, + _I86_PDE_ACCESSED = 0x20, + _I86_PDE_DIRTY = 0x40, + _I86_PDE_4MB = 0x80, + _I86_PDE_CPU_GLOBAL = 0x100, + _I86_PDE_LV4_GLOBAL = 0x200, + _I86_PDE_FRAME = 0x7FFFF000 + }; + +typedef unsigned pd_entry; + +extern void pd_entry_add_attrib (pd_entry* entry, unsigned mask); +extern void pd_entry_del_attrib (pd_entry* entry, unsigned mask); +extern void pd_entry_set_frame (pd_entry* entry, unsigned address); +extern unsigned pd_entry_get_frame (pd_entry entry); + +extern unsigned char pd_entry_is_present (pd_entry entry); +extern unsigned char pd_entry_is_user (pd_entry entry); +extern unsigned char pd_entry_is_4mb (pd_entry entry); +extern unsigned char pd_entry_is_writable (pd_entry entry); +extern void pd_entry_enable_global (pd_entry entry); +#endif \ No newline at end of file diff --git a/SysCore/memory/pte.c b/SysCore/memory/lib/pte.c similarity index 64% rename from SysCore/memory/pte.c rename to SysCore/memory/lib/pte.c index 4f7bad8..d51801b 100644 --- a/SysCore/memory/pte.c +++ b/SysCore/memory/lib/pte.c @@ -1,4 +1,4 @@ -#include +#include "pte.h" void pt_entry_add_attrib (pt_entry* entry, unsigned mask) { *entry |= mask; @@ -9,18 +9,17 @@ void pt_entry_add_attrib (pt_entry* entry, unsigned mask) { } void pt_entry_set_frame (pt_entry* entry, unsigned address) { - *entry &= ~_I86_PTE_FRAME; - *entry |= address & _I86_PTE_FRAME; + *entry = (*entry & ~_I86_PTE_FRAME) | address; } unsigned pt_entry_get_frame (pt_entry entry) { - return entry&_I86_PTE_FRAME; + return (entry & _I86_PTE_FRAME); } unsigned char pt_entry_is_present (pt_entry entry) { - return ( (entry & _I86_PTE_PRESENT) > 0 ); + return (entry & _I86_PTE_PRESENT); } unsigned char pt_entry_is_writable (pt_entry entry) { - return ( (entry & _I86_PTE_WRITABLE) > 0 ); + return (entry & _I86_PTE_WRITABLE); } \ No newline at end of file diff --git a/SysCore/memory/pte.h b/SysCore/memory/lib/pte.h similarity index 100% rename from SysCore/memory/pte.h rename to SysCore/memory/lib/pte.h diff --git a/SysCore/memory/mmngr_cr.asm b/SysCore/memory/mmngr.asm similarity index 75% rename from SysCore/memory/mmngr_cr.asm rename to SysCore/memory/mmngr.asm index 58375db..886c75a 100644 --- a/SysCore/memory/mmngr_cr.asm +++ b/SysCore/memory/mmngr.asm @@ -27,3 +27,11 @@ _write_cr3: mov cr3, eax pop ebp retn + +global _vmmngr_flush_tbl_entry +_vmmngr_flush_tbl_entry: + mov eax, [ebp+8] + cli + invlpg [eax] + sti + retn diff --git a/SysCore/memory/mmngr_ph.c b/SysCore/memory/mmngr_ph.c index 907f1a6..4581cb3 100644 --- a/SysCore/memory/mmngr_ph.c +++ b/SysCore/memory/mmngr_ph.c @@ -1,26 +1,34 @@ /****************************************************** * Physical Memory Manager * ******************************************************/ -#include -#include + +// +==============================================+ +// | HEADERS | +// +===================================== cta os =+ #include "mmngr_ph.h" + +// +==============================================+ +// | DEFINITIONS | +// +===================================== cta os =+ #define PMMNGR_BLOCK_SIZE 4096 // block size (4k) #define PMMNGR_BLOCK_ALIGN PMMNGR_BLOCK_SIZE // block alignment -struct memory_stack_entry{ - word low; - byte high; -} __attribute__ ((__packed__)); -typedef struct memory_stack_entry mstack; -static uint32_t _mmngr_memory_size=0; // size of physical memory -static uint32_t _mmngr_used_blocks=0; // number of blocks currently in use -static uint32_t _mmngr_max_blocks=0; // maximum number of available memory blocks -static uint32_t _mmngr_index = 0; +// +==============================================+ +// | DATA DECLARATIONS | +// +===================================== cta os =+ +static unsigned _mmngr_memory_size=0; // size of physical memory +static unsigned _mmngr_used_blocks=0; // number of blocks currently in use +static unsigned _mmngr_max_blocks=0; // maximum number of available memory blocks +static unsigned _mmngr_index = 0; static mstack* _mmngr_memory_stack= 0; // memory stack + +// +==============================================+ +// | LOCAL FUNCTIONS | +// +===================================== cta os =+ inline mstack mstack_pop () { mstack temp; @@ -34,7 +42,6 @@ inline mstack mstack_pop () return temp; } - inline void mstack_push (const mstack *block) { if (block->low == 0 && block-> high == 0) return; @@ -46,54 +53,90 @@ inline void mstack_push (const mstack *block) _mmngr_used_blocks--; } - -inline byte mstack_test (const mstack *block) +inline int mstack_test (const mstack *block) { - uint32_t i; + unsigned i; for (i = 0; i < _mmngr_index; i++) - if (_mmngr_memory_stack[i].low == block->low && _mmngr_memory_stack[i].high == block->high) return 1; + if (_mmngr_memory_stack[i].low == block->low && _mmngr_memory_stack[i].high == block->high) + return (int) i; - return 0; + return -1; } -byte pmmngr_test_block (uint32_t block) +inline int mstack_qsort_cmp (mstack a, mstack b) { - mstack temp; - temp.low = block & 0xFFFF; - temp.high = (block>>16) & 0xFF; - - return mstack_test(&temp); + return (a.high == b.high) ? (int)a.low - (int)b.low : (int)a.high - (int)b.high; } -void pmmngr_free_block(void* address) +void mstack_qsort(int beg, int end) { - // Calculate block - mstack block; - uint32_t temp = (uint32_t)address / PMMNGR_BLOCK_SIZE; - block.low = temp & 0xFFFF; - block.high = (temp>>16) & 0xFF; - - // Push it - mstack_push (&block); + + mstack piv; mstack tmp; + + int l,r,p; + + while (beg 0)) r--; + + if (l>r) break; + + tmp.low = _mmngr_memory_stack[l].low; + tmp.high = _mmngr_memory_stack[l].high; + + _mmngr_memory_stack[l].low = _mmngr_memory_stack[r].low; + _mmngr_memory_stack[l].high = _mmngr_memory_stack[r].high; + + _mmngr_memory_stack[r].low = tmp.low; + _mmngr_memory_stack[r].high = tmp.high; + + if (p==r) p=l; + + l++; r--; + } + + _mmngr_memory_stack[p].low = _mmngr_memory_stack[r].low; + _mmngr_memory_stack[p].high = _mmngr_memory_stack[r].high; + + _mmngr_memory_stack[r].low = piv.low; + _mmngr_memory_stack[r].high = piv.high; + r--; + + // Recursion on the shorter side & loop (with new indexes) on the longer + if ((r-beg)<(end-l)) { + mstack_qsort(beg, r); + beg=l; + } + else { + mstack_qsort(l, end); + end=r; + } + } } -void* pmmngr_alloc_block() +// +==============================================+ +// | DEBUGGING FUNCTIONS | +// +===================================== cta os =+ +/*void print_stack() { - if (_mmngr_index == 0) return 0;// Out of memory - // pop a block - mstack block = mstack_pop(); - - // Calculate and return address; - void* address; - uint32_t temp = block.low | (block.high<<16); - address = (void *)(temp * PMMNGR_BLOCK_SIZE); - - return address; + int i; + for (i = 0; i < _mmngr_index; i++) printf (" %u", _mmngr_memory_stack[i].low); } +extern char getch();*/ - -void pmmngr_init (size_t memSize, uint32_t stack) { +// +==============================================+ +// | INITIALISATION FUNCTIONS | +// +===================================== cta os =+ +void pmmngr_init (unsigned memSize, unsigned stack) { _mmngr_memory_size = memSize; _mmngr_memory_stack = (mstack*) stack; @@ -104,7 +147,7 @@ void pmmngr_init (size_t memSize, uint32_t stack) { // By default, all of memory is in use } -void pmmngr_init_region (physical_addr base, size_t size) { +void pmmngr_init_region (unsigned base, unsigned size) { mstack block; @@ -121,7 +164,7 @@ void pmmngr_init_region (physical_addr base, size_t size) { } -void pmmngr_deinit_region (physical_addr base, size_t size) { +void pmmngr_deinit_region (unsigned base, unsigned size) { unsigned int start = base / PMMNGR_BLOCK_SIZE; unsigned int count = size / PMMNGR_BLOCK_SIZE; int temp; @@ -161,28 +204,136 @@ void pmmngr_deinit_region (physical_addr base, size_t size) { } -size_t pmmngr_get_memory_size () { +// +==============================================+ +// | MEMORY MANAGING FUNCTIONS | +// +===================================== cta os =+ +unsigned char pmmngr_test_block (unsigned block) +{ + mstack temp; + temp.low = block & 0xFFFF; + temp.high = (block>>16) & 0xFF; + + return (mstack_test(&temp) == -1)? 0 : 1; +} + +void pmmngr_free_block(void* address) +{ + // Calculate block + mstack block; + unsigned temp = (unsigned)address / PMMNGR_BLOCK_SIZE; + block.low = temp & 0xFFFF; + block.high = (temp>>16) & 0xFF; + + // Push it + mstack_push (&block); +} + +void pmmngr_free_blocks (unsigned base, unsigned size) +{ + mstack start, end, i; + + // 4k align + base /= PMMNGR_BLOCK_SIZE; + size /= PMMNGR_BLOCK_SIZE; + + // Calculate blocks + start.low = base & 0xFFFF; + start.high = (base >> 16) & 0xFF; + end.low = (base + size) & 0xFFFF; + end.high = ((base + size)>>16) & 0xFF; + + for (i.low = start.low, i.high = start.high; // i = start + i.low < end.low || i.high < end.high;) // i != end + { + // only push if block is used + if (mstack_test(&i) == -1) mstack_push(&i); + + // increment i.high + if (i.low == 0xFFFF) { + i.low = 0; i.high++; + } + else i.low++; + } +} + +void* pmmngr_alloc_block() +{ + if (_mmngr_index == 0) return 0;// Out of memory + // pop a block + mstack block = mstack_pop(); + + // Calculate and return address; + void* address; + unsigned temp = block.low | (block.high<<16); + address = (void *)(temp * PMMNGR_BLOCK_SIZE); + + return address; +} + +void* pmmngr_alloc_blocks (unsigned blocks) +{ + // Less than 2 blocks requested + if (blocks == 0) return 0; + if (blocks == 1) return pmmngr_alloc_block(); + + // Sort the stack for the next step + mstack_qsort(0, (int)_mmngr_index); + + int i = (int) _mmngr_index-1; // i = counter + int l = 1; // l = number of consecutive blocks + unsigned temp; // temp = temporary storage + unsigned prev = _mmngr_memory_stack[i].low | (_mmngr_memory_stack[i].high<<16); --i; + + // Search consecutive blocks + for (; i >=0; i--) { + temp = _mmngr_memory_stack[i].low | (_mmngr_memory_stack[i].high<<16); + + if (temp == prev-1) l++; + else l = 1; + + if (l == blocks) { + pmmngr_deinit_region (temp * PMMNGR_BLOCK_SIZE, blocks * PMMNGR_BLOCK_SIZE); + return (void*) (temp * PMMNGR_BLOCK_SIZE); + } + + prev = temp; + } + + return 0; // Could not find so many free blocks +} + + + + +// +==============================================+ +// | GET DATA FUNCTIONS | +// +===================================== cta os =+ +unsigned pmmngr_get_memory_size () { return _mmngr_memory_size; } -uint32_t pmmngr_get_block_count () { +unsigned pmmngr_get_block_count () { return _mmngr_max_blocks; } -uint32_t pmmngr_get_use_block_count () { +unsigned pmmngr_get_use_block_count () { return _mmngr_used_blocks; } -uint32_t pmmngr_get_free_block_count () { +unsigned pmmngr_get_free_block_count () { return _mmngr_index; } -uint32_t pmmngr_get_block_size () { +unsigned pmmngr_get_block_size () { return PMMNGR_BLOCK_SIZE; } -void pmmngr_paging_enable (byte b) { - uint32_t temp; + +// +==============================================+ +// | PAGING RELATED FUNCTIONS | +// +===================================== cta os =+ +void pmmngr_paging_enable (unsigned char b) { + unsigned temp; temp = read_cr0(); // Enable @@ -192,13 +343,7 @@ void pmmngr_paging_enable (byte b) { write_cr0(temp); } - -byte pmmngr_is_paging () { - uint32_t temp = read_cr0(); +unsigned char pmmngr_is_paging () { + unsigned temp = read_cr0(); return ((temp&0x80000000)>0); -} - -mstack* pmmngr_get_stack_addr() -{ - return _mmngr_memory_stack; } \ No newline at end of file diff --git a/SysCore/memory/mmngr_ph.h b/SysCore/memory/mmngr_ph.h index 6d61f49..d80425c 100644 --- a/SysCore/memory/mmngr_ph.h +++ b/SysCore/memory/mmngr_ph.h @@ -1,33 +1,47 @@ - #ifndef _MMNGR_PHYS_H #define _MMNGR_PHYS_H -#include -#include - - #define pmmngr_load_PDBR(addr) write_cr3(addr) #define pmmngr_get_PDBR() read_cr3() // physical address typedef unsigned physical_addr; -extern uint32_t read_cr0(); -extern uint32_t read_cr3(); -extern void write_cr0(uint32_t data); -extern void write_cr3(uint32_t data); -extern void pmmngr_free_block(void* address); // releases a memory block -extern void* pmmngr_alloc_block (); // allocates a single memory block -extern void pmmngr_init (size_t memSize, uint32_t stack); // initialize the physical memory manager -extern void pmmngr_init_region (physical_addr base, size_t size); // enables a physical memory region for use -extern void pmmngr_deinit_region (physical_addr base, size_t size); // disables a physical memory region as in use (unuseable) -extern size_t pmmngr_get_memory_size (); // returns amount of physical memory the manager is set to use -extern uint32_t pmmngr_get_use_block_count (); // returns number of blocks currently in use -extern uint32_t pmmngr_get_free_block_count (); // returns number of blocks not in use -extern uint32_t pmmngr_get_block_count (); // returns number of memory blocks -extern uint32_t pmmngr_get_block_size (); // returns default memory block size in bytes -extern void pmmngr_paging_enable (byte b); // enable or disable paging -extern byte pmmngr_is_paging (); // test if paging is enabled +struct memory_stack_entry{ + unsigned short low; + unsigned char high; +} __attribute__ ((__packed__)); +typedef struct memory_stack_entry mstack; + +// CR registers r/w operations +extern unsigned read_cr0(); +extern unsigned read_cr3(); +extern void write_cr0(unsigned data); +extern void write_cr3(unsigned data); + +// Free/Alloc memory block(s) +extern void pmmngr_free_block(void* address); +extern void pmmngr_free_blocks(unsigned base, unsigned size); +extern void* pmmngr_alloc_block (); +extern void* pmmngr_alloc_blocks (unsigned blocks); + +// De/Initialisation routines +extern void pmmngr_init (unsigned memSize, unsigned stack); +extern void pmmngr_init_region (unsigned base, unsigned size); +extern void pmmngr_deinit_region (unsigned base, unsigned size); + +// Useful information +extern unsigned pmmngr_get_memory_size (); // returns amount of physical memory the manager is set to use +extern unsigned pmmngr_get_use_block_count (); // returns number of blocks currently in use +extern unsigned pmmngr_get_free_block_count (); // returns number of blocks not in use +extern unsigned pmmngr_get_block_count (); // returns number of memory blocks +extern unsigned pmmngr_get_block_size (); // returns default memory block size in unsigned chars +extern unsigned char pmmngr_test_block (unsigned block); + +// Paging +extern void pmmngr_paging_enable (unsigned char b); // enable or disable paging +extern unsigned char pmmngr_is_paging (); // test if paging is enabled + +extern void print_stack(); -extern byte pmmngr_test_block (uint32_t block); #endif diff --git a/SysCore/memory/mmngr_vi.c b/SysCore/memory/mmngr_vi.c new file mode 100644 index 0000000..c604ac9 --- /dev/null +++ b/SysCore/memory/mmngr_vi.c @@ -0,0 +1,140 @@ +// +==============================================+ +// | HEADERS | +// +===================================== cta os =+ +#include "mmngr_vi.h" +#include "mmngr_ph.h" + +// +==============================================+ +// | DEFINITIONS | +// +===================================== cta os =+ +#define PAGE_SIZE 4096 +#define PTABLE_ADDR_SPACE_SIZE 0x400000 +#define DTABLE_ADDR_SPACE_SIZE 0xffffffff + +pdirectory* _current_directory; +unsigned _current_page_directory_base_register; +extern unsigned char *memset (unsigned char *dest, unsigned char val, int count); +extern char getch(); + +// +==============================================+ +// | PAGE FUNCTIONS | +// +===================================== cta os =+ +unsigned char vmmngr_alloc_page (pt_entry* entry) +{ + void* p = pmmngr_alloc_block (); + if (!p) return 0; + + pt_entry_set_frame(entry, (unsigned)p); + pt_entry_add_attrib (entry, _I86_PTE_PRESENT); + + return 1; +} + +void vmmngr_free_page (pt_entry* entry) +{ + void* p = (void*) pt_entry_get_frame(*entry); + + if (p) pmmngr_free_block (p); + + pt_entry_del_attrib (entry, _I86_PTE_PRESENT); +} + + +// +==============================================+ +// | PAGE TABLE FUNCTIONS | +// +===================================== cta os =+ +inline void vmmngr_ptable_clear(ptable* p) +{ + if(p) memset ((unsigned char*)p, 0, sizeof(ptable)); +} + +inline unsigned vmmngr_ptable_virt_to_index (unsigned addr) +{ + return (addr >= PTABLE_ADDR_SPACE_SIZE) ? 0 : addr/PAGE_SIZE; +} + +inline pt_entry* vmmngr_ptable_lookup_entry (ptable* p, unsigned addr) +{ + if (p) return &p->m_entries[vmmngr_ptable_virt_to_index(addr)]; + return 0; +} + + +// +==============================================+ +// | PAGE DIRECTORY FUNCTIONS | +// +===================================== cta os =+ +inline void vmmngr_pdirectory_clear(pdirectory* dir) +{ + if(dir) memset ((unsigned char*)dir, 0, sizeof(pdirectory)); +} + +inline unsigned vmmngr_pdirectory_virt_to_index (unsigned addr) +{ + return (addr > DTABLE_ADDR_SPACE_SIZE) ? 0 : addr/PAGE_SIZE; +} + +inline pd_entry* vmmngr_pdirectory_lookup_entry (pdirectory* dir, unsigned addr) +{ + if (dir) return &dir->m_entries[vmmngr_ptable_virt_to_index(addr)]; + return 0; +} + +// +==============================================+ +// | VIRTUAL MEMORY MANAGER | +// +===================================== cta os =+ +inline unsigned char vmmngr_switch_pdirectory (pdirectory* dir) +{ + if (!dir) return 0; + _current_directory = dir; + + write_cr3 (_current_page_directory_base_register); + return 1; +} + +pdirectory* vmmngr_get_directory() { + return _current_directory; +} + +void vmmngr_initialize() +{ + // Allocate default page table + ptable* table = (ptable*) pmmngr_alloc_block(); + if (!table) return; + + // Clear page table + vmmngr_ptable_clear(table); + + // Identity map the first page table + int i, frame; + for (i = 0, frame = 0; i < 1024; i++, frame += 4096) + { + // Create a new page + pt_entry page = 0; + pt_entry_add_attrib (&page, _I86_PTE_PRESENT); + pt_entry_set_frame (&page, frame); + + table->m_entries[vmmngr_ptable_virt_to_index(frame)] = page; + } + + // Create default directory table + pdirectory* dir = (pdirectory*) pmmngr_alloc_blocks(3); + if (!dir) return; + + // Clear directory table and set it as current + vmmngr_pdirectory_clear(dir); + + // Get first entry in dir table and set it up to point to our table + pd_entry* entry = vmmngr_pdirectory_lookup_entry(dir, 0); + pd_entry_add_attrib (entry, _I86_PDE_PRESENT); + pd_entry_add_attrib (entry, _I86_PDE_WRITABLE); + pd_entry_set_frame (entry, (unsigned) table); + + // Store current PDBR + _current_page_directory_base_register = (unsigned) &dir->m_entries; + + // Switch to our page directory + vmmngr_switch_pdirectory (dir); + + // Enable paging + pmmngr_paging_enable (1); +} \ No newline at end of file diff --git a/SysCore/memory/mmngr_vi.h b/SysCore/memory/mmngr_vi.h new file mode 100644 index 0000000..0861421 --- /dev/null +++ b/SysCore/memory/mmngr_vi.h @@ -0,0 +1,25 @@ +#ifndef __MEMORY_MANAGER_VIRTUAL__ +#define __MEMORY_MANAGER_VIRTUAL__ + +#include "lib/pde.h" +#include "lib/pte.h" + +#define PAGES_PER_TABLE 1024 +#define PAGES_PER_DIR 1024 + +typedef unsigned virtual_address; + +typedef struct { + pt_entry m_entries[PAGES_PER_TABLE]; +} ptable ; + +typedef struct { + pd_entry m_entries[PAGES_PER_DIR]; +} pdirectory ; + +//extern pdirectory* _current_directory; + +extern void vmmngr_flush_tbl_entry (unsigned addr); +extern void vmmngr_initialize(); + +#endif \ No newline at end of file diff --git a/SysCore/memory/pde.c b/SysCore/memory/pde.c deleted file mode 100644 index ddb6aac..0000000 --- a/SysCore/memory/pde.c +++ /dev/null @@ -1,26 +0,0 @@ -#include - -void pt_entry_add_attrib (pt_entry* entry, unsigned mask) { - *entry |= mask; -} - - void pt_entry_del_attrib (pt_entry* entry, unsigned mask) { - *entry &= ~mask; -} - - void pt_entry_set_frame (pt_entry* entry, unsigned address) { - *entry &= ~_I86_PTE_FRAME; - *entry |= address & _I86_PTE_FRAME; - } - - unsigned pt_entry_get_frame (pt_entry entry) { - return entry&_I86_PTE_FRAME; -} - - unsigned char pt_entry_is_present (pt_entry entry) { - return ( (entry & _I86_PTE_PRESENT) > 0 ); - } - - unsigned char pt_entry_is_writable (pt_entry entry) { - return ( (entry & _I86_PTE_WRITABLE) > 0 ); -} \ No newline at end of file diff --git a/SysCore/memory/pde.h b/SysCore/memory/pde.h deleted file mode 100644 index 24434ad..0000000 --- a/SysCore/memory/pde.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __PAGE_DIRECTORY_ENTRY_ -#define __PAGE_DIRECTORY_ENTRY_ - -enum __PAGE_FLAGS { - _I86_PTE_PRESENT = 1, - _I86_PTE_WRITABLE = 2, - _I86_PTE_USER = 4, - _I86_PTE_WRITETHROUGH = 8, - _I86_PTE_NOT_CACHEABLE = 0x10, - _I86_PTE_ACCESSED = 0x20, - _I86_PTE_DIRTY = 0x40, - _I86_PTE_PAT = 0x80, - _I86_PTE_CPU_GLOBAL = 0x100, - _I86_PTE_LV4_GLOBAL = 0x200, - _I86_PTE_FRAME = 0x7FFFF000 - }; - -typedef unsigned pt_entry; - -extern void pt_entry_add_attrib (pt_entry* entry, unsigned mask); -extern void pt_entry_del_attrib (pt_entry* entry, unsigned mask); -extern void pt_entry_set_frame (pt_entry* entry, unsigned address); -extern unsigned pt_entry_get_frame (pt_entry entry); - -extern unsigned char pt_entry_is_present (pt_entry entry); -extern unsigned char pt_entry_is_writable (pt_entry entry); -#endif \ No newline at end of file diff --git a/SysCore/objects/KERNEL.BIN b/SysCore/objects/KERNEL.BIN index 4d61829d51f2dcb8561b8670fb7058cffb819b30..b1f621f517c2056d65bc7280adc1a24b5e2e9e3a 100644 GIT binary patch delta 7605 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 delta 6950 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 diff --git a/SysCore/objects/MAIN.O b/SysCore/objects/MAIN.O index d9c212a063d2fe2cf819fd0652b8fc6d505f555f..6bb3cf0cb85e83b9d85de24d66f1545bec08595d 100644 GIT binary patch literal 6778 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 G5&Z^F=k!zn literal 0 HcmV?d00001 diff --git a/SysCore/objects/mmngr_te.o b/SysCore/objects/mmngr_te.o new file mode 100644 index 0000000000000000000000000000000000000000..93b72fb45f35829c437ed46a2603603f0afaf4f1 GIT binary patch literal 697 zcmeZaWMKdS2}TA60Wgb|QLiMmq6Ex_5CK4H3lbm1Q~+YVl*E!m5C;!%0Ltkl6&K@C z0+wn3sY}k!%}vdNTP*?j3B=q$j1bWS@+441oPa!S6p=6>&lE)@8_2VTi!=gR@dYLE!00Nfj89BSiBBvk zDauSj5==?W!4xb`Es0MnO3Y0~QkafKEVDSipeVH%lo}A$00qm7GD{MZfKdYg>HlyB literal 0 HcmV?d00001 diff --git a/SysCore/objects/mmngr_vi.o b/SysCore/objects/mmngr_vi.o new file mode 100644 index 0000000000000000000000000000000000000000..9a66ec5bcd9f06ad275e9dccbb618e0d70893543 GIT binary patch literal 2191 zcma)7OKclO7#=4}WeJPA#Vtv3ODHQSJy?jQha#c^4eF(W3OC^p=xDv3xSRT=^|VPj zLs;Zv)%<}y+>wVN|#Yi*z&G)~) z{XMfjlrk8NYlDnEp^%X(NHHfB*2^;kjC}!k9Zwp=m?M~lvL!7%?>An6u~2HY?&m|c zw=oNLqgE63uyhXGrJyFD9@sA(F^z9%w{X+<_p{jtI=}wtWx7N!9Wv9(wD_CMF5C#r z7hpbPywhD8H;w=2`AHV(yT$fudg%=_>%Hgue&?ri3|Y5l z@*Oya8fT=LSs6DoYD<|Wy?K=>U7Yl!LRtM&+zNVq5e-HIGMyufY~dEWx}VAPLYH3d z->;x+X3!g>%3UOfR7i;mn>sV~bU1(mMeiXECyJgyf!nE(!J0R{t9N{V#V}JKy-UEV zFZrpX{LSu%y>alsf#*hc9eict>50qs#MuP%2X@J*+hA4_K3kCB za)Q|n=0VIT^YegX3FcKY21Dzy`TeFU|kMZVu3CJ8m8&j&_cp;AR=BcB;(40!(dgMdId3b GCfI*LOCdS{ literal 0 HcmV?d00001 diff --git a/SysCore/shell/apps.h b/SysCore/shell/apps.h index 33d6de2..4cc7de7 100644 --- a/SysCore/shell/apps.h +++ b/SysCore/shell/apps.h @@ -8,12 +8,9 @@ const char *apps_lst[] = { "memory", "help", "cpu_info", - "mem_alloc", //0 - "mem_free", //1 - "mem_stat", - "mem_test", //2 + "memstat" }; -int apps_count = 13; +int apps_count = 10; @@ -139,54 +136,6 @@ void apps_help(const int pn, const char* param[]) extern void detect_cpu(); - - - -void apps_memory_manager (const int function, const int pn, const char* param[]) -{ - switch (function) { - // Alloc - case 0: - { unsigned int times = 1; - if (pn > 1 && strcmp(param[1], "times") == 0) - times = atoui(param[2]); - - uint32_t temp; - for (; times > 0; times--) { - temp = (uint32_t) pmmngr_alloc_block(); - if (temp == 0) { - printf ("Out of memory.\n"); - break; - } - else printf ("New block allocated at address 0x%x\n", temp); - } - return; - } - // Free - case 1: - { if (pn <= 1) { - printf ("Parameter missing: [address (hex)]\n"); - return; - } - - uint32_t temp = atox(param[1]); - pmmngr_free_block ((void*)temp); - printf ("Block containing address 0x%x now free.", temp); - return; - } - // Test - case 2: - { if (pn <= 1) { - printf ("Parameter missing: [block number]"); - return ; } - unsigned int temp = atoui(param[1]); - printf (pmmngr_test_block(temp) ? "Block %u is free.\n" : "Block %u is used.\n", temp); - } - } - -} - - void apps_memory_status() { printf ("Memory available: %u KB \n", pmmngr_get_memory_size ()); diff --git a/SysCore/shell/shell.c b/SysCore/shell/shell.c index 87bb81a..759267a 100644 --- a/SysCore/shell/shell.c +++ b/SysCore/shell/shell.c @@ -74,11 +74,7 @@ void shell() case 6: apps_memory(params, (const char**)param); break; case 7: apps_help(params, (const char**)param); break; case 8: puts((char*)get_cpu_vender()); break; - case 9: apps_memory_manager (0, params, (const char**)param); break; - case 10: apps_memory_manager (1, params, (const char**)param); break; - case 11: apps_memory_status(); break; - case 12: apps_memory_manager (2, params, (const char**)param); break; - + case 9: apps_memory_status(); break; default: puts("Invalid function: "); puts(param[0]); putc('\n'); break; diff --git a/buildOS.bat b/buildOS.bat index ac7cc9f..0b9edaa 100644 --- a/buildOS.bat +++ b/buildOS.bat @@ -37,4 +37,5 @@ set djgpp_path=C:\DJGPP\bin cd.. @echo ************************ Done ************************ -@echo. \ No newline at end of file +@echo. +@pause \ No newline at end of file