Skip to content

Commit 4fbc43b

Browse files
committed
Update to mGBA 0.8.1
1 parent 6593ecc commit 4fbc43b

File tree

16 files changed

+96
-35
lines changed

16 files changed

+96
-35
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.8.0</string>
20+
<string>0.8.1</string>
2121
<key>NSPrincipalClass</key>
2222
<string>OEGameCoreController</string>
2323
<key>OEGameCoreClass</key>

src/core/core.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ bool mCoreLoadELF(struct mCore* core, struct ELF* elf) {
370370
Elf32_Phdr* phdr = ELFProgramHeadersGetPointer(&ph, i);
371371
void* block = mCoreGetMemoryBlock(core, phdr->p_paddr, &bsize);
372372
char* bytes = ELFBytes(elf, &esize);
373-
if (block && bsize >= phdr->p_filesz && esize >= phdr->p_filesz + phdr->p_offset) {
373+
if (block && bsize >= phdr->p_filesz && bsize > phdr->p_offset && esize >= phdr->p_filesz + phdr->p_offset) {
374374
memcpy(block, &bytes[phdr->p_offset], phdr->p_filesz);
375375
} else {
376376
return false;

src/gb/audio.c

+6-2
Original file line numberDiff line numberDiff line change
@@ -1078,9 +1078,13 @@ void GBAudioPSGDeserialize(struct GBAudio* audio, const struct GBSerializedPSGSt
10781078
LOAD_32LE(audio->ch4.lastEvent, 0, &state->ch4.lastEvent);
10791079
LOAD_32LE(when, 0, &state->ch4.nextEvent);
10801080
if (audio->ch4.envelope.dead < 2 && audio->playingCh4) {
1081-
if (when - audio->ch4.lastEvent > (uint32_t) audio->sampleInterval) {
1081+
if (!audio->ch4.lastEvent) {
10821082
// Back-compat: fake this value
1083-
audio->ch4.lastEvent = when - audio->sampleInterval;
1083+
uint32_t currentTime = mTimingCurrentTime(audio->timing);
1084+
int32_t cycles = audio->ch4.ratio ? 2 * audio->ch4.ratio : 1;
1085+
cycles <<= audio->ch4.frequency;
1086+
cycles *= 8 * audio->timingFactor;
1087+
audio->ch4.lastEvent = currentTime + (when & (cycles - 1)) - cycles;
10841088
}
10851089
mTimingSchedule(audio->timing, &audio->ch4Event, when);
10861090
}

src/gb/debugger/cli.c

+6
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,17 @@ static void _GBCLIDebuggerInit(struct CLIDebuggerSystem*);
1616
static bool _GBCLIDebuggerCustom(struct CLIDebuggerSystem*);
1717

1818
static void _frame(struct CLIDebugger*, struct CLIDebugVector*);
19+
#if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2
1920
static void _load(struct CLIDebugger*, struct CLIDebugVector*);
2021
static void _save(struct CLIDebugger*, struct CLIDebugVector*);
22+
#endif
2123

2224
struct CLIDebuggerCommandSummary _GBCLIDebuggerCommands[] = {
2325
{ "frame", _frame, "", "Frame advance" },
26+
#if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2
2427
{ "load", _load, "*", "Load a savestate" },
2528
{ "save", _save, "*", "Save a savestate" },
29+
#endif
2630
{ 0, 0, 0, 0 }
2731
};
2832

@@ -73,6 +77,7 @@ static void _frame(struct CLIDebugger* debugger, struct CLIDebugVector* dv) {
7377
gbDebugger->inVblank = GBRegisterSTATGetMode(((struct GB*) gbDebugger->core->board)->memory.io[REG_STAT]) == 1;
7478
}
7579

80+
#if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2
7681
static void _load(struct CLIDebugger* debugger, struct CLIDebugVector* dv) {
7782
struct CLIDebuggerBackend* be = debugger->backend;
7883
if (!dv || dv->type != CLIDV_INT_TYPE) {
@@ -106,3 +111,4 @@ static void _save(struct CLIDebugger* debugger, struct CLIDebugVector* dv) {
106111

107112
mCoreSaveState(gbDebugger->core, dv->intValue, SAVESTATE_SCREENSHOT | SAVESTATE_RTC | SAVESTATE_METADATA);
108113
}
114+
#endif

src/gba/audio.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ void GBAAudioResizeBuffer(struct GBAAudio* audio, size_t samples) {
104104
}
105105

106106
void GBAAudioScheduleFifoDma(struct GBAAudio* audio, int number, struct GBADMA* info) {
107+
info->reg = GBADMARegisterSetDestControl(info->reg, GBA_DMA_FIXED);
108+
info->reg = GBADMARegisterSetWidth(info->reg, 1);
107109
switch (info->dest) {
108110
case BASE_IO | REG_FIFO_A_LO:
109111
audio->chA.dmaSource = number;
@@ -129,8 +131,6 @@ void GBAAudioScheduleFifoDma(struct GBAAudio* audio, int number, struct GBADMA*
129131
audio->externalMixing = false;
130132
}
131133
}
132-
info->reg = GBADMARegisterSetDestControl(info->reg, GBA_DMA_FIXED);
133-
info->reg = GBADMARegisterSetWidth(info->reg, 1);
134134
}
135135

136136
void GBAAudioWriteSOUND1CNT_LO(struct GBAAudio* audio, uint16_t value) {

src/gba/core.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ static void _GBACoreReset(struct mCore* core) {
608608
#endif
609609

610610
ARMReset(core->cpu);
611-
if (core->opts.skipBios && (gba->romVf || gba->memory.rom)) {
611+
if ((core->opts.skipBios && (gba->romVf || gba->memory.rom)) || (gba->romVf && GBAIsMB(gba->romVf))) {
612612
GBASkipBIOS(core->board);
613613
}
614614
}

src/gba/debugger/cli.c

+6
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,17 @@ static void _GBACLIDebuggerInit(struct CLIDebuggerSystem*);
1616
static bool _GBACLIDebuggerCustom(struct CLIDebuggerSystem*);
1717

1818
static void _frame(struct CLIDebugger*, struct CLIDebugVector*);
19+
#if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2
1920
static void _load(struct CLIDebugger*, struct CLIDebugVector*);
2021
static void _save(struct CLIDebugger*, struct CLIDebugVector*);
22+
#endif
2123

2224
struct CLIDebuggerCommandSummary _GBACLIDebuggerCommands[] = {
2325
{ "frame", _frame, "", "Frame advance" },
26+
#if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2
2427
{ "load", _load, "*", "Load a savestate" },
2528
{ "save", _save, "*", "Save a savestate" },
29+
#endif
2630
{ 0, 0, 0, 0 }
2731
};
2832

@@ -72,6 +76,7 @@ static void _frame(struct CLIDebugger* debugger, struct CLIDebugVector* dv) {
7276
gbaDebugger->inVblank = GBARegisterDISPSTATGetInVblank(((struct GBA*) gbaDebugger->core->board)->memory.io[REG_DISPSTAT >> 1]);
7377
}
7478

79+
#if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2
7580
static void _load(struct CLIDebugger* debugger, struct CLIDebugVector* dv) {
7681
struct CLIDebuggerBackend* be = debugger->backend;
7782
if (!dv || dv->type != CLIDV_INT_TYPE) {
@@ -107,3 +112,4 @@ static void _save(struct CLIDebugger* debugger, struct CLIDebugVector* dv) {
107112

108113
mCoreSaveState(gbaDebugger->core, dv->intValue, SAVESTATE_SCREENSHOT | SAVESTATE_RTC | SAVESTATE_METADATA);
109114
}
115+
#endif

src/gba/gba.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ void GBASkipBIOS(struct GBA* gba) {
257257
if (gba->memory.rom) {
258258
cpu->gprs[ARM_PC] = BASE_CART0;
259259
} else {
260-
cpu->gprs[ARM_PC] = BASE_WORKING_RAM;
260+
cpu->gprs[ARM_PC] = BASE_WORKING_RAM + 0xC0;
261261
}
262262
gba->video.vcount = 0x7D;
263263
gba->memory.io[REG_VCOUNT >> 1] = 0x7D;

src/gba/hle-bios.c

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
#include <mgba/internal/gba/memory.h>
44

55
const uint8_t hleBios[SIZE_BIOS] = {
6-
0x06, 0x00, 0x00, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x0b, 0x00, 0x00, 0xea,
6+
0x06, 0x00, 0x00, 0xea, 0x88, 0x00, 0x00, 0xea, 0x0b, 0x00, 0x00, 0xea,
77
0xfe, 0xff, 0xff, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x00, 0x00, 0xa0, 0xe1,
88
0x2c, 0x00, 0x00, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x02, 0x03, 0xa0, 0xe3,
9-
0x03, 0x10, 0xd0, 0xe5, 0xea, 0x00, 0x51, 0xe3, 0xf8, 0x01, 0x9f, 0x15,
9+
0x03, 0x10, 0xd0, 0xe5, 0xea, 0x00, 0x51, 0xe3, 0x04, 0x02, 0x9f, 0x15,
1010
0x10, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x29, 0xe1,
1111
0x00, 0x00, 0x5d, 0xe3, 0x01, 0xd3, 0xa0, 0x03, 0x20, 0xd0, 0x4d, 0x02,
1212
0x00, 0x58, 0x2d, 0xe9, 0x02, 0xb0, 0x5e, 0xe5, 0x9c, 0xc0, 0xa0, 0xe3,
@@ -49,5 +49,6 @@ const uint8_t hleBios[SIZE_BIOS] = {
4949
0x03, 0xa0, 0xa0, 0xe1, 0x02, 0x00, 0x51, 0xe1, 0xf8, 0x07, 0xa1, 0xb8,
5050
0xfc, 0xff, 0xff, 0xba, 0x03, 0x00, 0x00, 0xea, 0x02, 0x00, 0x51, 0xe1,
5151
0xf8, 0x07, 0xb0, 0xb8, 0xf8, 0x07, 0xa1, 0xb8, 0xfb, 0xff, 0xff, 0xba,
52-
0xf0, 0x87, 0xbd, 0xe8, 0xc0, 0x00, 0x00, 0x02
52+
0xf0, 0x87, 0xbd, 0xe8, 0x04, 0xf0, 0x5e, 0xe2, 0x00, 0x00, 0x00, 0x00,
53+
0x04, 0xe0, 0xa0, 0x03, 0xc0, 0x00, 0x00, 0x02
5354
};

src/gba/hle-bios.s

+5
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,9 @@ blt 0b
187187
2:
188188
ldmfd sp!, {r4-r10, pc}
189189

190+
undefBase:
191+
subs pc, lr, #4
192+
.word 0
193+
.word 0x03A0E004
194+
190195
.ltorg

src/gba/io.c

+4-5
Original file line numberDiff line numberDiff line change
@@ -950,7 +950,7 @@ void GBAIOSerialize(struct GBA* gba, struct GBASerializedState* state) {
950950
STORE_32(gba->memory.dma[i].when, 0, &state->dma[i].when);
951951
}
952952

953-
state->dmaTransferRegister = gba->memory.dmaTransferRegister;
953+
STORE_32(gba->memory.dmaTransferRegister, 0, &state->dmaTransferRegister);
954954

955955
GBAHardwareSerialize(&gba->memory.hw, state);
956956
}
@@ -988,12 +988,11 @@ void GBAIODeserialize(struct GBA* gba, const struct GBASerializedState* state) {
988988
LOAD_32(gba->memory.dma[i].nextDest, 0, &state->dma[i].nextDest);
989989
LOAD_32(gba->memory.dma[i].nextCount, 0, &state->dma[i].nextCount);
990990
LOAD_32(gba->memory.dma[i].when, 0, &state->dma[i].when);
991-
if (GBADMARegisterGetTiming(gba->memory.dma[i].reg) != GBA_DMA_TIMING_NOW) {
992-
GBADMASchedule(gba, i, &gba->memory.dma[i]);
993-
}
994991
}
995992
GBAAudioWriteSOUNDCNT_X(&gba->audio, gba->memory.io[REG_SOUNDCNT_X >> 1]);
996-
gba->memory.dmaTransferRegister = state->dmaTransferRegister;
993+
994+
LOAD_32(gba->memory.dmaTransferRegister, 0, &state->dmaTransferRegister);
995+
997996
GBADMAUpdate(gba);
998997
GBAHardwareDeserialize(&gba->memory.hw, state);
999998
}

src/gba/memory.c

+12-8
Original file line numberDiff line numberDiff line change
@@ -772,12 +772,12 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) {
772772
#define STORE_SRAM \
773773
if (address & 0x3) { \
774774
mLOG(GBA_MEM, GAME_ERROR, "Unaligned SRAM Store32: 0x%08X", address); \
775-
value = 0; \
776-
} \
777-
GBAStore8(cpu, address & ~0x3, value, cycleCounter); \
778-
GBAStore8(cpu, (address & ~0x3) | 1, value, cycleCounter); \
779-
GBAStore8(cpu, (address & ~0x3) | 2, value, cycleCounter); \
780-
GBAStore8(cpu, (address & ~0x3) | 3, value, cycleCounter);
775+
} else { \
776+
GBAStore8(cpu, address, value, cycleCounter); \
777+
GBAStore8(cpu, address | 1, value, cycleCounter); \
778+
GBAStore8(cpu, address | 2, value, cycleCounter); \
779+
GBAStore8(cpu, address | 3, value, cycleCounter); \
780+
}
781781

782782
#define STORE_BAD \
783783
mLOG(GBA_MEM, GAME_ERROR, "Bad memory Store32: 0x%08X", address);
@@ -923,8 +923,12 @@ void GBAStore16(struct ARMCore* cpu, uint32_t address, int16_t value, int* cycle
923923
break;
924924
case REGION_CART_SRAM:
925925
case REGION_CART_SRAM_MIRROR:
926-
GBAStore8(cpu, (address & ~0x1), value, cycleCounter);
927-
GBAStore8(cpu, (address & ~0x1) | 1, value, cycleCounter);
926+
if (address & 1) {
927+
mLOG(GBA_MEM, GAME_ERROR, "Unaligned SRAM Store16: 0x%08X", address);
928+
break;
929+
}
930+
GBAStore8(cpu, address, value, cycleCounter);
931+
GBAStore8(cpu, address | 1, value, cycleCounter);
928932
break;
929933
default:
930934
mLOG(GBA_MEM, GAME_ERROR, "Bad memory Store16: 0x%08X", address);

src/gba/renderers/gl.c

+4-3
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,7 @@ void GBAVideoGLRendererDeinit(struct GBAVideoRenderer* renderer) {
931931
void GBAVideoGLRendererReset(struct GBAVideoRenderer* renderer) {
932932
struct GBAVideoGLRenderer* glRenderer = (struct GBAVideoGLRenderer*) renderer;
933933

934+
glRenderer->oamDirty = true;
934935
glRenderer->paletteDirty = true;
935936
glRenderer->vramDirty = 0xFFFFFF;
936937
glRenderer->firstAffine = -1;
@@ -1727,13 +1728,13 @@ void GBAVideoGLRendererDrawSprite(struct GBAVideoGLRenderer* renderer, struct GB
17271728
glStencilFunc(GL_EQUAL, 1, 1);
17281729
glUseProgram(shader->program);
17291730
glDrawBuffers(2, (GLenum[]) { GL_NONE, GL_COLOR_ATTACHMENT1 });
1730-
glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE);
17311731
glBindVertexArray(shader->vao);
17321732
glUniform2i(uniforms[GBA_GL_VS_LOC], totalHeight, 0);
17331733
glUniform2i(uniforms[GBA_GL_VS_MAXPOS], totalWidth, totalHeight);
1734-
glUniform4i(uniforms[GBA_GL_OBJ_INFLAGS], GBAObjAttributesCGetPriority(sprite->c), 0, 0, 0);
1734+
glUniform4i(uniforms[GBA_GL_OBJ_INFLAGS], GBAObjAttributesCGetPriority(sprite->c),
1735+
(renderer->target1Obj || GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_SEMITRANSPARENT) | (renderer->target2Obj * 2) | (renderer->blendEffect * 4),
1736+
renderer->blda, GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_SEMITRANSPARENT);
17351737
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
1736-
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
17371738

17381739
glDrawBuffers(1, (GLenum[]) { GL_COLOR_ATTACHMENT0 });
17391740
}

src/gba/renderers/video-software.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render
623623

624624
_drawScanline(softwareRenderer, y);
625625

626-
if (softwareRenderer->forceTarget1 && softwareRenderer->target2Bd) {
626+
if ((softwareRenderer->forceTarget1 || softwareRenderer->bg[0].target1 || softwareRenderer->bg[1].target1 || softwareRenderer->bg[2].target1 || softwareRenderer->bg[3].target1) && softwareRenderer->target2Bd) {
627627
x = 0;
628628
for (w = 0; w < softwareRenderer->nWindows; ++w) {
629629
uint32_t backdrop = 0;

src/util/elf-read.c

+3
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ void ELFGetProgramHeaders(struct ELF* elf, struct ELFProgramHeaders* ph) {
8484
ELFProgramHeadersClear(ph);
8585
Elf32_Ehdr* hdr = elf32_getehdr(elf->e);
8686
Elf32_Phdr* phdr = elf32_getphdr(elf->e);
87+
if (!hdr || !phdr) {
88+
return;
89+
}
8790
ELFProgramHeadersResize(ph, hdr->e_phnum);
8891
memcpy(ELFProgramHeadersGetPointer(ph, 0), phdr, sizeof(*phdr) * hdr->e_phnum);
8992
}

src/util/vfs/vfs-fd.c

+39-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright (c) 2013-2015 Jeffrey Pfau
1+
/* Copyright (c) 2013-2020 Jeffrey Pfau
22
*
33
* This Source Code Form is subject to the terms of the Mozilla Public
44
* License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -14,11 +14,23 @@
1414
#include <windows.h>
1515
#endif
1616

17+
#include <mgba-util/vector.h>
18+
19+
#ifdef _WIN32
20+
struct HandleMappingTuple {
21+
HANDLE handle;
22+
void* mapping;
23+
};
24+
25+
DECLARE_VECTOR(HandleMappingList, struct HandleMappingTuple);
26+
DEFINE_VECTOR(HandleMappingList, struct HandleMappingTuple);
27+
#endif
28+
1729
struct VFileFD {
1830
struct VFile d;
1931
int fd;
2032
#ifdef _WIN32
21-
HANDLE hMap;
33+
struct HandleMappingList handles;
2234
#endif
2335
};
2436

@@ -74,12 +86,23 @@ struct VFile* VFileFromFD(int fd) {
7486
vfd->d.truncate = _vfdTruncate;
7587
vfd->d.size = _vfdSize;
7688
vfd->d.sync = _vfdSync;
89+
#ifdef _WIN32
90+
HandleMappingListInit(&vfd->handles, 4);
91+
#endif
7792

7893
return &vfd->d;
7994
}
8095

8196
bool _vfdClose(struct VFile* vf) {
8297
struct VFileFD* vfd = (struct VFileFD*) vf;
98+
#ifdef _WIN32
99+
size_t i;
100+
for (i = 0; i < HandleMappingListSize(&vfd->handles); ++i) {
101+
UnmapViewOfFile(HandleMappingListGetPointer(&vfd->handles, i)->mapping);
102+
CloseHandle(HandleMappingListGetPointer(&vfd->handles, i)->handle);
103+
}
104+
HandleMappingListDeinit(&vfd->handles);
105+
#endif
83106
if (close(vfd->fd) < 0) {
84107
return false;
85108
}
@@ -134,16 +157,25 @@ static void* _vfdMap(struct VFile* vf, size_t size, int flags) {
134157
if (size > fileSize) {
135158
size = fileSize;
136159
}
137-
vfd->hMap = CreateFileMapping((HANDLE) _get_osfhandle(vfd->fd), 0, createFlags, 0, size & 0xFFFFFFFF, 0);
138-
return MapViewOfFile(vfd->hMap, mapFiles, 0, 0, size);
160+
struct HandleMappingTuple tuple = {0};
161+
tuple.handle = CreateFileMapping((HANDLE) _get_osfhandle(vfd->fd), 0, createFlags, 0, size & 0xFFFFFFFF, 0);
162+
tuple.mapping = MapViewOfFile(tuple.handle, mapFiles, 0, 0, size);
163+
*HandleMappingListAppend(&vfd->handles) = tuple;
164+
return tuple.mapping;
139165
}
140166

141167
static void _vfdUnmap(struct VFile* vf, void* memory, size_t size) {
142168
UNUSED(size);
143169
struct VFileFD* vfd = (struct VFileFD*) vf;
144-
UnmapViewOfFile(memory);
145-
CloseHandle(vfd->hMap);
146-
vfd->hMap = 0;
170+
size_t i;
171+
for (i = 0; i < HandleMappingListSize(&vfd->handles); ++i) {
172+
if (HandleMappingListGetPointer(&vfd->handles, i)->mapping == memory) {
173+
UnmapViewOfFile(memory);
174+
CloseHandle(HandleMappingListGetPointer(&vfd->handles, i)->handle);
175+
HandleMappingListShift(&vfd->handles, i, 1);
176+
break;
177+
}
178+
}
147179
}
148180
#endif
149181

0 commit comments

Comments
 (0)