1 /*
2 actionreplay.c
3
4 With this file, it's possible to enter
5 action-replay codes.
6 */
7
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <ctype.h>
12 #include <string.h>
13
14 #include "globals.h"
15 #include "arplay.h"
16
17 #define MAX_ARCODES 8
18 #define AR_CODELENGTH 8
19
20 Ar_Code arcode[MAX_ARCODES];
21 int codesentered=0;
22 int ar_enabled=0;
23
ar_setcode(char * code)24 void ar_setcode(char *code)
25 {
26 unsigned int n,lcode=0,hcode=0;
27
28 if (codesentered>=MAX_ARCODES) {
29 fprintf(OUTSTREAM,"Too many action replay codes.\n");
30 return;
31 }
32 if (strlen(code)==AR_CODELENGTH) {
33 for (n=0;n<AR_CODELENGTH;n++) {
34 code[n]=toupper(code[n]);
35 if ((code[n]>='0' && code[n]<='9')||
36 (code[n]>='A' && code[n]<='F')); else {
37 fprintf(OUTSTREAM,"Action replay code faulty (%s).\n",code);
38 return;
39 }
40 }
41 } else {
42 fprintf(OUTSTREAM,"Action replay code faulty (%s).\n",code);
43 return;
44 }
45
46 printf("Got: Code: %s=>",code);
47 sscanf(code,"%04X%04X",&hcode,&lcode);
48 lcode=(lcode>>8)|((lcode&0xFF)<<8);
49
50 arcode[codesentered].addr=lcode;
51 arcode[codesentered].test=hcode>>8;
52 arcode[codesentered].set=hcode&0xFF;
53
54 printf("%04X; %02X=>%02X\n",arcode[codesentered].addr,
55 arcode[codesentered].test,arcode[codesentered].set);
56
57 codesentered++;
58 }
59
ar_checkwrite(unsigned int addr,unsigned char value)60 int ar_checkwrite(unsigned int addr,unsigned char value)
61 {
62 int n;
63
64 if (ar_enabled) {
65 for (n=0;n<codesentered;n++)
66 if (arcode[n].addr==addr) {
67 /* if (arcode[n].test==arcode[n].set)*/
68 return arcode[n].set;
69 /* else
70 return arcode[n].test==value ? arcode[n].set : value;*/
71 }
72 }
73 return value;
74 }
75