Изучение принципов обработки аппаратных прерываний. Логика взаимодействия процессора и контроллера прерываний, страница 5

add                        dl, '0'

dec                        di

es                   mov                      b [di], '.'

dec                        di

es                   mov                      [di], dl

loop                      l1

inc                         time

cmp                       time, 15                ;проверка на окончание времени маскирования клавиатуры

jne                         end_060

in                           al, 021  

and                        al, not bit irq       

out                        021, al                  ;размаскирование клавиатуры (IMR)

end_060:

pop                       es, di, ds, cx, bx, ax

iret

i08_hnd:

push                      ax, ds

mov                      ds, cs                     ;установка доступа к данным процедуры

inc                         cntr                       ;увеличение значения счетчика прерывании

cmp                       cntr, 18                 ;проверка на прохождение 1 минуты (~990 мсек)

jne                         l10

mov                       cntr, 0                   ;обнуление счетчика прерывании

int                         060                       ;вызов пользовательского прерывания

l10:

pop                       ds, ax

cs                   jmp                       old_v                    ;передача управления исходному обработчику

Программа маскирует доступ к клавиатуре на 15 секунд.

2.6.  Маскирование доступа к клавиатуре с заменой функции 25h прерывания DOS  21h

Out6.8

include                 macr.inc

jmp                       start

old_v            dd                          ?             ;двойное слово для хранения значения вектора прерывания 08h

old_v1          dd                          ?             ;двойное слово для хранения значения вектора прерывания 060h

cntr                db                          0             ;счетчик прерываний от таймера

time                dw                         0

irq                  equ                        1

start:

schv                      old_v, 08, i08_hnd        ;замена ВП системного таймера с запретом внеш. прерыв.

schv                      old_v1, 060, i060_hnd   ;замена пользовательского ВП с запретом внеш. прерыв.

in                           al, 021

or                          al, bit irq

out                        021, al                  ;маскирование клавиатуры (IMR)

mov                      ah, 0

int                         016                       ;ожидание прерывания от клавиатуры

srestv                    08, old_v              ;восстановление ВП системного таймера

srestv                    060, old_v1         ;восстановление пользовательского ВП

mov                      ah, 04c

int                         021                       ;завершение выполнения программы

i060_hnd:

push                      ax, bx, cx, ds, di, es

mov                      es, 0b800                            ;указатель на видеобуфер

mov                      bx, 10

mov                      cx, 3

mov                      di, 6

mov                      ax, time

l1:

mov                      dx, 0                      ;преобразование числа секунд в ASCII код и отображение

div                        bx                          ;его на экране

add                        dl, '0'

dec                        di

es                   mov                      b [di], '.'

dec                        di

es                   mov                      [di], dl

loop                      l1                          

inc                         time

cmp                       time, 15                ;проверка на окончание времени маскирования клавиатуры

jne                         end_060

in                           al, 021

and                        al, not bit irq

out                        021, al                  ;размаскирование клавиатуры (IMR)