Программирование на Ассемблере
Так
что Вам нужно всего-лишь указать место в памяти, где записаны параметры
тона (или любого другого звука). В дополнении к этому нужно передать чипу
Paula информацию о том, как эти параметры должны интерпретироваться.
Начнем с самого простого - с генерации тона постоянной частоты. Если
нарисовать диаграмму такого звука, то она будет состоять из
последовательности повторяющихся фрагментов, форма которых определяет так
называемый \"волновой пакет\" тона. Существует несколько стандартных волновых
пакетов: синусоидальный, прямоугольный, треугольный и пилообразный.
Рассмотрим для начала самый простой из них - прямоугольный.
Очевидно, что для генерации \"прямоугольного\" тона нужно периодически
переключать динамик из одного положения в другое. Частота таких
переключений и определяет частоту тона.
Чтобы воспроизвести любой звук с помощью Amiga, нужно задать таблицу всех
значений его амплитуды (каждый элемент таблицы должен лежать в пределах от
-128 до 127). В случае простого прямоугольного тона нам потребуется
таблица, содержащая всего два значения амплитуды - наибольшее и наименьшее,
например: soundtab: dc.b -100,100 Теперь нужно передать адрес этой таблицы чипу Paula. Так как Amiga имеет
четыре звуковых канала, мы можем записать адрес таблицы амплитуд в любой из
следующих регистров:
$DFF0A0 для канала 0 (левый динамик)
$DFF0B0 для канала 1 (правый динамик)
$DFF0C0 для канала 3 (левый динамик)
$DFF0D0 для канала 4 (правый динамик) Выберем, например, нулевой канал: move.l #soundtab,$DFF0A0 ;адрес таблицы амплитуд Далее нам нужно проинформировать звуковой чип о том, сколько элементов
содержит таблица амплитуд. При воспроизведении звука данные из этой таблицы
выбираются последовательно, причем при достижении конца таблицы звук
\"зацикливается\": указатель DMA сбрасывается на начало таблицы. Поскольку
custom-чипы адресуют память по словам (16 бит), а не по байтам, то таблица
амплитуд должна содержать четное число байт, а ее длина должна задаваться в
словах.
|