From 19de9e560d0372a66879d416435eccbde36333a9 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Fri, 25 Jan 2019 12:21:51 +0100 Subject: [PATCH] Add a VGA buffer module --- src/main.rs | 2 ++ src/vga_buffer.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/vga_buffer.rs diff --git a/src/main.rs b/src/main.rs index 0f0eac13..1a4f8b64 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,8 @@ use core::panic::PanicInfo; static HELLO: &[u8] = b"Hello World!"; +mod vga_buffer; + #[no_mangle] pub extern "C" fn _start() -> ! { let vga_buffer = 0xb8000 as *mut u8; diff --git a/src/vga_buffer.rs b/src/vga_buffer.rs new file mode 100644 index 00000000..2a736b1f --- /dev/null +++ b/src/vga_buffer.rs @@ -0,0 +1,44 @@ +#[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)] +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; + +struct Buffer { + chars: [[ScreenChar; BUFFER_WIDTH]; BUFFER_HEIGHT], +}