Added set_cursor_position

This commit is contained in:
Ryan Kennedy 2020-03-16 13:26:09 -05:00
parent 273665c720
commit 855c6b8658
4 changed files with 86 additions and 0 deletions

View file

@ -170,6 +170,17 @@ impl Vga {
self.crtc_controller_registers.read(emulation_mode, index)
}
/// Writes `value` to the crtc controller, as determined by `index`.
pub fn write_crtc_controller(
&mut self,
emulation_mode: EmulationMode,
index: CrtcControllerIndex,
value: u8,
) {
self.crtc_controller_registers
.write(emulation_mode, index, value);
}
/// Returns the current `EmulationMode` as determined by the miscellaneous output register.
pub fn get_emulation_mode(&mut self) -> EmulationMode {
EmulationMode::from(self.general_registers.read_msr() & 0x1)

View file

@ -2,6 +2,7 @@ use super::ScreenCharacter;
use crate::{
colors::{Color16Bit, TextModeColor, DEFAULT_PALETTE},
fonts::TEXT_8X16_FONT,
registers::CrtcControllerIndex,
vga::{Vga, VideoMode, VGA},
};
use spinning_top::SpinlockGuard;
@ -76,6 +77,30 @@ impl Text40x25 {
vga.load_font(&TEXT_8X16_FONT);
}
/// Sets the current text cursor to the position specified by
/// `x` and `y`.
///
/// Panics if `x >= 40` or `y >= 25`.
pub fn set_cursor_position(&self, x: usize, y: usize) {
assert!(x < WIDTH, "x >= {}", WIDTH);
assert!(y < HEIGHT, "y >= {}", HEIGHT);
let offset = WIDTH * y + x;
let (mut vga, _frame_buffer) = self.get_frame_buffer();
let emulation_mode = vga.get_emulation_mode();
let cursor_start = offset & 0xFF;
let cursor_end = (offset >> 8) & 0xFF;
vga.write_crtc_controller(
emulation_mode,
CrtcControllerIndex::TextCursorLocationLow,
cursor_start as u8,
);
vga.write_crtc_controller(
emulation_mode,
CrtcControllerIndex::TextCursorLocationHigh,
cursor_end as u8,
);
}
/// Returns the start of the `FrameBuffer` as `*mut ScreenCharacter`
/// as well as a lock to the vga driver. This ensures the vga
/// driver stays locked while the frame buffer is in use.

View file

@ -2,6 +2,7 @@ use super::ScreenCharacter;
use crate::{
colors::{Color16Bit, TextModeColor, DEFAULT_PALETTE},
fonts::TEXT_8X8_FONT,
registers::CrtcControllerIndex,
vga::{Vga, VideoMode, VGA},
};
use spinning_top::SpinlockGuard;
@ -76,6 +77,30 @@ impl Text40x50 {
vga.load_font(&TEXT_8X8_FONT);
}
/// Sets the current text cursor to the position specified by
/// `x` and `y`.
///
/// Panics if `x >= 40` or `y >= 50`.
pub fn set_cursor_position(&self, x: usize, y: usize) {
assert!(x < WIDTH, "x >= {}", WIDTH);
assert!(y < HEIGHT, "y >= {}", HEIGHT);
let offset = WIDTH * y + x;
let (mut vga, _frame_buffer) = self.get_frame_buffer();
let emulation_mode = vga.get_emulation_mode();
let cursor_start = offset & 0xFF;
let cursor_end = (offset >> 8) & 0xFF;
vga.write_crtc_controller(
emulation_mode,
CrtcControllerIndex::TextCursorLocationLow,
cursor_start as u8,
);
vga.write_crtc_controller(
emulation_mode,
CrtcControllerIndex::TextCursorLocationHigh,
cursor_end as u8,
);
}
/// Returns the start of the `FrameBuffer` as `*mut ScreenCharacter`
/// as well as a lock to the vga driver. This ensures the vga
/// driver stays locked while the frame buffer is in use.

View file

@ -2,6 +2,7 @@ use super::ScreenCharacter;
use crate::{
colors::{Color16Bit, TextModeColor, DEFAULT_PALETTE},
fonts::TEXT_8X16_FONT,
registers::CrtcControllerIndex,
vga::{Vga, VideoMode, VGA},
};
use spinning_top::SpinlockGuard;
@ -76,6 +77,30 @@ impl Text80x25 {
vga.load_font(&TEXT_8X16_FONT);
}
/// Sets the current text cursor to the position specified by
/// `x` and `y`.
///
/// Panics if `x >= 80` or `y >= 25`.
pub fn set_cursor_position(&self, x: usize, y: usize) {
assert!(x < WIDTH, "x >= {}", WIDTH);
assert!(y < HEIGHT, "y >= {}", HEIGHT);
let offset = WIDTH * y + x;
let (mut vga, _frame_buffer) = self.get_frame_buffer();
let emulation_mode = vga.get_emulation_mode();
let cursor_start = offset & 0xFF;
let cursor_end = (offset >> 8) & 0xFF;
vga.write_crtc_controller(
emulation_mode,
CrtcControllerIndex::TextCursorLocationLow,
cursor_start as u8,
);
vga.write_crtc_controller(
emulation_mode,
CrtcControllerIndex::TextCursorLocationHigh,
cursor_end as u8,
);
}
/// Returns the start of the `FrameBuffer` as `*mut ScreenCharacter`
/// as well as a lock to the vga driver. This ensures the vga
/// driver stays locked while the frame buffer is in use.