Z80 ゲーム機を作ろう(その2)
(その2)です。このタイトルもこの先どれくらい続くのかわかりませんが(…え?),まずは製作スタートです。
プログラムコードの転送
CPU 基板から作りたいところですが,まず,Z80 からアクセスするメモリへのプログラムの転送について考えてみます。
前回のパチパチマイコンは,トグルスイッチでのプログラム入力しかありませんでしたが,ゲーム機のプログラムは,そこそこの容量があるでしょうし,全てスイッチ入力するのも拷問に近いです。
一般的にゲーム機のプログラムと言うと,外部メディアから読み込むものを除いて,ROMに入っているものを想像すると思います。
ただ,ROM は,その名前の通り,読み出し専用メモリであり,頻繁に書き込むものではありません。
また,書き込みも何かと手間がかかります。毎回書き込みに時間がかかっては,プログラムの動作テストも非常に面倒なことになりそうです。
そこで,プログラムを格納するメモリを,ROM の代わりに SRAM を使い,外部から簡単に書き込めるようにします。
手法は,パチパチマイコンと同じで,CPU からバスを奪うダイレクトメモリアクセス(DMA)で書き込みます。
CPU 外部から書き込んだ後は,ライトプロテクトをしてCPU からは書き込み不可とすれば,ROM のように振る舞えるというわけです。いわゆる ROM エミュレータと言われるやつですね。
ホスト PC からのデータ受け取り
では,そのプログラムデータをどこから書き込むかですが,プログラムのバイナリイメージは,PC 上でソースファイルからアセンブルして作るので,PC から直接送り込めると便利です。
PC との接続方法と言うといくつかあると思いますが,昨今の PC のインターフェースを考えると,USB 端子からシリアル変換するのが簡単で都合が良さそうです。(RS232C レベルを 5V にしてくれるので,直接 COM ポートに接続するより楽になりました)
ということで,PC と Z80 バスの間をインターフェースする基板から作成します。
データの中継をマイコンで
シリアルデータと Z80 バスとのやり取りには,AVR マイコンを使います。
Z80よりも性能が良いマイコンを使うことになってしまいますが…,ここはデータのインターフェースに特化しているということで良しとしましょう…。
最終的に Z80 バスへデータを読み書きするのですが,16bit のアドレスバスと,8bit のデータバスにアクセスするには,AVR マイコンのピンが足りませんので,AVR マイコンからシリアルで出力したデータをシフトレジスタでパラレル変換して Z80 バスへ接続します。
…で,作った基板がこちらです。
その他機能として
この基板には,PC とのデータ中継の他に,デバッグ用として 8bit の出力ポートと入力ポートも付けてあります。
出力は LED 8 個,入力はディップスイッチで,これらを I/O ポートにマッピングし,AVR マイコンと,Z80 どちらからもアクセスできるようにしています。
写真では,入力ポートから読み込んだデータを,そのまま出力ポートに書き込んで,LED が点灯しているのがわかります。
また,AVR マイコンに,シリアル EEPROM を付けて,そこからデータを転送できるようにもしています。
最終的には,この EEPROM にプログラム ROM イメージを格納して SRAM へ転送する予定です。
SD カードという方法もありますが,レベル変換とか面倒なのでやめました(オイ)
1 枚目の基板ができたので,次は Z80 CPU 基板の製作に入りたいと思います。