Системное программное обеспечение персональных ЭВМ


Пример 5



Пример 5

/*== ПРИМЕР 6.4 ==*/ /*============== Сигнал тревоги в AT ================*/ #include <dos.h>

#include <stdio.h>

/* Выражения преобразования BCD->int и наоборот */ #define bcd_to_int(x) (x>>4)*10+(x&0x0f) #define int_to_bcd(x) ((x/10)=60) { m-=60; rr.h.ch=int_to_bcd(bcd_to_int(rr.h.ch)+1); } rr.h.cl=int_to_bcd(m); /* Запись увеличенного времени в регистры тревоги */ rr.h.ah=6; /* функция 6 */ int86(0x1a,&rr,&rr); rr.h.ah=0x2c; intdos(&rr,&rr); printf("\nВремя запуска - %02d:%02d:%02d\n", rr.h.ch,rr.h.cl,rr.h.dh); /* Ожидание тревоги */ flag=0; /* Переменная flag установится в 1 по сигналу тревоги в обработчике прерывания 4A */ while(flag==0); rr.h.ah=0x2c; intdos(&rr,&rr); printf("Время тревоги - %02d:%02d:%02d\n", rr.h.ch,rr.h.cl,rr.h.dh); /* Отмена тревоги */ rr.h.ah=7; /* функция 7 */ int86(0x1a,&rr,&rr); } /*==== Обработчик прерывания 4A - обработчик тревоги ====*/ void interrupt new4A() { putchar(7); /* Звуковой сигнал */ flag=1; /* Установка флага */ writevect(0x4a,old4A); /* Восстановление вектора */ } /*==== Получение старого вектора ====*/ void *readvect(int in) { rr.h.ah=0x35; rr.h.al=in; intdosx(&rr,&rr,&sr); return(MK_FP(sr.es,rr.x.bx)); } /*==== Запись нового вектора ====*/ void writevect(int in, void *h) { rr.h.ah=0x25; rr.h.al=in; sr.ds=FP_SEG(h); rr.x.dx=FP_OFF(h); intdosx(&rr,&rr,&sr); }




- Начало -  - Назад -  - Вперед -