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:для гл.энергетика) +------------================------------+
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября