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