ПОДГОТОВКА ДАННЫХ ДЛЯ ПЕЧАТИ Перед тем как напечатать спрайт на экране, мы должны под- готовить для этого необходимые данные, дабы при печати не от- влекаться на эти детали. Давайте выделим несколько пе- ременных, в которых у нас будут храниться данные: 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 Ну вот, теперь Вы сможете ра- ботать практически с любым ти- пом заголовков. Основное разли- чие между разными программами формирования спрайтов состоит именно в формате формируемого ими заголовка. Мы рассмотрели основные, и Вам не составит тру- да переделать эти процедурки для немного измененных типов заго- ловков.