Start implementing events + add video stubs

This commit is contained in:
Jeffrey Pfau 2013-04-15 22:18:28 -07:00
parent 1838cc0597
commit 9b5d5d6478
6 changed files with 114 additions and 3 deletions

View File

@ -117,4 +117,7 @@ void ARMRun(struct ARMCore* cpu) {
} else {
ARMStep(cpu);
}
if (cpu->cycles >= cpu->nextEvent) {
cpu->board->processEvents(cpu->board);
}
}

View File

@ -87,7 +87,7 @@ struct ARMMemory {
struct ARMBoard {
struct ARMCore* cpu;
void (*reset)(struct ARMBoard* board);
void (*nextEvent)(struct ARMBoard* board);
void (*processEvents)(struct ARMBoard* board);
void (*swi16)(struct ARMBoard* board, int immediate);
void (*swi32)(struct ARMBoard* board, int immediate);
@ -99,8 +99,8 @@ struct ARMCore {
union PSR cpsr;
union PSR spsr;
uint32_t cycles;
uint32_t nextEvent;
int32_t cycles;
int32_t nextEvent;
int32_t bankedRegisters[6][7];
int32_t bankedSPSRs[6];

27
src/gba/gba-video.c Normal file
View File

@ -0,0 +1,27 @@
#include "gba-video.h"
#include <limits.h>
void GBAVideoInit(struct GBAVideo* video) {
video->inHblank = 0;
video->inVblank = 0;
video->vcounter = 0;
video->vblankIRQ = 0;
video->hblankIRQ = 0;
video->vcounterIRQ = 0;
video->vcountSetting = 0;
video->vcount = -1;
video->lastHblank = 0;
video->nextHblank = VIDEO_HDRAW_LENGTH;
video->nextEvent = video->nextHblank;
video->nextHblankIRQ = 0;
video->nextVblankIRQ = 0;
video->nextVcounterIRQ = 0;
}
int32_t GBAVideoProcessEvents(struct GBAVideo* video, int32_t cycles) {
return INT_MAX;
}

61
src/gba/gba-video.h Normal file
View File

@ -0,0 +1,61 @@
#ifndef GBA_VIDEO_H
#define GBA_VIDEO_H
#include <stdint.h>
enum {
VIDEO_CYCLES_PER_PIXEL = 4,
VIDEO_HORIZONTAL_PIXELS = 240,
VIDEO_HBLANK_PIXELS = 68,
VIDEO_HDRAW_LENGTH = 1006,
VIDEO_HBLANK_LENGTH = 226,
VIDEO_HORIZONTAL_LENGTH = 1232,
VIDEO_VERTICAL_PIXELS = 160,
VIDEO_VBLANK_PIXELS = 68,
VIDEO_VERTICAL_TOTAL_PIXELS = 228,
VIDEO_TOTAL_LENGTH = 280896,
REG_DISPSTAT_MASK = 0xFF38
};
struct GBAVideoRenderer {
void (*init)(struct GBAVideoRenderer* renderer);
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);
};
struct GBAVideo {
struct GBAVideoRenderer renderer;
// DISPSTAT
int inHblank;
int inVblank;
int vcounter;
int blankIRQ;
int vblankIRQ;
int hblankIRQ;
int vcounterIRQ;
int vcountSetting;
// VCOUNT
int vcount;
int32_t lastHblank;
int32_t nextHblank;
int32_t nextEvent;
int32_t nextHblankIRQ;
int32_t nextVblankIRQ;
int32_t nextVcounterIRQ;
};
void GBAVideoInit(struct GBAVideo* video);
int32_t GBAVideoProcessEvents(struct GBAVideo* video, int32_t cycles);
#endif

View File

@ -4,6 +4,7 @@
#include "debugger.h"
#include <limits.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
@ -15,6 +16,7 @@ enum {
SP_BASE_SUPERVISOR = 0x03FFFFE0
};
static void GBAProcessEvents(struct ARMBoard* board);
static void GBAHitStub(struct ARMBoard* board, uint32_t opcode);
void GBAInit(struct GBA* gba) {
@ -40,6 +42,7 @@ void GBADeinit(struct GBA* gba) {
void GBABoardInit(struct GBABoard* board) {
board->d.reset = GBABoardReset;
board->d.processEvents = GBAProcessEvents;
board->d.swi16 = GBASwi16;
board->d.swi32 = GBASwi32;
board->d.hitStub = GBAHitStub;
@ -55,6 +58,21 @@ void GBABoardReset(struct ARMBoard* board) {
cpu->gprs[ARM_SP] = SP_BASE_SYSTEM;
}
static void GBAProcessEvents(struct ARMBoard* board) {
struct GBABoard* gbaBoard = (struct GBABoard*) board;
int32_t cycles = board->cpu->cycles;
int32_t nextEvent = INT_MAX;
int32_t testEvent;
testEvent = GBAVideoProcessEvents(&gbaBoard->p->video, cycles);
if (testEvent < nextEvent) {
nextEvent = testEvent;
}
board->cpu->cycles = 0;
board->cpu->nextEvent = nextEvent;
}
void GBAAttachDebugger(struct GBA* gba, struct ARMDebugger* debugger) {
ARMDebuggerInit(debugger, &gba->cpu);
gba->debugger = debugger;

View File

@ -4,6 +4,7 @@
#include "arm.h"
#include "gba-memory.h"
#include "gba-video.h"
enum GBAError {
GBA_NO_ERROR = 0,
@ -23,6 +24,7 @@ struct GBA {
struct ARMCore cpu;
struct GBABoard board;
struct GBAMemory memory;
struct GBAVideo video;
struct ARMDebugger* debugger;