Arduinoを使ったgameboyカードリッジのdump

259 views

Published on

arduinoを使ってゲームボーイのカードリッジからデータを吸い出します

Published in: Devices & Hardware
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
259
On SlideShare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
1
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Arduinoを使ったgameboyカードリッジのdump

  1. 1. Arduino を使った GAMEBOY カードリッジの DUMP 工学部情報科学科 勝亦利宗
  2. 2. 自己紹介 ● 工学部情報科学科 2 年 勝亦利宗 ● Twitter @___106___ ● Github https://github.com/106-/ – 今回のプログラム https://github.com/106-/gbdumper
  3. 3. 必要なもの ● Arduino Leonard ● シフトレジスタ SN74HC595N ● ブレッドボード ● ジャンパーケーブル多数 ● ジャンパーピン多数 ● 10KΩ の抵抗 4 本 ● ゲームボーイ用カードリッジコネクタ ● IDE ケーブル
  4. 4. なぜゲームボーイからデータを取り出すのか ? ● セーブデータの保存 ( データ保持用の電池が切れる ) ● エミュレータで使う
  5. 5. カードリッジのしくみ ● ピン配置
  6. 6. カードリッジのしくみ ● VCC : 5V 電源 ● CLK : Arduino の GND に接続 – ポケットカメラの出力がおかしくなるため ● WR, RD, MREQ : Arduino の任意のピンに接続 – 上線は否定の意味 ( 使わないときは常に HIGH) – 抵抗を挟んでおく ( フェイルセーフ ) – 読み込み / 書き込み / メモリ書き込みのスイッチ ● A0-A15 : ( 読み込み | 書き込み ) たいアドレスを指定する ● D0-D7 : アドレスに指定したデータが読み出せたり書き込めたり
  7. 7. カードリッジのしくみ ● RESET : 抵抗を挟んで 5V 電源 ● AUDIO : 用途不明 ● GND : Arduino の GND に接続 → 基本的に A0-A15 ピンにアドレスを指定し , それに対するデータを D0-D7 ピンに指定していく
  8. 8. シフトレジスタとは ● カードのピンが 27 本なのに対して ,Arduino のピンは 18 本しかない – シフトレジスタを使って解決する
  9. 9. シフトレジスタとは ● シフトレジスタ : – パラレル信号をシリアル信号に変換したり , その逆もできる IC – Arduino には簡単に使える関数が存在するので便利 – 今回はシリアル→パラレル変換ができるものを使う – 山形の秋葉原で買えます → アドレス指定部分に必要だった 16 本のピンを一つに集約できる ! – ラッチピン , クロックピン , シリアルピンの 3 本
  10. 10. シフトレジスタとは // シフトレジスタでアドレスを指定する . void setaddress(unsigned int addr) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, (addr>>8)); shiftOut(dataPin, clockPin, MSBFIRST, (addr&0xFF)); digitalWrite(latchPin, HIGH); } こんな感じでアドレスを指定できる
  11. 11. シフトレジスタとは ● 接続例 ( シフトレジスタが一つの場合 ) http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2369
  12. 12. 回路完成図
  13. 13. プログラム部を DUMP する ● DUMP 時の動作 – ROM のヘッダを読み込み ,MBC(MBC とは ?→ あとで ) を調べる – RD ピンを LOW にして , アドレスを変えながらデータを一つ一つ送信する – MBC を切り替えてゆく
  14. 14. MBC とは ● Memory Bank Controller の略 – GB の ROM サイズは最大で 16KByte – ROM を複数積むことで容量不足分を補う – 複数積んだ ROM を切り替える ( バンク切り替えという ) のが MBC – 切り替えは特定のアドレスに書き込んで行う – MBC にはいくつかのタイプがある ● MBC によって書き込むアドレスが違ったりするので面倒
  15. 15. ROM のヘッダ ● 0x0100 から 0x014F の範囲には , そのゲームの様々な情報が記録されている – ゲームのタイトル ,MBC のタイプ , データのサイズなど – データチェック用に任天堂のロゴも ● MBC の判定に使うのは 0x147, ROM/RAM のサイズは 0x148 と 0x149
  16. 16. クライアント ● 送られてきたデータを PC に保存するプログラムを Python で書く ● ヘッダ部を読み込み ,MBC の情報などを表示する ● とくに複雑なことは無いので詳しい説明は省きます
  17. 17. DUMP してみる ● BGB で動作確認
  18. 18. そのほかにも… ● セーブデータを読み込んだり , 書き込んだり – サイズやアドレスが ROM とは違うが , 基本的な考え方は ROM と同じ
  19. 19. そのほかにも… ● ポケットカメラの画像を抽出する – PocketSaver というソフトをつかう
  20. 20. 参考 ● GBCartRead: Arduino based Gameboy Cart Reader https://www.insidegadgets.com/2011/03/19/gbcartread-arduino-based-gameboy -cart-reader-%E2%80%93-part-1-read-the-rom/ ● いまさら聞けないゲームボーイ http://matsu-world.qee.jp/gameboy/index.html ● Memory Bank Controllers http://gbdev.gg8.se/wiki/articles/Memory_Bank_Controllers

×