SRのVRAMのアクセス関連がよく分からないので調べてみました。まだ途中ですが。
Mr.PC Technical Collection を参考にしているのですが、間違っている所もあるようです。
どうやったら、思っているモードの画面が表示されるのかがかなり分かり難いです。
I/Oポートの0xC0〜0xCFをアクセスすればよさそうなのですが、いまいちすっきりしません。また、BASICからI/Oポートにアクセスしても、VSYNC割り込みの時に変更されるので、挙動が分かりにくくなっています。
そこでプログラムを作ってみました。
srgraph.zip
サブCPU以外の割り込みを禁止して、0xC1〜0xCF にアクセスできるようにしています。
走らせると、0xC0〜0xCF に出力する値を入力すると、その値を出力します。
任意のキー(スペースキーがベスト)を元に戻ります。
事前に、0x0000〜0x7FFFにグラフィックデータをロードさせると、挙動が分かりやすいです。
Mr.PC Technical Collection でのI/Oポートの説明は以下の通りです。
ポート0xC1
bit7-4:1固定
bit3:1=横320ドット。0=横640ドット。
bit2:1=キャラクタモード。0=グラフィックモード。
bit1:1=40文字。0=80文字。
bit0:1=縦200ライン。0=縦204ライン。
ポート0xC8
bit7-5:1固定
bit4:ビットマップのページ指定。1=上位32K。0=下位32K。
bit3:1=ビットマップDisable。0=ビットマップEnable。
bit2:1=20行。0=25行。
bit1:1=バスリクエストOFF。0=バスリクエストON。
bit0:1=旧BASIC。0=SR-BASIC
ポート0xC9
bit7-4:0固定
bit3-0:VRAMアドレス指定(ページ1〜16)
これを動作ごとにまとめた結果が以下の通りです。
○キャラクタモードの場合
ポート0xC1 bit2=1にする。
画面サイズは、ポート0xC1 bit1 と、ポート0xC8 bit2 で決定する。
表示ページは、ポート0xC9 で決定する。
ポート0xC1 bit3、bit0 は、グラフィックモード用の設定のため、無関係になる。
ポート0xC8 bit0=0 に設定しておく必要あり(SR-BASICのため)
ポート0xC8 bit3=1 に設定しておく。
○グラフィックモードの場合
ポート0xC1 bit2=0にする。
画面サイズは、ポート0xC1 bit3 bit0 で決定する。
表示ページは、ポート0xC9 で決定する。ただし、bit2-0 は無視される。bit3=ページ番号となる。
ポート0xC1 bit1 と、ポート0xC8 bit2 は、キャラクタモード用の設定のため、無関係になる。
ポート0xC8 bit0=0 に設定しておく必要あり(SR-BASICのため)
☆ポート0xC8 bit3=0 にすると、ポート0xCE、ポート0xCFで座標アクセスが出来る。逆に直接アクセスができない。
☆座標アクセスの際は、ページ番号によりポート0xC8 bit4を変更する。通常は、下位32K(ページ0)。
☆ポート0xC8 bit3=1 、bit4=0 にした場合、通常環境では暴走する。これは、BASICのワークエリアにアクセスができないため。
最後の☆の行に関しては、まだ調査中です。


以前書いたプログラムを引っ張り出して確認したら、
直接アクセスする時はポートC8とワークエリアのED1DにEAを出力して、
終わったらE2を出力してました。
うろ覚えでコメントするものじゃないなあ…。
私もよく間違えていますので(^^;)
画面1で、ED1Dの値を見ると、0xEEなので、0の時にビットマップイネーブル(座標指定アクセス)だと思われます。
特に0xC8が知りたいです。
ポート機能の一覧という意味ですか?
ポート機能は、まだ調べて切れていません。
大体は、『Mr.PC Technical Collection』と同じです。
ディスク周りや音声合成周りとかは抜けていますが。
ポート0xC8(出力のみ)
bit7-5:未使用
bit4:ビットマップモードのアドレス指定(1:0x8000〜、0:0x0000〜)
bit3:ビットマップモード(座標指定モード)(1:Disable、0:Enable)
bit2:テキスト画面行数指定(1:20行、0:25行)
bit1:バスリクエスト(1:OFF、0:ON)
bit0:BASICモード(1:N66-BASIC、0:SR-BASIC)
bit1は、SR-BASICモード時は機能しません(SR-BASICモード時は、常にバスリクエストOFF)。
bit0は、かなり影響があるビットで、N66-BASICモードにした場合は特定のI/Oの挙動が変わったり
アクセスが出来なかったりします。このビットは独立にすべきですよねぇ。
bit4に関しては、まだ未検証です。
0xB0 のように書き込みオンリーで読み込み不可のような属性のつもりでした。
0xC8 でいうと bit0 や 1 を読んで、現在どんな状態にあるのかが分かるといいなと思ったのでした。
値を変更して書き戻すときなども、読めない場合はワークに保存しておく必要があったりしますね。
0xC8 についてだけでもご存じでしたらお願いします。
0xC0〜0xCFは、リードバックが出来ません。0xFFが返ってくるだけです。
ちゃんと調べられていないのですが、SRでは、0x60〜0x6Fと、0xF0〜0xF8だけだと思います。
後は、繋がっている先のLSIでのリードバック(例えば、PSG/OPNのレジスタ0x00〜0x0Fなど)が可能なものもあります。
ちゃんと調べられていないのですが、SRでは、0x60〜0x6Fと、0xF0〜0xF8だけだと思います。
正
ちゃんと調べられていないのですが、SRでは、0x60〜0x6Fと、0xF0〜0xF8だけがリードバックが出来たと思います。
です。
うーん、やはりそうでしたか。
素直にワークに保存したほうが良さそうですね。
ありがとうございました。