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


         

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


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

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

Учитывая все сказанное, можно написать такую процедуру обработки прерываний:

INTERR PUSH AF ;сохраняем используемые PUSH BC ; в прерывании регистры PUSH HL INTER1 LD A,(REPEAT) AND A ; Если эффект прозвучал нужное количество раз, ; завершаем обработку прерывания JR Z,EXITI LD HL,(CURADR) ;определяем текущий адрес ; в блоке данных LD B,(HL) ;высота звука INC B DEC B ; Если встретился маркер конца блока данных, ; переходим к следующему повторению JR Z,EXITI0 INC HL LD C,(HL) ;длительность звука INC HL LD (CURADR),HL ;запоминаем текущий адрес CALL BEEP ;извлекаем звук EXITI POP HL ;восстанавливаем регистры POP BC POP AF JP 56 ;переходим к стандартному ; обработчику прерываний ; Переход к началу эффекта - повторение EXITI0 LD HL,(ADREFF) ;восстанавливаем начальный LD (CURADR),HL ; адрес блока данных LD HL,REPEAT DEC (HL) ;уменьшаем счетчик повторений JR INTER1 REPEAT DEFB 0 ;количество повторений эффекта ADREFF DEFW 0 ;начальный адрес блока данных эффекта CURADR DEFW 0 ;текущий адрес в блоке данных ; Извлечение звука BEEP XOR A BEEP1 XOR 16 OUT (254),A PUSH BC DJNZ $ POP BC DEC C JR NZ,BEEP1 RET




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