Anatomy of an Xplorer Cheat for Hot Shots Golf

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!