aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoruser <user@clank>2026-07-16 15:45:09 +0200
committeruser <user@clank>2026-07-16 15:45:09 +0200
commit7274084cc07a473c530b129aa217f586781ba70c (patch)
treeff51346fa5939c6b60e2eb9b4f88f73dcc5ff22d
parentterm: cursor + O(1) line scrolling (diff)
downloadgbos-7274084cc07a473c530b129aa217f586781ba70c.tar.gz
gbos-7274084cc07a473c530b129aa217f586781ba70c.tar.xz
gbos-7274084cc07a473c530b129aa217f586781ba70c.zip
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.
Diffstat (limited to '')
-rw-r--r--src/boot.asm2
-rw-r--r--src/syscall.asm4
-rw-r--r--src/term.asm14
3 files changed, 18 insertions, 2 deletions
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