DS Memory: Fix unaligned memory
Vicki Pfau vi@endrift.com
Sun, 19 Feb 2017 13:30:21 -0800
1 files changed,
30 insertions(+),
30 deletions(-)
jump to
M
src/ds/memory.c
→
src/ds/memory.c
@@ -244,18 +244,18 @@ int wait = ds->ds7.memory.waitstatesNonseq32[address >> DS_BASE_OFFSET];
switch (address >> DS_BASE_OFFSET) { case DS7_REGION_BIOS: - LOAD_32(value, address & (DS7_SIZE_BIOS - 1), memory->bios7); + LOAD_32(value, address & (DS7_SIZE_BIOS - 4), memory->bios7); break; case DS_REGION_WORKING_RAM: if (address >= DS7_BASE_WORKING_RAM || !ds->memory.wramSize7) { - LOAD_32(value, address & (DS7_SIZE_WORKING_RAM - 1), memory->wram7); + LOAD_32(value, address & (DS7_SIZE_WORKING_RAM - 4), memory->wram7); } else { - LOAD_32(value, address & (ds->memory.wramSize7 - 1), memory->wram); + LOAD_32(value, address & (ds->memory.wramSize7 - 4), memory->wram); } break; case DS_REGION_RAM: if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { - LOAD_32(value, address & (DS_SIZE_RAM - 1), memory->ram); + LOAD_32(value, address & (DS_SIZE_RAM - 4), memory->ram); break; } mLOG(DS_MEM, STUB, "Unimplemented DS7 Load32: %08X", address);@@ -285,13 +285,13 @@ int wait = ds->ds7.memory.waitstatesNonseq16[address >> DS_BASE_OFFSET];
switch (address >> DS_BASE_OFFSET) { case DS7_REGION_BIOS: - LOAD_16(value, address & (DS7_SIZE_BIOS - 1), memory->bios7); + LOAD_16(value, address & (DS7_SIZE_BIOS - 2), memory->bios7); break; case DS_REGION_WORKING_RAM: if (address >= DS7_BASE_WORKING_RAM || !ds->memory.wramSize7) { - LOAD_16(value, address & (DS7_SIZE_WORKING_RAM - 1), memory->wram7); + LOAD_16(value, address & (DS7_SIZE_WORKING_RAM - 2), memory->wram7); } else { - LOAD_16(value, address & (ds->memory.wramSize7 - 1), memory->wram); + LOAD_16(value, address & (ds->memory.wramSize7 - 2), memory->wram); } break; case DS_REGION_RAM:@@ -357,14 +357,14 @@
switch (address >> DS_BASE_OFFSET) { case DS_REGION_WORKING_RAM: if (address >= DS7_BASE_WORKING_RAM || !ds->memory.wramSize7) { - STORE_32(value, address & (DS7_SIZE_WORKING_RAM - 1), memory->wram7); + STORE_32(value, address & (DS7_SIZE_WORKING_RAM - 4), memory->wram7); } else { - STORE_32(value, address & (ds->memory.wramSize7 - 1), memory->wram); + STORE_32(value, address & (ds->memory.wramSize7 - 4), memory->wram); } break; case DS_REGION_RAM: if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { - STORE_32(value, address & (DS_SIZE_RAM - 1), memory->ram); + STORE_32(value, address & (DS_SIZE_RAM - 4), memory->ram); break; } mLOG(DS_MEM, STUB, "Unimplemented DS7 Store32: %08X:%08X", address, value);@@ -391,14 +391,14 @@
switch (address >> DS_BASE_OFFSET) { case DS_REGION_WORKING_RAM: if (address >= DS7_BASE_WORKING_RAM || !ds->memory.wramSize7) { - STORE_16(value, address & (DS7_SIZE_WORKING_RAM - 1), memory->wram7); + STORE_16(value, address & (DS7_SIZE_WORKING_RAM - 2), memory->wram7); } else { - STORE_16(value, address & (ds->memory.wramSize7 - 1), memory->wram); + STORE_16(value, address & (ds->memory.wramSize7 - 2), memory->wram); } break; case DS_REGION_RAM: if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { - STORE_16(value, address & (DS_SIZE_RAM - 1), memory->ram); + STORE_16(value, address & (DS_SIZE_RAM - 2), memory->ram); break; } mLOG(DS_MEM, STUB, "Unimplemented DS7 Store16: %08X:%04X", address, value);@@ -695,18 +695,18 @@ switch (address >> DS_BASE_OFFSET) {
case DS9_REGION_ITCM: case DS9_REGION_ITCM_MIRROR: if (address < memory->itcmSize) { - LOAD_32(value, address & (DS9_SIZE_ITCM - 1), memory->itcm); + LOAD_32(value, address & (DS9_SIZE_ITCM - 4), memory->itcm); break; } mLOG(DS_MEM, STUB, "Bad DS9 Load32: %08X:%08X", address, value); break; case DS_REGION_RAM: if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) { - LOAD_32(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + LOAD_32(value, address & (DS9_SIZE_DTCM - 4), memory->dtcm); break; } if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { - LOAD_32(value, address & (DS_SIZE_RAM - 1), memory->ram); + LOAD_32(value, address & (DS_SIZE_RAM - 4), memory->ram); break; } mLOG(DS_MEM, STUB, "Unimplemented DS9 Load32: %08X", address);@@ -729,11 +729,11 @@ }
case DS9_REGION_BIOS: // TODO: Fix undersized BIOS // TODO: Fix masking - LOAD_32(value, address & (DS9_SIZE_BIOS - 1), memory->bios9); + LOAD_32(value, address & (DS9_SIZE_BIOS - 4), memory->bios9); break; default: if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) { - LOAD_32(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + LOAD_32(value, address & (DS9_SIZE_DTCM - 4), memory->dtcm); break; } mLOG(DS_MEM, STUB, "Unimplemented DS9 Load32: %08X", address);@@ -759,18 +759,18 @@ switch (address >> DS_BASE_OFFSET) {
case DS9_REGION_ITCM: case DS9_REGION_ITCM_MIRROR: if (address < memory->itcmSize) { - LOAD_16(value, address & (DS9_SIZE_ITCM - 1), memory->itcm); + LOAD_16(value, address & (DS9_SIZE_ITCM - 2), memory->itcm); break; } mLOG(DS_MEM, STUB, "Bad DS9 Load16: %08X:%08X", address, value); break; case DS_REGION_RAM: if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) { - LOAD_16(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + LOAD_16(value, address & (DS9_SIZE_DTCM - 2), memory->dtcm); break; } if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { - LOAD_16(value, address & (DS_SIZE_RAM - 1), memory->ram); + LOAD_16(value, address & (DS_SIZE_RAM - 2), memory->ram); break; } mLOG(DS_MEM, STUB, "Unimplemented DS9 Load16: %08X", address);@@ -792,11 +792,11 @@ }
case DS9_REGION_BIOS: // TODO: Fix undersized BIOS // TODO: Fix masking - LOAD_16(value, address & (DS9_SIZE_BIOS - 1), memory->bios9); + LOAD_16(value, address & (DS9_SIZE_BIOS - 2), memory->bios9); break; default: if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) { - LOAD_16(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + LOAD_16(value, address & (DS9_SIZE_DTCM - 2), memory->dtcm); break; } mLOG(DS_MEM, STUB, "Unimplemented DS9 Load16: %08X", address);@@ -867,18 +867,18 @@ switch (address >> DS_BASE_OFFSET) {
case DS9_REGION_ITCM: case DS9_REGION_ITCM_MIRROR: if (address < memory->itcmSize) { - STORE_32(value, address & (DS9_SIZE_ITCM - 1), memory->itcm); + STORE_32(value, address & (DS9_SIZE_ITCM - 4), memory->itcm); break; } mLOG(DS_MEM, STUB, "Bad DS9 Store32: %08X:%08X", address, value); break; case DS_REGION_RAM: if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) { - STORE_32(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + STORE_32(value, address & (DS9_SIZE_DTCM - 4), memory->dtcm); break; } if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { - STORE_32(value, address & (DS_SIZE_RAM - 1), memory->ram); + STORE_32(value, address & (DS_SIZE_RAM - 4), memory->ram); break; } mLOG(DS_MEM, STUB, "Unimplemented DS9 Store32: %08X:%08X", address, value);@@ -898,7 +898,7 @@ break;
} default: if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) { - STORE_32(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + STORE_32(value, address & (DS9_SIZE_DTCM - 4), memory->dtcm); break; } mLOG(DS_MEM, STUB, "Unimplemented DS9 Store32: %08X:%08X", address, value);@@ -920,18 +920,18 @@ switch (address >> DS_BASE_OFFSET) {
case DS9_REGION_ITCM: case DS9_REGION_ITCM_MIRROR: if (address < memory->itcmSize) { - STORE_16(value, address & (DS9_SIZE_ITCM - 1), memory->itcm); + STORE_16(value, address & (DS9_SIZE_ITCM - 2), memory->itcm); break; } mLOG(DS_MEM, STUB, "Bad DS9 Store16: %08X:%04X", address, value); break; case DS_REGION_RAM: if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) { - STORE_16(value, address & (DS9_SIZE_DTCM - 1), memory->dtcm); + STORE_16(value, address & (DS9_SIZE_DTCM - 2), memory->dtcm); break; } if ((address & (DS_SIZE_RAM - 1)) < DS_SIZE_RAM) { - STORE_16(value, address & (DS_SIZE_RAM - 1), memory->ram); + STORE_16(value, address & (DS_SIZE_RAM - 2), memory->ram); break; } mLOG(DS_MEM, STUB, "Unimplemented DS9 Store16: %08X:%04X", address, value);