PC-6001mkII用の64KByte ROMカードを作ってみる

初代機用32KByte ROMカード編からの続きです。ここではmkII(試していませんが6601もOKなはず)に限定して話を進めます。

メモリ構成の確認

初代機用32KByte ROMカードでは、RAM領域をROM領域に置き換えました。その際、PC-6001のアドレスバス信号A0-A15をフラッシュメモリのA0-A15に接続しました。 これにより、PC-6001(Z80)から出力されるアドレス信号は全てフラッシュメモリ側に伝わっていることになります。初代PC-6001では、外部のRAM領域が16KByte分なので、その箇所のみフラッシュメモリが見えていました。

PC-6001mkIIでは、内蔵RAM64KByteとは別に、外部に64KByteのRAMを持つことが出来るようになっています。PC-6006SRという64KByte RAMカートリッジが発売されていて(型番上はSR用の周辺機器なのですが)、 これがPC-6001mkIIでも使えたようです。(未所有なので詳しいことは知りません)。

ということは、前回作成した、初代機用32KByte ROMカードをPC-6001mkIIに差し込めば、mkIIの外部64KByteRAM領域がフラッシュメモリ64KByteの領域として見えることになります。

2つの外部ROM領域が間にあるので、図ではフラッシュメモリが分断しているように見えますが、PC-6001mkIIから外部RAMとしてみた場合には、連続した64KByteのメモリ空間になるはずですから、その辺を確認してみます。

PC-6001mkIIのバンク切り替え

PC-6001mkIIでは、起動用兼BASIC ROM、音声合成/FDD制御用ROM、漢字ROM、テキストフォントROM、RAM64KByteが搭載されていて、Z80メモリ空間には収まらないのでバンク切り替えの仕組みを持っています。 その仕組みと切り換え方法を、秀和システム PC-6001mkII解析マニュアルIから引用します。

切り換え方法はI/Oポートで指定しますが、読み込みと書き込みを別々に指定できます。(もちろん書き込み先はRAMに限定されます)

I/O F0H ... 上位4bitで4000H-7FFFH、下位4bitで0000H-3FFFHの読み込み先メモリを指定

I/O F1H ... 上位4bitでC000H-FFFFH、下位4bitで8000H-BFFFHの読み込み先メモリを指定

それぞれ4bitに指定する値と対応するメモリは以下のようになります。

4bitBASIC ROM音声合成/漢字外部ROM4外部ROM3内部RAM外部RAM
下位上位下位上位下位上位下位上位
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F

リセット時の外部ROM4は4000H-5FFFH、外部ROM3は6000H-7FFFHです。音声合成ROMと漢字ROMの切り替えはI/OポートC2Hを使います。

なんだか分かりにくい指定方法ですが、F0H,F1H共にDDHを指定すればZ80メモリ空間は全て内部RAM、EEHを指定すればZ80メモリ空間は全て外部RAMからの読み込みなるということです。リセット時は、F0Hが71H、F1HがDDHに指定されているので、0000H-3FFFHがBASIC ROM、4000H-5FFFHがROM4、6000H-7FFFHがROM3、8000H-FFFFHが内蔵RAMとなっています。これにより、PC-6001初代機の、4000HからのA,Bの文字を読み取って外部ROMから起動する仕組みが引き継がれています。

一方、書き込み先指定は、I/OポートF2Hを使います。

I/O F2H ... Bit0-1が0000H-3FFFH、Bit2-3が4000H-7FFFH、Bit4-5が8000H-BFFFH、Bit6-7がC000H-FFFFHの書き込み先メモリを指定

指定する2bitによって書き込み先が変わります。

指定するBit内部RAM外部RAM
00
01
10
11

外部にRAMを拡張しないと内蔵RAMしかありませんから、通常のPC-6001mkIIでは、F2Hに55H以外の値を指定することはありません。

読み込み実験

外部ROM64KByteが本当に読み込めるかどうかのテストです。BASICからOUT命令を使ってバンク切り替えを行うとBASIC ROMエリアやBASICで使っている内部RAMのワークエリアにアクセス出来なくなり暴走してしまいます。ただ、BASIC起動直後からでも、4000Hの外部ROMエリアに割り当てられているフラッシュメモリの内容を読み取ることは確認できたので、それであれば、電源ONで拡張ROMエリアにあるテスト用のマシン語プログラムを即座に実行できます。

とりあえず、1000Hバイト単位に8Byte分だけ画面に表示するという、64KByte全部は確認できないけど、画面にダンプデータが表示される満足感優先な方法でテストしてみました。

仕組みとしては、4000Hからの外部ROMから起動し、内部RAMにテストプログラムを転送して、そちらにジャンプし、外部RAMの内容を調べるという方法です。ただ、内部RAMの領域もバンク切り替え対象ですから、その時は、別のバンクエリアの内部RAM側でプログラムを実行します。ソースファイルをここでHTML表示するには長めなのでZIPファイルで。

mkII64KromCard_checker.zip

アセンブル方法とか使い方は省略します。特別なことはしてませんが、5000H,8000H両方のプログラムをアセンブルしてバイナリ化したものをmainルーチンでバイナリファイルとしてincludeしてます。

プログラムを書き終えてから気がつきましたが、最初にあれこれ転送せずとも、PC-6001mkIIでは読み取り/書き出し先を別々に切り換えられるので、外部RAM(フラッシュメモリ)に64KByte分のテストプログラムを書き込んでおいて、その内容を丸々ごっそり(64KByte全て)と内部RAMに転送して実行すればよかったですね・・・。でも、バンク切り替えの仕方を色々と試せたので良しとします。

上の実行結果画面では、フラッシュメモリの内容を表示しています。フラッシュメモリには、400H毎に+1する値を書き込んであり、私の基板ではフラッシュメモリのA16/A17は+5Vにつないでいるので、30000H-3FFFFHの内容(C0H-FFH)のデータが並んでいる事になります。4000Hからは起動用のテストプログラムを書き込んであり、先頭の2バイトがA,Bの文字になっているのがわかります。8000HからBFFFHにはVRAMテスト用の画像データを埋め込んであったので、それが見えています。4000H-7FFFHは、外部RAM領域であると同時に外部ROM領域ということになります。このように、問題なくフラッシュメモリ64KByteの領域を読めてるようですね(全バイトみてないので実はA12/A11がおかしくて1000H単位での後半データが読めないとかありえますが)。

市販のテープゲームのほとんどが64KByte RAMに収まるサイズで動いているので、その内容をまるごとフラッシュメモリに書き込んで、4000Hからの起動プログラムで内部RAMに転送&ジャンプさせれば、電源ONで起動するゲームカートリッジも作れるはずです。

PC-6001mkIIでは、VRAMアドレスに該当する領域を外部RAMに割り当てていても、内部RAMの方を使うようです。これは、えすびさんの動画再生ボードのブログ記事にも書かれていて、それを実際に確認できました。ちなみにP6エミュレータのPC-6001VWでは、VRAM領域を外部RAMにしてあると、そちらを表示してしまいます。

Z80が内部RAMと外部RAMのどちらにアクセスしているのかをPC-6001mkIIの拡張コネクタに出ている信号から見分ける方法はDRD2信号です。外部RAMアクセス時はDRD2がActitve(0V)になります。内部RAMをアクセスしている時はDRD2信号は変化しないようです。また、内部RAMにアクセスしている時でも拡張コネクタのRASとEXCASは出力されていました(VRAMアクセス時は変化しないようですが)。

基板製作

PC-6001用の32KByte ROMカードをそのまま使ったので、今回は回路も基板製作もありません。