1 use core::ops::{AddAssign, Deref, DerefMut, Shl};
3 use volatile::Volatile;
6 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
27 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
29 pub struct ColorCode(u8);
32 pub fn new(foreground: Color, background: Color) -> ColorCode {
33 ColorCode((background as u8).shl(4) | (foreground as u8))
37 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
41 color_code: ColorCode,
44 impl Deref for ScreenChar {
45 type Target = ScreenChar;
47 fn deref(&self) -> &Self::Target {
52 impl DerefMut for ScreenChar {
53 fn deref_mut(&mut self) -> &mut Self::Target {
58 const BUFFER_WIDTH: usize = 80;
59 const BUFFER_HEIGHT: usize = 25;
63 chars: [[Volatile<ScreenChar>; BUFFER_WIDTH]; BUFFER_HEIGHT],
68 column_position: usize,
69 color_code: ColorCode,
70 buffer: &'static mut Buffer,
74 pub fn write_byte(&mut self, byte: u8) {
76 b'\n' => self.new_line(),
78 if self.column_position >= BUFFER_WIDTH {
82 let row = self.row_position;
83 let col = self.column_position;
85 let color_code = self.color_code;
86 self.buffer.chars[row][col].write(ScreenChar {
87 ascii_character: byte,
91 self.column_position.add_assign(1);
96 pub fn write_string(&mut self, s: &str) {
97 for byte in s.bytes() {
99 // Printable ASCII character or \n
100 0x20..=0x7e | b'\n' => self.write_byte(byte),
101 // Not printable, write error char instead
102 _ => self.write_byte(0xfe),
107 fn new_line(&mut self) {
112 pub fn test_print() {
113 let mut writer = Writer {
116 color_code: ColorCode::new(Color::Yellow, Color::Black),
117 buffer: unsafe { &mut *(0xb8000 as *mut Buffer) },
120 writer.write_string("Hello Stage2!");