ぴゅう太に2Mビットフラッシュメモリカートリッジをつないでみる

ぴゅう太/Jr/mk2のカートリッジスロットに、256KB ROM(EN29F0002T)をつなぐ方法を考えてみました。

ePyutaの改造方法は以下になります。市販されていない256KBカートリッジのみ拡張メガロム機能が有効になります。

http://www.geocities.jp/parallel_computer_inc/epyuta_mega.zip

使い方は、アドレス8002に値00-0Fを書き込むことで、16KB(8000-BFFF)が切り替わります。

2Mフラッシュメモリ(00000-3FFFF)のBANK0(00000-03FFF)は16KBカートリッジ(8000-BFFF)として起動します。なおBANK1(04000-07FFF)は固定(4000-7FFF)されています。つまり起動したら4000にジャンプしてバンク切り替え(8000-BFFF)する算段です。

memory.h

	uint8_t ipl[0x8000];	// ipl rom (32k)
	uint8_t basic[0x4000];	// basic rom (16k)
//	uint8_t cart[0x8000];	// cartridge (32k)
	uint8_t cart[0x40000];	// cartridge (256k)
	uint8_t extram[0x4000];	// extram (16k)

memory.cpp

///		MEGAROM
///		SET_BANK(0x0000, 0x3fff, wdmy, ipl); \
///		SET_BANK(0x4000, 0x7fff, wdmy, cart + 0x4000); \
///		SET_BANK(0x8000, 0xbfff, wdmy, cart); \

///		RAM & MEGAROM
///		SET_BANK(0x0000, 0x3fff, wdmy, ipl); \
///		SET_BANK(0x4000, 0x5fff, wdmy, cart + 0x4000); \
///		SET_BANK(0x6000, 0x7fff, extram, extram); \
///		SET_BANK(0x8000, 0xbfff, wdmy, cart); \
///		SET_BANK(0xc000, 0xdfff, extram + 0x2000, extram + 0x2000); \

#define ENABLE_CART() { \
	if (ctype == 5){ \
		SET_BANK(0x0000, 0x3fff, wdmy, ipl); \
		SET_BANK(0x4000, 0x7fff, wdmy, cart + 0x4000); \
		SET_BANK(0x8000, 0xbfff, wdmy, cart); \
	} else if (ctype == 4) { \
		SET_BANK(0x0000, 0x3fff, wdmy, ipl); \
		SET_BANK(0x4000, 0xbfff, wdmy, cart); \
	} else if (ctype == 3){ \
		SET_BANK(0x0000, 0x3fff, wdmy, ipl); \
		SET_BANK(0x4000, 0x5fff, wdmy, cart + 0x4000); \
		SET_BANK(0x6000, 0x7fff, extram, extram); \
		SET_BANK(0x8000, 0xbfff, wdmy, cart); \
		SET_BANK(0xc000, 0xdfff, extram + 0x2000, extram + 0x2000); \
	} else { \
		SET_BANK(0x0000, 0x7fff, wdmy, ipl); \
		SET_BANK(0x8000, 0xbfff, wdmy, cart); \
	} \
	cart_enabled = true; \
}

(省略)
void MEMORY::initialize()
{
	memset(ipl, 0xff, sizeof(ipl));
	memset(basic, 0xff, sizeof(basic));
	memset(cart, 0xff, sizeof(cart));
	memset(rdmy, 0xff, sizeof(rdmy));
	memset(extram, 0xff, sizeof(extram));
	
	bank=0;
(省略)
void MEMORY::write_data8(uint32_t addr, uint32_t data)
{
	addr &= 0xffff;
	if(addr == 0x8002) {
		bank = data & 0xf;
	} else if(addr < 0xe000) {
		wbank[addr >> 12][addr & 0xfff] = data;
	} else if(addr == 0xe000) {
(省略)
uint32_t MEMORY::read_data8(uint32_t addr)
{
	uint32_t val = 0;
	
	addr &= 0xffff;
	if(ctype == 5 && addr >= 0x8000 && addr < 0xc000) {
		return cart[bank * 0x4000 + addr - 0x8000];
	} else if(addr < 0xe000) {
		return rbank[addr >> 12][addr & 0xfff];
	} else if(addr == 0xe000) {
(省略)
void MEMORY::open_cart(const _TCHAR* file_path)
{
	// open cart
	FILEIO* fio = new FILEIO();
	
	if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
		// 8kb
		ctype = fio->Fread(cart, 0x2000, 1);
		memcpy(cart + 0x2000, cart, 0x2000);
		// 16kb
		ctype += fio->Fread(cart + 0x2000, 0x2000, 1);
		// 24kb
		ctype += fio->Fread(cart + 0x4000, 0x2000, 1);
		// 32kb
		ctype += fio->Fread(cart + 0x6000, 0x2000, 1);
		// 256kb
		ctype += fio->Fread(cart + 0x8000, 0x38000, 1);
		fio->Fclose();
		
		ENABLE_CART();
	}
	delete fio;
}