ぴゅう太/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; }