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