From 0c49f05afe84f23c361a05f2890b966af21536bb Mon Sep 17 00:00:00 2001 From: Robert Pengelly Date: Sun, 18 Oct 2026 12:30:45 +0100 Subject: [PATCH] Implement BIOS cursor visibility control and restore on exit --- interrupts.c | 7 +++++++ main.c | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/interrupts.c b/interrupts.c index 5c8edd5..4502012 100644 --- a/interrupts.c +++ b/interrupts.c @@ -6044,6 +6044,10 @@ static void bios_video_initialize (void) { } bios_video_initialized = 1; + + /* The BIOS text screen starts blank; remove any previous host output. */ + fputs ("\033[2J\033[H", stdout); + fflush (stdout); } @@ -6087,6 +6091,9 @@ static void int_10 (CPU8086 *cpu) { bios_cursor_start = (uint8_t) (cpu->regs[REG_CX] >> 8); bios_cursor_end = (uint8_t) cpu->regs[REG_CX]; + fputs ((bios_cursor_start & 0x20) ? "\033[?25l" : "\033[?25h", stdout); + fflush (stdout); + break; case 0x02: { /* set cursor position */ diff --git a/main.c b/main.c index 14d9a34..d27e696 100644 --- a/main.c +++ b/main.c @@ -15,6 +15,13 @@ #define MEM_SIZE (640UL << 10) #define EXE_LOAD_SEG 0x0060 +static void restore_terminal_cursor (void) { + + fputs ("\033[?25h", stdout); + fflush (stdout); + +} + static void usage (const char *argv0) { fprintf (stderr, "Usage: %s [--trace] program.com\n", argv0); } @@ -270,6 +277,15 @@ int main (int argc, char **argv) { } + if (atexit (restore_terminal_cursor) != 0) { + + fprintf (stderr, "Failed to register terminal cursor cleanup\n"); + + free (mem); + return 1; + + } + /* init_dos_heap(&cpu, 0x2000); */ init_ivt (&cpu); -- 2.34.1