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

         

Динамическое окно


Продемонстрируем использование подпрограмм CLSV и SETV на примере довольно часто используемого способа вывода окна: оно появляется не внезапно, а как бы выплывает на поверхность экрана или приближается издалека. При этом изменяются не только размеры окна, но и его цвет.

Универсальная программа, создающая таким способом окно любого размера и в произвольном месте экрана, потребует достаточно сложных вычислений с привлечением не только операций сложения и умножения, но и деления. Поэтому, чтобы упростить задачу, напишем программу для конкретного окна. А чтобы вы могли лучше понять, как она работает, сначала сделаем ее в Laser Basic'е и только потом перепишем на ассемблере:

10 INK 5: PAPER 0: BORDER 0: CLS 20 FOR n=7 TO 1 STEP -1 30 LET m=7-n 40 .ROW=5+n:.COL=2+2*n 50 .HGT=2+2*m:.LEN=1+4*m 60 LET attr=8*n+64: POKE 23693,attr 70 .CLSV:.SETV 80 NEXT n

После этого можно обвести окно рамкой, а внутри что-нибудь написать, но это мы уже сделаем в ассемблерной программе.

Поскольку рамки вокруг окон рисуются довольно часто, прежде чем привести текст программы, напишем универсальную процедуру, выводящую в выбранном месте экрана прямоугольник произвольного размера. Этой процедурой мы еще воспользуемся впоследствии, поэтому ее также желательно иметь в отдельном библиотечном файле. Перед обращением к ней в регистрах B и C нужно задать координаты верхнего левого угла прямоугольника соответственно по вертикали и горизонтали, а в H и L - его высоту и ширину. Поскольку позже мы предложим более быстродействующую процедуру, то чтобы не возникло путаницы с именами, назовем ее BOX_0, а в имени другой процедуры изменим индекс.

BOX_0 PUSH HL CALL 8933 ;PLOT - верхний левый угол POP BC PUSH BC LD DE,#101 ;верхняя линия LD B,0 CALL 9402 ;DRAW POP BC PUSH BC LD D,-1 ;правая линия LD C,0 CALL 9402 POP BC PUSH BC LD E,-1 ;нижняя линия LD B,0 CALL 9402 POP BC LD DE,#101 ;левая линия LD C,0 CALL 9402 LD HL,10072 EXX RET

Если в приведенной процедуре вам что-нибудь не совсем ясно, вернитесь к четвертой главе и еще раз просмотрите раздел .


Используя подготовленные процедуры, можно написать программу «всплывающего» окна:

ORG 60000 ENT $ CALL SETSCR ;подготовка экрана DYNW LD B,7 DYNW1 LD A,7 ;вычисление промежуточной переменной ; для расчета размеров окна SUB B LD C,A LD A,B ;расчет переменной ROW ADD A,5 LD (ROW),A LD A,B ;расчет переменной COL ADD A,A ADD A,2 LD (COL),A LD A,C ;расчет переменной HGT ADD A,A ADD A,2 LD (HGT),A LD A,C ;расчет переменной LEN ADD A,A ADD A,A INC A LD (LEN),A LD A,B ;расчет байта атрибутов RLCA RLCA RLCA OR %01000000 ;64 - повышенная яркость LD (ATTR),A PUSH BC LD BC,3 CALL 7997 ;небольшая задержка перед выводом окна CALL CLSV ;очистка окна CALL SETV ;установка атрибутов окна POP BC DJNZ DYNW1 LD DE,D_ATTR ;установка атрибутов линий рамки LD BC,6 CALL 8252 LD BC,#7625 ;B = 118, C = 37 LD HL,#5EBE ;H = 94, L = 190 CALL BOX_0 ;рамка вокруг окна LD DE,TEXT LD BC,END-TEXT JP 8252 ;печать текста в окне

COL DEFB 0 ROW DEFB 0 LEN DEFB 0 HGT DEFB 0 ATTR DEFB 0 D_ATTR DEFB 16,0,17,1,19,1 TEXT DEFB 22,9,12,16,6,17,1,19,1 DEFM "Program" DEFB 22,11,8,16,4 DEFM "DYNAMIC··WINDOW" DEFB 22,15,8,16,5 DEFM "Saint-Petersburg" DEFB 22,17,14,16,3 DEFM "1994" END


Содержание раздела







Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий