Mercurial > repos > blastem
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 } |