Звук на Спеки.
ZXNet echo conference «real.speccy»
From Eugene Safronov → To All 20 March 1998
* Crossposted in REAL.SPECCY
* Crossposted in FROM_ME
Бью тебе челом, All !
Как я вижу, звуковая карта для Спека заинтересовала многих. Инфа по железу
уже вроде бы была, теперь несколько слов о программировании сей фичи.
[кусь-кусь-кусь]
Программирование.
Все порты устройства имеют младший байт адреса #77. Старшие байты адреса
такие:
Контроллер DMA -
#0C,#1C,#2C,#3C,#4C,#5C,#6C,#7C,#8C,#9C,#AC,#BC,#CC,#DC,#EC,#FC
Первый таймер - #3D,#7D,#BD,#FD
Второй таймер - #3E,#7E,#BE,#FE
Банки каналов - #07,#17,#27,#37
Громкость каналов - #3F,#7F,#BF,#FF
Маска прерываний - #F7
Для работы со звуком контроллер должен быть запрограммирован в режиме
одиночной передачи, приоритет передачи может быть как простой так и
циклический.
Таймеры задают частоты выборки канклов DMA и прерываний. Каналы 1 и 2
таймеров тактируются частотой 3.5 МГц, а каналы 3 - частотой 1.75 МГц. Каналы 1
и 2 первого таймера задают частоту на 1 и 2 канале DMA, каналы 1 и 2 второго
таймера задают частоту на 3 и 4 канале DMA. Все каналы таймеров должны работать
во втором режиме.
Регистры банков устанавливают банк памяти с которым будет происходить
обмен. Регистры банков содержат старшие биты номера сраницы, младшие два бита
вхлдят в адрес прямого доступа. Hапример необходимо передать массив, который
находится в #16 странице с алреса #D8E7. Младшие два бита номера страницы %01,
для адреса DMA это будут два старших бита. Таким образом получаем банк DMA
адрес
#98E7. Рисунок иллюстрирует преобразование номера страницы в адрес и номер
банка
для Пентагон-512 и Профи-1024:
Пентагон-512
биты #7DDF Адрес
╔═І═І═І═І═І═І═І═╗ ╔═І═І═І═І═І═І═І═І═І═І═І═І═І═І═І═╗
·7│6│5│4│3│2│1│0· биты ·f│e│d│c│b│a│9│8│7│6│5│4│3│2│1│0·
╚І╧І╧═╧═╧═╧І╧І╧Іў ╚═╧═╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧Іў
│ └────┐ │ │ └──────────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└────┐ │ ┌┘ └──────────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
╔═І╧І╧І╧╗ ╔╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧╗
·3│2│1│0· биты ·f│e│d│c│b│a│9│8│7│6│5│4│3│2│1│0·
╚═╧═╧═╧═ў ╚═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═ў
Банк Адрес
Профи-1024
#DFFD #7FFD Адрес
╔═І═І═╗ ╔═І═І═І═І═І═І═І═╗ ╔═І═І═І═І═І═І═І═І═І═І═І═І═І═І═І═╗
·2│1│0· ·7│5│5│4│3│2│1│0· ·f│e│d│c│b│a│9│8│7│6│5│4│3│2│1│0·
╚І╧І╧Іў ╚═╧═╧═╧═╧═╧І╧І╧Іў ╚═╧═╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧Іў
│ │ └────────────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ └────────────┐ │ │ │ └──────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└────────────┐ │ │ │ └──────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
╔╧І╧І╧І╧╗ ╔╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧І╧╗
·3│2│1│0· биты ·f│e│d│c│b│a│9│8│7│6│5│4│3│2│1│0·
╚═╧═╧═╧═ў ╚═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═ў
Банк Адрес
Рис. Преобразование страничного адреса в адрес DMA
Массив не может пересекать границу 4-х страниц, т.е. может находиться в
#10,#11,#12,#13 страницах но не может находиться в #13 и #14 страницах, такие
массивы необходимо передавать за два раза исользуя прерывание конца передачи
или
выравнивать по границе 4-х страниц.
Регистры громкости каналов устанавливают громкость в пределах от 0(полное
остутствие звука) до 63(максммальная громкость). Регистры громкости имеют
разрядность 6 бит, поэтому значение 64 равно 0 в отличие от Амиги, где 64 -
максимальная громкость.
Контроллер прерываний в цикле подтверждения прерывания выдаёт вектор
прерывания, который указывает какие устройства послали запрос на прерывание.
Вектор прерывания имеет следующую структуру:
бит 7 - устанавливается в 1 если пришло кадровое прерывание, в протовном
случае сбрасывается.
бит 6 - сбрасывается в 0 если пришло прерывание от 2го таймера, в противном
случае устанавливается.
бит 5 - сбрасывается в 0 если пришло прерывание от 1го таймера, в противном
случае устанавливается.
бит 4 - сбрасывается в 0 если пришло прерывание окончания передачи на
каком-либо канале DMA, в противном случае устанавливается. Для того,
чтобы определить какой канал завершил передачу необходимо прочесть
регистр состояния контроллера DMA.
биты 3-0 всегда установлены в 1
Если приходят одновременно несколько прерываний то несколько битов
устанавливается соотватствующим образом независимо. Hапример:
#FF - кадровое прерывание
#3F - прерывание от 2го таймера
#5F - прерывание от 1го таймера
#6F - прерывание конца передачи
#BF - кадровое прерывание и 2го таймера
#EF - кадровое прерывание и прерывание конца передачи
и т.д.
Вектору #7F не соответствует никакое устройство, но как показала практика в
среднем раз в пять минут такой вектор 'проскакивает' и его тоже необходимо
обработать. Ему соответствует кадровое прерывание, которое приходит в момент
выполнения команды EI.
Регистр маски позволяет маскировать отдельные типы прерывания. Раскладка
битов такая:
7 6 5 4 3 2 1 0
╔═І═І═І═І═І═І═І═╗
·x│x│x│x│0│1│1│1·
╚═╧═╧═╧═╧І╧І╧І╧Іў
│ │ │ └─── разрешает прерывание конца передачи
│ │ └───── разрешает прерывание 1го таймера
│ └─────── разрешает прерывание 2го таймера
└───────── разрешает кадровое прерывание
В отличие от остальных прерываний, кадровое разрешается не 1,а 0.
[кусь-кусь-кусь]
Вот вроде бы и все на сегодня. В следующий раз расскажу о чем-нибудь ещё.
у пакеда, All, пакеда!
[Team вор Alos MUST DIE!]