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



         

СОЗДАНИЕ ЗВУКОВЫХ ЭФФЕКТОВ - часть 4


Следующий пример немного похож на предыдущий, но позволяет выделять более низкие частоты. При наличии воображения его вполне можно сравнить с отдаленными раскатами грома. Продолжительность звучания здесь определяется в регистре B:

CRASH LD A,(23624) AND #38 RRA RRA RRA DI LD HL,100 ;начальный адрес в ПЗУ CRASH1 XOR 16 OUT (254),A ;извлекаем звук LD C,A ;сохраняем значение аккумулятора LD E,(HL) ;получаем в паре DE INC HL ; продолжительность цикла задержки LD A,(HL) AND 3 ;ограничиваем величину старшего байта LD D,A CRASH2 LD A,D ;цикл задержки OR E JR Z,CRASH3 DEC DE JR CRASH2 CRASH3 LD A,C ;восстанавливаем значение аккумулятора DJNZ CRASH1 EI RET

Неплохие результаты можно получить, если изменять во времени среднюю частоту выводимого шума. Ниже приведен текст подпрограммы, построенной именно по такому принципу:

EXPLOS LD A,(23624) AND #38 RRA RRA RRA LD L,A DI EXPL1 PUSH BC PUSH DE EXPL2 PUSH DE EXPL3 LD B,E DJNZ $ ;задержка LD A,(BC) ;в паре BC один из первых 256 адресов ПЗУ AND 16 OR L OUT (254),A INC C DEC D JR NZ,EXPL3 POP DE ; Изменение высоты шума (понижение среднего тона; ; если заменить на DEC E, тон будет наоборот повышаться) INC E DEC D JR NZ,EXPL2 POP DE POP BC DJNZ EXPL1 ;повторение всего эффекта EI RET

Перед обращением к ней в регистр B заносится количество повторений эффекта (что позволяет получить звук, напоминающий описанный выше эффект «Laser»), в D задается длительность звучания и в E - величина, определяющая начальную среднюю частоту. Например, для создания звука, напоминающего взрыв бомбы, можно предложить такие значения регистров:

LD B,1 LD D,100 LD E,-1 CALL EXPLOS RET

а пулеметную очередь можно получить с другими исходными данными:

LD B,5 LD D,35 LD E,0 CALL EXPLOS RET

У всех перечисленных процедур есть один общий недостаток: на время звучания выполнение основной программы затормаживается. Существует несколько способов обхода этой неприятности. Наиболее удачным из них представляется использование прерываний. Конечно, в этом случае получить чистый тон окажется совершенно невозможно, но для создания звуковых имитаций это и не особенно важно.




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