|
ZX Pilot
#41
29 декабря 2002 |
|
Железо - Руководство по программированию самой крутой звуковой карты - DMA USC.

D M A I
──────────────────────────────────────────
░░░░░░░░ ░░░░░
░▒▒▒▒▒▒▒▒░ ░▒▒▒▒▒░░
░▒▓▓▓▓▓▓▓▓▒░ ░ ░ ░▒▓▓▓▓▓▒▒░
░▒▓████████▓▒░░▒░ ░▒░░▒▓█████▓▓▒░
░▒▓███▓▓███▓▒▒▓▒░ ░▒▓▒▒▓███▓▓███▓▒░
░▒▓███▓▒▓███▓▓█▓▒░ ░▒▓█▓▒▓███▓▒▓███▓▒░
░▒▓███▓▒▓███▓▓██▓▒░▒▓██▓▓███▓▒▒▓███▓▒░
░▒▓███▓▒▒▓███▓▓███▓▒▓███▓▓███▓▒▒▒▓███▓▒░
░▒▓███▓▒▒▓███▓▓████▓████▓▒▓███▓▓▓████▓▒░
░▒▓███▓▒▒▓███▓▓█████████▓▒▓██████▓███▓▒░
░▒▓███▓▒▒▓███▓▒▓███▓█▓███▓▒▓███▓▓▓▒▓███▓▒░
░▓▓███▓▓▓███▓▒▒▓███▓▓▓███▓░▒▓███▓▒▒▓███▓▒░
▒▓█████████▓▒░░▒▓▓▓▒▒▒▓▓▓▒░▒▓███▓▒▒▓███▓▒░
░▒▓▓▓▓▓▓▓▓▓▒░ ░▒▒▒░░░▒▒▒░ ░▒▓▓▓▒░░▒▓▓▓▒░
░▒▒▒▒▒▒▒▒▒░ ░░░ ░░░ ░▒▒▒░ ░▒▒▒░
░░░░░░░░░ Ultrasound Card ░░░ ░░░
--==єє The Best for SPECCY ЄЄ==--
+------------================------------+
Приветствую тебя,
Уважаемый читатель ZxPilot'a!
Сегодня мы начинаем публиковать
Руководство по программированию самой
крутой звуковой карточки - DMA USC для
самого крутого компьютера - Zx-Spectrum!
Итак, в этой части руководства ты сможешь
познакомимся с тем, как же карточка
~видит~ память и с помощью каких рычагов к
ней обращается.
+------------================------------+
Руководство по программированию
DMA UltraSound Card
1. Распределение памяти компьютера.
Прежде чем подойти в плотную к вопросу
программирования карты необходимо хоть
чуточку узнать о том, как же она
распределяет память компьютера, доступную
ей. Доступ контроллера ПДП (i8237) к
памяти не зависит от порта расширения ОЗУ
(#7ffd, #1ffd, & etc) и вся доступная ему
память разделена на БАНКи размером по 64
кБ.
Для особо непонятливых привожу сей
рисуночек, дабы вы смогли сравнить деление
ОЗУ компа для Z80 и для DMA:
Память Z80 Память DMA
Страница Адрес Адрес Банк
┌────────┬-----------------┬────────┐
│ 0 │#c000 #0000│#00 Bank│
│ │ │ │
│ Page │#ffff #3fff│ │
├────────┼-----------------┤ │
│ 1 │#c000 #4000│ │
│ │ │ │
│ Page │#ffff #7fff│ │
├────────┼-----------------┤ │
│ 2 │#c000 #8000│ │
│ │ │ │
│ Page │#ffff #bfff│ │
├────────┼-----------------┤ │
│ 3 │#c000 #c000│ │
│ │ │ │
│ Page │#ffff #ffff│ │
├────────┼-----------------┤────────┤
│ 4 │#c000 #0000│#01 Bank│
│ │ │ │
│ Page │#ffff #3fff│ │
├────────┼-----------------┤ │
.. ... ..
├────────┼-----------------┤ │
│ 7 │#c000 #c000│ │
│ │ │ │
│ Page │#ffff #ffff│ │
├────────┼-----------------┼────────┤
.. ... ..
и так далее...
Одним словом банк состоит из 4-х
страниц и начинается со страницы с
номером, кратным 4 (0, 4, 8 и т.д.). Т.о.
в компьютере со 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 разрядов и
определяет адрес внутри заданного банка.
Каждый канал ПДП имеет свой регистр
начального адреса.
┌─────┬──────────────────────────────┐
│Адрес│ Назначение │
├─────┼──────────────────────────────┤
│#0c77│Регистр нач. адреса 0го канала│
│#2c77│Регистр нач. адреса 1го канала│
│#4c77│Регистр нач. адреса 2го канала│
│#6c77│Регистр нач. адреса 3го канала│
└─────┴──────────────────────────────┘
При программировании задаются два байта
адреса последовательно - сначала младший
байт, затем старший.
Пример:
...
ld bc,#0c77;в регистр адреса 0 кан.
ld hl,#1234;загружаем адрес #1234
out (c),l ;текущего банка
out (c),h
...
2.3. Регистр текущего адреса.
Кроме регистров начального адреса
имеются регистры текущего адреса.
Начальное значение заносится в этот
регистр одновременно с регистром
начального адреса. В дальнейшем в ходе
передачи значеное текущего адреса
автоматически увеличивается или
уменьшается в зависимости от режима работы
канала (см. регистр режима).
Обращение к регистрам текущего адреса
производится по адресам регистров
начального адреса в режиме чтения
значения.
Возможность чтения значения текущего
адреса из регистра на "лету" дает
возможность делать такие вещи, как
voicemeter или осциллограф.
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. Регистр текущего счетчика циклов.
Регистр содержит текущее значение
счетчика циклов (число оставшихся циклов
передачи). Отображаемое в нем число циклов
всегда на единицу меньше числа еще не
переданных элементов данных.
Обращение к регистрам текущего счетчика
циклов производится по адресам регистров
начального счетчика циклов в режиме чтения
значения.
to be continued ...
+------------================------------+
На этом, пожалуй, все. Ожидайте
продолжение этого романа и не забывайте,
что содержимое этого раздела газеты
ZxPilot зависит лишь от вас! Задавайте
вопросы, а мы здесь же на них и ответим!
Связаться с нами можно по нижеследующим
адресам:
Михальченков Дмитрий Александрович
Post-Mail:
85280, Украина, Донецкая обл,
г. Дзержинск, пос. Кирово,
ул. Юности дом 16, кв. 48
E-Mail:
mehanik@nv1.novdz.donetsk.ua (для Димы)
vadim@novdz.donetsk.ua
(subj:для гл.энергетика)
+------------================------------+
D M A II
──────────────────────────────────────────
░░░░░░░░ ░░░░░
░▒▒▒▒▒▒▒▒░ ░▒▒▒▒▒░░
░▒▓▓▓▓▓▓▓▓▒░ ░ ░ ░▒▓▓▓▓▓▒▒░
░▒▓████████▓▒░░▒░ ░▒░░▒▓█████▓▓▒░
░▒▓███▓▓███▓▒▒▓▒░ ░▒▓▒▒▓███▓▓███▓▒░
░▒▓███▓▒▓███▓▓█▓▒░ ░▒▓█▓▒▓███▓▒▓███▓▒░
░▒▓███▓▒▓███▓▓██▓▒░▒▓██▓▓███▓▒▒▓███▓▒░
░▒▓███▓▒▒▓███▓▓███▓▒▓███▓▓███▓▒▒▒▓███▓▒░
░▒▓███▓▒▒▓███▓▓████▓████▓▒▓███▓▓▓████▓▒░
░▒▓███▓▒▒▓███▓▓█████████▓▒▓██████▓███▓▒░
░▒▓███▓▒▒▓███▓▒▓███▓█▓███▓▒▓███▓▓▓▒▓███▓▒░
░▓▓███▓▓▓███▓▒▒▓███▓▓▓███▓░▒▓███▓▒▒▓███▓▒░
▒▓█████████▓▒░░▒▓▓▓▒▒▒▓▓▓▒░▒▓███▓▒▒▓███▓▒░
░▒▓▓▓▓▓▓▓▓▓▒░ ░▒▒▒░░░▒▒▒░ ░▒▓▓▓▒░░▒▓▓▓▒░
░▒▒▒▒▒▒▒▒▒░ ░░░ ░░░ ░▒▒▒░ ░▒▒▒░
░░░░░░░░░ Ultrasound Card ░░░ ░░░
--==єє The Best for SPECCY ЄЄ==--
Здоровенькi були!
Приветствую тебя, читатель ZxPilotа!
Вот и дождались вы продолжения этой
рубрики. Как говорится - не прошло и
века;) А причин тому было много! Первая и
наиболее весомая - енто ваша нулевая
активность, господин Читатель!;( Я просто
не знаю о чем писать, вот еще парочку
статей дам редактору, а на том и все:(
Ну да ладно, это я так, отвлекся.
Сегодня же мы поговорим о регистрах
режима, команд, маски и состояния. Итак,
поехали...
──────────────────────────────────────────
2.6. Регистр режима.
Данный регистр задает режим работы
своего канала контроллера. Имеет адрес
#bc77. Биты регистра имеют следующее
назначение:
╔═╤═╤═╤═╤═╤═╤═╤═╗
║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 -каскадный режим
Кратко объясню назначение некоторых
битов:
■ Номер канала - выбор канала ПДП,
режим которого задается.
■ Режим работы - для работы DMA USC
используется всего два режима:
- чтение из памяти (комбинация - 10) -
при проигрывании сэмпла, либо при
перемещении блока данных в памяти
(задается для канала-источника).
- запись в память (комб. - 01) - при
перемещении блока, задается для ка-
нала-приемника.
■ Автоинициализация - иными словами -
зацикливание, т.е. при окончании передачи
восстанавливаются исходные данные
начального адреса и длины блока. Т.о. если
мы установим 4й бит регистра, то мы
разрешим повторение передачи заново.
■ Изменение текущего адреса. При
нулевом состоянии этого бита при передаче
адрес увеличивается, т.е. сэмпл будет
проигрываться нормально, иначе -
происходит уменьшение адреса.
■ Тип передачи: БИС i8237 (КР1810ВТ37)
поддерживает 4 режима передачи данных, но
для работы с DMA USC нам нужен всего лишь
один - режим одиночной передачи
(комбинация 01). Этот режим заключается в
том, что после передачи очередного байта
данных карта освобождает шину процессору,
но сразу же начинает проверку сигналов
запроса и, как только обнаруживает
активный сигнал запроса, инициирует
следующий цикл передачи.
>!!!< Остальные режимы в данном
руководстве описываться не будут из-за
узкой направленности статьи. Если кому-то
интересно полное описание БИС, входящих в
карту, можете обратиться к автору.
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-низкий
Для работы со звуком все разряды
регистра устанавливаем в 0-е состояние.
Другие комбинации применяются для работы с
блоками данных, для их переброски, заливки
... но об этом поговорим отдельно.
2.8. Регистр маски.
Перед программированием какого-либо
канала нужно запретить ему выполнять
текущую работу, для этого его надо
замаскировать. А чтобы разрешить работу
канала после программирования его нужно
демаскировать. Для этих операций в DMA
имется два регистра:
1.Регистр маски (#fc77) - маскирует/
демаскирует все каналы ПДП. Биты 0-3
регистра отвечают соответственно за 0-3
каналы. 0 в соответствующем бите разрешает
работу, а 1 - запрещает.
2.Регистр одиночной маски (#ac77).
╔═╤═╤═╗
║2│1│0║
╚╤╧╤╧╤╝
│ └─┴──────0-1: Номер канала.
└──────────2: 0-разрешить работу,
1-запретить.
2.9. Регистр состояния.
Регистр отражает текущее состояние
запросов и передач по всем четырем
каналам. Биты 0-3 устанавливаются в
единицу после завершения передачи по
каналам 0-3 (бит 0 - канал 0, бит 1 -
канал 1 и т.д.), если не задан режим
автоинициализации. Эти биты очищаются
после команды сброса контроллера и после
каждой операции считывания состояноя из
регистра состояния. Биты 4-7 указывают по
какому из каналов 0-3 активен в текущий
момент сигнал запроса на ПДП.
На этом все. С наилучшими пожеланиями,
Дмитрий aka
Hard/WCG
+-------------=====[Cut]=====------------+
Задать нам вопросы или просто так,
можно по адресам:
Михальченков Дмитрий Александрович
Post-Mail:
85280, Украина, Донецкая обл,
г. Дзержинск, пос. Кирово,
ул. Юности дом 16, кв. 48
E-Mail:
mehanik@nv1.novdz.donetsk.ua (для Димы)
vadim@novdz.donetsk.ua
(subj:для гл.энергетика)
+------------================------------+
Другие статьи номера:
Похожие статьи:
В этот день... 3 ноября