N80と時を同じくして作った"PC-8801"のエミュレータのこぼれ話
PC-8001の上位機種として1981年12月に登場し、その後も長くシリーズ展開された人気パソコン。PC-8001の互換モード(Nモード)を持ち、過去のPC-8001用ソフト資産も継承できる優れものだった。PC-8001の弱点であったグラフィックス機能も強化され、mkII以降のシリーズではサウンド他も強化された。
初代PC-8801のエミュレーター。N80と同様、IBM-PC互換機(DOS/Vマシン)のMS-DOS上で動作した16bitアプリ。自分は初代88ユーザーだったのでmkIIやSR以降の機能は実装されていない。
N80も一通り完成し、次のステップとしてPC-8801のエミュレータ"N88"に着手した。どうしても森田氏作の「アルフォス」を動かしたいという思いがあったからだ。PC-8801はハード的にもPC-8001を拡張した設計になっていたので、N80をそのまま拡張すれば実現できそうだった。
N80はDOS/V機の標準的な表示装置CGA(EGA/VGA)のテキストのみを使用していたが、PC-8801ではグラフィックス機能が加わる事になる。ところがEGAではテキストとグラフィックを同時に使えない制約があったので、グラフィックスとテキストを全てソフト的に重ね合わせて再現するのは現実的ではない。何せホスト側の互換機は「486SX-25MHz」である、まともな速度では動作するとは思えなかった。
そこでEGAの4枚あるGVRAMの内3枚をグラフィックスに、残りの1枚でテキストを表示する事にした。テキストはグラフィックで文字を描く分処理が重くなる上に、カラーや他の属性はほぼ使えなくなったが、ここは割り切ることにした。
PC-8801とEGAのGVRAM構造はよく似ていたので、ハード任せにした方が速度が稼げる。
PC-8801では割り込み機能が積極的に使われるようになり、Z80エミュレータにも割込み対応の改良をする必要があった。キー入力の検知走査やカセットテープからのデータ読み込みなど、PC-8001ではポーリングで行っていたような処理が割り込み駆動になっていた。
実機には中古で買ったPC-80S31を繋いでいたが、PC-8801のフロッピードライブはFDU側にもCPUを持つインテリジェント型だったので実装は諦める事にした。486SXにはZ80を2つ同時に回せる程のパワーは無かった。
PC-8001ではポーリング方式だったテープの読み込みが、PC-8801では割込み駆動方式になった。N80ではCMTデータを渡すだけなので実機より速く読み込めたが、N88では実機並みの速度になってしまった。手持ちのテープはBASIC+マシン語の構成でBASICからマシン語を読み込ませるものが多かったので、マシン語だけ読込みを高速化する細工を入れた。 CMTファイル上のマシン語データは開始アドレスとデータ及びチェックサムというフォーマットだったので、空いているport(&HF0)を叩くとN88側でデータを抜き出して直接メモリに転送させるようにした。BASIC部分の修正が必要ではあったが、loadは劇的に早くなった。