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は週末にアップ予定。

コメント

_ れふてぃ ― 2017年01月27日 00:01

さすがというか、早すぎです!
魚の小骨のように気になっていた問題がどんどん解決してすっきりしました。ありがとうございました。

_ ゆうくん ― 2017年01月27日 22:39

ありがとうございます。

ただ、今回の修正は偶然の力にすさまじく助けられました。
特に、開発メモの存在に気が付かなかったらまだまだ右往左往していたと思います。
っていうか、早々にあきらめてたハズ・・・

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
答えは「MSX」です。

コメント:

トラックバック

このエントリのトラックバックURL: http://miyako.asablo.jp/blog/2017/01/26/8335083/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。