X. Преамбула
Звуковая карта с прямым доступом к памяти (ПДП), называемая DMA UltraSound Card разработана Алексеем Иноземцевым. Карта не имеет первоначальных коммерческих целей, вся документация по ней может распространяться любым некоммерческим методом. Возможность распространения документации с корыстной выгодой необходимо заранее согласовать с автором представляемого документа.
Изменение копирайтов в данном руководстве будет принято как оскорбление автора и не приветствуется! При использовании материала данного руководства в своих статьях, книгах, ссылка на источник обязательна.
0. Введение
Руководство по программированию предназначено для ознакомления с практическим программированием звукового устройства DMA UltraSound Card (DMA USC) для компьютера Zx-Spectrum. В данном руководстве приводится полная справочная информация по адресации портов ввода/вывода этой карты, а также описание назначения портов, регистров и их программирование.
1. Распределение памяти компьютера.
Прежде чем подойти вплотную к вопросу программирования карты необходимо иметь представление о том, как же она распределяет память компьютера, доступную ей. Доступ контроллера ПДП (i8237) к па¬мяти не зависит от порта расширения ОЗУ компьютера, будь-то Pentagon (#7ffd), Scorpion (#1ffd) или любой другой Спектрум-совместимый клон.
Вся доступная DMA USC память разделена на отрезки объемом по 64 кБ. Мы будем называть эти отрезки памяти БАНКами, чтобы не путать со «страницами».
|
Рис.1 Распределение ОЗУ компьютера в сравнительном изображении для центрального процессора Z80 и контроллера ПДП i8237 |
На Рис.1 приводится карта памяти компьютера в сравнительном изображении для процессора и контроллера ПДП. Из этого рисунка легко понять, как необходимо адресовать память при взаимодействии с ПДП контроллером, относительно распределения ОЗУ для Z80.
Другими словами, банк состоит из 4х страниц и начинается со страницы с номе¬ром, кратным 4 (0 банк - 0,1,2,3; 1 банк - 4,5,6,7 и т.д.). Т.о. в компьютере с ОЗУ 128 Кб будет всего два банка, 512 Кб – 8 банков, 1024 Кб - 16 банков. Адресация внут¬ри банка лежит в пределах от #0000 до #ffff, т.е. шестнадцатиразрядная.
Для управления памятью существуют регистры банков и регистры начального ад¬реса, причем для каждого канала свой набор этих регистров.
2. Регистры контроллера ПДП.
2.1. Регистр банков.
У каждого канала имеется свой регистр банка, поэтому доступ одного канала к памяти не зависит от выбранных банков других каналов.
| Адрес | Назначение |
| #0777 | Регистр банка 0го канала |
| #1777 | Регистр банка 1го канала |
| #2777 | Регистр банка 2го канала |
| #3777 | Регистр банка 3го канала |
При программировании регистра не¬обходимо занести в него номер банка, к которому вы хотите обратиться.Пример:
...
ld bc,#0777 ;регистр 0го канала
ld a,1 ;программируем на
out (c),a ;работу с 1м банком
...
2.2. Регистр начального адреса.
Этот регистр задает начальный ад¬рес, с которого будет производиться передача блока данных. Регистр содержит 16 разрядов и определяет адрес внутри заданного банка (#0000-#ffff).
| Адрес | Назначение |
| #0c77 | Регистр нач. адреса 0го канала |
| #2c77 | Регистр нач. адреса 1го канала |
| #4c77 | Регистр нач. адреса 2го канала |
| #6c77 | Регистр нач. адреса 3го канала |
При программировании задаются два байта адреса последовательно - сначала младший байт, затем старший.
Пример:...
ld bc,#0c77 ;в регистр адреса 0 кан.
ld hl,#1234 ;загружаем адрес #1234
out (c),l ;текущего банка
out (c),h
...
2.3. Регистр текущего адреса.
Кроме регистров начального адреса имеются регистры текущего адреса.Начальное значение заносится в этот регистр автоматически, одновременно с регистром на¬чального адреса. В дальнейшем, в ходе пе¬редачи, значение текущего адреса увеличивается или уменьшается в за¬висимости от режима работы канала (см. регистр режима).
Обращение к регистрам текущего ад¬реса производится по адресам регистров начального адреса в режиме чтения значе¬ния.
2.4. Регистр начального счетчика циклов.
В этом регистре задается начальное количество циклов передачи для программи¬руемого канала (длина сэмпла).
| Адрес | Назначение |
| #1c77 | Регистр нач. счетчика 0го канала |
| #3c77 | Регистр нач. счетчика 1го канала |
| #5c77 | Регистр нач. счетчика 2го канала |
| #7c77 | Регистр нач. счетчика 3го канала |
При передаче данных в этот регистр необходимо задавать длину блока данных на 1 байт меньше истинной длины, т.е. при передаче 100 байт данных в ре¬гистр нужно записать число 99.
Пример:
...
ld bc,#1cff ;в регистр счетчика
ld hl,#1234 ;0-го канала заносим
out (c),l ;длину передаваемого
out (c),h ;блока
...
2.5. Регистр текущего счетчика циклов.
Регистр содержит текущее значение счетчика циклов (число оставшихся циклов передачи). Отображаемое в нем число циклов всегда на единицу меньше числа еще не переданных элементов данных.
Обращение к регистрам текущего счетчика циклов производится по адресам регистров начального счетчика циклов в режиме чтения значения.
2.6. Регистр режима.
Данный регистр задает режим работы своего канала контроллера. Адрес регистра для всех каналов одинаковый - #bc77, разделение по каналам производится исходя из значения битов 0 и 1 этого регистра.
Биты регистра имеют следующее назначение:
╔═╤═╤═╤═╤═╤═╤═╤═╗
║7│6│5│4│3│2│1│0║
╚╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╝
│ │ │ │ │ │ └─┴0-1: Номер канала:
└─┤ │ │ └─┤ 00 - 0й канал
│ │ │ │ 01 - 1й
│ │ │ │ 10 - 2й
│ │ │ │ 11 - 3й
│ │ │ │
│ │ │ └────2-3: Режим работы:
│ │ │ 00 – проверка
│ │ │ 01 - запись (в память)
│ │ │ 10 - чтение (из памяти)
│ │ │ 11 – недопустимая
│ │ │ комбинация
│ │ │
│ │ └────────4: Автоинициализация:
│ │ 1 – разрешена
│ │ 0 – запрещена
│ │
│ └──────────5: Изменение адреса
│ при обмене:
│ 0 – увеличение
│ 1 – уменьшение
│
└────────────6-7: Тип передачи:
00 -режим передачи по требованию
01 -режим одиночной передачи
10 -режим блочной передачи
11 -каскадный режим
Рис.2 Разбитовка регистра режима контроллера ПДП
Кратко о назначении некоторых битов:
- Номер канала - выбор канала ПДП, для которого задается режим работы.
- Режим работы - для работы DMA USC используется всего два режима:
- чтение из памяти (комбинация - 10) – при проигрывании сэмпла, либо при перемещении блока данных в памяти (задается для канала-источника).
- запись в память (комб. - 01) - при перемещении блока, задается для канала-приемника.
- Автоинициализация - иными словами – зацикливание, т.е. при окончании передачи восстанавливаются исходные данные начального адреса и начального счетчика циклов. Т.о. если установить 4й бит регистра режима, то мы разрешим повторение передачи, и сэмпл будет играть бесконечно.
- Изменение текущего адреса. При нулевом состоянии этого бита при передаче адрес увеличивается, т.е. сэмпл будет проигрываться нормально, иначе - происходит уменьшение адреса (проигрывание «наоборот»).
- Тип передачи: БИС i8237 (КР1810ВТ37) поддерживает 4 режима передачи данных, но для работы с DMA USC нам нужен всего лишь один - режим одиночной передачи(комбинация - 01). Этот режим заключается в том, что после передачи очередного байта данных карта освобождает шину процессору, но сразу же начинает проверку сигналов запроса и, как только обнаруживает активный сигнал запроса, инициирует следующий цикл передачи.
>!!!< Остальные режимы в данном руководстве описываться не будут из-за узкой направленности. Детальную информацию по остальным режимам передачи можно найти в [1].
2.7. Регистр команд.
Регистр команд управляет работой контроллера и программируется всего один раз при полной его инициализации. Имеет адрес #8c77. Раскладка регистра:╔═╤═╤═╤═╤═╤═╤═╤═╗
║7│6│5│4│3│2│1│0║
╚╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╝
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ └0: 0-запрет передачи память-память
│ │ │ │ │ │ │ 1-разрешение
│ │ │ │ │ │ └──1: 0-запретить фиксацию адреса в 0м канале
│ │ │ │ │ │ 1-разрешить
│ │ │ │ │ └────2: 0-разблокировать контроллер
│ │ │ │ │ 1-заблокировать
│ │ │ │ └──────3: 0-нормальная временная диаграмма
│ │ │ │ 1-сжатие времени передачи
│ │ │ └────────4: 0-режим фиксированных приоритетов
│ │ │ 1-режим циклического сдвига приоритетов.
│ │ └──────────5: 1-режим расширенной записи
│ │ 0-задержки при записи
│ └────────────6: 0-активен высокий уровень сигнала запроса
│ 1-низкий DREQ
└──────────────7: 0-активен высокий уровень сигнала подтверждения запроса на ПДП
1-низкий
Рис.3 Разбитовка регистра команд контроллера ПДП
Для работы со звуком все разряды регистра устанавливаем в 0е состояние. Другие комбинации применяются для работы с блоками данных, для их переброски, заливки ... но об этом поговорим отдельно.
2.8. Регистр маски.
Перед программированием какого-либо канала нужно запретить ему выполнять текущую работу, для этого его необходимо замаскировать. А чтобы разрешить работу канала после программирования его нужно демаскировать. Для этих операций в DMA имеется два регистра:
- Регистр маски(#fc77) - маскирует/демаскирует все каналы ПДП. Биты 0-3 регистра отвечают соответственно за 0-3 каналы (0 в соответствующем бите разрешает работу, а 1 – запрещает).
- Регистр одиночной маски(#ac77).
╔═╤═╤═╗
║2│1│0║
╚╤╧╤╧╤╝
│ └─┴──────0-1: Номер канала.
└──────────2: 0-разрешить работу,
1-запретить.
2.9. Регистр состояния.
Регистр отражает текущее состояние запросов и передач по всем четырем каналам. Биты 0-3 устанавливаются в единицу после завершения передачи по каналам 0-3 (бит 0 - канал 0, бит 1 - канал 1 и т.д.), если не задан режим автоинициализации. Эти биты очищаются после команды сброса контроллера и после каждой операции считывания состояния из регистра состояния. Биты 4-7 указывают, по какому из каналов 0-3 активен в текущий момент сигнал запроса на ПДП.
Источники
- Архитектура ввода-вывода персональных ЭВМ IBM PC. Справочное пособие.






