Embedded Debug
FastLED/FastLED
Firmware crash analysis, stack trace decoder, and register dump interpreter for ESP32/ARM/AVR platforms.
Debug Commodore 64 programs running under the VICE emulator through its binary monitor: BASIC, cc65-compiled C, and 6502 assembly.
$ npx skills add idolpx/meatloaf --skill commodore64-vice-debugging -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install idolpx/meatloaf commodore64-vice-debugging --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/idolpx/meatloaf.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/commodore64-vice-debugging .claude/skills/commodore64-vice-debugging && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "commodore64-vice-debugging" agent skill from https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-vice-debugging into .claude/skills/commodore64-vice-debugging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commodore64-vice-debugging", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-vice-debuggingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add idolpx/meatloaf --skill commodore64-vice-debugging -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install idolpx/meatloaf commodore64-vice-debugging --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/idolpx/meatloaf.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/commodore64-vice-debugging .agents/skills/commodore64-vice-debugging && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "commodore64-vice-debugging" agent skill from https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-vice-debugging into .agents/skills/commodore64-vice-debugging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commodore64-vice-debugging", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add idolpx/meatloaf --skill commodore64-vice-debugging -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install idolpx/meatloaf commodore64-vice-debugging --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/idolpx/meatloaf.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/commodore64-vice-debugging .cursor/skills/commodore64-vice-debugging && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "commodore64-vice-debugging" agent skill from https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-vice-debugging into .cursor/skills/commodore64-vice-debugging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commodore64-vice-debugging", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/idolpx/meatloaf.git --path .claude/skills/commodore64-vice-debugging--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add idolpx/meatloaf --skill commodore64-vice-debugging -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install idolpx/meatloaf commodore64-vice-debugging --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/idolpx/meatloaf.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/commodore64-vice-debugging .gemini/skills/commodore64-vice-debugging && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "commodore64-vice-debugging" agent skill from https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-vice-debugging into .gemini/skills/commodore64-vice-debugging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commodore64-vice-debugging", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install idolpx/meatloaf commodore64-vice-debuggingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add idolpx/meatloaf --skill commodore64-vice-debugging -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/idolpx/meatloaf.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/commodore64-vice-debugging .github/skills/commodore64-vice-debugging && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "commodore64-vice-debugging" agent skill from https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-vice-debugging into .github/skills/commodore64-vice-debugging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commodore64-vice-debugging", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add idolpx/meatloaf --skill commodore64-vice-debugging -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install idolpx/meatloaf commodore64-vice-debugging --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/idolpx/meatloaf.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/commodore64-vice-debugging .opencode/skills/commodore64-vice-debugging && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "commodore64-vice-debugging" agent skill from https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-vice-debugging into .opencode/skills/commodore64-vice-debugging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commodore64-vice-debugging", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
commodore64-vice-debuggingDebug Commodore 64 programs running under the VICE emulator through its binary monitor: BASIC, cc65-compiled C, and 6502 assembly.
Commodore64 Vice Debugging is an agent skill from idolpx/meatloaf. Debug Commodore 64 programs running under the VICE emulator through its binary monitor: BASIC, cc65-compiled C, and 6502 assembly. Automates the unattended cycle — write/modify source → build (petcat/bc64, cl65, ca65) → autostart in VICE → set symbol breakpoints and watchpoints → read registers, memory and screen → patch → repeat. Use whenever the user mentions VICE, x64sc, x128, the VICE binary monitor, emulator breakpoints, checkpoints or watchpoints, stepping 6502 code, reading C64 screen memory, cc65 label…
Its SKILL.md is about 4.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including scripts (for example `evals/evals.json`, `reference/binary_monitor_protocol.md` and `scripts/vice_debug.py`).
It sits in Development, covering Debugging, Embedded systems and Responsive design. It works with ESP32. The repository describes itself as: The internet is a massive floppy drive for your C64 with Meatloaf! The licence is GPL-3.0.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 9a88a9f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 3 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
pythonFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Commodore64 Vice Debugging loads about 4.8k tokens when it runs. Until then it costs about 237 tokens; SKILL.md has 1,583 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from idolpx/meatloaf at commit 9a88a9f, republished under its GPL-3.0 licence (© idolpx). 1,583 words, ~4,835 tokens.
.claude/skills/commodore64-vice-debugging/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Drives a real VICE emulator over TCP so a C64 program can be built, run, breakpointed, inspected and patched without a human touching the emulator.
source (.bas / .c / .s)
│ build (petcat | bc64 | cl65 | ca65+ld65)
▼
foo.prg + foo.lbl (symbols) + foo.map
│ autostart
▼
┌──────────────────────┐ TCP 6502 (binary monitor) ┌──────────────┐
│ VICE (x64sc) │◄─────────────────────────────►│ vice_debug.py│
│ emulated C64 │ checkpoints, regs, memory │ (this PC) │
└──────────────────────┘ └──────────────┘Scope: the C64 program is what gets debugged. This skill does not talk to Meatloaf firmware or any ESP32 — VICE has no bridge to a real IEC device. For that loop use the commodore64-debugging skill.
All three were established empirically against VICE 3.10 on Windows. They are not in the protocol documentation.
If a monitor client disconnects while the machine is stopped at a checkpoint, VICE tears down its monitor listener permanently. The emulator keeps running and its window stays responsive, but nothing can ever connect again — port 6502 refuses connections until VICE is restarted.
Consequence: one CLI process per command does not work once a breakpoint
fires. Everything that must observe a halted machine has to happen on a
single connection. That is exactly what batch is for:
# WRONG - the process after `wait` disconnects while halted, killing the monitor
python vice_debug.py brk _bump
python vice_debug.py wait
python vice_debug.py regs # -> connection refused, VICE now unreachable
# RIGHT - one connection for the whole stop/inspect/resume sequence
python vice_debug.py batch "brk _bump" "autostart foo.prg" wait regs "mem _counter -n 1"ViceSession.close() always resumes before closing, and main() closes the
shared session in a finally, so the CLI cannot trip this on its own. Custom
code using ViceMonitor directly must resume by hand.
keyboard_feed (0x72) queues text that VICE holds for as long as any binary
monitor client is connected. Polling the screen for 20 s while connected shows
nothing; the text appears the instant the connection drops.
type handles this for you — it feeds, drops the connection, waits, and
reconnects to show the screen. Know about it anyway, because it explains the
classic symptom: a typed command appearing to run one invocation late, or
seemingly duplicating itself.
Prefer autostart over typing RUN wherever possible — autostart works
normally while connected.
registers get returns (id, value) pairs with no names. The IDs differ per
emulator and per VICE build. On this x64sc 3.10: A=0, X=1, Y=2, PC=3, SP=4, FL=5, plus LIN=53, CYC=54, 00=55, 01=56. Always resolve them through
registers available (0x83) first — vice_monitor.py does this and caches it,
so you work with {"PC": 2112, "A": 1, ...}.
cd .claude/skills/commodore64-vice-debugging/scripts
python vice_debug.py config # what got discovered
python vice_debug.py launch # start VICE with -binarymonitor
python vice_debug.py cycle ../../../my.bas # build, run, show the screen
python vice_debug.py kill # clean shutdownconfig resolves every tool without hardcoding paths and reports what it
found. Run it before anything else when something behaves oddly:
{
"machine": "c64",
"emulator": "C:\\vice\\bin\\x64sc.EXE",
"petcat": "C:\\vice\\bin\\petcat.EXE",
"c1541": "C:\\vice\\bin\\c1541.EXE",
"cl65": "C:\\Users\\you\\Tools\\cc65\\bin\\cl65.EXE",
"bc64": null,
"basic_compiler": "petcat",
"monitor_host": "127.0.0.1",
"monitor_port": 6502,
"monitor_reachable": true
}commodore64-vice-debugging/
├── SKILL.md ← this file: workflow + reference
├── scripts/
│ ├── vice_monitor.py ← binary monitor protocol client (standalone)
│ ├── vice_toolchain.py ← tool discovery, building, label parsing
│ └── vice_debug.py ← CLI + ViceSession automation
├── reference/
│ └── binary_monitor_protocol.md ← full opcode / packet reference
└── evals/evals.jsonvice_monitor.py has no dependencies beyond the standard library and imports
nothing else from the skill — import it directly to drive VICE from your own
Python.
build dispatches on extension and always emits a .prg.
| Source | Toolchain | Notes |
|---|---|---|
.bas | bc64 if installed, else VICE's petcat -w2 | petcat writes the $0801 header itself |
.c | cl65 -t c64 -g -Ln foo.lbl --mapfile foo.map | -g, no -O, so variables survive inspection |
.s .asm | same driver plus -C c64-asm.cfg -u __LOADADDR__ | required — see below |
.prg | none | passed through |
python vice_debug.py build game.c # -> game.prg, game.lbl, game.map
python vice_debug.py build game.c --release # -Oirs instead of -g
python vice_debug.py build main.s -o main.prgAssembly needs the asm linker config. A standalone .s has none of the C
runtime's segments, so the default c64.cfg fails to link with
Error: Start address of memory area 'BSS' is not constant. The builder adds
-C <machine>-asm.cfg -u __LOADADDR__ automatically, and steps aside if you
pass your own -C. A minimal source that links with it:
.segment "EXEHDR" ; BASIC stub so RUN works
.word nextline
.word 10
.byte $9e, "2061", $00 ; SYS 2061 -> $080D
nextline:
.word 0
.segment "CODE"
.export start
start: lda #$06
sta $d020
jmp startName your outputs distinctly. build foo.bas and build foo.c both
default to foo.prg. Building one after the other leaves a .prg from one
language beside a .lbl from the other, and every breakpoint silently targets
addresses that are not in the running program. Use -o.
python vice_debug.py d64 loader.s game.c -o disk.d64 --name mygameNeeded when the program loads further files at runtime or you want true drive
emulation — autostarting a bare .prg gives it no disk to read from.
| Command | What it does | When |
|---|---|---|
autostart <file> | Hands the file to VICE's own autostart | Default. Handles .prg, .d64, .t64, .crt, sets up TDE, types RUN itself |
load <file.prg> | Writes the body into RAM, does not run | When you need the code resident so you can set checkpoints and poke memory before the first instruction |
load strips the 2-byte little-endian load-address header and writes the body
to that address. For a program at $0801 it also fixes the BASIC pointers at
$2D/$2F/$31 to just past the program end — without that, RUN sees a
zero-length program. It is skipped automatically for anything not loading at
$0801, since C and assembly programs use that zero page for their own
globals. Override with --basic / --no-basic.
python vice_debug.py autostart game.prg --wait 4 # run and show the screen
python vice_debug.py load game.prg # resident, not running
python vice_debug.py load game.bas --run --wait 4 # build, inject, RUNVICE calls them all checkpoints; the operation bits decide the kind:
exec (0x04) is a breakpoint, load (0x01) and store (0x02) are
watchpoints.
python vice_debug.py labels game.lbl # load symbols (persists between calls)
python vice_debug.py brk _main # break on execute (default)
python vice_debug.py brk '$d020' --store # break when anything writes the border
python vice_debug.py brk _buf _bufend --load --trace # log reads of a range, don't stop
python vice_debug.py brk _bump --temp # delete after the first hit
python vice_debug.py brks # list
python vice_debug.py delbrk --allAddresses accept $c000, 0xc000, bare hex c000, decimal #49152, or any
symbol from the loaded label file. cc65 prefixes C symbols with _, and the
resolver tries that prefix for you, so brk main finds _main.
--cond attaches a VICE monitor condition expression:
python vice_debug.py brk _bump --cond "A == 3"Verified: A == 99 never fires, A == 1 fires with A=1 at the stop.
Quoting on Windows: PowerShell mangles nested quotes when passing them to
a native executable, so --cond "A == 3" inside a quoted batch argument
arrives split into pieces. Use a batch file, where each line is parsed by the
skill and nothing else touches it:
python vice_debug.py batch -f session.txt# session.txt — blank lines and # comments are skipped
labels game.lbl
delbrk --all
brk _bump --exec --cond "A == 1"
autostart game.prg
wait --timeout 20
regs
mem _counter -n 1python vice_debug.py regs # decoded, with symbol for PC
python vice_debug.py regs --set A=7 X=1
python vice_debug.py mem _counter -n 16 # hex dump
python vice_debug.py mem '$0400' -n 1000 --ascii
python vice_debug.py mem '$c000' -n 256 --raw > dump.bin
python vice_debug.py poke _counter 04
python vice_debug.py poke '$d020' --text HELLO
python vice_debug.py screenMemory reads default to side-effects OFF. Reading an I/O register such as
$D019 with side effects clears latched bits and changes what the running
program sees — a debugger that alters the bug is worthless. Pass
--side-effects only when you specifically want that.
screen resolves where screen RAM actually is rather than assuming $0400:
the VIC bank comes from $DD00 bits 0-1 (inverted) and the matrix offset from
$D018 bits 4-7. Programs that relocate the screen — common in C and
assembly — are read correctly.
It also picks the character set from $D018 bit 1, so uppercase/graphics mode
and mixed-case mode both decode properly. Reverse-video codes are folded onto
their normal characters so a reverse-printed line still reads as text.
+----------------------------------------+
|hello from cc65 |
|counter=5 || Command | Effect |
|---|---|
wait --timeout N | Block until a stopped/JAM event; prints registers, PC symbol, and which checkpoint fired |
step [n] [--over] | Advance n instructions; --over steps over JSR |
ret | Run until the current subroutine returns |
cont | Resume |
reset [--hard] | Soft reset, or --hard for a power cycle |
wait exits non-zero if nothing stopped within the timeout, so a script can
tell "hit the breakpoint" from "ran to completion".
Phase 1 — set up once per session
python vice_debug.py diag # tools, reachability, current checkpoints, screen preview
python vice_debug.py launch # if diag says the monitor is unreachablePhase 2 — one iteration, in a single batch
python vice_debug.py batch \
"build game.c -o game.prg" \
"labels game.lbl" \
"delbrk --all" \
"brk _update_sprites" \
"autostart game.prg" \
"wait --timeout 20" \
regs \
"mem _sprite_x -n 8" \
screenPhase 3 — read the evidence
| Observation | Likely meaning |
|---|---|
wait times out, screen shows READY. | Program ran and exited, or never started — check the screen for a BASIC error |
wait times out, screen shows program output | Breakpoint address is wrong: stale .lbl, or .prg and .lbl from different builds |
| Stops immediately at an address far from your code | You broke inside the KERNAL/BASIC ROM; check the symbol resolved as expected |
?SYNTAX ERROR after a manual load --run | BASIC pointers not fixed, or a non-BASIC PRG loaded to $0801 and RUN typed |
JAM event | Illegal opcode — usually a JMP/JSR through an uninitialised pointer |
| Screen full of graphics glyphs | Charset/$D018 differs from what the program set; the decoder follows it, so this is real |
| Connection refused, VICE window alive | A client disconnected while halted — restart VICE (gotcha 1) |
Phase 4 — fix and repeat. Edit source, rerun the same batch. Nothing needs restarting unless gotcha 1 was hit.
import sys
sys.path.insert(0, ".claude/skills/commodore64-vice-debugging/scripts")
from vice_debug import ViceSession
with ViceSession() as s: # resumes + closes cleanly on exit
s.use_labels("game.lbl")
s.brk("_update_sprites")
s.autostart("game.prg")
if s.mon.wait_for_stop(20):
print(s.where()) # registers + PC symbol
print(s.mon.read_memory(s.addr("_sprite_x"), 8).hex())
print("\n".join(s.screen()))The lower layer is usable on its own:
from vice_monitor import ViceMonitor, OP_STORE
with ViceMonitor() as m:
m.set_checkpoint(0xD020, operation=OP_STORE)
ev = m.wait_for_stop(30)
print(ev.name, hex(m.last_pc))
m.resume() # REQUIRED before the connection dropsconfig show discovered tools, monitor state, loaded labels
diag full health check incl. screen preview and live checkpoints
launch start VICE with the binary monitor (--prg, --warp, --no-run, --extra)
kill quit VICE over the monitor, falling back to the pid
ping check the connection
info VICE version, banks, registers, register table, screen geometry
build compile .bas/.c/.s to .prg (-o, --release, --extra)
d64 build a .d64 from several programs (-o, --name)
labels load or show a VICE label file
autostart let VICE load and RUN (--no-run, --wait)
load write a .prg into RAM (-a, --run, --basic, --no-basic, --wait)
type feed text to the keyboard (--no-return, --wait)
screen decode screen memory (--raw, --json)
regs read or write registers (--set NAME=VALUE ...)
mem read memory (-n, --raw, --ascii, --side-effects)
poke write memory (hex bytes, --file, --text)
brk set a checkpoint (--exec, --load, --store, --temp, --trace, --cond)
brks list checkpoints
delbrk delete checkpoints (numbers, or --all)
step advance N instructions (--over)
ret run until subroutine return
cont resume
wait block until stopped (--timeout, --screen)
reset reset the machine (--hard, --wait, --screen)
cycle build + launch-if-needed + reset + autostart + screen
batch run several subcommands on ONE connection (-f FILE, --stop-on-error)Global: --machine (c64, c128, vic20, plus4, pet, scpu64, c64dtv),
--port.
Everything is discovered automatically; these override a single run.
| Variable | Purpose |
|---|---|
VICE_MACHINE | c64 (default), c128, vic20, plus4, pet, scpu64, c64dtv |
VICE_EMULATOR | Full path to x64sc/x128/… , skipping lookup |
VICE_BIN_DIR | Directory searched first for VICE tools |
VICE_MONITOR_HOST | Default 127.0.0.1 |
VICE_MONITOR_PORT | Default 6502 |
CC65_BIN_DIR | Directory holding cl65/ca65/ld65 |
BC64 | Full path to the bc64 BASIC compiler |
Discovery checks PATH, then common install locations (C:\vice\bin,
/usr/local/bin, /opt/homebrew/bin, ~/Tools/cc65/bin, …).
VICE aborts during startup (Windows exit code 0xe0464645) when it cannot
bind the monitor address — almost always a previous instance that was
force-killed moments earlier and whose socket has not been released. launch
retries once after a 2 s pause, and kill waits for the port to actually close
before returning. If it persists:
netstat -ano | findstr 6502 # find the holder
python vice_debug.py --port 6510 launchPrefer kill over killing the process: it sends the monitor's QUIT command,
which shuts VICE down cleanly and releases the port.
| Flag | Produces | Use |
|---|---|---|
-Ln foo.lbl | VICE label file | Always. This is what makes brk _main work; build adds it |
--mapfile foo.map | Segment addresses and sizes | Find where BSS/DATA/CODE actually landed |
--listing foo.lst | Asm interleaved with C | When you suspect codegen |
-g | Debug info, no optimisation | Default here; -O folds variables away |
-Wl --dbgfile,foo.dbg | VICE/CCS64 debug info | Source-level stepping in VICE's own GUI monitor |
Reading the map file:
$ grep -E "(__MAIN|__BSS|__STACK)" game.map
__MAIN_START__ 00080D RLA __MAIN_SIZE__ 00C7F3 REA
__BSS_RUN__ 005415 RLA __BSS_SIZE__ 000031 REARLA = relocatable address (a real C64 address after linking), REA = a
relocatable expression (may be a constant, not an address), RLZ = zero page.
"vice", "x64sc", "x128", "xvic", "xplus4", "binary monitor", "remote monitor", "checkpoint", "watchpoint", "breakpoint", "emulator", "petcat", "c1541", "cc65", "cl65", "ca65", "ld65", "label file", "-Ln", "map file", "6502 step", "screen memory", "$0400", "$d018", "$dd00", "$d020", "commodore 64", "c64", "prg", "d64", "autostart", "jam", "6502 assembly debugging"
© idolpx, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (scripts) in .claude/skills/commodore64-vice-debugging of idolpx/meatloaf.
Open the folder on GitHubat commit 9a88a9f
Commodore64 Vice Debugging next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Commodore64 Vice Debugging this skillidolpx/meatloaf | 128 | — | ~4.8k | Automated safety check: Pass | GPL-3.0 | |
| Embedded DebugFastLED/FastLED | 7.5k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Feature ContractFastLED/FastLED | 7.5k | — | ~1.7k | Automated safety check: Pass | MIT | |
| Openocd Jtagmohitmishra786/low-level-dev-skills | 253 | — | ~1.6k | Automated safety check: Pass | MIT | |
| Embedded DebuggerAdancurusul/embedded-debugger-mcp | 199 | — | ~1.4k | Automated safety check: Pass | MIT | |
| RuView Hardware Setupruvnet/RuView | 97k | — | ~1.8k | Automated safety check: Notes | MIT |
FastLED/FastLED
Firmware crash analysis, stack trace decoder, and register dump interpreter for ESP32/ARM/AVR platforms.
FastLED/FastLED
Generate a structured implementation contract before making any code changes to FastLED.
mohitmishra786/low-level-dev-skills
OpenOCD skill for embedded hardware debugging. An agent skill from mohitmishra786/low-level-dev-skills.
Adancurusul/embedded-debugger-mcp
Embedded hardware debugging workflow for probe-rs targets using embedded-debugger-mcp.
ruvnet/RuView
Brings a RuView CSI sensing node online by building ESP32-S3 or ESP32-C6 firmware, flashing the board, provisioning WiFi and checking the serial output.
alxv2016/folloup-sticky
ESP32 firmware engineering for ESP-IDF projects. An agent skill from alxv2016/folloup-sticky.
idolpx/meatloaf
Debug Commodore 64 BASIC programs, cc65-compiled C PRGs, and Meatloaf ESP32 firmware in tandem, using the Ultimate 64's REST API and Meatloaf's UART serial debug output.
idolpx/meatloaf
Write Commodore 64 BASIC v2 programs. An agent skill from idolpx/meatloaf.
idolpx/meatloaf
Commodore 64/128 JiffyDOS reference — use whenever the user is working in a C64/128 emulator (VICE, Ultimate 64, etc.) and you see signs of the JiffyDOS replacement ROM: the boot saying "jiffydos…
idolpx/meatloaf
Reference for Meatloaf's DOS command channel — the complete set of drive-level commands accepted over the IEC bus secondary address 15 on a Meatloaf ESP32 device.
idolpx/meatloaf
Reference for the Meatloaf full-mode HTTP client protocol — the line-oriented command language (m, h, b, s, status, r-h, r-b, j, c) that an ESP32-based Meatloaf device accepts over the C64's IEC bus…
Works with
Categories
Debug Commodore 64 programs running under the VICE emulator through its binary monitor: BASIC, cc65-compiled C, and 6502 assembly. Commodore64 Vice Debugging is an agent skill from idolpx/meatloaf. Debug Commodore 64 programs running under the VICE emulator through its binary monitor: BASIC, cc65-compiled C, and 6502 assembly.
Commodore64 Vice Debugging fits situations like: the user mentions VICE; the VICE binary monitor; emulator breakpoints; stepping 6502 code.
Run `npx skills add idolpx/meatloaf --skill commodore64-vice-debugging -a claude-code`. Or copy the skill folder (.claude/skills/commodore64-vice-debugging in idolpx/meatloaf) into .claude/skills/commodore64-vice-debugging in your project. Claude Code loads it when a task matches its description.
Run `npx skills add idolpx/meatloaf --skill commodore64-vice-debugging -a codex`. Or copy the skill folder (.claude/skills/commodore64-vice-debugging in idolpx/meatloaf) into .agents/skills/commodore64-vice-debugging in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add idolpx/meatloaf --skill commodore64-vice-debugging -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/commodore64-vice-debugging, .gemini/skills/commodore64-vice-debugging, .github/skills/commodore64-vice-debugging and .opencode/skills/commodore64-vice-debugging in your project.
Going by SKILL.md and its folder, Commodore64 Vice Debugging needs Python for the scripts in its folder and the command-line tools its instructions call (python). Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Commodore64 Vice Debugging is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.8k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Commodore64 Vice Debugging: Embedded Debug (FastLED/FastLED, 7.5k stars), Feature Contract (FastLED/FastLED, 7.5k stars), Openocd Jtag (mohitmishra786/low-level-dev-skills, 253 stars) and Embedded Debugger (Adancurusul/embedded-debugger-mcp, 199 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
idolpx (a GitHub user) maintains it in idolpx/meatloaf, which has 128 GitHub stars. The repository holds 6 skills in this directory. The repository was last updated on October 6, 2026.
Source: idolpx/meatloaf on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.