初代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をプルアップすれば問題は解決するだろうと思います。

似非P6ROM製品版

前スレはコチラ。

http://niga2.sytes.net/wordpress/?p=690

1年間塩漬けになっていた似非P6ROMプロジェクトは2021年11月から本腰を入れて開発再開。OPN2の音質は、高音質化改造されたメガドライブ実機と比較して劣らないレベルを目指し、最終的にOPN2のアナログ電源は+12Vからレギュレータで+5Vを生成して分離、OPAMPはアナログ+5Vの単電源とすることで比較的良好な結果が得られた。+12V電源を要するため、断腸の思い(嘘)でCASIOのMSXは対象外へ。

当初は裸基板でリリースするつもりであったが、試作機を剥き身のまま雑に扱っているうちにFlashROMが壊れる事例が発生したため、ケースは必要と判断。P6系の同人ハードで有名なBAKUTENDOさんの作品に倣って、リップルレーザーさんにアクリルパネル製造を依頼してみた。

前面パネルはクリアブルーを選択。製品名やロゴはテプラの裏貼りとした。コストはかかってしまったが、製品として恥ずかしくない仕上りになった。

PC-6601SRのスロットに挿した状態。程よい出っ張り具合。

もちろんT.Matsushima氏による「特攻空母BELUGA」も遊べる。ソフトウエアはFlashROMのバンク0にプリインストールされている。Mr.PCのファミべーキーボードアダプタや、赤外線ワイヤレスな猫の手リモコンシリーズは家電のケンちゃんで不定期で頒布中(売り切れ御免)。

MSXでは8kバンクで1MbitまでのMegaROMゲームを起動できる。コナミバンクやSCC付きのゲームも動作するが、SCC音は鳴らない。

スロットに挿入する際は逆差し防止機構がないので要注意。上面や背面スロットでは間違わないと思うが、セパレートキーボード機の前面スロットではラベル面が下を向く機種がある


音声ケーブルの接続

似非P6ROMには音声入力端子があり、MSX/P6本体からの出力音声とOPN2サウンドをミキシングすることができる。

ミキシング入力はステレオで、入力レベルはRV1/RV2で調整できる。接続には下のようなケーブルを用意する。

これは秋月電子の3.5mmステレオミニプラグオーディオケーブル(90cm)[DCB-AKI09]を切断してRCAプラグをつけた自作品。LRの芯線はまとめてRCAのセンターピンにハンダ付けした。なお、100均のケーブルは芯線にハンダ付けが困難なリッツ線が使われていることがあるのでオススメしない。

この組み合わせでも接続可能。共立エレショップで取り扱いあり。

出力端子からはラインレベルで信号が出るので、適当なアンプやアクティブスピーカーに接続すればOK。

上画像のようにMSXでVGM再生する場合は、プレーヤーのVGMPlay 1.3ににパッチを施し、Makoto(OPNA)の偽装工作を要する(後述)。MSX本体や周辺機器の状態によっては似非P6ROMでVGM再生出来ないので注意。具体的には、多くのSONY機(HB-F1XD/mk2/XDJ/XVなど)や拡張スロットなどで、スロットのデータバスとCPU間にバスバッファが存在する環境ではNG。MSXのスロットでは、IOデバイスのデータ読み取りの際に/BUSDIR信号でバスバッファに入出力方向の明示をすることになっているが、P6では/BUSDIRのピンに/ExCAS信号が割当たっており、戦士のカートリッジの拡張RAM制御に必要である。このため、似非P6ROMでは/BUSDIR出力をオミットした。これはMSX/P6両対応を実現するための「仕様」ということでご理解いただきたい。なお、松下A1シリーズの基本スロットにはバスバッファが存在しないため、この問題は発生しない(拡張スロットを使うとNG)。MSX用のOPN系音源は、いずれきちんと対応したカートリッジをリリースするつもりなので、主にMSXでVGM再生したいユーザーはそれまで待って頂いたほうが良いと思う。


VGMPlay 1.3パッチ情報

VGMPlay for MSXは下記サイトで配布されていて、ソースコードも閲覧できる。

http://www.grauw.nl/projects/vgmplay-msx/

2022年現在のVGMPlay 1.3はOPN2実音源には対応していないが、Makoto(OPNA)には対応している。OPN2のFM音源部はOPNAと互換性があり、似非P6ROMのOPN2のIOアドレスはMakotoと同じ#14-17hに割り当ててある。よって、Makoto(OPNA)に偽装することでOPN2の発音が可能である。

具体的にはVGMPLayのMakoto検出プログラムを書き換え、OPNAが存在するものと認識させればよい。ソースコードを読むと、OPNAの存在はステータスレジスタやADPCMレジスタを読み書きして確認しているようだ。以下にMakoto検出部分を抜粋。なお、Makoto_STATUS1はIOアドレス#16hを指す。

VGMPlay 1.3では、冒頭の IN A,(16h)が59F3hからの2バイト「DB 16」に該当する。ここをSCF ,RETにすればMakotoが存在することになるので「37 C9」に書き換える。これでOPN系のVGMデータが強制的にIOアドレス#14h-17hに流し込めるようになる。

OPN2クロックを変更する場合

似非P6ROMのOPN2クロックはMakotoに合わせて8MHzを選択している。VGMPlay 1.3ではMakotoのクロックが6C79hと6D8Chと725Chからの3バイトに「00 12 7A」と書かれており、10進数に直すと7A1200h=8000000となる。

似非P6ROMではオシレータを追加して8MHz以外のクロックをOPN2に供給することが可能。音源のクロックをメガドラ実機と同じ7.6704MHzにする場合はX1にオシレータ(EPSON SG-8002DC +5Vを推奨)を実装し、左のジャンパーピンを下側ショートにすればよい。VGMPlayの周波数設定は、7670400=750A80hになるので、「00 12 7A」 をサーチして「80 0A 75」と書き換えることになる。ここを直しておかないとPSGとミキシングした際に不協が生じる。

作者のGrawさんがOPN2に対応してくれるまでは、VGMPlayのバージョンが上がっても上記データのサーチ&書き換えで追従できるだろう。


似非P6ROMでVGM再生

実際にどのような音が出るのか、メガドライブのThunder ForceIVのVGMデータを使ってサンプリングしてみた。

MSX本体は初代FS-A1改。電源はiPadの純正ACアダプタでUSB化、内部の±12V電源はDC-DCモジュールで生成している。メガドライブのDCSG音はPSGで代理発音されるので、MSX本体の音声出力からケーブルで似非P6ROMのミキシング入力に接続し、音声出力をPCのUSBオーディオ(UA-30)を経由して録音した。

Thunder force IVの3番、4番、7番、11番、33番目の曲を各30秒収録した。fade out処理以外は無加工で、曲間の無音部にノイズが目立つが、ノイズ成分のほとんどは本体PSGサウンドに由来する。

OPN2単体の音質確認のために同じ曲を本体PSGミキシングなしで収録してみた。ホワイトノイズは聞こえるが、本体のデジタル信号由来のノイズはほぼ聞こえないレベルだろう。

そもそも、OPN2はホワイトノイズが多い石のようで、静かな曲を再生すると背後に雨が降っているようなノイズが混入する。特にThunder force IVの7番の中間部で顕著。こちらもPSGミキシングなしで収録。

この傾向は高音質化メガドライブ実機でも同様のようなので、YM2612実音源の特性なのだろう。


制限事項

似非P6ROMは、P6とMSX両対応とするために敢えていくつかの設計上のお約束を無視しており、そのため以下の制限が発生する。

  1. MSXで似非ROM機能とMSX-MUSIC(OPLL)の同時使用は不可
  2. MSXのVGMPlayでOPN2発音ができない環境が存在
  3. OPN2の割り込み機能は使用不可
  4. スロットに+12Vが供給されていない機種ではOPN2発音不可

1.についてはOPLLのIOアドレス(#7C-7Dh)と戦士のカートリッジのバンクレジスタ(#70-7Fh)が重複することが原因。MSXでの使用時も#70h-7Fhのバンクレジスタは有効で、ここに値を書いてしまうとアドレス空間4000-5FFFhのバンクが切り替わってしまう。OPLLアクセスで#7C-7Dhに書き込んだときも同様に切り替わるので似非P6ROMのFashROMにOPLLを使うソフトをインストールして運用することはできない。なお、これらのIOレジスタは書き込み専用なのでバス競合は発生しない。MIDI-SAURUSなど同じ理由で同時使用できないデバイスが存在するので、IOマップで確認を。

2.は既に解説しているが、スロットのデータバスとCPU間にバスバッファが存在する環境ではVGMPlayでの似非P6ROMのOPN2の発音ができない。具体的には多くのSONY製のMSXや外付けの拡張スロットが該当する。P6とMSXでスロット10pの役割が異なることが原因。FS-A1シリーズの基本スロットであれば問題なく発音できる。

3.はP6とMSXでスロット8pの役割が異なることが原因。MSXではCPUの/INTが繋がっているが、P6では/NMIが繋がっている。MSXでは音源の/IRQを/INTに接続すれば問題ないが、P6ではNMIが発行されてしまってNG。そのため、音源の割り込み機能はオミットした。P6ではスロットに/INTが存在しないので音源の割り込み機能の実装自体が不可能。

4.は、アナログ電源の生成に+12Vを使用していることが原因。OPN2はDAC内蔵音源であるため電源ノイズがモロに音声信号に現れる。MSXのVcc電源はデジタルノイズで酷く汚染されているため、音源のデジタル・アナログ電源の分離は絶対に必要。Vccに含まれるノイズはフィルター回路では十分な除去ができなかったため、比較的クリーンな+12Vを利用することにした。CASIO機(PV-7やMX-10等)ではスロットに±12Vが出ていないので似非P6ROMの音源は使えない。

バス競合のような致命的なエラーは回避できるように設計したつもりであるが、後から別の問題が出てくる可能性はあるかも…。


似非P6ROMのリリース計画

前スレに書いたように、OPN2音源の入手性には問題があるが、初回リリースのみ発音確認したリファービッシュ品を実装して頒布することにした。IC表面が削られてリマークされているので、見た目が怪しい点はご了解いただきたい。

 

音源部組み立てキット版

以後は音源部をキット化した半完成品を頒布する予定であるが、YM2612は各自調達が必要。音源ガチャでドロップした石を死蔵している方には最適かも? こちらも需要はあまり多くないと思うので少数で終息する予定。

似非P6ROMはどちらかというとP6寄りの設計で、MSXでの使用時に何かと制限があるため、主にP6での使用を想定しているユーザーにお求め頂ければ幸いである。

似非P6ROMの開発

MSXとPC-6001の類似性

MSXとPC-6001のシステムを眺めてみると、後発のMSXはPC-6001のシステムの一部を取り込んで設計されたと思われるような共通点が見えてくる。グラフィックキャラクターの配列が同じだったり、外部スロットの50pカードエッジコネクタのピン配列はVccやGNDの他、アドレス線とデータ線はまったく同じ配列になっている。

双方の50pカードエッジの信号配列は下記リンクで比較すると分かりやすい。

PC-6001 : https://electrelic.com/electrelic/node/517

MSX : https://electrelic.com/electrelic/node/516

表を一部引用させていただき、相違点を赤枠で括ってみた。

P6はカートリッジ上のDRAMが直で繋がるようになっていて、8000h~BFFFhのDRAM制御信号が1,3,5,10pに出ているが、MSXのDRAM関連信号は/RFSHのみ。

/CSxはROM用の信号で、MSXでは16kB単位、P6は8kB単位で区分けされている。いずれも当該アドレスのREADでアクティブになるが、MSXのROMには/SLTSLを絡める必要がある。

なお、初代P6とmkII以降では7,8,16pの役割が異なるようだが、MSXとの互換性を考える上ではあまり影響はなさそうである。

http://sbeach.seesaa.net/article/387861397.html

以上の相違点を理解すれば、MSXとP6のどちらでも使えるROMカートリッジが制作可能と思われた。

なお、MSXの/SLTSL信号 (4p)は、P6では/CS2(4000-5FFFh)になっており、この領域を使うP6のROMカートリッジであれば、特に細工をしなくてもMSXで吸い出しができそうに見える。更に、P6ROMの/CS2(2p)と/CS3(4p)を入れ替えてしまえば6000-7FFFhも吸い出せるだろう。


戦士のカートリッジ

P6用のカートリッジといえば、「TINYゼビウス」の伝説的プログラマ松島徹氏が2008年に新作ゲーム「特攻空母ベルーガ」を発表した際、これをROMカートリッジ化するためのMEGA-SYSTEM 6000 (戦士のカートリッジ)が西田ラヂオ氏によって設計されている。ソースはコチラ。

http://tulip-house.ddo.jp/digital/BELUGA/

回路図を引用:

MEGA SYSTEM 6000では、ROMは4000-5FFFhにマッピングされ、8kBx16バンクで容量は128kB、バンクレジスタはIO#70h(~7Fh)に置かれている。6000-BFFFhには拡張RAMが実装されていて、その内6000-7FFFhはREAD ONLYに設定できる(起動時は書き込み許可)。4000-7FFFhに擬似的なROMを置くことができるので、バンク0に起動メニューと転送プログラム、以後のバンクに既存のROMソフトのイメージを入れておけば、N in 1カートリッジを作ることもできそう。

ROMの/CSにはP6の/CS2が繋がっているが、このピンは都合の良いことにMSXでは/SLTSLにアサインされており、ROM領域だけならMSXからも読み取りできてしまいそう。ひょっとしたらMSXとP6両対応のメガROMカートリッジが作れるのでは?と思ったのが2020年7月の話である。


似非P6ROMの設計と試作

P6では「戦士のカートリッジ」、MSXではASCII 8k bankの「似非ROM」として機能するものができたら面白そうだし、ROMファイル書き込みに既存のソフトが流用できてオトクである。早速CPLDでロジックを錬成して基板を設計してみた。

P6はスロットが深いためこのような基板サイズになるが、スペースが余りまくりである。何か追加できないかと考えていたところ、秋葉原のFM音源ガチャでドロップした石があったことを思い出した。

せっかくなので、このFM音源(YM2612:OPN2)を追加してみることにした。OPN2ならDAC内蔵でお手軽だし、P6ならSRで採用されたYM2203(OPN)の後継チップなので相性もいいだろうと。

とりあえずオーディオ回路をテキトーに追加して2020年10月にできた試作基板がコチラ。IOアドレスはMSXのOPNAカートリッジ(Makoto)と同じ#14-17hに割り当て、VGMPlay for MSX 1.3をパッチしてOPNAを偽装したところ発音が確認できた。

P6実機でBELUGAが動作するか確認をしたかったため、TinyProjectのHashiさんにコンタクトを図ってみたり。その時のツイートがコチラ。

結果、両機種対応のMegaROMシステムとして想定どおりの動作を確認できた。しかし、音源部は無音時のノイズが目立ち、改修が必要。

もう一つの問題としては、OPN2の入手性。2020年の時点でOPN2は入手が難しくなっていて、Aliなんかだとほぼほぼフェイクだという情報が流れていた。試しに中華圏から取り寄せてみたところ、届いたのがコチラ(笑。

左下が音源ガチャのドロップ品でおそらく本物。それ以外は明らかなリマーク品。ただし、パッケージの形状は本物と変わらず、裏面にJAPANの凸モールドも確認できるのでフェイクとは断定し難い。ダメもとで似非P6ROMに挿してデータを流してみたら、なんと普通に鳴る石だった。どうやら本物の中古汚損品をリマークした「リファービッシュ品」と思われる。果たしてこれを製品に実装して頒布してよいものかどうか…。

以上の事情により音源付きでの製品化は困難と思われたのと、2020年は似非SDisk等の先行プロジェクトを優先させたため、似非P6ROMの開発はこのまま1年の塩漬けに…。(次回に続く)

ご注意

 似非P6ROMはP6でもMSXでも動作するように設計していますが、通常の戦士のカートリッジはMSXでは機能しません。それどころかROM/RAMでバスが競合が発生して故障の原因になるのでMSXに挿して電源を投入するのはやめましょう。