オレ仕様のゲーム機を作ろう(その11)

いやはや,更新間隔が開きすぎですね…(笑)。

前回は…,っていつでしたっけ?1月でした。9ヶ月ぶりの更新になります。

オレ仕様のゲーム機を作ろう(その10)

いや,モノづくりは続けてはいたのですが,まぁ,面倒くさがってブログを全く更新していませんでした。

サンプルプログラムのその後

前回,オレ仕様ゲーム機で動作するサンプルプログラムを作成しました。

「Abbaye des Morts」というフリーの PC ゲームですが,これを実装しながら,Z80 プログラミングの勉強をしている段階で,MSX にも簡単にポーティングできるのでは?… と変なことを考え,突如,MSX でのコーディングをすることになってしまいました。(意外と飽きっぽいのです)

このオレ仕様ゲーム機は,BG が 8×8 ドットで,キャラごとに 2 色なので,MSX の SCREEN 2 でカバーすることができそうです。

スプライトも単色表示なので,同じく MSX のスプライト機能でカバーできそうと思ったのですが,SCREEN 2 でのスプライトは,水平ライン上に 4 枚までしか表示できないので,このスプライトの横並びを 8 枚まで表示できる,SCREEN4 で実装してみることにしました。

…となると,MSX ではなく,MSX2 以降ということになりますね。

また,MSX(に搭載されている TMS9918 という VDP)では,固定の 16 色ですが,MSX2 以降(に搭載されている V9938 という VDP 以降)はパレットも使えるので,オレ仕様ゲーム機と同じ色合いにすることもできます。

実は,このゲーム,すでに MSX に移植されています。

MSXdev’20: #15 – l’Abbaye des Morts

二番煎じ的なところもあるのですが,まぁ,個人の勝手移植なので,いいじゃないですか…(笑)。

MSX 2 での対応部分を考える

「意外と簡単に行けるね〜」と思っていましたが,BG のネームテーブルの構造が双方で若干異なります。

オレ仕様ゲーム機では,一画面中に 512 種類のパターンを指定することができます。

ただ,画面全体にそれぞれ異なるパターンを表示するには数が足りませんので,フルビットマップ表示はできません。

それに対して,MSX2 の SCREEN 4 (SCREEN 2 も)は,画面の上段 256 キャラ分(256 x 64 ドット),中段の 256 キャラ分,下段の 256 キャラ分に,それぞれ,別々の 256 種類のパターンを指定することができます。

画面全体で,768 種類のパターンを指定することができるので,フルビットマップ表示が可能です。

また,このゲーム,画面下部にステータスエリアがあり,その部分の情報に結構パターン数を使います。

画面全体で共通のパターンデータを使用すると,256 種類しか使えませんし,上段,中段,下段用に専用のパターンを用意すると同じパターンをダブって用意しなければならないので,メモリ効率がよくありません。

この辺り,MSX ゲームでの「あるある」かもしれませんね。

MSX2 での実装

画面スクロールしない,画面切り替えのゲームなので,結局,画面ごとに,上段,中段,下段にそれぞれパターンを持つことにしました。

画面ごとにデータを分けるので,パターン数自体はとても少ないです。

また,MSX2 での実装ということで,VRAM も 64KB 以上あるので,画面下部のステータスエリアは,別画面(別アドレスの VRAM)に用意し,走査線割り込みで,表示を切り替える手法を使うことにしました。

BG は,以上のような感じで移植できそうです。

以前の記事にも書いたことがありますが,MSX のスプライトの X 座標は,8bitでの指定です。0〜255 の値を指定し,負の数は指定できません。

スプライトの座標は,スプライト矩形の左上位置を指定するので,単純に設定すると,画面右端にはみ出して表示することはできますが,画面左端にはみ出して表示することができません。(ゼロより左の座標指定ができない)

そのために,スプライトアトリビュートエリアに,EC ビットという指定があり,このビットを立てると,スプライトが 32 ドット左にシフトするという機能があります。

この機能を使うと,画面左端にはみ出して表示させることができるわけですが,プログラムがちょっと面倒くさいです(笑)。市販されている MSX のゲームでもこの部分を端折っているものはありますよね。(画面左端でスプライトがぱっと消えたりとか)

この辺り以外は,オレ仕様ゲーム機用に書いたコードを利用できたので,スムーズに移植できたと思います。

なんとなくできた

いつものように(?)きちんと完成はさせていません(笑)。

8 割くらいは実装できたかな…と思いますが,ラスボス,死亡処理,セーブポイント,音楽および効果音が未実装です。

昨今の MSX での開発は,高機能なエミュレータがあるので,それを使って開発するのが主流だと思います。デバッガも装備していて,VRAM の内容もリアルタイムに確認できるので,とても便利ですよね。

自分はと言うと,過去に MSX 互換機を作成したことがあるのですが,それにGDB(GNU Debugger)スタブを移植して,ホスト PC から GDB でのソースコードデバッグをしながら開発するスタイルです。

MSX 互換機はこれです。

Z80マイコンシステム – 肝八

互換機上では,GDB でデバッグできるように,MSX の BIOS は載せず,単純に MSX のハードウェアを直接アクセスする形でプログラムを書きます。

そして,ある程度コーディングが進んだタイミングで,MSX 上でも動くように条件アセンブルして,実機確認します。(このスタイル自体,あまりメリットはありませんね…)

MSX 互換機上での動作状況はこんな感じです。

 

そして,MSX エミュレータの openMSX での動作状況はこんな感じです。

 

最近,こんなものを購入したので,いつかメガロムに入れて完成させたいな〜と思っています。

 

 

次回は

さて,今回は MSX でのプログラミングということで,多少脱線してしまいましたが,次回以降は,オレ仕様ゲーム機のバージョンアップ版を作っていきます。

 

オレ仕様ゲーム機は,まだまだ続きます(笑)。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA