Create a Writer struct with a `write_byte` function

master
Philipp Oppermann 8 years ago
parent afc2c26a9d
commit 46d47f8d2e

@ -1,5 +1,6 @@
#![feature(lang_items)] #![feature(lang_items)]
#![feature(const_fn)] #![feature(const_fn)]
#![feature(unique)]
#![no_std] #![no_std]
extern crate rlibc; extern crate rlibc;

@ -1,4 +1,7 @@
use core::ptr::Unique;
#[allow(dead_code)] #[allow(dead_code)]
#[derive(Debug, Clone, Copy)]
#[repr(u8)] #[repr(u8)]
pub enum Color { pub enum Color {
Black = 0, Black = 0,
@ -19,6 +22,7 @@ pub enum Color {
White = 15, White = 15,
} }
#[derive(Debug, Clone, Copy)]
struct ColorCode(u8); struct ColorCode(u8);
impl ColorCode { impl ColorCode {
@ -27,6 +31,7 @@ impl ColorCode {
} }
} }
#[derive(Debug, Clone, Copy)]
#[repr(C)] #[repr(C)]
struct ScreenChar { struct ScreenChar {
ascii_character: u8, ascii_character: u8,
@ -39,3 +44,38 @@ const BUFFER_WIDTH: usize = 80;
struct Buffer { struct Buffer {
chars: [[ScreenChar; BUFFER_WIDTH]; BUFFER_HEIGHT], chars: [[ScreenChar; BUFFER_WIDTH]; BUFFER_HEIGHT],
} }
pub struct Writer {
column_position: usize,
color_code: ColorCode,
buffer: Unique<Buffer>,
}
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 */}
}

Loading…
Cancel
Save