From b6f78ed9c18aad6b33d7236c1322012a5d7c740c Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Mon, 8 Apr 2024 19:28:00 +0200 Subject: [PATCH] Added scrolling (finally) --- src/kernel/isrs.c | 3 ++- src/kernel/keyboard.c | 2 +- src/kernel/screen.c | 40 ++++++++++++++++++++++++---------------- src/kernel/screen.h | 7 ++++--- 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/kernel/isrs.c b/src/kernel/isrs.c index 9b252dc..9c77870 100644 --- a/src/kernel/isrs.c +++ b/src/kernel/isrs.c @@ -2,6 +2,7 @@ #include "idt.h" #include "screen.h" #include "system.h" +#include "string.h" char* exceptionMessages[] = { "Divide By Zero Error", @@ -79,7 +80,7 @@ void faultHandler(struct regs* r) { if (r->errCode) { print(": 0x", 0x04); - printHex(r->errCode, 0x04); + print(itoa(r->errCode, 16), 0x04); } cli(); diff --git a/src/kernel/keyboard.c b/src/kernel/keyboard.c index 0a1e8b5..e141696 100644 --- a/src/kernel/keyboard.c +++ b/src/kernel/keyboard.c @@ -60,7 +60,7 @@ void keyboardHandler() { char* read(char terminator, uint8_t attr) { bufferLen = 0; - echo = true; + echo = attr ? true : false; echoAttr = attr; while (buffer[bufferLen-1] != terminator && bufferLen < MAX_BUFFER_SIZE); diff --git a/src/kernel/screen.c b/src/kernel/screen.c index 8aee3f5..6b18b47 100644 --- a/src/kernel/screen.c +++ b/src/kernel/screen.c @@ -2,20 +2,38 @@ #include "stdint.h" #include "system.h" -uint16_t cursor = 0; +uint32_t cursor = 0; void updateCursor() { + // Move visual cursor position outb(0x3d4, 0x0f); // Low byte outb(0x3d5, cursor & 0xff); outb(0x3d4, 0x0e); // High byte outb(0x3d5, cursor >> 8); } +void scroll() { + if (cursor < COLS * ROWS) return; + + for (int i = 1; i < ROWS; i++) { + memcopy((char*)(calcOffset(0, i)*2)+VIDMEM, (char*)(calcOffset(0, i-1)*2)+VIDMEM, COLS*2); + } + + char* lastRow = (char*)(calcOffset(0, ROWS-1)*2)+VIDMEM; + for (int i = 0; i < COLS*2; i += 2) { + lastRow[i] = '\0'; + lastRow[i+1] = 0x0f; + } + + cursor = calcOffset(0, ROWS-1); +} void putc(char c, uint8_t attr) { if (c == '\n') { uint16_t line = cursor - (cursor % COLS); setCursorPos(line + COLS); + scroll(); + updateCursor(); return; } else if (c == '\b') { cursor--; @@ -32,6 +50,7 @@ void putc(char c, uint8_t attr) { cursor++; + scroll(); updateCursor(); } @@ -42,6 +61,7 @@ void print(char* s, uint8_t attr) { c = *(++s); } + scroll(); updateCursor(); } @@ -73,28 +93,16 @@ void clear(uint8_t attr) { updateCursor(); } - -void printHex(uint8_t d, uint8_t attr) { - char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; - uint8_t low = d & 0x0f; - uint8_t high = (d & 0xf0) >> 4; - - putc(hexDigits[low], attr); - putc(hexDigits[high], attr); - - updateCursor(); -} - -void setCursorPos(uint16_t offset) { +void setCursorPos(uint32_t offset) { cursor = offset; updateCursor(); } -uint16_t getCursorPos() { +uint32_t getCursorPos() { return cursor; } -uint16_t calcOffset(uint8_t col, uint8_t row) { +uint32_t calcOffset(uint8_t col, uint8_t row) { return row * COLS + col; } diff --git a/src/kernel/screen.h b/src/kernel/screen.h index 929e0a1..b34150e 100644 --- a/src/kernel/screen.h +++ b/src/kernel/screen.h @@ -21,9 +21,10 @@ void printAt(char* s, uint8_t attr, uint8_t row, uint8_t col); void clear(uint8_t attr); void printHex(uint8_t d, uint8_t attr); -void setCursorPos(uint16_t offset); -uint16_t getCursorPos(); -uint16_t calcOffset(uint8_t row, uint8_t col); +void setCursorPos(uint32_t offset); +uint32_t getCursorPos(); +uint32_t calcOffset(uint8_t row, uint8_t col); +void scroll(); void enableCursor(uint8_t start, uint8_t end); void disableCursor();