mirror of https://github.com/mgba-emu/mgba.git
GBA Memory: Patching functions can now expand ROM
This commit is contained in:
parent
0789ebb8cc
commit
f94c959cac
|
@ -17,6 +17,7 @@
|
||||||
#define IDLE_LOOP_THRESHOLD 10000
|
#define IDLE_LOOP_THRESHOLD 10000
|
||||||
|
|
||||||
static uint32_t _popcount32(unsigned bits);
|
static uint32_t _popcount32(unsigned bits);
|
||||||
|
static void _pristineCow(struct GBA* gba);
|
||||||
static uint32_t _deadbeef[2] = { 0xDEADBEEF, 0xFEEDFACE };
|
static uint32_t _deadbeef[2] = { 0xDEADBEEF, 0xFEEDFACE };
|
||||||
|
|
||||||
static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t region);
|
static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t region);
|
||||||
|
@ -848,12 +849,12 @@ void GBAPatch32(struct ARMCore* cpu, uint32_t address, int32_t value, int32_t* o
|
||||||
case REGION_CART1_EX:
|
case REGION_CART1_EX:
|
||||||
case REGION_CART2:
|
case REGION_CART2:
|
||||||
case REGION_CART2_EX:
|
case REGION_CART2_EX:
|
||||||
|
_pristineCow(gba);
|
||||||
if ((address & (SIZE_CART0 - 1)) < gba->memory.romSize) {
|
if ((address & (SIZE_CART0 - 1)) < gba->memory.romSize) {
|
||||||
LOAD_32(oldValue, address & (SIZE_CART0 - 1), gba->memory.rom);
|
gba->memory.romSize = (address & (SIZE_CART0 - 4)) + 4;
|
||||||
STORE_32(value, address & (SIZE_CART0 - 1), gba->memory.rom);
|
|
||||||
} else {
|
|
||||||
GBALog(gba, GBA_LOG_WARN, "Bad memory Patch32: 0x%08X", address);
|
|
||||||
}
|
}
|
||||||
|
LOAD_32(oldValue, address & (SIZE_CART0 - 1), gba->memory.rom);
|
||||||
|
STORE_32(value, address & (SIZE_CART0 - 1), gba->memory.rom);
|
||||||
break;
|
break;
|
||||||
case REGION_CART_SRAM:
|
case REGION_CART_SRAM:
|
||||||
case REGION_CART_SRAM_MIRROR:
|
case REGION_CART_SRAM_MIRROR:
|
||||||
|
@ -915,12 +916,12 @@ void GBAPatch16(struct ARMCore* cpu, uint32_t address, int16_t value, int16_t* o
|
||||||
case REGION_CART1_EX:
|
case REGION_CART1_EX:
|
||||||
case REGION_CART2:
|
case REGION_CART2:
|
||||||
case REGION_CART2_EX:
|
case REGION_CART2_EX:
|
||||||
|
_pristineCow(gba);
|
||||||
if ((address & (SIZE_CART0 - 1)) < gba->memory.romSize) {
|
if ((address & (SIZE_CART0 - 1)) < gba->memory.romSize) {
|
||||||
LOAD_16(oldValue, address & (SIZE_CART0 - 1), gba->memory.rom);
|
gba->memory.romSize = (address & (SIZE_CART0 - 2)) + 2;
|
||||||
STORE_16(value, address & (SIZE_CART0 - 1), gba->memory.rom);
|
|
||||||
} else {
|
|
||||||
GBALog(gba, GBA_LOG_WARN, "Bad memory Patch16: 0x%08X", address);
|
|
||||||
}
|
}
|
||||||
|
LOAD_16(oldValue, address & (SIZE_CART0 - 1), gba->memory.rom);
|
||||||
|
STORE_16(value, address & (SIZE_CART0 - 1), gba->memory.rom);
|
||||||
break;
|
break;
|
||||||
case REGION_CART_SRAM:
|
case REGION_CART_SRAM:
|
||||||
case REGION_CART_SRAM_MIRROR:
|
case REGION_CART_SRAM_MIRROR:
|
||||||
|
@ -1482,3 +1483,12 @@ uint32_t _popcount32(unsigned bits) {
|
||||||
bits = (bits & 0x33333333) + ((bits >> 2) & 0x33333333);
|
bits = (bits & 0x33333333) + ((bits >> 2) & 0x33333333);
|
||||||
return (((bits + (bits >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24;
|
return (((bits + (bits >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _pristineCow(struct GBA* gba) {
|
||||||
|
if (gba->memory.rom != gba->pristineRom) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gba->memory.rom = anonymousMemoryMap(SIZE_CART0);
|
||||||
|
memcpy(gba->memory.rom, gba->pristineRom, gba->memory.romSize);
|
||||||
|
memset(((uint8_t*) gba->memory.rom) + gba->memory.romSize, 0xFF, SIZE_CART0 - gba->memory.romSize);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue