Вывод информации содержащейся в CMOS памяти BIOS (с)


Добавил:DMT
Дата создания:24 января 2008, 0:55
Дата обновления:16 июня 2008, 19:52
Просмотров:10706 последний сегодня, 4:06
Комментариев: 0
Чтение памяти CMOS ОЗУ
Программа читает CMOS память компьютера выводит текущее время (время BIOS), а также некоторые данные конфигурации. Программа написана на языке Assembler для компилятора Masm 32.
Результат работы программы:
Чтение CMOS и MCB
В состав памяти 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++
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <iostream.h>
  4.  
  5. #define byte unsigned char
  6.  
  7. char *d[7] = {"Воскресенье", "Понедельник", "Вторник", "Среда",
  8. "Четверг", "Пятница", "Суббота"};
  9. char *m[12] = {"Января", "Февраля", "Марта", "Апреля", "Мая", "Июня",
  10. "Июля", "Августа", "Сентября",
  11. "Октября", "Ноября", "Декабря"};
  12. char *sd[11] = {"Сброс при помощи Ctrl+Alt+Del",
  13. "Сброс после определения объема CMOS пямяти",
  14. "Сброс после тестирования CMOS памяти",
  15. "Сброс после ошибки четности в ОП",
  16. "Сброс с запросом перезагрузки",
  17. "Перезапуск контроллера прерываний",
  18. "Сброс после проверки защищенного режима",
  19. "Сброс после проверки защищенного режима",
  20. "Сброс после проверки защищенного режима",
  21. "Сброс после блочного копирования",
  22. "Переход по адресу BIOS 0000h:0467h"};
  23. char *ngmd[5] = {"не установлен",
  24. "360 Кбайт",
  25. "1,2 Мбайт",
  26. "720 Кбайт",
  27. "1,44 Мбайт"};
  28. char *vid[4] = {"не используется или EGA",
  29. "CGA, EGA, VGA в режиме 40x25",
  30. "CGA, EGA, VGA в режиме 80x25",
  31. "монохромный видеоадаптер"};
  32. char *yn[2] = {"Да", "Нет"};
  33.  
  34. int fb(int x)
  35. { return (int)(x%16+x/16*10); }
  36.  
  37. int cb(int b, int bit, int kol)
  38. { int i, sbit = 0;
  39. int m[8]={1, 2, 4, 8, 16, 32, 64, 128};
  40. for (i = bit; i<(bit+kol); i++)
  41. sbit += m[i];
  42. return (b&sbit)>>bit;
  43. }
  44.  
  45. void main()
  46. { byte cs[64];
  47. int i, j;
  48. for (i = 0; i<64; i++)
  49. { outp(0x70, i);
  50. cs[i] = inp(0x71);
  51. }
  52. //----------
  53. clrscr();
  54. cout<<"Сведения CMOS"<<endl;
  55. cout<<"Часы реального времени (00h-0Dh):"<<endl;
  56. printf("Время: %d:%d:%d\n", fb(cs[4]), fb(cs[2]), fb(cs[0]));
  57. printf("Сигнал в: %d:%d:%d\n", fb(cs[5]), fb(cs[3]), fb(cs[1]));
  58. printf("Дата: %s %d %s %d года\n", d[fb(cs[6])-1], fb(cs[7]), m[fb(cs[8])-1], 2000+fb(cs[9]));
  59. cout<<"Байт диагностики (0Eh):"<<endl;
  60. printf("Правильная установка RTC: %s\n", yn[cb(cs[0x0E], 2, 1)]);
  61. printf("Жесткий диск есть: %s\n", yn[1-cb(cs[0x0E], 3, 1)]);
  62. printf("Правильный размер ОП: %s\n", yn[cb(cs[0x0E], 4, 1)]);
  63. printf("Конфигурация правильная: %s\n", yn[cb(cs[0x0E], 5, 1)]);
  64. printf("Контрольная сумма CMOS правильная: %s\n", yn[cb(cs[0x0E], 6, 1)]);
  65. printf("Бартарея CMOS исправна: %s\n", yn[cb(cs[0x0E], 7, 1)]);
  66. cout<<"Статус выключения (ShutDown 0Fh):"<<endl;
  67. printf("%s\n", sd[cs[0x0F]]);
  68. cout<<"Тип накопителей НГМД (10h):"<<endl;
  69. printf("Первый НГМД: %s\n", ngmd[cb(cs[0x10], 4, 4)]);
  70. printf("Второй НГМД: %s\n", ngmd[cb(cs[0x10], 0, 4)]);
  71. getch();
  72. clrscr();
  73. cout<<"Тип накопителей НМД
  74. 53f
  75. (12h):"<<endl;
  76. printf("Первый НМД: %d\n", cb(cs[0x12], 4, 4));
  77. //
  78. 4e4
  79. if (cb(cs[0x12], 4, 4) == 15) printf("(зарезервированный тип)");
  80. printf("Второй НМД: %d\n", cb(cs[0x12], 0, 4));
  81. // if (cb(cs[0x12], 0, 4) == 15) printf("(зарезервированный тип CMOS)");
  82. cout<<"Байт оборудования (14h):"<<endl;
  83. printf("Установлен НГМД: %s\n", yn[cb(cs[0x14], 0, 1)]);
  84. printf("Математический сопроцессор: %s\n", yn[1-cb(cs[0x14], 1, 1)]);
  85. printf("Видеоадаптер: %s\n", vid[cb(cs[0x14], 4, 2)]);
  86. printf("Количество НГМД: %d\n", cb(cs[0x14], 4, 2)+1);
  87. printf("Основная память (15h-16h): %u Кбайт\n", cs[0x15]+cs[0x16]*255);
  88. printf("Расширенная память (17h-18h): %u Кбайт\n", cs[0x17]+cs[0x18]*255);
  89. printf("Диск С: (19h): %d\n", cs[0x19]);
  90. printf("Диск D: (1Ah): %d\n", cs[0x1A]);
  91. printf("Контрольная сумма ячеек 10h-20h (2Eh-2Fh): %d\n", cs[0x2E]*255+cs[0x2F]);
  92. printf("Расширенная память (30h-31h): %u Кбайт\n", cs[0x30]+cs[0x31]*255);
  93. printf("Столетие (32h): %d\n", fb(cs[0x32]));
  94. cout<<"Дополнительная информация из CMOS памяти (33h):"<<endl;
  95. printf("IBM 128K памяти установлен: %s\n", yn[1-cb(cs[0x33], 7, 1)]);
  96. printf("Используется утилита SETUP: %s\n", yn[1-cb(cs[0x33], 6, 1)]);
  97. getch();
  98. }
При использовании обязательна ссылка на http://DMTSoft.ru
up