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


         

Если вы не хотите лишаться


Если вы не хотите лишаться возможностей, предоставляемых стандартной процедурой обработки прерываний, можете завершать свою подпрограмму командой 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


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