Как написать игру для ZX Spectrum на ассемблере


         

Теперь следует сказать несколько слов


Теперь следует сказать несколько слов о построении блоков данных SPR1 и SPR2, поскольку они тесно связаны с подпрограммой PUT и их формат, естественно, должен быть согласован с ее работой. Опишем их структуру. Первый байт соответствует количеству фрагментов, входящих в спрайт (в нашем примере как для первого, так и для второго спрайта - это число 6). Далее следуют параметры для каждого фрагмента, занимающие по 4 байта:

1-й байт - относительная вертикальная координата данного знакоместа в спрайте; 2-й байт - относительная горизонтальная координата данного знакоместа в спрайте; 3-й байт - байт суммарных атрибутов знакоместа; 4-й байт - код символа соответствующего фрагмента спрайта.

Поскольку подпрограмма PUT нам потребуется не только в данном примере, сохраните ее в виде отдельного библиотечного файла. Она имеет следующий вид:

PUT LD E,(HL) ;считываем количество фрагментов спрайта PUT1 INC HL LD A,22 RST 16 LD A,B ;регистр B содержит координату ROW ADD A,(HL) ;прибавляем к ней относительную ; координату внутри спрайта RST 16 INC HL LD A,C ;в C - горизонтальная координата COL ADD A,(HL) ;складываем ее с относительной ; координатой, взятой из блока данных RST 16 INC HL LD A,(HL) ;считываем байт атрибутов знакоместа LD (23695),A INC HL LD A,(HL) ;берем код выводимого символа RST 16 DEC E JR NZ,PUT1 ;переходим к выводу следующего ; фрагмента RET

Перед вызовом этой процедуры необходимо в регистровой паре HL указать начальный адрес блока данных, соответствующего выводимому спрайту, а в регистрах B и C задать координаты экрана по вертикали и горизонтали.

Наконец соберем все части программы в единое целое, добавив несколько уже знакомых процедур, и напишем небольшую часть, управляющую движением человечка:

ORG 60000 ENT $ CALL SETSCR LD HL,UDG LD (23675),HL CALL FON CYCLE LD HL,SPR1 ;вывод спрайта 1 LD BC,#A0F ;B = 10, C = 15 CALL PUT CALL PAUSE ;небольшая задержка LD HL,SPR2 ;вывод спрайта 2 LD BC,#A0F CALL PUT CALL PAUSE ;снова задержка ; Выход из цикла при нажатии клавиши Space


Содержание  Назад  Вперед