Mercurial > repos > blastem
comparison system.c @ 2053:3414a4423de1 segacd
Merge from default
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 15 Jan 2022 13:15:21 -0800 |
parents | 5dacaef602a7 81df9aa2de9b |
children | 1e626d0ecf9c |
comparison
equal
deleted
inserted
replaced
1692:5dacaef602a7 | 2053:3414a4423de1 |
---|---|
1 #include <string.h> | 1 #include <string.h> |
2 #include "system.h" | 2 #include "system.h" |
3 #include "genesis.h" | 3 #include "genesis.h" |
4 #include "gen_player.h" | |
4 #include "sms.h" | 5 #include "sms.h" |
5 | 6 |
6 uint8_t safe_cmp(char *str, long offset, uint8_t *buffer, long filesize) | 7 uint8_t safe_cmp(char *str, long offset, uint8_t *buffer, long filesize) |
7 { | 8 { |
8 long len = strlen(str); | 9 long len = strlen(str); |
23 || safe_cmp("TMR SEGA", 0x3FF0, media->buffer, media->size) | 24 || safe_cmp("TMR SEGA", 0x3FF0, media->buffer, media->size) |
24 || safe_cmp("TMR SEGA", 0x7FF0, media->buffer, media->size) | 25 || safe_cmp("TMR SEGA", 0x7FF0, media->buffer, media->size) |
25 ) { | 26 ) { |
26 return SYSTEM_SMS; | 27 return SYSTEM_SMS; |
27 } | 28 } |
29 if (safe_cmp("BLSTEL\x02", 0, media->buffer, media->size)) { | |
30 uint8_t *buffer = media->buffer; | |
31 if (media->size > 9 && buffer[7] == 0) { | |
32 return buffer[8] + 1; | |
33 } | |
34 } | |
35 | |
36 | |
28 //TODO: Detect Jaguar ROMs here | 37 //TODO: Detect Jaguar ROMs here |
29 | 38 |
30 //Header based detection failed, examine filename for clues | 39 //Header based detection failed, examine filename for clues |
31 if (media->extension) { | 40 if (media->extension) { |
32 if (!strcmp("md", media->extension) || !strcmp("gen", media->extension)) { | 41 if (!strcmp("md", media->extension) || !strcmp("gen", media->extension)) { |
41 } | 50 } |
42 | 51 |
43 //More certain checks failed, look for a valid 68K reset vector | 52 //More certain checks failed, look for a valid 68K reset vector |
44 if (media->size >= 8) { | 53 if (media->size >= 8) { |
45 char *rom = media->buffer; | 54 char *rom = media->buffer; |
46 uint32_t reset = rom[4] << 24 | rom[5] << 16 | rom[6] << 8 | rom[7]; | 55 uint32_t reset = rom[5] << 16 | rom[6] << 8 | rom[7]; |
47 if (!(reset & 1) && reset < media->size) { | 56 if (!(reset & 1) && reset < media->size) { |
48 //we have a valid looking reset vector, assume it's a Genesis ROM | 57 //we have a valid looking reset vector, assume it's a Genesis ROM |
49 return SYSTEM_GENESIS; | 58 return SYSTEM_GENESIS; |
50 } | 59 } |
51 } | 60 } |
62 } | 71 } |
63 switch (stype) | 72 switch (stype) |
64 { | 73 { |
65 case SYSTEM_GENESIS: | 74 case SYSTEM_GENESIS: |
66 return &(alloc_config_genesis(media->buffer, media->size, lock_on, lock_on_size, opts, force_region))->header; | 75 return &(alloc_config_genesis(media->buffer, media->size, lock_on, lock_on_size, opts, force_region))->header; |
76 case SYSTEM_GENESIS_PLAYER: | |
77 return &(alloc_config_gen_player(media->buffer, media->size))->header; | |
67 case SYSTEM_SEGACD: | 78 case SYSTEM_SEGACD: |
68 return &(alloc_config_genesis_cdboot(media, opts, force_region))->header; | 79 return &(alloc_config_genesis_cdboot(media, opts, force_region))->header; |
69 #ifndef NO_Z80 | 80 #ifndef NO_Z80 |
70 case SYSTEM_SMS: | 81 case SYSTEM_SMS: |
71 return &(alloc_configure_sms(media, opts, force_region))->header; | 82 return &(alloc_configure_sms(media, opts, force_region))->header; |
72 #endif | 83 #endif |
73 default: | 84 default: |
74 return NULL; | 85 return NULL; |
75 } | 86 } |
76 } | 87 } |
88 | |
89 system_header *alloc_config_player(system_type stype, event_reader *reader) | |
90 { | |
91 switch(stype) | |
92 { | |
93 case SYSTEM_GENESIS: | |
94 return &(alloc_config_gen_player_reader(reader))->header; | |
95 } | |
96 return NULL; | |
97 } | |
98 | |
99 void system_request_exit(system_header *system, uint8_t force_release) | |
100 { | |
101 system->force_release = force_release; | |
102 system->request_exit(system); | |
103 } |