RuView Hardware Setup
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.
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.
$ npx skills add idolpx/meatloaf --skill meatloaf-dos -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install idolpx/meatloaf meatloaf-dos --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-meatloaf .claude/skills/meatloaf-dos && 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 "meatloaf-dos" agent skill from https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-meatloaf into .claude/skills/meatloaf-dos/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "meatloaf-dos", 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-meatloafType 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 meatloaf-dos -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install idolpx/meatloaf meatloaf-dos --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-meatloaf .agents/skills/meatloaf-dos && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "meatloaf-dos" agent skill from https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-meatloaf into .agents/skills/meatloaf-dos/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "meatloaf-dos", 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 meatloaf-dos -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install idolpx/meatloaf meatloaf-dos --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-meatloaf .cursor/skills/meatloaf-dos && 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 "meatloaf-dos" agent skill from https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-meatloaf into .cursor/skills/meatloaf-dos/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "meatloaf-dos", 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-meatloaf--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 meatloaf-dos -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install idolpx/meatloaf meatloaf-dos --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-meatloaf .gemini/skills/meatloaf-dos && 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 "meatloaf-dos" agent skill from https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-meatloaf into .gemini/skills/meatloaf-dos/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "meatloaf-dos", 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 meatloaf-dosInstalls 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 meatloaf-dos -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-meatloaf .github/skills/meatloaf-dos && 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 "meatloaf-dos" agent skill from https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-meatloaf into .github/skills/meatloaf-dos/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "meatloaf-dos", 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 meatloaf-dos -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 meatloaf-dos --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-meatloaf .opencode/skills/meatloaf-dos && 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 "meatloaf-dos" agent skill from https://github.com/idolpx/meatloaf/tree/main/.claude/skills/commodore64-meatloaf into .opencode/skills/meatloaf-dos/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "meatloaf-dos", 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.
meatloaf-dosReference 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.
Meatloaf Dos is an agent skill from 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. Use whenever the user asks about Meatloaf DOS commands, custom fast-loader toggles, directory navigation, tape image operations, time/clock access, partition switching, or the auth: credential command. Also covers the standard CBM DOS 2.6 commands (b-r, b-w, m-r, m-w, m-e, n:, s:, r:, u1/ua, uj, etc.) as supported by Meatloaf, plus the full set of…
Its SKILL.md is about 7.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `evals/evals.json`).
It sits in Development, covering Embedded systems. 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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are basic, c and cpp).
From 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.
Meatloaf Dos loads about 7.4k tokens when it runs. Until then it costs about 218 tokens; SKILL.md has 3,017 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); files beside SKILL.md are not scanned.
The full file from idolpx/meatloaf at commit 9a88a9f, republished under its GPL-3.0 licence (© idolpx). 3,017 words, ~7,370 tokens.
.claude/skills/meatloaf-dos/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Meatloaf is an ESP32 firmware that plugs into the C64's IEC bus, emulating one or more virtual disk drives. This document covers every command you can send to a Meatloaf drive over its command channel (secondary address 15, device number 8 by default). It documents the standard CBM DOS 2.6 commands Meatloaf responds to, the SD2IEC-style extensions it inherits, and the Meatloaf-specific commands added in this firmware.
Not what you're looking for? If you want to make HTTP requests (GET/POST/PUT) with custom headers and JSON parsing, you want the full-mode HTTP client protocol — secondary address 2, commands
m,h,b,s,status,r-h,r-b,j. See the meatloaf-networking skill for that.
There are three ways to send commands to a Meatloaf drive:
CRITICAL: Always use lowercase BASIC keywords. On the C64 you
normally type with shift-lock off, so open, print#, close,
input#, get#, rem, load, save, list, run, chr$ are
all lowercase. Never write OPEN, PRINT#, CLOSE, INPUT#,
GET#, REM, LOAD"$",8 etc. in code examples — that looks wrong.
Uppercase BASIC is never correct in examples.
open 15,8,15 : rem open command channel to device 8
print#15,"cmd" : rem send command
close 15 : rem close channelFor commands that return data (like pwd), read the error/status
channel after sending:
open 15,8,15
print#15,"cmd"
input#15, e, e$, t, s : rem e=status code, e$=message, t=track, s=sector
close 15
print e$ : rem prints the responseFor commands that return multi-line data:
open 15,8,15
print#15,"cmd"
get#15, a$ : rem read one byte at a time
rem ... loop until st and 64 (eoi)
close 15Gotcha: colons and input#. BASIC's input# treats : as a
field separator. Commands whose output contains colons (like t-ra
and t-ri which return HH:MM:SS times) will break with input#.
Use get# in a loop for those instead.
@ wedge (if JiffyDOS is active)If the C64 has a JiffyDOS Kernal ROM, just type @cmd at the ready.
prompt. JiffyDOS forwards everything after @ to the drive's command
channel and prints the response automatically.
@cmd ← sends "cmd" to drive command channel, shows response
@ ← by itself, reads the error channelThis works for all commands in this reference — @pwd, @md:dir,
@cp2, @t-ra, etc.
#include <cbm.h>
cbm_open(15, 8, 15, ""); // open command channel
cbm_write(15, "cmd\r\n", 5); // send command
cbm_close(15); // close| Command | Category | Description |
|---|---|---|
i | Standard DOS | Initialize (reset) drive |
uj | Standard DOS | Cold reset drive |
u9 / ui | Standard DOS | Warm reset (re-run DOS vectors) |
u{shift-j} | Standard DOS | Hard reset |
u{shift-j}+ | Standard DOS | Reboot ESP32 |
ui+ / ui- | Standard DOS | Bus speed (C64 / VIC-20) |
n:name,id | Standard DOS | Format disk image |
s:pattern | Standard DOS | Scratch (delete) files |
r:new=old | Standard DOS | Rename file |
c:new=old | Standard DOS | Copy file |
v | Standard DOS | Validate BAM |
b-p ch,pos | Standard DOS | Buffer pointer (position in stream) |
b-r ch,trk,sec | Standard DOS | Read block (seek to track/sector) |
b-w ch,trk,sec | Standard DOS | Write block |
b-a trk,sec | Standard DOS | Allocate block in BAM |
b-f trk,sec | Standard DOS | Free block in BAM |
b-e trk,sec | Standard DOS | Block execute |
m-r addr,len | Standard DOS | Memory read |
m-w addr,len,data | Standard DOS | Memory write |
m-e addr | Standard DOS | Memory execute |
u1 ch,drv,trk,sec | Standard DOS | Block read (UA: buffer, UB: track/sector) |
cd path | Navigation | Change directory |
cp n | Partition | Change to partition n (text arg) |
c{shift-p}n | Partition | Change to partition n (binary byte) |
pwd | Navigation | Print working directory |
md:path | Navigation | Make directory (mkdir) |
rd:path | Navigation | Remove directory (rmdir) |
p ch,hi,mid,lo | Navigation | Position (seek) stream pointer |
t-c ms|mmm:ss | Tape | Set tape counter position |
t-i | Tape | Build tape index (.idx) |
t-ra | Time | Read time as ASCII |
t-ri | Time | Read time as ISO-8601 |
t-rd | Time | Read time as decimal |
t-rb | Time | Read time as BCD |
t-rz | Time | Read timezone |
t-wa | Time | Write time (ASCII — not yet implemented) |
t-wi | Time | Write time (ISO-8601 — not yet implemented) |
t-wd | Time | Write time (decimal — not yet implemented) |
t-wb | Time | Write time (BCD — not yet implemented) |
t-wz:timezone | Time | Set timezone |
xr:romname | Extended | Load a custom DOS ROM |
auth:user,pass | Meatloaf | Set HTTP auth credentials |
vd+ / vd- | Meatloaf | Enable / disable VDrive mode |
ej+ / ej- | Fast loader | Toggle JiffyDOS fast loader |
ee+ / ee- | Fast loader | Toggle Epyx fast loader |
ea+ / ea- | Fast loader | Toggle Action Replay 6 fast loader |
ef+ / ef- | Fast loader | Toggle Final Cartridge 3 fast loader |
ed+ / ed- | Fast loader | Toggle DolphinDOS fast loader |
These are the classic 1541/1571/1581 commands. Meatloaf implements most of them, either natively (for local SD/flash filesystems) or through VDrive emulation (for disk images).
i, uj, u9/ui| Command | Effect |
|---|---|
i | Initialize the drive: close all channels, reset memory, re-read directory. Sets the status to the DOS version string. |
uj | Cold reset — full re-initialization like i but also resets VDrive state. |
u9 / ui | Warm reset — re-runs the DOS vectors from $FFFA. Sets status to DOS version. |
u{shift-j} | Hard reset — same as cold reset, but also resets the working directory to flash root (/). |
u{shift-j}+ | Reboot the ESP32 — triggers fnSystem.reboot(). The entire device restarts. |
BASIC V2:
open 15,8,15 : print#15,"i" : close 15Wedge:
@iui+ / ui-| Command | Effect |
|---|---|
ui- | Set bus timing for VIC-20 speed (20 µs data valid). |
ui+ | Set bus timing for C64 speed (60 µs data valid). Default is C64. |
Switching to VIC-20 speed can help with timing-sensitive setups.
The status code is always set to OK.
BASIC V2:
open 15,8,15 : print#15,"ui-" : close 15 : rem VIC-20 mode
open 15,8,15 : print#15,"ui+" : close 15 : rem C64 moden:name,idCreates a new (empty) filesystem on the current media. When VDrive
mode is active (vd+), n: creates a new disk image file in the
current directory — the filename before the colon determines the image
name, and the id after the comma sets the disk label. When VDrive is
off, n: calls m_cwd->format() on the current directory.
open 15,8,15,"n:mydisk,01" : close 15Wedge: @n:mydisk,01
s:patternDeletes files matching a pattern. Supports wildcards * (any
characters) and ? (single character). Returns FILES SCRATCHED
with the count.
open 15,8,15,"s:backup.*" : close 15Wedge: @s:backup.*
r:newname=oldnameRenames a file. The = separator splits old name (right) from new
name (left). The match uses isMatch() which supports * and ?.
open 15,8,15,"r:newgame=oldgame" : close 15Wedge: @r:newgame=oldgame
c:newname=oldnameCopies a file on the same media. Same = syntax as rename.
open 15,8,15,"c:backup=original" : close 15Wedge: @c:backup=original
vRebuilds the Block Availability Map (BAM) on disk media. Currently a no-op that logs "validate bam" — the actual BAM rebuild is delegated to VDrive when active.
open 15,8,15,"v" : close 15Wedge: @v
b-p, b-r, b-w, b-a, b-f, b-eThese operate on the currently open file stream (not on a raw disk buffer like a 1541 would). They're adapted for Meatloaf's streaming model:
| Command | Arguments | Effect |
|---|---|---|
b-p channel,pos | channel, position | Buffer pointer — positions the stream's read/write cursor to pos. Calls stream->position(pos). |
b-r channel,trk,sec | channel, track, sector | Read block — seeks to track/sector via stream->seekSector(trk, sec), then reads the block into the status buffer. |
b-w channel,trk,sec | channel, track, sector | Write block — seeks to track/sector (implementation pending; currently just logs). |
b-a trk,sec | track, sector | Allocate block in BAM (currently logs only). |
b-f trk,sec | track, sector | Free block in BAM (currently logs only). |
b-e trk,sec | track, sector | Block execute (currently logs only). |
b-p is the most generally useful — it works on any stream (network
streams, file streams, disk image streams) for random-access seeking.
b-r reads the block content into the drive's status buffer. You
retrieve it by reading the error channel after the command.
BASIC V2 — b-p (position):
open 2,8,2,"http://example.com/data" : rem open file
open 15,8,15 : print#15,"b-p 2,256" : close 15 : rem seek to byte 256
rem read from channel 2 continues at position 256BASIC V2 — b-r (read block, retrieve via status):
open 2,8,2,":myfile" : rem open file on channel 2
open 15,8,15 : print#15,"b-r 2,0,18,0" : rem seek to track 18 sector 0 on channel 2
close 15
input#15, e, e$, t, s : rem read the block data from statusWedge — b-p:
@b-p 2,256m-r, m-w, m-eThese operate on Meatloaf's internal DOS RAM (not the C64's memory). This is the firmware's own memory space used for ROM patching and fast-loader detection.
| Command | Arguments | Effect |
|---|---|---|
m-r addr,len | addr (2 bytes), len (1 byte) | Memory read — reads len bytes from firmware address addr and returns them through the status channel. |
m-w addr,len,data | addr (2 bytes), len (1 byte), data (up to 34 bytes) | Memory write — writes data to firmware address addr. Used for soft-loading fast-loader ROM patches. |
m-e addr | addr (2 bytes) | Memory execute — calls a function at firmware address addr. Used to activate detected fast loaders. Also checks m_memory.mw_hash against known fast-loader hashes for auto-detection. |
m-r — read from firmware memory:
open 15,8,15 : print#15,"m-r" + chr$(0) + chr$(3) + chr$(4) : rem read 4 bytes from $0300
input#15, a$ : rem read returned bytes
close 15m-w — write to firmware memory:
rem This is binary — you send raw bytes after m-w
open 15,8,15
print#15,"m-w" + chr$(0) + chr$(3) + chr$(2) + chr$(1) + chr$(2) : rem write bytes $01 $02 to $0300
close 15These commands use Petroski's "M-W" protocol from the original 1541 and are commonly used by fast-loader cartridges to install custom drive code on-the-fly.
u1–u9, ua–uh, ui, ujThese are the classic user-command vectors from 1541 DOS:
| Command | Effect |
|---|---|
u1 ch,drv,trk,sec / ua ch,drv,trk,sec | Block read — seeks to track/sector on the stream for channel, then reads the block. Like b-r but uses the U1 vector. |
u2 ch,drv,trk,sec / ub ch,drv,trk,sec | Block write — seeks to track/sector, then writes. |
u3–u9 / uc–uh | User command — execute firmware code at address $0500 + (N*3) where N is 0–6 (u3=0, u4=3, u5=6, u6=9, u7=12, u8=15, u9=18; uc=21, ud=24, ue=27, uf=30, ug=33, uh=36). These are the standard 1541 user vectors. |
u9 / ui | Warm reset — see Initialize section above. |
uj | Cold reset — see Initialize section above. |
BASIC V2 — u1 block read:
open 15,8,15,"u1 2,0,18,0" : rem read block at track 18 sector 0 into channel 2's stream
close 15cdChanges Meatloaf's current working directory (the m_cwd pointer).
Accepts relative paths (cd dirname, cd..), absolute paths
(cd/path/to/dir), and URLs. The : separator, _ (parent), ^
(up/root), / path separators are all handled:
| Example | Effect |
|---|---|
cd dir | Enter directory DIR from current location |
cd:dir | Same, with : separator |
cd_ | Go up one level (parent directory) |
cd:_ | Same, with : separator |
cd.. | Go up one level (Unix-style) |
cd:.. | Same, with : separator |
cd^ | Go to root |
cd/ | Go to root |
cd/sd/ | Navigate to SD card root |
cd//sd/games | Navigate to SD card games folder |
cd http://server/path/ | Navigate to a URL |
The directory listing is obtained by load"$",8 (without changing the
directory), but after a cd command, the $ listing reflects the new
current directory.
BASIC V2:
open 15,8,15 : print#15,"cd games" : rem go into GAMES directory
open 15,8,15 : print#15,"cd.." : rem go up one level
open 15,8,15 : print#15,"cd/" : rem go to root
open 15,8,15 : print#15,"cd//sd" : rem switch to SD cardWedge:
@cd games
@cd..
@cd/
@cd//sdpwdReturns the current working directory URL through the error channel.
The response is PETSCII-encoded and ends with CR.
BASIC V2:
open 15,8,15
print#15,"pwd"
input#15, e, e$, t, s
print e$ : rem prints the current directory path
close 15Wedge:
@pwdmd:pathCreates a new directory at the given path. If the path already exists,
returns FILE EXISTS. If the filesystem is read-only, returns
WRITE PROTECT. On failure, returns WRITE ERROR.
BASIC V2:
open 15,8,15,"md:newdir" : close 15Wedge:
@md:newdirrd:pathDeletes an empty directory. Standard CBM DOS error codes apply:
FILE NOT FOUND if it doesn't exist, WRITE PROTECT if read-only,
WRITE ERROR on failure.
BASIC V2:
open 15,8,15,"rd:olddir" : close 15Wedge:
@rd:olddirp ch,hi,mid,loPositions the read/write cursor of an open channel's stream. The
position is calculated as (hi * 65536) + (mid * 256) + lo. This is
the same p command from SD2IEC and works on any open stream,
including network streams and disk image streams.
open 2,8,2,"http://example.com/bigfile"
open 15,8,15 : print#15,"p 2,0,1,0" : rem seek to byte 256
close 15Wedge:
@p 2,0,1,0cp n / c{shift-p}nSwitches to a different partition on mounted CMD media (DHD hard
disks, D1M/D2M/D4M floppy images). The partition number must be
1–254 (a CMD HD holds at most 254 partitions); partition 0 is the
system partition and cannot be selected, though it does appear in
the $=P listing. Returns PARTITION SELECTED on success or ILLEGAL PARTITION if the partition doesn't exist.
Two forms:
cp 2, cp 5 — the number follows cp.c + {shift-p} + n where n is a raw byte.After a successful partition change, the working directory is set to that partition's root.
A partition can also be named directly as the first component of an
in-image path — hdbackup.dhd/2/game or hdbackup.dhd/subs/game. That
loads or saves from that partition without changing the selected
one; only cp n and the partition console command change the
selection. A partition number of 0 in a path means "the currently
selected partition". Where a file has the same name as a partition the
partition wins — reach the file by giving the partition number
explicitly, e.g. hdbackup.dhd/2/subs.
BASIC V2:
open 15,8,15,"cp 2" : close 15 : rem switch to partition 2Wedge:
@cp 2auth:user,passSets HTTP Basic authentication credentials for the current working
directory (used when accessing password-protected URLs). The user and
password are comma-separated after the auth: prefix. These
credentials are stored in the current directory's MFile object and
applied to all subsequent HTTP requests from that location.
open 15,8,15,"auth:myuser,mypassword" : close 15Wedge:
@auth:myuser,mypasswordvd+ / vd-Enables or disables Meatloaf's Virtual Drive mode. VDrive mode
intercepts file operations to present disk images (D64, D81, DHD,
etc.) as if they were real Commodore floppy drives — directory
listings show the image's internal directory, load/save operate on
the image's internal files, and commands like n: create new disk
image files.
| Setting | Effect |
|---|---|
vd+ | Enable VDrive mode — disk images are mounted as virtual drives with full internal filesystem emulation |
vd- | Disable VDrive mode — files are accessed directly from the underlying filesystem (default) |
When VDrive mode is enabled, the m-r, m-w, m-e commands are
not delegated to VDrive — they still operate on firmware memory.
Commands like b-p, u1/ua still go through VDrive's channel
handlers.
BASIC V2:
open 15,8,15 : print#15,"vd+" : close 15 : rem enable VDrive
open 15,8,15 : print#15,"vd-" : close 15 : rem disable VDriveWedge:
@vd+
@vd-xr:romnameLoads a custom DOS ROM by name. The ROM name is UTF-8 decoded (the
command is mstr::toUTF8()'d before use). Meatloaf stores known
ROMs that can be swapped in on-the-fly. If the named ROM is not
found, returns FILE NOT FOUND.
open 15,8,15,"xr:dos1541" : close 15 : rem load 1541 DOS ROMWedge:
@xr:dos1541These enable or disable detection of specific fast-loader protocols. Each fast loader has its own ROM-patch detection logic in Meatloaf's memory. When detection is enabled, Meatloaf watches the m-r/m-w/m-e sequence sent by the C64's fast-loader cartridge and activates the correct drive-side fast transfer protocol. When disabled, the drive falls back to standard IEC timing for that loader.
All fast-loader toggles follow the same pattern: <two letters>+ to
enable, <two letters>- to disable.
| Command | Fast Loader | Compile guard |
|---|---|---|
ej+ / ej- | JiffyDOS | IEC_FP_JIFFY |
ee+ / ee- | Epyx FastLoad | IEC_FP_EPYX |
ea+ / ea- | Action Replay 6 | IEC_FP_AR6 |
ef+ / ef- | Final Cartridge 3 | IEC_FP_FC3 |
ed+ / ed- | DolphinDOS | IEC_FP_DOLPHIN |
Whether a particular fast-loader toggle is available depends on the
Meatloaf firmware build — each is guarded by a compile-time
#ifdef. If you send an unknown toggle or one not compiled in,
the command falls through and you get ?syntax error from the drive.
BASIC V2:
open 15,8,15 : print#15,"ej+" : close 15 : rem enable JiffyDOS fast loader
open 15,8,15 : print#15,"ee+" : close 15 : rem enable Epyx FastLoad
open 15,8,15 : print#15,"ej-" : close 15 : rem disable JiffyDOS fast loaderWedge:
@ej+
@ee+
@ej-t-c, t-iThese commands operate on mounted tape images (.tap, .dmp,
.htap files). The current working directory must be inside a tape
container for these to work — otherwise the drive returns
INVALID COMMAND.
Sets the tape read position by time. Two argument formats:
t-c 45000 — seek to 45 seconds int-c 0:45 or t-c mmm:ss — seek to 0:45The command is parsed as:
image->setCounter(arg)which returns ST_OK on success or ST_SYNTAX_INVALID if the
argument is malformed.
BASIC V2:
open 15,8,15 : print#15,"t-c 0:45" : close 15 : rem seek to 0:45
open 15,8,15 : print#15,"t-c 45000" : close 15 : rem seek to 45 secondsWedge:
@t-c 0:45Scans the mounted tape image and generates its .idx index file
alongside the tape image. The index file speeds up subsequent tape
access by pre-computing the locations of all blocks. Uses
TAPMFile::buildIndex() internally.
BASIC V2:
open 15,8,15 : print#15,"t-i" : close 15Wedge:
@t-it-r*, t-w*Meatloaf has a real-time clock that can be read and (partially) written through the command channel. The time is sourced from the ESP32's system time (which may be set by NTP or manually).
| Command | Format | Example output |
|---|---|---|
t-ra | ASCII | 07/18/2026 14:30:00 |
t-ri | ISO-8601 | 2026-07-18T14:30:00 |
t-rd | Decimal | Packed decimal representation |
t-rb | BCD | Binary-coded decimal representation |
t-rz | Timezone | UTC or America/New_York etc. |
The time data is written to the drive's status buffer and can be read through the error channel after issuing the command.
BASIC V2 — use get# because t-ra contains colons (:):
10 open 15,8,15
20 print#15,"t-ra"
30 get#15, a$ : if a$="" then 30
40 if a$ = chr$(13) then close 15 : end
50 print a$; : goto 30Wedge:
@t-ra| Command | Effect | Status |
|---|---|---|
t-wa | Write time from ASCII string | Not yet implemented |
t-wi | Write time from ISO-8601 string | Not yet implemented |
t-wd | Write time from decimal | Not yet implemented |
t-wb | Write time from BCD | Not yet implemented |
t-wz:timezone | Set the timezone | ✅ Implemented |
t-wz — Set timezone:
open 15,8,15 : print#15,"t-wz:America/New_York" : close 15Wedge:
@t-wz:America/New_YorkTime zones use POSIX TZ format strings (e.g. UTC, EST5EDT,
America/New_York, CET-1CEST). The value is stored in the ESP32's
environment variable TZ and takes effect immediately.
After every command, the drive's error/status channel returns a structured response. Reading it confirms whether the command succeeded:
open 15,8,15 : input#15, e, e$, t, s : close 15The format is always: CODE,MESSAGE,TRACK,SECTOR
Colon gotcha:
input#splits on:. If the message contains colons (liket-ratime output:07/18/2026 14:30:00), only the part before the first colon is captured. Useget#in a loop for commands that return colons in their output.
| Code | Message | Meaning |
|---|---|---|
00 | ok | No error |
01 | files scratched | s: command succeeded; the 1st status byte holds the count |
02 | partition selected | cp:nn succeeded; track byte holds partition number |
03 | illegal partition | Requested partition doesn't exist |
20 | read error | Block read failure (no header/sync/data/checksum) |
25 | write error | Write verification failed |
26 | write protect | Media is read-only |
30 | invalid command | Unrecognized or malformed DOS command |
31 | invalid filename | Bad file name syntax |
62 | file not found | File or directory doesn't exist |
63 | file exists | File already exists (create without overwrite) |
70 | no channel | Referenced channel doesn't exist |
72 | dir error | Directory error |
73 | disk full | Media is full |
74 | drive not ready | Drive or media not available |
77 | file type mismatch | Operation not supported for this media type |
83 | permission denied | Access denied |
73 | meatloaf x.y | dos version — returned on init/reset, x.y is the firmware version |
load"$",8 : rem try device 8
load"$",9 : rem try device 9 if 8 didn't respondOr via wedge (JiffyDOS):
/$ ← try device 8 (default)
@#9 ← switch default to device 9
/$ ← list device 9open 15,8,15 : print#15,"cd http://example.com/games" : close 15
load"$",8
listopen 15,8,15,"auth:guest,letmein" : close 15
load"http://example.com/protected/game.prg",8
run@ej+ ← enable JiffyDOS fast loader
/cd games ← navigate to games directory
/$ ← list games
/game ← load and run a gameopen 15,8,15 : print#15,"cd//sd" : close 15
load"$",8
list@t-ra ← read current time as ASCII@i ← initialize (reset) drive
@ ← check that status is 00,ok nowopen 15,8,15,"t-c 10:30" : rem fast-forward to 10 minutes 30 seconds
close 15
load"tap:",1,1 : rem load from tape device| Situation | This skill | Other skill |
|---|---|---|
| Making HTTP requests (GET/POST/PUT with headers, bodies, JSON parsing) | ❌ Covers standard DOS only | ✅ meatloaf-networking skill — full-mode HTTP client with m,h,b,s,status,r-h,r-b,j commands |
| Writing C64 BASIC V2 programs (bc64 compiler, POKEs, SID, sprites, loops) | ❌ Covers only the DOS command channel | ✅ c64-basic skill — writing BASIC code, bc64 syntax |
JiffyDOS wedge commands (@, /, ↑, @$, sys 58451) | ✅ Explains how @ forwards commands | ✅ c64-jiffydos skill — full JiffyDOS reference, wedge shortcuts, function keys |
| Debugging / unattended C64 workflow (inject BASIC, capture serial, iterate) | ❌ | ✅ c64-meatloaf-debug skill |
| C64 hardware reference (POKE addresses, SID, sprites, joystick) | ❌ | ✅ c64-basic skill, hardware reference |
| Meatloaf firmware itself (building, flashing, board configs) | ❌ | See the idolpx/meatloaf repo |
The DOS command channel (this skill) lives below the full-mode HTTP client in Meatloaf's architecture:
┌─────────────────────────────────┐
│ C64 BASIC program │
│ ↓ open/print#/input# │
├─────────────────────────────────┤
│ DOS command channel (sec addr 15) │ ← You are here
│ ↓ cd, pwd, md, s:, n:, auth, │
│ ej+, t-ra, cp, etc. │
├─────────────────────────────────┤
│ Full-mode HTTP client (sec addr 2) │ ← meatloaf-networking skill
│ ↓ m, h, b, s, status, r-h, r-b, j │
├─────────────────────────────────┤
│ IEC bus + WiFi (ESP32) │
└─────────────────────────────────┘The DOS command channel handles drive-level operations: navigating directories, formatting media, deleting files, setting time, toggling fast loaders. The full-mode HTTP client handles application-level networking: making API calls with custom headers and bodies.
When both are needed (e.g., a BASIC program navigates to a URL with
cd, enables JiffyDOS with ej+, then makes an API call), use both
skills.
@ prefix, / load shortcut, function key
macros, sys 58451), see the
c64-jiffydos skill.lib/device/iec/drive.cpp
in the idolpx/meatloaf repo.© 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 1 other file in .claude/skills/commodore64-meatloaf of idolpx/meatloaf.
Open the folder on GitHubat commit 9a88a9f
Meatloaf Dos 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 |
|---|---|---|---|---|---|---|
| Meatloaf Dos this skillidolpx/meatloaf | 128 | — | ~7.4k | Automated safety check: Pass | GPL-3.0 | |
| RuView Hardware Setupruvnet/RuView | 97k | — | ~1.8k | Automated safety check: Notes | MIT | |
| Esp32 Firmware Engineeralxv2016/folloup-sticky | 117 | 1 repos | ~3.8k | Automated safety check: Pass | GPL-3.0 | |
| RuView mmWave Radar Setupruvnet/RuView | 97k | — | ~907 | Automated safety check: Notes | MIT | |
| Embedded DebugFastLED/FastLED | 7.5k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Auto EmbeddedDunCanYounG-1/MICU-auto-embedded | 253 | — | ~1.6k | Automated safety check: Pass | CC-BY-NC-4.0 |
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.
ruvnet/RuView
Sets up and runs 60 GHz and 24 GHz mmWave radar sensing on ESP32 boards in RuView, alone or fused with WiFi CSI.
FastLED/FastLED
Firmware crash analysis, stack trace decoder, and register dump interpreter for ESP32/ARM/AVR platforms.
DunCanYounG-1/MICU-auto-embedded
全平台嵌入式 AI 开发框架(对标 Trellis):把 RIPER-5 五阶段协议 + 四文件记忆 + 分层架构门禁 + Scout/Builder/Verifier 多 Agent + 24 个工具调用技能(build/flash/debug/serial/can/modbus/visa/static/memory/rtos/scons),做成『装进工程、项目级 hook…
BlueAndi/Pixelix
A skill your agent uses when writing, reviewing, or refactoring C/C++ firmware code in this repository (src/, lib/, test/) — creating or editing .h/.hpp/.cpp files, applying MISRA-oriented and…
idolpx/meatloaf
Debug Commodore 64 programs running under the VICE emulator through its binary monitor: BASIC, cc65-compiled C, and 6502 assembly.
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 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
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. Meatloaf Dos is an agent skill from 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.
Meatloaf Dos fits situations like: the user asks about Meatloaf DOS commands; custom fast-loader toggles; directory navigation; tape image operations.
Run `npx skills add idolpx/meatloaf --skill meatloaf-dos -a claude-code`. Or copy the skill folder (.claude/skills/commodore64-meatloaf in idolpx/meatloaf) into .claude/skills/meatloaf-dos in your project. Claude Code loads it when a task matches its description.
Run `npx skills add idolpx/meatloaf --skill meatloaf-dos -a codex`. Or copy the skill folder (.claude/skills/commodore64-meatloaf in idolpx/meatloaf) into .agents/skills/meatloaf-dos 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 meatloaf-dos -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/meatloaf-dos, .gemini/skills/meatloaf-dos, .github/skills/meatloaf-dos and .opencode/skills/meatloaf-dos in your project.
SKILL.md names no scripts, command-line tools or credentials: Meatloaf Dos is instructions for the agent only.
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. Review the folder before installing.
Meatloaf Dos 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 7.4k tokens (SKILL.md is roughly 29k 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 Meatloaf Dos: RuView Hardware Setup (ruvnet/RuView, 97k stars), Esp32 Firmware Engineer (alxv2016/folloup-sticky, 117 stars), RuView mmWave Radar Setup (ruvnet/RuView, 97k stars) and Embedded Debug (FastLED/FastLED, 7.5k 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.