I coded an intro for a « trainer ». This into was a joke because we did not used our real name, but fake name from the group « Quartex ». In fact, I seemed to not like them, but I really can not remember why. Maybe I met some Quartex members and had bad experience with them.
This is not the case for Moby, because he is really a nice guy.
Data and source code is here: Trainer_QTX.zip
Here is the video of that intro:
A « trainer » is a special version of a game where you can choose some « cheats ». For example you can have infinite lives. Usually a game with a « trainer » start on menu where you can choose options.
How a trainer work ?
To add a trainer to a game you have to modify it. This is quite same principle as cracking. You check the game executable and search for the good lines and modify them.
Let’s explain the principle:
1/ Search some memory space that the game is not using. On Amiga, the games often used same locations of the memory (when you launch a game, it is always loading and running at same position in memory). The game do not erase all the memory before using it. That means you can leave some small data and code in memory before the game run.
2/ Check program in the game executable. Even if a game executable is a binary file, you can parse it. You can find « opcodes » or dissassemble the executable. As it was written in assembly, when disassembling code, it is closed to original code. If you search for live decrease for examples, you should search for « sub.w #1, … » functions. There can be lot in a game so you have to test them all.
Another technic was to use an external cartridge to do the job. For example, the « Action Replay III » had a special function to search for location of data. Load and run your game, press the Action replay button and enter menu. Say how much lifes you have at that point (5 for instance). Then go back to game. Play and loose a life. Back to Action replay and say now how much lives you have (4 now). The cartridge will check all the location that had the 5 values before and not are 4. Usually you can find the exact place where the lives value is stored. You can then modify it, or check into program the exact line where that value is changed.
3/ When you have find the exact place of program that change data (or anything), replace this « opcode » by a jump opcode (using hexadecimal editor). The two opcodes have the same size, so you can directly change into executable binary. For example put operation « JSR 0x100 ». This means « Jump to Subroutine » at memory « 0x100 ». At this position you can put a small routine that do the trainer work: If user selected « Yes » infinite lifes, then subroutine exit and do nothing. Else it remove one life (original removed line).
You can read a more technical explanation in this thread.
I really do not remember who did the trainer work. I did the intro coding.
You can see the full source code here : TRAINER17.S
As you can see, when changing the options, this change two variables « ETAT1 » and « ETAT2 » (means « State1 » and « State2 »). When exiting the intro, these two values are copied at memory $7C010. As I said earlier this is a place that the game will not erase or used. The changed game executable will come and test values at that exact position.
The arts are ripped from « Substance » demo. The names are all changed using bad play on words.
« Quartex » -> « Quartix »
« Corto » -> « Cirti »
« Moby » -> « Miby »
« Mack » -> « Mick ».
« Toxin » -> « Intox » our friend from Paradox. He is also into game highscore.
« ManKick » -> « Kickman » our friend from Paradox.
You can find that production on internet under the name:
Mega Phoenix (1991)(Dinamic)[cr Skillion][t +2 QTX]
Great demo of that time
Substance by Quartex and Alliance Design