SUNSOFT-4 の調査

昨日は FME-7 を解析してましたが、解析意欲の原因は SUNSOFT-4 だったりします。 SUNSOFT-4 の使用ソフトはアフターバーナーマハラジャ、なんてったってベースボールの3つでなんか濃いです。

この SUNSOFT-4 は 163 のように VRAM CS を制御しているために、 name table に ROM を振ることが出来ます。name table というのは背景にキャラクタの指定をするデータで RAM にするのが普通です。RAM にすると当然ながらプログラムで VRAM を書き換える必要があり、更新に時間が必要です。

ここを ROM にすると CPU からの書き換えがバンク切り替えだけになるので更新がすぐにできます。しかし、0x400 byte 単位の切り換えですから、128 通りの画面情報を持つだけで 1Mbit になってしまいます。文字列を1文字ずつ順番に表示するのに ROM として使うとすぐに容量不足になりますし、中身がスカスカなデータになってしまいます。

name table を ROM にするという用途は、画面のバリエーションが少ないレースゲーム(F1レースとかマッハライダーのネームテーブルを確認してみてください)のような、疑似3Dゲームに使うことができます。.... というわけでアフターバーナーは背景が高速に切り替わっている理由がここにあります。

アフターバーナーではスコアは常に表示されず、特定の期間に表示されるだけですが、これはスプライトでやっているので、そのときに敵がでてこなかったりとか配慮されてますね。この仕組みを思いついてハードを製作してセガからライセンスをとって販売したサンソフトさんは変態さんだと思います。これこそ好景気のなせる業なのかもしれません。

補足しますと、表示期間中に name table を ROM から RAM に切り換えることも可能でして、画面の3/4をROMで疑似3D画面、残り1/4をVRAMでスコアやステータス表示も可能かもしれません。SUNSOFT-4 は汎用性が欠けたりタイマ割り込み機能がないので 163 を使った方がいいかと思いますが、レースゲームを自分で作りたいという人はやってみてください。

アフターバーナーのカートリッジ

http://bootgod.dyndns.org:7777/profile.php?id=3806

Program ROM 1M, Charcter/Nametable ROM 1M x2 で基板の面積がたりないのか SUNSOFT-4 が斜めになっています。こんな基板初めて見た。

今回は name table の address から Charcter ROM を dump してみることにしました。例によって、 anago に手を加えているのでソースをさわれない人は動かせないスクリプトです。

function ppu_dump(d, pagesize, banksize)
{
	//dump uses 0x2000-0x23ff*/
	cpu_write(d, 0xe000, 0x13);
	for(local i = 0; i < pagesize*2; i += 1){
		cpu_write(d, 0xd000, i);
		ppu_read(d, 0x2000, 0x400);
	}
}

これの結果としてキャラクタ兼ネームテーブル ROM は後半の 1M bit のみが得られました。nesdev の wiki にも言及されており、これは事実でしょう。

$C000-$CFFF: Nametable register 0

Map a 1 KiB CHR ROM bank in place of the lower nametable (CIRAM $000-$3FF). Only D6-D0 are used; D7 is ignored and treated as 1, so nametables must be in the last 128 KiB of CHR ROM.

PPU bank のレジスタは D6:0 が有効の 7bit レジスタx6だと思われます。charcter bank は 0x800 byte 単位で 0x00000-0x3ffff までアクセス可能、name table bank は 0x400 byte で 0x20000-0x3ffff までアクセス可能とすれば辻褄があいます。

ROM を2つに分離した理由はよくわかりません。アクセススピードの問題かでしょうか....?

マハラジャのカートリッジ

http://bootgod.dyndns.org:7777/profile.php?id=3852

program ROM 1Mbit, charcter/nametable ROM 1Mbit, work RAM 64Kbit + 電池というわりと普通のカートリッジです。アフターバーナーと同様のスクリプトを使ったら、charcter/nametable ROM が全て dump できました。

マハラジャは name table ROM 機能は使っていないようです。

なんてったってベースボールのカートリッジ

http://bootgod.dyndns.org:7777/profile.php?id=2265

野球データを更新するためにサブカートリッジを持つという変態カートリッジ。
当初下記のスクリプトでやってみたら、Program ROM データが正しく出てきませんでした。

function cpu_dump(d, pagesize, banksize)
{
	for(local i = 0; i < pagesize - 1; i += 1){
		cpu_write(d, 0xf000, i);
		cpu_read(d, 0x8000, banksize);
	}
	cpu_read(d, 0xc000, banksize);
}

page #0-6 が 0xff で埋まっていて、末尾はデータが出てくる... ということで考え直して page #8-e を指定したらデータが出てきました。つまり前半1Mbitはサブカートリッジの領域で、後半1Mbitがメインカートリッジの領域となっているのでしょう。サブカートリッジの端子数が30pinなんで都合が良さそうです。

配線は未調査ですが 7432 は A18 と program ROM EN# を main ROM program EN# と sub program ROM EN# で分離すると思うんですが、反転ゲートは入ってないし、その用途で使うなら 74139 が普通なのでちょっと謎です。

なおキャラクタデータは 1Mbit なので nametable 領域から dump できました。