Browse Source

vga_console: add Writer.move_cursor(), make write_str move the cursor

master
3moon 8 years ago
parent
commit
c250c57fd6
1 changed files with 17 additions and 0 deletions
  1. +17
    -0
      src/arch/x86_64/device/vga_console.rs

+ 17
- 0
src/arch/x86_64/device/vga_console.rs View File

@ -4,6 +4,7 @@ use core::fmt;
use core::ptr::Unique; use core::ptr::Unique;
use spin::Mutex; use spin::Mutex;
use volatile::Volatile; use volatile::Volatile;
use x86::shared::io;
pub static WRITER: Mutex<Writer> = Mutex::new(Writer { pub static WRITER: Mutex<Writer> = Mutex::new(Writer {
column_pos: 0, row_pos: 0, column_pos: 0, row_pos: 0,
@ -112,6 +113,18 @@ impl Writer {
self.style self.style
} }
fn move_cursor(&mut self, row: usize, col: usize) {
let pos: u16 = ((row * 80) + col) as u16;
// Lovingly ripped off from wiki.osdev.org/Text_Mode_Cursor
unsafe {
io::outb(0x3d4, 0x0F);
io::outb(0x3d5, (pos & 0xff) as u8);
io::outb(0x3d4, 0x0e);
io::outb(0x3d5, ((pos>>8) & 0xff) as u8);
}
}
fn new_line(&mut self) { fn new_line(&mut self) {
self.column_pos = 0; self.column_pos = 0;
self.row_pos += 1; self.row_pos += 1;
@ -152,6 +165,10 @@ impl fmt::Write for Writer {
self.write_byte(byte); self.write_byte(byte);
} }
let row = self.row_pos;
let col = self.column_pos;
self.move_cursor(row, col);
Ok(()) Ok(())
} }
} }

Loading…
Cancel
Save