← ジョン・ドウ レポート
ドラゴンクエスト · スクロール改善

MSX版ドラゴンクエスト・ドラゴンクエストII スクロール改善 報告書

MSX2 版のドラゴンクエストII は、フィールドや町のスクロールがファミコン版より明らかにぎこちない。V9958(MSX2+、turbo R)の横スクロール機能を使って、これを1ドットずつの滑らかなスクロールにできないかを調べ、パッチにした。ドラゴンクエスト(以下 DQ1)は、その練習として先に手がけた。あわせて、V9968 への対応と、歩き出しなどの操作の反応も改善した。

1. 元の MSX2 版のスクロール

1.1 動き方

版1歩の動き1歩にかかる時間
ファミコン版 DQ11ドットずつ16フレーム(Mesen で実測)
MSX2 版 DQ11歩ごとに画面全体を VDP のコピーで1マス分一度に動かす約10フレーム
MSX2 版 DQ2半歩(8ドット)ごとに、画面を裏のページに8ドットずつ写し、新しい列を描いて表示ページを切り替える25〜28フレーム(半歩 約13フレーム)

DQ2 は、動きが8ドット単位でカクカクするうえ、1歩がファミコン版より大幅に遅い。

1.2 遅さの理由

移植者の川俣晶氏の著書「ENIX移植プログラマー戦記」によると、ファミコン(6502)から MSX(Z80)への移植は「基本的にソースコードは書き換えない、その代わり、マクロを用意して6502の命令をZ80の命令郡に置き換えてしまう」方法で行われ、「懸念事項はサイズと速度と互換性の3点だ」とされている。

ROM を読むと、実際にゲームの大部分は、6502 の命令1つごとに補助ルーチンを呼ぶ形になっていた(X レジスタを B、Y レジスタを C に当て、補助ルーチンの写しが各バンクにある)。容量は抑えられるが、命令ごとに呼び出しと戻りが入るので遅い。スクロールを滑らかにしても、一歩ごとのゲームの処理が間に合わず、引っかかりとして見える。速度の改善はここが中心になった。

2. DQ1(練習)

エミュレータ(openMSX)でのみ確認しており、実機ではまだ確かめていない。

3. DQ2 のスクロール

3.1 仕組み

3.2 速さ

改善内容効果(エミュレータでの測定)
補助ルーチンの置き換え6502 の命令をまねる補助ルーチンの呼び出し約 3,100 か所を、同じ働きの Z80 命令に直接置き換え町の中の一歩ごとの引っかかりが減る
NPC の移動処理NPC の位置・向き・ぶつかり判定の処理を Z80 で書き直し。元の処理と呼び出しごとに突き合わせて差がないことを確認町を40秒歩いたとき、NPC の処理が全体の 16.1% → 9.2%。1フレーム以上待たされた回数 30回 → 3回
混雑時の処理5人以上並んだときに隠す人を選ぶ処理を高速化(結果は変えない)その処理が約15% → 約6%
窓窓の表示・消去で描き直す部品の処理を高速化コマンド窓とステータス窓の表示 約48 → 約32フレーム
R800 版turbo R では最初の一歩から R800 で動かす町での引っかかりがなくなる

3.3 操作の反応

4. V9968 への対応

V9968 は HRA! 氏が FPGA で作った V9958 上位互換の VDP で、カートリッジ版は I/O 88h で使う。

5. 高速モード

6. 元の ROM の版

MSX2 版ドラゴンクエストII には、3 種類の吸い出しが知られている。違いは 2〜3 か所で、そのうちの1つ([568] と呼ばれるもの)だけ、効果音を鳴らし始める処理の誤り(足し算に使うレジスタの取り違え。ROM のバンク切り替えのレジスタに 0 を書いていた)が直っていた。ほかの版との違いがすべて「1 のビットを 0 にした」形であることなどから、これを最後の修正版とみなし、パッチはどの版から当てても、この版と同じ中身にそろえてから改造する。

7. パッチプログラム

配布するのは、Python で書いたパッチプログラム1本(DQ1・DQ2 それぞれ)。

8. 確認

項目確認
DQ2 の滑らかなスクロール、NPC、混雑時の点滅実機 turbo R(Z80・R800)、openMSX
DQ2 の V9968(カートリッジ)実機 V9968 カートリッジ(Z80・R800)
DQ2 の V9968 内蔵、MSX1 + V9968openMSX のみ(V9968 内蔵の機種は、VDP を V9968 にした試験用の機種設定)
DQ2 の Panasonic の高速モード実機(3倍速改造機)、openMSX FS-A1WX
DQ2 の V9938 での元の動きopenMSX(C-BIOS MSX2)
DQ1openMSX のみ