comparison system.c @ 2413:64cf80e683aa

Initial support for Colecovision emulation
author Michael Pavone <pavone@retrodev.com>
date Thu, 04 Jan 2024 22:56:35 -0800
parents 92449b47cce8
children 65c2e4d990cc
comparison
equal deleted inserted replaced
2412:ed7b4d869989 2413:64cf80e683aa
2 #include "system.h" 2 #include "system.h"
3 #include "genesis.h" 3 #include "genesis.h"
4 #include "gen_player.h" 4 #include "gen_player.h"
5 #include "sms.h" 5 #include "sms.h"
6 #include "mediaplayer.h" 6 #include "mediaplayer.h"
7 #include "coleco.h"
7 8
8 uint8_t safe_cmp(char *str, long offset, uint8_t *buffer, long filesize) 9 uint8_t safe_cmp(char *str, long offset, uint8_t *buffer, long filesize)
9 { 10 {
10 long len = strlen(str); 11 long len = strlen(str);
11 return filesize >= offset+len && !memcmp(str, buffer + offset, len); 12 return filesize >= offset+len && !memcmp(str, buffer + offset, len);
37 safe_cmp("Vgm ", 0, media->buffer, media->size) 38 safe_cmp("Vgm ", 0, media->buffer, media->size)
38 || safe_cmp("RIFF", 0, media->buffer, media->size) 39 || safe_cmp("RIFF", 0, media->buffer, media->size)
39 || safe_cmp("fLaC", 0, media->buffer, media->size)) { 40 || safe_cmp("fLaC", 0, media->buffer, media->size)) {
40 return SYSTEM_MEDIA_PLAYER; 41 return SYSTEM_MEDIA_PLAYER;
41 } 42 }
43 if (
44 (safe_cmp("\xAA\x55", 0, media->buffer, media->size)
45 || safe_cmp("\x55\xAA", 0, media->buffer, media->size))
46 && media->size > 0xB) {
47 uint8_t *buffer = media->buffer;
48 if (((buffer[0xB] << 8) | buffer[0xA]) > 0x8000) {
49 return SYSTEM_COLECOVISION;
50 }
51 }
42 52
43 53
44 //TODO: Detect Jaguar ROMs here 54 //TODO: Detect Jaguar ROMs here
45 55
46 //Header based detection failed, examine filename for clues 56 //Header based detection failed, examine filename for clues
51 if (!strcmp("sms", media->extension) || !strcmp("sg", media->extension) || !strcmp("gg", media->extension)) { 61 if (!strcmp("sms", media->extension) || !strcmp("sg", media->extension) || !strcmp("gg", media->extension)) {
52 return SYSTEM_SMS; 62 return SYSTEM_SMS;
53 } 63 }
54 if (!strcmp("j64", media->extension)) { 64 if (!strcmp("j64", media->extension)) {
55 return SYSTEM_JAGUAR; 65 return SYSTEM_JAGUAR;
66 }
67 if (!strcmp("col", media->extension)) {
68 return SYSTEM_COLECOVISION;
56 } 69 }
57 } 70 }
58 71
59 //More certain checks failed, look for a valid 68K reset vector 72 //More certain checks failed, look for a valid 68K reset vector
60 if (media->size >= 8) { 73 if (media->size >= 8) {
85 case SYSTEM_SEGACD: 98 case SYSTEM_SEGACD:
86 return &(alloc_config_genesis_cdboot(media, opts, force_region))->header; 99 return &(alloc_config_genesis_cdboot(media, opts, force_region))->header;
87 #ifndef NO_Z80 100 #ifndef NO_Z80
88 case SYSTEM_SMS: 101 case SYSTEM_SMS:
89 return &(alloc_configure_sms(media, opts, force_region))->header; 102 return &(alloc_configure_sms(media, opts, force_region))->header;
103 case SYSTEM_COLECOVISION:
104 return &(alloc_configure_coleco(media))->header;
90 #endif 105 #endif
91 case SYSTEM_MEDIA_PLAYER: 106 case SYSTEM_MEDIA_PLAYER:
92 return &(alloc_media_player(media, opts))->header; 107 return &(alloc_media_player(media, opts))->header;
93 default: 108 default:
94 return NULL; 109 return NULL;