From c4bed9000d29c1a29b0c56330cc9cb6a6dbcb1b8 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 10 Apr 2026 17:41:15 +0000 Subject: [PATCH] Now prints "Hello, World" on boot --- build/OSDev_18/compile_commands.json | 5 ++ build/OSDev_18/disk.iso | Bin 33554432 -> 33554432 bytes build/OSDev_18/kernel.bin | Bin 71604 -> 21612 bytes build/OSDev_18/kernel.iso | Bin 2672640 -> 2623488 bytes src/OSDev_18/CMakeLists.txt | 1 + src/OSDev_18/include/kernel/terminal.h | 42 +++++++++---- src/OSDev_18/src/kernel.c | 4 ++ src/OSDev_18/src/terminal.c | 78 +++++++++++++++++++++++++ 8 files changed, 119 insertions(+), 11 deletions(-) mode change 100644 => 100755 build/OSDev_18/kernel.bin create mode 100644 src/OSDev_18/src/terminal.c diff --git a/build/OSDev_18/compile_commands.json b/build/OSDev_18/compile_commands.json index fe72fc9..e3b71ee 100644 --- a/build/OSDev_18/compile_commands.json +++ b/build/OSDev_18/compile_commands.json @@ -8,5 +8,10 @@ "directory": "/workspaces/AdvOpSys/build/OSDev_18", "command": "/usr/local/bin/i686-elf-gcc -I/workspaces/AdvOpSys/src/OSDev_18/include -g -Wall -Wextra -nostdinc -nostdlib -fno-builtin -fno-stack-protector -fno-stack-check -fno-lto -fPIE -m32 -march=i386 -mno-mmx -mno-sse -mno-sse2 -mno-red-zone -Wno-main -g -Wno-unused-variable -Wno-unused-parameter -std=gnu99 -o CMakeFiles/uiaos-kernel.dir/src/kernel.c.o -c /workspaces/AdvOpSys/src/OSDev_18/src/kernel.c", "file": "/workspaces/AdvOpSys/src/OSDev_18/src/kernel.c" +}, +{ + "directory": "/workspaces/AdvOpSys/build/OSDev_18", + "command": "/usr/local/bin/i686-elf-gcc -I/workspaces/AdvOpSys/src/OSDev_18/include -g -Wall -Wextra -nostdinc -nostdlib -fno-builtin -fno-stack-protector -fno-stack-check -fno-lto -fPIE -m32 -march=i386 -mno-mmx -mno-sse -mno-sse2 -mno-red-zone -Wno-main -g -Wno-unused-variable -Wno-unused-parameter -std=gnu99 -o CMakeFiles/uiaos-kernel.dir/src/terminal.c.o -c /workspaces/AdvOpSys/src/OSDev_18/src/terminal.c", + "file": "/workspaces/AdvOpSys/src/OSDev_18/src/terminal.c" } ] \ No newline at end of file diff --git a/build/OSDev_18/disk.iso b/build/OSDev_18/disk.iso index ca7780dcbf09c4973a7b45f97ba232593e5ca8ee..d8917684e9730bda38e090f0ecabc3214efdf487 100644 GIT binary patch delta 2328 zcmW;ML$nxJ5CG8=+xEm0+vbmL+qUyFv27<4+qP}nwmDOk#jVqe_mt^6hToGLvaM41WKY5N}~+Qq8!Sj0xF^sDx(Ujq8h5B25O=fYNHP7 zq8{p_0UDwa8lwrCq8XZ_1zMsNTB8lxq8-|!13ID;I-?7^q8qxS2YR9xdZQ2eq96Jr z5CiZJ24WBfV+e*~7=~j6Mq(63V+_V(9L8e;CSnpMV+y8X8m40gW?~j*V-DtG9_C{K z7UEwl!eT7JQY^!AtiVdF!fLF+TCBr*Y`{ir!e(s2R&2v|?7&X!!fx!rUhKnu9Kb;w z!eJc2Q5?f@oWMz(!fBkrS)9XpT);(K!ev~+Rb0b$+`vuT!fo8aUEITcJitRd!ecza zQ#`|SyueGm!fU+2TfD=2e85M1!e@NJSA4^F{J>BA!f*UHlHDH*6VwDV!A%Gg(u6Xh zO&Al_gfoBsMsSK~BALi0iiv8Xndl~liD_b)*d~sNYvP&sCV@$45}ChDVw1!qHOWkJ zlftAlf16Y$wMk>rnsg?;$zU>?OeV9*VzQcSCcDXDa++Kwx5;DjntUd|DPRhkLZ+}O zVv3q#rnm_(B}_?E%9J)`Oj%RTls6SjMN`RCHdRbjQ_WO2HB3!Y%hWb?OkGpY)He-G zL(|AKHcd=Z)66tCElf+(%Ct6ZOk2~=v^O10N7Ko4HeF0t)6H}@Jxov2%k(yVOkdN_ z^f!TKfceJ^G=t1wGsFxv!_06q!i+Sd%xE*lj5XuTcr(FFG?UC^GsR3b)68@;!^||Z z%xp8q%r*1Oe6zqTH2<1KX0cgfmYQW|xmjUWnpI}CS!33kb!NTUU^bdfX0zF1wwi5b zyV+rOnq6kM*<<#aeP+KoU=Er?=CC=%B=COHVo|$nqTI3kUd<#Alp9t4?H)?MF0Q* delta 2328 zcmW;ML$nxJ5CG8=+qP}n__2+NZ9Dm~Z6`Ca?M!Ujwr$K*WpV5D;=N^eU|?Y6KujnW zJYeDLl zVj~XXA|B!+0TLn+5+ezcA{mk+1yUjvQX>u0A|28r12Q5LG9wGJA{(+J2XZ18aw8A& zA|LXj01BcI3Zn>$q8N&!1WF z;~y--Vl2T@EW>iFz)GybYOKLptiyV2z(#DsW^BP$Y{Pc!z)tMKZv2Zq*o%GGj{`V} zLpY2hIErI9juSYEQ#g$?IE!;Qj|;enOSp_HxQc7IjvKg%TeyuoxQlzZj|X^&M|g}U zc#3Cuju&`|S9py#c#C&4_=<1%jvx4mU-*sxMzj0lVS<`qCb$VzO(K)nBr!=%GLzh- zFeyzcliH*)X-ztl-efQtO(v7sWHDJyHj~}tFgZ;wliTDmc}+f(-xM$fO(9d*6fs3j zF;m=>FeOcZDP>BVGN!C4XUdxjrlP52Dw`^%s;OqGn;NF3sby-LI;O6vXX=~3Oas%< zG%}4%6Vuc*GtEs4)6%putxX%#*0eM2O$XD_bTXYy7t_^rGu=%O)6?`ay-gp}*Yq>} z%>WZ<2AV-;uo+^8nqg+R8DU16QD(FmW5$|sX1tkTCYniRvYBG0nrUXbnPFy{S!TAG zW9FK9X1-Zq7Mj1!KW33xY?hd%W|>)TR+yD$m04}pn6+k|S#LI&jb@YCY_^!KW}De= zc9@-Jm)ULpHG9lnv(M}|2h2fp$Q(9D%u#d995*M-Nps4aHfPLPbIzPM7tBR-$y_#9 z%vE#ETsJq&O>@iKHh0WjbI;s256naJ$UHVr%v1BsJU1`QOY_RSHgC*Z^Ul0CAIwMd d$$U0n%vbZxd^bPLPxH(C4zh>q7i9Z~{{hsZ$K?P3 diff --git a/build/OSDev_18/kernel.bin b/build/OSDev_18/kernel.bin old mode 100644 new mode 100755 index 000ec0063e0c2671cff374e5d62e47d96b94a505..f7eadce2ea3307d66efbeeae6bdc712525605866 GIT binary patch literal 21612 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 literal 71604 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 CUaTI=h#hhvS=jWA>yR`PGr zqNH6;owP7>(PdXf)?Bf!Z26_7>#rTUXvyVEFS>Zyij}M8kK3^5nyc4dc;y9`te!Y| z%A!S!!ji?n_M5lH;)(68wN1^`KH5@QRb5lJsa~|dep|(sjg1Y-_8Ri3dZZ_G|2Ur( zw7LEhwA+a`?Vq6C=RRheZ`$<#3-<%~9Q>H=l`dX!v^#2-Uvt1LlrMoZqE$38d{I2M zS(xVK^|4qpN@ALG?U~lDU&FK;Os&{&812}G)AZ3X?*=^MKynC!%QSCuT@c_)+w|*x zdH__CW-(CoEak&!;2K#aXy{DZ$*0`GryZ#3kD#HWr@D`zIRcu7kDxgLnr6`8(R!LZ zEe?4Kp@VkNV2hnbQ(@DPZWe&%bD$aHq>27i=!Wpu0Dl+oc~1Og5+4Ta2HS+7}UU^1_m|o zu{5y5_o3u>BJX(LrnnJzs?(kR&Q$l=ctsb&gDNLI<<_cBd=)+Mqq-AMbSoV6RDayA z|HlCMFYUU*gH-gR_zje&*_P`GTi$_kDtaZ~N}FzAzY0(N{ZEvi^mPKCf%j_x+lr4G zpTeIBZb6r%FXA)sPWpB7q4^-Xv+<#MQSwkbHJ=Jj^F(kpZ)%>@{E)mf4>V77S8~(* z5Z{4+WM2eVa#6d9_z>SiASS+aSMdKT9m!Aph(GmnHva!z8{}Fem18o&qm54wC0=aO#iz9pULd*1o@j_Edk*zALz*Q~3XCdo}KX zcjad(?vh^aweL#L1L;-$quMEc1MlSTsUPx}ba(P0Jr1N-^^a;teuwzcALSQRSNX}A z>eR0j9>Ux?>B$~cUCHUJJMjdk`B8Yf)4HJhz&wM-8ON@n7xF9eFEn0tr}as7@8{}Fem1p0U4g7E@ehEZt|T|yy7zwTb6*0ghpE`(g&f)ODANkPRCMjGXE{bLJxkU6 z0UG!vf^05u#wBdjS5N~Z11+W#%(dHK`uQm2u}oY^e^ZH6=#PXX{Z&EA&*Dx`U;lai zar&|=$T#8!73~Nyx8bps^eMpT<7&snWL~MH4C5|TeYfDEY3_Zv`MYol2-WD}Z=>uY zB+DEH8MPeuze2EOsB1lc!ZpYRG$a`BW+5>}c^QP#cRzA7%OYlf#V4C4aS_uefIiR; z9wSlLdUQYP9vZByvue~yBa>Z#3yn|<(#YE&x(#KrIa^edn0hY;z-1JlPYnNQOVckw zs}gfM8ZFBSu_@HJ=N?>*mPDMD6jKqC=Bkf1vXNdQbL~zrJ_!ZA3{69xw^96Zc8EQM zyVgTBH;q0-C7SLn(Rvmd_nxR3u8l0)l$eAo(a_BD-4fHxI1M60&W1h@91OvlhWj8e zTF+I03D$;_wK0|8uq9W0Yl680wAfs`*ZYbfQWJGr%RD~WN4-$Yax6hV$sZt1!6<$T z6_cv}g1cX+Iu0JB>Q6x9u#D?*2~siiED{sV2z(c1FEwC3vgEvC2z3eq zb`iRVYHoV$pEvePz(Vm^`qxn{%qT}y-~FST^;zGf4Ta z-B;*8LT#Gp*R{LUI3Gl0(z5{7zmLl(pCqhd#xH=o5V*?#)+*R}LN`-@TA4i(;_ADR!gZ>Jl4Q!g#ul>v4(j` zL5N*W2$JqbTe?*MWJ`0*A+=KnxitSdWC3JFzJGy;nKbcxFb}1;Ydv>>%6$jH3+0fR zyNzmNq}~kuE2sqvh|IOShVMtiS=6wWg)$`xtTZD6P~JvRYHm*YAVZuc_~+MF0B8@1 z^zO+Z;at06>mQ&%hCB);>lTK504&ImJ21d4xPJ{8+c)Tc0M1=F2T(g8>CXe=DOf>} z4~b1iZR1uJ%AghW64;I>@}3@CUC*L@sDKcz-IY8ZOR(&KtZiXvwUK$fB+R2|MK6SC zJ-<|~y!p;nK0lGUc5h{#-+-lNxJmvAqKW9l$d%*?*C997&PYk#%-CoyHSiF|85A0r z3hfcP9~>5dI13aeEoGya^d2CcbGe|+M=_^dfK90!vI#Dixha(sBZ$4?zXx(Nd#hj| zVmO!Up38L~qL)`ZMnCYH=@z%EAr{l#0$kG;pzPBAg;t>UFd&9z;L5eD0dZ^elc^pp z8)Z}bG0I*oAJ+`64iKOA0m^>uW|RY(4}3DUS5XeqK*%ojmr*OuBZJ|3&*Bi%&jnzp z4Y&^g?;Fs-a34isgvZhl^HC`CmVnm?;fT0yAZU88Ku2L4U=rXc043h51!q42C^H^u zGYSEaMcz!8-s}q~`su=a_u~q^>_a&~DKcc4f zj6!!tBkL&7)U$SQkRtM~!H|S#_=Tkl+f~o8D zyUd3&h%we7Bsr`kVLk#D{1SB99(M+~R|)RF20&j0Z9g2Kal3YJ(k}t%kxWtr`~rA9 zYV)XP?oOb-{;Oi!Q}mof)k7}k>tji|Pz!TU2Cpx4f#hPrpPmH>k}rg95>FXGUzkMZ zj#!!T6_B1o%NRdN!bHRItw#$e}@$p8>M%{vo#a?b#^_wiPA` zE&!xyISAGZ4lhcArs0xcgJ&6pZ<-(neT}h=HO-bHnZ|b3v_zKuI>&G}2g!h4yPH|z zL^RUs+~dG@q+t6GuobN8Mo3nO{BHwxO>0qzJt|190E>(#P^}~`+u24n%!~s7QfBJf z#wvoc$C`|10VH22x~|NUT~kw*xetu5Dx{fN0U~;BPwVLbccZm}T{V?F0#YI&%~cDe zG|epYUWmM=fU1+xXsBrPV`@}Y&DPBNtZ2lHji@Y_6@wMcLPy#~fqM!=tXnjA6%Aa? zO)YG>Z5WMg$U@S^m;m{+dj*lOqY1VhH3>U9$0o1Om;_#%sIyu&Eg+W%+$5V1CKM^^ z+)$G6livnp5ipB}hgcL=^)md3o#^P&FOsJ0pm8B_lz!0;8f65Leo>cxv6>)f%7=`5 zF)B0T2=LksDEj=Qcc#6AvR{;4+6yQLd=!Zc?GBVPMVV`#MmZ?TZtWSAL!#_q2C3G} zErj5LPoB-Q1>k&}rx%{Tz~=dRlnZU1#HUEmxS5d;gnO7st-lEPaGTHLD31_Hql+26 zsJKUNpuUJ^l!IopP2;A~HG@L#*_c^dnP4-i3D?8qHouLA=TSGPw_|s51L*Hl^aeAl zK|hO5HMqVQcyA`;noYywdJXEnKcYQy!e0U+x@3V<1R3J)$NYVj)Y(IeCX-SsZAdX~ z72zj1jbnn0odzf2=g5l5Ny`_L!ePt&d#GF`E6prehnnVblV$7`oY`8K4Vh03j3i5# z&wIA{+&3b`ZUi=Af51EgP7nA*XD6YEPg%OnP!0MsE>hctAxeXc6c8J8SDxyjh$X>4&(QuKtFb~PY1G1Og5`y52B-Ym-(0bX^ZEN=%q)*;J_0k6DUmgk{d@l{z)fM(-E zvfPAn^oO!shw_G>%JO$XU;ex-dr`jb_p-bWG}rdZ@|OU==5Mlm1>o!Hj0>_|it^O~ zSzdwix*}OVj`G?uviv5>S51@UTfpbag|d7D%4N%Cc`0bFD3j&$QNBDX%X3g((;&-R zK!4eGS)LAf>20z+5#>v9hD7p=MfsAi$Z{Cv)ep+@x6yXh_htD}z*p{*UUiP{ye+~2(|5cXn0{o)?l;s}4BjgIu@9lsu&6DMJlrJoi<=1h$V3I5! z#cj!4S^gbvizBl9B5sQ=ljY}eJO5f)eipZdwX%E=w*{@TydSsuJ7xLDxXtU5<;QWG z`$bXCq_moQ+>fAUl5;f453M1{22a^E*X%%ft9Xk)O9wAiv26z;UxVgX_}V~Z;lTU?IV;&Q|m zmm{`l&e#G(GPa;`GPbxJvBl+xEt)g7XwKN;a>N!_Dz<3O*aDG~vBl+xE!+`XxFfds zD7FMCta!ym#1_5kKY#TG#kWbU-s z!X6FDEjN4vJ?He&y7kg}WjQa=(#&)J9;@p!sB1m@2Z6R3@EW+UWEW_}t|<~bBDvEK|-B(|}+qzu?2P|ScgaNFLX8FdOz<_RZihE;pY9FZ zgWf=7njhC2%#?ZNUf2*%^96gKuzkUI;gy}fVAfYD4CzOK=V_k6eA3|wzDDNoKi(6# zZBOt5hU~UI!4nvn?|?1?K-fz{zk=dIMS(*>+Y`)?6bEreSBxE*7I6OnOQ@Q9?fC+5 zURv^j;bK;>RV25mWd~$TFXzGoupCq)~O{-9xocH83qCP>AH+yOIyQkAI zu=>3@=+C``#zD)UJ!^;fGQ1!!Pigm{e-Yx(39$-Dlnaas*fNxRz6Bnx>q-^_i{&nk zIZe+Z097jRS(HuJ&rEvPN}EU2KhK|uGSlej%k>LU!4pS$3K=3Yu{G6sF`Wj9t*P!7 z+YYfO)jb7c0oTuzFmSOMH8RZMm?Dud7(PFp_sio4!!IiG9K#6sz6yjq$S^WRMV@3B zK~a%M8AeD{JdBIYsF7Qs4MuE+n5(cBt=1rSXqezgs8P5mG zZ45K-CU&&RG=|&kC}A*0_&Xq-i*d0THAb30PSTBX(v7z1yfoyWxb8;qYY|= z1&<%N6T6fy#w;vOwjbcCtX_ut*koJVcez zB3a<^LaL0nlLabIl*s}Wr;22Ow-ixjrkyNMd5%mLsAz9Qd4iW; z)-YWB;xZB?X407P+({%0{3dfPfVPXEqI3~_hxZi7q>JD?z0}gg_El~~N2At+k3B>z1BpWo6Q6nAQf2mMtoV zc9<$T#YAN?lTHD1@!JPDa>^p&ysd;T;3PO5*%}N_;NWSvfMmn``~_r#%)Axg0s^@A zp^3ZLeU5;;uSCsrj(d)*9iiILz(t}~IF4$C?zO1->B3Cv(@n_*-{jsTo6yF?ILA%f zM}xWPD9f1O{*0{AiLvQ(-z{oIUjjRAgph2Q?S{0T!@y-e3CvL9jZ`SJ4wZQXhGS#q z*TI72z*|w0a=?!h!zM5M^9ta}pX~sn2Vvdc1cf*a!t?p*fM+_MIN@lFK;n@Tj>aw{ zwBwl*j>akp3q5ixL*=0!xs{=^^iDV?ql)xS zM!b+J<2`aKL*6nJ(@tQ>A)D`Fus9~8Ft7g( zm!W;+X2ga364PnSBaD#R%FuH#kKD>oF`2*|re-REp_V2KOYg+rMr|Qz?OAf!3Ctvb zxW0krgeb^a35poDvasfh~R*KA+D9Duwieb#PkSHbw zW(f+m#-^xI6k}!b#1{p~*};4-w<&fhiYd&6-`QdO%E0x4V(}F=#U4db#9aHRm-0Z5 zpx9exQ~W|vj9{*8;!zd&iJ-XeN}J-iqQHbaLp(MIj!KHFY>I5yju=ZZb3IQKTLLbC zFxs^tHpB~vTX)X`gg(YaxWKEq_u=Lvh+c_O3B4weVS343M2Red0?T>;7cahvd}W(Wu6z!j6w#qQq_ zPE2i92UOu58R#R3Xg}n7f|O)ZMI%;YAp#plac+i?W7^~pI|-XY=zzUs&l>$AsB*pq z&XZ9%A0Ph=T=XGS5=$oc8W5JFdjGlV=^~vZ>U0$BBeK8>5Il?m!jDMOXU(7msS@j1 zi%1x;udYKkv~<4?;uGMO2idfq?-P&rfwFn{$^c;be}&A?foO~%%8)EshGd4B&7L>< z4v+}h-$aY|@$pk|)oDl$*=aYCF;U4*Z#e4txcG=n$i4|RCHuTI+2@@udpU@&1~)1D zX4Hi2HVXf@2x4tXHu)lYJ)s)&rY+6dB&s#R_*SMx>{?~8 zwFS?5?b-&HNUAQjtJffMF>RS$gO%o~iM;_G+&)Pu=XTVDa%>@eKZn#(IW-_Ut8$_x zw?Q(YoC9F-0zUpjxag!ahjLD!dOsMg0avYOHrnWK0puexp`7agf^uxzF>Kp0iyuRy zc{FPJC3USrBrvYsjln9WRc6v!7q2TNN3{lQhGN~wDX&CLjLPQjdlO9LsNVgMQMoFq zuLd72JJ;^Tu8maPCLBAxP~oELr?P%4u$9FJr-ayQunpq8=>|1nSpBr@iAMM_57SL7 zgkkSOtrG(TuEBblFSKF84@jnye3EHBE0_e5u~*=-1a#vB-9pe6HsckzvBRagFfVOK z$DT75Xi6aq@<3lQ2A3hpMsd}sWT>-I$@pX=>S<^uF7F`2ls$b>H5#gVlDrEa#n7Kk zlI>Mwg^D*DwT6_F<5`6p_4fdXsVA-H-$5+o%^4=UMob$5m=^S$V-r(~D~SbRuvif? zIsl=x`0tr;^y2L9x6me~#S^B6*bbEc8UO_y>Dy_s{c4&z)u%MhemBi|lK){Zrv*(t z+xvO6GdbAih~o?FOQ7*wJI3>?A-|rd(;2oag0h>ID}vP9$n`Em-6QLxsXhaB@f-#F zQmRi!U7VeAeInIMQO}U{Q>i`7ZT=lV;Hv&i>LtF$MO#sU?GALB7Ch&99 zL+rP>YdwF&RlEtbI?tXaH-7kyt;r;r;j;42M;mQ3e{}|)53fLZ3$?&2P6gQ7Fn5%d zWlKN}Iwv(}YzNUo+SraqC*K4_>k->rQu)GsyOY9sKyD`vwQO;KgcQ$ubQ-3=9UP{- zG%dtv=cDyp30?sbYDzZA4)@}YRE*UP#>KUhcz;*7Y>HHsqUx`U04Uc)i;7Ye0Dx zJ+8x^oUH3d0Jv?kr2q&E(K-J4 z!u9my>b?ur2`Jz_<#PkXOH5GccJv6{O$2tdAkO+KL4s}?ew%=JdH^|xq=ec$KR{)! ztQb0?SXSm7foXI-{2Lm)GYb|kH2g2NhCe{3Z-U}s=-y3E!YH1G zs;z8szW+~anA2(*L*sg6mVD0(X%T8J^2}rM<$#%f$PKCyKOh9&C#P-Am`T!vO;0l$ zm-`ceN#Gf!Pi|(66@c(JzgEMvD3HplE`3 z>kT5|m`7$%Q&K}*@D%Tnzly$$T$`t>C0>CPln@YDf1hyEZJy@eP;*}|Pzm!mDjr#B zX2y0v{l?9>+NQy1_f3YrGFu(V(vxa3bPHq30c8vm^ndV;9(7b9mfe5-scYIBJ?f}J z^8O@GUDMv^QAZV$oqbdxY@VgP(Ie^3_|#Rr#6UPO=PaUy!F=KnRX%6g0lYe<7y%Nle+!W0+dOolucw}~=#D3@y5otfezqsBKqQ~I zqH*$xtL}K>s{d0@Ty@72SN$wcTp?2OiL35-;;P=}q30~>Z612g;-@qtM2}buaS_j1 z{50mQ)Z0Ata7CBL6d(1R#eU`AqbZ8c-qk|YiFP%?GIye0+z5Ub3Vw62?ghVM@#Yrs zn@cT*suq&puq69Z!VXvLSq>f7YJN8d$6CQrytFfdsATpp6v*S8Rf^$59!B)1xdWhq`v{-jeag9Q&=~jck6N%)y%V3br6$bc!!P zFrPuR_BZ+1224L`VoI(`saM;Y7&TX(I~;%}j1PY~#yI`u7(<>e8}dZikSEH9JW=+U zcR~UWowIqxyyM6P8;=Z8HW;TGuL_ z9>B##>|eu2Cto<9X>?Mi4-5PXHJoy-gR+T&j6hHfV;Y^5=@SF*3W}pw+Z1F7f?_Pw z=rNEMN!N&Iw{k)1ojIG77Z~!Em33W z-vDsaqGmxl=5llH$LgSuyAT&V#g!?DIU2R>99%G8`#_m93}wG`G>cFa`y01#G`V!T z#!d0!N0~w~FP&^Id4FDrm7uxSvkjPx2*L870{}M5ymT}+o&NE}#{>zz2qH+P7uzI( z^+4VQWFB_ZGjpUjst;5Gx}BPQAA{1)3(5?tMmtQ^`B`Frw7VJv-ZuaV?|~J6LG(~e zj*e_DtQ?)TjM|K`Hv)~4#U$IQG_d?92wmiE01I*rTF(-&kW|GsRTC?CnW#K&S}rRD zm89?{DVR2z`F!X5bnIGPW7%@}934-{N(?F)97h84O0@YU{<*&8Ij%w&PZng#@#!Oq zM`U6Bhv1*wnzlSg1G%RJ?WZ7-GH2p7LN{rn7y1)}wrxYVJCiUPgY55m zG1*CDN?HX^8k$?kA{B^c)Vb$$<>4I=8o4*$F~u;VlyZDNje3MJk>oI>l-#EY>q^m?b>wp@ro^4n%nd>_{?msVplQ}K ziRpkTRBI{WoSbK@mw^stz*0~~MCLahQ$G}j=sJzh875H-#5t`zHRtYu zQ{r42p3_EY4j833&1B?4&QO-(OHRCBT0%e?E@l#*<;<%ic)A)w2FTC%(Q=n=ip(+1 zou%AFcKUouGeF)YW|Av6oU800PuW3!%18>FES%aXbRv{Xl+#(1@|DgOLk5Dchh5fVE&<7~k$id)!K1p6;ij}BlrDTX2(16ebmK1tmVAKh%N%AE2TnUiv zTry7AwpybiYK^nqr<%XBYXFbS(^pII%u$PJHjfg6L<`6nBJuF`9fv<7wHN?k3`B^z zCy3KQ z^^`d(^Gj-(+rHk`GImocNwC9}(zmJfjn_iReP;~Ra+-HY`UA-&kW_J|QgP<#`V1<4 zhA2wFC#3XwWgZNn4nyN z1DASoz5X++-3~><9HkSo{Ufa z6kTURzm;OwCH5;bQE}QT6fY%EU>UEWdTOdD@e-n~Sdo;JxEtYZvaY?8#lZX)OQ&XenvRFBZp?Mk+4RdybnC9$d`049>V=2%C<@bgXDHiYGx#@ zn^DgG8=-Y4@6l&NlGUWhOnJ_>6Lu=7 z#FI*!rJI(qTTT*&NT%aYYk@t59Jie3WE@G_>Y2ibn9O8^JM&ILE=v526B&38DLgkd zD|vFB@-vdbFbl^x1wO3|#{z}Q28vFP*tE|`GaMzp9PU}>M(sFGQ@k-Cd30SqW{%r87|}uk8s_6GHy$ zOz}_!!YsK6oZD@u*Ku0HS+cFOIwOq6_C=@76yC%WdOLk~&afwP%9C;}(kNtDbIeiN zHWm`39nImeGr88KA9AVb(A9Jpskt1OHOtASP@BFHG?SB~R^WhXkbdC|6HUQU&9s-M zO8G?^QEGMr$`72$4-Qn1G>8y6J7;PwU15$?yqroqAf@)3 z^f(kB95>?+kAmngl=?+Qs!IG~_*scpzZgh3`jhxIU?K79_wyuH;eU+7Vu@Ej`j(FW zG!D@uUj3FV+jb;J1 z{J!Z5uUQK(%9`k(e#v5$fWbUEc3S3<7 zCpdRkbMHIcB-jExF-xLe!m3)KC}}m2=;MwjOhXly)Ocu}6mgCbXl6n3o?%X*vf1kLqpu*^ecZk_P+#Iwi;~nG zt+{+20B@hUkh>Cm^i)3b9zHa|CvO}fgR!aes$6MK#O*71=T zj%yhngo{ymZ{yk&K4S_DW;A!#aB~YUUdJ!it>T6H_HLe|d#k9Y!WtgB zj~6cB*|$iudXX1G4Xv^#pYDUfRwswK#i2v!`yuYtzi@LE&w|10|ITh9lfu({ZPP!s zqCbGaq&yTo9@fMqwaO?m=x^Jo>XGj;Ki`~ zJ$zUj&w(wyD7)K(-=7s?iKVhY)LdUtt4zE9PM&41cNH(J!Z#mz4i@3P+?^opLoFBd#Ls>*?LN0y%9v&vaeyBv@pOzFZQ@B0%+xT6@*Bf}?gspb}YU-^J3O~g0 zts+COl>QMm`+1&sFX#87gA3q@b2-0*L?uF-T*o=7DbRh5N#Sf*{>Ix0?b$U>WCiLR9ptxlf2y^96g= zEdF?AZ2X?gSX_h||5;dY7W^yP-Tm-snVdwm(rWIiJ!lf4|^T+ z4{vI=ZGssu;wDnM^-#+wKJzbp$O0a8jm{xpa22fr?QbqGgumMs{^NSu2S|8v86dpy zw3Of%@?5i(4_kp-H6MamGS}5X!09}&fKORSkfcDXg+RLZZSI}OwW;_bjHZ3g7Hs3$ z)(%%8fZRVtoi`wo2m={^AmPM?zTW5}33XaTE;3ZtG=j~>#aK+GKcT74m%(mn+o2EF z$dcCM&m6V>YGk+2pSDgc=ZnCCmJ9{MGv-xpB@&54V$rv_lVbVk7Xigf#M%Iz?I&Tx z7mrC8*YhM63CQJ|DuHaY<Jf_I{1LE5RdRj;MDS#X`KUY23?F?b7>?qjYWTz|Uc7)3 zg`w3vtIEEPbd-Z6MG4Q58RKcUAaE2Tp=~}|uR+|=3*V*^QeG4hhT#oFWIdO>!y!Iu zq42M-@gVYMuUX4^323%bLs$++$G`FAl#FrndwjlrJry41^JnAsT|R#fZjbQ!b8&l^&!30ecliAI zxIM%(7xIZ)d3GDcGz9M~j0p}mh_oLay3AoJSMYU!yhJ$PKmSwCcPL)VN;7OXo?79h zRk{cZA{)_DCL@*}?S1v223JwSL$_4(;FEk9l8il+sdJQFqjF?gc!+X&IEy-xicdv^ z<1ZqTykoYZsF|WcF9=>)VU%!HT*YYK|aPKXAJhV3kS?Vpk_*_1nm=2dg z9lCG8%ELZm-L*(nOYBgOJS5k>o@Z9^jDwEz$4+{X^Ef4I*fWrcma;Riy%`adzlfzhWHiseh^=g`h z?=o(u*%cQt#bS2F#L}S!O>7~$fG~lTq+H}e$PSUBWlrJvUbLZaRthY>o9EoZr@qDu z*U}zhW)%-2l^4G#c~vT2{I1u{m1qO& zrGWRSJ**Euu1Fh}euRc4E@D_>M0CuOk5dL1DK>?eDNG#Za@|7iThzu2u#}LutRw5o zycMVj_jj*>;M3ums(A*^C#LYs?ilxVb3g5Ur}JDKSO{>a8@uL7NsNnj#gE%kf7~z~ za6@u&5t55!%#rZSfpezwpdy~}3}qr&=R>a}&8vCf4b0GLvSEDSn={|p4cWfKy;Dc> z{1RT&$+ZqXZj}w+Lau{$9a>mw{g!+Aka_qK9+v^x@3Cc{d^SUJsmLRY$Q2=(#RbcX zyXZVh&(e4fd{P_FbVJKU7M$aq!kyTVTy)21!;rApCMO3K88WZ zW`%HUBYAs72EQVO~Oc5<(R=H)88G68;<9*O@P&MG4~FB#^JbciynV^ldnep#u&itV8KW z0SJ*wTSuFG@YP-tKE64Qf7zydW3*yZA|9=XF;TB#7hh5qzHr*?@U$6|r%#?5p42d7 zIxf+8Ma{z68FOZ#+}Jd!p<$aWw6w&M1)>8k9;=*meN!Xg)!|810Bmfntxwc8%1TQD z9ZqVFHzi^fiKaM!5>inUtJt)#u}MM;EiJuNj&@kBU@Bv3pSZE0#`(T%{^cmkK#HZ-@!W99V4HFTc9*T~Dug%sr# zHJi$-qP6wq^-UG{H&@DI+iF2S0Eu6h-8N%-d7=q$aHzdLRu1-wIQ`2P;GaS@wj^t%C|(z>uXyQtg0#A5KS<&s7}7jEX|qtLnLPF1ccf1F~xQ#mlZJzj#d~atUi_YOKX< zmAAwa6;1U`72Z7RTfFIsi=>^GLmDJ0;bvv+Ei7JGo9(uC2LmF(AP1@-5`2f z79oA0k1etCiq?1wl%TYNc@~mlBFGvX!dlU%+c>v%a&h}(oZcWvo=~!qSiK6o?%j?*hvM( zo3+9;_-db6twhW=Mq41a151GNn%e3bfhupPt*oq%iS||X ztt~aGHTVch(JPw6mdmT75chhhQ;?HGpl)%ePFv#Br;6(|ah)!%GsN{gah)Zuvl)K0 z6NK^2po?z?S$y+M_?~JkbgW$B6yGd}=1^%aU8aGGl!6r-i^p4=6D=LXoP~76ExuU{X_^?xG%=KELT>;-PC2cuWKAtC@Tv8!v82As9bywuh#qgoaD=|` z^QvlQQp#7Nvx+9n$2QQm#FH@5Zc{AY7^_cu(e2GK8F)nWNsBo$s!DfTULV~KXUrNl zqOYo^@@QpcoGDh(+D3@d5{qw%RkDUwM97UzO^NbEwAx8hUg5xzgQw_%U{H;qC?sn} zfU2sEBc{kIFmRqJe$+9Wc?rTTE5E4h5>|nr2v>}_SY6%>`49wJDx!@vHx$vLEfux3 zj1ZCpp%P*6>c*`NY}(Yz(WumJlZeK*M#;KsVhvz@bz`)FH8scLQ3~pfv900t*Rn>z zqa_93(o|a+9)He+@oEmx{+x+n0-rMht22?Pk5$#i>MP5q&7FyX3f?y@sE;;mtc;$I zUMlNLw_tEBwH4*l?E4J+ex7}w1qVs7vnonD#VASZBH_DhUZfMSW8XQVN?(ihTS8#B)qCLbk}O&OP_PPi9pW zk8N&^HCAl56*t|!&rB%+^T?WOV$tUE%2*4sFi}L(0n2=tem2Ew#vJY)}Kbr+O>W7FcL=&31$c z>K1s>E>>Py8y9h9JGBv2O5hlT7DAvGxDtHPe-5i`NzB1AryL61S2S;@3^0ymS6i`( zHPqH4JBz^!;H%#C;JT%j!aSB(npZ*ek7Gty@ELNArVwpnFu3u&pmr8yRbJ7M;n z(o~qNRACZnn`tW)KV@rEd{av^lKqw`)2B|KF{yS_V*0c>lbTv8V_T*`KU1boEyo%z zkHXuDdVTH2iYX!mpIq?~%_+sLbTaq|`m=TSF`LykR@Apv#-@;@n9IuArpYxQlLbj4 z2HLV65xe0dM|w8Nr^w6|?MaTt#D75$F%H28b^ty$=T9=Silzo+ho59npFoXv9{RC+ zvu6=2QwaM>#)-rY-IAY**EZ8$B|&SXw!!Q$;T&ZClia0 z-Bc|g>8ue0>`Y`jGzZUztHe-2?gBrNN|kiY%^%aOlzf!2FuI`o+D2@2aJLuiCovZ} zs3|fOeQc%CJlP8S_)gXCT86j(Lf0fgYofNkkrqB$E z%O~nQ$%0*c;f3?U&u`~|E{az2|d-?QzrT)8uf3>DjL@+*>M8AbwsbC8VUvQe>gd{TbknsRTQ>&CubELa&S0{Lia3Z0m;is^ zG?O5y;g>N8qWm;jEXg2hAiAg#iHP6Nd*1K8Pj5SBJ!$W~pZh%Ld4HVuo_o%FpXYrn zmyO1KjinWi89K3U@H_Pz{V}S!Vdq@6-OahZmOG8B<$ZN>Cx^9sQ|K@3yH3aJpEsoA zEQhwCwpDHo;~pKSON=@*9o> zma8tqxhiSw(H>_kwN9mfvJK};wVd`Gtvf!><{EWg$U2Nq%JEn*pDR}!K0D@j8n3ix zp?&~!e!^JJ;am>m0G+pG_fEaGPUZHpJ(Pny)&o9Kx!;wJb6VLZeQ-}G7aeE9vQBqC zR!u4wxsz^Lj*TlqKceGQT|uX@eRiot{n3f_hfh@h&+Eq_XWWOZwC+u^jgt4UtP|`y9q;_~E$P^o-u9`(=W-or3pyui%Y<~i6lJt?M>q!Pcmd0( z^H|nle52!KF|D&Jk2A}?%%Svwp$r4 z3%1+~KU)5!(C_T;RVOVU&2s95+;y66tWn0S_mm4UvRayLtPgER?j_hPr|o^A|IqQm zZ`Qd!)DyWEnzLLNndusndLnl{%_r(RRxEYAhHW-3Y)D42f!sEyYkQM)SP9e1HQ5Gj zTanvl9WVS8bgs-Qg>}5XRM4s1QfJ4jTt%JxLqAdR`OXv zZPxR%e>i8>;WxDmMD%>8Hx!M< zLwY6;z4-~Tuk|SZDY38X;NOdV4F~^O>}xjo?_zJ%m(|b6v#eweDsN8lGEAOjDZ#Ic z$*X)uW*q6st8Dq3Hl}CWBhPNMN0wddV~?D=(O$}^o9)YsqaXt;7c`VVA6CBC@hsPy z)y?IRdoh+r=EYbZc@|@NWLdPF^2iDp%OeNixZb9G7Sr?Q^2qNN%Nu{NW{>twh+}!= za*O4Wdn}gMr13beLMZQ~y7E|vZ~vLnPg|wv5kC<43w8QL%=|mZe^Dprc&G6`w=9q2 zP3kGvkNT5pD%PJwQ^TK(>U-bkphr6|QWR`CblkMY%%v;6e z_V`WK-z6rKhjvc;-w0nK{Vd-vCQHXe=5LFgj)KqE6JqCzfJyi51QYPb<@)Os5b%1j z^E1F-6+5W|{IJ+*7vR^$PFVmi(22o$4&V#L&O`v;D0VUc_yMsq2*9t3y)nN3QpazI zS!kQLIlc;pFIZyRJYUQT+vWvgZ`eDtjv0Tf+w1Yb_+!;xj|avdtMqz2aK1@v^ycyz zf2=9%@xb|k6=cV={1YmV^U{(j(L@!f%Uh#v~PTRa~4YVo6iuM__=@LsVuj>kvUU&Z>` z=cP@|x}g5N;9Slsp#Hq{iCOdW1|0`JPeWo>`1I%HDlzMMN|@yP;ElD<%QwWV)j6Rj z_KzF&`HJ3}kesbSqu`*Jds?jLJ|DxRuQ^HI zx9YCqefm5Ni}wfpQL*O|u(wz2>q7W|cww-2n|N2?JH^ijdv}X(3w)p0*LK)DEOufF z_+hcHkKrf8TZ8>yi*F44JMl=c|Dt$9kRK8Io&bAC#hzz`kBR>f_W!5&l(7F>V$YqR zf3mIteQySHPvHA3_ydwJ2>X+Ahigoar%n3aBS8h{2l~HN@~1=jOT{B$|4)j2-;e!O z;*)~BOYHejn`Vy75EJ}UP76TDZvCfFYnd%hX@ezE6;;qQsL|91Nh zi9NrK{891ap?uO1dTs|fX?+d^`4O@2pOKUM$n%r%Kg8z;{WrzVfb`&$7TP{ zF5WNp{RZ-nh@Be-ULyWXXz#gV&;234K)fi(yT!gYLw=ojpU(Ge%II1Qh)Fo&<2xeu zoDuq~(Nhphsb49`6BPH~EA~AL`d<^D8QRNo$pfK2-xSZ)=h@}m#r{G6Ua`~FVDFIl z`XGN$+!X5jnArEo=szX)yczt0*uPD{N5q~tgh@NZJro<~PZpr|d>?W$;dqV~K3(kj zYxra0YeM_Z7T*-=+a~thE&40PzGsKYz~%WjxJT?cJ$OLuduMo9+!XBZ6gyK7@~g!i zp+47(J@-lgLEg8VXZTi^k) z=c3TRLj3a}zf$bqvXEaZek+teCjMaH{bK*Vg#H2XSdf25+#Bp46q9hs?fa2IW!sYw<=xR`$tAcM}{(tj%=5!lsxP8D{SepSo+piJzyrevW!Tp>PBKG zfPp$kN>VX+3MWt0=F%V49uC>nt$9GM4!u2Hi_|=xm*TmKhcWMI-}D|f@_Vgq@;9;9 zsUi}3y7W$T!NrDMACWHRKu_|)>}qQ}jt^yR-?mh4X=hP*y*RvX53iT#bx&(+*|^>z zd98L{u;$`z>pH3~oa=UX%Kx#myQR0gwRalrDawm+L_NO#G}d>oTeZ8i-`Tl)nj)s` z(lVnOwe-%kO0qxWIR)=RQ0#1dcW9Xb20mOXs42qW9BX zYga7q>Rr2PRd?q_y%#NC(bcJO-MeSmlIB6h3~V2eWAd)yFE$VCnGzb51)5VJ{m?6bxJ;$ zYY-4HGu00qE&TM$fCYK(moW+LE)%EH(mA~9i;iv?8<0v)Ui-`JYda}$O2*rgo4;ZJ zT#;IwQ0WycokgwF^?l!-6iHCVAL!A}{TNk+V-!}MKddyCsnVq=q(xpYJrj`>OMj zYVU3KD}nAy-?aKb1s`y= zuynRA4~V|y%J{v>$CoIkX*yIXveIsRIeG`)$e~Iptc`Y+u_1C-uMbKqOV5MBZq*6^ zQBzZBOYp>2J6dQ4KL4`WR&`3B6iO96vbBf5ol`HQ;jQzGYmvrKj$M=PqGBMpZC697 za@<`EL6ow>S_ly;qbO1z`1`gD+mnjUZPIC(7pDgm12d|jug$P-cBJ!OY_)am{i+BSeT5oak)T84#ijjRaQMjAWw8zF_K~-n>TOiy_^upqPgV3k0PXO;j$7*!@G23J^gHu=4FbFy1&!(xwoeLg1~LcMUVN|i7V0+ zdzSLsUirUT&$KDo+di*&O?vxoWzTYJ%FpNPx%O_6^qwRkaNaCiFZOFhhwm$jTeO0s zH_Ha~hF>FF{YX)q7ustX>A?INy_+8^is$$-Id7Kj74y0!zrW!n%}eU{Xm7~)-=CkY zxAqmy-=%|CYFh91I=$0g)BH=Rk{+#hSJtzrMS4d=xjt?`uG5?UhE_-RPC(dS-iVZbR{k?oGX6hmD~T^`22iOLcX1v)+FJ*sB%K diff --git a/build/OSDev_18/kernel.iso b/build/OSDev_18/kernel.iso index fac34b2f7b1c3e4737aeb4671a5e07459450cc85..61a090bd673b6fdd24a821bee9b9d8308aea8437 100644 GIT binary patch delta 6493 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 lnh6+j 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 ui|=QTGD)wz$V%e%9{Y)nSsz|!7 -#include -#include +#ifndef KERNEL_TERMINAL_H +#define KERNEL_TERMINAL_H + #include +#include -const size_t VGA_HEIGHT = 25; -const size_t VGA_WIDTH = 80; +enum vga_colour{ + VGA_COLOR_BLACK = 0, + VGA_COLOR_BLUE = 1, + VGA_COLOR_GREEN = 2, + VGA_COLOR_CYAN = 3, + VGA_COLOR_RED = 4, + VGA_COLOR_MAGENTA = 5, + VGA_COLOR_BROWN = 6, + VGA_COLOR_LIGHT_GREY = 7, + VGA_COLOR_DARK_GREY = 8, + VGA_COLOR_LIGHT_BLUE = 9, + VGA_COLOR_LIGHT_GREEN = 10, + VGA_COLOR_LIGHT_CYAN = 11, + VGA_COLOR_LIGHT_RED = 12, + VGA_COLOR_LIGHT_MAGENTA = 13, + VGA_COLOR_LIGHT_BROWN = 14, + VGA_COLOR_WHITE = 15, +}; -static uint16_t* terminalBuffer = (uint16_t*) 0xB8000; +uint8_t vgaEntryColour(enum vga_colour fg, enum vga_colour bg); +uint16_t vgaEntry(unsigned char uc, uint8_t color); +void terminalEntryAt(char c, uint8_t colour, size_t x, size_t y); +void terminalInitialize(void); +void terminalSetColour(uint8_t colour); +void terminalPutChar(char c); +void terminalWrite(const char* data, size_t size); +void terminalWriteString(const char* data); - -void terminalEntryAt(char c, uint8_t colour, size_t x, size_t y){ - size_t index = y * VGA_WIDTH + x; - terminalBuffer[index] = vgaEntry(c, colour); -} \ No newline at end of file +#endif \ No newline at end of file diff --git a/src/OSDev_18/src/kernel.c b/src/OSDev_18/src/kernel.c index ab9c143..14afe40 100644 --- a/src/OSDev_18/src/kernel.c +++ b/src/OSDev_18/src/kernel.c @@ -1,6 +1,10 @@ #include +#include void main(void) { + terminalInitialize(); + terminalWriteString("Hello, World!\n"); + for (;;) { __asm__ volatile ("hlt"); } diff --git a/src/OSDev_18/src/terminal.c b/src/OSDev_18/src/terminal.c new file mode 100644 index 0000000..1dc1bb7 --- /dev/null +++ b/src/OSDev_18/src/terminal.c @@ -0,0 +1,78 @@ +#include + +const size_t VGA_HEIGHT = 25; +const size_t VGA_WIDTH = 80; + +static size_t terminal_row; +static size_t terminal_column; + +static uint8_t terminal_colour; +static uint16_t* terminal_buffer = (uint16_t*) 0xB8000; + +// Builds the colour byte +uint8_t vgaEntryColour(enum vga_colour fg, enum vga_colour bg) { + return fg | bg << 4; +} + +// Builds the full cell +uint16_t vgaEntry(unsigned char uc, uint8_t color) { + return (uint16_t) uc | (uint16_t) color << 8; +} + +void terminalEntryAt(char c, uint8_t colour, size_t x, size_t y){ + size_t index = y * VGA_WIDTH + x; + terminal_buffer[index] = vgaEntry(c, colour); +} + +void terminalInitialize(void) { + terminal_row = 0; + terminal_column = 0; + terminal_colour = vgaEntryColour(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK); + terminal_buffer = (uint16_t*) 0xB8000; + + for (size_t y = 0; y < VGA_HEIGHT; y++) { + for (size_t x = 0; x < VGA_WIDTH; x++) { + terminalEntryAt(' ', terminal_colour, x, y); + } + } +} + +void terminalSetColour(uint8_t colour) { + terminal_colour = colour; +} + +void terminalPutChar(char c) { + if (c == '\n') { + terminal_column = 0; + terminal_row++; + return; + } + terminalEntryAt(c, terminal_colour,terminal_column, terminal_row); + terminal_column++; + + if (terminal_column == VGA_WIDTH) { + terminal_column = 0; + terminal_row++; + } + + if (terminal_row == VGA_HEIGHT) { + terminal_row = 0; + } +} + +void terminalWrite(const char* data, size_t size) { + for (size_t i = 0; i < size; i++) { + terminalPutChar(data[i]); + } +} + +void terminalWriteString(const char* data) { + size_t len = 0; + + while (data[len] != '\0') { + len++; + } + + terminalWrite(data, len); +} +