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


Пример 4



Пример 4

/*== ПРИМЕР 6.3 ==*/ /*============= Системная служба даты ================*/ #include <dos.h>

main() { union REGS rr; int y,m,d; /* Исходный год, месяц, день */ /* Получение текущей даты */ rr.h.ah=0x2a; /* Чтение даты */ intdos(&rr,&rr); d=rr.h.dl; m=rr.h.dh; y=rr.x.cx; printf("%02d:%02d:%02d\n",d,m,y); /* Убедимся, что во флаге смены даты BIOS - 0 */ printf("Флаг смены даты = %d\n",peekb(0x40,0x70)); /* Установка флага смены даты */ pokeb(0x40,0x70,1); /* Пока нет запроса даты, флаг остается взведенным (запрос будет выдан по клавише Esc) */ while(getch()!=27) printf("Флаг смены даты = %d\n",peekb(0x40,0x70)); /* Запрос даты. Мы получим дату на 1 большую исходной */ rr.h.ah=0x2a; /* Чтение даты */ intdos(&rr,&rr); printf("%02d:%02d:%02d\n",rr.h.dl,rr.h.dh,rr.x.cx); /* а флаг смены даты сбрасывается */ printf("Флаг смены даты = %d\n",peekb(0x40,0x70)); /* Восстановление исходной даты */ rr.h.ah=0x2b; /* Запись даты */ rr.h.dl=d; rr.h.dh=m; rr.x.cx=y; intdos(&rr,&rr); /* и вывод ее */ rr.h.ah=0x2a; /* Чтение даты */ intdos(&rr,&rr); printf("%02d:%02d:%02d\n",rr.h.dl,rr.h.dh,rr.x.cx); }

В AT имеются независимые часы реального времени, показания которых содержатся в CMOS-памяти. Регистры CMOS-памяти, связанные с временем и датой следующие: 0 - секунды, 2 - минуты, 4 - часы, 6 - день недели (0 - воскресенье), 7 - день месяца, 8 - месяц, 9 - год. Доступ к этим данным - либо через порты 0x70, 0x71, либо через прерывание 0x1A. Функция 2 этого прерывания (AH=2) - чтение часов реального времени, функция 3 - установка часов, функции 4, 5 - чтение и установка даты соответственно. Используются те же регистры, что и в функциях DOS 0x2C, 0x2A, но все данные представляются в двоично-десятичном коде. При загрузке системы на AT время дня и дата выбираются из этих часов, далее эти часы и системная служба времени работают независимо друг от друга.

Кроме того, в AT имеется также возможность запрограммировать прерывание на заданное время, в описаниях это часто называют сигналом тревоги (alarm). Время поступления этого сигнала заносится в регистры CMOS-памяти: 1 - секунды, 3 - минуты, 5 - часы, а прерывание по достижению заданного времени разрешается единицей в разряде 5 регистра 0x0B. При достижении заданного времени происходит прерывание 0x4A.

Сигнал тревоги может быть задан при помощи функции 6 прерывания 0x1A, а отменен - функцией 7, как это показано в следующем примере.




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