オレ仕様のゲーム機を作ろう(その24)
前回は「スクロール BG 基板」を作って独立してスクロールする BG 画面を 2面表示できるようになりました。
オレ仕様のゲーム機を作ろう(その23)
今回は,「スプライト基板」を作りたいと思います。
スプライトの仕様
当初の予定では,以前まで 1 枚の大きさが 16 x 16 ドットに固定されていたスプライトを,大きさを可変できるようにする…ということになっていました。
大きさは,縦横それぞれ,16 ドット,32 ドット,64 ドット,128 ドットの 4種類から設定できるので,全部で 16 通りの大きさが設定できます。
色数も BG と同様に,パターンあたり 16 色指定でき,この 16 色のパレットが全部で 16 本あり,その中の 1 本をパターンに指定できます。
表示できるスプライトの枚数ですが,画面全体に最大で 160 枚,水平ライン上に,横サイズ 16 ドット換算で,最大 40 枚まで表示することができます。(ですので,横サイズ 32 ドットのスプライトは,最大 20 枚まで表示できることになります。)
X68000 のスプライトが,画面全体に最大 128 枚,水平ライン上に 32 枚までで,メガドライブが,画面全体に最大 80 枚,水平ライン上に 20 枚までなので,そこそこのスペックにはなったのかな〜と思っています。
ただし,スプライトを設定するメモリは,V-BLANK 期間しかアクセスできないので,画面の特定ライン表示中に,スプライト設定を変更して事実上の枚数を増加させる,スプライトダブラーのようなことはできないようになっています。
設定できる座標(画面位置)は,X 方向, Y 方向ともに,0〜511 までです。(511 は,-1 と同義です)
指定できるパターン番号は,最大で 4096 パターン指定できます。
また,各スプライトごとに縦方向と横方向それぞれ反転表示することができます。
作成した基板
今回は,3 枚の基板から構成されています。
スプライトの大きさを可変にしたせいで,基板が 1 枚増えてしまいました。
まずは,「スプライトデータを設定する基板」です。
74 ロジック IC と SRAM で構成されています。
160 枚あるスプライトの,パターン番号,表示 XY 座標,縦横の大きさ,上下左右反転表示,パレット番号を指定します。(便宜上,スプライトメモリと呼ぶことにします)
メイン CPU バスと,サブ CPU バスの両方からアクセスすることができますが,アクセスできるタイミングは,部品を増やしたくなかったので, V-BLANK 期間のみにしました。
表示期間中は,このスプライトメモリに設定された値から,現在の走査線上にどのパターンを表示すべきかという情報を,スプライトパターンを決定する基板に渡してやります。
次は,「スプライトパターンを決定する基板」です。
これもまた,74 ロジック IC と SRAM のみで構成されています。
スプライトの大きさによって,参照するパターンが変わるので,結構部品数が増えてしまいました。
左端にある SRAM がパターンを定義するメモリになりますが,パターンは 4096個定義できるので,合計で 4M ビット = 512K バイト搭載しています。
実はもっと増やすこともできたのですが,このパターン定義メモリも,CPU のメモリ空間にマッピングされ,バンク切り替えしてアクセスします。
このバング設定レジスタが,5 ビット分しかないので,この容量になってしまいました。
まぁ,これだけあれば,十分かもしれません。
スプライトのパターンからドットデータを決定して,次のラインバッファ基板へデータを渡してやります。
次は「ラインバッファ基板」です。
これもまた,74 ロジック IC と SRAM のみで構成されています。
送られてきたパターンのドットデータとスプライトメモリの X 座標から,ラインバッファに最大 40 枚分をレンダリングします。
ラインバッファは,一つ前の走査線で書き込み,次の走査線でそれをディスプレイに送るため,ダブルバッファになっています。
そして,レンダリングされた走査線 1 本分を,「画面ミキサー基板」に送ってやり,他のBG 画面とミックスされ最終的にディスプレイモニターにアナログ RGB データとして送られます。
概ね,やっていることは,以前作ったスプライト回路と同じなのですが,色数が増えたのと,スプライトの大きさを可変にしたことで,かなり回路が複雑になってしまいました。
やはり一発では動かない(毎回だな…)
こんな感じからスタートすると,やる気パワーがかなり取られますが(笑),地道に信号をチェックして調べていくしかないです。
だいぶ,マシになってきましたが,ここまで来ると「もしかして,行けるのでは?」と思ったりしてきます。
そして,「あとはノイズかな…」というところまで来て…。
「来たーっ!!!」となります(笑)。
基板を接続してみる
今回は,基板を 3 枚追加したので,10 階建てになりました。
使っているロジック IC や SRAM などの DIP 部品も 500 個近くになってきました。
そして,重さを量ってみたら,なんと 5 キロを超えていました。かなり重いです(笑)。
この後,まだ基板を追加する予定なので,ますます重くなると思います。
動作テストしてみる
まずは,スプライトの大きさテストです。
それぞれ,大きさの違うスプライトを表示しています。
大きいスプライトを反転表示をさせると,スプライト内のパターンの位置も反転します。
次にスプライトを多数表示させて,BG と重ね合わせています。
現状の問題点として,0 番目(先頭)のスプライトの表示がチラチラしてしまうのですが,処理タイミングをちょっと早める必要がありそうです。(動作テストでは 0 番目のスプライトを表示しないようにしています)
今回はここまでです。
これで画面表示周りはほぼ完成しました。
残るはサウンド周りです。
次回は,「FM 音源基板」に着手したいと思っています。
それでは次回に続きます。
ひえぇ、凄い…ここまで一気に読んでしまいました。
MSXを触りながら、いつかX68000を超える凄いハードを作りたいと夢見ていた少年時代に戻ったようです。
残念ながら私には電子回路のスキルが身に付かなかったので実現は難しいのですが、もし実現できていたら…を見ているようでワクワクします。
個人的には、パワードリフトみたいな拡大縮小回転可能なスプライトを大量に配置して画面を埋め尽くした無理やりな3D画面を作れるスーパーハードに到達して欲しいです笑
今後とも進展を楽しみにしています!
こうしさん
コメントありがとうございます。
自分も若いときに,X68000 が買えず,ずっと憧れていましたが,当時,今の電子工作スキルがあったらな〜なんて思ったりします。
FPGA などを使えば,ある程度のところまでは実現できそうですが,ロジック IC を使った電子工作でどこまでやれるか,頑張っていきたいと思います。
私も帰省から戻る電車のなかで一気よみしてしまいました。すごいの一言です。
学生のときに88FHの水晶発信子を付け替えて、「もしかして、10MHzでうごいたりしねーか?」って、ハンダづけしてゴニョゴニョしてるうちにpcそのものを壊してしまった(電源が入らなくなった)のを思い出しました。
バンク切り替えとか、でてくる単語が懐かしいです。あいまいなまま今に至る用語の勉強になりました。今後に活かせそうです(笑
88にスプライトほしかったなぁ〜
つもさん
コメントありがとうございます。
私も MSX TurboR を壊してしまったときは,かなり悲しかったです(笑)。
88FA を持っていましたが,スプライトじゃない,あのカクカクな動きのゲームも楽しかったですよね。
今後も,いろいろと作っていきたいと思いますので,よろしくおねがいします。