Revert "Move halting code out from below the ARM emulator"

This reverts commit 3b74b61862.
This commit is contained in:
Jeffrey Pfau 2013-11-14 23:16:34 -08:00
parent 0bc5c4a69e
commit e6eea94626
2 changed files with 49 additions and 41 deletions

View File

@ -115,7 +115,6 @@ void GBAInit(struct GBA* gba) {
gba->timersEnabled = 0;
memset(gba->timers, 0, sizeof(gba->timers));
gba->halted = 0;
gba->springIRQ = 0;
gba->keySource = 0;
gba->rotationSource = 0;
@ -153,47 +152,37 @@ void GBABoardReset(struct ARMBoard* board) {
static void GBAProcessEvents(struct ARMBoard* board) {
struct GBABoard* gbaBoard = (struct GBABoard*) board;
do {
int32_t cycles = board->cpu->cycles;
int32_t nextEvent = INT_MAX;
int32_t testEvent;
int32_t cycles = board->cpu->cycles;
int32_t nextEvent = INT_MAX;
int32_t testEvent;
if (gbaBoard->p->springIRQ) {
ARMRaiseIRQ(&gbaBoard->p->cpu);
gbaBoard->p->springIRQ = 0;
}
if (gbaBoard->p->springIRQ) {
ARMRaiseIRQ(&gbaBoard->p->cpu);
gbaBoard->p->springIRQ = 0;
}
testEvent = GBAVideoProcessEvents(&gbaBoard->p->video, cycles);
if (testEvent < nextEvent) {
nextEvent = testEvent;
}
testEvent = GBAVideoProcessEvents(&gbaBoard->p->video, cycles);
if (testEvent < nextEvent) {
nextEvent = testEvent;
}
testEvent = GBAAudioProcessEvents(&gbaBoard->p->audio, cycles);
if (testEvent < nextEvent) {
nextEvent = testEvent;
}
testEvent = GBAAudioProcessEvents(&gbaBoard->p->audio, cycles);
if (testEvent < nextEvent) {
nextEvent = testEvent;
}
testEvent = GBAMemoryProcessEvents(&gbaBoard->p->memory, cycles);
if (testEvent < nextEvent) {
nextEvent = testEvent;
}
testEvent = GBAMemoryProcessEvents(&gbaBoard->p->memory, cycles);
if (testEvent < nextEvent) {
nextEvent = testEvent;
}
testEvent = GBATimersProcessEvents(gbaBoard->p, cycles);
if (testEvent < nextEvent) {
nextEvent = testEvent;
}
testEvent = GBATimersProcessEvents(gbaBoard->p, cycles);
if (testEvent < nextEvent) {
nextEvent = testEvent;
}
board->cpu->cycles = 0;
board->cpu->nextEvent = nextEvent;
if (gbaBoard->p->halted) {
gbaBoard->p->halted = !(gbaBoard->p->memory.io[REG_IF >> 1] & gbaBoard->p->memory.io[REG_IE >> 1]);
board->cpu->cycles = nextEvent;
if (nextEvent == INT_MAX) {
break;
}
}
} while (gbaBoard->p->halted);
board->cpu->cycles = 0;
board->cpu->nextEvent = nextEvent;
}
static int32_t GBATimersProcessEvents(struct GBA* gba, int32_t cycles) {
@ -467,9 +456,28 @@ void GBATestIRQ(struct ARMBoard* board) {
}
}
void GBAHalt(struct GBA* gba) {
gba->cpu.cycles = gba->cpu.nextEvent;
gba->halted = 1;
int GBAWaitForIRQ(struct GBA* gba) {
int irqs = gba->memory.io[REG_IF >> 1];
int newIRQs = 0;
gba->memory.io[REG_IF >> 1] = 0;
while (1) {
if (gba->cpu.nextEvent == INT_MAX) {
break;
} else {
gba->cpu.cycles = gba->cpu.nextEvent;
GBAProcessEvents(&gba->board.d);
if (gba->memory.io[REG_IF >> 1]) {
newIRQs = gba->memory.io[REG_IF >> 1];
break;
}
}
}
gba->memory.io[REG_IF >> 1] = newIRQs | irqs;
return newIRQs;
}
int GBAHalt(struct GBA* gba) {
return GBAWaitForIRQ(gba);
}
void GBALog(struct GBA* gba, enum GBALogLevel level, const char* format, ...) {

View File

@ -85,7 +85,6 @@ struct GBA {
unsigned enable : 1;
} timers[4];
int halted;
int springIRQ;
int* keySource;
struct GBARotationSource* rotationSource;
@ -128,7 +127,8 @@ void GBAWriteIE(struct GBA* gba, uint16_t value);
void GBAWriteIME(struct GBA* gba, uint16_t value);
void GBARaiseIRQ(struct GBA* gba, enum GBAIRQ irq);
void GBATestIRQ(struct ARMBoard* board);
void GBAHalt(struct GBA* gba);
int GBAWaitForIRQ(struct GBA* gba);
int GBAHalt(struct GBA* gba);
void GBAAttachDebugger(struct GBA* gba, struct ARMDebugger* debugger);