From afc2c26a9d2758204c27214502624786dc2a29ca Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 12 Apr 2017 19:16:04 +0200 Subject: [PATCH] Create a vga_buffer module --- src/lib.rs | 3 +++ src/vga_buffer.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/vga_buffer.rs diff --git a/src/lib.rs b/src/lib.rs index 9e2fec8..ffb8853 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,8 +1,11 @@ #![feature(lang_items)] +#![feature(const_fn)] #![no_std] extern crate rlibc; +mod vga_buffer; + #[no_mangle] pub extern fn rust_main() { // ATTENTION: we have a very small stack and no guard page diff --git a/src/vga_buffer.rs b/src/vga_buffer.rs new file mode 100644 index 0000000..eaa8896 --- /dev/null +++ b/src/vga_buffer.rs @@ -0,0 +1,41 @@ +#[allow(dead_code)] +#[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, +} + +struct ColorCode(u8); + +impl ColorCode { + const fn new(foreground: Color, background: Color) -> ColorCode { + ColorCode((background as u8) << 4 | (foreground as u8)) + } +} + +#[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], +}