gambatte: add oam, hram to memory domain list

This commit is contained in:
goyuken 2012-09-11 19:05:44 +00:00
parent c5e71487fd
commit d57e195e52
7 changed files with 35 additions and 10 deletions

View File

@ -339,8 +339,10 @@ namespace BizHawk.Emulation.Consoles.GB
if (!LibGambatte.gambatte_getmemoryarea(GambatteState, which, ref data, ref length))
throw new Exception("gambatte_getmemoryarea() failed!");
if (data == IntPtr.Zero || length <= 0)
// if length == 0, it's an empty block; (usually rambank on some carts); that's ok
if (data == IntPtr.Zero && length > 0)
throw new Exception("bad return from gambatte_getmemoryarea()");
MemoryRefreshers[i] = new MemoryRefresher(data, length);
@ -349,17 +351,18 @@ namespace BizHawk.Emulation.Consoles.GB
void InitMemoryDomains()
{
MemoryDomains = new MemoryDomain[4];
MemoryRefreshers = new MemoryRefresher[4];
MemoryDomains = new MemoryDomain[6];
MemoryRefreshers = new MemoryRefresher[6];
CreateMemoryDomain(LibGambatte.MemoryAreas.rambank);
CreateMemoryDomain(LibGambatte.MemoryAreas.cartram);
CreateMemoryDomain(LibGambatte.MemoryAreas.rom);
CreateMemoryDomain(LibGambatte.MemoryAreas.vram);
CreateMemoryDomain(LibGambatte.MemoryAreas.wram);
CreateMemoryDomain(LibGambatte.MemoryAreas.oam);
CreateMemoryDomain(LibGambatte.MemoryAreas.hram);
// fixme: other code brokenly assumes that MainMemory is MemoryDomains[0]
// (here, we'd want it to be MemoryDomains[2])
var tmp = MemoryDomains[2];
MemoryDomains[2] = MemoryDomains[0];
MemoryDomains[0] = tmp;

View File

@ -276,7 +276,9 @@ namespace BizHawk.Emulation.Consoles.GB
vram = 0,
rom = 1,
wram = 2,
rambank = 3,
cartram = 3,
oam = 4,
hram = 5
}
/// <summary>

View File

@ -97,7 +97,7 @@ public:
int saveSavedataLength();
void saveSavedata(char *dest);
// 0 = vram, 1 = rom, 2 = wram, 3 = rambank
// 0 = vram, 1 = rom, 2 = wram, 3 = cartram, 4 = oam, 5 = hram
bool getMemoryArea(int which, unsigned char **data, int *length);
/** Saves emulator state to the state slot selected with selectState().

View File

@ -694,8 +694,7 @@ void Cartridge::saveSavedata(char *dest) {
}
}
bool Cartridge::getMemoryArea(int which, unsigned char **data, int *length)
{
bool Cartridge::getMemoryArea(int which, unsigned char **data, int *length) {
if (!data || !length)
return false;
@ -717,6 +716,7 @@ bool Cartridge::getMemoryArea(int which, unsigned char **data, int *length)
*data = memptrs.rambankdata();
*length = memptrs.rambankdataend() - memptrs.rambankdata();
return true;
default:
return false;
}

View File

@ -1003,4 +1003,24 @@ void Memory::setDmgPaletteColor(unsigned palNum, unsigned colorNum, unsigned lon
display.setDmgPaletteColor(palNum, colorNum, rgb32);
}
bool Memory::getMemoryArea(int which, unsigned char **data, int *length) {
if (!data || !length)
return false;
switch (which)
{
case 4: // oam
*data = &ioamhram[0];
*length = 160;
return true;
case 5: // hram
*data = &ioamhram[384];
*length = 127;
return true;
default: // pass to cartridge
return cart.getMemoryArea(which, data, length);
}
}
}

View File

@ -83,7 +83,7 @@ public:
void saveSavedata(char *dest) { cart.saveSavedata(dest); }
const std::string saveBasePath() const { return cart.saveBasePath(); }
bool getMemoryArea(int which, unsigned char **data, int *length) { return cart.getMemoryArea(which, data, length); }
bool getMemoryArea(int which, unsigned char **data, int *length); // { return cart.getMemoryArea(which, data, length); }
void setOsdElement(std::auto_ptr<OsdElement> osdElement) {
display.setOsdElement(osdElement);