ОХОТА
Давайте отправимся с Вами
на охоту, а охота это такое...
Только-то вот наша охота необыч-
ная: мы с Вами будем охотиться
на спрайты. Что нам для этого
понадобится? Все очень просто.
Покопайтесь в своих стареньких
дисках и найдите 1-2 программы,
которые перенесены Вами с кассе-
ты, или Вы точно знаете, что они
не защищены нашими умельцами.
Определить "девственную" (разве
что MAGIC'ом попорченую) прог-
рамму просто - у нее скорее все-
го не будет при загрузки прыгаю-
щих строк с приветами или надпи-
сей типа "CRACKET BY...". Дру-
гие программы нам не подходят,
т.к. они компрессированные, за-
щищенные, и мы просто в них ни-
чего не найдем.
Теперь стоит вооружиться. Я,
например, взял себе не совсем
новую, но испытанную мной и рас-
пространяемую Инфоркомом прог-
рамму File dump editor. Это
очень удобная программа, и с по-
мощью ее мы легко сможем найти
спрайты в программах. Если у Вас
нет этой программы, то поищите
на диске какую-либо другую, спо-
собную просматривать и искать в
программах спрайты. Для тех, у
кого вообще нет никаких прог-
рамм, я предлагаю свою. Вам сле-
дует ассемблировать ее в область
памяти, которая точно не будет
затерта просматриваемым блоком
(лучше всего в 3 треть экрана,
т.к. она намеренно не использу-
ется программой). Затем Вам сле-
дует загрузить программный блок
и запустить просмотрщик.
После запуска программы у Вас
появятся следующие клавиши:
1 - Переключение режимов -
символ/спрайт.
Q - Уменьшает адрес просмотра
на 1 байт.
A - Увеличивает адрес просмотра
на 1.
O - Уменьшает размер отобража-
емого окна в длину на 1.
P - Увеличивает размер отобра-
жаемого окна на 1.
SPACE - Выход в бейсик.
Q+SHIFT - Уменьшает адрес про-
смотра на 256.
A+SHIFT - Увеличивает адрес
просмотра на 256.
Изначально адрес установлен
на шрифт ПЗУ и включен режим
просмотра символов. Вы сможете
найти при помощи этой программы
спрайты почти всех форматов.
Размер программы очень мал. Так-
же Вы можете усовершенствовать
ее по своему усмотрению, увели-
чивая количество клавиш. Прог-
рамма написана для ассемблера
TASM, но ее просто переделать
для других ассемблеров.
140.
ORG #61A8 ;Адрес ассемблирования.
UNPHASE ;Аналог ENT, но для TASM'а.
PHASE 20480 ;Эта команда ассемблирует все, что нахо-
;дится за ней, в адрес, который следует за
;ней, в нашем случае в 3 треть экрана, но
;код помещает в адрес ORG.
EI ;Включаем прерывания.
XOR A ;Делаем бордер черным.
OUT (#FE),A
INC A ;В переменной FLAG режим вывода спрайтов
;на экран - 1 печатаем символы, 0 - спрай-
;ты.
LD (FLAG),A
LD A,#20 ;В LEN заносим текущий размер окна в шири-
;ну.
LD (LEN),A
LD HL,#3D00 ;Теперь в переменной VRAM адрес памяти,
;начиная с которого будем печатать на эк-
;ран.
LD (VRAM),HL
CALL SETSP ;Рисуем на экране содержимое памяти.
KEY XOR A ;В переменную нажатой клавиши заносим 0.
LD (#5C08),A
LD BC,#0000 ;Пауза до нажатия любой клавиши.
CALL #1F3D
LD A,(#5C08);Читаем содержимое переменной.
CP #31 ;Если нажали "1"- происходит переключение
;режимов вывода спрайтов.
JR Z,SETFLAG
CP #71 ;Если нажали "q" (маленькое) - уменьшаем
;адрес просмотра на 1.
JR Z,UP1
CP #61 ;Если нажали "a" (маленькое) - увеличиваем
;адрес просмотра на 1.
JR Z,DOWN1
CP #51 ;Если нажали "Q" (большое) - уменьшаем ад-
;рес просмотра на #0100.
JR Z,UP256
CP #41 ;Если нажали "A" (большое) - увеличиваем
;адрес просмотра на #0100.
JR Z,DOWN256
CP #20 ;При нажатии на пробел происходит выход из
;программы.
RET Z
CP #6F ;Если нажали "o" (маленькое) - уменьшаем
;размер окна.
JR Z,DECR
CP #70 ;Если нажали "p" (маленькое) - увеличение
;размера окна.
JR Z,INCR
JR KEY ;Если жали другое переход на опрос клавиш.
SETFLAG LD A,(FLAG) ;Инвертируем флаг.
XOR #01
LD (FLAG),A
JR KEY-3
UP1 LD HL,(VRAM) ;Следующие процедуры уменьшают/увеличивают
;адрес просмотра.
DEC HL
LD (VRAM),HL
JR KEY-3
DOWN1 LD HL,(VRAM)
INC HL
JR UP1+4
UP256 LD HL,(VRAM)
LD DE,#0100
AND A
SBC HL,DE
JR UP1+4
DOWN256 LD HL,(VRAM)
LD DE,#0100
ADD HL,DE
JR UP1+4
DECR LD A,(LEN) ;Следующие процедуры уменьшают/увеличивают
;размер окна.
CP #01
JR Z,KEY
DEC A
LD (LEN),A
JR KEY-3
INCR LD A,(LEN)
CP #20
JR Z,KEY
INC A
LD (LEN),A
JR KEY-3
SETSP CALL CLS ;Вызываем очистку окна.
LD A,(FLAG)
DEC A
JR Z,CHR ;Если 1,печатаем символы, иначе - спрайты.
LD HL,#4000 ;Адрес начала экрана.
LD DE,(VRAM);Адрес в памяти.
LD B,#80 ;Размер окна в высоту 128 ПИКСЕЛЕЙ (16*8).
SPR1 PUSH HL
LD A,(LEN) ;Заносим в C размер окна в длину.
LD C,A ;Далее печатаем спрайт.
SPR2 LD A,(DE)
LD (HL),A
INC DE
INC HL
DEC C
JR NZ,SPR2
POP HL
CALL DOWN
DJNZ SPR1
RET
DOWN INC H ;Переход на следующую пиксельную линию
;снизу.
LD A,H
AND #07
RET NZ
LD A,L
ADD A,#20
LD L,A
RET C
LD A,H
SUB #08
LD H,A
RET
CHR LD HL,#4000 ;Адрес 1 трети экрана.
LD DE,(VRAM);В DE заносим адрес в памяти.
CALL CHRSET ;Заполняем первую треть.
LD HL,#4800 ;Адрес второй трети.
CALL CHRSET ;Заполняем ее.
RET
CHRSET LD B,#08 ;Эта процедура заполняет треть экрана сим-
;волами.
CHR1 PUSH HL
LD A,(LEN)
LD C,A
CHR2 PUSH BC
PUSH HL
LD B,#08
CHR3 LD A,(DE)
LD (HL),A
INC H
INC DE
DJNZ CHR3
POP HL
POP BC
INC HL
DEC C
JR NZ,CHR2
POP HL
PUSH DE
LD DE,#0020
ADD HL,DE
POP DE
DJNZ CHR1
RET
CLS LD HL,#5800 ;Сначала окрашиваем весь экран цветом
;INK 0, PAPER 0.
PUSH HL
LD DE,#5801
LD BC,#02FF
LD (HL),#00
LDIR
POP HL ;Затем делаем видимой часть экрана, ко-
;торая попадает в окно.
LD B,#10
CLS1 PUSH HL
LD A,(LEN)
LD C,A
CLS2 LD (HL),#0F
INC HL
DEC C
JR NZ,CLS2
POP HL
LD DE,#20
ADD HL,DE
DJNZ CLS1
RET
FLAG NOP ;Переменная, которая хранит указатель фор-
;мата печати.
VRAM DEFW #0000 ;Переменная, которая хранит адрес в памяти
LEN NOP ;Переменная, которая хранит размер окна в
;длину.
2
Ну вот, оружие подобрано, и
мы начинаем охоту. Что же мы
должны найти? Спрайты. Увеличи-
вая или уменьшая адрес просмотра
и изменяя размеры окна, найдите
в программе картинки, предвари-
тельно переведя просмотрщик в
режим просмотра спрайтов.
Для просмотра я взял несколь-
ко программ из своей коллек-
ции: 3D BATMAN (OCEAN), ELEFANT-
1 (CODE MASTERS), JACK THE NIP-
PER-2, KRAKOUT. Давайте посмот-
рим, что же мне удалось в них
найти. Первые три спрайта я на-
шел в режиме поиска спрайтов, а
спрайт из программы KRAKOUT был
найден в символьном режиме прос-
мотра.
Собственно, на этом наша охо-
та закончена и мы плавно перехо-
дим к следующей главе, которая
пояснит нам, что же мы нашли.