Checksum BIOS

This commit is contained in:
Jeffrey Pfau 2014-01-18 00:17:58 -08:00
parent 94cc48faf1
commit ce4d0b5203
3 changed files with 29 additions and 0 deletions

View File

@ -7,6 +7,9 @@
#include <math.h> #include <math.h>
#include <stdlib.h> #include <stdlib.h>
const uint32_t GBA_BIOS_CHECKSUM = 0xBAAE187F;
const uint32_t GBA_DS_BIOS_CHECKSUM = 0xBAAE1880;
static void _unLz77(struct GBAMemory* memory, uint32_t source, uint8_t* dest); static void _unLz77(struct GBAMemory* memory, uint32_t source, uint8_t* dest);
static void _unHuffman(struct GBAMemory* memory, uint32_t source, uint32_t* dest); static void _unHuffman(struct GBAMemory* memory, uint32_t source, uint32_t* dest);
static void _unRl(struct GBAMemory* memory, uint32_t source, uint8_t* dest); static void _unRl(struct GBAMemory* memory, uint32_t source, uint8_t* dest);
@ -237,6 +240,8 @@ void GBASwi16(struct ARMBoard* board, int immediate) {
case 0xC: case 0xC:
_FastCpuSet(gba); _FastCpuSet(gba);
break; break;
case 0xD:
gba->cpu.gprs[0] = GBAChecksum(gba->memory.bios, SIZE_BIOS);
case 0xE: case 0xE:
_BgAffineSet(gba); _BgAffineSet(gba);
break; break;
@ -317,6 +322,15 @@ void GBASwi32(struct ARMBoard* board, int immediate) {
GBASwi16(board, immediate >> 16); GBASwi16(board, immediate >> 16);
} }
uint32_t GBAChecksum(uint32_t* memory, size_t size) {
size_t i;
uint32_t sum = 0;
for (i = 0; i < size; i += 4) {
sum += memory[i >> 2];
}
return sum;
}
static void _unLz77(struct GBAMemory* memory, uint32_t source, uint8_t* dest) { static void _unLz77(struct GBAMemory* memory, uint32_t source, uint8_t* dest) {
int remaining = (memory->d.load32(&memory->d, source, 0) & 0xFFFFFF00) >> 8; int remaining = (memory->d.load32(&memory->d, source, 0) & 0xFFFFFF00) >> 8;
// We assume the signature byte (0x10) is correct // We assume the signature byte (0x10) is correct

View File

@ -3,7 +3,13 @@
#include "arm.h" #include "arm.h"
#include <string.h>
void GBASwi16(struct ARMBoard* board, int immediate); void GBASwi16(struct ARMBoard* board, int immediate);
void GBASwi32(struct ARMBoard* board, int immediate); void GBASwi32(struct ARMBoard* board, int immediate);
uint32_t GBAChecksum(uint32_t* memory, size_t size);
const uint32_t GBA_BIOS_CHECKSUM;
const uint32_t GBA_DS_BIOS_CHECKSUM;
#endif #endif

View File

@ -360,6 +360,15 @@ void GBALoadROM(struct GBA* gba, int fd, const char* fname) {
void GBALoadBIOS(struct GBA* gba, int fd) { void GBALoadBIOS(struct GBA* gba, int fd) {
gba->memory.bios = fileMemoryMap(fd, SIZE_BIOS, MEMORY_READ); gba->memory.bios = fileMemoryMap(fd, SIZE_BIOS, MEMORY_READ);
gba->memory.fullBios = 1; gba->memory.fullBios = 1;
uint32_t checksum = GBAChecksum(gba->memory.bios, SIZE_BIOS);
GBALog(gba, GBA_LOG_DEBUG, "BIOS Checksum: 0x%X", checksum);
if (checksum == GBA_BIOS_CHECKSUM) {
GBALog(gba, GBA_LOG_INFO, "Official GBA BIOS detected");
} else if (checksum == GBA_DS_BIOS_CHECKSUM) {
GBALog(gba, GBA_LOG_INFO, "Official GBA (DS) BIOS detected");
} else {
GBALog(gba, GBA_LOG_WARN, "BIOS checksum incorrect");
}
if ((gba->cpu.gprs[ARM_PC] >> BASE_OFFSET) == BASE_BIOS) { if ((gba->cpu.gprs[ARM_PC] >> BASE_OFFSET) == BASE_BIOS) {
gba->memory.d.setActiveRegion(&gba->memory.d, gba->cpu.gprs[ARM_PC]); gba->memory.d.setActiveRegion(&gba->memory.d, gba->cpu.gprs[ARM_PC]);
} }