PageRenderTime 73ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/trunk/src/gba/Cheats.cpp

https://bitbucket.org/ZachThibeau/vba-m
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
  1. #include <memory.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #include "GBA.h"
  6. #include "GBAinline.h"
  7. #include "Cheats.h"
  8. #include "Globals.h"
  9. #include "../NLS.h"
  10. #include "../Util.h"
  11. /**
  12. * Gameshark code types: (based on AR v1.0)
  13. *
  14. * NNNNNNNN 001DC0DE - ID code for the game (game 4 character name) from ROM
  15. * DEADFACE XXXXXXXX - changes decryption seeds // Not supported by VBA.
  16. * 0AAAAAAA 000000YY - 8-bit constant write
  17. * 1AAAAAAA 0000YYYY - 16-bit constant write
  18. * 2AAAAAAA YYYYYYYY - 32-bit constant write
  19. * 30XXAAAA YYYYYYYY - 32bit Group Write, 8/16/32bit Sub/Add (depending on the XX value).
  20. * 6AAAAAAA Z000YYYY - 16-bit ROM Patch (address >> 1). Z selects the Rom Patching register.
  21. * - AR v1/2 hardware only supports Z=0.
  22. * - AR v3 hardware should support Z=0,1,2 or 3.
  23. * 8A1AAAAA 000000YY - 8-bit button write
  24. * 8A2AAAAA 0000YYYY - 16-bit button write
  25. * 8A4AAAAA YYYYYYYY - 32-bit button write // BUGGY ! Only writes 00000000 on the AR v1.0.
  26. * 80F00000 0000YYYY - button slow motion
  27. * DAAAAAAA 00Z0YYYY - Z = 0 : if 16-bit value at address != YYYY skip next line
  28. * - Z = 1 : if 16-bit value at address == YYYY skip next line
  29. * - Z = 2 : if 16-bit value at address > YYYY (Unsigned) skip next line
  30. * - Z = 3 : if 16-bit value at address < YYYY (Unsigned) skip next line
  31. * E0CCYYYY ZAAAAAAA - Z = 0 : if 16-bit value at address != YYYY skip CC lines
  32. * - Z = 1 : if 16-bit value at address == YYYY skip CC lines
  33. * - Z = 2 : if 16-bit value at address > YYYY (Unsigned) skip CC lines
  34. * - Z = 3 : if 16-bit value at address < YYYY (Unsigned) skip CC lines
  35. * FAAAAAAA 0000YYYY - Master code function
  36. *
  37. *
  38. *
  39. * CodeBreaker codes types: (based on the CBA clone "Cheatcode S" v1.1)
  40. *
  41. * 0000AAAA 000Y - Game CRC (Y are flags: 8 - CRC, 2 - DI)
  42. * 1AAAAAAA YYYY - Master Code function (store address at ((YYYY << 0x16)
  43. * + 0x08000100))
  44. * 2AAAAAAA YYYY - 16-bit or
  45. * 3AAAAAAA YYYY - 8-bit constant write
  46. * 4AAAAAAA YYYY - Slide code
  47. * XXXXCCCC IIII (C is count and I is address increment, X is value incr.)
  48. * 5AAAAAAA CCCC - Super code (Write bytes to address, 2*CCCC is count)
  49. * BBBBBBBB BBBB
  50. * 6AAAAAAA YYYY - 16-bit and
  51. * 7AAAAAAA YYYY - if address contains 16-bit value enable next code
  52. * 8AAAAAAA YYYY - 16-bit constant write
  53. * 9AAAAAAA YYYY - change decryption (when first code only?)
  54. * AAAAAAAA YYYY - if address does not contain 16-bit value enable next code
  55. * BAAAAAAA YYYY - if 16-bit value at address <= YYYY skip next code
  56. * CAAAAAAA YYYY - if 16-bit value at address >= YYYY skip next code
  57. * D00000X0 YYYY - if button keys ... enable next code (else skip next code)
  58. * EAAAAAAA YYYY - increase 16/32bit value stored in address
  59. * FAAAAAAA YYYY - if 16-bit value at address AND YYYY = 0 then skip next code
  60. **/
  61. #define UNKNOWN_CODE -1
  62. #define INT_8_BIT_WRITE 0
  63. #define INT_16_BIT_WRITE 1
  64. #define INT_32_BIT_WRITE 2
  65. #define GSA_16_BIT_ROM_PATCH 3
  66. #define GSA_8_BIT_GS_WRITE 4
  67. #define GSA_16_BIT_GS_WRITE 5
  68. #define GSA_32_BIT_GS_WRITE 6
  69. #define CBA_IF_KEYS_PRESSED 7
  70. #define CBA_IF_TRUE 8
  71. #define CBA_SLIDE_CODE 9
  72. #define CBA_IF_FALSE 10
  73. #define CBA_AND 11
  74. #define GSA_8_BIT_GS_WRITE2 12
  75. #define GSA_16_BIT_GS_WRITE2 13
  76. #define GSA_32_BIT_GS_WRITE2 14
  77. #define GSA_16_BIT_ROM_PATCH2C 15
  78. #define GSA_8_BIT_SLIDE 16
  79. #define GSA_16_BIT_SLIDE 17
  80. #define GSA_32_BIT_SLIDE 18
  81. #define GSA_8_BIT_IF_TRUE 19
  82. #define GSA_32_BIT_IF_TRUE 20
  83. #define GSA_8_BIT_IF_FALSE 21
  84. #define GSA_32_BIT_IF_FALSE 22
  85. #define GSA_8_BIT_FILL 23
  86. #define GSA_16_BIT_FILL 24
  87. #define GSA_8_BIT_IF_TRUE2 25
  88. #define GSA_16_BIT_IF_TRUE2 26
  89. #define GSA_32_BIT_IF_TRUE2 27
  90. #define GSA_8_BIT_IF_FALSE2 28
  91. #define GSA_16_BIT_IF_FALSE2 29
  92. #define GSA_32_BIT_IF_FALSE2 30
  93. #define GSA_SLOWDOWN 31
  94. #define CBA_ADD 32
  95. #define CBA_OR 33
  96. #define CBA_LT 34
  97. #define CBA_GT 35
  98. #define CBA_SUPER 36
  99. #define GSA_8_BIT_POINTER 37
  100. #define GSA_16_BIT_POINTER 38
  101. #define GSA_32_BIT_POINTER 39
  102. #define GSA_8_BIT_ADD 40
  103. #define GSA_16_BIT_ADD 41
  104. #define GSA_32_BIT_ADD 42
  105. #define GSA_8_BIT_IF_LOWER_U 43
  106. #define GSA_16_BIT_IF_LOWER_U 44
  107. #define GSA_32_BIT_IF_LOWER_U 45
  108. #define GSA_8_BIT_IF_HIGHER_U 46
  109. #define GSA_16_BIT_IF_HIGHER_U 47
  110. #define GSA_32_BIT_IF_HIGHER_U 48
  111. #define GSA_8_BIT_IF_AND 49
  112. #define GSA_16_BIT_IF_AND 50
  113. #define GSA_32_BIT_IF_AND 51
  114. #define GSA_8_BIT_IF_LOWER_U2 52
  115. #define GSA_16_BIT_IF_LOWER_U2 53
  116. #define GSA_32_BIT_IF_LOWER_U2 54
  117. #define GSA_8_BIT_IF_HIGHER_U2 55
  118. #define GSA_16_BIT_IF_HIGHER_U2 56
  119. #define GSA_32_BIT_IF_HIGHER_U2 57
  120. #define GSA_8_BIT_IF_AND2 58
  121. #define GSA_16_BIT_IF_AND2 59
  122. #define GSA_32_BIT_IF_AND2 60
  123. #define GSA_ALWAYS 61
  124. #define GSA_ALWAYS2 62
  125. #define GSA_8_BIT_IF_LOWER_S 63
  126. #define GSA_16_BIT_IF_LOWER_S 64
  127. #define GSA_32_BIT_IF_LOWER_S 65
  128. #define GSA_8_BIT_IF_HIGHER_S 66
  129. #define GSA_16_BIT_IF_HIGHER_S 67
  130. #define GSA_32_BIT_IF_HIGHER_S 68
  131. #define GSA_8_BIT_IF_LOWER_S2 69
  132. #define GSA_16_BIT_IF_LOWER_S2 70
  133. #define GSA_32_BIT_IF_LOWER_S2 71
  134. #define GSA_8_BIT_IF_HIGHER_S2 72
  135. #define GSA_16_BIT_IF_HIGHER_S2 73
  136. #define GSA_32_BIT_IF_HIGHER_S2 74
  137. #define GSA_16_BIT_WRITE_IOREGS 75
  138. #define GSA_32_BIT_WRITE_IOREGS 76
  139. #define GSA_CODES_ON 77
  140. #define GSA_8_BIT_IF_TRUE3 78
  141. #define GSA_16_BIT_IF_TRUE3 79
  142. #define GSA_32_BIT_IF_TRUE3 80
  143. #define GSA_8_BIT_IF_FALSE3 81
  144. #define GSA_16_BIT_IF_FALSE3 82
  145. #define GSA_32_BIT_IF_FALSE3 83
  146. #define GSA_8_BIT_IF_LOWER_S3 84
  147. #define GSA_16_BIT_IF_LOWER_S3 85
  148. #define GSA_32_BIT_IF_LOWER_S3 86
  149. #define GSA_8_BIT_IF_HIGHER_S3 87
  150. #define GSA_16_BIT_IF_HIGHER_S3 88
  151. #define GSA_32_BIT_IF_HIGHER_S3 89
  152. #define GSA_8_BIT_IF_LOWER_U3 90
  153. #define GSA_16_BIT_IF_LOWER_U3 91
  154. #define GSA_32_BIT_IF_LOWER_U3 92
  155. #define GSA_8_BIT_IF_HIGHER_U3 93
  156. #define GSA_16_BIT_IF_HIGHER_U3 94
  157. #define GSA_32_BIT_IF_HIGHER_U3 95
  158. #define GSA_8_BIT_IF_AND3 96
  159. #define GSA_16_BIT_IF_AND3 97
  160. #define GSA_32_BIT_IF_AND3 98
  161. #define GSA_ALWAYS3 99
  162. #define GSA_16_BIT_ROM_PATCH2D 100
  163. #define GSA_16_BIT_ROM_PATCH2E 101
  164. #define GSA_16_BIT_ROM_PATCH2F 102
  165. #define GSA_GROUP_WRITE 103
  166. #define GSA_32_BIT_ADD2 104
  167. #define GSA_32_BIT_SUB2 105
  168. #define GSA_16_BIT_IF_LOWER_OR_EQ_U 106
  169. #define GSA_16_BIT_IF_HIGHER_OR_EQ_U 107
  170. #define GSA_16_BIT_MIF_TRUE 108
  171. #define GSA_16_BIT_MIF_FALSE 109
  172. #define GSA_16_BIT_MIF_LOWER_OR_EQ_U 110
  173. #define GSA_16_BIT_MIF_HIGHER_OR_EQ_U 111
  174. #define MASTER_CODE 112
  175. #define CHEATS_16_BIT_WRITE 114
  176. #define CHEATS_32_BIT_WRITE 115
  177. CheatsData cheatsList[100];
  178. int cheatsNumber = 0;
  179. u32 rompatch2addr [4];
  180. u16 rompatch2val [4];
  181. u16 rompatch2oldval [4];
  182. u8 cheatsCBASeedBuffer[0x30];
  183. u32 cheatsCBASeed[4];
  184. u32 cheatsCBATemporaryValue = 0;
  185. u16 cheatsCBATable[256];
  186. bool cheatsCBATableGenerated = false;
  187. u16 super = 0;
  188. extern u32 mastercode;
  189. u8 cheatsCBACurrentSeed[12] = {
  190. 0x00, 0x00, 0x00, 0x00,
  191. 0x00, 0x00, 0x00, 0x00,
  192. 0x00, 0x00, 0x00, 0x00
  193. };
  194. u32 seeds_v1[4];
  195. u32 seeds_v3[4];
  196. u32 seed_gen(u8 upper, u8 seed, u8 *deadtable1, u8 *deadtable2);
  197. //seed tables for AR v1
  198. u8 v1_deadtable1[256] = {
  199. 0x31, 0x1C, 0x23, 0xE5, 0x89, 0x8E, 0xA1, 0x37, 0x74, 0x6D, 0x67, 0xFC, 0x1F, 0xC0, 0xB1, 0x94,
  200. 0x3B, 0x05, 0x56, 0x86, 0x00, 0x24, 0xF0, 0x17, 0x72, 0xA2, 0x3D, 0x1B, 0xE3, 0x17, 0xC5, 0x0B,
  201. 0xB9, 0xE2, 0xBD, 0x58, 0x71, 0x1B, 0x2C, 0xFF, 0xE4, 0xC9, 0x4C, 0x5E, 0xC9, 0x55, 0x33, 0x45,
  202. 0x7C, 0x3F, 0xB2, 0x51, 0xFE, 0x10, 0x7E, 0x75, 0x3C, 0x90, 0x8D, 0xDA, 0x94, 0x38, 0xC3, 0xE9,
  203. 0x95, 0xEA, 0xCE, 0xA6, 0x06, 0xE0, 0x4F, 0x3F, 0x2A, 0xE3, 0x3A, 0xE4, 0x43, 0xBD, 0x7F, 0xDA,
  204. 0x55, 0xF0, 0xEA, 0xCB, 0x2C, 0xA8, 0x47, 0x61, 0xA0, 0xEF, 0xCB, 0x13, 0x18, 0x20, 0xAF, 0x3E,
  205. 0x4D, 0x9E, 0x1E, 0x77, 0x51, 0xC5, 0x51, 0x20, 0xCF, 0x21, 0xF9, 0x39, 0x94, 0xDE, 0xDD, 0x79,
  206. 0x4E, 0x80, 0xC4, 0x9D, 0x94, 0xD5, 0x95, 0x01, 0x27, 0x27, 0xBD, 0x6D, 0x78, 0xB5, 0xD1, 0x31,
  207. 0x6A, 0x65, 0x74, 0x74, 0x58, 0xB3, 0x7C, 0xC9, 0x5A, 0xED, 0x50, 0x03, 0xC4, 0xA2, 0x94, 0x4B,
  208. 0xF0, 0x58, 0x09, 0x6F, 0x3E, 0x7D, 0xAE, 0x7D, 0x58, 0xA0, 0x2C, 0x91, 0xBB, 0xE1, 0x70, 0xEB,
  209. 0x73, 0xA6, 0x9A, 0x44, 0x25, 0x90, 0x16, 0x62, 0x53, 0xAE, 0x08, 0xEB, 0xDC, 0xF0, 0xEE, 0x77,
  210. 0xC2, 0xDE, 0x81, 0xE8, 0x30, 0x89, 0xDB, 0xFE, 0xBC, 0xC2, 0xDF, 0x26, 0xE9, 0x8B, 0xD6, 0x93,
  211. 0xF0, 0xCB, 0x56, 0x90, 0xC0, 0x46, 0x68, 0x15, 0x43, 0xCB, 0xE9, 0x98, 0xE3, 0xAF, 0x31, 0x25,
  212. 0x4D, 0x7B, 0xF3, 0xB1, 0x74, 0xE2, 0x64, 0xAC, 0xD9, 0xF6, 0xA0, 0xD5, 0x0B, 0x9B, 0x49, 0x52,
  213. 0x69, 0x3B, 0x71, 0x00, 0x2F, 0xBB, 0xBA, 0x08, 0xB1, 0xAE, 0xBB, 0xB3, 0xE1, 0xC9, 0xA6, 0x7F,
  214. 0x17, 0x97, 0x28, 0x72, 0x12, 0x6E, 0x91, 0xAE, 0x3A, 0xA2, 0x35, 0x46, 0x27, 0xF8, 0x12, 0x50
  215. };
  216. u8 v1_deadtable2[256] = {
  217. 0xD8, 0x65, 0x04, 0xC2, 0x65, 0xD5, 0xB0, 0x0C, 0xDF, 0x9D, 0xF0, 0xC3, 0x9A, 0x17, 0xC9, 0xA6,
  218. 0xE1, 0xAC, 0x0D, 0x14, 0x2F, 0x3C, 0x2C, 0x87, 0xA2, 0xBF, 0x4D, 0x5F, 0xAC, 0x2D, 0x9D, 0xE1,
  219. 0x0C, 0x9C, 0xE7, 0x7F, 0xFC, 0xA8, 0x66, 0x59, 0xAC, 0x18, 0xD7, 0x05, 0xF0, 0xBF, 0xD1, 0x8B,
  220. 0x35, 0x9F, 0x59, 0xB4, 0xBA, 0x55, 0xB2, 0x85, 0xFD, 0xB1, 0x72, 0x06, 0x73, 0xA4, 0xDB, 0x48,
  221. 0x7B, 0x5F, 0x67, 0xA5, 0x95, 0xB9, 0xA5, 0x4A, 0xCF, 0xD1, 0x44, 0xF3, 0x81, 0xF5, 0x6D, 0xF6,
  222. 0x3A, 0xC3, 0x57, 0x83, 0xFA, 0x8E, 0x15, 0x2A, 0xA2, 0x04, 0xB2, 0x9D, 0xA8, 0x0D, 0x7F, 0xB8,
  223. 0x0F, 0xF6, 0xAC, 0xBE, 0x97, 0xCE, 0x16, 0xE6, 0x31, 0x10, 0x60, 0x16, 0xB5, 0x83, 0x45, 0xEE,
  224. 0xD7, 0x5F, 0x2C, 0x08, 0x58, 0xB1, 0xFD, 0x7E, 0x79, 0x00, 0x34, 0xAD, 0xB5, 0x31, 0x34, 0x39,
  225. 0xAF, 0xA8, 0xDD, 0x52, 0x6A, 0xB0, 0x60, 0x35, 0xB8, 0x1D, 0x52, 0xF5, 0xF5, 0x30, 0x00, 0x7B,
  226. 0xF4, 0xBA, 0x03, 0xCB, 0x3A, 0x84, 0x14, 0x8A, 0x6A, 0xEF, 0x21, 0xBD, 0x01, 0xD8, 0xA0, 0xD4,
  227. 0x43, 0xBE, 0x23, 0xE7, 0x76, 0x27, 0x2C, 0x3F, 0x4D, 0x3F, 0x43, 0x18, 0xA7, 0xC3, 0x47, 0xA5,
  228. 0x7A, 0x1D, 0x02, 0x55, 0x09, 0xD1, 0xFF, 0x55, 0x5E, 0x17, 0xA0, 0x56, 0xF4, 0xC9, 0x6B, 0x90,
  229. 0xB4, 0x80, 0xA5, 0x07, 0x22, 0xFB, 0x22, 0x0D, 0xD9, 0xC0, 0x5B, 0x08, 0x35, 0x05, 0xC1, 0x75,
  230. 0x4F, 0xD0, 0x51, 0x2D, 0x2E, 0x5E, 0x69, 0xE7, 0x3B, 0xC2, 0xDA, 0xFF, 0xF6, 0xCE, 0x3E, 0x76,
  231. 0xE8, 0x36, 0x8C, 0x39, 0xD8, 0xF3, 0xE9, 0xA6, 0x42, 0xE6, 0xC1, 0x4C, 0x05, 0xBE, 0x17, 0xF2,
  232. 0x5C, 0x1B, 0x19, 0xDB, 0x0F, 0xF3, 0xF8, 0x49, 0xEB, 0x36, 0xF6, 0x40, 0x6F, 0xAD, 0xC1, 0x8C
  233. };
  234. //seed tables for AR v3
  235. u8 v3_deadtable1[256] = {
  236. 0xD0, 0xFF, 0xBA, 0xE5, 0xC1, 0xC7, 0xDB, 0x5B, 0x16, 0xE3, 0x6E, 0x26, 0x62, 0x31, 0x2E, 0x2A,
  237. 0xD1, 0xBB, 0x4A, 0xE6, 0xAE, 0x2F, 0x0A, 0x90, 0x29, 0x90, 0xB6, 0x67, 0x58, 0x2A, 0xB4, 0x45,
  238. 0x7B, 0xCB, 0xF0, 0x73, 0x84, 0x30, 0x81, 0xC2, 0xD7, 0xBE, 0x89, 0xD7, 0x4E, 0x73, 0x5C, 0xC7,
  239. 0x80, 0x1B, 0xE5, 0xE4, 0x43, 0xC7, 0x46, 0xD6, 0x6F, 0x7B, 0xBF, 0xED, 0xE5, 0x27, 0xD1, 0xB5,
  240. 0xD0, 0xD8, 0xA3, 0xCB, 0x2B, 0x30, 0xA4, 0xF0, 0x84, 0x14, 0x72, 0x5C, 0xFF, 0xA4, 0xFB, 0x54,
  241. 0x9D, 0x70, 0xE2, 0xFF, 0xBE, 0xE8, 0x24, 0x76, 0xE5, 0x15, 0xFB, 0x1A, 0xBC, 0x87, 0x02, 0x2A,
  242. 0x58, 0x8F, 0x9A, 0x95, 0xBD, 0xAE, 0x8D, 0x0C, 0xA5, 0x4C, 0xF2, 0x5C, 0x7D, 0xAD, 0x51, 0xFB,
  243. 0xB1, 0x22, 0x07, 0xE0, 0x29, 0x7C, 0xEB, 0x98, 0x14, 0xC6, 0x31, 0x97, 0xE4, 0x34, 0x8F, 0xCC,
  244. 0x99, 0x56, 0x9F, 0x78, 0x43, 0x91, 0x85, 0x3F, 0xC2, 0xD0, 0xD1, 0x80, 0xD1, 0x77, 0xA7, 0xE2,
  245. 0x43, 0x99, 0x1D, 0x2F, 0x8B, 0x6A, 0xE4, 0x66, 0x82, 0xF7, 0x2B, 0x0B, 0x65, 0x14, 0xC0, 0xC2,
  246. 0x1D, 0x96, 0x78, 0x1C, 0xC4, 0xC3, 0xD2, 0xB1, 0x64, 0x07, 0xD7, 0x6F, 0x02, 0xE9, 0x44, 0x31,
  247. 0xDB, 0x3C, 0xEB, 0x93, 0xED, 0x9A, 0x57, 0x05, 0xB9, 0x0E, 0xAF, 0x1F, 0x48, 0x11, 0xDC, 0x35,
  248. 0x6C, 0xB8, 0xEE, 0x2A, 0x48, 0x2B, 0xBC, 0x89, 0x12, 0x59, 0xCB, 0xD1, 0x18, 0xEA, 0x72, 0x11,
  249. 0x01, 0x75, 0x3B, 0xB5, 0x56, 0xF4, 0x8B, 0xA0, 0x41, 0x75, 0x86, 0x7B, 0x94, 0x12, 0x2D, 0x4C,
  250. 0x0C, 0x22, 0xC9, 0x4A, 0xD8, 0xB1, 0x8D, 0xF0, 0x55, 0x2E, 0x77, 0x50, 0x1C, 0x64, 0x77, 0xAA,
  251. 0x3E, 0xAC, 0xD3, 0x3D, 0xCE, 0x60, 0xCA, 0x5D, 0xA0, 0x92, 0x78, 0xC6, 0x51, 0xFE, 0xF9, 0x30
  252. };
  253. u8 v3_deadtable2[256] = {
  254. 0xAA, 0xAF, 0xF0, 0x72, 0x90, 0xF7, 0x71, 0x27, 0x06, 0x11, 0xEB, 0x9C, 0x37, 0x12, 0x72, 0xAA,
  255. 0x65, 0xBC, 0x0D, 0x4A, 0x76, 0xF6, 0x5C, 0xAA, 0xB0, 0x7A, 0x7D, 0x81, 0xC1, 0xCE, 0x2F, 0x9F,
  256. 0x02, 0x75, 0x38, 0xC8, 0xFC, 0x66, 0x05, 0xC2, 0x2C, 0xBD, 0x91, 0xAD, 0x03, 0xB1, 0x88, 0x93,
  257. 0x31, 0xC6, 0xAB, 0x40, 0x23, 0x43, 0x76, 0x54, 0xCA, 0xE7, 0x00, 0x96, 0x9F, 0xD8, 0x24, 0x8B,
  258. 0xE4, 0xDC, 0xDE, 0x48, 0x2C, 0xCB, 0xF7, 0x84, 0x1D, 0x45, 0xE5, 0xF1, 0x75, 0xA0, 0xED, 0xCD,
  259. 0x4B, 0x24, 0x8A, 0xB3, 0x98, 0x7B, 0x12, 0xB8, 0xF5, 0x63, 0x97, 0xB3, 0xA6, 0xA6, 0x0B, 0xDC,
  260. 0xD8, 0x4C, 0xA8, 0x99, 0x27, 0x0F, 0x8F, 0x94, 0x63, 0x0F, 0xB0, 0x11, 0x94, 0xC7, 0xE9, 0x7F,
  261. 0x3B, 0x40, 0x72, 0x4C, 0xDB, 0x84, 0x78, 0xFE, 0xB8, 0x56, 0x08, 0x80, 0xDF, 0x20, 0x2F, 0xB9,
  262. 0x66, 0x2D, 0x60, 0x63, 0xF5, 0x18, 0x15, 0x1B, 0x86, 0x85, 0xB9, 0xB4, 0x68, 0x0E, 0xC6, 0xD1,
  263. 0x8A, 0x81, 0x2B, 0xB3, 0xF6, 0x48, 0xF0, 0x4F, 0x9C, 0x28, 0x1C, 0xA4, 0x51, 0x2F, 0xD7, 0x4B,
  264. 0x17, 0xE7, 0xCC, 0x50, 0x9F, 0xD0, 0xD1, 0x40, 0x0C, 0x0D, 0xCA, 0x83, 0xFA, 0x5E, 0xCA, 0xEC,
  265. 0xBF, 0x4E, 0x7C, 0x8F, 0xF0, 0xAE, 0xC2, 0xD3, 0x28, 0x41, 0x9B, 0xC8, 0x04, 0xB9, 0x4A, 0xBA,
  266. 0x72, 0xE2, 0xB5, 0x06, 0x2C, 0x1E, 0x0B, 0x2C, 0x7F, 0x11, 0xA9, 0x26, 0x51, 0x9D, 0x3F, 0xF8,
  267. 0x62, 0x11, 0x2E, 0x89, 0xD2, 0x9D, 0x35, 0xB1, 0xE4, 0x0A, 0x4D, 0x93, 0x01, 0xA7, 0xD1, 0x2D,
  268. 0x00, 0x87, 0xE2, 0x2D, 0xA4, 0xE9, 0x0A, 0x06, 0x66, 0xF8, 0x1F, 0x44, 0x75, 0xB5, 0x6B, 0x1C,
  269. 0xFC, 0x31, 0x09, 0x48, 0xA3, 0xFF, 0x92, 0x12, 0x58, 0xE9, 0xFA, 0xAE, 0x4F, 0xE2, 0xB4, 0xCC
  270. };
  271. #define debuggerReadMemory(addr) \
  272. READ32LE((&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask]))
  273. #define debuggerReadHalfWord(addr) \
  274. READ16LE((&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask]))
  275. #define debuggerReadByte(addr) \
  276. map[(addr)>>24].address[(addr) & map[(addr)>>24].mask]
  277. #define debuggerWriteMemory(addr, value) \
  278. WRITE32LE(&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask], value)
  279. #define debuggerWriteHalfWord(addr, value) \
  280. WRITE16LE(&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask], value)
  281. #define debuggerWriteByte(addr, value) \
  282. map[(addr)>>24].address[(addr) & map[(addr)>>24].mask] = (value)
  283. #define CHEAT_IS_HEX(a) ( ((a)>='A' && (a) <='F') || ((a) >='0' && (a) <= '9'))
  284. #define CHEAT_PATCH_ROM_16BIT(a,v) \
  285. WRITE16LE(((u16 *)&rom[(a) & 0x1ffffff]), v);
  286. #define CHEAT_PATCH_ROM_32BIT(a,v) \
  287. WRITE32LE(((u32 *)&rom[(a) & 0x1ffffff]), v);
  288. static bool isMultilineWithData(int i)
  289. {
  290. // we consider it a multiline code if it has more than one line of data
  291. // otherwise, it can still be considered a single code
  292. // (Only CBA codes can be true multilines !!!)
  293. if(i < cheatsNumber && i >= 0)
  294. switch(cheatsList[i].size) {
  295. case INT_8_BIT_WRITE:
  296. case INT_16_BIT_WRITE:
  297. case INT_32_BIT_WRITE:
  298. case GSA_16_BIT_ROM_PATCH:
  299. case GSA_8_BIT_GS_WRITE:
  300. case GSA_16_BIT_GS_WRITE:
  301. case GSA_32_BIT_GS_WRITE:
  302. case CBA_AND:
  303. case CBA_IF_KEYS_PRESSED:
  304. case CBA_IF_TRUE:
  305. case CBA_IF_FALSE:
  306. case GSA_8_BIT_IF_TRUE:
  307. case GSA_32_BIT_IF_TRUE:
  308. case GSA_8_BIT_IF_FALSE:
  309. case GSA_32_BIT_IF_FALSE:
  310. case GSA_8_BIT_FILL:
  311. case GSA_16_BIT_FILL:
  312. case GSA_8_BIT_IF_TRUE2:
  313. case GSA_16_BIT_IF_TRUE2:
  314. case GSA_32_BIT_IF_TRUE2:
  315. case GSA_8_BIT_IF_FALSE2:
  316. case GSA_16_BIT_IF_FALSE2:
  317. case GSA_32_BIT_IF_FALSE2:
  318. case GSA_SLOWDOWN:
  319. case CBA_ADD:
  320. case CBA_OR:
  321. case CBA_LT:
  322. case CBA_GT:
  323. case GSA_8_BIT_POINTER:
  324. case GSA_16_BIT_POINTER:
  325. case GSA_32_BIT_POINTER:
  326. case GSA_8_BIT_ADD:
  327. case GSA_16_BIT_ADD:
  328. case GSA_32_BIT_ADD:
  329. case GSA_8_BIT_IF_LOWER_U:
  330. case GSA_16_BIT_IF_LOWER_U:
  331. case GSA_32_BIT_IF_LOWER_U:
  332. case GSA_8_BIT_IF_HIGHER_U:
  333. case GSA_16_BIT_IF_HIGHER_U:
  334. case GSA_32_BIT_IF_HIGHER_U:
  335. case GSA_8_BIT_IF_AND:
  336. case GSA_16_BIT_IF_AND:
  337. case GSA_32_BIT_IF_AND:
  338. case GSA_8_BIT_IF_LOWER_U2:
  339. case GSA_16_BIT_IF_LOWER_U2:
  340. case GSA_32_BIT_IF_LOWER_U2:
  341. case GSA_8_BIT_IF_HIGHER_U2:
  342. case GSA_16_BIT_IF_HIGHER_U2:
  343. case GSA_32_BIT_IF_HIGHER_U2:
  344. case GSA_8_BIT_IF_AND2:
  345. case GSA_16_BIT_IF_AND2:
  346. case GSA_32_BIT_IF_AND2:
  347. case GSA_ALWAYS:
  348. case GSA_ALWAYS2:
  349. case GSA_8_BIT_IF_LOWER_S:
  350. case GSA_16_BIT_IF_LOWER_S:
  351. case GSA_32_BIT_IF_LOWER_S:
  352. case GSA_8_BIT_IF_HIGHER_S:
  353. case GSA_16_BIT_IF_HIGHER_S:
  354. case GSA_32_BIT_IF_HIGHER_S:
  355. case GSA_8_BIT_IF_LOWER_S2:
  356. case GSA_16_BIT_IF_LOWER_S2:
  357. case GSA_32_BIT_IF_LOWER_S2:
  358. case GSA_8_BIT_IF_HIGHER_S2:
  359. case GSA_16_BIT_IF_HIGHER_S2:
  360. case GSA_32_BIT_IF_HIGHER_S2:
  361. case GSA_16_BIT_WRITE_IOREGS:
  362. case GSA_32_BIT_WRITE_IOREGS:
  363. case GSA_CODES_ON:
  364. case GSA_8_BIT_IF_TRUE3:
  365. case GSA_16_BIT_IF_TRUE3:
  366. case GSA_32_BIT_IF_TRUE3:
  367. case GSA_8_BIT_IF_FALSE3:
  368. case GSA_16_BIT_IF_FALSE3:
  369. case GSA_32_BIT_IF_FALSE3:
  370. case GSA_8_BIT_IF_LOWER_S3:
  371. case GSA_16_BIT_IF_LOWER_S3:
  372. case GSA_32_BIT_IF_LOWER_S3:
  373. case GSA_8_BIT_IF_HIGHER_S3:
  374. case GSA_16_BIT_IF_HIGHER_S3:
  375. case GSA_32_BIT_IF_HIGHER_S3:
  376. case GSA_8_BIT_IF_LOWER_U3:
  377. case GSA_16_BIT_IF_LOWER_U3:
  378. case GSA_32_BIT_IF_LOWER_U3:
  379. case GSA_8_BIT_IF_HIGHER_U3:
  380. case GSA_16_BIT_IF_HIGHER_U3:
  381. case GSA_32_BIT_IF_HIGHER_U3:
  382. case GSA_8_BIT_IF_AND3:
  383. case GSA_16_BIT_IF_AND3:
  384. case GSA_32_BIT_IF_AND3:
  385. case GSA_ALWAYS3:
  386. case GSA_8_BIT_GS_WRITE2:
  387. case GSA_16_BIT_GS_WRITE2:
  388. case GSA_32_BIT_GS_WRITE2:
  389. case GSA_16_BIT_ROM_PATCH2C:
  390. case GSA_16_BIT_ROM_PATCH2D:
  391. case GSA_16_BIT_ROM_PATCH2E:
  392. case GSA_16_BIT_ROM_PATCH2F:
  393. case GSA_8_BIT_SLIDE:
  394. case GSA_16_BIT_SLIDE:
  395. case GSA_32_BIT_SLIDE:
  396. case GSA_GROUP_WRITE:
  397. case GSA_32_BIT_ADD2:
  398. case GSA_32_BIT_SUB2:
  399. case GSA_16_BIT_IF_LOWER_OR_EQ_U:
  400. case GSA_16_BIT_IF_HIGHER_OR_EQ_U:
  401. case GSA_16_BIT_MIF_TRUE:
  402. case GSA_16_BIT_MIF_FALSE:
  403. case GSA_16_BIT_MIF_LOWER_OR_EQ_U:
  404. case GSA_16_BIT_MIF_HIGHER_OR_EQ_U:
  405. case MASTER_CODE:
  406. case CHEATS_16_BIT_WRITE:
  407. case CHEATS_32_BIT_WRITE:
  408. return false;
  409. // the codes below have two lines of data
  410. case CBA_SLIDE_CODE:
  411. case CBA_SUPER:
  412. return true;
  413. }
  414. return false;
  415. }
  416. static int getCodeLength(int num)
  417. {
  418. if(num >= cheatsNumber || num < 0)
  419. return 1;
  420. // this is for all the codes that are true multiline
  421. switch(cheatsList[num].size) {
  422. case INT_8_BIT_WRITE:
  423. case INT_16_BIT_WRITE:
  424. case INT_32_BIT_WRITE:
  425. case GSA_16_BIT_ROM_PATCH:
  426. case GSA_8_BIT_GS_WRITE:
  427. case GSA_16_BIT_GS_WRITE:
  428. case GSA_32_BIT_GS_WRITE:
  429. case CBA_AND:
  430. case GSA_8_BIT_FILL:
  431. case GSA_16_BIT_FILL:
  432. case GSA_SLOWDOWN:
  433. case CBA_ADD:
  434. case CBA_OR:
  435. case GSA_8_BIT_POINTER:
  436. case GSA_16_BIT_POINTER:
  437. case GSA_32_BIT_POINTER:
  438. case GSA_8_BIT_ADD:
  439. case GSA_16_BIT_ADD:
  440. case GSA_32_BIT_ADD:
  441. case GSA_CODES_ON:
  442. case GSA_8_BIT_IF_TRUE3:
  443. case GSA_16_BIT_IF_TRUE3:
  444. case GSA_32_BIT_IF_TRUE3:
  445. case GSA_8_BIT_IF_FALSE3:
  446. case GSA_16_BIT_IF_FALSE3:
  447. case GSA_32_BIT_IF_FALSE3:
  448. case GSA_8_BIT_IF_LOWER_S3:
  449. case GSA_16_BIT_IF_LOWER_S3:
  450. case GSA_32_BIT_IF_LOWER_S3:
  451. case GSA_8_BIT_IF_HIGHER_S3:
  452. case GSA_16_BIT_IF_HIGHER_S3:
  453. case GSA_32_BIT_IF_HIGHER_S3:
  454. case GSA_8_BIT_IF_LOWER_U3:
  455. case GSA_16_BIT_IF_LOWER_U3:
  456. case GSA_32_BIT_IF_LOWER_U3:
  457. case GSA_8_BIT_IF_HIGHER_U3:
  458. case GSA_16_BIT_IF_HIGHER_U3:
  459. case GSA_32_BIT_IF_HIGHER_U3:
  460. case GSA_8_BIT_IF_AND3:
  461. case GSA_16_BIT_IF_AND3:
  462. case GSA_32_BIT_IF_AND3:
  463. case GSA_8_BIT_IF_LOWER_U:
  464. case GSA_16_BIT_IF_LOWER_U:
  465. case GSA_32_BIT_IF_LOWER_U:
  466. case GSA_8_BIT_IF_HIGHER_U:
  467. case GSA_16_BIT_IF_HIGHER_U:
  468. case GSA_32_BIT_IF_HIGHER_U:
  469. case GSA_8_BIT_IF_AND:
  470. case GSA_16_BIT_IF_AND:
  471. case GSA_32_BIT_IF_AND:
  472. case GSA_ALWAYS:
  473. case GSA_8_BIT_IF_LOWER_S:
  474. case GSA_16_BIT_IF_LOWER_S:
  475. case GSA_32_BIT_IF_LOWER_S:
  476. case GSA_8_BIT_IF_HIGHER_S:
  477. case GSA_16_BIT_IF_HIGHER_S:
  478. case GSA_32_BIT_IF_HIGHER_S:
  479. case GSA_16_BIT_WRITE_IOREGS:
  480. case GSA_32_BIT_WRITE_IOREGS:
  481. case GSA_8_BIT_GS_WRITE2:
  482. case GSA_16_BIT_GS_WRITE2:
  483. case GSA_32_BIT_GS_WRITE2:
  484. case GSA_16_BIT_ROM_PATCH2C:
  485. case GSA_16_BIT_ROM_PATCH2D:
  486. case GSA_16_BIT_ROM_PATCH2E:
  487. case GSA_16_BIT_ROM_PATCH2F:
  488. case GSA_8_BIT_SLIDE:
  489. case GSA_16_BIT_SLIDE:
  490. case GSA_32_BIT_SLIDE:
  491. case GSA_8_BIT_IF_TRUE:
  492. case GSA_32_BIT_IF_TRUE:
  493. case GSA_8_BIT_IF_FALSE:
  494. case GSA_32_BIT_IF_FALSE:
  495. case CBA_LT:
  496. case CBA_GT:
  497. case CBA_IF_TRUE:
  498. case CBA_IF_FALSE:
  499. case GSA_8_BIT_IF_TRUE2:
  500. case GSA_16_BIT_IF_TRUE2:
  501. case GSA_32_BIT_IF_TRUE2:
  502. case GSA_8_BIT_IF_FALSE2:
  503. case GSA_16_BIT_IF_FALSE2:
  504. case GSA_32_BIT_IF_FALSE2:
  505. case GSA_8_BIT_IF_LOWER_U2:
  506. case GSA_16_BIT_IF_LOWER_U2:
  507. case GSA_32_BIT_IF_LOWER_U2:
  508. case GSA_8_BIT_IF_HIGHER_U2:
  509. case GSA_16_BIT_IF_HIGHER_U2:
  510. case GSA_32_BIT_IF_HIGHER_U2:
  511. case GSA_8_BIT_IF_AND2:
  512. case GSA_16_BIT_IF_AND2:
  513. case GSA_32_BIT_IF_AND2:
  514. case GSA_ALWAYS2:
  515. case GSA_8_BIT_IF_LOWER_S2:
  516. case GSA_16_BIT_IF_LOWER_S2:
  517. case GSA_32_BIT_IF_LOWER_S2:
  518. case GSA_8_BIT_IF_HIGHER_S2:
  519. case GSA_16_BIT_IF_HIGHER_S2:
  520. case GSA_32_BIT_IF_HIGHER_S2:
  521. case GSA_GROUP_WRITE:
  522. case GSA_32_BIT_ADD2:
  523. case GSA_32_BIT_SUB2:
  524. case GSA_16_BIT_IF_LOWER_OR_EQ_U:
  525. case GSA_16_BIT_IF_HIGHER_OR_EQ_U:
  526. case GSA_16_BIT_MIF_TRUE:
  527. case GSA_16_BIT_MIF_FALSE:
  528. case GSA_16_BIT_MIF_LOWER_OR_EQ_U:
  529. case GSA_16_BIT_MIF_HIGHER_OR_EQ_U:
  530. case MASTER_CODE:
  531. case CHEATS_16_BIT_WRITE:
  532. case CHEATS_32_BIT_WRITE:
  533. case UNKNOWN_CODE:
  534. return 1;
  535. case CBA_IF_KEYS_PRESSED:
  536. case CBA_SLIDE_CODE:
  537. return 2;
  538. case CBA_SUPER:
  539. return ((((cheatsList[num].value-1) & 0xFFFF)/3) + 1);
  540. }
  541. return 1;
  542. }
  543. int cheatsCheckKeys(u32 keys, u32 extended)
  544. {
  545. bool onoff = true;
  546. int ticks = 0;
  547. int i;
  548. mastercode = 0;
  549. for (i = 0; i<4; i++)
  550. if (rompatch2addr [i] != 0) {
  551. CHEAT_PATCH_ROM_16BIT(rompatch2addr [i],rompatch2oldval [i]);
  552. rompatch2addr [i] = 0;
  553. }
  554. for (i = 0; i < cheatsNumber; i++) {
  555. if(!cheatsList[i].enabled) {
  556. // make sure we skip other lines in this code
  557. i += getCodeLength(i)-1;
  558. continue;
  559. }
  560. switch(cheatsList[i].size) {
  561. case GSA_CODES_ON:
  562. onoff = true;
  563. break;
  564. case GSA_SLOWDOWN:
  565. // check if button was pressed and released, if so toggle our state
  566. if((cheatsList[i].status & 4) && !(extended & 4))
  567. cheatsList[i].status ^= 1;
  568. if(extended & 4)
  569. cheatsList[i].status |= 4;
  570. else
  571. cheatsList[i].status &= ~4;
  572. if(cheatsList[i].status & 1)
  573. ticks += ((cheatsList[i].value & 0xFFFF) * 7);
  574. break;
  575. case GSA_8_BIT_SLIDE:
  576. i++;
  577. if(i < cheatsNumber) {
  578. u32 addr = cheatsList[i-1].value;
  579. u8 value = cheatsList[i].rawaddress;
  580. int vinc = (cheatsList[i].value >> 24) & 255;
  581. int count = (cheatsList[i].value >> 16) & 255;
  582. int ainc = (cheatsList[i].value & 0xffff);
  583. while(count > 0) {
  584. CPUWriteByte(addr, value);
  585. value += vinc;
  586. addr += ainc;
  587. count--;
  588. }
  589. }
  590. break;
  591. case GSA_16_BIT_SLIDE:
  592. i++;
  593. if(i < cheatsNumber) {
  594. u32 addr = cheatsList[i-1].value;
  595. u16 value = cheatsList[i].rawaddress;
  596. int vinc = (cheatsList[i].value >> 24) & 255;
  597. int count = (cheatsList[i].value >> 16) & 255;
  598. int ainc = (cheatsList[i].value & 0xffff)*2;
  599. while(count > 0) {
  600. CPUWriteHalfWord(addr, value);
  601. value += vinc;
  602. addr += ainc;
  603. count--;
  604. }
  605. }
  606. break;
  607. case GSA_32_BIT_SLIDE:
  608. i++;
  609. if(i < cheatsNumber) {
  610. u32 addr = cheatsList[i-1].value;
  611. u32 value = cheatsList[i].rawaddress;
  612. int vinc = (cheatsList[i].value >> 24) & 255;
  613. int count = (cheatsList[i].value >> 16) & 255;
  614. int ainc = (cheatsList[i].value & 0xffff)*4;
  615. while(count > 0) {
  616. CPUWriteMemory(addr, value);
  617. value += vinc;
  618. addr += ainc;
  619. count--;
  620. }
  621. }
  622. break;
  623. case GSA_8_BIT_GS_WRITE2:
  624. i++;
  625. if(i < cheatsNumber) {
  626. if(extended & 4) {
  627. CPUWriteByte(cheatsList[i-1].value, cheatsList[i].address);
  628. }
  629. }
  630. break;
  631. case GSA_16_BIT_GS_WRITE2:
  632. i++;
  633. if(i < cheatsNumber) {
  634. if(extended & 4) {
  635. CPUWriteHalfWord(cheatsList[i-1].value, cheatsList[i].address);
  636. }
  637. }
  638. break;
  639. case GSA_32_BIT_GS_WRITE2:
  640. i++;
  641. if(i < cheatsNumber) {
  642. if(extended & 4) {
  643. CPUWriteMemory(cheatsList[i-1].value, cheatsList[i].address);
  644. }
  645. }
  646. break;
  647. case GSA_16_BIT_ROM_PATCH:
  648. if((cheatsList[i].status & 1) == 0) {
  649. if(CPUReadHalfWord(cheatsList[i].address) != cheatsList[i].value) {
  650. cheatsList[i].oldValue = CPUReadHalfWord(cheatsList[i].address);
  651. cheatsList[i].status |= 1;
  652. CHEAT_PATCH_ROM_16BIT(cheatsList[i].address, cheatsList[i].value);
  653. }
  654. }
  655. break;
  656. case GSA_16_BIT_ROM_PATCH2C:
  657. i++;
  658. if(i < cheatsNumber) {
  659. rompatch2addr [0] = ((cheatsList[i-1].value & 0x00FFFFFF) << 1) + 0x8000000;
  660. rompatch2oldval [0] = CPUReadHalfWord(rompatch2addr [0]);
  661. rompatch2val [0] = cheatsList[i].rawaddress & 0xFFFF;
  662. }
  663. break;
  664. case GSA_16_BIT_ROM_PATCH2D:
  665. i++;
  666. if(i < cheatsNumber) {
  667. rompatch2addr [1] = ((cheatsList[i-1].value & 0x00FFFFFF) << 1) + 0x8000000;
  668. rompatch2oldval [1] = CPUReadHalfWord(rompatch2addr [1]);
  669. rompatch2val [1] = cheatsList[i].rawaddress & 0xFFFF;
  670. }
  671. break;
  672. case GSA_16_BIT_ROM_PATCH2E:
  673. i++;
  674. if(i < cheatsNumber) {
  675. rompatch2addr [2] = ((cheatsList[i-1].value & 0x00FFFFFF) << 1) + 0x8000000;
  676. rompatch2oldval [2] = CPUReadHalfWord(rompatch2addr [2]);
  677. rompatch2val [2] = cheatsList[i].rawaddress & 0xFFFF;
  678. }
  679. break;
  680. case GSA_16_BIT_ROM_PATCH2F:
  681. i++;
  682. if(i < cheatsNumber) {
  683. rompatch2addr [3] = ((cheatsList[i-1].value & 0x00FFFFFF) << 1) + 0x8000000;
  684. rompatch2oldval [3] = CPUReadHalfWord(rompatch2addr [3]);
  685. rompatch2val [3] = cheatsList[i].rawaddress & 0xFFFF;
  686. }
  687. break;
  688. case MASTER_CODE:
  689. mastercode = cheatsList[i].address;
  690. break;
  691. }
  692. if (onoff) {
  693. switch(cheatsList[i].size) {
  694. case INT_8_BIT_WRITE:
  695. CPUWriteByte(cheatsList[i].address, cheatsList[i].value);
  696. break;
  697. case INT_16_BIT_WRITE:
  698. CPUWriteHalfWord(cheatsList[i].address, cheatsList[i].value);
  699. break;
  700. case INT_32_BIT_WRITE:
  701. CPUWriteMemory(cheatsList[i].address, cheatsList[i].value);
  702. break;
  703. case GSA_8_BIT_GS_WRITE:
  704. if(extended & 4) {
  705. CPUWriteByte(cheatsList[i].address, cheatsList[i].value);
  706. }
  707. break;
  708. case GSA_16_BIT_GS_WRITE:
  709. if(extended & 4) {
  710. CPUWriteHalfWord(cheatsList[i].address, cheatsList[i].value);
  711. }
  712. break;
  713. case GSA_32_BIT_GS_WRITE:
  714. if(extended & 4) {
  715. CPUWriteMemory(cheatsList[i].address, cheatsList[i].value);
  716. }
  717. break;
  718. case CBA_IF_KEYS_PRESSED:
  719. {
  720. u16 value = cheatsList[i].value;
  721. u32 addr = cheatsList[i].address;
  722. if((addr & 0xF0) == 0x20) {
  723. if((keys & value) == 0) {
  724. i++;
  725. }
  726. } else if((addr & 0xF0) == 0x10) {
  727. if((keys & value) == value) {
  728. i++;
  729. }
  730. } else if((addr & 0xF0) == 0x00) {
  731. if(((~keys) & 0x3FF) == value) {
  732. i++;
  733. }
  734. }
  735. }
  736. break;
  737. case CBA_IF_TRUE:
  738. if(CPUReadHalfWord(cheatsList[i].address) != cheatsList[i].value) {
  739. i++;
  740. }
  741. break;
  742. case CBA_SLIDE_CODE:
  743. {
  744. u32 address = cheatsList[i].address;
  745. u16 value = cheatsList[i].value;
  746. i++;
  747. if(i < cheatsNumber) {
  748. int count = ((cheatsList[i].address - 1) & 0xFFFF);
  749. u16 vinc = (cheatsList[i].address >> 16) & 0xFFFF;
  750. int inc = cheatsList[i].value;
  751. for(int x = 0; x <= count ; x++) {
  752. CPUWriteHalfWord(address, value);
  753. address += inc;
  754. value += vinc;
  755. }
  756. }
  757. }
  758. break;
  759. case CBA_IF_FALSE:
  760. if(CPUReadHalfWord(cheatsList[i].address) == cheatsList[i].value){
  761. i++;
  762. }
  763. break;
  764. case CBA_AND:
  765. CPUWriteHalfWord(cheatsList[i].address,
  766. CPUReadHalfWord(cheatsList[i].address) &
  767. cheatsList[i].value);
  768. break;
  769. case GSA_8_BIT_IF_TRUE:
  770. if(CPUReadByte(cheatsList[i].address) != cheatsList[i].value) {
  771. i++;
  772. }
  773. break;
  774. case GSA_32_BIT_IF_TRUE:
  775. if(CPUReadMemory(cheatsList[i].address) != cheatsList[i].value) {
  776. i++;
  777. }
  778. break;
  779. case GSA_8_BIT_IF_FALSE:
  780. if(CPUReadByte(cheatsList[i].address) == cheatsList[i].value) {
  781. i++;
  782. }
  783. break;
  784. case GSA_32_BIT_IF_FALSE:
  785. if(CPUReadMemory(cheatsList[i].address) == cheatsList[i].value) {
  786. i++;
  787. }
  788. break;
  789. case GSA_8_BIT_FILL:
  790. {
  791. u32 addr = cheatsList[i].address;
  792. u8 v = cheatsList[i].value & 0xff;
  793. u32 end = addr + (cheatsList[i].value >> 8);
  794. do {
  795. CPUWriteByte(addr, v);
  796. addr++;
  797. } while (addr <= end);
  798. }
  799. break;
  800. case GSA_16_BIT_FILL:
  801. {
  802. u32 addr = cheatsList[i].address;
  803. u16 v = cheatsList[i].value & 0xffff;
  804. u32 end = addr + ((cheatsList[i].value >> 16) << 1);
  805. do {
  806. CPUWriteHalfWord(addr, v);
  807. addr+=2;
  808. } while (addr <= end);
  809. }
  810. break;
  811. case GSA_8_BIT_IF_TRUE2:
  812. if(CPUReadByte(cheatsList[i].address) != cheatsList[i].value) {
  813. i+=2;
  814. }
  815. break;
  816. case GSA_16_BIT_IF_TRUE2:
  817. if(CPUReadHalfWord(cheatsList[i].address) != cheatsList[i].value) {
  818. i+=2;
  819. }
  820. break;
  821. case GSA_32_BIT_IF_TRUE2:
  822. if(CPUReadMemory(cheatsList[i].address) != cheatsList[i].value) {
  823. i+=2;
  824. }
  825. break;
  826. case GSA_8_BIT_IF_FALSE2:
  827. if(CPUReadByte(cheatsList[i].address) == cheatsList[i].value) {
  828. i+=2;
  829. }
  830. break;
  831. case GSA_16_BIT_IF_FALSE2:
  832. if(CPUReadHalfWord(cheatsList[i].address) == cheatsList[i].value) {
  833. i+=2;
  834. }
  835. break;
  836. case GSA_32_BIT_IF_FALSE2:
  837. if(CPUReadMemory(cheatsList[i].address) == cheatsList[i].value) {
  838. i+=2;
  839. }
  840. break;
  841. case CBA_ADD:
  842. if ((cheatsList[i].address & 1) == 0) {
  843. CPUWriteHalfWord(cheatsList[i].address,
  844. CPUReadHalfWord(cheatsList[i].address) +
  845. cheatsList[i].value);
  846. } else {
  847. CPUWriteMemory(cheatsList[i].address & 0x0FFFFFFE,
  848. CPUReadMemory(cheatsList[i].address & 0x0FFFFFFE) +
  849. cheatsList[i].value);
  850. }
  851. break;
  852. case CBA_OR:
  853. CPUWriteHalfWord(cheatsList[i].address,
  854. CPUReadHalfWord(cheatsList[i].address) |
  855. cheatsList[i].value);
  856. break;
  857. case CBA_GT:
  858. if (!(CPUReadHalfWord(cheatsList[i].address) > cheatsList[i].value)){
  859. i++;
  860. }
  861. break;
  862. case CBA_LT:
  863. if (!(CPUReadHalfWord(cheatsList[i].address) < cheatsList[i].value)){
  864. i++;
  865. }
  866. break;
  867. case CBA_SUPER:
  868. {
  869. int count = 2*((cheatsList[i].value -1) & 0xFFFF)+1;
  870. u32 address = cheatsList[i].address;
  871. for(int x = 0; x <= count; x++) {
  872. u8 b;
  873. int res = x % 6;
  874. if (res==0)
  875. i++;
  876. if(res < 4)
  877. b = (cheatsList[i].address >> (24-8*res)) & 0xFF;
  878. else
  879. b = (cheatsList[i].value >> (8 - 8*(res-4))) & 0xFF;
  880. CPUWriteByte(address, b);
  881. address++;
  882. }
  883. }
  884. break;
  885. case GSA_8_BIT_POINTER :
  886. if (((CPUReadMemory(cheatsList[i].address)>=0x02000000) && (CPUReadMemory(cheatsList[i].address)<0x02040000)) ||
  887. ((CPUReadMemory(cheatsList[i].address)>=0x03000000) && (CPUReadMemory(cheatsList[i].address)<0x03008000)))
  888. {
  889. CPUWriteByte(CPUReadMemory(cheatsList[i].address)+((cheatsList[i].value & 0xFFFFFF00) >> 8),
  890. cheatsList[i].value & 0xFF);
  891. }
  892. break;
  893. case GSA_16_BIT_POINTER :
  894. if (((CPUReadMemory(cheatsList[i].address)>=0x02000000) && (CPUReadMemory(cheatsList[i].address)<0x02040000)) ||
  895. ((CPUReadMemory(cheatsList[i].address)>=0x03000000) && (CPUReadMemory(cheatsList[i].address)<0x03008000)))
  896. {
  897. CPUWriteHalfWord(CPUReadMemory(cheatsList[i].address)+((cheatsList[i].value & 0xFFFF0000) >> 15),
  898. cheatsList[i].value & 0xFFFF);
  899. }
  900. break;
  901. case GSA_32_BIT_POINTER :
  902. if (((CPUReadMemory(cheatsList[i].address)>=0x02000000) && (CPUReadMemory(cheatsList[i].address)<0x02040000)) ||
  903. ((CPUReadMemory(cheatsList[i].address)>=0x03000000) && (CPUReadMemory(cheatsList[i].address)<0x03008000)))
  904. {
  905. CPUWriteMemory(CPUReadMemory(cheatsList[i].address),
  906. cheatsList[i].value);
  907. }
  908. break;
  909. case GSA_8_BIT_ADD :
  910. CPUWriteByte(cheatsList[i].address,
  911. ((cheatsList[i].value & 0xFF) + CPUReadMemory(cheatsList[i].address)) & 0xFF);
  912. break;
  913. case GSA_16_BIT_ADD :
  914. CPUWriteHalfWord(cheatsList[i].address,
  915. ((cheatsList[i].value & 0xFFFF) + CPUReadMemory(cheatsList[i].address)) & 0xFFFF);
  916. break;
  917. case GSA_32_BIT_ADD :
  918. CPUWriteMemory(cheatsList[i].address ,
  919. (cheatsList[i].value + CPUReadMemory(cheatsList[i].address)) & 0xFFFFFFFF);
  920. break;
  921. case GSA_8_BIT_IF_LOWER_U:
  922. if (!(CPUReadByte(cheatsList[i].address) < (cheatsList[i].value & 0xFF))) {
  923. i++;
  924. }
  925. break;
  926. case GSA_16_BIT_IF_LOWER_U:
  927. if (!(CPUReadHalfWord(cheatsList[i].address) < (cheatsList[i].value & 0xFFFF))) {
  928. i++;
  929. }
  930. break;
  931. case GSA_32_BIT_IF_LOWER_U:
  932. if (!(CPUReadMemory(cheatsList[i].address) < cheatsList[i].value)) {
  933. i++;
  934. }
  935. break;
  936. case GSA_8_BIT_IF_HIGHER_U:
  937. if (!(CPUReadByte(cheatsList[i].address) > (cheatsList[i].value & 0xFF))) {
  938. i++;
  939. }
  940. break;
  941. case GSA_16_BIT_IF_HIGHER_U:
  942. if (!(CPUReadHalfWord(cheatsList[i].address) > (cheatsList[i].value & 0xFFFF))) {
  943. i++;
  944. }
  945. break;
  946. case GSA_32_BIT_IF_HIGHER_U:
  947. if (!(CPUReadMemory(cheatsList[i].address) > cheatsList[i].value)) {
  948. i++;
  949. }
  950. break;
  951. case GSA_8_BIT_IF_AND:
  952. if (!(CPUReadByte(cheatsList[i].address) & (cheatsList[i].value & 0xFF))) {
  953. i++;
  954. }
  955. break;
  956. case GSA_16_BIT_IF_AND:
  957. if (!(CPUReadHalfWord(cheatsList[i].address) & (cheatsList[i].value & 0xFFFF))) {
  958. i++;
  959. }
  960. break;
  961. case GSA_32_BIT_IF_AND:
  962. if (!(CPUReadMemory(cheatsList[i].address) & cheatsList[i].value)) {
  963. i++;
  964. }
  965. break;
  966. case GSA_8_BIT_IF_LOWER_U2:
  967. if (!(CPUReadByte(cheatsList[i].address) < (cheatsList[i].value & 0xFF))) {
  968. i+=2;
  969. }
  970. break;
  971. case GSA_16_BIT_IF_LOWER_U2:
  972. if (!(CPUReadHalfWord(cheatsList[i].address) < (cheatsList[i].value & 0xFFFF))) {
  973. i+=2;
  974. }
  975. break;
  976. case GSA_32_BIT_IF_LOWER_U2:
  977. if (!(CPUReadMemory(cheatsList[i].address) < cheatsList[i].value)) {
  978. i+=2;
  979. }
  980. break;
  981. case GSA_8_BIT_IF_HIGHER_U2:
  982. if (!(CPUReadByte(cheatsList[i].address) > (cheatsList[i].value & 0xFF))) {
  983. i+=2;
  984. }
  985. break;
  986. case GSA_16_BIT_IF_HIGHER_U2:
  987. if (!(CPUReadHalfWord(cheatsList[i].address) > (cheatsList[i].value & 0xFFFF))) {
  988. i+=2;
  989. }
  990. break;
  991. case GSA_32_BIT_IF_HIGHER_U2:
  992. if (!(CPUReadMemory(cheatsList[i].address) > cheatsList[i].value)) {
  993. i+=2;
  994. }
  995. break;
  996. case GSA_8_BIT_IF_AND2:
  997. if (!(CPUReadByte(cheatsList[i].address) & (cheatsList[i].value & 0xFF))) {
  998. i+=2;
  999. }
  1000. break;
  1001. case GSA_16_BIT_IF_AND2:
  1002. if (!(CPUReadHalfWord(cheatsList[i].address) & (cheatsList[i].value & 0xFFFF))) {
  1003. i+=2;
  1004. }
  1005. break;
  1006. case GSA_32_BIT_IF_AND2:
  1007. if (!(CPUReadMemory(cheatsList[i].address) & cheatsList[i].value)) {
  1008. i+=2;
  1009. }
  1010. break;
  1011. case GSA_ALWAYS:
  1012. i++;
  1013. break;
  1014. case GSA_ALWAYS2:
  1015. i+=2;
  1016. break;
  1017. case GSA_8_BIT_IF_LOWER_S:
  1018. if (!((s8)CPUReadByte(cheatsList[i].address) < ((s8)cheatsList[i].value & 0xFF))) {
  1019. i++;
  1020. }
  1021. break;
  1022. case GSA_16_BIT_IF_LOWER_S:
  1023. if (!((s16)CPUReadHalfWord(cheatsList[i].address) < ((s16)cheatsList[i].value & 0xFFFF))) {
  1024. i++;
  1025. }
  1026. break;
  1027. case GSA_32_BIT_IF_LOWER_S:
  1028. if (!((s32)CPUReadMemory(cheatsList[i].address) < (s32)cheatsList[i].value)) {
  1029. i++;
  1030. }
  1031. break;
  1032. case GSA_8_BIT_IF_HIGHER_S:
  1033. if (!((s8)CPUReadByte(cheatsList[i].address) > ((s8)cheatsList[i].value & 0xFF))) {
  1034. i++;
  1035. }
  1036. break;
  1037. case GSA_16_BIT_IF_HIGHER_S:
  1038. if (!((s16)CPUReadHalfWord(cheatsList[i].address) > ((s16)cheatsList[i].value & 0xFFFF))) {
  1039. i++;
  1040. }
  1041. break;
  1042. case GSA_32_BIT_IF_HIGHER_S:
  1043. if (!((s32)CPUReadMemory(cheatsList[i].address) > (s32)cheatsList[i].value)) {
  1044. i++;
  1045. }
  1046. break;
  1047. case GSA_8_BIT_IF_LOWER_S2:
  1048. if (!((s8)CPUReadByte(cheatsList[i].address) < ((s8)cheatsList[i].value & 0xFF))) {
  1049. i+=2;
  1050. }
  1051. break;
  1052. case GSA_16_BIT_IF_LOWER_S2:
  1053. if (!((s16)CPUReadHalfWord(cheatsList[i].address) < ((s16)cheatsList[i].value & 0xFFFF))) {
  1054. i+=2;
  1055. }
  1056. break;
  1057. case GSA_32_BIT_IF_LOWER_S2:
  1058. if (!((s32)CPUReadMemory(cheatsList[i].address) < (s32)cheatsList[i].value)) {
  1059. i+=2;
  1060. }
  1061. break;
  1062. case GSA_8_BIT_IF_HIGHER_S2:
  1063. if (!((s8)CPUReadByte(cheatsList[i].address) > ((s8)cheatsList[i].value & 0xFF))) {
  1064. i+=2;
  1065. }
  1066. break;
  1067. case GSA_16_BIT_IF_HIGHER_S2:
  1068. if (!((s16)CPUReadHalfWord(cheatsList[i].address) > ((s16)cheatsList[i].value & 0xFFFF))) {
  1069. i+=2;
  1070. }
  1071. break;
  1072. case GSA_32_BIT_IF_HIGHER_S2:
  1073. if (!((s32)CPUReadMemory(cheatsList[i].address) > (s32)cheatsList[i].value)) {
  1074. i+=2;
  1075. }
  1076. break;
  1077. case GSA_16_BIT_WRITE_IOREGS:
  1078. if ((cheatsList[i].address <= 0x3FF) && (cheatsList[i].address != 0x6) &&
  1079. (cheatsList[i].address != 0x130))
  1080. ioMem[cheatsList[i].address & 0x3FE]=cheatsList[i].value & 0xFFFF;
  1081. break;
  1082. case GSA_32_BIT_WRITE_IOREGS:
  1083. if (cheatsList[i].address<=0x3FF)
  1084. {
  1085. if (((cheatsList[i].address & 0x3FC) != 0x6) && ((cheatsList[i].address & 0x3FC) != 0x130))
  1086. ioMem[cheatsList[i].address & 0x3FC]= (cheatsList[i].value & 0xFFFF);
  1087. if ((((cheatsList[i].address & 0x3FC)+2) != 0x6) && ((cheatsList[i].address & 0x3FC) +2) != 0x130)
  1088. ioMem[(cheatsList[i].address & 0x3FC) + 2 ]= ((cheatsList[i].value>>16 ) & 0xFFFF);
  1089. }
  1090. break;
  1091. case GSA_8_BIT_IF_TRUE3:
  1092. if(CPUReadByte(cheatsList[i].address) != cheatsList[i].value) {
  1093. onoff=false;
  1094. }
  1095. break;
  1096. case GSA_16_BIT_IF_TRUE3:
  1097. if(CPUReadHalfWord(cheatsList[i].address) != cheatsList[i].value) {
  1098. onoff=false;
  1099. }
  1100. break;
  1101. case GSA_32_BIT_IF_TRUE3:
  1102. if(CPUReadMemory(cheatsList[i].address) != cheatsList[i].value) {
  1103. onoff=false;
  1104. }
  1105. break;
  1106. case GSA_8_BIT_IF_FALSE3:
  1107. if(CPUReadByte(cheatsList[i].address) == cheatsList[i].value) {
  1108. onoff=false;
  1109. }
  1110. break;
  1111. case GSA_16_BIT_IF_FALSE3:
  1112. if(CPUReadHalfWord(cheatsList[i].address) == cheatsList[i].value) {
  1113. onoff=false;
  1114. }
  1115. break;
  1116. case GSA_32_BIT_IF_FALSE3:
  1117. if(CPUReadMemory(cheatsList[i].address) == cheatsList[i].value) {
  1118. onoff=false;
  1119. }
  1120. break;
  1121. case GSA_8_BIT_IF_LOWER_S3:
  1122. if (!((s8)CPUReadByte(cheatsList[i].address) < ((s8)cheatsList[i].value & 0xFF))) {
  1123. onoff=false;
  1124. }
  1125. break;
  1126. case GSA_16_BIT_IF_LOWER_S3:
  1127. if (!((s16)CPUReadHalfWord(cheatsList[i].address) < ((s16)cheatsList[i].value & 0xFFFF))) {
  1128. onoff=false;
  1129. }
  1130. break;
  1131. case GSA_32_BIT_IF_LOWER_S3:
  1132. if (!((s32)CPUReadMemory(cheatsList[i].address) < (s32)cheatsList[i].value)) {
  1133. onoff=false;
  1134. }
  1135. break;
  1136. case GSA_8_BIT_IF_HIGHER_S3:
  1137. if (!((s8)CPUReadByte(cheatsList[i].address) > ((s8)cheatsList[i].value & 0xFF))) {
  1138. onoff=false;
  1139. }
  1140. break;
  1141. case GSA_16_BIT_IF_HIGHER_S3:
  1142. if (!((s16)CPUReadHalfWord(cheatsList[i].address) > ((s16)cheatsList[i].value & 0xFFFF))) {
  1143. onoff=false;
  1144. }
  1145. break;
  1146. case GSA_32_BIT_IF_HIGHER_S3:
  1147. if (!((s32)CPUReadMemory(cheatsList[i].address) > (s32)cheatsList[i].value)) {
  1148. onoff=false;
  1149. }
  1150. break;
  1151. case GSA_8_BIT_IF_LOWER_U3:
  1152. if (!(CPUReadByte(cheatsList[i].address) < (cheatsList[i].value & 0xFF))) {
  1153. onoff=false;
  1154. }
  1155. break;
  1156. case GSA_16_BIT_IF_LOWER_U3:
  1157. if (!(CPUReadHalfWord(cheatsList[i].address) < (cheatsList[i].value & 0xFFFF))) {
  1158. onoff=false;
  1159. }
  1160. break;
  1161. case GSA_32_BIT_IF_LOWER_U3:
  1162. if (!(CPUReadMemory(cheatsList[i].address) < cheatsList[i].value)) {
  1163. onoff=false;
  1164. }
  1165. break;
  1166. case GSA_8_BIT_IF_HIGHER_U3:
  1167. if (!(CPUReadByte(cheatsList[i].address) > (cheatsList[i].value & 0xFF))) {
  1168. onoff=false;
  1169. }
  1170. break;
  1171. case GSA_16_BIT_IF_HIGHER_U3:
  1172. if (!(CPUReadHalfWord(cheatsList[i].address) > (cheatsList[i].value & 0xFFFF))) {
  1173. onoff=false;
  1174. }
  1175. break;
  1176. case GSA_32_BIT_IF_HIGHER_U3:
  1177. if (!(CPUReadMemory(cheatsList[i].address) > cheatsList[i].value)) {
  1178. onoff=false;
  1179. }
  1180. break;
  1181. case GSA_8_BIT_IF_AND3:
  1182. if (!(CPUReadByte(cheatsList[i].address) & (cheatsList[i].value & 0xFF))) {
  1183. onoff=false;
  1184. }
  1185. break;
  1186. case GSA_16_BIT_IF_AND3:
  1187. if (!(CPUReadHalfWord(cheatsList[i].address) & (cheatsList[i].value & 0xFFFF))) {
  1188. onoff=false;
  1189. }
  1190. break;
  1191. case GSA_32_BIT_IF_AND3:
  1192. if (!(CPUReadMemory(cheatsList[i].address) & cheatsList[i].value)) {
  1193. onoff=false;
  1194. }
  1195. break;
  1196. case GSA_ALWAYS3:
  1197. if (!(CPUReadMemory(cheatsList[i].address) & cheatsList[i].value)) {
  1198. onoff=false;
  1199. }
  1200. break;
  1201. case GSA_GROUP_WRITE:
  1202. {
  1203. int count = ((cheatsList[i].address) & 0xFFFE) +1;
  1204. u32 value = cheatsList[i].value;
  1205. if (count==0)
  1206. i++;
  1207. else
  1208. for (int x = 1; x <= count; x++) {
  1209. if ((x % 2) ==0){
  1210. if (x<count)
  1211. i++;
  1212. CPUWriteMemory(cheatsList[i].rawaddress, value);
  1213. }
  1214. else
  1215. CPUWriteMemory(cheatsList[i].value, value);
  1216. }
  1217. }
  1218. break;
  1219. case GSA_32_BIT_ADD2:
  1220. CPUWriteMemory(cheatsList[i].value ,
  1221. (CPUReadMemory(cheatsList[i].value) + cheatsList[i+1].rawaddress) & 0xFFFFFFFF);
  1222. i++;
  1223. break;
  1224. case GSA_32_BIT_SUB2:
  1225. CPUWriteMemory(cheatsList[i].value ,
  1226. (CPUReadMemory(cheatsList[i].value) - cheatsList[i+1].rawaddress) & 0xFFFFFFFF);
  1227. i++;
  1228. break;
  1229. case GSA_16_BIT_IF_LOWER_OR_EQ_U:
  1230. if(CPUReadHalfWord(cheatsList[i].address) > cheatsList[i].value) {
  1231. i++;
  1232. }
  1233. break;
  1234. case GSA_16_BIT_IF_HIGHER_OR_EQ_U:
  1235. if(CPUReadHalfWord(cheatsList[i].address) < cheatsList[i].value) {
  1236. i++;
  1237. }
  1238. break;
  1239. case GSA_16_BIT_MIF_TRUE:
  1240. if(CPUReadHalfWord(cheatsList[i].address) != cheatsList[i].value) {
  1241. i+=((cheatsList[i].rawaddress >> 0x10) & 0xFF);
  1242. }
  1243. break;
  1244. case GSA_16_BIT_MIF_FALSE:
  1245. if(CPUReadHalfWord(cheatsList[i].address) == cheatsList[i].value) {
  1246. i+=(cheatsList[i].rawaddress >> 0x10) & 0xFF;
  1247. }
  1248. break;
  1249. case GSA_16_BIT_MIF_LOWER_OR_EQ_U:
  1250. if(CPUReadHalfWord(cheatsList[i].address) > cheatsList[i].value) {
  1251. i+=(cheatsList[i].rawaddress >> 0x10) & 0xFF;
  1252. }
  1253. break;
  1254. case GSA_16_BIT_MIF_HIGHER_OR_EQ_U:
  1255. if(CPUReadHalfWord(cheatsList[i].address) < cheatsList[i].value) {
  1256. i+=(cheatsList[i].rawaddress >> 0x10) & 0xFF;
  1257. }
  1258. break;
  1259. case CHEATS_16_BIT_WRITE:
  1260. if ((cheatsList[i].address>>24)>=0x08) {
  1261. CHEAT_PATCH_ROM_16BIT(cheatsList[i].address, cheatsList[i].value);
  1262. } else {
  1263. CPUWriteHalfWord(cheatsList[i].address, cheatsList[i].value);
  1264. }
  1265. break;
  1266. case CHEATS_32_BIT_WRITE:
  1267. if ((cheatsList[i].address>>24)>=0x08) {
  1268. CHEAT_PATCH_ROM_32BIT(cheatsList[i].address, cheatsList[i].value);
  1269. } else {
  1270. CPUWriteMemory(cheatsList[i].address, cheatsList[i].value);
  1271. }
  1272. break;
  1273. }
  1274. }
  1275. }
  1276. for (i = 0; i<4; i++)
  1277. if (rompatch2addr [i] != 0)
  1278. CHEAT_PATCH_ROM_16BIT(rompatch2addr [i],rompatch2val [i]);
  1279. return ticks;
  1280. }
  1281. void cheatsAdd(const char *codeStr,
  1282. const char *desc,
  1283. u32 rawaddress,
  1284. u32 address,
  1285. u32 value,
  1286. int code,
  1287. int size)
  1288. {
  1289. if(cheatsNumber < 100) {
  1290. int x = cheatsNumber;
  1291. cheatsList[x].code = code;
  1292. cheatsList[x].size = size;
  1293. cheatsList[x].rawaddress = rawaddress;
  1294. cheatsList[x].address = address;
  1295. cheatsList[x].value = value;
  1296. strcpy(cheatsList[x].codestring, codeStr);
  1297. strcpy(cheatsList[x].desc, desc);
  1298. cheatsList[x].enabled = true;
  1299. cheatsList[x].status = 0;
  1300. // we only store the old value for this simple codes. ROM patching
  1301. // is taken care when it actually patches the ROM
  1302. switch(cheatsList[x].size) {
  1303. case INT_8_BIT_WRITE:
  1304. cheatsList[x].oldValue = CPUReadByte(address);
  1305. break;
  1306. case INT_16_BIT_WRITE:
  1307. cheatsList[x].oldValue = CPUReadHalfWord(address);
  1308. break;
  1309. case INT_32_BIT_WRITE:
  1310. cheatsList[x].oldValue = CPUReadMemory(address);
  1311. break;
  1312. case CHEATS_16_BIT_WRITE:
  1313. cheatsList[x].oldValue = CPUReadHalfWord(address);
  1314. break;
  1315. case CHEATS_32_BIT_WRITE:
  1316. cheatsList[x].oldValue = CPUReadMemory(address);
  1317. break;
  1318. }
  1319. cheatsNumber++;
  1320. }
  1321. }
  1322. void cheatsDelete(int number, bool restore)
  1323. {
  1324. if(number < cheatsNumber && number >= 0) {
  1325. int x = number;
  1326. if(restore) {
  1327. switch(cheatsList[x].size) {
  1328. case INT_8_BIT_WRITE:
  1329. CPUWriteByte(cheatsList[x].address, (u8)cheatsList[x].oldValue);
  1330. break;
  1331. case INT_16_BIT_WRITE:
  1332. CPUWriteHalfWord(cheatsList[x].address, (u16)cheatsList[x].oldValue);
  1333. break;
  1334. case INT_32_BIT_WRITE:
  1335. CPUWriteMemory(cheatsList[x].address, cheatsList[x].oldValue);
  1336. break;
  1337. case CHEATS_16_BIT_WRITE:
  1338. if ((cheatsList[x].address>>24)>=0x08) {
  1339. CHEAT_PATCH_ROM_16BIT(cheatsList[x].address, cheatsList[x].oldValue);
  1340. } else {
  1341. CPUWriteHalfWord(cheatsList[x].address, cheatsList[x].oldValue);
  1342. }
  1343. break;
  1344. case CHEATS_32_BIT_WRITE:
  1345. if ((cheatsList[x].address>>24)>=0x08) {
  1346. CHEAT_PATCH_ROM_32BIT(cheatsList[x].address, cheatsList[x].oldValue);
  1347. } else {
  1348. CPUWriteMemory(cheatsList[x].address, cheatsList[x].oldValue);
  1349. }
  1350. case GSA_16_BIT_ROM_PATCH:
  1351. if(cheatsList[x].status & 1) {
  1352. cheatsList[x].status &= ~1;
  1353. CHEAT_PATCH_ROM_16BIT(cheatsList[x].address,
  1354. cheatsList[x].oldValue);
  1355. }
  1356. break;
  1357. case GSA_16_BIT_ROM_PATCH2C:
  1358. case GSA_16_BIT_ROM_PATCH2D:
  1359. case GSA_16_BIT_ROM_PATCH2E:
  1360. case GSA_16_BIT_ROM_PATCH2F:
  1361. if(cheatsList[x].status & 1) {
  1362. cheatsList[x].status &= ~1;
  1363. }
  1364. break;
  1365. case MASTER_CODE:
  1366. mastercode=0;
  1367. break;
  1368. }
  1369. }
  1370. if((x+1) < cheatsNumber) {
  1371. memcpy(&cheatsList[x], &cheatsList[x+1], sizeof(CheatsData)*
  1372. (cheatsNumber-x-1));
  1373. }
  1374. cheatsNumber--;
  1375. }
  1376. }
  1377. void cheatsDeleteAll(bool restore)
  1378. {
  1379. for(int i = cheatsNumber-1; i >= 0; i--) {
  1380. cheatsDelete(i, restore);
  1381. }
  1382. }
  1383. void cheatsEnable(int i)
  1384. {
  1385. if(i >= 0 && i < cheatsNumber) {
  1386. cheatsList[i].enabled = true;
  1387. mastercode = 0;
  1388. }
  1389. }
  1390. void cheatsDisable(int i)
  1391. {
  1392. if(i >= 0 && i < cheatsNumber) {
  1393. switch(cheatsList[i].size) {
  1394. case GSA_16_BIT_ROM_PATCH:
  1395. if(cheatsList[i].status & 1) {
  1396. cheatsList[i].status &= ~1;
  1397. CHEAT_PATCH_ROM_16BIT(cheatsList[i].address,
  1398. cheatsList[i].oldValue);
  1399. }
  1400. break;
  1401. case GSA_16_BIT_ROM_PATCH2C:
  1402. case GSA_16_BIT_ROM_PATCH2D:
  1403. case GSA_16_BIT_ROM_PATCH2E:
  1404. case GSA_16_BIT_ROM_PATCH2F:
  1405. if(cheatsList[i].status & 1) {
  1406. cheatsList[i].status &= ~1;
  1407. }
  1408. break;
  1409. case MASTER_CODE:
  1410. mastercode=0;
  1411. break;
  1412. }
  1413. cheatsList[i].enabled = false;
  1414. }
  1415. }
  1416. bool cheatsVerifyCheatCode(const char *code, const char *desc)
  1417. {
  1418. size_t len = strlen(code);
  1419. if(len != 11 && len != 13 && len != 17) {
  1420. systemMessage(MSG_INVALID_CHEAT_CODE, N_("Invalid cheat code '%s': wrong length"), code);
  1421. return false;
  1422. }
  1423. if(code[8] != ':') {
  1424. systemMessage(MSG_INVALID_CHEAT_CODE, N_("Invalid cheat code '%s': no colon"), code);
  1425. return false;
  1426. }
  1427. size_t i;
  1428. for(i = 0; i < 8; i++) {
  1429. if(!CHEAT_IS_HEX(code[i])) {
  1430. // wrong cheat
  1431. systemMessage(MSG_INVALID_CHEAT_CODE,
  1432. N_("Invalid cheat code '%s': first part is not hex"), code);
  1433. return false;
  1434. }
  1435. }
  1436. for(i = 9; i < len; i++) {
  1437. if(!CHEAT_IS_HEX(code[i])) {
  1438. // wrong cheat
  1439. systemMessage(MSG_INVALID_CHEAT_CODE,
  1440. N_("Invalid cheat code '%s' second part is not hex"), code);
  1441. return false;
  1442. }
  1443. }
  1444. u32 address = 0;
  1445. u32 value = 0;
  1446. char buffer[10];
  1447. strncpy(buffer, code, 8);
  1448. buffer[8] = 0;
  1449. sscanf(buffer, "%x", &address);
  1450. switch(address >> 24) {
  1451. case 0x02:
  1452. case 0x03:
  1453. case 0x04:
  1454. case 0x05:
  1455. case 0x06:
  1456. case 0x07:
  1457. case 0x08:
  1458. case 0x09:
  1459. case 0x0A:
  1460. case 0x0B:
  1461. case 0x0C:
  1462. case 0x0D:
  1463. break;
  1464. default:
  1465. systemMessage(MSG_INVALID_CHEAT_CODE_ADDRESS,
  1466. N_("Invalid cheat code address: %08x"),
  1467. address);
  1468. return false;
  1469. }
  1470. strncpy(buffer, &code[9], 8);
  1471. sscanf(buffer, "%x", &value);
  1472. int type = 0;
  1473. if(len == 13)
  1474. type = 114;
  1475. if(len == 17)
  1476. type = 115;
  1477. cheatsAdd(code, desc, address, address, value, type, type);
  1478. return true;
  1479. }
  1480. void cheatsAddCheatCode(const char *code, const char *desc)
  1481. {
  1482. cheatsVerifyCheatCode(code, desc);
  1483. }
  1484. u16 cheatsGSAGetDeadface(bool v3)
  1485. {
  1486. for(int i = cheatsNumber-1; i >= 0; i--)
  1487. if ((cheatsList[i].address == 0xDEADFACE) && (cheatsList[i].code == (v3 ? 257 : 256)))
  1488. return cheatsList[i].value & 0xFFFF;
  1489. return 0;
  1490. }
  1491. void cheatsGSAChangeEncryption(u16 value, bool v3) {
  1492. int i;
  1493. u8 *deadtable1, *deadtable2;
  1494. if (v3) {
  1495. deadtable1 = (u8*)(&v3_deadtable1);
  1496. deadtable2 = (u8*)(&v3_deadtable2);
  1497. for (i = 0; i < 4; i++)
  1498. seeds_v3[i] = seed_gen(((value & 0xFF00) >> 8), (value & 0xFF) + i, deadtable1, deadtable2);
  1499. }
  1500. else {
  1501. deadtable1 = (u8*)(&v1_deadtable1);
  1502. deadtable2 = (u8*)(&v1_deadtable2);
  1503. for (i = 0; i < 4; i++){
  1504. seeds_v1[i] = seed_gen(((value & 0xFF00) >> 8), (value & 0xFF) + i, deadtable1, deadtable2);
  1505. }
  1506. }
  1507. }
  1508. u32 seed_gen(u8 upper, u8 seed, u8 *deadtable1, u8 *deadtable2) {
  1509. int i;
  1510. u32 newseed = 0;
  1511. for (i = 0; i < 4; i++)
  1512. newseed = ((newseed << 8) | ((deadtable1[(i + upper) & 0xFF] + deadtable2[seed]) & 0xFF));
  1513. return newseed;
  1514. }
  1515. void cheatsDecryptGSACode(u32& address, u32& value, bool v3)
  1516. {
  1517. u32 rollingseed = 0xC6EF3720;
  1518. u32 *seeds = v3 ? seeds_v3 : seeds_v1;
  1519. int bitsleft = 32;
  1520. while (bitsleft > 0) {
  1521. value -= ((((address << 4) + seeds[2]) ^ (address + rollingseed)) ^
  1522. ((address >> 5) + seeds[3]));
  1523. address -= ((((value << 4) + seeds[0]) ^ (value + rollingseed)) ^
  1524. ((value >> 5) + seeds[1]));
  1525. rollingseed -= 0x9E3779B9;
  1526. bitsleft--;
  1527. }
  1528. }
  1529. void cheatsAddGSACode(const char *code, const char *desc, bool v3)
  1530. {
  1531. if(strlen(code) != 16) {
  1532. // wrong cheat
  1533. systemMessage(MSG_INVALID_GSA_CODE,
  1534. N_("Invalid GSA code. Format is XXXXXXXXYYYYYYYY"));
  1535. return;
  1536. }
  1537. int i;
  1538. for(i = 0; i < 16; i++) {
  1539. if(!CHEAT_IS_HEX(code[i])) {
  1540. // wrong cheat
  1541. systemMessage(MSG_INVALID_GSA_CODE,
  1542. N_("Invalid GSA code. Format is XXXXXXXXYYYYYYYY"));
  1543. return;
  1544. }
  1545. }
  1546. char buffer[10];
  1547. strncpy(buffer, code, 8);
  1548. buffer[8] = 0;
  1549. u32 address;
  1550. sscanf(buffer, "%x", &address);
  1551. strncpy(buffer, &code[8], 8);
  1552. buffer[8] = 0;
  1553. u32 value;
  1554. sscanf(buffer, "%x", &value);
  1555. cheatsGSAChangeEncryption(cheatsGSAGetDeadface (v3), v3);
  1556. cheatsDecryptGSACode(address, value, v3);
  1557. if(value == 0x1DC0DE) {
  1558. u32 gamecode = READ32LE(((u32 *)&rom[0xac]));
  1559. if(gamecode != address) {
  1560. char buffer[5];
  1561. *((u32 *)buffer) = address;
  1562. buffer[4] = 0;
  1563. char buffer2[5];
  1564. *((u32 *)buffer2) = READ32LE(((u32 *)&rom[0xac]));
  1565. buffer2[4] = 0;
  1566. systemMessage(MSG_GBA_CODE_WARNING, N_("Warning: cheats are for game %s. Current game is %s.\nCodes may not work correctly."),
  1567. buffer, buffer2);
  1568. }
  1569. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value, v3 ? 257 : 256,
  1570. UNKNOWN_CODE);
  1571. return;
  1572. }
  1573. if(isMultilineWithData(cheatsNumber-1)) {
  1574. cheatsAdd(code, desc, address, address, value, v3 ? 257 : 256, UNKNOWN_CODE);
  1575. return;
  1576. }
  1577. if(v3) {
  1578. int type = ((address >> 25) & 127) | ((address >> 17) & 0x80);
  1579. u32 addr = (address & 0x00F00000) << 4 | (address & 0x0003FFFF);
  1580. u16 mcode = (address>>24 & 0xFF);
  1581. if ((mcode & 0xFE) == 0xC4)
  1582. {
  1583. cheatsAdd(code, desc, address, (address & 0x1FFFFFF) | (0x08000000),
  1584. value, 257, MASTER_CODE);
  1585. mastercode = (address & 0x1FFFFFF) | (0x08000000);
  1586. }
  1587. else
  1588. switch(type) {
  1589. case 0x00:
  1590. if(address == 0) {
  1591. type = (value >> 25) & 127;
  1592. addr = (value & 0x00F00000) << 4 | (value & 0x0003FFFF);
  1593. switch(type) {
  1594. case 0x04:
  1595. cheatsAdd(code, desc, address, 0, value & 0x00FFFFFF, 257, GSA_SLOWDOWN);
  1596. break;
  1597. case 0x08:
  1598. cheatsAdd(code, desc, address, 0, addr, 257, GSA_8_BIT_GS_WRITE2);
  1599. break;
  1600. case 0x09:
  1601. cheatsAdd(code, desc, address, 0, addr, 257, GSA_16_BIT_GS_WRITE2);
  1602. break;
  1603. case 0x0a:
  1604. cheatsAdd(code, desc, address, 0, addr, 257, GSA_32_BIT_GS_WRITE2);
  1605. break;
  1606. case 0x0c:
  1607. cheatsAdd(code, desc, address, 0, value & 0x00FFFFFF, 257, GSA_16_BIT_ROM_PATCH2C);
  1608. break;
  1609. case 0x0d:
  1610. cheatsAdd(code, desc, address, 0, value & 0x00FFFFFF, 257, GSA_16_BIT_ROM_PATCH2D);
  1611. break;
  1612. case 0x0e:
  1613. cheatsAdd(code, desc, address, 0, value & 0x00FFFFFF, 257, GSA_16_BIT_ROM_PATCH2E);
  1614. break;
  1615. case 0x0f:
  1616. cheatsAdd(code, desc, address, 0, value & 0x00FFFFFF, 257, GSA_16_BIT_ROM_PATCH2F);
  1617. break;
  1618. case 0x20:
  1619. cheatsAdd(code, desc, address, 0, addr, 257, GSA_CODES_ON);
  1620. break;
  1621. case 0x40:
  1622. cheatsAdd(code, desc, address, 0, addr, 257, GSA_8_BIT_SLIDE);
  1623. break;
  1624. case 0x41:
  1625. cheatsAdd(code, desc, address, 0, addr, 257, GSA_16_BIT_SLIDE);
  1626. break;
  1627. case 0x42:
  1628. cheatsAdd(code, desc, address, 0, addr, 257, GSA_32_BIT_SLIDE);
  1629. break;
  1630. default:
  1631. cheatsAdd(code, desc, address, address, value, 257, UNKNOWN_CODE);
  1632. break;
  1633. }
  1634. } else
  1635. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_FILL);
  1636. break;
  1637. case 0x01:
  1638. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_FILL);
  1639. break;
  1640. case 0x02:
  1641. cheatsAdd(code, desc, address, addr, value, 257, INT_32_BIT_WRITE);
  1642. break;
  1643. case 0x04:
  1644. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_TRUE);
  1645. break;
  1646. case 0x05:
  1647. cheatsAdd(code, desc, address, addr, value, 257, CBA_IF_TRUE);
  1648. break;
  1649. case 0x06:
  1650. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_TRUE);
  1651. break;
  1652. case 0x07:
  1653. cheatsAdd(code, desc, address, addr, value, 257, GSA_ALWAYS);
  1654. break;
  1655. case 0x08:
  1656. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_FALSE);
  1657. break;
  1658. case 0x09:
  1659. cheatsAdd(code, desc, address, addr, value, 257, CBA_IF_FALSE);
  1660. break;
  1661. case 0x0a:
  1662. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_FALSE);
  1663. break;
  1664. case 0xc:
  1665. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_LOWER_S);
  1666. break;
  1667. case 0xd:
  1668. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_LOWER_S);
  1669. break;
  1670. case 0xe:
  1671. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_LOWER_S);
  1672. break;
  1673. case 0x10:
  1674. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_HIGHER_S);
  1675. break;
  1676. case 0x11:
  1677. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_HIGHER_S);
  1678. break;
  1679. case 0x12:
  1680. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_HIGHER_S);
  1681. break;
  1682. case 0x14:
  1683. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_LOWER_U);
  1684. break;
  1685. case 0x15:
  1686. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_LOWER_U);
  1687. break;
  1688. case 0x16:
  1689. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_LOWER_U);
  1690. break;
  1691. case 0x18:
  1692. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_HIGHER_U);
  1693. break;
  1694. case 0x19:
  1695. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_HIGHER_U);
  1696. break;
  1697. case 0x1A:
  1698. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_HIGHER_U);
  1699. break;
  1700. case 0x1C:
  1701. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_AND);
  1702. break;
  1703. case 0x1D:
  1704. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_AND);
  1705. break;
  1706. case 0x1E:
  1707. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_AND);
  1708. break;
  1709. case 0x20:
  1710. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_POINTER);
  1711. break;
  1712. case 0x21:
  1713. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_POINTER);
  1714. break;
  1715. case 0x22:
  1716. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_POINTER);
  1717. break;
  1718. case 0x24:
  1719. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_TRUE2);
  1720. break;
  1721. case 0x25:
  1722. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_TRUE2);
  1723. break;
  1724. case 0x26:
  1725. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_TRUE2);
  1726. break;
  1727. case 0x27:
  1728. cheatsAdd(code, desc, address, addr, value, 257, GSA_ALWAYS2);
  1729. break;
  1730. case 0x28:
  1731. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_FALSE2);
  1732. break;
  1733. case 0x29:
  1734. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_FALSE2);
  1735. break;
  1736. case 0x2a:
  1737. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_FALSE2);
  1738. break;
  1739. case 0x2c:
  1740. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_LOWER_S2);
  1741. break;
  1742. case 0x2d:
  1743. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_LOWER_S2);
  1744. break;
  1745. case 0x2e:
  1746. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_LOWER_S2);
  1747. break;
  1748. case 0x30:
  1749. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_HIGHER_S2);
  1750. break;
  1751. case 0x31:
  1752. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_HIGHER_S2);
  1753. break;
  1754. case 0x32:
  1755. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_HIGHER_S2);
  1756. break;
  1757. case 0x34:
  1758. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_LOWER_U2);
  1759. break;
  1760. case 0x35:
  1761. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_LOWER_U2);
  1762. break;
  1763. case 0x36:
  1764. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_LOWER_U2);
  1765. break;
  1766. case 0x38:
  1767. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_HIGHER_U2);
  1768. break;
  1769. case 0x39:
  1770. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_HIGHER_U2);
  1771. break;
  1772. case 0x3A:
  1773. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_HIGHER_U2);
  1774. break;
  1775. case 0x3C:
  1776. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_AND2);
  1777. break;
  1778. case 0x3D:
  1779. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_AND2);
  1780. break;
  1781. case 0x3E:
  1782. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_AND2);
  1783. break;
  1784. case 0x40:
  1785. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_ADD);
  1786. break;
  1787. case 0x41:
  1788. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_ADD);
  1789. break;
  1790. case 0x42:
  1791. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_ADD);
  1792. break;
  1793. case 0x44:
  1794. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_TRUE3);
  1795. break;
  1796. case 0x45:
  1797. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_TRUE3);
  1798. break;
  1799. case 0x46:
  1800. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_TRUE3);
  1801. break;
  1802. case 0x47:
  1803. cheatsAdd(code, desc, address, addr, value, 257, GSA_ALWAYS3);
  1804. break;
  1805. case 0x48:
  1806. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_FALSE3);
  1807. break;
  1808. case 0x49:
  1809. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_FALSE3);
  1810. break;
  1811. case 0x4a:
  1812. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_FALSE3);
  1813. break;
  1814. case 0x4c:
  1815. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_LOWER_S3);
  1816. break;
  1817. case 0x4d:
  1818. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_LOWER_S3);
  1819. break;
  1820. case 0x4e:
  1821. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_LOWER_S3);
  1822. break;
  1823. case 0x50:
  1824. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_HIGHER_S3);
  1825. break;
  1826. case 0x51:
  1827. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_HIGHER_S3);
  1828. break;
  1829. case 0x52:
  1830. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_HIGHER_S3);
  1831. break;
  1832. case 0x54:
  1833. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_LOWER_U3);
  1834. break;
  1835. case 0x55:
  1836. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_LOWER_U3);
  1837. break;
  1838. case 0x56:
  1839. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_LOWER_U3);
  1840. break;
  1841. case 0x58:
  1842. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_HIGHER_U3);
  1843. break;
  1844. case 0x59:
  1845. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_HIGHER_U3);
  1846. break;
  1847. case 0x5a:
  1848. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_HIGHER_U3);
  1849. break;
  1850. case 0x5c:
  1851. cheatsAdd(code, desc, address, addr, value, 257, GSA_8_BIT_IF_AND3);
  1852. break;
  1853. case 0x5d:
  1854. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_IF_AND3);
  1855. break;
  1856. case 0x5e:
  1857. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_IF_AND3);
  1858. break;
  1859. case 0x63:
  1860. cheatsAdd(code, desc, address, addr, value, 257, GSA_16_BIT_WRITE_IOREGS);
  1861. break;
  1862. case 0xE3:
  1863. cheatsAdd(code, desc, address, addr, value, 257, GSA_32_BIT_WRITE_IOREGS);
  1864. break;
  1865. default:
  1866. cheatsAdd(code, desc, address, address, value, 257, UNKNOWN_CODE);
  1867. break;
  1868. }
  1869. } else {
  1870. int type = (address >> 28) & 15;
  1871. switch(type) {
  1872. case 0:
  1873. case 1:
  1874. case 2:
  1875. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value, 256, type);
  1876. break;
  1877. case 3:
  1878. switch ((address >> 0x10) & 0xFF){
  1879. case 0x00:
  1880. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value, 256, GSA_GROUP_WRITE);
  1881. break;
  1882. case 0x10:
  1883. cheatsAdd(code, desc, address, value & 0x0FFFFFFF, address & 0xFF, 256, GSA_32_BIT_ADD );
  1884. break;
  1885. case 0x20:
  1886. cheatsAdd(code, desc, address, value & 0x0FFFFFFF, (~(address & 0xFF)+1), 256, GSA_32_BIT_ADD );
  1887. break;
  1888. case 0x30:
  1889. cheatsAdd(code, desc, address, value & 0x0FFFFFFF, address & 0xFFFF, 256, GSA_32_BIT_ADD );
  1890. break;
  1891. case 0x40:
  1892. cheatsAdd(code, desc, address, value & 0x0FFFFFFF, (~(address & 0xFFFF)+1), 256, GSA_32_BIT_ADD );
  1893. break;
  1894. case 0x50:
  1895. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value, 256, GSA_32_BIT_ADD2);
  1896. break;
  1897. case 0x60:
  1898. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value, 256, GSA_32_BIT_SUB2);
  1899. break;
  1900. default:
  1901. // unsupported code
  1902. cheatsAdd(code, desc, address, address, value, 256,
  1903. UNKNOWN_CODE);
  1904. break;
  1905. }
  1906. break;
  1907. case 6:
  1908. address <<= 1;
  1909. type = (value >> 24) & 0xFF;
  1910. if(type == 0x00) {
  1911. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value & 0xFFFF, 256,
  1912. GSA_16_BIT_ROM_PATCH);
  1913. break;
  1914. }
  1915. // unsupported code
  1916. cheatsAdd(code, desc, address, address, value, 256,
  1917. UNKNOWN_CODE);
  1918. break;
  1919. case 8:
  1920. switch((address >> 20) & 15) {
  1921. case 1:
  1922. cheatsAdd(code, desc, address, address & 0x0F0FFFFF, value, 256,
  1923. GSA_8_BIT_GS_WRITE);
  1924. break;
  1925. case 2:
  1926. cheatsAdd(code, desc, address, address & 0x0F0FFFFF, value, 256,
  1927. GSA_16_BIT_GS_WRITE);
  1928. break;
  1929. case 4:
  1930. // This code is buggy : the value is always set to 0 !
  1931. cheatsAdd(code, desc, address, address & 0x0F0FFFFF, 0, 256,
  1932. GSA_32_BIT_GS_WRITE);
  1933. break;
  1934. case 15:
  1935. cheatsAdd(code, desc, address, 0, value & 0xFFFF, 256, GSA_SLOWDOWN);
  1936. break;
  1937. default:
  1938. // unsupported code
  1939. cheatsAdd(code, desc, address, address, value, 256,
  1940. UNKNOWN_CODE);
  1941. break;
  1942. }
  1943. break;
  1944. case 0x0d:
  1945. if(address != 0xDEADFACE) {
  1946. switch((value >> 20) & 0xF) {
  1947. case 0:
  1948. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value & 0xFFFF, 256,
  1949. CBA_IF_TRUE);
  1950. break;
  1951. case 1:
  1952. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value & 0xFFFF, 256,
  1953. CBA_IF_FALSE);
  1954. break;
  1955. case 2:
  1956. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value & 0xFFFF, 256,
  1957. GSA_16_BIT_IF_LOWER_OR_EQ_U);
  1958. break;
  1959. case 3:
  1960. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value & 0xFFFF, 256,
  1961. GSA_16_BIT_IF_HIGHER_OR_EQ_U);
  1962. break;
  1963. default:
  1964. // unsupported code
  1965. cheatsAdd(code, desc, address, address, value, 256,
  1966. UNKNOWN_CODE);
  1967. break;
  1968. }
  1969. } else
  1970. cheatsAdd(code, desc, address, address, value, 256,
  1971. UNKNOWN_CODE);
  1972. break;
  1973. case 0x0e:
  1974. switch((value >> 28) & 0xF) {
  1975. case 0:
  1976. cheatsAdd(code, desc, address, value & 0x0FFFFFFF, address & 0xFFFF, 256,
  1977. GSA_16_BIT_MIF_TRUE);
  1978. break;
  1979. case 1:
  1980. cheatsAdd(code, desc, address, value & 0x0FFFFFFF, address & 0xFFFF, 256,
  1981. GSA_16_BIT_MIF_FALSE);
  1982. break;
  1983. case 2:
  1984. cheatsAdd(code, desc, address, value & 0x0FFFFFFF, address & 0xFFFF, 256,
  1985. GSA_16_BIT_MIF_LOWER_OR_EQ_U);
  1986. break;
  1987. case 3:
  1988. cheatsAdd(code, desc, address, value & 0x0FFFFFFF, address & 0xFFFF, 256,
  1989. GSA_16_BIT_MIF_HIGHER_OR_EQ_U);
  1990. break;
  1991. default:
  1992. // unsupported code
  1993. cheatsAdd(code, desc, address, address, value, 256,
  1994. UNKNOWN_CODE);
  1995. break;
  1996. }
  1997. break;
  1998. case 0x0f:
  1999. cheatsAdd(code, desc, address, (address & 0xFFFFFFF), value, 256, MASTER_CODE);
  2000. mastercode = (address & 0xFFFFFFF);
  2001. break;
  2002. default:
  2003. // unsupported code
  2004. cheatsAdd(code, desc, address, address, value, 256,
  2005. UNKNOWN_CODE);
  2006. break;
  2007. }
  2008. }
  2009. }
  2010. bool cheatsImportGSACodeFile(const char *name, int game, bool v3)
  2011. {
  2012. FILE *f = fopen(name, "rb");
  2013. if(!f)
  2014. return false;
  2015. int games = 0;
  2016. int len = 0;
  2017. fseek(f, 0x1e, SEEK_CUR);
  2018. fread(&games, 1, 4, f);
  2019. bool found = false;
  2020. int g = 0;
  2021. while(games > 0) {
  2022. if(g == game) {
  2023. found = true;
  2024. break;
  2025. }
  2026. fread(&len, 1, 4, f);
  2027. fseek(f,len,SEEK_CUR);
  2028. int codes = 0;
  2029. fread(&codes, 1, 4, f);
  2030. while(codes > 0) {
  2031. fread(&len, 1, 4, f);
  2032. fseek(f, len, SEEK_CUR);
  2033. fseek(f, 8, SEEK_CUR);
  2034. fread(&len, 1, 4, f);
  2035. fseek(f, len*12, SEEK_CUR);
  2036. codes--;
  2037. }
  2038. games--;
  2039. g++;
  2040. }
  2041. if(found) {
  2042. char desc[256];
  2043. char code[17];
  2044. fread(&len, 1, 4, f);
  2045. fseek(f, len, SEEK_CUR);
  2046. int codes = 0;
  2047. fread(&codes, 1, 4, f);
  2048. while(codes > 0) {
  2049. fread(&len, 1, 4, f);
  2050. fread(desc, 1, len, f);
  2051. desc[len] =0;
  2052. desc[31] = 0;
  2053. fread(&len, 1, 4, f);
  2054. fseek(f, len, SEEK_CUR);
  2055. fseek(f, 4, SEEK_CUR);
  2056. fread(&len, 1, 4, f);
  2057. while(len) {
  2058. fseek(f, 4, SEEK_CUR);
  2059. fread(code, 1, 8, f);
  2060. fseek(f, 4, SEEK_CUR);
  2061. fread(&code[8], 1, 8, f);
  2062. code[16] = 0;
  2063. cheatsAddGSACode(code, desc, v3);
  2064. len -= 2;
  2065. }
  2066. codes--;
  2067. }
  2068. }
  2069. fclose(f);
  2070. return false;
  2071. }
  2072. void cheatsCBAReverseArray(u8 *array, u8 *dest)
  2073. {
  2074. dest[0] = array[3];
  2075. dest[1] = array[2];
  2076. dest[2] = array[1];
  2077. dest[3] = array[0];
  2078. dest[4] = array[5];
  2079. dest[5] = array[4];
  2080. }
  2081. void chatsCBAScramble(u8 *array, int count, u8 b)
  2082. {
  2083. u8 *x = array + (count >> 3);
  2084. u8 *y = array + (b >> 3);
  2085. u32 z = *x & (1 << (count & 7));
  2086. u32 x0 = (*x & (~(1 << (count & 7))));
  2087. if (z != 0)
  2088. z = 1;
  2089. if ((*y & (1 << (b & 7))) != 0)
  2090. x0 |= (1 << (count & 7));
  2091. *x = x0;
  2092. u32 temp = *y & (~(1 << (b & 7)));
  2093. if (z != 0)
  2094. temp |= (1 << (b & 7));
  2095. *y = temp;
  2096. }
  2097. u32 cheatsCBAGetValue(u8 *array)
  2098. {
  2099. return array[0] | array[1]<<8 | array[2] << 16 | array[3]<<24;
  2100. }
  2101. u16 cheatsCBAGetData(u8 *array)
  2102. {
  2103. return array[4] | array[5]<<8;
  2104. }
  2105. void cheatsCBAArrayToValue(u8 *array, u8 *dest)
  2106. {
  2107. dest[0] = array[3];
  2108. dest[1] = array[2];
  2109. dest[2] = array[1];
  2110. dest[3] = array[0];
  2111. dest[4] = array[5];
  2112. dest[5] = array[4];
  2113. }
  2114. void cheatsCBAParseSeedCode(u32 address, u32 value, u32 *array)
  2115. {
  2116. array[0] = 1;
  2117. array[1] = value & 0xFF;
  2118. array[2] = (address >> 0x10) & 0xFF;
  2119. array[3] = (value >> 8) & 0xFF;
  2120. array[4] = (address >> 0x18) & 0x0F;
  2121. array[5] = address & 0xFFFF;
  2122. array[6] = address;
  2123. array[7] = value;
  2124. }
  2125. u32 cheatsCBAEncWorker()
  2126. {
  2127. u32 x = (cheatsCBATemporaryValue * 0x41c64e6d) + 0x3039;
  2128. u32 y = (x * 0x41c64e6d) + 0x3039;
  2129. u32 z = x >> 0x10;
  2130. x = ((y >> 0x10) & 0x7fff) << 0x0f;
  2131. z = (z << 0x1e) | x;
  2132. x = (y * 0x41c64e6d) + 0x3039;
  2133. cheatsCBATemporaryValue = x;
  2134. return z | ((x >> 0x10) & 0x7fff);
  2135. }
  2136. #define ROR(v, s) \
  2137. (((v) >> (s)) | (((v) & ((1 << (s))-1)) << (32 - (s))))
  2138. u32 cheatsCBACalcIndex(u32 x, u32 y)
  2139. {
  2140. if(y != 0) {
  2141. if(y == 1)
  2142. x = 0;
  2143. else if(x == y)
  2144. x = 0;
  2145. if(y < 1)
  2146. return x;
  2147. else if(x < y)
  2148. return x;
  2149. u32 x0 = 1;
  2150. while(y < 0x10000000) {
  2151. if(y < x) {
  2152. y = y << 4;
  2153. x0 = x0 << 4;
  2154. } else break;
  2155. }
  2156. while(y < 0x80000000) {
  2157. if(y < x) {
  2158. y = y << 1;
  2159. x0 = x0 << 1;
  2160. } else break;
  2161. }
  2162. loop:
  2163. u32 z = 0;
  2164. if(x >= y)
  2165. x -= y;
  2166. if(x >= (y >> 1)) {
  2167. x -= (y >> 1);
  2168. z |= ROR(x0, 1);
  2169. }
  2170. if(x >= (y >> 2)) {
  2171. x -= (y >> 2);
  2172. z |= ROR(x0, 2);
  2173. }
  2174. if(x >= (y >> 3)) {
  2175. x -= (y >> 3);
  2176. z |= ROR(x0, 3);
  2177. }
  2178. u32 temp = x0;
  2179. if(x != 0) {
  2180. x0 = x0 >> 4;
  2181. if(x0 != 0) {
  2182. y = y >> 4;
  2183. goto loop;
  2184. }
  2185. }
  2186. z = z & 0xe0000000;
  2187. if(z != 0) {
  2188. if((temp & 7) == 0)
  2189. return x;
  2190. } else
  2191. return x;
  2192. if((z & ROR(temp, 3)) != 0)
  2193. x += y >> 3;
  2194. if((z & ROR(temp, 2)) != 0)
  2195. x += y >> 2;
  2196. if((z & ROR(temp, 1)) != 0)
  2197. x += y >> 1;
  2198. return x;
  2199. } else {
  2200. }
  2201. // should not happen in the current code
  2202. return 0;
  2203. }
  2204. void cheatsCBAUpdateSeedBuffer(u32 a, u8 *buffer, int count)
  2205. {
  2206. int i;
  2207. for(i = 0; i < count; i++)
  2208. buffer[i] = i;
  2209. for(i = 0; (u32)i < a; i++) {
  2210. u32 a = cheatsCBACalcIndex(cheatsCBAEncWorker(), count);
  2211. u32 b = cheatsCBACalcIndex(cheatsCBAEncWorker(), count);
  2212. u32 t = buffer[a];
  2213. buffer[a] = buffer[b];
  2214. buffer[b] = t;
  2215. }
  2216. }
  2217. void cheatsCBAChangeEncryption(u32 *seed)
  2218. {
  2219. int i;
  2220. cheatsCBATemporaryValue = (seed[1] ^ 0x1111);
  2221. cheatsCBAUpdateSeedBuffer(0x50, cheatsCBASeedBuffer, 0x30);
  2222. cheatsCBATemporaryValue = 0x4efad1c3;
  2223. for(i = 0; (u32)i < seed[4]; i++) {
  2224. cheatsCBATemporaryValue = cheatsCBAEncWorker();
  2225. }
  2226. cheatsCBASeed[2] = cheatsCBAEncWorker();
  2227. cheatsCBASeed[3] = cheatsCBAEncWorker();
  2228. cheatsCBATemporaryValue = seed[3] ^ 0xf254;
  2229. for(i = 0; (u32)i < seed[3]; i++) {
  2230. cheatsCBATemporaryValue = cheatsCBAEncWorker();
  2231. }
  2232. cheatsCBASeed[0] = cheatsCBAEncWorker();
  2233. cheatsCBASeed[1] = cheatsCBAEncWorker();
  2234. *((u32 *)&cheatsCBACurrentSeed[0]) = seed[6];
  2235. *((u32 *)&cheatsCBACurrentSeed[4]) = seed[7];
  2236. *((u32 *)&cheatsCBACurrentSeed[8]) = 0;
  2237. }
  2238. u16 cheatsCBAGenValue(u32 x, u32 y, u32 z)
  2239. {
  2240. y <<= 0x10;
  2241. z <<= 0x10;
  2242. x <<= 0x18;
  2243. u32 x0 = (int)y >> 0x10;
  2244. z = (int)z >> 0x10;
  2245. x = (int)x >> 0x10;
  2246. for(int i = 0; i < 8; i++) {
  2247. u32 temp = z ^ x;
  2248. if ((int)temp >= 0) {
  2249. temp = z << 0x11;
  2250. }
  2251. else {
  2252. temp = z << 0x01;
  2253. temp ^= x0;
  2254. temp = temp << 0x10;
  2255. }
  2256. z = (int)temp >> 0x10;
  2257. temp = x << 0x11;
  2258. x = (int)temp >> 0x10;
  2259. }
  2260. return z & 0xffff;
  2261. }
  2262. void cheatsCBAGenTable() {
  2263. for (int i = 0; i < 0x100; i++) {
  2264. cheatsCBATable[i] = cheatsCBAGenValue(i, 0x1021, 0);
  2265. }
  2266. cheatsCBATableGenerated = true;
  2267. }
  2268. u16 cheatsCBACalcCRC(u8 *rom, int count)
  2269. {
  2270. u32 crc = 0xffffffff;
  2271. if (count & 3) {
  2272. // 0x08000EAE
  2273. } else {
  2274. count = (count >> 2) - 1;
  2275. if(count != -1) {
  2276. while(count != -1) {
  2277. crc = (((crc << 0x08) ^ cheatsCBATable[(((u32)crc << 0x10) >> 0x18)
  2278. ^ *rom++]) << 0x10) >> 0x10;
  2279. crc = (((crc << 0x08) ^ cheatsCBATable[(((u32)crc << 0x10) >> 0x18)
  2280. ^ *rom++]) << 0x10) >> 0x10;
  2281. crc = (((crc << 0x08) ^ cheatsCBATable[(((u32)crc << 0x10) >> 0x18)
  2282. ^ *rom++]) << 0x10) >> 0x10;
  2283. crc = (((crc << 0x08) ^ cheatsCBATable[(((u32)crc << 0x10) >> 0x18)
  2284. ^ *rom++]) << 0x10) >> 0x10;
  2285. count--;
  2286. }
  2287. }
  2288. }
  2289. return crc & 0xffff;
  2290. }
  2291. void cheatsCBADecrypt(u8 *decrypt)
  2292. {
  2293. u8 buffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
  2294. u8 *array = &buffer[1];
  2295. cheatsCBAReverseArray(decrypt, array);
  2296. for(int count = 0x2f; count >= 0; count--) {
  2297. chatsCBAScramble(array, count, cheatsCBASeedBuffer[count]);
  2298. }
  2299. cheatsCBAArrayToValue(array, decrypt);
  2300. *((u32 *)decrypt) = cheatsCBAGetValue(decrypt) ^
  2301. cheatsCBASeed[0];
  2302. *((u16 *)(decrypt+4)) = (cheatsCBAGetData(decrypt) ^
  2303. cheatsCBASeed[1]) & 0xffff;
  2304. cheatsCBAReverseArray(decrypt, array);
  2305. u32 cs = cheatsCBAGetValue(cheatsCBACurrentSeed);
  2306. for(int i = 0; i <= 4; i++) {
  2307. array[i] = ((cs >> 8) ^ array[i+1]) ^ array[i] ;
  2308. }
  2309. array[5] = (cs >> 8) ^ array[5];
  2310. for(int j = 5; j >=0; j--) {
  2311. array[j] = (cs ^ array[j-1]) ^ array[j];
  2312. }
  2313. cheatsCBAArrayToValue(array, decrypt);
  2314. *((u32 *)decrypt) = cheatsCBAGetValue(decrypt)
  2315. ^ cheatsCBASeed[2];
  2316. *((u16 *)(decrypt+4)) = (cheatsCBAGetData(decrypt)
  2317. ^ cheatsCBASeed[3]) & 0xffff;
  2318. }
  2319. int cheatsCBAGetCount()
  2320. {
  2321. int count = 0;
  2322. for(int i = 0; i < cheatsNumber; i++) {
  2323. if(cheatsList[i].code == 512)
  2324. count++;
  2325. }
  2326. return count;
  2327. }
  2328. bool cheatsCBAShouldDecrypt()
  2329. {
  2330. for(int i = 0; i < cheatsNumber; i++) {
  2331. if(cheatsList[i].code == 512) {
  2332. return (cheatsList[i].codestring[0] == '9');
  2333. }
  2334. }
  2335. return false;
  2336. }
  2337. void cheatsAddCBACode(const char *code, const char *desc)
  2338. {
  2339. if(strlen(code) != 13) {
  2340. // wrong cheat
  2341. systemMessage(MSG_INVALID_CBA_CODE,
  2342. N_("Invalid CBA code. Format is XXXXXXXX YYYY."));
  2343. return;
  2344. }
  2345. int i;
  2346. for(i = 0; i < 8; i++) {
  2347. if(!CHEAT_IS_HEX(code[i])) {
  2348. // wrong cheat
  2349. systemMessage(MSG_INVALID_CBA_CODE,
  2350. N_("Invalid CBA code. Format is XXXXXXXX YYYY."));
  2351. return;
  2352. }
  2353. }
  2354. if(code[8] != ' ') {
  2355. systemMessage(MSG_INVALID_CBA_CODE,
  2356. N_("Invalid CBA code. Format is XXXXXXXX YYYY."));
  2357. return;
  2358. }
  2359. for(i = 9; i < 13; i++) {
  2360. if(!CHEAT_IS_HEX(code[i])) {
  2361. // wrong cheat
  2362. systemMessage(MSG_INVALID_CBA_CODE,
  2363. N_("Invalid CBA code. Format is XXXXXXXX YYYY."));
  2364. return;
  2365. }
  2366. }
  2367. char buffer[10];
  2368. strncpy(buffer, code, 8);
  2369. buffer[8] = 0;
  2370. u32 address;
  2371. sscanf(buffer, "%x", &address);
  2372. strncpy(buffer, &code[9], 4);
  2373. buffer[4] = 0;
  2374. u32 value;
  2375. sscanf(buffer, "%x", &value);
  2376. u8 array[8] = {
  2377. address & 255,
  2378. (address >> 8) & 255,
  2379. (address >> 16) & 255,
  2380. (address >> 24) & 255,
  2381. (value & 255),
  2382. (value >> 8) & 255,
  2383. 0,
  2384. 0
  2385. };
  2386. if(cheatsCBAGetCount() == 0 &&
  2387. (address >> 28) == 9) {
  2388. u32 seed[8];
  2389. cheatsCBAParseSeedCode(address, value, seed);
  2390. cheatsCBAChangeEncryption(seed);
  2391. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value, 512, UNKNOWN_CODE);
  2392. } else {
  2393. if(cheatsCBAShouldDecrypt())
  2394. cheatsCBADecrypt(array);
  2395. address = READ32LE(((u32 *)array));
  2396. value = READ16LE(((u16 *)&array[4]));
  2397. int type = (address >> 28) & 15;
  2398. if(isMultilineWithData(cheatsNumber-1) || (super>0)) {
  2399. cheatsAdd(code, desc, address, address, value, 512, UNKNOWN_CODE);
  2400. if (super>0)
  2401. super-= 1;
  2402. return;
  2403. }
  2404. switch(type) {
  2405. case 0x00:
  2406. {
  2407. if(!cheatsCBATableGenerated)
  2408. cheatsCBAGenTable();
  2409. u32 crc = cheatsCBACalcCRC(rom, 0x10000);
  2410. if(crc != address) {
  2411. systemMessage(MSG_CBA_CODE_WARNING,
  2412. N_("Warning: Codes seem to be for a different game.\nCodes may not work correctly."));
  2413. }
  2414. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value, 512,
  2415. UNKNOWN_CODE);
  2416. }
  2417. break;
  2418. case 0x01:
  2419. cheatsAdd(code, desc, address, (address & 0x1FFFFFF) | 0x08000000, value, 512, MASTER_CODE);
  2420. mastercode = (address & 0x1FFFFFF) | 0x08000000;
  2421. break;
  2422. case 0x02:
  2423. cheatsAdd(code, desc, address, address & 0x0FFFFFFE, value, 512,
  2424. CBA_OR);
  2425. break;
  2426. case 0x03:
  2427. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value, 512,
  2428. INT_8_BIT_WRITE);
  2429. break;
  2430. case 0x04:
  2431. cheatsAdd(code, desc, address, address & 0x0FFFFFFE, value, 512,
  2432. CBA_SLIDE_CODE);
  2433. break;
  2434. case 0x05:
  2435. cheatsAdd(code, desc, address, address & 0x0FFFFFFE, value, 512,
  2436. CBA_SUPER);
  2437. super = getCodeLength(cheatsNumber-1);
  2438. break;
  2439. case 0x06:
  2440. cheatsAdd(code, desc, address, address & 0x0FFFFFFE, value, 512,
  2441. CBA_AND);
  2442. break;
  2443. case 0x07:
  2444. cheatsAdd(code, desc, address, address & 0x0FFFFFFE, value, 512,
  2445. CBA_IF_TRUE);
  2446. break;
  2447. case 0x08:
  2448. cheatsAdd(code, desc, address, address & 0x0FFFFFFE, value, 512,
  2449. INT_16_BIT_WRITE);
  2450. break;
  2451. case 0x0a:
  2452. cheatsAdd(code, desc, address, address & 0x0FFFFFFE, value, 512,
  2453. CBA_IF_FALSE);
  2454. break;
  2455. case 0x0b:
  2456. cheatsAdd(code, desc, address, address & 0x0FFFFFFE, value, 512,
  2457. CBA_GT);
  2458. break;
  2459. case 0x0c:
  2460. cheatsAdd(code, desc, address, address & 0x0FFFFFFE, value, 512,
  2461. CBA_LT);
  2462. break;
  2463. case 0x0d:
  2464. if ((address & 0xF0)<0x30)
  2465. cheatsAdd(code, desc, address, address & 0xF0, value, 512,
  2466. CBA_IF_KEYS_PRESSED);
  2467. break;
  2468. case 0x0e:
  2469. cheatsAdd(code, desc, address, address & 0x0FFFFFFF, value & 0x8000 ? value | 0xFFFF0000 : value, 512,
  2470. CBA_ADD);
  2471. break;
  2472. case 0x0f:
  2473. cheatsAdd(code, desc, address, address & 0x0FFFFFFE, value, 512,
  2474. GSA_16_BIT_IF_AND);
  2475. break;
  2476. default:
  2477. // unsupported code
  2478. cheatsAdd(code, desc, address, address & 0xFFFFFFFF, value, 512,
  2479. UNKNOWN_CODE);
  2480. break;
  2481. }
  2482. }
  2483. }
  2484. void cheatsSaveGame(gzFile file)
  2485. {
  2486. utilWriteInt(file, cheatsNumber);
  2487. utilGzWrite(file, cheatsList, sizeof(cheatsList));
  2488. }
  2489. void cheatsReadGame(gzFile file, int version)
  2490. {
  2491. cheatsNumber = 0;
  2492. cheatsNumber = utilReadInt(file);
  2493. if (version > 8)
  2494. utilGzRead(file, cheatsList, sizeof(cheatsList));
  2495. bool firstCodeBreaker = true;
  2496. for(int i = 0; i < cheatsNumber; i++) {
  2497. if (version <9)
  2498. {
  2499. cheatsList[i].code = utilReadInt(file);
  2500. cheatsList[i].size = utilReadInt(file);
  2501. cheatsList[i].status = utilReadInt(file);
  2502. cheatsList[i].enabled = utilReadInt(file) ? true : false;
  2503. utilGzRead(file, &cheatsList[i].address, sizeof(u32));
  2504. cheatsList[i].rawaddress = cheatsList[i].address;
  2505. utilGzRead(file, &cheatsList[i].value, sizeof(u32));
  2506. utilGzRead(file, &cheatsList[i].oldValue, sizeof(u32));
  2507. utilGzRead(file, &cheatsList[i].codestring, 20*sizeof(char));
  2508. utilGzRead(file, &cheatsList[i].desc, 32*sizeof(char));
  2509. }
  2510. cheatsList[i].status = 0;
  2511. if(!cheatsList[i].codestring[0]) {
  2512. switch(cheatsList[i].size) {
  2513. case 0:
  2514. sprintf(cheatsList[i].codestring, "%08x:%02x", cheatsList[i].address,
  2515. cheatsList[i].value);
  2516. break;
  2517. case 1:
  2518. sprintf(cheatsList[i].codestring, "%08x:%04x", cheatsList[i].address,
  2519. cheatsList[i].value);
  2520. break;
  2521. case 2:
  2522. sprintf(cheatsList[i].codestring, "%08x:%08x", cheatsList[i].address,
  2523. cheatsList[i].value);
  2524. break;
  2525. }
  2526. }
  2527. if(cheatsList[i].enabled) {
  2528. cheatsEnable(i);
  2529. }
  2530. if(cheatsList[i].code == 512 && firstCodeBreaker) {
  2531. firstCodeBreaker = false;
  2532. char buffer[10];
  2533. strncpy(buffer, cheatsList[i].codestring, 8);
  2534. buffer[8] = 0;
  2535. u32 address;
  2536. sscanf(buffer, "%x", &address);
  2537. if((address >> 28) == 9) {
  2538. strncpy(buffer, &cheatsList[i].codestring[9], 4);
  2539. buffer[4] = 0;
  2540. u32 value;
  2541. sscanf(buffer, "%x", &value);
  2542. u32 seed[8];
  2543. cheatsCBAParseSeedCode(address, value, seed);
  2544. cheatsCBAChangeEncryption(seed);
  2545. }
  2546. }
  2547. }
  2548. }
  2549. // skip the cheat list data
  2550. void cheatsReadGameSkip( gzFile file, int version )
  2551. {
  2552. int nCheats = 0;
  2553. nCheats = utilReadInt( file );
  2554. if( version >= 9 ) {
  2555. utilGzSeek( file, sizeof( cheatsList ), SEEK_CUR );
  2556. }
  2557. for( int i = 0; i < nCheats; i++ ) {
  2558. if( version < 9 ) {
  2559. utilGzSeek( file, ( 7 * sizeof(int) ) + ( 52 * sizeof(char) ), SEEK_CUR );
  2560. }
  2561. }
  2562. }
  2563. void cheatsSaveCheatList(const char *file)
  2564. {
  2565. if(cheatsNumber == 0)
  2566. return;
  2567. FILE *f = fopen(file, "wb");
  2568. if(f == NULL)
  2569. return;
  2570. int version = 1;
  2571. fwrite(&version, 1, sizeof(version), f);
  2572. int type = 1;
  2573. fwrite(&type, 1, sizeof(type), f);
  2574. fwrite(&cheatsNumber, 1, sizeof(cheatsNumber), f);
  2575. fwrite(cheatsList, 1, sizeof(cheatsList), f);
  2576. fclose(f);
  2577. }
  2578. bool cheatsLoadCheatList(const char *file)
  2579. {
  2580. int count = 0;
  2581. FILE *f = fopen(file, "rb");
  2582. if(f == NULL)
  2583. return false;
  2584. int version = 0;
  2585. if(fread(&version, 1, sizeof(version), f) != sizeof(version)) {
  2586. fclose(f);
  2587. return false;
  2588. }
  2589. if(version != 1) {
  2590. systemMessage(MSG_UNSUPPORTED_CHEAT_LIST_VERSION,
  2591. N_("Unsupported cheat list version %d"), version);
  2592. fclose(f);
  2593. return false;
  2594. }
  2595. int type = 0;
  2596. if(fread(&type, 1, sizeof(type), f) != sizeof(type)) {
  2597. fclose(f);
  2598. return false;
  2599. }
  2600. if((type != 0) && (type != 1)) {
  2601. systemMessage(MSG_UNSUPPORTED_CHEAT_LIST_TYPE,
  2602. N_("Unsupported cheat list type %d"), type);
  2603. fclose(f);
  2604. return false;
  2605. }
  2606. if(fread(&count, 1, sizeof(count), f) != sizeof(count)) {
  2607. fclose(f);
  2608. return false;
  2609. }
  2610. if (type == 1)
  2611. {
  2612. if(fread(cheatsList, 1, sizeof(cheatsList), f) != sizeof(cheatsList)) {
  2613. fclose(f);
  2614. return false;
  2615. }
  2616. }
  2617. else if (type == 0)
  2618. {
  2619. for(int i = 0; i < count; i++) {
  2620. fread(&cheatsList[i].code, 1, sizeof(int),f);
  2621. fread(&cheatsList[i].size, 1, sizeof(int),f);
  2622. fread(&cheatsList[i].status, 1, sizeof(int),f);
  2623. fread(&cheatsList[i].enabled, 1, sizeof(int),f);
  2624. cheatsList[i].enabled = cheatsList[i].enabled ? true : false;
  2625. fread(&cheatsList[i].address, 1, sizeof(u32),f);
  2626. cheatsList[i].rawaddress = cheatsList[i].address;
  2627. fread(&cheatsList[i].value, 1, sizeof(u32),f);
  2628. fread(&cheatsList[i].oldValue, 1, sizeof(u32),f);
  2629. fread(&cheatsList[i].codestring, 1, 20*sizeof(char),f);
  2630. if(fread(&cheatsList[i].desc, 1, 32*sizeof(char),f) != 32*sizeof(char)) {
  2631. fclose(f);
  2632. return false;
  2633. }
  2634. }
  2635. }
  2636. bool firstCodeBreaker = true;
  2637. for(int i = 0; i < count; i++) {
  2638. cheatsList[i].status = 0; // remove old status as it is not used
  2639. if(!cheatsList[i].codestring[0]) {
  2640. switch(cheatsList[i].size) {
  2641. case 0:
  2642. sprintf(cheatsList[i].codestring, "%08x:%02x", cheatsList[i].address,
  2643. cheatsList[i].value);
  2644. break;
  2645. case 1:
  2646. sprintf(cheatsList[i].codestring, "%08x:%04x", cheatsList[i].address,
  2647. cheatsList[i].value);
  2648. break;
  2649. case 2:
  2650. sprintf(cheatsList[i].codestring, "%08x:%08x", cheatsList[i].address,
  2651. cheatsList[i].value);
  2652. break;
  2653. }
  2654. }
  2655. if(cheatsList[i].code == 512 && firstCodeBreaker) {
  2656. firstCodeBreaker = false;
  2657. char buffer[10];
  2658. strncpy(buffer, cheatsList[i].codestring, 8);
  2659. buffer[8] = 0;
  2660. u32 address;
  2661. sscanf(buffer, "%x", &address);
  2662. if((address >> 28) == 9) {
  2663. strncpy(buffer, &cheatsList[i].codestring[9], 4);
  2664. buffer[4] = 0;
  2665. u32 value;
  2666. sscanf(buffer, "%x", &value);
  2667. u32 seed[8];
  2668. cheatsCBAParseSeedCode(address, value, seed);
  2669. cheatsCBAChangeEncryption(seed);
  2670. }
  2671. }
  2672. }
  2673. cheatsNumber = count;
  2674. fclose(f);
  2675. return true;
  2676. }
  2677. extern int cpuNextEvent;
  2678. extern void debuggerBreakOnWrite(u32 , u32, u32, int, int);
  2679. #ifdef BKPT_SUPPORT
  2680. static u8 cheatsGetType(u32 address)
  2681. {
  2682. switch(address >> 24) {
  2683. case 2:
  2684. return freezeWorkRAM[address & 0x3FFFF];
  2685. case 3:
  2686. return freezeInternalRAM[address & 0x7FFF];
  2687. case 5:
  2688. return freezePRAM[address & 0x3FC];
  2689. case 6:
  2690. if (address > 0x06010000)
  2691. return freezeVRAM[address & 0x17FFF];
  2692. else
  2693. return freezeVRAM[address & 0x1FFFF];
  2694. case 7:
  2695. return freezeOAM[address & 0x3FC];
  2696. }
  2697. return 0;
  2698. }
  2699. #endif
  2700. void cheatsWriteMemory(u32 address, u32 value)
  2701. {
  2702. #ifdef BKPT_SUPPORT
  2703. #ifdef SDL
  2704. if(cheatsNumber == 0) {
  2705. int type = cheatsGetType(address);
  2706. u32 oldValue = debuggerReadMemory(address);
  2707. if(type == 1 || (type == 2 && oldValue != value)) {
  2708. debuggerBreakOnWrite(address, oldValue, value, 2, type);
  2709. cpuNextEvent = 0;
  2710. }
  2711. debuggerWriteMemory(address, value);
  2712. }
  2713. #endif
  2714. #endif
  2715. }
  2716. void cheatsWriteHalfWord(u32 address, u16 value)
  2717. {
  2718. #ifdef BKPT_SUPPORT
  2719. #ifdef SDL
  2720. if(cheatsNumber == 0) {
  2721. int type = cheatsGetType(address);
  2722. u16 oldValue = debuggerReadHalfWord(address);
  2723. if(type == 1 || (type == 2 && oldValue != value)) {
  2724. debuggerBreakOnWrite(address, oldValue, value, 1, type);
  2725. cpuNextEvent = 0;
  2726. }
  2727. debuggerWriteHalfWord(address, value);
  2728. }
  2729. #endif
  2730. #endif
  2731. }
  2732. #if defined BKPT_SUPPORT && defined SDL
  2733. void cheatsWriteByte(u32 address, u8 value)
  2734. #else
  2735. void cheatsWriteByte(u32, u8)
  2736. #endif
  2737. {
  2738. #ifdef BKPT_SUPPORT
  2739. #ifdef SDL
  2740. if(cheatsNumber == 0) {
  2741. int type = cheatsGetType(address);
  2742. u8 oldValue = debuggerReadByte(address);
  2743. if(type == 1 || (type == 2 && oldValue != value)) {
  2744. debuggerBreakOnWrite(address, oldValue, value, 0, type);
  2745. cpuNextEvent = 0;
  2746. }
  2747. debuggerWriteByte(address, value);
  2748. }
  2749. #endif
  2750. #endif
  2751. }