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

         

МНОГОКАДРОВАЯ ЗАСТАВКА



МНОГОКАДРОВАЯ ЗАСТАВКА

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

Что касается окон, то в принципе этот вопрос нами уже решен и можно было бы к нему вновь не возвращаться. Однако использование подпрограмм, работающих с окнами в том виде, в котором мы их предложили ранее, не всегда удобно. Если все параметры окон фиксированы, то нелепо каждый раз переопределять переменные ROW, COL и иже с ними. Лучше составить блоки данных, содержащие сведения о размерах, местоположении и всех прочих характеристиках, а затем выполнять любые преобразования окон, передавая подпрограммам единственное значение - адрес таблицы параметров (то бишь блока данных).

В начале книги мы говорили о существовании такой группы регистров, как индексные. Группа эта немногочисленна и включает в себя лишь два регистра: IX и IY. Как мы уже сообщали, оба они состоят из 16 бит и разделить их на половинки «законными» методами невозможно, поэтому они обычно рассматриваются не как регистровые пары, а как отдельные регистры.

Но для каких целей они существуют, в каких ситуациях их удобно применять и в каких группах команд они могут встречаться? Обычно эти регистры используются при обработке массивов, блоков данных или таблиц, а употребляются они практически во всех типах команд, в которых может принимать участие регистровая пара HL. За более подробной информацией на этот счет можете обратиться к , где в алфавитном порядке приведены все команды микропроцессора.



Рисунок 6.9. Многокадровая заставка

MENU CALL 3435 LD A,2 CALL 5633 LD DE,TEXT5 LD BC,ENDTXT-TEXT5 CALL 8252 ;«Select options 0 to 4» LD IX,WIN0 ;окно для названия игры CALL CLSW CALL SETW CALL BOX

В сформированном окне напечатаем название игры FOOTBALL, для чего используем расширенные подпрограммой буквы.

LD DE,COORD ;позиционирование курсора LD BC,TEXT-COORD CALL 8252 LD HL,TEXT ;вывод названия игры LD B,8 MET LD A,(HL) PUSH HL PUSH BC CALL DBLSYM POP BC POP HL INC HL DJNZ MET

Сделаем для меню окно с черной тенью и поместим в него текст, в соответствии с которым вы можете обратиться к одному из четырех кадров, нажав клавиши 1-4, или начать игру, выбрав клавишу 0 (для упрощения программы нажатие 0 или 4 возвращает вас в редактор GENS4 или в Бейсик).

LD IX,WIN1 ;окно основного меню CALL WINDOW LD DE,TEXT1 ;текст меню LD BC,TEXT2-TEXT1 CALL 8252

Теперь можно написать блок управления, который, как ни странно, выглядит довольно простым. Программка «крутится» в цикле, пока не нажата одна из указанных в кавычках клавиш. При нажатии же на клавишу, команда сравнения CP изменит биты флагового регистра (в частности флаг Z установится в ноль), после чего следующая команда JR Z,KADR? осуществит переход на выбранный вами кадр.

XOR A LD (23560),A CYCLE LD A,(23560) CP "1" JR Z,KADR1 CP "2" JR Z,KADR2 CP "3" JR Z,KADR3 CP "4" JR Z,EXIT CP "0" JR NZ,CYCLE ; При нажатии на клавиши 0 или 4 восстанавливаются атрибуты экрана и стандартный ; набор символов, после чего происходит выход в редактор GENS или в Бейсик. EXIT LD A,7 CALL 8859 ;белый бордюр LD A,%00111000 ;стандартные атрибуты LD (23693),A CALL 3435 LD A,2 CALL 5633 LD HL,15360 LD (23606),HL RET

Части программы, формирующие окна кадров и печатающие в них тексты, исключительно похожи друг на друга. Тем не менее, имеются и некоторые отличия, которые определяются конкретными данными для окон и текстов. Каждый из кадров начинается со звукового сигнала SND, о котором мы говорили в начале этой главы и заканчивается процедурой WAIT, которая фиксирует кадр на экране, позволяя увидеть его содержание и выбрать дальнейшие действия (в этой программе чисто умозрительно, за исключением клавиши Е, которая действительно возвращает вас в меню).






Известно, что в Бейсике к любому элементу массива можно обратиться по индексу, например, оператор LET b=a(8) присвоит переменной b значение 8-го элемента массива a(). В ассемблере подобная запись может выглядеть так:

LD B,(IX+7)

Обратите внимание, что первый элемент массива имеет индекс 0, а не 1. В отличие от массивов Бейсика, максимальный индекс у регистров IX и IY не может превышать 127, но зато допускаются отрицательные значения номера элемента массива. Таким образом, общий размер адресуемой области составляет 256 байтовых элементов, а индексный регистр указывает на его «середину».

Реальным примером большой структуры данных могут служить системные переменные Бейсика. Обычно они адресуются регистром IY, который указывает на переменную ERR_NR, находящуюся по адресу 23610. Кстати, именно в связи с этим регистр IY лучше оставить в покое и никак не изменять его в своих программах, по крайней мере, до тех пор, пока вы так или иначе используете операционную систему компьютера. Что касается регистра IX, то им вы можете смело пользоваться при любых обстоятельствах.

Наверное, лучше всего объяснить идею применения индексных регистров на конкретном примере. В качестве такого примера приведем уже знакомые вам процедуры очистки окон и установки в них постоянных атрибутов (тем более, что они понадобятся при составлении программы многокадровой заставки), но графические переменные заменим единой структурой, первый элемент которой адресуем через IX. Саму же структуру оставим без изменения, то есть на первом месте (по смещению 0, задаваемом как IX+0 или просто IX) по-прежнему будет находиться параметр COL, на втором (задаваемом как IX+1) - ROW, дальше LEN, HGT и ATTR. А чтобы новые процедуры отличить от описанных выше, изменим их имена на SETW и CLSW:

SETW LD DE,#5800 LD B,(IX+3) ;HGT LD C,(IX+2) ;LEN LD A,(IX+1) ;ROW LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,DE LD A,L ADD A,(IX) ;COL LD L,A LD A,(IX+4) ;ATTR SETW1 PUSH BC PUSH HL SETW2 LD (HL),A INC HL DEC C JR NZ,SETW2 POP HL POP BC LD DE,32 ADD HL,DE DJNZ SETW1 RET ; ----------------- CLSW LD B,(IX+3) ;HGT LD C,(IX+2) ;LEN LD A,(IX+1) ;ROW CLSW1 PUSH AF PUSH BC PUSH DE CALL 3742 POP DE LD A,L ADD A,(IX) ;COL LD L,A LD B,8 CLSW2 PUSH HL PUSH BC LD B,C CLSW3 LD (HL),0 INC HL DJNZ CLSW3 POP BC POP HL INC H DJNZ CLSW2 POP BC POP AF INC A DJNZ CLSW1 RET



KADR1 CALL SND ;звуковой сигнал LD IX,WIN2 CALL WINDOW ;вывод окна LD DE,TEXT2 ;текст в окне LD BC,TEXT3- TEXT2 CALL 8252 CALL WAIT ;ожидание нажатия клавиши E

JP MENU ;возврат в меню ; Формирование окна Кадра 2 и печать в нем текста KADR2 CALL SND LD IX,WIN3 CALL WINDOW LD DE,TEXT3 LD BC,TEXT4-TEXT3 CALL 8252 CALL WAIT JP MENU ; Формирование окна Кадра 3 и печать в нем текста KADR3 CALL SND LD IX,WIN4 CALL WINDOW LD DE,TEXT4 LD BC,TEXT5-TEXT4 CALL 8252 CALL WAIT JP MENU ; Подпрограмма ожидания нажатия клавиши E

WAIT XOR A LD (23560),A WAIT1 LD A,(23560) CP "E" RET Z CP "e" JR NZ,WAIT1 RET SND LD B,10 LD HL,350 LD DE,4

; Данные для формирования окна с названием игры

; Данные для формирования всех окон с тенями

; Данные для печати названия игры COORD DEFB 22,1,8,16,6,19,1 TEXT DEFM "FOOTBALL" ; Данные для печати текста Меню TEXT1 DEFB 22,7,13,16,7,17,2,19,1 DEFM "M E N U" DEFB 22,9,9 DEFM "0. START··GAME" DEFB 22,11,9 DEFM "1. KEYBOARD" DEFB 22,13,9 DEFM "2. JOYSTICK" DEFB 22,15,9 DEFM "3. HI··SCORE" DEFB 22,17,9 DEFM "4. DEMO MODE" ; Данные для печати текста Кадра 1 TEXT2 DEFB 22,6,14,17,3,16,1 DEFM "Define keys" DEFB 22,8,15 DEFM "LEFT....O" DEFB 22,10,15 DEFM "RIGHT...P" DEFB 22,12,15 DEFM "UP......Q" DEFB 22,14,15 DEFM "DOWN....A" DEFB 22,16,15 DEFM "FIRE....M" DEFB 22,18,16 DEFM "MENU--E" ; Данные для печати текста Кадра 2 TEXT3 DEFB 22,10,16,17,5,16,0 DEFM "Joystick" DEFB 22,12,14 DEFM "1. KEMPSTON" DEFB 22,14,14 DEFM "2. SINCLAIR" DEFB 22,16,14 DEFM "3. CURSOR" DEFB 22,18,16 DEFM "MENU--E" ; Данные для печати текста Кадра 3 TEXT4 DEFB 22,7,8,17,6,16,1 DEFM "Hi score" DEFB 22,8,7 DEFM "PETR...726" DEFB 22,10,7 DEFM "IGOR...694" DEFB 22,12,7 DEFM "ALEX...605" DEFB 22,14,7 DEFM "SERG...523" DEFB 22,16,7 DEFM "WLAD...419" DEFB 22,18,8 DEFM "MENU--E" ; Данные для текста под заставкой TEXT5 DEFB 22,21,6,16,7,17,4,19,0 DEFM "Select options 0 to 4" ENDTXT


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