Как написать игру для 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




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