journal 2026-05-05

P73 AtomVM renders framebuffer frames

P73 is the follow-through from the P72 I/O bridge: Erlang code running inside AtomVM now renders a framebuffer animation.

The key addition is chip:hline/4. P72 had chip:write16/2, which was good for proving single-pixel writes but too clumsy for full frames. P73 keeps the render decisions in Erlang and lets the platform NIF write each scanline into the RGB565 framebuffer window.

Captured UART:

AtomVM on P73 (framebuffer graphics demo)
Starting AtomVM revision 0.8.0-dev+git.b7503e6
Found startup beam: graphics.beam
P73 AtomVM framebuffer starting
framebuffer base: 15728640
rendered frames: 8
render delta ms: 588
P73 AtomVM framebuffer PASS
Return value: ok
AtomVM exited result=0

Harness:

[harness] frame 0 dumped (24576 bytes)
[harness] frame 1 dumped (24576 bytes)
[harness] frame 2 dumped (24576 bytes)
[harness] frame 3 dumped (24576 bytes)
[harness] frame 4 dumped (24576 bytes)
[harness] frame 5 dumped (24576 bytes)
[harness] frame 6 dumped (24576 bytes)
[harness] frame 7 dumped (24576 bytes)
[harness] === run ended after 24288424 post-load cycles ===
[harness] halted=1, halt_code=0x00000001

The viewer generated:

Honest status: RTL simulation PASS. F/D architectural compliance was NOT RUN. LibreLane hardening was NOT RUN.

The next cleanup would be to make the framebuffer map less ad hoc. Right now 0x00f00000 is a convention chosen because AtomVM’s bundled lib.avm and main.avm occupy the 8 MiB and 12 MiB slots.