comparison system.c @ 1140:4490c9c12272

Detect system type from filename if header based methods fail. Allow overriding system type from command line.
author Michael Pavone <pavone@retrodev.com>
date Mon, 02 Jan 2017 21:46:26 -0800
parents 928a65750345
children aee2177a1630
comparison
equal deleted inserted replaced
1139:160e3f597cec 1140:4490c9c12272
7 { 7 {
8 long len = strlen(str); 8 long len = strlen(str);
9 return filesize >= offset+len && !memcmp(str, buffer + offset, len); 9 return filesize >= offset+len && !memcmp(str, buffer + offset, len);
10 } 10 }
11 11
12 system_type detect_system_type(uint8_t *rom, long filesize) 12 system_type detect_system_type(system_media *media)
13 { 13 {
14 if (safe_cmp("SEGA", 0x100, rom, filesize)) { 14 if (safe_cmp("SEGA", 0x100, media->buffer, media->size)) {
15 //TODO: Differentiate between vanilla Genesis and Sega CD/32X games 15 //TODO: Differentiate between vanilla Genesis and Sega CD/32X games
16 return SYSTEM_GENESIS; 16 return SYSTEM_GENESIS;
17 } 17 }
18 if (safe_cmp("TMR SEGA", 0x1FF0, rom, filesize) 18 if (safe_cmp("TMR SEGA", 0x1FF0, media->buffer, media->size)
19 || safe_cmp("TMR SEGA", 0x3FF0, rom, filesize) 19 || safe_cmp("TMR SEGA", 0x3FF0, media->buffer, media->size)
20 || safe_cmp("TMR SEGA", 0x7FF0, rom, filesize) 20 || safe_cmp("TMR SEGA", 0x7FF0, media->buffer, media->size)
21 ) { 21 ) {
22 return SYSTEM_SMS; 22 return SYSTEM_SMS;
23 } 23 }
24 //TODO: Detect Jaguar ROMs here 24 //TODO: Detect Jaguar ROMs here
25 25
26 //Header based detection failed, examine filename for clues
27 if (media->extension) {
28 if (!strcmp("md", media->extension) || !strcmp("gen", media->extension)) {
29 return SYSTEM_GENESIS;
30 }
31 if (!strcmp("sms", media->extension)) {
32 return SYSTEM_SMS;
33 }
34 if (!strcmp("j64", media->extension)) {
35 return SYSTEM_JAGUAR;
36 }
37 }
38
26 //More certain checks failed, look for a valid 68K reset vector 39 //More certain checks failed, look for a valid 68K reset vector
27 if (filesize >= 8) { 40 if (media->size >= 8) {
41 char *rom = media->buffer;
28 uint32_t reset = rom[4] << 24 | rom[5] << 16 | rom[6] << 8 | rom[7]; 42 uint32_t reset = rom[4] << 24 | rom[5] << 16 | rom[6] << 8 | rom[7];
29 if (!(reset & 1) && reset < filesize) { 43 if (!(reset & 1) && reset < media->size) {
30 //we have a valid looking reset vector, assume it's a Genesis ROM 44 //we have a valid looking reset vector, assume it's a Genesis ROM
31 return SYSTEM_GENESIS; 45 return SYSTEM_GENESIS;
32 } 46 }
33 } 47 }
34 return SYSTEM_UNKNOWN; 48 return SYSTEM_UNKNOWN;
35 } 49 }
36 50
37 system_header *alloc_config_system(system_type stype, void *rom, uint32_t rom_size, void *lock_on, uint32_t lock_on_size, uint32_t opts, uint8_t force_region, rom_info *info_out) 51 system_header *alloc_config_system(system_type stype, system_media *media, uint32_t opts, uint8_t force_region, rom_info *info_out)
38 { 52 {
53 void *lock_on = NULL;
54 uint32_t lock_on_size = 0;
55 if (media->chain) {
56 lock_on = media->chain->buffer;
57 lock_on_size = media->chain->size;
58 }
39 switch (stype) 59 switch (stype)
40 { 60 {
41 case SYSTEM_GENESIS: 61 case SYSTEM_GENESIS:
42 return &(alloc_config_genesis(rom, rom_size, lock_on, lock_on_size, opts, force_region, info_out))->header; 62 return &(alloc_config_genesis(media->buffer, media->size, lock_on, lock_on_size, opts, force_region, info_out))->header;
43 #ifndef NO_Z80 63 #ifndef NO_Z80
44 case SYSTEM_SMS: 64 case SYSTEM_SMS:
45 return &(alloc_configure_sms(rom, rom_size, lock_on, lock_on_size, opts, force_region, info_out))->header; 65 return &(alloc_configure_sms(media->buffer, media->size, lock_on, lock_on_size, opts, force_region, info_out))->header;
46 #endif 66 #endif
47 default: 67 default:
48 return NULL; 68 return NULL;
49 } 69 }
50 } 70 }