comparison blastem.c @ 166:97aa449706c2

Added SMD ROM support
author Mike Pavone <pavone@retrodev.com>
date Sun, 06 Jan 2013 09:51:15 -0800
parents a2ab895d9708
children ebcbdd1c4cc8
comparison
equal deleted inserted replaced
165:62b152811bae 166:97aa449706c2
24 24
25 #ifndef MIN 25 #ifndef MIN
26 #define MIN(a,b) ((a) < (b) ? (a) : (b)) 26 #define MIN(a,b) ((a) < (b) ? (a) : (b))
27 #endif 27 #endif
28 28
29 #define SMD_HEADER_SIZE 512
30 #define SMD_MAGIC1 0x03
31 #define SMD_MAGIC2 0xAA
32 #define SMD_MAGIC3 0xBB
33 #define SMD_BLOCK_SIZE 0x4000
34
35 int load_smd_rom(long filesize, FILE * f)
36 {
37 uint8_t block[SMD_BLOCK_SIZE];
38 filesize -= SMD_HEADER_SIZE;
39 fseek(f, SMD_HEADER_SIZE, SEEK_SET);
40
41 uint16_t * dst = cart;
42 while (filesize > 0) {
43 fread(block, 1, SMD_BLOCK_SIZE, f);
44 for (uint8_t *low = block, *high = (block+SMD_BLOCK_SIZE/2), *end = block+SMD_BLOCK_SIZE; high < end; high++, low++) {
45 *(dst++) = *high << 8 | *low;
46 }
47 filesize -= SMD_BLOCK_SIZE;
48 }
49 return 1;
50 }
51
29 int load_rom(char * filename) 52 int load_rom(char * filename)
30 { 53 {
54 uint8_t header[10];
31 FILE * f = fopen(filename, "rb"); 55 FILE * f = fopen(filename, "rb");
32 if (!f) { 56 if (!f) {
33 return 0; 57 return 0;
34 } 58 }
59 fread(header, 1, sizeof(header), f);
35 fseek(f, 0, SEEK_END); 60 fseek(f, 0, SEEK_END);
36 long filesize = ftell(f); 61 long filesize = ftell(f);
37 if (filesize/2 > CARTRIDGE_WORDS) { 62 if (filesize/2 > CARTRIDGE_WORDS) {
38 //carts bigger than 4MB not currently supported 63 //carts bigger than 4MB not currently supported
39 filesize = CARTRIDGE_WORDS*2; 64 filesize = CARTRIDGE_WORDS*2;
40 } 65 }
41 fseek(f, 0, SEEK_SET); 66 fseek(f, 0, SEEK_SET);
42 fread(cart, 2, MIN(filesize/2, CARTRIDGE_WORDS), f); 67 if (header[1] == SMD_MAGIC1 && header[8] == SMD_MAGIC2 && header[9] == SMD_MAGIC3) {
68 int i;
69 for (i = 3; i < 8; i++) {
70 if (header[i] != 0) {
71 break;
72 }
73 }
74 if (i == 8) {
75 if (header[2]) {
76 fprintf(stderr, "%s is a split SMD ROM which is not currently supported", filename);
77 exit(1);
78 }
79 return load_smd_rom(filesize, f);
80 }
81 }
82 fread(cart, 2, filesize/2, f);
43 fclose(f); 83 fclose(f);
44 for(unsigned short * cur = cart; cur - cart < (filesize/2); ++cur) 84 for(unsigned short * cur = cart; cur - cart < (filesize/2); ++cur)
45 { 85 {
46 *cur = (*cur >> 8) | (*cur << 8); 86 *cur = (*cur >> 8) | (*cur << 8);
47 } 87 }