2014年05月10日

SRのVRAMについて(2)

  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のワークエリアにアクセスができないため。

  最後の☆の行に関しては、まだ調査中です。

posted by えすび at 20:44| Comment(9) | P6解析:画面周り | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
あちゃーすみません、先日のコメントは1と0が逆でしたね。
以前書いたプログラムを引っ張り出して確認したら、
直接アクセスする時はポートC8とワークエリアのED1DにEAを出力して、
終わったらE2を出力してました。
うろ覚えでコメントするものじゃないなあ…。
Posted by 秋川 at 2014年05月11日 15:36
あー、気にしないで下さい。
私もよく間違えていますので(^^;)

画面1で、ED1Dの値を見ると、0xEEなので、0の時にビットマップイネーブル(座標指定アクセス)だと思われます。
Posted by えすび at 2014年05月11日 21:44
質問なのですが、SR周りのポートのR/W可否ってどうなっているのでしょうか。
特に0xC8が知りたいです。
Posted by bookworm at 2014年06月18日 19:45
ポートのR/W可否、というのは、どういう意味でしょうか?
ポート機能の一覧という意味ですか?


ポート機能は、まだ調べて切れていません。
大体は、『Mr.PC Technical Collection』と同じです。
ディスク周りや音声合成周りとかは抜けていますが。

Posted by えすび at 2014年06月19日 07:55
一応、ポート0xC8に関して記しておきます。


ポート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に関しては、まだ未検証です。


Posted by えすび at 2014年06月19日 08:05
すみません分かりにくかったですね。
0xB0 のように書き込みオンリーで読み込み不可のような属性のつもりでした。
0xC8 でいうと bit0 や 1 を読んで、現在どんな状態にあるのかが分かるといいなと思ったのでした。
値を変更して書き戻すときなども、読めない場合はワークに保存しておく必要があったりしますね。
0xC8 についてだけでもご存じでしたらお願いします。
Posted by bookworm at 2014年06月19日 11:36
あー、リードバックが出来るかどうかですね。

0xC0〜0xCFは、リードバックが出来ません。0xFFが返ってくるだけです。

ちゃんと調べられていないのですが、SRでは、0x60〜0x6Fと、0xF0〜0xF8だけだと思います。

後は、繋がっている先のLSIでのリードバック(例えば、PSG/OPNのレジスタ0x00〜0x0Fなど)が可能なものもあります。
Posted by えすび at 2014年06月19日 13:54
↑誤
ちゃんと調べられていないのですが、SRでは、0x60〜0x6Fと、0xF0〜0xF8だけだと思います。


ちゃんと調べられていないのですが、SRでは、0x60〜0x6Fと、0xF0〜0xF8だけがリードバックが出来たと思います。

です。
Posted by えすび at 2014年06月19日 13:56
>0xC0〜0xCFは、リードバックが出来ません。0xFFが返ってくるだけです。
うーん、やはりそうでしたか。
素直にワークに保存したほうが良さそうですね。
ありがとうございました。
Posted by bookworm at 2014年06月19日 20:55
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。