From 815d1b81996bccea7b0911a121517c0cfad79e87 Mon Sep 17 00:00:00 2001 From: kieron Date: Fri, 18 Sep 2015 18:28:01 +0000 Subject: [PATCH] Console Refactoring. git-svn-id: https://spexeah.com:8443/svn/Asuro@6 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c --- Asuro.iso | Bin 5066752 -> 5066752 bytes bin/kernel.bin | Bin 12516 -> 12516 bytes iso/boot/asuro.bin | Bin 12516 -> 12516 bytes lib/console.o | Bin 2268 -> 3428 bytes lib/console.ppu | Bin 4318 -> 8501 bytes lib/kernel.o | Bin 2236 -> 1868 bytes lib/kernel.ppu | Bin 1432 -> 1410 bytes lib/libpconsole.a | Bin 18802 -> 26948 bytes lib/libpkernel.a | Bin 18322 -> 17192 bytes src/console.pas | 234 +++++++++++++++++++++++++++------------------ src/kernel.pas | 62 +++++------- 11 files changed, 162 insertions(+), 134 deletions(-) diff --git a/Asuro.iso b/Asuro.iso index 5725f34041d1e49935d5baea8011687774afa22e..0a79ff7f41721b637314480f786e21b2e159803c 100644 GIT binary patch delta 11001 zcmbVS3s6+o8Qu#EEU?0Yh%2HlxFQBYKv7YU_bY%9#dxe{qK&9T9tKgHCJGMbl$Fq7 zx`|7S&1k0&O`EBYMog`ZJO!f>L?enXRN{(=Au1vg=-qqH3e=Buri|-y?{~iM|Nh6h zyLZ`wywG_3ti_1&I$DQ_m>6w2L$;C2h0tSP8>-p{9=ry^LQ71U)ek-@maRf z)_L$rANPqyLf`%*{AKjW@lSr?Ai?VWvtNewZ|>hLq0RdT$!^nl1pTxFS_w@(00JNR z^uVvJe@^;f3JCc1L01;=Adu8gK2#>5|2`A~xb}xVCDi{gLbo3FRGG?RA(IK>Kl!4R zd~ZEvaJM ze^epQw$A?kCMp=oCk_b(i6IEyTLe9Pj-e~Vi3`)^sp8X!959BWDHImG?b zxect@4XAKy8(85!Y(SoGG_Z^mjY#>8MmEhm8&O6rjVvRJ^GJEgd8WMWJmQ`^&$!(X zjca0Pb`w&rXkyCk5DmS+&@~rOM#nF(jEonM^8AZl!^S8&A}wZwG5Yc%vv~C)3KQ@h zYuJkK5PFECSHDB0@x8>9(=H+IflHaJ+06*eYG!fEnvwFoW~QvVjJWBS8MpK@; zO76r}mYne_iV}Q{CAab#LJx7Y`5IF8z0Q=$b;Lbzohdh5N4ZbF!E#T!fp+evH-61p zeG@5X++@n75N+kCq7}tm-pbq6isCl4vP$+qZsIM*&AWxFQGd%%^4ts2l-uluXWMPW zZQ`iK9fU5u!?+ZpEqBpLe2N_PmqrGS7!-A8mTL zmv!(5gs%UA?UauodY7ZBu4vc6`zrHY*23iRf?@locBA!MyWFH0ySq^454%|A6MsYw z-uaO^*!?5Q?f#F$uB~?Q5lQ;+>RI60`qm>>g`JO3lxvSz6zj(bUG~^ZQsh@~`}mlo zq?8e^;Z2WOoZiRCZ{ib%<~~7jYMw9`olj7gL%Ug*f7y+=Uv@L@^=?$-nNQhdu6&AI z9eTQ&%|H)QUf(nP9YsRQqNO9eqiE}4=_#Kfp*No~i$%{+dY7KD^!lD5i^;uAIjxO9JbGD^7KSyzEp0l{^&yjLiALG8=htRM4W=VzX?n9pAeqx@pe?rx$_=#1c z9ipNA3|-TY;vVn!b{O)OLNW54!T?L|7X!$`7X#}|_CHn&!2ZV>f@J^WQUP#3zAZ=w z4N3u#4Q~j-@Y|WBC5a>4&KNF=YfU~3eS!cwWJt6Sq$~^@ERYpLl?C_GVIhEO86qqN zsfmV6OX&54C69l{67qxPoWEKQ@vqGI9gGKC3DS5P)>uLQaVxI>y%o$a*jgBV{Yj2V z7PlaL4{11J&6Bxe4aIzIc(Go$fyMZXjgT!hL#=@P^$O1aNCA_%r{KxB*h2nVTh1@F zh5R;K&R5w%Jl&4trFPJNs~yi@VGrXkx99P9VEhutcPXL#Yf3KvD3-~BOmYu%k zEkna3!C!w3pbmRK&<01c@@tnU0<6YwgzhSeI8j%(;!mMm`=d-fg9nQ)F zcRnkw6QGy%6S&v132?6OPT+H`oCx*boXGWyCc=Glc_Q<-YZ8QCo5bz^Y7z{8YLc*! zje-W+&(a9e?Tg_v4b*?A;rgx~(0+yoxBoj2sDIZ(81{b1HkIg|&Vvt?4XZqPp{OTR zYVqVvx1J2~<&!y1G2UXvt+g=IrCOfpHZ9DwQOh&!#dz`*j&Gg<{e3fq`|HMdq8GJi`p}#C|^CV#Wkr~%cgZy`=3DV7?VgEE3|M@gw z*v*P^am=Cw!#n+~^4#&kZ6 zznu>CZ%-e7g|T0p6ceN0{sawnx-W0chrUp&)t7s9@PqhUeta-~>j!gb_2aqN&4Bzj zXK?)wXTV%rW(f1xVE99RmOqbQhVchxTpfV<0cL&x9PE1mygsTx$WIUC{8Eg!nQ_%j z%%3StANFdH7MnK0U$zWwGr1S#ELf}Mv-n&T%!0Wz&f@$Y%#RD={LCQ8KN0j__hxB} zmW=Q>0z=Sj9&5#HnD?RCylz)#!(4pka4)HIpqG7fggiDEbK%^rpF4a*+bxM*95}+O zY};IOU4vn)H-ZK2(A#F)CE^`vC)!O-!Q6EZR!W%1BW;)mt5P#hkp32C=)rjMe0~|+ zHXrhv=5xMv2*j6%2!T@7N<(1PZin#QstkqvRiXScS{e$wb|aMMFJA!lmoDJ?1q&em z+ycRKXr&!qk25^96oSD;I3bJ=P+k~pT1}Xc$_6AH;u+z*6{X=Y)wXc1uZne+^H%SHf2>TZ%R=tjDIPX`|FE^@n4JM z@!yYw^LH*zh&6RWkH4Gq^IsJ)d>t=H-xV=5$3yqi61e-+1c>i5<8=@(ANQ)z_y2!O zraa=Lb%YHi0wordSW+UV#EKGYO2m^2N^B{yqr{#PB_*RMaiGMJ5)~y*lsHo|ni3aE z#!%u)$yiF%l#HXqjgs+{xKlELl8KZ|qC`W92PK}AOr}Ij$rMVwD49x$Hzm_3d4&=m zN~TldONk#PGbr(=B!H4YN@h|ri;^HpW>YeUlDU)wQ!?RD}0bj+_4KY}98~Wo$*XxcYv7eWgM)KlI0FFCJBu z{KLz1vShQYutTA9*Xr`L@Nlz5o`*2)w#6=&r))~sRLNwuR)XoN*j-yJhA6C7R1F3+%ZxHD$*5;B zCYWd?N{1r(vf@#af&8PAhS>yLAQy_#h+u3m)nQP(B+pA$TG*k~tYTf%<_oDnX zt+FIdYp-jp6=WZr+&W5E`SgmesWw`x67JjRs!YGg5_HY~G{yP1o%r9=?!rp{A}8II zV`tBtIrH>ZMZ2Z0>4Wo|uIv<-?l_qzPpB1qcZ#yQI%A4xN3`G~T2L2@;R>rYFS^5; zebT7TDgmVVXs|ocS)YszSdf%t1309-;4Lk*WD~SZM@ho zNh?KZl_>2}SgmFm8kdWRahK?nAOF>KOb3r!OvjrCkC%%kjcZ;U_e;HXJSsgE_M~jH z;oYt(IVvua_2)|+6Bn2|TiB!CrZg@S&$D4rSCzgbU}dzG)LF(NZXyojj~nE_2sUJh zRWDlpzE*iKU)En&+JCZEu9fvGwc?cb%eBQ5*f_grBQwtL71bP%)|I%AE)F%HHlO{W zBxLNGVwc1;^wlCIH#hyQyv%n!WJx(&#MQ~^Svk4y zYC<)##7LPeK4a~=At&c+Oaaq!@>XRIS(q#?eDPBtULs5n=||kW;#EMV5g!}Mx8JhJ sw<_0YY;W3>H$1VtBN&9T`29laZ$2-J7as}Y<5lsISpIog((C2_0s9l~9{>OV delta 10934 zcmbVS3sh5Ax;_U2gb*S7JglNld#&K2-9t*9 zVNKeGTBoC3Gk4T=yGCn!q2qO0`Dqy=z>9194TS(e>#cW5Op|8GYlE=;zTxhd=p^vkZIgo$)+uT)ua+j5hCmN_O(*5sZ`f`O0Y8 zJ`niOr~BTvf06WoR1omn10F2k0U&9daIj29|9NmO;5vQjBcs7zBJ`aveKeM`*a(6s z{U{curYtgg?+toh=+K=n{q0`heBkfQc`5`pXzG~6^b}p1QCB@3l&>=f$#-%qjLH$ybwG(*!*BktcgT7Mc@^!}d3)qjs#@~7`v!|EYA@eFH8 z+8MzVbe+4ZP!YwB6yKBz~Yuhg@QlnqGvwFWlL?>C@~S{hhJHjPMmaU)aS)`+-g z8X316q6tk5&22);l}${!9iowE8M^u`%INS}mXY}^Ql9gJ-=Hy?uS<^`VvN52fmyux z0}2!JBWu{Q9}#+xqZfZfr3pI6l+({4?!I%`tl7;7&1q(F%bJn$t!AdIIghxR=NY&3 zJmR*VXI$k4RJf%VSkd2w=sAY|u?0~VwJ_?|78Le$i|=sD(<|TDj&aHH#@%(H;F1@6 zk6H8$8E;_ zPl!Ic&0P6+AnrRI4BZdW0geXVLEPi+V^*&UG}Jx?J}Rc zXdi95yPI|JXN0c%neCJhA$pUeny&dCPw%U&cUcQk#)zivpQ=U}-{~4H$Jp70GQZo! zG9UK~a`5Ia%)!oIP;R$>8FXz`>2=A*=;|f=kc8EqkX6Wk2DDL6M{?5<5q)-lhr!c^h`^^Bd@WsGdi~Wy0MPUDurz~QY3eI1pfcQ67{07D&>_mAyO{?u7|F9j`|H%&K7hx|B zzW$`drAS*4zJ@d%vggTMu!mwn4!l^eIKX23%|XnSo8hU1{B=ss|4<2&xuxXExH&@p z8b{7Ab%gvjN6y!%AfBn>c&Q5dZ&mU9l}<4JQYRk&U5uaO_{VA}|FW9P|5goW^_ZH^ zYKI!y*A3(Lvxh;v(u#LrT<6SZDc2eDtE~9X&d^`faFM;)XMLMtLEMs9%hh}gdIBFN z3b~nER+{R^i^0aLqRYn`QGP?!s$wafIkU=r6Exc&v^Quoh8nycTQSV5}o_XuQ@f=UiFT?m9EABZ8 z^G9+2J28HD6xSa;8uIf-b9^Vp?~dmBUSlBt%`u$63*%j5#HoX3B~6#E8)8;AdhuD= z=>=!yju)R5kFn6py0P4A*;qK&H^=h1R*!@F%g1s3;&E`_oFB*heLNn*FOTQ;e>)zA zKQ>-mz(zp}?dNDk`S!*1nHK8b)pC6gZ)iWuo7?}RH`KrBEe?7;Gl&KzH|b|DaKo@xVhrwDc4dZiB7zT4`2;=--%ufjC{OoYZKN9{g z_h#t}7Z33nfhl|jkF{(D%=_RBUbl-gU@ieOxtFw=(952gVm_OTS#a*w%^JL+Rg2>n zg%0s7+cwKu*9aKvwFuGo+1qBv#nK&VC)!O-5!`hzR!W@BBdwnet5P#tls^kI^Nw~mBaRp41B|!Eai^Mi*p!TT-jw2a82?;6_tzf} z^qDbZ5mO^FXB6DaYeWFjSgluV+;pOVRx zOra!zl0Zs=D49yhG)jUg385sElIfI$Q4&tc3`%BFGK-Q3N@i0shmyIJL{c)3k|;`| zDbZ09LrE+p^C^j=B%YFl|0en@jhI&c##;S9h8N6|zHDT+m3~zyG#bHt%W|Z#99@x) zj@iw3(O5n*6$b3|(ospAI@0FA7XkS$6~UG@hov=r_iz1=w4fr}a$^4=Qjtuusn}(K z{s5tZuPj);gq6f8OQIF#2-NSt-K(yV&2JQyukN~X;oPnO%6 zZ3Usytco@_O6MwqT{H!PxmR+3`*Gb-rSx}Cnnb9L79H4ukiI9~a-wjLggNlz-O_Q~ zj?EIs&|M)N3wlF$bcuViWud}Gi2U<#LDhs*DIwqII z!YXmM)V83gFV%9^TIZ5smZe#ByPvFRxF$9*^$1~9OVBRF2op`B>3INO$BHF{X9w} z(?!)vYc4#cq7F~PGGDcnk;bsq*KJ3>uT!nP@ZNXtC=FFTEeFNh3PaUF!O*?H(EJZU zFg3od*A~26m#RY#T&rxiH8i}}xaor7s(IZr zaa@b4-Ks3Cr~k?ew(7S#nM$|n4}4s#R}{oAj!n|On!4CqS`xn@Gjn~$#+4b_+7%fa zGFRl~W@=LxX;OW#s0| z%eC2g8LKikXmc|&SIJZ%Mi$Yocxx~#1ko&BgcPf^HY;~^-iDlv{H(m(*@9qnDIDpZ zoVP_%&&kZm+whiF8>tnNVi@A0&swwgDI_75^&`^r@};DnS)USPY!JtI7di=o_3@-e z(uGO77zkSF@p}38Yc>UTI7 zHVe0t++HpO1od&g2_noQA?k2x5-x42usBdj89)Y*0b~FfKn9QjWB?gJ29SaO zmVuV*Up(ImA^(cM`Rffb5h5qwG6Nv*KAbAhpSRTq<_gFq7B2EjesimZ5N(j_1HU8k zbEUAO{SmaKm@{94`R>EgkR#oomI-G*0sk1#1_N4*g+L#IP?~iNA5)O*%wP6E0RYW3 zfg}pbJD>w~kk5qbm(BJVpkoyMiGvsb^rp31p=)VwW(P=B{j0-Nsh=mxRzQu2sw}c! z5^Gi6ww9NOwFYBFd+9R>6)aXV?I`?#*J*9Oz`Rx#14UU~<@`-WAyhT}Pgx2N5 zq@ZkZ>N_F}3ks-4o)^D`(#d95VUc}dkr&O&dwYB8y_i}Bd7(V_n+8}YEuhr6s_QR+ zKM($4^^zFLCqzz9h#l%}gCSSTmpj$U&W3u|7!X6ureCen2^m)JeM8fH*A9=JZKcwa z?@~8P->YcfbMSw1pWp>zLjxIu2b;XQBHBbQ$6@)d&rqqP`);K!^ z>j^_W9MltndieZpJJaiheuL$El-+h|TbIQSqm8K5!kAmfO}maATE~IM>rj8rubDqs zc4iJThafYr)WXjC&C_5pKZ1q0^5<0kpdtT6_zW@xh`!D39V-{O(bx z>O}w%%id0~(_L2{g|BetDNs8HC0s2$=I=9~vV*&P?BoAz!@r)Z>3oOk=i!pbT_@H` z!73Z9NGwi-^KY@DcF;L!yx5<)a}9z8iz|BM8LiJ#d)hzr-tH-lKQX297v_7#ZmH56 zmzKQG%cl-}%~%*BL5R{MGa$o?D>1ihKVSJBS<{e<4nL1?;~d($o#N8dMa?(qBL jxz$AF|JH;5pND7wbS-DsDWb+ literal 12516 zcmeI2QD|Fb6vw|LH%-W@rkKux6+a=2iMHfn0~HEcHKWjOt*(6-4D@EX>B5rSk$hDP zQwMj0eqMro6$IB;L2$5#V27HfWb3RCZGD(ka0~}`w#XhvGBQ|q&dp8CG(%Crmvh2* z@44Ukf9IUvV+dnTe1fqqC;s|PkwEv4=7R}LMMeaO01+SpM1Tko0U|&IhyW2F0z`la{I>+$ zUwr(6ht;1X~g3-Is`_}!H zCFHU&0W+1T%hzz&`Yt+YavI*II43(*s^DV*J4cA&D`J56su+XUD z_Z^T|K3+ss?Vhv~na^O3=YNpj7N?WRWNk}cE7iM7*0Zi9X_sFcK!MpGHkOrg;o=@x zi~aebKPke>zwL1m^KI<~F6Mr0^21QyTSCoLyew3TTas$F=*Jr-}=esbW zXJgsl+=;UxW4lit3wOhYg7S1YR1o1^l`eMfoA>;(T>J5YYfF*k3rtoI%WGd^!(RvB zQmYwDk-6P+v-sWW>T2yq=~s{3IJZ8td3Hr8hbvtJ^0u{ce`m*p%uqIHLS|#RuMB%N zwnMFYrN$q_e6*q{5#w$kS1lZa@*W1dQF+C#_my3*iuIn9SKI2XVLf@>I@wmoSPqr3 z$u?{J*V2^;5CI}U1c(3;AOb{y2oM1x@Mi*ebT~Nm>L@=tKJ^^>IZZpI=8vms9#?Z( zT+eEJ{0NWhy3i6J7*W$Am7V7K*}Tv)FLISA0VLXT9)g^Yv@^RHYmSx(-+zF?VZhfbWJG`n5CI}U1c(3;AOb{y2oM1x zKm`650)zPzd65%poDB-?UBLzus!-WrJfHvD?ZBy*xnS7u_v0JNedTM+d*K nJ7?m~x~E_oe`~jO99Bo*AqvAW?%c7at#O`F*WdKvj&ZaHNzi}g diff --git a/iso/boot/asuro.bin b/iso/boot/asuro.bin index 6fef80cb9ebb13cc46a0ec8dff6571f165ab402c..71faf335fd8163dcb810791f984ad1ef17095291 100755 GIT binary patch literal 12516 zcmeHNUuauZ7(chYX<~b8QoO8DGr5Dy5XM3u=94XCwbjI7 zHVe0t++HpO1od&g2_noQA?k2x5-x42usBdj89)Y*0b~FfKn9QjWB?gJ29SaO zmVuV*Up(ImA^(cM`Rffb5h5qwG6Nv*KAbAhpSRTq<_gFq7B2EjesimZ5N(j_1HU8k zbEUAO{SmaKm@{94`R>EgkR#oomI-G*0sk1#1_N4*g+L#IP?~iNA5)O*%wP6E0RYW3 zfg}pbJD>w~kk5qbm(BJVpkoyMiGvsb^rp31p=)VwW(P=B{j0-Nsh=mxRzQu2sw}c! z5^Gi6ww9NOwFYBFd+9R>6)aXV?I`?#*J*9Oz`Rx#14UU~<@`-WAyhT}Pgx2N5 zq@ZkZ>N_F}3ks-4o)^D`(#d95VUc}dkr&O&dwYB8y_i}Bd7(V_n+8}YEuhr6s_QR+ zKM($4^^zFLCqzz9h#l%}gCSSTmpj$U&W3u|7!X6ureCen2^m)JeM8fH*A9=JZKcwa z?@~8P->YcfbMSw1pWp>zLjxIu2b;XQBHBbQ$6@)d&rqqP`);K!^ z>j^_W9MltndieZpJJaiheuL$El-+h|TbIQSqm8K5!kAmfO}maATE~IM>rj8rubDqs zc4iJThafYr)WXjC&C_5pKZ1q0^5<0kpdtT6_zW@xh`!D39V-{O(bx z>O}w%%id0~(_L2{g|BetDNs8HC0s2$=I=9~vV*&P?BoAz!@r)Z>3oOk=i!pbT_@H` z!73Z9NGwi-^KY@DcF;L!yx5<)a}9z8iz|BM8LiJ#d)hzr-tH-lKQX297v_7#ZmH56 zmzKQG%cl-}%~%*BL5R{MGa$o?D>1ihKVSJBS<{e<4nL1?;~d($o#N8dMa?(qBL jxz$AF|JH;5pND7wbS-DsDWb+ literal 12516 zcmeI2QD|Fb6vw|LH%-W@rkKux6+a=2iMHfn0~HEcHKWjOt*(6-4D@EX>B5rSk$hDP zQwMj0eqMro6$IB;L2$5#V27HfWb3RCZGD(ka0~}`w#XhvGBQ|q&dp8CG(%Crmvh2* z@44Ukf9IUvV+dnTe1fqqC;s|PkwEv4=7R}LMMeaO01+SpM1Tko0U|&IhyW2F0z`la{I>+$ zUwr(6ht;1X~g3-Is`_}!H zCFHU&0W+1T%hzz&`Yt+YavI*II43(*s^DV*J4cA&D`J56su+XUD z_Z^T|K3+ss?Vhv~na^O3=YNpj7N?WRWNk}cE7iM7*0Zi9X_sFcK!MpGHkOrg;o=@x zi~aebKPke>zwL1m^KI<~F6Mr0^21QyTSCoLyew3TTas$F=*Jr-}=esbW zXJgsl+=;UxW4lit3wOhYg7S1YR1o1^l`eMfoA>;(T>J5YYfF*k3rtoI%WGd^!(RvB zQmYwDk-6P+v-sWW>T2yq=~s{3IJZ8td3Hr8hbvtJ^0u{ce`m*p%uqIHLS|#RuMB%N zwnMFYrN$q_e6*q{5#w$kS1lZa@*W1dQF+C#_my3*iuIn9SKI2XVLf@>I@wmoSPqr3 z$u?{J*V2^;5CI}U1c(3;AOb{y2oM1x@Mi*ebT~Nm>L@=tKJ^^>IZZpI=8vms9#?Z( zT+eEJ{0NWhy3i6J7*W$Am7V7K*}Tv)FLISA0VLXT9)g^Yv@^RHYmSx(-+zF?VZhfbWJG`n5CI}U1c(3;AOb{y2oM1x zKm`650)zPzd65%poDB-?UBLzus!-WrJfHvD?ZBy*xnS7u_v0JNedTM+d*K nJ7?m~x~E_oe`~jO99Bo*AqvAW?%c7at#O`F*WdKvj&ZaHNzi}g diff --git a/lib/console.o b/lib/console.o index 9b008b574e8af8e99ee6b9d06f06f3df43566fa2..d8a0b35c8cd8aef30ac086930c72fa82e1054777 100644 GIT binary patch literal 3428 zcmbVOUu;uV82|bQR-v#BD>P>6BsWL`)S37vMocJO$Esb6U4aoGvl|^Wj1F%v3=HD5 zBk5gjY{C=1IDIqmVS-uwlW19&2FOeVd;p#npA>k&7lvp$f8Xsn<&JgJc#?B}=lA_N z-}jw+&bjw}f3VGBv5;&Qve83E^vm*!=0yY6(=w`)rUw4@_w4L!G57U4X1QaOzT?oF z6kSv7Us3szey@Dt9F;EvC$cZGN&WalqA+R*l7r}=MM}N=47O6SX zlg^^>Z-&1M{%-xG(v*oR&RkSku3srx=yc(|75c=?P5oM_RcWx?uG5P=pn!h;I}Y>1 zGCXGPr6*c4jrz@Rewvz^n)&s@Et`Jr^wpy`M_@W!(CmSdWzz_z)h|{GKs03F&LUcR zvbp+dDsKq&xRH+&`7|IOSLTWl>5cr>lHJvkey~ivm(!HxrKO}7^C6MPk47FdoX6_< zdFa!b%QCVPksA=%m7a80>NhmT8)RRw(AiSyVP&r+BOB`|eXt zBUojlxQqFD{!2tMVm%i3uf{U%?}qArIH@?tsC+SBE|lyFm7NOqf7z~NjZIZQ?ozfU zu8tzd`tggorpL3dbG|H=(!06MYx=UTH~Vzg;Lv7ejXJS8te%tS<+F|lcJ=suXAEF@~TJANPaejo{PJhgrP3E3_!cAZ`tHEuLaQh>?a!RGp zMoZ<;K-(jChm9O$97<@}ausf#wI&bd&x1Fh9}#-L-~hwE6F7vvNAN+x0ft@&PNTmj z_?X}TLq7>@#-e;6_$|Q!hW;<$81#n(S1@MIjq`g2<7O-quQv02f=m57;4LQoCxS~o z&$Y#*zb?4c-v-}q(yzvtxzumK_-*tjA>jD!f=m5A@FDbPg#KN@rT$~^QFOP^j|ndI zm%t0?e82Pjw*;4Z8@9w<$UYVNCc&kClh`sap+@YVHo+K-_50er5vBU5 zdJL)wE#7-@A+OG8BoNxBY+t}JrKySJf!YBBp{NoJhqf`Y``nO;ckxOWaz~BuU9{STT#b4;>3^x%UsMYL1!9w6tH5U2_K zP@pdG4A6=T^sL~Y3;aUhdDbKTgy4MV^1Rnr4!;|MPYZkkcOH?5G TW|9xXZab9x7sNK4AFszh-!u3I literal 2268 zcmbVNU1%It6h4z3v)gUew640f(JBnFK4c9=1ra6N-D$IQyBlZ6rjJ-}0!K&@W$H}V54e4YS+n8=ojcJF!WSPR9Sz~kZg4(K zq5jL0Yl4Lv(t;9hwlx$^lr4dd~zaL`d z+HdEjWto-F1FL4(wQs4*AHw)kt2wi66Hlqb#=9fnXznB5i>h;(K0@(vl3aWH{%_KGwl^wZgXyj&1&fgmJa~x_OnZFz3<(6 zRjT(GyW*?2K=s)54RxHkNST_v-x%KvAm)8ElFu*0->W`acQXKagFlQsP{-vuzIK*f ze*hZm;v4T)07Bp%Z&bx_Zo`|o!?%L?bI99plAri1oFlkAf!K-jGtS@U9KntEBHqF| z%lR1R2yXmi#A)1=A~AKVuFALJold=u8% z;^RAzH~Dxg@`#T^VPx1E88l+=-fP` z@_>54uRxmB4%c~hC-GR>#t9o@y?Hwiu^!7p)94vJ+TCa7hYW~W?+w}c9z@&p@R+cM zM{FauFY{KbW#cap|VoW6Ek-842r{n9%n9p!u;r$5Cs2Hv2C`4Hxd$o;x| q_!-Oz5u(t&>a!{Qrr01NID{^R_9oZk{phH>jV66vNkje7e*6bS0*qP! diff --git a/lib/console.ppu b/lib/console.ppu index ac9d446569905967b017b42e805c2c92a37dd9b6..9992a87ac9a2bb4b5a34f824f79a755bffa89ab1 100644 GIT binary patch literal 8501 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 delta 124 zcmZqTp1~~}5D;o;Y|7Hi$iU2SAb^RXfR%wk`umO@S~o6Q@=ugCX5PN%=fq$O4q=C1 zDsSVT8Bd&C%owtnol%Z)Ge46a6R$EO101MN_F^$*H2{hjO>SX{5wt*(vjMVQCx2wg LX7rmJ%c=?h9GV>j diff --git a/lib/libpconsole.a b/lib/libpconsole.a index 25e4ce2d0d999edebf056e0e60a5f45b0be45424..d215f2f5833e04fe2efad262c5a4763d51233525 100644 GIT binary patch literal 26948 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 OmX<8LWZCn>vi}Ftt+svu literal 18802 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 DmNSKk literal 18322 zcmeHOL2MgE6dflmv{74GY)7^$ zhy((u96&vx_P_x|5a&vP3mlMuUJ4Ri5H~oK1E>|fAaSZH!vDMT?b)9!yOBcWjrL39 znLqPpclPgpGkllrS^kyuoAnC=il>=xot z$T01>F2ue!gxLR%5C=XK;?U1RXb*(w*(b!2lR_LjBSi0l5TWa1iEKKN%8!i?C(}I> z<5Q_z@^mJX%O}%kGx=Q4$Z+;dGCiCUmr8~CvdE2Q6T@d-8qTJYlexUvSLA!lLQg(5 z8@6Z>i`Hk+q86>+qQxxQfJGa$XhRk)91@rGYFS?h)xyDwVNTVCQLv+?nZL29X}j2f zX;V#`?szMaIvWTCz<#C#M7wBeLi9@|YBV1eI}KYCdTp-u-6sB8RT0)B3pi7o+6;O- z)3-5wJJTOwI{HCV+QkkbjT2lf)PxAu_1EhnI9sR}M6g(^K~XPWzL>vIEtGT-tSy!5 zg(Bqjs+rGGsa&b+!57j~y|sE_=2G(v4ka`OCK_g(;X9>{!$urkeq7d5MmX?xyd+25 zUcjg~A`ZGLWY)t_sosJ(=*y6ByvQ!Z;kl1MqOn0y+=jFZ3sUG@$3a(d_drh)2y(&= zDP?RXC&Mxd;ToPD@jctLjQsUITN)y6F^lQ3Smhbd?sMtc;lV*UX*t64cQw)X|GxVb^lVl%J6$n4wYh4# zn%HqQzRltM%_AA`9UFvizXOxfw|6??tlyvie18+CQ!b6^2O3&o4Wp@c4-9NCOpfM# zHAjv53FQKCy3R2D6{f2T7~-$6_V=0o3DZAg`qxbVk?FrM{Vvnn6@%k=x|n{L>Ag%> z*Z7Uab|abeWG0o!kBy`f!`aD^Y$A~sjmlhNGG~ponr$yT2}3kqD6vI%b?bna=g3GU*o}w;XXpvE!!2M8T@QV8&NQ*w6+}yA$qZ z8^kPoAP>OLwiKW`u&PI^!p9-148^E+wWrz{V*5~9E3Rq{1@%uR?yussbOR%R!Bk4 zpzttqLcw4=;dVn=4I}Mva4F4D49Xm57e*rP8%R!JWM@0vYh{d7T9cigqhL4| zp=-g)R$7zLc3t=oVH(eP&RX}0dDA8ui&_3dL5pEhS);;<4V*P`08ty_sl0|Y*r*8M z*04swV3C}Zho}?KwgSnCHF#0ocpxcwjVPQo-OzxZPeM4(8uCnzBR2HAWP|@!!GEh@ z_z-vOIMgmfa&qk3fT2(qiUxTx=Z<|3>fAWC<6DK8OV1t%$6$^}ah~UAB+cyR`Lk0a zW7_%5R5xDPIzlYPrdFEgaXfsUSHsw_x8APNWQ~_aqUX)CEoOTi#Kt@*ya!Mfv+cTD;O*ij`N1&?0ADXH@peCxW#3c$TWX1|e2SFIB2bns!P9ldUgaSyV7sBpl}n$Jy}& zaVwBoZ~c&;#W?b06W?Eroko+|i&uFt;4L1IPvecCGUveryGw-QJm5Gx9w2T7k`oUw z&~Xz-ZQA>*u>6R|kq7_(dNDeGajv;wY{B(n&|5qSDIDmOWzLgD1%pMxah`CT9ZwLq z0?COd5C3^XZfv&zPjZzyy!qY2aTV;c`p@OaCVXr(h3^ZtE>Gl^wU;K9@$87pePBP%_Ty~B f=RFf=M_lgY`kw83w#Pi%<=(6B*}i9c!?XVdMdA0H diff --git a/src/console.pas b/src/console.pas index ce86c43a..4155b0a3 100644 --- a/src/console.pas +++ b/src/console.pas @@ -15,16 +15,24 @@ unit console; interface -var - xpos: Integer = 0; - ypos: Integer = 0; +procedure console_init(); +procedure console_clear(); -procedure ktest(); -procedure kclearscreen(); -procedure kwritechr(c: Char); -procedure kwritestr(s: PChar); -procedure kwriteint(i: Integer); -procedure kwritedword(i: DWORD); +procedure console_writechar(character : char; attributes : char); +procedure console_writestring(str: PChar; attributes : char); +procedure console_writeint(i: Integer; attributes : char); +procedure console_writedword(i: DWORD; attributes : char); + +procedure console_writecharln(character : char; attributes : char); +procedure console_writestringln(str: PChar; attributes : char); +procedure console_writeintln(i: Integer; attributes : char); +procedure console_writedwordln(i: DWORD; attributes : char); + +procedure _console_increment_x(); +procedure _console_increment_y(); +procedure _console_safeincrement_y(); +procedure _console_safeincrement_x(); +procedure _console_newline(); implementation @@ -41,79 +49,56 @@ type T2DVideoMemory = Array[0..24] of Array[0..79] of TCharacter; P2DVideoMemory = ^T2DVideoMemory; + TCoord = record + X : Byte; + Y : Byte; + end; var - vidmem : PChar = PChar($b8000); - memory : PVideoMemory = PVideoMemory($b8000); - mem2d : P2DVideoMemory = P2DVideoMemory($b8000); + Console_Memory : PVideoMemory = PVideoMemory($b8000); + Console_Matrix : P2DVideoMemory = P2DVideoMemory($b8000); + Console_Cursor : TCoord; + +procedure console_init(); [public, alias: 'console_init']; +Begin + console_clear(); +end; + +procedure console_clear(); [public, alias: 'console_clear']; +var + x,y: Byte; -procedure ktest(); [public, alias: 'ktest']; begin - memory^[0].Attributes:= #7; - memory^[0].Character:= 'T'; - mem2d^[1][0].Attributes:=#7; - mem2d^[1][0].Character:='E'; - while true do begin + for x:=0 to 79 do begin + for y:=0 to 24 do begin + Console_Matrix^[y][x].Character:=#0; + Console_Matrix^[y][x].Attributes:=#7; + end; + end; + Console_Cursor.X:= 0; + Console_Cursor.Y:= 0; +end; + +procedure console_writechar(character: char; attributes: char); [public, alias: 'console_writechar']; +begin + Console_Matrix^[Console_Cursor.Y][Console_Cursor.X].Character:= character; + Console_Matrix^[Console_Cursor.Y][Console_Cursor.X].Attributes:= attributes; + _console_safeincrement_x(); +end; + +procedure console_writestring(str: PChar; attributes: char); [public, alias: 'console_writestring']; +var + i : integer; + +begin + i:= 0; + while (str[i] <> #0) do begin + console_writechar(str[i], attributes); + i:=i+1; end; end; -procedure kclearscreen(); [public, alias: 'kclearscreen']; -var - i: Integer; -begin - for i := 0 to 3999 do - vidmem[i] := #0; -end; - -procedure kwritechr(c: Char); [public, alias: 'kwritechr']; -var - offset: Integer; -begin - if (ypos > 24) then - ypos := 0; - - if (xpos > 79) then - xpos := 0; - - offset := (xpos shl 1) + (ypos * 160); - vidmem[offset] := c; - offset += 1; - vidmem[offset] := #7; - offset += 1; - - xpos := (offset mod 160); - ypos := (offset - xpos) div 160; - xpos := xpos shr 1; -end; - -procedure kwritestr(s: PChar); [public, alias: 'kwritestr']; -var - offset, i: Integer; -begin - if (ypos > 24) then - ypos := 0; - - if (xpos > 79) then - xpos := 0; - - offset := (xpos shl 1) + (ypos * 160); - i := 0; - - while (s[i] <> Char($0)) do - begin - vidmem[offset] := s[i]; - offset += 1; - vidmem[offset] := #7; - offset += 1; - i += 1; - end; - - xpos := (offset mod 160); - ypos := (offset - xpos) div 160; - xpos := xpos shr 1; -end; - -procedure kwriteint(i: Integer); [public, alias: 'kwriteint']; +procedure console_writeint(i: Integer; attributes : char); [public, alias: 'console_writeint']; var buffer: array [0..11] of Char; str: PChar; @@ -122,53 +107,114 @@ var begin str := @buffer[11]; str^ := #0; - - if (i < 0) then - begin + if (i < 0) then begin digit := -i; minus := True; - end - else - begin + end else begin digit := i; minus := False; end; - repeat Dec(str); str^ := Char((digit mod 10) + Byte('0')); digit := digit div 10; until (digit = 0); - - if (minus) then - begin + if (minus) then begin Dec(str); str^ := '-'; end; - - kwritestr(str); + console_writestring(str, attributes); end; -procedure kwritedword(i: DWORD); [public, alias: 'kwritedword']; +procedure console_writedword(i: DWORD; attributes : char); [public, alias: 'console_writedword']; var buffer: array [0..11] of Char; str: PChar; digit: DWORD; begin - for digit := 0 to 10 do - buffer[digit] := '0'; - + for digit := 0 to 10 do buffer[digit] := '0'; str := @buffer[11]; str^ := #0; - digit := i; repeat Dec(str); str^ := Char((digit mod 10) + Byte('0')); digit := digit div 10; until (digit = 0); - - kwritestr(@Buffer[0]); + console_writestring(@Buffer[0], attributes); +end; + +procedure console_writecharln(character: char; attributes: char); [public, alias: 'console_writecharln']; +begin + console_writechar(character, attributes); + _console_safeincrement_y(); +end; + +procedure console_writestringln(str: PChar; attributes: char); [public, alias: 'console_writestringln']; +begin + console_writestring(str, attributes); + _console_safeincrement_y(); +end; + +procedure console_writeintln(i: Integer; attributes: char); [public, alias: 'console_writeintln']; +begin + console_writeint(i, attributes); + _console_safeincrement_y(); +end; + +procedure console_writedwordln(i: DWORD; attributes: char); [public, alias: 'console_writedwordln']; +begin + console_writedword(i, attributes); + _console_safeincrement_y(); +end; + +procedure _console_increment_x(); [public, alias: '_console_increment_x']; +begin + Console_Cursor.X:= Console_Cursor.X+1; + If Console_Cursor.X > 79 then Console_Cursor.X:= 0; +end; + +procedure _console_increment_y(); [public, alias: '_console_increment_y']; +begin + Console_Cursor.Y:= Console_Cursor.Y+1; + If Console_Cursor.Y > 24 then begin + _console_newline(); + Console_Cursor.Y:= 24; + end; +end; + +procedure _console_safeincrement_x(); [public, alias: '_console_safeincrement_x']; +begin + Console_Cursor.X:= Console_Cursor.X+1; + If Console_Cursor.X > 79 then begin + _console_safeincrement_y(); + end; +end; + +procedure _console_safeincrement_y(); [public, alias: '_console_safeincrement_y']; +begin + Console_Cursor.Y:= Console_Cursor.Y+1; + If Console_Cursor.Y > 24 then begin + _console_newline(); + Console_Cursor.Y:= 24; + end; + Console_Cursor.X:= 0; +end; + +procedure _console_newline(); [public, alias: '_console_newline']; +var + x, y : byte; + +begin + for x:=0 to 79 do begin + for y:=0 to 23 do begin + Console_Matrix^[y][x]:= Console_Matrix^[y+1][x]; + end; + end; + for x:=0 to 79 do begin + Console_Matrix^[24][x].Character:= #0; + Console_Matrix^[24][x].Attributes:= #7; + end; end; end. diff --git a/src/kernel.pas b/src/kernel.pas index 492cc6ba..0530d5ce 100644 --- a/src/kernel.pas +++ b/src/kernel.pas @@ -25,48 +25,30 @@ implementation procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: DWORD); stdcall; [public, alias: 'kmain']; begin - kclearscreen(); - ktest(); - kwritestr('FUCK YOU!'); - kwritestr('Freepascal barebone OS booted!'); - xpos := 0; - ypos += 1; - - if (mbmagic <> MULTIBOOT_BOOTLOADER_MAGIC) then - begin - kwritestr('Halting system, a multiboot-compliant boot loader needed!'); - asm - cli - hlt - end; - end - else - begin - kwritestr('Booted by a multiboot-compliant boot loader!'); - xpos := 0; - ypos += 2; - kwritestr('Multiboot information:'); - xpos := 0; - ypos += 2; - kwritestr(' Lower memory = '); - kwriteint(mbinfo^.mem_lower); - kwritestr('KB'); - xpos := 0; - ypos += 1; - kwritestr(' Higher memory = '); - kwriteint(mbinfo^.mem_upper); - kwritestr('KB'); - xpos := 0; - ypos += 1; - kwritestr(' Total memory = '); - kwriteint(((mbinfo^.mem_upper + 1000) div 1024) +1); - kwritestr('MB'); - end; - + console_init(); + console_writestringln('Asuro Booting...', #7); + if (mbmagic <> MULTIBOOT_BOOTLOADER_MAGIC) then begin + console_writestringln('Multiboot Compliant Boot-Loader Needed!', #7); + console_writestringln('HALTING', #7); asm - @loop: - jmp @loop + cli + hlt end; + end; + console_writestringln('Asuro Booted Correctly!', #7); + console_writestring('Lower Memory = ', #7); + console_writeint(mbinfo^.mem_lower, #7); + console_writestringln('KB', #7); + console_writestring('Higher Memory = ', #7); + console_writeint(mbinfo^.mem_upper, #7); + console_writestringln('KB', #7); + console_writestring('Total Memory = ', #7); + console_writeint(((mbinfo^.mem_upper + 1000) div 1024) +1, #7); + console_writestringln('MB', #7); + asm + @loop: + jmp @loop + end; end; end.