Предыдущий раздел | УПРАВЛЕНИЕ УСТРОЙСТВАМИ БЕЗ ПРЕРЫВАНИЙ | Следующий раздел |
Программа синхронного драйвера ввода символов с перфоленты:
; Синхронный драйвер ввода символов с перфоленты
; --------------------------------------------------------------------
; Содержит: 1) п/п-у инициализации (вызов из DOS)
; 2) п/п-у вывода символа (вызов командой int 0eeh)
;
absolute 2ch ; Следующий байт имеет адрес-смещение 2ch
Blocokr resw 1 ; Адрес-сегмент блока окружения
segment code ; Виртуальный сегмент кода
org 100h
Start: jmp Init ; Переход на инициализацию
;
; Ввод символа – обработчик программного прерывания с номером EEh
; ------------------------------------------------------------------------------------------
; Выходы: флаг CF – признак результата (0 – успешно; 1 – ошибка)
; AL – код символа
Begin: sti ; Разрешить маскируемые прерывания
push ax ; Сохранение содержимого
push ds ; регистров в стеке
mov ax, cs ; DS будет адресовать данные
mov ds, ax ; резидентной программы
in al, 90h ; Чтение RS в AL
or al, 00000001b ; Запуск
out 90h, al ; устройства
.Povt:
in al, 90h ; Чтение RS в AL
test al, 10000000b ; Символ готов?
jz .Povt ; Нет
test al, 01110000b ; Ошибка есть?
jnz .Error ; Да
in al, 91h ; Прием символа из RD
clc ; Сбрасывает флаг переноса CF
jmp .Exit
.Error: stc ; Устанавливает флаг переноса CF
.Exit:
pop ds ; Восстановление содержимого
pop ax ; регистров из стека
iret ; Возврат в программу из прерывания
; Инициализационная часть программы
Init: mov ax, 25eeh ; Запись стартового адреса обработчика
mov dx, Begin ; в вектор прерываний
int 21h ; с номером EEh
in al, 90h ; Чтение RS в AL
and al, 11110111h ; Запрет прерываний
out 90h, al ; от устройства
mov ah, 49h ; Освобождение области памяти,
mov es, Blocokr ; занимаемой
int 21h ; блоком окружения
mov dx, Init ; Возврат в DOS, оставшись
int 27h ; резидентным
Инициализационная часть этой программы выполняется в результате запуска программы из DOS. Так как эта часть нерезидентна, то она размещена в конце программы. В начале своего выполнения она помещает стартовый адрес резидентной части в выбранный вектор прерываний, а затем запрещает прерывания от устройства ввода перфоленты, сбросив бит 3 в RS. Далее производится подготовка резидентной части путем освобождения памяти, занимаемой блоком окружения программы. После этого инициализационная часть выполняет возврат в DOS, сопровождаемый просьбой сделать резидентной начало программы (до метки Init).
Резидентная часть программы инициируется в результате программного прерывания с номером EEh. Выполнение этой части начинается так же, как начинается любой обработчик прерываний:
1) разрешение маскируемых прерываний;
2) сохранение содержимого используемых регистров в стеке;
3) запись в DS адреса-сегмента данных резидентной части.
После этого производится запуск устройства ввода перфоленты (установкой бита 0 в RS). Далее в цикле опрашивается бит 7 в RS до тех пор, пока он не будет установлен в 1. В зависимости от наличия ошибки перед возвратом в прикладную программу сбрасывается или устанавливается флаг CF.
Предыдущий раздел | В начало | Следующий раздел |