オレ仕様のゲーム機を作ろう(その10)
さて,いつものようにしばらくぶりの更新です(笑)。
前回は,スプライト表示回路を作成し,当初予定していた機能をすべて実装することができました。
オレ仕様のゲーム機を作ろう(その9)
今回からは,このゲーム機で動作するソフトウェアを作成していきます。
スプライトの座標範囲の拡張
このゲーム機の画面解像度は,横 256 ドット,縦 224 ドットです。前回の記事でスプライトの座標をメモリで指定できるようにしたのですが,X 座標,Y座標それぞれ 1 バイトで,0〜255 までを指定することができます。
画面の Y 方向は,縦 224 ドットなので,256 – 224 = 32 で,32 ドット分の画面外領域があるので問題ないのですが,X 方向は画面領域いっぱいの座標しか指定できません。
ここで何が問題になるかと言うと,X 方向で画面外にはみ出したスプライトが,逆方向の画面外から飛び出してくるのです。(ラップアラウンドって言うんですかね…?)
これだと,画面外から入って来たり,逆に画面外に出ていく表現ができないんですね。
MSX のスプライトも,横解像度が 256 ドットで,X 位置の指定も 1 バイトなので,同じような問題が発生しそうですが,スプライト指定データに,左に 32ドットシフトさせる機能を指定することでこの問題を回避できます。
今回は,単純に X 位置を 8 ビットではなく,9 ビットで指定できるようにして,画面外にはみ出しても自然に表示できるようにします。
ラインバッファのアドレスカウンタを 1 ビット拡張するのですが,特に空いているフリップフロップもないので,同じカウンタ IC を追加しました。1 ビットでも,8 ビット分のカウンタ IC を追加するのでちょっともったいないかもですね(笑)。
ソフトウェアの作成
さて,なんか適当なゲームでも動かしたいところですが,あまり大掛かりなものに挑戦すると頓挫と言うか,途中で飽きてしまいそうなので,既存のゲームを移植することにします。
このゲーム機の画面構成的に ZX Spectrum のゲームとか良さそうですが,絵素材の取り扱いが面倒そうなので,ZX Spectrum ライクな PC ゲームを見つけてきました。
https://locomalito.com/abbaye_des_morts.php
「Abbaye des Morts」というフリーの PC ゲームです。
リンク先に動画があるので,どんな感じのゲームなのか確認できると思います。
既にいろんな機種に移植されているようで,同じ Z80 では,ZX Spectrum や,MSX にも移植されているようです。(オリジナル版はたしか GAMEMAKER で作られていたような…)
ライセンスが CC ライセンスなので,グラフィック素材はありがたくそのまま使わせてもらおうと思います。
今回は,Linux に移植されていて,GPL として,ソースコードが公開されているものを参考に,移植していくことにしました。
https://github.com/nevat/abbayedesmorts-gpl
グラフィックデータが,PNG ファイルになっているので,適当にコンバートすれば,実機に取り込みやすそうです。
プログラムコードは,元のソースコード(GPL 版)が C 言語で書かれており,これをなるべく動作が同じような感じになるように,Z80 コードに書き直していきます。
Z80 の C コンパイラを通す方法もありかもしれませんが,比較的規模の大きいZ80 コードは,もう何年も書いていないので,Z80 マシン語の勉強がてらイチから書いてみようと思います。
他機種の移植版は,独特のアレンジ(?)がされている感じがするのですが,できるだけ,この GPL 版を再現する方向で進めていきます。
マップデータを作成
元のソースでは,マップデータは C 言語のソースにハードコーディングしていますが,マップエディタでマップデータを作ってみました。
使用したマップエディタは以前から愛用している「Tiled」というフリーのツールです。
一応フリーのツールですが,寄付を募っています。とても使いやすいツールで,積極的にバージョンアップされているので,私は送金して使わせてもらっています。
さすがに,イチからマップディタでポチポチするのは大変なので,元のソースコード中にハードコーディングされているマップデータをコンバートして取り込みました。
このマップエディタは,マップチップの指定だけではなく,いろいろなオブジェクトを作成して属性を追加し,マップ上に組み込めるので,当たり判定やイベントの発生,敵の配置などもこの機能を使用してマップデータに入れてみました。
なんとなくできてきた
久しぶりのマシン語プログラミングですが,なかなかコーディングが進みません(笑)。
今の時代,画面表示なんかは,ゲームエンジンにお願いすればちゃちゃっと表示してくれますよね。
それに対し,こんな古の仕様のゲーム機は,何をするにもある程度(行数)のコードを書く必要があるんですね。
しかも,8bit CPU なので,16bit 演算が非常にもどかしい…(笑)。
モトローラの 6809 なんかは,16bit アキュムレータの他,インデックスレジスタも16bit での即値加減算くらいはできるのですが,Z80 はとてもコード量(バイト数)が多くなる傾向があります。(単に Z80 の使い方が下手くそなだけかもしれません…)
それでも,地道に基本的な下回りのルーチンを揃えて,マップとキャラクターが表示できるようになりました。ここまで来ると,あとはそれぞれ個別の動きを増やしていけば良いので,先は見えてきそうです。
デジタルカメラで,動作状況を撮影してみました。
モニターをそのまま撮影したので,画面の映りがちょっと汚いです…。
ゲームの序盤部分がそれっぽく動くようになりました。敵との当たり判定はまだ入れていません。
完成できたらいいな…
まだまだ実装する部分は沢山あるので,完成まではもう少し時間がかかりそうです。
あと,サウンドですが,元のサウンドも PSG っぽい音なので再現できそうなのですが,素材が MP3 なので,YMZ294 で再生するには耳コピするしかなさそうです。(なんか他にいい方法があればいいのですが…)
今回は,ここまでです。
それでは,次回に続きます…。