ПОДГОТОВКА ДАННЫХ ДЛЯ ПЕЧАТИ
Перед тем как напечатать
спрайт на экране, мы должны под-
готовить для этого необходимые
данные, дабы при печати не от-
влекаться на эти детали.
Давайте выделим несколько пе-
ременных, в которых у нас будут
храниться данные:
COORD - координаты печати 1 -
Y, 2 - X.
LENHGT - длина спрайта (в
знакоместах) и его высота (в
пикселях).
ADRSPR - адрес данных спрайта
в памяти.
А теперь давайте посмотрим,
как же нам поместить нужные дан-
ные в эти переменные. Ранее мы с
вами уже говорили о различных
способах хранения данных и со-
ответственно о разных блоках
спрайтов и заголовков к ним. Для
начала заполним эти переменные
для спрайтов одинакового разме-
ра. Одним из параметров такого
блока является полная длина од-
ного спрайта (длина маски + дли-
на спрайта + (если есть) длина
атрибутов):
На входе в регистре A должен
быть номер спрайта (нумеруются с
0). На выходе в переменной ADR-
SPR будет адрес спрайта, в пере-
менной LENHGT его длина и высо-
та.
140.
ODINAK LD HL,SPRDATA+4 ;В HL адрес данных спрайтов. Посколь-
;ку первые 4 байта составляют заголо-
;вок, мы их пропускаем.
AND A ;Если номер спрайта 0, переходим.
JR Z,ODINAK1
LD B,A ;Организуем цикл.
LD DE,LINESPR ;В DE длина одного спрайта.
ADD HL,DE ;Складываем.
DJNZ $-1 ;Завершаем цикл.
ODINAK1 LD (ADRSPR),HL ;В переменную заносим адрес данных
;спрайта.
LD HL,(ZAGOLOWOK);В HL длина и высота спрайта, которые
;указаны в заголовке блока спрайтов
;(помните, там должны быть эти дан-
;ные).
LD (LENHGT),HL ;В переменную их.
RET ;Выход.
2
Теперь перейдем ко второму
типу блоков спрайтов - разнород-
ным спрайтом, то есть спрайты в
этом блоке могут иметь разные
размеры. Переменные остались те
же, при входе в подпрограмму в
регистре A должен быть номер
спрайта (нумерация с 0). Для на-
чала заполним переменные для
ОТДЕЛЬНОЙ таблицы:
140.
OTDEL LD L,A ;Заносим номер спрайта в регистр L.
LD H,#00 ;Обнуляем H.
ADD HL,HL ;Так как на каждый спрайт в таблице от-
;водится 4 байта, умножаем номер спрай-
;та на 4.
ADD HL,HL
LD DE,SPRDATA ;В DE адрес таблицы.
ADD HL,DE ;Получаем в HL адрес данных о спрайте.
LD E,(HL) ;Заносим в DE адрес самого спрайта, для
;чего читаем данные по адресу в регис-
;тре HL.
INC HL
LD D,(HL)
INC HL
PUSH HL
-------------------------
LD HL,SPRDATA ;Мы с Вами уже говорили, что вместо ко-
;нкретного адреса спрайтов может указы-
;ваться смещение до спрайта от адреса
;загрузки. Если было задано смещение,
;то и в регистре DE у нас к этому мо-
;менту находится смещение до нужного
;нам спрайта. Чтобы получить адрес
;спрайта, мы к смещению прибавляем ад-
;рес загрузки. Если задавался адрес,
;эти две строки нужно убрать.
ADD HL,DE
-------------------------
OTDEL1 LD (ADRSPR),HL ;Заносим в переменную адрес данных
;спрайта.
POP HL
140. LD C,(HL) ;Заносим в BC длину и высоту, на кото-
;рые указывает HL.
INC HL
LD B,(HL)
LD (LENHGT),BC ;Заносим в переменную длину и высоту.
RET ;Выход.
2
Теперь заполним данные для
СКВОЗНОЙ таблицы. Переменные ос-
тались те же.
140.
SKWOZ LD HL,SPRDATA ;В HL адрес загрузки спрайтов.
AND A ;Если номер спрайта 0, переходим.
JR Z,SKWOZ1
LD B,A ;В B номер спрайта, организуем цикл.
SKWOZ2 LD E,(HL) ;Заносим в DE адрес следующего спрайта.
INC HL
LD D,(HL)
EX DE,HL
-------------------------
LD DE,SPRDATA ;Мы с Вами уже говорили, что вместо ко-
;нкретного адреса спрайтов может указы-
;ваться смещение до спрайта от адреса
;загрузки. Если было задано смещение,
;то и в регистре DE у нас к этому мо-
;менту находится смещение до нужного
;нам спрайта. Чтобы получить адрес
;спрайта, мы к смещению прибавляем ад-
;рес загрузки. Если задавался адрес,
;эти две строки нужно убрать.
ADD HL,DE
-------------------------
SKWOZ3 DJNZ SKWOZ2 ;Закрываем цикл.
SKWOZ1 INC HL ;В HL адрес данных спрайта.
INC HL ;Увеличиваем HL на два. Теперь HL ука-
;зывает на длину и высоту спрайта. Вре-
;менно сохраняем.
PUSH HL
INC HL ;Увеличив HL еще на 2, мы получим адрес
;данных спрайта.
INC HL
LD (ADRSPR),HL ;В переменную заносим адрес данных
;спрайта.
POP HL ;Восстанавливаем HL.
LD C,(HL) ;В BC заносим длину и высоту.
INC HL
LD B,(HL)
LD (LENHGT),BC ;В переменную их.
RET ;Выход.
2
Ну вот, теперь Вы сможете ра-
ботать практически с любым ти-
пом заголовков. Основное разли-
чие между разными программами
формирования спрайтов состоит
именно в формате формируемого
ими заголовка. Мы рассмотрели
основные, и Вам не составит тру-
да переделать эти процедурки для
немного измененных типов заго-
ловков.