Для роботи з годинником реального часу BIOS має шість функцій перериван-
ня 1Ah.
Прочитати показники годинника:
Вхід: AH = 02h
Вихід: CH – години у BCD форматі; CL – хвилини у BCD форматі;
DH – секунди у BCD форматі;
CF = 1, якщо годинник реального часу не встановлений. Встановити годинник:
Вхід: AH = 03h
CH – години у BCD форматі;
CL – хвилини у BCD форматі;
DH – секунди у BCD форматі;
DL = 1, якщо необхдно використовувати літній час. Прочитати дату з годинника:
Вхід: AH = 04h
Вихід: CH – століття у BCD форматі;
CL – рік у BCD форматі;
DH – місяць у BCD форматі;
DL – число у BCD форматі;
CF = 1, якщо годинник реального часу не встановлений. Встановити дату:
Вхід: AH = 05h
CH – століття у BCD форматі;
CL – рік у BCD форматі;
DH – місяць у BCD форматі;
DL – число у BCD форматі; Встановити будильник:
Вхід: AH = 06h
CH – години у BCD форматі;
CL – хвилини у BCD форматі;
DH – секунди у BCD форматі;
DL = 1, якщо необхдно використовувати літній час. Вихід: CF = 1, якщо годинник реального часу не встановлений. Скинути будильник:
Вхід: AH = 07h
Коли будильник, встановлений функцією 06h, “продзвенить”, буде виклика-
ний обробник переривання 4Ah. Програмі дозволяється становлювати лише один будильник.
МЕТОДИЧНІ ВКАЗІВКИ
В даній роботі пропонується дослідити і протестувати декілька програм, які читають показники годинника реального часу.
Для виконання роботи необхідні грунтовні знання архітектури та принципів функціонування годинника реального часу, а також знання призначення та способів використання обробників переривань.
ЛІТЕРАТУРА
1. Гук М. Аппаратные средства IBM PC. Энциклопедия. – СПб.: “Издательс-
тво Питер”, 1999. – 816 с.
2. Гуржій А. М., Коряк С. Ф., Самсонов В. В., Скляров О. Я. Архітектура, принципи функціонування і керування ресурсами IBM PC: Навч. посібник. Харків: ТОВ. “Компанія СМІТ”, 2003. – 512 с.
3. Зубков С. В. Ассемблер для DOS, Windows и Unix. – М.: ДМК, 1999. –
640 с.
4. Фролов А. В., Фролов Г. В. Аппаратное обеспечение персонального ком-
пьютера. – М.: ДИАЛОГ МИФИ, 1997. – 304 с.
ЗАВДАННЯ
1. Дослідити програму clock, яка читає показники годинника реального часу, виводить їх на екран, а також надає можливість прочитати та вивести на екран дисплея вміст вказаного користувачем регістра КМОН-пам’яті.
2. За текстом програми нарисувати схему алгоритму.
3. На вінчестері створити каталог CMOS.
4. За допомогою редактора середовища програмування Borland C++ 3.1 створити символьний файл тексту вивченої програми і записати його в каталог CMOS.
5. Виконати налагодження програми та запустити її на виконання.
6. Прочитати вміст усіх регістрів КМОН-пам’яті та записати у таблицю в наступному форматі:
Номер регістра | Вміст | Розшифрування вмісту регістра |
07h | Дата (поточне число місяця – 27) | |
08h | Дата (поточний місяць року 2 – лютий) |
7. Змінити програму так, щоб на екран дисплея видати за один перегляд вміст усіх регістрів від 00h до 3Fh та виконати пункти 2 – 6.
8. Дослідити програм int1A, яка читає показники годинника реального часу, виводить їх на екран, а також надає можливість змінити показники годинника.
9. За текстом програми нарисувати схему алгоритму.
10. За допомогою редактора середовища програмування Borland C++ 3.1
створити символьний файл тексту вивченої програми і записати його в каталог
CMOS.
11. Виконати налагодження програми та запустити її на виконання.
12. За аналогією розробити програмні модулі, які дозволяють крім читання та зміни часу, прочитати і встановити дату. Для цього використовувати функції 04h
та 05h перериванн 1Ah.
13. Порівняти програми clock та int1A в частині реалізації функцій читання та запису регістрів RTC.
14. Зробити висновки.
ТЕКСТИ ПРОГРАМ
// clock
#include <dos.h>
#include <bios.h>
#include <conio.h>
#include <stdio.h>
void main (void)
{
int nreg;
clrscr ();
outportb (0x70, 4);
printf (“Години: %x\n”, inportb (0x71));
outportb (0x70, 2);
printf (“Хвилини: %x\n”, inportb (0x71));
outportb (0x70, 0);
printf (“Секунди: %x\n”, inportb (0x71));
puts (“Вкажіть номер регістра: ”);
scanf (“%d”, &nreg);
outportb (0x70, nreg);
printf (“Значення: %x\n”, inportb (0x71));
}
// int1A
#include <dos.h>
#include <bios.h>
#include <conio.h>
#include <stdio.h>
unsigned char sec, min, hor;
void GetSystemTime (void)
{
asm {
mov | ah, | 0x02 | |
int | 0x1A | ||
mov | hor, | ch | |
mov | min, | cl | |
mov | sec, | dh | |
} |
}
void main (void)
{
clrscr (); GetSystemTime ();
printf (“Показники годинника до встановлення\n”);
printf (“Години: %x\n”, hor);
printf (“Хвилини: %x\n”, min);
printf (“Секунди: %x\n”, sec);
while (1) {
puts (“Встановити годинник реального часу (y/n)?”);
if (getch () == „n‟) break;
printf (“Години: ”); scanf (“%x”, &hor); printf (“Хвилини: ”); scanf (“%x”, &min); printf (“Секунди: ”); scanf (“%x”, &sec);
asm {
mov ah, 0x03 mov ch, hor mov cl, min mov dh, sec mov dl, 0x01 int 0x1A
}
GetSystemTime ();
printf (“Показники годинника після встановлення\n”);
printf (“Години: %x\n”, hor); printf (“Хвилини: %x\n”, min); printf (“Секунди: %x\n”, sec);
}
}
КОНТРОЛЬНІ ЗАПИТАННЯ
1. Призначення годинника реального часу в обчислювальній системі. Мож-
ливі галузі застосування.
2. Скільки незалежних програмованих джерел маскованих переривань про-
цесора зебезпечує MC 146818?
3. Які порти вводу/виводу використовуються для читання і запису даних у регістри RTC та які команди при цьому використовуються?
4. Назвіть шість функцій переривання 1Ah, призначених для роботи з
годинником реального часу.
5. Наведіть формати виклику функцій переривання 1Ah.