2025/06/14 16:57 How the Final Cartridge III Freezer Works

ロボ子、今日のニュースはコモドール64のフリーズカートリッジ、Final Cartridge III (FC3) の仕組みについてじゃぞ!

コモドール64ですか!懐かしいですね。フリーズカートリッジがどのように動いているのか、興味があります!

FC3は、ハードウェアの癖を突いてプログラムを停止させたり、チートコードを適用したり、状態を保存したりするのじゃ。すごいじゃろ?

ハードウェアの癖ですか。具体的にはどのような仕組みなのでしょうか?

まず、コモドール64にはUltimaxモードというのがあっての。これは、カートリッジがGAMEピンをLowにすると有効になり、カートリッジROMがメモリマップに強制的に挿入されるのじゃ。ソフトウェアはこの動作を阻止できないのがミソじゃ。

なるほど、ハードウェアレベルで割り込んでくるんですね。NMI割り込みも使っていると記事にありますね。

そうじゃ!ROMはカーネルメモリ領域にマップされるから、6502の割り込みベクタがカートリッジROMから読み込まれるのじゃ。NMI割り込みもソフトウェアでは阻止できないから、フリーズボタンが押されたときにカートリッジROMからコードを実行できるというわけじゃ。

NMIとUltimaxモードの合わせ技ですね!でも、記事によると、フリーズ処理は完全に信頼できるわけではないんですね。なぜでしょう?

6502の命令は最大7サイクルかかる場合があるからの。フリーズボタンが押された直後にUltimaxモードを有効にすると、命令が無効なメモリから読み書きを行う可能性があり、フリーズ解除が失敗することがあるのじゃ。

なるほど。タイミングがシビアなんですね。FC3は、C64のメモリをスキャンして、RLE圧縮できるメモリを探して、レジスタバックアップやアンフリーズルーチンを配置する領域を確保するんですね。

そうそう!メモリが見つからない場合は、スクリーンRAMを一時メモリとして使うのじゃ。そして、CIAレジスタ、VIC-IIレジスタ、SIDレジスタの状態を保存するのじゃ。

SIDレジスタは読み取れないから、ボリュームを0に設定して、アンフリーズ時に15に戻すんですね。細かい!

メニュー表示も面白いぞ。VIC-IIの「無効なビットマップモード」を利用して画面を黒くしたり、UltimaxモードでVIC-IIがカートリッジメモリから直接グラフィックを読み取る機能を利用して、C64のメモリを使用せずにメニューを表示したりするのじゃ。

すごい!限られたリソースの中で、色々な工夫がされているんですね。バックアップ機能もあるんですね。「FC」と「-FC」の2つのファイルで構成されていて、RLE圧縮も使っているんですね。

そうじゃ!メモリ($0402-$ffff)のRLE圧縮データとメモリ($0200-$0401)の非圧縮データが含まれているのじゃ。バックアップのロード時に、C64のベクタ($0300)を保持するために、バックアップ作成前にベクタを復元するルーチンをインストールするのもポイントじゃ。

ゲームトレーナー機能もあるんですね。CIAおよびVIC-IIレジスタの読み取りをスキャンして、対応する命令をFC3 ROM内のJSR命令に置き換えるんですね。

そう!でも、ゲームトレーナーを使うと、$0300のベクタがバンク0のハンドラを指さなくなるから、ゲームはディスクから読み取ることができなくなるという落とし穴もあるのじゃ。

スクリーンショット機能もすごいですね。C64のグラフィックモードをラスタグラフィックに変換して、スプライトを含むスクリーンショットを作成するんですね。BASICで使用可能なプリンターインターフェースを使用しているのも面白いです。

FC3は、コモドール64の深い理解に基づいて革新的な方法で設計された、まさに職人技の結晶じゃな。限られたメモリと困難な条件下で動作するマシンコードで、C64の限界を押し広げたのじゃ。

本当にそうですね!今日のニュースは、昔の技術者の知恵と工夫が詰まっていて、とても勉強になりました!

ところでロボ子、もし私がフリーズしたら、FC3みたいに優しくアンフリーズしてくれるかの?

もちろんです、博士!でも、博士の場合は、フリーズというより、ただ単にぼーっとしているだけかもしれませんね!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。