Agent skill

TeensyROM Menu Program Adder

by SensoriumEmbedded in SensoriumEmbedded/TeensyROM

Adds a Commodore 64 program, cartridge, SID or picture to TeensyROM's built-in menu by converting it to a PROGMEM header and wiring it into MainMenuItems.h.

MITAuto-check passedDevelopment

Install TeensyROM Menu Program Adder

skills CLI
$ npx skills add SensoriumEmbedded/TeensyROM --skill add-menu-program -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install SensoriumEmbedded/TeensyROM add-menu-program --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/SensoriumEmbedded/TeensyROM.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/add-menu-program .claude/skills/add-menu-program && rm -rf skills-src

Use ~/.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/

Facts

Skill name
add-menu-program
GitHub stars
227
Token cost
~1.2k tokens
SKILL.md length
575 words
Files
1
Skills in repo
4
Repo updated
First seen
Licence
MIT

At a glance

Adds a Commodore 64 program, cartridge, SID or picture to TeensyROM's built-in menu by converting it to a PROGMEM header and wiring it into MainMenuItems.h.

  • Works in 4 steps: Get what you need up front → Convert the binary to a header → Place the header → …
  • Adding a game, demo or cartridge image to the TeensyROM menu
  • SKILL.md covers 0. Get what you need up front, 1. Convert the binary to a…, 2. Place the header and 3. Wire it into MainMenuItems.h
  • Calls node

What it does

TeensyROM compiles its menu content into the firmware as PROGMEM byte arrays, so adding a file means converting it to a header, placing the header where the build expects it, and wiring it into `MainMenuItems.h`. The agent starts by asking for anything missing: the source file, which existing menu directory it belongs in, the display name for the menu, which is free text and often differs from the filename, and a target folder if not the default.

Conversion uses `node tools/bin2header.mjs -t PROGMEM` on the file, which writes a header next to the source, with the array name taken from the filename. If the filename starts with a digit, the name must be overridden with `-n` so it begins with a letter, following the existing convention, and the generated declaration is checked for the PROGMEM static const form. The header then goes in `Source/Teensy/TRMenuFiles/ROMs/` by default, or the text, SID or picture folders, followed by two edits in `Source/Teensy/MainMenuItems.h`.

When your agent uses it

  • Adding a game, demo or cartridge image to the TeensyROM menu
  • Embedding a SID tune or picture file in the firmware menu
  • Fixing an array name that breaks the build after converting a binary

Example prompts

  • “Add Space Taxi.prg to the TeensyROM menu and show it as Space Taxi (1984).”
  • “Convert this .crt cartridge to a header and wire it into the ROMs section.”
  • “The converted file starts with a number and the array name fails to compile. Fix it.”

Requirements

  • Node.js, to run tools/bin2header.mjs
  • A checkout of the TeensyROM repository

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Get what you need up front
  2. Convert the binary to a header
  3. Place the header
  4. Wire it into MainMenuItems.h

What it can do on your machine

Read from SKILL.md and the folder at commit 28f6aa8. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

TeensyROM Menu Program Adder loads about 1.2k tokens when it runs. Until then it costs about 106 tokens; SKILL.md has 575 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~106
When it runs · the whole SKILL.md, loaded when a task matches
~1.2k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from SensoriumEmbedded/TeensyROM at commit 28f6aa8, republished under its MIT licence (© SensoriumEmbedded). 575 words, ~1,186 tokens.

Download SKILL.mdSave it as .claude/skills/add-menu-program/SKILL.md (or your agent's skills folder).
name
add-menu-program
description
Steps for adding a C64 program/binary to TeensyROM's built-in menu (converting a .prg/.crt/.bin into a PROGMEM header via tools/bin2header.mjs, dropping it into Source/Teensy/TRMenuFiles/, and wiring it into MainMenuItems.h). Use this whenever the user wants to add a program, game, demo, cart, SID, or picture file to the TeensyROM menu, or asks to "add X to the menu" / "add a new ROM" for this project.

Adding a program to TeensyROM's built-in menu

TeensyROM embeds its menu content as PROGMEM byte arrays compiled directly into the firmware. Adding a file means: convert it to a header, drop the header where the build expects it, then wire two things into MainMenuItems.h.

0. Get what you need up front

Ask for whatever isn't given:

  • The source file (a .prg in the common case; could be .crt/.bin/.sid/.kla etc.)
  • Which existing menu directory it goes in (see the mapping below — if the user names a directory that doesn't obviously match, check the table at the bottom of Source/Teensy/MainMenuItems.h rather than guessing)
  • The display name to show in the TeensyROM menu (this is free text the user chooses — often quite different from the filename, don't just reuse the filename)
  • Target directory for the header file, if not the default (Source/Teensy/TRMenuFiles/ROMs/)

1. Convert the binary to a header

node tools/bin2header.mjs -t PROGMEM "<path-to-file>"

This writes <file>.h next to the source (e.g. MyProg.prg → MyProg.prg.h) unless -o is given. The array name (-n) defaults to the filename with . replaced by _ — this is the identifier you'll reference in step 3, so don't rename it after the fact without also updating the reference.

Gotcha — check the first character of the filename before running. If it starts with a digit, the default array name would start with _, which collides with C's reserved- identifier rules. The existing convention in this codebase (see a586220ast_Diagnostics.h, a781220_Dead_Test.h) is to override with -n "a<name>" instead — a leading letter, not an underscore.

Verify PROGMEM actually landed correctly. Open the generated .h and check the array declaration line reads exactly:

c
PROGMEM static const unsigned char <hname>[] = {

tools/bin2header.mjs adds the space after -t PROGMEM for you (the old Python script did not, and produced PROGMEMstatic const...), so this check is a sanity check rather than a known trap.

2. Place the header

Move/copy the generated .h into Source/Teensy/TRMenuFiles/ROMs/ (the default for programs/carts/binaries) unless the user specified a different subfolder — the codebase also uses TRMenuFiles/Text_PETSCII/, TRMenuFiles/SIDs/, and TRMenuFiles/Pics/ for those respective content types.

Show full SKILL.md (249 more words)Show less

3. Wire it into MainMenuItems.h

Two edits, both in Source/Teensy/MainMenuItems.h:

a) Add the #include, grouped with the other includes of the same content type near the top of the file:

c
#include "TRMenuFiles/ROMs/<file>.h"

b) Add a row at the bottom of the target directory's array. Each menu directory is a StructMenuItem dir<Name>[] array. Find the right one from the human-readable name using the top-level directory table near the end of the file (around line ~313), which maps display names to array identifiers, e.g.:

c
rtDirectory, IOH_None, (char*)"/Utilities", (uint8_t*)dirUtilities, sizeof(dirUtilities),

tells you "Utilities" is dirUtilities. Append a new row at the bottom of that array, matching its existing column alignment:

c
rtFilePrg  , IOH_None         , (char*)"<Display Name>"           , (uint8_t*)<hname>    , sizeof(<hname>) ,
  • rtFilePrg is correct for a plain .prg; use rtFileCrt/rtFileSID/rtFileKla/ rtBin16k/rtBin8kHi/rtBin8kLo etc. to match the source format — check a sibling entry in the same array for the type actually used for that format.
  • IOH_None is correct unless the program needs a specific IO handler active while it runs (e.g. IOH_Swiftlink for a terminal program, IOH_TR_BASIC for BASIC-with-TR-commands) — if unsure, ask, or check what a similar existing entry uses.
  • <hname> must be the exact array name bin2header generated (or the -n override), used identically for both the pointer cast and the sizeof().

That's the whole change — sizeof(dir<Name>) in the top-level directory table is computed automatically, so nothing else needs to be touched for a program going into an existing directory. (Adding a new top-level directory, rather than a program inside an existing one, would also need a new row in that top-level table — out of scope for this checklist unless asked.)

© SensoriumEmbedded, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/add-menu-program of SensoriumEmbedded/TeensyROM.

Open the folder on GitHubat commit 28f6aa8

Compare with similar skills

TeensyROM Menu Program Adder 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.

TeensyROM Menu Program Adder compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
TeensyROM Menu Program Adder this skillSensoriumEmbedded/TeensyROM227—~1.2kAutomated safety check: PassMIT
Authoring VPhone Patch SetsLakr233/vphone-cli15k—~4.6kAutomated safety check: PassMIT
Sipeed I2C and SPI Hardware Controlsipeed/picoclaw30k—~578Automated safety check: PassMIT
RuView Hardware Setupruvnet/RuView97k—~1.8kAutomated safety check: NotesMIT
Esp32 Firmware Engineeralxv2016/folloup-sticky1161 repos~3.8kAutomated safety check: PassGPL-3.0
ExecuTorch Binary Size Reductionpytorch/executorch5.1k—~793Automated safety check: PassCustom licence

Similar skills

  • Authoring VPhone Patch Sets

    Lakr233/vphone-cli

    Explains how to declare a firmware patch in a vphone patch set, add a new set, or write a preset, including naming, gating and the checks that catch undeclared patches.

    15k GitHub stars~4.6k tokensUpdated today
    DevelopmentAuto-check passed
  • Reads and controls I2C and SPI peripherals on Sipeed boards such as LicheeRV Nano, MaixCAM and NanoKVM through the i2c and spi tools.

    30k GitHub stars~578 tokensUpdated 13 days ago
    DevelopmentAuto-check passed
  • 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.

    97k GitHub stars~1.8k tokensUpdated today
    DevelopmentAuto-check: notes
  • Esp32 Firmware Engineer

    alxv2016/folloup-sticky

    ESP32 firmware engineering for ESP-IDF projects. An agent skill from alxv2016/folloup-sticky.

    116 GitHub starsUsed in 1 repo~3.8k tokens
    DevelopmentAuto-check passed
  • Measures and shrinks the ExecuTorch runtime binary by building a size test, analyzing it with bloaty and landing each reduction as its own pull request.

    5.1k GitHub stars~793 tokensUpdated today
    DevelopmentAuto-check passed
  • Sets up and runs 60 GHz and 24 GHz mmWave radar sensing on ESP32 boards in RuView, alone or fused with WiFi CSI.

    97k GitHub stars~907 tokensUpdated today
    DevelopmentAuto-check: notes

More from SensoriumEmbedded/TeensyROM

  • TeensyROM IO Handler Checklist

    SensoriumEmbedded/TeensyROM

    Walks through adding a new cartridge or peripheral IO handler to TeensyROM's MinimalBoot firmware and the three files that must stay in sync.

    227 GitHub stars~1.8k tokensUpdated today
    Auto-check passed
  • Beyond Compare Git Diff Opener

    SensoriumEmbedded/TeensyROM

    Opens Beyond Compare on a git diff for the current work, a pull request, a branch, a commit or a range, without touching the checkout.

    227 GitHub stars~2.4k tokensUpdated today
    Auto-check passed
  • TeensyROM Build and Flash

    SensoriumEmbedded/TeensyROM

    Explains how to build the C64 menu programs and the dual-boot TeensyROM firmware from the repo and flash it to one or more boards over USB.

    227 GitHub stars~1.3k tokensUpdated today
    Auto-check passed

Categories

Questions about TeensyROM Menu Program Adder

What does TeensyROM Menu Program Adder do?

Adds a Commodore 64 program, cartridge, SID or picture to TeensyROM's built-in menu by converting it to a PROGMEM header and wiring it into MainMenuItems.h. h`. The agent starts by asking for anything missing: the source file, which existing menu directory it belongs in, the display name for the menu, which is free text and often differs from the filename, and a target folder if not the default.

When should I use TeensyROM Menu Program Adder?

TeensyROM Menu Program Adder fits situations like: adding a game, demo or cartridge image to the TeensyROM menu; embedding a SID tune or picture file in the firmware menu; fixing an array name that breaks the build after converting a binary.

How do I install TeensyROM Menu Program Adder in Claude Code?

Run `npx skills add SensoriumEmbedded/TeensyROM --skill add-menu-program -a claude-code`. Or copy the skill folder (.claude/skills/add-menu-program in SensoriumEmbedded/TeensyROM) into .claude/skills/add-menu-program in your project. Claude Code loads it when a task matches its description.

How do I install TeensyROM Menu Program Adder in Codex?

Run `npx skills add SensoriumEmbedded/TeensyROM --skill add-menu-program -a codex`. Or copy the skill folder (.claude/skills/add-menu-program in SensoriumEmbedded/TeensyROM) into .agents/skills/add-menu-program in your project. Codex loads it when a task matches its description.

Can I use TeensyROM Menu Program Adder in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add SensoriumEmbedded/TeensyROM --skill add-menu-program -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-menu-program, .gemini/skills/add-menu-program, .github/skills/add-menu-program and .opencode/skills/add-menu-program in your project.

What does TeensyROM Menu Program Adder need to run?

Going by SKILL.md and its folder, TeensyROM Menu Program Adder needs the command-line tools its instructions call (node). Our summary lists: Node.js, to run tools/bin2header.mjs; A checkout of the TeensyROM repository.

Does TeensyROM Menu Program Adder access the network?

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.

Is TeensyROM Menu Program Adder safe to install?

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.

What licence does TeensyROM Menu Program Adder use?

TeensyROM Menu Program Adder is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does TeensyROM Menu Program Adder use?

About 1.2k tokens (SKILL.md is roughly 4.7k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to TeensyROM Menu Program Adder?

Skills that share tags, products or a category with TeensyROM Menu Program Adder: Authoring VPhone Patch Sets (Lakr233/vphone-cli, 15k stars), Sipeed I2C and SPI Hardware Control (sipeed/picoclaw, 30k stars), RuView Hardware Setup (ruvnet/RuView, 97k stars) and Esp32 Firmware Engineer (alxv2016/folloup-sticky, 116 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains TeensyROM Menu Program Adder?

SensoriumEmbedded (a GitHub user) maintains it in SensoriumEmbedded/TeensyROM, which has 227 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 7, 2026.

Source: SensoriumEmbedded/TeensyROM on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.