mirror of https://github.com/bsnes-emu/bsnes.git
56 lines
1.6 KiB
C++
56 lines
1.6 KiB
C++
auto CPU::readIWRAM(uint mode, uint32 addr) -> uint32 {
|
|
if(regs.memory.control.disable) return cpu.pipeline.fetch.instruction;
|
|
|
|
if(mode & Word) return readIWRAM(Half, addr &~ 2) << 0 | readIWRAM(Half, addr | 2) << 16;
|
|
if(mode & Half) return readIWRAM(Byte, addr &~ 1) << 0 | readIWRAM(Byte, addr | 1) << 8;
|
|
|
|
return iwram[addr & 0x7fff];
|
|
}
|
|
|
|
auto CPU::writeIWRAM(uint mode, uint32 addr, uint32 word) -> void {
|
|
if(regs.memory.control.disable) return;
|
|
|
|
if(mode & Word) {
|
|
writeIWRAM(Half, addr &~2, word >> 0);
|
|
writeIWRAM(Half, addr | 2, word >> 16);
|
|
return;
|
|
}
|
|
|
|
if(mode & Half) {
|
|
writeIWRAM(Byte, addr &~1, word >> 0);
|
|
writeIWRAM(Byte, addr | 1, word >> 8);
|
|
return;
|
|
}
|
|
|
|
iwram[addr & 0x7fff] = word;
|
|
}
|
|
|
|
auto CPU::readEWRAM(uint mode, uint32 addr) -> uint32 {
|
|
if(regs.memory.control.disable) return cpu.pipeline.fetch.instruction;
|
|
if(!regs.memory.control.ewram) return readIWRAM(mode, addr);
|
|
|
|
if(mode & Word) return readEWRAM(Half, addr &~ 2) << 0 | readEWRAM(Half, addr | 2) << 16;
|
|
if(mode & Half) return readEWRAM(Byte, addr &~ 1) << 0 | readEWRAM(Byte, addr | 1) << 8;
|
|
|
|
return ewram[addr & 0x3ffff];
|
|
}
|
|
|
|
auto CPU::writeEWRAM(uint mode, uint32 addr, uint32 word) -> void {
|
|
if(regs.memory.control.disable) return;
|
|
if(!regs.memory.control.ewram) return writeIWRAM(mode, addr, word);
|
|
|
|
if(mode & Word) {
|
|
writeEWRAM(Half, addr &~2, word >> 0);
|
|
writeEWRAM(Half, addr | 2, word >> 16);
|
|
return;
|
|
}
|
|
|
|
if(mode & Half) {
|
|
writeEWRAM(Byte, addr &~1, word >> 0);
|
|
writeEWRAM(Byte, addr | 1, word >> 8);
|
|
return;
|
|
}
|
|
|
|
ewram[addr & 0x3ffff] = word;
|
|
}
|