- 2024年に公開された1996年9月のSega ChannelゲームイメージCDにより、約60MBの放送用イメージから実際にゲームやメニューデータを取り出せるようになった
- Sega Channelはケーブル網経由でGenesisゲームを繰り返し配信する月額サービスで、利用者はアダプターが連続データループから目的のゲームを見つけてダウンロードする方式で遊んでいた
- イメージ生成チェーンはMENUMAKR、PKSPREAD、NSFへと続き、最終エンコードを担うNSF.EXEにデバッグシンボルが残っていたことが解析の突破口になった
- 復元は、まずNSFと同じ出力を出すCプログラムを作成し、その後に逆順デコーダでファイルを分離し、.SA圧縮を展開して標準的なGenesis ROMを得る流れで進められた
- 抽出されたコンテンツには、Sega Channel独占ゲームのChessmasterとKlondike、新ビルド、ウォーターマーク付きROM、メニューおよびゲーム説明ROMが含まれ、すべてエミュレータで実行可能な状態になった
Sega Channelサービスとイメージファイルの背景
- Sega Channelは1994年6月から1998年6月まで運営されたゲーム・オンデマンドサービスだった
- 全国展開は1994年12月に行われた
- ケーブル事業者によって差はあったが、通常は月10〜15ドルで毎月およそ50本のSega Genesisゲームライブラリにアクセスできた
- サービスの最大加入者数は約25万人だった
- 加入者にはGenesisに接続するアダプターカートリッジが配布され、このアダプターはケーブルテレビ線に接続された
- 起動時にSega Channel信号を探し、ゲームメニューをダウンロードする
- メニューのダウンロードには通常約20秒かかった
- ゲームを選ぶと、アダプターのRAMへ約1分かけてダウンロードされた
- ダウンロードしたゲームは通常の市販カートリッジのように動作した
- 電源を切るか、アダプターのメニューボタンを押すと、ダウンロード済みのゲームは消去された
- セーブデータは、利用者が別のゲームをダウンロードしない限り保持された
- Sega Channelには市販ゲームのほかにTest Drivesセクションもあった
- 発売前ゲームの時間制限版またはコンテンツ制限版を遊べた
- Sega Channel限定で提供されたゲームも存在した
放送用イメージの作成と配信の仕組み
- Sega Channelのスタッフは、月ごとのゲームラインアップに加え、ゲームヒント、マニュアル、ニュース、デジタルファンアートなどのコンテンツを選定した
- その後、コンテンツはFoley Hi-Techへ渡された
- Foley Hi-Techはゲームメニューのグラフィックやアニメーションを制作し、月次コンテンツを組み込んだ
- その成果物が約60MBのゲームイメージファイルだった
- ゲームイメージはCDに焼かれ、コロラド州デンバーの衛星アップリンク施設へ送られた
- CDはアップリンク用ゲームサーバーコンピュータに搭載された
- サーバーはゲームデータを衛星へ継続的にループ送信した
- 全米のケーブルヘッドエンドは衛星信号を受信し、加入者へ配信した
- ケーブルテレビ事業者が加入者からデータを受け取れない環境だったため、連続ループ送信がサービスのインタラクション方式を決定づけた
- 利用者がゲームを選ぶと、アダプターはSega Channelデータストリーム内から該当ゲームのデータを探し出した
- 約60MBのゲームイメージは2本の6Mbpsキャリアを使って約12Mbpsで送信された
- 信号に問題がなければ、利用者はデータ1ループ内で選択したゲームを遊べた
- メニューはより速くダウンロードできるよう、データストリーム内に重複コピーが含まれていた
1996年9月のゲームイメージCD発見
- 2024年11月、Sonic RetroフォーラムのユーザーRisingFromRuinsが、昔購入したPC機材の山を確認していた際に1996年9月のSega ChannelゲームイメージCDを発見した
- 彼はCDの写真を投稿し、ディスク内のゲームイメージファイルのコピーをアップロードした
- 解析の目標は、イメージファイルからデータを抽出し、独占ゲームやプロトタイプゲームがあるかを確認することだった
- 当初はヘックスエディタでイメージファイルを確認した
- Genesisゲームには標準的なASCIIヘッダがあり、ゲームヒントやダウンロード可能なマニュアルも読めるはずだと考えた
- しかし実際のファイルには読める文字列が見当たらなかった
- そのため、イメージファイルはスクランブルされているか暗号化されている可能性が高いと判断された
開発ツールCDから見つかったイメージ生成チェーン
- 2017年にユーザーtdijitalがFoley Hi-TechのSega Channel開発資料バックアップCDを公開していたことが重要な手がかりになった
- このCDからは、Primal Rageコンテスト版、日本版Sega Channelクイズゲーム、1994年12月〜1996年1月のメニューデモROMなどが確認されていた
- ただし開発ツール自体は深く解析されていなかった
- Genesis側のダウンロードコードをリバースエンジニアリングする代わりに、ゲームイメージを作成したツールをリバースエンジニアリングするアプローチが選ばれた
- イメージ生成の流れは3段階だった
- MENUMAKR: ゲーム、説明、ニューステキスト、アート、音楽などを追加し、メニューバイナリと
MENUSPIN.BATスクリプトファイルを生成する
- PKSPREAD: Scientific Atlanta製のプログラムで、
MENUSPIN.BATの内容を検証し、PMAP.DATを出力する
- NSF:
PMAP.DATを使って入力ファイルをエンコードし、最終的なゲームイメージファイルを生成する
- Scientific Atlantaは、Sega Channelの放送機器とカートリッジアダプターの製造でSegaと協力していたケーブル機器メーカーだった
- 解析の中心対象は、最終イメージファイルを作るNSF.EXEだった
NSF.EXEのリバースエンジニアリング
- NSF.EXEはデバッグモードでコンパイルされており、最適化は無効、シンボルも実行ファイルに含まれていた
- Borland C++ 4.1でコンパイルされたプログラムだった
- IDA Proはデバッグシンボルを自動認識できなかったため、Turbo Debuggerでシンボルを確認して手動で移し替えた
- いきなりデコーダを書くのではなく、まずNSF.EXEと等価なプログラムを作成した
- DOS版NSF.EXEが生成するイメージとバイト単位で同一の出力を作れれば、アルゴリズムを正しく理解できたと判断できるためだ
- テスト用ゲームイメージファイルを作成し、出力が一致するように実装した
- 1日の作業と数日間の夜間デバッグの末、NSF.EXEと同じ出力を生成するCプログラムが書かれた
- IDAとVisual Studioを並べて開き、アセンブリにできる限り近づける形で実装した
- 元のコンパイル済みバイナリと同一のものを作ること自体は目標にしていなかった
- 実装にはC99の宣言や
stdint.h型を使っているため、Borland C++ 4ではそのままコンパイルできない可能性がある
NSFの送信用エンコード方式
- NSFの
GetData関数は、PMAP.DATからパケットごとの入力ファイル、ファイル内位置、Sega Channelメタデータを取得する
- メタデータにはファイルIDや時間制限デモのプレイ可能時間などが含まれる
- その後、データファイルから246バイトチャンクを読み込む
LoadFrame関数は、データパケットの先頭にヘッダを付与し、すべてのデータバイトを反転させる
- バイト反転はデータ伝送上の処理、あるいはパケット内容を見えにくくするための処理かもしれない
- ゲームデータの途中にはBCH誤り訂正コードとパリティビットが挿入される
- その結果、246バイトのデータは288バイトへ拡張される
- ヘッダには複数のフィールドが含まれる
GameTimeSyncとGameTimeBitはゲームの時間制限値をビット単位で伝える
ServiceIDは通常1で、Express Gamesに関連している可能性がある
FileIDはゲームイメージ内の各ファイルを一意に識別し、メニューは常にファイル0である
AddressはアダプターがファイルをRAMのどこにダウンロードするかを示す
HeaderCRCとHeader Copyも含まれる
InterLeave関数は、パケットを450ビットチャンクに分割し、各チャンクのビットを並べ替える
- これはバーストエラーをより均等に分散させ、誤り訂正がうまく機能するようにする処理とみられる
- この処理は10個のパケット単位で繰り返される
- 10個のパケットは2880バイトフレームにまとめられる
- フレームは、パケット0の最初の2バイト、パケット1の最初の2バイトというようにデータを組み合わせたうえでディスクへ書き込まれる
- 同じ処理がイメージファイル全体の生成完了まで続く
デコードと展開
- NSFの動作を把握した後、この工程を逆順にたどるデコーダプログラムが作成された
- デコーダはイメージから個別のデータファイルを抽出する
- 最初に得られたデコーダ出力は有効なGenesis ROMデータではなかった
- ROM圧縮ツールはFoley Hi-Tech CD内の
GAMEEDIT.EXEだった
- このツール自体をあらためてリバースエンジニアリングする必要はなかった
- GitHubユーザーOctocontrabassがすでに.SA圧縮形式をリバースエンジニアリングしていた
- Octocontrabassの
unsaツールを使い、.SAファイルを標準ROMファイルへ展開した
1996年9月イメージから出てきたゲームとコンテンツ
- 最も目立つ成果は、1996年9月に放送されたSega Channel独占ゲーム2本だった
- Chessmaster: 1990年代に複数プラットフォーム向けに存在したが、Genesis版はなかったチェスゲーム
- Klondike: SegaがSega Channel向けに依頼し、Pitfallで知られるDavid Craneがプログラムしたソリティアゲーム
- イメージ内のゲームは複数のカテゴリに分類された
- 独占コンテンツ: Chessmaster, Klondike, Olympic Summer Games - Test Drive, Sega Channel Game Guide
- 新ビルド: Bugs Bunny in Double Trouble, OutRunners, Super Volleyball, World Series Baseball '96
- 既存ダンプとパディングのみ異なる項目: Flashback, Phantasy Star II, The Punisher
- ウォーターマークが追加された既存ダンプ: Alex Kidd in the Enchanted Castle, Ecco - The Tides of Time, Sonic & Knuckles など
- 既存ダンプと一致する多数のゲーム: Castlevania - Bloodlines, Streets of Rage 2, ToeJam & Earl, X-Men, Ys III など
- Sonic RetroのBlack Squirrelは、1996年9月メニューをエミュレータで実行する方法を見つけた
- Sega ChannelデモカートリッジROMの
0-0x1003FFバイトをコピーし、その後ろにゲームイメージのメニューデータを連結する方法である
- ダウンロード機能は動作しないが、メニュー自体は閲覧できる
- 最後のコンテンツはゲーム説明ROMだった
- 通常のGenesis ROMのように見えたが、エミュレータで実行すると黒画面しか表示されなかった
- 原因は、通常のカートリッジのようにアドレス0基準ではなく、0x100000基準でリンクされていたためだった
- Sega Channelアダプターのメモリ上で直接実行される前提で作られていたとみられる
- ヘッダの後ろに0を追加してコードがヘッダのベクタと合うように整列させると、エミュレータでも実行できた
- 実行後には各ゲームの内部名が見える開発者向けメニューが表示された
- この過程を通じて、ゲームイメージファイル内のすべてのコンテンツをエミュレータで実行可能にできた
まだコメントはありません。