Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/quicknes/nes_emu/Mmc24.cpp
2 views
1
#include <cstring>
2
3
#include "Nes_Mapper.h"
4
#include "blargg_source.h"
5
6
#include "Mmc24.h"
7
8
9
class MMC2: public Nes_Mapper
10
{
11
byte regs[6]; // A,B,C,D,E,F
12
13
void mirror(byte val)
14
{
15
if (val & 1)
16
mirror_horiz();
17
else
18
mirror_vert();
19
}
20
21
public:
22
MMC2()
23
{
24
register_state(regs, sizeof(regs));
25
}
26
27
virtual void reset_state()
28
{
29
std::memset(regs, 0, sizeof(regs));
30
}
31
32
virtual void apply_mapping()
33
{
34
mirror(regs[5]);
35
set_prg_bank(0x8000, bank_8k, regs[0]);
36
set_prg_bank(0xa000, bank_8k, 13);
37
set_prg_bank(0xc000, bank_8k, 14);
38
set_prg_bank(0xe000, bank_8k, 15);
39
40
set_chr_bank(0x0000, bank_4k, regs[1]);
41
set_chr_bank(0x1000, bank_4k, regs[3]);
42
43
set_chr_bank_ex(0x0000, bank_4k, regs[2]);
44
set_chr_bank_ex(0x1000, bank_4k, regs[4]);
45
}
46
47
virtual void write(nes_time_t, nes_addr_t addr, int data)
48
{
49
switch (addr >> 12)
50
{
51
case 0xa: regs[0] = data; set_prg_bank(0x8000, bank_8k, data); break;
52
case 0xb: regs[1] = data; set_chr_bank(0x0000, bank_4k, data); break;
53
case 0xc: regs[2] = data; set_chr_bank_ex(0x0000, bank_4k, data); break;
54
case 0xd: regs[3] = data; set_chr_bank(0x1000, bank_4k, data); break;
55
case 0xe: regs[4] = data; set_chr_bank_ex(0x1000, bank_4k, data); break;
56
case 0xf: regs[5] = data; mirror(data); break;
57
}
58
}
59
};
60
61
class MMC4: public Nes_Mapper
62
{
63
byte regs[6]; // A,B,C,D,E,F
64
65
void mirror(byte val)
66
{
67
if (val & 1)
68
mirror_horiz();
69
else
70
mirror_vert();
71
}
72
73
public:
74
MMC4()
75
{
76
register_state(regs, sizeof(regs));
77
}
78
79
virtual void reset_state()
80
{
81
std::memset(regs, 0, sizeof(regs));
82
}
83
84
virtual void apply_mapping()
85
{
86
enable_sram();
87
88
mirror(regs[5]);
89
set_prg_bank(0x8000, bank_16k, regs[0]);
90
91
set_chr_bank(0x0000, bank_4k, regs[1]);
92
set_chr_bank(0x1000, bank_4k, regs[3]);
93
94
set_chr_bank_ex(0x0000, bank_4k, regs[2]);
95
set_chr_bank_ex(0x1000, bank_4k, regs[4]);
96
}
97
98
virtual void write(nes_time_t, nes_addr_t addr, int data)
99
{
100
switch (addr >> 12)
101
{
102
case 0xa: regs[0] = data; set_prg_bank(0x8000, bank_16k, data); break;
103
case 0xb: regs[1] = data; set_chr_bank(0x0000, bank_4k, data); break;
104
case 0xc: regs[2] = data; set_chr_bank_ex(0x0000, bank_4k, data); break;
105
case 0xd: regs[3] = data; set_chr_bank(0x1000, bank_4k, data); break;
106
case 0xe: regs[4] = data; set_chr_bank_ex(0x1000, bank_4k, data); break;
107
case 0xf: regs[5] = data; mirror(data); break;
108
}
109
}
110
};
111
112
113
void register_mmc24()
114
{
115
register_mapper<MMC2>(9);
116
register_mapper<MMC4>(10);
117
}
118
119