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

       

Цепочка окон



Рисунок 5.5. Цепочка окон

Программа состоит из двух основных частей. На первом этапе из блока данных считываются параметры окон и выполняются уже известные процедуры CLSV и SETV. В конце блока данных установлен байт со значением -1 (255), при считывании которого программа переходит ко второму этапу - формированию «бегущей строки». Такое решение позволяет легко изменять не только размеры, цвет и местоположение окон, но и добавлять другие или убирать лишние, что особенно важно при отладке программы. Текст «бегущей строки» дан в формате ASCIIZ, и это также дает возможность как угодно изменять его без коррекций в самой программе.

Несмотря на довольно большой размер программы, в ней не встретится никаких неизвестных команд, поэтому приводим ее текст лишь с краткими комментариями:

ORG 60000 ENT $ CALL SETSCR

; Вывод последовательности окон LD HL,COORD ;адрес блока данных параметров окон PW1 LD A,(HL) ;последовательное считывание параметров CP -1 ;проверка достижения конца блока данных JR Z,PW2 ;если да, переходим ко второму этапу INC HL LD (COL),A LD A,(HL) INC HL LD (ROW),A LD A,(HL) INC HL LD (LEN),A LD A,(HL) INC HL LD (HGT),A LD A,(HL) ;последний параметр - цвет окна INC HL RLCA ;сдвигаем на место атрибута PAPER RLCA RLCA OR 7 ;добавляем цвет INK 7 LD (ATTR),A PUSH HL PUSH BC XOR A OUT (254),A ;получаем «щелчок» LD BC,5 CALL 7997 ;PAUSE 5 LD A,16 OUT (254),A CALL CLSV ;вывод окна CALL SETV POP BC POP HL JR PW1 ;переход к следующему окну PW2 LD A,6 LD (23695),A ;устанавливаем временные атрибуты LD BC,#8780 ;B = 135, C = 128 LD HL,#3848 ;H = 56, L = 72 CALL BOX_0 ;прямоугольник вокруг последнего окна ; «Бегущая строка» в последнем окне LD HL,TEXT ;адрес текста «бегущей строки» PW3 LD A,22 ;AT 8,24 RST 16 LD A,8 RST 16 LD A,24 RST 16 LD A,16 ;INK 0 RST 16 XOR A RST 16 LD A,(HL) ;считываем очередной символ AND A ;дошли до конца? RET Z ;если да, то завершаем программу RST 16 ;выводим считанный символ на экран INC HL LD B,8 ;сдвигаем строку на 8 пикселей влево PW4 PUSH BC PUSH HL CALL SCROL ;скроллинг строки на 1 пиксель влево LD BC,1 CALL 7997 ;PAUSE 1 POP HL POP BC DJNZ PW4 JR PW3 ;переходим к выводу следующего символа SCROL LD HL,18448+8 ;заранее рассчитанный адрес экрана ; конца «бегущей строки» LD C,8 SCROL1 LD B,8 AND A PUSH HL SCROL2 RL (HL) DEC HL DJNZ SCROL2 POP HL INC H DEC C JR NZ,SCROL1 RET


COL DEFB 0 ROW DEFB 0 LEN DEFB 0 HGT DEFB 0 ATTR DEFB 0 ; Данные для всех окон. Параметры записаны в таком порядке: ; COL, ROW, LEN, HGT и последнее число - код цвета окна (PAPER) COORD DEFB 27,11,4,4,7 DEFB 26,12,4,4,4 DEFB 24,13,4,4,1 DEFB 23,15,4,4,2 DEFB 21,17,5,3,3 DEFB 19,18,5,3,5 DEFB 17,20,4,2,6 DEFB 14,21,4,2,2 DEFB 12,19,3,3,7 DEFB 10,18,3,3,1 DEFB 9,17,3,3,4 DEFB 7,15,4,4,3 DEFB 5,13,4,4,2 DEFB 4,12,4,4,5 DEFB 3,11,4,4,6 DEFB 1,8,5,5,1 DEFB 2,5,5,5,7 DEFB 3,4,5,5,2 DEFB 4,3,5,5,5 DEFB 6,2,5,5,3 DEFB 8,1,8,5,4 DEFB 11,0,6,5,6 DEFB 13,1,6,6,1 DEFB 15,3,7,6,3 DEFB 16,5,9,7,6 ; «Закрашивание» последнего окна DEFB 20,8,1,1,0 DEFB 19,7,3,3,0 DEFB 18,6,5,5,0 DEFB 17,6,7,5,0 DEFB 16,5,9,7,0 DEFB 255 ;------------------- TEXT DEFM "Sinclair Research Ltd. 1982" DEFM "······Program··W·I·N·D·O·W" DEFM "··*·Saint-Petersburg··1994··*" DEFM "·········" DEFB 0


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