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

       

Правила игры



Рисунок 6.6. Правила игры

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

ORG 60000 ENT $ ; Задание адресов новых фонтов и постоянных атрибутов экрана LATF EQU 64000-256 RUSF EQU LATF+768 LD A,6 LD (23693),A LD A,0 CALL 8859 CALL 3435 LD A,2 CALL 5633 ; Ввод символа UDG для рисования фактуры LD HL,UDG LD (23675),HL ; Заполнение всего экрана фактурой CALL DESK ; Начало основной программы LD HL,RUSF LD (23606),HL NEW LD HL,TEXT CYCLE1 CALL PRINT LD B,10 CYCLE2 PUSH HL PUSH BC CALL SCR_UP CALL PAUSE POP BC POP HL JR Z,EXIT DJNZ CYCLE2 LD A,(HL) AND A JR NZ,CYCLE1 LD B,80 ;расстояние между текстами CYCLE3 PUSH BC CALL SCR_UP CALL PAUSE POP BC JR Z,EXIT DJNZ CYCLE3 JR NEW ; Восстановление стандартного набора символов и выход EXIT LD HL,15360 LD (23606),HL RET ; Для того, чтобы строки выводимого текста можно было успеть прочитать, ; в цикл вставлена подпрограмма задержки, а нажав клавишу Space, ; можно в любой момент завершить работу программы. PAUSE LD BC,6 CALL 7997 LD A,(23560) CP " " RET ; Подпрограмма печати строки текста PRINT PUSH BC LD DE,PAR LD BC,5 CALL 8252 LD B,24 ;число символов в строке PR_CI LD A,(HL) RST 16 INC HL DJNZ PR_CI POP BC RET PAR DEFB 22,15,4,16,0 ; Подпрограмма заполнения экрана фактурой DESK LD BC,704 LD A,#14 RST 16 LD A,1 RST 16 DESK1 LD A,144 RST 16 DEC BC LD A,B OR C JR NZ,DESK1 LD A,#14 RST 16 LD A,0 RST 16 ; Создание в фактуре окна для вывода текста CALL CLSV CALL SETV RET ; Подпрограммы

; Данные для окна с текстом COL1 DEFB 4 ROW1 DEFB 4 LEN1 DEFB 24 HGT1 DEFB 12 ATTR DEFB %01000010 ; Данные для окна в фактуре COL DEFB 3 ROW DEFB 3 LEN DEFB 26 HGT DEFB 13 ; Данные для выводимого в окно текста TEXT DEFM "····P·I·R·A·M·I·D·A·····" DEFM "························" DEFM "Celx igry sostoit w tom," DEFM "~toby··perwym··postawitx" DEFM "swoi··fi{ki··na··wer{inu" DEFM "piramidy. Dlq |togo nuv-" DEFM "no ispolxzowatx gorizon-" DEFM "talxnye··i··wertikalxnye" DEFM "peredwiveniq fi{ek,krome" DEFM "togo,velatelxno wospolx-" DEFM "zowatxsq··dopolnitelxny-" DEFM "mi prodwiveniqmi,···sutx" DEFM "kotoryh··sostoit··w tom," DEFM "~toby sostawitx fi{ki··w" DEFM "wide treugolxnika, posle" DEFM "~ego sdelatx hod werhnej" ; При желании текст можно продолжить DEFB 0 ; Данные для фактуры вокруг окна UDG DEFB 248,116,34,71,143,7,34,113

Два вида горизонтального скроллинга продемонстрируем на примере еще одной программы, где эти процедуры действуют одновременно. Сразу после запуска программа создает на экране фрагмент средневекового замка из красного кирпича с зубчатыми стенами и бойницами, а в средней его части - ажурные ворота. До тех пор, пока никакая клавиша не нажата, изображение неподвижно. После нажатия любой из них створки ворот начинают медленно расходиться в разные стороны (Рисунок  6.7), создавая совершенно бесподобный эффект.


Несколько слов о самой программе. Как вы заметили, здесь впервые встретилась директива ассемблера EQU (Equal - равный), которая служит для определения констант. Эта директива обязательно должна располагаться следом за какой-нибудь меткой, и именно этой метке в результате будет присвоено значение выражения после EQU. Таким образом, метка LATF в нашей программе становится численно равной адресу размещения латинского шрифта, уменьшенного на 256, то есть 63744, а метка RUSF принимает значение 64512.

Директиву EQU особенно удобно использовать в тех случаях, когда какая-либо постоянная величина многократно встречается в тексте программы. Если во время отладки ее потребуется изменить, то не нужно будет редактировать множество строк, достаточно будет лишь скорректировать выражение после EQU.

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

ENDTXT EQU TEXT+LENTXT

то все они (в данном случае TEXT, и LENTXT) должны быть определены в программе до строки EQU, иначе ассемблер не сможет вычислить значение выражения и выдаст сообщение об ошибке.

Использование констант LATF и RUSF в программе «Правила игры» позволяет легко изменить при желании адреса загрузки шрифтов, а «включение» того или иного набора в тексте программы становится более наглядным. Эти «переключения» выполняют строки

LD HL,LATF LD (23606),HL

или

LD HL,RUSF LD (23606),HL

Здесь число 23606 - адрес системной переменной CHARS, которая указывает местоположение в памяти текущего символьного набора. Напомним, что для «включения» нового фонта необходимо прежде уменьшить его адрес на 256, а затем записать два байта полученного числа в ячейки 23606 и 23607 (младший байт, как всегда, на первом месте).

Возможно, вам не совсем понятно, зачем нужно уменьшать адрес загрузки шрифта на 256 перед занесением его в системную переменную CHARS, поэтому поясним, отчего так происходит. Назвав новые наборы символов полными, мы слегка погрешили против истины, так как на самом деле полный набор должен включать все коды от 0 до 255. Мы же пользуемся только «печатными» символами, имеющими коды от 32 до 127 включительно, то есть первые 32 символа оказываются как бы «выброшенными». Каждый символ занимает в памяти 8 байт, поэтому «реальный» адрес размещения фонта и будет равен адресу загрузки нового набора минус 32ґ8=256 байт. (Вообще говоря, в недрах подпрограммы печати символов из ПЗУ скрывается операция, вновь увеличивающая значение адреса на 256, но этот «тонкий» ход остается на совести разработчиков интерпретатора Бейсика для Speccy Примеч. ред.)


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