Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
RishiRecon
GitHub Repository: RishiRecon/exploits
Path: blob/main/misc/emulator/xnes/snes9x/cheats.cpp
28515 views
1
/***********************************************************************************
2
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
3
4
(c) Copyright 1996 - 2002 Gary Henderson ([email protected]),
5
Jerremy Koot ([email protected])
6
7
(c) Copyright 2002 - 2004 Matthew Kendora
8
9
(c) Copyright 2002 - 2005 Peter Bortas ([email protected])
10
11
(c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/)
12
13
(c) Copyright 2001 - 2006 John Weidman ([email protected])
14
15
(c) Copyright 2002 - 2006 funkyass ([email protected]),
16
Kris Bleakley ([email protected])
17
18
(c) Copyright 2002 - 2010 Brad Jorsch ([email protected]),
19
Nach ([email protected]),
20
21
(c) Copyright 2002 - 2011 zones ([email protected])
22
23
(c) Copyright 2006 - 2007 nitsuja
24
25
(c) Copyright 2009 - 2011 BearOso,
26
OV2
27
28
29
BS-X C emulator code
30
(c) Copyright 2005 - 2006 Dreamer Nom,
31
zones
32
33
C4 x86 assembler and some C emulation code
34
(c) Copyright 2000 - 2003 _Demo_ ([email protected]),
35
Nach,
36
zsKnight ([email protected])
37
38
C4 C++ code
39
(c) Copyright 2003 - 2006 Brad Jorsch,
40
Nach
41
42
DSP-1 emulator code
43
(c) Copyright 1998 - 2006 _Demo_,
44
Andreas Naive ([email protected]),
45
Gary Henderson,
46
Ivar ([email protected]),
47
John Weidman,
48
Kris Bleakley,
49
Matthew Kendora,
50
Nach,
51
neviksti ([email protected])
52
53
DSP-2 emulator code
54
(c) Copyright 2003 John Weidman,
55
Kris Bleakley,
56
Lord Nightmare ([email protected]),
57
Matthew Kendora,
58
neviksti
59
60
DSP-3 emulator code
61
(c) Copyright 2003 - 2006 John Weidman,
62
Kris Bleakley,
63
Lancer,
64
z80 gaiden
65
66
DSP-4 emulator code
67
(c) Copyright 2004 - 2006 Dreamer Nom,
68
John Weidman,
69
Kris Bleakley,
70
Nach,
71
z80 gaiden
72
73
OBC1 emulator code
74
(c) Copyright 2001 - 2004 zsKnight,
75
pagefault ([email protected]),
76
Kris Bleakley
77
Ported from x86 assembler to C by sanmaiwashi
78
79
SPC7110 and RTC C++ emulator code used in 1.39-1.51
80
(c) Copyright 2002 Matthew Kendora with research by
81
zsKnight,
82
John Weidman,
83
Dark Force
84
85
SPC7110 and RTC C++ emulator code used in 1.52+
86
(c) Copyright 2009 byuu,
87
neviksti
88
89
S-DD1 C emulator code
90
(c) Copyright 2003 Brad Jorsch with research by
91
Andreas Naive,
92
John Weidman
93
94
S-RTC C emulator code
95
(c) Copyright 2001 - 2006 byuu,
96
John Weidman
97
98
ST010 C++ emulator code
99
(c) Copyright 2003 Feather,
100
John Weidman,
101
Kris Bleakley,
102
Matthew Kendora
103
104
Super FX x86 assembler emulator code
105
(c) Copyright 1998 - 2003 _Demo_,
106
pagefault,
107
zsKnight
108
109
Super FX C emulator code
110
(c) Copyright 1997 - 1999 Ivar,
111
Gary Henderson,
112
John Weidman
113
114
Sound emulator code used in 1.5-1.51
115
(c) Copyright 1998 - 2003 Brad Martin
116
(c) Copyright 1998 - 2006 Charles Bilyue'
117
118
Sound emulator code used in 1.52+
119
(c) Copyright 2004 - 2007 Shay Green ([email protected])
120
121
SH assembler code partly based on x86 assembler code
122
(c) Copyright 2002 - 2004 Marcus Comstedt ([email protected])
123
124
2xSaI filter
125
(c) Copyright 1999 - 2001 Derek Liauw Kie Fa
126
127
HQ2x, HQ3x, HQ4x filters
128
(c) Copyright 2003 Maxim Stepin ([email protected])
129
130
NTSC filter
131
(c) Copyright 2006 - 2007 Shay Green
132
133
GTK+ GUI code
134
(c) Copyright 2004 - 2011 BearOso
135
136
Win32 GUI code
137
(c) Copyright 2003 - 2006 blip,
138
funkyass,
139
Matthew Kendora,
140
Nach,
141
nitsuja
142
(c) Copyright 2009 - 2011 OV2
143
144
Mac OS GUI code
145
(c) Copyright 1998 - 2001 John Stiles
146
(c) Copyright 2001 - 2011 zones
147
148
149
Specific ports contains the works of other authors. See headers in
150
individual files.
151
152
153
Snes9x homepage: http://www.snes9x.com/
154
155
Permission to use, copy, modify and/or distribute Snes9x in both binary
156
and source form, for non-commercial purposes, is hereby granted without
157
fee, providing that this license information and copyright notice appear
158
with all copies and any derived work.
159
160
This software is provided 'as-is', without any express or implied
161
warranty. In no event shall the authors be held liable for any damages
162
arising from the use of this software or it's derivatives.
163
164
Snes9x is freeware for PERSONAL USE only. Commercial users should
165
seek permission of the copyright holders first. Commercial use includes,
166
but is not limited to, charging money for Snes9x or software derived from
167
Snes9x, including Snes9x or derivatives in commercial game bundles, and/or
168
using Snes9x as a promotion for your commercial product.
169
170
The copyright holders request that bug fixes and improvements to the code
171
should be forwarded to them so everyone can benefit from the modifications
172
in future versions.
173
174
Super NES and Super Nintendo Entertainment System are trademarks of
175
Nintendo Co., Limited and its subsidiary companies.
176
***********************************************************************************/
177
178
179
#include <ctype.h>
180
#include "snes9x.h"
181
#include "memmap.h"
182
#include "cheats.h"
183
184
#define WRAM_BITS ALL_BITS
185
#define SRAM_BITS ALL_BITS + (0x20000 >> 5)
186
#define IRAM_BITS ALL_BITS + (0x30000 >> 5)
187
188
#define BIT_CLEAR(a, v) (a)[(v) >> 5] &= ~(1 << ((v) & 31))
189
190
#define TEST_BIT(a, v) ((a)[(v) >> 5] & (1 << ((v) & 31)))
191
192
#define _S9XCHTC(c, a, b) \
193
((c) == S9X_LESS_THAN ? (a) < (b) : \
194
(c) == S9X_GREATER_THAN ? (a) > (b) : \
195
(c) == S9X_LESS_THAN_OR_EQUAL ? (a) <= (b) : \
196
(c) == S9X_GREATER_THAN_OR_EQUAL ? (a) >= (b) : \
197
(c) == S9X_EQUAL ? (a) == (b) : \
198
(a) != (b))
199
200
#define _S9XCHTD(s, m, o) \
201
((s) == S9X_8_BITS ? ((uint8) (*((m) + (o)))) : \
202
(s) == S9X_16_BITS ? ((uint16) (*((m) + (o)) + (*((m) + (o) + 1) << 8))) : \
203
(s) == S9X_24_BITS ? ((uint32) (*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16))) : \
204
((uint32) (*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16) + (*((m) + (o) + 3) << 24))))
205
206
#define _S9XCHTDS(s, m, o) \
207
((s) == S9X_8_BITS ? ((int8) (*((m) + (o)))) : \
208
(s) == S9X_16_BITS ? ((int16) (*((m) + (o)) + (*((m) + (o) + 1) << 8))) : \
209
(s) == S9X_24_BITS ? (((int32) ((*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16)) << 8)) >> 8): \
210
((int32) (*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16) + (*((m) + (o) + 3) << 24))))
211
212
static bool8 S9xAllHex (const char *, int);
213
214
215
static bool8 S9xAllHex (const char *code, int len)
216
{
217
for (int i = 0; i < len; i++)
218
if ((code[i] < '0' || code[i] > '9') && (code[i] < 'a' || code[i] > 'f') && (code[i] < 'A' || code[i] > 'F'))
219
return (FALSE);
220
221
return (TRUE);
222
}
223
224
const char * S9xProActionReplayToRaw (const char *code, uint32 &address, uint8 &byte)
225
{
226
uint32 data = 0;
227
228
if (strlen(code) != 8 || !S9xAllHex(code, 8) || sscanf(code, "%x", &data) != 1)
229
return ("Invalid Pro Action Replay code - should be 8 hex digits in length.");
230
231
address = data >> 8;
232
byte = (uint8) data;
233
234
return (NULL);
235
}
236
237
const char * S9xGoldFingerToRaw (const char *code, uint32 &address, bool8 &sram, uint8 &num_bytes, uint8 bytes[3])
238
{
239
char tmp[15];
240
int i;
241
242
if (strlen(code) != 14)
243
return ("Invalid Gold Finger code - should be 14 hex digits in length.");
244
245
strncpy(tmp, code, 5);
246
tmp[5] = 0;
247
if (sscanf(tmp, "%x", &address) != 1)
248
return ("Invalid Gold Finger code.");
249
250
for (i = 0; i < 3; i++)
251
{
252
unsigned int byte;
253
254
strncpy(tmp, code + 5 + i * 2, 2);
255
tmp[2] = 0;
256
if (sscanf(tmp, "%x", &byte) != 1)
257
break;
258
bytes[i] = (uint8) byte;
259
}
260
261
num_bytes = i;
262
sram = code[13] == '1';
263
264
return (NULL);
265
}
266
267
const char * S9xGameGenieToRaw (const char *code, uint32 &address, uint8 &byte)
268
{
269
char new_code[12];
270
271
if (strlen(code) != 9 || *(code + 4) != '-' || !S9xAllHex(code, 4) || !S9xAllHex(code + 5, 4))
272
return ("Invalid Game Genie(tm) code - should be 'xxxx-xxxx'.");
273
274
strcpy(new_code, "0x");
275
strncpy(new_code + 2, code, 4);
276
strcpy(new_code + 6, code + 5);
277
278
static const char *real_hex = "0123456789ABCDEF";
279
static const char *genie_hex = "DF4709156BC8A23E";
280
281
for (int i = 2; i < 10; i++)
282
{
283
if (islower(new_code[i]))
284
new_code[i] = toupper(new_code[i]);
285
286
int j;
287
for (j = 0; j < 16; j++)
288
{
289
if (new_code[i] == genie_hex[j])
290
{
291
new_code[i] = real_hex[j];
292
break;
293
}
294
}
295
296
if (j == 16)
297
return ("Invalid hex-character in Game Genie(tm) code.");
298
}
299
300
uint32 data = 0;
301
sscanf(new_code, "%x", &data);
302
byte = (uint8) (data >> 24);
303
address = data & 0xffffff;
304
address = ((address & 0x003c00) << 10) +
305
((address & 0x00003c) << 14) +
306
((address & 0xf00000) >> 8) +
307
((address & 0x000003) << 10) +
308
((address & 0x00c000) >> 6) +
309
((address & 0x0f0000) >> 12) +
310
((address & 0x0003c0) >> 6);
311
312
return (NULL);
313
}
314
315
void S9xStartCheatSearch (SCheatData *d)
316
{
317
memmove(d->CWRAM, d->RAM, 0x20000);
318
memmove(d->CSRAM, d->SRAM, 0x10000);
319
memmove(d->CIRAM, &d->FillRAM[0x3000], 0x2000);
320
memset((char *) d->ALL_BITS, 0xff, 0x32000 >> 3);
321
}
322
323
void S9xSearchForChange (SCheatData *d, S9xCheatComparisonType cmp, S9xCheatDataSize size, bool8 is_signed, bool8 update)
324
{
325
int l, i;
326
327
switch (size)
328
{
329
case S9X_8_BITS: l = 0; break;
330
case S9X_16_BITS: l = 1; break;
331
case S9X_24_BITS: l = 2; break;
332
default:
333
case S9X_32_BITS: l = 3; break;
334
}
335
336
if (is_signed)
337
{
338
for (i = 0; i < 0x20000 - l; i++)
339
{
340
if (TEST_BIT(d->WRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTDS(size, d->RAM, i), _S9XCHTDS(size, d->CWRAM, i)))
341
{
342
if (update)
343
d->CWRAM[i] = d->RAM[i];
344
}
345
else
346
BIT_CLEAR(d->WRAM_BITS, i);
347
}
348
349
for (i = 0; i < 0x10000 - l; i++)
350
{
351
if (TEST_BIT(d->SRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTDS(size, d->SRAM, i), _S9XCHTDS(size, d->CSRAM, i)))
352
{
353
if (update)
354
d->CSRAM[i] = d->SRAM[i];
355
}
356
else
357
BIT_CLEAR(d->SRAM_BITS, i);
358
}
359
360
for (i = 0; i < 0x2000 - l; i++)
361
{
362
if (TEST_BIT(d->IRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTDS(size, d->FillRAM + 0x3000, i), _S9XCHTDS(size, d->CIRAM, i)))
363
{
364
if (update)
365
d->CIRAM[i] = d->FillRAM[i + 0x3000];
366
}
367
else
368
BIT_CLEAR(d->IRAM_BITS, i);
369
}
370
}
371
else
372
{
373
for (i = 0; i < 0x20000 - l; i++)
374
{
375
if (TEST_BIT(d->WRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTD(size, d->RAM, i), _S9XCHTD(size, d->CWRAM, i)))
376
{
377
if (update)
378
d->CWRAM[i] = d->RAM[i];
379
}
380
else
381
BIT_CLEAR(d->WRAM_BITS, i);
382
}
383
384
for (i = 0; i < 0x10000 - l; i++)
385
{
386
if (TEST_BIT(d->SRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTD(size, d->SRAM, i), _S9XCHTD(size, d->CSRAM, i)))
387
{
388
if (update)
389
d->CSRAM[i] = d->SRAM[i];
390
}
391
else
392
BIT_CLEAR(d->SRAM_BITS, i);
393
}
394
395
for (i = 0; i < 0x2000 - l; i++)
396
{
397
if (TEST_BIT(d->IRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTD(size, d->FillRAM + 0x3000, i), _S9XCHTD(size, d->CIRAM, i)))
398
{
399
if (update)
400
d->CIRAM[i] = d->FillRAM[i + 0x3000];
401
}
402
else
403
BIT_CLEAR(d->IRAM_BITS, i);
404
}
405
}
406
407
for (i = 0x20000 - l; i < 0x20000; i++)
408
BIT_CLEAR(d->WRAM_BITS, i);
409
410
for (i = 0x10000 - l; i < 0x10000; i++)
411
BIT_CLEAR(d->SRAM_BITS, i);
412
}
413
414
void S9xSearchForValue (SCheatData *d, S9xCheatComparisonType cmp, S9xCheatDataSize size, uint32 value, bool8 is_signed, bool8 update)
415
{
416
int l, i;
417
418
switch (size)
419
{
420
case S9X_8_BITS: l = 0; break;
421
case S9X_16_BITS: l = 1; break;
422
case S9X_24_BITS: l = 2; break;
423
default:
424
case S9X_32_BITS: l = 3; break;
425
}
426
427
if (is_signed)
428
{
429
for (i = 0; i < 0x20000 - l; i++)
430
{
431
if (TEST_BIT(d->WRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTDS(size, d->RAM, i), (int32) value))
432
{
433
if (update)
434
d->CWRAM[i] = d->RAM[i];
435
}
436
else
437
BIT_CLEAR(d->WRAM_BITS, i);
438
}
439
440
for (i = 0; i < 0x10000 - l; i++)
441
{
442
if (TEST_BIT(d->SRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTDS(size, d->SRAM, i), (int32) value))
443
{
444
if (update)
445
d->CSRAM[i] = d->SRAM[i];
446
}
447
else
448
BIT_CLEAR(d->SRAM_BITS, i);
449
}
450
451
for (i = 0; i < 0x2000 - l; i++)
452
{
453
if (TEST_BIT(d->IRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTDS(size, d->FillRAM + 0x3000, i), (int32) value))
454
{
455
if (update)
456
d->CIRAM[i] = d->FillRAM[i + 0x3000];
457
}
458
else
459
BIT_CLEAR(d->IRAM_BITS, i);
460
}
461
}
462
else
463
{
464
for (i = 0; i < 0x20000 - l; i++)
465
{
466
if (TEST_BIT(d->WRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTD(size, d->RAM, i), value))
467
{
468
if (update)
469
d->CWRAM[i] = d->RAM[i];
470
}
471
else
472
BIT_CLEAR(d->WRAM_BITS, i);
473
}
474
475
for (i = 0; i < 0x10000 - l; i++)
476
{
477
if (TEST_BIT(d->SRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTD(size, d->SRAM, i), value))
478
{
479
if (update)
480
d->CSRAM[i] = d->SRAM[i];
481
}
482
else
483
BIT_CLEAR(d->SRAM_BITS, i);
484
}
485
486
for (i = 0; i < 0x2000 - l; i++)
487
{
488
if (TEST_BIT(d->IRAM_BITS, i) && _S9XCHTC(cmp, _S9XCHTD(size, d->FillRAM + 0x3000, i), value))
489
{
490
if (update)
491
d->CIRAM[i] = d->FillRAM[i + 0x3000];
492
}
493
else
494
BIT_CLEAR(d->IRAM_BITS, i);
495
}
496
}
497
498
for (i = 0x20000 - l; i < 0x20000; i++)
499
BIT_CLEAR(d->WRAM_BITS, i);
500
501
for (i = 0x10000 - l; i < 0x10000; i++)
502
BIT_CLEAR(d->SRAM_BITS, i);
503
}
504
505
void S9xSearchForAddress (SCheatData *d, S9xCheatComparisonType cmp, S9xCheatDataSize size, uint32 value, bool8 update)
506
{
507
int l, i;
508
509
switch (size)
510
{
511
case S9X_8_BITS: l = 0; break;
512
case S9X_16_BITS: l = 1; break;
513
case S9X_24_BITS: l = 2; break;
514
default:
515
case S9X_32_BITS: l = 3; break;
516
}
517
518
for (i = 0; i < 0x20000 - l; i++)
519
{
520
if (TEST_BIT(d->WRAM_BITS, i) && _S9XCHTC(cmp, i, (int32) value))
521
{
522
if (update)
523
d->CWRAM[i] = d->RAM[i];
524
}
525
else
526
BIT_CLEAR(d->WRAM_BITS, i);
527
}
528
529
for (i = 0; i < 0x10000 - l; i++)
530
{
531
if (TEST_BIT(d->SRAM_BITS, i) && _S9XCHTC(cmp, i + 0x20000, (int32) value))
532
{
533
if (update)
534
d->CSRAM[i] = d->SRAM[i];
535
}
536
else
537
BIT_CLEAR(d->SRAM_BITS, i);
538
}
539
540
for (i = 0; i < 0x2000 - l; i++)
541
{
542
if (TEST_BIT(d->IRAM_BITS, i) && _S9XCHTC(cmp, i + 0x30000, (int32) value))
543
{
544
if (update)
545
d->CIRAM[i] = d->FillRAM[i + 0x3000];
546
}
547
else
548
BIT_CLEAR(d->IRAM_BITS, i);
549
}
550
551
for (i = 0x20000 - l; i < 0x20000; i++)
552
BIT_CLEAR(d->WRAM_BITS, i);
553
554
for (i = 0x10000 - l; i < 0x10000; i++)
555
BIT_CLEAR(d->SRAM_BITS, i);
556
}
557
558
void S9xOutputCheatSearchResults (SCheatData *d)
559
{
560
int i;
561
562
for (i = 0; i < 0x20000; i++)
563
{
564
if (TEST_BIT(d->WRAM_BITS, i))
565
printf("WRAM: %05x: %02x\n", i, d->RAM[i]);
566
}
567
568
for (i = 0; i < 0x10000; i++)
569
{
570
if (TEST_BIT(d->SRAM_BITS, i))
571
printf("SRAM: %04x: %02x\n", i, d->SRAM[i]);
572
}
573
574
for (i = 0; i < 0x2000; i++)
575
{
576
if (TEST_BIT(d->IRAM_BITS, i))
577
printf("IRAM: %05x: %02x\n", i, d->FillRAM[i + 0x3000]);
578
}
579
}
580
581