初代PC-6001で似非P6ROM使用時に画面が乱れる件

家電のケンちゃんからリリースしている「似非P6ROM」ですが、「特攻空母BELUGA」を初代PC-6001で起動するとタイトルCGが激しく乱れるとの報告がありました。

この現象は当方のPC-6601SRでは確認できませんでした。動画を撮影されたセイさんによると、乱れるのはタイトルCGだけで、ゲームは普通にプレイできるとのこと。さらに調査を進めると、初代PC-6001で、似非P6ROMに搭載されている8000h-BFFFhのRAMがVRAM領域として使われる時に発生することが分かりました。

試しに似非P6ROMのRAMチェッカーを初代P6で実行すると正常に読み書きできていました。

つまり、8000h-BFFFhはRAMとしてはアクセスできているのにVRAMとしては正しくアクセスできていないことになります。


原因の究明

似非P6ROMは戦士のカートリッジの互換機として設計していますが、西田さんのオリジナルとは微妙に仕様が異なります。本家ではP6のスロットの/RAS2と/EXCAS、/DRD2がL時にカートリッジの8000h-BFFFhにレイアウトされたSRAMからデータを読み出す仕様になっていますが、似非P6ROMでは更にアドレスが8000-BFFFhであること、つまり「A15=Hi,A14=Lo」を条件にしています。MSXではこの条件を入れておかないと4000h-7FFFhアクセスがあった時(システムROMのREAD時など)に似非P6ROMのRAMがデータを吐き出してしまい、バス競合が発生して動作しなくなるからです。どうしてそうなるかはMSXとP6のスロットの信号の違いを眺めていれば理解できると思います。

本家の戦士のカートリッジでは初代機でもタイトルCGは正常に表示されますから、このあたりに不具合の原因がありそうです。

さて、P6ではCPUが管理する16bit幅のアドレス上のメモリの一部をVRAMとして利用していますが、画面描画時にCPUはBUSREQを受けてバスを開放し、VDGと呼ばれるプロセッサ(M5C6847)がVRAMアドレスを発行してRAMにアクセスします。ところが、VDGがハードウエア的に生成しているアドレスはA0-A12の13bit幅しかありません。残りのA13はページアドレスとしてVDGの外で生成されていますが、A14,A15を生成する仕組みは見つけられませんでした。つまり、VDGによるVRAMアクセス時はA14,A15がHiレベルでもLoレベルでもなく、浮いていると考えられます。

参考資料:(M5C6847のアドレスバスはDA0からDA12までしかない)

https://en.wikipedia.org/wiki/Motorola_6847

これはP6のスロットに出ている外部DRAM用の信号が、8000h-BFFFhのアドレスデコードを含んでいることを示唆しています。それを裏付けるように、純正のROMRAMカートリッジはスロットのA14,A15には何も繋がっていませんでした。

実際にVDGがVRAMアクセスする時、浮いているA15:A14は論理的には00,01,10,11のいずれかの状態になりますが、似非P6ROMでは「10」の時のみアクセス可能、つまり確率1/4でアクセスに成功することになります。これでノイズの中に部分的にタイトルCGが表示される現象が説明できます。


対策

似非P6ROMのCPLDを改修し、本家戦士のカートリッジ同様に外部DRAM信号を利用したSRAMアクセス時のA14,A15を無視すればVRAMアクセス時の問題は回避できると考えられます。しかしそれをやると似非P6ROMがMSXで動作しなくなってしまいます。

そもそも初代P6がVRAMアクセス時にA14,A15をフローティングにしているのがイレギュラーなので、本体改造してCPUバス開放時の信号をA15=Hi,A14=Loにしてしまえば問題は解決します。例えば以下のような回路になりますが、P6mkII以降はこのような仕組みがカスタムICに入っていると思われます。

しかし、あくまでもVRAMアクセス時にA14,A15が浮いているのは初代P6本体の「仕様」です。よって似非P6ROMの改修で対処するのが正道でしょう。

このように2本の抵抗を使ってA15をプルアップ、A14をプルダウンすると、CPUバス開放時にA15=Hi,A14=Loとなり、似非P6ROMのRAMをVRAMとして正常にアクセスできるようになると思われます。実際にセイさんに検証していただきました。

改修により正しくタイトルCGが表示されるようになりました。このままMSXやPC-6601に挿しても問題なく動作するそうです。デメリットとして、A14、A15の状態遷移がわずかに遅延しますが、通常は問題にならないでしょう。あと、P6のバスバッファ付きの拡張スロットを使うと、末端のカートリッジのプルアップ、プルダウンが無効化されるため画面の乱れが再発します。


結論

今回の不具合は初代PC-6001限定で発動するもので、原因は初代P6の画面描画時にアドレスバスA14,A15が浮いているという「仕様」でした。

初代P6以外で運用する場合は不具合は発生しませんし改修も不要です。画面が乱れる状態で使用を続けていても故障の原因にはなりません。改修する場合も似非P6ROM基板への抵抗2本の取り付けといった比較的簡単な作業で完了します。よって今回の件は「仕様」とさせていただき、当方による改修サービスは行いません。恐れ入りますが、本機をPC-6001初代機でご使用になる方には、抵抗2本の増設による改修を推奨いたします。


補足

後から知ったのですが、P6で様々な検証記事を書かれているMORIYAさんが過去に類似の問題を報告されていました。

http://p6ers.net/mm/pc-6001/dev/flashromcard/32k.html

おそらくこのケースでもROMカートリッジのA14をプルダウン、A15をプルアップすれば問題は解決するだろうと思います。