ピロ彦の何か置き場

なぜ"電源ON/OFFバグ"は発生するのか? ~ファミコン版ドラゴンクエスト3~

【電源ON/OFFバグ】を簡潔に言い表すと

「りせっとをおさずに
 でんげんをきると
 ぼうけんのしょが きえてしまう
 ばあいがあります!!」

というメッセージの表示後に電源をON/OFFすると
メモリがグチャグチャになるバグである。



電源ON/OFFバグ後にコントローラのいずれかのボタンを押す、
またはボタンに反応がない場合はリセットボタンを押してから操作をすると
画面がバグった状態で『全滅復帰』に遷移するので、
バグった画面のまま王様に話しかけてセーブした後に
リセットをすることで画面が正常化される。

バージョンによる違い

FC版DQ3にはいくつかのバージョンがあり、ツルツル無印のガワが初期版で
写真では判別しにくいが右上に薄っすらと刻印があり、無印とA刻印は問題ないが
後期版(ザラザラB刻印)ではこのバグが発生しないことが知られている。

この後期版は初期版と比べてセーブデータが消えにくいとの噂があるが、
DQ3初期版にはMMC1Aという制御回路が搭載され、
DQ3後期版にはDQ4にも搭載されているMMC1B2が使用されているため
前者に比べて比較的安定していると推測される。



また、海外版"Dragon Warrior III"にはMMC1B3が搭載されているので
電源ON/OFFバグは発生しないのではないかと予想され、
森田将棋にはMMC1が搭載されている。

バッテリーバックアップの仕様

wikipediaの"バッテリーバックアップ"の頁によると

  • ファミリーコンピュータはバッテリーバックアップを考慮していないプラットフォームである[注 1]。すなわちCPUとカートリッジのメモリ空間がCPUのバスを通じて直接接続されており、さらに一定容量以上のカートリッジは、カートリッジ内にメモリ空間を拡張するための制御回路(MMC, Multi Memory Controller)を搭載しバンク切り替えを行っている。このため単純に電源を切ると、電源を切断して回路の電圧・電流が低下した瞬間に、CPUやMMCが誤動作する可能性がある。カートリッジバス上のMMCの誤動作やメモリ空間にSRAMが見えている最中にこのような状況が発生すると、SRAMのデータ化けを起こす確率が非常に高くなる。バッテリーバックアップ機能を搭載したファミリーコンピュータ用カートリッジの多くは、電源を切る際に、リセットボタンを押したまま電源スイッチをOFFにする必要があるが、これはリセットボタンを押している間はCPUの動作が完全に停止する為である[注 2]
  • 前述のエラーや書き込まれるデータの問題によってセーブデータが化けていた場合、そのエラーの大小にかかわらず該当データはゲームによって破棄される実装になっているものが多く、取り扱いや接続端子の状態によっては記録したデータを喪失するケースも発生する。

とのことで冒険の書にエラーが発生しやすい設計になっているが、
少しでもデータに不具合があるとCRCによる誤り検出に引っかかり
【呪いのモチーフ】とメッセージが流れた後、
ボタン操作をすると冒険の書を削除する処理が発生する。

この時、MMCの誤動作によってバッテリーバックアップの
読み込みミスがあった場合も同様に冒険の書の削除が行われてしまうが、
ごく稀に冒険の書5番などが消えてしまうことがある。

電源バグ検証中に冒険の書5が消えたぜ。これだからドラクエ3はやめられないぜ。

FC版 ドラクエ3の電源バグ 雑談 / ニコ生TS https://t.co/U1vR0ef0hK pic.twitter.com/vtn74sAVaI

— Hitsheegame (@Hitsheegame) October 29, 2020

このような読み込みミスが発生した場合は、
冒険の書が削除される前にリセットをすることで
冒険の書が復活したように見えることがあるが、
本当に誤り検出に引っかかっている場合は
何度リセットをしても冒険の書が復活することはない。

復活することはないのだが、
データの先頭である主人公のレベルが0に削除された瞬間にリセットを押して
仲間の誰かがレベル0ではないという状態を作れれば
誤り検出をスルー出来る冒険の書になるという仕様があるため、
いわゆるサブフレームリセットTASへの利用が期待されている。


またDQ4は削除してから曲とメッセージを流す無慈悲な仕様であるため
いくらリセットをしても意味はない。

MMCについて

調査したところ、
DQ3後期版ではバンク切り替え時にカートリッジ上のSRAMへのアクセスを
ON/OFF可能なMMC1B2を搭載しているので
ぼうけんのしょが きえてしまう ばあいがあります!!」
の最後の文字が表示され無限ループ処理に入る直前に
SRAMへのアクセスを無効にするコードが書かれているが、

DQ3初期版のMMC1AはカートリッジのSRAMへのアクセスが常に有効であるために
SRAMへのアクセスを無効にするコードの名残りのようなものが存在しているが
仕様上オフにはならず無限ループ時には不安定になっていると予想され、
SNROM+MMC1の構成では$A000~$BFFFの4ビットを1にすることで
カートリッジのSRAMへのアクセスがオフにされるらしく、
その画面でリセットを押すと王様の前から全滅復帰する。

DQ3 後期版
0D:BBC7:AD D5 06 LDA $06D5 = #$0D // bank 0Dへの切り替え準備
0D:BBCA:09 10   ORA #$10     // bank 1xでSRAMへのアクセス無効
0D:BBCC:20 BD FF JSR $FFBD     // バンク切り替えのサブルーチン
0D:BBCF:4C CF BB JMP $BBCF     // 無限ループ

DQ3 初期版
0D:BBC7:A9 10   LDA #$10     //4bit=1
0D:BBC9:8D C8 06 STA $06C8 = #$00 // NMI内で$BFFF=#$10になる
0D:BBCC:4C CC BB JMP $BBCC    // 無限ループ
-------------------------NMI-----------------------------
~~~~~~~~~~~~~~~~~~~~~~~~~~
0F:C64E:8D C8 06 STA $06C8 = #$10
0F:C651:8D FF BF STA $BFFF = #$BF
0F:C654:4A LSR
0F:C655:8D FF BF STA $BFFF = #$BF
0F:C658:4A LSR
0F:C659:8D FF BF STA $BFFF = #$BF
0F:C65C:4A LSR
0F:C65D:8D FF BF STA $BFFF = #$BF
0F:C660:4A LSR
0F:C661:8D FF BF STA $BFFF = #$BF
0F:C664:60 RTS
~~~~~~~~~~~~~~~~~~~~~~~~~~

全滅復帰する理由について

調査すると一つのフラグが影響してることがわかる。

バッテリーバックアップ上の$6A58というフラグは通常
冒険の書を作成してマップが読み込まれる際に0x03にセットされたり
冒険の書を選択して再開した場合には0xFFにセットされたりしている。
このフラグはリセットもしくは電源投入時にこの$6A58が0に初期化され、
そのしばらく後に$6A58=0であれば条件分岐によってタイトル画面へ遷移するが
何らかの理由で$6A58が0以外であれば全滅復帰へ分岐する。
通常の全滅時に何らかの理由でこのフラグがオフになっていれば
タイトル画面に戻ることになると予想される。

後期版では$6A58への書き込みがMMCの初期化後に行われているが、
初期版ではMMCの初期化前に$6A58に書き込みを行おうとするために
MMCが不安定になった状態では$6A58への書き込みが失敗し、
$6A58を読み込む際に0以外の値が取得されて全滅復帰に分岐していると考えられる。

メモリがグチャグチャになる理由

本体側のメモリは電源を切ることで時間経過とともに揮発していくが、
本来必要な初期化処理は冒険の書選択時に行われているため
タイトル画面がスキップされたことで揮発したメモリがそのまま使用されることになる。

文字がグチャグチャになる理由としては、
大半の画像は暗転時に読み込み直されるのに対して
文字の画像だけはタイトル画面で一度しか読み込まれないため、
電源ON/OFFバグ時にはタイトル画面がスキップされて
文字が読み込み直されないことが原因であると考えられる。

出来ることと出来ないこと

本体メモリをバグらせられるのは主にキャラステータスである名前や習得呪文や
キャラステータスに含まれる所持アイテムとルーラ登録地などで、
フラグ類はすべてカートリッジ側で管理しているため
復活場所やゾーマ打倒フラグなどをイジることは出来ません。
また後期版は使えないため、2コンAボタン押しノーエンカ技も使えません。

カセットの抜き差しや交換などをしていると
イキナリ全滅復帰する事例も報告されているので
もしかしたら抜き差しによってMMCを不安定化させて
王様までの道のりを全滅復帰でショートカットすることも可能かもしれません。

ついでにRTAについて

電源ON/OFFバグによってメモリのビットが立ちやすい本体であれば
高レベル高ステータスやにじのしずくが期待しやすくRTA向きであり、
逆にビットが下がりやすい本体であればPTの存在フラグなども消え
低レベル低ステータスになりやすくRTAには不向きであると言える。

DQ3なんでもありRTAガチ勢は本体ガチャを行っているが、
初期型ファミコンNEWファミコン(AV仕様)ではバグでの変化が乏しく
一部のファミコン互換機なども出荷時期によっては
期待できるロットと期待できないロットが混在し混迷を極めているらしい。


また、時間と温度によってバグり方が変化することが知られているが
メモリの揮発速度が温度で変化することが原因の一つとして考えられ、
それ以外にも本体内部の各種コンデンサなども熱の影響を受けそうである。

電源タップのスイッチを用いた電源ON/OFFバグもあり、この場合は
アダプタの性能や本体電源部の三端子レギュレータの温度も考慮する必要がある。

うちには3種類のACアダプタがあるが、
うちの後期型ファミコンと純正アダプタの組み合わせでは
にじのしずくが出やすいのは2.5~8秒前後電源を落とした時で、
コロンバスサークルのミニACアダプタでは1.2~3秒程度でにじのしずくが出やすかった。

最後は電源タップのスイッチを入れてから映像が来るまでに1秒かかるアダプタで
定格電流が1000mAと他のアダプタの850mAと違うことも影響しているのか
メモリの変化も乏しく、RTAには不向きであった。

また、本体温度が上がると酒場に登録された賢者が高火力になりやすいが、
賢者が遊び人に変化しやすくなるというジレンマがあるため
RTAでは温度管理が非常に大事になってくるため、
ファミコンの下に古いPCケースのサイドパネルを放熱板として敷いている。

当初は本体側の電源ON/OFFによって棺桶バグを誘発して
アイテム変化を狙う安定型チャートだったが、
電源タップのスイッチを使うことでにじのしずくが狙えて
理力の杖持ちルカニ僧侶とバイキルト商人と高攻撃力の賢者が出る
何気に記録が狙える神個体だったことが判明し、リアルラック勢への転向を決意。


最後に

2020年12月27日~31日に行われる『RTA in Japan 2020』では、初日の15:50あたりに
ドラゴンクエスト3 なんでもありRTA 4人レース』が行われます。
日曜日のいい感じの時間なので、お時間がある人は是非応援してください!
お時間のない人もアーカイブでのご視聴をどうぞ!

また走者も増えているのでこれを見て自分もRTAしてみたいと思った方は是非!!

本体個体値、時間調整、温度調整、
ACアダプタ、電源タップ、
組み合わせは無限大!
君だけのRTAチャートを作ろう!!!