<feed xmlns='http://www.w3.org/2005/Atom'>
<title>sl0pboy.git, branch master</title>
<subtitle>sl0pboy - a Game Boy Color emulator (companion to the gbos OS)</subtitle>
<id>https://git.sl0p.foo/sl0pboy.git/atom/?h=master</id>
<link rel='self' href='https://git.sl0p.foo/sl0pboy.git/atom/?h=master'/>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/'/>
<updated>2026-07-18T20:47:08Z</updated>
<entry>
<title>docs: document the SL0PBOY boot-logo patcher (tools/mk_sl0pboy_bios.py)</title>
<updated>2026-07-18T20:47:08Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-18T20:47:08Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=27359b442c139e5cec1ac36b50b427fb828e73e6'/>
<id>urn:sha1:27359b442c139e5cec1ac36b50b427fb828e73e6</id>
<content type='text'>
Add a BIOS subsection covering usage (Pillow dep, SL0P_TEXT/SL0P_FONT
knobs, the preview PNG), how the in-place $0607 blob patch works, and
why the forked binary stays out of git while the generator ships.
</content>
</entry>
<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>hooks: clang-format pre-commit (changed lines only) + .clang-format</title>
<updated>2026-07-18T18:57:37Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-18T18:57:37Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=4901afc59a43841a7cd9e5aee5fbdbd5966a8171'/>
<id>urn:sha1:4901afc59a43841a7cd9e5aee5fbdbd5966a8171</id>
<content type='text'>
git-clang-format scopes formatting to the lines each commit touches -
a full-file reformat would destroy the deliberately dense hand
formatting (opcode tables, multi-statement helpers). The hook re-adds
formatted files (git-clang-format --staged fixes the worktree, not the
index) and refuses partially-staged C files rather than mixing staged
and unstaged changes. Enable once: git config core.hooksPath hooks
</content>
</entry>
<entry>
<title>README: fix source paths in Architecture table (src/ prefix)</title>
<updated>2026-07-18T18:53:17Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-18T18:53:17Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=e281b0dc76f20163a8bbaafa082aa54a81a5c65b'/>
<id>urn:sha1:e281b0dc76f20163a8bbaafa082aa54a81a5c65b</id>
<content type='text'>
The Architecture table listed the core sources as bare filenames
(types.h, cart.c, ...), but they live under src/. Prefix them with
src/ so the paths actually point at the files.
</content>
</entry>
<entry>
<title>render: --shrink N - downscale the half-block live display (1-4)</title>
<updated>2026-07-18T18:41:19Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-18T18:41:19Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=fa1579cc9f209dbeb14ab277dc9c4ac741ace57c'/>
<id>urn:sha1:fa1579cc9f209dbeb14ab277dc9c4ac741ace57c</id>
<content type='text'>
Decimates the LCD N x N before the half-block encode so the monitor pane
takes 160/N cols x 72/N rows. Display-only: capture, recording and sixel
still read the full-res framebuffer.

Decimation is max-luma pick, not box-average: terminal fonts are 1px
bright strokes on dark background, and averaging dims them into grey
mush (the 'blurry font' regression). Keeping the brightest source pixel
of each block preserves stroke brightness and hue.
</content>
</entry>
<entry>
<title>main: allow --sock (control/debug socket) in headless mode</title>
<updated>2026-07-17T18:22:13Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-17T18:22:13Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=e8c1777a1761ebf55029589912198c83fb06aaec'/>
<id>urn:sha1:e8c1777a1761ebf55029589912198c83fb06aaec</id>
<content type='text'>
The control socket was only opened on the windowed path, so a --headless
GB couldn't be inspected. A scriptable, invisible GB is exactly the one
you most want to peek into - reading kernel WRAM over the debug socket is
how the TCP field-offset corruption got pinned down. Open it in the
headless loop too and poll it each frame; close it on exit.
</content>
</entry>
<entry>
<title>cpu: log the $ED poweroff opcode with pc/registers</title>
<updated>2026-07-17T17:47:02Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-17T17:47:02Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=ef07ad11bb0a20f137682e901a0a6beacfc08968'/>
<id>urn:sha1:ef07ad11bb0a20f137682e901a0a6beacfc08968</id>
<content type='text'>
The clean-exit opcode used to print nothing, so any guest crash that
walked into a stray $ED byte was indistinguishable from a silent
socket death (one of the kill vectors in the link-drop investigation).
Now it identifies itself on stderr with pc/af/bc/de/hl/sp.
</content>
</entry>
<entry>
<title>gb: auto-reconnect a dead --serial-sock link instead of going silent</title>
<updated>2026-07-17T17:46:58Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-17T17:46:58Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=130215c21ce4aa300abc9a276e2ffb35c8f43803'/>
<id>urn:sha1:130215c21ce4aa300abc9a276e2ffb35c8f43803</id>
<content type='text'>
Root-cause work for the 'idle link-socket drop' (see gbos
docs/link-drop-investigation.md): when the hub restarts or the bridge
dies, the link fd went dead forever - and before SIGPIPE was ignored,
the next console-echo write() would kill the whole emulator silently.

Now, in --serial-sock mode, EOF on read or EPIPE/ECONNRESET/ENOTCONN/
EBADF on either direction marks the link dead, closes the fd, and
retries connect() every 500ms from the serial poll path (the guest
polls constantly, so no extra plumbing). RX stays pending while down
(serial_no_eof semantics), so the guest just sees a quiet link that
comes back. Logs 'link socket lost / reconnected' either way.

Verified: SIGKILL the hub, restart it - every GB reconnects within ~1s
and keeps its lease.
</content>
</entry>
<entry>
<title>main: silence stderr while the live sixel display is up</title>
<updated>2026-07-17T17:45:03Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-17T17:45:03Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=a3dd7fa747d631831e920aa55ed03e7954ca6517'/>
<id>urn:sha1:a3dd7fa747d631831e920aa55ed03e7954ca6517</id>
<content type='text'>
Runtime chatter (link reconnect notices, input debug, cart warnings) was
landing mid-sixel-stream and corrupting the picture. Redirect fd 2 to
/dev/null for the duration of the display loop; restored on exit so the
final stats line still prints. Startup errors before the display begins
are unaffected.
</content>
</entry>
<entry>
<title>main: --serial-sock PATH - link port over a unix socket (net + live display)</title>
<updated>2026-07-17T11:22:00Z</updated>
<author>
<name>gbc dev</name>
<email>gbc@localhost</email>
</author>
<published>2026-07-17T11:22:00Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0pboy.git/commit/?id=346634bbd7376c0120c51e8ec5ba3d7d400fc567'/>
<id>urn:sha1:346634bbd7376c0120c51e8ec5ba3d7d400fc567</id>
<content type='text'>
The serial fds are serviced by cpu_step in every mode, so wiring them to a
connected unix socket lets networking run alongside a live display (--sixel /
terminal) - unlike --headless, which needs stdio for the serial. The emulator
connects to PATH (retrying ~1s so a launcher can listen first) and uses it
non-blocking with no EOF-exit; it overrides the headless stdio serial.

Pairs with gbos tools/netboot, which listens on PATH, brings up a TUN+NAT, and
bridges the socket &lt;-&gt; TUN. In windowed mode the OSK is the console and the
link port is pure network - cleanly separated. Verified: host pings the GB 3/3
over the socket link.
</content>
</entry>
</feed>
