From 0a20fedfda988c5a8d422974ca6d21a9b4f42f2c Mon Sep 17 00:00:00 2001 From: rdanbrook <1869094+rdanbrook@users.noreply.github.com> Date: Sun, 28 Apr 2019 21:06:43 -0400 Subject: [PATCH] Fixed hashing and added ability to load a ROM directly from memory --- core/hash.c | 15 ++----------- core/hash.h | 2 +- core/loadrom.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++--- core/loadrom.h | 1 + core/system.h | 2 +- shell/smsplus.c | 7 ++++++- 6 files changed, 64 insertions(+), 19 deletions(-) diff --git a/core/hash.c b/core/hash.c index 6fe60c8..03813f4 100644 --- a/core/hash.c +++ b/core/hash.c @@ -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[] = { diff --git a/core/hash.h b/core/hash.h index c538b14..db0499a 100644 --- a/core/hash.h +++ b/core/hash.h @@ -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); diff --git a/core/loadrom.c b/core/loadrom.c index d067b26..e53d55f 100644 --- a/core/loadrom.c +++ b/core/loadrom.c @@ -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; +} diff --git a/core/loadrom.h b/core/loadrom.h index b6b925a..565768d 100644 --- a/core/loadrom.h +++ b/core/loadrom.h @@ -3,6 +3,7 @@ /* Function prototypes */ int load_rom(char *filename); +int load_rom_mem(uint8_t *rom, size_t size); #endif /* _LOADROM_H_ */ diff --git a/core/system.h b/core/system.h index 1495216..abbee63 100644 --- a/core/system.h +++ b/core/system.h @@ -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]; diff --git a/shell/smsplus.c b/shell/smsplus.c index 7c078ff..d5e4fdb 100644 --- a/shell/smsplus.c +++ b/shell/smsplus.c @@ -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;