all repos — mgba @ 2f0ab002e262bb2212648c9805f58de06e60aa70

mGBA Game Boy Advance Emulator

DS Memory: Allow ARM7 to use mapped VRAM
Vicki Pfau vi@endrift.com
Mon, 27 Feb 2017 14:01:10 -0800
commit

2f0ab002e262bb2212648c9805f58de06e60aa70

parent

0cb9c41a4a4252e806d3d3f6cc081b6bda2d37b2

1 files changed, 48 insertions(+), 1 deletions(-)

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

@@ -264,8 +264,17 @@ cpu->memory.activeRegion = ds->memory.ram;

cpu->memory.activeMask = DS_SIZE_RAM - 1; break; } - // Fall through + goto jump_error; + case DS_REGION_VRAM: + if (address < 0x06040000 && ds->memory.vram7[(address & 0x3FFFF) >> 17]) { + // TODO: redzones + cpu->memory.activeRegion = (uint32_t*) ds->memory.vram7[(address & 0x3FFFF) >> 17]; + cpu->memory.activeMask = 0x1FFFF; + break; + } + // Fall through default: + jump_error: memory->activeRegion = -1; cpu->memory.activeRegion = _deadbeef; cpu->memory.activeMask = 0;

@@ -305,6 +314,12 @@ break;

case DS_REGION_IO: value = DS7IORead32(ds, address & 0x00FFFFFC); break; + case DS_REGION_VRAM: + if (address < 0x06040000 && memory->vram7[(address & 0x3FFFF) >> 17]) { + LOAD_32(value, address & 0x1FFFC, memory->vram7[(address & 0x3FFFF) >> 17]); + break; + } + // Fall through default: mLOG(DS_MEM, STUB, "Unimplemented DS7 Load32: %08X", address); break;

@@ -345,6 +360,12 @@ mLOG(DS_MEM, STUB, "Unimplemented DS7 Load16: %08X", address);

case DS_REGION_IO: value = DS7IORead(ds, address & DS_OFFSET_MASK); break; + case DS_REGION_VRAM: + if (address < 0x06040000 && memory->vram7[(address & 0x3FFFF) >> 17]) { + LOAD_16(value, address & 0x1FFFE, memory->vram7[(address & 0x3FFFF) >> 17]); + break; + } + // Fall through default: mLOG(DS_MEM, STUB, "Unimplemented DS7 Load16: %08X", address); break;

@@ -418,6 +439,12 @@ break;

case DS_REGION_IO: DS7IOWrite32(ds, address & DS_OFFSET_MASK, value); break; + case DS_REGION_VRAM: + if (address < 0x06040000 && memory->vram7[(address & 0x3FFFF) >> 17]) { + STORE_32(value, address & 0x1FFFC, memory->vram7[(address & 0x3FFFF) >> 17]); + break; + } + // Fall through default: mLOG(DS_MEM, STUB, "Unimplemented DS7 Store32: %08X:%08X", address, value); break;

@@ -452,6 +479,12 @@ break;

case DS_REGION_IO: DS7IOWrite(ds, address & DS_OFFSET_MASK, value); break; + case DS_REGION_VRAM: + if (address < 0x06040000 && memory->vram7[(address & 0x3FFFF) >> 17]) { + STORE_16(value, address & 0x1FFFE, memory->vram7[(address & 0x3FFFF) >> 17]); + break; + } + // Fall through default: mLOG(DS_MEM, STUB, "Unimplemented DS7 Store16: %08X:%04X", address, value); break;

@@ -601,6 +634,13 @@ break;

case DS_REGION_IO: LDM_LOOP(value = DS7IORead32(ds, address)); break; + case DS_REGION_VRAM: + LDM_LOOP(if (address < 0x06040000 && memory->vram7[(address & 0x3FFFF) >> 17]) { + LOAD_32(value, address & 0x1FFFF, memory->vram7[(address & 0x3FFFF) >> 17]); + } else { + mLOG(DS_MEM, STUB, "Unimplemented DS7 LDM: %08X", address); + }); + break; default: mLOG(DS_MEM, STUB, "Unimplemented DS7 LDM: %08X", address); LDM_LOOP(value = 0);

@@ -658,6 +698,13 @@ 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; + case DS_REGION_VRAM: + STM_LOOP(if (address < 0x06040000 && memory->vram7[(address & 0x3FFFF) >> 17]) { + STORE_32(value, address & 0x1FFFF, memory->vram7[(address & 0x3FFFF) >> 17]); + } else { + mLOG(DS_MEM, STUB, "Unimplemented DS7 STM: %08X", address); }); break; default: