ドアドアmk2のテープ構成は如何に!? †
- では、いよいよ「ドアドアmk2」のディスク化にとりかかるのだが、まずは、原理と現実のギャップの大きさに思わずたじろいでしまう話である。
ドアドアmk2のIPL †
- 最初に、オリジナルのテープを解析する。まず、cloadコマンドでBasicを読み込むのだが、ただのBasicではない。かなり大きなマシン語ファイルが一体化されたタイプである。
- Basicの主な処理は2つある
- 面選択(全部で100面だが、1-50/51-100のどちらかを選ぶ)[Basic部分]
- マシン語ローダを起動 [連結されたマシン語部分を実行する]
- マシン語ローダーを逆アセンブルしていくと、これがさらに4機能に分かれていることが分かる。その一つStarter部が、他のMain、BGM、workの3つのモジュールを裏RAM等に転送してから、Mainを起動する形になっている。
転送先Aアドレス | 機能 | 処理内容 |
4000h~ | IPL-Main | マシン語ローダーの本体 |
5100h~ | IPL-BGM | BGM再生用のプログラムとデータ |
FF00h~ | IPL-work | 割り込みワーク、CMTエラー処理等 |
- もう一つ、大きな特徴で、かつ恐いことなのだが、このマシン語ローダは、割り込みworkを自分で設定している事からも分かるのだが、Basicの制御を完全に離れ、すべてのメモリー(64MB)をRAM化して(自己管理下において)動作する点だ。
- IPL-Main( 4000h~)を解析すると分かるのだが、いきなり割り込み禁止処理したり、CMT制御もROM内ルーチンはコールせず、I/Oポートを直接操作してモータ制御やデータを読込む独自の処理を行っている。データロードが終了すると、そのままMain Programが起動し、ゲームスタートとなる。
P6のメモリーマップ †
- 話は前後するが、ここでPC6001mk2のメモリーマップについて簡単に触れておく。
- CPUのμPD780は8bitなので、アドレス空間はそもそも最大64KBである。V-RAMを含めて、64KBのほぼ全部ユーザが利用可能になっている。
- では、Basic-ROM等はどこにあるかと言うと、「ユーザエリアA」と呼ばれる下位アドレス0000h~7FFFFh領域である。バンク切替えという方式で、この32KBをROM⇔RAMで切替えて使っている。アドレス空間が小さい時代の詰め込み技術である。
- 64KBすべてがユーザエリアとはいえ、Basic-ROMを利用する場合には、この「ユーザエリアA」にはマシン語プログラムは配置できず、単なるデータ領域として使うしかないという制約がある。そのため、通常はグラフィック用のV-RAMとして使われることが多い。
- 一方、VRAMはスクリーンのPAGE数というパラメータで変更するのだが、16色グラフィック画面(16KB)は最大3画面とることができ、下位アドレス0000h~ から 16KB(4000h)単位で順に割り当てられる。テキスト画面の場合は2KB(800h)で、グラフィック画面の直近上位に配置される。
- ユーザのBasic領域は、PAGE数で変動するが、「ユーザエリアB」のアドレス8000h以降のテキスト画面の直近上位に割り当てられる。
テープの構成 †
- 平行してテープの構成をチェックしたのだが、Basicで書かれたIPL部分の後ろにギャップ(無音部分)があるが、その後は非常に長いデータが切れ間なく続く。約15分近いものだ、これがマシン語本体にあたる部分だ。
- そのマシン語部分を『めいたんてい』というコピーツールを利用して本体メモリーに読み込んでみたのだが、な、なんとサイズは FF00hと推定された! P6メモリー領域である64KBにぎりぎり迫るとんでもない大きさなのだ。
- 通常、マシン語はテ-プ上でもギャップをはさんでいくつかに分割されるものなのだが、そのギャップがも全然ない。テープ一本でこれほどのサイズは例がない。一体、どのようにメモリー上に配置していくのか?!
マシン語ローダを解析 †
- いきなりボーゼンとしてしまうのだが、気を取り直して手がかりを探ることにする。
- 何をおいても、マシン語ローダの処理内容を解析するのが基本である。マシン語LoaderのIPL-Mainルーチンのアドレスは4000h~407Dhで、その中核部分は逆アセンブルリストにして60行程度ものだが、まずはそのフローチャートを作成してみる。
- テープロード時の画面の変化やテープの構成等も相互に参照しながら、おおよその内容をまとめてみたのが次の図である。
テープ構成の特徴 †
- マシン語ローダと表裏一体であるから、解析してフローが書ければ、テープ側の内容構成もおのずと判明する次第。
- テープサイズが膨大なことは毎度ながら特筆すべきことだが、加えてデータの並び方も変則なのだ。
- テープのヘッド部分にマークがなく、いきなりデータが並んでいる
- そのデータの並び方が、単純にセットアドレス順ではない
- 前半部はタイトルデータと、キャラクタデータが複雑な混在配置 (5000h分)
- 後半部の面データは、前50面分と後50面分が各々1バイト毎に交互に配置 (2000h分)
- テープ内のデータは、基本的にセットアドレスの高位側から逆順で格納されている
- マシン語のトータルサイズは実にFF00h、うち実際にメモリーにセットされるのはEF00h分であるが、マシン語ローダが置かれた領域(4000h~5000h)以外は、読み込んだデータで埋め尽くされることになる。最初にcloadしたBasicはもちろん、裏RAMに配置したIPLのBGMルーチンなども途中で破壊しつつ、マシン語のロードが進んでいく仕掛けなのである。