[1chipMSX改]

V9958調査資料 〜VRAMアクセス〜

CPUからVRAMへ読み書きアクセスをする場合、VDPを経由してVRAM用のDRAMへアクセスすることになる。
そのコマンドが、port#1 に対して、アドレス下位・上位の順で書き込んだ後に port#0 を読み書きする
シーケンスになっている。
port#0 を「読む」「書く」という区別はできるのに、なぜか「アドレス上位」の指定のときに bit6 で
読み書きのどちらを希望するか指定するようになっている。
では、書き込みと指定しておいて読み込んだらどうなるのか?
読み込みと指定しておいて書き込んだらどうなるのか?

まず、読み込みと指定しておいて書き込んでみるテストプログラムを作成してみた。

テストプログラム

このテストプログラムは、下記のシーケンスで処理する。

(1) SCREEN1 にする (2) VRAM書き込みモードとして 1800h(パターンネームテーブル) を指定する
(3) "ABCDEFGHIJ" を書き込む
(4) VRAM読み込みモードとして 1800h を指定する
(5) 1byte 読み込む
(6) "abcdefghij" を書き込む

FS-A1STで実行してみた結果、表示されたのは「ABabcdefghij」だった。

もし、読み込みと書き込みで独立したアドレスポインタレジスタを持っているなら「ABCDEFGHIJabcdefghij」と
表示されるべきだが、そうなっていないため、独立しているわけではなさそうだ。
かといって、もしアドレス設定時の「読み込み」「書き込み」の指定自体が無意味だとすると、
「Aabcdefghij」と表示されるべきだが、そうなっていないため、読み込みモードと書き込みモードで、
インクリメントのタイミングが異なっているのは確かなようだ。

ちなみに、オリジナルの 1chipMSX で動かしてみると、FS-A1STと同じ表示が得られた。
一方で、BlueMSX 2.7 で動かしてみたところ「AB bcdefghij」と、若干異なる表示になった。

いわゆる Don'tcare の挙動部分にあたるが、もしかすると制作者の意図に反して、この挙動に助けられている
バグありソフトが無いとも限らないし、意図的に利用している人もいる可能性もあるので、この部分の挙動も含めて
再現する回路を作るのが望ましいだろう。

[▲上へ]