Version 1, last updated by optixx at September 09, 2009 13:17 UTC
memoryMapBSNES
CPU RAM Regions
MMIOAccess mmio; StaticRAM wram(128 * 1024); StaticRAM apuram(64 * 1024); StaticRAM vram(64 * 1024); StaticRAM oam(544); StaticRAM cgram(512);
Simple Cart Layouts
LoRom
Cartridge::LoROM: map(MapLinear, 0x00, 0x7f, 0x8000, 0xffff, memory::cartrom); map(MapLinear, 0x80, 0xff, 0x8000, 0xffff, memory::cartrom); map_generic_sram();
HiRom
Cartridge::HiROM: map(MapShadow, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom); map(MapLinear, 0x40, 0x7f, 0x0000, 0xffff, memory::cartrom); map(MapShadow, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom); map(MapLinear, 0xc0, 0xff, 0x0000, 0xffff, memory::cartrom); map_generic_sram();
Mapping Method
void Bus::map(
MapMode mode,
uint8 bank_lo, uint8 bank_hi,
uint16 addr_lo, uint16 addr_hi,
Memory &access, unsigned offset, unsigned size
) {
assert(bank_lo > 8;
uint8 page_hi = addr_hi >> 8;
unsigned index = 0;
switch(mode) {
case MapDirect: {
for(unsigned bank = bank_lo; bank << 16) + (page << 8), access, (bank << 16) + (page << 8));
}
}
} break;
case MapLinear: {
for(unsigned bank = bank_lo; bank << 16) + (page << 8), access, mirror(offset + index, access.size()));
index += 256;
if(size) index %= size;
}
}
} break;
case MapShadow: {
for(unsigned bank = bank_lo; bank << 16) + (page << 8), access, mirror(offset + index, access.size()));
index += 256;
if(size) index %= size;
}
index += (255 - page_hi) * 256;
if(size) index %= size;
}
} break;
}
}
Sram Mapping
void sBus::map_generic_sram() {
if(memory::cartram.size() == 0 || memory::cartram.size() == -1U) { return; }
map(MapLinear, 0x20, 0x3f, 0x6000, 0x7fff, memory::cartram);
map(MapLinear, 0xa0, 0xbf, 0x6000, 0x7fff, memory::cartram);
//research shows only games with very large ROM/RAM sizes require MAD-1 memory mapping of SRAM
//otherwise, default to safer, larger SRAM address window
uint16 addr_hi = (memory::cartrom.size() > 0x200000 || memory::cartram.size() > 32 * 1024) ? 0x7fff : 0xffff;
map(MapLinear, 0x70, 0x7f, 0x0000, addr_hi, memory::cartram);
if(cartridge.mapper() != Cartridge::LoROM) return;
map(MapLinear, 0xf0, 0xff, 0x0000, addr_hi, memory::cartram);
}