メモリー マッパー
カートリッジに割り当てられたリニアなメモリー空間は 0x000000 〜 0x7FFFFF の4MBytesですが、後期のソフトはより大きなROMサイズを必要とする様になります。 つまり4MBytesを超えるメモリー空間が必要なソフトでは、 他機種と同じくメモリー マッパーが必要になります。 ここでは Super Street Fighter II に搭載されたマッパーについて解説します。
マッパー I/Oのアドレス
以下の8つのI/Oポートがあります。
0xA130F1 ROM/RAM選択 0xA130F3 68000のメモリー空間 0x080000 〜 0x0FFFFF に割り当てるカートリッジ領域 0xA130F3 68000のメモリー空間 0x100000 〜 0x17FFFF に割り当てるカートリッジ領域 0xA130F5 68000のメモリー空間 0x180000 〜 0x1FFFFF に割り当てるカートリッジ領域 0xA130F7 68000のメモリー空間 0x200000 〜 0x27FFFF に割り当てるカートリッジ領域 0xA130F9 68000のメモリー空間 0x280000 〜 0x2FFFFF に割り当てるカートリッジ領域 0xA130FB 68000のメモリー空間 0x300000 〜 0x37FFFF に割り当てるカートリッジ領域 0xA130FD 68000のメモリー空間 0x380000 〜 0x3FFFFF に割り当てるカートリッジ領域
メモリータイプとプロテクト
ポート 0xA130F1 で68000のメモリー空間 0x200000 〜 0x3FFFFF がROMかRAMかを指定します。 これはバックアップRAM等の書き込み可能なメモリー空間を持つカートリッジで有用です。 Bit 0 に 1 をセットするとRAMとなります。 Bit 1 に 0 をセットすると書き込み可能になります。 つまりROMのみで構成されたカートリッジでは0xA130F1 に 0x00 を書き込めば良い事になります。
バンク切り替えポート
ポート 0xA130F3 〜 0xA130FF は 512KBytes 単位で区切られた個々のバンクに割り当てるカートリッジ領域をセットします。 68000のメモリー空間 0x000000 〜 0x07FFFF に対してバンク切り替えを行うことは出来ず、 カートリッジ領域 0x000000 〜 0x07FFFF に固定されています。
コード例
簡易的にROMカートリッジの前半4MBytesをリニアにマッピングする例を以下に挙げます。
*(uchar *)0xA130F1 = 0x00; /* ROM/RAM Select & Writable */ *(uchar *)0xA130F3 = 0x01; /* 0.5M */ *(uchar *)0xA130F5 = 0x02; /* 1.0M */ *(uchar *)0xA130F7 = 0x03; /* 1.5M */ *(uchar *)0xA130F9 = 0x04; /* 2.0M */ *(uchar *)0xA130FB = 0x05; /* 2.5M */ *(uchar *)0xA130FD = 0x06; /* 3.0M */ *(uchar *)0xA130FF = 0x07; /* 3.5M */