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

       

Спрайт «вертолет»



Рисунок 8.2. Спрайт «вертолет»

ORG 60000 ENT $ LD A,5 LD (23693),A XOR A CALL 8859 CALL 3435 ; Основная часть программы LD BC,#505 ;задаем исходное положение вертолета KEY PUSH BC CALL KBDJOY ;читаем данные из портов POP BC RRCA ;поворачиваем ручку джойстика вправо ; или нажимаем клавишу P - ; полет вертолета вправо JR NC,KEY1 INC C KEY1 RRCA ;поворачиваем ручку джойстика влево ; или нажимаем клавишу O - ; полет вертолета влево JR NC,KEY2 DEC C KEY2 RRCA ;поворачиваем ручку джойстика вниз ; или нажимаем клавишу A - ; полет вертолета вниз JR NC,KEY3 INC B KEY3 RRCA ;поворачиваем ручку джойстика вверх ; или нажимаем клавишу Q - ; полет вертолета вверх JR NC,KEY4 DEC B KEY4 RRCA ;при нажатии кнопки «огонь» джойстика ; или клавиши M - выход RET C ; Подпрограмма вывода на экран изображения вертолета в двух фазах, ; каждая из которых соответствует одному из положений винта XOR A ;формируем звуковой сигнал, OUT (254),A ; имитирующий работу двигателя CALL CHECK ;проверка достижения границ экрана LD A,16 OUT (254),A LD A,SPRXOR ;задаем режим вывода спрайта LD HL,WERT1 ;устанавливаем адрес спрайта PUSH BC PUSH HL CALL PTBL ;выводим вертолет в первой фазе LD BC,5 ;задаем задержку между фазами CALL 7997 ; вращения винта POP HL POP BC LD A,SPRXOR ;режим вывода спрайта PUSH BC PUSH HL CALL PTBL ;стираем вертолет в первой фазе POP HL POP BC XOR A OUT (254),A ; Вывод вертолета во второй фазе LD A,16 ;звуковой сигнал OUT (254),A LD A,SPRXOR ;режим вывода спрайта LD HL,WERT2 ;устанавливаем адрес спрайта ; с другим расположением винта PUSH BC PUSH HL CALL PTBL ;выводим спрайт во второй фазе LD BC,5 CALL 7997 POP HL POP BC LD A,SPRXOR ;режим вывода спрайта PUSH BC PUSH HL CALL PTBL ;стираем с экрана спрайт во второй фазе POP HL POP BC JR KEY ; Подпрограмма проверки границ экрана CHECK LD A,C AND A ;сравниваем координату X вертолета ; с заданной левой границей экрана JR NZ,CONT1 INC C CONT1 CP 29 ;сравниваем координату X вертолета ; с заданной правой границей экрана JR NZ,CONT2 DEC C CONT2 LD A,B ;задаем верхнюю границу экрана AND A ;сравниваем координату Y вертолета ; с заданной верхней границей экрана JR NZ,CONT3 INC B CONT3 CP 21 ;сравниваем координату Y вертолета ; с заданной нижней границей экрана RET NZ DEC B RET ; Подпрограмма чтения данных из портов клавиатуры и джойстика KBDJOY IN A,(31) ;опрашиваем порт джойстика LD E,A ;запоминаем полученные биты ; Проверяем, подключен ли порт джойстика (ручку невозможно ; повернуть сразу и вправо и влево - если оба бита установлены, ; порт не подключен) AND 3 CP 3 JR NZ,KBDJ1 ;если да, переходим к опросу клавиатуры LD E,0 ; иначе очищаем коллектор битов KBDJ1 LD HL,DKEY ;адрес блока данных клавиатуры KBDJ2 LD C,(HL) ;младший байт адреса порта INC C ;проверка на 0 (конец блока данных) DEC C LD A,E ;значение коллектора в аккумулятор RET Z ;выход, если конец данных INC HL LD B,(HL) ;старший байт адреса порта INC HL IN A,(C) ;читаем из порта CPL ;инвертируем биты AND (HL) ;проверяем конкретный бит INC HL JR Z,KBDJ3 LD A,(HL) ;если бит установлен, читаем код направления OR E ; и объединяем с коллектором LD E,A KBDJ3 INC HL JR KBDJ2 ;продолжаем чтение ; Данные управляющих клавиш: ; первое число - младший байт порта ; второе число - старший байт порта ; третье число - маска бита ; четвертое - код направления (аналогично кодам джойстика) DKEY DEFB #FE,#FB,1,8 ;Q - вверх DEFB #FE,#FD,1,4 ;A - вниз DEFB #FE,#DF,2,2 ;O - влево DEFB #FE,#DF,1,1 ;P - вправо DEFB #FE,#7F,4,16 ;M - «огонь» DEFB 0 ;метка конца блока данных

; Заголовок первой фазы спрайта «вертолет» WERT1 DEFB 7 DEFB 0,1,6,1,0,6,1,1,6,1,2,6 DEFB 2,0,6,2,1,6,2,2,6 ; Данные первой фазы спрайта «вертолет» DEFB 0,0,4,28,56,32,24,24 DEFB 0,0,0,1,2,2,4,4 DEFB 60,60,255,129,66,36,36,24 DEFB 0,0,0,128,64,64,32,32 DEFB 7,2,1,0,1,2,4,14 DEFB 255,36,36,255,0,0,0,0 DEFB 224,64,128,0,128,64,32,112 ; Заголовок второй фазы спрайта «вертолет» WERT2 DEFB 9 DEFB 0,0,6,0,1,6,0,2,6 DEFB 1,0,6,1,1,6,1,2,6 DEFB 2,0,6,2,1,6,2,2,6 ; Данные второй фазы спрайта «вертолет» DEFB 0,0,30,127,255,127,14,0 DEFB 0,0,0,129,231,129,24,24 DEFB 0,0,120,254,255,254,112,0 DEFB 0,0,0,1,2,2,4,4 DEFB 60,60,255,129,66,36,36,24 DEFB 0,0,0,128,64,64,32,32 DEFB 7,2,1,0,1,2,4,14 DEFB 255,36,36,255,0,0,0,0 DEFB 224,64,128,0,128,64,32,112



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