いろいろ飛び交っているようなので(^^;)
1.初代機
垂直同期は普通では検出不可です。
ブログの前の記事では、サブCPUを使って無理やり検出してますが、実際にプログラムで使用するのにはちょっと難しいです。
2.mk2/66
垂直同期、水平同期は、PSGのジョイスティックポートから読み出す事が出来ます。
MODE1〜5のどのモードでも読み出せます。
; ジョイスティックポートにアクセスする
;
: レジスタ0x07(ミキサ)の上位2ビットを設定する(B:出力、A:入力)
; BASICではA、Bとも入力になっているため変更が必要
ld a,$07
out ($a0),a
ld a,$bf
out ($a1),a
; レジスタ0x0fに0xc0を出力(ジョイスティック1、8ピンに"L"を出力)
ld a,$0f
out ($a0),a
ld a,$c0
out ($a1),a
; レジスタ0x0eからジョイスティックポートを読み出す
ld a,$0e
out ($a0),a
in a,($a2)
この状態で、Aregには、
Areg[7-0]:垂直同期 水平同期 TRG2 TRG1 右 左 下 上
が返ってきます。
ただし...
検出できる垂直同期は、垂直帰線期間の始まりとかではなく、どちらかというと単なるタイミング信号です。
具体的には、画面走査線のカウンタ値で示すと以下の通りです。
画面走査線カウンタ(0〜261)
0〜 2:垂直同期="L"
3〜261:垂直同期="H"
37〜228:画面描画範囲
帰線期間のちょうど真ん中辺りのタイミングのため、ちょっと使いづらいです。
また、水平同期に関してはパルス幅が14MHzで64クロックしかなく、CPUからまともに検出する事が難しいです。
3.mk2SR/66SR
mk2/66と同じ手順で垂直同期、水平同期は、PSGのジョイスティックポートから読み出す事が出来ます。
MODE1〜6のどのモードでも読み出せます。
さらに垂直同期をトリガにした割り込みが使用できます。
ただし、あくまでも垂直同期で、垂直帰線期間の始まりとかではありません。

