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
|
// license:BSD-3-Clause
// copyright-holders:Fabio Priuli
#ifndef MAME_BUS_NES_MMC3_H
#define MAME_BUS_NES_MMC3_H
#pragma once
#include "nxrom.h"
// ======================> nes_txrom_device
class nes_txrom_device : public nes_nrom_device
{
public:
// construction/destruction
nes_txrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual uint8_t read_m(offs_t offset) override;
virtual void write_m(offs_t offset, uint8_t data) override;
virtual void txrom_write(offs_t offset, uint8_t data);
virtual void write_h(offs_t offset, uint8_t data) override { txrom_write(offset, data); }
virtual void prg_cb(int start, int bank);
virtual void chr_cb(int start, int bank, int source);
virtual void hblank_irq(int scanline, bool vblank, bool blanked) override;
virtual void pcb_reset() override;
protected:
nes_txrom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
virtual void device_start() override { mmc3_start(); }
virtual void set_prg(int prg_base, int prg_mask);
virtual void set_chr(uint8_t chr, int chr_base, int chr_mask);
void mmc3_start();
void mmc3_common_initialize(int prg_mask, int chr_mask, int IRQ_type);
// are there MMC3 clones which need more regs?
uint16_t m_mmc_prg_bank[4];
uint16_t m_mmc_vrom_bank[8]; // a few clones need more than the 6 banks used by base MMC3 (e.g. waixing_g)
uint8_t m_mmc_mirror;
int m_prg_base, m_prg_mask; // MMC3 based multigame carts select a block of banks by using these (and then act like normal MMC3),
int m_chr_base, m_chr_mask; // while MMC3 and clones (mapper 118 & 119) simply set them as 0 and 0xff resp.
int m_latch;
int m_wram_protect;
int m_alt_irq;
uint16_t m_irq_count, m_irq_count_latch;
uint8_t m_irq_clear;
int m_irq_enable;
};
// ======================> nes_hkrom_device
class nes_hkrom_device : public nes_txrom_device
{
public:
// construction/destruction
nes_hkrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual uint8_t read_m(offs_t offset) override;
virtual void write_m(offs_t offset, uint8_t data) override;
virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
int m_wram_enable;
uint8_t m_mmc6_reg;
// MMC-6 contains 1K of internal ram, battery backed up
uint8_t m_mmc6_ram[0x400];
};
// ======================> nes_txsrom_device
class nes_txsrom_device : public nes_txrom_device
{
public:
// construction/destruction
nes_txsrom_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void write_h(offs_t offset, u8 data) override;
protected:
// construction/destruction
nes_txsrom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
virtual void set_chr(u8 chr, int chr_base, int chr_mask) override;
};
// ======================> nes_tqrom_device
class nes_tqrom_device : public nes_txrom_device
{
public:
// construction/destruction
nes_tqrom_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void chr_cb(int start, int bank, int source) override;
protected:
// construction/destruction
nes_tqrom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
};
// ======================> nes_qj_device
class nes_qj_device : public nes_txrom_device
{
public:
// construction/destruction
nes_qj_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void write_m(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
};
// ======================> nes_zz_device
class nes_zz_device : public nes_txrom_device
{
public:
// construction/destruction
nes_zz_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void write_m(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
};
// device type definition
DECLARE_DEVICE_TYPE(NES_TXROM, nes_txrom_device)
DECLARE_DEVICE_TYPE(NES_HKROM, nes_hkrom_device)
DECLARE_DEVICE_TYPE(NES_TXSROM, nes_txsrom_device)
DECLARE_DEVICE_TYPE(NES_TQROM, nes_tqrom_device)
DECLARE_DEVICE_TYPE(NES_QJ_PCB, nes_qj_device)
DECLARE_DEVICE_TYPE(NES_ZZ_PCB, nes_zz_device)
#endif // MAME_BUS_NES_MMC3_H
|