ЛЕКЦИЯ № 6 ВВОД – ВЫВОД В ПОРТ Вся работа системы с устройствами на самом низком уровне выполняется с использованием портов ввода-вывода. Концептуальная схема управления оборудованием компьютера Программа пользователя Функции операционной системы Функции BIOS … Пространство портов ввода-вывода Аппаратура компьютера …
Схема формирования звука для встроенного динамика Системные часы (генератор импульсов, частота 1, 19 МГц) Регистр управления (порт 43 h) Таймер i 8253 Канал 0 Порт 40 h Канал 1 Порт 40 h Регистр ввода-вывода (порт 42 h) канал 2 Регистр - защелка да Регистр – счетчик (count=count-1) count=0? И нет i 8255 Порт 61 h 7 6 5 4 3 2 1 0 Вход 2 Вход 1 И
Структура байта состояния (порт 43 h) бит 0 Значение, загружаемое в регистр- защелку задано: 0 - двоичным числом, 1 - двоичнодесятичным (BCD) числом. биты 1 -3 Режим работы микросхемы таймера. Всего 6 режимов, но обычно используется третий (в этом случае значение поля – 011) биты 4 -5 Тип операции: 00 – передать значение счетчика в регистр-задвижку, 10 – записать в регистрзадвижку только старший байт, 01 – записать в регистр-задвижку только младший байт, 11 записать в регистр-задвижку сначала младший байт, затем старший биты 6 -7 Номер программируемого канала: 00, 01, 10
Последовательность действий при программировании звукового канала таймера. 1. Посредством порта 43 h выбрать канал, задать режим работы и тип операции передачи значения в канал (10110110=0 b 6 h). 2. Подать ток на динамик, установив бит 1 порта 61 h. 3. Используя регистр ax , поместить нужное значение в порт 42 h, определив тем самым нужную высоту тона. 4.
masm model small stack 100 h delay macro time local ext, iter ; макрос задержки, его текст ограничивается директивами macro и endm. ; На входе - значение задержки (в мкс) push cx mov cx, time ext: push cx mov cx, 5000 iter: loop iter pop cx loop ext pop cx endm
. data ; сегмент данных tonelow dw 2651 ; нижняя граница звучания = 450 Гц cnt db 0 ; счётчик для выхода из программы temp dw ? ; верхняя граница звучания. code ; сегмент кода main: ; точка входа в программу mov ax, @data ; связываем регистр ds с сегментом mov ds, ax ; данных через регистр ax xor ax, ax ; очищаем ax go: ; заносим слово состояния 10110110 b(0 В 6 h) в командный регистр (порт 43 h) mov al, 0 B 6 h out 43 h, al in al, 61 h ; получим значение порта 61 h в al or al, 3 ; инициализируем динамик и подаем ток в порт 61 h out 61 h, al mov cx, 1000 ; количество шагов ступенчатого изменения тона
musicup: ; в ax значение нижней границы частоты mov ax, tonelow out 42 h, al xchg al, ah ; обмен между al и ah out 42 h, al ; в порт 42 h старшее слово ax: ah sub tonelow, 1 ; повышаем тон ; в порт 42 h младшее слово ax : al delay 50 ; задержка mov dx, tonelow ; в dx текущее значение высоты mov temp, dx ; temp - верхнее значение высоты loop musicup ; повторить цикл повышения mov cx, 1000 ; восстановить счетчик цикла
musicdown: mov ax, temp ; в ax верхнее значение высоты out 42 h, al ; в порт 42 h младшее слово ax : al mov al, ah ; обмен между al и ah out 42 h, al ; в порт 42 h старшее слово ax : ah add temp, 1 ; понижаем высоту delay 50 ; задержка loop musicdown ; повторить цикл понижения nosound: in al, 61 h ; получим значение порта 61 h в AL and al, 0 FCh ; выключить динамик out 61 h, al ; в порт 61 h mov dx, 2651 ; для последующих циклов mov tonelow, dx inc cnt ; увеличиваем счётчик проходов, то есть ; количество звучаний сирены cmp cnt, 10 ; 10 раз? jne go ; если нет, идти на метку go
exit: mov ax, 4 c 00 h int 21 h end main ; стандартный выход ; конец программы