Fix clear() function

This commit is contained in:
greg
2015-11-10 00:46:08 -08:00
parent 0008341fcd
commit 638056117f

View File

@@ -6,23 +6,23 @@ extern crate rlibc;
#[no_mangle]
pub extern fn rust_main() {
let gamarjoba = b"Gamarjoba, munde";
let color_byte = 0x1f; // white on blue
let mut gamarjoba_colored = [color_byte; 32];
for (i, char_byte) in gamarjoba.into_iter().enumerate() {
gamarjoba_colored[i*2] = *char_byte;
}
//write to center of VGA buffer
let buffer_ptr = (0xb8000 + 1988) as *mut _;
unsafe { *buffer_ptr = gamarjoba_colored };
vga_buffer::write_to_coord(10,10, b'f');
clear();
loop {}
}
fn clear() {
let blank_color = vga_buffer::ColorCode::new(
vga_buffer::Color::White,
vga_buffer::Color::Black);
for i in 0..vga_buffer::BUFFER_WIDTH {
for j in 0..vga_buffer::BUFFER_HEIGHT {
vga_buffer::write_to_coord(i, j, b' ', blank_color);
}
}
}
mod vga_buffer {
#[repr(u8)]
pub enum Color {
@@ -45,9 +45,9 @@ mod vga_buffer {
}
#[derive(Clone, Copy)]
struct ColorCode(u8);
pub struct ColorCode(u8);
impl ColorCode {
const fn new(foreground: Color, background: Color) -> ColorCode {
pub const fn new(foreground: Color, background: Color) -> ColorCode {
ColorCode((background as u8) << 4 | (foreground as u8))
}
}
@@ -58,16 +58,21 @@ mod vga_buffer {
color_code: ColorCode
}
const BUFFER_HEIGHT: usize = 25;
const BUFFER_WIDTH: usize = 80;
pub const BUFFER_HEIGHT: usize = 25;
pub const BUFFER_WIDTH: usize = 80;
const BUFFER_PTR: usize = 0xb8000;
pub fn write_to_coord(x: usize, y: usize, character: u8) {
let ptr = BUFFER_PTR + (2*x as usize) + (BUFFER_HEIGHT * 2 * y as usize);
pub fn write_to_coord(x: usize, y: usize, character: u8, color_code: ColorCode) {
let ptr = BUFFER_PTR + (2*x as usize) + (BUFFER_WIDTH*2*y as usize);
let data = ScreenChar {
ascii_char: character,
color_code: ColorCode::new(Color::White, Color::Red)
color_code: color_code,
};
if x > BUFFER_WIDTH || y > BUFFER_HEIGHT {
return;
}
unsafe {
*(ptr as *mut _) = data;
}