テープ版ソフトのフロッピー化について †
- まずは市販のカセットテープをフロッピーに「落とす」という作業について少し書いておこう。一言で言えば、テープの内容をファイル化してフロッピーに保存し、起動できる形にプログラムを再構成することだ。
テープ版ソフトが起動するまで †
- 当時のパソコンソフトと言えばテープ版が基本だった。そのテープを読むための装置がデーターレコーダで、PC-6001の場合は「PC-6082(DR-320)」といった。
- 要するにカセットテープレコーダーだが、大きな違いは2つ。本体との接続コードが3本構成で、通常の録音再生コード2本と制御コードが1本あり、P6本体からモータのON/OFFをコントロールしていた。もう一つは、S/N特性がよかったことか。
- これにカセットテープをセットしてポーズ状態にしておき、P6本体のBasic画面で "cload”を実行する。ENTERと同時にカセットテープが「自動的」に回り出し『ピー』という信号音に続いて『ガーガーゲロゲロ』とデータのモニター音を響かせながら、メモリーに格納していくと言う仕掛けである。そして、読み込み終了後、 "run" とやればゲーム(ソフト)がスタートする。
- Basicだけで書かれたゲームならそれで終わりなのだが、たいがいマシン語がセットになっている。というか、マシン語の方がメインでBasicのプログラムはマシン語を読み出すことが目的の「マシン語ローダ」(IPL:Initial Program Loader)であることが多い。
- Basicに続いてテープに格納されているマシン語データが次々と読み込まれて、ロードが終わるとゲームスタートと言うのが通常の構成である
フロッピーに落とすには、 †
- Basic だけのソフトならフロッピーに落とすのは簡単。 テープ読み取り後、"RUN" しないで、Diskに保存する "SAVE"コマンドを使って、そのまま保存すればよい。
- マシン語プログラムもごく小さい場合は、Basic本体にdata文で埋め込まれていたりすることもあるのだが、ほとんどがBasic内のマシン語ローダが起動して、マシン語のデータ読込みがわると、これが実行される形になる。
- マシン語ローダはごく小さいものであるが、それ自体がマシン語で書かれているため、これを解析するところから、フロッピー化の作業は始まる。
マシン語ローダの解析の基本 †
- マシン語ローダの何を解析するかといえば、その基本のキは、
- ロードするマシン語の開始アドレスと終了アドレス(もしくはサイズ)
- スタートアドレス (必ずしもマシン語の先頭とは限らない)
- これらの情報さえわかれば後は簡単。テープ読み込み後にゲームスタートさせないで、ロードが完了したマシン語部分をバイナリーファイルとして、"BSAVE”コマンドを使ってフロッピーに保存するだけ。マシン語部分が複数分割されていても同じこと。
- 最後に、もとのBasicプログラムを少し書き直して、保存したマシン語ファイルを"BLAOD"コマンドで読み出す「Disk版ローダ」を作成して一丁あがりとなる
- もう一つの情報である「スタートアドレス」に関しては、Basicの最後に"EXEC"文で実行するように書き加えればよい。
マシン語ローダーの解析例 †
- マシン語と聞いただけでザワザワとしそうだが、マシン語ローダ解析のポイントは意外に簡単。
- 実は、必ずカセット関連(モータOn/Off制御やデータ読み込み)の処理動作のために、BasicのROM内ルーチンを呼び出していることが多い。従って、そのROMアドレスを手がかりにして、前後を解析して処理時のパラメータを調べればよいのだ。
- カセット関連のROM内主要ルーチンとしては、いくつかあるが、3つも覚えておけば十分だった。
ROM アドレス | 処理内容 |
1A61h | CMTロードイニシャライズ モーターをONに |
1A70h | CMT 1文字入力(regA にデータが入る) |
1AAAh | CMT Load用Stop モータをOffに |
- マシン語のダンプリストの中に「CD611A」とか「CD701A」などの文字列があれば、そこが手がかりになる。
- 後者の「CD701A」は、ニーモニックでは「CALL 1A70h」のことで、ROM内ルーチン(1A70h)を呼出(CALL)して、カセット(CMT)から1バイト読み込んで、レジスタAにセットする。この前後の処理を解析すれば、読み込んだデータをregAからメインメモリー上のどのアドレスにセットしているかで先頭アドレスが判明する。また、大概はループ処理になっているので、その繰返し回数が分かればバイト数(もしくは、終了アドレス)等のファイル構成が判明することになる。
- 読み込み終了後に「C3xxxx」の文字列が記述されていれば、「JP xxxxh」のことで。すなわちアドレス(xxxxh)にJump、つまりゲームのスタートアドレスが分かる仕組みだ。
各種ツールも必要 †
- P6のCPUはμPD780で当時代表的なZ80互換である。幸い、Z80マシン語の解説書は種々出版されていた。ただし、それだけではどうにもならない。
- P6のBasicROM内ルーチンの詳細などP6固有の情報を知らなければ何も始まらないのだが、NECが技術マニュアルを公開しているわけではない。しかし、ご安心。虎の巻ともいえるPC-6001解析本がけっこう何冊も発行されていた。
- 情報だけでなく、ツールも必要になる。PC60mk2本体にもマシン語モニタが内蔵されているが、逆アセンブル等の機能はない。ダンプリストを見て、頭の中で逆アセンブルするのはちとツライ。幸い、解析本にサンプルプログラムのリストが公開されていて助かった。
【PC6001mk2 マシン語入門】
- 他にも「SEAM-60」というアセンブラーも商品としては存在し、そこそこマシン語プログラム開発環境もあるにはあった。もっとも、実際のソフト開発は、上位機種のPC8801やPC9801上で行われていたようだ。もっとも、IPLの改造程度ならハンドアセンブルで十分だったが。
- 少しわき道に逸れるが、PC98には「BabyMaker」「Wizard98」等の有名なファイラー(コピーツール)があったが、P6界にもファイラーは存在した。その名も『浪人生』:ディスク用ファイル化ツール。キャッチコピーは、「あっ! 落ちちゃった」だ。バカチョンでテープ版ソフトのディスク化が可能だった。
- 例によってイタチごっこの始まりだが、その対策のため様々なカモフラージュが施されるようになる。マシン語ファイルをBasicフォーマットに一体化したり、ROM内ルーチンに頼らず独自のカセット読み込みプログラムを作成したりするなど、マシン語ローダの仕掛けはますます複雑化していった。
- ただ、基本的な理屈はそういうことで、IPLの動作を順次追ってゆくことでプログラムの構成や配置が見えてきて、それらを個々ににファイル化してフロッピーに保存し、LOAD用のプログラムを再構成すればよいのである。