all repos — mgba @ 488decf83a8ff476830f8afa7b68bbd898a04a03

mGBA Game Boy Advance Emulator

DS Video: Begin hooking up OAM
Vicki Pfau vi@endrift.com
Tue, 21 Feb 2017 19:04:44 -0800
commit

488decf83a8ff476830f8afa7b68bbd898a04a03

parent

e0518fdf30601b2424ab98e7b351cb75d66bcd74

4 files changed, 28 insertions(+), 2 deletions(-)

jump to
M include/mgba/internal/ds/video.hinclude/mgba/internal/ds/video.h

@@ -61,6 +61,7 @@ void (*deinit)(struct DSVideoRenderer* renderer);

uint16_t (*writeVideoRegister)(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value); void (*writePalette)(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value); + void (*writeOAM)(struct DSVideoRenderer* renderer, uint32_t oam); void (*drawScanline)(struct DSVideoRenderer* renderer, int y); void (*finishFrame)(struct DSVideoRenderer* renderer);
M src/ds/memory.csrc/ds/memory.c

@@ -955,6 +955,8 @@ break;

} case DS9_REGION_OAM: STORE_32(value, address & (DS9_SIZE_OAM - 4), ds->video.oam.raw); + ds->video.renderer->writeOAM(ds->video.renderer, (address & (DS9_SIZE_OAM - 4)) >> 1); + ds->video.renderer->writeOAM(ds->video.renderer, ((address & (DS9_SIZE_OAM - 4)) >> 1) + 1); break; default: if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) {

@@ -1022,6 +1024,7 @@ break;

} case DS9_REGION_OAM: STORE_16(value, address & (DS9_SIZE_OAM - 2), ds->video.oam.raw); + ds->video.renderer->writeOAM(ds->video.renderer, (address & (DS9_SIZE_OAM - 2)) >> 1); break; default: if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) {

@@ -1245,7 +1248,9 @@ }

}); break; case DS9_REGION_OAM: - STM_LOOP(STORE_32(value, address & (DS9_SIZE_OAM - 1), ds->video.oam.raw)); + STM_LOOP(STORE_32(value, address & (DS9_SIZE_OAM - 1), ds->video.oam.raw); + ds->video.renderer->writeOAM(ds->video.renderer, (address & (DS9_SIZE_OAM - 4)) >> 1); + ds->video.renderer->writeOAM(ds->video.renderer, ((address & (DS9_SIZE_OAM - 4)) >> 1) + 1)); break; default: STM_LOOP(if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) {
M src/ds/renderers/software.csrc/ds/renderers/software.c

@@ -13,6 +13,7 @@ static void DSVideoSoftwareRendererDeinit(struct DSVideoRenderer* renderer);

static void DSVideoSoftwareRendererReset(struct DSVideoRenderer* renderer); static uint16_t DSVideoSoftwareRendererWriteVideoRegister(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value); static void DSVideoSoftwareRendererWritePalette(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value); +static void DSVideoSoftwareRendererWriteOAM(struct DSVideoRenderer* renderer, uint32_t oam); static void DSVideoSoftwareRendererDrawScanline(struct DSVideoRenderer* renderer, int y); static void DSVideoSoftwareRendererFinishFrame(struct DSVideoRenderer* renderer); static void DSVideoSoftwareRendererGetPixels(struct DSVideoRenderer* renderer, size_t* stride, const void** pixels);

@@ -24,6 +25,7 @@ renderer->d.reset = DSVideoSoftwareRendererReset;

renderer->d.deinit = DSVideoSoftwareRendererDeinit; renderer->d.writeVideoRegister = DSVideoSoftwareRendererWriteVideoRegister; renderer->d.writePalette = DSVideoSoftwareRendererWritePalette; + renderer->d.writeOAM = DSVideoSoftwareRendererWriteOAM; renderer->d.drawScanline = DSVideoSoftwareRendererDrawScanline; renderer->d.finishFrame = DSVideoSoftwareRendererFinishFrame; renderer->d.getPixels = DSVideoSoftwareRendererGetPixels;

@@ -95,6 +97,15 @@ if (address < 0x200) {

softwareRenderer->engA.d.writePalette(&softwareRenderer->engA.d, address & 0x1FF, value); } else { softwareRenderer->engB.d.writePalette(&softwareRenderer->engB.d, address & 0x1FF, value); + } +} + +static void DSVideoSoftwareRendererWriteOAM(struct DSVideoRenderer* renderer, uint32_t oam) { + struct DSVideoSoftwareRenderer* softwareRenderer = (struct DSVideoSoftwareRenderer*) renderer; + if (oam < 0x100) { + softwareRenderer->engA.d.writeOAM(&softwareRenderer->engA.d, oam & 0xFF); + } else { + softwareRenderer->engB.d.writeOAM(&softwareRenderer->engB.d, oam & 0xFF); } }
M src/ds/video.csrc/ds/video.c

@@ -19,6 +19,7 @@ static void DSVideoDummyRendererReset(struct DSVideoRenderer* renderer);

static void DSVideoDummyRendererDeinit(struct DSVideoRenderer* renderer); static uint16_t DSVideoDummyRendererWriteVideoRegister(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value); static void DSVideoDummyRendererWritePalette(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value); +static void DSVideoDummyRendererWriteOAM(struct DSVideoRenderer* renderer, uint32_t oam); static void DSVideoDummyRendererDrawScanline(struct DSVideoRenderer* renderer, int y); static void DSVideoDummyRendererFinishFrame(struct DSVideoRenderer* renderer); static void DSVideoDummyRendererGetPixels(struct DSVideoRenderer* renderer, size_t* stride, const void** pixels);

@@ -104,6 +105,7 @@ .reset = DSVideoDummyRendererReset,

.deinit = DSVideoDummyRendererDeinit, .writeVideoRegister = DSVideoDummyRendererWriteVideoRegister, .writePalette = DSVideoDummyRendererWritePalette, + .writeOAM = DSVideoDummyRendererWriteOAM, .drawScanline = DSVideoDummyRendererDrawScanline, .finishFrame = DSVideoDummyRendererFinishFrame, .getPixels = DSVideoDummyRendererGetPixels,

@@ -364,9 +366,16 @@ return value;

} static void DSVideoDummyRendererWritePalette(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value) { - UNUSED(value); + UNUSED(renderer); UNUSED(address); UNUSED(value); + // Nothing to do +} + +static void DSVideoDummyRendererWriteOAM(struct DSVideoRenderer* renderer, uint32_t oam) { + UNUSED(renderer); + UNUSED(oam); + // Nothing to do } static void DSVideoDummyRendererDrawScanline(struct DSVideoRenderer* renderer, int y) {