Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР_АИС_ч2.doc
Скачиваний:
15
Добавлен:
03.03.2016
Размер:
1.24 Mб
Скачать

С клавиатуры и вывода на экран дисплея и методов генерирования звука в персональных эвм с использование прерываний bios”

  1. Цель работы

Изучить и исследовать команды прерывания ПЭВМ и научиться программировать задачи ввода данных с клавиатуры и вывода сообщений на экран монитора компьютера.

Изучить методы генерирования звуковых сигналов программным способом. Исследовать алгоритмы воспроизведения звуковых колебаний путём вывода прямоугольной последовательности импульсов через параллельный порт компьютера, а также программирования микросхемы таймера.

3. Основные теоретические положения

3.1 Программирования процедур ввода данных с клавиатуры и вывода на экран дисплея ПЭВМ.

Все необходимые экранные и клавиатурные операции на ПЭВМ можно выполнить с помощью команды прерывания BIOS INT 10H, которая передает управление непосредственно в базовую систему ввода/вывода. Для выполнения некоторых более сложных функций существует прерывание более высокого уровня INT 21H, которое сначала передает управление в DOS.

Команда INT прерывает работу текущей программы, передает управление в DOS или BIOS для определенного действия и затем возвращает управление в прерванную программу. Наиболее часто прерывание используют для операций ввода/вывода. При выходе из программы и последующем возврате команда INT выполняет следующее:

  • уменьшает указатель стека на 2 и заносит в вершину стека содержимое регистра флагов;

  • очищает флаги TF и IF;

  • уменьшает указатель стека на 2 и заносит содержимое регистра CS в стек;

  • уменьшает указатель стека на 2 и заносит в стек значение IP;

  • обеспечивает выполнение указанного номером прерывания действия;

  • восстанавливает из стека значения регистров и возвращает управление в прерванную программу на команду, следующую после INT.

Этот процесс процессор выполняет автоматически. Программисту необходимо лишь определить сегмент стека достаточно большим для записи в него содержимого регистров.

Установка курсора.

Экран компьютера можно представить в виде двухмерного пространства с адресуемыми позициями, в любую из которых может быть установлен курсор. Обычный монитор, например, имеет 25 строк (нумеруемых от 0 до 24) и 80 столбцов (нумеруемых от 0 до 79). Так левый верхний угол экрана имеет координаты 00, 00; верхний правый - 00,79 (00h,4Fh), центр экрана - 12,39/40 (0Сh,27/28h), а правый нижний - 18h,4Fh.

Команда INT 10h включает в себя установку курсора в любую позицию и очистку экрана. Например:

MOV AH,02 ;

Запрос на установку курсора

MOV BH,00 ;

Экран 0

MOV DH,05 ;

Строка 05

MOV DL,12 ;

Столбец 12

INT 10h ;

Передача управления в BIOS.

Очистка экрана

Для очистки экрана используется функция прокрутки (АН=06) с заполнением экрана пробелами (AL=00). Начальное значение строки и столбца заносится в регистр СХ, конечное - в DX, а в регистр ВН заносится число 07 (черно-белый режим).

MOV AX, 0600h

MOV BH, 07

MOV CX, 0000

MOV DX,184Fh

INT 10h .

Вывод на экран в базовой версии DOS.

Вывод на экран требует определения текстового сообщения в области данных, установки в регистре АН значения 09 (Вызов функции DOS) и указания команды DOS INT 21h. В процессе выполнения операции конец сообщения определяется по ограничителю ($).

NAME DB ‘Имя студента’, ‘$’

MOV AH, 09 ;

Запрос вывода на экран

LEA DX, NAME ;

загрузка адреса сообщения

INT 21h ;

Вызов DOS .

Ввод данных с клавиатуры (базовая версия DOS)

Для ввода, использующего базовую версию DOS, область ввода требует наличия списка параметров, содержащего спецификацию полей, которые необходимы для выполнения команды INT. В частности, должна быть определена максимальная длина вводимого текста и определено поле, куда команда возвращает действительную длину введенного текста в байтах.

NAMEPAR ;

Список параметров

MAXLEN DB 20 ;

Максимальная длина

REALLEN DB ? ;

Реальная длина

NAMEFLD DB 20 DUP(‘ ‘) ;

Введенные символы .

Для запроса на ввод необходимо поместить в регистр АН номер функции 10 (0Аh), загрузить адрес списка параметров (NAMEPAR в нашем примере) в регистр DX и вызвать функцию DOS ввода данных с клавиатуры INT 21h.

Операции ввода данных с клавиатуры ПЭВМ и вывода на экран дисплея ПЭВМ можно осуществить с помощью команд прерывания INT. Все необходимые экранные и клавиатурные операции выполняются путем обращения к стандартным подпрограммам базовой системы ввода/вывода (BIOS) посредством команды INT 10H или к подпрограммам операционной системы ПЭВМ (DOS) с помощью команды INT 21H. Подпрограммы BIOS позволяют выполнять относительно простые операции ввода/вывода, в то время как подпрограммы DOS предоставляют более широкий набор функций, позволяющих наряду с вводом/выводом данных осуществлять подсчет введенных символов, проверять наличие специальных управляющих символов и т.д.

Команда INT прерывает обработку текущей программы, передает управление в DOS или BIOS для выполнения определенных действий и затем возвращает управление в прерванную программу для продолжения обработки. В текстовом режиме дисплея его экран представляется в виде двухмерного пространства с адресуемыми позициями, в любую из которых может быть установлен курсор. Обычный видеомонитор имеет формат 80х25, т.е. 25 строк (нумеруемых от 0 до 24) и 80 столбцов (нумерация 0-79). Левый верхний угол экрана имеет координаты 00,00, а нижний - 24,79 (18H,4FH). В ряде дисплеев формат экрана изменен до 40х25.

В текстовом режиме с форматом 80х25 на экране последовательно может быть отображено до 4-х страниц текста, а с форматом 40х25 -до 8 страниц. Для работы монохромного дисплея имеется память объемом 4 Кбайт, начинающаяся по шестнадцатиричному адресу В0000 (дисплейный буфер). Эта память включает:

- 2 Кбайт для символов на экране (25 строк х 80 столбцов);

- 2 Кбайт для байтов-атрибутов, обеспечивающих инвертирование, мигание, выделение яркостью и подчеркивание.

Для работы стандартного цветного графического дисплея имеется 16 Кбайт памяти (дисплейный буфер), начинающейся по шестнадцатеричному адресу В0000. Такой дисплей может являться текстовым (для нормального ASCII-кода) или графическим и работать как в цветном, так и в черно-белом (BW) режиме. Дисплейный буфер обеспечивает экранные страницы, пронумерованные от 0 до 3 для экрана на 80 столбцов и от 0 до 7 для экрана на 40 столбцов. Номер страницы по умолчанию - 0, но можно установить любую страницу в памяти.

Байт-атрибут как для монохромного, так и для графического дисплея в текстовом (не графическом) режиме определяет характеристики каждого отображаемого символа. Байт-атрибут имеет следующие 8 бит:

Фон

Текст

Атрибут:

BL R G B

I R G B

Номер битов:

7 6 5 4

3 2 1 0

Буквы RGB представляют битовые позиции, управляющие соответственно красным (Red), зеленым (Green) и синим (Blue) лучом в цветном мониторе. Бит 7 (BL) устанавливает мигание, а бит 3 (I) интенсивность свечения. На монохромных мониторах текст высвечивается зеленым или оранжевым на темном фоне, хотя здесь такое изображение называется черно-белым (BW). Для модификации атрибутов можно комбинировать биты следующим образом:

Эффект выделения

Фон

RGB

Текст

RGB

Неотображаемый (черный по черному)

000

000

Подчеркивание (не для цвета)

000

001

Нормальный (белый по черному)

000

111

Инвертированный (черный по белому)

111

000

Цветные мониторы не обеспечивают подчеркивания; вместо этого установка битов подчеркивания выбирает синий цвет для текста и получается отображение синим по черному. Ниже приведены некоторые атрибуты, основанные на комбинации битов фона, текста, мигания, и выделения яркостью:

Двоичный код

Эффект выделения

0000 0000 00Н

Неотображаемый (для паролей)

0000 0111 07Н

Белый по черному, нормальный

1000 0111 87Н

Белый по черному, мигание

0000 1111 0FН

Белый по черному, яркий

0111 0000 70Н

Черный по белому, инверсия

1111 0000 F0Н

Черный по белому, инверсия, мигающий

Эти атрибуты подходят для текстового режима как для монохромных, так и для цветных дисплеев. Для генерации атрибута можно использовать команду INT 10H. При этом регистр BL должен содержать значение байта-атрибута, а регистр АН - один из следующих кодов: 06 (прокрутка вверх), 07 (прокрутка вниз), 08 (ввод символа с атрибутом), 09 (вывод символа с атрибутом). Если программа установила некоторый атрибут, то он остается таким, пока программа его не изменит. Если установить значение байта-атрибута равным 00, то символ вообще не будет отображен.

Прерывание INT 10H обеспечивает управление всем экраном. В регистре АН устанавливается код, определяющий функцию прерывания. Команда сохраняет содержимое регистров BX, CX, DX, SI и BP. Ниже описываются все возможные функции.

AH = 00: Установка режима. Данная функция позволяет переключать цветной монитор в текстовый или графический режимы. Установка режима для выполняемой в текущий момент программы осуществляется с помощью INT 10H. При установке происходит очистка экрана. Содержимое регистра AL может быть следующим:

00 40 х 25 чёрно-белый текстовый режим

01 40 х 25 стандартный 16-цветовой текстовый режим

02 80 х 25 черно-белый текстовый режим

03 80 х 25 стандартный 16-цветовой текстовый режим

04 320 х 200 стандартный 4-цветовой графический

05 320 х 200 черно-белый графический режим

06 640 х 200 черно-белый графический режим

07 80 х 25 черно-белый стандартный монохромный

0D 320 х 200 16-цветовой графический режим (EGA)

0E 640 х 200 16-цветовой графический режим (EGA)

0F 640 х 350 черно-белый графический режим (EGA)

10 640 х 350 64-цветовой графический режим (EGA)

Для определения типа адаптера, установленного в системе, служит прерывание BIOS INT 11H. Данная команда возвращает в регистре АХ значение, в котором биты 5 и 4 указывают на видеорежим:

00 40х25 черно-белый режим в цветном адаптере

10 80х25 черно-белый режим в цветном адаптере

11 80х25 черно-белый режим в черно-белом адаптере

Программа, работающая с неизвестным типом монитора, может проверить тип по регистру АХ после INT 11H и затем установить необходимый режим.

AH = 01: Установка размера курсора. Курсор не является символом из набора ASCII- кодов. Компьютер имеет собственное аппаратное обеспечение для управления видом курсора. Для этого имеется специальная обработка по INT- прерыванию. Обычно символ курсора похож на символ подчеркивания. Используя INT 10H, можно управлять вертикальным размером курсора: биты 4-0 в регистре СН для верхней линии сканирования, а биты 4-0 в регистре CL - для нижней. Можно установить любой размер курсора по вертикали: от 0 до 13 для монохромных и EGA-мониторов и от 0 до 7 для большинства цветных мониторов Приведем пример для увеличения размера курсора от его верхней линии сканирования до нижней:

MOV AH,01 ;

Установить размер курсора

MOV CH,00 ;

Верхняя линия сканирования

MOV CL,13 ;

Нижняя линия сканирования

INT 10H ;

Вызвать BIOS

В результате выполнения этих команд курсор превратится в сплошной мигающий прямоугольник. Можно установить любой размер курсора между верхней и нижней границами, например 04/08, 03/10 и т.д. Курсор сохраняет свой вид, пока программа не изменит его.

Использование размеров 12/13 (для моно) и 6/7 (для цвета) переводит курсор в его нормальный вид.

AH = 02: Установка позиции курсора. Эта функция устанавливает курсор в любую позицию на экране в соответствие с координатами строки и столбца. Номер страницы обычно равен 0, но может иметь значение от 0 до 3 при 80 столбцах на экране. Для установки позиции курсора необходимо занести в регистр АН значение 02, в регистр ВН - номер страницы и в регистр DX - координаты строки и столбца:

MOV AH,02 ; установить положение курсора

MOV BH,00 ; Страница 0

MOV DH,строка ; Строка

MOV DL,столбец ; Столбец

INT 10H ; Вызвать BIOS

AH = 03: Чтение текущего положения курсора. Программа может определить положение курсора на экране (строку и столбец), а также размеры курсора следующим образом:

MOV AH,03 ; Определить положение курсора

MOV BH,00 ; Страница 0

INT 10H ; Вызвать BIOS

После возврата регистр DH будет содержать номер строки, а регистр DL - номер столбца. В регистре CH будет верхняя линия сканирования, а регистре CL - нижняя.

AH = 05: Выбор активной страницы. В текстовом режиме с форматом экрана 80х50 устанавливается до 4 страниц ( от 0 до 3), а в формате 40х25 - до 8 страниц (от 0 до 7).

MOV AH,05 ; Установить активную страницу

MOV AL,страница ; Номер страницы

INT 10H ; Вызвать BIOS

AH = 06: Прокрутка экрана вверх. Когда программа пытается выдать текст на строку ниже последней на экране, то происходит переход на верхнюю строку. Даже если с помощью прерывания будет специфицирован нулевой столбец, нижние строки на экране будут испорчены. Для решения этой проблемы используется прокрутка экрана.

Ранее код 06 использовался для очистки экрана. В текстовом режиме установка в регистре AL значения 00 приводит к полной прокрутке вверх всего экрана, очищая его пробелами. Установка ненулевого значения в регистре AL определяет количество строк прокрутки экрана вверх. Верхние строки уходят с экрана, а чистые строки вводятся снизу. Следующие команды выполняют прокрутку всего экрана на одну строку:

MOV AX,0601H ; Прокрутить на одну строку вверх

MOV BH,07 ; Атрибут: нормальный, черно-белый

MOV CX,0000 ; Координаты от 00,00

MOV DX,184FH ; до 24,79 (весь экран)

INT 10H ; Вызвать BIOS

Для прокрутки любого количества строк необходимо установить соответствующее значение в регистре AL. Регистр ВН содержит атрибут для нормального или инвертированного отображения, мигания, установки цвета и т.д. Значения в регистрах СХ и DX позволяют прокручивать любую часть экрана. Ниже объясняется стандартный подход к прокрутке.

  1. Определить в элементе ROW (строка) значение 0 для установки

строки положения курсора.

  1. Выдать текст и продвинуть курсор на следующую строку.

  1. Проверить, находится ли курсор на последней строке (CMP ROW,22).

  2. Если да, то увеличить элемент ROW (INC ROW) и выйти.

  3. Если нет, то прокрутить экран на одну строку и, используя

ROW, переустановить курсор.

AH = 07: Прокрутка экрана вниз. Для текстового режима прокрутка экрана вниз обеспечивает удаление нижних строк и вставку чистых строк сверху. Регистр АН должен содержать 07, значения остальных регистров аналогичны функции 06 для прокрутки вверх.

AH = 08: Чтение атрибута/символа в текущей позиции курсора. Для чтения символа и байта-атрибута из дисплейного буфера как в текстовом, так и в графическом режиме используются следующие команды:

MOV AH,08 ; Запрос на чтение атрибута/символа

MOV BH,00 ; Страница 0 ( для текстового режима)

INT 10H ; Вызвать BIOS

Данная функция возвращает в регистре AL значение символа, а в АН - его атрибут. В графическом режиме функция возвращает 00 для не ASCII-кодов. Так как эта функция читает только один символ, то для символьной строки необходима организация цикла.

AH = 09: Вывод атрибута/ символа в текущую позицию курсора. Для вывода на экран символов в текстовом или графическом режиме с установкой мигания, инвертирования и т.д. можно воспользоваться следующими командами:

MOV AH,09 ; Функция вывода

MOV AL, символ ; Выводимый символ

MOV BH,страница ; Номер страницы (текстовый режим)

MOV BL,атрибут ; Атрибут или цвет

MOV CX,повторение ; Число повторений

INT 10H ; Вызвать BIOS

В регистр AL должен быть помещен выводимый на экран символ. Значение в регистре СХ определяет число повторений символа на экране. Вывод на экран последовательности различных символов требует организации цикла. Данная функция не перемещает курсор.

AH = 0F: Получение текущего видеорежима Данная функция возвращает в регистре AL текущий видеорежим (см. функцию АН = 00), в регистре АН - число символов в строке (20, 40 или 80), в регистре ВН - номер страницы.

AH = 13: Вывод символьной строки (только для АТ). Данная функция позволяет на компьютерах типа АТ выводить на экран символьные строки с установкой атрибутов и перемещением курсора:

MOV AH,13H ; Функция вывода на экран

MOV AL,сервис ; 0, 1, 2 или 3

MOV BH,страница ;

LEA BP,адрес ; Адрес строки в ES:BP

MOV CX,длина ; Длина строки

MOV DX,экран ; Координаты на экране

INT 10H ; Вызвать BIOS

Значения в регистре AL указывают:

0 - использовать атрибут и не перемещать курсор;

1 - использовать атрибут и переместить курсор;

2 - вывести символ, затем атрибут и не перемещать курсор;

3 - вывести символ, затем атрибут и переместить курсор.

Команда INT 10H производит установку курсора в требуемую позицию и очистку экрана. Для конкретизации действий, выполняемых по этой команде, требуется задать функцию прерывания и указать ряд параметров, которые предварительно должны быть занесены в регистры общего назначения процессора. Код выполняемой функции прерывания INT 10H заносится в регистр АН. Ниже описываются наиболее употребляемые функции. Полный набор функций изложен в [6.1, 6.9, 6.10].

Для большинства задач программирования процедур ввода/вывода более удобной является команда прерывания DOS INT 21H.

Вывод на экран в базовой версии DOS требует определения текстового сообщения в области данных, установки в регистре АН значения 09 (вызов функции DOS "Вывод на экран") и указания команды DOS INT 21H. В процессе выполнения операции конец сообщения определяется по ограничителю ($).

Пример вывода фамилии, имени и отчества студента.

FIOSTUD DB 'Petrov Vladimir Ivanovich','$'

. . .

MOV AH,09 ;

Запрос вывода на экран

LEA DX,FIOSTUD ;

Загрузка адреса выводимого сообщения

INT 21H ;

Вызов DOS

Знак ограничителя '$' можно кодировать непосредственно после символьной строки или в следующем операторе DB '$'.

Процедура ввода данных с клавиатуры проще, чем вывод на экран. Для ввода с использованием функции DOS необходимо дополнительно указать параметры, которые задают максимальную длину вводимого текста, а также определяют поле, куда команда возвращает действительную длину введенного текста в байтах. Размер полей для указания максимальной и действительной длины вводимого текста равен одному байту.

Для запроса на ввод необходимо поместить в АН номер этой функции 10(0АН), загрузить адрес списка параметров в регистр DX и выполнить INT 21Н.

Команда INT ожидает, пока пользователь не введет с клавиатуры текст, проверяя при этом, чтобы число введенных символов не превышало максимального значения, указанного в списке параметров. Для указания конца ввода следует нажать клавишу Return. Код этой клавиши (OD) также заносится в поле ввода.

Расширенные версии DOS рассматривают внешние устройства как некоторые файлы, имеющие соответствующие номера:

0 Ввод с клавиатуры (CON).

1 Вывод на экране (CON).

2 Вывод на экран по ошибке (CON).

3 Ввод/вывод на внешние устройства (AUX).

4 Вывод на печать (LPT или PRN).

Для ввода/вывода используется прерывание DOS INT 21H, необходимая функция запрашивается через регистр АН: 3FH - для ввода, 40Н - для вывода. В регистр СХ заносится число байтов для ввода/вывода, а в регистр DX - адрес области ввода/вывода. В результате успешного выполнения операции ввода/вывода очищается флаг переноса (CF) и в регистр АХ устанавливается действительное число байтов, участвующих в операции. При неуспешной операции устанавливается флаг CF, а код ошибки (в данном случае 6) заносится в регистр АХ.

Пример. Произвести ввод данных с клавиатуры с использованием функции ввода.

INADR DB 20DUP(' ') ;

Область ввода

MOV AH,3FH ;

Запрос на ввод

MOV BX,00 ;

Номер для клавиатуры

MOV CX,20 ;

Макс. количество байт для ввода

LEA DX,INADR ;

Адрес области ввода

INT 21H ;

Вызов DOS

3.2 Программирование задач генерации звука с помощью динамика ПЭВМ.

На персональных ЭВМ типа IBM-PC воспроизвести звук определённой высоты и длительности можно двумя способами:

  • Программирование микросхемы интерфейса с периферией 8255.

  • Программирование микросхемы таймера 8253;

3.2.1 Программирование таймера 8253.

Микросхема 8253 работает независимо от процессора. Процессор программирует микросхему, и затем обращается к другим программам. Она имеет три канала, каждый из которых состоит из трёх регистров. Доступ к каждой тройке регистров производится через три 8-разрядных порта ввода/вывода (на каждый канал - по порту). Номера портов от 40Н до 42Н соответствуют каналам 0 - 2. Схема генерации звука на основе микросхемы таймера представлена на рисунке 1.

Рисунок 3.1 — Схема генерации звука в компьютере

Тактовые импульсы на схему подаются от внешнего генератора тактовых импульсов (ГТИ) с частотой 1193180 Гц. Каналы 0 и 1 рассматриваться не будут т.к. они не участвуют в процессе воспроизведения звука, их схема идентична со схемой канала 2. Он имеет две входные линии: от ГТИ и вентильной схемы. Вентиль позволяют «открывать» и «закрывать» вход от ГТИ (0 на входе вентиля - он закрыт, 1 - открыт). Текущее состояние вентиля зависит от значения младшего бита порта В (адрес 61Н) микросхемы 8255. Когда вентиль открыт, канал на каждый импульс ГТИ выполняет следующие действия (в ПЭВМ программируемый таймер работает в 3-м режиме – с автозагрузкой регистра констант):

  1. Уменьшает значение счётчика на 1;

  2. Проверяет: значение счётчика = 0?

  3. Если равно, то копирует значение регистра констант в счётчик и устанавливает на выходе высокий потенциал («1»), после чего ждет следующий импульс от ГТИ;

  4. Иначе - проверяет: значение счётчика = половине значения Рг констант?;

  5. Если не равно, то ждёт следующего импульса от ГТИ;

  6. Иначе - устанавливает на выходе низкий потенциал («0»), после чего ждет следующий импульс от ГТИ.

Таким образом, устанавливая определённое значение в Рг констант, можно получить нужную частоту на выходе канала.

Как видно из рисунка, выходной сигнал отображается на бите 5 порта С (адрес 62Н) микросхемы 8255. Затем он объединяется по схеме И с выходом бита 1 порта В. Выход схемы И подсоединяется к положительному полюсу динамика. Как видно, для того, чтобы сигнал дошёл до динамика, недостаточно иметь на выходе канала 2 сигнала какой-либо частоты, также необходимо иметь в ячейке 1 порта В «1» (при «0» на вход динамика всё время будет подаваться нулевой потенциал).

Таким образом, для того, чтобы PC-SPEAKER зазвучал, необходимо выполнить следующие действия:

  1. Установить определённое для нужной частоты значение в Рг констант (оно определяется по следующей формуле: число:= 1193180/частоту (в герцах);

  2. Установить бит 0 порта В в «1» (открываем Вентиль);

  3. Установить бит 1 порта В в «1» (разрешаем работу динамика).

Для задания режима работы программируемого таймера 8253 используется командный регистр (адрес 43Н). Значение битов этого регистра таково:

Номера

Битов

Значение команды

0

Если «0» - данные в двоичном формате, иначе - в формате BCD (двоично-десятичном);

3,2,1

«000»-«101» - номер режима 0-5 (для формирования определённой частоты - режим 3 («011»));

5,4

Тип операции:

«00» = передать значение счётчика в «Задвижку»,

«01» = читать/писать только старший байт,

«10» = читать/писать только младший байт,

«11» = читать/писать младший, а потом старший байт;

7,6

«00»-«10» - номер программируемого канала 0-2 (в нашем случае канал 2 («10»)).

Таким образом, для того, чтобы прозвучала нота «До» средней октавы, мы должны написать следующий код ассемблера:

REG_B

ORG

61h

; REG_B - адрес регистра В МС

;8255

COM_REG

ORG

43h

; COM_REG - адрес командного

;регистра МС 8253

CHANN_2

ORG

42h

; CHANN_2 - адрес канала 2

;микросхемы 8253

mov

al,

10110110b

; Режим 3, тип 3, канал 2, данные

;бинарные

out

COM_REG,

al

; Запись регистра

mov

ax,

2281

; 1193180(Гц)/523(Гц) = 2281

out

CHANN_2,

al

; Запись младшего байта в

;Рг констант

mov

al,

ah

;out CHAN_2, ah - такой команды

;нет!

out

CHANN_2,

al

; Запись старшего байта в

;Рг констант

in

al,

REG_B

; Чтение предыдущего значения

;регистра В

or

al,

03h

; Устанавливаем в «1» биты 0 и 1

;регистра В

out

REG_B,

al

; Запись нового значения регистра

ret

; Выход из программы

В связи с тем, что микросхема 8253 работает параллельно с центральным процессором, то при выходе из программы динамик будет продолжать звучать. Для того, чтобы он перестал звучать, как видно из схемы на рисунке 1, достаточно установить в «0» или бит 0 или бит 1 регистра В, микросхемы 8255.

3.2.2 Использование регистра В микросхемы 8255

Микросхема 8255 имеет три однобайтовых регистра, именуемых от порта А до порта С (их адреса от 60H до 62H соответственно). Для воспроизведения звука достаточно рассмотреть биты 0 и 1 регистра В (адрес 61Н). Как видно из схемы на рисунке 1, если установить биты 0 и 1 в «1», то на вход динамика будет подаваться сигнал от выхода канала 2 микросхемы 8253 (этот процесс мы рассмотрели выше), но если сбросить бит 0 регистра В, то канал 2 будет выдавать на выход «1», что даёт нам возможность самим управлять напряжением на входе динамика (конечно на уровне «0» и «1»), путём изменения значения бита 1 регистра В.

Данный метод удобен в использовании тем, что позволяет создавать гораздо более изощрённые звуковые спецэффекты (такие, как: плавный переход тонов, изменение громкости, эффект звучания одновременно нескольких нот), но имеет и ряд недостатков:

  1. Занимает всё основное время работы ЦП;

  2. Если не делать поправку на скорость ЦП, то на компьютерах с большей тактовой частотой, последовательности «0» и «1» на входе динамика, будут изменяться быстрее, что приведёт к увеличению частоты и длительности нот, а также нежелательным последствиям спецэффектов (таким, как дребезг, писк и т.п.);

  3. Для того, чтобы процесс генерации звука не был прерван каким-либо прерыванием, необходимо перед генерацией звука запретить все прерывания (система может потерять некоторые нужные ей прерывания – например, прерывание по таймеру, которые происходят 18.2 раза в секунду, что приведёт к потере точности показания времени).

В общем случае, для формирования звука, путём изменения значения бита 1 регистра В микросхемы 8255, необходимо выполнить следующие действия:

  1. Запретить прерывания;

  2. Отключить громкоговоритель от таймера (путём занесения «0» в бит 0 регистра В);

  3. Установить на входе громкоговорителя высокий потенциал (путём занесения «1» в бит 1 регистра В);

  4. Выдержать определённое количество циклов (путём простоя системы некоторое время);

  5. Установить на входе громкоговорителя низкий потенциал (путём занесения «0» в бит 1 регистра В);

  6. Выдержать определённое количество циклов;

  7. Повторять всех операции, начиная с пункта 3, такое количество раз, которое необходимо для звучания ноты определённой длинны;

  8. Разрешить прерывания.

И в конце описания этого метода - небольшая программа, которая заставляет звучать динамик с частотой, зависящей только от производительности системы.

CHANN_B

EQU

61h

; CHANN_B - адрес регистра В

;микросхемы 8255

FREQ

EQU

200

; FREG - кол-во циклов длитель-

;ности сигналов

CYCL

EQU

30000

; CYCL - кол-во циклов форми-

;рования «1» и «0»

cli

; Запрещение прерываний

in

al,

CHANN_B

; Чтение регистра В

and

al,

0FEh

; Отключение динамика от таймера

mov

dx,

CYCL

; Количество циклов формирова-

;ния «1» и «0»

SND_C:

or

al,

02h

; Устанавливаем на входе динамика

out

CHANN_B,

al

; высокое напряжение

mov

cx,

FREQ

; Количество циклов

;длительности «1»

SND_F1:

loop

SND_F1

; Простой системы

and

al,

0FDh

; Устанавливаем на входе

;динамика

out

CHANN_B,

al

; низкое напряжение

mov

cx,

FREQ

; Количество циклов

;длительности «0»

SND_F2:

loop

SND_F2

; Простой системы

dec

Dx

; Уменьшаем кол-во циклов

;формирования «0» и «1»

jnz

SND_C

; Время звучания ещё не вышло?

sti

; Если вышло - то разрешаем

;прерывания

ret

; Выход из программы