summaryrefslogtreecommitdiff
path: root/cpu-docs
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-08-25 15:15:03 -0300
committerGabriel Schneider <[email protected]>2026-08-25 15:15:03 -0300
commit894524a2e10296d6db4e82e0fe98b1802910ab77 (patch)
tree0597f8287f90d66627850f82e6b504a77db5125e /cpu-docs
parentc2129d652fc2ab929fceb89e37430170075d2627 (diff)
downloadesp32p4-894524a2e10296d6db4e82e0fe98b1802910ab77.tar.gz
esp32p4-894524a2e10296d6db4e82e0fe98b1802910ab77.zip
pardes runs on the board: install a trap vector, clamp the grid
It works. `zig build interact -Dpardes` flashes the editor, attaches a terminal, and typing changes the screen. TWO FIXES, and the first is the one that mattered. **Install mtvec.** The console went silent immediately after the editor's allocators.init and nothing could explain it: bounded writes did not change it, no Guru Meditation was printed, and execution did not return from pardes_p4_init even when that function was made to return immediately after the marker that DID print. Setting mtvec to this image's own handler, in DIRECT mode, fixed it - and the handler never fires, which is the tell. hal/intr.zig:302 names the mechanism: the CLIC can fetch handlers from MTVT instead of trapping to mtvec, and the bootloader leaves that vectored mode on with a table this image does not own. `systimer.init` is enabled a few lines earlier, so its first tick dispatched through a vector table belonging to nobody. Writing mtvec with the low two bits clear selects direct mode and the interrupt has somewhere legitimate to go. That single register write took the port from "faults before the editor starts" to the whole of pardes_p4_init succeeding, including vaxis's capability handshake going out over the wire: \e[?1049h \e[?1016$p \e[?2027$p \e[?2031$p \e[?2048h \e[6n \e[>q \e[?u \e_Gi=1,a=q \e[c alt screen, in-band resize, cursor report, kitty keyboard, kitty graphics, DA1 - every one of them answered by the terminal emulator on the far end of the CH340, which is the whole design. **Clamp the grid, and make a failed resize atomic.** Pardes.init then returned OutOfMemory with 9,128 bytes left of 393,216: every cell is paid for four times (vaxis Screen + InternalScreen, pardes Surface + previous_cells). Measured: 40x12 initialises with room to spare, 80x24 does not. So max_cols/max_rows cap the geometry and the host's larger terminal simply hosts a corner of itself. The second half of that is subtler and cost a working editor. `Vaxis.resize` deinits both screens BEFORE allocating the replacements (Vaxis.zig:194-206), so a failed resize leaves vaxis with freed screens and renders nothing at all - and the host bridge injects a size report on attach, so an unclamped 80x24 killed an editor that had already drawn its interface. A failed resize now restores the previous geometry. Measured end to end on the die: the first frame is ~1.5 KB of ANSI drawing the acme tag bars ("New Newcol Joincol Find Grep Help Change" / "Save New Newtty Del Filter"), and typing two characters produces a 116-byte incremental update that draws the `^` modified-marker and moves the cursor to row 3 column 3. vaxis's damage tracking is doing exactly what a 11.9 KB/s link needs. Image is 598,528 B of the 1,536,000 B factory partition, 39%. Also retired here: the I1..I10 and B1..B9 bring-up markers, the MMU table dump, the cache before/after probe, the allocator and vtable pointer dumps, and the RX byte probe. Each answered its question and each answer now lives in a comment beside the code it explains. The trap handler stays - it is the diagnostic this port most needed and did not have.
Diffstat (limited to 'cpu-docs')
0 files changed, 0 insertions, 0 deletions