Conversion

Lazy Bastard
Most people seem to think that if a code is hacked for a specific version of a game (for example, 1.1 instead of 1.0), it cannot be used for the other version. This is generally untrue. In fact, every game I have encountered with two versions has had a conversion formula, though some needed to be discovered. 

You see, when a game is made, then released again at a later time (with a different version), there's generally a reason for this, and a resultant change in the game. In a memory editor, changes seem to appear primarily near the beginning of memory.  What this does is effectively push everything else in the memory a certain amount of addresses up, thus making it impossible for you to successfully use the same exact code for both versions. You can, however, convert the code from one version to another, which is what I will discuss.


-How do you find a conversion formula?

First off, I should admit that for the purposes of this guide, my terminology has thus far been a bit misleading. Technically, we're mostly concerned with offsets here rather than true formulas/formulae, since the addressing difference between two versions of a game is generally a matter of addition/subtraction. But this is merely a semantic admission, and there will come times when a mathematical formula will be required, so on we go. 

In order to (feasibly) discover a conversion formula, there must already have been at least a few codes hacked for both versions; for example, an infinite health code for each version, or a maximum ammo code for each version. Without these, I suppose you could go and hack a couple of codes for both versions yourself, but if you have both versions, why do you want to convert codes anyway? And why do you have both versions...are you some kind of a wierdo fanatic of this game? Now, write those codes down, on top of each other, the first version then the next, and always put one version on top and one on bottom (in the same order each time), so you don't get confused. Now you are to find the difference between the two addresses in each pair. This is when a basic understanding of hex comes in handy. No, wait! Don't run away! I'm going to explain it! Damn. Oh well, I'll just keep talking to myself. For the purpose of this FAQ, I'll use the PSX/N64/etc 8-digit, 16-bit addressing system, such as what you might see in a GSPro. Remember that the last four digits in a code do not make up the address; I've just used them in the examples because it's easier. OK, here are some examples of adding and subtracting in hex:

 00000000 0005
+00000000 0005
=00000000 000A

You see, hexadecimal, commonly known as hex, goes from 0 to F (F representing 15). It goes like this, hex on the left, our system on the right:

0=0
1=1
2=2
3=3
4=4
5=5
6=6
7=7
8=8
9=9
A=10
B=11
C=12
D=13
E=14
F=15
10=16
11=17
12=18
13=19
14=20
15=21
16=22
17=23
18=24
19=25
1A=26
1B=27
1C=28
1D=29
1E=30
1F=31
20=32
and so on...

You see? Looking at this, you can see that A represents 10, and so on. Therefore if 

5+5=10, 5+5=A.

OK, now, remember to carry the 1 when you add, just like in 3rd grade, only now you don't carry the 1 until you pass F, instead of 9 like in 3rd grade. For example:

 00000000 000B
+00000000 0006
=00000000 0011

As you can see, B+6=11. This is because B represents 11, and 6 of course still represents 6, and if you add 11 and 6, you get 17. Remember, like I said, that F=15. So, if F=15, and you go past F, 10=16, and 11=17. Look back at the chart if you still don't understand. After F in hex, just like after 9 in our numerical system, you go to 10. Understand? If not, try reading the FAQ I wrote on the basics of hexadecimal, or feel free to e-mail any of us at the GSHI staff any time. OK, another example:

  00000000 0014
+00000000 0005
=00000000 0019

This is simple addition; 14+5=19. Here's another:

 00000000 0016
+00000000 0007
=00000000 001D

This is a bit more complicated, although simple if you pay attention. 1D=29. 16 (in hex)=22, and 7 is the same in either system. 7+22=29, just as in hex, 7+16=1D. Or, if you don't want to do it this way, or if you are experienced enough in hex (or if you just want to jump in like I did when I was first learning), you could just add in hex, without ever thinking of the regular system equivalent. Here's how I would do that, in really small, easy steps. I would actually skip most of this, but you are learning; you need to see how I got this or that. OK, if you count 7 digits up from 16, it goes like this: 16, 17, 18, 19, 1A, 1B, 1C, 1D. You see? Either way, you simply add them together; the way you do it is your preference, as long as it still has the same outcome.

OK, now subtraction is a bit more trying, but still simple once you get the hang of it. 

Here's an example:

 00000000 000B
-00000000 0004
=00000000 0007

This is because if B represents 11, and 11-4=7, then B-4=7. OK, just in case this is still not clear enough, here are a few more examples:

 00000000 0008
-00000000 0003
=00000000 0005

Simple subtraction in this case. Here's another one like the first:

 00000000 000D
-00000000 0002
=00000000 000B

This is because if D=13, and B=11, and 13-2=11, then D-2=11. Therefore D-2=B. Here's another one.

 00000000 0012
-00000000 000A
=00000000 0008

The reason for this is that 12 (in hex)=18, and A=10 , therefore 12-A=8, just as 18-10=8.

OK, now, as I said before, you will not be working with the last four digits in the code, as I have done in the examples. You will be adding or subtracting between addresses. The address is from the third digit in the code to the eighth (technically, PSX memory, as far as the GSPro is concerned, runs from 0x80000000 to 0x80200000 [2 Mb RAM], per PlayStation Developer's Guide, v2.5c, but effectively, you may ignore this technicality). For example, "547891" in the following code makes up the address.

80547891 FF57

The first two digits in the code control the code type, which you can read more about in the FAQ on code types that Code Master wrote (you can download it from the FAQs section of the GSHI). The next six digits are the address, like I said, and the last four, which are seperated from the rest, tell the system what information to send to that address, or, simply put, what to do to that address, and are commonly referred to as "the digits".


-OK, enough hex, how do I find the conversion formula?

Hey, you can't talk to me like that. Heh, OK, if you remember, I just told you to stack the two codes, one from one version, one from the other, but both still being the same exact code (meaning both are infinite lives codes, or infinite health codes, the only difference between the two being that they are for different versions of the game), on top of each other. Now, remember, always put them in the same order between versions each time. For example, if the 1.0 code is on top of the 1.1 code in the first pair, the 1.0 code should be on top in every pair. This is common sense, just so you don't get confused when looking for the difference. OK, say your two codes are infinite lives codes; and they are like this:

version 1.0: 80091200 FFFF
version 1.1: 80091220 FFFF

Well, the difference in the two codes is simple: 00000020 0000

Therefore, to convert a code from version 1.0 to version 1.1 in this game, you simply add 00000020 0000, and to convert from version 1.1 to version 1.0, you subtract 00000020 0000. 

OK, here's another example:

version 1.0: 80091234 0009
version 1.1: 80091247 0009

Here we have a difference that is a bit more complicated. Think back to your hex training now; look at the things that are different about the codes. OK, now what's the difference between 34 and 47? Well, you could find the equivalent of each one in our system (decimal). If you want to do it that way, 34=52, and 47=71. The difference between 52 and 71 (subtract 52 from 71) is 19. Remember when you add 19 to 34 (to check if your formula is correct), that you are adding in hex, from 0-F and not from 0-9. Now this is not the method I would use to find the difference, but it is a method that will work. The method I would use, as said before, would be simply finding the distance between the two by counting. Once again, I would not actually write down each digit along the way, but this is so you can see what I'm doing. From 34 to 47: 34, 35, 36, 37, 38, 39, 3A, 3B, 3C, 3D, 3E, 3F, 40, 41, 42, 43, 44, 45, 46, 47. As you can see, the difference is 19 either way, otherwise one of the methods would be incorrect. You must find the difference between a few different pairs, and if all match, you have most likely found the conversion formula (in this case, an offset). Next you must test the formula by getting a code that is only for the version you do not have, and converting it using your formula, inputting it into your cheat system, and testing it out. Does it work? If it did, congratulations, you just found your first conversion formula. If not, check to see if your math is right, 9 times out of 10, if the code didn't work, you messed up somewhere in your math.


This text was brought to you by GSHI.org, unless someone else gave it to you, in which case it was only written by someone at GSHI.org. Heheh.