From 7274084cc07a473c530b129aa217f586781ba70c Mon Sep 17 00:00:00 2001 From: user Date: Thu, 16 Jul 2026 15:45:09 +0200 Subject: syscall: mirror console output to the LCD terminal KPutc's console path now renders each byte on the LCD terminal via term_putc in addition to the serial write. Serial is kept so scripted tests still capture output (and for link-cable/debug), while the shell, command output, and echoed input now appear on-screen in the 40-col font with a live cursor and scrolling. Dropped the boot-time term_demo; the terminal starts blank and fills from real console traffic. term_putc now saves/forces/restores SVBK=1 so it always reads and writes the terminal buffer/state in WRAM bank 1, regardless of which process context KPutc is invoked from (defensive; all procs currently use bank 1). The stack lives in non-banked WRAM, so saving SVBK across the switch is safe. Verified: a headless run of `uname; ls; echo hello world` renders each prompt, the echoed command, and its output on the LCD (captured via the new `--headless --shot` path), and serial capture is unchanged. --- src/boot.asm | 2 +- src/syscall.asm | 4 +++- src/term.asm | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/boot.asm b/src/boot.asm index ea52858..973bc8e 100644 --- a/src/boot.asm +++ b/src/boot.asm @@ -57,7 +57,7 @@ KernelInit: ld [wCurProc+1], a call fs_init ; mount the disk (format on first boot; persists) call term_init ; set up the LCD text terminal - call term_demo ; cursor + scroll demo + ; terminal starts blank; shell output flows in via KPutc ; --- spawn the init task (pid 1); it fork()s the rest --- ld hl, TaskInit diff --git a/src/syscall.asm b/src/syscall.asm index 5557b5f..870a2ff 100644 --- a/src/syscall.asm +++ b/src/syscall.asm @@ -149,9 +149,11 @@ KPutc:: jp sys_putb ; B=fd, E=byte .console ld a, [wKChar] - ld [rSB], a + ld [rSB], a ; mirror to serial (test capture / link) ld a, $81 ld [rSC], a + ld a, [wKChar] + call term_putc ; and render on the LCD terminal ret ; ----------------------------------------------------------------------------- diff --git a/src/term.asm b/src/term.asm index deb6748..10cdccc 100644 --- a/src/term.asm +++ b/src/term.asm @@ -493,7 +493,21 @@ cursor_down: ; ----------------------------------------------------------------------------- ; term_putc - A = character. Print at the cursor, advance, handle \n \r \b. ; ----------------------------------------------------------------------------- +; term_putc guarantees SVBK=1 so the buffer/state at $D5xx/$D6xx are the ones +; we built, no matter which process context KPutc calls us from. The stack is +; in non-banked WRAM ($Cxxx/$Axxx), so saving SVBK across the switch is safe. term_putc:: + ld d, a + ld a, [rSVBK] + push af + ld a, 1 + ld [rSVBK], a + ld a, d + call term_putc_body + pop af + ld [rSVBK], a + ret +term_putc_body: cp 10 jr z, .newline cp 13 -- cgit v1.3.1-sl0p