DS Video: Begin hooking up OAM

This commit is contained in:
Vicki Pfau 2017-02-21 19:04:44 -08:00
parent e0518fdf30
commit 488decf83a
4 changed files with 28 additions and 2 deletions

View File

@ -61,6 +61,7 @@ struct DSVideoRenderer {
uint16_t (*writeVideoRegister)(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value); uint16_t (*writeVideoRegister)(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value);
void (*writePalette)(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 (*drawScanline)(struct DSVideoRenderer* renderer, int y);
void (*finishFrame)(struct DSVideoRenderer* renderer); void (*finishFrame)(struct DSVideoRenderer* renderer);

View File

@ -955,6 +955,8 @@ void DS9Store32(struct ARMCore* cpu, uint32_t address, int32_t value, int* cycle
} }
case DS9_REGION_OAM: case DS9_REGION_OAM:
STORE_32(value, address & (DS9_SIZE_OAM - 4), ds->video.oam.raw); 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; break;
default: default:
if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) { if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) {
@ -1022,6 +1024,7 @@ void DS9Store16(struct ARMCore* cpu, uint32_t address, int16_t value, int* cycle
} }
case DS9_REGION_OAM: case DS9_REGION_OAM:
STORE_16(value, address & (DS9_SIZE_OAM - 2), ds->video.oam.raw); 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; break;
default: default:
if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) { if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) {
@ -1245,7 +1248,9 @@ uint32_t DS9StoreMultiple(struct ARMCore* cpu, uint32_t address, int mask, enum
}); });
break; break;
case DS9_REGION_OAM: 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; break;
default: default:
STM_LOOP(if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) { STM_LOOP(if ((address & ~(DS9_SIZE_DTCM - 1)) == memory->dtcmBase) {

View File

@ -13,6 +13,7 @@ static void DSVideoSoftwareRendererDeinit(struct DSVideoRenderer* renderer);
static void DSVideoSoftwareRendererReset(struct DSVideoRenderer* renderer); static void DSVideoSoftwareRendererReset(struct DSVideoRenderer* renderer);
static uint16_t DSVideoSoftwareRendererWriteVideoRegister(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value); 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 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 DSVideoSoftwareRendererDrawScanline(struct DSVideoRenderer* renderer, int y);
static void DSVideoSoftwareRendererFinishFrame(struct DSVideoRenderer* renderer); static void DSVideoSoftwareRendererFinishFrame(struct DSVideoRenderer* renderer);
static void DSVideoSoftwareRendererGetPixels(struct DSVideoRenderer* renderer, size_t* stride, const void** pixels); static void DSVideoSoftwareRendererGetPixels(struct DSVideoRenderer* renderer, size_t* stride, const void** pixels);
@ -24,6 +25,7 @@ void DSVideoSoftwareRendererCreate(struct DSVideoSoftwareRenderer* renderer) {
renderer->d.deinit = DSVideoSoftwareRendererDeinit; renderer->d.deinit = DSVideoSoftwareRendererDeinit;
renderer->d.writeVideoRegister = DSVideoSoftwareRendererWriteVideoRegister; renderer->d.writeVideoRegister = DSVideoSoftwareRendererWriteVideoRegister;
renderer->d.writePalette = DSVideoSoftwareRendererWritePalette; renderer->d.writePalette = DSVideoSoftwareRendererWritePalette;
renderer->d.writeOAM = DSVideoSoftwareRendererWriteOAM;
renderer->d.drawScanline = DSVideoSoftwareRendererDrawScanline; renderer->d.drawScanline = DSVideoSoftwareRendererDrawScanline;
renderer->d.finishFrame = DSVideoSoftwareRendererFinishFrame; renderer->d.finishFrame = DSVideoSoftwareRendererFinishFrame;
renderer->d.getPixels = DSVideoSoftwareRendererGetPixels; renderer->d.getPixels = DSVideoSoftwareRendererGetPixels;
@ -98,6 +100,15 @@ static void DSVideoSoftwareRendererWritePalette(struct DSVideoRenderer* renderer
} }
} }
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);
}
}
static void _drawScanlineA(struct DSVideoSoftwareRenderer* softwareRenderer, int y) { static void _drawScanlineA(struct DSVideoSoftwareRenderer* softwareRenderer, int y) {
memcpy(softwareRenderer->engA.d.vramBG, softwareRenderer->d.vramABG, sizeof(softwareRenderer->engA.d.vramBG)); memcpy(softwareRenderer->engA.d.vramBG, softwareRenderer->d.vramABG, sizeof(softwareRenderer->engA.d.vramBG));
memcpy(softwareRenderer->engA.d.vramOBJ, softwareRenderer->d.vramAOBJ, sizeof(softwareRenderer->engA.d.vramOBJ)); memcpy(softwareRenderer->engA.d.vramOBJ, softwareRenderer->d.vramAOBJ, sizeof(softwareRenderer->engA.d.vramOBJ));

View File

@ -19,6 +19,7 @@ static void DSVideoDummyRendererReset(struct DSVideoRenderer* renderer);
static void DSVideoDummyRendererDeinit(struct DSVideoRenderer* renderer); static void DSVideoDummyRendererDeinit(struct DSVideoRenderer* renderer);
static uint16_t DSVideoDummyRendererWriteVideoRegister(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value); 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 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 DSVideoDummyRendererDrawScanline(struct DSVideoRenderer* renderer, int y);
static void DSVideoDummyRendererFinishFrame(struct DSVideoRenderer* renderer); static void DSVideoDummyRendererFinishFrame(struct DSVideoRenderer* renderer);
static void DSVideoDummyRendererGetPixels(struct DSVideoRenderer* renderer, size_t* stride, const void** pixels); static void DSVideoDummyRendererGetPixels(struct DSVideoRenderer* renderer, size_t* stride, const void** pixels);
@ -104,6 +105,7 @@ static struct DSVideoRenderer dummyRenderer = {
.deinit = DSVideoDummyRendererDeinit, .deinit = DSVideoDummyRendererDeinit,
.writeVideoRegister = DSVideoDummyRendererWriteVideoRegister, .writeVideoRegister = DSVideoDummyRendererWriteVideoRegister,
.writePalette = DSVideoDummyRendererWritePalette, .writePalette = DSVideoDummyRendererWritePalette,
.writeOAM = DSVideoDummyRendererWriteOAM,
.drawScanline = DSVideoDummyRendererDrawScanline, .drawScanline = DSVideoDummyRendererDrawScanline,
.finishFrame = DSVideoDummyRendererFinishFrame, .finishFrame = DSVideoDummyRendererFinishFrame,
.getPixels = DSVideoDummyRendererGetPixels, .getPixels = DSVideoDummyRendererGetPixels,
@ -364,9 +366,16 @@ static uint16_t DSVideoDummyRendererWriteVideoRegister(struct DSVideoRenderer* r
} }
static void DSVideoDummyRendererWritePalette(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value) { static void DSVideoDummyRendererWritePalette(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value) {
UNUSED(value); UNUSED(renderer);
UNUSED(address); UNUSED(address);
UNUSED(value); 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) { static void DSVideoDummyRendererDrawScanline(struct DSVideoRenderer* renderer, int y) {