Path: blob/master/libsnes/bsnes/snes/chip/bsx/cartridge/cartridge.cpp
2 views
#ifdef BSX_CPP12BSXCartridge bsxcartridge;34BSXCartridge::BSXCartridge()5: sram("BSX_RAM")6, psram("BSX_PRAM")7{8}910void BSXCartridge::init() {11}1213void BSXCartridge::load() {14sram.map(allocate<uint8>(32 * 1024, 0xff), 32 * 1024);15sram.write_protect(false);16cartridge.nvram.append({ "bsx.ram", sram.data(), sram.size() });1718psram.map(allocate<uint8>(512 * 1024, 0xff), 512 * 1024);19psram.write_protect(false);20cartridge.nvram.append({ "bsx.psram", psram.data(), psram.size() });21}2223void BSXCartridge::unload() {24}2526void BSXCartridge::power() {27}2829void BSXCartridge::reset() {30for(unsigned i = 0; i < 16; i++) r[i] = 0x00;31r[0x07] = 0x80;32r[0x08] = 0x80;33mmio_commit();34}3536uint8 BSXCartridge::memory_access(bool write, Memory &memory, unsigned addr, uint8 data) {37if(write == 0) return memory_read(memory, addr);38memory_write(memory, addr, data);39}4041uint8 BSXCartridge::memory_read(Memory &memory, unsigned addr) {42addr = bus.mirror(addr, memory.size());43return memory.read(addr);44}4546void BSXCartridge::memory_write(Memory &memory, unsigned addr, uint8 data) {47addr = bus.mirror(addr, memory.size());48return memory.write(addr, data);49}5051//mcu_access() allows mcu_read() and mcu_write() to share decoding logic52uint8 BSXCartridge::mcu_access(bool write, unsigned addr, uint8 data) {53if((addr & 0xe08000) == 0x008000) { //$00-1f:8000-ffff54if(r07 == 1) {55addr = ((addr & 0x1f0000) >> 1) | (addr & 0x7fff);56return memory_access(write, cartridge.rom, addr, data);57}58}5960if((addr & 0xe08000) == 0x808000) { //$80-9f:8000-ffff61if(r08 == 1) {62addr = ((addr & 0x1f0000) >> 1) | (addr & 0x7fff);63return memory_access(write, cartridge.rom, addr, data);64}65}6667if((addr & 0xe0e000) == 0x206000) { //$20-3f:6000-7fff68return memory_access(write, psram, addr, data);69}7071if((addr & 0xf00000) == 0x400000) { //$40-4f:0000-ffff72if(r05 == 0) return memory_access(write, psram, addr & 0x0fffff, data);73}7475if((addr & 0xf00000) == 0x500000) { //$50-5f:0000-ffff76if(r06 == 0) return memory_access(write, psram, addr & 0x0fffff, data);77}7879if((addr & 0xf00000) == 0x600000) { //$60-6f:0000-ffff80if(r03 == 1) return memory_access(write, psram, addr & 0x0fffff, data);81}8283if((addr & 0xf80000) == 0x700000) { //$70-77:0000-ffff84return memory_access(write, psram, addr & 0x07ffff, data);85}8687if(((addr & 0x408000) == 0x008000) //$00-3f|80-bf:8000-ffff88|| ((addr & 0x400000) == 0x400000) //$40-7f|c0-ff:0000-ffff89) {90if(r02 == 0) addr = ((addr & 0x7f0000) >> 1) | (addr & 0x7fff);91Memory &memory = (r01 == 0 ? (Memory&)bsxflash : (Memory&)psram);92return memory_access(write, memory, addr & 0x7fffff, data);93}9495return cpu.regs.mdr;96}9798uint8 BSXCartridge::mcu_read(unsigned addr) {99return mcu_access(0, addr);100}101102void BSXCartridge::mcu_write(unsigned addr, uint8 data) {103mcu_access(1, addr, data);104}105106uint8 BSXCartridge::mmio_read(unsigned addr) {107if((addr & 0xf0ffff) == 0x005000) { //$00-0f:5000108uint8 n = (addr >> 16) & 15;109return r[n];110}111112if((addr & 0xf8f000) == 0x105000) { //$10-17:5000-5fff113return memory_read(sram, ((addr >> 16) & 7) * 0x1000 + (addr & 0xfff));114}115116return 0x00;117}118119void BSXCartridge::mmio_write(unsigned addr, uint8 data) {120if((addr & 0xf0ffff) == 0x005000) { //$00-0f:5000121uint8 n = (addr >> 16) & 15;122r[n] = data;123if(n == 0x0e && data & 0x80) mmio_commit();124return;125}126127if((addr & 0xf8f000) == 0x105000) { //$10-17:5000-5fff128return memory_write(sram, ((addr >> 16) & 7) * 0x1000 + (addr & 0xfff), data);129}130}131132void BSXCartridge::mmio_commit() {133r00 = r[0x00] & 0x80;134r01 = r[0x01] & 0x80;135r02 = r[0x02] & 0x80;136r03 = r[0x03] & 0x80;137r04 = r[0x04] & 0x80;138r05 = r[0x05] & 0x80;139r06 = r[0x06] & 0x80;140r07 = r[0x07] & 0x80;141r08 = r[0x08] & 0x80;142r09 = r[0x09] & 0x80;143r0a = r[0x0a] & 0x80;144r0b = r[0x0b] & 0x80;145r0c = r[0x0c] & 0x80;146r0d = r[0x0d] & 0x80;147r0e = r[0x0e] & 0x80;148r0f = r[0x0f] & 0x80;149}150151#endif152153154