Skip to content

Commit d5164f8

Browse files
committed
Update to mGBA 0.7.1
1 parent cef60bf commit d5164f8

File tree

10 files changed

+43
-46
lines changed

10 files changed

+43
-46
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.0</string>
20+
<string>0.7.1</string>
2121
<key>NSPrincipalClass</key>
2222
<string>OEGameCoreController</string>
2323
<key>OEGameCoreClass</key>

src/gb/gb.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ void GBResizeSram(struct GB* gb, size_t size) {
202202
if (gb->memory.sram == (void*) -1) {
203203
gb->memory.sram = NULL;
204204
}
205-
} else {
205+
} else if (size) {
206206
uint8_t* newSram = anonymousMemoryMap(size);
207207
if (gb->memory.sram) {
208208
if (size > gb->sramSize) {

src/gb/serialize.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) {
113113
error = true;
114114
}
115115
LOAD_16LE(check16, 0, &state->video.x);
116-
if (check16 < 0 || check16 > GB_VIDEO_HORIZONTAL_PIXELS) {
116+
if (check16 < -7 || check16 > GB_VIDEO_HORIZONTAL_PIXELS) {
117117
mLOG(GB_STATE, WARN, "Savestate is corrupted: video x is out of range");
118118
error = true;
119119
}
@@ -138,7 +138,7 @@ bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) {
138138
if (error) {
139139
return false;
140140
}
141-
gb->timing.root = NULL;
141+
mTimingClear(&gb->timing);
142142
LOAD_32LE(gb->timing.masterCycles, 0, &state->masterCycles);
143143

144144
gb->cpu->a = state->cpu.a;

src/gba/dma.c

+8-11
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ void _dmaEvent(struct mTiming* timing, void* context, uint32_t cyclesLate) {
182182
dma->nextCount = 0;
183183
bool noRepeat = !GBADMARegisterIsRepeat(dma->reg);
184184
noRepeat |= GBADMARegisterGetTiming(dma->reg) == GBA_DMA_TIMING_NOW;
185-
noRepeat |= memory->activeDMA == 3 && GBADMARegisterGetTiming(dma->reg) == GBA_DMA_TIMING_CUSTOM;
185+
noRepeat |= memory->activeDMA == 3 && GBADMARegisterGetTiming(dma->reg) == GBA_DMA_TIMING_CUSTOM && gba->video.vcount == VIDEO_VERTICAL_PIXELS + 1;
186186
if (noRepeat) {
187187
dma->reg = GBADMARegisterClearEnable(dma->reg);
188188

@@ -237,9 +237,6 @@ void GBADMAService(struct GBA* gba, int number, struct GBADMA* info) {
237237

238238
gba->cpuBlocked = true;
239239
if (info->count == info->nextCount) {
240-
if (sourceRegion < REGION_CART0 || destRegion < REGION_CART0) {
241-
cycles += 2;
242-
}
243240
if (width == 4) {
244241
cycles += memory->waitstatesNonseq32[sourceRegion] + memory->waitstatesNonseq32[destRegion];
245242
} else {
@@ -263,19 +260,17 @@ void GBADMAService(struct GBA* gba, int number, struct GBADMA* info) {
263260
}
264261
gba->bus = memory->dmaTransferRegister;
265262
cpu->memory.store32(cpu, dest, memory->dmaTransferRegister, 0);
266-
memory->dmaTransferRegister &= 0xFFFF0000;
267-
memory->dmaTransferRegister |= memory->dmaTransferRegister >> 16;
268263
} else {
269264
if (sourceRegion == REGION_CART2_EX && memory->savedata.type == SAVEDATA_EEPROM) {
270265
if (memory->savedata.type == SAVEDATA_AUTODETECT) {
271266
mLOG(GBA_MEM, INFO, "Detected EEPROM savegame");
272267
GBASavedataInitEEPROM(&memory->savedata);
273268
}
274269
memory->dmaTransferRegister = GBASavedataReadEEPROM(&memory->savedata);
275-
} else {
276-
if (source) {
277-
memory->dmaTransferRegister = cpu->memory.load16(cpu, source, 0);
278-
}
270+
memory->dmaTransferRegister |= memory->dmaTransferRegister << 16;
271+
} else if (source) {
272+
memory->dmaTransferRegister = cpu->memory.load16(cpu, source, 0);
273+
memory->dmaTransferRegister |= memory->dmaTransferRegister << 16;
279274
}
280275
if (destRegion == REGION_CART2_EX) {
281276
if (memory->savedata.type == SAVEDATA_AUTODETECT) {
@@ -289,7 +284,6 @@ void GBADMAService(struct GBA* gba, int number, struct GBADMA* info) {
289284
cpu->memory.store16(cpu, dest, memory->dmaTransferRegister, 0);
290285

291286
}
292-
memory->dmaTransferRegister |= memory->dmaTransferRegister << 16;
293287
gba->bus = memory->dmaTransferRegister;
294288
}
295289
int sourceOffset = DMA_OFFSET[GBADMARegisterGetSrcControl(info->reg)] * width;
@@ -306,6 +300,9 @@ void GBADMAService(struct GBA* gba, int number, struct GBADMA* info) {
306300
info->nextDest = dest;
307301
if (!wordsRemaining) {
308302
info->nextCount |= 0x80000000;
303+
if (sourceRegion < REGION_CART0 || destRegion < REGION_CART0) {
304+
info->when += 2;
305+
}
309306
}
310307
GBADMAUpdate(gba);
311308
}

src/gba/gba.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,8 @@ void GBASkipBIOS(struct GBA* gba) {
232232
} else {
233233
cpu->gprs[ARM_PC] = BASE_WORKING_RAM;
234234
}
235-
gba->memory.io[REG_VCOUNT >> 1] = 0x7E;
235+
gba->video.vcount = 0x7D;
236+
gba->memory.io[REG_VCOUNT >> 1] = 0x7D;
236237
gba->memory.io[REG_POSTFLG >> 1] = 1;
237238
int currentCycles = 0;
238239
ARM_WRITE_PC;

src/gba/memory.c

+6-2
Original file line numberDiff line numberDiff line change
@@ -1647,6 +1647,10 @@ void _pristineCow(struct GBA* gba) {
16471647
}
16481648

16491649
void GBAPrintFlush(struct GBA* gba) {
1650+
if (!gba->memory.agbPrintBuffer) {
1651+
return;
1652+
}
1653+
16501654
char oolBuf[0x101];
16511655
size_t i;
16521656
for (i = 0; gba->memory.agbPrintCtx.get != gba->memory.agbPrintCtx.put && i < 0x100; ++i) {
@@ -1688,8 +1692,8 @@ static void _agbPrintStore(struct GBA* gba, uint32_t address, int16_t value) {
16881692

16891693
static int16_t _agbPrintLoad(struct GBA* gba, uint32_t address) {
16901694
struct GBAMemory* memory = &gba->memory;
1691-
int16_t value = 0xFFFF;
1692-
if (address < AGB_PRINT_TOP) {
1695+
int16_t value = address >> 1;
1696+
if (address < AGB_PRINT_TOP && memory->agbPrintBuffer) {
16931697
LOAD_16(value, address & (SIZE_AGB_PRINT - 1), memory->agbPrintBuffer);
16941698
} else if ((address & 0x00FFFFF8) == (AGB_PRINT_STRUCT & 0x00FFFFF8)) {
16951699
value = (&memory->agbPrintCtx.request)[(address & 7) >> 1];

src/gba/renderers/software-obj.c

-9
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@
2727
} \
2828
} \
2929
for (; outX < condition; ++outX, inX += xOffset) { \
30-
if (!(renderer->row[outX] & FLAG_UNWRITTEN)) { \
31-
continue; \
32-
} \
3330
int localX = inX - xOffset * (outX % mosaicH); \
3431
if (localX < 0 || localX > width - 1) { \
3532
continue; \
@@ -43,9 +40,6 @@
4340
unsigned widthMask = ~(width - 1); \
4441
unsigned heightMask = ~(height - 1); \
4542
for (; outX < condition; ++outX, ++inX) { \
46-
if (!(renderer->row[outX] & FLAG_UNWRITTEN)) { \
47-
continue; \
48-
} \
4943
renderer->spriteCyclesRemaining -= 2; \
5044
xAccum += mat.a; \
5145
yAccum += mat.c; \
@@ -151,9 +145,6 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re
151145
if (GBARegisterDISPCNTGetMode(renderer->dispcnt) >= 3 && GBAObjAttributesCGetTile(sprite->c) < 512) {
152146
return 0;
153147
}
154-
if (renderer->spriteCyclesRemaining <= 0) {
155-
return 0;
156-
}
157148

158149
int objwinSlowPath = GBARegisterDISPCNTIsObjwinEnable(renderer->dispcnt) && GBAWindowControlGetBlendEnable(renderer->objwin.packed) != GBAWindowControlIsBlendEnable(renderer->currentWindow.packed);
159150
int variant = renderer->target1Obj &&

src/gba/renderers/video-software.c

+21-18
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,8 @@ static void _enableBg(struct GBAVideoSoftwareRenderer* renderer, int bg, bool ac
727727
if (!active) {
728728
renderer->bg[bg].enabled = 0;
729729
} else if (!wasActive && active) {
730-
if (renderer->nextY == 0) {
730+
if (renderer->nextY == 0 || GBARegisterDISPCNTGetMode(renderer->dispcnt) > 2) {
731+
// TODO: Investigate in more depth how switching background works in different modes
731732
renderer->bg[bg].enabled = 4;
732733
} else {
733734
renderer->bg[bg].enabled = 1;
@@ -809,7 +810,6 @@ static void GBAVideoSoftwareRendererWriteBLDCNT(struct GBAVideoSoftwareRenderer*
809810

810811
static void _drawScanline(struct GBAVideoSoftwareRenderer* renderer, int y) {
811812
int w;
812-
renderer->end = 0;
813813
int spriteLayers = 0;
814814
if (GBARegisterDISPCNTIsObjEnable(renderer->dispcnt) && !renderer->d.disableOBJ) {
815815
if (renderer->oamDirty) {
@@ -818,31 +818,34 @@ static void _drawScanline(struct GBAVideoSoftwareRenderer* renderer, int y) {
818818
renderer->spriteCyclesRemaining = GBARegisterDISPCNTIsHblankIntervalFree(renderer->dispcnt) ? OBJ_HBLANK_FREE_LENGTH : OBJ_LENGTH;
819819
int mosaicV = GBAMosaicControlGetObjV(renderer->mosaic) + 1;
820820
int mosaicY = y - (y % mosaicV);
821-
for (w = 0; w < renderer->nWindows; ++w) {
822-
renderer->start = renderer->end;
823-
renderer->end = renderer->windows[w].endX;
824-
renderer->currentWindow = renderer->windows[w].control;
825-
if (!GBAWindowControlIsObjEnable(renderer->currentWindow.packed) && !GBARegisterDISPCNTIsObjwinEnable(renderer->dispcnt)) {
821+
int i;
822+
for (i = 0; i < renderer->oamMax; ++i) {
823+
struct GBAVideoSoftwareSprite* sprite = &renderer->sprites[i];
824+
int localY = y;
825+
renderer->end = 0;
826+
if (GBAObjAttributesAIsMosaic(sprite->obj.a)) {
827+
localY = mosaicY;
828+
}
829+
if ((localY < sprite->y && (sprite->endY - 256 < 0 || localY >= sprite->endY - 256)) || localY >= sprite->endY) {
826830
continue;
827831
}
828-
int i;
829-
int drawn;
830-
831-
for (i = 0; i < renderer->oamMax; ++i) {
832-
int localY = y;
832+
for (w = 0; w < renderer->nWindows; ++w) {
833833
if (renderer->spriteCyclesRemaining <= 0) {
834834
break;
835835
}
836-
struct GBAVideoSoftwareSprite* sprite = &renderer->sprites[i];
837-
if (GBAObjAttributesAIsMosaic(sprite->obj.a)) {
838-
localY = mosaicY;
839-
}
840-
if ((localY < sprite->y && (sprite->endY - 256 < 0 || localY >= sprite->endY - 256)) || localY >= sprite->endY) {
836+
renderer->currentWindow = renderer->windows[w].control;
837+
renderer->start = renderer->end;
838+
renderer->end = renderer->windows[w].endX;
839+
if (!GBAWindowControlIsObjEnable(renderer->currentWindow.packed) && !GBARegisterDISPCNTIsObjwinEnable(renderer->dispcnt)) {
841840
continue;
842841
}
843-
drawn = GBAVideoSoftwareRendererPreprocessSprite(renderer, &sprite->obj, localY);
842+
843+
int drawn = GBAVideoSoftwareRendererPreprocessSprite(renderer, &sprite->obj, localY);
844844
spriteLayers |= drawn << GBAObjAttributesCGetPriority(sprite->obj.c);
845845
}
846+
if (renderer->spriteCyclesRemaining <= 0) {
847+
break;
848+
}
846849
}
847850
}
848851

src/gba/serialize.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ bool GBADeserialize(struct GBA* gba, const struct GBASerializedState* state) {
128128
if (error) {
129129
return false;
130130
}
131-
gba->timing.root = NULL;
131+
mTimingClear(&gba->timing);
132132
LOAD_32(gba->timing.masterCycles, 0, &state->masterCycles);
133133

134134
size_t i;

src/gba/sio.c

+1
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ void GBASIOWriteSIOCNT(struct GBASIO* sio, uint16_t value) {
164164
}
165165
break;
166166
case SIO_MULTI:
167+
value &= 0xFF83;
167168
value |= 0xC;
168169
break;
169170
default:

0 commit comments

Comments
 (0)