PC-6001で垂直同期が取れるのか。
それを調べるため、DMA ON/OFFを繰り返したときにどうなるのか、試してみました。 プログラムは以下のようなものを使いました。 WAITの影響を少なくするため、RAMで動作させます。
di loop: ld a, #0x02 out (#0x93), a call wait ld a, #0x03 out (#0x93), a call wait jp loop ;; T-state: 2840(incl. call) wait: ld hl, #100 wait_loop: dec hl ld a, h or l jp nz, wait_loop ret
実行の全体像は以下の図のようになります。
記録時間を長くするため、記録周期を粗くしている(1MHz)ので、CLKやM1、WAITは信号ドロップにより不正確です。
気にしないでください。
BUSREQ/BUSACKのみ見てください。
この図で、A-B区間は垂直帰線と推測されます。
赤くなっている部分は、H/Lが細かい周期で繰り返されている箇所です。
水平帰線によりH/Lを繰り返しているのでしょう。
これは、赤い部分に挟まれた短いHの期間をズームしたものです。 ここはDMA OFFでwaitを実行している部分でしょう。 A-Bの時間(727us)は、DMA OFF時のの論理実行時間(約720us)にきわめて近くなっており、予測は正しそうです。
さらに、赤い部分(H/Lが密で、水平帰線を繰り返している部分)のズームです。 本当なら水平線の本数は192本あり、その分のLを繰り返すはずが、ここでは32本分しかありません。 Bの部分でDMA OFFにしているためです。
少なくともここで言えるのは、「ポート0x93のコントロールによるVDGのDMAのON/OFFは垂直帰線に同期しているわけではない」ということです。
残念ながら。
さらに調べると、この計測における一つの水平帰線(BUSACK=L)の時間は40~41usなのですが、DMA ON直後のBUSACK=Lの時間(上図でAから始まるBUSACK=L部分)はそれより短い(21~25usくらい)という結果でした。逆に、DMA OFF直前のBUSACK=Lの時間(上図Bで終わる部分)は41usになっています。垂直帰線によるBUSACK=Hが終わった直後のBUSACK=L(最初の図のBの直後)もおよそ41usです。すなわち、DMA OFFからONにした直後のみDMAが占有する時間が少ないことになります。
これが何を意味するのかはまだよくわかりません。
もう少し考察が必要ですね。また、何か別の方法も考えねば...。

検証していただいてありがとうございます。
>ポート0x93のコントロールによるVDGのDMAのON/OFFは垂直帰線に同期しているわけではない
うーむ、残念です。
あとタイミングっぽいので考えられるのは、アトリビュート書き込みでの
スクリーンモード切替とか0xB0ポートでのページ切り替えとかでしょうけれど、
こちらも期待できなさそうですね。
昔現役で弄っていた頃に実験してうまくいかなかったような記憶が…。
おとなしくニコニコ動画の前で正座してPCM同期再生を待つことにします。
この結果を見るに、6847の割込みはかなり強引というか、調停回路のようなものはないみたいですね。
> おとなしくニコニコ動画の前で正座してPCM同期再生を待つことにします。
ええぇえぇ?
> ここでは32本分しかありません
このテストを行ったときの画面モードは、いわゆるBASICの画面モード1だったのでは
ないでしょうか。この場合、必要なVRAM情報のバイト数は32x16程度なので、
その分のRAMアクセス分しかBUSREQが発生しなかったのではないかと。
確かに今見ると、そんな気もします。
さらに、最初にDMA OFFとしていた部分の実行時間は727usではなく、727msなので、これはおかしいですね。
すると、DMA OFF時の信号はどうなっているのだろう...。