Add cursor for VGA

master
WangRunji 7 years ago
parent 5bf407de7c
commit b954aef696

@ -1,6 +1,7 @@
use spin::Mutex;
use core::ptr::Unique;
use volatile::Volatile;
use x86_64::instructions::port::{outw, outb};
pub const VGA_BUFFER: Unique<VgaBuffer> = unsafe{
Unique::new_unchecked(0xb8000 as *mut _)
@ -77,6 +78,17 @@ impl VgaBuffer {
pub fn byte_at(&self, row: usize, col: usize) -> u8 {
self.chars[row][col].read().ascii_char
}
pub fn set_cursor_at(&self, row: usize, col: usize) {
assert!(row < BUFFER_HEIGHT && col < BUFFER_WIDTH);
let pos = row * BUFFER_WIDTH + col;
unsafe {
// Reference: Rustboot project
outw(0x3D4, 15u16); // WARNING verify should be u16
outb(0x3D5, pos as u8);
outw(0x3D4, 14u16);
outb(0x3D5, (pos >> 8) as u8);
}
}
}
#[cfg(test)]

@ -38,6 +38,7 @@ impl VgaWriter {
self.buffer.write(row, col, byte);
self.column_position += 1;
self.buffer.set_cursor_at(row, col);
}
}
}

Loading…
Cancel
Save