bsnes-hd/bsnes/sfc/smp/memory.cpp
2020-01-12 22:12:37 +01:00

42 lines
1.3 KiB
C++

auto SMP::readRAM(uint16 address) -> uint8 {
if(address >= 0xffc0 && io.iplromEnable) return iplrom[address & 0x3f];
if(io.ramDisable) return 0x5a; //0xff on mini-SNES
return dsp.apuram[address];
}
auto SMP::writeRAM(uint16 address, uint8 data) -> void {
//writes to $ffc0-$ffff always go to apuram, even if the iplrom is enabled
if(io.ramWritable && !io.ramDisable) dsp.apuram[address] = data;
}
auto SMP::idle() -> void {
waitIdle();
}
auto SMP::read(uint16 address) -> uint8 {
//Kishin Douji Zenki - Tenchi Meidou requires bus hold delays on CPU I/O reads.
//smp_mem_access_times requires no bus hold delays on APU RAM reads.
if((address & 0xfffc) == 0x00f4) {
wait(address, 1);
uint8 data = readRAM(address);
if((address & 0xfff0) == 0x00f0) data = readIO(address);
wait(address, 1);
return data;
} else {
wait(address, 0);
uint8 data = readRAM(address);
if((address & 0xfff0) == 0x00f0) data = readIO(address);
return data;
}
}
auto SMP::write(uint16 address, uint8 data) -> void {
wait(address);
writeRAM(address, data); //even IO writes affect underlying RAM
if((address & 0xfff0) == 0x00f0) writeIO(address, data);
}
auto SMP::readDisassembler(uint16 address) -> uint8 {
if((address & 0xfff0) == 0x00f0) return 0x00;
return readRAM(address);
}