FrontPage  Index  Search  Changes  Login

how to describe mapper scripts

CPU bank

banksize

banksize はマッパーごとに違います。使用されるタイプは 8K,16K,32K の3通り。

 8K 0x2000
16K 0x4000
32K 0x8000 (ROM area全部)

bankarea

CPU reset の処理の都合で bankarea の末尾は固定エリアになっていたり、reset 直後は ROM の末尾にあわせていることがほとんどです。

VitruaNES のソースの記載

SetPROM_8K_Bank( n, data )

0 $0000 main RAM
1 $2000 PPU IO
2 $4000 SOUND IO + extra IO
3 $6000 RAM (bankの場合もある)
4 $8000 ROM bank0
5 $a000 ROM bank1
6 $c000 ROM bank2
7 $f000 ROM bank3

SetPROM_16K_Bank( n, data )

0 $0000
1 $4000
2 $8000 ROM bank0
3 $c000 ROM bank1

SetPROM_32K_Bank( n, data )

0 $0000
1 $8000 ROM bank0

PPU bank

PPU キャラクタ area は RAM としても使えるので、ROM の場合のみ読み込む必要があります。

UNROM とディスクシステムは必ず RAM で、mmc1/3 の RPG は RAM の場合が多い気がします。

banksize

使用されるタイプは 1K,2K,4K,8K の3通り。

1K 0x0400
2K 0x0800
4K 0x1000
8K 0x2000 (PPU charcter 全部)

VitruaNES のソースの記載

スプライトキャラクタとBGキャラクタはプログラムで任意変更できますが、ここでは下記とします。

$0000-$0fff BG
$1000-$1fff sprite

SetVROM_1K_Bank( n, data )

0 $0000-$03ff BG bank0, name $000-$07f
1 $0400-$07ff BG bank1, name $080-$0ff
2 $0800-$0bff BG bank2, name $100-$17f
3 $0c00-$0fff BG bank3, name $180-$1ff
4 $1000-$13ff sprite bank0
5 $1400-$17ff sprite bank1
6 $1800-$1bff sprite bank2
7 $1c00-$1fff sprite bank3

SetVROM_2K_Bank( n, data )

0 $0000-$07ff BG bank0, name $000-$0ff
1 $0800-$0fff BG bank1, name $100-$1ff
2 $1000-$17ff sprite bank0
3 $1800-$1fff sprite bank1

SetVROM_4K_Bank( n, data )

0 $0000-$0fff BG
1 $1000-$1fff sprite
2 $2000-$2fff nametable
3 $3000-$3fff palette

SetVROM_8K_Bank( n, data )

0 $0000

実際にかいてみる -市販ソフト編-

用意するもの:

  • mapper の仕様が分かる資料
  • ROM image のデータベースなどソフトの仕様とチェックサムが分かる資料
  • 読み出したいカートリッジ

カートリッジの仕様を調べる

データベースで資料を拾ってきます。

Fudou Myouou Den
header 080H---
allsize 393,232 (byte)
prgsize 256 (K)
chrsize 128 (K)
allcrc 7678f1d5
prgcrc 9832d15a
chrcrc aaa9acdd
  • header から mapper 番号をスクリプトに書きます。
    • H, V は初期のソフトを除いて使用していないのでとりあえずかかなくてよいです。
    • S は現在未対応です。どなたかハードウェアの仕様を教えてください。
    • 4 は対応ソフトが少ないので未対応です。
    • T が記載されたデータは本当の ROM にはないので使わないでください。
  • prgsize から CPU_ROMSIZE を記載します。
  • chrsize から PPU_ROMSIZE を記載します。0 の場合はキャラクタRAMなのでかかなくてもよいです。
    • 同じマッパで ROM 容量が異なる場合、最大値をいれておくのが無難です。
    • ROM SIZE が設定の値と異なる場合は小さい ROM SIZE に自動的に修正しますが、指定サイズ分読み込むので時間がかかります。
  • mapper 番号からマッパやソフトの名前をコメントに入れておきましょう。

ここまでのスクリプト

#Taito X1-005
#TFC-FM-5900
MAPPER 80
CPU_ROMSIZE 0x40000
PPU_ROMSIZE 0x20000

マッパの仕様を調べる

VirtuaNES の Mapper080.cpp より。switch( addr )から抜粋。

case	0x7EFA:
case	0x7EFB:
	SetPROM_8K_Bank( 4, data );
	break;
case	0x7EFC:
case	0x7EFD:
	SetPROM_8K_Bank( 5, data );
	break;
case	0x7EFE:
case	0x7EFF:
	SetPROM_8K_Bank( 6, data );
	break;

ここからプログラムROMのバンクの仕様を下記と判断します。

  • bank0 $7efa, bank1 $7efc, bank2 $7efe, bank3 固定
  • bank0と1を書き込んで固定エリア以外のデータを取ってくるのを末尾の手前まで繰り返す
  • bank2を書き込んで末尾のエリアを取ってくる
    • bank0,1から全てとってもいいのだけど、趣味と言うことで。

ここまでのスクリプト

STEP_START i 0 0x1e 2
	CPU_WRITE $7efa i
	CPU_WRITE $7efc i + 1
	CPU_READ $8000 0x4000
STEP_END
CPU_WRITE $7efe 0x1e
CPU_READ $c000 0x4000

VirtuaNES の Mapper080.cpp より。switch( addr )から抜粋の上編集。

case	0x7EF0:
	SetVROM_2K_Bank( 0, (data>>1)&0x3F );
	break;
case	0x7EF1:
	SetVROM_2K_Bank( 2, (data>>1)&0x3F );
	break;
case	0x7EF2:
	SetVROM_1K_Bank( 4, data );
	break;
case	0x7EF3:
	SetVROM_1K_Bank( 5, data );
	break;
case	0x7EF4:
	SetVROM_1K_Bank( 6, data );
	break;
case	0x7EF5:
	SetVROM_1K_Bank( 7, data );
	break;

今回は全てのキャラクタ領域を一度に設定して、データを取ってくることにします。

STEP_START i 0 0x80 8
	CPU_WRITE $7ef0 i
	CPU_WRITE $7ef1 i + 2
	CPU_WRITE $7ef2 i + 4
	CPU_WRITE $7ef3 i + 5
	CPU_WRITE $7ef4 i + 6
	CPU_WRITE $7ef5 i + 7
	PPU_READ 0 0x2000
STEP_END

読み出してみる

  • スクリプトを記載したら、エラーチェックが無いか確認してください。ループの設定はミスをしやすいので要注意。
  • 接触不良の判断はしていないのでカートリッジの端子を掃除しておくことをお勧めします。
  • うまく動けば下記のようにバンクが切り替わってると思います。
  • 同じチェックサムのデータが出た場合はバンクが切り替わってないので、スクリプトのバンクレジスタのアドレスを確認してください。
./unagi.exe x1_005.map tfc_fm_5900.nes
00 01 CPU:
        ff ff ff ff d9 d9 d9 d9-da da da da bf bf bf bf; 0x1800be
02 03 CPU:
        00 00 00 00 01 01 01 01-02 02 02 02 03 03 03 03; 0x0f0daf
04 05 CPU:
        00 00 00 00 01 01 01 01-02 02 02 02 03 03 03 03; 0x10d284
06 07 CPU:
        00 00 00 00 01 01 01 01-02 02 02 02 03 03 03 03; 0x0bca29
(以下略)

動かしてみる

  • エミュレータで起動します。
  • ROM 情報を確認して同じ CRC が得られれば成功と言えます。
    • CRC 情報の正確さは 90% ぐらいと思ってください。
    • バージョン違いや hackrom や読み込み失敗(したけど動いてしまう)などが合わさるので、それらを総合的に判断するしかないです。
    • 確実さを求めるなら、カートリッジから ROM を外してダイレクトに読み込むしかありません。
Last modified:2008/12/18 20:44:49
Keyword(s):
References: