diff --git a/src/vga_buffer.rs b/src/vga_buffer.rs index 216b012..b9e76d7 100644 --- a/src/vga_buffer.rs +++ b/src/vga_buffer.rs @@ -1,4 +1,5 @@ use volatile::Volatile; +use core::fmt; #[allow(dead_code)] #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -86,18 +87,47 @@ impl Writer { } } - fn new_line(&mut self) {} + fn new_line(&mut self) { + for row in 1..BUFFER_HEIGHT { + for col in 0..BUFFER_WIDTH { + let character = self.buffer.chars[row][col].read(); + self.buffer.chars[row - 1][col].write(character); + } + } + + self.clear_row(BUFFER_HEIGHT - 1); + self.column_position = 0; + } + + fn clear_row(&mut self, row: usize) { + let blank = ScreenChar { + ascii_character: b' ', + color_code: self.color_code, + }; + + 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) -> fmt::Result { + self.write_string(s); + Ok(()) + } } pub fn print_something() { + use core::fmt::Write; let mut writer = Writer { column_position: 0, color_code: ColorCode::new(Color::White, Color::Black), buffer: unsafe { &mut *(0xb8000 as *mut Buffer) } }; - writer.write_byte(b'H'); - writer.write_string("ello "); - writer.write_string("World!!!!!"); + writeln!(writer, "Hello world!").unwrap(); + writeln!(writer, "Hello again!").unwrap(); + }