Advertisement
Guest User

Untitled

a guest
Mar 31st, 2015
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.19 KB | None | 0 0
  1. // Parse Action Replay Code
  2. #include <string>
  3. #include <vector>
  4.  
  5. #define STR(x) # x
  6.  
  7. enum Button
  8. {
  9. A = 0xFFFE,
  10. B = 0xFFFD,
  11. Select = 0xFFFB,
  12. Start = 0xFFF7,
  13. Right = 0xFFEF,
  14. Left = 0xFFDF,
  15. Up = 0xFFBF,
  16. Down = 0xFF7F,
  17. RT = 0xFEFF,
  18. LT = 0xFDFF
  19. };
  20.  
  21. struct ARCode
  22. {
  23. ARCode() :
  24. Command(0),
  25. Parameters(0)
  26. {
  27. }
  28. unsigned int Command, Parameters;
  29. };
  30.  
  31. bool ParseARLine(const char* str, ARCode& Code)
  32. {
  33. const char HexDigits[] = "0123456789ABCDEF";
  34. const char WhiteSpace[] = " \t\n\v\f\r";
  35. ARCode TempCode;
  36. //skip whitespace
  37. str = strpbrk(str, HexDigits);
  38. if( !str )
  39. {
  40. //No Hex Digits found
  41. return false;
  42. }
  43.  
  44. for( size_t i = 0; i < 8; i++ )
  45. {
  46. if( strchr(HexDigits, *str) )
  47. {
  48. unsigned int Digit;
  49. // Parse Hex Digit
  50. sscanf(str, "%1x", &Digit);
  51. TempCode.Command <<= 4;
  52. TempCode.Command |= Digit;
  53. str++;
  54. }
  55. else if( strchr(WhiteSpace, *str) )
  56. {
  57. //Invalid code length
  58. return false;
  59. }
  60. else
  61. {
  62. //Invalid hex digit found
  63. return false;
  64. }
  65. }
  66.  
  67. //Parse Parameter
  68. //skip whitespace
  69. str = strpbrk(str, HexDigits);
  70. for( size_t i = 0; i < 8; i++ )
  71. {
  72. if( strchr(HexDigits, *str) )
  73. {
  74. unsigned int Digit;
  75. // Parse Hex Digit
  76. sscanf(str, "%1x", &Digit);
  77. TempCode.Parameters <<= 4;
  78. TempCode.Parameters |= Digit;
  79. str++;
  80. }
  81. else if( strchr(WhiteSpace, *str) )
  82. {
  83. //Invalid code length
  84. return false;
  85. }
  86. else
  87. {
  88. //Invalid hex digit found
  89. return false;
  90. }
  91. }
  92. }
  93. int main()
  94. {
  95. const char Code1[] =
  96. " 94000130 FFFB0000\n"
  97. "022340C8 03840074"
  98. "022340C8 03840074\n";
  99. const char Code[] =
  100. " 94000l30 FFFB0000\n"
  101. "022340C8 03840074\n"
  102. "022340CC 03840075\n"
  103. "022340D0 03840076\n"
  104. "022340D4 03840077\n"
  105. "02234364 0384023C\n"
  106. "02234368 0384023D\n"
  107. "0223436C 0384023E\n"
  108. "02234370 0384023F\n"
  109. "02234374 03840240\n"
  110. "02234378 03840241\n"
  111. "D2000000 00000000\n"
  112. "94000130 FFFB0000\n"
  113. "D5000000 03840001\n"
  114. "C0000000 0000000F\n"
  115. "D6000000 02233FCC\n"
  116. "D4000000 00000001\n"
  117. "D2000000 00000000\n"
  118. "94000130 FFFB0000\n"
  119. "D5000000 03840041\n"
  120. "C0000000 0000002E\n"
  121. "D6000000 0223400C\n"
  122. "D4000000 00000001\n"
  123. "D2000000 00000000\n"
  124. "94000130 FFFB0000\n"
  125. "D5000000 03840087\n"
  126. "C0000000 0000000C\n"
  127. "D6000000 022340D8\n"
  128. "D4000000 00000001\n"
  129. "D2000000 00000000\n"
  130. "94000130 FFFB0000\n"
  131. "D5000000 038400D5\n"
  132. "C0000000 00000071\n"
  133. "D6000000 0223410C\n"
  134. "D4000000 00000001\n"
  135. "D2000000 00000000\n"
  136. "94000130 FFFB0000\n"
  137. "D5000000 038401EC\n"
  138. "C0000000 00000008\n"
  139. "D6000000 022342D4\n"
  140. "D4000000 00000001\n"
  141. "D2000000 00000000\n"
  142. "94000130 FFFB0000\n"
  143. "D5000000 03840219\n"
  144. "C0000000 0000001A\n"
  145. "D6000000 022342F8\n"
  146. "D4000000 00000001\n"
  147. "D2000000 00000000\n"
  148. "94000130 FFFB0000\n"
  149. "D5000000 03840244\n"
  150. "C0000000 0000000A\n"
  151. "D6000000 0223437C\n"
  152. "D4000000 00000001\n"
  153. "D2000000 00000000\n";
  154.  
  155. std::vector<ARCode> Codes;
  156.  
  157. std::size_t LineCount = 0;
  158.  
  159. ARCode CheatLine;
  160.  
  161. const char *CurLine;
  162. CurLine = Code;
  163.  
  164. //Parse code line by line
  165. while( ParseARLine(CurLine, CheatLine) )
  166. {
  167. }
  168.  
  169. do
  170. {
  171. LineCount++;
  172.  
  173. //Parse Command
  174.  
  175. Codes.push_back(CheatLine);
  176.  
  177. // Next code pair lead-in
  178. CurLine += strspn(CurLine, "\n");
  179. } while( CurLine );
  180.  
  181. for( ARCode cheat : Codes )
  182. {
  183. printf("-> %08X:%08X | ", cheat.Command, cheat.Parameters);
  184. switch( cheat.Command >> 28 )
  185. {
  186. //Constant RAM Writes
  187. case 0:
  188. {
  189. printf("[%08X + $Off] = %08X",
  190. cheat.Command & 0x0FFFFFFF,
  191. cheat.Parameters);
  192. break;
  193. }
  194. case 1:
  195. {
  196. printf("[%08X + $Off] = %08X",
  197. cheat.Command & 0x0FFFFFFF,
  198. cheat.Parameters & 0xFFFF);
  199. break;
  200. }
  201. case 2:
  202. {
  203. printf("[%08X + $Off] = %08X",
  204. cheat.Command & 0x0FFFFFFF,
  205. cheat.Parameters & 0xFF);
  206. break;
  207. }
  208. //Conditional 32 bit
  209. case 3:
  210. {
  211. printf("if ( [%08X] > %08X )",
  212. cheat.Command & 0x0FFFFFFF, cheat.Parameters);
  213. break;
  214. }
  215. case 4:
  216. {
  217. printf("if ( [%08X] > %08X )",
  218. cheat.Command & 0x0FFFFFFF, cheat.Parameters);
  219. break;
  220. }
  221. case 5:
  222. {
  223. printf("if ( [%08X] == %08X )",
  224. cheat.Command & 0x0FFFFFFF, cheat.Parameters);
  225. break;
  226. }
  227. case 6:
  228. {
  229. printf("if ( [%08X] != %08X )",
  230. cheat.Command & 0x0FFFFFFF, cheat.Parameters);
  231. break;
  232. }
  233. //Conditional 16 bit
  234. case 7:
  235. {
  236. printf("if ( [%08X] < %04X & 0x04X )",
  237. cheat.Command & 0x0FFFFFFF, cheat.Parameters >> 16,
  238. cheat.Parameters & 0xFFFF);
  239. break;
  240. }
  241. case 8:
  242. {
  243. printf("if ( [%08X] > %04X & 0x04X )",
  244. cheat.Command & 0x0FFFFFFF, cheat.Parameters >> 16,
  245. cheat.Parameters & 0xFFFF);
  246. break;
  247. }
  248. case 9:
  249. {
  250. printf("if ( [%08X] == %04X )",
  251. cheat.Command & 0x0FFFFFFF, cheat.Parameters >> 16);
  252. if( (cheat.Command & 0x0FFFFFFF) == 0x04000130 )
  253. {
  254. printf(" Button pressed: ");
  255. switch( cheat.Parameters >> 16 )
  256. {
  257. case A:
  258. {
  259. printf("A");
  260. break;
  261. }
  262. case B:
  263. {
  264. printf("B");
  265. break;
  266. }
  267. case Select:
  268. {
  269. printf("Select");
  270. break;
  271. }
  272. case Start:
  273. {
  274. printf("Start");
  275. break;
  276. }
  277. case Right:
  278. {
  279. printf("Right");
  280. break;
  281. }
  282. case Left:
  283. {
  284. printf("Left");
  285. break;
  286. }
  287. case Up:
  288. {
  289. printf("Up");
  290. break;
  291. }
  292. case Down:
  293. {
  294. printf("Down");
  295. break;
  296. }
  297. case RT:
  298. {
  299. printf("Right Trigger");
  300. break;
  301. }
  302. case LT:
  303. {
  304. printf("Left Trigger");
  305. break;
  306. }
  307. default:
  308. printf("Unknown Key");
  309. break;
  310. }
  311. }
  312. break;
  313. }
  314. case 0xA:
  315. {
  316. printf("if ( [%08X] != %04X )",
  317. cheat.Command & 0x0FFFFFFF, cheat.Parameters >> 16);
  318. break;
  319. }
  320. //Offset Code
  321. case 0xB:
  322. {
  323. printf("$Off = [%08X + $Off]",
  324. cheat.Command & 0x0FFFFFFF);
  325. break;
  326. }
  327. //Loop
  328. case 0xC:
  329. {
  330. printf("loop ( %08X ) x%u",
  331. cheat.Parameters, cheat.Parameters);
  332. break;
  333. }
  334. //Data
  335. case 0xD:
  336. {
  337. switch( (cheat.Command >> 24) & 0xF )
  338. {
  339. case 0x0:
  340. {
  341. printf("Terminate Segment");
  342. break;
  343. }
  344. case 0x1:
  345. {
  346. printf("Loop execute");
  347. break;
  348. }
  349. case 0x2:
  350. {
  351. printf("Segment End");
  352. break;
  353. }
  354. case 0x3:
  355. {
  356. printf("$Off = %08X", cheat.Parameters);
  357. break;
  358. }
  359. case 0x4:
  360. {
  361. printf("$Data += %08X", cheat.Parameters);
  362. break;
  363. }
  364. case 0x5:
  365. {
  366. printf("$Data = %08X", cheat.Parameters);
  367. break;
  368. }
  369. case 0x6:
  370. {
  371. printf("32-bit [%08X + $Off] = $Data. $Off += 4",
  372. cheat.Parameters);
  373. break;
  374. }
  375. case 0x7:
  376. {
  377. printf("16-bit [%08X + $Off] = $Data. $Off += 2",
  378. cheat.Parameters);
  379. break;
  380. }
  381. case 0x8:
  382. {
  383. printf("8-bit [%08X + $Off] = $Data. $Off += 1",
  384. cheat.Parameters);
  385. break;
  386. }
  387. case 0x9:
  388. {
  389. printf("32-bit $Data = [%08X + $Off]",
  390. cheat.Parameters);
  391. break;
  392. }
  393. case 0xA:
  394. {
  395. printf("16-bit $Data = [%08X + $Off]",
  396. cheat.Parameters);
  397. break;
  398. }
  399. case 0xB:
  400. {
  401. printf("8-bit $Data = [%08X + $Off] !Bugged!",
  402. cheat.Parameters);
  403. break;
  404. }
  405. case 0xC:
  406. {
  407. printf("$Off += %08X", cheat.Parameters);
  408. break;
  409. }
  410. default:
  411. break;
  412. }
  413. break;
  414. }
  415. //Patch Code
  416. case 0xE:
  417. {
  418. break;
  419. }
  420. //Memory Copy
  421. case 0xF:
  422. {
  423. break;
  424. }
  425. default:
  426. {
  427. break;
  428. }
  429. }
  430. printf("\n");
  431. }
  432.  
  433. int _c = getchar();
  434. return 0;
  435. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement