Программирование CMOS

В эпоху интенсивного развития высоких технологий и технологий Internet программирование для «железа» отошло на второй план. А между тем практически невозможно реализовать ничего стоящего без правильной конфигурации оборудования, в частности CMOS - энергонезависимой памяти компьютера. В данной статье мы рассмотрим устройство CMOS, его структуру и возможности программирования. Сразу оговорюсь, что программировать CMOS желательно из реального режима ОС; под ОС Windows это делается с помощью специальных драйверов VxD или SYS. В Сети существует достаточно источников документации по построению таковых, поэтому я на них останавливаться не буду. Естественно, что проводить все ниже перечисленные действия по записи значений в CMOS следует с особой осторожностью; иногда (!) можно потерять практически все значения конфигурации ПК. В таковом случае необходимо очистить CMOS; как это сделать - смотрите в документации к вашей материнской плате. Также я буду использовать язык ассемблера для иллюстрации конкретных примеров, а так же широко распространенный отладчик DEBUG.EXE, который прилагается практически с каждой версией ОС Windows/DOS.

Вся информация, представленная в данной статье несет только информативные цели. Автор не несет ответственности за некорректное использование приведённых ниже фактов.

ДАННЫЕ CMOS

CMOS является нечто вроде базы данных, которая предназначена для хранения информации о конфигурации ПК. Однако, в отличие от реальной БД, которая имеет реальный образ на магнитном носителе, CMOS хранит свои данные на микросхеме многократной записи (write many-read many). Программа установки BIOS SETUP при записи сохраняет в ней свою системную информацию, которую впоследствии сама же и считывает (при загрузке ПК). Каждая ячейка имеет размер в 1 байт.

 

Таблица данных имеет следующий вид:

 
Адрес  Назначение 
00H-0DH  RTC (Real Time Clock) - часы реального времени (таймер)
0EH  Байт статуса процедуры POST (результат загрузки ПК)
0FH  Байт завершения работы ПК
10Н  Тип дисковода
11Н  Зарезервировано
12Н  Тип(ы) винчестера (если значение < 15)
13Н  Зарезервировано
14Н  Байт конфигурации оборудования
15Н-16Н  Размр базовой памяти
17Н-18Н  Размер памяти за пределом 1 Мб
19Н  Тип винчестера С: (если значение > 15)
1АН  Тип винчестера D: (если значение > 15)
1BH-20H  Зарезервировано
21H-2DH  Зарезервировано
2EH-2FH  Контрольная сумма CMOS (от 10Н - 20Н)
30Н-31Н  Размер расширенной памяти за пределом 1 Мб
32Н  Номер текущего века в BCD нотации (например 17Н)
33Н  Другая информация
34Н-3АН  Зарезервировано

Ячейки таблицы, показанные красным цветом, представляют собой адреса CMOS, защищенные контрольной суммой. То есть запись в диапазон адресов 10Н-20Н должен сопровождаться корректировкой значений в ячейках 2ЕН-2FH. Иначе можно получить сообщение о неправильной установке параметров или о «усохшей» батарее CMOS. Контрольная сумма представляет собой 16-битную сумму всех значений, записанных в ячейки CMOS с 10Н по 20Н. В ячейку 2ЕН пишется старший байт суммы, а в 2FH - младший. В любом случае, мой вам совет - сначала сохраните старое значение CMOS (да и вообще все значения CMOS) а потом просто вычитайте или складывайте нужные значения с полученной контрольной суммой. Так проще.

ЧТЕНИЕ И ЗАПИСЬ CMOS

Чтение : для чтения значения из ячейки, запишите значение в порт 70Н адрес интересующей вас ячейки, а затем считайте значение из порта 71Н - это и будет интересующие вас значение. Например получим номер текущего века (MS Debug):

Нумерация веков идёт с 00Н (если так можно выразиться), поэтому значение 20Н вполне адекватно.

Запись: для записи значения в CMOS запишите значение адреса в порт 70Н, а затем новое значение в порт 71Н. Установим для примера новое значение века (так сказать «машина времени» J):

Теперь чтобы вернуть все как было, введем в порт 70Н значение 32Н, а в 71Н - 20Н:

 

Пусть вас не смущает отсутствие символа "Н" после цифр - все значения в MS Debug идут только в шестнадцатеричном виде.

 

ПОДРОБНЕЕ ОБ АДРЕСАХ CMOS

Итак, остановимся на подробном рассмотрении значений, хранящихся в CMOS.

Адрес (HEX)  Описание 
00Н  Текущая секунда
01Н  Сигнальная секунда
02Н  Текущая минута
03Н  Сигнальная минута
04Н  Текущий час
05Н  Сигнальный час
06Н  Текущий день недели (1 - Воскресенье)
07Н  Текущий день месяца
08Н  Текущий месяц
09Н  Текущий год (только 2 последние цифры, напр. 98)

Все значения RTC храняться в BCD формате как 2 полубайта но в десятичном формате. Например 31 (dec) хранится как 31 (hex).

 

 


Страница сайта http://silicontaiga.ru
Оригинал находится по адресу http://silicontaiga.ru/home.asp?artId=5961