diff --git a/src/kernel/drivers/interrupts/keyboard/keyboard.c b/src/kernel/drivers/interrupts/keyboard/keyboard.c index 86a94bd..54e5fcd 100644 --- a/src/kernel/drivers/interrupts/keyboard/keyboard.c +++ b/src/kernel/drivers/interrupts/keyboard/keyboard.c @@ -27,15 +27,14 @@ '+', 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", "\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}; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, "\e[H", "\e[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, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', diff --git a/src/kernel/drivers/interrupts/keyboard/keyboard.c b/src/kernel/drivers/interrupts/keyboard/keyboard.c index 86a94bd..54e5fcd 100644 --- a/src/kernel/drivers/interrupts/keyboard/keyboard.c +++ b/src/kernel/drivers/interrupts/keyboard/keyboard.c @@ -27,15 +27,14 @@ '+', 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", "\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}; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, "\e[H", "\e[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, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', diff --git a/src/kernel/drivers/textMode/terminal.c b/src/kernel/drivers/textMode/terminal.c index 5ee1813..ecd58b0 100644 --- a/src/kernel/drivers/textMode/terminal.c +++ b/src/kernel/drivers/textMode/terminal.c @@ -76,6 +76,16 @@ uint32_t *currentBuffer = &ansiEscapeBuffer1; +#define addBuffer(i) \ + case i + '0': \ + *currentBuffer *= 10; \ + *currentBuffer += i; \ + break; + +#define forCurrentBuffer(func) \ + for (uint16_t i = 0; i < max(*currentBuffer, 1); i++) \ + func + void writeChar(char c) { if (c == 0) return; @@ -90,30 +100,22 @@ switch (currentAnsiEscapeState) { case BRACKET_OPEN: currentAnsiEscapeState = BUFFER; + currentBuffer = &ansiEscapeBuffer1; + ansiEscapeBuffer1 = 0; + ansiEscapeBuffer2 = 0; 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; + addBuffer(0); + addBuffer(1); + addBuffer(2); + addBuffer(3); + addBuffer(4); + addBuffer(5); + addBuffer(6); + addBuffer(7); + addBuffer(8); + addBuffer(9); case 'H': cursorOffset = 0; setCursorOffset(0); @@ -124,39 +126,47 @@ currentState = STANDARD; return; case 'A': - if (cursorOffset <= 0) { - shiftDown(); - } else { - cursorOffset -= VIDEO_WIDTH; - setCursorOffset(cursorOffset); - } + forCurrentBuffer({ + if (cursorOffset < VIDEO_WIDTH) { + 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); - } + forCurrentBuffer({ + 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); - } + forCurrentBuffer({ + 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--; - } + forCurrentBuffer({ + if (cursorOffset == 0) { + cursorOffset = VIDEO_WIDTH - 1; + shiftDown(); + } else { + cursorOffset--; + } + }); setCursorOffset(cursorOffset); currentState = STANDARD; return; @@ -171,8 +181,11 @@ newLine(); return; case '\b': - setCharAtOffset(--cursorOffset, ' ', currentFormat); - setCursorOffset(cursorOffset); + // savely move cursor left via ANSI-escape codes + writeChar(0x1B); + writeChar('['); + writeChar('D'); + setCharAtOffset(cursorOffset, ' ', currentFormat); return; } setCharAtOffset(cursorOffset++, c, currentFormat);