このサイトは、只今WEB業界で活躍中のデザイナー、プログラマーの方々の情報を集めたweb統合情報サイトです。

Archives Details

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

Game

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が喜んでいるような気がするのだ。

 

ではではぁ。

またまたぁー

 

Comment

Related Article

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

2025.10.24

う、動くぞ! Mac mini Apple M4 Pro で PS3ソフトを遊ぶ。RPCS3 Mac版を起動

2025.04.12

時代を先取りし過ぎた ニューラルネットワークが導入されたゲーム『がんばれ森川君2号』を令和に嗜んでみる。

2025.04.06

M1Macで、PSP モンハン3 をプレイする。

2022.01.23

M1 Macで作る、ファミコンソフトプログラミング。 アセンブラでハローワールド編

2021.11.08

う、動くぞ! M1 Mac(Big Sur)で PS2ソフトを遊ぶ。PCSX2 Mac版を起動

2021.11.07

ゲオ 驚異の80%オフセール開催中! 中古ソフト大量購入!! まだ間に合う急げぇ〜!

2021.10.24

【2021】ゲオのサマーセール 980円以下のゲームソフトが半額!8月16日(月)まで。で購入したもの。

2021.08.08

M1(Appleシリコン)Macで、ファミコンソフトプログラミング。 サクッと開発環境準備編

2021.03.21

ゲオのサマーセール 980円以下のゲームソフトが半額!8月16日(日)まで。で購入したもの。

2020.08.13

CATEGORY LIST

LATEST NEWS

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

Game

2025.10.24

Three.js - ShaderMaterialで、ブレンドシェイプ(MorphTarget)アニメーション対応

JavaScript

2025.10.15

ゲーム開発に必要な基本数学入門

Rust

2025.08.15

Godot 4 & WebAssemblyで様々なデータフォーマットを処理

Godot

2025.07.06

Godot 4 & WebAssemblyで、Hello WebAssembly! - godot-wasm

Godot

2025.06.21

Godot 4 & Rust 始め方

Rust

2025.06.19

ご、ごめん。。今はFlutterの気分じゃないんだ。。

Flutter

2025.05.30

AIのために働け。AI リーダブルコーディングな未来。

AI・Bot・algorithm

2025.05.21

Rustでつくる ふっかつのじゅもん

Rust

2025.04.29

Tauri(Rust) × AI で作る GitGUIクライアントアプリ その5

Rust

2025.04.14

う、動くぞ! Mac mini Apple M4 Pro で PS3ソフトを遊ぶ。RPCS3 Mac版を起動

Game

2025.04.12

Tauri(Rust) × AI で作る GitGUIクライアントアプリ その4

Rust

2025.04.10

RANKING

Follow

SPONSOR

現在、掲載募集中です。



Links

About Us

WEBデザイナーの、WEBデザイナーによる、WEBデザイナーの為のサイト。「みんなで書こう!」と仲間を募ってみたが、結局書くのは自分だけとなってしまいました。日々のメモを綴っていきます。

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

MAD CITY 北九州市で生まれ育つ。20代はバンド活動に明け暮れ、ふと「webデザイナーになりたい。」と思い、デジタルハリウッド福岡校入学。卒業後、数々の賞を受賞、web業界をざわつかせる。
現在、主に、ゲーム制作中心に港区六本木界隈で活動中。

FOLLOW US