調査した所、以下の通りでした(以下、グラフィック画面のみの話です)。
表示切替は、ポート0xC9に、0x00/0x08 を出力します。
0x00を出力した場合は、0x0000〜0x7FFFのVRAMの内容が表示されます。
0x08を出力した場合は、
(グラフィックの場合は、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


これ,あとの文のつながりからすると,8000〜FFFF でしょうか。
だとすると,A000- にプログラムを置いて実行するというのがよく理解できません。
66SR の 64KB RAM の前半 32KB がページ0になって,後半がページ1になるってことですよね?
(修正しました)
>>だとすると,A000- にプログラムを置いて実行するというのがよく理解できません。
>>66SR の 64KB RAM の前半 32KB がページ0になって,後半がページ1になるってことですよね?
プログラムを0xA000〜に置くので、そのプログラムが画面データとして、そのまま表示されます。
実際にプログラムとして使用したい場合は、拡張RAMが必要になります。
もしくは、0x7E00〜0x7FFF、0xFE00〜0xFFFFにプログラム、スタックを置いて、ビットマップモードを使わない、という方法もなくはないですが...
オープニング/エンディングでは、元のプログラムで仮想VRAMを使っているため、ちらつきがかなり抑えられているためです。
そしてカートリッジ スロットに挿した外部 ROM RAM 部分は VRAM として使うことはできない,という話を聞いたことがあります。
たとえば,プログラムは外部 ROM RAM に置いて,バンク切り替え操作を,READ:外部(プログラム) WRITE:内部(VRAM),スタックとワーク エリアは 0x7E00〜0x7FFF と 0xFE00〜0xFFFF って感じでしょうか。(自己書き換えできない)
> あ、ハイドライド3では、2画面切換は使っていません。
見られているッ!!
画面に書き込む時だけ、バンク切換を行うようにします。
参考まで、だーいぶ前に作ったプログラムをこの記事に追記しておきます。
ポート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を判定していましたが
これが間違いだったのですね。
画面切換(3)の方のプログラムも参考にして下さい。
今のバージョンでは、明らかに動作が違います。
エミュレータでは、波打っているような動作(書き換えするのが見えてしまっている)のが、綺麗に動作します。