1chipMSXとドラゴンクエスト22017年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番目のスプライト番号

んで、bit6=1になる条件を調べていたら、MRCのWikiTMS9918のデータシートに興味深い記述があった。
以下は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;

※REQ_VSYNC_INT_Nは真偽値逆転しているので、割り込み発生時に0。

これでビルドしたところ、ドラゴンクエスト2のタイトル画面の画像乱れはなくなった。
あと、ついでに10MHzにクロックアップした際のキャラクタのちらつきもなくなった。

この修正を含めた1chipNextorMSXのVer1.0.3は週末にアップ予定。

1chipMSXにROMディスク その32017年01月26日 23:54

内蔵BIOSにROMディスクを含めると一気にサイズが大きくなる。
大きくなりすぎて圧縮後サイズが256KB超えてしまい2+のBIOSを含めることができなくなった。

対処方法としてKDLさんの所でやっているようにEPCSの開始アドレスを&h4000hから&h34000hに変更。
これで圧縮後304KBまでのBIOSを内蔵できる。

あと、DIPSW5をOFFにするとSDだけでなくROMDISKも無効になる。
いろいろできるようにROMDISKだけを無効にするとか実装できないかな?

ちょっと考えてみよう。