diff --git a/src/kernel/drivers/interrupts/keyboard/keyboard.c b/src/kernel/drivers/interrupts/keyboard/keyboard.c index 01d381b..86a94bd 100644 --- a/src/kernel/drivers/interrupts/keyboard/keyboard.c +++ b/src/kernel/drivers/interrupts/keyboard/keyboard.c @@ -27,12 +27,15 @@ '+', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; const char *altKeycodes[128] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, "\x1B[H", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "\x1B[H", "\x1B[A", 0, 0, + "\e[D", 0, "\e[C", 0, 0, "\e[B", 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; const char capitalKeycodes[128] = { 0, 27, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', @@ -59,15 +62,6 @@ void keyboardHandler() { uint8_t scancode = getScancode(); - if (scancode & 0x80) { - scancode = scancode & 0x7F; - for (uint8_t i = 0; i < sizeof(modifierScancodes); i++) { - if (scancode == modifierScancodes[i]) { - modifiers = modifiers & (0xFF ^ 0x01 << i); - } - } - return; - } if (scancode == 0xE0) { // double length scancode = getScancode(); @@ -81,6 +75,15 @@ printf("%s", altKeycodes[scancode]); return; } + if (scancode & 0x80) { + scancode = scancode & 0x7F; + for (uint8_t i = 0; i < sizeof(modifierScancodes); i++) { + if (scancode == modifierScancodes[i]) { + modifiers = modifiers & (0xFF ^ 0x01 << i); + } + } + return; + } if (!(scancode & 0x80)) { for (uint8_t i = 0; i < sizeof(modifierScancodes); i++) { if (scancode == modifierScancodes[i]) { diff --git a/src/kernel/drivers/interrupts/keyboard/keyboard.c b/src/kernel/drivers/interrupts/keyboard/keyboard.c index 01d381b..86a94bd 100644 --- a/src/kernel/drivers/interrupts/keyboard/keyboard.c +++ b/src/kernel/drivers/interrupts/keyboard/keyboard.c @@ -27,12 +27,15 @@ '+', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; const char *altKeycodes[128] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, "\x1B[H", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "\x1B[H", "\x1B[A", 0, 0, + "\e[D", 0, "\e[C", 0, 0, "\e[B", 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; const char capitalKeycodes[128] = { 0, 27, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', @@ -59,15 +62,6 @@ void keyboardHandler() { uint8_t scancode = getScancode(); - if (scancode & 0x80) { - scancode = scancode & 0x7F; - for (uint8_t i = 0; i < sizeof(modifierScancodes); i++) { - if (scancode == modifierScancodes[i]) { - modifiers = modifiers & (0xFF ^ 0x01 << i); - } - } - return; - } if (scancode == 0xE0) { // double length scancode = getScancode(); @@ -81,6 +75,15 @@ printf("%s", altKeycodes[scancode]); return; } + if (scancode & 0x80) { + scancode = scancode & 0x7F; + for (uint8_t i = 0; i < sizeof(modifierScancodes); i++) { + if (scancode == modifierScancodes[i]) { + modifiers = modifiers & (0xFF ^ 0x01 << i); + } + } + return; + } if (!(scancode & 0x80)) { for (uint8_t i = 0; i < sizeof(modifierScancodes); i++) { if (scancode == modifierScancodes[i]) { diff --git a/src/kernel/drivers/textMode/terminal.c b/src/kernel/drivers/textMode/terminal.c index 9e5c941..5ee1813 100644 --- a/src/kernel/drivers/textMode/terminal.c +++ b/src/kernel/drivers/textMode/terminal.c @@ -1,5 +1,6 @@ #include #include +#include uint16_t *framebuffer = (uint16_t *)FRAMEBUFFER_LOCATION; uint8_t currentFormat = 0x0A; @@ -34,6 +35,19 @@ } } +void shiftDown() { + for (int y = VIDEO_HEIGHT - 1; y >= 0; y--) { + for (int x = 0; x < VIDEO_WIDTH; x++) { + uint16_t old = + *(uint16_t *)(FRAMEBUFFER_LOCATION + getOffset(x, y) * 2); + setCharAtOffset(getOffset(x, y + 1), old, old >> 8); + } + } + for (int x = 0; x < VIDEO_WIDTH; x++) { + setCharAtOffset(x, ' ', currentFormat); + } +} + uint16_t cursorOffset = 0; void newLine() { @@ -79,6 +93,27 @@ return; case BUFFER: switch (c) { + case '1': + *currentBuffer += 1; + case '2': + *currentBuffer += 2; + case '3': + *currentBuffer += 3; + case '4': + *currentBuffer += 4; + case '5': + *currentBuffer += 5; + case '6': + *currentBuffer += 6; + case '7': + *currentBuffer += 7; + case '8': + *currentBuffer += 8; + case '9': + *currentBuffer += 9; + case '0': + *currentBuffer *= 10; // shift right in decimal + break; case 'H': cursorOffset = 0; setCursorOffset(0); @@ -88,6 +123,43 @@ clearScreen(); currentState = STANDARD; return; + case 'A': + if (cursorOffset <= 0) { + shiftDown(); + } else { + cursorOffset -= VIDEO_WIDTH; + setCursorOffset(cursorOffset); + } + currentState = STANDARD; + return; + case 'B': + if (cursorOffset / VIDEO_WIDTH + 1 >= VIDEO_HEIGHT) { + shiftUp(); + } else { + cursorOffset += VIDEO_WIDTH; + setCursorOffset(cursorOffset); + } + currentState = STANDARD; + return; + case 'C': + if ((cursorOffset + 1) / VIDEO_WIDTH >= VIDEO_HEIGHT) { + newLine(); + } else { + cursorOffset++; + setCursorOffset(cursorOffset); + } + currentState = STANDARD; + return; + case 'D': + if (cursorOffset == 0) { + cursorOffset = VIDEO_WIDTH - 1; + newLine(); + } else { + cursorOffset--; + } + setCursorOffset(cursorOffset); + currentState = STANDARD; + return; } } }