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


         

однако микропроцессор имеет для этих


XOR 255

однако микропроцессор имеет для этих целей специальную инструкцию CPL, которая и выполняется быстрее и занимает в памяти всего один байт. Ею мы и воспользуемся в подпрограмме INVV:

INVV LD BC,(LEN) LD A,(ROW) INVV1 PUSH AF PUSH BC CALL 3742 LD A,(COL) ADD A,L LD L,A LD B,8 INVV2 PUSH HL LD E,C INVV3 LD A,(HL) ;читаем байт из видеобуфера CPL ;инвертируем байт в аккумуляторе LD (HL),A ;возвращаем обратно в видеобуфер INC HL DEC E JR NZ,INVV3 POP HL INC H DJNZ INVV2 POP BC POP AF INC A DJNZ INVV1 RET

Поскольку здесь говорится об окнах, задаваемых с точностью до знакоместа, есть возможность несколько ускорить процедуру инвертирования изображения, что может оказаться существенным при работе с большой площадью экрана. Ведь вместо того, чтобы инвертировать каждый байт данных, можно просто поменять местами цвета INK и PAPER в области атрибутов и вместо восьми байт для каждого знакоместа обрабатывать только один. Для успешного решения этой задачи еще раз напомним значения битов в байте атрибутов: биты 0, 1 и 2 отвечают за цвет «чернил» INK, биты 3, 4 и 5 определяют цвет «бумаги» PAPER, 6-й бит задает уровень яркости BRIGHT, а старший 7-й бит включает или выключает мерцание FLASH.

Вот эта подпрограмма:

INVA LD DE,#5800 ;начало как в процедуре SETV LD BC,(LEN) LD A,(ROW) LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,DE LD A,(COL) ADD A,L LD L,A INVA1 PUSH BC PUSH HL INVA2 LD A,%11000000 ;маскируем 2 старших бита атрибутов, ; которые не будут изменяться AND (HL) ;выделяем их из суммарных атрибутов LD B,A ;запоминаем их в регистре B LD A,%00111000 ;маскируем биты для цвета PAPER AND (HL) ;выделяем их RRCA ;сдвигаем на место битов цвета INK RRCA RRCA OR B ;объединяем с выделенными ранее битами LD B,A ;снова запоминаем LD A,%00000111 ;маскируем биты для цвета INK AND (HL) ;выделяем их RLCA ;сдвигаем на место битов цвета PAPER RLCA RLCA OR B ;объединяем все атрибуты LD (HL),A ;возвращаем их в видеобуфер INC HL DEC C JR NZ,INVA2 POP HL POP BC LD DE,32 ADD HL,DE DJNZ INVA1 RET


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