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


         

Окна в игре MICRONAUT ONE - часть 2


Эта подпрограмма только очищает окно, но никак не влияет на его цвет. Для изменения атрибутов нужна другая процедура, которую назовем SETV. Здесь нам потребуется дополнительная переменная для хранения байта атрибутов, которую нужно определить в программе строкой

ATTR DEFB 0

и перед обращением к подпрограмме SETV занести в нее необходимое значение.

Прежде чем привести текст подпрограммы, скажем несколько слов о способе расчета требуемого адреса в области атрибутов экрана. Эта задача намного проще определения адреса в области данных, так как атрибуты имеют линейную организацию. Поэтому достаточно номер строки экрана умножить на 32, то есть на длину полной строки экрана, добавить величину смещения от левого края (горизонтальную позицию интересующего знакоместа) и полученную величину сложить с адресом начала области атрибутов. Наиболее сложным моментом расчетов может показаться операция умножения и это было бы действительно так, не будь один из сомножителей числом, равным степени 2, что позволяет свести задачу к простому сложению.

Вот текст подпрограммы, выполняющей установку атрибутов в окне экрана:

SETV LD DE,#5800 ;адрес начала области атрибутов экрана LD BC,(LEN) ;C = LEN, B = HGT LD A,(ROW) LD L,A ;расчет адреса левого верхнего угла окна LD H,0 ; в области атрибутов экрана ADD HL,HL ;умножаем на 32 (2 в 5-ой степени) ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,DE ;полученное смещение складываем ; с началом области атрибутов LD A,(COL) ;добавляем горизонтальное смещение окна ADD A,L LD L,A LD A,(ATTR) ;в аккумуляторе байт атрибутов SETV1 PUSH BC PUSH HL SETV2 LD (HL),A ;помещаем в видеобуфер INC HL DEC C ;до правого края окна JR NZ,SETV2 POP HL POP BC LD DE,32 ;переходим к следующей строке ADD HL,DE ; (длина строки 32 знакоместа) DJNZ SETV1 ;повторяем, пока не дойдем до нижнего ; края окна RET

Еще одним довольно распространенным видом преобразований, выполняемых с окнами, является инвертирование изображения. Подпрограмма, реализующая это действие очень похожа на процедуру очистки окна, только в этом случае байт данных из видеобуфера инвертируется в аккумуляторе и затем помещается обратно на свое место. Как вы знаете, инверсия - это изменение состояния битов на противоположное: если бит установлен, он сбрасывается и наоборот. Такую операцию можно выполнить, например, с помощью команды




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