Внутри корпуса IBM PC есть маленький динамик. Программа может
управлять звуками, генерируемыми этими динамиком. Для этого нужно
управлять некоторыми выходными битами микросхемы 8255 и генератора
тона в микросхеме 8253.
На Фиг. 8.1 показана программа, которая управляет динамиком
двумя разными способами. Первый способ, помеченный в листинге
меткой DIRECT, непосредственно управляет динамиком. Бит 1 выводного
порта 61H подключен к динамику. Всякий раз, когда программа меняет
значение этого бита, диффузор динамика двигается либо наружу, либо
внутрь. Быстро меняя значение этого бита, программа генерирует
звук. Это иллюстрирует первая часть программы на Фиг. 8.1, она
меняет значение бита 1, порождая высокочастотный тон. Скорость, с
которой программа меняет бит 1, определяет частоту тона.
Взяв на себя непосредственное управление динамиком, вы должны
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:05:08
Фиг. 8.1 Управление динамиком Page 1-1
PAGE ,132
TITLE Фиг. 8.1 Управление динамиком
0000 STACK SEGMENT STACK
0000 0040[ DW 64 DUP (?)
????
]
0080 STACK ENDS
0000 CODE SEGMENT
ASSUME CS:CODE
0000 SPEAKER PROC FAR
0000 1E PUSH DS ; Адрес возврата
0001 B8 0000 MOV AX, 0
0004 50 PUSH AX
;----- Задание режима работы динамика
0005 2B C9 SUB CX, CX ; Счетчик цикла
0007 E4 61 IN AL, 61H
0009 24 FE AND AL, 0FEH
000B E6 61 OUT 61H, AL ; Установка разряда 0 порта 61H в 0 для
; задания прямого управления динамиком
000D DIRECT:
000D 0C 02 OR AL, 2
000F E6 61 OUT 61H, AL ; Включить динамик
0011 24 FD AND AL, 0FDH
0013 E6 61 OUT 61H, AL ; Выключить динамик
0015 E2 F6 LOOP DIRECT
;----- Управление высотой звука динамика
0017 B0 B6 MOV AL, 10110110b
0019 E6 43 OUT 43H, AL ; Установка режима для 2-го канала
001B B8 03E8 MOV AX, 1000 ; Выбор высоты звука
001E E6 42 OUT 42H, AL
0020 8A C4 MOV AL, AH
0022 E6 42 OUT 42H, AL ; Занесение высоты звука в порт динамика
0024 E4 61 IN AL, 61H
0026 8A E0 MOV AH, AL
0028 0C 03 OR AL, 3
002A E6 61 OUT 61H, AL ; Выбор режима управления динамикаом
002C 2B C9 SUB CX, CX
002E KILL_TIME:
002E E2 FE LOOP KILL_TIME ; Цикл ожидания, во время которого
; работает динамик
0030 8A C4 MOV AL, AH
0032 E6 61 OUT 61H, AL ; Выключение динамика
0034 CB RET
0035 SPEAKER ENDP
0035 CODE ENDS
END
Фиг. 8.1 Управление динамиком
прежде всего работать с выводным портом микросхемы 8255 системной
платы. Программируемый периферийный
интерфейс микросхемы 8255 (PPI) имеет всего три входных или
выходных, порта. IBM PC инициализирует микросхему 8255 так, чтобы получилось два входных
порта - 60H и 62H - и один порт вывода, 61H. Порт 60H в первую
очередь вводит значения с клавиатуры. Его можно
также использовать для чтения положения переключателей на системной
плате. Обычно состояния этих переключателей читаются только один
раз, во время инициализации при включении питания системы.
Результат программа BIOS записывает в память для дальнейшего
использования. Поэтому с точки зрения наших целей можно считать,
что порт 60H непосредственно обслуживает ввод с клавиатуры. Вообще
входной порт выполняет важную функцию. Он служит буфером между
микропроцессором и устройством ввода-вывода; он передает данные
микропроцессору только тогда, когда последний запрашивает их
командой IN. Все остальное время вводной порт задерживает данные и
не допускает, чтобы они повлияли на работу микропроцессора.
Другой порт ввода микросхемы 8255, порт 62H, обслуживает другие
входы. Четыре его бита непосредственно соответствуют
переключателям, показывающим объем памяти, подсоединенной к
системному каналу ввода-вывода. Другие четыре бита имеют
индивидуальное назначение. Два из них показывают тип системной
ошибки. Программа обслуживания немаскируемого прерывания NMI
использует эти биты для определения причины системной аварии. Бит 5
порта 62H используется для обратной связи с одним из каналов
таймера-счетчика. Этот бит служит индикатором текущего выхода
второго канала микросхемы 8253. Бит 4 порта 62H отражает текущее
состояние ввода с кассетного магнитофона. Сзади у IBM PC, рядом с
разъемом для подключения клавиатуры, имеется разъем для подключения
кассетного магнитофона. При чтении данных с кассеты, этот бит
используется для определения текущего значения, вводимого с
кассеты.
Порт 61H - это порт вывода микросхемы 8255 в машине фирмы IBM.
Всякий выходной порт захватывает (временно запоминает) данные,
выводимые программой. Если бы аппаратура не запоминала данные, они
бы пропали в течение микросекунды или около этого. Такое
запоминание данных позволяет сохранять их значение в порте до тех
пор, пока они снова не будут изменены программой. То есть, когда мы
выводим значение, меняющее положение диффузора динамика, оно
остается неизменными до тех пор, пока его не изменит программа.
На Фиг.8.2 показано значение битов порта 61H. Эти данные взяты
из из технического описания.
При изучении управления динамиком
имеют значение только биты 0
и 1. Из всех других - только бит 3 -
управление двигателем
кассетного магнитофона - и бит 7 - сброс
ввода с клавиатуры - имеют
какое-то значение для наших программ.
Остальные биты предназначены
только для инициализации и диагностики.
Чтобы полностью разобраться
в них, нужно детально изучить
принципиальные схемы системы.
Возвращаясь к обсуждению управления
динамиком, мы можем
заметить, что биты 0 и 1 используются для
непосредственного
Бит Значение
-----------------------------------------------------
0 Порт 2 таймера (упраление динамиком)
1 Прямое управление динамиком
2 Мультиплексный порт 62H
3 Управление мотором кассетного магнитофона
4 Включение контроля доступа на системной
плате памяти
5 Включение контроля доступа в памяти
каналов ввода-вывода
6 Временной контроль клавиатуры
7 Мультиплексный/сброса ввода с клавиатуры
порт 60H
-----------------------------------------------------
Фиг. 8.2 Значение битов порта 61H
управления. Как показано на Фиг. 8.1,
установка бита 0 в положение
0 включает прямое управление динамиком,
блокируя механизм генерации
звука микросхемой 8253. Этот метод
используется во второй части
програмы.
Обратите внимание на то, как программа
сбрасывает бит 0.
Команда OUT включает все 8 бит порта 61H.
Способа изменить только
бит 0, оставив остальные биты нетронутыми,
не существует. Если в
программе нужно изменить только бит 0, она
должна считать из порта
текущее значение других разрядов. К
счастью, микросхема 8255
допускает прямое программное чтение
выводных портов.
Последовательность команд
IN
AL , 61H
AND
AL , 0FFH
OUT
61H, AL
читает текущий код из выводного порта,
затем команда AND сбрасывает
младший бит, а команда OUT посылает
результат в выводной порт. Если
бы программа вывела в порт просто число 0,
динамик работал бы
верно, но клавиатура была бы выключена.
Работая с любым портом
вывода побитовой настройки, стройте
программу так, чтобы она не
влияла ни на один из других бит, если
только вы не собираететсь
изменять и их.
Оставшаяся часть первой программы на
Фиг.8.1 изменяет значение
бита 1 выходного порта. Исходное значение
порта 61H находится уже в
регистре AL, так что программе не нужно
читать его при каждом
выполнении цикла. Регистр CX используется
таким образом, чтобы
выполнить цикл 64K раз. При выполнении
программы вам, возможно, не
удастся услышать звук, генерируемый
программой. В этом случае
попытайтесь вставить несколько добавочных
команд NOP в цикл DIRECT.
Это снизит частоту тона.
Вторая часть программы на Фиг. 8.1 для
генерации тональности
использует таймер-счетчик 8253. Прежде чем
двигаться дальше,
обсудим функционирование микросхемы 8253,
чтобы понять, как она
используется в системе. Микросхема 8253
фирмы Intel содержит три
16-битовых счетчика, которые могут быть
использованы в системе для
счета или задания временных интервалов. В
один из счетчиков
программа загружает 16-битовое значение.
Содержимое счетчика
уменьшается на единицу по каждому импульсу
от таймера; частота
импульсов, подводимых с таймера ко всем
трем каналам, равна
1.19МГц. Это означает, что содержимое
счетчика уменьшается на
единицу каждые 840 наносекунд. Каждый из трех каналов имеет
выход.
Строка контроля выхода изменяется всякий
раз, когда содержимое
счетчика достигает нуля. Командами
управления определяют способ,
которым микросхема 8253 ведет счет.
Выходы этих трех каналов счетчика-таймера
подключаются к
различным узлам системной платы. Канал 0
подключается к контроллеру
прерываний 8259. Система использует этот
канал для порождения
прерывания времени суток. Канал 1 соединен
с контроллером прямого
доступа к памяти (ПДП или DMA) 8237, и
использовать этот канал
схемы 8253 нельзя, так как смена кода в
этом счетчике с большой
вероятностью уничтожит вашу программу и
все другие данные в памяти
системы. Канал 2 подключен к динамику для
генерации звука.
Позже мы вернемся к каналу 0 микросхемы
8253. Канал 2 Дает
выход на динамик. Для установки канала
таймера программа посылает
код 0B6H в порт 43H, управляющий порт
микросхемы 8253. Тем самым
канал 2 таймера-счетчика настраивается на
работу в качестве
делителя частоты. Таймер делит исходную
частоту - в данном случае
1.19МГц - на 16-битовое число, которое
программа загружает в
регистр канала 2. Регистр канала 2
расположен по адресу порта 42H
(канал 0 - это порт 40H и, поскольку вы
никогда не должны изменять
содержимое канала 1, задачу определения
адреса его порта мы
оставляем вам). Программа в примере
загружает в регистр канала
число 1000. Это означает, что на выходе вы
услышите частоту 1190Гц.
На самом деле, вы услышите основную
частоту 1190 Гц плюс обертоны,
вызванные прямоугольной формой сигнала
таймера.
Заметим, что число 1000 - 16-битовое, в то
время как порт 42H -
8-битовый. Команда установки режима
работы, которую мы послали в
порт 43H, сообщила микросхеме 8253, что в
нее будет выводиться
16-битовое число в виде двух 8-битовых.
Сначала посылается младший
значащий байт, а за ним следует старший.
Такая двухшаговая
процедура загружает в канальный регистр
требуемое значение.
Далее программа должна дать управляющему
порту 61H такую
установку, чтобы он пропускал сигнал на
динамик. Для этого
программа устанавливает равными 1 биты 0 и
1 управляющего порта.
Заметим, что программа в начале сохраняет
первоначальное значение
кода из управляющего порта и
восстанавливает его в конце. Это
отключает динамик по окончании звука. Если
этот способ
недостаточен, - например, если программа
генерирует звук тогда,
когда не совсем ясно, был ли выключен
динамик - можно выключить
его, сбросив в нуль бит 1 порта 61H.
Эти два метода управления динамиком
наиболее прямолинейны. Эти
методы можно пытаться комбинировать в
поисках интересных эффектов.
После установки на вывод звука при помощи
микросхемы 8253 можно
модулировать выходной сигнал посредством
битов 1, 0 или обоих,
порта 61H, а также менять число в
канальном счетчике при включенном
динамике. Программу на Фиг. 8.1 можно
изменить так, чтобы она
выводила значение регистра CX при каждой
итерации цикла. Это
приведет к тому, что частота сигнала из
динамика будет расти от
очень низкого к очень высокому тону.
Работая с этими тремя
управляющими значениями, вы сможете
создать множество интересных
эффектов.