-3Fh - зарезервировано
Это поле вы можете использовать по своему усмотрению, например, хранить здесь пароль.
PS/2 использует ячейку с адресом 37h для хранения номера текущего столетия. Ячейки 38h-3Fh в модели 50 компьютера PS/2 используются для хранения пароля. Обращение к этим ячейкам выполняется по адресам 78h-7Fh, которые аппаратно отображаются на адреса 38h-3Fh.
Приведем две маленькие программы, демонстрирующие приемы работы с КМОП-памятью. Первая программа записывает в ячейки 34h-3Fh строку символов, вторая отображает эту строку, а также некоторые другие ячейки.
#include <stdio.h> #include <stdlib.h>
main() {
// Эта строка будет записана в КМОП-память
static char password[12] = "!Frolov A.V."; int i,j;
printf("\n*Запись в CMOS* ©Фролов A. 1991\n\n");
for(i=0x34,j=0; i<0x40; i++,j++) {
// Задаем адрес ячейки КМОП-памяти
outp(0x70,i);
// Выполняем запись в эту ячейку
outp(0x71,password[j]); } }
Программа для чтения содержимого КМОП-памяти:
#include <stdio.h> #include <stdlib.h>
main() { unsigned char cmos[164]; int i;
printf("\n*Чтение из CMOS* ©Фролов A. 1991\n\n");
// Читаем все 64 ячейки КМОП-памяти в массив cmos
for(i=0; i<64; i++) { outp(0x70,i); cmos[i]=inp(0x71); }
// Отображаем ячейки часов реального времени
printf("\nЯчейки часов реального времени: ");
for(i=0; i<0xd; i++) { printf("%02.2x ",(unsigned)cmos[i]); }
// Отображаем состояние байта диагностики // после включения питания
printf("\nБайт диагностики: %02.2x",cmos[0xe]);
// Отображаем содержимое байта отключения
printf("\nБайт отключения: %02.2x\n",cmos[0xf]);
// Отображаем содержимое зарезервированных ячеек
printf("\nPassword : "); for(i=0x34; i<0x40; i++) { printf("%02.2x ",(unsigned)cmos[i]); }
// Выводим это же еще раз в виде текстовой строки
cmos[0x40]=0; printf(">%s<\n",&cmos[0x34]); }
Некоторую помощь в определении конфигурации компьютера вам может оказать прерывание BIOS INT11h, которое мы рассмотрим ниже.