DOORmk2/(3)テープの構成

Last-modified: 2009-11-28 (土) 17:54:54 (5266d)

ドアドアmk2のテープ構成は如何に!?

ドアドアmk2のIPL

  • 最初に、オリジナルのテープを解析する。まず、cloadコマンドでBasicを読み込むのだが、ただのBasicではない。かなり大きなマシン語ファイルが一体化されたタイプである。
  • Basicの主な処理は2つある
    1. 面選択(全部で100面だが、1-50/51-100のどちらかを選ぶ)[Basic部分]
       面選択画面
    2. マシン語ローダを起動 [連結されたマシン語部分を実行する]
       CR-320
  • マシン語ローダーを逆アセンブルしていくと、これがさらに4機能に分かれていることが分かる。その一つStarter部が、他のMain、BGM、workの3つのモジュールを裏RAM等に転送してから、Mainを起動する形になっている。
    転送先Aアドレス機能処理内容
    4000h~IPL-Mainマシン語ローダーの本体
    5100h~IPL-BGMBGM再生用のプログラムとデータ
    FF00h~IPL-work割り込みワーク、CMTエラー処理等
  • もう一つ、大きな特徴で、かつ恐いことなのだが、このマシン語ローダは、割り込みworkを自分で設定している事からも分かるのだが、Basicの制御を完全に離れ、すべてのメモリー(64MB)をRAM化して(自己管理下において)動作する点だ。
  • IPL-Main( 4000h~)を解析すると分かるのだが、いきなり割り込み禁止処理したり、CMT制御もROM内ルーチンはコールせず、I/Oポートを直接操作してモータ制御やデータを読込む独自の処理を行っている。データロードが終了すると、そのままMain Programが起動し、ゲームスタートとなる。

P6のメモリーマップ

  • 話は前後するが、ここでPC6001mk2のメモリーマップについて簡単に触れておく。
     MemoryMap
  • 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行程度ものだが、まずはそのフローチャートを作成してみる。
  • テープロード時の画面の変化やテープの構成等も相互に参照しながら、おおよその内容をまとめてみたのが次の図である。
     IPL_FlowChart

テープ構成の特徴

  • マシン語ローダと表裏一体であるから、解析してフローが書ければ、テープ側の内容構成もおのずと判明する次第。
  • テープサイズが膨大なことは毎度ながら特筆すべきことだが、加えてデータの並び方も変則なのだ。
    1. テープのヘッド部分にマークがなく、いきなりデータが並んでいる
    2. そのデータの並び方が、単純にセットアドレス順ではない
    3. 前半部はタイトルデータと、キャラクタデータが複雑な混在配置 (5000h分)
    4. 後半部の面データは、前50面分と後50面分が各々1バイト毎に交互に配置 (2000h分)
    5. テープ内のデータは、基本的にセットアドレスの高位側から逆順で格納されている
       Tape_Structure
  • マシン語のトータルサイズは実にFF00h、うち実際にメモリーにセットされるのはEF00h分であるが、マシン語ローダが置かれた領域(4000h~5000h)以外は、読み込んだデータで埋め尽くされることになる。最初にcloadしたBasicはもちろん、裏RAMに配置したIPLのBGMルーチンなども途中で破壊しつつ、マシン語のロードが進んでいく仕掛けなのである。

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   リンク元