diff --git a/CHANGES b/CHANGES index b8b54474f..2d3f11afc 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,7 @@ Bugfixes: - GB Video: Fix 16-bit screenshots (fixes mgba.io/i/826) - GB Core: Fix palette loading when loading a foreign config - Qt: Fix LOG argument order + - GB Memory: Prevent accessing empty SRAM (fixes mgba.io/i/831) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/memory.c b/src/gb/memory.c index 0c3d7e57c..68a8eabc2 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -221,7 +221,7 @@ uint8_t GBLoad8(struct LR35902Core* cpu, uint16_t address) { return memory->rtcRegs[memory->activeRtcReg]; } else if (memory->mbcRead) { return memory->mbcRead(memory, address); - } else if (memory->sramAccess) { + } else if (memory->sramAccess && memory->sram) { return memory->sramBank[address & (GB_SIZE_EXTERNAL_RAM - 1)]; } else if (memory->mbcType == GB_HuC3) { return 0x01; // TODO: Is this supposed to be the current SRAM bank? @@ -290,7 +290,7 @@ void GBStore8(struct LR35902Core* cpu, uint16_t address, int8_t value) { case GB_REGION_EXTERNAL_RAM + 1: if (memory->rtcAccess) { memory->rtcRegs[memory->activeRtcReg] = value; - } else if (memory->sramAccess) { + } else if (memory->sramAccess && memory->sram) { memory->sramBank[address & (GB_SIZE_EXTERNAL_RAM - 1)] = value; } else { memory->mbcWrite(gb, address, value); @@ -388,7 +388,7 @@ uint8_t GBView8(struct LR35902Core* cpu, uint16_t address, int segment) { if (memory->rtcAccess) { return memory->rtcRegs[memory->activeRtcReg]; } else if (memory->sramAccess) { - if (segment < 0) { + if (segment < 0 && memory->sram) { return memory->sramBank[address & (GB_SIZE_EXTERNAL_RAM - 1)]; } else if ((size_t) segment * GB_SIZE_EXTERNAL_RAM < gb->sramSize) { return memory->sram[(address & (GB_SIZE_EXTERNAL_RAM - 1)) + segment *GB_SIZE_EXTERNAL_RAM];