Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_2011.doc
Скачиваний:
64
Добавлен:
09.12.2018
Размер:
1.15 Mб
Скачать

Алгоритм работы программы приема /передачи без прерываний

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

Текст программы

mov ax, 40h

mov es, ax

ketry: mov dx, es:[0] ; базовый адрес порта COM в dx

add dx, 5 ; адрес регистра статуса в dx

in al,dx ; читаем в регистр al

test al, 00011110b ; проверка на ошибку порта

jnz error ;если есть ошибки, то на метку error

test al, 00000001b ; данные получены?

jnz prb ;если байт принят, то на метку prb

test al, 00100000b ; регистр хранения передатчика пуст?

jz ketry ;в начало

mov ah, 1 ;иначе

int 16h ; проверка клавиатуры

jz ketry ;если в буфере клавиатуры нет кода, то в начало

mov ah, 0

int 15h ; загрузка символа с клавиатуры в al

sub dx, 5 ;вычисляем адрес регистра хранения

out dx, al ; загрузка символа в регистр хранения порта

jmp short ketry

prb: mov dx, es:[0]

in al, dx

jmp short ketry

  1. Работа com – порта в режиме прерываний

Сигнал прерываний от COM – порта поступает на вход контроллера прерываний. Если прерывания разрешены, то программа обработки прерываний в зависимости от состояния регистра статуса может принимать или передавать байт.

Для инициализации работы порта в данном режиме регистр разрешения прерываний должен быть загружен определенным образом.

Регистр разрешения прерываний

В указанные ниже разряды регистра необходимо записать единицы, которые разрешают прерывания по перечисленным причинам:

Бит 0 – прерывание при получении данных

Бит 1 – прерывание, когда регистр хранения передатчика пуст

Бит 2 – прерывания при ошибке приема данных

Бит 3 – прерывания при изменении регистра статуса модема

Регистр идентификации прерывания

Регистр используется программой для определения причины возникновения прерывания.

Бит 0 –есть прерывание по любой из причин

Биты 2, 1 – причины возникновения прерывания

«0 0» изменения в регистре статуса модема

«0 1» регистр передатчика пуст

«1 0» получены данные

«1 1» ошибка приема

Вызов обработчика прерывания

После возникновения прерывания программа-обработчик прерываний должна опознать причину прерываний в следующей последовательности:

  1. ошибка?

  2. получены данные?

  3. регистр передатчика пуст?

  4. проверка статуса модема (читать регистр статуса модема)

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

cseg segment

org 100h

assume cs:cseg, ds:cseg, ss:cseg

begin:

jmp setup

ioint proc far

nexin:

push ds

mov ax,40h

mov ds,ax

mov dx,ds:[0]

add dx,2

in al,dx

test al,100b ;проверка регистра идентификации прерывания (принят байт?)

jz pdb ;передать байт

prb:

;здесь прием байта

jmp short anot

pdb:

;здесь передача байта

anot:

mov ax, 40h ; проверка наличия прерываний

mov ds, ax

mov dx, ds:[0]

add dx, 2

in al, dx

test al, 1 ; есть прерывание на выходе порта?

jnz nexin ;в начало программы

mov al, 20h

out 20h, al ; очистка регистра ISR в i8259

pop ds

finish equ $

iret

ioint endp

setup:

; инициализация регистра разрешения прерывания (прием/передача)

mov ax, 40h

mov ds, ax

mov dx, ds:[0] ; базовый адрес

inc dx

mov al, 11b ; прерывание при передаче или приеме байта

out dx, al

;установка нового вектора прерывания

mov dx, offset ioint ; смещение

mov ax, seg ioint ; сегмент

mov ds, ax

mov al, 0bh ; записываем номер вектора прерываний

mov ah, 25h

int 21h

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

mov dx,finish

int 27h

cseg ends

end begin

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]