1 use core::ops::{AddAssign, Shl};
4 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
25 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
27 pub struct ColorCode(u8);
30 pub fn new(foreground: Color, background: Color) -> ColorCode {
31 ColorCode((background as u8).shl(4) | (foreground as u8))
35 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
39 color_code: ColorCode,
42 const BUFFER_WIDTH: usize = 80;
43 const BUFFER_HEIGHT: usize = 25;
47 chars: [[ScreenChar; BUFFER_WIDTH]; BUFFER_HEIGHT],
52 column_position: usize,
53 color_code: ColorCode,
54 buffer: &'static mut Buffer,
58 pub fn write_byte(&mut self, byte: u8) {
60 b'\n' => self.new_line(),
62 if self.column_position >= BUFFER_WIDTH {
66 let row = self.row_position;
67 let col = self.column_position;
69 let color_code = self.color_code;
70 self.buffer.chars[row][col] = ScreenChar {
71 ascii_character: byte,
75 self.column_position.add_assign(1);
80 pub fn write_string(&mut self, s: &str) {
81 for byte in s.bytes() {
83 // Printable ASCII character or \n
84 0x20..=0x7e | b'\n' => self.write_byte(byte),
85 // Not printable, write error char instead
86 _ => self.write_byte(0xfe),
91 fn new_line(&mut self) {
97 let mut writer = Writer {
100 color_code: ColorCode::new(Color::Yellow, Color::Black),
101 buffer: unsafe { &mut *(0xb8000 as *mut Buffer) },
104 writer.write_string("Hello Stage2!");