From a4ed035c933f66c32cf664ce8e8850def15523fc Mon Sep 17 00:00:00 2001 From: kieron Date: Mon, 13 Feb 2017 16:35:36 +0000 Subject: [PATCH] Keyboard Driver Started/Hex output added - Added writehexex/writehexlnex/writehexln/writehex - Started work on the keyboard driver, polling PS2 line for keystate. git-svn-id: https://spexeah.com:8443/svn/Asuro@16 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c --- Asuro.iso | Bin 11307008 -> 11307008 bytes bin/kernel.bin | Bin 14812 -> 15424 bytes iso/boot/asuro.bin | Bin 14812 -> 15424 bytes ...{BIOS_DATA_AREA.ppu => bios_data_area.ppu} | Bin 2006 -> 2006 bytes lib/console.o | Bin 10576 -> 12684 bytes lib/console.ppu | Bin 14439 -> 15931 bytes lib/kernel.o | Bin 3036 -> 3152 bytes lib/kernel.ppu | Bin 1298 -> 1347 bytes lib/keyboard.ppu | Bin 0 -> 1032 bytes lib/util.ppu | Bin 3413 -> 4539 bytes src/bios_data_area.pas | 2 +- src/console.pas | 68 +++++++++++++++++- src/kernel.pas | 10 ++- src/keyboard.pas | 31 ++++++++ src/util.pas | 42 +++++++++++ 15 files changed, 150 insertions(+), 3 deletions(-) rename lib/{BIOS_DATA_AREA.ppu => bios_data_area.ppu} (87%) create mode 100644 lib/keyboard.ppu create mode 100644 src/keyboard.pas diff --git a/Asuro.iso b/Asuro.iso index 8b3c9d43a6b1dc04171e9f87b464a9418659adb3..6b95f5fa8302c2df84ab76dfcd0cee2b0660206e 100644 GIT binary patch delta 37534 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 delta 36706 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 DYFS%H delta 1727 zcmZ{kUr19?9LIlmP937{`d@0fO*fOInB_l2Au%7Nl@)<03MJLkAcY8GizKKeXvZFc zr1{WeF)@aO(M*wg$`>hW)r5je5G?S?hwA&g+nI-02kt%J`~7{+@0@$?xxe_e#MNn+ zx2uKB)=zC)?agFHYA219%(a!dwOHbN`PcI0bx$}MCY+b? zBRZH{V{VvLg4Jm#a6vp5GC0AY&fz47tDwTYR-=}k6gwVP+pKoLhkI>?B^$G`vQ;AX zB^}E*@`zT9qFZsz_ylXIhJ#yB>9y^FGAx+VY0R;_1ble#?Q2_>Fc-C@i6M96UUKPV zkG;P9A%d_ywld|YUAOj9xRu0X_qoFpa945B-AW2znkWA}S7LQ$92<=x-a4m7qOZ zy5SLCN+$aUOxNPQ$ z!NYM}Y!~3tOL2VML@sFABzGQ$h)YBW!z+|&tQozja9kv2!8PXK zekvT7kY#ZE_sJ&n<>#6Ebqdvuh-=6iz#2)Rm*D<1XmVU(65wQvaj9D+CrUf2gVODn zE=VpnssD_=sBm12w!!7vh8qgUg~{gKJu1p-g7iQExk%Ljl#5b8dY0kPng6&0+_xeo z(v8m)x91ASrGn24?%5{wM{qV8B;tfzFm!;)6Im{MD8HIun&a}uoScklnXnM6<`2mE RbmoNCb)bgnCgpwP$iK)R2W|{UQEXE&;cik;QFn-S^z~;fpWam-9WJ zbIv`z_i^tpheo;wti|C9CLRZ~vMg4@R^gt$*l2;>zZky#{;XG7XbV{J!qBh znpC?yx2L(^tIQ0tfsSDhTZzJZ!*=pT(OWqo|7%6(j2gSs%gTGT*z*`jPCu@o9<~%72U!NP76@kKd9$p5 ztO8>0-%u=CZ_MU%7>n}-p%IBs!Zln%^f9dToQr7AQN-{|um<>d|D{slglQmq=yJJF!2>FR4suLW=wuic4dLoK)zqdB>-(k~b0$ zjhiA3O3vi6KD@&@mPkB4VTfGIxcgs|BG*ri9Jv>6QH;Z-^z&P>Ojl{OLkTG~DV1nXy6kaLi6vL0~L+WKaFG{6S6Zhd3x}4{d{#ny&xkQ@U7JMCl zjK!Q7)U<<-lm1lG75pY?Rnsr?IO!1U$rPyMSIBWl3#j53peH*-^=f{O#G69Y@Y5t3 zgxJK7k=Q6iEq{;1S|RGVheWXuF5XO{K!|!?PvSWtUfIa2p-$Z~ou!Vk{<5|kXa%3j zK6rTt)+@b5neBauU!PD*ZG~Cm{|>%x>y@6@zK@X@vP?r3rT+to%;*NEI`v|CUWSkL z)-V&f7dq87%61F>6*1?Nj)-ffv8f}vV`eJsdh%9lpXYQ8Yh7ro9V&! zu)vkTsBz-#t+)wp8{d<%nT?f6Qwt9W-bj!gmZ(FbpA#SC1+t%i7 z4KBsq;4NomXD)IuZa0fDDM{`*nmZ zMqx#(c2!4Y5P6o|(-A9(6~rm#S%l*UP;}q{@qnBlGQV0Q>guYc>Wsr^-m7^KpG0hO zw*Gk?VP^DHto@E}bfgia5kxGt`JRphKms7?jhj2?X-_eb7)VTXYts=Yt_d8d2pVB@0}iZE{gq41=XGwn@-8BwL_JWMZ~k0I=nA|6Vie?t zj?kTV3#34h2RcG`;1q~KkQp7J`!5M13$oadUI1#0?m@OPlap7fBXlnsR*IJEbZ)v5 z3y_d5^|p@Cby%X6G9T6vx+zLEvf)gIpg(c!*g<|WQZMO;z88AV>Eh_-V0QYdXrV@Q zgbqF@NP0JZ1))+@n~t+akeIr?I^R60BXorlk!aU*^Ru7k$VAjns#g{euLRK^t*ie5 DYFS%H delta 1727 zcmZ{kUr19?9LIlmP937{`d@0fO*fOInB_l2Au%7Nl@)<03MJLkAcY8GizKKeXvZFc zr1{WeF)@aO(M*wg$`>hW)r5je5G?S?hwA&g+nI-02kt%J`~7{+@0@$?xxe_e#MNn+ zx2uKB)=zC)?agFHYA219%(a!dwOHbN`PcI0bx$}MCY+b? zBRZH{V{VvLg4Jm#a6vp5GC0AY&fz47tDwTYR-=}k6gwVP+pKoLhkI>?B^$G`vQ;AX zB^}E*@`zT9qFZsz_ylXIhJ#yB>9y^FGAx+VY0R;_1ble#?Q2_>Fc-C@i6M96UUKPV zkG;P9A%d_ywld|YUAOj9xRu0X_qoFpa945B-AW2znkWA}S7LQ$92<=x-a4m7qOZ zy5SLCN+$aUOxNPQ$ z!NYM}Y!~3tOL2VML@sFABzGQ$h)YBW!z+|&tQozja9kv2!8PXK zekvT7kY#ZE_sJ&n<>#6Ebqdvuh-=6iz#2)Rm*D<1XmVU(65wQvaj9D+CrUf2gVODn zE=VpnssD_=sBm12w!!7vh8qgUg~{gKJu1p-g7iQExk%Ljl#5b8dY0kPng6&0+_xeo z(v8m)x91ASrGn24?%5{wM{qV8B;tfzFm!;)6Im{MD8HIun&a}uoScklnXnM6<`2mE RbmoNCb)bgnCgpwP$iK)RtQJ$yOEy1_lWr1_6E`W@O|`%FHj0Pf09Ej87~|O#~@m3% j4q`D0p-Sr&Bo;SlESQ+Ah^BAjq+nJwq0OIJA2R{~@S`6& diff --git a/lib/console.o b/lib/console.o index b1cb47ee290f57104612910b6d9414e25c6ce3fd..48a627fb56cfb8399fe5547018d0096eaa8e4688 100644 GIT binary patch literal 12684 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 N?7NOv--is|{{p|oZnyvd delta 3398 zcmZ{mU1%It7>2)@)Ff-O&1QeHNp_Q+#N8&?m_`zzXenEXwbW2!2pX-GNVQb4c8iq; z{MohS!a^>BqqI<=5vqvvB4HH@Dz=~!K_Q?Qxu|5p7QM`c^~ww1@0)LinL`~&-g(aZ zo-^lnW*3jGPcJ#Cl|GVdT>cNy1npcMJ7?9uYTDIQztucs*JonWP5TEa?&ZjWT9l^| zWm~wHo>1N<+()lOxKMvQe%`7+h{7c8pa$2{i}@erGbl?^J9RhtuE)d5$Hh<3QxQKw z$CbB>-$Caieg|FlxJq6iNk2paN%}p~K#FW0hF(cZQC8WjpQe2gKTR{r&8U;4480fe zGju_?N;D;bPFjrwI%!SW5kE_fh@Yi9$|do;D1Hxa^h#0}4Jh++CaIhDMf`4hh8fSN zVF~om8<9W{Eh=9YKS#?EKS!&|HTWIm&`-(>!u@nxc|v%AES?Iz60FBgyK;$)<$1pxiDSjLH!oJyx!I6%GUi9v?LLkinA%A130}vK*5A#vSZph89^JqFt=u zJ*qrw_AJ&X$2Vn?<710R|@q9|#WelCa7WK&6AzM5dqSde0N}Xx?G|zZ?e8eHXvV4>B9-*9Hf*g0Mrx zJ+`1HRo_*0q5R-h<`;A?L1hV`j+PIp@(geeOHq}ZvKC<3g|Qz+XI1A^PpDQ@=T&Q} zGUaI4??{`LCscW${9wOhc|M<9;HXhl^?S-kmwms-+I%8RV`5?xgOm=zo8 zbLFe7ZA90UzhT7(rn;sDKeJ-1ZYbYmZ714N{+ku^*lI!1p*GeI%$#zOHHn#09%oGv zm6a!0G5=G_GprdpMRQv45^E<>MfnVCmZ+w@z}iK$r2HW(w)C>{6;>RD73D8kadfUL zf6tnC_m^_+RH?20Y^h*dW%qO`hT{azn}#zAo{}D1GMpON5$8L@Sq6`a^M~QAYn^m@ zTeNFiL6tGXalp&c*ps-!KIQSrb)A#qoV|-Ae}5NFJAZh@dZb);y{(gI#M($#$J^tQHjz2OjxC@WuTBwJZrJ%vxM((fBgK-<= uTChLE?IrR=HTXsR^@no1k(&$$mqNjTP>_EvhjR)1m|VsQ;0Est<^BVJvHLgx diff --git a/lib/console.ppu b/lib/console.ppu index 0de019db6baed6428421355d93bb959e0e0603db..bc5c92a2e1effb1f276ecf42f75f2ffed6120af6 100644 GIT binary patch literal 15931 zcmeHO3vgA(dEUKTJrF_&q$`9GpeGMq9!3}wj2+Mm5D}8l14M|q7Sc7yTy*i36v8B_ zF?rO%cH^We@pwA1lWAQyanc#baXQVUIE_1vJx-f?T&D4~p>;a7>$*uMO*0rJrr)=Z zqdiC0(b3Ihrqjue&cFZJ{r2Dg|IhA!|MO5!&%owwTg09XXUw`_mghwYQMpGZ#SNrUOdlvpX8%mCirpFT_LlZ-Zp-ggU~$l8C4*S~3&{>@qY zr}f{GwSQW_ty%l0_1l)Ue_Frov-GQ(tXt<<2KqUyarJFkMM1z!=&r0#Xgw3!niUEI zWSQF-C3bo&Fakx&1%*_c<7)Djp^-aH!Hi;mN?>q?B+U}tuc|U z@s4bbL)jXS{pRAs49QZpL=>H;XjIWWMe`LcP_$6d`HB`Pxs^*iXxmKN}IB^iD{nB8^-BY&Z?wIk#e zcXcJWD)wwgSZ%>0()kd=9$c`d1-;gdoZmGVrbi>zw2@$jXI0 z>rIXbS)#kE(LgnonUyptzh^RYIt2|DX~b%@QB{ptOvK@2DwRGXWT{51XB!T!V;Q)- zLnlTjAY!owG@*&6X&qzWqI)t!XN6p%``?8Y=BHY~QgC@G?S(Q8K&~xlyVilGz2RS%;KM z6mw#Euiv`mLF+oY`s+KpyY`?i^%*xhHtYW91Pon~+KrrQRLGigYu9zOurTj)>^hGo z8E1@N!qKKwfDdI?BY^8UP=4HR*NUKBhq`;)>RX$8+d8_MJN*muOgb|X=AvoSZscq* zt=3zRNETFCi`p^m9D(sd&?W;Q>SpkvOxp(_ZYd$-Wxr`N7UbUcLC-S(H9L{~KzPHN zI2R17^RC%WqxW9aj$!(m@n;n`r(QV-K9pg10f?InOm@HDuo-KSJFK%yg%bZpV_Zm$ zg)vRX%9}8o8%!F!?S?y7RZgIGO#EG{7e|B07ywc42OrAB3jjXAf$|~0i7SK4QU?%& zJnzncjWY^zzc&DUlLO@ypLue|;zVF^tP8W<^o6>W!ePle??PQMioTB8u|#h(=Dj~P z04n@*@S!eL3<>5^CYkb4pCys%;Dur&VU)C)iT_G5oXj36Igt)0>aN1cP2%1ayKc-V z1X$V0pZG}aPS7GRR~yITTxXYX5yhgEp~fwlP1YVjlZ-RpUts_Q)qoG>nOy+3aG?A* zzh~V1R3&RV0KqpZ04Wb;i$dYtqoYtW=G9SXy%&WVjTKu^JC11q)aRJ>4c0MR&4_oS zb{umbjf(Tuc&`C~6`kNiIp!pQr#Mjl#P68e;F3Yyf>%u3Qhu2cyuvv}?};|fi9NBw z+YykUnh*8vzOCF@?IB&4W4FIe-13r{XE&}*4j;Jh_exK9_ zeZqL>Bpb>r<-U+U!l*YFzwDv%@XJPT51lhcd;+!Om%RY`{Iape`sIEz;xninzkGtC z<4Zt4X8>Tu7r=+|%eMghHV4Yb{cf4DhY%-&Uh%IL>Qk zsN6A}XX>D2q_z)~n`(=CnhIX5hb}BzQ9FL=N0ZMlTk5S}wwV#TP&?0(74N zfE8WfL;2+tfN302d1JsYtAndXC!E1x&=9n3A61C%+4^VWRPi7|#0IWC*p01fSSA7`3M>tS^-xq`BjQyl?)u3Z$OIf+c z>u^MB4|5K(sA5a(VPG^$GGwI1Oya(9kdFso?tgoVWJas!qwBVhEH^SRTUo#`Vf!guZ zIgF5TKBfO_0{|_}YJcY;Ft-bC0+q?P`gXIYua7V|6Gs#oQ zv5Ca2PfVy2OJwRCsEqT)z$=cvKM1SuYXJU-()U0(eGg~T_v~!f5bCKCnbNs4-*Nod z(f7Z@>iY`--&XpL1oU;E+$8#%cehXb_;97?fy#?(=H~!3PJKmKB--7m{o3zwLhu`XThwdt5cLvKn;8ThQ}>@S&B4)GA2eE$DrK(8tqA&7Kh4SPEHZ5r66FvIPjOi@wbgvcZC$1E>bwGPV_Tp`&mL z9|x?quonR1WtOpRphZ??V%Av9_q_SG1Ec5D*{6_eE$Ff*Xon{VYE#fUi}@!{&~2U| z{ZLNGxCOlmkXC#bK(69+!g>pP-J7q~n-9JwW`o82$eVAsH=llRfd>&5^fOOThbKtg z$m7P`Vy<~Qb$UA48(Vz+VPT8_bpXg%H|QdtIG1u`I3D_}2Z@wC^8+G0_~Kxt15 z0Hr-)vwmdp7PiC_Hs}dco~N*_7R5A93p+w#zVr}To=!QXSm_BnN@4gOz)P5f+-`+2 z!>dNWj3ojne6(?kMKuCduTXb@mL>v;fsi{a@;CGpGW^K91WE#=o$lMS9pgCuEU}>T%sw0I%VQ z${lin&H*3_CE|W*ni%M5YwmAPv<~$4b@x_y55Fc)<6j+UqW&u!o7BJzXo($Y9dOtV63?kYQSk!m7rjATS@2#?yVD@BEufh~5kR|Kl%@ zpS!c=s*^&9PvT-K#UY{7nMxhJu#WR z$mMO$Z2U#6oq-I{4lC0lR*=EGlH^kn6g zstcJcUSdU$N7#rYOH{sC<}Jjnjo1`wKN5Db#qhP~*VgZY9o= zELBTH<%?8ar1D~wm#BQP%1c$gMCD~FU#jwQl`m6yh02$!yi(;WRK8N>RVuGmxps1m zqF1TBR^_V;Ib=}z|J}|kQw=vc4c`1yJsETJ>QwDLwq`-4s(HvXuT!;S95@Kn_OG{m zB?>ugP%%{-nNgzH;)-1(qPA5nb6ffUR{c2m`}Koe;ivx|Zl+orm#KV>%Ij3VR^{td zUa#_)%Ht~Epz<}|w66E4xJPa9sGArA$Um!?=0?(rx^Nk&I`(X5n@!b*SdNmoAeY6- zKdGL#7$2>{C2Nb37q{hxhHn?LtdcbqRI%hxvX%i&QCn^*E96q$U%_@?UL=0wgx$#p%R%%2G+i+#!D7QBFCcM)&ukr5qP~WNkh2#X0MVRT^>xjdY-ftXB~0idqf135~pETG0)lN^-^* zt2N>n+URB`IX%uCk(m%D*kDo)+XXU?R)gd%F92 zx{{fOhD>L7XS&>k(3#P((MjI#$c=<5>Vjbs5j9~WZ+Z3U_kxrOPOp1yBgzMGg;MWB z06s=WnenSv>8RJO2IP#K1(h+=2vioqhMb$ z-I3hi+TWFKO{Y_xZT;zFL;Jzj)EcYvM0Ro{dwggrH#sypnIAniHL2c?{+f$<#}l|B z@y*DWczi;xt=BhFil@-S^b9Uc1nkL3k?Hp%mkGM)D{L_7EXq(OzX;$D$RsEHCa-o( zKAP%GCuyTHbcHqaR358(_{7{dXvVx|jI@L-L&KBVypZ)#Yu@uz0_hws$GnG7l?j4= zgv+L%f(T{ac>rH0m%PhwUR}_i9hpJ3)vwQ=WP5%oblywNBL^%hR_xi0{6SS_gJKfOL(|rJCrO&w0 zu{qa22jJEfiErglqe8B)wsu`Y3ln2G$F2v_Boo}@SCZSL8qlHaY6h@{jPgOhU2B7O z9qmbVG_<#-Iy$>syZjUL)Oda*%uUm#UCz;9THKqE2oY4;jB=J~rRdsW07P90I+SVG z1K34I`H0`NS+|T6v8!9HIRAX)^2v>bF->nNJ20BN<{G?NiC0*a4x)5Se1z&H_<&6r z08w~p3uoeO0OrUjAM=~IE_nC!nuC#Q)kS?1Q?I&kcItKaE)1#HUE^vyKk@dX(g~D~ zg?d*(gUA~IQFnq4brU}X;A3QzAM;x{Ykp$A!926_R{9LY$_rhb%K`t20e}=|L5DK$CjkD8jPlcd^I}2sxc-s@YW=;k@z*p%e+8fLdd2jd*fd;96v^hc;7|>kAXub7?J+M z06>aggAU~xzBWXtu>73gGj8ysA_2W@;TyGVm2(QM-Ei*FYj-ck)oZueTf66t6~9O6 zIEKN$&oRx7)-i7yj*BQA$2>}-5{$!3X`e~uphG!^0q+*&m@oMq6Aw-qtaf zSxY{gQ}mL*4w`aJB)labHTthZ>A0j7K%YwzaqE(p;b=nXxJ1ttzIg030FYuA=uj>> z0^k4{<%@ooGz4A3O@gb)Y!b>T)xLdjgj>aY+|tf*;g%L}30-Gw=tSwbr2{~pTUypz zw;VDYX_SszK1|UGzMOOYbi8u_3_kB{O<3>TX*ljf>3HX(v@F3_{tp@eNbxx6P~LeKz%P+e z{>JZ}#^9u}ae;4(S>>BGHarODqDG7wiFYE`o6NQ~*3>7AB~PJroO3;(KId%PWI3KT z9A{8E&e1DsCHTH(03gLTL5FhA&j9>68Rct!=geABDx?T(GyWB&B8za2(Hl({$Hj`e zTz!%PExu!HcoC)Jmcs!0+;Vw?b;}P7$4^i?ZutmBC-@QQmj(b*{3qy8Ziy_yR|#A~ z{*T`+8-sI3MgEiPG^5zZdyDvweg0%pa}cu*31p zCn!3B22n->O{xH0inoh7zx8Yau!)TF4`q5JEg{n4c&5GQa9d}0vc0FPC)L-GR;4Zc z&+XyyJC2QxWrxRegU?F|)p6eb$ zJ(VKUIy~ZM)djPyw>AgC<-UDx^_dMpuUC>x2_|^I$NAE|%>itmwPbc*E0Gxzwq#S_&}6vxdW;n zdf=xTC5l6R5$Dzr{Jn>eiycHY)h$W4b6dh8NrmEll59x&<37Kh1x`^uV*vW&KEKuY zPf@;rek!X4U~>wdqMQMMI%@&t6yQ5Wc@F&?L!YAX&BAwzau$75Tz~dwI2k-e`8E)= zMI-2>;3>)rK+rU;BOM$#ML7omzp!Z?x!w3rQGSSinyv+KnFLNzUIt+16oq1frzo!g zLGNf0)HQI5@+$!Nr9tbk4wU~C<+tdk_w*4-4AiVsl-B{7IYo&pNZ=IZ4M6B)?W_h+ z!BdnAK=5UTR?282@*CpR+Bb5|DZ&kJ0&31<@g^kTDCY0Z7>t-2zal0wH!2a=k^=c_VED zLXX5CM##8@#J!PtDyc`(Zx2E?SkPvG)}vcScOqZrsFTCdVWWj@1&lXQMz26#W)&i4 zqs6?-8*djddORIh3AxFFuJ%B?JrI@3-X&y{1zqPUwFe+qDZ-j9Y`>?}K36GX5*E|t zjo0Rlr(Y}anrJ~OZ@i>8o_)^}a;t?60JZ@D89j)6xzAS|bejd<0$@x54-(E>9#i$=>|<$!vad zG&`YtB!70m#0O5~MyXF>|H?>2^LZSpBWOj3K5NXh+QUX6_bpb>N%Vf%(EwFMr_IRa z7T%+Oar(;A?cSjraZ<{Q)W_56;#~F<&8;<3cQf)OGvZ{sr_Bq_h}>r*b+;fd^EAg- z&JGX!eFNq*j43kBXPj)}&ik?>=vB~CPvmB9UcYhr&V&A)slUXBB@(Od98-;KQ^(!% zEw66I<2J6kOa~(#J6;TJp2DE{*=@7&J)cEP!SQ(e8gR+x^~jgoI|aH5w0X}IeDP!o za_iPY+Op^EY>1<8yED>m&{EwlxrKY(KBte-79TMxVRHJW!JLzmXx@cLT^6|<5VFT} z&;e%@jX6%tppd;Drq^KflHgs}zG?(=(BZ!s^l?*X1QNp)-d9>Cr{K6Fa{~1HOr257 zLS*tu{sBkk2SJ}Ub?#vck;!NOryZG3fqur+8C)(zCWD19J2Jlx`rk~Qd-6hLGPd}h zBlG*9Up93{XA6{*8vzKqx{oS{b(gS9(3*xt}^|-_ybHb)83!z>q*sk z-*Bc*jtos^Gs9E)iSc>-EKWb}7?*8yRBi^n)6}Eri{YB@6v%*Qk0bLs(4D5f&?ztk znJGu+5zv`;D03JxPdGAjpr=fI75ZYh=4*QvJnwg8J_!25?@;Egkoj>(=98eGHud>G zLLtlx3Hbp<&4VbHSfzc<;V(kPZ#`J8q`lz7ajum2 z`f!~Zch2CH&DF<%t4QzY@F5S?D2YGxAvsejdIQKVjeOZ4)f;a02#_{dmfaOf)++|F z6MeGgR^%(qYhT8B?~~~w6Mo2F8HV4Yd<_?4Jy~-Cd4*-P4(PW`;=E!i62C+FhQ~DO zV;aJ*7V&0^c07^b&S{@G)?&1Gs=`-+f9J*JC_32OsyVI{cYR4;m(Oc~#1#O+Mk Vg#Um5$0Vm2ph-T>W+i#){{W&=47LCO diff --git a/lib/kernel.o b/lib/kernel.o index b3c9bf502a41cfa9f90938858fd6f195e81bfc88..2facf1458130a6ef9f2f3b89b02d85bc81ac371f 100644 GIT binary patch delta 408 zcmca3enDb_0+RvfL?somQjYFeo)>@q|Np;(0SLgX#@`cT>Y3bFCKgIEce`-_DW-0> z$s&yUQWL=P9f$e19R{;rzXxdofyus%`x!+y^D-$j0x3ggb4I}pj1VahDFDRhH%GGU zXSDTpjdb#N404HAQHghV4T%qScJy=hcX3rwaf%FaWpMWQ3-j!2n7kG!_6I0t0~UM3CBSOI#K4d+nUPzWbp{Iq!@J3W+`^M>xCI#7Ci`-$ mGk%y{%B{}&ft`WDVDdt4WeEjNNOP;tSHj(-9IfcVRQ3!$pQ7n`Y%ptfuNHF|^ic8KQ zNcac_R~!O^D+vjIfN)GY$(uKMA7aMQM|jy*_kOn2o$LGQpfUL^%kqw7rq}Q<+dfu_ zmmSVm(!>{1X@V9n>#4o7_4@3i&kx)z7F5ha>y=e5ZoHg}^V&W$6+iV3*E}XtZ7c>y zY;hgLyoom*VjNiB#b@C70)cjXg%#N&bWDf?Z8^tKJDg|_UDLv&C@<1;{4RP3Yb;MB z>-ZZR##MWYXbl4sSNA-k9JeOs2v6dl;!FIqI#Ca^jW`wa7i{n!gOA_M~i&7Kyieqy; zEKjzAq&TuuE0gjQi&ENx{*>+CXdFFp|0Ef9R%VbKBM@>hG60~OU>FO zsIj@ttUDd`wv6Y25)ACg`FX|pIjLXo{p~$bregsT<8$)#4~}EA@sX`$N2z{ttQ3RKG=3B-(|Y(SDVJ2x>i a52R@=^F*Kx_AL7uIVb;T5e2eES@i&j(mdn< diff --git a/lib/keyboard.ppu b/lib/keyboard.ppu new file mode 100644 index 0000000000000000000000000000000000000000..e9d9534b726b1f720eb520082b2b7d64739975f2 GIT binary patch literal 1032 zcmaJPK6W6bwBqu?Z5iO=+S~1nWV) z_$$17P!v42zr&NK{)X68)_EqoubT?KF!Rnl&pWg8vFqy_bGPQ{h{>Thc|$)PqW7iK zmxo{GH#0=!iQt?QVfLOi_MfzBdv#E}0ipoQj3mVM-CFy@=Z}wlz)rTk-|jTFZ~r)a z_38V!uXvw%(P=(^cmL|q@WJRYfN>Fab2dTC0F}d8)kCVa4n`HkIn{O5!>UWT_yUX0 zmaFAT@aQ3c0uz%bs5C_`lZ(`j3r~o@loL~#G+0ama~go$#HZT$CTz93fM0`|1(rVG zJt^DMa??!Ojv_NEK88R%mUB~_x%?ogF0L(-S)>qI?4GBK%39cDuwwtd&eCr(^AJ(lY0j!8~=L z#9me-rhpeQ;eqmGY5m@qio)S=4|y4hrc_>xF+u83h|ym|d6 z67=kyPmi#<)9geMPs^hjJmfJXwa1LFtgcl2&`)Ci3D!~C>i#!mU$XKHnz~{06WtX1 yPVD24of0|QaZKA4S$|-0DEyiT7ZG2uCF4&)o9IpV!E`syz`Z;I%CS3ear6f)BX|M; literal 0 HcmV?d00001 diff --git a/lib/util.ppu b/lib/util.ppu index 00fb1bcee9d119f71a94f5e0714069f18482f846..afbebfda001e4cb745a1f3b09897dc3b1cb010f2 100644 GIT binary patch delta 1184 zcmZWoO-NKx6u##^$N77X(=_wcsc}*t70pl%QHD_B-(qYU&9o_u2Bd|8zabcIGNd3d za5~U7T(yu|1ua5Q+DMxg5=FGAP2i$kh)qI$_syH(RR`{Q-#y=V?>Xnbd*4T2w=@k5 z45!*oiwzQ*SPV+R2ZXra*Sz7sTk|b0gh&;d657s-)k6P-d?*X+#lmLfqMHN>mjoSB z$U_3Fg>Y9ug%3OV_WyZ%UW%DkLA7mmBLidS=r?n2Cqn0y$_iL?N=#3qOgVb zeEeKyD9lBM~CRyV2kNVws5)kd}z zc||*}2hdayL(qhe^VLQuo$WGn{ewNG*>!!WR~w%i<$LZUStU7&A)61vSItb{o)Z)Z zxG;f{rg)f+FDl2$!Q`(}W)HAo3sgKxT+oi`ClP8@Vak_N=j_y~0HmJ(Cv^m3J9TX( zb&I`o5?@E^S+#M(3xC!Y0E%`ib(?BuK!s`0XSbkOA)~`X=}g`<^XY8HuBE$kuqU1E z%%C1#bT@UYWu=p-1G38rR?4w>5E1i-92m`&ifiirim zY&)0_z+dcnkl*>+tj2a6itoU?Jgs*as;l1)M#EdwCC}&=4AoOaJx$vhfSWBUR*z7^ zL7f6VXU{__V=M|qr$f;ToVDlDQXGaN=TM9Q-}+0@2*spBF$=ulP^5TYH{z<68nb+< T#;3;dYQkh)ITA~fQ#Ixvfc~JR delta 573 zcmYk2ze@sf7{=fC)YQ%^weAYV(z>bCh=_iW7%mYNIwS=Rk`N?FErmft4GuLF*gFJG zK~P)N7-2X?O)j~F{TC4>4!z&Y;11sR9-hzpzW2WOI9T(AQmORl#28c%EO6+SAff=w zT-1*aVp!DxV4xHlwp>RqOUb-c!&13HJ<^bhfZ#yj9u5SX#BVQEq#}nFunF7F0ob&P zye71vzU{PbSws)rT3%4&+(W0u};u& zM_d)(TQHF%>s5n@JJ(HQgY_1Da8D(TnXj1@h-JinOH^-OLnx5Gza>%Ucz&OQ1s0zOym diff --git a/src/bios_data_area.pas b/src/bios_data_area.pas index b0c269d9..5f32060a 100644 --- a/src/bios_data_area.pas +++ b/src/bios_data_area.pas @@ -1,4 +1,4 @@ -unit BIOS_DATA_AREA; +unit bios_data_area; interface diff --git a/src/console.pas b/src/console.pas index 2215bfe6..1fc388dc 100644 --- a/src/console.pas +++ b/src/console.pas @@ -4,7 +4,7 @@ interface uses util, - BIOS_DATA_AREA; + bios_data_area; type TColor = ( Black = $0, @@ -32,21 +32,25 @@ procedure writechar(character : char); procedure writestring(str: PChar); procedure writeint(i: Integer); procedure writeword(i: DWORD); +procedure writehex(i: DWORD); procedure writecharln(character : char); procedure writestringln(str: PChar); procedure writeintln(i: Integer); procedure writewordln(i: DWORD); +procedure writehexln(i: DWORD); procedure writecharex(character : char; attributes : char); procedure writestringex(str: PChar; attributes : char); procedure writeintex(i: Integer; attributes : char); procedure writewordex(i: DWORD; attributes : char); +procedure writehexex(i : DWORD; attributes : char); procedure writecharlnex(character : char; attributes : char); procedure writestringlnex(str: PChar; attributes : char); procedure writeintlnex(i: Integer; attributes : char); procedure writewordlnex(i: DWORD; attributes : char); +procedure writehexlnex(i: DWORD; attributes : char); function combinecolors(Foreground, Background : TColor) : char; @@ -159,6 +163,68 @@ begin console._safeincrement_x(); end; +procedure writehexex(i : dword; attributes: char); [public, alias: 'console_writehexex']; +var + Hex : Array[0..7] of Byte; + Res : DWORD; + Rem : DWORD; + c : Integer; + +begin + for c:=0 to 7 do begin + Hex[c]:= 255; + end; + c:=0; + Res:= i; + Rem:= Res mod 16; + while Res > 0 do begin + Hex[c]:= Rem; + Res:= Res div 16; + Rem:= Res mod 16; + c:=c+1; + end; + writestringex('0x', attributes); + for c:=7 downto 0 do begin + if Hex[c] <> 255 then begin + case Hex[c] of + 0:writecharex('0', attributes); + 1:writecharex('1', attributes); + 2:writecharex('2', attributes); + 3:writecharex('3', attributes); + 4:writecharex('4', attributes); + 5:writecharex('5', attributes); + 6:writecharex('6', attributes); + 7:writecharex('7', attributes); + 8:writecharex('8', attributes); + 9:writecharex('9', attributes); + 10:writecharex('A', attributes); + 11:writecharex('B', attributes); + 12:writecharex('C', attributes); + 13:writecharex('D', attributes); + 14:writecharex('E', attributes); + 15:writecharex('F', attributes); + else writecharex('?', attributes); + end; + end; + end; +end; + +procedure writehex(i : dword); [public, alias: 'console_writehex']; +begin + console.writehexex(i, Console_Properties.Default_Attribute); +end; + +procedure writehexlnex(i : dword; attributes : char); +begin + console.writehexex(i, attributes); + console._safeincrement_y(); +end; + +procedure writehexln(i : dword); +begin + writehexlnex(i, Console_Properties.Default_Attribute); +end; + procedure writestringex(str: PChar; attributes: char); [public, alias: 'console_writestringex']; var i : integer; diff --git a/src/kernel.pas b/src/kernel.pas index 61e2373a..83af5d69 100644 --- a/src/kernel.pas +++ b/src/kernel.pas @@ -6,13 +6,17 @@ uses multiboot, util, console, - BIOS_DATA_AREA; + bios_data_area, + keyboard; procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: DWORD); stdcall; implementation procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: DWORD); stdcall; [public, alias: 'kmain']; +var + c : byte; + begin console.init(); console.writestringln('Booting Asuro...'); @@ -37,6 +41,10 @@ begin console.writeint(((mbinfo^.mem_upper + 1000) div 1024) +1); console.writestringln('MB'); console.setdefaultattribute(console.combinecolors(lYellow, Black)); + while true do begin + c:= keyboard.get_scancode; + console.writehexln(c); + end; util.halt_and_catch_fire; end; diff --git a/src/keyboard.pas b/src/keyboard.pas new file mode 100644 index 00000000..f51e7a7b --- /dev/null +++ b/src/keyboard.pas @@ -0,0 +1,31 @@ +unit keyboard; + +{$ASMMODE intel} + +interface + +uses + util; + +function get_scancode() : byte; + +implementation + +function get_scancode() : byte; [public, alias: 'get_scancode']; +var + c : byte; + +begin + c:= 0; + while true do begin + if inb($60) <> c then begin + c:= inb($60); + if c > 0 then begin + get_scancode:= c; + exit; + end; + end; + end; +end; + +end. diff --git a/src/util.pas b/src/util.pas index 27aea650..5839ac0b 100644 --- a/src/util.pas +++ b/src/util.pas @@ -11,6 +11,9 @@ procedure outb(port : word; val : byte); procedure outw(port : word; val : word); procedure outl(port : word; val : longword); procedure halt_and_catch_fire(); +function inb(port : word) : byte; +function inw(port : word) : word; +function inl(port : word) : dword; implementation @@ -76,4 +79,43 @@ begin end; end; +function inl(port : word) : dword; [public, alias: 'inl']; +begin + asm + PUSH EAX + PUSH EDX + MOV DX, port + IN EAX, DX + MOV inl, EAX + POP EDX + POP EAX + end; +end; + +function inw(port : word) : word; [public, alias: 'inw']; +begin + asm + PUSH EAX + PUSH EDX + MOV DX, port + IN AX, DX + MOV inw, AX + POP EDX + POP EAX + end; +end; + +function inb(port : word) : byte; [public, alias: 'inb']; +begin + asm + PUSH EAX + PUSH EDX + MOV DX, port + IN AL, DX + MOV inb, AL + POP EDX + POP EAX + end; +end; + end.