Picocalc_NESco
May 1, 2026 · View on GitHub
Picocalc_NESco は、PicoCalc 向けに調整している NES エミュレーター firmware です。
現在の実装は infones ベースで、PicoCalc の LCD、I2C keyboard、PWM audio、SD / flash ROM 選択 menu に接続しています。
現在の埋め込み version は 1.1.24 です。
このプロジェクトは PicoCalc 専用 firmware を対象にしています。
PicoCalc 向け以外の build は未検証なので、現在は明示的に無効化しています。
infones 側にある他環境向け build は、このプロジェクトの対象外です。
概要
現状は「日常的に試せる build」ができていて、ROM menu、通常表示、stretch 表示、基本的なセーブデータ保存 / 復元まで動作確認が進んでいます。 一方で、特殊 mapper ROM の互換性確認など、継続して確認中の項目があります。

以下の画像は動作例です。ROM ファイルは同梱していません。 ゲーム中は通常表示と stretch 表示を切り替えできます。下のゲーム画面は Mapper30 ROM での動作例です。


実装の特徴
infonesベースの NES emulation を PicoCalc 向け firmware として接続しています- PicoCalc ROM menu から ROM を選択して起動できます
- SD card の ROM 読み込みと、本体 flash 常駐 ROM entry 表示に対応しています
ESCによる game から menu への復帰を確認しています256x240通常表示に対応しています320x300stretch 表示に対応しています。ただし optional 表示機能であり、常時60fpsは保証していません- game 中の
Shift+Wで256x240と320x300を切り替えできます - ROM menu / help / game 中の screenshot 保存と、ROM menu からの screenshot viewer に対応しています
- core1 keyboard polling と core1 LCD worker により、入力応答と game 表示処理を補助しています
- battery-backed SRAM の
*.srmsave / restore に対応しています。DragonQuest3で実機確認済みです Mapper30ROM の起動と表示を実機確認済みです。ただし*.m30保存 / 復元は未確認ですMap6Map19Map185Map188Map235は dynamic 化済みです。ただし対象 mapper ROM での実機確認は未完です- runtime log は default では banner 1 行目以外 disable です
- PicoCalc debug console の UART は
921600 bpsで初期化します
すぐ使うには
- build して
Picocalc_NESco.uf2を作る - SD card の
pico1-appsにPicocalc_NESco.uf2を置く - 起動時に PicoCalc 側から選んで起動する
- SD card に
.nesを置く - 起動後の ROM menu から
Enterまたは-で開始する
ROM ファイルは同梱していません。利用者自身が合法的に用意した ROM を使用してください。
PicoCalc への設置方法は、PicoCalc 側の pico_multi_booter など既存運用を参照してください。
事実として、*.uf2 は SD card の pico1-apps に置くことで、起動時に選択できます。
操作方法
ROM menu:
Up / Down: cursor moveEnter / -: open or startH / ?: helpF4: screenshot viewerF5: screenshot
In game:
Arrow keys: D-pad`: Select-: Start[: B]: AESC: return to ROM menuF1: resetF5: screenshotShift+W:256x240/320x300view toggle
ビルド
事実:
PICO_SDK_PATHが必須です- build system は CMake + Pico SDK です
- target は
Picocalc_NEScoです .uf2はpico_add_extra_outputs()により生成されます
以下の build 例は Picocalc_NESco/ で実行する前提です。
初回 build 例:
cmake -S . \
-B build \
-DPICO_SDK_PATH=/path/to/pico-sdk
cmake --build build -j4
既存 build dir を使う更新 build 例:
cd build
make clean
make -j4
build 後は、生成物から次を自動表示するようにしています。
arm-none-eabi-size- 埋め込み version / build id banner
想定生成物:
build/Picocalc_NESco.elfbuild/Picocalc_NESco.uf2
GitHub Actions では、push / pull request / manual run 時に clean configure / build と *.elf / *.uf2 生成確認だけを自動実行します。実機確認は含みません。
実行時メモ:
- 起動時は version / build id banner を 1 行表示します
- UART baud rate は
921600 bpsです - それ以外の verbose runtime log は default では無効です
- game 開始時と通常表示復帰時には、viewport 外側へ
Shift+W Stretch Screenのヒントを表示します - 一番上の flash 常駐 entry は
SYSTEM FLASHと表示します
セーブ仕様
通常の battery-backed SRAM save は raw *.srm として扱います。
.nesは SD card の/nesに置くことを推奨します- root に置いても構いませんが、
/nesがある場合はそこから起動する前提で運用しています sd:/から起動した ROM は、ROM と同じ場所に*.srmを置きますflash:/staged ROM は、flash metadata に保存した元のsd:/.../*.nespath を基準に、元 ROM と同じ場所へ*.srmを置きます- metadata が古く元 path を持たない staged ROM だけは、fallback として
0:/saves/を使います
Mapper30 は、通常の *.srm に加えて PRG flash overlay を *.m30 として保存 / 復元する初段実装があります。
事実:
- 通常の
*.srmsave はDragonQuest3で実機確認済みです Mapper30ROM の起動と表示は実機確認済みですMapper30の*.m30保存 / 復元は、実ゲームでの書き込み / 復元確認が未完です
既知の制約
Mapper30の*.m30保存 / 復元は実装済みですが、実ゲームでの書き込み / 復元確認は未完ですMap6Map19Map185Map188Map235は dynamic 化済みですが、対象 mapper ROM での実機確認は未完ですcore/ディレクトリは repo に残っていますが、現在の active target source には入っていません- 電源 ON 時の audio pop は残ることがありますが、現状は運用上許容として扱っています
- 互換性確認の最小セットは
docs/project/ARCHITECTURE.mdの互換性確認の基準を参照してください
ライセンス概要
この repo は単一 license ではありません。概要は次です。
- project-owned top-level /
platform//drivers/: MIT infones/: GNU GPL v2fatfs/: FatFs licensefont/: M+ / PixelMplus derived datacore/: source header 上は MIT だが、由来整理は継続中
infones、fatfs、font 系既存資産を除く PicoCalc 向け接続層・周辺実装の大半は Codex 支援のもとで作成しています。
正本は LICENSE を参照してください。
関連文書
- 現在のタスク:
docs/project/TASKS.md - 作業規約:
docs/project/CONVENTIONS.md - 構成メモ:
docs/project/ARCHITECTURE.md - 計画書索引:
docs/project/PLANS.md - agent 向け入口:
AGENTS.md - 履歴:
docs/project/Picocalc_NESco_HISTORY.md infones接続設計:docs/design/INFONES_PLATFORM_CONNECTION_PLAN_20260419.md- mapper 動的化設計:
docs/design/MAPPER_DYNAMIC_ALLOCATION_PLAN_20260419.md