diff options
| author | user <user@clank> | 2026-07-16 13:54:23 +0200 |
|---|---|---|
| committer | user <user@clank> | 2026-07-16 13:54:23 +0200 |
| commit | 4656a1003226709e9b3c804ec32b4913fca4c7f4 (patch) | |
| tree | 516185fb1827495f0fe747b6365eb963ad5cf031 /src/boot.asm | |
| parent | fs: reject open()/read() on a directory (EISDIR) (diff) | |
| download | gbos-4656a1003226709e9b3c804ec32b4913fca4c7f4.tar.gz gbos-4656a1003226709e9b3c804ec32b4913fca4c7f4.tar.xz gbos-4656a1003226709e9b3c804ec32b4913fca4c7f4.zip | |
term: 40-column text terminal on the CGB LCD (4x8 dynamic tiles)
Add a background-tile text terminal that packs TWO 4px-wide characters
into each 8x8 tile, giving a 40x18 grid instead of the 20x18 you'd get
from an 8x8 font. The tilemap is static (one dedicated VRAM tile per
screen position); we rebuild a tile's 16 bytes from two glyphs whenever
a character changes. 360 tiles exceed the 256 a single tilemap can
address, so positions 256-359 live in VRAM bank 1 via the CGB tilemap
attribute bank-bit -- hence CGB-only.
- Switch the ROM to CGB (rgbfix -C). Safe for the FS: every process has
PROC_WRAMB=1, so SVBK stays on bank 1 and the WRAMX FS caches don't move.
- CGB BG palette 0 = white bg / black text via BCPS/BCPD.
- src/term.asm: term_init (palette + static tilemap + clear buffer),
build_tile (combine two 4px glyphs -> one 8x8 tile, correct VRAM bank),
term_redraw (rebuild all tiles), term_puts, term_show, term_test.
- src/font.asm: 96-glyph 3x5-in-4x8 font, generated by tools/genfont.py.
- 40x18 text buffer at $D600 (WRAMX, above the FS caches).
- tools/ppmview.py: render a --shot PPM as ASCII so the LCD is inspectable
from the shell during development.
Verified via emulator screenshot: "GBOS TERMINAL", the alphabet, and a
bank-1 row all render legibly at 40 columns. Serial shell + filesystem
still work unchanged.
Note: a full term_redraw builds 360 tiles and takes ~8 frames; fine for
incremental single-char updates, but scrolling needs a smarter path
(next milestone). Input (no keyboard) is also still TODO.
Diffstat (limited to '')
| -rw-r--r-- | src/boot.asm | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/boot.asm b/src/boot.asm index 9d9571e..0a5f2e3 100644 --- a/src/boot.asm +++ b/src/boot.asm @@ -56,6 +56,8 @@ KernelInit: ld a, HIGH(wKernelPCB) 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_test ; render a test pattern ; --- spawn the init task (pid 1); it fork()s the rest --- ld hl, TaskInit |
