Fixed hashing and added ability to load a ROM directly from memory

This commit is contained in:
rdanbrook 2019-04-28 21:06:43 -04:00
parent 9dbeac12df
commit 0a20fedfda
6 changed files with 64 additions and 19 deletions

View file

@ -109,23 +109,12 @@ void sha1_final(sha1_context_t* context, uint8_t digest[SHA1_DIGEST_SIZE]) {
memset(finalcount, 0, 8);
}
const char* sha1(const void *buf, size_t size) {
void sha1(uint8_t *digest, const void *buf, size_t size) {
// Do the SHA1 hash operation
sha1_context_t context;
uint8_t digest[SHA1_DIGEST_SIZE];
sha1_init(&context);
sha1_update(&context, buf, size);
sha1_final(&context, digest);
char strbuf[SHA1_DIGEST_SIZE * 2 + 1];
static char checksum[SHA1_DIGEST_SIZE * 2 + 1];
for (int i = 0; i < SHA1_DIGEST_SIZE; i++) {
snprintf(strbuf, sizeof(strbuf), "%s", checksum);
snprintf(checksum, sizeof(checksum), "%s%02X", strbuf, digest[i]);
}
return checksum;
}
static uint32_t crc32_tab[] = {

View file

@ -26,7 +26,7 @@ typedef struct {
uint8_t buffer[64];
} sha1_context_t;
const char* sha1(const void *buf, size_t size);
void sha1(uint8_t *digest, const void *buf, size_t size);
void sha1_init(sha1_context_t* context);
void sha1_transform(uint32_t state[5], const uint8_t buffer[64]);
void sha1_update(sha1_context_t* context, const uint8_t* data, const size_t len);

View file

@ -67,9 +67,11 @@ int load_rom(char *filename)
cart.pages = (size / 0x4000);
cart.crc = crc32(0L, cart.rom, size);
const char *shabuf = sha1(cart.rom, sizeof(cart.rom));
snprintf(cart.sha1, sizeof(cart.sha1), "%s", shabuf);
uint8_t *temprom = malloc(size * sizeof(uint8_t));
memcpy(temprom, cart.rom, size);
sha1(cart.sha1, temprom, size);
free(temprom);
/* Assign default settings (US NTSC machine) */
cart.mapper = MAPPER_SEGA;
@ -93,3 +95,51 @@ int load_rom(char *filename)
return 1;
}
int load_rom_mem(uint8_t *rom, size_t size)
{
int i;
if(cart.rom) { free(cart.rom); }
cart.rom = (uint8_t*)malloc(size * sizeof(uint8_t));
memcpy(cart.rom, rom, size);
/* Don't load games smaller than 16K */
if(size < 0x4000) return 0;
/* Take care of image header, if present */
if((size / 512) & 1)
{
size -= 512;
memmove(cart.rom, cart.rom + 512, size);
}
cart.pages = (size / 0x4000);
cart.crc = crc32(0L, cart.rom, size);
uint8_t *temprom = malloc(size * sizeof(uint8_t));
memcpy(temprom, cart.rom, size);
sha1(cart.sha1, temprom, size);
free(temprom);
/* Assign default settings (US NTSC machine) */
cart.mapper = MAPPER_SEGA;
sms.display = DISPLAY_NTSC;
sms.territory = TERRITORY_EXPORT;
/* Look up mapper in game list */
for(i = 0; game_list[i].name != NULL; i++)
{
if(cart.crc == game_list[i].crc)
{
cart.mapper = game_list[i].mapper;
sms.display = game_list[i].display;
sms.territory = game_list[i].territory;
}
}
system_assign_device(PORT_A, DEVICE_PAD2B);
system_assign_device(PORT_B, DEVICE_PAD2B);
return 1;
}

View file

@ -3,6 +3,7 @@
/* Function prototypes */
int load_rom(char *filename);
int load_rom_mem(uint8_t *rom, size_t size);
#endif /* _LOADROM_H_ */

View file

@ -43,7 +43,7 @@ typedef struct
uint8_t *rom;
uint8_t pages;
uint32_t crc;
char sha1[41];
uint8_t sha1[20];
uint32_t sram_crc;
int mapper;
uint8_t sram[0x8000];

View file

@ -386,7 +386,12 @@ int main (int argc, char *argv[]) {
}
fprintf(stdout, "CRC : %08X\n", cart.crc);
fprintf(stdout, "SHA1: %s\n", cart.sha1);
//fprintf(stdout, "SHA1: %s\n", cart.sha1);
fprintf(stdout, "SHA1: ");
for (int i = 0; i < SHA1_DIGEST_SIZE; i++) {
fprintf(stdout, "%02X", cart.sha1[i]);
}
fprintf(stdout, "\n");
// Set defaults
settings.video_scale = 2;