diff --git a/stage23/lib/panic.s2.c b/stage23/lib/panic.s2.c index 8c841d60..70c2ebdf 100644 --- a/stage23/lib/panic.s2.c +++ b/stage23/lib/panic.s2.c @@ -14,100 +14,6 @@ #include #include -#if bios == 1 -void fallback_raw_putchar(uint8_t c) { - struct rm_regs r = {0}; - r.eax = 0x0e00 | c; - rm_int(0x10, &r, &r); -} - -void fallback_clear(bool move) { - (void)move; - struct rm_regs r = {0}; - rm_int(0x11, &r, &r); - switch ((r.eax >> 4) & 3) { - case 0: - r.eax = 3; - break; - case 1: - r.eax = 1; - break; - case 2: - r.eax = 3; - break; - case 3: - r.eax = 7; - break; - } - rm_int(0x10, &r, &r); -} - -void fallback_set_cursor_pos(size_t x, size_t y) { - struct rm_regs r = {0}; - r.eax = 0x0200; - r.ebx = 0; - r.edx = (y << 8) + x; - rm_int(0x10, &r, &r); -} - -void fallback_get_cursor_pos(size_t *x, size_t *y) { - struct rm_regs r = {0}; - r.eax = 0x0300; - r.ebx = 0; - rm_int(0x10, &r, &r); - *x = r.edx & 0xff; - *y = r.edx >> 8; -} - -#elif uefi == 1 -static int cursor_x = 0, cursor_y = 0; - -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++; - } - } -} - -void fallback_clear(bool move) { - (void)move; - gST->ConOut->ClearScreen(gST->ConOut); - cursor_x = cursor_y = 0; -} - -void fallback_set_cursor_pos(size_t x, size_t y) { - if (x >= 80 || y >= 25) - return; - gST->ConOut->SetCursorPosition(gST->ConOut, x, y); - cursor_x = x; - cursor_y = y; -} - -void fallback_get_cursor_pos(size_t *x, size_t *y) { - *x = cursor_x; - *y = cursor_y; -} -#endif - noreturn void panic(bool allow_menu, const char *fmt, ...) { va_list args; @@ -124,23 +30,7 @@ noreturn void panic(bool allow_menu, const char *fmt, ...) { } if (term_backend == NOT_READY) { -#if uefi == 1 - if (!efi_boot_services_exited) { - gST->ConOut->Reset(gST->ConOut, false); - gST->ConOut->SetMode(gST->ConOut, 0); - cursor_x = cursor_y = 0; -#elif bios == 1 - fallback_clear(true); -#endif - term_notready(); - raw_putchar = fallback_raw_putchar; - clear = fallback_clear; - set_cursor_pos = fallback_set_cursor_pos; - get_cursor_pos = fallback_get_cursor_pos; - term_backend = FALLBACK; -#if uefi == 1 - } -#endif + term_fallback(); } print("\033[31mPANIC\033[37;1m\033[0m: "); diff --git a/stage23/lib/term.h b/stage23/lib/term.h index 7c4ab431..13a9a2d3 100644 --- a/stage23/lib/term.h +++ b/stage23/lib/term.h @@ -45,6 +45,8 @@ extern size_t term_rows, term_cols; extern bool term_runtime; extern bool early_term; +void term_fallback(void); + void term_reinit(void); void term_deinit(void); void term_vbe(size_t width, size_t height); diff --git a/stage23/lib/term.s2.c b/stage23/lib/term.s2.c index aa2667cd..c0543796 100644 --- a/stage23/lib/term.s2.c +++ b/stage23/lib/term.s2.c @@ -77,6 +77,120 @@ void term_notready(void) { term_cols = 100; } +#if bios == 1 +void fallback_raw_putchar(uint8_t c) { + struct rm_regs r = {0}; + r.eax = 0x0e00 | c; + rm_int(0x10, &r, &r); +} + +void fallback_clear(bool move) { + (void)move; + struct rm_regs r = {0}; + rm_int(0x11, &r, &r); + switch ((r.eax >> 4) & 3) { + case 0: + r.eax = 3; + break; + case 1: + r.eax = 1; + break; + case 2: + r.eax = 3; + break; + case 3: + r.eax = 7; + break; + } + rm_int(0x10, &r, &r); +} + +void fallback_set_cursor_pos(size_t x, size_t y) { + struct rm_regs r = {0}; + r.eax = 0x0200; + r.ebx = 0; + r.edx = (y << 8) + x; + rm_int(0x10, &r, &r); +} + +void fallback_get_cursor_pos(size_t *x, size_t *y) { + struct rm_regs r = {0}; + r.eax = 0x0300; + r.ebx = 0; + rm_int(0x10, &r, &r); + *x = r.edx & 0xff; + *y = r.edx >> 8; +} + +#elif uefi == 1 +static int cursor_x = 0, cursor_y = 0; + +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++; + } + } +} + +void fallback_clear(bool move) { + (void)move; + gST->ConOut->ClearScreen(gST->ConOut); + cursor_x = cursor_y = 0; +} + +void fallback_set_cursor_pos(size_t x, size_t y) { + if (x >= 80 || y >= 25) + return; + gST->ConOut->SetCursorPosition(gST->ConOut, x, y); + cursor_x = x; + cursor_y = y; +} + +void fallback_get_cursor_pos(size_t *x, size_t *y) { + *x = cursor_x; + *y = cursor_y; +} +#endif + +void term_fallback(void) { +#if uefi == 1 + if (!efi_boot_services_exited) { + gST->ConOut->Reset(gST->ConOut, false); + gST->ConOut->SetMode(gST->ConOut, 0); + cursor_x = cursor_y = 0; +#elif bios == 1 + fallback_clear(true); +#endif + term_notready(); + raw_putchar = fallback_raw_putchar; + clear = fallback_clear; + set_cursor_pos = fallback_set_cursor_pos; + get_cursor_pos = fallback_get_cursor_pos; + term_backend = FALLBACK; +#if uefi == 1 + } +#endif +} + void (*raw_putchar)(uint8_t c); void (*clear)(bool move); void (*enable_cursor)(void);