all repos — mgba @ 871ce36386905810de2b7cdff6d13feb10f83daf

mGBA Game Boy Advance Emulator

DS Memory: Implement (currently fixed-location) DTCM
Jeffrey Pfau jeffrey@endrift.com
Mon, 26 Dec 2016 01:03:11 -0800
commit

871ce36386905810de2b7cdff6d13feb10f83daf

parent

ef29028109e9ebc57138b389ae5d77018a35012e

2 files changed, 31 insertions(+), 2 deletions(-)

jump to
M src/ds/memory.csrc/ds/memory.c

@@ -595,6 +595,10 @@ int wait = 0;

switch (address >> DS_BASE_OFFSET) { case DS_REGION_RAM: + if ((address & ~(DS9_SIZE_DTCM - 1)) == DS9_BASE_DTCM) { + LOAD_32(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + break; + } if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { LOAD_32(value, address & (DS_SIZE_RAM - 1), memory->ram); break;

@@ -626,6 +630,10 @@ int wait = 0;

switch (address >> DS_BASE_OFFSET) { case DS_REGION_RAM: + if ((address & ~(DS9_SIZE_DTCM - 1)) == DS9_BASE_DTCM) { + LOAD_16(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + break; + } if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { LOAD_16(value, address & (DS_SIZE_RAM - 1), memory->ram); break;

@@ -656,6 +664,10 @@ int wait = 0;

switch (address >> DS_BASE_OFFSET) { case DS_REGION_RAM: + if ((address & ~(DS9_SIZE_DTCM - 1)) == DS9_BASE_DTCM) { + value = ((uint8_t*) memory->dtcm)[address & (DS9_SIZE_DTCM - 1)]; + break; + } if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { value = ((uint8_t*) memory->ram)[address & (DS_SIZE_RAM - 1)]; break;

@@ -688,6 +700,10 @@ }

mLOG(DS_MEM, STUB, "Bad DS9 Store32: %08X:%08X", address, value); break; case DS_REGION_RAM: + if ((address & ~(DS9_SIZE_DTCM - 1)) == DS9_BASE_DTCM) { + STORE_32(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + break; + } if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { STORE_32(value, address & (DS_SIZE_RAM - 1), memory->ram); break;

@@ -723,6 +739,10 @@ }

mLOG(DS_MEM, STUB, "Bad DS9 Store16: %08X:%04X", address, value); break; case DS_REGION_RAM: + if ((address & ~(DS9_SIZE_DTCM - 1)) == DS9_BASE_DTCM) { + STORE_16(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + break; + } if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { STORE_16(value, address & (DS_SIZE_RAM - 1), memory->ram); break;

@@ -758,6 +778,10 @@ }

mLOG(DS_MEM, STUB, "Bad DS9 Store8: %08X:%02X", address, value); break; case DS_REGION_RAM: + if ((address & ~(DS9_SIZE_DTCM - 1)) == DS9_BASE_DTCM) { + ((uint8_t*) memory->dtcm)[address & (DS9_SIZE_DTCM - 1)] = value; + break; + } if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { ((uint8_t*) memory->ram)[address & (DS_SIZE_RAM - 1)] = value; break;

@@ -801,7 +825,9 @@ address &= 0xFFFFFFFC;

switch (address >> DS_BASE_OFFSET) { case DS_REGION_RAM: - LDM_LOOP(if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { + LDM_LOOP(if ((address & ~(DS9_SIZE_DTCM - 1)) == DS9_BASE_DTCM) { + LOAD_32(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + } else if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { LOAD_32(value, address & (DS_SIZE_RAM - 1), memory->ram); } else { mLOG(DS_MEM, STUB, "Unimplemented DS9 LDM: %08X", address);

@@ -862,7 +888,9 @@ mLOG(DS_MEM, STUB, "Bad DS9 Store32: %08X:%08X", address, value);

}); break; case DS_REGION_RAM: - STM_LOOP(if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { + STM_LOOP(if ((address & ~(DS9_SIZE_DTCM - 1)) == DS9_BASE_DTCM) { + LOAD_32(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + } else if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { STORE_32(value, address & (DS_SIZE_RAM - 1), memory->ram); } else { mLOG(DS_MEM, STUB, "Unimplemented DS9 STM: %08X", address);
M src/ds/memory.hsrc/ds/memory.h

@@ -32,6 +32,7 @@ enum DSMemoryBase {

DS7_BASE_BIOS = 0x00000000, DS9_BASE_ITCM = 0x00000000, DS_BASE_RAM = 0x02000000, + DS9_BASE_DTCM = 0x027C0000, DS_BASE_WORKING_RAM = 0x03000000, DS7_BASE_WORKING_RAM = 0x03800000, DS_BASE_IO = 0x04000000,