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

         

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


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

IMON XOR A ;в начале на всякий случай LD (REPEAT),A ; запрещаем вывод звука LD A,24 ;код команды JR LD (65535),A LD A,195 ;код команды JP LD (65524),A LD HL,INTERR ;переход на процедуру LD (65525),HL ; обработки прерываний LD HL,#FE00 ;формируем таблицу векторов прерываний LD DE,#FE01 LD BC,256 LD (HL),#FF ;на адрес 65535 (#FFFF) LD A,H ;запоминаем старший байт адреса таблицы LDIR DI LD I,A ;загружаем регистр вектора прерываний IM 2 ;включаем 2-й режим EI RET

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

IMOFF DI LD A,63 LD I,A IM 1 EI RET

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

EFF1 DEFB 200,5,220,4,200,5 DEFB 100,8,80,9,50,20 DEFB 0 EFF2 DEFB 50,20,100,6,200,3,100,6 DEFB 0

Наконец, напишем управляющую часть, которая позволит легко обратиться к любой подпрограмме: включения или выключения второго режима прерываний, а также активизации того или иного эффекта. Напомним, что для «запуска» любого из заданных в блоках данных эффектов необходимо сначала занести в переменные ADREFF и CURADR начальный адрес соответствующего блока и в переменной REPEAT указать количество повторений звука.




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