From 2df6e24d0516af0336dfb0d8e4807f06eac1b38c Mon Sep 17 00:00:00 2001 From: Arthur Beck Date: Sat, 25 Jan 2025 10:57:17 -0600 Subject: [PATCH] Outputting to the screen via the t(level) class of functions now works --- kernel/config.aphro.example | 4 +- kernel/grub/boot/aphrodite.kernel | Bin 32544 -> 33976 bytes kernel/grub/boot/grub/grub.cfg | 4 +- kernel/kernel.flat | Bin 32544 -> 33976 bytes kernel/src/include/arch/x86/egatext.rs | 20 +++- kernel/src/include/arch/x86/output.rs | 135 +++++++++++++++++++++++++ kernel/src/internal/arch/x86/entry.rs | 11 +- 7 files changed, 164 insertions(+), 10 deletions(-) diff --git a/kernel/config.aphro.example b/kernel/config.aphro.example index 3f2e4ec..a91c120 100644 --- a/kernel/config.aphro.example +++ b/kernel/config.aphro.example @@ -1,5 +1,5 @@ -# config.aphro for aphrodite devel-461136c-out-of-tree -CFG_VERSION=devel-461136c-out-of-tree +# config.aphro for aphrodite devel-bc19d1a-out-of-tree +CFG_VERSION=devel-bc19d1a-out-of-tree CONT_WITH_DIFFERENT_VERSION=false # Begin metadata diff --git a/kernel/grub/boot/aphrodite.kernel b/kernel/grub/boot/aphrodite.kernel index 4158efc10185a5adab070bd2ce3399ed74628b93..be1bb802da13cdfa796ad74b342fc139626c6095 100755 GIT binary patch delta 11034 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 delta 10131 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 delta 10131 zcmb7}3wRVow#U0CLzuw8OvsP~j4+S}VhkaZ7YPIej7fkjB+3#D2njDSHxOjOCpdx0 z>`l}3{eneY-EX~$my0j1x<(PbK0r`|f&#J$-!AOJ`k-TgkFe-PMCblb&(x%FGqBe8 zb-L=*uTGt+I(4dgvP-o*{gd33=^L z5;qcyb@^MKap_SkBeBSPN5yR4nOO$)ch~w4vPMXf`eX?T6V!$6xeotfSfV~@hd|el z9SH<#23M+`#^qQ^()=XVocd}dMeQir&7cXzi4X|?&jcRDs~K<809HGwYe9m@DVvg!Wl&jSIqP_gU& zfx(|*7P@vC$RErhc*j6fgCH6 zBZy2>d_URlAE`CG{+bu_BO8H}=*8;$-saeF7^|-r+f+Y!RmXqBflyUi)7w-$3C5vV zQWI+yJt&53H*NZ~k6@FF*fb@y5*-ymP3XkwXqbUQ$GhlB8)^3Iax@f>C4X)mKkrO{u2T%&)-kAVQnNveNRu%=A)7b3S2x*Pp@!JM*gsLpso$LEcl4t*9&k@7g-A`zn{v8Y9n`r$E54Cy=xGPtx#8l@xaP#zC%T z1Er47F(JDD(p41_nsjXcr;6C-5>#}q)%~pk9@~5frOw-Re+Fu~_Soh;VpDYgNqVzFpAS`qDVmsVuQOVJ*2YAalhokfW#+3_BPccSK-1j~?f z>RJiST3n^^97d;hsqlUEvJr(~ThnI&%9o7`G;D1yVXjJJy_bsSw5hd*!$8a_lS;&@}C{m{m^7hU}t~BPLBDCC>jTW5h z!6R-P?L8>)wW1$u$YTf3JcN>Ql%~pe64}nXO~!@ItVZ_PLORWm1V|jI3he}YpnA%gqO$X zLxtW%oni59dcB2m@Nv%(T8mlvIE_{<$cNLes&ed%Qs==hesH{eB5EGa#>0-6aU?q4 z*xgTpPb^ifgY+pf)^?uawdNml{BF-Km@PSq_d=2=AN;>#`YellYv;4Oq*LGa@)@#Y z!$&Z!sq^BSfq*1+_IvXuyxdF4&WAIP#1I8 z?>%$_nwDF&$#&mmc{N)9~H!vDtli7YF5q~)8zY;N)>%Y}B< zklbWB-_GI{HP{g;C2UaV2X0^RxH#Sb$ALTU( zT9I4V>f4!bM5^VnME3HC1#w#up6{4lrnZ_r&R_qblE{XQtcV{=a=O5|)I;2uHxk%? zjJ)lJKV!~(``j>hukKq3C-dx|il|a%?6tCUBjcUHAtdrv8EoUIw=8cRYbi=emo0y7 zXZPJS&a%eBUcISkY{)sYaCHf`vh!BYq7y_I1slq(<8F0Im9^X4*ipK6q>YV9P0Ad2 z242bjg1Jz;$|`F58Z&U$!({5d%&)2D>tKzJTUl96%$zbKovlk9<>)l0r?anC;?~(W z?W`p=)p9(J{Vg@cvPNbxH*fHs2cg*&wR3h^jm7waBG*+*glSRR)X%u30c<>7t0A?v zO5^uGz#h7JZbpWt=x6ldtLR!zFG41CY)>^?aqZ85H;TGzp%9Cb(Y+|^0pJ)YP`_6D zV{2Pg86&o-HeLIe4INz|r?PpYCk(g%^OmZGY5g56TM>6 z$K5am%V5m^HV_D{p!zAdBBf=1`a7~*(~^|&D_KrrHJ+*R5%!wrK6x&?IkPJMGENAS zy#u!KMqjb5nSjR z&~o&;Z4|C{c%rc;Yal;}24nGl7-bwc(oVc_kVsov9=v68w4Bd|6=kxsw@qM5$v}2! zvYYKH%9it3*A$O8*CVB`s#{#Wx;j0*w0cF|iu8q9*^3utXH_q*UXq!;D7QL$>5|;B z)%i;n<>cmMF0Rf>|K%-mBKF~p)Jbl{CXrf<{lzUj9?AQQ2cP%LyUCB-B);c4W?dz5 z?&~cCQ>MCSUk^&p{N?kKna7;dJT0G0eY01~pJz^x+1c{mY*qOStfC^R<)Pc>^n>rn z3**`E3*DBSES_aCRrzvmxHP#cpS@a@Cuf8u!>aRTq6ZGYuF=$J;PodUP@QmnU7kl5 z#$R7m*}TN$>zd`sCcFLxF6Upf|LMCDuW#ACa}(K9i-xx}E;=2>`YjvRQnGBdm3>+3 zVuxz&y=Ehv&1RnE3G7m>J*En!Duk*c)^GU@UWzZcqtr$>#i%^w`s>}!~=);Mtpm;wX9IOf_-qki1 zyCROc>RhqyLW?T2sA92o39)@}aBw{o_gAs%x`apT>|P4`o1v5fKTllg%1|S7!N6?? zhjS;Kh@%5(ouK?(aPNYH72(A7y&`ZQfcwCOgQX|%3jsU;@BkEYC8U+-6EN$PrwKj? z?jResA|ZczNJ?hY8FmS+-N^GqE!=qS6k5}-M~Q6f%7j>5kkUby$~>zQ58Qb3h#3a>c>!h>`nMg<5CZ#9@Yh2cL~yLNV83LvmnidG?#6@HzD=|K}whHu_pVy zAkBv~-(*MQ!;kki4$^TZOTQCxX#u1KB+YLYq!S^Xh?Q>TQ-L?NptN7$qT%4tY&}~4 zC`z$Z(fEOwj&`1SYx;eV_f5zB!|d>?1n&|-x&_iLXg!=a#hbT&BE->((IsIgxSvM` zDnBdeGk>NA2T?d-vCZ^)kn@_3aTE%V0;KOZo;dhkNFl~+{+LcbpkKiP^TfFi1nvxC z%$Z@5w1h)=^MQ=PCkN$8U-A3v}3JpVEH zjf!_X1S>pb1b#q3|KY@S7YSe^z(#Gt|WO3!}SC~(!dHCEpwNheKp!9QHzS%I63<6&~DB&A=?1;;-coR z9yk=|tngB6T7=_C;Nro>gWJumf?l3AI7j1eyAjW5T+&!UvOf2W#6u36TgtnZX^<^NEdU?ke0bT?MhYcsL@F{?tb7QFP zTsUHw>hAc2z!ick1XsnCfalqfh%F&~Uh|7|+gM4uy$6Mlb%W+t>v!PVxE4X-L4iAf zV00i~l4^U<=RmLubu8r}CghF7{QG+Vrwiaa0N)uG{7HbL+=e*<_ddAy!C^y%6X&)F zTo<@5u8-EA5(l@2z$nPfe***Lb;R-0?y$gJfx;``a3c#R&e;YB+mk*kf}0f{=nPX> ze-2I(Ko>w4z@8L7AaF_Gl76O;>w87u(!izltj{YM0+3OGWzDf?Er&ry0x>xCSr4h6oB*3g8xS zTOx4J3EVbt+ah#)Qs8!g+X2oiIs;$3L>x$bByR(JJA%S8f!haeUjzdi1@0)gqupH4 z|9Qu|1@KFNUv`70&vNdPz+D7)F#?x?Fv~~XOaNT~T>yJpyQc*% z30%@YDKzbrjtN{ExU>kI(>t`=!UBK=5jrjrxI%D+5fs)7+$?ajBIw%{;=HE!1DqE@ z;dwz}Ex6hU+$eYVK-Pj=8-bfIaGTOF|C=I!j|t!(pzse7xK9Oc2e=&(xaeWs2EGmM zZIkm#;l!P5q5vKMcp!qp`vmSdxZ@GHmjvz%xHBSGi|%>Hrv>l|z$+psaBf^WWRz*? z?6^1DCtUr_&-L9Ya0)nuO@25b_EABa4QVzTwk{#|6G2)4X#ufbYjSr_rI41QCp&uO ziTBhG9Bmh}Xb!kJ;CLOeJU?FG=3RrkC&*Qr3ahRGJ}xL+d=2g+fm=o#>v|}``<) Result<(), crate::Error<'static>> { + pub fn write_str(self, pos: (u32, u32), str: &str, color: u8) -> Result<(u32, u32), crate::Error<'static>> { let (mut x, mut y) = pos; for char in str.as_bytes() { self.write_char((x, y), *char, color)?; x += 1; - if x>self.width { + while x>self.width { x -= self.width; y += 1; } } - Ok(()) + Ok((x, y)) + } + + /// Writes a &\[u8] to the screen. + pub fn write_bytes(self, pos: (u32, u32), str: &[u8], color: u8) -> Result<(u32, u32), crate::Error<'static>> { + let (mut x, mut y) = pos; + for char in str { + self.write_char((x, y), *char, color)?; + x += 1; + while x>self.width { + x -= self.width; + y += 1; + } + } + Ok((x, y)) } } \ No newline at end of file diff --git a/kernel/src/include/arch/x86/output.rs b/kernel/src/include/arch/x86/output.rs index 4ccdddf..95e046f 100644 --- a/kernel/src/include/arch/x86/output.rs +++ b/kernel/src/include/arch/x86/output.rs @@ -2,9 +2,12 @@ #![cfg(any(target_arch = "x86"))] use super::ports; +use super::egatext::*; use paste::paste; +static mut OUTPUT_TERM_POSITION: (u32, u32) = (0, 0); + macro_rules! message_funcs { ($func_name:ident, $prefix:literal, $level:ident) => { paste! { @@ -94,6 +97,138 @@ macro_rules! message_funcs { } ports::outb(super::DEBUG_PORT, s); } + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////// + + + /// Outputs a $func_name message &str to the terminal. + pub fn [< t $func_name s >](s: &str, info: FramebufferInfo) -> Result<(), crate::Error<'static>> { + unsafe { + if cfg!($level = "false") { + return Ok(()); + } + OUTPUT_TERM_POSITION = info.write_str(OUTPUT_TERM_POSITION, $prefix, WHITE_ON_BLACK)?; + OUTPUT_TERM_POSITION = info.write_str(OUTPUT_TERM_POSITION, s, WHITE_ON_BLACK)?; + } + Ok(()) + } + /// Outputs a $func_name message &str and a newline to the terminal. + pub fn [< t $func_name sln >](s: &str, info: FramebufferInfo) -> Result<(), crate::Error<'static>> { + unsafe { + if cfg!($level = "false") { + return Ok(()); + } + OUTPUT_TERM_POSITION = info.write_str(OUTPUT_TERM_POSITION, $prefix, WHITE_ON_BLACK)?; + OUTPUT_TERM_POSITION = info.write_str(OUTPUT_TERM_POSITION, s, WHITE_ON_BLACK)?; + OUTPUT_TERM_POSITION.1 += 1; + } + Ok(()) + } + + /// Outputs a $func_name message &\[u8] to the terminal. + pub fn [< t $func_name b >](s: &[u8], info: FramebufferInfo) -> Result<(), crate::Error<'static>> { + unsafe { + if cfg!($level = "false") { + return Ok(()); + } + OUTPUT_TERM_POSITION = info.write_str(OUTPUT_TERM_POSITION, $prefix, WHITE_ON_BLACK)?; + OUTPUT_TERM_POSITION = info.write_bytes(OUTPUT_TERM_POSITION, s, WHITE_ON_BLACK)?; + } + Ok(()) + } + /// Outputs a $func_name message &\[u8] and a newline to the terminal. + pub fn [< t $func_name bln >](s: &[u8], info: FramebufferInfo) -> Result<(), crate::Error<'static>> { + unsafe { + if cfg!($level = "false") { + return Ok(()); + } + OUTPUT_TERM_POSITION = info.write_str(OUTPUT_TERM_POSITION, $prefix, WHITE_ON_BLACK)?; + OUTPUT_TERM_POSITION = info.write_bytes(OUTPUT_TERM_POSITION, s, WHITE_ON_BLACK)?; + OUTPUT_TERM_POSITION.1 += 1; + } + Ok(()) + } + + /// Outputs a(n) $func_name message u8 to the terminal. + pub fn [< t $func_name u >](s: u8, info: FramebufferInfo) -> Result<(), crate::Error<'static>> { + unsafe { + if cfg!($level = "false") { + return Ok(()); + } + OUTPUT_TERM_POSITION = info.write_str(OUTPUT_TERM_POSITION, $prefix, WHITE_ON_BLACK)?; + info.write_char(OUTPUT_TERM_POSITION, s, WHITE_ON_BLACK)?; + OUTPUT_TERM_POSITION.0 += 1; + while OUTPUT_TERM_POSITION.0 > info.width { + OUTPUT_TERM_POSITION.0 -= info.width; + OUTPUT_TERM_POSITION.1 += 1; + } + } + Ok(()) + } + + /////////////////////////////////////////////////////////////// + + /// Outputs a $func_name message &str to the terminal without a prefix. + pub fn [< t $func_name snp >](s: &str, info: FramebufferInfo) -> Result<(), crate::Error<'static>> { + unsafe { + if cfg!($level = "false") { + return Ok(()); + } + OUTPUT_TERM_POSITION = info.write_str(OUTPUT_TERM_POSITION, s, WHITE_ON_BLACK)?; + } + Ok(()) + } + /// Outputs a $func_name message &str and a newline to the terminal without a prefix. + pub fn [< t $func_name snpln >](s: &str, info: FramebufferInfo) -> Result<(), crate::Error<'static>> { + unsafe { + if cfg!($level = "false") { + return Ok(()); + } + OUTPUT_TERM_POSITION = info.write_str(OUTPUT_TERM_POSITION, s, WHITE_ON_BLACK)?; + OUTPUT_TERM_POSITION.1 += 1; + } + Ok(()) + } + + /// Outputs a $func_name message &\[u8] to the terminal without a prefix. + pub fn [< t $func_name bnp >](s: &[u8], info: FramebufferInfo) -> Result<(), crate::Error<'static>> { + unsafe { + if cfg!($level = "false") { + return Ok(()); + } + OUTPUT_TERM_POSITION = info.write_bytes(OUTPUT_TERM_POSITION, s, WHITE_ON_BLACK)?; + } + Ok(()) + } + /// Outputs a $func_name message &\[u8] and a newline to the terminal without a prefix. + pub fn [< t $func_name bnpln >](s: &[u8], info: FramebufferInfo) -> Result<(), crate::Error<'static>> { + unsafe { + if cfg!($level = "false") { + return Ok(()); + } + OUTPUT_TERM_POSITION = info.write_bytes(OUTPUT_TERM_POSITION, s, WHITE_ON_BLACK)?; + OUTPUT_TERM_POSITION.1 += 1; + } + Ok(()) + } + + /// Outputs a(n) $func_name message u8 to the terminal without a prefix. + pub fn [< t $func_name unp >](s: u8, info: FramebufferInfo) -> Result<(), crate::Error<'static>> { + unsafe { + if cfg!($level = "false") { + return Ok(()); + } + info.write_char(OUTPUT_TERM_POSITION, s, WHITE_ON_BLACK)?; + OUTPUT_TERM_POSITION.0 += 1; + while OUTPUT_TERM_POSITION.0 > info.width { + OUTPUT_TERM_POSITION.0 -= info.width; + OUTPUT_TERM_POSITION.1 += 1; + } + } + Ok(()) + } } } } diff --git a/kernel/src/internal/arch/x86/entry.rs b/kernel/src/internal/arch/x86/entry.rs index 5f3314a..c2a1736 100644 --- a/kernel/src/internal/arch/x86/entry.rs +++ b/kernel/src/internal/arch/x86/entry.rs @@ -256,9 +256,15 @@ extern "C" fn _start() -> ! { let ColorInfo::Palette{num_colors, palette: _} = color_info else { unreachable!() }; sdebugs("Number of palette colors: "); sdebugbnpln(&aphrodite::u32_as_u8_slice(num_colors)); + + sfatalsln("Halting CPU; Indexed color unimplemented"); + asm!("hlt", options(noreturn)); }, 1 => { // RGB sdebugsnpln("(RGB)"); + + sfatalsln("Halting CPU; RGB color unimplemented"); + asm!("hlt", options(noreturn)); }, 2 => { // EGA Text sdebugsnpln("(EGA Text)"); @@ -272,10 +278,9 @@ extern "C" fn _start() -> ! { bpp: framebuffer_info.bpp }; ega.clear_screen(BLACK_ON_BLACK); - ega.write_str((0, 0), "Test", WHITE_ON_BLACK).unwrap(); - + tdebugsln("Testing EGA Text framebuffer...", ega).unwrap(); for _ in 0..100000000 { - asm!("nop") + asm!("nop"); } }, _ => {