Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/cheat/cheat.cpp
2 views
1
#include <snes/snes.hpp>
2
3
#define CHEAT_CPP
4
namespace SNES {
5
6
Cheat cheat;
7
8
bool Cheat::enabled() const {
9
return system_enabled;
10
}
11
12
void Cheat::enable(bool state) {
13
system_enabled = state;
14
cheat_enabled = system_enabled && code_enabled;
15
}
16
17
void Cheat::synchronize() {
18
memset(override, 0x00, 16 * 1024 * 1024);
19
code_enabled = size() > 0;
20
21
for(unsigned i = 0; i < size(); i++) {
22
const CheatCode &code = operator[](i);
23
24
unsigned addr = mirror(code.addr);
25
override[addr] = true;
26
if((addr & 0xffe000) == 0x7e0000) {
27
//mirror $7e:0000-1fff to $00-3f|80-bf:0000-1fff
28
unsigned mirroraddr;
29
for(unsigned x = 0; x <= 0x3f; x++) {
30
mirroraddr = ((0x00 + x) << 16) + (addr & 0x1fff);
31
override[mirroraddr] = true;
32
33
mirroraddr = ((0x80 + x) << 16) + (addr & 0x1fff);
34
override[mirroraddr] = true;
35
}
36
}
37
}
38
39
cheat_enabled = system_enabled && code_enabled;
40
}
41
42
uint8 Cheat::read(unsigned addr) const {
43
addr = mirror(addr);
44
45
for(unsigned i = 0; i < size(); i++) {
46
const CheatCode &code = operator[](i);
47
if(addr == mirror(code.addr)) {
48
return code.data;
49
}
50
}
51
52
return 0x00;
53
}
54
55
void Cheat::init() {
56
memset(override, 0x00, 16 * 1024 * 1024);
57
}
58
59
Cheat::Cheat() {
60
override = new uint8[16 * 1024 * 1024];
61
system_enabled = true;
62
}
63
64
Cheat::~Cheat() {
65
delete[] override;
66
}
67
68
bool Cheat::decode(const string &code, unsigned &addr, unsigned &data) {
69
string t = code;
70
t.lower();
71
72
#define ischr(n) ((n >= '0' && n <= '9') || (n >= 'a' && n <= 'f'))
73
74
if(t.wildcard("??????:??")) {
75
//Direct
76
t = { substr(t, 0, 6), substr(t, 7, 2) };
77
for(unsigned n = 0; n < 8; n++) if(!ischr(t[n])) return false; //validate input
78
unsigned r = hex(t);
79
80
addr = r >> 8;
81
data = r & 0xff;
82
return true;
83
}
84
85
if(t.wildcard("????" "-" "????")) {
86
//Game Genie
87
t = { substr(t, 0, 4), substr(t, 5, 4) };
88
for(unsigned n = 0; n < 8; n++) if(!ischr(t[n])) return false; //validate input
89
t.transform("df4709156bc8a23e", "0123456789abcdef");
90
unsigned r = hex(t);
91
static unsigned bits[] = { 13, 12, 11, 10, 5, 4, 3, 2, 23, 22, 21, 20, 1, 0, 15, 14, 19, 18, 17, 16, 9, 8, 7, 6 };
92
93
addr = 0;
94
for(unsigned n = 0; n < 24; n++) addr |= r & (1 << bits[n]) ? 0x800000 >> n : 0;
95
data = r >> 24;
96
return true;
97
} else {
98
return false;
99
}
100
101
#undef ischr
102
}
103
104
unsigned Cheat::mirror(unsigned addr) const {
105
//$00-3f|80-bf:0000-1fff -> $7e:0000-1fff
106
if((addr & 0x40e000) == 0x000000) return (0x7e0000 + (addr & 0x1fff));
107
return addr;
108
}
109
110
}
111
112