MacとClaude Codeで構築する cc65(NES)開発環境
2025.10.24

どもです。
いやぁ急に寒くなって来ましたね。
皆さん、どの様にお過ごしでしょうか。お身体大丈夫でしょうか。
そう、寒くなるとやりたくなるのがNES開発ですよね。
以前、アセンブラでハローワールドできる環境の記事…
M1 Macで作る、ファミコンソフトプログラミング。 アセンブラでハローワールド編
というか、もう4年前なの?
恐ろしい。。こんなに時間の経過って早くなるのか。。
ひゃー。
ということで、今回、
Shiru氏作のNES向けCライブラリ(PPU制御、スプライト描画など)neslibの開発環境を構築しようかな。と思って、ChatGPTと相談しつつ進めていたのですが、どうもうまくいかず、というか色々壁もありパッと用意できそうもないので、一旦cc65のスタートテンプレートでも用意しようかな。
とこちらもChatGPTと相談しつつ進めていたのですが、どうもうまくいかず(最近どうどうとChatGPTがハルシエーションかましてくる感じあってあんま信用してない)。というか、誰か有志がすでに用意しているだろうと検索していたらやはりいました。
https://note.com/kanno_develop/n/n81f100b53635
まじでありがとうございます!あなたのお陰でレトロゲームの継承は行われていくのです。
cc65-helloworld
https://github.com/KannoDevelop/cc65-helloworld/tree/main
というわけで、こちらをcloneして実行していきましょう。
その前にcc65はbrewでinstallしておきましょう
brew install cc65
では、cloneして、makefileのPathのところを、1箇所だけ変更すればビルドは成功します。
# cc65 ツールチェーンのパス CC65_PATH = /opt/homebrew
書き換えたらmakeコマンド
make
build/cc65-helloworld.nesが生成されるのでこちらをエミュレーターで開いていきましょう。
openEmu
fceux

すると、あらエミュレータによって差分が出ています。(そもそもレポジトリにあるスクリーンショットとも違いますが。。)
ここから、Claude Codeさんにお願いして直してもらいましょう。
至って簡単です。(Claudeの詳細は割愛させていただきます)
なにはともあれcursorを開き、ターミナルタブClaudeにログインし
claude
事象を投げちゃいます。
こちらのプロジェクトcc65のハローワールド表示なのですが、openEmuで起動すると表示するが、fceuxだとうまく表示しないので原因を調べて
すると、
FCEUXで表示されない原因を特定しました。主な問題点は以下の通りです: 主な問題点 1. パレット設定がない(最も重要) NESのPPUでは、背景やスプライトを表示する前に必ずパレットデータを設定する必要があります。現在のコードではパレット設定が全くないため、FCEUXでは正しく表示されません。OpenEMU はデフォルトのパレットを自動的に設定してくれる可能性がありますが、FCEUXはより厳密なため、パレットが設定されていないと表示されません。 1. PPUの内部状態リセット不足 VRAMアドレスを設定する前に、PPUのステータスレジスタ($2002)を読み取ってPPUの内部アドレスラッチをリセットする必要があります。 修正方法 src/main.c:141の辺りに、パレット設定コードを追加する必要があります。具体的には: 1. PPUステータスレジスタを読み取ってラッチをリセット 2. パレットアドレス($3F00)を設定 3. パレットデータを書き込み 修正を実施しますか?
おお。凄いですね。プロジェクトのソース辿るので話が早い。

早速修正お願いして修正してもらいます。
少し待つと
⏺ 修正が完了しました!ビルドも成功しています。
実施した修正内容
1. パレットデータの追加 (src/main.c:88-100)
NESで色を表示するために必要なパレットデータを32バイト分定義しました。
const UChar palette[32] = {
// 背景用パレット (16バイト)
0x0F, 0x00, 0x10, 0x30, // パレット0: 黒、グレー、薄いグレー、白
// ...
};
2. パレット設定処理の追加 (src/main.c:162-179)
初期化処理でパレットデータをVRAMの$3F00番地に書き込む処理を追加しました。
3. PPU内部ラッチのリセット (src/main.c:168, 200)
VRAMアドレスを設定する前に、PPUステータスレジスタ($2002)を読み取ることで、PPUの内部アドレスラッチをリセットする処理を追加しました。これにより、VRAMアドレスの設定が正しく動
作します。
なぜFCEUXで表示されなかったのか
- OpenEMU: パレットが設定されていない場合、デフォルトのパレットを自動的に適用する寛容な実装
- FCEUX: より厳密なエミュレータで、パレットが設定されていないと正しく表示されない
なるほど、パレットデータがないと厳密なFCEUXでは正しく表示しないのか。
修正のdiffは以下のようなところ
+//--------------------------------------------------------------
+// パレットデータ
+//--------------------------------------------------------------
+// NESのパレットは32バイト(背景用16バイト + スプライト用16バイト)で構成されます。
+// 各パレットは4色で構成され、最初の色は透明色として扱われます。
+// パレットアドレスは$3F00から始まります。
+const UChar palette[32] = {
+ // 背景用パレット (16バイト)
+ 0x0F, 0x00, 0x10, 0x30, // パレット0: 黒、グレー、薄いグレー、白
+ 0x0F, 0x00, 0x00, 0x00, // パレット1: 未使用
+ 0x0F, 0x00, 0x00, 0x00, // パレット2: 未使用
+ 0x0F, 0x00, 0x00, 0x00, // パレット3: 未使用
+
+ // スプライト用パレット (16バイト)
+ 0x0F, 0x00, 0x00, 0x00, // パレット0: 未使用
+ 0x0F, 0x00, 0x00, 0x00, // パレット1: 未使用
+ 0x0F, 0x00, 0x00, 0x00, // パレット2: 未使用
+ 0x0F, 0x00, 0x00, 0x00 // パレット3: 未使用
+};
+
//--------------------------------------------------------------
// グローバル変数
//--------------------------------------------------------------
@@ -139,6 +159,26 @@ void NesMain()
*REGIST_PPU_CTRL2 = 0x00;
+ //----------------------------------------------------------
+ // パレット設定
+ //----------------------------------------------------------
+ // PPUの内部アドレスラッチをリセットするため、
+ // ステータスレジスタ($2002)を読み取ります。
+ // これを行わないとVRAMアドレス設定が正しく動作しない場合があります。
+ i = *REGIST_PPU_STS;
+
+ // パレットデータのVRAMアドレスは$3F00から始まります。
+ // $2006に上位バイト、下位バイトの順で書き込みます。
+ *REGIST_ADR = 0x3F; // 上位8ビット
+ *REGIST_ADR = 0x00; // 下位8ビット
+
+ // パレットデータを32バイト書き込み
+ for (i = 0; i < 32; i++)
+ {
+ *REGIST_GRA = palette[i];
+ }
+
+
//----------------------------------------------------------
// BG面に "HELLO WORLD" を描画
//----------------------------------------------------------
@@ -156,6 +196,9 @@ void NesMain()
//
// ※今回は座標(10,10)に相当する直値0x214aを直接指定しています。
//
+ // PPUの内部アドレスラッチをリセット
+ i = *REGIST_PPU_STS;
まじ何もしなくて修正してくれるからClaude Code便利。
では早速エミュレータで確認。
openEmu

fceux

まだ差分はあるものの、無事FCEUXのエミュレータでも表示することができました。
しかし、この令和の時代に、M4 Proと$200課金したClaude CodeでNesのソースを修正してもらうのは、何ともCPU、GPUとも贅沢な使い方をしているなと技術の無駄遣いに酔いしれています。
かつてファミコンのCPUはたった 1.79MHzの8bit。
それを、数十億トランジスタのM4 Pro でエミュレートしながら、
AIにCとアセンブラの相談をする という、もはや現代の錬金術みたいな状況。
本来なら $ make 一発で動くはずの世界に、
ClaudeとChatGPTがデバッグレビューをする —
これが2025年の“レトロ開発環境”だ。
けれど、それがまた良い。
画面に「HELLO, WORLD!」と表示された瞬間、
GPUファンが静かに回り、どこかで
6502が喜んでいるような気がするのだ。
ではではぁ。
またまたぁー



















