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



         

Ввод имени играющего



Рисунок 8.1. Ввод имени играющего



Представим себе, что в конце игры необходимо набрать имя играющего, чтобы затем записать его в раздел меню HI SCORE. Для этого, при достижении определенных результатов, вызывается кадр, в котором вы видите примерно такую таблицу, какая изображена на Рисунок 8.1. Далее, управляя курсором с помощью клавиш Q, A, O и P, требуется выбрать из таблицы буквы вашего имени, нажимая после каждой клавишу выбора M. При этом набранные буквы из таблицы будут переноситься в строку, расположенную ниже. Если какой-то символ набран неверно, его можно стереть, «нажав» в таблице букву d (delete), для печати пробела используется буква s (space), а для ввода имени и завершения этой части программы - буква e (enter). Надо сказать, что такой способ ввода имени не самый удобный, однако он имеет право на существование в случаях, когда играющий еще плохо знаком с клавиатурой ZX Spectrum, но имеет некоторое представление о латинском алфавите.

ORG 60000 ENT $ XOR A CALL 8859 LD A,68 LD (23693),A CALL 3435 LD A,2 CALL 5633 ; Очистка строки для ввода имени LD HL,NAME LD DE,NAME+1 LD BC,19 LD (HL)," " LDIR ; Вывод таблицы символов в рамке CALL TABL CALL LINES LD A,68 LD (23693),A LD BC,#506 ;начальные координаты курсора в таблице LD E,0 ;номер символа в строке ввода SET 3,(IY+48) ;режим ввода прописных букв ; Управление курсором и печать выбранного символа в строку KEYS CALL SETCUR ;вывод курсора XOR A LD (23560),A WAIT LD A,(23560) ;ожидание нажатия клавиши AND A JR Z,WAIT CP "P" ;перемещение курсора на JR Z,RIGHT ; один шаг вправо CP "O" ;перемещение курсора JR Z,LEFT ; на один шаг влево CP "Q" ;перемещение курсора JR Z,UP ; на один шаг вверх CP "A" ;перемещение курсора JR Z,DOWN ; на один шаг вниз CP "M" ;печать выбранного символа JR Z,SELECT ; в строке ввода JR KEYS ; Перемещение курсора вправо RIGHT LD A,C ;проверка достижения курсором CP 24 ; правой границы таблицы JR NC,KEYS CALL RESCUR ;удаление курсора на прежнем месте INC C ;изменение положения курсора INC C CALL SETCUR ;установка курсора на букву таблицы JR KEYS ; Перемещение курсора влево LEFT LD A,C ;проверка достижения курсором CP 7 ; левой границы таблицы JR C,KEYS CALL RESCUR DEC C DEC C CALL SETCUR JR KEYS ; Перемещение курсора вверх UP LD A,B ;проверка достижения курсором CP 6 ; верхней границы таблицы JR C,KEYS CALL RESCUR DEC B DEC B CALL SETCUR JR KEYS ; Перемещение курсора вниз DOWN LD A,B ;проверка достижения курсором CP 11 ; нижней границы таблицы JR NC,KEYS CALL RESCUR INC B INC B CALL SETCUR JR KEYS ; Выбор символа, который затем будет напечатан в строке или выбор ; функции для редактирования этой строки SELECT PUSH BC PUSH DE CALL SND ;звуковой сигнал, издаваемый при ; перемещении символа из таблицы в ; набираемую строку POP DE POP BC LD A,B CP 11 JR NZ,MOVE ;печать символа LD A,C CP 20 JR Z,DELETE ;удаление символа в строке CP 22 JR Z,SPACE ;печать пробела в строке CP 24 RET Z ;выход из программы ; Перемещаем символ из таблицы в набираемую строку и смещаем курсор ; на позицию вправо, при этом делаем проверку того, чтобы символ ; не вышел за заданные границы строки (слева и справа). MOVE LD A,E CP 20 JP NC,KEYS LD D,0 PUSH BC PUSH DE LD A,B ;по вертикальной координате курсора ; определяем адрес данных строки ; таблицы (STR1, STR2, STR3 или STR4) SUB 5 LD HL,D_STR LD E,A ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD A,C ;по горизонтальной координате находим ; код символа в блоке данных SUB 6 LD C,A LD B,0 ADD HL,BC POP DE POP BC LD A,(HL) ;помещаем код символа в A LD HL,NAME ;определяем адрес в строке NAME ADD HL,DE ; для ввода символа LD (HL),A ;помещаем символ в строку ввода CALL PR_STR ;выводим строку ввода на экран INC E ;смещаем позицию ввода вперед JP KEYS ; Удаление неправильно набранного символа DELETE LD A,E ;проверка достижения начала строки ввода AND A JP Z,KEYS DEC E ;уменьшаем позицию ввода LD D,0 LD HL,NAME ADD HL,DE LD (HL)," " ;заменяем удаляемый символ пробелом CALL PR_STR JP KEYS ; Ввод пробела SPACE LD A,E ;проверка достижения конца строки ввода CP 20 JP NC,KEYS LD D,0 LD HL,NAME ADD HL,DE LD (HL)," " CALL PR_STR INC E ;увеличиваем позицию ввода JP KEYS ; Вывод курсора изменением байта атрибутов RESCUR LD A,68 ;PAPER 0, INK 4, BRIGHT 1 JR PRATTR ; Удаление курсора восстановлением байта атрибутов SETCUR LD A,79 ;PAPER 1, INK 7, BRIGHT 1 ; Вычисляем адрес атрибутов знакоместа и заносим ; по этому адресу байт из аккумулятора PRATTR LD L,B LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL PUSH AF LD A,H ADD A,#58 LD H,A LD A,L ADD A,C LD L,A POP AF LD (HL),A RET ; Подпрограмма печати таблицы символов TABL LD DE,STR LD BC,LENSTR JP 8252 ; Подпрограмма печати введенной строки PR_STR PUSH BC PUSH DE LD DE,STR5 LD BC,LENLIN CALL 8252 POP DE POP BC RET ; Подпрограмма рисования рамки LINES EXX PUSH HL LD A,66 LD (23695),A LD BC,#8A2C ;B = 138, C = 44 CALL 8933 LD DE,#101 LD BC,160 ;B = 0, C = 160 CALL 9402 LD DE,#FF01 LD BC,#3D00 ;B = 61, C = 0 CALL 9402 LD DE,#1FF LD BC,160 CALL 9402 LD DE,#101 LD BC,#3D00 CALL 9402 POP HL EXX RET ; Короткий звуковой сигнал SND LD B,30 LD HL,350 LD DE,2 SND1 PUSH BC PUSH DE PUSH HL CALL 949 POP HL POP DE POP BC SBC HL,DE DJNZ SND1 RET ; Данные таблицы символов STR DEFB 22,5,6 STR1 DEFM "1 2 3 4 5 6 7 8 9 0" ;символы через один пробел DEFB 22,7,6 STR2 DEFM "A B C D E F G H I J" DEFB 22,9,6 STR3 DEFM "K L M N O P Q R S T" DEFB 22,11,6 STR4 DEFM "U V W X Y Z . d s e" STR5 DEFB 22,19,5,16,5,">",16,2 NAME DEFM "····················" DEFB 16,5,"<" LENSTR EQU $-STR ;длина строки для печати таблицы LENLIN EQU $-STR5 ;длина строки ввода имени ; Адреса данных символов в таблице D_STR DEFW STR1,STR2,STR3,STR4

Эту программу можно рассматривать как вполне независимый кадр заставки. Если вы решите использовать ее в своей собственной игре, единственное, что вам потребуется, это перенести после выхода введенное имя из строки NAME в таблицу «рекордов». И, конечно же, вам нужно будет проследить, чтобы имена меток, задействованные в приведенной программе не повторялись в вашей игре. Естественно, что при необходимости наименования меток можно и заменить.




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