2018年04月06日

P6SRの2画面切換(2)

  P6SRのグラフィック2画面切換について。

  調査した所、以下の通りでした(以下、グラフィック画面のみの話です)。


  表示切替は、ポート0xC9に、0x00/0x08 を出力します。
  0x00を出力した場合は、0x0000〜0x7FFFのVRAMの内容が表示されます。
  0x08を出力した場合は、0x0000〜0x7FFF0x8000-0xFFFFのVRAMの内容が表示されます。
  (グラフィックの場合は、bit3のみ意味を持ちます) 


  ポート0xC8のbit4-3は、以下の通りですが、画面表示には関係ありません。
  bit4:グラフィック表示ページ(0:ページ0(0x0000〜0x7FFF)/1:ページ1(0x8000〜0xFFFF))
  bit3:ビットマップモード(0:イネーブル/1:ディセーブル(直接アクセスモード))


  ポート0xC8のbit4-3は、CPUからVRAMにアクセスする際に有効となるビットで、画面表示には関係がないんですね。この辺りが、今のエミュレータでは正確に対応できていません。



  上記のことですが、画面周りのポートはBASICで管理されているので、BASICから確認するのはちょっと面倒です。例えば、以下のようにします。

 1)コマンドラインから、SCREEN 2,2,2:LINE(0,0)-(319,199),16 とします。BASICでいうページ2に斜め線が1本引かれます。

 2)MON で、マシン語モニタに入って、0xA000〜から以下の設定をします(SA000 space で入力できます)。

A000:F3 3E FB D3 C3 3E 08 D3 C9 18 FE

 3)B でBASICで戻った後、EXEC &HA000 でさっきと違うグラフィックページが表示されるはずです。

  ちなみに表示されているのは、0x8000〜0xFFFFのページです。
  実行後は、BASICに戻ってこないので、リセットして下さい(0xA000〜の内容は残っています)。

  0xA007 の 08 を 00 にすると、0x0000〜0x7FFFのページが表示されます。




 2018-04-08:追記です。

 参考までに2画面切換のプログラムを置いておきます。
 P6SRに、16K以上の拡張RAMが必要です。また、今のところ、エミュレータでは正常に動作しません。

 CLOAD、RUNすると、○がカーソルで動かせます。
 画面をクリアしていないのは、2画面切換をしている事が分かるように、です。

180406_01_sc2demo.zip

posted by えすび at 22:58| Comment(8) | P6解析:画面周り | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
> 0x08を出力した場合は、0x0000〜0x7FFFのVRAMの内容が表示されます。

これ,あとの文のつながりからすると,8000〜FFFF でしょうか。
だとすると,A000- にプログラムを置いて実行するというのがよく理解できません。
66SR の 64KB RAM の前半 32KB がページ0になって,後半がページ1になるってことですよね?
Posted by Ackieee at 2018年04月07日 12:37
0x08を出力した場合は、0x8000-0xFFFFが表示されます
(修正しました)

>>だとすると,A000- にプログラムを置いて実行するというのがよく理解できません。
>>66SR の 64KB RAM の前半 32KB がページ0になって,後半がページ1になるってことですよね?


プログラムを0xA000〜に置くので、そのプログラムが画面データとして、そのまま表示されます。

実際にプログラムとして使用したい場合は、拡張RAMが必要になります。


もしくは、0x7E00〜0x7FFF、0xFE00〜0xFFFFにプログラム、スタックを置いて、ビットマップモードを使わない、という方法もなくはないですが...

Posted by えすび at 2018年04月07日 12:52
あ、ハイドライド3では、2画面切換は使っていません。

オープニング/エンディングでは、元のプログラムで仮想VRAMを使っているため、ちらつきがかなり抑えられているためです。

Posted by えすび at 2018年04月07日 14:31
なるほど,SR のモード6で,2画面でダブルバッファリングをやろうとしたら,0x7E00〜0x7FFF と 0xFE00〜0xFFFF の 512バイト x 2箇所以外はすべて VRAM になっちゃうわけですね (直接アクセス モード時) 。
そしてカートリッジ スロットに挿した外部 ROM RAM 部分は VRAM として使うことはできない,という話を聞いたことがあります。
Posted by Ackieee at 2018年04月08日 00:58
もしそうだとしたときのプログラムの置き場ですが,どうするのがいいんでしょうか。
たとえば,プログラムは外部 ROM RAM に置いて,バンク切り替え操作を,READ:外部(プログラム) WRITE:内部(VRAM),スタックとワーク エリアは 0x7E00〜0x7FFF と 0xFE00〜0xFFFF って感じでしょうか。(自己書き換えできない)

> あ、ハイドライド3では、2画面切換は使っていません。

見られているッ!!
Posted by Ackieee at 2018年04月08日 00:59
外部RAMが使用できるのであれば、プログラム、スタック、割り込みなど、全部外部RAMにするのが一番簡単です。

画面に書き込む時だけ、バンク切換を行うようにします。

参考まで、だーいぶ前に作ったプログラムをこの記事に追記しておきます。

Posted by えすび at 2018年04月08日 01:22
情報ありがとうございます。
ポート0xC9はてっきりテキストVRAMだけに適用されると思い込んでいました。
という訳でP6Vの場合,vdg.cppのVDG64::GetVramAddr()を下記のように直すとちゃんと表示されるようです。(実機確認していないですが...)

これを↓
---------------------------------------------------
if( CharMode ) return (WORD)SRTextAddr<<12;
else return (SRBMPage ? 0x8000 : 0x0000);
---------------------------------------------------
こう↓
---------------------------------------------------
return (WORD)(SRTextAddr & (CharMode ? 0x0f : 0x08))<<12;
---------------------------------------------------

SRBMPage = ポート0xC8のbit4で表示VRAMを判定していましたが
これが間違いだったのですね。
Posted by ゆみたろ at 2018年04月08日 23:11
今のところ、2画面を使っているソフトはないと思いますので、影響はないかと思います(^^;)

画面切換(3)の方のプログラムも参考にして下さい。
今のバージョンでは、明らかに動作が違います。

エミュレータでは、波打っているような動作(書き換えするのが見えてしまっている)のが、綺麗に動作します。

Posted by えすび at 2018年04月08日 23:57
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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

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