EEPROM only works in DMAs

This commit is contained in:
Jeffrey Pfau 2013-04-27 20:39:14 -07:00
parent 4380ec0260
commit f4fa423135
1 changed files with 33 additions and 12 deletions

View File

@ -129,7 +129,9 @@ int32_t GBALoad32(struct ARMMemory* memory, uint32_t address) {
case BASE_CART1_EX: case BASE_CART1_EX:
case BASE_CART2: case BASE_CART2:
case BASE_CART2_EX: case BASE_CART2_EX:
return gbaMemory->rom[(address & (SIZE_CART0 - 1)) >> 2]; if ((address & (SIZE_CART0 - 1)) < gbaMemory->romSize) {
return gbaMemory->rom[(address & (SIZE_CART0 - 1)) >> 2];
}
case BASE_CART_SRAM: case BASE_CART_SRAM:
break; break;
default: default:
@ -163,7 +165,9 @@ int16_t GBALoad16(struct ARMMemory* memory, uint32_t address) {
case BASE_CART1_EX: case BASE_CART1_EX:
case BASE_CART2: case BASE_CART2:
case BASE_CART2_EX: case BASE_CART2_EX:
return ((int16_t*) gbaMemory->rom)[(address & (SIZE_CART0 - 1)) >> 1]; if ((address & (SIZE_CART0 - 1)) < gbaMemory->romSize) {
return ((int16_t*) gbaMemory->rom)[(address & (SIZE_CART0 - 1)) >> 1];
}
case BASE_CART_SRAM: case BASE_CART_SRAM:
break; break;
default: default:
@ -196,12 +200,9 @@ uint16_t GBALoadU16(struct ARMMemory* memory, uint32_t address) {
case BASE_CART1: case BASE_CART1:
case BASE_CART1_EX: case BASE_CART1_EX:
case BASE_CART2: case BASE_CART2:
return ((uint16_t*) gbaMemory->rom)[(address & (SIZE_CART0 - 1)) >> 1];
case BASE_CART2_EX: case BASE_CART2_EX:
if ((address & (SIZE_CART0 - 1)) < gbaMemory->romSize) { if ((address & (SIZE_CART0 - 1)) < gbaMemory->romSize) {
return ((uint16_t*) gbaMemory->rom)[(address & (SIZE_CART0 - 1)) >> 1]; return ((uint16_t*) gbaMemory->rom)[(address & (SIZE_CART0 - 1)) >> 1];
} else {
return GBASavedataReadEEPROM(&gbaMemory->savedata);
} }
case BASE_CART_SRAM: case BASE_CART_SRAM:
break; break;
@ -236,7 +237,9 @@ int8_t GBALoad8(struct ARMMemory* memory, uint32_t address) {
case BASE_CART1_EX: case BASE_CART1_EX:
case BASE_CART2: case BASE_CART2:
case BASE_CART2_EX: case BASE_CART2_EX:
return ((int8_t*) gbaMemory->rom)[address & (SIZE_CART0 - 1)]; if ((address & (SIZE_CART0 - 1)) < gbaMemory->romSize) {
return ((int8_t*) gbaMemory->rom)[address & (SIZE_CART0 - 1)];
}
case BASE_CART_SRAM: case BASE_CART_SRAM:
if (gbaMemory->savedata.type == SAVEDATA_NONE) { if (gbaMemory->savedata.type == SAVEDATA_NONE) {
GBASavedataInitSRAM(&gbaMemory->savedata); GBASavedataInitSRAM(&gbaMemory->savedata);
@ -275,7 +278,9 @@ uint8_t GBALoadU8(struct ARMMemory* memory, uint32_t address) {
case BASE_CART1_EX: case BASE_CART1_EX:
case BASE_CART2: case BASE_CART2:
case BASE_CART2_EX: case BASE_CART2_EX:
return ((uint8_t*) gbaMemory->rom)[address & (SIZE_CART0 - 1)]; if ((address & (SIZE_CART0 - 1)) < gbaMemory->romSize) {
return ((uint8_t*) gbaMemory->rom)[address & (SIZE_CART0 - 1)];
}
case BASE_CART_SRAM: case BASE_CART_SRAM:
if (gbaMemory->savedata.type == SAVEDATA_NONE) { if (gbaMemory->savedata.type == SAVEDATA_NONE) {
GBASavedataInitSRAM(&gbaMemory->savedata); GBASavedataInitSRAM(&gbaMemory->savedata);
@ -593,11 +598,27 @@ void GBAMemoryServiceDMA(struct GBAMemory* memory, int number, struct GBADMA* in
} }
} else { } else {
uint16_t word; uint16_t word;
while (wordsRemaining--) { if (source >> BASE_OFFSET == BASE_CART2_EX && memory->savedata.type == SAVEDATA_EEPROM) {
word = GBALoadU16(&memory->d, source); while (wordsRemaining--) {
GBAStore16(&memory->d, dest, word); word = GBASavedataReadEEPROM(&memory->savedata);
source += sourceOffset; GBAStore16(&memory->d, dest, word);
dest += destOffset; source += sourceOffset;
dest += destOffset;
}
} else if (dest >> BASE_OFFSET == BASE_CART2_EX && memory->savedata.type == SAVEDATA_EEPROM) {
while (wordsRemaining--) {
word = GBALoadU16(&memory->d, source);
GBASavedataWriteEEPROM(&memory->savedata, word);
source += sourceOffset;
dest += destOffset;
}
} else {
while (wordsRemaining--) {
word = GBALoadU16(&memory->d, source);
GBAStore16(&memory->d, dest, word);
source += sourceOffset;
dest += destOffset;
}
} }
} }