ZX-Forum №3 1995 г.

Читатель-читателю - Поиск "вечных жизней".


Темы статьи: Пресса  

Поиск "вечных жизней "

© Сергей Бородавкин, г. Гродно (Беларусь), 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.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Очумелые ручки - Подключение контроллеров дисковода к ZX-Spectrum.
Авторы - Авторы журнала и контакты редакции.
Scene - беседа Sq, Diver, CJ о судьбе газеты Insanity.
Музыкантам - Как сделать музыку на 4 канала и больше.
RED HAWK - Описание игры RED HAWK.

В этот день...   25 апреля