Предыдущий раздел УПРАВЛЕНИЕ УСТРОЙСТВАМИ БЕЗ ПРЕРЫВАНИЙ Следующий раздел

20.2.2. Программа синхронного драйвера

Программа синхронного драйвера ввода символов с перфоленты:

 

;             Синхронный драйвер ввода символов с перфоленты 

;             --------------------------------------------------------------------

;         Содержит: 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.

 


Предыдущий раздел В начало Следующий раздел