Skip to content

Commit

Permalink
Update to mGBA 0.7.2
Browse files Browse the repository at this point in the history
  • Loading branch information
clobber committed Jun 10, 2019
1 parent d5164f8 commit 7b3de70
Show file tree
Hide file tree
Showing 19 changed files with 238 additions and 151 deletions.
2 changes: 1 addition & 1 deletion Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>0.7.1</string>
<string>0.7.2</string>
<key>NSPrincipalClass</key>
<string>OEGameCoreController</string>
<key>OEGameCoreClass</key>
Expand Down
1 change: 1 addition & 0 deletions src/core/cheats.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ void mCheatSetDeinit(struct mCheatSet* set) {
if (set->name) {
free(set->name);
}
StringListDeinit(&set->lines);
set->deinit(set);
free(set);
}
Expand Down
4 changes: 2 additions & 2 deletions src/gb/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -816,10 +816,10 @@ static void _GBCoreEnableVideoLayer(struct mCore* core, size_t id, bool enable)
gb->video.renderer->disableBG = !enable;
break;
case 1:
gb->video.renderer->disableOBJ = !enable;
gb->video.renderer->disableWIN = !enable;
break;
case 2:
gb->video.renderer->disableWIN = !enable;
gb->video.renderer->disableOBJ = !enable;
break;
default:
break;
Expand Down
4 changes: 2 additions & 2 deletions src/gb/gb.c
Original file line number Diff line number Diff line change
Expand Up @@ -630,7 +630,7 @@ void GBDetectModel(struct GB* gb) {
}

void GBUpdateIRQs(struct GB* gb) {
int irqs = gb->memory.ie & gb->memory.io[REG_IF];
int irqs = gb->memory.ie & gb->memory.io[REG_IF] & 0x1F;
if (!irqs) {
gb->cpu->irqPending = false;
return;
Expand Down Expand Up @@ -723,7 +723,7 @@ static void _enableInterrupts(struct mTiming* timing, void* user, uint32_t cycle

void GBHalt(struct LR35902Core* cpu) {
struct GB* gb = (struct GB*) cpu->master;
if (!(gb->memory.ie & gb->memory.io[REG_IF])) {
if (!(gb->memory.ie & gb->memory.io[REG_IF] & 0x1F)) {
cpu->cycles = cpu->nextEvent;
cpu->halted = true;
} else if (gb->model < GB_MODEL_CGB) {
Expand Down
34 changes: 19 additions & 15 deletions src/gb/renderers/software.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,24 +218,23 @@ static void GBVideoSoftwareRendererDeinit(struct GBVideoRenderer* renderer) {
UNUSED(softwareRenderer);
}

static void GBVideoSoftwareRendererUpdateWindow(struct GBVideoSoftwareRenderer* renderer, bool before, bool after) {
if (renderer->lastY >= GB_VIDEO_VERTICAL_PIXELS || after == before) {
static void GBVideoSoftwareRendererUpdateWindow(struct GBVideoSoftwareRenderer* renderer, bool before, bool after, uint8_t oldWy) {
if (renderer->lastY >= GB_VIDEO_VERTICAL_PIXELS || !(after || before)) {
return;
}
if (renderer->lastY >= renderer->wy) {
if (renderer->lastY >= oldWy) {
if (!after) {
renderer->currentWy -= renderer->lastY;
renderer->hasWindow = true;
} else {
} else if (!before) {
if (!renderer->hasWindow) {
if (renderer->lastY > renderer->wy) {
renderer->currentWy = GB_VIDEO_VERTICAL_PIXELS;
} else {
renderer->currentWy = renderer->lastY - renderer->wy;
}
renderer->currentWy = renderer->lastY - renderer->wy;
} else {
renderer->currentWy += renderer->lastY;
}
} else if (renderer->wy != oldWy) {
renderer->currentWy += oldWy - renderer->wy;
renderer->hasWindow = true;
}
}
}
Expand All @@ -246,10 +245,11 @@ static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer*
GBVideoCacheWriteVideoRegister(renderer->cache, address, value);
}
bool wasWindow = _inWindow(softwareRenderer);
uint8_t wy = softwareRenderer->wy;
switch (address) {
case REG_LCDC:
softwareRenderer->lcdc = value;
GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer));
GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer), wy);
break;
case REG_SCY:
softwareRenderer->scy = value;
Expand All @@ -259,11 +259,11 @@ static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer*
break;
case REG_WY:
softwareRenderer->wy = value;
GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer));
GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer), wy);
break;
case REG_WX:
softwareRenderer->wx = value;
GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer));
GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer), wy);
break;
case REG_BGP:
softwareRenderer->lookup[0] = value & 3;
Expand Down Expand Up @@ -498,9 +498,13 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i
}
if (GBRegisterLCDCIsBgEnable(softwareRenderer->lcdc) || softwareRenderer->model >= GB_MODEL_CGB) {
int wy = softwareRenderer->wy + softwareRenderer->currentWy;
if (GBRegisterLCDCIsWindow(softwareRenderer->lcdc) && wy <= y && endX >= softwareRenderer->wx - 7) {
if (softwareRenderer->wx - 7 > 0 && !softwareRenderer->d.disableBG) {
GBVideoSoftwareRendererDrawBackground(softwareRenderer, maps, startX, softwareRenderer->wx - 7, softwareRenderer->scx - softwareRenderer->offsetScx, softwareRenderer->scy + y - softwareRenderer->offsetScy);
int wx = softwareRenderer->wx - 7;
if (GBRegisterLCDCIsWindow(softwareRenderer->lcdc) && wy == y && wx <= endX) {
softwareRenderer->hasWindow = true;
}
if (GBRegisterLCDCIsWindow(softwareRenderer->lcdc) && softwareRenderer->hasWindow && wx <= endX) {
if (wx > 0 && !softwareRenderer->d.disableBG) {
GBVideoSoftwareRendererDrawBackground(softwareRenderer, maps, startX, wx, softwareRenderer->scx - softwareRenderer->offsetScx, softwareRenderer->scy + y - softwareRenderer->offsetScy);
}

maps = &softwareRenderer->d.vram[GB_BASE_MAP];
Expand Down
4 changes: 4 additions & 0 deletions src/gb/test/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ M_TEST_DEFINE(reset) {
assert_true(core->init(core));
mCoreInitConfig(core, NULL);
core->reset(core);
mCoreConfigDeinit(&core->config);
core->deinit(core);
}

Expand All @@ -41,6 +42,7 @@ M_TEST_DEFINE(loadNullROM) {
mCoreInitConfig(core, NULL);
assert_false(core->loadROM(core, NULL));
core->reset(core);
mCoreConfigDeinit(&core->config);
core->deinit(core);
}

Expand All @@ -51,7 +53,9 @@ M_TEST_DEFINE(isROM) {
struct mCore* core = mCoreFindVF(vf);
assert_non_null(core);
assert_int_equal(core->platform(core), PLATFORM_GB);
vf->close(vf);
assert_true(core->init(core));

core->deinit(core);
}

Expand Down
1 change: 1 addition & 0 deletions src/gb/test/mbc.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ M_TEST_SUITE_TEARDOWN(GBMBC) {
return 0;
}
struct mCore* core = *state;
mCoreConfigDeinit(&core->config);
core->deinit(core);
return 0;
}
Expand Down
1 change: 1 addition & 0 deletions src/gb/test/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ M_TEST_SUITE_TEARDOWN(GBMemory) {
return 0;
}
struct mCore* core = *state;
mCoreConfigDeinit(&core->config);
core->deinit(core);
return 0;
}
Expand Down
1 change: 1 addition & 0 deletions src/gb/test/rtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ M_TEST_SUITE_TEARDOWN(GBRTC) {
return 0;
}
struct GBRTCTest* test = *state;
mCoreConfigDeinit(&test->core->config);
test->core->deinit(test->core);
free(test);
return 0;
Expand Down
7 changes: 4 additions & 3 deletions src/gb/timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,10 @@ void GBTimerDivReset(struct GBTimer* timer) {

uint8_t GBTimerUpdateTAC(struct GBTimer* timer, GBRegisterTAC tac) {
if (GBRegisterTACIsRun(tac)) {
timer->nextDiv -= mTimingUntil(&timer->p->timing, &timer->event);
mTimingDeschedule(&timer->p->timing, &timer->event);
_GBTimerDivIncrement(timer, (timer->p->cpu->executionState + 2) & 3);

switch (GBRegisterTACGetClock(tac)) {
case 0:
timer->timaPeriod = 1024 >> 4;
Expand All @@ -107,9 +111,6 @@ uint8_t GBTimerUpdateTAC(struct GBTimer* timer, GBRegisterTAC tac) {
break;
}

timer->nextDiv -= mTimingUntil(&timer->p->timing, &timer->event);
mTimingDeschedule(&timer->p->timing, &timer->event);
_GBTimerDivIncrement(timer, (timer->p->cpu->executionState + 2) & 3);
timer->nextDiv += GB_DMG_DIV_PERIOD;
mTimingSchedule(&timer->p->timing, &timer->event, timer->nextDiv);
} else {
Expand Down
9 changes: 8 additions & 1 deletion src/gb/video.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,6 @@ void _endMode0(struct mTiming* timing, void* context, uint32_t cyclesLate) {
++video->ly;
video->p->memory.io[REG_LY] = video->ly;
GBRegisterSTAT oldStat = video->stat;
video->stat = GBRegisterSTATSetLYC(video->stat, lyc == video->ly);
if (video->ly < GB_VIDEO_VERTICAL_PIXELS) {
next = GB_VIDEO_MODE_2_LENGTH;
video->mode = 2;
Expand All @@ -246,6 +245,14 @@ void _endMode0(struct mTiming* timing, void* context, uint32_t cyclesLate) {
if (!_statIRQAsserted(video, oldStat) && _statIRQAsserted(video, video->stat)) {
video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT);
}

// LYC stat is delayed 1 T-cycle
oldStat = video->stat;
video->stat = GBRegisterSTATSetLYC(video->stat, lyc == video->ly);
if (!_statIRQAsserted(video, oldStat) && _statIRQAsserted(video, video->stat)) {
video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT);
}

GBUpdateIRQs(video->p);
video->p->memory.io[REG_STAT] = video->stat;
mTimingSchedule(timing, &video->modeEvent, (next << video->p->doubleSpeed) - cyclesLate);
Expand Down
2 changes: 1 addition & 1 deletion src/gba/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ static void _GBACoreReset(struct mCore* core) {
#endif

ARMReset(core->cpu);
if (core->opts.skipBios && gba->isPristine) {
if (core->opts.skipBios && (gba->romVf || gba->memory.rom)) {
GBASkipBIOS(core->board);
}
}
Expand Down
8 changes: 2 additions & 6 deletions src/gba/gba.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,10 +218,6 @@ void GBAReset(struct ARMCore* cpu) {
if (gba->pristineRomSize > SIZE_CART0) {
GBAMatrixReset(gba);
}

if (!gba->romVf && gba->memory.rom) {
GBASkipBIOS(gba);
}
}

void GBASkipBIOS(struct GBA* gba) {
Expand Down Expand Up @@ -393,8 +389,6 @@ bool GBALoadROM(struct GBA* gba, struct VFile* vf) {
gba->memory.romMask = toPow2(gba->memory.romSize) - 1;
gba->memory.mirroring = false;
gba->romCrc32 = doCrc32(gba->memory.rom, gba->memory.romSize);
GBAHardwareInit(&gba->memory.hw, &((uint16_t*) gba->memory.rom)[GPIO_REG_DATA >> 1]);
GBAVFameDetect(&gba->memory.vfame, gba->memory.rom, gba->memory.romSize);
if (popcount32(gba->memory.romSize) != 1) {
// This ROM is either a bad dump or homebrew. Emulate flash cart behavior.
#ifndef FIXED_ROM_BUFFER
Expand All @@ -409,6 +403,8 @@ bool GBALoadROM(struct GBA* gba, struct VFile* vf) {
if (gba->cpu && gba->memory.activeRegion >= REGION_CART0) {
gba->cpu->memory.setActiveRegion(gba->cpu, gba->cpu->gprs[ARM_PC]);
}
GBAHardwareInit(&gba->memory.hw, &((uint16_t*) gba->memory.rom)[GPIO_REG_DATA >> 1]);
GBAVFameDetect(&gba->memory.vfame, gba->memory.rom, gba->memory.romSize);
// TODO: error check
return true;
}
Expand Down
6 changes: 3 additions & 3 deletions src/gba/io.c
Original file line number Diff line number Diff line change
Expand Up @@ -461,19 +461,19 @@ void GBAIOWrite(struct GBA* gba, uint32_t address, uint16_t value) {
break;

case REG_DMA0CNT_LO:
GBADMAWriteCNT_LO(gba, 0, value);
GBADMAWriteCNT_LO(gba, 0, value & 0x3FFF);
break;
case REG_DMA0CNT_HI:
value = GBADMAWriteCNT_HI(gba, 0, value);
break;
case REG_DMA1CNT_LO:
GBADMAWriteCNT_LO(gba, 1, value);
GBADMAWriteCNT_LO(gba, 1, value & 0x3FFF);
break;
case REG_DMA1CNT_HI:
value = GBADMAWriteCNT_HI(gba, 1, value);
break;
case REG_DMA2CNT_LO:
GBADMAWriteCNT_LO(gba, 2, value);
GBADMAWriteCNT_LO(gba, 2, value & 0x3FFF);
break;
case REG_DMA2CNT_HI:
value = GBADMAWriteCNT_HI(gba, 2, value);
Expand Down
Loading

0 comments on commit 7b3de70

Please sign in to comment.