aa2dba92 |
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 |