mirror of https://github.com/mgba-emu/mgba.git
Restructure video memory
This commit is contained in:
parent
cb48145ea3
commit
9ba9fac898
|
@ -91,7 +91,7 @@ void GBASwi16(struct ARMBoard* board, int immediate) {
|
||||||
_unLz77(&gba->memory, gba->cpu.gprs[0], &((uint8_t*) gba->memory.wram)[(gba->cpu.gprs[1] & (SIZE_WORKING_RAM - 1))]);
|
_unLz77(&gba->memory, gba->cpu.gprs[0], &((uint8_t*) gba->memory.wram)[(gba->cpu.gprs[1] & (SIZE_WORKING_RAM - 1))]);
|
||||||
break;
|
break;
|
||||||
case 0x12:
|
case 0x12:
|
||||||
_unLz77(&gba->memory, gba->cpu.gprs[0], &((uint8_t*) gba->video.renderer->vram)[(gba->cpu.gprs[1] & (SIZE_VRAM - 1))]);
|
_unLz77(&gba->memory, gba->cpu.gprs[0], &((uint8_t*) gba->video.vram)[(gba->cpu.gprs[1] & (SIZE_VRAM - 1))]);
|
||||||
break;
|
break;
|
||||||
case 0x1F:
|
case 0x1F:
|
||||||
_MidiKey2Freq(gba);
|
_MidiKey2Freq(gba);
|
||||||
|
|
|
@ -16,6 +16,10 @@ static void* _GBAThreadRun(void* context) {
|
||||||
pthread_sigmask(SIG_UNBLOCK, &signals, 0);
|
pthread_sigmask(SIG_UNBLOCK, &signals, 0);
|
||||||
|
|
||||||
GBAInit(&gba);
|
GBAInit(&gba);
|
||||||
|
if (threadContext->renderer) {
|
||||||
|
GBAVideoAssociateRenderer(&gba.video, threadContext->renderer);
|
||||||
|
}
|
||||||
|
|
||||||
threadContext->gba = &gba;
|
threadContext->gba = &gba;
|
||||||
threadContext->debugger = &debugger;
|
threadContext->debugger = &debugger;
|
||||||
if (threadContext->fd >= 0) {
|
if (threadContext->fd >= 0) {
|
||||||
|
|
|
@ -4,8 +4,12 @@
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
struct GBAThread {
|
struct GBAThread {
|
||||||
|
// Output
|
||||||
struct GBA* gba;
|
struct GBA* gba;
|
||||||
struct ARMDebugger* debugger;
|
struct ARMDebugger* debugger;
|
||||||
|
|
||||||
|
// Input
|
||||||
|
struct GBAVideoRenderer* renderer;
|
||||||
int fd;
|
int fd;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -6,14 +6,14 @@
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static void GBAVideoRendererInit(struct GBAVideoRenderer* renderer);
|
static void GBAVideoDummyRendererInit(struct GBAVideoRenderer* renderer);
|
||||||
|
|
||||||
static void GBAVideoDummyRendererDeinit(struct GBAVideoRenderer* renderer);
|
static void GBAVideoDummyRendererDeinit(struct GBAVideoRenderer* renderer);
|
||||||
static uint16_t GBAVideoDummyRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value);
|
static uint16_t GBAVideoDummyRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value);
|
||||||
static void GBAVideoDummyRendererDrawScanline(struct GBAVideoRenderer* renderer, int y);
|
static void GBAVideoDummyRendererDrawScanline(struct GBAVideoRenderer* renderer, int y);
|
||||||
static void GBAVideoDummyRendererFinishFrame(struct GBAVideoRenderer* renderer);
|
static void GBAVideoDummyRendererFinishFrame(struct GBAVideoRenderer* renderer);
|
||||||
|
|
||||||
static struct GBAVideoRenderer dummyRenderer = {
|
static struct GBAVideoRenderer dummyRenderer = {
|
||||||
|
.init = GBAVideoDummyRendererInit,
|
||||||
.deinit = GBAVideoDummyRendererDeinit,
|
.deinit = GBAVideoDummyRendererDeinit,
|
||||||
.writeVideoRegister = GBAVideoDummyRendererWriteVideoRegister,
|
.writeVideoRegister = GBAVideoDummyRendererWriteVideoRegister,
|
||||||
.drawScanline = GBAVideoDummyRendererDrawScanline,
|
.drawScanline = GBAVideoDummyRendererDrawScanline,
|
||||||
|
@ -43,6 +43,13 @@ void GBAVideoInit(struct GBAVideo* video) {
|
||||||
video->nextVcounterIRQ = 0;
|
video->nextVcounterIRQ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GBAVideoAssociateRenderer(struct GBAVideo* video, struct GBAVideoRenderer* renderer) {
|
||||||
|
video->renderer = renderer;
|
||||||
|
renderer->palette = video->palette;
|
||||||
|
renderer->vram = video->vram;
|
||||||
|
renderer->oam = &video->oam;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t GBAVideoProcessEvents(struct GBAVideo* video, int32_t cycles) {
|
int32_t GBAVideoProcessEvents(struct GBAVideo* video, int32_t cycles) {
|
||||||
video->nextEvent -= cycles;
|
video->nextEvent -= cycles;
|
||||||
if (video->nextEvent <= 0) {
|
if (video->nextEvent <= 0) {
|
||||||
|
@ -128,16 +135,16 @@ uint16_t GBAVideoReadDISPSTAT(struct GBAVideo* video) {
|
||||||
return (video->inVblank) | (video->inHblank << 1) | (video->vcounter << 2);
|
return (video->inVblank) | (video->inHblank << 1) | (video->vcounter << 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GBAVideoRendererInit(struct GBAVideoRenderer* renderer) {
|
static void GBAVideoDummyRendererInit(struct GBAVideoRenderer* renderer) {
|
||||||
memset(renderer->palette, 0, sizeof(renderer->palette));
|
(void)(renderer);
|
||||||
memset(renderer->vram, 0, sizeof(renderer->vram));
|
// Nothing to do
|
||||||
memset(&renderer->oam, 0, sizeof(renderer->oam));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GBAVideoDummyRendererDeinit(struct GBAVideoRenderer* renderer) {
|
static void GBAVideoDummyRendererDeinit(struct GBAVideoRenderer* renderer) {
|
||||||
(void)(renderer);
|
(void)(renderer);
|
||||||
// Nothing to do
|
// Nothing to do
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t GBAVideoDummyRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) {
|
static uint16_t GBAVideoDummyRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) {
|
||||||
(void)(renderer);
|
(void)(renderer);
|
||||||
(void)(address);
|
(void)(address);
|
||||||
|
|
|
@ -89,15 +89,16 @@ union GBAOAM {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GBAVideoRenderer {
|
struct GBAVideoRenderer {
|
||||||
|
void (*init)(struct GBAVideoRenderer* renderer);
|
||||||
void (*deinit)(struct GBAVideoRenderer* renderer);
|
void (*deinit)(struct GBAVideoRenderer* renderer);
|
||||||
|
|
||||||
uint16_t (*writeVideoRegister)(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value);
|
uint16_t (*writeVideoRegister)(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value);
|
||||||
void (*drawScanline)(struct GBAVideoRenderer* renderer, int y);
|
void (*drawScanline)(struct GBAVideoRenderer* renderer, int y);
|
||||||
void (*finishFrame)(struct GBAVideoRenderer* renderer);
|
void (*finishFrame)(struct GBAVideoRenderer* renderer);
|
||||||
|
|
||||||
uint16_t palette[SIZE_PALETTE_RAM >> 1];
|
uint16_t* palette;
|
||||||
uint16_t vram[SIZE_VRAM >> 1];
|
uint16_t* vram;
|
||||||
union GBAOAM oam;
|
union GBAOAM* oam;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GBAVideo {
|
struct GBAVideo {
|
||||||
|
@ -124,9 +125,14 @@ struct GBAVideo {
|
||||||
int32_t nextHblankIRQ;
|
int32_t nextHblankIRQ;
|
||||||
int32_t nextVblankIRQ;
|
int32_t nextVblankIRQ;
|
||||||
int32_t nextVcounterIRQ;
|
int32_t nextVcounterIRQ;
|
||||||
|
|
||||||
|
uint16_t palette[SIZE_PALETTE_RAM >> 1];
|
||||||
|
uint16_t vram[SIZE_VRAM >> 1];
|
||||||
|
union GBAOAM oam;
|
||||||
};
|
};
|
||||||
|
|
||||||
void GBAVideoInit(struct GBAVideo* video);
|
void GBAVideoInit(struct GBAVideo* video);
|
||||||
|
void GBAVideoAssociateRenderer(struct GBAVideo* video, struct GBAVideoRenderer* renderer);
|
||||||
int32_t GBAVideoProcessEvents(struct GBAVideo* video, int32_t cycles);
|
int32_t GBAVideoProcessEvents(struct GBAVideo* video, int32_t cycles);
|
||||||
|
|
||||||
void GBAVideoWriteDISPSTAT(struct GBAVideo* video, uint16_t value);
|
void GBAVideoWriteDISPSTAT(struct GBAVideo* video, uint16_t value);
|
||||||
|
|
Loading…
Reference in New Issue