2018年12月02日

画面切り替えと垂直同期検出の件(画面がちらつく問題)

 P6でキャラ描画時にちらつく問題の続きです。

 ロジアナで確認しました。
 結論ですが、いろいろと間違いが発見されました。

○mk2
★ページ切り替え(ポート0xb0)に設定した値は、垂直同期がH→Lのタイミングで反映される。
★PSGのIOA7には、垂直同期が出力されている。
 1フレーム262ラインの内、3ラインが"L"、259ラインが"H"が出力されている。

○mk2SR
★ページ切り替え(ポート0xb0)に設定した値は、即時に反映される。
★OPNのIOA7には、帰線期間が出力されている(帰線期間は"H"、描画期間は"L")。
 1フレーム262ラインの内、192ラインが"L"、70ラインが"H"(MODE2)
 1フレーム262ラインの内、200ラインが"L"、62ラインが"H"(MODE5)


 調査していませんが、66/66SRも、mk2/mk2SRと同等だと思います。
 (カスタムLSIなどが同じなので)

 特に、SRのOPNから読み出せるのが、垂直同期ではなく、帰線期間だったというのは、ちょっとびっくりです。
 (確かにちゃんと調査してませんでしたが...)


以下、調査内容の詳細です。

こんなプログラムで調査してみました。


10 REM mode2/5,page4
20 FOR J=2 TO 4
30 SCREEN3,J,J:CLS:LINE(0,0)-(319,199),J,BF
40 NEXT
1000 GOSUB 9000
1010 EXEC &HDF00
9000 AD=&HDF00
9010 READA$:IF A$="**" THEN RETURN
9020 POKEAD,VAL("&H"+A$):AD=AD+1:GOTO 9010
10100 DATAf3,31,00,df,21,e8,03,cd,2a,df,3e,00,d3,91,3e,f0
10110 DATAd3,b0,3e,ff,d3,91,21,e8,03,cd,2a,df,3e,00,d3,91
10120 DATA3e,f6,d3,b0,3e,ff,d3,91,18,da,3e,78,3d,20,fd,2b
10130 DATA7c,b5,20,f6,c9
10140 DATA**


マシン語の内容は以下の通りです。


org $df00

di
ld sp,$df00
MAINLOOP;
ld hl,1000
call W_TIME

ld a,$00
out ($91),a ; プリンタポートへ出力(デバッグ用)

ld a,$f0 ; $c000〜を表示(MODE 1-4時)SCREEN,3
; $8000〜を表示(MODE 5時)SCREEN,2
out ($b0),a

ld a,$ff
out ($91),a ; プリンタポートへ出力(デバッグ用)

ld hl,1000
call W_TIME

ld a,$00
out ($91),a ; プリンタポートへ出力(デバッグ用)

ld a,$f6 ; $a000〜を表示(MODE 1-4時)SCREEN,4
; $4000〜を表示(MODE 5時)SCREEN,3
out ($b0),a

ld a,$ff
out ($91),a ; プリンタポートへ出力(デバッグ用)

jr MAINLOOP

;
; 時間待ち(大体 2ms × HL)
;
W_TIME:
.lp1: ld a,$78
.lp2: dec a
jr nz,.lp2

dec hl
ld a,h
or l
jr nz,.lp1
ret



 プログラムは単純に違うページに違う色を付けて、ページを切り替えているだけのものです。

 ロジアナで確認したものが以下の通りです。
 信号は上から、
 トリガ(プリンタポート)
 PSG/OPNのIOA7(PSG/OPNから読み出せる値)
 VSYNC(バッファ後、外部に出力されているもの)
 HSYNC(バッファ後、外部に出力されているもの)
 R(バッファ後、外部に出力されているもの)
 G(バッファ後、外部に出力されているもの)
 B(バッファ後、外部に出力されているもの)
 H(バッファ後、外部に出力されているもの)
 です。

181202_01_mk2_mode2_1.png
 mk2 MODE2

181202_01_mk2_mode5_1.png
 mk2 MODE5


 mk2の場合、描画範囲では、MODE2/MODE5とも、すぐには画面が切り替えられずに、次のフレームで切り替わっています。

181202_01_mk2sr_mode2_1.png
 mk2SR MODE2

181202_01_mk2sr_mode5_1.png
 mk2SR MODE5


 mk2SRの場合、描画範囲では、MODE2/MODE5とも、すぐに画面が切り替わっています。
 さらに、IOA7が描画範囲では"L"になっているのが分かると思います。


 さらに、VSYNCの前後で、画面を切り替えた時に、どこで反映されるかを確認しました。

181202_01_mk2_mode2_2.png
 mk2 MODE2 VSYNC後

181202_01_mk2_mode5_2.png
 mk2 MODE5 VSYNC後

 VSYNCの後に画面切り替えを指示した場合、その次のフレームで画面が切り替わっています。


181202_01_mk2_mode2_3.png
 mk2 MODE2 VSYNC前

181202_01_mk2_mode2_3.png
 mk2 MODE5 VSYNC前


 VSYNCの前に画面切り替えを指示した場合、VSYNCを跨いだ次のフレームで画面が切り替わっています。
posted by えすび at 22:56| Comment(0) | P6解析:画面周り | このブログの読者になる | 更新情報をチェックする