/trunk/src/gba/Cheats.cpp
C++ | 2898 lines | 2672 code | 147 blank | 79 comment | 411 complexity | 96eaf67ae726fe30025a4f45a60e51c6 MD5 | raw file
Possible License(s): BSD-2-Clause, LGPL-3.0, LGPL-2.1
Large files files are truncated, but you can click here to view the full file
- #include <memory.h>
- #include <string.h>
- #include <stdio.h>
- #include <ctype.h>
- #include "GBA.h"
- #include "GBAinline.h"
- #include "Cheats.h"
- #include "Globals.h"
- #include "../NLS.h"
- #include "../Util.h"
- /**
- * Gameshark code types: (based on AR v1.0)
- *
- * NNNNNNNN 001DC0DE - ID code for the game (game 4 character name) from ROM
- * DEADFACE XXXXXXXX - changes decryption seeds // Not supported by VBA.
- * 0AAAAAAA 000000YY - 8-bit constant write
- * 1AAAAAAA 0000YYYY - 16-bit constant write
- * 2AAAAAAA YYYYYYYY - 32-bit constant write
- * 30XXAAAA YYYYYYYY - 32bit Group Write, 8/16/32bit Sub/Add (depending on the XX value).
- * 6AAAAAAA Z000YYYY - 16-bit ROM Patch (address >> 1). Z selects the Rom Patching register.
- * - AR v1/2 hardware only supports Z=0.
- * - AR v3 hardware should support Z=0,1,2 or 3.
- * 8A1AAAAA 000000YY - 8-bit button write
- * 8A2AAAAA 0000YYYY - 16-bit button write
- * 8A4AAAAA YYYYYYYY - 32-bit button write // BUGGY ! Only writes 00000000 on the AR v1.0.
- * 80F00000 0000YYYY - button slow motion
- * DAAAAAAA 00Z0YYYY - Z = 0 : if 16-bit value at address != YYYY skip next line
- * - Z = 1 : if 16-bit value at address == YYYY skip next line
- * - Z = 2 : if 16-bit value at address > YYYY (Unsigned) skip next line
- * - Z = 3 : if 16-bit value at address < YYYY (Unsigned) skip next line
- * E0CCYYYY ZAAAAAAA - Z = 0 : if 16-bit value at address != YYYY skip CC lines
- * - Z = 1 : if 16-bit value at address == YYYY skip CC lines
- * - Z = 2 : if 16-bit value at address > YYYY (Unsigned) skip CC lines
- * - Z = 3 : if 16-bit value at address < YYYY (Unsigned) skip CC lines
- * FAAAAAAA 0000YYYY - Master code function
- *
- *
- *
- * CodeBreaker codes types: (based on the CBA clone "Cheatcode S" v1.1)
- *
- * 0000AAAA 000Y - Game CRC (Y are flags: 8 - CRC, 2 - DI)
- * 1AAAAAAA YYYY - Master Code function (store address at ((YYYY << 0x16)
- * + 0x08000100))
- * 2AAAAAAA YYYY - 16-bit or
- * 3AAAAAAA YYYY - 8-bit constant write
- * 4AAAAAAA YYYY - Slide code
- * XXXXCCCC IIII (C is count and I is address increment, X is value incr.)
- * 5AAAAAAA CCCC - Super code (Write bytes to address, 2*CCCC is count)
- * BBBBBBBB BBBB
- * 6AAAAAAA YYYY - 16-bit and
- * 7AAAAAAA YYYY - if address contains 16-bit value enable next code
- * 8AAAAAAA YYYY - 16-bit constant write
- * 9AAAAAAA YYYY - change decryption (when first code only?)
- * AAAAAAAA YYYY - if address does not contain 16-bit value enable next code
- * BAAAAAAA YYYY - if 16-bit value at address <= YYYY skip next code
- * CAAAAAAA YYYY - if 16-bit value at address >= YYYY skip next code
- * D00000X0 YYYY - if button keys ... enable next code (else skip next code)
- * EAAAAAAA YYYY - increase 16/32bit value stored in address
- * FAAAAAAA YYYY - if 16-bit value at address AND YYYY = 0 then skip next code
- **/
- #define UNKNOWN_CODE -1
- #define INT_8_BIT_WRITE 0
- #define INT_16_BIT_WRITE 1
- #define INT_32_BIT_WRITE 2
- #define GSA_16_BIT_ROM_PATCH 3
- #define GSA_8_BIT_GS_WRITE 4
- #define GSA_16_BIT_GS_WRITE 5
- #define GSA_32_BIT_GS_WRITE 6
- #define CBA_IF_KEYS_PRESSED 7
- #define CBA_IF_TRUE 8
- #define CBA_SLIDE_CODE 9
- #define CBA_IF_FALSE 10
- #define CBA_AND 11
- #define GSA_8_BIT_GS_WRITE2 12
- #define GSA_16_BIT_GS_WRITE2 13
- #define GSA_32_BIT_GS_WRITE2 14
- #define GSA_16_BIT_ROM_PATCH2C 15
- #define GSA_8_BIT_SLIDE 16
- #define GSA_16_BIT_SLIDE 17
- #define GSA_32_BIT_SLIDE 18
- #define GSA_8_BIT_IF_TRUE 19
- #define GSA_32_BIT_IF_TRUE 20
- #define GSA_8_BIT_IF_FALSE 21
- #define GSA_32_BIT_IF_FALSE 22
- #define GSA_8_BIT_FILL 23
- #define GSA_16_BIT_FILL 24
- #define GSA_8_BIT_IF_TRUE2 25
- #define GSA_16_BIT_IF_TRUE2 26
- #define GSA_32_BIT_IF_TRUE2 27
- #define GSA_8_BIT_IF_FALSE2 28
- #define GSA_16_BIT_IF_FALSE2 29
- #define GSA_32_BIT_IF_FALSE2 30
- #define GSA_SLOWDOWN 31
- #define CBA_ADD 32
- #define CBA_OR 33
- #define CBA_LT 34
- #define CBA_GT 35
- #define CBA_SUPER 36
- #define GSA_8_BIT_POINTER 37
- #define GSA_16_BIT_POINTER 38
- #define GSA_32_BIT_POINTER 39
- #define GSA_8_BIT_ADD 40
- #define GSA_16_BIT_ADD 41
- #define GSA_32_BIT_ADD 42
- #define GSA_8_BIT_IF_LOWER_U 43
- #define GSA_16_BIT_IF_LOWER_U 44
- #define GSA_32_BIT_IF_LOWER_U 45
- #define GSA_8_BIT_IF_HIGHER_U 46
- #define GSA_16_BIT_IF_HIGHER_U 47
- #define GSA_32_BIT_IF_HIGHER_U 48
- #define GSA_8_BIT_IF_AND 49
- #define GSA_16_BIT_IF_AND 50
- #define GSA_32_BIT_IF_AND 51
- #define GSA_8_BIT_IF_LOWER_U2 52
- #define GSA_16_BIT_IF_LOWER_U2 53
- #define GSA_32_BIT_IF_LOWER_U2 54
- #define GSA_8_BIT_IF_HIGHER_U2 55
- #define GSA_16_BIT_IF_HIGHER_U2 56
- #define GSA_32_BIT_IF_HIGHER_U2 57
- #define GSA_8_BIT_IF_AND2 58
- #define GSA_16_BIT_IF_AND2 59
- #define GSA_32_BIT_IF_AND2 60
- #define GSA_ALWAYS 61
- #define GSA_ALWAYS2 62
- #define GSA_8_BIT_IF_LOWER_S 63
- #define GSA_16_BIT_IF_LOWER_S 64
- #define GSA_32_BIT_IF_LOWER_S 65
- #define GSA_8_BIT_IF_HIGHER_S 66
- #define GSA_16_BIT_IF_HIGHER_S 67
- #define GSA_32_BIT_IF_HIGHER_S 68
- #define GSA_8_BIT_IF_LOWER_S2 69
- #define GSA_16_BIT_IF_LOWER_S2 70
- #define GSA_32_BIT_IF_LOWER_S2 71
- #define GSA_8_BIT_IF_HIGHER_S2 72
- #define GSA_16_BIT_IF_HIGHER_S2 73
- #define GSA_32_BIT_IF_HIGHER_S2 74
- #define GSA_16_BIT_WRITE_IOREGS 75
- #define GSA_32_BIT_WRITE_IOREGS 76
- #define GSA_CODES_ON 77
- #define GSA_8_BIT_IF_TRUE3 78
- #define GSA_16_BIT_IF_TRUE3 79
- #define GSA_32_BIT_IF_TRUE3 80
- #define GSA_8_BIT_IF_FALSE3 81
- #define GSA_16_BIT_IF_FALSE3 82
- #define GSA_32_BIT_IF_FALSE3 83
- #define GSA_8_BIT_IF_LOWER_S3 84
- #define GSA_16_BIT_IF_LOWER_S3 85
- #define GSA_32_BIT_IF_LOWER_S3 86
- #define GSA_8_BIT_IF_HIGHER_S3 87
- #define GSA_16_BIT_IF_HIGHER_S3 88
- #define GSA_32_BIT_IF_HIGHER_S3 89
- #define GSA_8_BIT_IF_LOWER_U3 90
- #define GSA_16_BIT_IF_LOWER_U3 91
- #define GSA_32_BIT_IF_LOWER_U3 92
- #define GSA_8_BIT_IF_HIGHER_U3 93
- #define GSA_16_BIT_IF_HIGHER_U3 94
- #define GSA_32_BIT_IF_HIGHER_U3 95
- #define GSA_8_BIT_IF_AND3 96
- #define GSA_16_BIT_IF_AND3 97
- #define GSA_32_BIT_IF_AND3 98
- #define GSA_ALWAYS3 99
- #define GSA_16_BIT_ROM_PATCH2D 100
- #define GSA_16_BIT_ROM_PATCH2E 101
- #define GSA_16_BIT_ROM_PATCH2F 102
- #define GSA_GROUP_WRITE 103
- #define GSA_32_BIT_ADD2 104
- #define GSA_32_BIT_SUB2 105
- #define GSA_16_BIT_IF_LOWER_OR_EQ_U 106
- #define GSA_16_BIT_IF_HIGHER_OR_EQ_U 107
- #define GSA_16_BIT_MIF_TRUE 108
- #define GSA_16_BIT_MIF_FALSE 109
- #define GSA_16_BIT_MIF_LOWER_OR_EQ_U 110
- #define GSA_16_BIT_MIF_HIGHER_OR_EQ_U 111
- #define MASTER_CODE 112
- #define CHEATS_16_BIT_WRITE 114
- #define CHEATS_32_BIT_WRITE 115
- CheatsData cheatsList[100];
- int cheatsNumber = 0;
- u32 rompatch2addr [4];
- u16 rompatch2val [4];
- u16 rompatch2oldval [4];
- u8 cheatsCBASeedBuffer[0x30];
- u32 cheatsCBASeed[4];
- u32 cheatsCBATemporaryValue = 0;
- u16 cheatsCBATable[256];
- bool cheatsCBATableGenerated = false;
- u16 super = 0;
- extern u32 mastercode;
- u8 cheatsCBACurrentSeed[12] = {
- 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00
- };
- u32 seeds_v1[4];
- u32 seeds_v3[4];
- u32 seed_gen(u8 upper, u8 seed, u8 *deadtable1, u8 *deadtable2);
- //seed tables for AR v1
- u8 v1_deadtable1[256] = {
- 0x31, 0x1C, 0x23, 0xE5, 0x89, 0x8E, 0xA1, 0x37, 0x74, 0x6D, 0x67, 0xFC, 0x1F, 0xC0, 0xB1, 0x94,
- 0x3B, 0x05, 0x56, 0x86, 0x00, 0x24, 0xF0, 0x17, 0x72, 0xA2, 0x3D, 0x1B, 0xE3, 0x17, 0xC5, 0x0B,
- 0xB9, 0xE2, 0xBD, 0x58, 0x71, 0x1B, 0x2C, 0xFF, 0xE4, 0xC9, 0x4C, 0x5E, 0xC9, 0x55, 0x33, 0x45,
- 0x7C, 0x3F, 0xB2, 0x51, 0xFE, 0x10, 0x7E, 0x75, 0x3C, 0x90, 0x8D, 0xDA, 0x94, 0x38, 0xC3, 0xE9,
- 0x95, 0xEA, 0xCE, 0xA6, 0x06, 0xE0, 0x4F, 0x3F, 0x2A, 0xE3, 0x3A, 0xE4, 0x43, 0xBD, 0x7F, 0xDA,
- 0x55, 0xF0, 0xEA, 0xCB, 0x2C, 0xA8, 0x47, 0x61, 0xA0, 0xEF, 0xCB, 0x13, 0x18, 0x20, 0xAF, 0x3E,
- 0x4D, 0x9E, 0x1E, 0x77, 0x51, 0xC5, 0x51, 0x20, 0xCF, 0x21, 0xF9, 0x39, 0x94, 0xDE, 0xDD, 0x79,
- 0x4E, 0x80, 0xC4, 0x9D, 0x94, 0xD5, 0x95, 0x01, 0x27, 0x27, 0xBD, 0x6D, 0x78, 0xB5, 0xD1, 0x31,
- 0x6A, 0x65, 0x74, 0x74, 0x58, 0xB3, 0x7C, 0xC9, 0x5A, 0xED, 0x50, 0x03, 0xC4, 0xA2, 0x94, 0x4B,
- 0xF0, 0x58, 0x09, 0x6F, 0x3E, 0x7D, 0xAE, 0x7D, 0x58, 0xA0, 0x2C, 0x91, 0xBB, 0xE1, 0x70, 0xEB,
- 0x73, 0xA6, 0x9A, 0x44, 0x25, 0x90, 0x16, 0x62, 0x53, 0xAE, 0x08, 0xEB, 0xDC, 0xF0, 0xEE, 0x77,
- 0xC2, 0xDE, 0x81, 0xE8, 0x30, 0x89, 0xDB, 0xFE, 0xBC, 0xC2, 0xDF, 0x26, 0xE9, 0x8B, 0xD6, 0x93,
- 0xF0, 0xCB, 0x56, 0x90, 0xC0, 0x46, 0x68, 0x15, 0x43, 0xCB, 0xE9, 0x98, 0xE3, 0xAF, 0x31, 0x25,
- 0x4D, 0x7B, 0xF3, 0xB1, 0x74, 0xE2, 0x64, 0xAC, 0xD9, 0xF6, 0xA0, 0xD5, 0x0B, 0x9B, 0x49, 0x52,
- 0x69, 0x3B, 0x71, 0x00, 0x2F, 0xBB, 0xBA, 0x08, 0xB1, 0xAE, 0xBB, 0xB3, 0xE1, 0xC9, 0xA6, 0x7F,
- 0x17, 0x97, 0x28, 0x72, 0x12, 0x6E, 0x91, 0xAE, 0x3A, 0xA2, 0x35, 0x46, 0x27, 0xF8, 0x12, 0x50
- };
- u8 v1_deadtable2[256] = {
- 0xD8, 0x65, 0x04, 0xC2, 0x65, 0xD5, 0xB0, 0x0C, 0xDF, 0x9D, 0xF0, 0xC3, 0x9A, 0x17, 0xC9, 0xA6,
- 0xE1, 0xAC, 0x0D, 0x14, 0x2F, 0x3C, 0x2C, 0x87, 0xA2, 0xBF, 0x4D, 0x5F, 0xAC, 0x2D, 0x9D, 0xE1,
- 0x0C, 0x9C, 0xE7, 0x7F, 0xFC, 0xA8, 0x66, 0x59, 0xAC, 0x18, 0xD7, 0x05, 0xF0, 0xBF, 0xD1, 0x8B,
- 0x35, 0x9F, 0x59, 0xB4, 0xBA, 0x55, 0xB2, 0x85, 0xFD, 0xB1, 0x72, 0x06, 0x73, 0xA4, 0xDB, 0x48,
- 0x7B, 0x5F, 0x67, 0xA5, 0x95, 0xB9, 0xA5, 0x4A, 0xCF, 0xD1, 0x44, 0xF3, 0x81, 0xF5, 0x6D, 0xF6,
- 0x3A, 0xC3, 0x57, 0x83, 0xFA, 0x8E, 0x15, 0x2A, 0xA2, 0x04, 0xB2, 0x9D, 0xA8, 0x0D, 0x7F, 0xB8,
- 0x0F, 0xF6, 0xAC, 0xBE, 0x97, 0xCE, 0x16, 0xE6, 0x31, 0x10, 0x60, 0x16, 0xB5, 0x83, 0x45, 0xEE,
- 0xD7, 0x5F, 0x2C, 0x08, 0x58, 0xB1, 0xFD, 0x7E, 0x79, 0x00, 0x34, 0xAD, 0xB5, 0x31, 0x34, 0x39,
- 0xAF, 0xA8, 0xDD, 0x52, 0x6A, 0xB0, 0x60, 0x35, 0xB8, 0x1D, 0x52, 0xF5, 0xF5, 0x30, 0x00, 0x7B,
- 0xF4, 0xBA, 0x03, 0xCB, 0x3A, 0x84, 0x14, 0x8A, 0x6A, 0xEF, 0x21, 0xBD, 0x01, 0xD8, 0xA0, 0xD4,
- 0x43, 0xBE, 0x23, 0xE7, 0x76, 0x27, 0x2C, 0x3F, 0x4D, 0x3F, 0x43, 0x18, 0xA7, 0xC3, 0x47, 0xA5,
- 0x7A, 0x1D, 0x02, 0x55, 0x09, 0xD1, 0xFF, 0x55, 0x5E, 0x17, 0xA0, 0x56, 0xF4, 0xC9, 0x6B, 0x90,
- 0xB4, 0x80, 0xA5, 0x07, 0x22, 0xFB, 0x22, 0x0D, 0xD9, 0xC0, 0x5B, 0x08, 0x35, 0x05, 0xC1, 0x75,
- 0x4F, 0xD0, 0x51, 0x2D, 0x2E, 0x5E, 0x69, 0xE7, 0x3B, 0xC2, 0xDA, 0xFF, 0xF6, 0xCE, 0x3E, 0x76,
- 0xE8, 0x36, 0x8C, 0x39, 0xD8, 0xF3, 0xE9, 0xA6, 0x42, 0xE6, 0xC1, 0x4C, 0x05, 0xBE, 0x17, 0xF2,
- 0x5C, 0x1B, 0x19, 0xDB, 0x0F, 0xF3, 0xF8, 0x49, 0xEB, 0x36, 0xF6, 0x40, 0x6F, 0xAD, 0xC1, 0x8C
- };
- //seed tables for AR v3
- u8 v3_deadtable1[256] = {
- 0xD0, 0xFF, 0xBA, 0xE5, 0xC1, 0xC7, 0xDB, 0x5B, 0x16, 0xE3, 0x6E, 0x26, 0x62, 0x31, 0x2E, 0x2A,
- 0xD1, 0xBB, 0x4A, 0xE6, 0xAE, 0x2F, 0x0A, 0x90, 0x29, 0x90, 0xB6, 0x67, 0x58, 0x2A, 0xB4, 0x45,
- 0x7B, 0xCB, 0xF0, 0x73, 0x84, 0x30, 0x81, 0xC2, 0xD7, 0xBE, 0x89, 0xD7, 0x4E, 0x73, 0x5C, 0xC7,
- 0x80, 0x1B, 0xE5, 0xE4, 0x43, 0xC7, 0x46, 0xD6, 0x6F, 0x7B, 0xBF, 0xED, 0xE5, 0x27, 0xD1, 0xB5,
- 0xD0, 0xD8, 0xA3, 0xCB, 0x2B, 0x30, 0xA4, 0xF0, 0x84, 0x14, 0x72, 0x5C, 0xFF, 0xA4, 0xFB, 0x54,
- 0x9D, 0x70, 0xE2, 0xFF, 0xBE, 0xE8, 0x24, 0x76, 0xE5, 0x15, 0xFB, 0x1A, 0xBC, 0x87, 0x02, 0x2A,
- 0x58, 0x8F, 0x9A, 0x95, 0xBD, 0xAE, 0x8D, 0x0C, 0xA5, 0x4C, 0xF2, 0x5C, 0x7D, 0xAD, 0x51, 0xFB,
- 0xB1, 0x22, 0x07, 0xE0, 0x29, 0x7C, 0xEB, 0x98, 0x14, 0xC6, 0x31, 0x97, 0xE4, 0x34, 0x8F, 0xCC,
- 0x99, 0x56, 0x9F, 0x78, 0x43, 0x91, 0x85, 0x3F, 0xC2, 0xD0, 0xD1, 0x80, 0xD1, 0x77, 0xA7, 0xE2,
- 0x43, 0x99, 0x1D, 0x2F, 0x8B, 0x6A, 0xE4, 0x66, 0x82, 0xF7, 0x2B, 0x0B, 0x65, 0x14, 0xC0, 0xC2,
- 0x1D, 0x96, 0x78, 0x1C, 0xC4, 0xC3, 0xD2, 0xB1, 0x64, 0x07, 0xD7, 0x6F, 0x02, 0xE9, 0x44, 0x31,
- 0xDB, 0x3C, 0xEB, 0x93, 0xED, 0x9A, 0x57, 0x05, 0xB9, 0x0E, 0xAF, 0x1F, 0x48, 0x11, 0xDC, 0x35,
- 0x6C, 0xB8, 0xEE, 0x2A, 0x48, 0x2B, 0xBC, 0x89, 0x12, 0x59, 0xCB, 0xD1, 0x18, 0xEA, 0x72, 0x11,
- 0x01, 0x75, 0x3B, 0xB5, 0x56, 0xF4, 0x8B, 0xA0, 0x41, 0x75, 0x86, 0x7B, 0x94, 0x12, 0x2D, 0x4C,
- 0x0C, 0x22, 0xC9, 0x4A, 0xD8, 0xB1, 0x8D, 0xF0, 0x55, 0x2E, 0x77, 0x50, 0x1C, 0x64, 0x77, 0xAA,
- 0x3E, 0xAC, 0xD3, 0x3D, 0xCE, 0x60, 0xCA, 0x5D, 0xA0, 0x92, 0x78, 0xC6, 0x51, 0xFE, 0xF9, 0x30
- };
- u8 v3_deadtable2[256] = {
- 0xAA, 0xAF, 0xF0, 0x72, 0x90, 0xF7, 0x71, 0x27, 0x06, 0x11, 0xEB, 0x9C, 0x37, 0x12, 0x72, 0xAA,
- 0x65, 0xBC, 0x0D, 0x4A, 0x76, 0xF6, 0x5C, 0xAA, 0xB0, 0x7A, 0x7D, 0x81, 0xC1, 0xCE, 0x2F, 0x9F,
- 0x02, 0x75, 0x38, 0xC8, 0xFC, 0x66, 0x05, 0xC2, 0x2C, 0xBD, 0x91, 0xAD, 0x03, 0xB1, 0x88, 0x93,
- 0x31, 0xC6, 0xAB, 0x40, 0x23, 0x43, 0x76, 0x54, 0xCA, 0xE7, 0x00, 0x96, 0x9F, 0xD8, 0x24, 0x8B,
- 0xE4, 0xDC, 0xDE, 0x48, 0x2C, 0xCB, 0xF7, 0x84, 0x1D, 0x45, 0xE5, 0xF1, 0x75, 0xA0, 0xED, 0xCD,
- 0x4B, 0x24, 0x8A, 0xB3, 0x98, 0x7B, 0x12, 0xB8, 0xF5, 0x63, 0x97, 0xB3, 0xA6, 0xA6, 0x0B, 0xDC,
- 0xD8, 0x4C, 0xA8, 0x99, 0x27, 0x0F, 0x8F, 0x94, 0x63, 0x0F, 0xB0, 0x11, 0x94, 0xC7, 0xE9, 0x7F,
- 0x3B, 0x40, 0x72, 0x4C, 0xDB, 0x84, 0x78, 0xFE, 0xB8, 0x56, 0x08, 0x80, 0xDF, 0x20, 0x2F, 0xB9,
- 0x66, 0x2D, 0x60, 0x63, 0xF5, 0x18, 0x15, 0x1B, 0x86, 0x85, 0xB9, 0xB4, 0x68, 0x0E, 0xC6, 0xD1,
- 0x8A, 0x81, 0x2B, 0xB3, 0xF6, 0x48, 0xF0, 0x4F, 0x9C, 0x28, 0x1C, 0xA4, 0x51, 0x2F, 0xD7, 0x4B,
- 0x17, 0xE7, 0xCC, 0x50, 0x9F, 0xD0, 0xD1, 0x40, 0x0C, 0x0D, 0xCA, 0x83, 0xFA, 0x5E, 0xCA, 0xEC,
- 0xBF, 0x4E, 0x7C, 0x8F, 0xF0, 0xAE, 0xC2, 0xD3, 0x28, 0x41, 0x9B, 0xC8, 0x04, 0xB9, 0x4A, 0xBA,
- 0x72, 0xE2, 0xB5, 0x06, 0x2C, 0x1E, 0x0B, 0x2C, 0x7F, 0x11, 0xA9, 0x26, 0x51, 0x9D, 0x3F, 0xF8,
- 0x62, 0x11, 0x2E, 0x89, 0xD2, 0x9D, 0x35, 0xB1, 0xE4, 0x0A, 0x4D, 0x93, 0x01, 0xA7, 0xD1, 0x2D,
- 0x00, 0x87, 0xE2, 0x2D, 0xA4, 0xE9, 0x0A, 0x06, 0x66, 0xF8, 0x1F, 0x44, 0x75, 0xB5, 0x6B, 0x1C,
- 0xFC, 0x31, 0x09, 0x48, 0xA3, 0xFF, 0x92, 0x12, 0x58, 0xE9, 0xFA, 0xAE, 0x4F, 0xE2, 0xB4, 0xCC
- };
- #define debuggerReadMemory(addr) \
- READ32LE((&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask]))
- #define debuggerReadHalfWord(addr) \
- READ16LE((&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask]))
- #define debuggerReadByte(addr) \
- map[(addr)>>24].address[(addr) & map[(addr)>>24].mask]
- #define debuggerWriteMemory(addr, value) \
- WRITE32LE(&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask], value)
- #define debuggerWriteHalfWord(addr, value) \
- WRITE16LE(&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask], value)
- #define debuggerWriteByte(addr, value) \
- map[(addr)>>24].address[(addr) & map[(addr)>>24].mask] = (value)
- #define CHEAT_IS_HEX(a) ( ((a)>='A' && (a) <='F') || ((a) >='0' && (a) <= '9'))
- #define CHEAT_PATCH_ROM_16BIT(a,v) \
- WRITE16LE(((u16 *)&rom[(a) & 0x1ffffff]), v);
- #define CHEAT_PATCH_ROM_32BIT(a,v) \
- WRITE32LE(((u32 *)&rom[(a) & 0x1ffffff]), v);
- static bool isMultilineWithData(int i)
- {
- // we consider it a multiline code if it has more than one line of data
- // otherwise, it can still be considered a single code
- // (Only CBA codes can be true multilines !!!)
- if(i < cheatsNumber && i >= 0)
- switch(cheatsList[i].size) {
- case INT_8_BIT_WRITE:
- case INT_16_BIT_WRITE:
- case INT_32_BIT_WRITE:
- case GSA_16_BIT_ROM_PATCH:
- case GSA_8_BIT_GS_WRITE:
- case GSA_16_BIT_GS_WRITE:
- case GSA_32_BIT_GS_WRITE:
- case CBA_AND:
- case CBA_IF_KEYS_PRESSED:
- case CBA_IF_TRUE:
- case CBA_IF_FALSE:
- case GSA_8_BIT_IF_TRUE:
- case GSA_32_BIT_IF_TRUE:
- case GSA_8_BIT_IF_FALSE:
- case GSA_32_BIT_IF_FALSE:
- case GSA_8_BIT_FILL:
- case GSA_16_BIT_FILL:
- case GSA_8_BIT_IF_TRUE2:
- case GSA_16_BIT_IF_TRUE2:
- case GSA_32_BIT_IF_TRUE2:
- case GSA_8_BIT_IF_FALSE2:
- case GSA_16_BIT_IF_FALSE2:
- case GSA_32_BIT_IF_FALSE2:
- case GSA_SLOWDOWN:
- case CBA_ADD:
- case CBA_OR:
- case CBA_LT:
- case CBA_GT:
- case GSA_8_BIT_POINTER:
- case GSA_16_BIT_POINTER:
- case GSA_32_BIT_POINTER:
- case GSA_8_BIT_ADD:
- case GSA_16_BIT_ADD:
- case GSA_32_BIT_ADD:
- case GSA_8_BIT_IF_LOWER_U:
- case GSA_16_BIT_IF_LOWER_U:
- case GSA_32_BIT_IF_LOWER_U:
- case GSA_8_BIT_IF_HIGHER_U:
- case GSA_16_BIT_IF_HIGHER_U:
- case GSA_32_BIT_IF_HIGHER_U:
- case GSA_8_BIT_IF_AND:
- case GSA_16_BIT_IF_AND:
- case GSA_32_BIT_IF_AND:
- case GSA_8_BIT_IF_LOWER_U2:
- case GSA_16_BIT_IF_LOWER_U2:
- case GSA_32_BIT_IF_LOWER_U2:
- case GSA_8_BIT_IF_HIGHER_U2:
- case GSA_16_BIT_IF_HIGHER_U2:
- case GSA_32_BIT_IF_HIGHER_U2:
- case GSA_8_BIT_IF_AND2:
- case GSA_16_BIT_IF_AND2:
- case GSA_32_BIT_IF_AND2:
- case GSA_ALWAYS:
- case GSA_ALWAYS2:
- case GSA_8_BIT_IF_LOWER_S:
- case GSA_16_BIT_IF_LOWER_S:
- case GSA_32_BIT_IF_LOWER_S:
- case GSA_8_BIT_IF_HIGHER_S:
- case GSA_16_BIT_IF_HIGHER_S:
- case GSA_32_BIT_IF_HIGHER_S:
- case GSA_8_BIT_IF_LOWER_S2:
- case GSA_16_BIT_IF_LOWER_S2:
- case GSA_32_BIT_IF_LOWER_S2:
- case GSA_8_BIT_IF_HIGHER_S2:
- case GSA_16_BIT_IF_HIGHER_S2:
- case GSA_32_BIT_IF_HIGHER_S2:
- case GSA_16_BIT_WRITE_IOREGS:
- case GSA_32_BIT_WRITE_IOREGS:
- case GSA_CODES_ON:
- case GSA_8_BIT_IF_TRUE3:
- case GSA_16_BIT_IF_TRUE3:
- case GSA_32_BIT_IF_TRUE3:
- case GSA_8_BIT_IF_FALSE3:
- case GSA_16_BIT_IF_FALSE3:
- case GSA_32_BIT_IF_FALSE3:
- case GSA_8_BIT_IF_LOWER_S3:
- case GSA_16_BIT_IF_LOWER_S3:
- case GSA_32_BIT_IF_LOWER_S3:
- case GSA_8_BIT_IF_HIGHER_S3:
- case GSA_16_BIT_IF_HIGHER_S3:
- case GSA_32_BIT_IF_HIGHER_S3:
- case GSA_8_BIT_IF_LOWER_U3:
- case GSA_16_BIT_IF_LOWER_U3:
- case GSA_32_BIT_IF_LOWER_U3:
- case GSA_8_BIT_IF_HIGHER_U3:
- case GSA_16_BIT_IF_HIGHER_U3:
- case GSA_32_BIT_IF_HIGHER_U3:
- case GSA_8_BIT_IF_AND3:
- case GSA_16_BIT_IF_AND3:
- case GSA_32_BIT_IF_AND3:
- case GSA_ALWAYS3:
- case GSA_8_BIT_GS_WRITE2:
- case GSA_16_BIT_GS_WRITE2:
- case GSA_32_BIT_GS_WRITE2:
- case GSA_16_BIT_ROM_PATCH2C:
- case GSA_16_BIT_ROM_PATCH2D:
- case GSA_16_BIT_ROM_PATCH2E:
- case GSA_16_BIT_ROM_PATCH2F:
- case GSA_8_BIT_SLIDE:
- case GSA_16_BIT_SLIDE:
- case GSA_32_BIT_SLIDE:
- case GSA_GROUP_WRITE:
- case GSA_32_BIT_ADD2:
- case GSA_32_BIT_SUB2:
- case GSA_16_BIT_IF_LOWER_OR_EQ_U:
- case GSA_16_BIT_IF_HIGHER_OR_EQ_U:
- case GSA_16_BIT_MIF_TRUE:
- case GSA_16_BIT_MIF_FALSE:
- case GSA_16_BIT_MIF_LOWER_OR_EQ_U:
- case GSA_16_BIT_MIF_HIGHER_OR_EQ_U:
- case MASTER_CODE:
- case CHEATS_16_BIT_WRITE:
- case CHEATS_32_BIT_WRITE:
- return false;
- // the codes below have two lines of data
- case CBA_SLIDE_CODE:
- case CBA_SUPER:
- return true;
- }
- return false;
- }
- static int getCodeLength(int num)
- {
- if(num >= cheatsNumber || num < 0)
- return 1;
- // this is for all the codes that are true multiline
- switch(cheatsList[num].size) {
- case INT_8_BIT_WRITE:
- case INT_16_BIT_WRITE:
- case INT_32_BIT_WRITE:
- case GSA_16_BIT_ROM_PATCH:
- case GSA_8_BIT_GS_WRITE:
- case GSA_16_BIT_GS_WRITE:
- case GSA_32_BIT_GS_WRITE:
- case CBA_AND:
- case GSA_8_BIT_FILL:
- case GSA_16_BIT_FILL:
- case GSA_SLOWDOWN:
- case CBA_ADD:
- case CBA_OR:
- case GSA_8_BIT_POINTER:
- case GSA_16_BIT_POINTER:
- case GSA_32_BIT_POINTER:
- case GSA_8_BIT_ADD:
- case GSA_16_BIT_ADD:
- case GSA_32_BIT_ADD:
- case GSA_CODES_ON:
- case GSA_8_BIT_IF_TRUE3:
- case GSA_16_BIT_IF_TRUE3:
- case GSA_32_BIT_IF_TRUE3:
- case GSA_8_BIT_IF_FALSE3:
- case GSA_16_BIT_IF_FALSE3:
- case GSA_32_BIT_IF_FALSE3:
- case GSA_8_BIT_IF_LOWER_S3:
- case GSA_16_BIT_IF_LOWER_S3:
- case GSA_32_BIT_IF_LOWER_S3:
- case GSA_8_BIT_IF_HIGHER_S3:
- case GSA_16_BIT_IF_HIGHER_S3:
- case GSA_32_BIT_IF_HIGHER_S3:
- case GSA_8_BIT_IF_LOWER_U3:
- case GSA_16_BIT_IF_LOWER_U3:
- case GSA_32_BIT_IF_LOWER_U3:
- case GSA_8_BIT_IF_HIGHER_U3:
- case GSA_16_BIT_IF_HIGHER_U3:
- case GSA_32_BIT_IF_HIGHER_U3:
- case GSA_8_BIT_IF_AND3:
- case GSA_16_BIT_IF_AND3:
- case GSA_32_BIT_IF_AND3:
- case GSA_8_BIT_IF_LOWER_U:
- case GSA_16_BIT_IF_LOWER_U:
- case GSA_32_BIT_IF_LOWER_U:
- case GSA_8_BIT_IF_HIGHER_U:
- case GSA_16_BIT_IF_HIGHER_U:
- case GSA_32_BIT_IF_HIGHER_U:
- case GSA_8_BIT_IF_AND:
- case GSA_16_BIT_IF_AND:
- case GSA_32_BIT_IF_AND:
- case GSA_ALWAYS:
- case GSA_8_BIT_IF_LOWER_S:
- case GSA_16_BIT_IF_LOWER_S:
- case GSA_32_BIT_IF_LOWER_S:
- case GSA_8_BIT_IF_HIGHER_S:
- case GSA_16_BIT_IF_HIGHER_S:
- case GSA_32_BIT_IF_HIGHER_S:
- case GSA_16_BIT_WRITE_IOREGS:
- case GSA_32_BIT_WRITE_IOREGS:
- case GSA_8_BIT_GS_WRITE2:
- case GSA_16_BIT_GS_WRITE2:
- case GSA_32_BIT_GS_WRITE2:
- case GSA_16_BIT_ROM_PATCH2C:
- case GSA_16_BIT_ROM_PATCH2D:
- case GSA_16_BIT_ROM_PATCH2E:
- case GSA_16_BIT_ROM_PATCH2F:
- case GSA_8_BIT_SLIDE:
- case GSA_16_BIT_SLIDE:
- case GSA_32_BIT_SLIDE:
- case GSA_8_BIT_IF_TRUE:
- case GSA_32_BIT_IF_TRUE:
- case GSA_8_BIT_IF_FALSE:
- case GSA_32_BIT_IF_FALSE:
- case CBA_LT:
- case CBA_GT:
- case CBA_IF_TRUE:
- case CBA_IF_FALSE:
- case GSA_8_BIT_IF_TRUE2:
- case GSA_16_BIT_IF_TRUE2:
- case GSA_32_BIT_IF_TRUE2:
- case GSA_8_BIT_IF_FALSE2:
- case GSA_16_BIT_IF_FALSE2:
- case GSA_32_BIT_IF_FALSE2:
- case GSA_8_BIT_IF_LOWER_U2:
- case GSA_16_BIT_IF_LOWER_U2:
- case GSA_32_BIT_IF_LOWER_U2:
- case GSA_8_BIT_IF_HIGHER_U2:
- case GSA_16_BIT_IF_HIGHER_U2:
- case GSA_32_BIT_IF_HIGHER_U2:
- case GSA_8_BIT_IF_AND2:
- case GSA_16_BIT_IF_AND2:
- case GSA_32_BIT_IF_AND2:
- case GSA_ALWAYS2:
- case GSA_8_BIT_IF_LOWER_S2:
- case GSA_16_BIT_IF_LOWER_S2:
- case GSA_32_BIT_IF_LOWER_S2:
- case GSA_8_BIT_IF_HIGHER_S2:
- case GSA_16_BIT_IF_HIGHER_S2:
- case GSA_32_BIT_IF_HIGHER_S2:
- case GSA_GROUP_WRITE:
- case GSA_32_BIT_ADD2:
- case GSA_32_BIT_SUB2:
- case GSA_16_BIT_IF_LOWER_OR_EQ_U:
- case GSA_16_BIT_IF_HIGHER_OR_EQ_U:
- case GSA_16_BIT_MIF_TRUE:
- case GSA_16_BIT_MIF_FALSE:
- case GSA_16_BIT_MIF_LOWER_OR_EQ_U:
- case GSA_16_BIT_MIF_HIGHER_OR_EQ_U:
- case MASTER_CODE:
- case CHEATS_16_BIT_WRITE:
- case CHEATS_32_BIT_WRITE:
- case UNKNOWN_CODE:
- return 1;
- case CBA_IF_KEYS_PRESSED:
- case CBA_SLIDE_CODE:
- return 2;
- case CBA_SUPER:
- return ((((cheatsList[num].value-1) & 0xFFFF)/3) + 1);
- }
- return 1;
- }
- int cheatsCheckKeys(u32 keys, u32 extended)
- {
- bool onoff = true;
- int ticks = 0;
- int i;
- mastercode = 0;
- for (i = 0; i<4; i++)
- if (rompatch2addr [i] != 0) {
- CHEAT_PATCH_ROM_16BIT(rompatch2addr [i],rompatch2oldval [i]);
- rompatch2addr [i] = 0;
- }
- for (i = 0; i < cheatsNumber; i++) {
- if(!cheatsList[i].enabled) {
- // make sure we skip other lines in this code
- i += getCodeLength(i)-1;
- continue;
- }
- switch(cheatsList[i].size) {
- case GSA_CODES_ON:
- onoff = true;
- break;
- case GSA_SLOWDOWN:
- // check if button was pressed and released, if so toggle our state
- if((cheatsList[i].status & 4) && !(extended & 4))
- cheatsList[i].status ^= 1;
- if(extended & 4)
- cheatsList[i].status |= 4;
- else
- cheatsList[i].status &= ~4;
- if(cheatsList[i].status & 1)
- ticks += ((cheatsList[i].value & 0xFFFF) * 7);
- break;
- case GSA_8_BIT_SLIDE:
- i++;
- if(i < cheatsNumber) {
- u32 addr = cheatsList[i-1].value;
- u8 value = cheatsList[i].rawaddress;
- int vinc = (cheatsList[i].value >> 24) & 255;
- int count = (cheatsList[i].value >> 16) & 255;
- int ainc = (cheatsList[i].value & 0xffff);
- while(count > 0) {
- CPUWriteByte(addr, value);
- value += vinc;
- addr += ainc;
- count--;
- }
- }
- break;
- case GSA_16_BIT_SLIDE:
- i++;
- if(i < cheatsNumber) {
- u32 addr = cheatsList[i-1].value;
- u16 value = cheatsList[i].rawaddress;
- int vinc = (cheatsList[i].value >> 24) & 255;
- int count = (cheatsList[i].value >> 16) & 255;
- int ainc = (cheatsList[i].value & 0xffff)*2;
- while(count > 0) {
- CPUWriteHalfWord(addr, value);
- value += vinc;
- addr += ainc;
- count--;
- }
- }
- break;
- case GSA_32_BIT_SLIDE:
- i++;
- if(i < cheatsNumber) {
- u32 addr = cheatsList[i-1].value;
- u32 value = cheatsList[i].rawaddress;
- int vinc = (cheatsList[i].value >> 24) & 255;
- int count = (cheatsList[i].value >> 16) & 255;
- int ainc = (cheatsList[i].value & 0xffff)*4;
- while(count > 0) {
- CPUWriteMemory(addr, value);
- value += vinc;
- addr += ainc;
- count--;
- }
- }
- break;
- case GSA_8_BIT_GS_WRITE2:
- i++;
- if(i < cheatsNumber) {
- if(extended & 4) {
- CPUWriteByte(cheatsList[i-1].value, cheatsList[i].address);
- }
- }
- break;
- case GSA_16_BIT_GS_WRITE2:
- i++;
- if(i < cheatsNumber) {
- if(extended & 4) {
- CPUWriteHalfWord(cheatsList[i-1].value, cheatsList[i].address);
- }
- }
- break;
- case GSA_32_BIT_GS_WRITE2:
- i++;
- if(i < cheatsNumber) {
- if(extended & 4) {
- CPUWriteMemory(cheatsList[i-1].value, cheatsList[i].address);
- }
- }
- break;
- case GSA_16_BIT_ROM_PATCH:
- if((cheatsList[i].status & 1) == 0) {
- if(CPUReadHalfWord(cheatsList[i].address) != cheatsList[i].value) {
- cheatsList[i].oldValue = CPUReadHalfWord(cheatsList[i].address);
- cheatsList[i].status |= 1;
- CHEAT_PATCH_ROM_16BIT(cheatsList[i].address, cheatsList[i].value);
- }
- }
- break;
- case GSA_16_BIT_ROM_PATCH2C:
- i++;
- if(i < cheatsNumber) {
- rompatch2addr [0] = ((cheatsList[i-1].value & 0x00FFFFFF) << 1) + 0x8000000;
- rompatch2oldval [0] = CPUReadHalfWord(rompatch2addr [0]);
- rompatch2val [0] = cheatsList[i].rawaddress & 0xFFFF;
- }
- break;
- case GSA_16_BIT_ROM_PATCH2D:
- i++;
- if(i < cheatsNumber) {
- rompatch2addr [1] = ((cheatsList[i-1].value & 0x00FFFFFF) << 1) + 0x8000000;
- rompatch2oldval [1] = CPUReadHalfWord(rompatch2addr [1]);
- rompatch2val [1] = cheatsList[i].rawaddress & 0xFFFF;
- }
- break;
- case GSA_16_BIT_ROM_PATCH2E:
- i++;
- if(i < cheatsNumber) {
- rompatch2addr [2] = ((cheatsList[i-1].value & 0x00FFFFFF) << 1) + 0x8000000;
- rompatch2oldval [2] = CPUReadHalfWord(rompatch2addr [2]);
- rompatch2val [2] = cheatsList[i].rawaddress & 0xFFFF;
- }
- break;
- case GSA_16_BIT_ROM_PATCH2F:
- i++;
- if(i < cheatsNumber) {
- rompatch2addr [3] = ((cheatsList[i-1].value & 0x00FFFFFF) << 1) + 0x8000000;
- rompatch2oldval [3] = CPUReadHalfWord(rompatch2addr [3]);
- rompatch2val [3] = cheatsList[i].rawaddress & 0xFFFF;
- }
- break;
- case MASTER_CODE:
- mastercode = cheatsList[i].address;
- break;
- }
- if (onoff) {
- switch(cheatsList[i].size) {
- case INT_8_BIT_WRITE:
- CPUWriteByte(cheatsList[i].address, cheatsList[i].value);
- break;
- case INT_16_BIT_WRITE:
- CPUWriteHalfWord(cheatsList[i].address, cheatsList[i].value);
- break;
- case INT_32_BIT_WRITE:
- CPUWriteMemory(cheatsList[i].address, cheatsList[i].value);
- break;
- case GSA_8_BIT_GS_WRITE:
- if(extended & 4) {
- CPUWriteByte(cheatsList[i].address, cheatsList[i].value);
- }
- break;
- case GSA_16_BIT_GS_WRITE:
- if(extended & 4) {
- CPUWriteHalfWord(cheatsList[i].address, cheatsList[i].value);
- }
- break;
- case GSA_32_BIT_GS_WRITE:
- if(extended & 4) {
- CPUWriteMemory(cheatsList[i].address, cheatsList[i].value);
- }
- break;
- case CBA_IF_KEYS_PRESSED:
- {
- u16 value = cheatsList[i].value;
- u32 addr = cheatsList[i].address;
- if((addr & 0xF0) == 0x20) {
- if((keys & value) == 0) {
- i++;
- }
- } else if((addr & 0xF0) == 0x10) {
- if((keys & value) == value) {
- i++;
- }
- } else if((addr & 0xF0) == 0x00) {
- if(((~keys) & 0x3FF) == value) {
- i++;
- }
- }
- }
- break;
- case CBA_IF_TRUE:
- if(CPUReadHalfWord(cheatsList[i].address) != cheatsList[i].value) {
- i++;
- }
- break;
- case CBA_SLIDE_CODE:
- {
- u32 address = cheatsList[i].address;
- u16 value = cheatsList[i].value;
- i++;
- if(i < cheatsNumber) {
- int count = ((cheatsList[i].address - 1) & 0xFFFF);
- u16 vinc = (cheatsList[i].address >> 16) & 0xFFFF;
- int inc = cheatsList[i].value;
- for(int x = 0; x <= count ; x++) {
- CPUWriteHalfWord(address, value);
- address += inc;
- value += vinc;
- }
- }
- }
- break;
- case CBA_IF_FALSE:
- if(CPUReadHalfWord(cheatsList[i].address) == cheatsList[i].value){
- i++;
- }
- break;
- case CBA_AND:
- CPUWriteHalfWord(cheatsList[i].address,
- CPUReadHalfWord(cheatsList[i].address) &
- cheatsList[i].value);
- break;
- case GSA_8_BIT_IF_TRUE:
- if(CPUReadByte(cheatsList[i].address) != cheatsList[i].value) {
- i++;
- }
- break;
- case GSA_32_BIT_IF_TRUE:
- if(CPUReadMemory(cheatsList[i].address) != cheatsList[i].value) {
- i++;
- }
- break;
- case GSA_8_BIT_IF_FALSE:
- if(CPUReadByte(cheatsList[i].address) == cheatsList[i].value) {
- i++;
- }
- break;
- case GSA_32_BIT_IF_FALSE:
- if(CPUReadMemory(cheatsList[i].address) == cheatsList[i].value) {
- i++;
- }
- break;
- case GSA_8_BIT_FILL:
- {
- u32 addr = cheatsList[i].address;
- u8 v = cheatsList[i].value & 0xff;
- u32 end = addr + (cheatsList[i].value >> 8);
- do {
- CPUWriteByte(addr, v);
- addr++;
- } while (addr <= end);
- }
- break;
- case GSA_16_BIT_FILL:
- {
- u32 addr = cheatsList[i].address;
- u16 v = cheatsList[i].value & 0xffff;
- u32 end = addr + ((cheatsList[i].value >> 16) << 1);
- do {
- CPUWriteHalfWord(addr, v);
- addr+=2;
- } while (addr <= end);
- }
- break;
- case GSA_8_BIT_IF_TRUE2:
- if(CPUReadByte(cheatsList[i].address) != cheatsList[i].value) {
- i+=2;
- }
- break;
- case GSA_16_BIT_IF_TRUE2:
- if(CPUReadHalfWord(cheatsList[i].address) != cheatsList[i].value) {
- i+=2;
- }
- break;
- case GSA_32_BIT_IF_TRUE2:
- if(CPUReadMemory(cheatsList[i].address) != cheatsList[i].value) {
- i+=2;
- }
- break;
- case GSA_8_BIT_IF_FALSE2:
- if(CPUReadByte(cheatsList[i].address) == cheatsList[i].value) {
- i+=2;
- }
- break;
- case GSA_16_BIT_IF_FALSE2:
- if(CPUReadHalfWord(cheatsList[i].address) == cheatsList[i].value) {
- i+=2;
- }
- break;
- case GSA_32_BIT_IF_FALSE2:
- if(CPUReadMemory(cheatsList[i].address) == cheatsList[i].value) {
- i+=2;
- }
- break;
- case CBA_ADD:
- if ((cheatsList[i].address & 1) == 0) {
- CPUWriteHalfWord(cheatsList[i].address,
- CPUReadHalfWord(cheatsList[i].address) +
- cheatsList[i].value);
- } else {
- CPUWriteMemory(cheatsList[i].address & 0x0FFFFFFE,
- CPUReadMemory(cheatsList[i].address & 0x0FFFFFFE) +
- cheatsList[i].value);
- }
- break;
- case CBA_OR:
- CPUWriteHalfWord(cheatsList[i].address,
- CPUReadHalfWord(cheatsList[i].address) |
- cheatsList[i].value);
- break;
- case CBA_GT:
- if (!(CPUReadHalfWord(cheatsList[i].address) > cheatsList[i].value)){
- i++;
- }
- break;
- case CBA_LT:
- if (!(CPUReadHalfWord(cheatsList[i].address) < cheatsList[i].value)){
- i++;
- }
- break;
- case CBA_SUPER:
- {
- int count = 2*((cheatsList[i].value -1) & 0xFFFF)+1;
- u32 address = cheatsList[i].address;
- for(int x = 0; x <= count; x++) {
- u8 b;
- int res = x % 6;
- if (res==0)
- i++;
- if(res < 4)
- b = (cheatsList[i].address >> (24-8*res)) & 0xFF;
- else
- b = (cheatsList[i].value >> (8 - 8*(res-4))) & 0xFF;
- CPUWriteByte(address, b);
- address++;
- }
- }
- break;
- case GSA_8_BIT_POINTER :
- if (((CPUReadMemory(cheatsList[i].address)>=0x02000000) && (CPUReadMemory(cheatsList[i].address)<0x02040000)) ||
- ((CPUReadMemory(cheatsList[i].address)>=0x03000000) && (CPUReadMemory(cheatsList[i].address)<0x03008000)))
- {
- CPUWriteByte(CPUReadMemory(cheatsList[i].address)+((cheatsList[i].value & 0xFFFFFF00) >> 8),
- cheatsList[i].value & 0xFF);
- }
- break;
- case GSA_16_BIT_POINTER :
- if (((CPUReadMemory(cheatsList[i].address)>=0x02000000) && (CPUReadMemory(cheatsList[i].address)<0x02040000)) ||
- ((CPUReadMemory(cheatsList[i].address)>=0x03000000) && (CPUReadMemory(cheatsList[i].address)<0x03008000)))
- {
- CPUWriteHalfWord(CPUReadMemory(cheatsList[i].address)+((cheatsList[i].value & 0xFFFF0000) >> 15),
- cheatsList[i].value & 0xFFFF);
- }
- break;
- case GSA_32_BIT_POINTER :
- if (((CPUReadMemory(cheatsList[i].address)>=0x02000000) && (CPUReadMemory(cheatsList[i].address)<0x02040000)) ||
- ((CPUReadMemory(cheatsList[i].address)>=0x03000000) && (CPUReadMemory(cheatsList[i].address)<0x03008000)))
- {
- CPUWriteMemory(CPUReadMemory(cheatsList[i].address),
- cheatsList[i].value);
- }
- break;
- case GSA_8_BIT_ADD :
- CPUWriteByte(cheatsList[i].address,
- ((cheatsList[i].value & 0xFF) + CPUReadMemory(cheatsList[i].address)) & 0xFF);
- break;
- case GSA_16_BIT_ADD :
- CPUWriteHalfWord(cheatsList[i].address,
- ((cheatsList[i].value & 0xFFFF) + CPUReadMemory(cheatsList[i].address)) & 0xFFFF);
- break;
- case GSA_32_BIT_ADD :
- CPUWriteMemory(cheatsList[i].address ,
- (cheatsList[i].value + CPUReadMemory(cheatsList[i].address)) & 0xFFFFFFFF);
- break;
- case GSA_8_BIT_IF_LOWER_U:
- if (!(CPUReadByte(cheatsList[i].address) < (cheatsList[i].value & 0xFF))) {
- i++;
- }
- break;
- case GSA_16_BIT_IF_LOWER_U:
- if (!(CPUReadHalfWord(cheatsList[i].address) < (cheatsList[i].value & 0xFFFF))) {
- i++;
- }
- break;
- case GSA_32_BIT_IF_LOWER_U:
- if (!(CPUReadMemory(cheatsList[i].address) < cheatsList[i].value)) {
- i++;
- }
- break;
- case GSA_8_BIT_IF_HIGHER_U:
- if (!(CPUReadByte(cheatsList[i].address) > (cheatsList[i].value & 0xFF))) {
- i++;
- }
- break;
- case GSA_16_BIT_IF_HIGHER_U:
- if (!(CPUReadHalfWord(cheatsList[i].address) > (cheatsList[i].value & 0xFFFF))) {
- i++;
- }
- break;
- case GSA_32_BIT_IF_HIGHER_U:
- if (!(CPUReadMemory(cheatsList[i].address) > cheatsList[i].value)) {
- i++;
- }
- break;
- case GSA_8_BIT_IF_AND:
- if (!(CPUReadByte(cheatsList[i].address) & (cheatsList[i].value & 0xFF))) {
- i++;
- }
- break;
- case GSA_16_BIT_IF_AND:
- if (!(CPUReadHalfWord(cheatsList[i].address) & (cheatsList[i].value & 0xFFFF))) {
- i++;
- }
- break;
- case GSA_32_BIT_IF_AND:
- if (!(CPUReadMemory(cheatsList[i].address) & cheatsList[i].value)) {
- i++;
- }
- break;
- case GSA_8_BIT_IF_LOWER_U2:
- if (!(CPUReadByte(cheatsList[i].address) < (cheatsList[i].value & 0xFF))) {
- i+=2;
- }
- break;
- case GSA_16_BIT_IF_LOWER_U2:
- if (!(CPUReadHalfWord(cheatsList[i].address) < (cheatsList[i].value & 0xFFFF))) {
- i+=2;
- }
- break;
- case GSA_32_BIT_IF_LOWER_U2:
- if (!(CPUReadMemory(cheatsList[i].address) < cheatsList[i].value)) {
- i+=2;
- }
- break;
- case GSA_8_BIT_IF_HIGHER_U2:
- if (!(CPUReadByte(cheatsList[i].address) > (cheatsList[i].value & 0xFF))) {
- i+=2;
- }
- break;
- case GSA_16_BIT_IF_HIGHER_U2:
- if (!(CPUReadHalfWord(cheatsList[i].address) > (cheatsList[i].value & 0xFFFF))) {
- i+=2;
- }
- break;
- case GSA_32_BIT_IF_HIGHER_U2:
- if (!(CPUReadMemory(cheatsList[i].address) > cheatsList[i].value)) {
- i+=2;
- }
- break;
- case GSA_8_BIT_IF_AND2:
- if (!(CPUReadByte(cheatsList[i].address) & (cheatsList[i].value & 0xFF))) {
- i+=2;
- }
- break;
- case GSA_16_BIT_IF_AND2:
- if (!(CPUReadHalfWord(cheatsList[i].address) & (cheatsList[i].value & 0xFFFF))) {
- i+=2;
- }
- break;
- case GSA_32_BIT_IF_AND2:
- if (!(CPUReadMemory(cheatsList[i].address) & cheatsList[i].value)) {
- i+=2;
- }
- break;
- case GSA_ALWAYS:
- i++;
- break;
- case GSA_ALWAYS2:
- i+=2;
- break;
- case GSA_8_BIT_IF_LOWER_S:
- if (!((s8)CPUReadByte(cheatsList[i].address) < ((s8)cheatsList[i].value & 0xFF))) {
- i++;
- }
- break;
- case GSA_16_BIT_IF_LOWER_S:
- if (!((s16)CPUReadHalfWord(cheatsList[i].address) < ((s16)cheatsList[i].value & 0xFFFF))) {
- i++;
- }
- break;
- case GSA_32_BIT_IF_LOWER_S:
- if (!((s32)CPUReadMemory(cheatsList[i].address) < (s32)cheatsList[i].value)) {
- i++;
- }
- break;
- case GSA_8_BIT_IF_HIGHER_S:
- if (!((s8)CPUReadByte(cheatsList[i].address) > ((s8)cheatsList[i].value & 0xFF))) {
- i++;
- }
- break;
- case GSA_16_BIT_IF_HIGHER_S:
- if (!((s16)CPUReadHalfWord(cheatsList[i].address) > ((s16)cheatsList[i].value & 0xFFFF))) {
- i++;
- }
- break;
- case GSA_32_BIT_IF_HIGHER_S:
- if (!((s32)CPUReadMemory(cheatsList[i].address) > (s32)cheatsList[i].value)) {
- i++;
- }
- break;
- case GSA_8_BIT_IF_LOWER_S2:
- if (!((s8)CPUReadByte(cheatsList[i].address) < ((s8)cheatsList[i].value & 0xFF))) {
- i+=2;
- }
- break;
- case GSA_16_BIT_IF_LOWER_S2:
- if (!((s16)CPUReadHalfWord(cheatsList[i].address) < ((s16)cheatsList[i].value & 0xFFFF))) {
- i+=2;
- }
- break;
- case GSA_32_BIT_IF_LOWER_S2:
- if (!((s32)CPUReadMemory(cheatsList[i].address) < (s32)cheatsList[i].value)) {
- i+=2;
- }
- break;
- case GSA_8_BIT_IF_HIGHER_S2:
- if (!((s8)CPUReadByte(cheatsList[i].address) > ((s8)cheatsList[i].value & 0xFF))) {
- i+=2;
- }
- break;
- case GSA_16_BIT_IF_HIGHER_S2:
- if (!((s16)CPUReadHalfWord(cheatsList[i].address) > ((s16)cheatsList[i].value & 0xFFFF))) {
- i+=2;
- }
- break;
- case GSA_32_BIT_IF_HIGHER_S2:
- if (!((s32)CPUReadMemory(cheatsList[i].address) > (s32)cheatsList[i].value)) {
- i+=2;
- }
- break;
- case GSA_16_BIT_WRITE_IOREGS:
- if ((cheatsList[i].address <= 0x3FF) && (cheatsList[i].address != 0x6) &&
- (cheatsList[i].address != 0x130))
- ioMem[cheatsList[i].address & 0x3FE]=cheatsList[i].value & 0xFFFF;
- break;
- case GSA_32_BIT_WRITE_IOREGS:
- if (cheatsList[i].address<=0x3FF)
- {
- if (((cheatsList[i].address & 0x3FC) != 0x6) && ((cheatsList[i].address & 0x3FC) != 0x130))
- ioMem[cheatsList[i].address & 0x3FC]= (cheatsList[i].value & 0xFFFF);
- if ((((cheatsList[i].address & 0x3FC)+2) != 0x6) && ((cheatsList[i].address & 0x3FC) +2) != 0x130)
- ioMem[(cheatsList[i].address & 0x3FC) + 2 ]= ((cheatsList[i].value>>16 ) & 0xFFFF);
- }
- break;
- case GSA_8_BIT_IF_TRUE3:
- if(CPUReadByte(cheatsList[i].address) != cheatsList[i].value) {
- onoff=false;
- }
- break;
- case GSA_16_BIT_IF_TRUE3:
- if(CPUReadHalfWord(cheatsList[i].address) != cheatsList[i].value) {
- onoff=false;
- }
- break;
- case GSA_32_BIT_IF_TRUE3:
- if(CPUReadMemory(cheatsList[i].address) != cheatsList[i].value) {
- onoff=false;
- }
- break;
- case GSA_8_BIT_IF_FALSE3:
- if(CPUReadByte(cheatsList[i].address) == cheatsList[i].value) {
- onoff=false;
- }
- break;
- case GSA_16_BIT_IF_FALSE3:
- if(CPUReadHalfWord(cheatsList[i].address) == cheatsList[i].value) {
- onoff=false;
- }
- break;
- case GSA_32_BIT_IF_FALSE3:
- if(CPUReadMemory(cheatsList[i].address) == cheatsList[i].value) {
- onoff=false;
- }
- break;
- case GSA_8_BIT_IF_LOWER_S3:
- if (!((s8)CPUReadByte(cheatsList[i].address) < ((s8)cheatsList[i].value & 0xFF))) {
- onoff=false;
- }
- break;
- case GSA_16_BIT_IF_LOWER_S3:
- if (!((s16)CPUReadHalfWord(cheatsList[i].address) < ((s16)cheatsList[i].value & 0xFFFF))) {
- onoff=false;
- }
- break;
- case GSA_32_BIT_IF_LOWER_S3:
- if (!((s32)CPUReadMemory(cheatsList[i].address) < (s32)cheatsList[i].value)) {
- onoff=false;
- }
- break;
- case GSA_8_BIT_IF_HIGHER_S3:
- if (!((s8)CPUReadByte(cheatsList[i].address) > ((s8)cheatsList[i].value & 0xFF))) {
- onoff=false;
- }
- break;
- case GSA_16_BIT_IF_HIGHER_S3:
- if (!((s16)CPUReadHalfWord(cheatsList[i].address) > ((s16)cheatsList[i].value & 0xFFFF))) {
- onoff=false;
- }
- break;
- case GSA_32_BIT_IF_HIGHER_S3:
- if (!((s32)CPUReadMemory(cheatsList[i].address) > (s32)cheatsList[i].value)) {
- onoff=false;
- }
- break;
- case GSA_8_BIT_IF_LOWER_U3:
- if (!(CPUReadByte(cheatsList[i].address) < (cheatsList[i].value & 0xFF))) {
- onoff=false;
- }
- break;
- case GSA_16_BIT_IF_LOWER_U3:
- if (!(CPUReadHalfWord(cheatsList[i].address) < (cheatsList[i].value & 0xFFFF))) {
- onoff=false;
- }
- break;
- case GSA_32_BIT_IF_LOWER_U3:
- if (!(CPUReadMemory(cheatsList[i].address) < cheatsList[i].value)) {
- onoff=false;
- }
- break;
- case GSA_8_BIT_IF_HIGHER_U3:
- if (!(CPUReadByte(cheatsList[i].address) > (cheatsList[i].value & 0xFF))) {
- onoff=false;
- }
- break;
- case GSA_16_BIT_IF_HIGHER_U3:
- if (!(CPUReadHalfWord(cheatsList[i].address) > (cheatsList[i].value & 0xFFFF))) {
- onoff=false;
- }
- break;
- case GSA_32_BIT_IF_HIGHER_U3:
- if (!(CPUReadMemory(cheatsList[i].address) > cheatsList[i].value)) {
- onoff=false;
- }
- break;
- case GSA_8_BIT_IF_AND3:
- if (!(CPUReadByte(cheatsList[i].address) & (cheatsList[i].value & 0xFF))) {
- onoff=false;
- }
- break;
- case GSA_16_BIT_IF_AND3:
- if (!(CPUReadHalfWord(cheatsList[i].address) & (cheatsList[i].value & 0xFFFF))) {
- onoff=false;
- }
- break;
- case GSA_32_BIT_IF_AND3:
- if (!(CPUReadMemory(cheatsList[i].address) & cheatsList[i].value)) {
- onoff=false;
- }
- break;
- case GSA_ALWAYS3:
- if (!(CPUReadMemory(cheatsList[i].address) & cheatsList[i].value)) {
- onoff=false;
- }
- break;
- case GSA_GROUP_WRITE:
- {
- int count = ((cheatsList[i].address) & 0xFFFE) +1;
- u32 value = cheatsList[i].value;
- if (count==0)
- i++;
- else
- for (int x = 1; x <= count; x++) {
- if ((x % 2) ==0){
- if (x<count)
- i++;
- CPUWriteMemory(cheatsList[i].rawaddress, value);
- }
- else
- CPUWriteMemory(cheatsList[i].value, value);
- }
- }
- break;
- case GSA_32_BIT_ADD2:
- CPUWriteMemory(cheatsList[i].value ,
- (CPUReadMemory(cheatsList[i].value) + cheatsList[i+1].rawaddress) & 0xFFFFFFFF);
- i++;
- break;
- case GSA_32_BIT_SUB2:
- CPUWriteMemory(cheatsList[i].value ,
- (CPUReadMemory(cheatsList[i].value) - cheatsList[i+1].rawaddress) & 0xFFFFFFFF);
- i++;
- break;
- case GSA_16_BIT_IF_LOWER_OR_EQ_U:
- if(CPUReadHalfWord(cheatsList[i].address) > cheatsList[i].value) {
- i++;
- }
- break;
- case GSA_16_BIT_IF_HIGHER_OR_EQ_U:
- if(CPUReadHalfWord(cheatsList[i].address) < cheatsList[i].value) {
- i++;
- }
- break;
- case GSA_16_BIT_MIF_TRUE:
- if(CPUReadHalfWord(cheatsList[i].address) != cheatsList[i].value) {
- i+=((cheatsList[i].rawaddress >> 0x10) & 0xFF);
- }
- break;
- case GSA_16_BIT_MIF_FALSE:
- if(CPUReadHalfWord(cheatsList[i].address) == cheatsList[i].value) {
- i+=(cheatsList[i].rawaddress >> 0x10) & 0xFF;
- }
- break;
- case GSA_16_BIT_MIF_LOWER_OR_EQ_U:
- if(CPUReadHalfWord(cheatsList[i].address) > cheatsList[i].value) {
- i+=(cheatsList[i].rawaddress >> 0x10) & 0xFF;
- }
- break;
- case GSA_16_BIT_MIF_HIGHER_OR_EQ_U:
- if(CPUReadHalfWord(cheatsList[i].address) < cheatsList[i].value) {
- i+=(cheatsList[i].rawaddress >> 0x10) & 0xFF;
- }
- break;
- case CHEATS_16_BIT_WRITE:
- if ((cheatsList[i].address>>24)>=0x08) {
- CHEAT_PATCH_ROM_16BIT(cheatsList[i].address, cheatsList[i].value);
- } else {
- CPUWriteHalfWord(cheatsList[i].address, cheatsList[i].value);
- }
- break;
- case CHEATS_32_BIT_WRITE:
- if ((cheatsList[i].address>>24)>=0x08) {
- CHEAT_PATCH_ROM_32BIT(cheatsList[i].address, cheatsList[i].value);
- } else {
- CPUWriteMemory(cheatsList[i].address, cheatsList[i].value);
- }
- break;
- }
- }
- }
- for (i = 0; i<4; i++)
- if (rompatch2addr [i] != 0)
- CHEAT_PATCH_ROM_16BIT(rompatch2addr [i],rompatch2val [i]);
- return ticks;
- }
- void cheatsAdd(const char *codeStr,
- const char *desc,
- u32 rawaddress,
- u32 address,
- u32 value,
- int code,
- int size)
- {
- if(cheatsNumber < 100) {
- int x = cheatsNumber;
- cheatsList[x].code = code;
- cheatsList[x].size = size;
- cheatsList[x].rawaddress = rawaddress;
- cheatsList[x].address = address;
- cheatsList[x].value = value;
- strcpy(cheatsList[x].codestring, codeStr);
- strcpy(cheatsList[x].desc, desc);
- cheatsList[x].enabled = true;
- cheatsList[x].status = 0;
- // we only store the old value for this simple codes. ROM patching
- // is taken care when it actually patches the ROM
- switch(cheatsList[x].size) {
- case INT_8_BIT_WRITE:
- cheatsList[x].oldValue = CPUReadByte(address);
- break;
- case INT_16_BIT_WRITE:
- cheatsList[x].oldValue = CPUReadHalfWord(address);
- break;
- case INT_32_BIT_WRITE:
- cheatsList[x].oldValue = CPUReadMemory(address);
- break;
- case CHEATS_16_BIT_WRITE:
- cheatsList[x].oldValue = CPUReadHalfWord(address);
- break;
- case CHEATS_32_BIT_WRITE:
- cheatsList[x].oldValue = CPUReadMemory(address);
- break;
- }
- cheatsNumber++;
- }
- }
- void cheatsDelete(int number, bool restore)
- {
- if(number < cheatsNumber && number >= 0) {
- int x = number;
- if(restore) {
- switch(cheatsList[x].size) {
- case INT_8_BIT_WRITE:
- CPUWriteByte(cheatsList[x].address, (u8)cheatsList[x].oldValue);
- break;
- case INT_16_BIT_WRITE:
- CPUWriteHalfWord(cheatsList[x].address, (u16)cheatsList[x].oldValue);
- break;
- case INT_32_BIT_WRITE:
- CPUWriteMemory(cheatsList[x].address, cheatsList[x].oldValue);
- break;
- case CHEATS_16_BIT_WRITE:
- if ((cheatsList[x].address>>24)>=0x08) {
- CHEAT_PATCH_ROM_16BIT(cheatsList[x].address, cheatsList[x].oldValue);
- } else {
- CPUWriteHalfWord(cheatsList[x].address, cheatsList[x].oldValue);
- }
- break;
- case CHEATS_32_BIT_WRITE:
- if ((cheatsList[x].address>>24)>=0x08) {
- CHEAT_PATCH_ROM_32BIT(cheatsList[x].address, cheatsList[x].oldValue);
- } else {
- CPUWriteMemory(cheatsList[x].address, cheatsList[x].oldValue);
- }
- case GSA_16_BIT_ROM_PATCH:
- if(cheatsList[x].status & 1) {
- cheatsList[x].status &= ~1;
- CHEAT_PATCH_ROM_16BIT(cheatsList[x].address,
- cheatsList[x].oldValue);
- }
- break;
- case GSA_16_BIT_ROM_PATCH2C:
- case GSA_16_BIT_ROM_PATCH2D:
- case GSA_16_BIT_ROM_PATCH2E:
- case GSA_16_BIT_ROM_PATCH2F:
- if(cheatsList[x].status & 1) {
- cheatsList[x].status &= ~1;
- }
- break;
- case MASTER_CODE:
- mastercode=0;
- …
Large files files are truncated, but you can click here to view the full file