From 146a06f0e6d505d683fc67d9bffdddd5ba1e1aee Mon Sep 17 00:00:00 2001 From: Mathieu Maret Date: Wed, 14 Nov 2018 18:03:11 +0100 Subject: [PATCH] wip: add blinking cursor --- core/main.c | 1 + drivers/vga.c | 48 ++++++++++++++++++++++++++++++++++-------------- drivers/vga.h | 3 +++ 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/core/main.c b/core/main.c index 026481e..2ade256 100644 --- a/core/main.c +++ b/core/main.c @@ -29,6 +29,7 @@ void kmain(unsigned long magic, unsigned long addr) { unsigned long upper_mem = 0; VGASetup(BLACK, GREEN); + cursorEnable(14, 15); printf("Setting up Interruptions\n"); gdtSetup(); diff --git a/drivers/vga.c b/drivers/vga.c index 4043f38..5a0e91a 100644 --- a/drivers/vga.c +++ b/drivers/vga.c @@ -34,7 +34,7 @@ void printInt(int integer) if (integer < 0) { printChar('-'); } - if (integer == 0){ + if (integer == 0) { num[i++] = 0; } while (integer != 0) { @@ -57,7 +57,7 @@ void printIntDetails(int integer, uint color, uint bgColor, int startX, int star if (integer < 0) { printCharDetails('-', color, bgColor, x++, startY); } - if (integer == 0){ + if (integer == 0) { num[i++] = 0; } while (integer != 0) { @@ -111,7 +111,7 @@ void vprintf(const char *format, va_list ap) } case 's': { char *str = va_arg(ap, char *); - if(!str) + if (!str) str = "[NULL STR]"; printString(str); break; @@ -130,14 +130,14 @@ void vprintf(const char *format, va_list ap) } } -void printf(const char *format, ...){ +void printf(const char *format, ...) +{ va_list ap; va_start(ap, format); vprintf(format, ap); va_end(ap); } - void printString(const char *str) { while (*str) { @@ -154,22 +154,16 @@ void printChar(const char str) vgaScrollUp(); line--; } - } - else if(str == '\r') - { + } else if (str == '\r') { col = 0; - } - else if(str == '\b') - { + } else if (str == '\b') { col--; if (col < 0) { col = VGA_WIDTH - 1; line--; } printCharDetails(' ', vgaColor, vgaBgColor, col, line); - } - else - { + } else { printCharDetails(str, vgaColor, vgaBgColor, col++, line); if (col == VGA_WIDTH) { col = 0; @@ -180,6 +174,7 @@ void printChar(const char str) line--; } } + cursorMove(col - 1, line); } void printStringDetails(const char *str, uint color, uint bgColor, int startX, int startY) @@ -193,3 +188,28 @@ void printStringDetails(const char *str, uint color, uint bgColor, int startX, i i++; } } + +void cursorEnable(uint8_t cursor_start, uint8_t cursor_end) +{ + outb(0x3D4, 0x0A); + outb(0x3D5, (inb(0x3D5) & 0xC0) | cursor_start); + + outb(0x3D4, 0x0B); + outb(0x3D5, (inb(0x3D5) & 0xE0) | cursor_end); +} + +void cursorDisable(void) +{ + outb(0x3D4, 0x0A); + outb(0x3D5, 0x20); +} + +void cursorMove(int x, int y) +{ + uint16_t pos = y * VGA_WIDTH + x; + + outb(0x3D4, 0x0F); + outb(0x3D5, (uint8_t)(pos & 0xFF)); + outb(0x3D4, 0x0E); + outb(0x3D5, (uint8_t)((pos >> 8) & 0xFF)); +} diff --git a/drivers/vga.h b/drivers/vga.h index e21969d..19d676e 100644 --- a/drivers/vga.h +++ b/drivers/vga.h @@ -27,3 +27,6 @@ void printStringDetails(const char *str, uint color, uint bgColor, int startX, i void printString(const char *str); void printChar(const char str); void vgaScrollUp(void); +void cursorEnable(uint8_t cursor_start, uint8_t cursor_end); +void cursorDisable(void); +void cursorMove(int x, int y);