|
Читатель-читателю - Поиск "вечных жизней".
|
Поиск "вечных жизней "
© Сергей Бородавкин, г. Гродно (Беларусь), 1995.
Хочу предложить программу, которая облегчит жизнь многим хакерам и сохранит их драгоценное время. Программа позволяет автоматизировать поиск адресов, в которых хранится количество жизней, патронов, бомб, количество оставшегося времени и т.д. Одним словом, можно искать адреса всего того, что меняется в процессе игры. А после этого получать долгожданное бессмертие. Ведь как неприятно, когда не находишь среди опубликованных POKES названия нужной игры. А теперь любой желающий может попробовать свои силы в этом увлекательном занятии. Что для этого надо? Две вещи: система TRDOS любой версии и эта небольшая программа. Идея такова. В различные моменты времени сбрасываем на диск содержимое ОЗУ MAGIC-кнопкой. Причём первый раз сбрасываем, когда у вас имеется N чего-нибудь. Где под чем-нибудь подразумеваются или жизни, или снаряды, или мины, или время, или ..., а N - это их количество. Второй раз сбрасываем игру на диск, когда уже количество стало равно N-1 (N+1, если увеличивается). И третий - когда N-2 (N+2, если увеличивается). Абсолютно не важно, если MAGIC-файлы после сброса не работают из-за испорченного стека. Теперь остальное можно доверить программе, которая найдет эти изменившиеся на единицу байты и покажет их адрес. Главное, получить три MAGIC-файла, удовлетворяющих выше сказанному условию. Число их (три) получено экспериментальным путём. При двух файлах выдавалось много лишних адресов, не имеющих для нас никакого значения из-за того, что приличное количество байт в двух файлах отличалось на единицу. Короче говоря, двух файлов оказалось недостаточно для однозначного определения нужного адреса.
Программа.
|
|
|
ORG |
25000 |
;адрес размещения программы. |
61A8 |
CD6B0D |
BEGIN |
CALL |
#0D6B |
;очищаем экран. |
61AB |
CD7762 |
|
CALL |
PRN |
;печатаем название программы. |
61AE |
11E364 |
|
LD |
DE,TXMAG |
;печатаем просьбу |
61B1 |
012100 |
|
LD |
BC,#21 |
;вставить диск с |
61B4 |
CD3C2 0 |
|
CALL |
#2 03C |
;"магик" файлами. |
61B7 |
CDF663 |
|
CALL |
KEY |
;ждем нажатия на любую клавишу |
61BA |
010509 |
|
LD |
BC,#905 |
; считываем первые 9 секторов |
61BD |
210080 |
|
LD |
HL,#8000 |
;в память с адреса #8000 |
61C0 |
110000 |
|
LD |
DE,0 |
;нулевой дорожки. |
61C3 |
CD133D |
|
CALL |
#3D13 |
;входная точка подпрограммы. |
61C6 |
21409C |
|
LD |
HL,#9C4 0 |
; очищаем от |
61C9 |
11419C |
|
LD |
DE,#9C41 |
;"мусора" |
61CC |
01F401 |
|
LD |
BC,#01F4 |
; буфер для |
61CF |
3600 |
|
LD |
(HL),0 |
; хранения имен |
61D1 |
EDB0 |
|
LDIR |
|
;"магик" файлов. |
61D3 |
CD3E62 |
|
CALL |
NAME |
; помещаем в этот буфер ;имена "магик" файлов. |
61D6 |
AF |
|
XOR |
A |
;первоначально обнуляем ячейку |
61D7 |
320463 |
|
LD |
(NMAG),A |
;числа "магик" файлов. |
61DA |
3E16 |
|
LD |
A,#16 |
; устанавливаем |
61DC |
D7 |
|
RST |
#10 |
;позицию |
61DD |
AF |
|
XOR |
A |
; печати |
61DE |
D7 |
|
RST |
#10 |
; в левый |
61DF |
AF |
|
XOR |
A |
; верхний |
61E0 |
D7 |
|
RST |
#10 |
;угол. |
61E1 |
210040 |
|
LD |
HL,#4000 |
; очищаем |
61E4 |
110140 |
|
LD |
DE,#4001 |
; часть |
61E7 |
01FF0F |
|
LD |
BC,#0FFF |
; экрана |
61EA |
3600 |
|
LD |
(HL),0 |
; от |
61EC |
EDB0 |
|
LDIR |
|
;надписи. |
61EE |
CD8B62 |
|
CALL |
PRNAM |
;вывод имен MAGIC-файлов. |
61F1 |
3A04 63 |
|
LD |
A,(NMAG) |
;проверяем, есть ли на диске |
61F4 |
FE01 |
|
CP |
1 |
;хотя бы один "магик" файл. |
61F6 |
3008 |
|
JR |
NC,YES |
;если ДА, то продолжаем дальше. |
61F8 |
CD0164 |
|
CALL |
NO |
;если нет, то пишем надпись |
|
|
|
|
;об отсутствии "магик" файла. |
61FB |
CDF663 |
|
CALL |
KEY |
;ждем нажатия на любую клавишу и |
61FE |
18A8 |
|
JR |
BEGIN |
;переходим на начало программы. |
6200 |
CDB062 |
YES |
CALL |
SELEC |
;выбираем 1-ый "магик" файл. |
6203 |
CD0563 |
|
CALL |
TRSEC |
;его расположение на диске. |
6206 |
ED531363 |
|
LD |
(TS1),DE |
;запоминаем это значение. |
62 0A |
CDB663 |
|
CALL |
BEEP |
;сигнал о том, что файл выбран. |
62 0D |
CDB062 |
|
CALL |
SELEC |
;выбираем 2-ой "магик" файл. |
6210 |
CD0563 |
|
CALL |
TRSEC |
;его расположение на диске. |
6213 |
ED531563 |
|
LD |
(TS2),DE |
;запоминаем это значение. |
6217 |
CDB663 |
|
CALL |
BEEP |
;сигнал о том, что файл выбран. |
621A |
CDB062 |
|
CALL |
SELEC |
;выбираем 3-ий "магик" файл. |
621D |
CD0563 |
|
CALL |
TRSEC |
;его расположение на диске. |
6220 |
ED531763 |
|
LD |
(TS3),DE |
;запоминаем это значение. |
6224 |
CDB663 |
|
CALL |
BEEP |
;сигнал о том, что файл выбран. |
6227 |
CD6B0D |
|
CALL |
#0D6B |
;очищаем экран. |
622A |
CDC463 |
|
CALL |
MENU |
; выводим меню поиска и |
|
|
|
|
|
;обрабатываем нажатие клавиш. |
622D |
CD6B0D |
|
CALL |
#0D6B |
;очищаем экран. |
6230 |
3E02 |
|
LD |
A,2 |
; после очистки открываем |
6232 |
CD0116 |
|
CALL |
#1601 |
;2-ой канал. |
6235 |
CD1963 |
|
CALL |
FIND |
;процедура поиска. |
6238 |
CDF663 |
|
CALL |
KEY |
; ждем нажатия на любую клавишу и |
623B |
C3A8 61 |
|
JP |
BEGIN |
;переходим на начало программы. |
623E |
3AE4 8 8 |
NAME |
LD |
A,(#8 8E4) |
; в A заносим общее количество |
|
|
|
|
|
;файлов, имеющихся на диске. |
6241 |
47 |
|
LD |
B,A |
; копируем это значение в B для |
|
|
|
|
|
;организации цикла. |
6242 |
11409C |
|
LD |
DE,#9C4 0 |
; адрес буфера для хранения имен |
|
|
|
|
|
;"магик" файлов. |
6245 |
21F87F |
|
LD |
HL,#7FF8 |
;первоначальное значение. Оно |
|
|
|
|
|
;должно быть на 8 меньше адреса, |
|
|
|
|
|
;куда считана нулевая дорожка. |
6248 |
C5 |
NAME1 |
PUSH |
BC |
;сохраняем BC. |
6249 |
011000 |
|
LD |
BC,#10 |
;в BC - длина описателя файла. |
624C |
09 |
|
ADD |
HL,BC |
;прибавляем ее к HL. После этого |
|
|
|
|
|
;в HL находится адрес байта |
|
|
|
|
|
;спецификации файла. |
624D |
C1 |
|
POP |
BC |
;восстанавливаем BC. |
624E |
7E |
|
LD |
A,(HL) |
; проверяем является ли файл |
624F |
FE4 3 |
|
CP |
#43 |
;блоком кодов. |
6251 |
2803 |
|
JR |
Z,NAME2 |
;если ДА, то проверяем дальше. |
6253 |
10F3 |
|
DJNZ |
NAME1 |
;повторяем проверку столько раз, |
|
|
|
|
|
;сколько файлов на диске. |
6255 |
C9 |
|
RET |
|
;Все файлы проверены. |
6256 |
E5 |
NAME2 |
PUSH |
HL |
;сохраняем HL. |
6257 |
C5 |
|
PUSH |
BC |
;сохраняем BC. |
6258 |
010500 |
|
LD |
BC,5 |
; в BC помещаем смещение между |
|
|
|
|
|
;байтом спецификации файла и |
|
|
|
|
|
;байтом размера файла в сект. |
625B |
09 |
|
ADD |
HL,BC |
;прибавляем его к HL. Теперь в |
|
|
|
|
|
;HL находится адрес байта разме- |
|
|
|
|
|
;ра файла в количестве секторов. |
625C |
C1 |
|
POP |
BC |
;восстанавливаем BC. |
625D |
7E |
|
LD |
A,(HL) |
;проверяем длину файла, |
625E |
FEC0 |
|
CP |
#C0 |
;сравнивая ее с #C0. |
6260 |
E1 |
|
POP |
HL |
;восстанавливаем HL. |
6261 |
2803 |
|
JR |
Z,NAME3 |
;если длина равна #C0, то это ;MAGIC-файл; идем дальше. |
6263 |
10E3 |
|
DJNZ |
NAME1 |
;повторяем проверку столько раз, ;сколько файлов на диске. |
6265 |
C9 |
|
RET |
|
;Проверены все файлы. |
6266 |
C5 |
NAME3 |
PUSH |
BC |
;сохраняем BC. |
6267 |
E5 |
|
PUSH |
HL |
;сохраняем HL. |
6268 |
010800 |
|
LD |
BC,8 |
;уменьшаем HL на 8. После этого |
62 6B |
ED42 |
|
SBC |
HL,BC |
;он указывает на начальный адрес ;имени MAGIC-файла. |
62 6D |
011000 |
|
LD |
BC,#10 |
;перебрасываем блок описателя ;файла в адрес буфера для |
6270 |
EDB0 |
|
LDIR |
|
;хранения имен MAGIC-файлов. |
6272 |
E1 |
|
POP |
HL |
;восстанавливаем HL. |
6273 |
C1 |
|
POP |
BC |
;восстанавливаем BC. |
6274 |
10D2 |
|
DJNZ |
NAME1 |
;повторяем проверку столько раз, ;сколько файлов на диске. |
6276 |
C9 |
|
RET |
|
;Проверены все файлы. |
6277 |
3E01 |
PRN |
LD |
A,1 |
;в A помещаем номер канала. |
6279 |
CD0116 |
|
CALL |
#1601 |
;открываем 1-ый канал. |
627C |
110C64 |
|
LD |
DE,TXTPR |
;адрес названия программы. |
627F |
018C00 |
|
LD |
BC,#8C |
;длина названия программы. |
6282 |
CD3C2 0 |
|
CALL |
#203C |
;печатаем название программы. |
6285 |
3E02 |
|
LD |
A,2 |
;в A помещаем номер канала. |
6287 |
CD0116 |
|
CALL |
#1601 |
;открываем 2-ой канал для дальнейшей печати в основной экран. |
62 8A |
C9 |
|
RET |
|
;возврат. |
628B |
11409C |
PRNAM |
LD |
DE,#9C4 0 |
;в DE помещаем адрес, где лежат ;имена "магик" файлов. |
628E |
1A |
PRNA1 |
LD |
A,(DE) |
;если там находится 0, |
628F |
B7 |
|
OR |
A |
;то есть имена закончились, |
6290 |
C8 |
|
RET |
Z |
;то выходим. |
6291 |
3E0D |
|
LD |
A,#0D |
;смещаем позицию печати |
6293 |
D7 |
|
RST |
#10 |
; на строку ниже |
6294 |
3E17 |
|
LD |
A,#17 |
; с табуляцией |
6296 |
D7 |
|
RST |
#10 |
; в центр |
6297 |
3E0C |
|
LD |
A,#0C |
;строки. |
6299 |
D7 |
|
RST |
#10 |
; второй рестарт необходим для |
62 9A |
D7 |
|
RST |
#10 |
;правильной работы табуляции. |
62 9B |
010800 |
|
LD |
BC,8 |
;число символов в имени файла. |
62 9E |
CD3C2 0 |
|
CALL |
#203C |
;печать имени. |
62A1 |
3A04 63 |
|
LD |
A,(NMAG) |
; считаем количество |
62A4 |
3C |
|
INC |
A |
;"магик" файлов |
62A5 |
320463 |
|
LD |
(NMAG),A |
;на диске. |
62A8 |
210800 |
|
LD |
HL,8 |
; помещаем |
62AB |
19 |
|
ADD |
HL,DE |
; в DE адрес |
62AC |
EB |
|
EX |
DE,HL |
; следующего имени и |
62AD |
18DF |
|
JR |
PRNA1 |
; идем на начало процедуры ;с новым адресом. |
62AF |
C9 |
|
RET |
|
;возврат. |
62B0 |
0E01 |
SELEC |
LD |
C,1 |
;в регистре С будем хранить ;порядковый номер "магик" файла, ;выделенного на экране. |
62B2 |
212C58 |
|
LD |
HL,#582C |
;первоначальный адрес атрибутов. |
62B5 |
E5 |
SEL0 |
PUSH |
HL |
;сохраняем HL. |
62B6 |
C5 |
|
PUSH |
BC |
;сохраняем BC. |
62B7 |
210058 |
|
LD |
HL,#5800 |
; устанавливаем атрибуты |
62BA |
110158 |
|
LD |
DE,#5801 |
;для невыделенных имен |
62BD |
017F02 |
|
LD |
BC,#027F |
;"магик" файлов, |
62C0 |
3604 |
|
LD |
(HL),4 |
;не затрагивая надписей |
62C2 |
EDB0 |
|
LDIR |
|
;названия программы. |
62C4 |
C1 |
|
POP |
BC |
;восстанавливаем BC. |
62C5 |
E1 |
|
POP |
HL |
;восстанавливаем HL. |
62C6 |
0608 |
|
LD |
B,8 |
;делаем цикл для |
62C8 |
360E |
SEL1 |
LD |
(HL),#0E |
;выделения другим цветом |
62CA |
23 |
|
INC |
HL |
; одного имени |
62CB |
10FB |
|
DJNZ |
SEL1 |
;"магик" файла. |
62CD |
110800 |
|
LD |
DE,8 |
;возвращаем |
62D0 |
ED52 |
|
SBC |
HL,DE |
;в HL прежнее значение. |
62D2 |
AF |
|
XOR |
A |
;обнуляем системную переменную |
62D3 |
32085C |
|
LD |
(#5C08),A |
;кода последней нажатой клавиши. |
62D6 |
3A0 8 5C |
SEL2 |
LD |
A,(#5C08) |
; проверяем ее |
62D9 |
FE61 |
|
CP |
#61 |
;на нажатие клавиши "a". |
62DB |
2809 |
|
JR |
Z,DOWN |
;если "а" нажата, то идем ;на соответствующую процедуру. |
62DD |
FE71 |
|
CP |
#71 |
;проверяем нажатие клавиши "q". |
62DF |
2814 |
|
JR |
Z,UP |
;если "q" нажата, то идем ;на соответствующую процедуру. |
62E1 |
FE0D |
|
CP |
#0D |
;проверяем нажатие ENTER. |
62E3 |
C8 |
|
RET |
Z |
;если ENTER нажата, то возврат. |
62E4 |
18F0 |
|
JR |
SEL2 |
;если ничего не нажато, то ждем. |
62E6 |
3A04 63 |
DOWN |
LD |
A,(NMAG) |
; следим, чтобы выделение не |
62E9 |
B9 |
|
CP |
C |
;пошло ниже последнего файла. |
62EA |
2002 |
|
JR |
NZ,DOWN1 |
; если нет выхода за заданные ;пределы, то переход на DOWN1. |
62EC |
18C7 |
|
JR |
SEL0 |
;если есть выход за пределы, то ;возвращение к началу процедуры. |
62EE |
0C |
DOWN1 |
INC |
C |
;увеличиваем C на единицу. |
62EF |
112000 |
|
LD |
DE,#2 0 |
; устанавливаем адрес атрибутов |
62F2 |
19 |
|
ADD |
HL,DE |
; на одну строку ниже и |
62F3 |
18C0 |
|
JR |
SEL0 |
; идем на начало процедуры ;с новым адресом атрибутов. |
62F5 |
3E01 |
UP |
LD |
A,1 |
; следим, чтобы не было выделения |
62F7 |
B9 |
|
CP |
C |
;выше первого файла. |
62F8 |
2002 |
|
JR |
NZ,UP1 |
; если нет выхода за заданные ;пределы, то переход на UP1. |
62FA |
18B9 |
|
JR |
SEL0 |
; если есть выход за пределы, то ;возвращение к началу процедуры. |
62FC |
0D |
UP1 |
DEC |
C |
;уменьшаем C на единицу. |
62FD |
111F00 |
|
LD |
DE,#1F |
; устанавливаем адрес атрибутов |
6300 |
ED52 |
|
SBC |
HL,DE |
; на одну строку выше и |
6302 |
18B1 |
|
JR |
SEL0 |
; идем на начало процедуры ;с новым адресом атрибутов. |
6304 |
00 |
NMAG |
DEFB |
0 |
;ячейка памяти для хранения общ. ;количество MAGIC-файлов на диске. |
6305 |
213E9C |
TRSEC |
LD |
HL,#9C3E |
;первоначально в HL помещаем число ;на 2 меньшее адреса буфера ;для хранения имен MAGIC-файлов. |
6308 |
111000 |
|
LD |
DE,#10 |
;длина описателя файла. |
630B |
41 |
|
LD |
B,C |
; в B заносим порядковый номер ;выбранного "магик" файла. |
630C |
19 |
TRS1 |
ADD |
HL,DE |
;прибавляем длину описателя. |
630D |
10FD |
|
DJNZ |
TRS1 |
; количество сложений равно ;порядковому номеру выбранного ;MAGIC-файла. После этой процедуры ;HL указывает на адрес, в ;котором хранится дорожка и сектор |
|
|
|
|
|
;выбранного MAGIC-файла. |
630F |
5E |
|
LD |
E,(HL) |
;помещаем в регистр E номер |
6310 |
23 |
|
INC |
HL |
;сектора, а в регистр |
6311 |
56 |
|
LD |
D,(HL) |
;D - номер дорожки выбранного |
|
|
|
|
|
;"магик" файла. |
6312 |
C9 |
|
RET |
|
;возврат. |
6313 |
0000 |
TS1 |
DEFW |
0 |
;ячейка для хранения местоположения |
|
|
|
|
|
;1-го MAGIC-файла. |
6315 |
0000 |
TS2 |
DEFW |
0 |
; ячейка для хранения местополо- |
|
|
|
|
|
;жения 2-го MAGIC-файла. |
6317 |
0000 |
TS3 |
DEFW |
0 |
; ячейка для хранения местополо- |
|
|
|
|
|
;жения 3-го MAGIC-файла. |
6319 |
3E0C |
FIND |
LD |
A,#0C |
; сохраняем число дорожек, кото- |
631B |
32 0B64 |
|
LD |
(NTR),A |
;рые занимает MAGIC-файл. |
631E |
ED5B1363 |
FIND0 |
LD |
DE,(TS1) |
; считываем |
6322 |
010510 |
|
LD |
BC,#1005 |
;одну дорожку |
6325 |
210070 |
|
LD |
HL,#7000 |
;1-го файла |
6328 |
CD133D |
|
CALL |
#3D13 |
;в адрес #7000. |
632B |
ED5B1563 |
|
LD |
DE,(TS2) |
; считываем |
632F |
010510 |
|
LD |
BC,#1005 |
; одну дорожку |
6332 |
210080 |
|
LD |
HL,#8000 |
;2-го файла |
6335 |
CD133D |
|
CALL |
#3D13 |
;в адрес #8000. |
6338 |
ED5B1763 |
|
LD |
DE,(TS3) |
; считываем |
633C |
010510 |
|
LD |
BC,#1005 |
; одну дорожку |
633F |
210090 |
|
LD |
HL,#9000 |
;3-го файла |
6342 |
CD133D |
|
CALL |
#3D13 |
;в адрес #9000. |
6345 |
210070 |
|
LD |
HL,#7000 |
;помещаем в HL адрес 1-го файла. |
6348 |
110080 |
|
LD |
DE,#8000 |
;помещаем в DE адрес 2-го файла. |
634B |
DD210090 |
|
LD |
IX,#9000 |
;помещаем в IX адрес 3-го файла. |
634F |
1A |
FIND1 |
LD |
A,(DE) |
;в A значение байта 2-го файла. |
6350 |
46 |
|
LD |
B,(HL) |
;в B значение байта 1-го файла. |
6351 |
90 |
|
SUB |
B |
;сравниваем их. |
6352 |
FEFF |
|
CP |
#FF |
;здесь может быть также команда |
|
|
|
|
|
;CP 1 -это зависит от нашего |
|
|
|
|
|
;выбора в процедуре MENU. |
6354 |
2 0 0A |
|
JR |
NZ,NEXT |
;если отличаются не на единицу, |
|
|
|
|
|
;то переход к следующим значениям. |
6356 |
1A |
|
LD |
A,(DE) |
; заносим |
6357 |
47 |
|
LD |
B,A |
;в B значение байта 2-го файла. |
6358 |
DD7E00 |
|
LD |
A,(IX+0) |
;в A значение байта 3-го файла. |
635B |
90 |
|
SUB |
B |
;сравниваем их. |
635C |
FEFF |
|
CP |
#FF |
; здесь может быть также команда |
|
|
|
|
|
;CP 1 -это зависит от нашего |
|
|
|
|
|
;выбора в процедуре MENU. |
635E |
2829 |
|
JR |
Z,PRNUM |
; если и эти значения отличаются |
|
|
|
|
|
;на единицу, то переходим к про |
|
|
|
|
|
цедуре печати адреса. |
6360 |
23 |
NEXT |
INC |
HL |
; увеличиваем на единицу адрес |
|
|
|
|
|
;1-го файла. |
6361 |
13 |
|
INC |
DE |
; увеличиваем на единицу адрес |
|
|
|
|
|
;2-го файла. |
6362 |
DD2 3 |
|
INC |
IX |
; увеличиваем на единицу адрес |
|
|
|
|
|
;3-го файла. |
6364 |
7C |
|
LD |
A,H |
; проверяем не закончили ли мы |
6365 |
FE8 0 |
|
CP |
#80 |
;просмотр дорожки. |
6367 |
2 0E6 |
|
JR |
NZ,FIND1 |
; если не закончили, то возвра- |
|
|
|
|
|
;щаемся на начало процедуры с |
|
|
|
|
|
;новыми значениями. |
6369 |
2A1363 |
|
LD |
HL,(TS1) |
; увеличиваем на единицу |
636C |
24 |
|
INC |
H |
; содержимое ячейки места |
636D |
221363 |
|
LD |
(TS1),HL |
;1-го "магик" файла. |
6370 |
2A1563 |
|
LD |
HL,(TS2) |
;увеличиваем на единицу |
6373 |
24 |
|
INC |
H |
;содержимое ячейки места |
6374 |
221563 |
|
LD |
(TS2),HL |
;2-го "магик" файла. |
6377 |
2A1763 |
|
LD |
HL,(TS3) |
; увеличиваем на единицу |
637A |
24 |
|
INC |
H |
; содержимое ячейки места |
637B |
221763 |
|
LD |
(TS3),HL |
;3-го "магик" файла. |
637E |
3A0B64 |
|
LD |
A,(NTR) |
;уменьш. на 1 содержимое ячейки, |
6381 |
3D |
|
DEC |
A |
;в которой храним число остав |
6382 |
32 0B64 |
|
LD |
(NTR),A |
шихся для считывания дорожек. |
6385 |
C8 |
|
RET |
Z |
;возврат если там находится 0, |
|
|
|
|
|
;т.е. уже прошли все 12 дорожек. |
6386 |
1896 |
|
JR |
FIND0 |
; переход на считывание в память |
|
|
|
|
|
;следующих дорожек. |
6388 |
C9 |
|
RET |
|
;возврат. |
6389 |
E5 |
PRNUM |
PUSH |
HL |
;сохраняем от "порчи" HL, |
638A |
D5 |
|
PUSH |
DE |
;DE и |
638B |
DDE5 |
|
PUSH |
IX |
;IX. |
638D |
E5 |
|
PUSH |
HL |
; копируем через стек |
638E |
C1 |
|
POP |
BC |
;содержимое HL в BC. |
638F |
59 |
|
LD |
E,C |
; сохраняем в E содержимое C. |
|
|
|
|
|
;в нем содержится младший байт |
|
|
|
|
|
;истинного адреса, изменившейся |
|
|
|
|
|
;на единицу ячейки памяти. |
6390 |
78 |
|
LD |
A,B |
;в A старший байт адреса 2-го |
|
|
|
|
|
;файла. Он имеет значение в |
|
|
|
|
|
;пределах #70-#80. |
6391 |
C690 |
|
ADD |
A,#90 |
; для удобства прибавим к нему |
|
|
|
|
|
;#90, после этого там будет |
|
|
|
|
|
;число в пределах 0-#10. |
6393 |
F5 |
|
PUSH |
AF |
; сохраняем регистр A. |
6394 |
3A0B64 |
|
LD |
A,(NTR) |
; в B через A помещаем число ос- |
6397 |
47 |
|
LD |
B,A |
;тавшихся дорожек для считыван. |
6398 |
F1 |
|
POP |
AF |
; восстанавливаем регистр A. |
6399 |
50 |
|
LD |
D,B |
; в D число оставшихся дорожек |
|
|
|
|
|
;для считывания. |
639A |
0610 |
|
LD |
B,#10 |
;выполняем процедуру, равносиль |
639C |
92 |
PRNU1 |
SUB |
D |
ную выражению: A=A-#10*D. После |
639D |
10FD |
|
DJNZ |
PRNU1 |
; этого в A находится старший |
|
|
|
|
|
;байт истинного адреса, изменив- |
|
|
|
|
|
;шейся на единицу ячейки памяти. |
639F |
47 |
|
LD |
B,A |
; копируем в B регистр A. |
63A0 |
4B |
|
LD |
C,E |
; переписываем в C из E сохранен- |
|
|
|
|
|
;ное значение. Сейчас в BC нахо |
|
|
|
|
|
дится истинный адрес, изменив- |
|
|
|
|
|
;шейся на единицу ячейки памяти. |
63A1 |
CD2F2D |
|
CALL |
#2D2F |
;помещаем его на стек калькуля- |
63A4 |
CDE32D |
|
CALL |
#2DE3 |
; тора и печатаем. |
63A7 |
3E2 0 |
|
LD |
A,#20 |
; после числа |
63A9 |
D7 |
|
RST |
#10 |
; помещаем три |
63AA |
3E2 0 |
|
LD |
A,#20 |
; пробела для |
63AC |
D7 |
|
RST |
#10 |
; отделения его |
63AD |
3E2 0 |
|
LD |
A,#20 |
; от следующего |
63AF |
D7 |
|
RST |
#10 |
;выводимого числа. |
63B0 |
DDE1 |
|
POP |
IX |
;восстанавливаем IX. |
63B2 |
D1 |
|
POP |
DE |
;восстанавливаем DE. |
63B3 |
E1 |
|
POP |
HL |
;восстанавливаем HL. |
63B4 |
18AA |
|
JR |
NEXT |
;на проверку следующих значений. |
63B6 |
E5 |
BEEP |
PUSH |
HL |
;сохраняем HL. |
63B7 |
D5 |
|
PUSH |
DE |
;сохраняем DE. |
63B8 |
216400 |
|
LD |
HL,#64 |
;высота звука. |
63BB |
119600 |
|
LD |
DE,#96 |
;продолжительность его звучания |
63BE |
CDB503 |
|
CALL |
#03B5 |
;сама процедура. |
63C1 |
D1 |
|
POP |
DE |
;восстанавливаем DE. |
63C2 |
E1 |
|
POP |
HL |
;восстанавливаем HL. |
63C3 |
C9 |
|
RET |
|
;возврат. |
63C4 |
3E02 |
MENU |
LD |
A,2 |
; открываем |
63C6 |
CD0116 |
|
CALL |
#1601 |
;2-ой канал. |
63C9 |
119864 |
|
LD |
DE,TXMEN |
; печатаем |
63CC |
012E00 |
|
LD |
BC,#2E |
; сообщение о том, |
63CF |
CD3C2 0 |
|
CALL |
#203C |
;что нам надо искать. |
63D2 |
DD214F63 |
|
LD |
IX,FIND1 |
; привязка к адресу процедуры по ;иска FIND, для того чтобы там ;вставить необходимые команды. |
63D6 |
3EF7 |
MENU0 |
LD |
A,#F7 |
; опрашиваем |
63D8 |
DBFE |
|
IN |
A,(#FE) |
;клавиши "1"-"5". |
63DA |
CB47 |
|
BIT |
0,A |
;нажата клавиша "1"? |
63DC |
2806 |
|
JR |
Z,MENU1 |
; если да, то переход на ;соответствующую процедуру. |
63DE |
CB4F |
|
BIT |
1,A |
;нажата клавиша "2"? |
63E0 |
2 8 0B |
|
JR |
Z,MENU2 |
; если да, то переход на ;соответствующую процедуру. |
63E2 |
18F2 |
|
JR |
MENU0 |
;если не нажаты, то ждем. |
63E4 |
DD360401 |
MENU1 |
LD |
(IX+#04),1 |
; подставляем в процедуру поиска |
63E8 |
DD360E01 |
|
LD |
(IX+#0E),1 |
;в нужные ячейки единицу. После ;этого мы имеем в нужных местах |
63EC |
C9 |
|
RET |
|
;команду CP 1. |
63ED |
DD3604FF |
MENU2 |
LD |
(IX+#04),#FF |
; подставляем в процедуру по- |
63F1 |
DD360EFF |
|
LD |
(IX+#0E),#FF |
;иска в нужные ячейки #FF. ;После этого мы имеем в нужных |
63F5 |
C9 |
|
RET |
|
;местах команду CP #FF. |
63F6 |
AF |
KEY |
XOR |
A |
; обнуляем системную переменную |
63F7 |
32085C |
|
LD |
(#5C08),A |
; кода последней нажатой клавиши |
63FA |
3A085C |
KEY1 |
LD |
A,(#5C08) |
; проверяем |
63FD |
B7 |
|
OR |
A |
; ее. |
63FE |
C0 |
|
RET |
NZ |
; если клавиша нажата, то возврат |
63FF |
18F9 |
|
JR |
KEY1 |
;если нет, то ждем. |
6401 |
11C664 |
NO |
LD |
DE,TXTNO |
;адрес сообщения. |
6404 |
011D00 |
|
LD |
BC,#1D |
;его длина. |
6407 |
CD3C2 0 |
|
CALL |
#203C |
;печать сообщения. |
64 0A |
C9 |
|
RET |
|
;возврат. |
64 0B |
00 |
NTR |
DEFB |
0 |
; число дорожек, которые ;необходимо считать. |
64 0C |
11061001 |
TXTPR |
DEFB |
#11,6,#10,1 |
;устанавливаем PAPER и INK |
6410 |
46494E44 |
|
DEFM |
"FIND THE INFINITE ADDRESS V 1.00" |
6414 |
20544845 |
|
|
|
|
6418 |
20494E46 |
|
|
|
|
641C |
494E4954 |
|
|
|
|
6420 |
45204144 |
|
|
|
|
6424 |
44524553 |
|
|
|
|
6428 |
53205620 |
|
|
|
|
642C |
312E3030 |
|
|
|
|
6430 |
11011006 |
|
DEFB |
#11,1,#10,6 ; |
устанавливаем PAPER и INK |
6434 |
20205752 |
|
DEFM |
" WRITTEN BY |
SERGEY BORODAVKIN " |
6438 |
49545445 |
|
|
|
|
643C |
4E204259 |
|
|
|
|
6440 |
20534552 |
|
|
|
|
6444 |
47455920 |
|
|
|
|
6448 |
424F524F |
|
|
|
|
644C |
4441564B |
|
|
|
|
6450 |
4 94E2 02 0 |
|
|
|
|
6454 |
20202020 |
|
DEFM |
" GRODNO- |
94 TEL. 33-36-53 " |
6458 |
47524F44 |
|
|
|
|
645C |
4E4F2D39 |
|
|
|
|
6460 |
34205445 |
|
|
|
|
6464 |
4C2E2 033 |
|
|
|
|
6468 |
332D3336 |
|
|
|
|
64 6C |
2D353320 |
|
|
|
|
6470 |
20202020 |
|
|
|
|
6474 |
11061001 |
|
DEFB |
#11,6,#10,1 |
;устанавливаем PAPER и INK |
6478 |
20512C41 |
|
DEFM |
" Q,A - SELECT ENTER - ACCEPT " |
647C |
202D2053 |
|
|
|
|
6480 |
454C4543 |
|
|
|
|
6484 |
54202020 |
|
|
|
|
6488 |
20454E54 |
|
|
|
|
648C |
4552202D |
|
|
|
|
6490 |
20414343 |
|
|
|
|
6494 |
45505420 |
|
|
|
|
6498 |
160A06 |
TXMEN |
DEFB |
#16,#0A,6 |
; устанавливаем позицию |
64 9B |
312E2046 |
|
DEFM |
"1. FIND INC |
. ADDRESS" |
649F |
494E4420 |
|
|
|
|
64A3 |
494E432E |
|
|
|
|
64A7 |
20414444 |
|
|
|
|
64AB |
52455353 |
|
|
|
|
64AF |
160C06 |
|
DEFB |
#16,#0C,6 |
; устанавливаем позицию |
64B2 |
322E2046 |
|
DEFM |
"2. FIND DEC |
. ADDRESS" |
64B6 |
494E4420 |
|
|
|
|
64BA |
4445432E |
|
|
|
|
64BE |
20414444 |
|
|
|
|
64C2 |
52455353 |
|
|
|
|
64C6 |
160B04 |
TXTNO |
DEFB |
#16,#0B,4 |
; устанавливаем позицию |
64C9 |
1002 |
|
DEFB |
#10,2 |
;устанавливаем цвет INK |
64CB |
4D414749 |
|
DEFM |
"MAGIC FILES |
NO PRESENT !" |
64CF |
43204649 |
|
|
|
|
64D3 |
4C455320 |
|
|
|
|
64D7 |
4E4F2050 |
|
|
|
|
64DB |
52455345 |
|
|
|
|
64DF |
4E542021 |
|
|
|
|
64E3 |
160B02 |
TXMAG |
DEFB |
#16,#0B,2 |
; устанавливаем позицию |
64E6 |
1004 |
|
DEFB |
#10,4 |
;устанавливаем цвет INK |
64E8 |
494E5345 |
|
DEFM |
"INSERT DISC |
WITH MAGIC FILES" |
64EC |
52542044 |
|
|
|
|
64F0 |
49534320 |
|
|
|
|
64F4 |
57495448 |
|
|
|
|
64F8 |
204D4147 |
|
|
|
|
64FC |
49432046 |
|
|
|
|
6500 |
494C4553 |
|
|
|
|
После ассемблирования записываем полученный кодовый файл:
SAVE "ftia"CODE 25000,860 Загрузчик данного блока кодов может быть таким: 5 REM PROGRAM FTIA
10 PAPER 0 : BORDER 0 : INK 5 : CLEAR 24 999 20 RANDOMIZE USR 15619 : REM : LOAD "ftia" CODE 30 RANDOMIZE USR 25000
Как работать с программой
Создайте по выше указанной методике на диске три MAGIC-файла. Запустите программу. Далее по запросу вставьте диск с этими MAGIC-файлами и нажмите любую клавишу. Вы увидите имена своих MAGIC-файлов в той последовательности, как они у вас записаны на диске: 1-ый файл сверху, 2-ой ниже и т.д. Переименовывать MAGIC-файлы не обязательно. Клавишами "Q" и "A" выберите 1-ый сброшенный файл, выбор фиксируйте клавишей "ENTER". Аналогично выберите 2-ой и 3-ий файл. После этого появиться меню поиска. Если вы нажмете "1", то будет осуществлен поиск адресов, увеличившихся на единицу. Если "2", то уменьшившихся на единицу.
Пример
В качестве примера рассмотрим поиск бессмертия в известной игре "1942". После запуска этой программы, в дисковод помещаем рабочий диск с достаточным количеством свободного пространства для записи MAGIC-файлов. Стартуем игру, выбирая в меню программы 4-ый пункт. Количество жизней 1-го игрока отображается в виде изображений самолётов в правом верхнем углу экрана. Первый раз сбрасываем игру MAGIC-кнопкой, когда у нас есть четыре самолёта. Для наглядности переименуем полученный MAGIC-файл в NAME1. Потом даём себя один раз убить. У нас остается три самолёта и после этого сбрасываем игру "волшебной" кнопкой во второй раз. Даём имя файлу NAME2. И последний, третий раз сбрасываем программу в момент, когда у нас на экране остаётся два самолёта. Меняем имя файла на NAME3. Подготовительная часть закончена. Теперь запустите предлагаемую программу FTIA и вставьте рабочий диск с полученными MAGIC-файлами. После нажатия на любую клавишу вы увидите эти файлы:
@ - имена предыдущих MAGIC-файлов, если таковые имеются.
NAME1 - 1-ый сброшенный файл.
NAME2 - 2-ой.
NAME3 - 3-ий.
Клавишами "Q" и "A" выберите 1-ый сброшенный файл и нажмите "ENTER". Аналогично поступаем со 2-ым, а затем и с 3-им файлом. После этого вам будет предложено меню поиска:
1. FIND INC. ADDRESS
2. FIND DEC. ADDRESS
Нажмите клавишу "2" и через некоторое время вы увидите долгожданный адрес, в котором хранится количество жизней: 52208.
Дальше уже дело техники. Находим в отладчике этот адрес: 52303 LD A, 5
LD (52208),A
Заменяя число 5 на другое, вы получите необходимое вам число жизней.
Для того чтобы получить полное бессмертие, необходимо немного разбираться в машинном коде. Анализируя программу, устанавливаем, что необходимо исключить команду, которая уменьшает содержимое найденной ячейки памяти: 52471 DEC (IX+8)
где в данный момент значение (IX+8) равно 52208.
|
|