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



         

ПОДСЧЕТ КОЛИЧЕСТВЕННЫХ ВЕЛИЧИН - часть 2


MULT LD B,8 LD A,D AND A JR Z,MULT1 RLC B MULT1 LD C,D LD A,E EX DE,HL LD HL,0 MULT2 SRL C RRA JR NC,MULT3 ADD HL,DE MULT3 EX DE,HL ADD HL,HL EX DE,HL DJNZ MULT2 RET

Следующая подпрограмма предназначена для деления знаковых величин. Делимое перед обращением к ней должно находиться в паре HL, а делитель - в DE. Напоминаем, что деление на 0 невозможно, поэтому в программе имеет смысл выполнять подобную проверку. Если такая ошибка все же произойдет, будет выдано сообщение Бейсика Number too big. После выполнения процедуры частное окажется в паре HL, а остаток от деления будет отброшен.

DIVIS LD A,D OR E JR NZ,DIVIS1 RST 8 DEFB 5 ;Number too big DIVIS1 CALL DIVIS5 PUSH BC LD C,E LD B,D LD DE,0 PUSH DE EX DE,HL INC HL DIVIS2 ADD HL,HL EX DE,HL ADD HL,HL LD A,C SUB L LD A,B SBC A,H EX DE,HL JR NC,DIVIS2 EX DE,HL DIVIS3 EX DE,HL XOR A LD A,H RRA LD H,A LD A,L RRA LD L,A OR H JR Z,DIVIS4 EX DE,HL XOR A RR H RR L LD A,C SUB L LD A,B SBC A,H JP M,DIVIS3 LD A,C SUB L LD C,A LD A,B SBC A,H LD B,A EX (SP),HL ADD HL,DE EX (SP),HL JR DIVIS3 DIVIS4 POP HL POP BC BIT 7,B JR NZ,MINUS RET DIVIS5 LD B,H LD A,H RLA CALL C,MINUS EX DE,HL LD A,H XOR B LD B,A BIT 7,H RET Z MINUS LD A,H CPL LD H,A LD A,L CPL LD L,A INC HL RET

Как вы помните, извлечение квадратного корня из отрицательного числа невозможно, результат также не может быть меньше нуля, поэтому и соответствующая процедура работает с величинами из диапазона 0...65535. Перед обращением к ней число, из которого нужно извлечь корень, поместите в пару HL. Результат, как и в предыдущих подпрограммах, будет возвращен в HL. Дробная часть при этом, к сожалению, также теряется.

SQR LD A,L LD L,H LD H,0 LD DE,64 LD B,8 SQR1 SBC HL,DE JR NC,SQR2 ADD HL,DE SQR2 CCF RL D ADD A,A ADC HL,HL ADD A,A ADC HL,HL DJNZ SQR1 LD L,D LD H,A RET

А теперь приводим модифицированный текст программы МИШЕНЬ, в которой присутствуют некоторые типы оценок, а также демонстрируется применение только что предложенных математических процедур:

ORG 60000 ENT $ LD A,7 LD (23693),A XOR A CALL 8859 CALL 3435 LD A,2 CALL 5633 ;Основная часть программы МИШЕНЬ LD HL,UDG LD (23675),HL LD HL,0 LD (SCORE),HL ;обнуление счетчика количества очков, ; заработанных при стрельбе по «мишени» XOR A LD (KOL_W),A ;обнуление счетчика числа выстрелов, ; произведенных по «мишени» CALL MISH ;рисование «мишени» MAIN CALL WAIT ;ожидание нажатия любой клавиши LD A,22 RST 16 LD E,19 ;диапазон изменения координаты Y ; для пулевого отверстия CALL RND ;задаем координату Y LD (ROW),A ;заносим ее в переменную ROW RST 16 LD E,30 ;диапазон изменения координаты X ; для пулевого отверстия CALL RND ;задаем координату X LD (COL),A ;заносим ее в переменную COL RST 16 LD A,16 RST 16 LD A,6 ;задаем цвет пулевых отверстий RST 16 LD E,3 ;количество видов пулевых отверстий CALL RND ADD A,144 RST 16 CALL SND ;звуковой сигнал, имитирующий полет пули CALL OCENKA ;вычисление оценок результата стрельбы ; и вывод их на экран LD A,(23560) ;выход из программы CP " " JR NZ,MAIN RET ; Подпрограмма оценки результата стрельбы OCENKA LD BC,(COL) ;заносим в BC координаты выстрела LD A,10 ;вертикальная координата центра «мишени» CP B JR C,BOT_Y SUB B ;пулевое отверстие находится в верхней ; половине «мишени» JR CONT1 BOT_Y LD A,B SUB 10 ;пулевое отверстие находится в нижней ; половине «мишени» CONT1 LD B,A ;в регистре B длина катета по Y LD A,15 ;горизонтальная координата центра «мишени» CP C JR C,BIG_X SUB C JR CONT2 BIG_X LD A,C SUB 15 CONT2 LD C,A ;в регистре C длина катета по X ; Определяем длину гипотенузы прямоугольного треугольника LD H,0 LD L,B LD D,H LD E,L PUSH BC CALL MULT ;вычисляем квадрат величины Y LD B,H LD C,L POP HL LD H,0 LD D,H LD E,L PUSH BC CALL MULT ;вычисляем квадрат величины X POP BC ADD HL,BC CALL SQR ;определяем длину гипотенузы, ; величину которой помещаем в пару HL ; По длине гипотенузы находим количество заработанных очков ; в результате одного выстрела LD C,0 LD A,L CP 11 JR NC,SUM LD DE,D_SUM ADD HL,DE LD C,(HL) ; Вычисление трех оценочных характеристик стрельбы и их вывод на экран SUM PUSH BC LD DE,TXT1 LD BC,11 CALL 8252 POP BC LD HL,(SCORE) LD B,0 ADD HL,BC LD (SCORE),HL LD B,H LD C,L CALL 11563 CALL 11747 ;печать общего количества заработанных ; в результате стрельбы очков LD DE,TXT2 LD BC,11 CALL 8252 LD HL,KOL_W INC (HL) LD C,(HL) LD B,0 CALL 11563 CALL 11747 ;печать количества произведенных ; по «мишени» выстрелов LD DE,TXT3 LD BC,10 CALL 8252 LD HL,(SCORE) LD D,H LD E,L LD A,(KOL_W) LD L,A LD H,0 CALL DIVIS LD B,H LD C,L CALL 11563 JP 11747 ;печать среднего числа очков за один выстрел

; Подпрограммы MISH, CIRC и другие, а также блоки TEXT и UDG, ; на которые имеются ссылки в основной программе, описывались нами ; в первом варианте программы МИШЕНЬ

; Данные для мишени

LENTXT EQU $-TEXT ; Данные для пулевых отверстий

; Данные оценок D_SUM DEFB 10,10,8,8,8,6,6,6,4,4,4 TXT1 DEFB 22,21,0,16,4 DEFM "SCORE:" TXT2 DEFB 22,21,12,16,1 DEFM "SHOTS:" TXT3 DEFB 22,21,22,16,2 DEFM "MEAN:" ; Переменные для оценок SCORE DEFW 0 KOL_W DEFB 0 COL DEFB 0 ROW DEFB 0




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