mirror of
https://github.com/0ldsk00l/smsplus.git
synced 2024-05-13 10:09:17 -04:00
Fixed hashing and added ability to load a ROM directly from memory
This commit is contained in:
parent
9dbeac12df
commit
0a20fedfda
15
core/hash.c
15
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[] = {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
/* Function prototypes */
|
||||
int load_rom(char *filename);
|
||||
int load_rom_mem(uint8_t *rom, size_t size);
|
||||
|
||||
#endif /* _LOADROM_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];
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue