Skip to content

Commit 7b3de70

Browse files
committed
Update to mGBA 0.7.2
1 parent d5164f8 commit 7b3de70

File tree

19 files changed

+238
-151
lines changed

19 files changed

+238
-151
lines changed

Info.plist

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<key>CFBundleSignature</key>
1818
<string>????</string>
1919
<key>CFBundleVersion</key>
20-
<string>0.7.1</string>
20+
<string>0.7.2</string>
2121
<key>NSPrincipalClass</key>
2222
<string>OEGameCoreController</string>
2323
<key>OEGameCoreClass</key>

src/core/cheats.c

+1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ void mCheatSetDeinit(struct mCheatSet* set) {
9090
if (set->name) {
9191
free(set->name);
9292
}
93+
StringListDeinit(&set->lines);
9394
set->deinit(set);
9495
free(set);
9596
}

src/gb/core.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -816,10 +816,10 @@ static void _GBCoreEnableVideoLayer(struct mCore* core, size_t id, bool enable)
816816
gb->video.renderer->disableBG = !enable;
817817
break;
818818
case 1:
819-
gb->video.renderer->disableOBJ = !enable;
819+
gb->video.renderer->disableWIN = !enable;
820820
break;
821821
case 2:
822-
gb->video.renderer->disableWIN = !enable;
822+
gb->video.renderer->disableOBJ = !enable;
823823
break;
824824
default:
825825
break;

src/gb/gb.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ void GBDetectModel(struct GB* gb) {
630630
}
631631

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

724724
void GBHalt(struct LR35902Core* cpu) {
725725
struct GB* gb = (struct GB*) cpu->master;
726-
if (!(gb->memory.ie & gb->memory.io[REG_IF])) {
726+
if (!(gb->memory.ie & gb->memory.io[REG_IF] & 0x1F)) {
727727
cpu->cycles = cpu->nextEvent;
728728
cpu->halted = true;
729729
} else if (gb->model < GB_MODEL_CGB) {

src/gb/renderers/software.c

+19-15
Original file line numberDiff line numberDiff line change
@@ -218,24 +218,23 @@ static void GBVideoSoftwareRendererDeinit(struct GBVideoRenderer* renderer) {
218218
UNUSED(softwareRenderer);
219219
}
220220

221-
static void GBVideoSoftwareRendererUpdateWindow(struct GBVideoSoftwareRenderer* renderer, bool before, bool after) {
222-
if (renderer->lastY >= GB_VIDEO_VERTICAL_PIXELS || after == before) {
221+
static void GBVideoSoftwareRendererUpdateWindow(struct GBVideoSoftwareRenderer* renderer, bool before, bool after, uint8_t oldWy) {
222+
if (renderer->lastY >= GB_VIDEO_VERTICAL_PIXELS || !(after || before)) {
223223
return;
224224
}
225-
if (renderer->lastY >= renderer->wy) {
225+
if (renderer->lastY >= oldWy) {
226226
if (!after) {
227227
renderer->currentWy -= renderer->lastY;
228228
renderer->hasWindow = true;
229-
} else {
229+
} else if (!before) {
230230
if (!renderer->hasWindow) {
231-
if (renderer->lastY > renderer->wy) {
232-
renderer->currentWy = GB_VIDEO_VERTICAL_PIXELS;
233-
} else {
234-
renderer->currentWy = renderer->lastY - renderer->wy;
235-
}
231+
renderer->currentWy = renderer->lastY - renderer->wy;
236232
} else {
237233
renderer->currentWy += renderer->lastY;
238234
}
235+
} else if (renderer->wy != oldWy) {
236+
renderer->currentWy += oldWy - renderer->wy;
237+
renderer->hasWindow = true;
239238
}
240239
}
241240
}
@@ -246,10 +245,11 @@ static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer*
246245
GBVideoCacheWriteVideoRegister(renderer->cache, address, value);
247246
}
248247
bool wasWindow = _inWindow(softwareRenderer);
248+
uint8_t wy = softwareRenderer->wy;
249249
switch (address) {
250250
case REG_LCDC:
251251
softwareRenderer->lcdc = value;
252-
GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer));
252+
GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer), wy);
253253
break;
254254
case REG_SCY:
255255
softwareRenderer->scy = value;
@@ -259,11 +259,11 @@ static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer*
259259
break;
260260
case REG_WY:
261261
softwareRenderer->wy = value;
262-
GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer));
262+
GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer), wy);
263263
break;
264264
case REG_WX:
265265
softwareRenderer->wx = value;
266-
GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer));
266+
GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer), wy);
267267
break;
268268
case REG_BGP:
269269
softwareRenderer->lookup[0] = value & 3;
@@ -498,9 +498,13 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i
498498
}
499499
if (GBRegisterLCDCIsBgEnable(softwareRenderer->lcdc) || softwareRenderer->model >= GB_MODEL_CGB) {
500500
int wy = softwareRenderer->wy + softwareRenderer->currentWy;
501-
if (GBRegisterLCDCIsWindow(softwareRenderer->lcdc) && wy <= y && endX >= softwareRenderer->wx - 7) {
502-
if (softwareRenderer->wx - 7 > 0 && !softwareRenderer->d.disableBG) {
503-
GBVideoSoftwareRendererDrawBackground(softwareRenderer, maps, startX, softwareRenderer->wx - 7, softwareRenderer->scx - softwareRenderer->offsetScx, softwareRenderer->scy + y - softwareRenderer->offsetScy);
501+
int wx = softwareRenderer->wx - 7;
502+
if (GBRegisterLCDCIsWindow(softwareRenderer->lcdc) && wy == y && wx <= endX) {
503+
softwareRenderer->hasWindow = true;
504+
}
505+
if (GBRegisterLCDCIsWindow(softwareRenderer->lcdc) && softwareRenderer->hasWindow && wx <= endX) {
506+
if (wx > 0 && !softwareRenderer->d.disableBG) {
507+
GBVideoSoftwareRendererDrawBackground(softwareRenderer, maps, startX, wx, softwareRenderer->scx - softwareRenderer->offsetScx, softwareRenderer->scy + y - softwareRenderer->offsetScy);
504508
}
505509

506510
maps = &softwareRenderer->d.vram[GB_BASE_MAP];

src/gb/test/core.c

+4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ M_TEST_DEFINE(reset) {
3131
assert_true(core->init(core));
3232
mCoreInitConfig(core, NULL);
3333
core->reset(core);
34+
mCoreConfigDeinit(&core->config);
3435
core->deinit(core);
3536
}
3637

@@ -41,6 +42,7 @@ M_TEST_DEFINE(loadNullROM) {
4142
mCoreInitConfig(core, NULL);
4243
assert_false(core->loadROM(core, NULL));
4344
core->reset(core);
45+
mCoreConfigDeinit(&core->config);
4446
core->deinit(core);
4547
}
4648

@@ -51,7 +53,9 @@ M_TEST_DEFINE(isROM) {
5153
struct mCore* core = mCoreFindVF(vf);
5254
assert_non_null(core);
5355
assert_int_equal(core->platform(core), PLATFORM_GB);
56+
vf->close(vf);
5457
assert_true(core->init(core));
58+
5559
core->deinit(core);
5660
}
5761

src/gb/test/mbc.c

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ M_TEST_SUITE_TEARDOWN(GBMBC) {
2727
return 0;
2828
}
2929
struct mCore* core = *state;
30+
mCoreConfigDeinit(&core->config);
3031
core->deinit(core);
3132
return 0;
3233
}

src/gb/test/memory.c

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ M_TEST_SUITE_TEARDOWN(GBMemory) {
2727
return 0;
2828
}
2929
struct mCore* core = *state;
30+
mCoreConfigDeinit(&core->config);
3031
core->deinit(core);
3132
return 0;
3233
}

src/gb/test/rtc.c

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ M_TEST_SUITE_TEARDOWN(GBRTC) {
6969
return 0;
7070
}
7171
struct GBRTCTest* test = *state;
72+
mCoreConfigDeinit(&test->core->config);
7273
test->core->deinit(test->core);
7374
free(test);
7475
return 0;

src/gb/timer.c

+4-3
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ void GBTimerDivReset(struct GBTimer* timer) {
9292

9393
uint8_t GBTimerUpdateTAC(struct GBTimer* timer, GBRegisterTAC tac) {
9494
if (GBRegisterTACIsRun(tac)) {
95+
timer->nextDiv -= mTimingUntil(&timer->p->timing, &timer->event);
96+
mTimingDeschedule(&timer->p->timing, &timer->event);
97+
_GBTimerDivIncrement(timer, (timer->p->cpu->executionState + 2) & 3);
98+
9599
switch (GBRegisterTACGetClock(tac)) {
96100
case 0:
97101
timer->timaPeriod = 1024 >> 4;
@@ -107,9 +111,6 @@ uint8_t GBTimerUpdateTAC(struct GBTimer* timer, GBRegisterTAC tac) {
107111
break;
108112
}
109113

110-
timer->nextDiv -= mTimingUntil(&timer->p->timing, &timer->event);
111-
mTimingDeschedule(&timer->p->timing, &timer->event);
112-
_GBTimerDivIncrement(timer, (timer->p->cpu->executionState + 2) & 3);
113114
timer->nextDiv += GB_DMG_DIV_PERIOD;
114115
mTimingSchedule(&timer->p->timing, &timer->event, timer->nextDiv);
115116
} else {

src/gb/video.c

+8-1
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,6 @@ void _endMode0(struct mTiming* timing, void* context, uint32_t cyclesLate) {
224224
++video->ly;
225225
video->p->memory.io[REG_LY] = video->ly;
226226
GBRegisterSTAT oldStat = video->stat;
227-
video->stat = GBRegisterSTATSetLYC(video->stat, lyc == video->ly);
228227
if (video->ly < GB_VIDEO_VERTICAL_PIXELS) {
229228
next = GB_VIDEO_MODE_2_LENGTH;
230229
video->mode = 2;
@@ -246,6 +245,14 @@ void _endMode0(struct mTiming* timing, void* context, uint32_t cyclesLate) {
246245
if (!_statIRQAsserted(video, oldStat) && _statIRQAsserted(video, video->stat)) {
247246
video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT);
248247
}
248+
249+
// LYC stat is delayed 1 T-cycle
250+
oldStat = video->stat;
251+
video->stat = GBRegisterSTATSetLYC(video->stat, lyc == video->ly);
252+
if (!_statIRQAsserted(video, oldStat) && _statIRQAsserted(video, video->stat)) {
253+
video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT);
254+
}
255+
249256
GBUpdateIRQs(video->p);
250257
video->p->memory.io[REG_STAT] = video->stat;
251258
mTimingSchedule(timing, &video->modeEvent, (next << video->p->doubleSpeed) - cyclesLate);

src/gba/core.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ static void _GBACoreReset(struct mCore* core) {
445445
#endif
446446

447447
ARMReset(core->cpu);
448-
if (core->opts.skipBios && gba->isPristine) {
448+
if (core->opts.skipBios && (gba->romVf || gba->memory.rom)) {
449449
GBASkipBIOS(core->board);
450450
}
451451
}

src/gba/gba.c

+2-6
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,6 @@ void GBAReset(struct ARMCore* cpu) {
218218
if (gba->pristineRomSize > SIZE_CART0) {
219219
GBAMatrixReset(gba);
220220
}
221-
222-
if (!gba->romVf && gba->memory.rom) {
223-
GBASkipBIOS(gba);
224-
}
225221
}
226222

227223
void GBASkipBIOS(struct GBA* gba) {
@@ -393,8 +389,6 @@ bool GBALoadROM(struct GBA* gba, struct VFile* vf) {
393389
gba->memory.romMask = toPow2(gba->memory.romSize) - 1;
394390
gba->memory.mirroring = false;
395391
gba->romCrc32 = doCrc32(gba->memory.rom, gba->memory.romSize);
396-
GBAHardwareInit(&gba->memory.hw, &((uint16_t*) gba->memory.rom)[GPIO_REG_DATA >> 1]);
397-
GBAVFameDetect(&gba->memory.vfame, gba->memory.rom, gba->memory.romSize);
398392
if (popcount32(gba->memory.romSize) != 1) {
399393
// This ROM is either a bad dump or homebrew. Emulate flash cart behavior.
400394
#ifndef FIXED_ROM_BUFFER
@@ -409,6 +403,8 @@ bool GBALoadROM(struct GBA* gba, struct VFile* vf) {
409403
if (gba->cpu && gba->memory.activeRegion >= REGION_CART0) {
410404
gba->cpu->memory.setActiveRegion(gba->cpu, gba->cpu->gprs[ARM_PC]);
411405
}
406+
GBAHardwareInit(&gba->memory.hw, &((uint16_t*) gba->memory.rom)[GPIO_REG_DATA >> 1]);
407+
GBAVFameDetect(&gba->memory.vfame, gba->memory.rom, gba->memory.romSize);
412408
// TODO: error check
413409
return true;
414410
}

src/gba/io.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -461,19 +461,19 @@ void GBAIOWrite(struct GBA* gba, uint32_t address, uint16_t value) {
461461
break;
462462

463463
case REG_DMA0CNT_LO:
464-
GBADMAWriteCNT_LO(gba, 0, value);
464+
GBADMAWriteCNT_LO(gba, 0, value & 0x3FFF);
465465
break;
466466
case REG_DMA0CNT_HI:
467467
value = GBADMAWriteCNT_HI(gba, 0, value);
468468
break;
469469
case REG_DMA1CNT_LO:
470-
GBADMAWriteCNT_LO(gba, 1, value);
470+
GBADMAWriteCNT_LO(gba, 1, value & 0x3FFF);
471471
break;
472472
case REG_DMA1CNT_HI:
473473
value = GBADMAWriteCNT_HI(gba, 1, value);
474474
break;
475475
case REG_DMA2CNT_LO:
476-
GBADMAWriteCNT_LO(gba, 2, value);
476+
GBADMAWriteCNT_LO(gba, 2, value & 0x3FFF);
477477
break;
478478
case REG_DMA2CNT_HI:
479479
value = GBADMAWriteCNT_HI(gba, 2, value);

0 commit comments

Comments
 (0)