aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* gbhud: live joypad display (cute Game Boy layout, buttons light up)gbc dev2026-07-152-0/+20
| | | | | New INPUT section reads hJoyHeld (0xFFB4) and draws a d-pad cross + A/B circles + SEL/START pills; held buttons glow bright green, idle ones dim grey.
* gbctl: 'hud' kills any existing HUD pane before spawning (no double-HUD)gbc dev2026-07-1513-1/+26
| | | | | | gbctl hud now scans tmux for panes started with gbhud.py and kills them before spawning, so there's never more than one HUD (fixes the double-spawn flicker). Added 'gbctl hud --kill' to just tear the HUD down.
* fix(control): ignore SIGPIPE so a vanishing client can't kill the emulatorgbc dev2026-07-155-14/+38
| | | | | | | | | A client that connects and closes before reading (e.g. the HUD's liveness probe) made the greeting write() raise SIGPIPE, terminating the whole emulator - this was behind much of the 'it keeps dying' this session. Also: gbhud now re-resolves the live instance from the registry on every reconnect (skipping stale sockets by test-connecting), so the HUD follows respawns, and its box rendering is ANSI-width-correct.
* tools: live debug HUD (gbhud.py) + 'gbctl hud'gbc dev2026-07-1511-1/+202
| | | | | | | Reads WRAM over the control socket, resolves addresses from pokeyellow.sym, and pretty-prints game state (location, player pos/facing, movement+collision debug, player name/money/badges, party nicknames/levels/HP bars) refreshing ~5Hz. 'gbctl hud' spawns it in a tmux split bound to the live instance.
* apu: register-level emulation of 0xFF10-0xFF3F (fixes music fades)gbc dev2026-07-154-2/+123
| | | | | | | | | The APU was a black hole: reads returned 0xFF, writes were dropped. That hangs any game that fades music out by decrementing the NR50/rAUDVOL volume register until it reads 0 (Pokemon's StopMusic spin-wait) - the write never stuck, the read never hit 0, infinite loop. Store the 48 sound registers and return them with the standard hardware read-back OR-masks (NR50 mask 0x00 = exact readback). No synthesis, just correct register behavior.
* control: socket-based debug channel + gbctl CLI drivergbc dev2026-07-147-3/+1271
| | | | | | | | | | | | | | Replace the input-only FIFO's limitations with a Unix-domain socket control channel (--sock) that is a superset of the button vocabulary plus emulator introspection: read/write bus memory, get/set CPU context, single-step, PC breakpoints, value-change watchpoints, run/pause. Being a socket it replies to each command and broadcasts async 'event stop ...' lines; a stored last-stop record (stopinfo) lets per-request clients recover a missed event. Add gbctl: a stdlib-python CLI that spawns a tmux pane running the emulator on a ROM, auto-resolves the socket, and drives it with terse verbs (cpu/read/write/ reg/step/break/watch/continue/pause/press/hold/screen/stop). The FIFO stays as legacy input-only.
* speed control: frame skipping to decouple terminal draw from emulationgbc dev2026-07-044-13/+120
| | | | | | | Emulation always runs at native rate (correct game speed); --frameskip N draws only 1 of every N+1 frames so a slow terminal no longer bottlenecks the loop. Adds --fps cap, --uncapped/--turbo, live [ ] and f keys, HUD readout, and an exit summary of emulated-vs-drawn fps. Replaces the confusing --render-fps.
* input: external control channel via FIFOgbc dev2026-07-044-23/+159
| | | | | | | Adds --fifo [path] opening a named pipe that accepts button commands from any process. Supports momentary taps (a, start, name:N), deterministic hold/release (+name / -name), and 'release'. Merges with keyboard input; held state carries true key-up semantics the terminal can't provide. GBC_INPUT_DEBUG traces state.
* renderer: inter-frame diffing to minimize terminal outputgbc dev2026-07-043-9/+59
| | | | | | | Only cells that changed since the previous frame are redrawn, using cursor positioning to skip unchanged runs. Static screens write nothing after the first frame (~108x reduction on acid2). SIGWINCH forces a full repaint. Verified pixel-exact against the framebuffer (11520/11520 cells, 0 mismatch).
* docs: note mem_timing-2 passinggbc dev2026-07-041-1/+1
|
* add status line HUD, README with architecture and test statusgbc dev2026-07-042-0/+75
|
* terminal renderer (truecolor half-block), input, screenshot modegbc dev2026-07-044-4/+186
|
* core emulator: SM83 CPU, MMU, timer, PPU, CGB supportgbc dev2026-07-048-0/+1158
| | | | Passes blargg cpu_instrs (all 11), instr_timing, mem_timing.
* scaffolding: build system, cartridge loader with MBC1/2/3/5, core typesgbc dev2026-07-046-0/+483