hack a peek into bsnesv115 (#3118)
This commit is contained in:
parent
a3c9b50930
commit
f060fdaa60
Binary file not shown.
|
@ -135,7 +135,7 @@ auto Cartridge::loadMap(Markup::Node map, T& memory) -> uint {
|
|||
auto mask = map["mask"].natural();
|
||||
if(size == 0) size = memory.size();
|
||||
if(size == 0) return print("loadMap(): size=0\n"), 0; //does this ever actually occur?
|
||||
return bus.map({&T::read, &memory}, {&T::write, &memory}, addr, size, base, mask);
|
||||
return bus.map({&T::read, &memory}, {&T::write, &memory}, addr, true, size, base, mask);
|
||||
}
|
||||
|
||||
auto Cartridge::loadMap(
|
||||
|
@ -147,7 +147,7 @@ auto Cartridge::loadMap(
|
|||
auto size = map["size"].natural();
|
||||
auto base = map["base"].natural();
|
||||
auto mask = map["mask"].natural();
|
||||
return bus.map(reader, writer, addr, size, base, mask);
|
||||
return bus.map(reader, writer, addr, false, size, base, mask);
|
||||
}
|
||||
|
||||
//memory(type=ROM,content=Program)
|
||||
|
@ -726,5 +726,5 @@ auto Cartridge::loadOBC1(Markup::Node node) -> void {
|
|||
auto Cartridge::loadMSU1() -> void {
|
||||
has.MSU1 = true;
|
||||
|
||||
bus.map({&MSU1::readIO, &msu1}, {&MSU1::writeIO, &msu1}, "00-3f,80-bf:2000-2007");
|
||||
bus.map({&MSU1::readIO, &msu1}, {&MSU1::writeIO, &msu1}, "00-3f,80-bf:2000-2007", false);
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@ auto SDD1::unload() -> void {
|
|||
auto SDD1::power() -> void {
|
||||
//hook S-CPU DMA MMIO registers to gather information for struct dma[];
|
||||
//buffer address and transfer size information for use in SDD1::mcu_read()
|
||||
bus.map({&SDD1::dmaRead, &sdd1}, {&SDD1::dmaWrite, &sdd1}, "00-3f,80-bf:4300-437f");
|
||||
bus.map({&SDD1::dmaRead, &sdd1}, {&SDD1::dmaWrite, &sdd1}, "00-3f,80-bf:4300-437f", true);
|
||||
|
||||
r4800 = 0x00;
|
||||
r4801 = 0x00;
|
||||
|
|
|
@ -87,20 +87,20 @@ auto CPU::power(bool reset) -> void {
|
|||
|
||||
reader = {&CPU::readRAM, this};
|
||||
writer = {&CPU::writeRAM, this};
|
||||
bus.map(reader, writer, "00-3f,80-bf:0000-1fff", 0x2000);
|
||||
bus.map(reader, writer, "7e-7f:0000-ffff", 0x20000);
|
||||
bus.map(reader, writer, "00-3f,80-bf:0000-1fff", true, 0x2000);
|
||||
bus.map(reader, writer, "7e-7f:0000-ffff", true, 0x20000);
|
||||
|
||||
reader = {&CPU::readAPU, this};
|
||||
writer = {&CPU::writeAPU, this};
|
||||
bus.map(reader, writer, "00-3f,80-bf:2140-217f");
|
||||
bus.map(reader, writer, "00-3f,80-bf:2140-217f", false);
|
||||
|
||||
reader = {&CPU::readCPU, this};
|
||||
writer = {&CPU::writeCPU, this};
|
||||
bus.map(reader, writer, "00-3f,80-bf:2180-2183,4016-4017,4200-421f");
|
||||
bus.map(reader, writer, "00-3f,80-bf:2180-2183,4016-4017,4200-421f", false);
|
||||
|
||||
reader = {&CPU::readDMA, this};
|
||||
writer = {&CPU::writeDMA, this};
|
||||
bus.map(reader, writer, "00-3f,80-bf:4300-437f");
|
||||
bus.map(reader, writer, "00-3f,80-bf:4300-437f", true);
|
||||
|
||||
if(!reset) random.array(wram, sizeof(wram));
|
||||
|
||||
|
|
|
@ -8,8 +8,8 @@ S21FX::S21FX() {
|
|||
resetVector.byte(0) = bus.read(0xfffc, 0x00);
|
||||
resetVector.byte(1) = bus.read(0xfffd, 0x00);
|
||||
|
||||
bus.map({&S21FX::read, this}, {&S21FX::write, this}, "00-3f,80-bf:2184-21ff");
|
||||
bus.map({&S21FX::read, this}, {&S21FX::write, this}, "00:fffc-fffd");
|
||||
bus.map({&S21FX::read, this}, {&S21FX::write, this}, "00-3f,80-bf:2184-21ff", false);
|
||||
bus.map({&S21FX::read, this}, {&S21FX::write, this}, "00:fffc-fffd", false);
|
||||
|
||||
booted = false;
|
||||
|
||||
|
@ -44,7 +44,7 @@ S21FX::~S21FX() {
|
|||
bus.map([vector](uint24 addr, uint8) -> uint8 {
|
||||
return vector >> addr * 8;
|
||||
}, [](uint24, uint8) -> void {
|
||||
}, "00:fffc-fffd", 2);
|
||||
}, "00:fffc-fffd", false, 2);
|
||||
|
||||
if(link.open()) link.close();
|
||||
linkInit.reset();
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
namespace SuperFamicom {
|
||||
|
||||
Satellaview::Satellaview() {
|
||||
bus.map({&Satellaview::read, this}, {&Satellaview::write, this}, "00-3f,80-bf:2188-219f");
|
||||
bus.map({&Satellaview::read, this}, {&Satellaview::write, this}, "00-3f,80-bf:2188-219f", false);
|
||||
regs = {};
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,10 @@ auto Bus::reduce(uint addr, uint mask) -> uint {
|
|||
return addr;
|
||||
}
|
||||
|
||||
auto Bus::peek(uint addr, uint8 data) -> uint8 {
|
||||
return peekable[lookup[addr]] ? read(addr, data) : 0;
|
||||
}
|
||||
|
||||
auto Bus::read(uint addr, uint8 data) -> uint8 {
|
||||
return reader[lookup[addr]](target[addr], data);
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ auto Bus::reset() -> void {
|
|||
reader[id].reset();
|
||||
writer[id].reset();
|
||||
counter[id] = 0;
|
||||
peekable[id] = true;
|
||||
}
|
||||
|
||||
//if(lookup) delete[] lookup;
|
||||
|
@ -34,7 +35,7 @@ auto Bus::reset() -> void {
|
|||
auto Bus::map(
|
||||
const function<uint8 (uint, uint8)>& read,
|
||||
const function<void (uint, uint8)>& write,
|
||||
const string& addr, uint size, uint base, uint mask
|
||||
const string& addr, bool isPeekable, uint size, uint base, uint mask
|
||||
) -> uint {
|
||||
uint id = 1;
|
||||
while(counter[id]) {
|
||||
|
@ -43,6 +44,7 @@ auto Bus::map(
|
|||
|
||||
reader[id] = read;
|
||||
writer[id] = write;
|
||||
peekable[id] = isPeekable;
|
||||
|
||||
auto p = addr.split(":", 1L);
|
||||
auto banks = p(0).split(",");
|
||||
|
|
|
@ -26,6 +26,7 @@ struct Bus {
|
|||
|
||||
~Bus();
|
||||
|
||||
alwaysinline auto peek(uint address, uint8 data = 0) -> uint8;
|
||||
alwaysinline auto read(uint address, uint8 data = 0) -> uint8;
|
||||
alwaysinline auto write(uint address, uint8 data) -> void;
|
||||
|
||||
|
@ -33,7 +34,7 @@ struct Bus {
|
|||
auto map(
|
||||
const function<uint8 (uint, uint8)>& read,
|
||||
const function<void (uint, uint8)>& write,
|
||||
const string& address, uint size = 0, uint base = 0, uint mask = 0
|
||||
const string& address, bool isPeekable, uint size = 0, uint base = 0, uint mask = 0
|
||||
) -> uint;
|
||||
auto unmap(const string& address) -> void;
|
||||
|
||||
|
@ -44,6 +45,7 @@ private:
|
|||
function<uint8 (uint, uint8)> reader[256];
|
||||
function<void (uint, uint8)> writer[256];
|
||||
uint counter[256];
|
||||
bool peekable[256];
|
||||
};
|
||||
|
||||
extern Bus bus;
|
||||
|
|
|
@ -186,7 +186,7 @@ auto PPU::power(bool reset) -> void {
|
|||
|
||||
function<uint8 (uint, uint8)> reader{&PPU::readIO, this};
|
||||
function<void (uint, uint8)> writer{&PPU::writeIO, this};
|
||||
bus.map(reader, writer, "00-3f,80-bf:2100-213f");
|
||||
bus.map(reader, writer, "00-3f,80-bf:2100-213f", false);
|
||||
|
||||
if(!reset) {
|
||||
for(auto& word : vram) word = 0x0000;
|
||||
|
|
|
@ -86,7 +86,7 @@ auto PPU::power(bool reset) -> void {
|
|||
|
||||
function<uint8 (uint, uint8)> reader{&PPU::readIO, this};
|
||||
function<void (uint, uint8)> writer{&PPU::writeIO, this};
|
||||
bus.map(reader, writer, "00-3f,80-bf:2100-213f");
|
||||
bus.map(reader, writer, "00-3f,80-bf:2100-213f", false);
|
||||
|
||||
if(!reset) random.array((uint8*)vram.data, sizeof(vram.data));
|
||||
|
||||
|
|
|
@ -397,7 +397,7 @@ EXPORT void* snes_get_memory_region(int id, int* size, int* word_size)
|
|||
|
||||
EXPORT uint8_t snes_bus_read(unsigned addr)
|
||||
{
|
||||
return bus.read(addr);
|
||||
return bus.peek(addr);
|
||||
}
|
||||
|
||||
EXPORT void snes_bus_write(unsigned addr, uint8_t value)
|
||||
|
|
Loading…
Reference in New Issue