aboutsummaryrefslogtreecommitdiff
path: root/src/vga.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/vga.cc')
-rw-r--r--src/vga.cc24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/vga.cc b/src/vga.cc
index 6b64b98..66a6b3a 100644
--- a/src/vga.cc
+++ b/src/vga.cc
@@ -15,6 +15,9 @@ VGA::VGA(vga_color fg, vga_color bg, uint32_t address) : color_fg(fg), color_bg(
buffer[index].bg = color_bg;
}
}
+
+ enable_cursor(14, 15);
+ update_cursor();
}
void VGA::set_color(vga_color fg, vga_color bg) {
@@ -29,6 +32,27 @@ void VGA::set_color(vga_color fg, vga_color bg) {
}
}
+void VGA::enable_cursor(uint8_t start, uint8_t end) {
+ p_3d4.write(0x0a);
+ p_3d5.write((p_3d5.read() & 0xc0) | start);
+
+ p_3d4.write(0x0b);
+ p_3d5.write((p_3d5.read() & 0xe0) | end);
+}
+void VGA::disable_cursor() {
+ p_3d4.write(0x0a);
+ p_3d5.write(0x20);
+}
+void VGA::update_cursor() {
+ const uint16_t pos = row * max_columns + column;
+
+ p_3d4.write(0x0f);
+ p_3d5.write(static_cast<uint8_t>(pos & 0xff));
+
+ p_3d4.write(0x0e);
+ p_3d5.write(static_cast<uint8_t>((pos >> 8) & 0xff));
+}
+
void VGA::write(char c) {
switch (c) {
case '\n':