KZ80マイコンを 偽MSX1へ〜ROMカートリッジボード(1)

KZ80-1MSRAM

年明けからPC-8001ネタばかり書いていて、KZ80マイコン偽MSX1化の最後 ROMカートリッジボードについて書いてませんでした。
KZ80マイコン 偽MSX1化で最後に必要になるのが、ROMカートリッジボードです。昨今のレトロパソコンブームのおかげか?MSX1のゲームカートリッジは現在でもゲーム中古品取り扱い店でなんとか入手可能です。自作マイコンで、MSX1のゲームが動かしてみたくてROMカートリッジボードの作成に入りました。

大枠の設計

まずはROMカートリッジスロットの信号線ですが、ネットをさがすとあちこちで紹介されてます。さすが統一規格。

https://www.msx.org/wiki/MSX_Cartridge_slot

上に引用した図はMSX ROMカートリッジスロットを上から見た図となります。またわかりずらいですが、向かって右側がROMカートリッジの表面(正面?)となります。

Z80のアドレスバス、データバスと各種制御信号線でいけると踏んでいたので、ちょっと油断していたところがあったわけですが、以下のような対応が必要ということがわかりました。

  • ROMカートリッジにはZ80の固有信号線#RD/#WRや#M1/#MREQ/#IOREQが必要。(SBC8080バスには8080CPU用に丸めた信号しかない)
    • これは想定どおり。Z80固有信号線バスを別系統で引き込む作戦でした。
  • メモリーボード KZ80-1MSRAMのバンクメモリー回路はMSX1仕様と合ってないので別途 基本スロット信号を出す回路が必要
    • これもまぁまぁ想定通り。後述しますがMSXはもともとバンク切り替えを想定した仕様(基本スロット)になっているようです。
  • 基本スロット切り替え信号はPPI(8255)のAポートの信号線を使うので、KZ80-IOBなどとの結線が必要

単純にCPUバスの信号線と電源をひねり出せば良いと甘いことを考えていましたが、MSX基本スロットを切り替えるためのバンク切り替え回路も必要となりました。またバンク切り替え信号はSBC8080バスとは別系統でメモリーボード(KZ80-1MSRAM)へ配線する必要があります。

Z80固有信号線とアドレスバス、データバス信号線

Z80 CPUボード KZ80-CPUB REV1では、SBC8080 CPUルーズキットとの互換を目標に設計したため、Z80 CPU固有信号線を外部に出していませんでした。
BLOG記事にまとめていないのですが、昨年 Zilog社製周辺LSI(SIO/2、PIO、CTC)を使ったI/Oボードと接続するためREV2以降はZ80固有信号線端子(MIL規格 14pin)を装備していました。

Z80固有の信号線 #RD(読み出し)/#WR(書き込み)や#M1(マシンサイクル1)、#IOREQ(I/O要求)、#MREQ(メモリー要求)などなどを装備していますので、別系統でフラットケーブルで接続する手間はありますがMSX カートリッジスロットに必要な信号線は揃っています。
また、SBC8080バス側にZ80のアドレスバス、データバス信号線は出ていますのでそちらからMSXカートリッジスロットへ接続すればOKです。

メモリー構成(MSX基本スロット)切り替えのしくみ

MSXは基本スロットという名前のバンク切り替えの仕組みを持っています。KZ80のRAMボードKZ80-1MSRAMのバンク切り替えは、その仕様を知らないままオリジナルでバンク切り替え回路を設計したのでMSXのものと仕様は合っていません。

かつての各種MSXパソコンの仕様を参考に、今回は偽MSX1としては以下のバンク構成(基本スロット構成)にしてみようと思いました。

  • MSX基本スロットはスロット0〜3の4スロット構成となっています。各スロットは16kBづつのページに分かれていて、どのページがどのスロットに割当っているかを管理するのはPPI(8255)のAチャンネルです。各ページPPIの2bitづつの情報を使用して4スロットの番号を指しているという感じです。(スロットというと物理的なROMスロットのことのように聞こえますが、MSXでは一般的なマイコンのメモリバンクのことをスロットと呼称しています)
  • 電源投入時の起動の際は、ひとまずスロット0のMSX BIOS ROMが起動します。
    • MSX BIOS ROMの初期処理のなかで、PPI(8255)のAチャンネルへスロットごとのページ構成を設定します。(どこにRAMがあるか…などをスキャンして設定してくれます)
  • ROMカートリッジ1はスロット1へ配置します。将来2つ目のROMカートリッジ2を接続する場合はスロット2を使おうと思います。
  • RAMはスロット3にします。今回はKZ80-1MSRAMボードをRAMボードとして使いますので、将来的に64kB Full RAMにできるようにしたかったこともありスロット3にしました。

上のスロットの図にある74HC153がPPI(8253)が保持しているページ(アドレス範囲)に対応したスロット番号を74HC139へ知らせてバンク(スロット)切り替えをするというからくりです。
問題なのは上述したとおり電源ONしたときにはまずはスロット0(ROM)を選択する必要があるのですが、起動時にPPI(8255)は全部INPUTモードとなっていて各ページのスロット番号を保持していません。BIOS ROMを起動しないと設定されないわけで、鶏が先か卵が先か状態になってしまいます。

74HC153データシート

上記のように74HC153のデータシートの真理値表を見ると、#GA/#GB端子がHレベルの際は出力がLとなります。Z80からのリセット信号(#RESET)によってRSフリップフロップをHレベルにしておくことで起動時/リセット時にスロット0(ゼロ)が必ずセットされるかたちにしておきます。

PPI(8255)のチャンネルAに正しく基本スロットの情報を出力したところで、このRSフリップフロップはひっくり返したいので、PPI(8255)のページ0($0000-$2ffff)のスロット番号を示す信号線PA0/PA1が両方ともLレベルになったことをトリガーにRSフリップフロップをひっくり返します。これで74HC153の#GA/#GB端子がLレベルになり、A15/A14信号線に従ってPPI(8255)のデータによりメモリバンク(スロット)のコントロールができるようになります。

MSXのROMカートリッジスロットに#SLTSL(スロット選択)の信号線がありますが、そこには上のスロットの図の74HC139の出力 O1を接続します。
また、BIOS ROMとRAMは別基板のメモリーボードKZ80-1MSRAMへ載せる予定ですので、HC139の出力 O0(ゼロ)とO3については、ちっょと見栄えは悪いですがSBC8080バスとは別系統でメモリーボードKZ80-1MSRAMへ配線する必要があります。とほほ。

メモリーボード(KZ80-1MSRAM)のパターンカット

MSXの基本スロット信号線でRAM/RAMのコントロールをする必要がでてきましたので、メモリーボード(KZ80-1MSRAM)のパターンカットが必要です。
回路としては以下のようにROM/RAMのチップイネーブル(CS/#CS)を直接MSXの基本スロット信号に接続することになります。

KZ80-1MSRAMメモリーボードへ搭載するMSX BIOS ROMには、オープンソースで開発されているMSX互換BIOS C-BIOSなんかがおすすめです。

#CS1/#CS2/#CS12信号線

残るMSX ROMカートリッジスロットの信号線としてはROMカートリッジメモリ番地ごとのセレクト信号 #CS1、#CS2、#CS12を作ってあげる必要があります。

名称信号線の意味
#CS14000H~7FFFH番地セレクト信号
#CS28000H~BFFFH番地セレクト信号
#CS124000H~BFFFH番地セレクト信号

回路としては以下のような感じで、いつもの74HC139でアドレスデコーダをつくります。

全体回路図&ユニバーサル基板で試作

以上を網羅した全体回路図は以下になります。

この回路でMSX ROMカートリッジがコントロールできるか試してみるためユニバーサル基板で試作してみました。

最初の写真で、手前の赤/青のケーブルがメモリーボードへ接続したケーブルでスロット0とスロット3信号線です。基板反対側のフラットケーブルx2本はPPI(8255)のチャンネルA信号とCPUボードから接続したZ80固有信号です。

写真にうつっているROMカートリッジはハードオフでゲットしたドアドアのカートリッジです。
この基板で無事ゲームが稼働することが確認できました!! 以前作ったPSG音源ボードからゲーム音楽も出ますし、ジョイスティックでゲームを操作することもできました!

しかし! 調子に乗っていろいろなROMゲームカートリッジを入手して遊んでみたところ、グラディウス2(「に」と発音するらしいです)の音楽がイマイチ。ベースの音楽はでてますが主旋律が出てない感じ。どうもROMカセット自体にSCCという音源LSIが載っていてその音が出てないらしいのです。ROMカートリッジスロットの端子を見ると「SOUNDIN」というものがありますが、この信号をPSGとミキシングして上げる必要があるみたいです。

また、グラディウス2でゲームをしているとチラチラと自分の機体の残像が出たり得点表示あたりがうまく描画されなかったりと、どうもタイミングが合っていない感じ。

というわけで、ROMカートリッジボードの回路としてはもうちょっと追加が必要なのであります。
つづきます。

コメント