1chipMSXとドラゴンクエスト2 ― 2017年01月26日 22:22
れふてぃさんから新しい宿題をもらった。
お題は「1chipMSXでMSX2版のドラゴンクエスト2を実行するとタイトル画面の画像が崩れる」という現象。
どうもこれは1chipMSX、というより似非PLDシステムの頃からの問題の様で、1chipMSXのVDPの開発者のKuniさんのサイトにあるVDPソースに含まれている開発メモにも記述がある。
そのメモには原因まで書かれていて、
ステータスレジスタ#0のbit6、第5スプライト判定ビットが1になるタイミングの問題らしい。
また、暫定処置としてbit6を常に'0'になるようにすることで画面崩れがなくなるという記述もあった。
ステータスレジスタ#0の内容は以下の通り。
┏━━┯━━┯━━┯━━┯━━┯━━┯━━┯━━┓
┃bit7│bit6│bit5│bit4│bit3│bit2│bit1│bit0┃
┣━━┿━━┿━━┿━━┷━━┷━━┷━━┷━━┫
S#0┃ F │5S│ C │ 5th sprite ┃
┗━━┷━━┷━━┷━━━━━━━━━━━━━━┛
F : 垂直帰線割り込みフラグ
垂直帰線割り込みが発生
S#0を読むとリセットされる
5S : 第5スプライトフラグ
スプライトが5個(9個)並ぶとセット
C : 衝突フラグ
スプライトが衝突するとセット
5th sprite : 5番目のスプライト番号
以下はMRCのステータスレジスタbit6の説明
* Set to 1 when the F flag is equal to 0 and there are more than 4 or 8 sprites aligned on the same horizontal line
ステータスレジスタのbit6が1になるのはbit7が0、つまり割り込みが発生しておらず、かつ規定数以上スプライトが横並びになった場合とのこと。
以上まで調べがついたところで、1chipMSXのソースを眺めてみると、bit6のオンオフにbit7の値が関与している形跡がなかった。
そこで、ソースを以下のように修正した。
(対象はHRA!氏のemsx_top_20080511_001のvdp_register.vhd)
DBI <= (NOT REQ_VSYNC_INT_N) & VDPS0SPOVERMAPPED & VDPS0SPCOLLISIONINCIDENCE & VDPS0SPOVERMAPPEDNUM;
↓
DBI <= (NOT REQ_VSYNC_INT_N) & (VDPS0SPOVERMAPPED AND REQ_VSYNC_INT_N) & VDPS0SPCOLLISIONINCIDENCE & VDPS0SPOVERMAPPEDNUM;
↓
DBI <= (NOT REQ_VSYNC_INT_N) & (VDPS0SPOVERMAPPED AND REQ_VSYNC_INT_N) & VDPS0SPCOLLISIONINCIDENCE & VDPS0SPOVERMAPPEDNUM;
※REQ_VSYNC_INT_Nは真偽値逆転しているので、割り込み発生時に0。
これでビルドしたところ、ドラゴンクエスト2のタイトル画面の画像乱れはなくなった。
あと、ついでに10MHzにクロックアップした際のキャラクタのちらつきもなくなった。
この修正を含めた1chipNextorMSXのVer1.0.3は週末にアップ予定。
1chipMSXにROMディスク その3 ― 2017年01月26日 23:54
内蔵BIOSにROMディスクを含めると一気にサイズが大きくなる。
大きくなりすぎて圧縮後サイズが256KB超えてしまい2+のBIOSを含めることができなくなった。
対処方法としてKDLさんの所でやっているようにEPCSの開始アドレスを&h4000hから&h34000hに変更。
これで圧縮後304KBまでのBIOSを内蔵できる。
あと、DIPSW5をOFFにするとSDだけでなくROMDISKも無効になる。
いろいろできるようにROMDISKだけを無効にするとか実装できないかな?
ちょっと考えてみよう。
最近のコメント