Fruits Fields for PC-6001mkII

  • 投稿日:
  • by
  • カテゴリ:

1986年9月号のpioにフルーツフィールドというパズルゲームが掲載されました。船橋高校の高校生たちが作ったようで、8機種に移植されて、同時に全機種分のプログラムが掲載されていました。一部機種はソノシートにピーガーという例の音で、収録されたものが付録としてついていました。流石にソノシートは紛失していますが、雑誌は手元に残っていました。

当時、制作したグループと同じ高校生だったわたしは、せっせとダンプリストを片手に打ち込んで、PC-8801mkII版を遊び倒しましたが、全100面をクリアするには至りませんでした。

近頃は、Pasocom Mini PC-8001をはじめエミュレータ環境が充実しており、ちょっと遊ぶのにいいのですが、PC-8801にしてもPC-8001にしても、ゲームはテンキーでの操作を前提としており、ノートPC,それもGPD MicroPCみたいな特殊配列のキーボードでは遊びにくいのが難点です。というか、NUM LOCKキーのないGPDでは遊べません。

そんな折、なんとなく勢いで入手したPC-6001mkIIは、テンキーのないキーボードゆえ、ゲームはカーソルキーでの操作が主体であり、この手の小型PC上で遊ぶのにはもってこいです。

が、残念なことに、全8機種に対応しているフルーツフィールドですが、PC-6001シリーズは対応機種ではないのです。

PC-6001は、PC-8001よりは多分ましなグラフィックス画面もあるようだし、移植できるんじゃね?

と、PC-6001mkIIから、ROMを吸い出して、エミュレータをセットアップして、公開されているゲームで遊ぶだけで、なんとなく持て余していた環境上で、なんかしてみたかったこともあって、とりあえずやってみることにしました。

調べてみるとPC-6001では、グラフィックスが機能不足で、どうやらN60m-BASIC(モード5)でないと、PC-8001版すら移植は困難そうです。なんとなく、PC-8801版をもとにすればいいかなと思っていたのですが、モード5、SCREEN 3が、160x200x15色という解像度なので、160x100x8色のPC-8001版がぴったりな感じです。と、いうことで、PC-8001版をもとに移植することにします。

最初に取り掛かったのはキャラクターデータの移植です。PC-8001は2x4の8ドットのデータを4x2で並べて8x8のビットマップデータの形でデータを保持しています。PC-6001mkIIでは4dotを2byteeで保持する形になるので、2x2x8になるのですが、アスペクトの関係で、縦方向は同じパターンを2行ずつ使えばいいので、2x2x4で足ります。あとは、データを並べ替えてPC-6001mkIIのVRAMにべた書きできる形式にしてやります。テストのために、BASICのPOKEでVRAMべた書きしたのがコレです。この時、PC-6001mkIIのBASICが気が遠くなるくらいに遅いことを知ります。何ならゲームはBASICでもいいかなくらいに考えていましたが甘すぎました。全力でアセンブラで行きます


マップデータは、1nibbleで一マスの形式で、そのまま利用できそうです。

この頃になると、多少はPC-6001について知りたくもなかったことについてもわかってきていて、SCREEN 3では、文字を表示すると8x16の巨大文字になってしまい、ゲームの表示にはおよそ使えないことももちろん気づいていました。かくなる上は、フォントを4x8で自分で作るだけです。フルーツフィールドで使うだけなら、数字、記号、英大文字だけあれば事足ります。PC-8001版はPC-8801版の作者名のみに一部小文字が使われていましたが、あとはすべて大文字だったので、8801版の作者には大文字で我慢してもらうことにします。

プログラムを逆汗して、BIOSコールを可能なものは互換のもので、表示系などどうにもならないものは自前で組んで置き換えていきます。表示はときにはVRAMに直接書き込んだりしていたので、結構厄介でした。

PC-8001版は起動するとタイトルを表示してデモを開始します。デモは、デモ画面を表示して、REM君を動かしていきます。これ、ゲームルーチンをそのまま使っているので、デモが動けばほぼ骨格が完成した格好になります。

なので、エントリーポイントから、流れに沿って、デモの部分までを移植していきます。PC-8001版は、古き良き前方参照を徹底しており、ダンプリストはB000Hから始まりますが、エントリーポイントがB9CAHになっています。同じように移植するとエントリーポイントが覚えにくい面倒くさい番地になりそうなので、9000H番地開始で、エントリーポイントもそこになるようにします。

で、自前の表示ルーチン、キャラデータ、デモマップ、フォントなどを組み込んで、デモ周りのロジックをトップダウンで移植していきます。

開発環境はWSL2上のUbuntu上のzasmを利用します。キー入力は、PC-8001版はI/Oポートから直接読み込んでいますが、PC-6001ではBIOSを使うことにします。1061Hをコールすれば、AレジスタにSPC,上下左右のカーソルキー、STOP、そしてSHIFTの状態をビットマップで取得できます。ゲーム中の操作の大半はこれで事足ります。

デモ周りのロジックルーチンを移植すると、比較的簡単にデモは動きました。おお、これはゲームも簡単に行けそうじゃないか?と、喜んでいたら、ここで悲劇が......。

考え事をしながら、アセンブルをしようとしているところで、ふと、気づいたことがあって、viを起動しようとして、!vi と打ち込んだら、、、

 $ zasm -uwy --z80 ff6001.asm !vi

となって、ff6001.asmにバイナリががが、、、上書きされてしまった。

まあ、幸い、lst出力がviって名前で残っていたので、そこからソースを復旧して、事なきを得ました。悲劇を避けるために、エディタをUbuntu上のvimから、Windows上のVisual Studio Codeに変更して、zasmのコマンドラインも、

 $ zasm -uwy --z80 ff6001.asm ff6001.lst ff6001.bin

と、ファイル名をきちんと指定して、万一何かが後ろについてしまってもいいようにしました。つか、Makefile書けばいいんですけれどね。

バイナリができても、PC-6001エミュレータにロードする方法を考えなければなりません。PC-6001は機械語プログラムの扱いに関しては、驚くほど非力なんです。

N60m-BASICは一応、MONコマンドがありますが、テープIFでのやり取りが、アスキーコードべた書きで、効率も悪いので、年刊AhSki!に掲載されていた、南青山アドベンチャーをロード/セーブするための256byteモニターを使うことにして、ヘッダを付けてやります。

途中から面倒になったので、ローダを作成して、これの後ろにプログラム本体がくるようにしました。


このプログラムは、F900Hに読み込まれ、直後にセーブされているフルーツフィールド本体を読み込んで、制御をそのエントリーポイントに渡します。ついでに、

SCREEN 3,2,2:CONSOLE ,,,0
のような初期化もここで済ませてしまいます。これで、cload して、runでプログラムを読み込んで勝手に実行してくれます。

さて、PC-8001版のコードには、随所にウェイトループが組み込まれています。はっきり言って、それでもかなり速いんですが、最初同じだけウェイトを入れていたら、PC-6001版は全く使い物にならないくらい低速でした。絶望しました。

結果、大半のウェイトはほぼゼロにして、殺してしまいました。一部、面セレクトなどはウェイト入れないと狙ったところで数字を止められなくなってしまったので、復活させてますが、同じ4MHzのZ80だし、メモリアクセスにウェイトが入っているのも同じはずなのに、なんでこんなに違うんでしょう?

そして、昔のプログラマたちはそれだけ頑張ってこのマシンの上にゲームを移植していたんでしょう?

尊敬の念を覚えずにはいられませんね。

デモが動いたらゲームも大半はコードが組み込まれているわけで、一部のコードを追加したら、すぐに動くようになりました。逆汗のコードでサブルーチンの区切りが分かりにくくて、コンストラクションコードの一部をうっかり移植してしまっていたので、コンストラクションもほどなく動きました。

厄介だったのは、ゲームクリア時の画面でした。スタッフロールが流れるのですが、スクロール処理を組んでやる必要があります。まあ、ldirでいいだろうと思っていたら、何故か、画面がモザイク模様で埋め尽くされてしまいました。

結論から言うと、VRAMのある4000H~7FFFHのリードアクセスがROMに割り当てられていたため、ldirでスクロールさせる前に、バンク切り替えをしてやらないといけなかったというオチでした。

	in	a,(0F0H)		; read bank setting
	push	af
	and	0fh			; set 04000h-07fffh to RAM (VRAM)
	or	0d0h
	di
	out	(0F0H),a
	ld	hl, vram0+40*8
	ld	de, vram0
	ld	bc, 192*40
	ldir
	ld	hl, vram1+40*8
	ld	de, vram1
	ld	bc, 192*40
	ldir
	pop	af
	out	(0F0H),a		; restore bank
	ei

このスクロールは、アトリビュートエリアとグラフィックエリアとをそれぞれ一気にスクロールアップするため、一瞬ですが色ずれが発生して格好悪いんです。8lineずつ交互にするようにすればいいんですが、とりあえず、このままにして置きます。気が向いたら直すかもしれませんが。

BIOSコールにはキー入力のエントリが複数ありますが、0FC4Hのルーチンは、カーソルを表示するためにSCREEN 1に切り替えられてしまいます。なので、SCREEN 3のこのゲームでは使えません。

テープへのコンストラクションデータの保存、およびテープからの呼び出しは、とても簡単に実装できました。PC-6001のBIOSコールは、PC-8001よりこの辺りが充実していると思います。

PC-6001のプログラムはなんとなく感じが分かりました。そして、PC-6001の非力さも思い知らされました。いい勉強になりました。PC-8001に明らかに勝っているのは、色をどれだけ変えても、化けないことと、ドットごとに色を変えられるところくらいですかね?ゲーム向きではあると思います。

あとは、最初にも書いたように、テンキーがないので、ノートPCでのエミュレーションで遊びやすいというあたりですかね。

本当は、作ったのを公開したいのですが、版権はわたしにはないので、勝手にするのはまずいですよね。どこに聞けばいいんだろう? 工学社?

実際に遊ぶのは、PC-6001VW 4.x以降がいいですが、モニターが使い物にならないくらいに遅いので、デバッグは、Ubuntu上のPC-6001VXを使いました。

フルーツフィールド掲載のpio。この頃はASCII、I/O、pio、Oh!PCなんかを毎月買っていましたが、ほとんど残っていませんね。取っておけばよかった。もったいない。