DS: Attempt to detect if a game is homebrew
Vicki Pfau vi@endrift.com
Wed, 12 Apr 2017 00:54:32 -0700
3 files changed,
16 insertions(+),
0 deletions(-)
M
include/mgba/internal/ds/ds.h
→
include/mgba/internal/ds/ds.h
@@ -123,6 +123,8 @@ struct mCoreCallbacksList coreCallbacks;
struct mTimingEvent divEvent; struct mTimingEvent sqrtEvent; + + bool isHomebrew; }; struct DSCartridge {@@ -158,6 +160,15 @@ uint32_t busKEY1Timing;
uint32_t iconOffset; uint16_t secureAreaCrc16; uint16_t secureAreaDelay; + uint32_t arm9Autoload; + uint32_t arm7Autoload; + uint8_t secureAreaDisable[8]; + uint32_t usedSize; + uint32_t romHeaderSize; + uint8_t reserved2[56]; + uint8_t logo[156]; + uint16_t logoCrc16; + uint16_t headerCrc16; // TODO: Fill in more // And ROM data... };
M
src/ds/ds.c
→
src/ds/ds.c
@@ -294,6 +294,7 @@ DSAudioReset(&ds->audio);
DS7IOInit(ds); DSConfigureWRAM(&ds->memory, 3); + ds->isHomebrew = false; struct DSCartridge* header = ds->romVf->map(ds->romVf, sizeof(*header), MAP_READ); if (header) {@@ -304,6 +305,9 @@ memcpy(&ds->memory.ram[0x3FFC04 >> 2], DS_CHIP_ID, 4);
ds->memory.ram[0x3FFC40 >> 2] = 1; memcpy(&ds->memory.ram[0x3FFE00 >> 2], header, 0x170); DS7IOWrite32(ds, DS_REG_ROMCNT_LO, header->busTiming | 0x2700000); + + ds->isHomebrew = memcmp(&header->logoCrc16, DS_ROM_MAGIC, sizeof(header->logoCrc16)); + // TODO: Error check ds->romVf->seek(ds->romVf, header->arm7Offset, SEEK_SET); uint32_t base = header->arm7Base;