<feed xmlns='http://www.w3.org/2005/Atom'>
<title>sl0pboy.git/tools, branch master</title>
<subtitle>sl0pboy - a Game Boy Color emulator (companion to the gbos OS)</subtitle>
<id>https://git.sl0p.foo/sl0pboy.git/atom/tools?h=master</id>
<link rel='self' href='https://git.sl0p.foo/sl0pboy.git/atom/tools?h=master'/>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/'/>
<updated>2026-07-18T20:45:06Z</updated>
<entry>
<title>tools: mk_sl0pboy_bios.py - fork the CGB boot ROM's GAME BOY -&gt; SL0PBOY</title>
<updated>2026-07-18T20:45:06Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-18T20:45:06Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=79c8551c0599ea087502ae59bbe72d1ae8bbabf1'/>
<id>urn:sha1:79c8551c0599ea087502ae59bbe72d1ae8bbabf1</id>
<content type='text'>
The stock CGB boot ROM draws its GAME BOY wordmark from a 192-byte blob
at $0607 (routine $03F0 copies it to VRAM tiles $08-$37: 48 tiles, 4
bytes each, every byte a row doubled vertically). This re-encodes that
blob with a bold-italic SL0PBOY bitmap of the same size and patches it
in place over a local bios/gbc_bios.bin -&gt; bios/sl0pboy_bios.bin. No
code moves; the cart's own Nintendo logo ($104) is untouched so the
integrity check still passes and the boot hands off normally.

bios/ stays gitignored (copyrighted boot ROM); run this to produce the
fork locally. Verified end to end: logo drop + color + chime -&gt; gbos.
</content>
</entry>
<entry>
<title>rebrand: gbc -&gt; sl0pboy (binary, README, tooling)</title>
<updated>2026-07-16T23:08:48Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-16T23:08:48Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=c714fc8927c454b5cf4735429b4cc9cde7aa5760'/>
<id>urn:sha1:c714fc8927c454b5cf4735429b4cc9cde7aa5760</id>
<content type='text'>
</content>
</entry>
<entry>
<title>serial: headless mode tying serial port to stdio for OS debugging</title>
<updated>2026-07-15T21:44:28Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-15T21:44:28Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=24a015ff047d4b7bb955ba4bc61d5793d7492878'/>
<id>urn:sha1:24a015ff047d4b7bb955ba4bc61d5793d7492878</id>
<content type='text'>
- --headless: no rendering/TUI; serial TX -&gt; stdout, RX &lt;- stdin (nonblocking)
- generalize serial: serial_out_fd/serial_in_fd on the GB; internal-clock
  transfer now shifts in a real RX byte (from stdin) instead of always 0xFF
- paced to native speed by default, --uncapped for turbo; pipes/scripts cleanly
- README: document headless serial console
</content>
</entry>
<entry>
<title>control: video frame capture + deterministic input-movie replay</title>
<updated>2026-07-15T14:53:28Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-15T14:53:28Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=95fa3f0095d6f383840992cab6833cac92493a60'/>
<id>urn:sha1:95fa3f0095d6f383840992cab6833cac92493a60</id>
<content type='text'>
Two socket features for building reproducible showcase clips:

- record start &lt;path&gt; [everyN] / record stop: append the RGB888 framebuffer of
  each produced frame to a flat 'GBCV' capture file (downsample with everyN).
  tools/gbgif.py turns it into a GIF (or PNG frames). Capture is decoupled from
  wall-clock/turbo/frameskip, so timing is always correct.

- input play &lt;path&gt; [reset] / input stop: drive the joypad from a synthesized
  TAS-style movie (text: '&lt;frames&gt; [buttons...]' per line), frame-locked so
  replay is deterministic. 'reset' does an exact power-on (preserve cart
  ROM+SRAM, zero all other state) so a movie replays byte-identically -- verified
  by hashing two runs. tools/gbmovie.py is a Python builder for movies.
</content>
</entry>
<entry>
<title>tools: stitch_overworld.py - DFS EXPLORE's connection graph into one overworld image</title>
<updated>2026-07-15T09:56:21Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-15T09:56:21Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=b3a855234dc4b7ab3cab733cc21602485b8b3de4'/>
<id>urn:sha1:b3a855234dc4b7ab3cab733cc21602485b8b3de4</id>
<content type='text'>
</content>
</entry>
<entry>
<title>gbhud: live joypad display (cute Game Boy layout, buttons light up)</title>
<updated>2026-07-15T08:17:19Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-15T08:17:19Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=458b9934afaa87e73af3154da3c98f045a954bbb'/>
<id>urn:sha1:458b9934afaa87e73af3154da3c98f045a954bbb</id>
<content type='text'>
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.
</content>
</entry>
<entry>
<title>fix(control): ignore SIGPIPE so a vanishing client can't kill the emulator</title>
<updated>2026-07-14T23:42:34Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-14T23:42:34Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=2d39cb0b3ff9851e9872b3eb1f1324bde6910a1c'/>
<id>urn:sha1:2d39cb0b3ff9851e9872b3eb1f1324bde6910a1c</id>
<content type='text'>
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.
</content>
</entry>
<entry>
<title>tools: live debug HUD (gbhud.py) + 'gbctl hud'</title>
<updated>2026-07-14T23:32:57Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-14T23:32:57Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=f36200458ef8d4c698c41c3543b51f3235a25d19'/>
<id>urn:sha1:f36200458ef8d4c698c41c3543b51f3235a25d19</id>
<content type='text'>
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.
</content>
</entry>
<entry>
<title>apu: register-level emulation of 0xFF10-0xFF3F (fixes music fades)</title>
<updated>2026-07-14T22:37:04Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-14T22:37:04Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=12e67588053160d2f9599a09ef932f9b37b1b873'/>
<id>urn:sha1:12e67588053160d2f9599a09ef932f9b37b1b873</id>
<content type='text'>
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.
</content>
</entry>
</feed>
