9 static char *carts[] = {
13 [0x03] =
"MBC1+RAM+BATTERY",
15 [0x06] =
"MBC2+BATTERY",
17 [0x09] =
"ROM+RAM+BATTERY",
20 [0x0D] =
"MMM01+RAM+BATTERY",
21 [0x0F] =
"MBC3+TIMER+BATTERY",
22 [0x10] =
"MBC3+TIMER+RAM+BATTERY",
25 [0x13] =
"MBC3+RAM+BATTERY",
28 [0x17] =
"MBC4+RAM+BATTERY",
31 [0x1B] =
"MBC5+RAM+BATTERY",
32 [0x1C] =
"MBC5+RUMBLE",
33 [0x1D] =
"MBC5+RUMBLE+RAM",
34 [0x1E] =
"MBC5+RUMBLE+RAM+BATTERY",
35 [0xFC] =
"POCKET CAMERA",
36 [0xFD] =
"BANDAI TAMA5",
38 [0xFF] =
"HuC1+RAM+BATTERY",
41 static char *banks[] = {
57 static const int bank_sizes[] = {
71 static char *rams[] = {
79 static char *regions[] = {
85 static unsigned char header[] = {
86 0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B,
87 0x03, 0x73, 0x00, 0x83, 0x00, 0x0C, 0x00, 0x0D,
88 0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E,
89 0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99,
90 0xBB, 0xBB, 0x67, 0x63, 0x6E, 0x0E, 0xEC, 0xCC,
91 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E
94 static int rom_init(
unsigned char *rombytes,
size_t filesize)
97 int type, bank_index, ram, region, version, i, pass;
98 unsigned char checksum = 0;
100 if(
memcmp((
const char*)&rombytes[0x104], (
const char*)header,
sizeof(header)) != 0)
103 memcpy(buf, &rombytes[0x134], 16);
105 printf(
"Rom title: %s\n", buf);
107 type = (int)rombytes[0x147];
109 printf(
"Cartridge type: %s (%02X)\n", carts[type], type);
111 bank_index = rombytes[0x148];
113 if(bank_index >= 0x52 && bank_index <= 0x54)
115 else if(bank_index > 7)
120 printf(
"Illegal ROM size in header\n");
124 printf(
"Rom size: %s\n", banks[bank_index]);
126 rom_size = bank_sizes[bank_index];
130 printf(
"File not big enough for ROM size.\n");
134 ram = rombytes[0x149];
138 printf(
"RAM size: %s\n", rams[ram]);
140 region = rombytes[0x14A];
143 printf(
"Region: %s\n", regions[region]);
145 version = rombytes[0x14C];
146 printf(
"Version: %02X\n", version);
148 for(i = 0x134; i <= 0x14C; i++)
149 checksum = checksum - rombytes[i] - 1;
151 pass = rombytes[0x14D] == checksum;
153 printf(
"Checksum: %s (%02X)\n", pass ?
"OK" :
"FAIL", checksum);
204 unsigned int rom_get_mapper(
void)
209 int rom_load(
const char *filename) {
211 unsigned char *bytes = NULL;
214 f =
fopen(filename,
"r");
221 bytes = malloc(rom_size);
226 fread(f, rom_size, 1, bytes);
228 return rom_init(bytes, rom_size);
231 unsigned char *rom_getbytes(
void)
236 int rom_bank_valid(
int bank)
238 if(bank * 0x4000 > rom_size)
size_t filesize(const char *Path)
[FileIO] Возвращает размер указанного файла
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
int32_t memcmp(const char *s1, const char *s2, size_t n)
Сравнение массивов
FILE * fopen(const char *filename, const char *_mode)
Открывает файл
int fsize(FILE *stream)
Получение размера файла в байтах
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Структура файла. Требуется для работы с VFS.