I had beaten the first six or so characters in Hot Shots Golf (also known as Everybody's Golf in some countries), but couldn't beat the character called Buzz no matter how hard I tried. "Time for a cheat!" I thought, but try as I might I couldn't find any Xplorer cheats that worked for me. I didn't want to use one of the "unlock all characters" cheats, just something that would give me an advantage over Buzz. So I decided to get out the old X-Link software and make my own cheat.
The first step was to think of a possible way of cheating. In shoot-em-up type games you usually try to get an unlimited supply of ammo or infinite health, but that wasn't much good for a golf game! After some thinking I thought it might be possible to limit the number of strokes I'd played on a hole, thus making the game think I'd won every hole and hence the round.
Hooking up my Xplorer cartridge to my PC I then got the game to the point where I was about to tee off. I then started the X-Link software and started the trainer. I was pretty sure that the game must have a counter for the number of strokes I'd played, but I didn't know if it started at zero or one; so I used the "Range" option in X-Link to limit the number of possible memory locations to ones that held values between zero and two. Then I played my shot and did a "Greater" search. After doing this a few times I had found the memory location that held my stroke count: 101C98.
But there was a complication: on the second hole I noticed that the counter wasn't working! I went through the training exercise again and found that the memory location had changed; it was now two bytes further along. On the third hole I found that the memory location was another two bytes further along, and then it hit me: the game was keeping a stroke count for each hole in the round, a total of 18 holes and thus 18 stroke counters. Using the memory monitor in X-Link I confirmed my suspicion and was able to view all 18 stoke counters as I played.
The next step was to figure out how to modify these counters so that I would score just one stroke per hole. I played a round right up to the green and then set the stroke counter to 0; the on-screen stroke indicator changed to say that I was on my -1 shot. I sunk the ball and the game declared that I had won the round, but it didn't say that I'd sunk a hole in one.
I then repeated the experiment but this time set the stroke counter to 1 before I made my final shot. The on-screen stroke indicator changed to say that I was on my 0 shot and when I sunk the ball I was awarded with a "Hole In One" display.
The final step was to come up with a suitable code that set the stoke counters to 1. I figured it was ok to set all 18 counters in one go rather than try to figure out which hole I'm on and set just that counter. The code I came up with was:
B0120002 0000
10101C98 0100
The "B" code is known as a "Slide Code". This code lets you set a block of memory to a value (the value may be either fixed or varying). In my case I wanted to set 18 2-byte values to the value "1". The format for the "B" code is:
B0ww aaaa dddd
10xx xxxx yyyy
Where:
ww | Number of repetitions (18 steps in my example) |
aaaa | Size of the address step (2 bytes in my example) |
dddd | Size of the data step (0 = always the same value) |
xx xxxx | Start address (101C98 in my example) |
yyyy | Initial data (1 in my example) |
Remember that the codes are in hexadecimal, so I set the number of repetitions to 12 (12 hex = 18 decimal). Remember also that the PlayStation uses little-endian byte order (the low-order byte of the number is stored in memory at the lowest address, and the high-order byte at the highest address), so my initial data of "0100" is really "0001".
My code looked very promising, but there was a problem when I went to try it out: every time I went to play a shot the game thought that it was my first shot for the round and kept transporting my character to the tee! Obviously I didn't want to have my code playing continuously (i.e. always on), I needed a way to activate the code whenever I wanted from within the game. This type of code is called a "Joker Command"; it permits activation of the code only while a certain button combination on the PlayStation's controller is pressed.
Lets deviate and have a quick look at Joker Commands... All games have a certain area in memory where the currently pressed buttons on the controller are indicated to the game with a special value (sometimes there is more than one memory location that shows this, but it's usually enough to just find one of them). To make a Joker Command you have to find this memory location, which is fairly easy to do if you just hold down a button (or button combination) on the controller and then use X-Link to search the memory for the corresponding value. The values are:
Normal Joker Values | |
---|---|
Key | Value |
L2 | 0001 |
R2 | 0002 |
L1 | 0004 |
R1 | 0008 |
Triangle | 0010 |
Circle | 0020 |
X | 0040 |
Square | 0080 |
Select | 0100 |
Start | 0800 |
Up Arrow | 1000 |
Right Arrow | 2000 |
Down Arrow | 4000 |
Left Arrow | 8000 |
Two or more keys can be combined by adding the values together (i.e. L1 + R1 is 0012, Up Arrow + Triangle + Start is 1810). Remember that all these values are in hex. Some games don't use the Normal Joker Values, instead they may use Reversed Joker Values. In that case the values are:
Reversed Joker Values | |
---|---|
Key | Value |
L2 | 0100 |
R2 | 0200 |
L1 | 0400 |
R1 | 0800 |
Triangle | 1000 |
Circle | 2000 |
X | 4000 |
Square | 8000 |
Select | 0001 |
Start | 0008 |
Up Arrow | 0010 |
Right Arrow | 0020 |
Down Arrow | 0040 |
Left Arrow | 0080 |
In addition to these two encoding schemes there is also Complementary and Reverse-Complementary. The values for these two schemes are obtained by taking the value from one of the charts above and subtracting it from FFFF. For example Triangle in Complementary format is FFEF (FFFF - 0010) and in Reverse-Complementary format Triangle is EFFF (FFFF - 1000).
Back to our Hot Shots Golf Hole-In-One cheat... A little bit of work with X-Link told me that the memory location that Hot Shots Golf uses for its controller codes is at 103864 and 103868 (I don't know why there are two locations because using the memory monitor in X-Link you can see that the values in both these memory locations changes when a button is pressed). I had decided that I wanted my code to activate whenever I pressed L1 + L2 + R1 + R2 all at the same time. The code I came up with was:
D0103864 000F
The "D" code is an If-Then type of code. The format for the "D" code is:
D0xx xxxx yyyy
Where:
xx xxxx | The address to examine (103864 in my example) |
yyyy | The value to look for (000F in my example) |
My code essentially says: "If the value 000F is in memory location 103864 then do the rest of this cheat code". I look for the value 000F because that's the value for L1 + L2 + R1 + R2 (I had already determined that Hot Shots Golf uses Normal Joker Values). Side note: The Xplorer also has a 7 code that works the same as the D code; my understanding is that the D code is used to maintain backwards compatibility with the GameBuster cartridge.
So the complete code to set my stroke count to 1 for all holes whenever I press L1 + L2 + R1 + R2 is:
D0103864 000F
B0120002 0000
10101C98 0100
Some play-testing showed that this code works remarkably well, the only small gotcha is that you should only activate the cheat after the game has set you up ready to play your stroke; if you activate the cheat before it's your turn then the game will move you back to the tee-off point because it thinks you're on your first stroke of the hole!