アカデミー講座 ここではMAPPERの解析やROMの吸い取り方などを中心に掲載していきます。 第1回講座 NESのヘッダについての考察 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 0000h:4E 45 53 1A 10 20 00 20 00 00 00 00 00 00 00 00 0バイト目(固定数値)文字”N” 1バイト目(固定数値)文字”E” 2バイト目(固定数値)文字”S” 3バイト目(固定数値)EOF 4バイト目 PRGのバンク数(16進数) 5バイト目 CHRのバンク数(16進数) 6バイト目 上位バイトがMAPPER数の下位バイト、下位バイトがNESのセットアップ(下 記参照) 7バイト目 上位バイトがMAPPER数の上位バイト、下位バイトはTMP 8〜Fバイト目 TMP 6バイト目の下位バイトNESのセットアップ内容は下記の通り 0・・・縦画面切り替え 1・・・横画面切り替え 2・・・縦画面切り替え+セーブ機能 3・・・横画面切り替え+セーブ機能 4・・・縦画面切り替え+TRANERモード 5・・・横画面切り替え+TRANERモード 6・・・縦画面切り替え+セーブ機能+TRIANモード 7・・・横画面切り替え+セーブ機能+TRIANモード 8・・・縦画面切り替え+4画面切替機能 9・・・横画面切り替え+4画面切替機能 A・・・縦画面切り替え+4画面切替機能+セーブ機能 B・・・横画面切り替え+4画面切替機能+セーブ機能 C・・・縦画面切り替え+4画面切替機能+TRAINモード D・・・横画面切り替え+4画面切替機能+TRAINモード E・・・縦画面切り替え+4画面切替機能+TRAINモード+セーブ機能 F・・・横画面切り替え+4画面切替機能+TRAINモード+セーブ機能 6、7バイト目の上位バイトのMAPPER数の設定は下記の通り 例えばMAPPER0〜15までは6バイト目の上位バイトに16進数で記入。 7バイト目の上位バイトには0を記入する。 これが23のように15を超えた場合は6バイト目には7、7バイト目には 1を記入する。また現在のMAPPERの種類は次の通りです。 MAPPER0(バンク切替なし、ファミコンの初期)・・・ドンキーコング、マリオブラザーズ など MAPPER1(MMC1、多くの2Mロム)・・・・・・・桃太郎伝説、ファイナルファンタジー など MAPPER2(PRGの単純バンク切替)・・・・・・・・ロックマン、ロックマン2 など MAPPER3(CHRの単純バンク切替)・・・・・・・・忍者じゃじゃ丸くん、ホッターマンの地底探検 など MAPPER4(MMC3、ファミコンの後期)・・・・・・ワルキューレの冒険、サンサーラナーガ など MAPPER5(MMC5)・・・・・・・・・・・・・・・(海外版)悪魔城伝説 MAPPER6(FFE社の吸出しで吸い出した やしいCDのF4xxxに使用。他のMAPPERにTRAINモードを 付けて無理矢理動かしている?) MAPPER7(8000〜FFFFの32Kを一括で切り替える。CHRはない)・・・シャッフルパックカフェ など MAPPER8(FFE社の吸出しで吸い出した やしいCDのF3xxxに使用。他のMAPPERにTRAINモードを 付けて無理矢理動かしている?) MAPPER9(MMC2、日本語版パンチアウトが動くようにと作られたがまだサポートされていない。) MAPPER10(MMC4)・・・・・・・・・・・・・・(海外版)パンチアウト MAPPER11・・・・・・・・・・・・・・・・・・・・? ? ? MAPPER12(FFE社の吸出しで吸い出した やしいCDのF6xxxに使用。他のMAPPERにTRAINモード を付けて無理矢理動かしている?) MAPPER13、14・・・・・・・・・・・・・・・・・空き MAPPER15(出回っている100in1OnlyのためのMAPPER) MAPPER16(バンダイMAPPER、まだ完全ではない)・・・ドラゴンボールZ、ナイトガンダム物語 など MAPPER17(FFE社の吸出しで吸い出した やしいCDのF8xxxに使用。他のMAPPERにTRAINモード を付けて無理矢理動かしている?) MAPPER18(ジャレコMAPPER、まだ完全ではない)・・・じゃじゃ丸撃魔伝、寺尾のどすこい大相撲 など MAPPER19(ナムコMAPPER、青カセットに多く使用、完動するものも有るが、まだのも る。)・・・ファミス タ90、ファミスタ91 など MAPPER20(ディスクシステム用MAPPER、定義のみ) MAPPER21(コナミVRC4)・・・・・・・・・・・ワイワイワールド2、ゴエモン外伝2 など MAPPER22(コナミVRCタイプA)・・・・・・・・ツインビー3 など MAPPER23(コナミVRCタイプB)・・・・・・・・じゃりん子チエ、魂斗羅、ドラゴンスクロール など MAPPER24(コナミVRC6、定義のみ) MAPPER25〜31・・・・・・・・・・・・・・・・・空き MAPPER32(アイレムMAPPER、アイレムの後期)・・・パーマン、イメージファイト など MAPPER33(タイトーMAPPER)・・・・・・・パワーブレイザー、ゴルフっ子オープン、爆笑・人生劇場3など (カセットの に現在のタイトーロゴが入っているものに対応。) MAPPER34(8000〜FFFF32k一括切り替えCHR り、MAPPER7のCHR有りのときのときはこち ら)・・・ドラえもん、ドラゴンボール、バグってハニー など 第2回講座 MAPPER19の吸い出し方 今回はファミスタ’90を題材に吸い出しの方法を教えます。 吸出し機やプログラムは「ろむを吸おうぜっ」のもの基本とします。 http://www.ced.cas.uec.ac.jp/~h11099/romread/ まずファミスタ’90をMAPPER0でPRGを32K吸い出します。 それを逆アセンブラすると次のようなMAPPER切り替え場所が見つかります。 00/8061: A9 7C LDA #$7C 00/8063: 8D 00 E0 STA $E000 00/8066: A9 3D LDA #$3D 00/8068: 8D 00 E8 STA $E800 00/806B: A9 3E LDA #$3E 00/806D: 8D 00 F0 STA $F000 00/8070: A9 10 LDA #$10 00/8072: 85 19 STA $19 00/8074: 8D 00 80 STA $8000 00/8077: A9 11 LDA #$11 00/8079: 85 1A STA $1A 00/807B: 8D 00 88 STA $8800 00/807E: A9 12 LDA #$12 00/8080: 85 1B STA $1B 00/8082: 8D 00 90 STA $9000 00/8085: A9 13 LDA #$13 00/8087: 85 1C STA $1C 00/8089: 8D 00 98 STA $9800 00/808C: A9 04 LDA #$04 00/808E: 85 1D STA $1D 00/8090: 8D 00 A0 STA $A000 00/8093: A9 05 LDA #$05 00/8095: 85 1E STA $1E 00/8097: 8D 00 A8 STA $A800 00/809A: A9 06 LDA #$06 00/809C: 85 1F STA $1F 00/809E: 8D 00 B0 STA $B000 00/80A1: A9 07 LDA #$07 00/80A3: 85 20 STA $20 00/80A5: 8D 00 B8 STA $B800 00/80A8: A9 E0 LDA #$E0 00/80AA: 8D 00 C0 STA $C000 00/80AD: A9 E1 LDA #$E1 00/80AF: 8D 00 C8 STA $C800 00/80B2: A9 E0 LDA #$E0 00/80B4: 8D 00 D0 STA $D000 00/80B7: A9 E1 LDA #$E1 00/80B9: 8D 00 D8 STA $D800 00/80BC: A9 00 LDA #$00 00/80BE: 8D 00 50 STA $5000 00/80C1: A9 00 LDA #$00 00/80C3: 8D 00 58 STA $5800 00/80C6: A9 7F LDA #$7F 00/80C8: 8D 00 F8 STA $F800 00/80CB: 60 RTS 注意事項:左のアドレスは逆アセンブラの際のアドレスで実際とは異なります。 解説:8061h-806FhまでがPRGの情報、8070-80A7までがCHRの情報です。 これを吸い出しプログラム用にパラメーター化したものが下記のモノです。(プログラム250行 たり) if(type == 4) { if(mem == PRG) { set_address(0xE000); write_prg(8); INC_ADR; write_prg(bank<<1); set_address(0xE800); write_prg(9); INC_ADR; write_prg((bank<<1)+1); } else { set_address(0x8000); write_prg(0x00); INC_ADR; write_prg(bank<<3); set_address(0x8800); write_prg(0x01); INC_ADR; write_prg((bank<<3)+1); set_address(0x9000); write_prg(0x02); INC_ADR; write_prg((bank<<3)+2); set_address(0x9800); write_prg(0x03); INC_ADR; write_prg((bank<<3)+3); set_address(0xA000); write_prg(0x04); INC_ADR; write_prg((bank<<3)+4); set_address(0xA800); write_prg(0x05); INC_ADR; write_prg((bank<<3)+5); set_address(0xB000); write_prg(0x06); INC_ADR; write_prg((bank<<3)+6); set_address(0xB800); write_prg(0x07); INC_ADR; write_prg((bank<<3)+7); } 注意: 今回はヘッダー情報はMAPPER4になるようにしていますが実際はMAPPEER19の 為、吸出し後の書き換えが必要です。またMAPPER19はこのほかにフォーマットが有るら しく吸えないものも有ります。 吸い出せたもの:ファミスタ’90〜94、ドラゴンニンジャ、スプラッターハウス、妖怪道中 記など 吸い出せなかったもの:貝獣物語、じゅうべえくえすと、キングオブキングス、ナムコクラシッ ク、マインドシーカーなど 特殊な方法なもの:独眼竜政宗 第3回講座 MAPPER16の吸い出し方 まじかるタルるートくんを題材に吸い出しの方法を教えます。 まずれいのごとくをMAPPER0でPRGを32K吸い出します。 それを逆アセンブラすると次のようなMAPPER切り替え場所が見つかります。 00/989B: 85 50 STA $50 00/989D: 8D 08 80 STA $8008 00/98A0: 60 RTS 00/98A1: A5 8A LDA $8A 00/98A3: 29 02 AND #$02 00/98A5: 8D 09 80 STA $8009 00/98A8: A5 48 LDA $48 00/98AA: 8D 00 80 STA $8000 00/98AD: A5 49 LDA $49 00/98AF: 8D 01 80 STA $8001 00/98B2: A5 4A LDA $4A 00/98B4: 8D 02 80 STA $8002 00/98B7: A5 4B LDA $4B 00/98B9: 8D 03 80 STA $8003 00/98BC: A5 4C LDA $4C 00/98BE: 8D 04 80 STA $8004 00/98C1: A5 4D LDA $4D 00/98C3: 8D 05 80 STA $8005 00/98C6: A5 4E LDA $4E 00/98C8: 8D 06 80 STA $8006 00/98CB: A5 4F LDA $4F 00/98CD: 8D 07 80 STA $8007 00/98D0: 60 RTS 注意事項:左のアドレスは逆アセンブラの際のアドレスで実際とは異なります。 解説:989Bh-989FhまでがPRGの情報、98A8-98CFまでがCHRの情報です。 これを吸い出しプログラム用にパラメーター化したものが下記のモノです。 if(type == 5) { if(mem == PRG) { set_address(0x8008); write_prg(bank); } else { set_address(0x8000); write_prg((bank<<3)+0); set_address(0x8001); write_prg((bank<<3)+1); set_address(0x8002); write_prg((bank<<3)+2); set_address(0x8003); write_prg((bank<<3)+3); set_address(0x8004); write_prg((bank<<3)+4); set_address(0x8005); write_prg((bank<<3)+5); set_address(0x8006); write_prg((bank<<3)+6); set_address(0x8007); write_prg((bank<<3)+7); } 注意: 今回はヘッダー情報はMAPPER5になるようにしていますが実際はMAPPEER16の 為、 吸出し後の書き換えが必要です。掲示板の方に16以降にMAPPERに対応する為の法が 掲載されています。 鷲羽の掲示板←掲示板が有るのに気付かなかったという事を良く聞くのでここで宣伝します。 これでナイトガンダム物語以降発売された純正なバンダイの発売カセットはほぼ吸い出せます。 吸出し可能なもの:ナイトガンダム物語シリーズ、ドラゴンボールZシリーズ、DATACHシ リーズ など くまで予想:カラオケセットなども吸出し可能だと思います。 第4回講座 MAPPER32の吸い出し方 パーマンを題材に吸い出しの方法を教えます。 まずれいのごとくをMAPPER0でPRGを32K吸い出します。 それを逆アセンブラすると次のようなMAPPER切り替え場所が見つかります。 00/AF6E: A9 06 LDA #$06 00/AF70: 8D 00 80 STA $8000 00/AF73: A9 07 LDA #$07 00/AF75: 8D 00 A0 STA $A000 00/AF78: A9 15 LDA #$15 00/AF7A: 8D 00 B0 STA $B000 00/AF7D: A9 14 LDA #$14 00/AF7F: 8D 01 B0 STA $B001 00/AF82: A9 3D LDA #$3D 00/AF84: 8D 02 B0 STA $B002 00/AF87: A9 3C LDA #$3C 00/AF89: 8D 03 B0 STA $B003 00/AF8C: A9 7C LDA #$7C 00/AF8E: 8D 04 B0 STA $B004 00/AF91: A9 7E LDA #$7E 00/AF93: 8D 05 B0 STA $B005 00/AF96: A9 7F LDA #$7F 00/AF98: 8D 06 B0 STA $B006 00/AF9B: A9 00 LDA #$00 00/AF9D: 8D 07 B0 STA $B007 00/AFA0: 60 RTS 注意事項:左のアドレスは逆アセンブラの際のアドレスで実際とは異なります。 解説:AF6Eh-AF79hまでがPRGの情報、AF7A-AF9FまでがCHRの情報です。 これを吸い出しプログラム用にパラメーター化したものが下記のモノです。 if(type == 5) { if(mem == PRG) { set_address(0x9000); write_prg(0x00);/*←PRGの先頭をを[8][9]に呼び出す*/ set_address(0x8000); write_prg((bank<<1)+0); set_address(0xA000); write_prg((bank<<1)+1); } else { set_address(0xB000); write_prg((bank<<3)+0); set_address(0xB001); write_prg((bank<<3)+1); set_address(0xB002); write_prg((bank<<3)+2); set_address(0xB003); write_prg((bank<<3)+3); set_address(0xB004); write_prg((bank<<3)+4); set_address(0xB005); write_prg((bank<<3)+5); set_address(0xB006); write_prg((bank<<3)+6); set_address(0xB007); write_prg((bank<<3)+7); } } 吸出し可能なもの:パーマン、イメージファイト、迷宮島、メジャーリーグ など 次回の講座は「(未定)の吸い出し方」