Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/genplus-gx/core/cart_hw/sms_cart.c
2 views
1
/****************************************************************************
2
* Genesis Plus
3
* SG-1000, Master System & Game Gear cartridge hardware support
4
*
5
* Copyright (C) 2007-2012 Eke-Eke (Genesis Plus GX)
6
*
7
* Redistribution and use of this code or any derivative works are permitted
8
* provided that the following conditions are met:
9
*
10
* - Redistributions may not be sold, nor may they be used in a commercial
11
* product or activity.
12
*
13
* - Redistributions that are modified from the original source must include the
14
* complete source code, including the source code for all components used by a
15
* binary built from the modified sources. However, as a special exception, the
16
* source code distributed need not include anything that is normally distributed
17
* (in either source or binary form) with the major components (compiler, kernel,
18
* and so on) of the operating system on which the executable runs, unless that
19
* component itself accompanies the executable.
20
*
21
* - Redistributions must reproduce the above copyright notice, this list of
22
* conditions and the following disclaimer in the documentation and/or other
23
* materials provided with the distribution.
24
*
25
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
29
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35
* POSSIBILITY OF SUCH DAMAGE.
36
*
37
****************************************************************************************/
38
39
#include "shared.h"
40
#include "eeprom_93c.h"
41
#include "terebi_oekaki.h"
42
43
#define MAPPER_NONE (0x00)
44
#define MAPPER_TEREBI (0x01)
45
#define MAPPER_RAM_8K_EXT1 (0x02)
46
#define MAPPER_RAM_8K_EXT2 (0x03)
47
#define MAPPER_OMV (0x04)
48
#define MAPPER_SEGA (0x10)
49
#define MAPPER_SEGA_X (0x11)
50
#define MAPPER_93C46 (0x12)
51
#define MAPPER_CODIES (0x13)
52
#define MAPPER_MULTI (0x14)
53
#define MAPPER_KOREA (0x15)
54
#define MAPPER_KOREA_16K (0x16)
55
#define MAPPER_KOREA_8K (0x20)
56
#define MAPPER_MSX (0x21)
57
#define MAPPER_MSX_NEMESIS (0x22)
58
59
#define GAME_DATABASE_CNT (214)
60
61
typedef struct
62
{
63
uint32 crc;
64
uint8 g_3d;
65
uint8 fm;
66
uint8 peripheral;
67
uint8 mapper;
68
uint8 system;
69
uint8 region;
70
} rominfo_t;
71
72
typedef struct
73
{
74
uint8 fcr[4];
75
uint8 mapper;
76
uint8 pages;
77
} romhw_t;
78
79
static const rominfo_t game_list[GAME_DATABASE_CNT] =
80
{
81
/* program requiring Mega Drive VDP (Mode 5) */
82
{0x47FA618D, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_PBC, REGION_USA}, /* Charles MacDonald's Mode 5 Demo Program */
83
84
/* game requiring SEGA mapper */
85
{0xFF67359B, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* DataStorm (homebrew) */
86
87
/* games requiring 315-5124 VDP (Mark-III, Master System I) */
88
{0x32759751, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Y's (J) */
89
90
/* games requiring Sega 315-5235 mapper without bank shifting */
91
{0x23BAC434, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA_X, SYSTEM_GG, REGION_USA}, /* Shining Force Gaiden - Final Conflict (JP) [T-Eng] */
92
93
/* games using various Korean mappers */
94
{0x17AB6883, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_NONE, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* FA Tetris (KR) */
95
{0x61E8806F, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_NONE, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Flash Point (KR) */
96
{0x445525E2, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Penguin Adventure (KR) */
97
{0x83F0EEDE, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Street Master (KR) */
98
{0xA05258F5, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Won-Si-In (KR) */
99
{0x06965ED9, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* F-1 Spirit - The way to Formula-1 (KR) */
100
{0x77EFE84A, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Cyborg Z (KR) */
101
{0xF89AF3CC, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Knightmare II - The Maze of Galious (KR) */
102
{0x9195C34C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Boy 3 (KR) */
103
{0xE316C06D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX_NEMESIS, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Nemesis (KR) */
104
{0x0A77FA5E, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Nemesis 2 (KR) */
105
{0xA67F2A5C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MULTI, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* 4-Pak All Action (KR) */
106
{0x89B79E77, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Dodgeball King (KR) */
107
{0x18FB98A3, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Jang Pung 3 (KR) */
108
{0x97D03541, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Sangokushi 3 (KR) */
109
{0x67C2F0FF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Boy 2 (KR) */
110
{0x192949D5, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Janggun-ui Adeul (KR) */
111
{0x9FA727A0, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA_16K, SYSTEM_GGMS, REGION_USA}, /* Street Hero [Proto 0] [SMS-GG] (US) */
112
{0xFB481971, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA_16K, SYSTEM_GGMS, REGION_USA}, /* Street Hero [Proto 1] [SMS-GG] (US) */
113
114
/* games using Codemaster mapper */
115
{0x29822980, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Cosmic Spacehead */
116
{0x8813514B, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Excellent Dizzy Collection, The [Proto] */
117
{0xB9664AE1, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Fantastic Dizzy */
118
{0xA577CE46, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Micro Machines */
119
{0xEA5C3A6F, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_USA}, /* Dinobasher - Starring Bignose the Caveman [Proto] */
120
{0xAA140C9C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GGMS, REGION_USA}, /* Excellent Dizzy Collection, The [SMS-GG] */
121
{0xC888222B, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GGMS, REGION_USA}, /* Fantastic Dizzy [SMS-GG] */
122
{0x76C5BDFB, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GGMS, REGION_USA}, /* Jang Pung 2 [SMS-GG] */
123
{0x6CAA625B, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Cosmic Spacehead [GG]*/
124
{0x152F0DCC, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Drop Zone" */
125
{0x5E53C7F7, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Ernie Els Golf */
126
{0xD9A7F170, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Man Overboard! */
127
{0xF7C524F6, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Micro Machines [GG] */
128
{0xDBE8895C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Micro Machines 2 - Turbo Tournament */
129
{0xC1756BEE, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Pete Sampras Tennis */
130
{0x72981057, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* CJ Elephant Fugitive */
131
132
/* games using serial EEPROM */
133
{0x36EBCD6D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* Majors Pro Baseball */
134
{0x3D8D0DD6, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball [v0] */
135
{0xBB38CFD7, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball [v1] */
136
{0x578A8A38, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball '95 */
137
138
/* games using Terebi Oekaki graphic board */
139
{0xDD4A661B, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_TEREBI, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Terebi Oekaki */
140
141
/* games requiring 8K RAM extension adapter */
142
{0xCE5648C3, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Bomberman Special [DahJee] (TW) */
143
{0x223397A1, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SG, REGION_JAPAN_NTSC}, /* King's Valley (TW) */
144
{0x281D2888, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Knightmare (TW) */
145
{0x306D5F78, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Rally-X [DahJee] (TW) */
146
{0x29E047CC, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Road Fighter (TW) */
147
{0x5CBD1163, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Tank Battalion (TW) */
148
{0x2E7166D5, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SG, REGION_JAPAN_NTSC}, /* The Legend of Kage (TW) */
149
{0xC550B4F0, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SG, REGION_JAPAN_NTSC}, /* TwinBee (TW) */
150
{0xFC87463C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Yie Ar Kung-Fu II (TW) */
151
{0x69FC1494, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Bomberman Special (TW) */
152
{0xFFC4EE3F, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Magical Kid Wiz (TW) */
153
{0x2E366CCF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SG, REGION_JAPAN_NTSC}, /* The Castle (TW) */
154
{0xAAAC12CF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Rally-X (TW) */
155
{0xD2EDD329, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Road Fighter (TW) */
156
157
/* games requiring 2K internal RAM (Othello Multivision hardware) */
158
{0x7F7F009D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_OMV, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Circus Charlie (KR) */
159
{0x77DB4704, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_OMV, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Q*Bert */
160
{0xC5A67B95, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_OMV, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Othello Multivision BIOS */
161
162
/* games requiring Japanese region setting */
163
{0x71DEBA5A, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GG, REGION_JAPAN_NTSC}, /* Pop Breaker */
164
{0xC9DD4E5F, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Woody Pop (Super Arkanoid) */
165
166
/* games requiring Mark-III hardware (no Memory Control port) */
167
{0xBD1CC7DF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_MARKIII, REGION_JAPAN_NTSC}, /* Super Tetris (KR) */
168
{0x6D309AC5, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_MARKIII, REGION_JAPAN_NTSC}, /* Power Boggle Boggle (KR) */
169
170
/* games requiring random RAM pattern initialization */
171
{0x08BF3DE3, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_NONE, SYSTEM_MARKIII, REGION_JAPAN_NTSC}, /* Alibaba and 40 Thieves (KR) */
172
{0x643B6B76, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_NONE, SYSTEM_MARKIII, REGION_JAPAN_NTSC}, /* Block Hole (KR) */
173
174
/* games requiring PAL timings */
175
{0x72420F38, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Addams Familly */
176
{0x2D48C1D3, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Back to the Future Part III */
177
{0x1CBB7BF1, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Battlemaniacs (BR) */
178
{0x1B10A951, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Bram Stoker's Dracula */
179
{0xC0E25D62, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* California Games II */
180
{0x45C50294, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Jogos de Verao II (BR) */
181
{0xC9DBF936, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Home Alone */
182
{0x0047B615, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Predator2 */
183
{0xF42E145C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Quest for the Shaven Yak Starring Ren Hoek & Stimpy (BR) */
184
{0x9F951756, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* RoboCop 3 */
185
{0xF8176918, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sensible Soccer */
186
{0x1575581D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Shadow of the Beast */
187
{0x96B3F29E, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sonic Blast (BR) */
188
{0x5B3B922C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sonic the Hedgehog 2 [V0] */
189
{0xD6F2BFCA, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sonic the Hedgehog 2 [V1] */
190
{0xCA1D3752, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Space Harrier [50 Hz] */
191
{0x85CFC9C9, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Taito Chase H.Q. */
192
{0x332A847D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* NBA Jam [Proto] */
193
194
/* games running in Game Gear MS compatibility mode */
195
{0x59840FD6, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Castle of Illusion - Starring Mickey Mouse [SMS-GG] */
196
{0x9C76FB3A, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Rastan Saga [SMS-GG] */
197
{0xC8381DEF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Taito Chase H.Q [SMS-GG] */
198
{0xDA8E95A9, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* WWF Wrestlemania Steel Cage Challenge [SMS-GG] */
199
{0x1D93246E, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Olympic Gold [A][SMS-GG] */
200
{0xA2F9C7AF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Olympic Gold [B][SMS-GG] */
201
{0x01EAB89D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Out Run Europa [SMS-GG] */
202
{0xF037EC00, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Out Run Europa (US) [SMS-GG] */
203
{0xE5F789B9, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Predator 2 [SMS-GG] */
204
{0x311D2863, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Prince of Persia [A][SMS-GG] */
205
{0x45F058D6, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Prince of Persia [B][SMS-GG] */
206
{0x56201996, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* R.C. Grand Prix [SMS-GG] */
207
{0x10DBBEF4, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Super Kick Off [SMS-GG] */
208
{0x9942B69B, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Castle of Illusion - Starring Mickey Mouse (J) [SMS-GG] */
209
{0x7BB81E3D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Taito Chase H.Q (J) [SMS-GG] */
210
{0x6F8E46CF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Alex Kidd in Miracle World (TW) [SMS-GG] */
211
{0x3382D73F, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Olympic Gold (TW) [SMS-GG] */
212
213
/* games requiring 3-D Glasses */
214
{0x6BD5C2BF, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Space Harrier 3-D */
215
{0x8ECD201C, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Blade Eagle 3-D */
216
{0xFBF96C81, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Blade Eagle 3-D (BR) */
217
{0x58D5FC48, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Blade Eagle 3-D [Proto] */
218
{0x31B8040B, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Maze Hunter 3-D */
219
{0xABD48AD2, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Poseidon Wars 3-D */
220
{0xA3EF13CB, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Zaxxon 3-D */
221
{0xBBA74147, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Zaxxon 3-D [Proto] */
222
{0xD6F43DDA, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Out Run 3-D */
223
{0x871562b0, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Maze Walker */
224
{0x156948f9, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Space Harrier 3-D (J) */
225
226
/* games requiring 3-D Glasses & Sega Light Phaser */
227
{0xFBE5CFBB, 1, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Missile Defense 3D */
228
{0xE79BB689, 1, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Missile Defense 3D [BIOS] */
229
230
/* games requiring Sega Light Phaser */
231
{0x861B6E79, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Assault City [Light Phaser] */
232
{0x5FC74D2A, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Gangster Town */
233
{0xE167A561, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Hang-On / Safari Hunt */
234
{0x91E93385, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Hang-On / Safari Hunt [BIOS] */
235
{0xE8EA842C, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Marksman Shooting / Trap Shooting */
236
{0xE8215C2E, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Marksman Shooting / Trap Shooting / Safari Hunt */
237
{0x205CAAE8, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Operation Wolf */
238
{0x23283F37, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Operation Wolf [A] */
239
{0xDA5A7013, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rambo 3 */
240
{0x79AC8E7F, 0, 1, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rescue Mission */
241
{0x4B051022, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shooting Gallery */
242
{0xA908CFF5, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Spacegun */
243
{0x5359762D, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Wanted */
244
{0x0CA95637, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Laser Ghost */
245
246
/* games requiring Sega Paddle */
247
{0xF9DBB533, 0, 1, SYSTEM_PADDLE, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Alex Kidd BMX Trial */
248
{0xA6FA42D0, 0, 1, SYSTEM_PADDLE, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Galactic Protector */
249
{0x29BC7FAD, 0, 1, SYSTEM_PADDLE, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Megumi Rescue */
250
{0x315917D4, 0, 0, SYSTEM_PADDLE, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Woody Pop */
251
252
/* games requiring Sega Sport Pad */
253
{0x0CB7E21F, 0, 0, SYSTEM_SPORTSPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Great Ice Hockey */
254
{0xE42E4998, 0, 0, SYSTEM_SPORTSPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Sports Pad Football */
255
{0x41C948BF, 0, 0, SYSTEM_SPORTSPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Sports Pad Soccer */
256
257
/* games supporting YM2413 FM */
258
{0x1C951F8E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* After Burner */
259
{0xC13896D5, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Alex Kidd: The Lost Stars */
260
{0x5CBFE997, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Alien Syndrome */
261
{0xBBA2FE98, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Altered Beast */
262
{0xFF614EB3, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Aztec Adventure */
263
{0x3084CF11, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Bomber Raid */
264
{0xAC6009A7, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* California Games */
265
{0xA4852757, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Captain Silver */
266
{0xB81F6FA5, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Captain Silver (U) */
267
{0x3CFF6E80, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Casino Games */
268
{0xE7F62E6D, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Cloud Master */
269
{0x908E7524, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Cyborg Hunter */
270
{0xA55D89F3, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Double Dragon */
271
{0xB8B141F9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Fantasy Zone II */
272
{0xD29889AD, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Fantasy Zone: The Maze */
273
{0xA4AC35D8, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Galaxy Force */
274
{0x6C827520, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Galaxy Force (U) */
275
{0x1890F407, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Game Box S�rie Esportes Radicais (BR) */
276
{0xB746A6F5, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Global Defense */
277
{0x91A0FC4E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Global Defense [Proto] */
278
{0x48651325, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golfamania */
279
{0x5DABFDC3, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golfamania [Proto] */
280
{0xA51376FE, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golvellius - Valley of Doom */
281
{0x98E4AE4A, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Great Golf */
282
{0x516ED32E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Kenseiden */
283
{0xE8511B08, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Lord of The Sword */
284
{0x0E333B6E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Miracle Warriors - Seal of The Dark Lord */
285
{0x301A59AA, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Miracle Warriors - Seal of The Dark Lord [Proto] */
286
{0x01D67C0B, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* M�nica no Castelo do Drag�o (BR) */
287
{0x5589D8D2, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Out Run */
288
{0xE030E66C, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Parlour Games */
289
{0xF97E9875, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Penguin Land */
290
{0x4077EFD9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Power Strike */
291
{0xBB54B6B0, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* R-Type */
292
{0x42FC47EE, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rampage */
293
{0xC547EB1B, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rastan */
294
{0x9A8B28EC, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Scramble Spirits */
295
{0xAAB67EC3, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shanghai */
296
{0x0C6FAC4E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shinobi */
297
{0x4752CAE7, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* SpellCaster */
298
{0x1A390B93, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Tennis Ace */
299
{0xAE920E4B, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Thunder Blade */
300
{0x51BD14BE, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Time Soldiers */
301
{0x22CCA9BB, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Turma da M�nica em: O Resgate (BR) */
302
{0xB52D60C8, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Ultima IV */
303
{0xDE9F8517, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Ultima IV [Proto] */
304
{0xDFB0B161, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Vigilante */
305
{0x679E1676, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Wonder Boy III: The Dragon's Trap */
306
{0x8CBEF0C1, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Wonder Boy in Monster Land */
307
{0x2F2E3BC9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Zillion II - The Tri Formation */
308
{0x48D44A13, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_NONE, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* BIOS (J) */
309
{0xD8C4165B, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Aleste */
310
{0x4CC11DF9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Alien Syndrome (J) */
311
{0xE421E466, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Chouon Senshi Borgman */
312
{0x2BCDB8FA, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Doki Doki Penguin Land - Uchuu-Daibouken */
313
{0x56BD2455, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Doki Doki Penguin Land - Uchuu-Daibouken [Proto] */
314
{0xC722FB42, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Fantasy Zone II (J) */
315
{0x7ABC70E9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Family Games (Party Games) */
316
{0x6586BD1F, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Masters Golf */
317
{0x4847BC91, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Masters Golf [Proto] */
318
{0xB9FDF6D9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Haja no Fuuin */
319
{0x955A009E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hoshi wo Sagashite */
320
{0x05EA5353, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Kenseiden (J) */
321
{0xD11D32E4, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Kujakuou */
322
{0xAA7D6F45, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Lord of Sword */
323
{0xBF0411AD, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Maou Golvellius */
324
{0x21A21352, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Maou Golvellius [Proto] */
325
{0x5B5F9106, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Nekyuu Kousien */
326
{0xBEA27D5C, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Opa Opa */
327
{0x6605D36A, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Phantasy Star (J) */
328
{0xE1FFF1BB, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Shinobi (J) */
329
{0x11645549, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Solomon no Kagi - Oujo Rihita no Namida */
330
{0x7E0EF8CB, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Racing */
331
{0xB1DA6A30, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Wonder Boy Monster World */
332
{0x8132AB2C, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Tensai Bakabon */
333
{0xC0CE19B1, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Thunder Blade (J) */
334
{0x07301F83, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_PBC, REGION_JAPAN_NTSC} /* Phantasy Star [Megadrive] (J) */
335
};
336
337
/* Cartridge & BIOS ROM hardware */
338
static romhw_t cart_rom;
339
static romhw_t bios_rom;
340
341
/* Current slot */
342
static struct
343
{
344
uint8 *rom;
345
uint8 *fcr;
346
uint8 mapper;
347
uint8 pages;
348
} slot;
349
350
/* Function prototypes */
351
static void mapper_reset(void);
352
static void mapper_8k_w(int offset, unsigned int data);
353
static void mapper_16k_w(int offset, unsigned int data);
354
static void write_mapper_none(unsigned int address, unsigned char data);
355
static void write_mapper_sega(unsigned int address, unsigned char data);
356
static void write_mapper_codies(unsigned int address, unsigned char data);
357
static void write_mapper_korea(unsigned int address, unsigned char data);
358
static void write_mapper_korea_8k(unsigned int address, unsigned char data);
359
static void write_mapper_korea_16k(unsigned int address, unsigned char data);
360
static void write_mapper_msx(unsigned int address, unsigned char data);
361
static void write_mapper_multi(unsigned int address, unsigned char data);
362
static void write_mapper_93c46(unsigned int address, unsigned char data);
363
static void write_mapper_terebi(unsigned int address, unsigned char data);
364
static unsigned char read_mapper_93c46(unsigned int address);
365
static unsigned char read_mapper_terebi(unsigned int address);
366
static unsigned char read_mapper_korea_8k(unsigned int address);
367
static unsigned char read_mapper_default(unsigned int address);
368
369
void sms_cart_init(void)
370
{
371
int i;
372
373
/* game CRC */
374
uint32 crc = crc32(0, cart.rom, cart.romsize);
375
376
/* use Master System controller by default */
377
uint8 device = SYSTEM_MS_GAMEPAD;
378
379
/* unmapped memory return $FF on read (mapped to unused cartridge areas $510000-$5103FF & $510400-$5107FF) */
380
memset(cart.rom + 0x510000, 0xFF, 0x800);
381
382
/* default cartridge ROM mapper */
383
cart_rom.mapper = (cart.romsize > 0xC000) ? MAPPER_SEGA : MAPPER_NONE;
384
385
/* disable 3-D Glasses by default */
386
cart.special = 0;
387
388
/* YM2413 chip in AUTO mode */
389
if (config.ym2413 & 2)
390
{
391
if ((system_hw & SYSTEM_SMS) && (region_code == REGION_JAPAN_NTSC))
392
{
393
/* japanese Master System has built-in FM chip */
394
config.ym2413 = 3;
395
}
396
else
397
{
398
/* by default, FM chip is disabled */
399
config.ym2413 = 2;
400
}
401
}
402
403
/* auto-detect game settings */
404
for (i=0; i<GAME_DATABASE_CNT; i++)
405
{
406
if (crc == game_list[i].crc)
407
{
408
/* auto-detect cartridge mapper */
409
cart_rom.mapper = game_list[i].mapper;
410
411
/* auto-detect required peripherals */
412
device = game_list[i].peripheral;
413
414
/* auto-detect 3D glasses support */
415
cart.special = game_list[i].g_3d;
416
417
/* auto-detect system hardware */
418
if (!config.system || ((config.system == SYSTEM_GG) && (game_list[i].system == SYSTEM_GGMS)))
419
{
420
system_hw = game_list[i].system;
421
}
422
423
/* auto-detect YM2413 chip support in AUTO mode */
424
if (config.ym2413 & 2)
425
{
426
config.ym2413 |= game_list[i].fm;
427
}
428
429
/* game found, leave loop */
430
i = GAME_DATABASE_CNT;
431
}
432
}
433
434
/* ROM paging */
435
if (cart_rom.mapper < MAPPER_SEGA)
436
{
437
/* 1k ROM banks */
438
cart_rom.pages = (cart.romsize + (1 << 10) - 1) >> 10;
439
}
440
else if (cart_rom.mapper & MAPPER_KOREA_8K)
441
{
442
/* 8k ROM banks */
443
cart_rom.pages = (cart.romsize + (1 << 13) - 1) >> 13;
444
}
445
else
446
{
447
/* 16k ROM banks */
448
cart_rom.pages = (cart.romsize + (1 << 14) - 1) >> 14;
449
}
450
451
/* initialize extra hardware */
452
if (cart_rom.mapper == MAPPER_93C46)
453
{
454
/* 93C46 eeprom */
455
eeprom_93c_init();
456
}
457
else if (cart_rom.mapper == MAPPER_TEREBI)
458
{
459
/* Terebi Oekaki tablet */
460
cart.special |= HW_TEREBI_OEKAKI;
461
}
462
463
/* initialize SRAM */
464
sram_init();
465
466
/* enable cartridge backup memory by default */
467
sram.on = 1;
468
469
/* save current settings */
470
if (old_system[0] == -1)
471
{
472
old_system[0] = input.system[0];
473
}
474
if (old_system[1] == -1)
475
{
476
old_system[1] = input.system[1];
477
}
478
479
/* force port A & port B configuration */
480
input.system[0] = device;
481
input.system[1] = SYSTEM_MS_GAMEPAD;
482
483
/* default gun offset */
484
input.x_offset = 20;
485
input.y_offset = 0;
486
487
/* SpaceGun & Gangster Town use different gun offset */
488
if ((crc == 0x5359762D) || (crc == 0x5FC74D2A))
489
{
490
input.x_offset = 16;
491
}
492
493
/* BIOS support */
494
if (config.bios & 1)
495
{
496
/* load BIOS file */
497
int bios_size = load_bios();
498
499
if (bios_size > 0xC000)
500
{
501
/* assume SEGA mapper if BIOS ROM is larger than 48k */
502
bios_rom.mapper = MAPPER_SEGA;
503
bios_rom.pages = bios_size >> 14;
504
}
505
else if (bios_size >= 0)
506
{
507
/* default BIOS ROM mapper */
508
bios_rom.mapper = MAPPER_NONE;
509
bios_rom.pages = bios_size >> 10;
510
}
511
512
/* unload cartridge if required & BIOS ROM is loaded */
513
if (!(config.bios & 2) && bios_rom.pages)
514
{
515
cart_rom.pages = 0;
516
}
517
}
518
else
519
{
520
/* mark Master System & Game Gear BIOS as unloaded */
521
system_bios &= ~(SYSTEM_SMS | SYSTEM_GG);
522
523
/* BIOS ROM is disabled */
524
bios_rom.pages = 0;
525
}
526
}
527
528
void sms_cart_reset(void)
529
{
530
/* reset BIOS ROM paging (SEGA mapper by default) */
531
bios_rom.fcr[0] = 0;
532
bios_rom.fcr[1] = 0;
533
bios_rom.fcr[2] = 1;
534
bios_rom.fcr[3] = 2;
535
536
/* reset cartridge ROM paging */
537
switch (cart_rom.mapper)
538
{
539
case MAPPER_SEGA:
540
case MAPPER_SEGA_X:
541
cart_rom.fcr[0] = 0;
542
cart_rom.fcr[1] = 0;
543
cart_rom.fcr[2] = 1;
544
cart_rom.fcr[3] = 2;
545
break;
546
547
case MAPPER_KOREA_8K:
548
case MAPPER_MSX:
549
case MAPPER_MSX_NEMESIS:
550
cart_rom.fcr[0] = 0;
551
cart_rom.fcr[1] = 0;
552
cart_rom.fcr[2] = 0;
553
cart_rom.fcr[3] = 0;
554
break;
555
556
default:
557
cart_rom.fcr[0] = 0;
558
cart_rom.fcr[1] = 0;
559
cart_rom.fcr[2] = 1;
560
cart_rom.fcr[3] = 0;
561
break;
562
}
563
564
/* check if BIOS is larger than 1k */
565
if (bios_rom.pages > 1)
566
{
567
/* enable BIOS ROM */
568
slot.rom = cart.rom + 0x400000;
569
slot.fcr = bios_rom.fcr;
570
slot.mapper = bios_rom.mapper;
571
slot.pages = bios_rom.pages;
572
}
573
else
574
{
575
/* enable cartridge ROM */
576
slot.rom = cart.rom;
577
slot.fcr = cart_rom.fcr;
578
slot.mapper = cart_rom.mapper;
579
slot.pages = cart_rom.pages;
580
581
/* force Memory Control register value in RAM (usually set by Master System BIOS) */
582
if (system_hw & SYSTEM_SMS)
583
{
584
work_ram[0] = 0xA8;
585
}
586
}
587
588
/* reset Memory Control register (RAM & I/O are enabled, either BIOS or Cartridge ROM are enabled) */
589
io_reg[0x0E] = bios_rom.pages ? 0xE0 : 0xA8;
590
591
/* reset Z80 memory map */
592
mapper_reset();
593
594
/* 1k BIOS special case (Majesco GG) */
595
if (bios_rom.pages == 1)
596
{
597
/* BIOS ROM is mapped to $0000-$03FF */
598
z80_readmap[0] = cart.rom + 0x400000;
599
}
600
}
601
602
void sms_cart_switch(uint8 mode)
603
{
604
/* by default, disable cartridge & BIOS ROM */
605
slot.pages = 0;
606
607
/* cartridge ROM enabled ? */
608
if (mode & 0x40)
609
{
610
/* check if cartridge is loaded */
611
if (cart_rom.pages)
612
{
613
/* map cartridge ROM */
614
slot.rom = cart.rom;
615
slot.fcr = cart_rom.fcr;
616
slot.mapper = cart_rom.mapper;
617
slot.pages = cart_rom.pages;
618
}
619
}
620
else
621
{
622
/* BIOS ROM enabled ? */
623
if (mode & 0x08)
624
{
625
/* check if BIOS ROM is larger than 1K */
626
if (bios_rom.pages > 1)
627
{
628
/* map BIOS ROM */
629
slot.rom = cart.rom + 0x400000;
630
slot.fcr = bios_rom.fcr;
631
slot.mapper = bios_rom.mapper;
632
slot.pages = bios_rom.pages;
633
}
634
else
635
{
636
/* by default, map cartridge ROM */
637
slot.rom = cart.rom;
638
slot.fcr = cart_rom.fcr;
639
slot.mapper = cart_rom.mapper;
640
slot.pages = cart_rom.pages;
641
}
642
}
643
644
/* assume only BIOS would disable cartridge slot */
645
if (!bios_rom.pages)
646
{
647
/* max. BIOS ROM size supported is 1MB */
648
if (cart.romsize <= 0x100000)
649
{
650
/* copy to BIOS ROM */
651
memcpy(cart.rom + 0x400000, cart.rom, cart.romsize);
652
memcpy(bios_rom.fcr, cart_rom.fcr, 4);
653
bios_rom.mapper = cart_rom.mapper;
654
bios_rom.pages = cart_rom.pages;
655
656
/* unload cartridge */
657
cart_rom.pages = 0;
658
}
659
}
660
}
661
662
/* reset Z80 memory map */
663
mapper_reset();
664
665
/* 1k BIOS special case (Majesco GG) */
666
if ((bios_rom.pages == 1) && ((mode & 0x48) == 0x08))
667
{
668
/* BIOS ROM is mapped to $0000-$03FF */
669
z80_readmap[0] = cart.rom + 0x400000;
670
}
671
}
672
673
int sms_cart_region_detect(void)
674
{
675
int i;
676
677
/* compute CRC */
678
uint32 crc = crc32(0, cart.rom, cart.romsize);
679
680
/* Turma da M�nica em: O Resgate & Wonder Boy III enable FM support on japanese hardware only */
681
if (config.ym2413 && ((crc == 0x22CCA9BB) || (crc == 0x679E1676)))
682
{
683
return REGION_JAPAN_NTSC;
684
}
685
686
/* game database */
687
for (i=0; i<GAME_DATABASE_CNT; i++)
688
{
689
if (crc == game_list[i].crc)
690
{
691
return game_list[i].region;
692
}
693
}
694
695
/* Mark-III hardware */
696
if (system_hw == SYSTEM_MARKIII)
697
{
698
/* Japan */
699
return REGION_JAPAN_NTSC;
700
}
701
702
/* default region */
703
return REGION_USA;
704
}
705
706
int sms_cart_context_save(uint8 *state)
707
{
708
int bufferptr = 0;
709
save_param(slot.fcr, 4);
710
return bufferptr;
711
}
712
713
int sms_cart_context_load(uint8 *state)
714
{
715
int bufferptr = 0;
716
load_param(slot.fcr, 4);
717
return bufferptr;
718
}
719
720
static void mapper_reset(void)
721
{
722
int i;
723
724
/* reset internal RAM mapping */
725
if (system_hw == SYSTEM_SG)
726
{
727
/* 8k RAM extension adapter (type B) */
728
if (cart_rom.mapper == MAPPER_RAM_8K_EXT2)
729
{
730
/* $C000-$FFFF mapped to 8k external RAM (mirrored) */
731
for (i = 0x30; i < 0x40; i++)
732
{
733
z80_readmap[i] = z80_writemap[i] = &work_ram[(i & 0x07) << 10];
734
}
735
}
736
737
/* Othello Multivision hardware */
738
else if (cart_rom.mapper == MAPPER_OMV)
739
{
740
/* $C000-$FFFF mapped to 2k internal RAM (mirrored) */
741
for (i = 0x30; i < 0x40; i++)
742
{
743
z80_readmap[i] = z80_writemap[i] = &work_ram[(i & 0x01) << 10];
744
}
745
}
746
747
/* default SG-1000 hardware */
748
else
749
{
750
/* $C000-$FFFF mapped to 1k internal RAM (mirrored) */
751
for (i = 0x30; i < 0x40; i++)
752
{
753
z80_readmap[i] = z80_writemap[i] = &work_ram[0];
754
}
755
}
756
}
757
else
758
{
759
/* Master System / Game Gear hardware: $C000-$FFFF mapped to 8k internal RAM (mirrored) */
760
for (i = 0x30; i < 0x40; i++)
761
{
762
z80_readmap[i] = z80_writemap[i] = &work_ram[(i & 0x07) << 10];
763
}
764
}
765
766
/* check if ROM is disabled */
767
if (!slot.pages)
768
{
769
/* $0000-$BFFF mapped to unused cartridge areas */
770
for(i = 0x00; i < 0x30; i++)
771
{
772
z80_writemap[i] = cart.rom + 0x510000;
773
z80_readmap[i] = cart.rom + 0x510400;
774
}
775
776
/* set default Z80 memory handlers */
777
z80_readmem = read_mapper_default;
778
z80_writemem = write_mapper_none;
779
return;
780
}
781
782
/* by default, $0000-$BFFF is mapped to ROM (first 48k) */
783
for (i = 0x00; i < 0x30; i++)
784
{
785
z80_readmap[i] = &slot.rom[i << 10];
786
z80_writemap[i] = cart.rom + 0x510000; /* unused area */
787
}
788
789
/* reset cartridge hardware mapping */
790
if (slot.mapper < MAPPER_SEGA)
791
{
792
/* cartridge extra RAM enabled by default with 32K ROM (The Castle) */
793
if (slot.pages <= 0x20)
794
{
795
/* $8000-$BFFF mapped to 8k external RAM (mirrored) */
796
for (i = 0x20; i < 0x30; i++)
797
{
798
z80_readmap[i] = z80_writemap[i] = &work_ram[0x2000 + ((i & 0x07) << 10)];
799
}
800
}
801
802
/* 8k RAM extension adapter (type A) */
803
if (slot.mapper == MAPPER_RAM_8K_EXT1)
804
{
805
/* $2000-$3FFF mapped to 8k external RAM */
806
for (i = 0x08; i < 0x10; i++)
807
{
808
z80_readmap[i] = z80_writemap[i] = &work_ram[0x2000 + ((i & 0x07) << 10)];
809
}
810
}
811
}
812
else
813
{
814
/* reset ROM paging hardware */
815
if (slot.mapper & MAPPER_KOREA_8K)
816
{
817
/* 8k pages */
818
mapper_8k_w(0,slot.fcr[0]);
819
mapper_8k_w(1,slot.fcr[1]);
820
mapper_8k_w(2,slot.fcr[2]);
821
mapper_8k_w(3,slot.fcr[3]);
822
823
/* "Nemesis" mapper specific */
824
if (slot.mapper == MAPPER_MSX_NEMESIS)
825
{
826
/* first 8k page is mapped to last 8k ROM bank */
827
for (i = 0x00; i < 0x08; i++)
828
{
829
z80_readmap[i] = &slot.rom[(0x0f << 13) | ((i & 0x07) << 10)];
830
}
831
}
832
}
833
else
834
{
835
/* 16k pages */
836
mapper_16k_w(0,slot.fcr[0]);
837
mapper_16k_w(1,slot.fcr[1]);
838
mapper_16k_w(2,slot.fcr[2]);
839
mapper_16k_w(3,slot.fcr[3]);
840
}
841
}
842
843
/* reset Z80 memory handlers */
844
switch (slot.mapper)
845
{
846
case MAPPER_NONE:
847
case MAPPER_RAM_8K_EXT1:
848
case MAPPER_RAM_8K_EXT2:
849
z80_readmem = read_mapper_default;
850
z80_writemem = write_mapper_none;
851
break;
852
853
case MAPPER_CODIES:
854
z80_readmem = read_mapper_default;
855
z80_writemem = write_mapper_codies;
856
break;
857
858
case MAPPER_KOREA:
859
z80_readmem = read_mapper_default;
860
z80_writemem = write_mapper_korea;
861
break;
862
863
case MAPPER_KOREA_8K:
864
z80_readmem = read_mapper_korea_8k;
865
z80_writemem = write_mapper_korea_8k;
866
break;
867
868
case MAPPER_KOREA_16K:
869
z80_readmem = read_mapper_default;
870
z80_writemem = write_mapper_korea_16k;
871
break;
872
873
case MAPPER_MSX:
874
case MAPPER_MSX_NEMESIS:
875
z80_readmem = read_mapper_default;
876
z80_writemem = write_mapper_msx;
877
break;
878
879
case MAPPER_MULTI:
880
z80_readmem = read_mapper_default;
881
z80_writemem = write_mapper_multi;
882
break;
883
884
case MAPPER_93C46:
885
z80_readmem = read_mapper_93c46;
886
z80_writemem = write_mapper_93c46;
887
break;
888
889
case MAPPER_TEREBI:
890
z80_readmem = read_mapper_terebi;
891
z80_writemem = write_mapper_terebi;
892
break;
893
894
default:
895
z80_readmem = read_mapper_default;
896
z80_writemem = write_mapper_sega;
897
break;
898
}
899
}
900
901
static void mapper_8k_w(int offset, unsigned int data)
902
{
903
int i;
904
905
/* cartridge ROM page (8k) */
906
uint8 page = data % slot.pages;
907
908
/* Save frame control register data */
909
slot.fcr[offset] = data;
910
911
/* 4 x 8k banks */
912
switch (offset & 3)
913
{
914
case 0: /* cartridge ROM bank (8k) at $8000-$9FFF */
915
{
916
for (i = 0x20; i < 0x28; i++)
917
{
918
z80_readmap[i] = &slot.rom[(page << 13) | ((i & 0x07) << 10)];
919
}
920
break;
921
}
922
923
case 1: /* cartridge ROM bank (8k) at $A000-$BFFF */
924
{
925
for (i = 0x28; i < 0x30; i++)
926
{
927
z80_readmap[i] = &slot.rom[(page << 13) | ((i & 0x07) << 10)];
928
}
929
break;
930
}
931
932
case 2: /* cartridge ROM bank (8k) at $4000-$5FFF */
933
{
934
for (i = 0x10; i < 0x18; i++)
935
{
936
z80_readmap[i] = &slot.rom[(page << 13) | ((i & 0x07) << 10)];
937
}
938
break;
939
}
940
941
case 3: /* cartridge ROM bank (8k) at $6000-$7FFF */
942
{
943
for (i = 0x18; i < 0x20; i++)
944
{
945
z80_readmap[i] = &slot.rom[(page << 13) | ((i & 0x07) << 10)];
946
}
947
break;
948
}
949
}
950
951
#ifdef CHEATS_UPDATE
952
/* update ROM patches when banking has changed */
953
CHEATS_UPDATE();
954
#endif
955
}
956
957
static void mapper_16k_w(int offset, unsigned int data)
958
{
959
int i;
960
961
/* cartridge ROM page (16k) */
962
uint8 page = data % slot.pages;
963
964
/* page index increment (SEGA mapper only) */
965
if ((slot.fcr[0] & 0x03) && (slot.mapper == MAPPER_SEGA))
966
{
967
page = (page + ((4 - (slot.fcr[0] & 0x03)) << 3)) % slot.pages;
968
}
969
970
/* save frame control register data */
971
slot.fcr[offset] = data;
972
973
switch (offset)
974
{
975
case 0: /* control register (SEGA mapper only) */
976
{
977
if (data & 0x08)
978
{
979
/* external RAM (upper or lower 16K) mapped at $8000-$BFFF */
980
for (i = 0x20; i < 0x30; i++)
981
{
982
z80_readmap[i] = z80_writemap[i] = &sram.sram[((data & 0x04) << 12) + ((i & 0x0F) << 10)];
983
}
984
}
985
else
986
{
987
/* cartridge ROM page (16k) */
988
page = slot.fcr[3] % slot.pages;
989
990
/* page index increment (SEGA mapper) */
991
if ((data & 0x03) && (slot.mapper == MAPPER_SEGA))
992
{
993
page = (page + ((4 - (data & 0x03)) << 3)) % slot.pages;
994
}
995
996
/* cartridge ROM mapped at $8000-$BFFF */
997
for (i = 0x20; i < 0x30; i++)
998
{
999
z80_readmap[i] = &slot.rom[(page << 14) | ((i & 0x0F) << 10)];
1000
z80_writemap[i] = cart.rom + 0x510000; /* unused area */
1001
}
1002
}
1003
1004
if (data & 0x10)
1005
{
1006
/* external RAM (lower 16K) mapped at $C000-$FFFF */
1007
for (i = 0x30; i < 0x40; i++)
1008
{
1009
z80_readmap[i] = z80_writemap[i] = &sram.sram[(i & 0x0F) << 10];
1010
}
1011
}
1012
else
1013
{
1014
/* internal RAM (8K mirrorred) mapped at $C000-$FFFF */
1015
for (i = 0x30; i < 0x40; i++)
1016
{
1017
z80_readmap[i] = z80_writemap[i] = &work_ram[(i & 0x07) << 10];
1018
}
1019
}
1020
break;
1021
}
1022
1023
case 1: /* cartridge ROM bank (16k) at $0000-$3FFF */
1024
{
1025
/* first 1k is not fixed (CODEMASTER or MULTI mappers only) */
1026
if ((slot.mapper == MAPPER_CODIES) || (slot.mapper == MAPPER_MULTI))
1027
{
1028
z80_readmap[0] = &slot.rom[(page << 14)];
1029
}
1030
1031
for (i = 0x01; i < 0x10; i++)
1032
{
1033
z80_readmap[i] = &slot.rom[(page << 14) | ((i & 0x0F) << 10)];
1034
}
1035
break;
1036
}
1037
1038
case 2: /* cartridge ROM bank (16k) at $4000-$7FFF */
1039
{
1040
for (i = 0x10; i < 0x20; i++)
1041
{
1042
z80_readmap[i] = &slot.rom[(page << 14) | ((i & 0x0F) << 10)];
1043
}
1044
1045
/* cartridge RAM switch (CODEMASTER mapper only, see Ernie Elf's Golf) */
1046
if (slot.mapper == MAPPER_CODIES)
1047
{
1048
if (data & 0x80)
1049
{
1050
/* external RAM (8k) mapped at $A000-$BFFF */
1051
for (i = 0x28; i < 0x30; i++)
1052
{
1053
z80_readmap[i] = z80_writemap[i] = &sram.sram[(i & 0x0F) << 10];
1054
}
1055
}
1056
else
1057
{
1058
/* cartridge ROM page (16k) */
1059
page = slot.fcr[3] % slot.pages;
1060
1061
/* cartridge ROM mapped at $A000-$BFFF */
1062
for (i = 0x28; i < 0x30; i++)
1063
{
1064
z80_readmap[i] = &slot.rom[(page << 14) | ((i & 0x0F) << 10)];
1065
z80_writemap[i] = cart.rom + 0x510000; /* unused area */
1066
}
1067
}
1068
}
1069
break;
1070
}
1071
1072
case 3: /* cartridge ROM bank (16k) at $8000-$BFFF */
1073
{
1074
/* check that external RAM (16k) is not mapped at $8000-$BFFF (SEGA mapper only) */
1075
if ((slot.fcr[0] & 0x08)) break;
1076
1077
/* first 8k */
1078
for (i = 0x20; i < 0x28; i++)
1079
{
1080
z80_readmap[i] = &slot.rom[(page << 14) | ((i & 0x0F) << 10)];
1081
}
1082
1083
/* check that cartridge RAM (8k) is not mapped at $A000-$BFFF (CODEMASTER mapper only) */
1084
if ((slot.mapper == MAPPER_CODIES) && (slot.fcr[2] & 0x80)) break;
1085
1086
/* last 8k */
1087
for (i = 0x28; i < 0x30; i++)
1088
{
1089
z80_readmap[i] = &slot.rom[(page << 14) | ((i & 0x0F) << 10)];
1090
}
1091
break;
1092
}
1093
}
1094
1095
#ifdef CHEATS_UPDATE
1096
/* update ROM patches when banking has changed */
1097
CHEATS_UPDATE();
1098
#endif
1099
}
1100
1101
static void write_mapper_none(unsigned int address, unsigned char data)
1102
{
1103
z80_writemap[address >> 10][address & 0x03FF] = data;
1104
}
1105
1106
static void write_mapper_sega(unsigned int address, unsigned char data)
1107
{
1108
if (address >= 0xFFFC)
1109
{
1110
mapper_16k_w(address & 3, data);
1111
}
1112
1113
z80_writemap[address >> 10][address & 0x03FF] = data;
1114
}
1115
1116
static void write_mapper_codies(unsigned int address, unsigned char data)
1117
{
1118
if (address == 0x0000)
1119
{
1120
mapper_16k_w(1,data);
1121
return;
1122
}
1123
1124
if (address == 0x4000)
1125
{
1126
mapper_16k_w(2,data);
1127
return;
1128
}
1129
1130
if (address == 0x8000)
1131
{
1132
mapper_16k_w(3,data);
1133
return;
1134
}
1135
1136
z80_writemap[address >> 10][address & 0x03FF] = data;
1137
}
1138
1139
static void write_mapper_multi(unsigned int address, unsigned char data)
1140
{
1141
if (address == 0x3FFE)
1142
{
1143
mapper_16k_w(1,data);
1144
return;
1145
}
1146
1147
if (address == 0x7FFF)
1148
{
1149
mapper_16k_w(2,data);
1150
return;
1151
}
1152
1153
if (address == 0xBFFF)
1154
{
1155
mapper_16k_w(3,(slot.fcr[1] & 0x30) + data);
1156
return;
1157
}
1158
1159
z80_writemap[address >> 10][address & 0x03FF] = data;
1160
}
1161
1162
static void write_mapper_korea(unsigned int address, unsigned char data)
1163
{
1164
if (address == 0xA000)
1165
{
1166
mapper_16k_w(3,data);
1167
return;
1168
}
1169
1170
z80_writemap[address >> 10][address & 0x03FF] = data;
1171
}
1172
1173
static void write_mapper_msx(unsigned int address, unsigned char data)
1174
{
1175
if (address <= 0x0003)
1176
{
1177
mapper_8k_w(address,data);
1178
return;
1179
}
1180
1181
z80_writemap[address >> 10][address & 0x03FF] = data;
1182
}
1183
1184
static void write_mapper_korea_8k(unsigned int address, unsigned char data)
1185
{
1186
if (address == 0x4000)
1187
{
1188
mapper_8k_w(2,data);
1189
return;
1190
}
1191
1192
if (address == 0x6000)
1193
{
1194
mapper_8k_w(3,data);
1195
return;
1196
}
1197
1198
if (address == 0x8000)
1199
{
1200
mapper_8k_w(0,data);
1201
return;
1202
}
1203
1204
if (address == 0xA000)
1205
{
1206
mapper_8k_w(1,data);
1207
return;
1208
}
1209
1210
if (address == 0xFFFE)
1211
{
1212
mapper_8k_w(2,(data << 1) & 0xFF);
1213
mapper_8k_w(3,(1 + (data << 1)) & 0xFF);
1214
}
1215
else if (address == 0xFFFF)
1216
{
1217
mapper_8k_w(0,(data << 1) & 0xFF);
1218
mapper_8k_w(1,(1 + (data << 1)) & 0xFF);
1219
}
1220
1221
z80_writemap[address >> 10][address & 0x03FF] = data;
1222
}
1223
1224
static void write_mapper_korea_16k(unsigned int address, unsigned char data)
1225
{
1226
if (address == 0x4000)
1227
{
1228
mapper_16k_w(2,data);
1229
return;
1230
}
1231
1232
if (address == 0x8000)
1233
{
1234
mapper_16k_w(3,data);
1235
return;
1236
}
1237
1238
/* SEGA mapper compatibility */
1239
if (address >= 0xFFFC)
1240
{
1241
mapper_16k_w(address & 3, data);
1242
}
1243
1244
z80_writemap[address >> 10][address & 0x03FF] = data;
1245
}
1246
1247
static void write_mapper_93c46(unsigned int address, unsigned char data)
1248
{
1249
/* EEPROM serial input */
1250
if ((address == 0x8000) && eeprom_93c.enabled)
1251
{
1252
eeprom_93c_write(data);
1253
return;
1254
}
1255
1256
/* EEPROM ctrl */
1257
if (address == 0xFFFC)
1258
{
1259
/* enable/disable EEPROM */
1260
eeprom_93c.enabled = data & 0x08;
1261
1262
if (data & 0x80)
1263
{
1264
/* reset EEPROM */
1265
eeprom_93c_init();
1266
}
1267
}
1268
1269
/* SEGA mapper compatibility */
1270
if (address > 0xFFFC)
1271
{
1272
mapper_16k_w(address & 3, data);
1273
}
1274
1275
z80_writemap[address >> 10][address & 0x03FF] = data;
1276
}
1277
1278
static void write_mapper_terebi(unsigned int address, unsigned char data)
1279
{
1280
if (address == 0x6000)
1281
{
1282
terebi_oekaki_write(data);
1283
return;
1284
}
1285
1286
z80_writemap[address >> 10][address & 0x03FF] = data;
1287
}
1288
1289
static unsigned char read_mapper_93c46(unsigned int address)
1290
{
1291
if ((address == 0x8000) && eeprom_93c.enabled)
1292
{
1293
return eeprom_93c_read();
1294
}
1295
1296
return z80_readmap[address >> 10][address & 0x03FF];
1297
}
1298
1299
static unsigned char read_mapper_terebi(unsigned int address)
1300
{
1301
if (address == 0x8000)
1302
{
1303
return (terebi_oekaki_read() >> 8);
1304
}
1305
1306
if (address == 0xA000)
1307
{
1308
return (terebi_oekaki_read() & 0xFF);
1309
}
1310
1311
return z80_readmap[address >> 10][address & 0x03FF];
1312
}
1313
1314
static unsigned char read_mapper_korea_8k(unsigned int address)
1315
{
1316
unsigned char data = z80_readmap[address >> 10][address & 0x03FF];
1317
1318
/* 16k page */
1319
unsigned char page = address >> 14;
1320
1321
/* $4000-$7FFFF and $8000-$BFFF area are protected */
1322
if (((page == 1) && (slot.fcr[2] & 0x80)) || ((page == 2) && (slot.fcr[0] & 0x80)))
1323
{
1324
/* bit-swapped value */
1325
data = (((data >> 7) & 0x01) | ((data >> 5) & 0x02) |
1326
((data >> 3) & 0x04) | ((data >> 1) & 0x08) |
1327
((data << 1) & 0x10) | ((data << 3) & 0x20) |
1328
((data << 5) & 0x40) | ((data << 7) & 0x80));
1329
}
1330
1331
return data;
1332
}
1333
1334
static unsigned char read_mapper_default(unsigned int address)
1335
{
1336
return z80_readmap[address >> 10][address & 0x03FF];
1337
}
1338
1339