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



         

КОНТРОЛЬ ВРЕМЕНИ (РАБОТА СПРЕРЫВАНИЯМИ) - часть 5


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

INTERR PUSH AF PUSH BC PUSH DE PUSH HL ....... POP HL POP DE POP BC POP AF JP 56

В заключение этого раздела приведем процедуру, отсчитывающую секунды, остающиеся до окончания игры. Эта процедура может вызываться как из машинных кодов, так и из программы на Бейсике. В верхнем левом углу экрана постоянно будет находиться число, уменьшающееся на единицу по истечении каждой секунды. Для применения этой подпрограммы в реальной игре вам достаточно изменить адрес экранной области, куда будут выводиться числа и, возможно, начальное значение времени, отводимое на игру. Момент истечения времени определяется содержимым ячейки по смещению ORG+4. Если ее значение окажется не равным 0, значит игра закончилась.

ORG 60000 JR INITI JR IMOFF OUTTIM DEFB 0 INITI LD HL,D_TIM0 LD DE,D_TIME LD BC,3 LDIR XOR A LD (OUTTIM),A LD HL,TIM0 LD (HL),50 INC HL LD (HL),A INC HL LD (HL),A LD HL,TIMER ;установка прерывания

TIMER PUSH AF PUSH BC PUSH DE PUSH HL CALL CLOCK POP HL POP DE POP BC POP AF JP 56 TIM0 DEFB 50 ;количество прерываний в секунду TIM1 DEFB 0 ;время «проворота» третьего символа TIM2 DEFB 0 ;время «проворота» второго символа TIM3 DEFB 0 ;время «проворота» первого символа D_TIM0 DEFM "150" ;символы, выводимые на экран D_TIME DEFM "150" ;начальное значение времени ; Проверка необходимости изменения текущего времени CLOCK LD HL,TIM0 DEC (HL) JR NZ,CLOCK1 LD (HL),50 ; Уменьшение секунд LD A,8 ;символ «проворачивается» за 8 LD (TIM1),A ; тактов прерывания LD HL,D_TIME+2 LD A,(HL) DEC (HL) CP "0" JR NZ,CLOCK1 LD (HL),"9" ; Уменьшение десятков секунд LD A,8 LD (TIM2),A DEC HL LD A,(HL) DEC (HL) CP "0" JR NZ,CLOCK1 LD (HL),"9" ; Уменьшение сотен секунд LD A,8 LD (TIM3),A DEC HL LD A,(HL) DEC (HL) CP "0" JR Z,ENDTIM ;если время истекло CLOCK1 LD DE,#401D ;адрес экранной области LD A,(D_TIME) ;первый символ - сотни секунд LD HL,TIM3 CALL PRNT LD A,(D_TIME+1) ;второй символ - десятки секунд CALL PRNT LD A,(D_TIME+2) ;третий символ - секунды ; Печать символов с учетом их «проворота» PRNT PUSH HL LD L,A ;расчет адреса символа LD H,0 ; в стандартном наборе ADD HL,HL ADD HL,HL ADD HL,HL LD A,60 ADD A,H LD H,A EX (SP),HL LD A,(HL) LD C,A AND A JR Z,PRNT1 ;если символ «проворачивать» не нужно DEC (HL) EX (SP),HL NEG ;пересчет адреса символьного набора для ; создания иллюзии «проворота» цифры LD B,A LD A,L SUB B LD L,A JR PRNT2 PRNT1 EX (SP),HL PRNT2 LD B,8 PUSH DE PRNT3 LD A,(HL) LD (DE),A INC HL INC D LD A,C AND A JR Z,PRNT4 ; После цифры 9 при «провороте» должен появляться 0, а не двоеточие LD A,L CP 208 ;адрес символа : JR C,PRNT4 SUB 80 ;возвращаемся к адресу символа 0 LD L,A PRNT4 DJNZ PRNT3 POP DE POP HL INC DE DEC HL RET ; Истечение времени - выключение 2-го режима прерываний ENDTIM POP HL ;восстановление значения указателя стека ; после команды CALL CLOCK CALL IMOFF LD A,1 ;установка флага истечения времени LD (OUTTIM),A POP HL ;восстановление регистров POP DE POP BC POP AF RET




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