From 1816cefb47bb4575af2a01c6b1c11fff02780ac1 Mon Sep 17 00:00:00 2001 From: Arnau478 Date: Fri, 17 Jun 2022 12:47:57 +0200 Subject: [PATCH] VGA set_cursor() and get_cursor() --- src/kernel/drivers/vga.c | 16 ++++++++++++++++ src/kernel/drivers/vga.h | 5 +++++ src/kernel/main.c | 1 + 3 files changed, 22 insertions(+) diff --git a/src/kernel/drivers/vga.c b/src/kernel/drivers/vga.c index 2ed09f0..9046610 100644 --- a/src/kernel/drivers/vga.c +++ b/src/kernel/drivers/vga.c @@ -1,4 +1,5 @@ #include "vga.h" +#include "../arch/i686/io.h" void set_char(int x, int y, char c){ VGA_MEMORY[(x+y*VGA_WIDTH)*2] = c; @@ -7,3 +8,18 @@ void set_char(int x, int y, char c){ void set_color(int x, int y, uint8_t color){ VGA_MEMORY[(x+y*VGA_WIDTH)*2+1] = color; } + +void set_cursor(int offset){ + i686_outb(VGA_PORT_CTRL, 14); + i686_outb(VGA_PORT_DATA, (uint8_t)(offset >> 8)); + i686_outb(VGA_PORT_CTRL, 15); + i686_outb(VGA_PORT_DATA, (uint8_t)(offset & 0xff)); +} + +int get_cursor(){ + i686_outb(VGA_PORT_CTRL, 14); + int offset = i686_inb(VGA_PORT_DATA) << 8; // High byte + i686_outb(VGA_PORT_CTRL, 15); + offset += i686_inb(VGA_PORT_DATA); // Low byte + return offset; +} diff --git a/src/kernel/drivers/vga.h b/src/kernel/drivers/vga.h index 212ad6b..3fdecde 100644 --- a/src/kernel/drivers/vga.h +++ b/src/kernel/drivers/vga.h @@ -41,5 +41,10 @@ #define VGA_WIDTH 80 #define VGA_HEIGHT 25 +#define VGA_PORT_CTRL 0x3D4 +#define VGA_PORT_DATA 0x3D5 + void set_char(int x, int y, char c); void set_color(int x, int y, uint8_t color); +void set_cursor(int offset); +int get_cursor(); diff --git a/src/kernel/main.c b/src/kernel/main.c index 92b2867..6c3af3a 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -5,5 +5,6 @@ void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){ // Print a light cyan 'X' over green on the top left corner set_char(0, 0, 'X'); set_color(0, 0, VGA_COLOR_BG_GREEN | VGA_COLOR_FG_LIGHT_CYAN); + set_cursor(1); for(;;); // Halt here }