リトルバンパイアをP6で動かそうブログ6
やっと完成しました。技術的な話をまとめておきます。
○P6のメモリマップ
・FM音源なしバージョン
0x0000〜0x7FFF:グラフィック画面
0x8000〜0x99A9:メインBASICプログラム
0x99AA〜0xA544:変数エリア
0xA545〜0xAD48:スタックエリア+空き
0xAD47〜0xB8FF:文字列領域
0xB900〜0xCFFF:美咲フォントデータその2
0xD000〜0xDFFF:マシン語プログラム(後述)
0xE000〜0xEFFF:BASICワーク
0xF000〜0xFFFF:美咲フォントデータその3
拡張RAM
0x0000〜0x3FFF:美咲フォントデータその1
・FM音源ありバージョン
0x0000〜0x7FFF:グラフィック画面
0x8000〜0x99A9:メインBASICプログラム
0x99AA〜0xA544:変数エリア
0xA545〜0xAD48:スタックエリア+空き
0xAD47〜0xB8FF:文字列領域
0xB900〜0xCFFF:空き
0xD000〜0xDFFF:マシン語プログラム(後述)
0xE000〜0xEFFF:BASICワーク
0xF000〜0xF3C7:空き
0xF3C8〜0xFFFF:BGM演奏用MMLデータ
拡張RAM
0x0000〜0x66FF:美咲フォントデータ
0x7000〜0x77FF:BGM演奏プログラム(メイン)
0x7800〜0x7FFF:FM音源音色データ
○ディスクマップ
今回のプログラムでは、ファイルの管理をBASICがしているため、どのトラックにどのデータが入っているかは意識していません。ただし、トラック#0セクタ#1に関しては、起動用のプログラムが入っています。そのため、D88TOOLなどで上書きされないようにFATを一部書き換えています(0xFEを設定してシステム予約にしている)。
○88版からP6版への変換について
変換でやっている事は、以下の通りです。
(1)88版のディスクからファイルを取り出す。
88版では、N88-BASICではない、特殊なセクタ構成のDOSが使用されています。
1024バイト長×5セクタと、256バイト長×1セクタが、1トラック内に書き込まれています。そのうち、256バイト長のセクタに関しては、DOSのプログラムが書かれているようです。N88-BASICで使用しているのは、1024バイト長×5セクタの部分です。1トラックに5120バイト=256バイト×10として管理されています。また、1クラスタは2560バイトに設定されており、1トラック=2クラスタになっています(N88-BASICと同じ)。ディレクトリ、ID、FAT の構成は、N88-BASICやN66SR-BASICと同じですが、トラック#18ではなくトラック#1に格納されています。
プログラム(tsdos2file.exe)で、それぞれのD88イメージから、BASICファイルを取り出しています。
(2)88版のBASICメインプログラムをASCIIファイルに変換する
アリスソフトのゲーム(あ、リトルバンパイアはチャンピオンソフトか)では、他のゲームとの共通化を図るための工夫がなされています。
シナリオ(文章)、グラフィック、選択肢、BGMのファイルが、BASICで読めるデータファイル(or マシン語ファイル)です。BASICのメインプログラムでは、そのファイルをOPENした後に、専用の関数からデータを読み出して処理しています。選択肢を選んだ時は、選ぶ前の変数の状態からシナリオに書かれている計算式を実行して、動作を決定しているようです。
そのため、BASICメインプログラムを読んでも、ゲームの内容に関しては全然分かりません。
プログラム構成をできるだけ同じようにしたかったため、P6用のBASICメインプログラムも、元の88用のものから変換をしています。
リトルバンパイアでは、Pオプション付でセーブされているため、Pオプションを外すプログラム(n88dec.exe)と、N88-BASICをASCII変換するプログラム(n88toascii.exe)を作成しました。ただし、n88toascii.exe は多少手抜きです。
(3)ASCIIのBASICプログラムから、P6用のBASICメインプログラムを作成する
ASCIIのBASICプログラムからは、かなり変更されているために、gawkを使って変換しています(まず、手動で修正してから、それになるようにgawkを組んでいます)。
元のプログラムで使用されている文法で、N66SR-BASICにないものは、
DEFINT A-Z(変数の整数宣言)
WHILE WEND
ラベルジャンプ
2文字を超えた変数名
CALL文
です。意外に地味に面倒な変換をしています。
次に続きます。


> 0xD000〜0xDFFF:マシン語プログラム(後述)
> 0xE000〜0xEFFF:BASICワーク
> 0xF000〜0xFFFF:美咲フォントデータその3
> 拡張RAM
> 0x0000〜0x3FFF:美咲フォントデータその1
> 拡張RAM
> 0x0000〜0x66FF:美咲フォントデータ
26368バイトですか。漢字だけなら24K(21K)に収まるはずなので記号類もANKではなく
美咲フォントですか?
88版のシナリオはANK/漢字(゛゜含)交じりのようですが。
シナリオファイルは半角カナはひらがなで表示するようになっているので、カタカナは全角に
なっています。余談ですが98版も同様です。
問題は゛゜の処理ですが、元の字に重ねて表示するとか。
あ、結局88版@字数を減らしたM88では表示できない字が多々あったので、P6漢字だけでは
ダメそうです。