P6系の機種は、周知の通り、PC-6001、PC-6001mk2、PC-6601、PC-6001mk2SR、PC-6601SR と5種類ありますが、それらを同じプログラムで判別する必要がある場合があります。
一番手っ取り早いのはROMを読む事ですが、これはいろいろと問題がある場合があるので、通常は他の方法で行います。
今回は、以下のように判別しました。
初代機とそれ以外:ポート0xF6 が存在するかどうか?
mk2と66:ディスク用のバッファが存在するかどうか?
mk2SRと66SR:ディスク用のバッファが存在するかどうか?
SRとそれ以外:ポート0xA3 から値が読めるか?
初代機とそれ以外はいろいろと違うのですが、SR でモードによらずに読み書きが可能で、値を変更してもあまり影響がないポート0xF6(タイマ割り込みのタイマ値)を使っています。
mk2と66、mk2SRと66SRの判別は、全く同じものです。ディスク用バッファはディスクを内蔵側にした時に、ポート0xD0からアクセスが出来ます。
SRとそれ以外には、AY-3-8910とYM-2203 の違いを利用しています。ポート0xA3から値を何回か読み込んで、0xFF以外の値が返ってきたらSRと判断しています。AY-3-8910(非SR)の場合は、0xA3 が常に0xFFになります。
SR のI/O ポートはやっかいで、SR モードかそうでないかで、アクセスが出来たり出来なかったりするので、常にアクセスが出来るポートを選んでいます。
↓プログラムはコレです。
kishu.zip
〜.p6 ファイルが2つありますが、これはSRの中間コードが違うためです。
動作モード、ページに関係なく動作します。ただし、検証が甘いため、プログラムのアドレスが、ワークエリアに重なっているかも知れません。その場合は適宜変更して下さい。
用意されていて、判別のためのBIOSエントリ(01AAH)も
あったりしますが、これは何を見て判別しているんでしょう?
やっぱり内蔵FDD IFの有無あたりを見てるのかもです。
さっそく参考にさせていただきます。
こういうものを1つ作っておくと何かと便利ですよね。
ウェイトとかR/Wの可否とかタイミングはもう完璧なんでしょうか>FPGA
となるとI/Oか、実機には載せられないところに拡張メモリを積むとか。
いずれにせよ区別しただけで終わらない、出来ることが増えるのが理想ですね。
↓の記事を読むとアクセラレータが載りそうな気配ですが(^^;
ポート0xB2 で判別するのは、SRモード以外は大丈夫かどうか分からなかったので、とりあえずディスク用バッファで判別ルーチンを組みました。
後で調べましたが、SRモードでも66モードでも、ポート0xB2は読み出せるので、mk2SRと66SRの判別に使えます。
また、判別の方法ですが、多分I/Oコントロールの入力ピンの一部の接続が違うのだと思います(例えば、あるピンがmk2SR:GND/66SR:VCCなど)。単にそのデータをI/Oポートに反映させているだけじゃないかと思います。回路図を見てないので、何とも言えませんが...
>>ウェイトとかR/Wの可否とかタイミングはもう完璧なんでしょうか>FPGA
多分、この違いで機種判定をする、という意味だと思うんですが、そういう意味では、実機と同じになっているはずです。
正確には、ROM領域でも、RAM領域でも、NoWait で動いてしまうのが実機と違う所です。ウエイトをM1サイクルのみ1ウエイトにして、ROM領域を正常に読み込めるかどうかで判別できるかも...
アクセラレータ(というか動画再生カートリッジ)の話は...6月のオフに間に合うかな?