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