1
0
Fork 0
mirror of https://github.com/imjasonh/nescript synced 2026-07-08 08:55:38 +00:00
nescript/tests/emulator/goldens
Claude 854b61ea1e
docs + example: HUD demo and language-guide VRAM buffer section
Follow-up to 807c9c7 (the VRAM update buffer core). Adds the
realistic-HUD example the core was missing, plus a language-guide
section that explains when and how to use the three buffer
intrinsics.

**examples/hud_demo.ne**

A bouncing-ball playfield with a classic status bar across the
top:
- 5-cell lives indicator that ticks down once per second and
  resets at zero, drawn via `nt_fill_h` (plus a second
  `nt_fill_h` to erase the stale tail).
- Score counter at the right edge that bumps on every wall
  bounce, drawn via `nt_set`.
- One-shot `nt_attr` call on the first frame flipping the
  top-left metatile group to sub-palette 1 (the red HUD
  palette) so the UI chrome reads as distinct from the
  playfield.

The demo's point is the `last_score != score` / `last_lives !=
lives` shadow-compare pattern: on the ~58-of-60 frames where
nothing changed, the buffer stays empty and drain work is zero.
That's the whole reason the VRAM buffer exists — per-frame cost
scales with what moved, not with HUD complexity. Committed
`.nes` + pixel/audio goldens.

**docs/language-guide.md**

New "VRAM Update Buffer" section between "Hardware Intrinsics"
and "Inline Assembly". Covers:
- Why user code can't just poke `$2006` / `$2007` directly.
- The three intrinsics + their coordinate systems (cell, not
  pixel).
- The HUD pattern with a ready-to-paste code snippet and a
  pointer at `examples/hud_demo.ne`.
- A per-entry budget table + worked 1000-cycle drain example
  against the ~2273-cycle vblank budget.
- Known limits: horizontal-only, no overflow check,
  no coalescing — all already tracked under `future-work.md` §G.

**examples/README.md**

`vram_buffer_demo.ne` reframed as the minimal test-case exercise
it actually is, with a pointer at `hud_demo.ne` for the realistic
pattern. New table row for `hud_demo.ne`.

All 758 tests pass. Clippy clean. 48/48 emulator goldens match.
2026-04-18 21:34:44 +00:00
..
arrays_and_functions.audio.hash
arrays_and_functions.png compiler: fix three scoping bugs; war: revert all local/param workarounds 2026-04-15 20:33:41 +00:00
audio_demo.audio.hash codegen: emit gate markers at end of generate() to protect peephole 2026-04-16 21:31:47 +00:00
audio_demo.png
auto_chr_background.audio.hash
auto_chr_background.png
auto_sprite_flicker.audio.hash compiler: GNROM / debug port / sprite flicker / fade / sprite-0 split + docs 2026-04-18 19:31:55 +00:00
auto_sprite_flicker.png compiler: GNROM / debug port / sprite flicker / fade / sprite-0 split + docs 2026-04-18 19:31:55 +00:00
axrom_simple.audio.hash compiler: PRNG / edge input / palette fade / AxROM / CNROM / FCEUX labels 2026-04-18 18:13:18 +00:00
axrom_simple.png compiler: PRNG / edge input / palette fade / AxROM / CNROM / FCEUX labels 2026-04-18 18:13:18 +00:00
bitwise_ops.audio.hash
bitwise_ops.png
bouncing_ball.audio.hash
bouncing_ball.png
cnrom_simple.audio.hash compiler: PRNG / edge input / palette fade / AxROM / CNROM / FCEUX labels 2026-04-18 18:13:18 +00:00
cnrom_simple.png compiler: PRNG / edge input / palette fade / AxROM / CNROM / FCEUX labels 2026-04-18 18:13:18 +00:00
coin_cavern.audio.hash
coin_cavern.png
comparisons.audio.hash
comparisons.png codegen: emit gate markers at end of generate() to protect peephole 2026-04-16 21:31:47 +00:00
edge_input_demo.audio.hash compiler: PRNG / edge input / palette fade / AxROM / CNROM / FCEUX labels 2026-04-18 18:13:18 +00:00
edge_input_demo.png compiler: PRNG / edge input / palette fade / AxROM / CNROM / FCEUX labels 2026-04-18 18:13:18 +00:00
fade_demo.audio.hash compiler: GNROM / debug port / sprite flicker / fade / sprite-0 split + docs 2026-04-18 19:31:55 +00:00
fade_demo.png compiler: GNROM / debug port / sprite flicker / fade / sprite-0 split + docs 2026-04-18 19:31:55 +00:00
feature_canary.audio.hash examples: add feature_canary that turns red on any memory silent-drop regression 2026-04-18 00:14:40 +00:00
feature_canary.png examples: add feature_canary that turns red on any memory silent-drop regression 2026-04-18 00:14:40 +00:00
friendly_assets.audio.hash codegen: emit gate markers at end of generate() to protect peephole 2026-04-16 21:31:47 +00:00
friendly_assets.png
function_chain.audio.hash
function_chain.png
gnrom_simple.audio.hash compiler: GNROM / debug port / sprite flicker / fade / sprite-0 split + docs 2026-04-18 19:31:55 +00:00
gnrom_simple.png compiler: GNROM / debug port / sprite flicker / fade / sprite-0 split + docs 2026-04-18 19:31:55 +00:00
hello_sprite.audio.hash
hello_sprite.png
hud_demo.audio.hash docs + example: HUD demo and language-guide VRAM buffer section 2026-04-18 21:34:44 +00:00
hud_demo.png docs + example: HUD demo and language-guide VRAM buffer section 2026-04-18 21:34:44 +00:00
i16_demo.audio.hash compiler: i16 / SRAM saves / inline-asm dot labels / docs 2026-04-18 20:49:06 +00:00
i16_demo.png compiler: i16 / SRAM saves / inline-asm dot labels / docs 2026-04-18 20:49:06 +00:00
inline_asm_demo.audio.hash
inline_asm_demo.png codegen: reuse analyzer's local allocations so inline asm {param} works 2026-04-16 16:03:10 +00:00
logic_ops.audio.hash
logic_ops.png
loop_break_continue.audio.hash
loop_break_continue.png
match_demo.audio.hash
match_demo.png
metasprite_demo.audio.hash
metasprite_demo.png
mmc1_banked.audio.hash
mmc1_banked.png
mmc3_per_state_split.audio.hash
mmc3_per_state_split.png
nested_structs.audio.hash
nested_structs.png
noise_triangle_sfx.audio.hash codegen: emit gate markers at end of generate() to protect peephole 2026-04-16 21:31:47 +00:00
noise_triangle_sfx.png
palette_and_background.audio.hash
palette_and_background.png codegen: emit gate markers at end of generate() to protect peephole 2026-04-16 21:31:47 +00:00
palette_brightness_demo.audio.hash compiler: PRNG / edge input / palette fade / AxROM / CNROM / FCEUX labels 2026-04-18 18:13:18 +00:00
palette_brightness_demo.png compiler: PRNG / edge input / palette fade / AxROM / CNROM / FCEUX labels 2026-04-18 18:13:18 +00:00
platformer.audio.hash examples: move state-scoped globals to state-local in coin_cavern + platformer 2026-04-17 11:58:02 +00:00
platformer.png
pong.audio.hash analyzer+codegen: lift the 4-param ceiling via a direct-write calling convention 2026-04-18 02:34:56 +00:00
pong.png codegen: fuse compare-then-branch to drop boolean materialization 2026-04-16 17:10:02 +00:00
prng_demo.audio.hash compiler: PRNG / edge input / palette fade / AxROM / CNROM / FCEUX labels 2026-04-18 18:13:18 +00:00
prng_demo.png review: tighten PRNG / void-intrinsic / FCEUX path handling 2026-04-18 18:48:55 +00:00
scanline_split.audio.hash
scanline_split.png
sfx_pitch_envelope.audio.hash codegen: emit gate markers at end of generate() to protect peephole 2026-04-16 21:31:47 +00:00
sfx_pitch_envelope.png linker: skip default palette + rendering enable for non-visual ROMs 2026-04-16 21:15:08 +00:00
sha256.audio.hash examples/sha256: interactive SHA-256 hasher with on-screen keyboard 2026-04-16 14:02:58 +00:00
sha256.png examples/sha256: interactive SHA-256 hasher with on-screen keyboard 2026-04-16 14:02:58 +00:00
sprite_0_split_demo.audio.hash compiler: GNROM / debug port / sprite flicker / fade / sprite-0 split + docs 2026-04-18 19:31:55 +00:00
sprite_0_split_demo.png compiler: GNROM / debug port / sprite flicker / fade / sprite-0 split + docs 2026-04-18 19:31:55 +00:00
sprite_flicker_demo.audio.hash sprite-per-scanline: add cycle_sprites runtime flicker + debug telemetry 2026-04-15 22:07:19 +00:00
sprite_flicker_demo.png sprite-per-scanline: add cycle_sprites runtime flicker + debug telemetry 2026-04-15 22:07:19 +00:00
sprites_and_palettes.audio.hash
sprites_and_palettes.png
sram_demo.audio.hash compiler: i16 / SRAM saves / inline-asm dot labels / docs 2026-04-18 20:49:06 +00:00
sram_demo.png compiler: i16 / SRAM saves / inline-asm dot labels / docs 2026-04-18 20:49:06 +00:00
state_machine.audio.hash
state_machine.png
structs_enums_for.audio.hash
structs_enums_for.png
two_player.audio.hash
two_player.png
uxrom_banked.audio.hash
uxrom_banked.png
uxrom_banked_to_banked.audio.hash
uxrom_banked_to_banked.png
uxrom_user_banked.audio.hash
uxrom_user_banked.png
vram_buffer_demo.audio.hash compiler: VRAM update buffer (nt_set / nt_attr / nt_fill_h) 2026-04-18 21:14:31 +00:00
vram_buffer_demo.png compiler: VRAM update buffer (nt_set / nt_attr / nt_fill_h) 2026-04-18 21:14:31 +00:00
war.audio.hash analyzer+codegen: lift the 4-param ceiling via a direct-write calling convention 2026-04-18 02:34:56 +00:00
war.png examples: regenerate ROMs, gifs, and goldens after codegen local fix 2026-04-16 16:12:46 +00:00