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


         

Выполнение команд сдвига регистров



Рисунок 5.3. Выполнение команд сдвига регистров

Алгоритм расчета адресов экрана достаточно сложен, поэтому, как и прежде, обратимся за помощью к ПЗУ, благо в «прошивке» Speccy имеются необходимые процедуры. Для получения начального адреса любой строки экрана можно обратиться к подпрограмме, расположенной по адресу 3742. Перед обращением к ней в аккумулятор необходимо поместить номер строки экрана. На выходе в регистровой паре HL получится искомый адрес, зная который, уже несложно рассчитать и любой другой адрес в пределах данной строки. Каждая строка имеет длину 32байта, которые расположены последовательно, и вмещает 8 рядов пикселей. При переходе к следующему ряду адрес видеобуфера увеличивается на 256, то есть увеличивается только старший байт адреса, а младший остается без изменений.

Для примера покажем, как рассчитать адрес второго байта сверху в 5-й строке и 11-й позиции экрана (иначе, в позиции печати, определяемой директивой Бейсика AT 5,11):

LD A,5 ;номер строки CALL 3742 ;получаем в HL начальный адрес LD A,L ;берем значение младшего байта адреса OR 11 ;добавляем смещение в 11 байт (знакомест) LD L,A ;возвращаем в младший байт INC H ;увеличиваем адрес на 256 и тем самым ; получаем адрес второго байта в ; знакоместе сверху

Теперь можно написать программу, дающую эффект бегущей строки. Для определенности будем скроллировать 21-ю строку экрана:

ORG 60000 LD A,21 ;21-я строка экрана SCRLIN CALL 3742 ;получаем ее адрес в HL ; Так как строка должна бежать слева направо, то раньше нужно сдвигать ; последние байты, поэтому определяем адрес конца строки LD A,L OR 31 LD L,A LD C,8 ;высота строки 8 пикселей SCRL1 LD B,32 ;длина строки 32 байта AND A ;очистка флага CY PUSH HL ;сохраняем адрес SCRL2 RL (HL) ;последовательно сдвигаем все байты DEC HL DJNZ SCRL2 POP HL ;восстанавливаем адрес INC H ;переходим к следующему ряду пикселей DEC C ;повторяем JR NZ,SCRL1 RET

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



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