From 2b05b8b74fb4fca02b7ef42e6cd7cf36d20d8600 Mon Sep 17 00:00:00 2001 From: xamidev Date: Sun, 7 Jul 2024 10:08:25 +0200 Subject: [PATCH] Fixed printf x86_div64_32 and testing --- bochsrc.txt | 2 +- io.s | 34 ++++++++++++++++++++++------------ iso/boot/kernel.elf | Bin 10320 -> 14400 bytes kernel.elf | Bin 10320 -> 14400 bytes kmain.c | 22 +++++++++++++++++++++- os.iso | Bin 487424 -> 491520 bytes 6 files changed, 44 insertions(+), 14 deletions(-) diff --git a/bochsrc.txt b/bochsrc.txt index fe783a2..9783490 100644 --- a/bochsrc.txt +++ b/bochsrc.txt @@ -1,5 +1,5 @@ megs: 32 -display_library: sdl2 +display_library: x romimage: file=/usr/share/bochs/BIOS-bochs-legacy vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest ata0-master: type=cdrom, path=os.iso, status=inserted diff --git a/io.s b/io.s index bb131d9..b677e49 100644 --- a/io.s +++ b/io.s @@ -16,19 +16,29 @@ inb: global x86_div64_32 x86_div64_32: - mov eax, [bp+8] - mov ecx, [bp+12] - xor edx, edx - div ecx + push ebp + mov ebp, esp - mov bx, [bp+16] - mov [bx+4], eax + ; Arguments: + ; [ebp + 8] - lower 32 bits of dividend (uint32_t) + ; [ebp + 12] - upper 32 bits of dividend (uint32_t) + ; [ebp + 16] - divisor (uint32_t) + ; [ebp + 20] - pointer to quotient (uint64_t*) + ; [ebp + 24] - pointer to remainder (uint32_t*) - mov eax, [bp+4] - div ecx + mov eax, [ebp + 8] + mov edx, [ebp + 12] - mov [bx], eax - mov bx, [bp+18] - mov [bx], edx + mov ecx, [ebp + 16] - ret + div ecx + mov esi, [ebp + 20] + mov [esi], eax + + mov dword [esi + 4], 0 + + mov esi, [ebp + 24] + mov [esi], edx + + pop ebp + ret \ No newline at end of file diff --git a/iso/boot/kernel.elf b/iso/boot/kernel.elf index a1339134860d6110359e6abbe13fef65ce43e872..5315e60523c9d818b31fbe73fba136bf67ff0b22 100755 GIT binary patch delta 3166 zcma)8e^3eki07CX(t;j27!-<}N+-;P z*~WNTZ-RX`X`E@BG|t3!Mp6qk#H0>#3R9<8WMgfq|X6r^Tq-8I#maqh(}Nx=~{}FWrzsMxRsjssXt& z#JtsprQprebX(H`vP-8|F49KNH|I}(;kkF2xoXz;QWp1kPi5-8%K`a-PS3~b{uGH< z8W#Q>bosB>%b|3&)67y$MyiTr_KyrXiIot`+arpL=f<1;(jAs)vgdEmRzIXCgdAxg zAzA=Sn13V8Sl*HDSk4YZ!Rfie zpv_L7O*xhjLOo4CwPC|bvs0HO3^Tlw;XL|Ss>P=;Twr4{^L}YzvUN zq}gpwwM)}9`66#QKh84Vy0GE`laf9|e5A zC&q*-_o%uFHEKfrUnY3p%m@A%_ID8l35BCLPNv^Ce*28+Fn+kdD`AK=;N%1BSh0jH4AKv?voaoldDGh&EJ3s9E`UF%{){eUXYb`NIvj*s0kNj&kxL)(P?^o!b)O zN_4JH=hjBJG@W}==az-JK2VyMS5w1K7ihXgrJQQtp~k%}d)x<*2HEUxYik#a_Lqs> z?Ow65(=8V55xd=uo%_Z1wmo9wzCEI+@qo^DbhbCOx%cib7Z0`{6pM;*gb}jeyW1n~ z^X_eOcZx;cBpvSdGr)zX1 zkv?`_v7?EdLZ#O=?J11o7-ul9V4VI+)8_uqkp;QN|CD`HSN<O~16|8wS6lc3URRwe!s% ze5Yv*Xqs4uaW2E9Ak>zFJ_)V(Sxp;Yow^v5bU02n#+~AVHKR4UefHtT+I0RjCuWPUwQ@7V3}9az3M zPpx^@_&zLW=IMiZV`pB^wNOsXNdLhTt`*|y%JS9atHlaOMWthHMFo9Otnz(o!d*sx zID*51+>O7FbAZcZ_C?@lVsH`gFJf>h@E>FFD&R9Q_SnrTHwLdKq=L9(h-wIY5`!NF zULS)u11ogdvX^}_E^6V&NZw)#$0EkRxR}RCZfk?UMs{Vx!=cG9WA5Mt0{0{p%*U8r zi2|99;4d&AOcKZ=5j=_cdp@i$K>iy-d?am&Ku$*l{)PEdqd-`XFoW~JRS5!N{lIWP z=GU>m=#U3CKOzv;11W?j$-r%qgi;N0q!9R|K|pcB`YVC^%!~3IS;zUXgN(uk;>kl0 z_$@M8RHy|$8l&(8@ZYij%ZS14z*pgbeFiMRUBI4b00#17;Hj954*+jLMOZ5``6E6M zhhU&ALi7P2k8$`4@J%9+!;$^p0FT58gq4;VcnkO)7<@W{S*6(Bn>{S8bHIE|g@%FI z4*Tqxe(@-X0=%=uj6VQ&z(5KFQXp^z*pN8zals!92G3G@xY(Y^67=8-Xrwh_8XYb+ zC$gHiMH#i&9Nz(^!$#+e^AnF?c?6rkr$r^ANknW8`dCQ;TNxd+6Dzcw;Gic;N{kLd fa_FU!0z;XD-Yh9L{ACSIU0!VJUrWe~%-g>K)~-MS delta 2960 zcma)8eN5cu9e(Zefq{cFA0Y`JhsQ@!vOqbKK=ZK_I-D_SG)I~Xids^QH9%29n+z&3 zi5|#JgX`W#@}g~RMKqsv7|e`pE1#)L?SIxBWKg6h8IXw+x)Cxf^lF^&(aFPq#^i!(CevLhp? z1{mAX8dOi1;zthCL{~(;Ir96EU;F$SbvDaLGozeF6kTy?*RS}Hiu*!%4fMEhtEMcl z7-{Vjur@xWp7dO0JTV^IZSj{a#{Fw$!96+#17G_`O#h6<53U4MX9Xjeg4$Ev^wspo z6PwunuW9r`M!`DWFAYe8&GEeQA?pwQB#q9bpGq7+X-<(T=Fl@4DT&W9Je3Mu9@xnC z=TcezqNYS(hI)IesMbbmxwmiGCKu4pu>-Voi_!g_|B|n9pV4CJsmc;(wrIPubo?DviE!Ch)+5+2mOfZ z%G6t$GOYQ}&q$`u`!IweV^l>H?!F1w*K2bzsrF8qE+*qHCjXZUF);Hj)4>+z-zTs% z!kT|V?VTV!>5I)_)jvTNn;AL4G99evw1#PSV00+64ox1|@4RT4X&>}GAljd_aNj)9#>efVYd8ijpK<4*`P|f_)12BnO?sw~ zYw+;=vxlB<4!u!VEVkMAClU%ZwMfT#d~d9 zB4aYzw6*MvsI!tWhBM}@Nu=KOn*$p5{h?HL;Ba0^`@h-wv*ww`{i`6W}wNtr})_vdK{oncO#H z+(wgo(d4$pxJ;8f7NOtIE#SWwp%-#@2kH+WIr0+O^V0F7-|p%<{K5{oq(m5tAC_If4=j=ZC*$-WUVE+5q^6=XhXj(x|U^5KPLfE+!jo!i6$7#<2gduE?EmMy?PPvLT#r~G=&aQ6R>n-0}UQy=lHlg>`%F6PJt)(%VZmOsX z9CYH}-@G`IjkPyn73Ttv2&-5I{@8{~fY;gVHvw<6;m3i!Hh=6}jQ=CsC6Ig3_kacVk%NoF*x$lBi!UIA zCmCRFW1SHt!X5y_A7f2TmPkzu&tTOdXO{%|zX%DCpF!alAeg~@tOwDTW;_Fi9|Dh} z3^p|kk6@J{UkNC(DXEYMo04=Qk~HAgVg+UJ4pPkYc?r$2?8|_MQ&#jj@&p%v1Ql5h z639*{lyIvCb--tB22TSwL4GFYa6j-q1elBAXMy|T3Gn0?!?ucF0scplM9O3O0|5~8 zaLCRGt8ftbye;4lfm_k6*JJXZ0zc)D%+@mfbHEMg;BztgC1Cco$}U#c`@o{DLu0^9 z!d?W-e#1==SCQdLi~a~)4+rT`NQc5lz^BDa*SGwN=lfjrl`2mXE3gj-QlQ?7OnR}( zmBf1fTAZ1zawQCa8OWpmtSU@;7u$Cse2=cFmYr;TWV)lei0uTKwqPeqM3U(n)f?H@ f(pTx_>LPxZOz%{0;HQcx|HKC8H5`zWEZTnndCB6P diff --git a/kernel.elf b/kernel.elf index a1339134860d6110359e6abbe13fef65ce43e872..5315e60523c9d818b31fbe73fba136bf67ff0b22 100755 GIT binary patch delta 3166 zcma)8e^3eki07CX(t;j27!-<}N+-;P z*~WNTZ-RX`X`E@BG|t3!Mp6qk#H0>#3R9<8WMgfq|X6r^Tq-8I#maqh(}Nx=~{}FWrzsMxRsjssXt& z#JtsprQprebX(H`vP-8|F49KNH|I}(;kkF2xoXz;QWp1kPi5-8%K`a-PS3~b{uGH< z8W#Q>bosB>%b|3&)67y$MyiTr_KyrXiIot`+arpL=f<1;(jAs)vgdEmRzIXCgdAxg zAzA=Sn13V8Sl*HDSk4YZ!Rfie zpv_L7O*xhjLOo4CwPC|bvs0HO3^Tlw;XL|Ss>P=;Twr4{^L}YzvUN zq}gpwwM)}9`66#QKh84Vy0GE`laf9|e5A zC&q*-_o%uFHEKfrUnY3p%m@A%_ID8l35BCLPNv^Ce*28+Fn+kdD`AK=;N%1BSh0jH4AKv?voaoldDGh&EJ3s9E`UF%{){eUXYb`NIvj*s0kNj&kxL)(P?^o!b)O zN_4JH=hjBJG@W}==az-JK2VyMS5w1K7ihXgrJQQtp~k%}d)x<*2HEUxYik#a_Lqs> z?Ow65(=8V55xd=uo%_Z1wmo9wzCEI+@qo^DbhbCOx%cib7Z0`{6pM;*gb}jeyW1n~ z^X_eOcZx;cBpvSdGr)zX1 zkv?`_v7?EdLZ#O=?J11o7-ul9V4VI+)8_uqkp;QN|CD`HSN<O~16|8wS6lc3URRwe!s% ze5Yv*Xqs4uaW2E9Ak>zFJ_)V(Sxp;Yow^v5bU02n#+~AVHKR4UefHtT+I0RjCuWPUwQ@7V3}9az3M zPpx^@_&zLW=IMiZV`pB^wNOsXNdLhTt`*|y%JS9atHlaOMWthHMFo9Otnz(o!d*sx zID*51+>O7FbAZcZ_C?@lVsH`gFJf>h@E>FFD&R9Q_SnrTHwLdKq=L9(h-wIY5`!NF zULS)u11ogdvX^}_E^6V&NZw)#$0EkRxR}RCZfk?UMs{Vx!=cG9WA5Mt0{0{p%*U8r zi2|99;4d&AOcKZ=5j=_cdp@i$K>iy-d?am&Ku$*l{)PEdqd-`XFoW~JRS5!N{lIWP z=GU>m=#U3CKOzv;11W?j$-r%qgi;N0q!9R|K|pcB`YVC^%!~3IS;zUXgN(uk;>kl0 z_$@M8RHy|$8l&(8@ZYij%ZS14z*pgbeFiMRUBI4b00#17;Hj954*+jLMOZ5``6E6M zhhU&ALi7P2k8$`4@J%9+!;$^p0FT58gq4;VcnkO)7<@W{S*6(Bn>{S8bHIE|g@%FI z4*Tqxe(@-X0=%=uj6VQ&z(5KFQXp^z*pN8zals!92G3G@xY(Y^67=8-Xrwh_8XYb+ zC$gHiMH#i&9Nz(^!$#+e^AnF?c?6rkr$r^ANknW8`dCQ;TNxd+6Dzcw;Gic;N{kLd fa_FU!0z;XD-Yh9L{ACSIU0!VJUrWe~%-g>K)~-MS delta 2960 zcma)8eN5cu9e(Zefq{cFA0Y`JhsQ@!vOqbKK=ZK_I-D_SG)I~Xids^QH9%29n+z&3 zi5|#JgX`W#@}g~RMKqsv7|e`pE1#)L?SIxBWKg6h8IXw+x)Cxf^lF^&(aFPq#^i!(CevLhp? z1{mAX8dOi1;zthCL{~(;Ir96EU;F$SbvDaLGozeF6kTy?*RS}Hiu*!%4fMEhtEMcl z7-{Vjur@xWp7dO0JTV^IZSj{a#{Fw$!96+#17G_`O#h6<53U4MX9Xjeg4$Ev^wspo z6PwunuW9r`M!`DWFAYe8&GEeQA?pwQB#q9bpGq7+X-<(T=Fl@4DT&W9Je3Mu9@xnC z=TcezqNYS(hI)IesMbbmxwmiGCKu4pu>-Voi_!g_|B|n9pV4CJsmc;(wrIPubo?DviE!Ch)+5+2mOfZ z%G6t$GOYQ}&q$`u`!IweV^l>H?!F1w*K2bzsrF8qE+*qHCjXZUF);Hj)4>+z-zTs% z!kT|V?VTV!>5I)_)jvTNn;AL4G99evw1#PSV00+64ox1|@4RT4X&>}GAljd_aNj)9#>efVYd8ijpK<4*`P|f_)12BnO?sw~ zYw+;=vxlB<4!u!VEVkMAClU%ZwMfT#d~d9 zB4aYzw6*MvsI!tWhBM}@Nu=KOn*$p5{h?HL;Ba0^`@h-wv*ww`{i`6W}wNtr})_vdK{oncO#H z+(wgo(d4$pxJ;8f7NOtIE#SWwp%-#@2kH+WIr0+O^V0F7-|p%<{K5{oq(m5tAC_If4=j=ZC*$-WUVE+5q^6=XhXj(x|U^5KPLfE+!jo!i6$7#<2gduE?EmMy?PPvLT#r~G=&aQ6R>n-0}UQy=lHlg>`%F6PJt)(%VZmOsX z9CYH}-@G`IjkPyn73Ttv2&-5I{@8{~fY;gVHvw<6;m3i!Hh=6}jQ=CsC6Ig3_kacVk%NoF*x$lBi!UIA zCmCRFW1SHt!X5y_A7f2TmPkzu&tTOdXO{%|zX%DCpF!alAeg~@tOwDTW;_Fi9|Dh} z3^p|kk6@J{UkNC(DXEYMo04=Qk~HAgVg+UJ4pPkYc?r$2?8|_MQ&#jj@&p%v1Ql5h z639*{lyIvCb--tB22TSwL4GFYa6j-q1elBAXMy|T3Gn0?!?ucF0scplM9O3O0|5~8 zaLCRGt8ftbye;4lfm_k6*JJXZ0zc)D%+@mfbHEMg;BztgC1Cco$}U#c`@o{DLu0^9 z!d?W-e#1==SCQdLi~a~)4+rT`NQc5lz^BDa*SGwN=lfjrl`2mXE3gj-QlQ?7OnR}( zmBf1fTAZ1zawQCa8OWpmtSU@;7u$Cse2=cFmYr;TWV)lei0uTKwqPeqM3U(n)f?H@ f(pTx_>LPxZOz%{0;HQcx|HKC8H5`zWEZTnndCB6P diff --git a/kmain.c b/kmain.c index 9e75d2b..8cd6cef 100644 --- a/kmain.c +++ b/kmain.c @@ -3,11 +3,31 @@ int kmain(int retvalue) { + + // serial testing + init_serial(); log("serial connection established", 3); log("Kernel started", 2); clear(); - printf("Formatted: %% %c %s %d\n", 'f', "Hello", 77); + + // printf testing + + int age = 34; + int problems = 124; + char* name = "xamidev"; + + printf("Hello %s, you are %d years old and have %d problems. wow %%\n", name, age, problems); + + long suchwow = 2934342; + char character = 65; + printf("such number %u\nsuch character %c", suchwow, character); + + printf("wow negative %d\n", -3742); + printf("such hex %x %X\n", 0xcafe, 0xdeadbeef); + + printf("such pointer %p\n", (void*)0xcafe1234); + return retvalue; } diff --git a/os.iso b/os.iso index 3af65aca4e9ff83e7e87501d0c9ce7213aaa2f34..6c0640a01768c23841b6f07e9b7b96fc813349d7 100644 GIT binary patch delta 4589 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 C+*M%! delta 4140 zcma)84Nw%<9e?}o4i-4LRZ$U7Jo!+uf^Z70A2niFV`qvU=t&)enbHX8D2Ws@p%c72 z*Whh7*AkEEs}bur(vDTEikLQto)NUu4mzZzmPyGZnK=tFIwDd*um87uA4{Z8c39r~ z{oeok{omfR+Y{`4Gny@S_8yX-dmk_+_uKaGN9*Ea(hV#|h=IRzJB8hhd-?7`W0pBP zGi#A~VRl9aYtAq)%1{yRHNw;=6+ZW-P#1fIV~-v-Epeha#X%fm>4Zh^jPbyrb(V0Z z?Hg23pko}CpCmI+bEsU-Q}>b1xUK6~#WOK}4SC>LKYE!rGSjIfLjD1vuNC}t$#_l; z^O6H;F-*|g4#nFJxA8`tIpB?of*aLAl*T$2~Upwfz};xSvV-i+r%wxfK-e7OQF`sUR zgOZM??z6Yzo~vi-;=sIuQUxSr#7N@$Bh&8M#C3)%*~g9>R%2o+{4 zW47E^?uT8eknedV-}5xzZ(A`K7X%K>9yCKyo?&ia;A}UTY1L8}yWhUG;9FKgRST4h zm8%BmERz+syQigxiEECm*K=qQ*jzoEBsy_o!g>Qj^wm*6ocskr$VBG=I8yAy^O*39 zE+?)w*tFhCJ#3O^805X(@M#bR*lik@P%z^2S-g%&Ag*zg!!F@XncJao-boPrwuvsm zM%is8F5z8y`I$ymk$6@r8olAMieIf024cN2vX_0}MdJ11)m96HV>r__8RVF*5|JOG zK4QwcLEHNUN!X94^Bv(q=LTirg2EUs@ zKVA@CNWnj1$e9oE%s9!)Ik~!`U}!U7(cw7~L;CmQ55k?0o{p788h5T6<$a}VMH z+&*$~%5QNJGpld|?E7}_pP>mIo)zF+;yEW@-@$(geSxNEv}=wRhhKXs=P3=n-mqWD`9>6Fo07 z!P@$NEE`xz?OU`oj4sjIE!1?Q>IsjFx&&)CdR){UwALkAyZs@>gjDN`oqV*81aLpuHk4t=?Yc(V0^%-m}^^t$o*Xbvz=PuS7N2sM4Ex))+~Z5iCO`L!a?d%4MMiL^dhd(TrMErD^sQ!1@uOQkjX%-fG2 zl$1)Fxl-{JEs)yB4@$*w%1kU3r_uu>3~=6dIC8ob;Ux12o^KNYI6Tqx0Kx%AW&fq; zQ8@whvr%S;q{~Jq`I_A8^0!1&HcXkk5aU-|8e%kxR%(zb>!7BdP{r6Fxnf&X*(jxO zklL1@F!$x&mV-D=HD#Co3XpmQ|D70*V&mG=3f&5FDDV-1_SJg#!v#z?EsSQTFMA4( zM347dTcqUCzm&F*uvzAQ+mkia@Htafn0uNWjMn7}8oZgboxq7qIr;nqPQqOe$-PEAg%}$#%iJX?jd&(ALik4b8dZ|5 z6xoRgL*hP2_P*K{9{5DB)yhAS%V1B6ACa4lI1w9%sKErBHAG@g;&|J9&^Zq4<-+wslKB!*L6((sQPER0E+DV2H(sB|fgjrxdZG_yR^GcX!jgV&$a9BOecaD&RCfq@o zRy;Y`T3l6LS!K%1Okb3qk(OB{!^~Y~b9%<2R6k9ccj3w8rB*!4wowNc2Kiyo6c}s5 zLYQ9mPisTi1o$%*P5~UJ(w_%7ONAEz&Q#f>7nlas`eKC4=qnYm90Uqg3NHh`q*`AM zIEqZTgnwl_02du$Eqo;9=lA+=OueZcX4HO$6pPjQuQ! z=w?v-8H~}999rSW{V+w!gmEJjrU*8J;wOMxAP?F>6rYCC z1nU8ZEbW*K4$+R80QdG7z#s({pkzybWEd_xT zCZv!H__#`84d6mpKj=5O9&iCTxbMfC0NaBBV6>BBRmN`t{&xh2(*5#I8xVtFke(Ns zVIAO8Du=%YTmr?a^{*cVyi&u-rKR#G0p~#lU-hq_15EF@^r2~e1ejG-s2wm}q2C9p zKl?fmmmtDGiT(-7q^JMa6Y|_y-GLa>haT1+sO{ADkO&sD((x^RkzEo=Ujgm^;fggx7ZB+D=Vvr?$3J*Vq}> F`ah3N$w~kK