Z80 ゲーム機を作ろう(その3)
(その3)です。製作に時間がかかってしまって,久しぶりの記事更新です。前回は,PC と Z80 バスの間をインターフェースする基板を作りました。
今回は,Z80 CPU 基板を作っていきます。
基板の構成
Z80 が載っている基板ですが,CPU の他に,メモリと,ユーザー入力周り,設定用のディップスイッチも載せてしまいます。
…んで,できた基板がこちらです。なんか,すごいスパゲッティみたいになっていますが…。
前回作ったインターフェース基板と,バスをお互い排他しながら使います。
インターフェース基板から /BUSRQ をアクティブにしてバスを要求し,Z80 は,バスを開放して,/BUSAK をアクティブにしてそれを知らせます。
これは,パチパチマイコンでもやりました。
Z80 は,バスを開放すると,アドレスバスとデータバス,コントロール信号をハイインピーダンスにします。
これによって他のデバイスがこれらのバスを使えるようになりますが,今回は,Z80 とバスとの間に「バスバッファ」と呼ばれる IC を挟んで,これでバスのコントロールを行います。
このバスバッファは,/BUSAK 信号の他に,/RESET 信号がアクティブになると,バスとコントロール信号を切り離すようにしています。
リセット状態で,インターフェース基板からバスにアクセスできると,起動時のブートプログラムを簡単に転送できて便利です。(Z80 は,リセット状態時にバスは切り離しますが,コントロール信号は切り離さずに非アクティブ状態にするんですね)
メモリは SRAM 1 個
プログラムは ROM に,ワークエリアは RAM に置きます。
前回の記事で述べましたが,プログラムは SRAM に転送し,その後,Z80 からは書き込み不可にしてしまいます。
読み出ししかできなくなるので,Z80 からは ROM に見えるというわけです。
SRAM は,1Mbit のものを使っていてスカスカなので,ついでに,ワークエリアも同じ SRAM に割り当ててしまいます。
アドレスデコーダをごにょごにょして,アクセスするアドレスによって,書き込みの可否が変わるってわけです。
また,プログラム部分は,ROM として振る舞うわけですから,電源を切ってもその内容を保持したいですよね。
SRAM は,スタンバイ状態にすると非常に少ない電流でデータを保持できます。
家庭用ゲーム機のカセットの中にもリチウム電池が入っているのを見たこともあるかと思いますが,そのゲームカセットと同じように,電源を切った後は,リチウム電池でメモリ内のデータをバックアップすることにします。
ユーザー入力ポート
ゲーム機と言ったら,コントローラがないと話になりませんよね。
昨今のゲームコントローラと言うと,USB 接続が一般的だと思いますが,ここは,昔ながらのパラレル接続タイプを使用します。
DSUB 9 ピンにつなぐコントローラ…。
そうです。アレです(笑)。
今は普通のお店には売っていないかもしれません。私は手元に電波マイコンソフトのジョイスティックがあるので,これを使います。MSX 用のコントローラなら問題なく使えます。
クレジット投入と,ゲームスタートボタンに,タクトスイッチを割り当てました。
なんかチープな感じですが…この辺は機能すればいいんです。
あと,ゲームの設定用に,ディップスイッチを 2 つ付けました。
よくアーケード基板に付いているやつですね。
インターフェース基板にも I/O ポートにディップスイッチを付けていますが,こちらは,メモリマップトになっています。
二階建てになりました
前回作ったインターフェース基板と接続してみます。
こんな感じになりました。
左下に付いている DSUB 9 ピンコネクタにジョイスティックを接続します。
動作テストをしてみます
ジョイスティックポートをメモリマップト I/O として割り当てていますので,そこからデータを読み取り,インターフェース基板にある LED ポートににそのまま書き込んでみます。
プログラムは以下のような簡単なものです。(プログラムエントリが,0x100 となっているのは,事前にブートプログラムが書き込んであり,このテストプログラムをデバッガで読み込んで実行しているからです)
INPUT0 = $A000
INPUT1 = $A001
DIPSW0 = $A002
DIPSW1 = $A003
.text
.org $0100
.global start
start:
di
1:
ld a,(INPUT0)
cpl
out ($C0),a
jr 1b
そして,実行してみた結果です。
ジョイスティックのレバーとボタン,ゲームスタートボタンを押すと,割り当てているビットの LED が光りました!
取り敢えず,期待通りに動作しているようです。
よかった,よかった…。
さて,次回は,画面出力周りを作ろうかと思います。やっとゲームっぽくなりそうですが,うまく続くといいなぁ…。