Чтение памяти CMOS
ОЗУ
Программа читает CMOS память компьютера выводит текущее время
(время BIOS), а также некоторые данные конфигурации.
Программа написана на языке Assembler для компилятора Masm 32.
Результат работы программы:
В состав памяти IBM PC AT и совместимых ПК входят 64 байта
энергонезависимой оперативной памяти (CMOS), питающиеся от автономной батареи.
В эту память входит информация о текущих времени и дате, конфигурации ЖД и
HГМД, конфигурация оборудования и др. При включении ПЭВМ содержимое CMOS
анализируется BIOS.
Для доступа к данным CMOS используются порты 70h и 71h.
mov al,adr
out 70h,al ;выбрать адрес CMOS <adr>
in al,71h ;ввод байта из CMOS в pегистр al
Для чтения данных из памяти CMOS была разработана следующая программа,
которая выводит информацию о значиниях каждого байта памяти CMOS.
Данная программа была написана на языке программирования C++:
Код на C++ #include <stdio.h> #include <conio.h> #include <iostream.h> #define byte unsigned char char *d[7] = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"}; char *m[12] = {"Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"}; char *sd[11] = {"Сброс при помощи Ctrl+Alt+Del", "Сброс после определения объема CMOS пямяти", "Сброс после тестирования CMOS памяти", "Сброс после ошибки четности в ОП", "Сброс с запросом перезагрузки", "Перезапуск контроллера прерываний", "Сброс после проверки защищенного режима", "Сброс после проверки защищенного режима", "Сброс после проверки защищенного режима", "Сброс после блочного копирования", "Переход по адресу BIOS 0000h:0467h"}; char *ngmd[5] = {"не установлен", "360 Кбайт", "1,2 Мбайт", "720 Кбайт", "1,44 Мбайт"}; char *vid[4] = {"не используется или EGA", "CGA, EGA, VGA в режиме 40x25", "CGA, EGA, VGA в режиме 80x25", "монохромный видеоадаптер"}; char *yn[2] = {"Да", "Нет"}; int fb(int x) { return (int)(x%16+x/16*10); } int cb(int b, int bit, int kol) { int i, sbit = 0; int m[8]={1, 2, 4, 8, 16, 32, 64, 128}; for (i = bit; i<(bit+kol); i++) sbit += m[i]; return (b&sbit)>>bit; } void main() { byte cs[64]; int i, j; for (i = 0; i<64; i++) { outp(0x70, i); cs[i] = inp(0x71); } //---------- clrscr(); cout<<"Сведения CMOS"<<endl; cout<<"Часы реального времени (00h-0Dh):"<<endl; printf("Время: %d:%d:%d\n", fb(cs[4]), fb(cs[2]), fb(cs[0])); printf("Сигнал в: %d:%d:%d\n", fb(cs[5]), fb(cs[3]), fb(cs[1])); printf("Дата: %s %d %s %d года\n", d[fb(cs[6])-1], fb(cs[7]), m[fb(cs[8])-1], 2000+fb(cs[9])); cout<<"Байт диагностики (0Eh):"<<endl; printf("Правильная установка RTC: %s\n", yn[cb(cs[0x0E], 2, 1)]); printf("Жесткий диск есть: %s\n", yn[1-cb(cs[0x0E], 3, 1)]); printf("Правильный размер ОП: %s\n", yn[cb(cs[0x0E], 4, 1)]); printf("Конфигурация правильная: %s\n", yn[cb(cs[0x0E], 5, 1)]); printf("Контрольная сумма CMOS правильная: %s\n", yn[cb(cs[0x0E], 6, 1)]); printf("Бартарея CMOS исправна: %s\n", yn[cb(cs[0x0E], 7, 1)]); cout<<"Статус выключения (ShutDown 0Fh):"<<endl; printf("%s\n", sd[cs[0x0F]]); cout<<"Тип накопителей НГМД (10h):"<<endl; printf("Первый НГМД: %s\n", ngmd[cb(cs[0x10], 4, 4)]); printf("Второй НГМД: %s\n", ngmd[cb(cs[0x10], 0, 4)]); getch(); clrscr(); cout<<"Тип накопителей НМД 53f (12h):"<<endl; printf("Первый НМД: %d\n", cb(cs[0x12], 4, 4)); // 4e4 if (cb(cs[0x12], 4, 4) == 15) printf("(зарезервированный тип)"); printf("Второй НМД: %d\n", cb(cs[0x12], 0, 4)); // if (cb(cs[0x12], 0, 4) == 15) printf("(зарезервированный тип CMOS)"); cout<<"Байт оборудования (14h):"<<endl; printf("Установлен НГМД: %s\n", yn[cb(cs[0x14], 0, 1)]); printf("Математический сопроцессор: %s\n", yn[1-cb(cs[0x14], 1, 1)]); printf("Видеоадаптер: %s\n", vid[cb(cs[0x14], 4, 2)]); printf("Количество НГМД: %d\n", cb(cs[0x14], 4, 2)+1); printf("Основная память (15h-16h): %u Кбайт\n", cs[0x15]+cs[0x16]*255); printf("Расширенная память (17h-18h): %u Кбайт\n", cs[0x17]+cs[0x18]*255); printf("Диск С: (19h): %d\n", cs[0x19]); printf("Диск D: (1Ah): %d\n", cs[0x1A]); printf("Контрольная сумма ячеек 10h-20h (2Eh-2Fh): %d\n", cs[0x2E]*255+cs[0x2F]); printf("Расширенная память (30h-31h): %u Кбайт\n", cs[0x30]+cs[0x31]*255); printf("Столетие (32h): %d\n", fb(cs[0x32])); cout<<"Дополнительная информация из CMOS памяти (33h):"<<endl; printf("IBM 128K памяти установлен: %s\n", yn[1-cb(cs[0x33], 7, 1)]); printf("Используется утилита SETUP: %s\n", yn[1-cb(cs[0x33], 6, 1)]); getch(); }
|