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


         

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


Довольно часто в игровых программах применяется зеркальное отображение окон. Подобная процедура имеется и в Laser Basic'е. Ее выполняет оператор .MIRV, поэтому и нашу подпрограмму мы назовем так же. Перед обращением к ней, как и во всех предшествующих процедурах необходимо определить переменные ROW, COL, HGT и LEN с теми же ограничениями, о которых мы уже говорили.

MIRV LD BC,(LEN) LD A,(ROW) MIRV1 PUSH AF PUSH BC CALL 3742 ;в HL - адрес экрана LD A,(COL) OR L LD L,A ;начальный адрес левого края окна ; В DE получаем соответствующий адрес противоположного края окна LD D,H LD A,C ADD A,L DEC A LD E,A LD B,8 ;8 рядов пикселей MIRV2 PUSH DE PUSH HL PUSH BC SRL C ;делим ширину окна на 2 JR NC,MIRV3 ;продолжаем, если разделилось без остатка INC C ;иначе увеличиваем счетчик на 1 MIRV3 LD A,(HL) ;получаем байт с левой стороны CALL MIRV0 ;зеркально отображаем его PUSH BC ;запоминаем его LD A,(DE) ;берем байт с правой стороны CALL MIRV0 ;отображаем POP AF ;восстанавливаем предыдущий байт ; в аккумуляторе LD (HL),B ;записываем «правый» байт ; на левую сторону окна LD (DE),A ; и наоборот INC HL ;приближаемся с двух сторон DEC DE ; к середине окна DEC C JR NZ,MIRV3 ;повторяем, если еще не дошли до середины POP BC POP HL POP DE INC H ;переходим к следующему ряду пикселей INC D DJNZ MIRV2 POP BC POP AF INC A ;переходим к следующей строке экрана DJNZ MIRV1 RET ; Подпрограмма зеркального отображения байта в аккумуляторе MIRV0 RLA RR B ;отображенный байт получится в B RLA RR B RLA RR B RLA RR B RLA RR B RLA RR B RLA RR B RLA RR B RET

В этой процедуре применены уже достаточно сложные средства, о которых стоит поговорить особо. Ядром ее является внутренняя подпрограмма MIRV0, которая переворачивает байт: 7-й бит переходит в 0-й, 6-й - в 1-й и т. д. Исходный байт на входе в нее помещается в аккумулятор, а «перевернутый» получаем на выходе в регистре B. Поясним, как это происходит. После выполнения команды RLA биты аккумулятора сдвигаются влево и вытесняемый бит переходит во флаг переноса, который используется в качестве пересылочного буфера. При выполнении же команды RR B бит из флага переноса попадает в младший бит регистра B и на следующих этапах постепенно перемещается к левому краю, то есть в сторону старшего бита. После выполнения восьми пар команд сдвигов все биты из аккумулятора перейдут в регистр B, но окажутся записанными в обратном, «зеркальном» порядке. Добавим, что вместо команд




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