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


         

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


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

Перейдем теперь к вопросу, как программируются регистры музыкального сопроцессора. Связь с ними осуществляется через порты с адресами 49149 (#BFFD) и 65533 (#FFFD). Чтобы записать какое-либо значение в любой из регистров, его необходимо прежде всего выбрать (или назначить), выполнив команду OUT в порт 65533. Например, регистр R8 выбирается следующими командами:

LD BC,65533 ;в паре BC - адрес порта ; для выбора регистра LD A,8 ;в аккумуляторе - номер регистра OUT (C),A ;выбор

После этого в выбранный регистр можно записывать данные либо читать его содержимое. Для записи используется порт 49149, а для чтения - опять же 65533. Приведем фрагмент программы, в котором читается значение установленного ранее регистра и если оно не равно 0, содержимое регистра уменьшается на единицу:

LD BC,65533 ;адрес порта для чтения IN A,(C) ;читаем значение текущего регистра JR Z,ZERO ;если 0, обходим DEC A ;уменьшаем на 1 ; Выбираем порт 49149 для записи ; (значение регистра C остается прежним - #FD) LD B,#BF OUT (C),A ;записываем значение в выбранный регистр ZERO ......... ;продолжение программы

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

Можно написать универсальную подпрограмму, которая считывает из блока данных значения всех регистров и тем самым задает параметры звуков одновременно для всех трех каналов:

OUTREG DI ;запрещаем прерывания ; Данные будем считывать из массива DATREG ; в обратном порядке, начиная с последнего элемента LD HL,DATREG+13 LD D,13 ;начальный номер загружаемого регистра LD C,#FD ;младший байт адреса порта сопроцессора OUTR1 LD B,#FF ;адрес для выбора регистра OUT (C),D ;выбираем регистр LD B,#BF ;адрес для записи в регистр ; Записываем в порт байт из ячейки, адресуемой парой HL, ; и уменьшаем HL на 1 OUTD DEC D ;переходим к следующему регистру ; (с меньшим номером) JP P,OUTR1 ;повторяем, если записаны еще не все ; регистры (D >= 0) EI ;разрешаем прерывания RET DATREG DEFS 14 ;массив данных для регистров сопроцессора




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