← ジョン・ドウ レポート
ドラゴンクエスト · 調査報告

MSX版ドラゴンクエスト・ドラゴンクエストII 隠しキー操作 調査報告書

MSX版のドラゴンクエスト(以下 DQ1)とドラゴンクエストII(以下 DQ2)で、ゲームがキーボードのどのキーを読んでいるかを、プログラムを読んで全部洗い出した。そのうえで雑誌に載っていた隠し技を確かめた。記事どおりのもの、記事とは違う仕組みで起きていたもの、記事に載っていない隠しモードが見つかった。

調査のきっかけは、DQ2 を MSX に移植した川俣晶氏の著書「ENIX移植プログラマー戦記」にある、移植のときに「ENIXにもナイショの追加機能」を2つ入れた、という話である。中身は明かされておらず、どちらも過去にゲーム情報誌などで一度は知られた情報だという。よく知られた DQ2 の隠し機能は、MSX1版の「あぶない水着」のグラフィックと、仲間の名前を変える操作(§4.1)だが、後者はファミコン版にもあるので、MSX版で加えた機能かどうか怪しい。そこで、キー操作から洗い出すことにした(DQ1 はついでに調べた)。

1. 調査の範囲と方法

1.1 対象

略称ROM容量
DQ1 MSX1版ドラゴンクエスト(MSX1/2両用)128KB
DQ1 MSX2版ドラゴンクエスト(MSX2専用)128KB
DQ2 MSX1版ドラゴンクエストII(MSX1/2両用)256KB
DQ2 MSX2版ドラゴンクエストII(MSX2専用)256KB

確かめた隠し技は、徳間書店「ゲーム十字軍 Vol.2」108ページに載っているもののうち、次の3つ。

1.2 方法

  1. 4本の ROM の全バンクから、キーボードを読む処理を探した。BIOS の SNSMAT(0141h)の呼び出し、BIOS のキーバッファ(NEWKEY など)の参照、キーボード用 PPI(ポート A9h・AAh)の直接入出力、CHGET などのキー入力ルーチンの呼び出しが対象。
  2. 見つかった読み取り処理から、読んだ結果を入れる変数を特定し、その変数を判定している箇所をすべて逆アセンブルして読んだ。
  3. 必要なものは openMSX(Panasonic FS-A1ST)で実際に動かして確かめた。ブレークポイントで読まれたキーの行や乱数の値を記録し、画面を撮って結果を比べた。

2. キーボードの読み方

2.1 DQ1

MSX1版・MSX2版とも、キー入力のルーチンは1つで、次のキーだけを読む。読んだ結果はボタンのビットにまとめて変数 C047h に入れる。

ビット意味キー
10h上カーソル上、テンキー8、ジョイスティック
20h下カーソル下、テンキー2、ジョイスティック
40h左カーソル左、テンキー4、ジョイスティック
80h右カーソル右、テンキー6、ジョイスティック
0Dh決定スペース、RETURN、トリガA
02h取消SHIFT、トリガB

キーボードの行で言うと、行6(SHIFT)・行7(RETURN)・行8(スペースとカーソル)・行9と行10(テンキー)だけを読む。C047h の判定はすべてビット単位で、「AとBを同時に押す」のような組み合わせを比べる箇所はない。

これとは別に、MSX1版だけ、起動時に一度だけ行7を直接読む箇所がある(§3.1)。

2.2 DQ2

MSX1版・MSX2版とも同じルーチン(バンク30)で、行5〜行10を読み、変数 E02Fh に入れる。DQ1 と違って SELECT と STOP を独立したビットとして読む。

ビット意味キー
01h決定スペース、RETURN、X、トリガA
02h取消SHIFT、ESC、Z、トリガB
04hSELECTSELECT
08hSTOPSTOP
10h〜80h上・下・左・右カーソル、テンキー、ジョイスティック

このビットの並びは、ファミコンのコントローラを読んだときの並び(A・B・SELECT・START・上・下・左・右)と同じ。ファミコン版の作りをそのまま引き継いだものと思われる。

3. ドラゴンクエスト

3.1 敵キャラの自己紹介(ウル技①)

結論:記事どおりにできる。ただしゲームが見ているのは SELECT と RETURN の2つだけで、記事の7キー同時押しは、キーボードの配線の性質(ゴースト)を使ってこの2つを押したことにしている。

MSX1版は起動直後(5E2Eh)に SNSMAT で行7を読み、ビット7(RETURN)とビット6(SELECT)が両方押されていると、モンスターを順番に表示するモードに入る。敵の番号(C0E0h)を 0 から 27h まで回し、モンスターを1体ずつ表示し続ける。

MSXのキーボードは、キーが行と列の格子(マトリクス)につながっている。キーを3つ以上同時に押すと、押していないキーまで押されたように読めることがある(ゴースト)。記事の7キーはこの格子の上で次のようにつながる。

この結果、行7でもビット0・3・4・6・7の列が導通して、押していない SELECT(ビット6)と RETURN(ビット7)が押されたように読める。

openMSX(キーのゴーストを再現する設定の FS-A1ST)で起動時に押すキーを変えて試した。

押したキー起動時に読んだ行7の値結果
記事の7キー26h(ビット7・6・4・3・0 が押下)モンスター表示モード
SELECT と RETURN3Fhモンスター表示モード
何も押さないFFh通常のタイトル画面

7キーで読んだ値は、配線から予想したビット(0・3・4・6・7)とぴったり一致した。ゴーストの起き方はキーボードの作りで変わるため、7キー同時押しが効くかどうかは本体によって違う可能性がある(推定)。

MSX2専用版では、この起動時の判定そのものが削除されていた。記事の「MSX1、2両用版でしかできない」と合う。

3.2 「YUJI」で会心の一撃(ウル技③)

結論:ドラゴンに必ず会心の一撃が出るのは本当。ただし「YUJI」は関係ない。コマンド入力の画面で1〜2秒何もしないで待ってから攻撃すれば、何も打たなくても同じになる。

「YUJI」は読まれていない

Y・U は行5、J・I は行3にある。§2.1 のとおり DQ1 はこの2行をどこでも読まない。戦闘中に SNSMAT で読まれた行を記録しても、行6〜10しか出てこなかった。BIOS のキーバッファも使っていないので、文字を打っても、ゲームには何も押されていないのと同じ。

会心の一撃の判定

攻撃するときの判定(7D79h〜)は次のとおり。

敵の番号が 26h・27h(竜王)なら会心なし
A = 敵の番号 として乱数ルーチンを呼ぶ
乱数の上位バイトの下5ビットが 0 なら会心の一撃(確率 1/32)
乱数が止まる

乱数ルーチン(4497h)は、16ビットの値(C094h〜C095h)に、呼ばれたときの A レジスタの値を混ぜて次の値を作る。この式には、A の値ごとに1つずつ「固定点」がある。A = 0 のときの固定点は 037Eh で、一度 037Eh になると、A = 0 で何度呼んでも 037Eh のまま変わらない。

キー入力のルーチンは毎フレームこの乱数ルーチンを呼んでいて、何も押していなければ A = 0 で呼ぶ。そのため、コマンド入力の画面で何もせずにいると、1〜2秒で乱数が 037Eh に止まる。

乱数が 037Eh のときに攻撃すると、会心の判定に使う値は「3 + 敵の番号」の下5ビットになる。これが 0 になるのは、敵の番号が 1Eh のときだけで、1Eh はドラゴンの番号だった。

試した結果

ドラゴンの1歩手前の状態から、攻撃するまでの時間と「YUJI」の有無を変えて試した。

試し方攻撃するときの乱数結果
コマンドが出てすぐ攻撃(3回)毎回違う値普通の攻撃(ダメージ 23〜37)
1〜2秒待ってから攻撃(5回)037Eh毎回会心の一撃(127 ダメージで撃破)
「YUJI」と打ってから攻撃(5回)037Eh毎回会心の一撃

ほかの敵についても調べた。

「YUJI」と4文字打っている時間が、ちょうど乱数が止まるまでの待ち時間になっていた、というのが真相と考えられる。ドラゴンの番号が会心になる値と重なったのは偶然で、ドラゴンだけを特別に扱う処理はない。

4. ドラゴンクエストII

4.1 仲間の名前設定画面

結論:記事どおり。条件は「SELECT + STOP + 決定(スペース・RETURN・X・トリガA)」の同時押し。

名前を決めたときと、復活の呪文を入れ終えたときの両方の処理が、同じ場所(バンク15、実行時 4415h)に合流する。その直後(441Bh)で E02Fh を1回だけ読み、決定・SELECT・STOP の3ビット(0Dh)がそろっていれば、仲間の名前を入れ直す処理に進む。処理の要旨は次のとおり(実際のコードは補助ルーチンを呼ぶ形で書かれている)。

E02F を読む
and 0Dh            ; 決定(01h) + SELECT(04h) + STOP(08h)
cp 0Dh
jp nz,(通常の処理へ)
仲間の名前の領域を初期化して、名前設定画面へ

判定は1回だけで、最後の文字を決定したほぼ直後に行われる。復活の呪文で、52文字目を入れる直前の状態から試した。

52文字目の入れ方判定時の E02F結果
スペースだけ00hそのまま再開
SELECT と STOP を押しながらスペース0Dh仲間の名前設定画面になる

SELECT と STOP を押したまま文字を入れ続けようとすると、名前入力の画面がキーを離すのを待つため先へ進まない。記事のように「押しながら最後の文字を打ちこむ」のが正しい手順。

4.2 エンディング後の隠し戦闘モード(記事に載っていない)

キーの読み取りを調べている途中で見つかった。エンディングのあとに特定の操作をすると、パーティでモンスターと連戦できる。連戦が終わると、キーを押すたびに曲が変わる「曲を聴くモード」になる。MSX1版・MSX2版の両方で確認した。

操作
  1. スタッフロールの最後に「COPYRIGHT」の画面が出たら、「上 + 決定」を押し、そのまま押し続ける
  2. 「COPYRIGHT」が消えて画面が真っ黒になり、ENIX のロゴが出るまで押したままにする(「The End」まで押し続けてもよい)
  3. 「The End」が表示されたら、「上 + 決定」を離し、「下 + 取消」を押す。効果音が鳴り、連戦が始まる

キーボードなら、上 = ↑、決定 = SPACE または RETURN、下 = ↓、取消 = SHIFT または ESC。ジョイスティックなら、上下とトリガ A・B でもよい。

1. COPYRIGHT が出たら「上 + 決定」を押し始める
1. COPYRIGHT が出たら「上 + 決定」を押し始める
2. この ENIX ロゴの直前の黒い画面で、キーが記録される
2. この ENIX ロゴの直前の黒い画面で、キーが記録される
3. 「The End」で「下 + 取消」を押す
3. 「The End」で「下 + 取消」を押す

エンディングの処理は、COPYRIGHT が消えて ENIX のロゴが出るまでの黒い画面の間(1秒足らず)に、キーの状態(E02Fh)を一度だけ記録する。「The End」を表示したあと、記録した値が 11h(上 + 決定)なら、22h(下 + 取消)が押されるのを待って効果音を鳴らし、連戦の処理に進む。そうでなければ「The End」のまま止まる。黒い画面は短いので、COPYRIGHT が出ている間から押し続けておくのが確実である。記録した値は「上 + 決定」ちょうどでなければならず、ほかのキーが一緒に押されていると成立しない。

連戦

連戦の処理は、敵のグループを番号順に 0 から 38h まで、57組と戦う。

1組目: スライム8匹(MSX2版)
1組目: スライム8匹(MSX2版)
終盤: ハーゴン(MSX1版、HP を書き換えて進めたもの)
終盤: ハーゴン(MSX1版、HP を書き換えて進めたもの)
56組目: シドー(MSX1版、同上)
56組目: シドー(MSX1版、同上)
57組目: 名前の無い A〜H。ベホマで HP が 2506 になる(MSX1版、同上)
57組目: 名前の無い A〜H。ベホマで HP が 2506 になる(MSX1版、同上)

57組目は実質的に勝てない。 8匹の HP は最初 165〜202 ほどだが、この組はゲームの中で最大 HP が 2506 として扱われていて(正規のデータの外を読んだ値と思われる)、ベホマを唱えるとその敵の HP は 2506 まで回復する。ホイミでも最初の値を超えて回復する。こちらの攻撃は1回 20〜40 ポイント程度なので、倒しきることはできない。8匹が減らないのは、仲間を呼んでいるからではなく、1匹も倒れないからである。HP を書き換えて全滅しないようにしたまま、エミュレータ内の時間で15分戦い続けても、1匹も倒れなかった。

1戦ごとに次の判定がある。

この判定は1戦が終わったときにしか行われない。57組目からは「にげる」で抜けられる(試した1回目で逃げられた)。逃げると57組を戦い終えた扱いになり、曲を聴くモードに移る。

曲を聴くモード

打ち切ったとき、全滅したとき、57組を戦い終えたときは、どれも「曲を聴くモード」に入る。画面を空白で消して表示も切ったまま、キーを押して離すたびに、曲が 0Eh → 0Fh → 10h → 11h → 0Ch → 0Eh …… と順に変わる。聴けるのはこの5曲だけで、5曲を繰り返す。ほかの曲に切り替える方法はない。打ち切ったときと57組を戦い終えたときは、モードに入った時点でまず 0Ch が鳴る(全滅したときは鳴らずに、最初のキーで 0Eh になる)。

曲の番号曲名
0ChLove Song探して
0Eh王城
0Fh街の賑わい
10h恐怖の地下洞
11h魔の塔

曲名は、MSX2版で打ち切りからこのモードに入り、聴いて確かめた(2026-10-20)。

全滅すると画面が真っ暗なまま曲だけが変わっていくので、壊れたように見える。実際にはゲームは正常に動いていて、表示を強制的にオンにしても、画面には何も描かれていなかった。連戦の1戦目のあとに SELECT と STOP を押していると、全滅しなくてもこのモードに移ることも確かめた。

エンディングの出し方(検証用)

最後まで遊ばずにエンディングを確かめるため、エミュレータのデバッガで、ゲーム自身のイベント命令の99番(エンディング)を正規の呼び出し手順で実行した。そのため、検証したのはスタッフロール以降で、最後の戦闘の勝利後の物語の部分は通っていない。

5. ファミコン版との関係

結論:エンディング後の隠し戦闘モードは、ファミコン版の ROM には見当たらず、MSX版では移植のときに Z80 で書き足されたコードに見える。著書の「ナイショの追加機能」の候補と考えている。ただし候補にとどめる。

ファミコン版のドラゴンクエストII も、コントローラを MSX版と同じビットの並びで変数(ゼロページの 2Fh。MSX版の E02Fh はこれを移したもの)に読み込んでいる。ファミコン版に同じ隠しモードがあれば、6502 のプログラムの中に次のものがあるはずなので、ROM の中を探した。

探したものファミコン版の ROM
「上 + A」(11h)と「下 + B」(22h)を続けて比べる処理(CMP #$11 と CMP #$22)1か所もない
敵のグループを 0 から 38h まで順に戦わせるループ(CMP #$39 で終わる)ない。CMP #$39 は3か所あるが、どれも敵の番号を比べる処理

MSX版の書き方にも手がかりがある。著書によると、移植は「基本的にソースコードは書き換えない、その代わり、マクロを用意して6502の命令をZ80の命令郡に置き換えてしまう」方法で行われた。実際に MSX版の大部分は、6502 の命令1つごとに補助ルーチンを呼ぶ独特の形をしている。ところが MSX1版では次のようになっていた。

場所(MSX1版)書き方
連戦と曲を聴くモードの処理(バンク16 9000h〜9075h)補助ルーチンを使わない、普通の Z80 のコード
連戦から呼ぶ戦闘開始の処理(同じバンクの 9079h〜)6502 の命令を補助ルーチンで置き換えた、移植の形
エンディング後のキーの判定(バンク23 5587h〜)普通の Z80 のコード

つまり、ファミコン版から移した戦闘の処理を、Z80 で直接書いたコードから呼んでいる。ファミコン版にない処理を、移植のときに書き足したものと考えると、どれも説明がつく。

それでも候補にとどめるのは、次の理由による。

6. まとめ

隠し技記事実際の仕組み確認
DQ1 敵キャラの自己紹介7キー同時押し起動時の SELECT + RETURN。7キーはゴーストでこの2つを押したことにしているMSX1版で確認。MSX2版は削除
DQ1 「YUJI」で会心YUJI と入力YUJI は読まれない。待つと乱数が 037Eh に止まり、ドラゴンだけ会心になる確認
DQ2 仲間の名前設定STOP + SELECT で4文字目/呪文の最後決定 + SELECT + STOP を、最後の文字を決定する瞬間に確認
DQ2 隠し戦闘モード(記事になし)COPYRIGHT 後の黒画面で 上 + 決定、The End で 下 + 取消 → 57組の連戦(最後の組は実質勝てない)→ 5曲だけの曲を聴くモード。ファミコン版の ROM には見当たらず、MSX版で書き足されたコードに見える(§5)MSX1版・MSX2版で確認

付録 主なアドレス

版場所内容
DQ1 MSX1版5E2Eh起動時の行7の判定(モンスター表示モード)
DQ1 両版4B31h(MSX2版)キー入力のルーチン、C047h に格納
DQ1 両版4497h乱数ルーチン(C094h〜C095h)
DQ1 MSX2版7D79h〜7D8Ch会心の一撃の判定
DQ2 両版バンク30キー入力のルーチン、E02Fh に格納
DQ2 両版バンク15 441Bh仲間の名前設定の判定
DQ2 MSX1版バンク23 554Bh〜55A4hエンディングの隠しコマンドの判定(MSX2版はバンク30)
DQ2 両版バンク16 9000h〜連戦と曲を聴くモード
DQ2 両版E63Bh・E64Dh・E65Fh3人の HP