All: Make FIXED_ROM_BUFFER an option instead of 3DS-only

This commit is contained in:
Vicki Pfau 2017-07-09 10:53:30 -07:00
parent 9150a79efd
commit b71ffe711c
6 changed files with 27 additions and 10 deletions

View File

@ -5,6 +5,7 @@ Bugfixes:
Misc: Misc:
- GBA Timer: Use global cycles for timers - GBA Timer: Use global cycles for timers
- GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722)
- All: Make FIXED_ROM_BUFFER an option instead of 3DS-only
0.6.0: (Future) 0.6.0: (Future)
Features: Features:

View File

@ -255,6 +255,10 @@ if(DEFINED 3DS OR DEFINED PSP2 OR DEFINED WII)
set(USE_SQLITE3 OFF) set(USE_SQLITE3 OFF)
endif() endif()
if(DEFINED 3DS OR DEFINED WII)
add_definitions(-DFIXED_ROM_BUFFER)
endif()
if(NOT M_CORE_GBA) if(NOT M_CORE_GBA)
set(USE_GDB_STUB OFF) set(USE_GDB_STUB OFF)
endif() endif()

View File

@ -42,7 +42,7 @@ static void GBStop(struct LR35902Core* cpu);
static void _enableInterrupts(struct mTiming* timing, void* user, uint32_t cyclesLate); static void _enableInterrupts(struct mTiming* timing, void* user, uint32_t cyclesLate);
#ifdef _3DS #ifdef FIXED_ROM_BUFFER
extern uint32_t* romBuffer; extern uint32_t* romBuffer;
extern size_t romBufferSize; extern size_t romBufferSize;
#endif #endif
@ -109,7 +109,7 @@ bool GBLoadROM(struct GB* gb, struct VFile* vf) {
gb->pristineRomSize = vf->size(vf); gb->pristineRomSize = vf->size(vf);
vf->seek(vf, 0, SEEK_SET); vf->seek(vf, 0, SEEK_SET);
gb->isPristine = true; gb->isPristine = true;
#ifdef _3DS #ifdef FIXED_ROM_BUFFER
if (gb->pristineRomSize <= romBufferSize) { if (gb->pristineRomSize <= romBufferSize) {
gb->memory.rom = romBuffer; gb->memory.rom = romBuffer;
vf->read(vf, romBuffer, gb->pristineRomSize); vf->read(vf, romBuffer, gb->pristineRomSize);
@ -277,7 +277,7 @@ void GBUnloadROM(struct GB* gb) {
} }
if (gb->romVf) { if (gb->romVf) {
#ifndef _3DS #ifndef FIXED_ROM_BUFFER
gb->romVf->unmap(gb->romVf, gb->memory.rom, gb->pristineRomSize); gb->romVf->unmap(gb->romVf, gb->memory.rom, gb->pristineRomSize);
#endif #endif
gb->romVf->close(gb->romVf); gb->romVf->close(gb->romVf);
@ -326,7 +326,7 @@ void GBApplyPatch(struct GB* gb, struct Patch* patch) {
return; return;
} }
if (gb->romVf) { if (gb->romVf) {
#ifndef _3DS #ifndef FIXED_ROM_BUFFER
gb->romVf->unmap(gb->romVf, gb->memory.rom, gb->pristineRomSize); gb->romVf->unmap(gb->romVf, gb->memory.rom, gb->pristineRomSize);
#endif #endif
gb->romVf->close(gb->romVf); gb->romVf->close(gb->romVf);

View File

@ -42,7 +42,7 @@ static bool _setSoftwareBreakpoint(struct ARMDebugger*, uint32_t address, enum E
static bool _clearSoftwareBreakpoint(struct ARMDebugger*, uint32_t address, enum ExecutionMode mode, uint32_t opcode); static bool _clearSoftwareBreakpoint(struct ARMDebugger*, uint32_t address, enum ExecutionMode mode, uint32_t opcode);
#ifdef _3DS #ifdef FIXED_ROM_BUFFER
extern uint32_t* romBuffer; extern uint32_t* romBuffer;
extern size_t romBufferSize; extern size_t romBufferSize;
#endif #endif
@ -120,7 +120,7 @@ void GBAUnloadROM(struct GBA* gba) {
} }
if (gba->romVf) { if (gba->romVf) {
#ifndef _3DS #ifndef FIXED_ROM_BUFFER
gba->romVf->unmap(gba->romVf, gba->memory.rom, gba->pristineRomSize); gba->romVf->unmap(gba->romVf, gba->memory.rom, gba->pristineRomSize);
#endif #endif
gba->romVf->close(gba->romVf); gba->romVf->close(gba->romVf);
@ -323,7 +323,7 @@ bool GBALoadROM(struct GBA* gba, struct VFile* vf) {
gba->pristineRomSize = SIZE_CART0; gba->pristineRomSize = SIZE_CART0;
} }
gba->isPristine = true; gba->isPristine = true;
#ifdef _3DS #ifdef FIXED_ROM_BUFFER
if (gba->pristineRomSize <= romBufferSize) { if (gba->pristineRomSize <= romBufferSize) {
gba->memory.rom = romBuffer; gba->memory.rom = romBuffer;
vf->read(vf, romBuffer, gba->pristineRomSize); vf->read(vf, romBuffer, gba->pristineRomSize);
@ -344,7 +344,7 @@ bool GBALoadROM(struct GBA* gba, struct VFile* vf) {
GBAVFameDetect(&gba->memory.vfame, gba->memory.rom, gba->memory.romSize); GBAVFameDetect(&gba->memory.vfame, gba->memory.rom, gba->memory.romSize);
if (popcount32(gba->memory.romSize) != 1) { if (popcount32(gba->memory.romSize) != 1) {
// This ROM is either a bad dump or homebrew. Emulate flash cart behavior. // This ROM is either a bad dump or homebrew. Emulate flash cart behavior.
#ifndef _3DS #ifndef FIXED_ROM_BUFFER
void* newRom = anonymousMemoryMap(SIZE_CART0); void* newRom = anonymousMemoryMap(SIZE_CART0);
memcpy(newRom, gba->memory.rom, gba->pristineRomSize); memcpy(newRom, gba->memory.rom, gba->pristineRomSize);
gba->memory.rom = newRom; gba->memory.rom = newRom;
@ -404,7 +404,7 @@ void GBAApplyPatch(struct GBA* gba, struct Patch* patch) {
return; return;
} }
if (gba->romVf) { if (gba->romVf) {
#ifndef _3DS #ifndef FIXED_ROM_BUFFER
gba->romVf->unmap(gba->romVf, gba->memory.rom, gba->pristineRomSize); gba->romVf->unmap(gba->romVf, gba->memory.rom, gba->pristineRomSize);
#endif #endif
gba->romVf->close(gba->romVf); gba->romVf->close(gba->romVf);

View File

@ -1553,7 +1553,7 @@ void _pristineCow(struct GBA* gba) {
gba->cpu->memory.activeRegion = newRom; gba->cpu->memory.activeRegion = newRom;
} }
if (gba->romVf) { if (gba->romVf) {
#ifndef _3DS #ifndef FIXED_ROM_BUFFER
gba->romVf->unmap(gba->romVf, gba->memory.rom, gba->memory.romSize); gba->romVf->unmap(gba->romVf, gba->memory.rom, gba->memory.romSize);
#endif #endif
gba->romVf->close(gba->romVf); gba->romVf->close(gba->romVf);

View File

@ -24,6 +24,7 @@
#include <mgba-util/gui/file-select.h> #include <mgba-util/gui/file-select.h>
#include <mgba-util/gui/font.h> #include <mgba-util/gui/font.h>
#include <mgba-util/gui/menu.h> #include <mgba-util/gui/menu.h>
#include <mgba-util/memory.h>
#include <mgba-util/vfs.h> #include <mgba-util/vfs.h>
#define GCN1_INPUT 0x47434E31 #define GCN1_INPUT 0x47434E31
@ -114,6 +115,9 @@ static bool frameLimiter = true;
static int scaleFactor; static int scaleFactor;
static unsigned corew, coreh; static unsigned corew, coreh;
uint32_t* romBuffer;
size_t romBufferSize;
static void* framebuffer[2] = { 0, 0 }; static void* framebuffer[2] = { 0, 0 };
static int whichFb = 0; static int whichFb = 0;
@ -242,6 +246,10 @@ int main(int argc, char* argv[]) {
AUDIO_RegisterDMACallback(_audioDMA); AUDIO_RegisterDMACallback(_audioDMA);
memset(audioBuffer, 0, sizeof(audioBuffer)); memset(audioBuffer, 0, sizeof(audioBuffer));
#ifdef FIXED_ROM_BUFFER
romBufferSize = SIZE_CART0;
romBuffer = anonymousMemoryMap(romBufferSize);
#endif
#if !defined(COLOR_16_BIT) && !defined(COLOR_5_6_5) #if !defined(COLOR_16_BIT) && !defined(COLOR_5_6_5)
#error This pixel format is unsupported. Please use -DCOLOR_16-BIT -DCOLOR_5_6_5 #error This pixel format is unsupported. Please use -DCOLOR_16-BIT -DCOLOR_5_6_5
@ -510,6 +518,10 @@ int main(int argc, char* argv[]) {
} }
mGUIDeinit(&runner); mGUIDeinit(&runner);
#ifdef FIXED_ROM_BUFFER
mappedMemoryFree(romBuffer, romBufferSize);
#endif
free(fifo); free(fifo);
free(texmem); free(texmem);
free(rescaleTexmem); free(rescaleTexmem);