From a5557c75767f7201d5df8c6f95c162044072ef10 Mon Sep 17 00:00:00 2001 From: user Date: Thu, 16 Jul 2026 16:07:01 +0200 Subject: osk: toggle-able on-screen keyboard on the window layer A joypad-driven keyboard that costs zero permanent screen space: it lives on the GB window layer, so SELECT just flips LCDC bit 5 (window enable) and the terminal's background layer underneath is never disturbed. - src/joypad.asm: read $FF00 with edge detection (wPadCur/Prev/New). - src/osk.asm: 3x20 key grid (letters, digits, space, punctuation, plus Enter/Backspace) built once into spare bank-1 VRAM tiles (104+) and laid out on the $9C00 window map, docked to the bottom 3 rows. The highlighted key is a palette swap on its window attribute byte (CGB BG palette 1 = inverted), so moving the cursor is 1-2 attribute writes with no tile rebuilding. SELECT toggles, d-pad moves, A types. - KGetc's console poll loop now polls the joypad and osk_handle each iteration; a key press returns its byte to the reader exactly like a serial byte, so the shell is oblivious to the input source. Verified in the emulator (via --keys): SELECT shows the keyboard, the highlight tracks the d-pad, and typing "ls"+Enter runs the command and lists the files; a second SELECT hides it and reclaims the full 18 rows. Known limitation: the OSK overlays the bottom 3 terminal rows, so if the prompt has scrolled to the very bottom the current input line can be hidden. A follow-up can add a scroll region (terminal uses rows 0-14 while the OSK is up). Input over serial still works unchanged. --- src/boot.asm | 1 + 1 file changed, 1 insertion(+) (limited to 'src/boot.asm') diff --git a/src/boot.asm b/src/boot.asm index 973bc8e..7eed4a8 100644 --- a/src/boot.asm +++ b/src/boot.asm @@ -57,6 +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 osk_init ; build the on-screen keyboard (window layer) ; terminal starts blank; shell output flows in via KPutc ; --- spawn the init task (pid 1); it fork()s the rest --- -- cgit v1.3.1-sl0p