1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
#ifndef __NES_SLOT_H__
#define __NES_SLOT_H__
#include "includes/nes_mmc.h"
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
// ======================> nes_cart_interface
struct nes_cart_interface
{
};
// ======================> device_nes_cart_interface
class device_nes_cart_interface : public device_slot_card_interface
{
public:
// construction/destruction
device_nes_cart_interface(const machine_config &mconfig, device_t &device);
virtual ~device_nes_cart_interface();
// reading and writing
virtual DECLARE_READ8_MEMBER(read_l) { return 0xff; }
virtual DECLARE_READ8_MEMBER(read_m) { return 0xff; }
virtual DECLARE_READ8_MEMBER(read_h) { return 0xff; }
virtual DECLARE_WRITE8_MEMBER(write_l) { }
virtual DECLARE_WRITE8_MEMBER(write_m) { }
virtual DECLARE_WRITE8_MEMBER(write_h) { }
virtual void prg_alloc(running_machine &machine, size_t size);
virtual void prgram_alloc(running_machine &machine, size_t size);
virtual void vrom_alloc(running_machine &machine, size_t size);
virtual void vram_alloc(running_machine &machine, size_t size);
virtual void battery_alloc(running_machine &machine, size_t size);
virtual void mapper_ram_alloc(running_machine &machine, size_t size);
virtual void mapper_bram_alloc(running_machine &machine, size_t size);
virtual int get_mirroring() { return m_mirroring; }
virtual void set_mirroring(int val) { m_mirroring = val; }
virtual int get_four_screen_vram() { return m_four_screen_vram; }
virtual void set_four_screen_vram(int val) { m_four_screen_vram = val; }
virtual UINT8* get_prg_base() { return m_prg; }
virtual UINT8* get_prgram_base() { return m_prgram; }
virtual UINT8* get_vrom_base() { return m_vrom; }
virtual UINT8* get_vram_base() { return m_vram; }
virtual UINT8* get_battery_base() { return m_battery; }
virtual UINT8* get_mapper_ram_base() { return m_mapper_ram; }
virtual UINT8* get_mapper_bram_base() { return m_mapper_bram; }
virtual UINT32 get_prg_size() { return m_prg_size; }
virtual UINT32 get_prgram_size() { return m_prgram_size; }
virtual UINT32 get_vrom_size() { return m_vrom_size; }
virtual UINT32 get_vram_size() { return m_vram_size; }
virtual UINT32 get_battery_size() { return m_battery_size; }
virtual UINT32 get_mapper_ram_size() { return m_mapper_ram_size; }
virtual UINT32 get_mapper_bram_size() { return m_mapper_bram_size; }
//private:
// internal state
UINT8 *m_prg;
UINT8 *m_prgram;
UINT8 *m_vrom;
UINT8 *m_vram;
UINT8 *m_battery;
UINT8 *m_mapper_ram;
UINT8 *m_mapper_bram;
UINT32 m_prg_size;
UINT32 m_prgram_size;
UINT32 m_vrom_size;
UINT32 m_vram_size;
UINT32 m_battery_size;
UINT32 m_mapper_ram_size;
UINT32 m_mapper_bram_size;
int m_mirroring, m_four_screen_vram;
bool m_has_battery, m_has_prgram;
};
extern void nes_partialhash(hash_collection &dest, const unsigned char *data, unsigned long length, const char *functions);
// ======================> nes_cart_slot_device
class nes_cart_slot_device : public device_t,
public nes_cart_interface,
public device_image_interface,
public device_slot_interface
{
public:
// construction/destruction
nes_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual ~nes_cart_slot_device();
// device-level overrides
virtual void device_start();
virtual void device_config_complete();
// image-level overrides
virtual bool call_load();
virtual void call_unload();
virtual bool call_softlist_load(char *swlist, char *swname, rom_entry *start_entry);
virtual iodevice_t image_type() const { return IO_CARTSLOT; }
virtual bool is_readable() const { return 1; }
virtual bool is_writeable() const { return 0; }
virtual bool is_creatable() const { return 0; }
virtual bool must_be_loaded() const { return m_must_be_loaded; }
virtual bool is_reset_on_load() const { return 1; }
virtual const char *image_interface() const { return "nes_cart"; }
virtual const char *file_extensions() const { return "nes,unf,unif"; }
virtual const option_guide *create_option_guide() const { return NULL; }
virtual device_image_partialhash_func get_partial_hash() const { return &nes_partialhash; }
// slot interface overrides
virtual const char * get_default_card_software(const machine_config &config, emu_options &options);
// reading and writing
virtual DECLARE_READ8_MEMBER(read_l);
virtual DECLARE_READ8_MEMBER(read_m);
virtual DECLARE_READ8_MEMBER(read_h);
virtual DECLARE_WRITE8_MEMBER(write_l);
virtual DECLARE_WRITE8_MEMBER(write_m);
virtual DECLARE_WRITE8_MEMBER(write_h);
int get_pcb_id() { return m_pcb_id; };
// temporarily here
int m_chr_open_bus;
int m_ce_mask;
int m_ce_state;
int m_vrc_ls_prg_a;
int m_vrc_ls_prg_b;
int m_vrc_ls_chr;
int m_crc_hack;
int get_chr_open_bus() { return m_chr_open_bus; };
int get_ce_mask() { return m_ce_mask; };
int get_ce_state() { return m_ce_state; };
int get_vrc_ls_prg_a() { return m_vrc_ls_prg_a; };
int get_vrc_ls_prg_b() { return m_vrc_ls_prg_b; };
int get_vrc_ls_chr() { return m_vrc_ls_chr; };
int get_crc_hack() { return m_crc_hack; };
void set_must_be_loaded(bool _must_be_loaded) { m_must_be_loaded = _must_be_loaded; }
//private:
device_nes_cart_interface* m_cart;
int m_pcb_id;
bool m_must_be_loaded;
};
// device type definition
extern const device_type NES_CART_SLOT;
/***************************************************************************
DEVICE CONFIGURATION MACROS
***************************************************************************/
#define MCFG_NES_CARTRIDGE_ADD(_tag,_config,_slot_intf,_def_slot,_def_inp) \
MCFG_DEVICE_ADD(_tag, NES_CART_SLOT, 0) \
MCFG_DEVICE_CONFIG(_config) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp, false)
#define MCFG_NES_CARTRIDGE_NOT_MANDATORY \
static_cast<nes_cart_slot_device *>(device)->set_must_be_loaded(FALSE);
// CART DEVICE [TO BE MOVED TO SEPARATE SOURCE LATER]
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> nes_rom_device
class nes_rom_device : public device_t,
public device_nes_cart_interface
{
public:
// construction/destruction
nes_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
nes_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock);
//protected:
// device-level overrides
virtual void device_start();
virtual void device_config_complete() { m_shortname = "nes_rom"; }
// nescart_interface overrides
// virtual DECLARE_READ8_MEMBER(read_l);
// virtual DECLARE_READ8_MEMBER(read_m);
// virtual DECLARE_READ8_MEMBER(read_h);
// virtual DECLARE_WRITE8_MEMBER(write_l);
// virtual DECLARE_WRITE8_MEMBER(write_m);
// virtual DECLARE_WRITE8_MEMBER(write_h);
};
// device type definition
extern const device_type NES_ROM;
#endif
|