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


         

БЫСТРЫЙ ВЫВОД СПРАЙТОВ - часть 5


1-й байт - относительная вертикальная координата данного знакоместа в спрайте;

2-й байт - относительная горизонтальная координата данного знакоместа в спрайте;

3-й байт - суммарные атрибуты знакоместа.

Таким образом, можно составить примерно такой заголовок:

SPRITE DEFB 7 DEFB 0,2,15 DEFB 1,0,6, 1,1,6, 1,2,6, 1,3,6 DEFB 2,1,6, 2,2,6

Вторую часть блока данных составляют уже знакомые вам описания пикселей знакомест (по 8 байт на каждое), причем они должны быть перечислены в том порядке, в котором указаны в заголовке, например (всего должно быть 7 строк - по количеству символов, входящих в спрайт):

DEFB 33,39,62,255,0,127,127,127 DEFB 246,73,146,255,0,11,222,251 ................................ DEFB 35,216,225,228,3,16,148,35

Теперь разберемся с числовыми параметрами, необходимыми для вывода спрайта. Перед обращением к процедуре вывода, которую мы назвали PTBL, в регистре B нужно задать верхнюю границу описывающего прямоугольника (ROW), в C - левую границу описывающего прямоугольника (COL), в HL - адрес блока данных спрайта (метка SPRITE), а в аккумуляторе - код команды, определяющей способ вывода спрайтов, который в самом начале работы процедуры будет вставлен в основной цикл вывода и тем самым вместо составления четырех похожих друг на друга подпрограмм можно пользоваться одной. Для обычного вывода с замещением предыдущего изображения нужно задать команду NOP - отсутствие операции, которая кодируется байтом 0; для осуществления вывода по принципу OR, AND или XOR необходимо вставить в процедуру команды OR (HL), AND (HL) или XOR (HL), имеющие коды #B6, #A6 и #AE соответственно. Чтобы не держать в голове все эти коды, имеет смысл определить их как константы с помощью директивы EQU и присвоить им удобочитаемые имена:

    SPRPUT - вывод с уничтожением предыдущего изображения;

    SPROR - вывод по принципу OR;

    SPRAND - вывод по принципу AND;

    SPRXOR - вывод по принципу XOR.

В данном примере вновь применена команда EX (SP),HL, но здесь вершину стека можно рассматривать в качестве временной переменной, и такой прием может быть рассмотрен как один из способов борьбы с нехваткой регистров.




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