From dbc49f92ece149e9a8bc0c504efac688c28d3729 Mon Sep 17 00:00:00 2001 From: Conzer Date: Tue, 3 Dec 2024 15:22:49 -0500 Subject: [PATCH] start work on println --- src/main.rs | 2 ++ src/vga_buffer.rs | 79 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 src/vga_buffer.rs diff --git a/src/main.rs b/src/main.rs index 14e47f5..d252cee 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,7 @@ +#![allow()] #![no_std] #![no_main] +mod vga_buffer; use core::panic::PanicInfo; #[panic_handler] diff --git a/src/vga_buffer.rs b/src/vga_buffer.rs new file mode 100644 index 0000000..c77e9c3 --- /dev/null +++ b/src/vga_buffer.rs @@ -0,0 +1,79 @@ +// Handles VGA text printing + +#[allow(dead_code)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[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(Debug, Clone, Copy, PartialEq, Eq)] +#[repr(transparent)] +struct ColorCode(u8) + +impl ColorCode { + fn new(foreground: Color, background = Color) -> ColorCode { + ColorCode((background as u8) << 4 | (foreground as u8)) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[repr(C)] +struct ScreenChar { + ascii_character: u8, + color_code: ColorCode, +} + +const BUFFER_HEIGHT: usize = 25; +const BUFFER_WIDTH: usize = 80; + +#repr(transparent) +struct Buffer { + chars: [[ScreenChar; BUFFER_WIDTH]; BUFFER_HEIGHT], +} + +pub struct Writer { + column_position: usize, + color_code: ColorCode, + buffer: &'static mut Buffer, +} + +impl Writer { + pub fn write_byte(&mut self, byteL u8) { + match byte { + b'\n' => self.new_line(), + byte => { + if self.column_position > BUFFER_WIDTH { + self.new_line(); + } + + let row = BUFFER_HEIGHT - 1; + let col self.column_position; + + let color_code = self.color_code; + self.buffer.chars[row][col] = ScreenChar { + ascii_character: byte, + color_code, + }; + self.column_position += 1; + } + } + } + + fn new_line(&mut self) {/*TODO */} +} \ No newline at end of file