diff options
author | Dennis Kobert <dennis@kobert.dev> | 2019-11-03 01:22:02 +0100 |
---|---|---|
committer | Dennis Kobert <dennis@kobert.dev> | 2019-11-03 01:22:02 +0100 |
commit | b47731c6fd99d80b1023d906dd4b3bb377e49438 (patch) | |
tree | 0777c9eef5c416b5e58e1c44ded42d7b53382c57 /kernel/src/vga_text.rs | |
parent | 41bff6a115b9625747f08651aa8209c6767254da (diff) |
Merge: 41bff6a a2d6311
Diffstat (limited to 'kernel/src/vga_text.rs')
-rw-r--r-- | kernel/src/vga_text.rs | 167 |
1 files changed, 0 insertions, 167 deletions
diff --git a/kernel/src/vga_text.rs b/kernel/src/vga_text.rs deleted file mode 100644 index a292c8c..0000000 --- a/kernel/src/vga_text.rs +++ /dev/null @@ -1,167 +0,0 @@ -#[repr(u8)] -pub enum Color { - Black = 0, - Blue = 1, - Green = 2, - Cyan = 3, - Red = 4, - Magenta = 5, - Brown = 6, - LightGray = 7, - DarkGray = 8, - LightBlue = 9, - LightGreen = 10, - LightCyan = 11, - LightRed = 12, - Pink = 13, - Yellow = 14, - White = 15, -} - -#[derive(Clone, Copy)] -pub struct CharState(pub u8); - -impl CharState { - pub fn from_colors(fg: Color, bg: Color) -> Self { - Self((fg as u8) | ((bg as u8) << 4)) - } - - pub fn set_fg(&mut self, fg: Color) { - self.0 = (self.0 & 240) | (fg as u8) - } - - pub fn set_bg(&mut self, bg: Color) { - self.0 = (self.0 & 15) | ((bg as u8) << 4) - } -} - -#[no_mangle] -#[derive(Clone, Copy)] -pub struct VgaChar { - pub byte: u8, - pub state: CharState, -} - -impl VgaChar { - pub fn from_state_and_byte(state: CharState, byte: u8) -> Self { - Self{ state, byte } - } -} - -pub struct OStream { - pos: (u8, u8), - cursor: *mut VgaChar, - state: CharState, -} - -impl OStream { - pub fn new() -> Self { - Self { - pos: (0, 0), - cursor: Self::at(0), - state: CharState::from_colors(Color::White, Color::Black) - } - } - - fn at(n: usize) -> *mut VgaChar { - (0xb8000 + (n << 1)) as *mut VgaChar - } - - fn compute_cursor(&mut self) { - self.cursor = Self::at(self.pos.0 as usize + self.pos.1 as usize * 80) - } - - pub fn set_col(&mut self, col: u8) { - self.pos.0 = core::cmp::min(col, 79); - self.compute_cursor() - } - - pub fn set_row(&mut self, row: u8) { - self.pos.1 = core::cmp::min(row, 24); - self.compute_cursor() - } - - pub fn set_cursor(&mut self, col: u8, row: u8) { - self.pos = (core::cmp::min(col, 79), core::cmp::min(row, 24)); - self.compute_cursor() - } - - pub fn set_char(&mut self, c: VgaChar) { - unsafe {self.cursor.write_volatile(c)} - } - - pub fn put_char(&mut self, c: VgaChar) { - if c.byte == b'\n' { - self.new_line(); - } else if self.pos.0 >= 79 { - self.new_line(); - self.put_char(c); - } else { - self.set_char(c); - self.cursor = self.cursor.wrapping_offset(1); - self.pos.0 += 1; - } - } - - pub fn put_byte(&mut self, b: u8) { - self.put_char(VgaChar::from_state_and_byte(self.state, b)) - } - - pub fn clear(&self) { - let c = VgaChar::from_state_and_byte(self.state, b' '); - for i in 0..2000 { - unsafe {Self::at(i).write_volatile(c)} - } - } - - pub fn new_line(&mut self) { - if self.pos.1 >= 24 { - self.set_col(0); - for i in 0..1920 { - unsafe {Self::at(i).write_volatile(*Self::at(i + 80))} - } - } else { - self.set_cursor(0, self.pos.1 + 1); - } - } - - pub fn set_state(&mut self, state: CharState) { - self.state = state - } - - pub fn print(&mut self, s: &[u8]) { - for &b in s { - self.put_byte(b) - } - } - - pub fn print_centered(&mut self, s: &[u8]) { - let mut line = &s[..]; - let mut n = 0; - let slast = s.len() - 1; - for (i, &b) in s.iter().enumerate() { - if n >= 80 { - self.set_col(0); - self.print(&line[..80]); - line = &line[80..]; - n = 0; - } - if b == b'\n' || i == slast { - if b != b'\n' { n += 1 } - self.set_col(((80 - n) / 2) as u8); - self.print(&line[..n]); - self.new_line(); - if i == slast { return; } - line = &line[(n+1)..]; - n = 0; - } - n += 1; - } - } -} - -impl core::fmt::Write for OStream { - fn write_str(&mut self, s: &str) -> core::fmt::Result { - Ok(self.print(s.as_bytes())) - } -} |