diff --git a/kernel-rs/src/vga_buffer.rs b/kernel-rs/src/vga_buffer.rs deleted file mode 100644 index b245d306..00000000 --- a/kernel-rs/src/vga_buffer.rs +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2016 Philipp Oppermann. See the README.md -// file at the top-level directory of this distribution. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use core::ptr::Unique; -use core::fmt; -use spin::Mutex; -use volatile::Volatile; - -const BUFFER_HEIGHT: usize = 25; -const BUFFER_WIDTH: usize = 80; - -pub static WRITER: Mutex = Mutex::new(Writer { - column_position: 0, - color_code: ColorCode::new(Color::White, Color::Black), - vgabuffer: unsafe { Unique::new_unchecked(0xb8000 as *mut _) }, -}); - -// cursor is lightgray for everyone -static CURSOR: ScreenChar = ScreenChar { - ascii_character: b' ', - color_code: ColorCode::new(Color::LightGray, Color::LightGray), -}; - -// blank is black for everyone, could make screens choose this -static BLANK: ScreenChar = ScreenChar { - ascii_character: b' ', - color_code: ColorCode::new(Color::White, Color::Black), -}; - -pub struct Writer { - column_position: usize, - pub color_code: ColorCode, - vgabuffer: Unique, -} - -macro_rules! println { - ($fmt:expr) => (print!(concat!($fmt, "\n"))); - ($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*)); -} - -macro_rules! print { - ($($arg:tt)*) => ({ - $crate::vga_buffer::print(format_args!($($arg)*)); - }); -} - -pub fn print(args: fmt::Arguments) { - use core::fmt::Write; - WRITER.lock().write_fmt(args).unwrap(); -} - -impl Writer { - pub fn reset_screen(&mut self) - { - let color_code = self.color_code; - for row in 1..BUFFER_HEIGHT { - for col in 0..BUFFER_WIDTH { - self.buffer().chars[row][col].write(ScreenChar { - ascii_character: b' ', - color_code, - }); - } - } - self.column_position = 0; - } - - 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].write(ScreenChar { - ascii_character: byte, - color_code: color_code, - }); - self.column_position += 1; - } - } - if self.column_position >= BUFFER_WIDTH { - self.new_line(); - } - let row = BUFFER_HEIGHT - 1; - let col = self.column_position; - self.buffer().chars[row][col].write(CURSOR); - } - - fn buffer(&mut self) -> &mut Buffer { - unsafe { self.vgabuffer.as_mut() } - } - - fn new_line(&mut self) { - // remove cursor if newline isnt from end of screen - if self.column_position < BUFFER_WIDTH { - let col = self.column_position; - self.buffer().chars[BUFFER_HEIGHT - 1][col].write(BLANK); - } - for row in 1..BUFFER_HEIGHT { - for col in 0..BUFFER_WIDTH { - let buffer = self.buffer(); - let character = buffer.chars[row][col].read(); - buffer.chars[row - 1][col].write(character); - } - } - self.clear_row(BUFFER_HEIGHT - 1); - self.column_position = 0; - } - - fn clear_row(&mut self, row: usize) { - for col in 0..BUFFER_WIDTH { - self.buffer().chars[row][col].write(BLANK); - } - } -} - -impl fmt::Write for Writer { - fn write_str(&mut self, s: &str) -> ::core::fmt::Result { - for byte in s.bytes() { - self.write_byte(byte) - } - Ok(()) - } -} - -#[allow(dead_code)] -#[derive(Debug, Clone, Copy)] -#[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)] -pub struct ColorCode(u8); - -impl ColorCode { - pub const fn new(foreground: Color, background: Color) -> ColorCode { - ColorCode((background as u8) << 4 | (foreground as u8)) - } -} - -#[derive(Debug, Clone, Copy)] -#[repr(C)] -struct ScreenChar { - ascii_character: u8, - color_code: ColorCode, -} - -struct Buffer { - chars: [[Volatile; BUFFER_WIDTH]; BUFFER_HEIGHT], -}