小ネタ 2004-018
NintendoDSのカートリッジのセーブデータの解析
1. 準備 ・・・ EZ-USBでシリアルEEPROMを読み書きする
NintendoDSの分解記事がネットに出ていたのをみて、何らかのシリアルEEPROMがカートリッジに使われているのが分かった。
Cypress社の有名なUSBチップ"EZ-USB"を使ったキット「Mini EZ-USB」を使ってシリアルEEPROMの読み書きを試みてみた。
シリアルEEPROMにはI2C、microwire、SPI等、何種類か規格がある。Mini EZ-USBの汎用ファームウェアとカメレオンUSBキットのライブラリを流用して読み書きソフトを作ってみた。I2Cのメモリは定番なので楽勝で読み書きができた。microwireはうまく動かなかった。前にMicrochip社のマイコンでAT93C46の読み書きをしたときはうまく動いたのだが、なにかミスっているかも。SPIについてはNintendoDSのカートリッジのシリアルEEPROMがSPIのものだということが判明してから試みた。(回路図)
ただ、とりあえず作ったソフトはまだ動作がすごく遅い。
Mini EZ-USBキット と シリアルEEPROM用基板(3種)
2. 分解調査 ・・・ NintendoDSのゲームカートリッジの分解
NintendoDSのゲームカートリッジを分解してみた。写真下側の小さな8ピンのIC部品がセーブデータ用のシリアルEEPROMである。この部品は何なのかがネット上の写真からは読みとれなかったので、自分のカートリッジを分解した。蓋が接着剤で止めてあるみたいなので分解のときの力加減が難しかった。 シリアルEEPROMチップのマーキングを見ると9564W6という文字とSTというロゴが見える。ここから調べるとSTマイクロエレクトロニクス社のM95640という型式のSPI方式のEEPROM部品が出てきた。
DSのカートリッジを分解した写真 と 基板のシリアルEEPROMの拡大写真
3. 試作1号 ・・・ NintendoDSのカートリッジ基板の読み書き
NintendoDSのカートリッジの部品が、SPI方式のEEPROM「M95640」であるとの仮定で、読み書きのためのソフトを作ってみた。
結果、SPI方式で読み書きすることができた。読み書きの方法はデータシートを参考にした。
しかし、1つの疑問が生じた。M95640の容量は64kbitつまり8kバイトである。8kバイトのデータを読み出したのだが、前半4kバイトの内容と後半4kバイトの内容がまったく同じなのである。後半はメモリイメージを読み出しただけで、実は4kバイトの容量でないかという疑いが生じた。
以下のような実験をしてみた。
(1) 前半4kバイトと後半4kバイトに別の内容を書き込んでみる。
(2) 8kバイトよりも後ろのアドレスに書き込んでみる。
その結果、
(1)の結果、前半と後半に別々の内容が書き込まれた。
(2)の結果、8kバイトよりも前のアドレスに書き込まれた。
ということで、EEPROMの容量は8kバイトで間違いないと思われる。
製作した試作1号NDS-reader
4. 追試 ・・・ NintendoDSのゲームカートリッジのEEPROMを取り替えてみる
追試として、NintendoDSのゲームカートリッジの基板上のEEPROMを取り外して、外部に別のDIPタイプのM95640シリアルEEPROMを取り付けて、元のEEPROMから読み出したデータをそのまま書き込んでみた。結果、問題なく動作することが確認できた。
また、前半と後半に同じ内容が書かれていた理由の検証として、以下の実験をしてみた。
(1) 前半と後半に別のセーブデータを書き込んでみる。(パズル面の編集機能で面を書き換えてデータを作った)
他にも、
(2) EEPROMの出荷状態と同じ全部データ0xFFを書き込んでみる。
(3) EEPROMを取り外してみる。
(4) 容量が半分の4kバイトのEEPROMに取り替えてみる。(部品が手に入らなかったため未実施)
その結果、
(1)の結果、前半のデータで普通にゲームができた。後半は無視みたいだ。データのセーブ時に後半が全部前半と同じに書き直された。
(2)の結果、購入時の最初の状態でゲームが始まった。最初の画面が出たところですぐに止めてデータを読み出したところ、すでに最初の初期状態のセーブデータが書き込まれていた。
(3)の結果、最初の画面が出る前に画面が真っ白のままフリーズしてしまった。
NintendoDSのカートリッジの基板上のEEPROMを取り替えたところ
5. 試作2号
大体ここまではうまくいったので、他のゲームのセーブデータについても調べてみるために2号機を製作した。コンタクト部分にはジャンクのSmartMediaリーダーの部品を流用した。(これで分解しなくても直接カートリッジのデータが読める)
試作2号機
6. 追試その2
追試として自分の現在持っている全ソフトについて調べてみた。
(1) MetroidPrimeHunters体験版
(2) Feel the Magic XY/XX
(3) Sprung(出荷状態のママ、まだ起動していない状態)
(4) 直感ヒトフデ (既に上記でテスト済み)
(5) マリオ64DS
(6) 大合奏バンドブラザーズ
結果は以下の通り、
(1)の結果、データはセーブされていないようだ。0x61だとかそんなデータが256個ずつ繰り返されている。このソフトは体験版だからセーブ用に使われていないと思われる。部品はちゃんと載っているらしい。
(2)の結果、データは前半と後半という形式になっていない。前半と後半の内容が異なる。いきなり例外である。容量いっぱい活用しているのにはたぶん理由があって、このソフトのボイスレコーダー機能のためだと思われる。前半後半に同じ内容を記録するというのは必ずしもルールとして決まっていないかもしれない。
(3)の結果、データは全部0xFFだった。DSのゲームは出荷時にはEEPROMも出荷状態だと思われる。起動後のデータはまだ取っていないので後日チェックする。
(4)の結果、試作1号でチェック済みだが、前半と後半に同じ内容が記録されていた。データに0x55と0xAAが多いが、これは面データの未編集時のデフォルトが市松模様だからだと思われる。
(5)の結果、データは前半と後半に同じ内容が記録されていた。
(6)の結果、データはほとんど全部が0xFFで数十箇所ほど0x00だった。まともなセーブデータでないと思う。セーブ機能が備わっていないという可能性はありえないので、考えられる仮説としてはM95640とかのSPI方式EEPROMとは別の方式でデータをセーブしているのではないかと思われる。うまく読み書きできないのが残念だ。楽譜編集データの吸い出しや書き込みができると面白いのになあ。またそのうちこのゲームをやり込んで飽きたころに分解して調べてみる予定。
以上、ここまでに約1週間かかった。
(後日加筆 2005.1.5)
さらに調べを進めたところ、いくつか新しいことが分かった。
上記の(1)〜(6)のソフトについて、
(1)については、シリアルEEPROMにM95040が使われていることが分かった。容量が4kbitつまり512バイトしかない。M95040はaddress指定方法が8bitなのでM95640と同じソフトでは正しく読み出しができなかった。そのためデータが256個ずつ繰り返されているように見えたと思われる。ソフトをM95040用に書き直したところうまく読み書きできた。
(2)については、新しい発見はなし。ボイスレコーダー機能のデータがセーブされると思っていたが、それは勘違いで実はセーブされない。
(3)については、これもM95040だということが分かった。恋愛シミュレーションゲームのセーブデータがたった512バイトってのはどうかと思う。CG鑑賞機能のフラグ管理はしているようだ。
(4)については、パズルの面のデータの形式が分かった。パスワード解析の情報がネットに出ていて、それが参考になった。面データを書き換えただけでは反映されず、全部の面データを足しあわせた総チェックサムを整合させたら書き換えた内容が反映された。
(5)については、新しい発見はなし。
(6)については、使われている部品がSANYO製のLE25FW203というシリアルフラッシュメモリだということが分かった。容量は32kバイトである(?)。address指定方法が24bitであるので、M95640用ソフトでは正しく読み出しができなかった。ソフトを書き直したところ読み出しができた。
(後日加筆 2005.1.22)
回路図を追加した。
大合奏バンドブラザーズのセーブデータの容量が32kバイトでないことが確認できた。アマチュアモードでは32kバイトしか使われていなかったため気が付かなかった。
(後日加筆 2005.1.29)
(後日加筆)