オレ仕様のゲーム機を作ろう(その33)
前回から 2 ヶ月以上経ってしまいましたが,オレ仕様ゲーム機「重禄」の制作は,なんとか継続しています。
さて,前回は BG 表示基板を 4 枚使って,BG を 4 枚重ね合わせて表示させました。
今回はいよいよ,スプライトを表示する基板の作成です。
基本的なスペックは「鶏八」と同じ
以前作成した Z80 ゲーム機「鶏八」のスプライト回路を流用しますので,基本的な仕様は変わっていません。詳細は,「鶏八」の記事をご覧ください。
- 画面全体に最大 160 枚表示可能
- 水平ラインに横方向 16 ドット換算で最大 40 枚まで表示
- スプライトの大きさは,縦横それぞれ 16 ドット,32 ドット,64 ドット,128 ドットの組み合わせが可能。
- 縦方向,横方向それぞれで,反転表示が可能。
- スプライト 1 枚あたり,16 色パレット 16 本から 1 本のパレットを指定可能。
- 指定できるパターンは最大で 16 x 16 ドット換算で 4096 パターンが指定可能。
…と,ここまでは「鶏八」と同様なのですが,これではつまらないので,ちょっとした機能を追加してみました。
スプライトメモリの DMA 転送
「鶏八」の時は,スプライトを設定するメモリ(以下,スプライトメモリ)がV-BLANK 期間しかアクセスできなかったので,メインメモリにスプライトメモリのイメージを用意しておいて,V-BLANK 期間で MPU がスプライトメモリにコピーする必要がありました。
今回は,MPU が設定するスプライトメモリとハードウェアが読み取るスプライトメモリを別で用意し,V-BLANK に入ったときに,これらの間で(DMA 転送のように)ハードウェアが自動的にコピーするようにしました。(なんか,そんなアーケード基板がありましたよね…)
この DMA 転送中でも,MPU は止まることはないので,スプライトメモリ以外は普通にアクセスすることができます。
パレットのメモリも似たようなことをやっていますが,それと同様に専用のレジスタで,この DMA 転送のオンオフ設定と,現在の転送状態を確認することができます。
作成した基板
この機能を追加したせいで,「鶏八」の時は 3 枚で構成されていたスプライト表示の基板が,今回は 4 枚構成になってしまいました。
スプライトのサイズ可変機能と,この DMA 転送機能をカットして,スプライトパターンデータを格納するメモリを ROM にすれば,大幅に部品が減ると思います(笑)。
それでは,各々の基板の説明です。
まずは「スプライトデータを設定する基板」です。

74 ロジック IC と SRAM で構成されています。
パターン番号,縦横の大きさ,上下左右反転,パレット番号,表示 XY 座標を指定します。
上記のとおり,DMA 転送中以外は MPU から自由にアクセスできます。
次は「スプライトパターンのアドレスを決定する基板」です。

74 ロジック IC のみで構成されています。
何やら修正したあとが残っていますが…。
MPU もスプライトパターンを設定するので,アドレスの排他制御と,スプライトの大きさによって,参照するパターンが複雑に変わるので,その計算を行う回路になっています。
次は「スプライトパターンの基板」です。

74 ロジック IC と SRAM で構成されています。
これは,意外とスカスカになってしまいました。
前段のスプライトパターンアドレスによって,スプライトパターンが格納されている SRAM から実際のドットデータを引っ張ってきます。
そして最後が「ラインバッファ基板」です。

74 ロジック IC と SRAM で構成されています。
こちらはほぼ,「鶏八」の回路を流用しました。
走査線上にあるスプライトパターンをレンダリングして,画面合成基板に信号を送ります。
やはり一発では動かない(毎回だ…)

なんかちょっと意図しているものと違うんですよね…(笑)。
前回の回路を流用しているからサクッと行きそうなのですが,やっぱり修正箇所があったりして,こんな感じになってしまったり…。

これはちょっとヒドイですね…。
でも,なんとか表示までこぎ着けたのでした。

基板を接続してみる
スプライトの基板を接続する前に,それまでの基板の修正点を反映した新しい基板を青いレジストで作り直してみました。

なんか,青ってカッコいい!
そして,これに今回のスプライト基板を接続してみます。

一気に 11 階建てになりました。結構重いです(笑)。
テストプログラムを動かしてみる
「鶏八」の時に,Z80 コードで書いたスプライトの大きさ可変テストプログラムを 68000 で書き直してみました。
16 x 16 ドットから,128 x 128 ドットまで,16 種類の大きさを指定することができます。
上下左右反転もその大きさ単位で反転します。
BG との重ね合わせも,「鶏八」のプログラムと同じ感じで作りました。
160 枚まで表示できるはずですが,動画では,16 x 16 ドットのスプライトを 156 枚表示させています。
また,走査線割り込みも問題ないようです。
しかし,Z80 のアセンブリコードに比べて,68000 のコードは,縦の行数がかなり少なくなるので助かりますね。
今回はここまでです。
やっと,画面表示周りができました。(いや〜結構大変でした)
実は,このスプライト表示基板,もう 1 組作ると,倍の枚数が表示できるようにしています。
…が,いろいろと回路に修正を加えているので,新しい基板に作り変えてから,その辺りの検証をしようと思います。
ここまでくれば,ある程度動きのあるプログラムも作れそうですよね。
…と言うことで,このあとは,サウンド周りの基板が残っています。
基本的に,これも「鶏八」を流用するので,おそらく行けそうな気がするのですが…と言って,いつも毎回うまく行かないんですよね…(笑)。
それでは,次回に続きます。
