VSYNC FREQUENCY が 60.00Hz または 59.83.Hz では起動する.
read(6)と同時期にvceレジスタを操作していると思われる.
00] 00 00 00 00 00 00
disc #004B
DE.00]x01
DE.01]x01
DE.02]x02
08> 000E06 02->6280
08> 000E08 10->6280
DE.02]x01
08> 000E28 08->6280
08> 000E30 01->6280
08> 000E08 10->6280 と DE.02]x01 の間に address 0x1fe000 へ data 04, 01 の順に書かれている.
address 0x1fe000 に書かれる値は 01, 04, 05 である. 問題なのは bit2 の変更. この処理に従って vsync frequency を切り替えているがこれがかなり遅い.この問題は以前からあるが、重要度は低かったが、重要度が高くなるようにプログラムされているのは珍しい.
この問題は把握していていたが明文化していなかった.問題の対処方法は下記の2つ.
- 短期間に書かれる無意味な VCE レジスタの更新を無視する仕組みをつくる
- I2C の初期化を高速化する (もしくは別途処理が出来るハードウェア I2C 専用コントローラとかそれ専用のMCU)
回避方法は VSYNC FREQUENCY の設定を変えることがわかっている.
優先度は現状では低く、対処は先のため保留.
短期的な対処として VSYNC FREQUENCY が ORIGINAL でも動作できるパッチは提供できる.
720p 側の Vsync 周波数が original のときに VSync を変更するための MCU への割り込み条件を下記に変更.
(旧) 6280 から address 0x1fe400.w への書込み
(新) VCE の VSYNC = L のときに scanline / frame が変わったとき
このため MCU 内部の割り込みベクタの並べ替え、該当ソースの対応などファームウェア側で対処を増やした. また PCE を RESET したときの VSync の設定も下記へ変更した.
(旧) RESET から 6280 から address 0x1fe400.w への書込みの割り込み経由
(新) PCE RESET = H から一定時間経過後 scanline / frame count を取得
ゼロウイングの場合、xaddress 0x1fe400.w.2 = 0, (数命令) address 0x1fe400.w = 1 としていたので不必要な VSync の割り込みの発生が減り、動作が安定した.
放置していた激写ボーイの絵がでない問題もこれで改善する.