╔════════════════════╗
║ UNLIMIT ║
╚════════════════════╝
IN SEARCH OF ETERNAL LIFE
CopyRight (c) 1992-95 yu Max Iwamoto/Code Busters
This description began at the moment when
one of us came up with the idea to make a game that
we could not pass, lifeless. This idea came to fruition
success, which gave impetus to attempts to make lifeless
other games and take a closer look at their structure and specifics.
As a result, we developed practical techniques for working with
games (working on a game here (and further) means
the desire to make this game immortal). These techniques were
divided into five groups, which are presented below.
All of the following have been tested on MSX2 and
ZX-Spectrum using programs such as: Debugger,
Mons4, STS3.3, etc. This version of the article is designed
exclusively for ZX-Spectrum users.
This manual is intended for users
practically without at least minimal experience working in
Z80 assembler, but knowing its basic commands.
We offer several methods for your consideration
with the help of which we managed to remake more than one hundred games.
METHOD 1
-------
COME TO YOUR HEAD BY YOURSELF
Try to search for the cell in which it is stored
number of lives and increase them (it must be borne in mind that
that in some games the number of lives displayed on the screen is
1, and sometimes even 2, less than what is loaded), and also,
Never bet 255 lives, because... if they suddenly add you
life, then the life counter will become 0 and Game will begin
Over.Most often, entry occurs through
battery(hereinafter referred to as Ass):
#6000: 3E 03 A,#03 ; life in Ass
#6002: 32 00 C0 LD (#C000),A ; Ass in cell (#C000)
Change the number at address #6001 if the number of lives in
game has increased, which means cell (#C000) contains the quantity
lives. In addition to entering through the battery, there is
many others, here are some of them:
#6000: 21 00 C0 LD HL,#C000 ; #C000 in HL
#6003: 36 03 LD (HL),#03 ; life in (#C000)
In this case, the cell with which you need to work further is
(#C000).
Some companies have taken more cunning paths. They
They use several more ways to load lives into cells:
#6000: 21 03 00 LD HL,#0003 ;upload 3 to HL
#6003: 7D LD А,L ; to Ass from L
#6004: 32 00 C0 LD (#C000),A ; Ass in cell (#C000)
#6000: 21 03 00 LD HL,#0003 ; upload 3 to HL
#6003: 22 00 C0 LD (#C000),HL ; HL to cell (#C000)
DE, BC, IX, IY can be used instead of HL, but for
The main thing for us is to find a cell containing life. If the cell
found, then you need to go to the subtraction search stage
life, because if we just increase the value as needed
cell it may happen that even a large number
There are not enough lives to complete the game. Search for subtraction
Let's look at life using the example of the game BUGGY RANGER:
We have 3 lives. We find:
#B9EB: 3E 03 A,#03 ; life in Ass
#B9ED: 32 38 A9 LD (#A938),A ; Ass in cell (#A938) We are looking for calls to cell (#A938). We find:
#B959: 21 38 A9 LD HL,#A938 ;
#B95C: 35 DEC (HL) ; life subtraction
After we remove DEC (HL) (#00 in #B95C) game
becomes immortal, but to pass it practically
is impossible, because the energy is subtracted too quickly.
Therefore, we begin to look for what is entered in the cells next to
cell of life, i.e. (A9??):
#B9FF: 3E FF A,#FF ; energy in Ass
#BA01: 32 39 A9 LD (#A939),A ; Ass in cell (#A939)
Next we find:
#C72C: 3A 39 A9 LD A,(#A939) ; energy in Ass
#C72F: 95 SUB L ; subtracting As
#C730: 32 39 A9 LD (#A939),A ; Assinto an energy cell
#C733: B7 OR A ; displaying flags
#C734: CA 38 C7 JP Z,#C738 ; jump if 0
#C737: C9 RET ; return if not 0
#C738: AF XOR A ; Reset
#C739: 32 39 A9 LD (#A939),A ; energy cells
#C73C: C3 59 B9 JP #B959 ; transition to procedure
; life subtraction
Similarly, you can detect fuel and weapons: cells
(A93A) and (A941). Subtracting them is similar to subtracting lives.
The next method is that in the cell
It is not the number itself that is placed, but the ASCII code of this number.
For example, if a toy has 3 lives, then the corresponding
the cell will be placed not 3, but #33, that is, the code for the number 3.
Accordingly, there cannot be lives in this toy.
greater than 9, and also the check is carried out not at 0, but at
ASCII code code 0, i.e. at #30. Loved using this one
way of Bob Pape, who wrote R-TURE, DRAGON BREED,
TUSKER. Let's take TUSKER as an example:There are 3 lives in this game. So we start looking
entering 3 into Ass, but we find nothing. Next we begin
look for the entry of the ASCII code of the number 3 - #33. We find:
#94D4: 3E 33 A,#33 ; life in Ass
#94D6: 32 21 FE LD (#FE21),A ; Ass in cell (#FE21)
Now we begin to look for calls to the cell (#FE21):
#96E0: 3A 21 FE LD A,(#FE21)
#96E3: 3D DEC A
#96E4: 32 21 FE LD (#FE21),A
#96E7: FE 30 SR #30
#96E9: CA 01 84 JP Z,#8401
DEC And we have suspicions, they intensify when
we see CP #30 (check for number code 0). Now to the address
#96E3 set #00 and run the program. And lastly, the most cunning and most rarely encountered
way. Data about life, energy, stage number are stored in
TV programs, and are sent to their addresses by the command
LDIR. Moreover, most often they are stored after
forwarding routines!
#6000: 21 0C 60 LD HL,#600C ; Source
#6003: 11 00 C0 LD DE,#C000 ; Receiver
#6006: 01 03 00 LD BC,#0003 ; how much to send
#6009: ED IN LDIR ; send 3 bytes
#600B: C9 RET ; from #600C to #C000
#600C: 03 INC BC ; forwarded
#600D: 01 12 00 LD BC,#0012 ; data
In this case, the cell where you should look for life is
(#C000). In (#C001) the stage number is stored, and in (#C002)
the amount of energy the player has.
But there is another type of game. These are games where
several players. Everything is done in them throughindex
addressing, i.e. to subtract the lives of both players
the same subroutine is used. But if the game
represents a fight (for example Street Fighter), then removing
you will perform the procedure for subtracting energy (or lives)
Both players will become immortal and the game will lose its meaning. In this
In this case, it is necessary to remove not the subtraction command, but the inversion
to the subtraction procedure for one of the players.
It is necessary to mention one more common mistake.
If the number of some objects in a toy is the same, then
entry into cells is often in the same place.
For example, in the game Saigon Combat Unit 1 the number of lives is exactly
the number of grenades and the entry is nearby:
#A823: 3E 04 A,#04 ; number 4 in Ass
#A825: 32 20 B0 LD (#B020),A ; to the cell of lives
#A828: 32 21 B0 LD (#B021),A ; into the grenade cell
But in fact, the most cruel thing is when the creators of the gameprovide that someone will immortalize their game.
For example, this was done in the game EQUINOX. Life in it
are disabled quite simply, but if you reassign
keyboard before playing or you won't have enough time to
passing the level, then starting the game from the beginning you will see that
lives are deducted. If this happens, then you need to look
storing the subtraction command code in memory. In this case
we find:
#7006: 3E 35 A,#35 ; DEC command code (HL)
#7008: 32 B1 9B LD (#9BB1),A ; And at the address #9BB1,
; is exactly where it is
; subtraction of lives!!!
Therefore, if you put #00 instead of #35 at address #7007,
then the game will become absolutely endless.
METHOD 2 -------
SEARCHING FOR ZERO CHECK
If the first method did not lead to positive
results, then you should look to check the cells for zero,
clean it up and see what happens. Next I
Here are some of the possible options:
#6000: 3A 00 C0 LD A,(#C000) ; to As from (#C000)
#6003: B7 OR A ; set checkboxes
#6004: CA 00 80 JP Z,#8000 ; go if A=0
Remove the transition at address #6004 and see what
will happen. If the number of lives on the screen = 0, and the inscription Game
Over has not yet appeared, which means the cell of lives is in this
case - (#C000). You don’t have to search for subtraction,
because Game Over will never come anyway, but you need to remember
that the check for 0 can be in several places. Let's look at a few more examples:
#6000: 21 00 C0 LD HL,#C000 ; #C000 in HL
#6003: A6 AND (HL) ; set checkboxes
#6004: CA 00 80 JP Z,#8000 ; go if 0
Remove the transition at address #6004.
#6000: 3A 00 C0 LD A,(#C000) ; to As from (#C000)
#6003: D6 00 SUB #00 ; set checkboxes
#6005: CA 00 80 JP Z,#8000 ; go if A=0
Remove the transition at address #6005. Very often instead of SUB
#00 meets SUB #01 and thus 2 are killed at once
hare - life is subtracted and equality to zero is checked. B
In this case, you must put SUB #00 instead of SUB #01 and
life will become eternal.METHOD 3
-------
SEARCHING FOR REDUCING LIVES
You can also search for subtractions of any cells, among them
It may turn out to be a subtraction of life. Subtraction can
performed by any subtraction commands, for example: DEC N,
SUB N, where N - A, B, C, D, E, H, L, (IX+??), (IY+??), HL,
DE, B.C. But there are also more perverted methods:
#6000: 2A 00 C0 LD HL,(#C000) ; to HL from memory
#6003: 11 01 00 LD DE,#0001 ; how much to take
#6006: ED 52 SBC HL,DE ; reduce HL by DE
#6008: 7C LD A,H ; isn't it 0 for us?
#6009: 5B OR L ; in HL?
#600A: CA 00 80 JP Z,#8000 ; if 0, then Game Over
#600D: 22 00 C0 LD (#C000),HL ; otherwise we will continue...
It is necessary to put #00 at address #6004. And some
make it even more unusual:
#6000: 3E FF LD A,#FF ; life in L, #FF in Ass
#6003: 85 ADD A,L ; increase L by A=-1
#6004: 32 00 C0 LD (#C000),A ; return Ass to (#C000)
In this case, you can put #00 at address #6001 or
at #6002.
METHOD 4
-------
USING GAME FEATURES
Many games add lives for
anything, then you can find their addition. What if we
we know that there cannot be more than N lives, thencan be found
check for this number, determine the cell from which it is
take it and go to method 1, for example:
#6000: 3A 00 C0 LD A,(#C000) ; to As from (#C000)
#6003: FE 09 SR #09 ; equality check 9
#6005: CA 00 80 JP Z,#8000 ; leave if = 9
The cell to which you should look for access is (#C000).
Often the number of lives (weapon number, shots, etc.)
depicted in numbers. You can find a place in the program where
they are printed. Let's consider several possible options:
#6000: 7E LD A,(HL) ; load to A from (HL)
#6001: D6 01 SUB #01 ; decrease Ass by 1
#6003: 27 DAA ; decimal correction
#6004: CD ?? ?? CALL PRINT ; print procedure call
#6000: 7E LD А,(HL) ; load to A from (HL)
#6001: C6 30 ADD A,#30 ;add #30 to Ass
#6003: CD ?? ?? CALL PRINT ; print procedure call
In the second example we add #30 to Ac and get
a number equal to the ASCII code of this number and print as usual
text message. In this case, you need to look for the number
located in HL.
The point of the following method is to find the place where
the inscription Game Over is printed (or any other that
indicates the end of the game). It is likely that
somewhere nearby there is a check of some cell for
zero. If not, then continue searching.
METHOD 5
-------
This is a method of so-called shock therapy or a method"scientific poke" successfully used by our science in
for 73 years. It is used for digging games in which
There is absolutely nothing to grab onto. Most often these are games with graphical
indicator of life. This method is based on your
intuition and consists in creating an artificial clue: you
“travel” in the MONITOR according to the game listing and relying on intuition
change certain sections of the program that respond to
in your opinion, for lives, attempts, things, etc.
It should be noted that the above addresses and
the examples are purely conventional. In your game these addresses may be
others, moreover: these examples can be intertwined in
the most bizarre combinations.
Share your thoughts about the article