
2026/10/15 16:18
Commodore 64 ハードウェアシミュレーター:チップとピンを壊して結果を確認しよう
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
本ソフトウェアは、Andre Weissflog のコアモデルを zlib ライセンスの下で構築し、Commodore 64 のマザーボード(ASSY 250407)に対してサイクル正確なピン毎のシミュレーションを提供します。事前に定義された障害パターンに依存するツールとは異なり、明確な回路動作モデルおよびボードのネットリストを使用して、RAM のエイリアシングや電源投入前に特定のピンをリフトする際などに自然に発生するグリッチを導出します。ユーザーはチップをリフトする、ピンをショートさせる、ソケットを取り外す、抵抗器を開くなどしてボードと相互作用し、C64 の動作を安全に学習したり、壊れたハードウェアのトラブルシューティングを行ったりすることができます。パワーモデリングは厳格であり、死んだチップ、浮遊する CMOS 構成要素、および幻のパワー効果を区別します。シミュレーションにはオシロスコープ表示や .prg の読み込みによるデバッグ機能などの機能が含まれていますが、現在のハードウェア上のパフォーマンス制限のためゲームエミュレーターではありません(31–48% の速度でシミュレート)。既知のギャップとしては、SID フィルターやビデオ出力のようなアナログ部品がシミュレーションされていないことなどがあり、将来的なアップデートでは内部チップの障害およびネットブリッジの対応を計画しています。
本文
C64-HW-SIM: コモドール 64 のピン単位ハードウェアシミュレーター
C64-HW-SIM は、コモドール 64(型番:ASSY 250407)のマザーボードを ピン単位でシミュレートするプログラム です。 このツールを使って行うことができる操作には、以下の通りです。
- チップの脚を持ち上げて浮上状態にする
- グラウンドまたは +5V にショートさせる
- ソケットからチップを抜く
- 抵抗器を開路化する
これらの変更を加えることで、マシーンの挙動を以下のように観察できます。
- モニターに表示される画像の変化
- キーボードの動作
- 基板内を流れる電気信号
シミュレーションの性質
このプログラムは、基板のネットリストやチップの動作特性については完全な知識を持っていますが、「壊れた C64 がどのような見た目になるか」という知識は持ちません。
したがって、故障した部品をシミュレートした結果として生成される画面の「ゴミのような画像」は、誰かが意図的に設定したものではなく、回路自体から計算されて生成されたものです。
挙動の具体例
電源投入前にカラー RAM(17 ピン / A7)の脚を持ち上げて浮上状態にし、マシーンが起動すると:
- マシンは正常に見えるはずです。
- CPU は書き込みを行い、VIC が読み取りを行う際にも同じ誤ったアドレスを使用するため、RAM は単にエイリアス化してしまいます。
- 脚を戻すと、以前書き込まれなかったカラー RAM の半分が ランダムな色として表示されます。
- 再び脚を持ち上げると、画面はクリアになります。
- 実際の 2114 チップ も同様の挙動を示します。
ツールの主な用途
このプログラムを用いると、主に以下の二つのことを行うことができます。
-
学習・理解 コモドール 64 がどのように動作するかを、実機では再現が困難である(あるいは機器の故障を招くリスクがある)ほど詳細に学び、理解できます。
多くの基板ではチップがハンダ付けされているため、実機での実験には限界があります。
-
修理支援 故障した C64 を所持していて「どこが壊れているか」という仮説があれば、その仮説をシミュレートし、修理の手掛かりを得ることができます。
- チップをハンダ剥がす順序を論理的に最適化できます。
- 可能な限り少数のチップだけを対象とすることで、退屈な作業性と基板損傷リスクを減らせます。
注意点:シミュレーションには限界(異なる故障原因が同じ症状を示す可能性など)が存在します。また、画面上での表示内容だけですべてが決まるわけではありません。
動作速度について
このプログラムは非常に高速なコンピュータでも動作することがあります。 実際の C64 の速度に対する相対速度は以下の通りです:
| コンピュータ | シミュレーション速度 |
|---|---|
| Apple M3 Max | 31% |
| AMD Ryzen AI Max+ PRO 495 (Gorgon Halo) | 39% |
| Apple M5 Max | 48% |
これはゲームを楽しむためのエミュレーターではなく、ハードウェア挙動の理解と故障診断のためのツールです。
高速動作時の具体例(画像)
上記の速度では、キャラクター ROM(U5)をソケットから外し、後で元に戻す間にも、マゼス(maze)ゲームが進行しています:
- CPU、RAM、およびプログラムは正常に機能しており、文字の形だけが欠損しています。
- 示波器は ROM ソケットのデータ線 D0 に接続されており、VIC が文字の形状を読み込む際、ソケットが空だとバスが浮遊状態(点線のセグメント)になります。
- C64 の標準速度で表示されています。
謝辞と開発経緯
このプログラムのアイデアは、以下のアンドレ・ウェイスフログ氏(通称:floooh)の作品から得られました:
- 6502, VIC-II, CIA, SID などのピンをインターフェースとして用いるチップとエミュレーターの使用・観察。
- そのコードを基にアプローチを発展させ、C64 の他のすべての部品(RAM, ROM, ロジックチップ, PLA など)について ピン単位のモデルを持つことまで論理的な極点へと至らせたもの。
引用元とライセンス
| 項目 | 由来・参照元 | ライセンス |
|---|---|---|
| チップのコア部分 | floooh 氏の作品(6502, VIC-II など) | zlib |
| ボードの設計 | bwack 氏の「C64-250407-Replica-KiCad」 | CERN OHL |
| PLA の式則 | Mark Smith氏と Marko Mäkelä氏が読み出した 82S100 データ | - |
ビルド方法
make ./c64-hw-sim [program.prg]
- 対応 OS: macOS, Linux (X11)
- グラフィックス: OpenGL を使用
- ライブラリ: グラフィックスは
、インターフェースはsokol
(両方ともnuklear
フォルダにあります)third_party/
使用方法と UI
ウィンドウ内には以下の要素が表示されます:
- 基板
- モニター
- コントロールパネル
- 示波器
チップは役割に基づいた名前を持つボックスとして表現されています:
- RAM1 〜 RAM8: 4164 DRAM。それぞれはバイトの各ビットを保持しており、
はデータビットRAMn
を担当します。n-1 - VRAM: 2114 カラー RAM
- BASIC, KERNAL, CHAR: ROM
- PLA: アドレスデコーダ
詳細確認と操作
- ズームインして参照情報やアドレス範囲を確認できます。
- ピン(Pin)の状態表示: ロジックプローブのように表示されます。
- 🔴 赤: 高電位
- 🔵 青: 低電位
- 🟡 黄色: パルス状
- ⚪ 灰色: 浮遊
- 🟣 マゼンタ: 2 つの出力同士の対戦(コンテンション)時
チップ・部品への操作
- ピンのクリック: 示波器に表示し、破損させることができます。
- 浮遊状態
- グラウンドへのショート
- +5V へのショート
- チップをクリック: ソケットから抜けます(持ち上げ)。
- 抵抗器・フェライトビーズ・水晶振動子をクリック: 開路化します。
コントロールパネルとファイル読み込み
- 故障の一覧が表示され、各故障に対して修復ボタンが付いています。
ファイルも読み込むことができます。これらはフリーズカーリッジのようにそのまま DRAM チップに書き込まれるため、故障したボード上でも読み込み動作が可能です。.prg
キーボード操作
キーボードは通常通りに使用できます:
- ESC: RUN/STOP
- PgUp: RESTORE
- TAB: CTRL
- 左 ALT: C=
コマンドラインオプション
./c64-hw-sim --headless 200 --text --shot out.png --fault U17:removed
これはウィンドウなしで 4 秒(200 フレーム)動作し、モニター画像から読み取ったテキストを出力して画像を保存します。
故障指定の形式
REF:内容 または REF.PIN:内容 の形式で記述します。
(チップ除去)U17:removed
(ピン接地ショート)U21.14:gnd
(ピン電源ショート)U12.14:vcc
(ピン開路)U9.2:open
(抵抗器開路)R51:open
(プルアップ抵抗器ショート)RP4:short
その他のオプション
-
動作中の故障・修復:
--at 150:U6.17:open --at 300:repairC64 が動作中に部品を破損させ、後に修復します。
-
コンフリクト(対戦)ネットの報告:
オプションを使用すると、出力が対戦したネット(配線)を報告します。--nets -
起動後のテキスト入力:
C64HW_TYPE=PRINT "1+1\n"起動後に指定したテキストを入力します。
-
メモリマッピングの整合性チェック:
C64HW_CHECK=1すべての KERNAL 読み込みと VIC のフェッチを理想的なメモリマップに対してチェックします。
-
動作録画(グラフィカルモード):
--record 900:DIR --frames 90900 フレーム目以降から、4 エミュレートフレームごとの 90 回分ウィンドウを保存します。
tests/faults.sh は 31 の一般的な故障パターンを実行し、シミュレータ実行前に期待される症状が記述されています。
動作原理
ネットリストの解析
tools/kicad2c.py は bwack 氏の KiCad 版 250407 レプリカを C テーブルに変換します:
- 216 の部品
- 各部品のパッド
- 249 のネット(配線群)
ピン駆動モデル
各ピンは以下のように動作します:
- 強く駆動する
- 弱く駆動する(プルアップなど)
- 供給電圧からのショート
- 全く駆動しない
最も強力な駆動が優先されます。等しい強度の 2 つの出力が対戦している場合は「コンテンション」となり、低電位側が勝ちます。
浮遊モデル
誰も駆動していないネットは、充電を保持したままドリフトします:
- TTL インプットの負荷: マイクロ秒単位で約 1.4V 程度まで上昇します。
- MOS インプットのみ接続: 数十分の秒間で 0V 側へ向かって移動します。
MOS インプットは、その電圧と雑音を加えたものを自身のしきい値と比較するため、浮遊中のラインは誤作動しやすいのです。
電源故障の影響
チップの種類によります:
- VCC がなし: チップは「死亡状態」
- GND がなし: 出力が高電位に浮遊します
- CMOS チップ: 保護ダイオードを介して供給される「幽霊電源」によって動作を維持できます。
ノイズと再現性
雑音の種子は設定されており、実行結果を正確に再現することが可能です。
部品レベルモデル (src/parts.c
)
src/parts.c以下のような部品のピンレベルモデルを構築しています:
- グルーロジック
- ROM
- DRAM(/RAS と /CAS で行と列をラッチ)
- カラー RAM
- PLA(実数のロジック式則を含む)
コアエミュレーション (src/board.c
)
src/board.c6510、VIC-II、CIA、SID は floooh 氏のチップから取得したサイクル単位精度のコアを使用しています。 各コアはソケット上にあり、それ自身のピンしか見えない環境で動作します。半分サイクルごとに 3 つのステップに分けて実行されます:
- 行アドレス指定
- /RAS の下りエッジ
- /CAS の下りエッジ
全ボードは各ステップ後に安定します(詳細は
PLAN.md 参照)。
限界点と今後の予定
現状の制限
このシミュレーションは非常に低速であり、上記のコンピュータの上でも 実時間の 3 分の 1 から半分程度しかありません。 これは、各チップのすべてのピンをシミュレートしているためです。
- 浮遊モデルと電源モデルは正しい形状を持っていますが、その数値(しきい値、ドリフト時間、クロストーク)は 推測によるものです(
内の定数として定義)。src/sim.c - シミュレートされていないアナログ部品:
- ビデオ出力
- SID フィルター
- 電源供給回路
- ドットクロック PLL
今後の計画
以下については実装尚未了ですが、今後計画されています:
- チップ内部の故障(不良な DRAM セルや動作が緩慢な部分など)
- 2 つのネット間のブリッジ故障