/****************************************************************************** * Sega Master System / GameGear Emulator * Copyright (C) 1998-2007 Charles MacDonald * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * ROM File Loading support * ******************************************************************************/ #include "shared.h" #define GAME_DATABASE_CNT 97 typedef struct { uint32_t crc; uint8_t glasses_3d; uint8_t device; uint8_t mapper; uint8_t display; uint8_t territory; uint8_t console; const char *name; } rominfo_t; static rominfo_t game_list[GAME_DATABASE_CNT] = { /* games requiring CODEMASTER mapper */ {0x29822980, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Cosmic Spacehead"}, {0x6CAA625B, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GG, "Cosmic Spacehead (GG)"}, {0xEA5C3A6F, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Dinobasher - Starring Bignose the Caveman [Proto]"}, {0x152F0DCC, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Drop Zone"}, {0x5E53C7F7, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GG, "Ernie Els Golf"}, {0x8813514B, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Excellent Dizzy Collection, The [Proto]"}, {0xAA140C9C, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Excellent Dizzy Collection, The [SMS-GG]"}, {0xB9664AE1, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Fantastic Dizzy"}, {0xC888222B, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Fantastic Dizzy [SMS-GG]"}, {0x76C5BDFB, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Jang Pung 2 [SMS-GG]"}, {0xD9A7F170, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Man Overboard!"}, {0xA577CE46, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Micro Machines"}, {0xF7C524F6, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Micro Machines [BAD DUMP]"}, {0xDBE8895C, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Micro Machines 2 - Turbo Tournament"}, {0xC1756BEE, 0, DEVICE_PAD2B, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Pete Sampras Tennis"}, /* games requiring KOREA mappers */ {0x17AB6883, 0, DEVICE_PAD2B, MAPPER_NONE, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS2, "FA Tetris (KR)"}, {0x61E8806F, 0, DEVICE_PAD2B, MAPPER_NONE, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS2, "Flash Point (KR)"}, {0x89B79E77, 0, DEVICE_PAD2B, MAPPER_KOREA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS2, "Dodgeball King (KR)"}, {0x18FB98A3, 0, DEVICE_PAD2B, MAPPER_KOREA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS2, "Jang Pung 3 (KR)"}, {0x97D03541, 0, DEVICE_PAD2B, MAPPER_KOREA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS2, "Sangokushi 3 (KR)"}, {0x67C2F0FF, 0, DEVICE_PAD2B, MAPPER_KOREA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS2, "Super Boy 2 (KR)"}, {0x445525E2, 0, DEVICE_PAD2B, MAPPER_KOREA_MSX, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS2, "Penguin Adventure (KR)"}, {0x83F0EEDE, 0, DEVICE_PAD2B, MAPPER_KOREA_MSX, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS2, "Street Master (KR)"}, {0xA05258F5, 0, DEVICE_PAD2B, MAPPER_KOREA_MSX, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS2, "Won-Si-In (KR)"}, {0x06965ED9, 0, DEVICE_PAD2B, MAPPER_KOREA_MSX, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS2, "F-1 Spirit - The way to Formula-1 (KR)"}, /* games that require PAL timings (from MEKA.nam by Omar Cornut) */ {0x72420F38, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Addams Familly"}, {0x2D48C1D3, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Back to the Future Part III"}, {0x1CBB7BF1, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Battlemaniacs (BR)"}, {0x1B10A951, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Bram Stoker's Dracula"}, {0xC0E25D62, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "California Games II"}, {0xC9DBF936, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Home Alone"}, {0x0047B615, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Predator2"}, {0xF42E145C, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Quest for the Shaven Yak Starring Ren Hoek & Stimpy (BR)"}, {0x9F951756, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "RoboCop 3"}, {0x1575581D, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Shadow of the Beast"}, {0x96B3F29E, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Sonic Blast (BR)"}, {0x5B3B922C, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Sonic the Hedgehog 2 [V0]"}, {0xD6F2BFCA, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Sonic the Hedgehog 2 [V1]"}, {0xCA1D3752, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Space Harrier [50 Hz]"}, {0x85CFC9C9, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Taito Chase H.Q."}, {0x38434560, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Bad Apple SMS"}, {0xDA2A68C6, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "The Synchrobots"}, /* games requiring 315-5124 VDP (Mark-III, Sega Master System) */ {0x32759751, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS, "Y's (J)"}, /* games requiring Game Gear SMS compatibility mode */ {0x59840FD6, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Castle of Illusion - Starring Mickey Mouse"}, {0x9942B69B, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_GGMS, "Castle of Illusion - Starring Mickey Mouse (J)"}, {0x5877B10D, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_GGMS, "Castle of Illusion - Starring Mickey Mouse (J) [HACK]"}, {0x9C76FB3A, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Rastan Saga [SMS-GG]"}, {0x7BB81E3D, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Taito Chase H.Q. [SMS-GG]"}, {0x44FBE8F6, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Taito Chase H.Q. [SMS-GG][HACK]"}, {0x18086B70, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Taito Chase H.Q. [SMS-GG][HACK][BAD]"}, {0xDA8E95A9, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "WWF Wrestlemania Steel Cage Challenge [SMS-GG]"}, {0xCB42BD33, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "WWF Wrestlemania Steel Cage Challenge [SMS-GG] [BAD DUMP]"}, {0x1D93246E, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Olympic Gold [SMS-GG] [A]"}, {0xA2f9C7AF, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Olympic Gold [SMS-GG] [B]"}, {0xF037EC00, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Out Run Europa [SMS-GG]"}, {0xE5F789B9, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Predator 2 [SMS-GG]"}, {0x311D2863, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Prince of Persia [SMS-GG] [A]"}, {0x45F058d6, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Prince of Persia [SMS-GG] [B]"}, {0x56201996, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "R.C. Grand Prix [SMS-GG]"}, {0x10DBBEF4, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_GGMS, "Super Kick Off [SMS-GG]"}, {0xBD1CC7DF, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_GGMS, "Super Tetris (KR)"}, /* games requiring 3D Glasses */ {0xFBF96C81, 1, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Blade Eagle 3-D (BR)"}, {0x8ECD201C, 1, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Blade Eagle 3-D"}, {0x31B8040B, 1, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Maze Hunter 3-D"}, {0x871562b0, 1, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS, "Maze Walker"}, {0xABD48AD2, 1, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Poseidon Wars 3-D"}, {0x6BD5C2BF, 1, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Space Harrier 3-D"}, {0x156948f9, 1, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS, "Space Harrier 3-D (J)"}, {0xA3EF13CB, 1, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Zaxxon 3-D"}, {0xBBA74147, 1, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Zaxxon 3-D [Proto]"}, {0xD6F43DDA, 1, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Out Run 3-D"}, /* games requiring Light Phaser & 3D Glasses */ {0xFBE5CFBB, 1, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Missile Defense 3D"}, {0xE79BB689, 1, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Missile Defense 3D [BIOS]"}, /* games requiring Light Phaser */ {0x861B6E79, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Assault City [Light Phaser]"}, {0x5FC74D2A, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Gangster Town"}, {0xE167A561, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Hang-On / Safari Hunt"}, {0xC5083000, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Hang-On / Safari Hunt [BAD DUMP]"}, {0x91E93385, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Hang-On / Safari Hunt [BIOS]"}, {0xE8EA842C, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Marksman Shooting / Trap Shooting"}, {0xE8215C2E, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Marksman Shooting / Trap Shooting / Safari Hunt"}, {0x205CAAE8, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, CONSOLE_SMS2, "Operation Wolf"}, /* can be also played using the PLAYER2 gamepad */ {0x23283F37, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Operation Wolf [A]"}, /* can be also played using the PLAYER2 gamepad */ {0xDA5A7013, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Rambo 3"}, {0x79AC8E7F, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Rescue Mission"}, {0x4B051022, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Shooting Gallery"}, {0xA908CFF5, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Spacegun"}, {0x5359762D, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Wanted"}, {0x0CA95637, 0, DEVICE_LIGHTGUN, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Laser Ghost"}, /* games requiring Paddle */ {0xF9DBB533, 0, DEVICE_PADDLE, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS, "Alex Kidd BMX Trial"}, {0xA6FA42D0, 0, DEVICE_PADDLE, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS, "Galactic Protector"}, {0x29BC7FAD, 0, DEVICE_PADDLE, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS, "Megumi Rescue"}, {0x315917D4, 0, DEVICE_PADDLE, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS, "Woody Pop"}, /* games requiring Sport Pad (NOT EMULATED YET) */ {0x946B8C4A, 0, DEVICE_SPORTSPAD, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Great Ice Hockey"}, {0xE42E4998, 0, DEVICE_SPORTSPAD, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Sports Pad Football"}, {0x41C948BF, 0, DEVICE_SPORTSPAD, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS2, "Sports Pad Soccer"}, /* Games using FM sound only when a certain region is set. Not required for the games to be playable * but most people prefer the FM soundtrack anyway. */ {0x679E1676, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS2, "Wonder Boy III - The dragon's Trap"}, {0x22CCA9BB, 0, DEVICE_PAD2B, MAPPER_SEGA, DISPLAY_NTSC, TERRITORY_DOMESTIC, CONSOLE_SMS2, "Turma da Monica em O Resgate"} }; static void set_config() { uint32_t i; /* default sms settings */ cart.mapper = MAPPER_SEGA; sms.console = CONSOLE_SMS2; sms.territory = TERRITORY_EXPORT; sms.display = DISPLAY_NTSC; sms.glasses_3d = 0; sms.device[0] = DEVICE_PAD2B; sms.device[1] = DEVICE_PAD2B; sms.use_fm = option.fm; /* console type detection */ /* SMS Header is located at 0x7ff0 */ if ((cart.size > 0x7000) && (!memcmp (&cart.rom[0x7ff0], "TMR SEGA", 8))) { uint8_t region = (cart.rom[0x7fff] & 0xf0) >> 4; switch (region) { case 5: sms.console = CONSOLE_GG; sms.territory = TERRITORY_DOMESTIC; break; case 6: case 7: sms.console = CONSOLE_GG; sms.territory = TERRITORY_EXPORT; break; case 3: sms.console = CONSOLE_SMS; sms.territory = TERRITORY_DOMESTIC; break; default: sms.console = CONSOLE_SMS2; sms.territory = TERRITORY_EXPORT; break; } } sms.gun_offset = 20; /* default offset */ /* retrieve game settings from database */ for (i = 0; i < GAME_DATABASE_CNT; i++) { if (cart.crc == game_list[i].crc) { cart.mapper = game_list[i].mapper; sms.display = game_list[i].display; sms.territory = game_list[i].territory; sms.glasses_3d = game_list[i].glasses_3d; sms.console = game_list[i].console; sms.device[0] = game_list[i].device; if (game_list[i].device != DEVICE_LIGHTGUN) sms.device[1] = game_list[i].device; /* Games's specific hacks */ if ((strcmp(game_list[i].name, "Spacegun") == 0) || (strcmp(game_list[i].name, "Gangster Town") == 0)) { /* these games seem to use different gun position calculation method */ sms.gun_offset = 16; } i = GAME_DATABASE_CNT; } } /* enable BIOS on SMS only */ bios.enabled &= 2; /* force settings if AUTO is not set*/ switch(option.console) { case 1: sms.console = CONSOLE_SMS; break; case 2: sms.console = CONSOLE_SMS2; break; case 3: sms.console = CONSOLE_GG; break; case 4: sms.console = CONSOLE_GGMS; break; case 5: sms.console = CONSOLE_SG1000; cart.mapper = MAPPER_NONE; break; case 6: sms.console = CONSOLE_COLECO; cart.mapper = MAPPER_NONE; break; } switch(option.country) { /* USA */ case 1: sms.display = DISPLAY_NTSC; sms.territory = TERRITORY_EXPORT; break; /* EUROPE */ case 2: sms.display = DISPLAY_PAL; sms.territory = TERRITORY_EXPORT; break; /* JAPAN */ case 3: sms.display = DISPLAY_NTSC; sms.territory = TERRITORY_DOMESTIC; break; } } uint32_t load_rom (const char *filename) { if(cart.rom) { free(cart.rom); cart.rom = NULL; } if(check_zip(filename)) { char name[PATH_MAX]; cart.rom = loadFromZipByName((char*)filename, name, &cart.size); if (!cart.rom) return 0; strcpy(option.game_name, name); } else { FILE *fd = NULL; fd = fopen(filename, "rb"); if (!fd) return 0; /* Seek to end of file, and get size */ fseek(fd, 0, SEEK_END); cart.size = ftell(fd); fseek(fd, 0, SEEK_SET); if (cart.size < 0x4000) cart.size = 0x4000; cart.rom = malloc(cart.size); if (!cart.rom) { fclose(fd); return 0; } fread(cart.rom, cart.size, 1, fd); fclose(fd); } /* Take care of image header, if present */ if ((cart.size / 512) & 1) { cart.size -= 512; memcpy (cart.rom, cart.rom + 512, cart.size); } /* 16k pages */ cart.pages = cart.size / 0x4000; cart.crc = crc32 (0, cart.rom, cart.size); cart.loaded = 1; set_config(); return 1; }