Add dummy renderer + frame counting infrastructure from GBA.js

This commit is contained in:
Jeffrey Pfau 2013-04-15 23:01:40 -07:00
parent 9b5d5d6478
commit 2fe2c80ae5
4 changed files with 115 additions and 5 deletions

View File

@ -100,7 +100,7 @@ void ARMReset(struct ARMCore* cpu) {
cpu->spsr.packed = 0;
cpu->cycles = 0;
cpu->nextEvent = INT_MAX;
cpu->nextEvent = 0;
cpu->shifterOperand = 0;
cpu->shifterCarryOut = 0;

View File

@ -2,7 +2,23 @@
#include <limits.h>
static void GBAVideoDummyRendererInit(struct GBAVideoRenderer* renderer);
static void GBAVideoDummyRendererDeinit(struct GBAVideoRenderer* renderer);
static uint16_t GBAVideoDummyRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value);
static void GBAVideoDummyRendererDrawScanline(struct GBAVideoRenderer* renderer, int y);
static void GBAVideoDummyRendererFinishFrame(struct GBAVideoRenderer* renderer);
static struct GBAVideoRenderer dummyRenderer = {
.init = GBAVideoDummyRendererInit,
.deinit = GBAVideoDummyRendererDeinit,
.writeVideoRegister = GBAVideoDummyRendererWriteVideoRegister,
.drawScanline = GBAVideoDummyRendererDrawScanline,
.finishFrame = GBAVideoDummyRendererFinishFrame
};
void GBAVideoInit(struct GBAVideo* video) {
video->renderer = &dummyRenderer;
video->inHblank = 0;
video->inVblank = 0;
video->vcounter = 0;
@ -23,5 +39,94 @@ void GBAVideoInit(struct GBAVideo* video) {
}
int32_t GBAVideoProcessEvents(struct GBAVideo* video, int32_t cycles) {
return INT_MAX;
video->nextEvent -= cycles;
if (video->nextEvent <= 0) {
video->lastHblank -= video->eventDiff;
video->nextHblank -= video->eventDiff;
video->nextHblankIRQ -= video->eventDiff;
video->nextVcounterIRQ -= video->eventDiff;
if (video->inHblank) {
// End Hblank
video->inHblank = 0;
video->nextEvent = video->nextHblank;
++video->vcount;
switch (video->vcount) {
case VIDEO_VERTICAL_PIXELS:
video->inVblank = 1;
video->renderer->finishFrame(video->renderer);
video->nextVblankIRQ = video->nextEvent + VIDEO_TOTAL_LENGTH;
//video->cpu.mmu.runVblankDmas();
if (video->vblankIRQ) {
//video->cpu.irq.raiseIRQ(video->cpu.irq.IRQ_VBLANK);
}
//video->vblankCallback();
break;
case VIDEO_VERTICAL_TOTAL_PIXELS - 1:
video->inVblank = 0;
break;
case VIDEO_VERTICAL_TOTAL_PIXELS:
video->vcount = 0;
//video->renderPath.startDraw();
break;
}
video->vcounter = video->vcount == video->vcountSetting;
if (video->vcounter && video->vcounterIRQ) {
//video->cpu.irq.raiseIRQ(video->cpu.irq.IRQ_VCOUNTER);
video->nextVcounterIRQ += VIDEO_TOTAL_LENGTH;
}
if (video->vcount < VIDEO_VERTICAL_PIXELS) {
video->renderer->drawScanline(video->renderer, video->vcount);
}
} else {
// Begin Hblank
video->inHblank = 1;
video->lastHblank = video->nextHblank;
video->nextEvent = video->lastHblank + VIDEO_HBLANK_LENGTH;
video->nextHblank = video->nextEvent + VIDEO_HDRAW_LENGTH;
video->nextHblankIRQ = video->nextHblank;
if (video->vcount < VIDEO_VERTICAL_PIXELS) {
//video->cpu.mmu.runHblankDmas();
}
if (video->hblankIRQ) {
//video->cpu.irq.raiseIRQ(video->cpu.irq.IRQ_HBLANK);
}
}
video->eventDiff = video->nextEvent;
}
return video->nextEvent;
}
static void GBAVideoDummyRendererInit(struct GBAVideoRenderer* renderer) {
(void)(renderer);
// Nothing to do
}
static void GBAVideoDummyRendererDeinit(struct GBAVideoRenderer* renderer) {
(void)(renderer);
// Nothing to do
}
static uint16_t GBAVideoDummyRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) {
(void)(renderer);
(void)(address);
return value;
}
static void GBAVideoDummyRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) {
(void)(renderer);
(void)(y);
// Nothing to do
}
static void GBAVideoDummyRendererFinishFrame(struct GBAVideoRenderer* renderer) {
(void)(renderer);
printf("Drawing a frame\n");
// Nothing to do
}

View File

@ -26,12 +26,13 @@ struct GBAVideoRenderer {
void (*deinit)(struct GBAVideoRenderer* renderer);
uint16_t (*writeVideoRegister)(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value);
void (*drawScanline)(struct GBAVideoRenderer* video, int y);
void (*finishFrame)(struct GBAVideoRenderer* video);
void (*drawScanline)(struct GBAVideoRenderer* renderer, int y);
void (*finishFrame)(struct GBAVideoRenderer* renderer);
};
struct GBAVideo {
struct GBAVideoRenderer renderer;
struct GBA* p;
struct GBAVideoRenderer* renderer;
// DISPSTAT
int inHblank;
@ -49,6 +50,7 @@ struct GBAVideo {
int32_t lastHblank;
int32_t nextHblank;
int32_t nextEvent;
int32_t eventDiff;
int32_t nextHblankIRQ;
int32_t nextVblankIRQ;

View File

@ -33,6 +33,9 @@ void GBAInit(struct GBA* gba) {
GBABoardInit(&gba->board);
ARMAssociateBoard(&gba->cpu, &gba->board.d);
gba->video.p = gba;
GBAVideoInit(&gba->video);
ARMReset(&gba->cpu);
}