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

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

mov                      ah, 04c

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

i060_hnd:

inc                         sec                        ;циклы проверок правильности счета времени в формате чч:мм:сс

cmp                       sec, 60

jne                         end_060               ;секунды <= 60

mov                      sec, 0

inc                         min

cmp                       min, 60                 ;минуты <= 60

jne                         end_060

mov                      min, 0

inc                         hour

cmp                       hour, 24                ;часы <= 24

jne                         end_060

mov                      hour, 0

end_060:

mov                      flag, 1

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                    ;передача управления исходному обработчику

В результате выполнения программы в верхний левый угол экрана выводится время работы программы в формате чч:мм:сс. Выполнение программы прерывается, когда счетчик минут достигнет значения maxmin.

2.5.  Маскирование доступа к клавиатуре на 15 секунд

IMR – регистр маски прерывания служит для хранения разрешения и запрета (маскирования) прерываний, доступен через порт 21h/A1h (маскирование клавиатуры – 1 в первом бите регистра IMR).

Out5.8

include                    mac.inc

jmp                       start

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

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

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

time                dw                         0

irq                  equ                        1

start:

chv                        old_v, 08, i08_hnd             ;замена ВП системного таймера

chv                        old_v1, 060, i060_hnd       ;замена пользовательского ВП

in                           al, 021

or                          al, bit irq

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

mov                      ah, 0

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

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

restv                     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                          ;его на экране