script 仕様策定

dump にいろいろパラメータを追加したり、名称を整理してた。落ち着いてみると dump/workram/program と全て統合できそうな様子。

script で各機能の対応状況を変数にうめると、それをとってきてリストアップし直すのはあまりよろしくないと思うので、 dump だけは .ad, dump + workram は .ae と拡張子を替えていこうというところまでは昨夜の決定事項。それに flash を追加するとどうなるか。

dump は最低限機能だと思うので、そこから4通り。

.ad: dump
.ae: dump + workram
.af: dump           + program
.ag: dump + workram + program

てな感じでよいかしら。それを踏襲した mmc1_surom.ae はいまのところこんな感じになっている。

/*
SUROM:
Dragon Quest IV, Dragon Warrior III, Dragon Warrior IV, Ninjara Hoi!
SXROM:
Best Play Pro Yakyuu Special, Final Fantasy I & II
*/
board <- {
	mappernum = 1, vram_mirrorfind = false, ppu_ramfind = false,
	cpu_rom = {
		size_base = 4 * mega, size_max = 4 * mega,
		banksize = 0x4000, 
	}, 
	cpu_ram = {
		size_base = 0x2000, size_max = 0x8000,
		banksize = 0x2000
	},
	ppu_rom = {
		size_base = 0, size_max = 0,
		banksize = 0x1000, 
	}
};

dofile("mmc1.ai"); //mmc1_write() の実装を include

function cpu_dump(d, pagesize, banksize)
{
	cpu_write(d, 0x8000, 0x80); //serial count reset
	mmc1_write(d, 0x8000, 0x0c); //CPU/PPU bank configuration
	for(local i = 0; i < pagesize; i += 0x10){
		mmc1_write(d, 0xa000, (i & 0x10) | 1);
		for(local j = 0; j < 0x10 - 1; j += 1){
			mmc1_write(d, 0xe000, j | 0x10);
			cpu_read(d, 0x8000, banksize);
		}
		cpu_read(d, 0xc000, banksize);
	}
}

/*
http://nesdevwiki.org/wiki/SXROM
 CHR bank 0 (internal, $A000-$BFFF)
4bit0
-----
PSSxC
||| |
||| +- Select 4 KB CHR RAM bank at PPU $0000 (ignored in 8 KB mode)
|++--- Select 8 KB PRG RAM bank
+----- Select 256 KB PRG ROM bank
*/

function cpu_ram_access(d, pagesize, banksize)
{
	mmc1_write(d, 0x8000, 1 << 3);
	mmc1_write(d, 0xe000, 0);
	for(local i = 0; i < pagesize; i += 1){
		mmc1_write(d, 0xa000, 0);
		cpu_ramrw(d, 0x6000, banksize);
	}
	mmc1_write(d, 0xe000, 0xff);
}

CPUROM($8000-$ffff), CPURAM($6000-$7fff), PPUROM/RAM(0x0000-0x1fff) の3つデバイスを明確に別けたこと、デフォルト容量と最大容量を2つ記載。RAM にかんしては SKROM, SNROM <-> SXROM と EKROM, ETROM <-> EWROM ぐらいのかなりマイナーな要求に答えるとこんな感じ。

統合はいいんだが、それに着いてこられる人がどこまでいるかだな。