DS Memory: Implement (currently fixed-location) DTCM
Jeffrey Pfau jeffrey@endrift.com
Mon, 26 Dec 2016 01:03:11 -0800
2 files changed,
31 insertions(+),
2 deletions(-)
M
src/ds/memory.c
→
src/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.h
→
src/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,