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

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

l10:

pop                       ds, ax

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

i09_hnd:

push                      ax

in                           al, 060                  ;считывание с порта 60h значение скан-кода нажатой клавиши

cmp                       al, 1                       ;клавиша “Esc”?

mov                      al, 020

out                        020, al                  ;снятие заявки на обслуживание прерывания

pop                       ax

je                           exit                       ;если да, то выход из программы

iret

exit:

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

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

srestv                    09, old_v2            ;восстановление ВП клавиатуры

mov                      ah, 04c

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

Данная программа представляет собой простой бесконечный цикл. Выход из цикла и завершение программы осуществляется нажатием клавиши ESC, что проверяется в обработчике аппаратного прерывания от клавиатуры 9h.

2.8.  Часы суточного времени

В начале основной программы следует применить вызов функции 2Ch прерывания DOS 21h - в РОН записывается текущее системное время.

Out8.8

include                mac.inc

jmp                       start

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

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

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

sec                 db                          0                            ;счетчик секунд

min                db                          0                            ;счетчик минут

hour              db                          0                            ;счетчик часов

flag                db                          0

cnt                 db                          0                           

maxcnt          db                          15                         

start:

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

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

gettime                 hour, min, sec                     ;получение значения системного времени int 21h, 2Ch

l1:

test                        flag        ;проверка на требуемость изменения  отображения времени на экране

jz                           l2

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

mov                      bx, 10                   ;сохранение в стек числа часов, минут и секунд

mov                      cx, 3

mov                      di, 18

mov                      al, hour

mov                      ah, 0

push                      ax

mov                      al, min

mov                      ah, 0

push                      ax

mov                      al, sec

mov                      ah, 0

push                      ax

; цикл преобразования и вывода чч:мм:сс

l3:

pop                       ax                     ;выгрузка из стека и преобразование в ASCII код часов, минут

mov                      dx, 0                 ;секунд и отображение времени на экране в формате чч:мм:сс

div                        bx

add                        dl, '0'

add                        al, '0'

sub                        di, 2

cmp                       di, 16

je                           nopt