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


         

МУЗЫКАЛЬНЫЙ СОПРОЦЕССОР - часть 9


В процедуре обработки прерываний приведенная подпрограмма будет вызываться трижды для определения характера звучания в каждом из трех каналов независимо друг от друга. Это дает возможность использовать в программе одновременно три самостоятельных источника звука, закрепив за каждым игровым объектом свой звуковой канал. Правда, здесь есть одно небольшое ограничение: поскольку средняя частота «белого» шума общая для всех трех каналов, то его лучше выводить только в какой-то один, а другие два использовать для вывода изменяющегося тона.

Вот описываемая процедура обработки прерываний:

SND128 PUSH AF PUSH BC PUSH DE PUSH HL PUSH IX CALL NXTSND POP IX POP HL POP DE POP BC POP AF JP 56 NXTSND LD IX,CHAN_A XOR A CALL GETSND ;задание переменных для канала A LD IX,CHAN_B LD A,1 CALL GETSND ;задание переменных для канала B LD IX,CHAN_C LD A,2 CALL GETSND ;задание переменных для канала C ; Вычисление значения регистра R7, ; управляющего выводом в каналы тона и шума LD A,(CHAN_C+10) AND 9 ;выделяем биты 0 и 3 RLCA ;сдвигаем влево LD B,A ;результат сохраняем в регистре B LD A,(CHAN_B+10) AND 9 ;то же самое для других двух каналов OR B RLCA LD B,A LD A,(CHAN_A+10) AND 9 OR B CPL ;инвертируем биты LD E,7 ;устанавливаем данные регистра R7 в DATREG CALL SETREG ; Извлечение звука OUTREG LD HL,DATREG+13 LD D,13 LD C,#FD OUTR1 LD B,#FF OUT (C),D LD B,#BF OUTD DEC D RET M ;выход, если D < 0 JR OUTR1 DATREG DEFS 14 ; Задание элемента E массива DATREG значением из аккумулятора SETREG LD HL,DATREG LD D,0 ADD HL,DE LD (HL),A RET N_CHAN DEFB 0 ;номер текущего канала ; Таблицы переменных для каждого канала CHAN_A DEFS 19 CHAN_B DEFS 19 CHAN_C DEFS 19

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




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