From 46d47f8d2ee0b9eee478e6bcd3eaa69a08a5dea4 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 12 Apr 2017 19:20:15 +0200 Subject: [PATCH] Create a Writer struct with a `write_byte` function --- src/lib.rs | 1 + src/vga_buffer.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index ffb8853b..87889a41 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ #![feature(lang_items)] #![feature(const_fn)] +#![feature(unique)] #![no_std] extern crate rlibc; diff --git a/src/vga_buffer.rs b/src/vga_buffer.rs index eaa8896b..8b807fb4 100644 --- a/src/vga_buffer.rs +++ b/src/vga_buffer.rs @@ -1,4 +1,7 @@ +use core::ptr::Unique; + #[allow(dead_code)] +#[derive(Debug, Clone, Copy)] #[repr(u8)] pub enum Color { Black = 0, @@ -19,6 +22,7 @@ pub enum Color { White = 15, } +#[derive(Debug, Clone, Copy)] struct ColorCode(u8); impl ColorCode { @@ -27,6 +31,7 @@ impl ColorCode { } } +#[derive(Debug, Clone, Copy)] #[repr(C)] struct ScreenChar { ascii_character: u8, @@ -39,3 +44,38 @@ const BUFFER_WIDTH: usize = 80; struct Buffer { chars: [[ScreenChar; BUFFER_WIDTH]; BUFFER_HEIGHT], } + +pub struct Writer { + column_position: usize, + color_code: ColorCode, + buffer: Unique, +} + +impl Writer { + pub fn write_byte(&mut self, byte: 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: color_code, + }; + self.column_position += 1; + } + } + } + + fn buffer(&mut self) -> &mut Buffer { + unsafe{ self.buffer.as_mut() } + } + + fn new_line(&mut self) {/* TODO */} +}