Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/genplus-gx32/core/cd_hw/cd_cart.c
2 views
1
/***************************************************************************************
2
* Genesis Plus
3
* CD compatible ROM/RAM cartridge support
4
*
5
* Copyright (C) 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
41
42
/*--------------------------------------------------------------------------*/
43
/* backup RAM cartridge (max. 512KB) */
44
/*--------------------------------------------------------------------------*/
45
static unsigned int cart_ram_read_byte(unsigned int address)
46
{
47
/* LSB only */
48
if (address & 1)
49
{
50
return scd.cartridge.area[(address >> 1) & scd.cartridge.mask];
51
}
52
53
return 0xff;
54
}
55
56
static unsigned int cart_ram_read_word(unsigned int address)
57
{
58
return (scd.cartridge.area[(address >> 1) & scd.cartridge.mask] | 0xff00);
59
}
60
61
static void cart_ram_write_byte(unsigned int address, unsigned int data)
62
{
63
/* LSB only */
64
if (address & 1)
65
{
66
scd.cartridge.area[(address >> 1) & scd.cartridge.mask] = data;
67
}
68
}
69
70
static void cart_ram_write_word(unsigned int address, unsigned int data)
71
{
72
scd.cartridge.area[(address >> 1) & scd.cartridge.mask] = data & 0xff;
73
}
74
75
76
/*--------------------------------------------------------------------------*/
77
/* backup RAM cartridge ID */
78
/*--------------------------------------------------------------------------*/
79
80
static unsigned int cart_id_read_byte(unsigned int address)
81
{
82
/* LSB only */
83
if (address & 1)
84
{
85
return scd.cartridge.id;
86
}
87
88
return 0xff;
89
}
90
91
static unsigned int cart_id_read_word(unsigned int address)
92
{
93
return (scd.cartridge.id | 0xff00);
94
}
95
96
97
/*--------------------------------------------------------------------------*/
98
/* backup RAM cartridge write protection */
99
/*--------------------------------------------------------------------------*/
100
101
static unsigned int cart_prot_read_byte(unsigned int address)
102
{
103
/* LSB only */
104
if (address & 1)
105
{
106
return scd.cartridge.prot;
107
}
108
109
return 0xff;
110
}
111
112
static unsigned int cart_prot_read_word(unsigned int address)
113
{
114
return (scd.cartridge.prot | 0xff00);
115
}
116
117
static void cart_prot_write_byte(unsigned int address, unsigned int data)
118
{
119
/* LSB only */
120
if (address & 1)
121
{
122
int i;
123
124
if (data & 1)
125
{
126
/* cartridge is write enabled */
127
for (i=0x60; i<0x70; i++)
128
{
129
m68k.memory_map[i].write8 = cart_ram_write_byte;
130
m68k.memory_map[i].write16 = cart_ram_write_word;
131
zbank_memory_map[i].write = cart_ram_write_byte;
132
}
133
}
134
else
135
{
136
/* cartridge is write protected */
137
for (i=0x60; i<0x70; i++)
138
{
139
m68k.memory_map[i].write8 = m68k_unused_8_w;
140
m68k.memory_map[i].write16 = m68k_unused_16_w;
141
zbank_memory_map[i].write = zbank_unused_w;
142
}
143
}
144
145
scd.cartridge.prot = data;
146
}
147
}
148
149
static void cart_prot_write_word(unsigned int address, unsigned int data)
150
{
151
int i;
152
153
if (data & 1)
154
{
155
/* cartridge is write enabled */
156
for (i=0x60; i<0x70; i++)
157
{
158
m68k.memory_map[i].write8 = cart_ram_write_byte;
159
m68k.memory_map[i].write16 = cart_ram_write_word;
160
zbank_memory_map[i].write = cart_ram_write_byte;
161
}
162
}
163
else
164
{
165
/* cartridge is write protected */
166
for (i=0x60; i<0x70; i++)
167
{
168
m68k.memory_map[i].write8 = m68k_unused_8_w;
169
m68k.memory_map[i].write16 = m68k_unused_16_w;
170
zbank_memory_map[i].write = zbank_unused_w;
171
}
172
}
173
174
scd.cartridge.prot = data & 0xff;
175
}
176
177
/*--------------------------------------------------------------------------*/
178
/* ROM/RAM cartridge initialization */
179
/*--------------------------------------------------------------------------*/
180
void cd_cart_init(void)
181
{
182
int i;
183
184
/* System boot mode */
185
if (scd.cartridge.boot)
186
{
187
/* disable backup RAM cartridge when booting from cartridge (Mode 1) */
188
scd.cartridge.id = 0;
189
}
190
else
191
{
192
/* enable 512K backup RAM cartridge when booting from CD (Mode 2) */
193
//scd.cartridge.id = 6;
194
//scd.cartridge.id = 4; // use 128K instead, which is the size of a real ebram cart
195
// bizhawk doesn't need the extra space because it gives each game its own anyway
196
scd.cartridge.id = 1; // 16K to be size-frugal
197
}
198
199
/* RAM cartridge enabled ? */
200
if (scd.cartridge.id)
201
{
202
/* disable cartridge backup memory */
203
memset(&sram, 0, sizeof (T_SRAM));
204
205
/* clear backup RAM */
206
memset(scd.cartridge.area, 0x00, sizeof(scd.cartridge.area));
207
208
/* backup RAM size mask */
209
scd.cartridge.mask = (1 << (scd.cartridge.id + 13)) - 1;
210
211
/* enable RAM cartridge write access */
212
scd.cartridge.prot = 1;
213
214
/* RAM cartridge ID register (read-only) */
215
for (i=0x40; i<0x60; i++)
216
{
217
m68k.memory_map[i].base = NULL;
218
m68k.memory_map[i].read8 = cart_id_read_byte;
219
m68k.memory_map[i].read16 = cart_id_read_word;
220
m68k.memory_map[i].write8 = m68k_unused_8_w;
221
m68k.memory_map[i].write16 = m68k_unused_16_w;
222
zbank_memory_map[i].read = cart_id_read_byte;
223
zbank_memory_map[i].write = zbank_unused_w;
224
}
225
226
/* RAM cartridge memory */
227
for (i=0x60; i<0x70; i++)
228
{
229
m68k.memory_map[i].base = NULL;
230
m68k.memory_map[i].read8 = cart_ram_read_byte;
231
m68k.memory_map[i].read16 = cart_ram_read_word;
232
m68k.memory_map[i].write8 = cart_ram_write_byte;
233
m68k.memory_map[i].write16 = cart_ram_write_word;
234
zbank_memory_map[i].read = cart_ram_read_byte;
235
zbank_memory_map[i].write = cart_ram_write_byte;
236
}
237
238
/* RAM cartridge write protection register */
239
for (i=0x70; i<0x80; i++)
240
{
241
m68k.memory_map[i].base = NULL;
242
m68k.memory_map[i].read8 = cart_prot_read_byte;
243
m68k.memory_map[i].read16 = cart_prot_read_word;
244
m68k.memory_map[i].write8 = cart_prot_write_byte;
245
m68k.memory_map[i].write16 = cart_prot_write_word;
246
zbank_memory_map[i].read = cart_prot_read_byte;
247
zbank_memory_map[i].write = cart_prot_write_byte;
248
}
249
}
250
else
251
{
252
/* initialize ROM cartridge */
253
md_cart_init();
254
255
/* when booting from CD, cartridge is mapped to $400000-$7FFFFF */
256
if (!scd.cartridge.boot)
257
{
258
for (i=0; i<0x40; i++)
259
{
260
m68k.memory_map[i+0x40].base = m68k.memory_map[i].base;
261
m68k.memory_map[i+0x40].read8 = m68k.memory_map[i].read8;
262
m68k.memory_map[i+0x40].read16 = m68k.memory_map[i].read16;
263
m68k.memory_map[i+0x40].write8 = m68k.memory_map[i].write8;
264
m68k.memory_map[i+0x40].write16 = m68k.memory_map[i].write16;
265
zbank_memory_map[i+0x40].read = zbank_memory_map[i].read;
266
zbank_memory_map[i+0x40].write = zbank_memory_map[i].write;
267
}
268
}
269
}
270
}
271
272