HuCard の memory mapping

hardware address (21bit) と software address (16bit)

CPU は 16bit address として動きますが、内蔵された memory controller によって 21bit address に変換されます.
仕様を説明した文書によっては CPU address でのみ記述されていることもありますが、どちらのアドレスが書いてあるのか判断できない場合があり混乱の原因となります.

software 16bit address 空間は 0x2000 byte 単位で区切られた 8 つの banked area を持ちます. この文書では CPU がアクセスする banked area を CPU bank, 各 banked area で切り替えられる値を CPU page と呼びます (これも文書によって定義がバラバラで混乱する, よくあるのは区別せずに両方とも bank になってる).

softaddress name
-------------------
$0000-$1fff bank #0
$2000-$3fff bank #1
$4000-$5fff bank #2
$6000-$7fff bank #3
$8000-$9fff bank #4
$a000-$bfff bank #5
$c000-$dfff bank #6
$e000-$ffff bank #7

hardware 21bit address 空間は software address と各 bank の page の値を合成した値になります. このaddressによってCPUがどのデバイスにつながっているかわかります.

page hardaddress 
----------------------
0x00 0x000000-0x001fff
...
0x7f 0x0fe000-0x0fffff
...
0xff 0x1fe000-0x1fffff

PCE 回路としては page 0xf8 から 0xff に RAM や VDC/VCE の内部デバイスがつがっていて、 page 0x00 から 0xf7 は外部デバイスが自由に定義できます.

HuCard の hardware address 定義

実際に使われた HuCard は page 0x00 から 0x7f を使っています. この領域を大きく 2 つに分けています.

page      hardaddress       device
-------------------------------------
0x00-0x3f 0x000000-0x07ffff memory #0
0x40-0x7f 0x080000-0x0fffff memory #1

注意したいのが HuCard のコネクタには CPU address bus は全て配線されているので全領域に device を配置することができます. 市販品はこれ以外も実装できるのにその必要がないのでやってないだけです.

Hucard 種別その1: ROM #0 だけ

2Mbit (0x40000 byte) 以下と 4Mbit(0x80000 byte) の容量での設定です.
ROM memory #0 の領域に満たせない場合は mirror となります.

page      hardaddress       device
-------------------------------------
0x00-0x3f 0x000000-0x07ffff ROM #0 (readonly)
0x40-0x7f 0x080000-0x0fffff ROM #0 (mirror, readonly)

Hucard 種別その2: ROM #0 と ROM #1

3Mbit (0x40000+0x20000byte), 6Mbit(0x80000+0x40000byte), 8Mbit(0x80000+0x80000byte) の容量での設定です. 各領域の容量を満たさない場合は ROM #0, ROM #1 ともに個別に mirror があります.

page      hardaddress       device
-------------------------------------
0x00-0x3f 0x000000-0x07ffff ROM #0 (readonly)
0x40-0x7f 0x080000-0x0fffff ROM #1 (readonly)

Hucard 種別その3: ROM と RAM

Super System Card, Populus にあります. mirror の部分も同じ. 天の声バンクとアーケードカードは調べてないので違うかも.

page      hardaddress       device
-------------------------------------
0x00-0x3f 0x000000-0x07ffff ROM (readonly)
0x40-0x7f 0x080000-0x0fffff RAM (read and write)

Hucard 種別その4: Street Fighter II' Champion Edition

page      hardaddress       device
-------------------------------------
0x00      0x001ff0-0x001ff3 ROM #1 bank register (writeonly)
0x00-0x3f 0x000000-0x07ffff ROM #0 (readonly, fixed)
0x40-0x7f 0x080000-0x0fffff ROM #1 (readonly, banked)

ROM #1 容量が hardware address 空間を越えてますので, CPU とは別の bank 切り替えが発生します. ROM #1 は 4 page を持ちます.

hardaddress assignments
-----------------------------
0x001ff0    ROM #1 set page 0
0x001ff1    ROM #1 set page 1
0x001ff2    ROM #1 set page 2
0x001ff3    ROM #1 set page 3

ROM #1 の bank register は絶対 address です *1. 各 register に書く data は無関係で, address によって同じbank の page を選択するという珍しい実装になっています.

*1:$1ff0-$1ff3 と書いていた文書に腹が立ってこれを書いた