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

       

Элементы углов рамки



Рисунок 4.2. Элементы углов рамки

Для упрощения кодирования мы можем предложить простую сервисную программку на Бейсике, перед использованием которой следует создать полный набор символов, прибегнув к помощи одного из редакторов фонтов (например, из Art Studio). Но не обязательно все символы будут взяты из полученного шрифта, например, в нашей программе заставки их использовано только16. Вот текст кодировщика символов (в дальнейшем везде, где в программах потребуется ввести более одного пробела подряд, для наглядности будем обозначать их символом «·».):

10 BORDER 0: PAPER 0: INK 5: CLEAR 64255 30 INPUT "Font file name:"; LINE a$ 40 LOAD a$CODE 64256 50 INPUT "start symbol:"; LINE a$ 60 CLS : PRINT AT 15,0; INK 6;"'E' - to exit" 70 LET a$=a$(1) 80 LET start=64256+((CODE a$)-32)*8 90 LET s=CODE a$: LET c=0 100 GO TO 110 110 FOR m=start TO 64256+768 120 LET a=PEEK m: LET byte=a 130 LET c=c+1 140 DIM b(8) 150 FOR n=1 TO 8 160 LET a=a/2: LET b(n)=a<>INT a: LET a=INT a 170 NEXT n 180 PRINT AT 2,1; INK 2;"Symbol: "; INK 7; PAPER 1;CHR$ s; PAPER 0; INK 2;" Code: "; INK 7;s 190 FOR n=1 TO 8 200 IF b(n)=0 THEN PAPER 1 210 IF b(n)=1 THEN PAPER 6 220 PRINT AT c+3,9-n;" " 230 NEXT n 240 PAPER 0: PRINT AT c+3,10;byte;"··" 250 IF c>7 THEN LET c=0: LET s=s+1: GO TO 270 260 NEXT m 270 REM ----Если нажата клавиша E---- 280 LET k$=INKEY$ 290 IF k$="E" OR k$="e" THEN BEEP .01,0: GO TO 50 300 IF k$<>"" THEN BEEP .01,20: GO TO 260 310 GO TO 280

Использование этой программы не вызовет никаких затруднений - достаточно отвечать на вопросы, появляющиеся на экране. Добавим только, что при работе с дисководом следует включить в программу строку

20 RANDOMIZE USR 15619: REM : CAT

а строку 40 заменить на такую:

40 RANDOMIZE USR 15619: REM : LOAD a$CODE 64256

Мы пропустим утомительный этап кодирования символов, в результате чего получится довольно длинный ряд цифр, которые запишем после инструкции DEFB и присвоим первому байту этого блока данных метку UDG:


UDG DEFB 0,63,64,95,95,95,95,95 ;A (144) DEFB 0,252,30,250,250,250,242,242 ;B (145) DEFB 95,95,127,127,124,96,63,0 ;C (146) DEFB 226,194,130,2,2,2,252,0 ;D (147) DEFB 0,63,0,95,107,95,107,95 ;E (148) DEFB 0,244,0,208,234,208,234,208 ;F (149) DEFB 107,95,107,95,107,0,63,0 ;G (150) DEFB 234,208,234,208,234,0,244,0 ;H (151) DEFB 107,95,107,95,107,95,107,95 ;I (152) DEFB 234,208,234,208,234,208,234,208 ;J (153) DEFB 0,31,85,74,95,74,95,95 ;K (154) DEFB 0,255,85,170,255,170,255,255 ;L (155) DEFB 95,95,85,74,21,64,21,0 ;M (156) DEFB 255,255,85,170,85,0,85,0 ;N (157) DEFB 0,248,82,170,250,170,250,250 ;O (158) DEFB 250,250,82,170,80,2,80,0 ;P (159)

В комментариях справа от каждой строки указаны клавиши, соответствующие символам, вводимым в режиме курсора [G], и их десятичные коды. Буквы выписаны, скорее, как воспоминание о Бейсике, а вот коды нам понадобятся при составлении следующего блока, так как в редакторе GENS нет возможности вводить символы UDG непосредственно с клавиатуры.

Для получения блока данных, описывающего внешний вид рамки, за неимением какого-либо специализированного редактора лучше всего «включить» полученный набор UDG и составить программу сначала на Бейсике. При таком способе не нужно будет после каждого введенного символа транслировать программу заново и проверять правильность ввода, достаточно дать команду RUN. Кроме того, в Бейсике вы застрахованы от возникновения таких критических ошибок, после которых всю работу нужно начинать сначала. В конце останется только переписать полученный блок уже в редакторе GENS, не опасаясь, что где-то закралась ошибка.

«Включить» новые символы UDG в ассемблере до смешного просто. В Бейсике для этого требуется прежде всего определить адрес размещения символов в памяти, затем в цикле последовательно считывать коды из блока данных и переносить их по рассчитанному адресу. В ассемблере же ничего никуда перемещать не требуется, достаточно изменить адрес области UDG в системных переменных. А выполняется это всего двумя командами микропроцессора:





LD HL,UDG LD (23675),HL

Мы избавим вас от неблагодарной работы по составлению блока данных для печати рамки и приведем его в уже готовом виде:

RAMKA DEFB 22,4,0,16,5 DEFB 144,145,154,155,155,155,155,155 DEFB 155,155,158,154,155,155,155,155 DEFB 155,155,155,155,158,154,155,155 DEFB 155,155,155,155,155,158,144,145 DEFB 146,147,16,4,156,157,157,157,157,157 DEFB 157,157,159,156,157,157,157,157 DEFB 157,157,157,157,159,156,157,157 DEFB 157,157,157,157,157,159,16,5,146,147

DEFB 16,5,148,16,4,149,22,6,30,16,5,148,16,4,149 DEFB 16,5,152,16,4,153,22,7,30,16,5,152,16,4,153 DEFB 16,5,152,16,4,153,22,8,30,16,5,152,16,4,153 DEFB 16,5,150,16,4,151,22,9,30,16,5,150,16,4,151

DEFB 16,5,148,16,4,149,22,10,30,16,5,148,16,4,149 DEFB 16,5,152,16,4,153,22,11,30,16,5,152,16,4,153 DEFB 16,5,152,16,4,153,22,12,30,16,5,152,16,4,153 DEFB 16,5,150,16,4,151,22,13,30,16,5,150,16,4,151

DEFB 16,5 DEFB 144,145,154,155,155,155,155,155 DEFB 155,155,158,154,155,155,155,155 DEFB 155,155,155,155,158,154,155,155 DEFB 155,155,155,155,155,158,144,145 DEFB 146,147,16,4,156,157,157,157,157,157 DEFB 157,157,159,156,157,157,157,157 DEFB 157,157,157,157,159,156,157,157 DEFB 157,157,157,157,157,159,16,5,146,147

Вы можете заметить, что кроме кодов символов UDG в блок данных включены также и управляющие коды, изменяющие цвет и позицию печати.

Значительно проще составить блок данных для печати текста заставки. Он будет выглядеть примерно так:

TEXT DEFB 22,2,8,16,6 DEFM "*" DEFB 22,2,10,16,3 DEFM "F I G H T E R" DEFB 22,2,24,16,6 DEFM "*" DEFB 22,7,10,16,7 DEFM "Written by :" DEFB 22,9,7 DEFM "Kapultsevich···Igor" DEFB 22,12,5 DEFM "Saint-Petersburg··1994" DEFB 22,17,3,16,6 DEFM "Press any··key to continue"

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



Ни в коем случае! Ведь ассемблер сам может выполнять некоторые несложные расчеты, оперируя как с числами, так и с метками. Расположим блоки данных в таком порядке: сначала блок TEXT, затем - RAMKA и самым последним запишем блок UDG. Таким образом, длина блока TEXT будет равна разности его конечного и начального адресов, а так как сразу за ним следует блок RAMKA, то его длина определяется выражением RAMKA-TEXT. (Обратите внимание на тот факт, что ассемблер может вычислять выражения с метками даже до того, как эти метки встретятся в программе. Именно для обеспечения таких «ссылок вперед» и необходим второй проход ассемблирования - Примеч. ред.) Аналогично длина блока RAMKA вычисляется выражением UDG-RAMKA.

Теперь можно написать программку, формирующую на экране статическую заставку:

ORG 60000 ENT $ ; Подготовка экрана LD A,5 LD (23693),A LD A,0 CALL 8859 CALL 3435 LD A,2 CALL 5633 ; «Включение» символов UDG LD HL,UDG LD (23675),HL ; Вывод заставки на экран LD DE,RAMKA LD BC,UDG-RAMKA CALL 8252 LD DE,TEXT LD BC,RAMKA-TEXT CALL 8252 RET ; Подготовленные заранее блоки данных ; --------------

; --------------

; --------------


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