mirror of https://github.com/mgba-emu/mgba.git
Revert "Move halting code out from below the ARM emulator"
This reverts commit 3b74b61862
.
This commit is contained in:
parent
0bc5c4a69e
commit
e6eea94626
|
@ -115,7 +115,6 @@ void GBAInit(struct GBA* gba) {
|
||||||
gba->timersEnabled = 0;
|
gba->timersEnabled = 0;
|
||||||
memset(gba->timers, 0, sizeof(gba->timers));
|
memset(gba->timers, 0, sizeof(gba->timers));
|
||||||
|
|
||||||
gba->halted = 0;
|
|
||||||
gba->springIRQ = 0;
|
gba->springIRQ = 0;
|
||||||
gba->keySource = 0;
|
gba->keySource = 0;
|
||||||
gba->rotationSource = 0;
|
gba->rotationSource = 0;
|
||||||
|
@ -153,47 +152,37 @@ void GBABoardReset(struct ARMBoard* board) {
|
||||||
|
|
||||||
static void GBAProcessEvents(struct ARMBoard* board) {
|
static void GBAProcessEvents(struct ARMBoard* board) {
|
||||||
struct GBABoard* gbaBoard = (struct GBABoard*) board;
|
struct GBABoard* gbaBoard = (struct GBABoard*) board;
|
||||||
do {
|
int32_t cycles = board->cpu->cycles;
|
||||||
int32_t cycles = board->cpu->cycles;
|
int32_t nextEvent = INT_MAX;
|
||||||
int32_t nextEvent = INT_MAX;
|
int32_t testEvent;
|
||||||
int32_t testEvent;
|
|
||||||
|
|
||||||
if (gbaBoard->p->springIRQ) {
|
if (gbaBoard->p->springIRQ) {
|
||||||
ARMRaiseIRQ(&gbaBoard->p->cpu);
|
ARMRaiseIRQ(&gbaBoard->p->cpu);
|
||||||
gbaBoard->p->springIRQ = 0;
|
gbaBoard->p->springIRQ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
testEvent = GBAVideoProcessEvents(&gbaBoard->p->video, cycles);
|
testEvent = GBAVideoProcessEvents(&gbaBoard->p->video, cycles);
|
||||||
if (testEvent < nextEvent) {
|
if (testEvent < nextEvent) {
|
||||||
nextEvent = testEvent;
|
nextEvent = testEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
testEvent = GBAAudioProcessEvents(&gbaBoard->p->audio, cycles);
|
testEvent = GBAAudioProcessEvents(&gbaBoard->p->audio, cycles);
|
||||||
if (testEvent < nextEvent) {
|
if (testEvent < nextEvent) {
|
||||||
nextEvent = testEvent;
|
nextEvent = testEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
testEvent = GBAMemoryProcessEvents(&gbaBoard->p->memory, cycles);
|
testEvent = GBAMemoryProcessEvents(&gbaBoard->p->memory, cycles);
|
||||||
if (testEvent < nextEvent) {
|
if (testEvent < nextEvent) {
|
||||||
nextEvent = testEvent;
|
nextEvent = testEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
testEvent = GBATimersProcessEvents(gbaBoard->p, cycles);
|
testEvent = GBATimersProcessEvents(gbaBoard->p, cycles);
|
||||||
if (testEvent < nextEvent) {
|
if (testEvent < nextEvent) {
|
||||||
nextEvent = testEvent;
|
nextEvent = testEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
board->cpu->cycles = 0;
|
board->cpu->cycles = 0;
|
||||||
board->cpu->nextEvent = nextEvent;
|
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t GBATimersProcessEvents(struct GBA* gba, int32_t cycles) {
|
static int32_t GBATimersProcessEvents(struct GBA* gba, int32_t cycles) {
|
||||||
|
@ -467,9 +456,28 @@ void GBATestIRQ(struct ARMBoard* board) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GBAHalt(struct GBA* gba) {
|
int GBAWaitForIRQ(struct GBA* gba) {
|
||||||
gba->cpu.cycles = gba->cpu.nextEvent;
|
int irqs = gba->memory.io[REG_IF >> 1];
|
||||||
gba->halted = 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, ...) {
|
void GBALog(struct GBA* gba, enum GBALogLevel level, const char* format, ...) {
|
||||||
|
|
|
@ -85,7 +85,6 @@ struct GBA {
|
||||||
unsigned enable : 1;
|
unsigned enable : 1;
|
||||||
} timers[4];
|
} timers[4];
|
||||||
|
|
||||||
int halted;
|
|
||||||
int springIRQ;
|
int springIRQ;
|
||||||
int* keySource;
|
int* keySource;
|
||||||
struct GBARotationSource* rotationSource;
|
struct GBARotationSource* rotationSource;
|
||||||
|
@ -128,7 +127,8 @@ void GBAWriteIE(struct GBA* gba, uint16_t value);
|
||||||
void GBAWriteIME(struct GBA* gba, uint16_t value);
|
void GBAWriteIME(struct GBA* gba, uint16_t value);
|
||||||
void GBARaiseIRQ(struct GBA* gba, enum GBAIRQ irq);
|
void GBARaiseIRQ(struct GBA* gba, enum GBAIRQ irq);
|
||||||
void GBATestIRQ(struct ARMBoard* board);
|
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);
|
void GBAAttachDebugger(struct GBA* gba, struct ARMDebugger* debugger);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue