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

       

Построение буквы «Д»



Рисунок 6.5. Построение буквы «Д»

10, 20 - в этих строках порция данных переписывается из строки 1160 в переменные, после чего они принимают значения: y=0, x=112, hgt=10, len=4, ink=6 и dx=-1.

30 - центровка названия.

40 - устанавливается цвет линий (желтый).

50 - начало цикла рисования фрагмента буквы.

60, 70 - рисуются подряд две горизонтальные линии (длиной по len=4пикселя).

80 - координаты y и x изменяются, после чего в этом же цикле выводится следующая пара линий, и так - 10 раз (hgt), в результате получится левый элемент буквы (Рисунок  6.5, б).

90 - после того, как hgt пар линий будет напечатано, переход на начало.

На следующем этапе построения буквы «Д» прочитывается вторая порция данных из строки 1170: y=0, x=112, hgt=10, len=10, ink=6, dx=1 и рисуется правая часть буквы (Рисунок  6.5, в), каждая линия которой составляет 10 пикселей. Наконец, на основании третьей порции (строка 1180): y=40, x=100, hgt=2, len=34, ink=6 и dx=0 ставятся две последние линии по 34 пикселя (Рисунок  6.5, г), завершающие построение буквы «Д».

После того как мы выяснили способ формирования каждой буквы средствами Бейсика, перейдем непосредственно к ассемблерной программе строка за строкой. Но прежде чем приступить к описанию текста, следует заметить, что к этому моменту мы наговорили вам довольно много всякого, поэтому небольшие по размерам программы нет смысла разбивать на отдельные части и подробно распространяться о каждой из них, как мы это делали в четвертой и пятой главах. Думается, что сейчас будет уже вполне достаточно прокомментировать отдельные команды и только в случаях, представляющих особый интерес, рассмотреть более детально некоторые группы команд.

ORG 60000 LD HL,DATA ; Считывание параметров из блока данных CICL1 LD B,(HL) ;Y-координата начала линии INC B RET Z ;выход, если это конец блока данных LD A,112 ;отсчитывать будем не снизу, а сверху. ; Кроме того, сразу добавляем смещение ; от верхнего края в 64 пикселя и ; увеличиваем на 1, поскольку выполнялась ; команда INC B (175-64+1=112) SUB B LD B,A INC HL LD A,(HL) ;X-координата начала линии ADD A,40 ;центрируем надпись LD C,A INC HL LD D,(HL) ;высота рисуемой части буквы INC HL LD E,(HL) ; и ее ширина INC HL LD A,16 ;управляющий код для INK RST 16 LD A,(HL) ;код цвета RST 16 INC HL LD A,(HL) ;наклон рисуемой части INC HL PUSH HL ;сохраняем текущий адрес в блоке данных ; Цикл рисования части буквы, описанной очередной порцией данных CICL2 PUSH AF ;сохраняем в стеке аккумулятор CALL DRAW ;чертим первую линию DEC B ;вторая линия будет на 1 пиксель ниже CALL DRAW ;чертим вторую линию DEC B ;переходим ниже DEC B ;пропускаем еще два ряда пикселей DEC B POP AF ;восстанавливаем в аккумуляторе ; параметр наклона PUSH AF ADD A,C ;смещаем X-координату для LD C,A ; получения наклона POP AF DEC D ;повторяем заданное параметром JR NZ,CICL2 ; «высота» количество раз POP HL ;восстанавливаем адрес в блоке данных JR CICL1 ;переходим на начало ; Подпрограмма рисования одной горизонтальной линии DRAW PUSH BC ;сохраняем нужные регистры PUSH DE ; в машинном стеке CALL 8933 ;ставим точку с координатами ; из регистров B и C POP DE ;регистр E нам понадобится, ; поэтому восстанавливаем PUSH DE ; и снова сохраняем EXX PUSH HL ;сохраняем регистровую пару HL' EXX LD C,E ;длина линии (горизонтальное смещение) LD B,0 ;вертикальное смещение - 0 (линия ; идет горизонтально) LD DE,#101 ;положительное значение ; для обоих смещений CALL 9402 ;рисуем линию EXX POP HL ;восстанавливаем регистры из стека EXX POP DE POP BC RET


; Блоки данных для рисования букв

; буква «Н» DATA DEFB 0,0,12,6,2,0 DEFB 20,6,2,14,2,0 DEFB 0,20,12,10,2,0 ; буква «А» DEFB 0,46,12,4,1,-1 DEFB 0,46,12,10,1,1 DEFB 24,42,2,16,1,0 ; буква «Р» DEFB 0,72,12,10,3,0 DEFB 0,82,2,13,3,0 DEFB 24,82,2,13,3,0 DEFB 4,96,1,2,3,0 DEFB 24,96,1,2,3,0 DEFB 8,92,4,8,3,0 ; буква «Д» DEFB 0,112,10,4,6,-1 DEFB 0,112,10,10,6,1 DEFB 40,100,2,34,6,0 ; буква «Ы» DEFB 0,139,12,10,4,0 DEFB 16,150,2,13,4,0 DEFB 40,150,2,13,4,0 DEFB 20,163,1,2,4,0 DEFB 40,163,1,2,4,0 DEFB 24,160,4,8,4,0 DEFB 0,167,4,8,4,0 DEFB 16,169,1,6,4,0 DEFB 20,171,6,4,4,0 DEFB 44,169,1,6,4,0 DEFB -1 ;указатель конца блока данных

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


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