Рис. 7.2. Схема формирования звука для встроенного динамика
контроллер прерываний, являясь источником аппаратного прерывания от тайме-
ра, которое возникает 18,2 раза в секунду. Канал 1 связан с микросхемой прямого
доступа к памяти (DMA). И наконец, канал 2 выходит на динамик компьютера.
Как мы отметили, каналы таймера имеют одинаковую структуру, основу которой
составляют три
ввода-вывода разрядностью 8
регистр-фик-
сатор (latch register)
(counter register), оба по 16 битов. Все ре-
гистры связаны между собой следующим образом. В регистр ввода-вывода извне
помещается некоторое значение. Источником этого значения может быть либо
системное программное обеспечение, либо программа пользователя. Каждый ре-
гистр ввода-вывода имеет адрес в адресном пространстве ввода-вывода (номер
порта ввода-вывода). Регистр ввода-вывода канала 2 имеет номер порта ввода-
вывода 42h. Помещаемые в него значения немедленно попадают в регистр-фикса-
тор, где значение сохраняется до тех пор, пока в регистр ввода-вывода не будет
записано новое значение. Но как согласуются эти регистры по их разрядности, ведь
один из них
а другой 16-разрядный? Для этого предназначен
управле-
ния (ему соответствует порт 43h), который является частью механизма управле-
ния всей микросхемой таймера. Он содержит слово состояния, с помощью которо-
го производятся выбор канала, задание режима работы канала и типа операции
передачи значения в канал.
Ввод из порта и вывод в порт
Далее описана структура слова состояния:
Бит 0 определяет тип константы пересчета: 0 — константа задана двоичным
числом, 1 — константа задана двоично-десятичным (BCD) числом. Константа
пересчета — значение, загружаемое извне в регистр-фиксатор; в нашем случае
загружаться будет двоичное число, поэтому значение этого поля будет равно 0.
ii Биты 1-3 определяют режим работы микросхемы таймера. Всего можно опре-
делить шесть режимов, но обычно используется третий, поэтому для нашего
случая значение поля —
т Биты 4-5 определяют тип операции: 00 — передать значение счетчика в регистр-
фиксатор (то есть возможны не только операция записи значения в канал, но
и извлечение значения регистра-счетчика из него), 10 — записать в регистр-фик-
сатор только старший байт, 01 — записать в регистр-фиксатор только младший
байт,
— записать в регистр-фиксатор сначала старший байт, затем младший.
В нашем случае значение поля будет
Поэтому формирование
регистра-фиксатора через 8-разрядный регистр ввода-вывода производится
следующим образом: запись производится в два приема, первый байт из регис-
тра ввода-вывода записывается на место старшего байта регистра-фиксатора,
второй байт — на место младшего байта. Нетрудно догадаться, что в регистр
ввода-вывода эти байты помещаются командами IN и OUT.
II Биты 6-7 определяют номер программируемого канала. В нашем случае они
равны 10.
Для формирования любого звука необходимо задать его длительность и высо-
ту. После того как значение из регистра ввода-вывода попало в регистр-фиксатор,
оно моментально записывается в регистр-счетчик. Сразу же после этого значение
регистра-счетчика начинает уменьшаться на единицу с приходом каждого импульса
от системных часов. На выходе любого из трех каналов таймера стоит схема логи-
ческого умножения. Эта схема имеет два входа и один выход. Значение регистра-
счетчика участвует в формировании сигнала на одном из входов схемы логическо-
го умножения Сигнал на втором входе этой схемы зависит от состояния бита О
регистра микросхемы интерфейса с периферией (порт 61h). В свое время мы по-
дробно разберемся с логическими операциями, сейчас следует лишь пояснить, что
единица на выходе схемы логического умножения может появиться только в од-
ном случае — когда на обоих входах единицы. Когда значение в регистре-счетчике
становится равным нулю, на соответствующем входе схемы И формируется такая
единица.
если при этом на втором входе, значение которого зависит от бита О
порта 61h, также 1, то импульс от системных часов проходит на выход канала 2.
Одновременно с пропуском импульса в канале 2 немедленно производится загрузка
содержимого регистра-фиксатора (которое не изменилось, если его не изменили
извне) в регистр-счетчик. Весь процесс с уменьшением содержимого регистра-счет-
чика повторяется заново. Теперь вы понимаете, что чем меньшее значение загру-
жено в регистр-фиксатор, тем чаще будет происходить обнуление регистра-счет-
чика и тем чаще импульсы будут проходить на выход канала 2. А это означает
большее значение высоты звука. Понятно, что максимальное значение частоты на
входе 1 динамика — 1,19 МГц. Таким образом, импульс с выхода канала 2 попадает
Глава 7. Команды обмена данными
на динамик, и если на последний подан ток, то возникает долгожданный звук. По-
дачей тока на динамик управляет бит 1 порта 61h. Как прервать звучание? Очевид-
но, для этого возможны два пути: первый — отключить ток, сбросив бит 1 порта
61h, второй — сбросить бит 0 порта 61h. Эти две возможности используют для соз-
дания различных звуковых эффектов. Сбрасывая и устанавливая эти биты, мы
фактически определяем
звучания.
Если вы внимательно следили за всеми рассуждениями, то, наверное, без труда
сможете понять, почему первый канал таймера формирует сигналы аппаратного
прерывания от таймера
раза в секунду (на основании этих сигналов програм-
мы отслеживают время). Для этого BIOS во время загрузки после включения ком-
пьютера загружает в первый канал соответствующее значение.
Таким образом, наметились три последовательных действия, необходимые для
программирования звукового канала таймера (они применимы и к остальным ка-
налам).
1. Посредством порта
h выбрать канал, задать режим работы и тип операции
передачи значения в канал. В нашем случае соответствующее значение будет
равно
2. Подать ток на динамик, установив бит 1 порта 61h.
3. Используя регистр АХ, поместить нужное значение в порт 42h, определив тем
самым нужную высоту тона.
Далее в листинге
приведена программа, реализующая некоторые звуки.
Многие команды вам уже знакомы, некоторые мы пока еще не рассматривали, по-
этому поясним их функциональное назначение. Подробно они будут рассмотрены
в последующих главах. Для удобства в программе была использована макроко-
манда delay, выполняющая задержку работы программы на заданное время. По-
дробнее механизм макроподстановок будет рассмотрен в главе 14. Сейчас только
отметьте для себя, что введенная таким образом макрокоманда в тексте програм-
мы синтаксически ничем не отличается от других команд ассемблера, и это позво-
ляет программисту при необходимости расширить стандартный набор команд ас-
семблера. Введите текст макрокоманды delay (строки 13-25) и воспринимайте ее
чисто по функциональному назначению (задержка выполнения программы на про-
межуток времени, задаваемый значением ее операнда). Стоит отметить, что дан-
ная макрокоманда чувствительна к производительности процессора, из-за чего
звуки на компьютерах с разными моделями процессоров могут не совпадать. Сег-
мент кода, как обычно, начинается с настройки сегментного регистра DS (строки
32-33) на начало сегмента данных. После этого строками 37-38 мы выполняем
действия первого этапа — настройку канала 2, которая заключается в записи в ре-
гистр управления (порт 43h) байта состояния OB6h. На втором шаге мы должны
установить биты 0 и 1 порта 61h. Предварительно необходимо извлечь содержи-
мое этого порта. Это делается для того, чтобы выполнять установку битов 0 и 1, не
изменяя содержимого остальных битов порта 61h (строки 39-41). Принцип фор-
мирования сигнала сирены заключается в том, что в цикле на единицу изменяется
содержимое регистра-счетчика и делается небольшая задержка для того, чтобы
сигнал некоторое время звучал с нужной высотой. Постепенное повышение, а за-
Ввод из порта и вывод в порт 155
тем понижение высоты и дает нам эффект сирены. Строки 43-53 соответствуют
циклу, в теле которого высота повышается, а строки 55-62 — циклу понижения
тона. Оба цикла повторяются последовательно 5 раз. Контроль осуществляется
с помощью переменной cnt, содержимое которой увеличивается на 1 в строке 69
и контролируется на равенство 5 в строках 71-72. Если cnt = 5, то команда СМР
устанавливает определенные флаги. Последующая команда условного перехода
анализирует эти флаги и в зависимости от их состояния передает управление
либо на метку, указанную в качестве операнда этой команды, либо на следующую
за
команду. Цикл в программе ассемблера можно организовать несколькими
способами; все они будут подробно рассмотрены в главах 10 и
В данном случае
цикл организуется командой ШОР, которая в качестве операнда имеет имя метки.
На эту метку и передается управление при выполнении команды ШОР. Но до того
как передать управление, команда ШОР анализирует содержимое регистра ЕСХ/СХ,
и если оно равно нулю, управление передается не на метку, а на следующую за
команду. Если содержимое регистра ЕСХ/СХ не равно нулю, то оно уменьшает-
ся на единицу и управление передается на метку. Таким образом в ЕСХ/СХ хранится
Do'stlaringiz bilan baham: |