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


         

с команды BIT, которая здесь


Описание процедуры начнем с команды BIT, которая здесь встречается впервые и выполняет проверку состояния отдельных битов. Значение бита отражает флаг нуля - если бит установлен, выполняется условие NZ, в противном случае - Z (т. е. если проверяемый бит равен нулю, то Z=1). Команда имеет формат BIT n,s, где n - номер бита, задаваемый числом от 0 (младший) до 7 (старший), а s - операнд, которым может быть один из регистров общего назначения или (HL), (IX+d) и (IY+d). Попутно стоит сказать о еще двух командах этой группы: SET n,s - установка бита с номером n и RES n,s - сброс бита. В первом случае в бит n записывается единица, во втором - нуль. В этих командах операнды и формат такие же, как и в команде BIT, но флаги остаются без изменений.

PRSYM PUSH BC PUSH DE PUSH HL LD L,A ;по коду символа вычисляем его адрес LD H,0 ; в текущем наборе ADD HL,HL ADD HL,HL ADD HL,HL LD DE,(23606) ADD HL,DE LD DE,(23684) ;адрес текущей позиции печати ; в видеобуфере EX DE,HL PUSH HL LD B,8 PRS1 LD A,(DE) BIT 3,(IY+87) ;режим INVERSE 1 JR Z,PRS2 CPL ;если включен, инвертируем байт PRS2 BIT 1,(IY+87) ;режим OVER 1 JR Z,PRS3 XOR (HL) ;если включен, объединяем ; с изображением на экране PRS3 LD (HL),A INC DE INC H DJNZ PRS1 POP HL PUSH HL LD A,H ;вычисляем адрес в области атрибутов AND #18 RRCA RRCA RRCA ADD A,#58 LD H,A LD A,(23695) LD (HL),A ;записываем байт атрибутов в видеобуфер POP HL INC L ;переходим к следующей позиции печати JR NZ,PRS4 ;если 0, то это означает, что позиция ; печати перешла в следующую треть экрана LD A,H ;в этом случае увеличиваем ADD A,8 ; старший байт адреса на 8 LD H,A CP #58 JR C,PRS4 LD H,#40 ;если выход из последней трети, то ; возвращаемся в начало видеобуфера PRS4 LD (23684),HL POP HL POP DE POP BC RET

Используем сначала эту процедуру для вывода буквенной или цифровой информации. Конечно, можно представить себе ситуацию, когда печатается всего один символ, например, уровень игры, но все же значительно чаще приходится иметь дело с текстовыми строками или даже целыми страницами и тут процедуры PRSYM явно недостаточно. Во-первых, необходимо уметь позиционировать курсор подобно тому, как это выполняет AT в Бейсике, во-вторых, желательно иметь возможность в любой момент переводить курсор на следующую строку, а в-третьих, - вспомним еще несколько атрибутов печати, которые применяются в команде RST 16: INK, PAPER, BRIGHT, FLASH, INVERSE и OVER. Для того чтобы вывод текстов на экран не вызывал особых проблем, необходима процедура, хорошо «понимающая» все управляющие коды, используемые при печати, и настраивающая в соответствии с ними системные переменные, используемые подпрограммой PRSYM. Ниже приводится текст такой процедуры, которую мы назвали WRITE, с краткими комментариями к отдельным группам строк.


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