ZX Pilot #41
29 декабря 2002

Железо - Руководство по программированию самой крутой звуковой карты - DMA USC.

<b>Железо</b> - Руководство по программированию самой
крутой звуковой карты - 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:для гл.энергетика)

+------------================------------+




Другие статьи номера:

Вступление - вступление к газете.

Новости - новости от Ковровских спектрумистов.

О разном - IS-DOS не так уж и плох?

Тема - почему Nemo такой сукин сын?

Тема - продолжение опуса от Nemo.

Наш гость - мемуары Alone Coder'a.

Железо - Руководство по программированию самой крутой звуковой карты - DMA USC.

Новелла - Предсказание.

Comics - История.

Comics - Прекрасное чувство.

Birthday - поздравления спектрумистов с днями рождения.

Реклама - реклама и обьявления.

Credits - авторы газеты.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Вступление - Второй номер нашего журнала Flash Time, задерживается на неопределенный срок.
News - Karbo came back and wrote new music, Freeman is in Ukraine now, in Odessa (left there before the Maidan, to the sea, for health reasons), sculpts games for mobile phones, Mythos codes firmware for BMW on outsourcing and is engaged.
С битой по миру - размышления на тему "спектрум умрет только тогда, когда уйдет последний спектрумист".
Hints - Трюк с отгрузками в Чёрном Вороне.
Проза - А.Н.Толстой: Японская комната.

В этот день...   21 декабря