:: commit a06713def67d0dbb2dd61ed976e5b9c1f9a12a05

mintsuki <mintsuki@protonmail.com> — 2022-09-27 23:08

parents: 172c2b9569

term: Misc bug fixes in fallback backends

diff --git a/common/lib/term.c b/common/lib/term.c
index 1dac207f..c55d0892 100644
--- a/common/lib/term.c
+++ b/common/lib/term.c
@@ -54,8 +54,12 @@ static void fallback_raw_putchar(uint8_t c) {
     rm_int(0x10, &r, &r);
 }
 
+static void fallback_set_cursor_pos(size_t x, size_t y);
+static void fallback_get_cursor_pos(size_t *x, size_t *y);
+
 static void fallback_clear(bool move) {
-    (void)move;
+    size_t x, y;
+    fallback_get_cursor_pos(&x, &y);
     struct rm_regs r = {0};
     rm_int(0x11, &r, &r);
     switch ((r.eax >> 4) & 3) {
@@ -73,6 +77,10 @@ static void fallback_clear(bool move) {
             break;
     }
     rm_int(0x10, &r, &r);
+    if (move) {
+        x = y = 0;
+    }
+    fallback_set_cursor_pos(x, y);
 }
 
 static void fallback_set_cursor_pos(size_t x, size_t y) {
@@ -92,44 +100,53 @@ static void fallback_get_cursor_pos(size_t *x, size_t *y) {
     *y = r.edx >> 8;
 }
 
+static void fallback_scroll(void) {
+    size_t x, y;
+    fallback_get_cursor_pos(&x, &y);
+    fallback_set_cursor_pos(term_cols - 1, term_rows - 1);
+    fallback_raw_putchar(' ');
+    fallback_set_cursor_pos(x, y);
+}
+
 #elif defined (UEFI)
-static int cursor_x = 0, cursor_y = 0;
+
+static size_t cursor_x = 0, cursor_y = 0;
+
+static void fallback_scroll(void) {
+    gST->ConOut->SetCursorPosition(gST->ConOut, term_cols - 1, term_rows - 1);
+    CHAR16 string[2];
+    string[0] = ' ';
+    string[1] = 0;
+    gST->ConOut->OutputString(gST->ConOut, string);
+    gST->ConOut->SetCursorPosition(gST->ConOut, cursor_x, cursor_y);
+}
 
 static void fallback_raw_putchar(uint8_t c) {
     CHAR16 string[2];
     string[0] = c;
     string[1] = 0;
     gST->ConOut->OutputString(gST->ConOut, string);
-    switch (c) {
-        case 0x08:
-            if (cursor_x > 0)
-                cursor_x--;
-            break;
-        case 0x0A:
-            cursor_x = 0;
-            break;
-        case 0x0D:
-            if (cursor_y < 24)
-                cursor_y++;
-            break;
-        default:
-            if (++cursor_x > 80) {
-                cursor_x = 0;
-                if (cursor_y < 24)
-                    cursor_y++;
-            }
+    if (++cursor_x >= term_cols) {
+        cursor_x = 0;
+        if (++cursor_y >= term_rows) {
+            cursor_y--;
+        }
     }
+    gST->ConOut->SetCursorPosition(gST->ConOut, cursor_x, cursor_y);
 }
 
 static void fallback_clear(bool move) {
-    (void)move;
     gST->ConOut->ClearScreen(gST->ConOut);
-    cursor_x = cursor_y = 0;
+    if (move) {
+        cursor_x = cursor_y = 0;
+    }
+    gST->ConOut->SetCursorPosition(gST->ConOut, cursor_x, cursor_y);
 }
 
 static void fallback_set_cursor_pos(size_t x, size_t y) {
-    if (x >= 80 || y >= 25)
+    if (x >= term_cols || y >= term_rows) {
         return;
+    }
     gST->ConOut->SetCursorPosition(gST->ConOut, x, y);
     cursor_x = x;
     cursor_y = y;
@@ -148,11 +165,25 @@ void term_fallback(void) {
     if (!efi_boot_services_exited) {
 #endif
         fallback_clear(true);
+#if defined (UEFI)
+        gST->ConOut->EnableCursor(gST->ConOut, false);
+#endif
         raw_putchar = fallback_raw_putchar;
         clear = fallback_clear;
         set_cursor_pos = fallback_set_cursor_pos;
         get_cursor_pos = fallback_get_cursor_pos;
+        term_scroll = fallback_scroll;
+#if defined (UEFI)
+        UINTN uefi_term_x_size, uefi_term_y_size;
+        gST->ConOut->QueryMode(gST->ConOut, gST->ConOut->Mode->Mode, &uefi_term_x_size, &uefi_term_y_size);
+        term_cols = uefi_term_x_size;
+        term_rows = uefi_term_y_size;
+#elif defined (BIOS)
+        term_cols = 80;
+        term_rows = 25;
+#endif
         term_backend = FALLBACK;
+        term_reinit();
 #if defined (UEFI)
     }
 #endif
tab: 248 wrap: offon