DS Memory: Implement basic RAM access
Jeffrey Pfau jeffrey@endrift.com
Thu, 02 Jun 2016 21:13:44 -0700
1 files changed,
60 insertions(+),
0 deletions(-)
jump to
M
src/ds/memory.c
→
src/ds/memory.c
@@ -258,6 +258,7 @@ struct DSMemory* memory = &ds->memory;
int wait = 0; switch (address >> DS_BASE_OFFSET) { + default: break; }@@ -429,9 +430,12 @@ switch (address >> DS_BASE_OFFSET) {
case DS_REGION_RAM: if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { LOAD_32(value, address & (DS_SIZE_RAM - 1), memory->ram); + break; } + mLOG(DS_MEM, STUB, "Unimplemented DS9 Load32: %08X", address); break; default: + mLOG(DS_MEM, STUB, "Unimplemented DS9 Load32: %08X", address); break; }@@ -451,7 +455,14 @@ uint32_t value = 0;
int wait = 0; switch (address >> DS_BASE_OFFSET) { + case DS_REGION_RAM: + if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { + LOAD_16(value, address & (DS_SIZE_RAM - 1), memory->ram); + break; + } + mLOG(DS_MEM, STUB, "Unimplemented DS9 Load16: %08X", address); default: + mLOG(DS_MEM, STUB, "Unimplemented DS9 Load16: %08X", address); break; }@@ -471,7 +482,14 @@ uint32_t value = 0;
int wait = 0; switch (address >> DS_BASE_OFFSET) { + case DS_REGION_RAM: + if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { + value = ((uint8_t*) memory->ram)[address & (DS_SIZE_RAM - 1)]; + break; + } + mLOG(DS_MEM, STUB, "Unimplemented DS9 Load8: %08X", address); default: + mLOG(DS_MEM, STUB, "Unimplemented DS9 Load8: %08X", address); break; }@@ -488,6 +506,15 @@ struct DSMemory* memory = &ds->memory;
int wait = 0; switch (address >> DS_BASE_OFFSET) { + case DS_REGION_RAM: + if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { + STORE_32(value, address & (DS_SIZE_RAM - 1), memory->ram); + break; + } + mLOG(DS_MEM, STUB, "Unimplemented DS9 Store32: %08X:%08X", address, value); + break; + default: + mLOG(DS_MEM, STUB, "Unimplemented DS9 Store32: %08X:%08X", address, value); break; }@@ -503,7 +530,15 @@ struct DSMemory* memory = &ds->memory;
int wait = 0; switch (address >> DS_BASE_OFFSET) { + case DS_REGION_RAM: + if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { + STORE_16(value, address & (DS_SIZE_RAM - 1), memory->ram); + break; + } + mLOG(DS_MEM, STUB, "Unimplemented DS9 Store16: %08X:%04X", address, value); + break; default: + mLOG(DS_MEM, STUB, "Unimplemented DS9 Store16: %08X:%04X", address, value); break; }@@ -519,7 +554,14 @@ struct DSMemory* memory = &ds->memory;
int wait = 0; switch (address >> DS_BASE_OFFSET) { + case DS_REGION_RAM: + if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { + ((uint8_t*) memory->ram)[address & (DS_SIZE_RAM - 1)] = value; + break; + } + mLOG(DS_MEM, STUB, "Unimplemented DS9 Store8: %08X:%02X", address, value); default: + mLOG(DS_MEM, STUB, "Unimplemented DS9 Store8: %08X:%02X", address, value); break; }@@ -552,7 +594,16 @@ uint32_t addressMisalign = address & 0x3;
address &= 0xFFFFFFFC; switch (address >> DS_BASE_OFFSET) { + case DS_REGION_RAM: + LDM_LOOP(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); + }); + break; default: + mLOG(DS_MEM, STUB, "Unimplemented DS9 LDM: %08X", address); + LDM_LOOP(value = 0); break; }@@ -596,7 +647,16 @@ uint32_t addressMisalign = address & 0x3;
address &= 0xFFFFFFFC; switch (address >> DS_BASE_OFFSET) { + case DS_REGION_RAM: + STM_LOOP(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); + }); + break; default: + mLOG(DS_MEM, STUB, "Unimplemented DS9 STM: %08X", address); + STM_LOOP(); break; }