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 }