На главную Назад
Добро пожаловать, уважаемый посетитель!

Внутри корпуса IBM PC есть маленький динамик. Программа может

управлять звуками, генерируемыми этими динамиком. Для этого нужно

управлять некоторыми выходными битами микросхемы 8255 и генератора

тона в микросхеме 8253.

 

На Фиг. 8.1 показана программа, которая управляет динамиком

двумя разными способами. Первый способ, помеченный в листинге

меткой DIRECT, непосредственно управляет динамиком. Бит 1 выводного

порта 61H подключен к динамику. Всякий раз, когда программа меняет

значение этого бита, диффузор динамика двигается либо наружу, либо

внутрь. Быстро меняя значение этого бита, программа генерирует

звук. Это иллюстрирует первая часть программы на Фиг. 8.1, она

меняет значение бита 1, порождая высокочастотный тон. Скорость, с

которой программа меняет бит 1, определяет частоту тона.

Взяв на себя непосредственное управление динамиком, вы должны

Microsoft (R) Macro Assembler Version 5.001/1/80 04:05:08

Фиг. 8.1 Управление динамикомPage1-1

 

PAGE,132

TITLEФиг. 8.1 Управление динамиком

0000STACKSEGMENT STACK

00000040[DW64 DUP (?)

????

]

0080STACKENDS

 

0000CODESEGMENT

ASSUMECS:CODE

0000SPEAKER PROCFAR

00001EPUSHDS; Адрес возврата

0001B8 0000MOVAX, 0

000450PUSHAX

 

;-----Задание режима работы динамика

00052B C9SUBCX, CX; Счетчик цикла

0007E4 61INAL, 61H

000924 FEANDAL, 0FEH

000BE6 61OUT61H, AL ; Установка разряда 0 порта 61H в 0 для

;задания прямого управления динамиком

000DDIRECT:

000D0C 02ORAL, 2

000FE6 61OUT61H, AL ; Включить динамик

001124 FDANDAL, 0FDH

0013E6 61OUT61H, AL ; Выключить динамик

0015E2 F6LOOPDIRECT

 

;-----Управление высотой звука динамика

0017B0 B6MOVAL, 10110110b

0019E6 43OUT43H, AL ; Установка режима для 2-го канала

001BB8 03E8MOVAX, 1000; Выбор высоты звука

001EE6 42OUT42H, AL

00208A C4MOVAL, AH

0022E6 42OUT42H, AL ; Занесение высоты звука в порт динамика

 

0024E4 61INAL, 61H

00268A E0MOVAH, AL

00280C 03ORAL, 3

002AE6 61OUT61H, AL ; Выбор режима управления динамикаом

002C2B C9SUBCX, CX

002EKILL_TIME:

002EE2 FELOOPKILL_TIME; Цикл ожидания, во время которого

;работает динамик

00308A C4MOVAL, AH

0032E6 61OUT61H, AL ; Выключение динамика

 

0034CBRET

0035SPEAKER ENDP

0035CODEENDS

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. Эти данные взяты

из из технического описания.

 

и 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

допускает прямое программное чтение выводных портов.

Последовательность команд

 

INAL , 61H

ANDAL , 0FFH

OUT61H, 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 при каждой итерации цикла. Это

приведет к тому, что частота сигнала из динамика будет расти от

очень низкого к очень высокому тону. Работая с этими тремя

управляющими значениями, вы сможете создать множество интересных

эффектов.


 

Mail.ru