Add ROM override checking, seed with BPEE

This commit is contained in:
Jeffrey Pfau 2013-10-11 22:03:27 -07:00
parent 58611facf1
commit de39f23a1b
5 changed files with 82 additions and 3 deletions

View File

@ -114,6 +114,7 @@ struct GBAMemory {
struct GBASavedata savedata; struct GBASavedata savedata;
size_t romSize; size_t romSize;
uint16_t romID;
int fullBios; int fullBios;
char waitstates32[256]; char waitstates32[256];

View File

@ -21,6 +21,14 @@ void GBASavedataInit(struct GBASavedata* savedata, const char* filename) {
savedata->filename = filename; savedata->filename = filename;
} }
void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type) {
if (savedata->type != SAVEDATA_NONE) {
GBALog(0, GBA_LOG_WARN, "Can't re-initialize savedata");
return;
}
savedata->type = type;
}
void GBASavedataDeinit(struct GBASavedata* savedata) { void GBASavedataDeinit(struct GBASavedata* savedata) {
switch (savedata->type) { switch (savedata->type) {
case SAVEDATA_SRAM: case SAVEDATA_SRAM:
@ -43,7 +51,13 @@ void GBASavedataDeinit(struct GBASavedata* savedata) {
} }
void GBASavedataInitFlash(struct GBASavedata* savedata) { void GBASavedataInitFlash(struct GBASavedata* savedata) {
savedata->type = SAVEDATA_FLASH512; if (savedata->type == SAVEDATA_NONE) {
savedata->type = SAVEDATA_FLASH512;
}
if (savedata->type != SAVEDATA_FLASH512 && savedata->type != SAVEDATA_FLASH1M) {
GBALog(0, GBA_LOG_WARN, "Can't re-initialize savedata");
return;
}
savedata->fd = open(savedata->filename, O_RDWR | O_CREAT, 0666); savedata->fd = open(savedata->filename, O_RDWR | O_CREAT, 0666);
off_t end; off_t end;
int flags = MAP_SHARED; int flags = MAP_SHARED;
@ -66,7 +80,12 @@ void GBASavedataInitFlash(struct GBASavedata* savedata) {
} }
void GBASavedataInitEEPROM(struct GBASavedata* savedata) { void GBASavedataInitEEPROM(struct GBASavedata* savedata) {
savedata->type = SAVEDATA_EEPROM; if (savedata->type == SAVEDATA_NONE) {
savedata->type = SAVEDATA_EEPROM;
} else {
GBALog(0, GBA_LOG_WARN, "Can't re-initialize savedata");
return;
}
savedata->fd = open(savedata->filename, O_RDWR | O_CREAT, 0666); savedata->fd = open(savedata->filename, O_RDWR | O_CREAT, 0666);
off_t end; off_t end;
int flags = MAP_SHARED; int flags = MAP_SHARED;
@ -87,7 +106,12 @@ void GBASavedataInitEEPROM(struct GBASavedata* savedata) {
} }
void GBASavedataInitSRAM(struct GBASavedata* savedata) { void GBASavedataInitSRAM(struct GBASavedata* savedata) {
savedata->type = SAVEDATA_SRAM; if (savedata->type == SAVEDATA_NONE) {
savedata->type = SAVEDATA_SRAM;
} else {
GBALog(0, GBA_LOG_WARN, "Can't re-initialize savedata");
return;
}
savedata->fd = open(savedata->filename, O_RDWR | O_CREAT, 0666); savedata->fd = open(savedata->filename, O_RDWR | O_CREAT, 0666);
off_t end; off_t end;
int flags = MAP_SHARED; int flags = MAP_SHARED;

View File

@ -68,9 +68,16 @@ struct GBASavedata {
enum FlashStateMachine flashState; enum FlashStateMachine flashState;
}; };
struct SavedataOverride {
uint32_t id;
enum SavedataType type;
};
void GBASavedataInit(struct GBASavedata* savedata, const char* filename); void GBASavedataInit(struct GBASavedata* savedata, const char* filename);
void GBASavedataDeinit(struct GBASavedata* savedata); void GBASavedataDeinit(struct GBASavedata* savedata);
void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type);
void GBASavedataInitFlash(struct GBASavedata* savedata); void GBASavedataInitFlash(struct GBASavedata* savedata);
void GBASavedataInitEEPROM(struct GBASavedata* savedata); void GBASavedataInitEEPROM(struct GBASavedata* savedata);
void GBASavedataInitSRAM(struct GBASavedata* savedata); void GBASavedataInitSRAM(struct GBASavedata* savedata);

View File

@ -22,10 +22,17 @@ enum {
SP_BASE_SUPERVISOR = 0x03FFFFE0 SP_BASE_SUPERVISOR = 0x03FFFFE0
}; };
static const struct SavedataOverride _savedataOverrides[] = {
{ 'EEPB', SAVEDATA_FLASH1M },
{ 0, 0 }
};
static void GBAProcessEvents(struct ARMBoard* board); static void GBAProcessEvents(struct ARMBoard* board);
static int32_t GBATimersProcessEvents(struct GBA* gba, int32_t cycles); static int32_t GBATimersProcessEvents(struct GBA* gba, int32_t cycles);
static void GBAHitStub(struct ARMBoard* board, uint32_t opcode); static void GBAHitStub(struct ARMBoard* board, uint32_t opcode);
static void _checkOverrides(struct GBA* gba, uint32_t code);
void GBAInit(struct GBA* gba) { void GBAInit(struct GBA* gba) {
gba->errno = GBA_NO_ERROR; gba->errno = GBA_NO_ERROR;
gba->errstr = 0; gba->errstr = 0;
@ -270,6 +277,7 @@ void GBALoadROM(struct GBA* gba, int fd, const char* fname) {
gba->activeFile = fname; gba->activeFile = fname;
fstat(fd, &info); fstat(fd, &info);
gba->memory.romSize = info.st_size; gba->memory.romSize = info.st_size;
_checkOverrides(gba, ((struct GBACartridge*) gba->memory.rom)->id);
// TODO: error check // TODO: error check
} }
@ -432,3 +440,27 @@ void GBAHitStub(struct ARMBoard* board, uint32_t opcode) {
ARMDebuggerEnter(gbaBoard->p->debugger); ARMDebuggerEnter(gbaBoard->p->debugger);
} }
} }
void _checkOverrides(struct GBA* gba, uint32_t id) {
int i;
for (i = 0; _savedataOverrides[i].id; ++i) {
if (_savedataOverrides[i].id == id) {
gba->memory.savedata.type = _savedataOverrides[i].type;
switch (_savedataOverrides[i].type) {
case SAVEDATA_FLASH512:
case SAVEDATA_FLASH1M:
GBASavedataInitFlash(&gba->memory.savedata);
break;
case SAVEDATA_EEPROM:
GBASavedataInitEEPROM(&gba->memory.savedata);
break;
case SAVEDATA_SRAM:
GBASavedataInitSRAM(&gba->memory.savedata);
break;
case SAVEDATA_NONE:
break;
}
return;
}
}
}

View File

@ -93,6 +93,21 @@ struct GBA {
int logLevel; int logLevel;
}; };
struct GBACartridge {
uint32_t entry;
uint8_t logo[156];
char title[12];
uint32_t id;
uint16_t maker;
uint8_t type;
uint8_t unit;
uint8_t device;
uint8_t reserved[7];
uint8_t version;
uint8_t checksum;
// And ROM data...
};
void GBAInit(struct GBA* gba); void GBAInit(struct GBA* gba);
void GBADeinit(struct GBA* gba); void GBADeinit(struct GBA* gba);