9d74a5d475c8971e2565a36e9a4803094448961a
[fceu.git] / out_gp2x / readme_cheat.txt
1 \r
2 \r
3   FCE Ultra Cheat Guide\r
4 \r
5 ***** This file was obtained from *****\r
6 http://mednafen.com/documentation/cheat.html\r
7 \r
8 \r
9 /Last updated November 12, 2003\r
10 Valid as of FCE Ultra 0.97.4/\r
11 \r
12 *Table of Contents:*\r
13 \r
14     * Introduction <#intro>\r
15           o Cheat Files <#cheatfiles> \r
16     * The Windows Interface <#windows>\r
17           o Cheat Search Interface <#windows-search> \r
18     * The Text Interface(TODO)\r
19     * Examples <#examples>\r
20           o "Mega Man 3" Windows Example <#examples-mm3>\r
21           o "Over Horizon" Text Interface Example <#examples-oh> \r
22     * Tips <#tips> \r
23 \r
24 ------------------------------------------------------------------------\r
25 \r
26 \r
27     Introduction\r
28 \r
29 FCE Ultra allows cheating by the periodic "patching" of arbitrary\r
30 addresses in the 6502's memory space with arbitrary values, as well as\r
31 read substitution. "Read substitution" is the method that would be used\r
32 on a real NES/Famicom, such as done by the Game Genie and Pro Action\r
33 Replay. It is required to support GG and PAR codes, but since it is\r
34 relatively slow when done in emulation, it is not the preferred method\r
35 when a RAM patch will suffice. Also, in FCE Ultra, read substitution\r
36 will not work properly with zero-page addressing modes(instructions that\r
37 operate on RAM at $0000 through $00FF).\r
38 \r
39 The RAM patches are all applied a short time before the emulated\r
40 vertical blanking period. This detail shouldn't concern most people,\r
41 though. However, this does mean that cheating with games that use\r
42 bank-switched RAM may be problematic. Fortunately, such games are not\r
43 very common(in relation to the total number of NES and Famicom games).\r
44 \r
45 \r
46       Cheat Files\r
47 \r
48 Cheats are stored in the "cheats" subdirectory under the base FCE Ultra\r
49 directory. The files are in a simple plain-text format. Each line\r
50 represents a one-byte memory patch. The format is as follows(text in\r
51 brackets [] represents optional parameters):\r
52 \r
53     [S][C][:]Address(hex):Value(hex):[Compare value:]Description \r
54 \r
55 Example:\r
56 \r
57     040e:05:Infinite super power.\r
58 \r
59 A colon(:) near the beginning of the line is used to disable the cheat.\r
60 "S" denotes a cheat that is a read-substitute-style cheat(such as with\r
61 Game Genie cheats), and a "C" denotes that the cheat has a compare value.\r
62 \r
63 ------------------------------------------------------------------------\r
64 \r
65 \r
66     The Windows Interface\r
67 \r
68 All addresses listed in the cheats window are in unsigned 16-bit\r
69 hexadecimal format and all values in these windows are in an unsigned\r
70 8-bit decimal format(the range for values is 0 through 255).\r
71 \r
72 The cheats window contains the list of cheats for the currently loaded\r
73 game on the right side. Existing cheats can be selected, edited, and\r
74 updated using the "Update" button.\r
75 \r
76 \r
77       Cheat Search Interface\r
78 \r
79 The cheat search interface consists of several components: a list of\r
80 addresses and associated data for a search, several command buttons, and\r
81 the search parameters.\r
82 \r
83 Each entry in the list is in the format of:\r
84 \r
85     Address:Original Value:Current Value\r
86 \r
87 The address is the location in the 6502's address space, the original\r
88 value is the value that was stored at this address when the search was\r
89 reset, and the current value is the value that is currently stored at\r
90 that address. Selecting an item in this list will automatically cause\r
91 the "Address" field in the cheat information box on the right side of\r
92 the window to be updated with the selected address.\r
93 \r
94 The "Reset Search" button resets the search process; all valid addresses\r
95 are displayed in the cheat list and the data values at those addresses\r
96 noted.\r
97 \r
98 The "Do Search" buttons performs a search based on the search parameters\r
99 and removes any non-matching addresses from the address list.\r
100 \r
101 The "Set Original to Current" button sets the remembered original values\r
102 to the current values. It is like the "Reset Search" button, but it does\r
103 not affect which addresses are shown in the address list. This command\r
104 is especially useful when used in conjunction with the "O!=C" search\r
105 filter.\r
106 \r
107 The "Unhide Excluded" button shows all addresses that are excluded as a\r
108 result of any previous searches. It is like the "Reset Search" button\r
109 except that it does not affect the remembered original values.\r
110 \r
111 The numbers assigned the names "V1" and "V2" have different meanings\r
112 based on which filter is selected. A list of the names of the filters\r
113 and detailed information on what they do follows("original value"\r
114 corresponds to the value remembered for a given addres and "current\r
115 value" is the value currently at that address. Also, if a value is not\r
116 explicitly said to be shown under a certain condition, then it is\r
117 obviously excluded.):\r
118 \r
119 "O==V1 && C==V2":\r
120 \r
121     Show the address if the original value is equal to "V1" AND the\r
122     current value is equal to "V2". \r
123 \r
124 "O==V1 && |O-C|==V2":\r
125 \r
126     Show the address if the original value is equal to "V1" AND the\r
127     difference between the current value and the original value is equal\r
128     to "V2". \r
129 \r
130 "|O-C|==V2":\r
131 \r
132     Show the address if the difference between the current value and the\r
133     original value is equal to "V2". \r
134 \r
135 "O!=C":\r
136 \r
137     Show the address if the original value does not equal the current\r
138     value. \r
139 \r
140 The following cheat methods/filters automatically perform the function\r
141 of the "Set Original to Current" button after "Do Search" is pressed.\r
142 \r
143 "Value decreased."\r
144 \r
145     Show the address if the value has decreased. \r
146 \r
147 "Value increased."\r
148 \r
149     Show the address if the value has increased. \r
150 \r
151 ------------------------------------------------------------------------\r
152 \r
153 \r
154     Examples\r
155 \r
156 \r
157       "Mega Man 3" Windows Example\r
158 \r
159 This example will give Mega Man unlimited energy. Immediately after\r
160 entering the Top Man stage, make your way to the "Add Cheat" window.\r
161 Push "Reset Search". Go back to playing and move right until the first\r
162 enemy appears. Allow yourself to be hit twice. Each hit does "2" damage,\r
163 so you've lost 4 energy bars. Go to the "Add Cheat" window again and\r
164 select the third filter ("|O-C|==V2") and enter the value 4 next to\r
165 "V2". Then push "Do Search".\r
166 \r
167 Several addresses will appear in the address list. You can try to find\r
168 the address you want through trial and error, or you can narrow the\r
169 results down further. We will do the latter.\r
170 \r
171 Go back to playing MM3 and get hit one more time and make your way back\r
172 to the "Add Cheat" window. Your damage is now "6". You can probably see\r
173 which address that contains your life(it is 00A2). If not, change V2 to\r
174 6 and push "Do Search" again. This should leave only 00A2.\r
175 \r
176 Select that entry in the address list. Shift your attention to the "Add\r
177 Cheat" box to the right. Type in a meaningful name and the desired\r
178 value(156; it was the value when you had no damage, so it's safe to\r
179 assume it's the maximum value you can use). Push the "Add" button and a\r
180 new entry will appear in the cheats list. The cheat has been added.\r
181 \r
182 \r
183       "Over Horizon" Text Interface Example\r
184 \r
185 This example will give you infinite lives in the NTSC(Japanese) version\r
186 of "Over Horizon".\r
187 \r
188 Start a new game. Notice that when you press "Start" during gameplay,\r
189 the number of lives you have left is indicated. With no cheating, you\r
190 start with 3 lives(2 lives left).\r
191 \r
192 Activate the cheat interface immediately after starting a new game.\r
193 Select the "New Cheats" menu and "Reset Search".\r
194 \r
195 I'll assume that the number of lives left shown in the game is the same\r
196 number that's stored in RAM. Now, "Do Search". You're going to use the\r
197 first search filter. For V1, enter the value 2. For V2, enter the same\r
198 value. This, coupled with the fact that you just reset the search, will\r
199 allow you to search for a value "absolutely"(as opposed to changes in\r
200 the value).\r
201 \r
202 Now, "Show Results". When I did it, I received 11 results:\r
203 \r
204          1) $0000:002:002\r
205          2) $001c:002:002\r
206          3) $001e:002:002\r
207          4) $009d:002:002\r
208          5) $00b9:002:002\r
209          6) $00e3:002:002\r
210          7) $0405:002:002\r
211          8) $0406:002:002\r
212          9) $0695:002:002\r
213         10) $07d5:002:002       \r
214         11) $07f8:002:002\r
215 \r
216 You really can't do much yet(unless you want to spend time doing trial\r
217 and error cheat additions). Return to the game.\r
218 \r
219 After losing a life, go back to the cheat interface, to the "New Cheats"\r
220 menu, and "Show Results". Here are my results:\r
221 \r
222          1) $0000:002:002\r
223          2) $001c:002:002\r
224          3) $001e:002:002\r
225          4) $009d:002:002\r
226          5) $00b9:002:041\r
227          6) $00e3:002:002\r
228          7) $0405:002:001\r
229          8) $0406:002:002\r
230          9) $0695:002:002\r
231         10) $07d5:002:001\r
232         11) $07f8:002:002\r
233 \r
234 Notice that two addresses seem to hold the number of lives($0405 and\r
235 $07d5). You can lose another life and go "Show Results" again, and you\r
236 should see that $07d5 is the address that holds the number of lives.\r
237 \r
238 Now that you know the address that holds the number of lives, you can\r
239 add a cheat. You can either type in the number from the cheat results\r
240 list corresponding to the address you want to add a cheat for, or you\r
241 can remember the address and select "Add Cheat" from the "New Cheats"\r
242 menu. Do the former.\r
243 \r
244 Now you will need to enter a name for the cheat. I suggest something\r
245 short, but descriptive. "Infinite lives" will work fine. Next, a prompt\r
246 for the address will show up. Since you selected an item from the list,\r
247 you can press enter to use the associated address($07d5). Next, you will\r
248 need to enter a value. It doesn't need to be large(in fact, it probably\r
249 shouldn't be; abnormally high numbers can cause some games to\r
250 misbehave). I suggest a value of 2. After this, you should get a prompt\r
251 that looks like this:\r
252 \r
253    Add cheat "Infinite lives" for address $07d5 with value 002?(Y/N)[N]:\r
254 \r
255 Answer "Y". You now have infinite lives.\r
256 \r
257 ------------------------------------------------------------------------\r
258 \r
259 \r
260     Tips\r
261 \r
262 Games store player information in many different ways. For example, if\r
263 you have "3" lives in Super Wacky Dodgeball 1989, the game might store\r
264 it in memory as 2, 3, or 4, or perhaps a different number all together.\r
265 Also, say that you have 69 life points out of 200 in Mole Mashers. The\r
266 game might store how many life points you have, or how much damage you\r
267 have taken. Relative value searches are very valuable because you\r
268 probably don't know the way that the game stores its player data.\r
269 \r
270 Some games, especially RPGs, deal with individual numbers greater than\r
271 8-bits in size. Most that I've seen seem to store the multiple-byte data\r
272 least significant byte(lower byte of number) first in memory, though\r
273 conceivably, it could be stored most significant byte first, or the\r
274 component bytes of the number could be non-contiguous, though the latter\r
275 is very unlikely. For example, say I have 5304 experience points in\r
276 Boring Quest for the Overused Plot Device. To split the number into two\r
277 eight bit decimal numbers, take 5304 %(modulus) 256. This will give a\r
278 number that is the lower 8 bits. Next, take 5304 / 256. The integral\r
279 component of your answer will be the upper 8 bits(or the next 8 bits, if\r
280 the number is or can be larger than 16 bits) of 5304. Now you will need\r
281 to search for these numbers. Fortunately, most(all?) RPGs seem to store\r
282 large numbers exactly as they are shown in the game.\r
283 \r