GBA: Add baseline CP0 (Wii U VC) and CP1 (DCC) implementations

This commit is contained in:
Vicki Pfau 2024-06-02 17:33:25 -07:00
parent e4e455dd5e
commit 455060ec08
2 changed files with 19 additions and 0 deletions

View File

@ -13,6 +13,7 @@ Emulation fixes:
- GB Serialize: Add missing Pocket Cam state to savestates
- GB Video: Implement DMG-style sprite ordering
- GBA: Unhandled bkpt should be treated as an undefined exception
- GBA: Add baseline CP0 (Wii U VC) and CP1 (DCC) implementations
- GBA GPIO: Fix gyro read-out start (fixes mgba.io/i/3141)
- GBA I/O: Fix HALTCNT access behavior (fixes mgba.io/i/2309)
- GBA SIO: Fix MULTI mode SIOCNT bit 7 writes on secondary GBAs (fixes mgba.io/i/3110)

View File

@ -40,6 +40,8 @@ static const uint8_t GBA_ROM_MAGIC2[] = { 0x96 };
static const size_t GBA_MB_MAGIC_OFFSET = 0xC0;
static void GBAInit(void* cpu, struct mCPUComponent* component);
static void GBACP0Process(struct ARMCore* cpu, int crn, int crm, int crd, int opcode1, int opcode2);
static int32_t GBACP14Read(struct ARMCore* cpu, int crn, int crm, int opcode1, int opcode2);
static void GBAInterruptHandlerInit(struct ARMInterruptHandler* irqh);
static void GBAProcessEvents(struct ARMCore* cpu);
static void GBAHitStub(struct ARMCore* cpu, uint32_t opcode);
@ -72,6 +74,8 @@ static void GBAInit(void* cpu, struct mCPUComponent* component) {
gba->sync = 0;
GBAInterruptHandlerInit(&gba->cpu->irqh);
gba->cpu->cp[0].cdp = GBACP0Process;
gba->cpu->cp[14].mrc = GBACP14Read;
GBAMemoryInit(gba);
gba->memory.savedata.timing = &gba->timing;
@ -186,6 +190,20 @@ void GBADestroy(struct GBA* gba) {
mCoreCallbacksListDeinit(&gba->coreCallbacks);
}
static void GBACP0Process(struct ARMCore* cpu, int crn, int crm, int crd, int opcode1, int opcode2) {
UNUSED(cpu);
mLOG(GBA, INFO, "Hit Wii U VC opcode: cdp p0, %i, c%i, c%i, c%i, %i", opcode1, crd, crn, crm, opcode2);
}
static int32_t GBACP14Read(struct ARMCore* cpu, int crn, int crm, int opcode1, int opcode2) {
UNUSED(cpu);
UNUSED(crn);
UNUSED(crm);
UNUSED(opcode1);
UNUSED(opcode2);
return 0xF000B570;
}
void GBAInterruptHandlerInit(struct ARMInterruptHandler* irqh) {
irqh->reset = GBAReset;
irqh->processEvents = GBAProcessEvents;