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 - авторы газеты.


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

Похожие статьи:
Игры - обзор ELITE-2 для Spectrum-48K.
Раскрутка - прохождение текстовой адвентюры Knightmare.
Интерфейс - письма читателей: "SPECTRUM - это компьютер тех, кто развивается, кто увлечен им"...
Авторы журнала - Своих ГЕРОЕВ надо знать...
Обратная связь - Конкурс: Кто лучше придумает музыку для второго номера нашего журнала.

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