Страница 1 из 4 В эпоху
интенсивного развития высоких технологий и технологий Internet
программирование для «железа» отошло на второй план. А между тем
практически невозможно реализовать ничего стоящего без правильной
конфигурации оборудования, в частности CMOS - энергонезависимой памяти
компьютера. В данной статье мы рассмотрим устройство CMOS, его структуру
и возможности программирования. Сразу оговорюсь, что программировать
CMOS желательно из реального режима ОС; под ОС Windows это делается с
помощью специальных драйверов VxD или SYS. В Сети существует достаточно
источников документации по построению таковых, поэтому я на них
останавливаться не буду. Естественно, что проводить все ниже
перечисленные действия по записи значений в CMOS следует с особой
осторожностью; иногда (!) можно потерять практически все значения
конфигурации ПК. В таковом случае необходимо очистить CMOS; как это
сделать - смотрите в документации к вашей материнской плате. Также я
буду использовать язык ассемблера для иллюстрации конкретных примеров, а
так же широко распространенный отладчик DEBUG.EXE, который прилагается
практически с каждой версией ОС Windows/DOS.
Страница 2 из 4
Данные 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)а
потом просто вычитайте или складывайте нужные значения с полученной
контрольной суммой. Так проще.
Страница 3 из 4 Чтение и запись CMOS Чтение: для
чтения значения из ячейки, запишите значение в порт 70Н адрес
интересующей вас ячейки, а затем считайте значение из порта 71Н - это и
будет интересующие вас значение. Например получим номер текущего века
(MS Debug): Нумерация веков идёт с 00Н (если так можно выразиться), поэтому значение 20Н вполне адекватно. Запись:
для записи значения в CMOS запишите значение адреса в порт 70Н, а затем
новое значение в порт 71Н. Установим для примера новое значение века
(так сказать «машина времени» J): Теперь чтобы вернуть все как было, введем в порт 70Н значение 32Н, а в 71Н - 20Н: Пусть вас не смущает отсутствие символа "Н” после цифр - все значения в MS Debug идут только в шестнадцатеричном виде.
Страница 4 из 4 Подробнее об адресах CMOS Итак, остановимся на подробном рассмотрении значений, хранящихся в CMOS. Адрес (HEX) | Описание | 00Н | Текущая секунда | 01Н | Сигнальная секунда | 02Н | Текущая минута | 03Н | Сигнальная минута | 04Н | Текущий час | 05Н | Сигнальный час | 06Н | Текущий день недели (1 - Воскресенье) | 07Н | Текущий день месяца | 08Н | Текущий месяц | 09Н | Текущий год (только 2 последние цифры, напр. 98) | Все значения RTC хранятся в BCD формате как 2 полубайта но в десятичном формате. Например 31 (dec) хранится как 31 (hex). Адрес (HEX) | Описание | 0AH | Регистр статуса RTC (# A): Биты 0-3 - Селектор уровня (установлены в 0110) Биты 4-6 - 22-уровневый делитель (установлен в 010) Бит 7 - В данный момент производится обновление (если == 0 то разрешено чтение) | 0BH | Регистр статуса RTC (# B): Бит 0 - Включен режим экономии времени (летнее); (0 = стандартное время; по умолч. = 0) Бит 1 - 12 или 24 часовой режим времени (если 0 то 12 часовой; по умолч. = 1) Бит 2 - Режим BCD даты (1=двоичный, 0 =BCD, по умолч. = 0) Бит 3 - Включить Square Wave (1=включить; по умолч. = 0) Бит 4 - Включить прерывание обновления (0=отключить, по умолч. = 0) Бит 5 - Включить сигнальное прерывание (0=отключить, по умолч = 0) Бит 6 - Включить периодическое прерывание (0=отключить, по умолч. = 0) Бит 7 - UIP флаг (Update In Progress), 0 - можно читать CMOS | 0CH | Регистр статуса RTC (# С):в основном не используется | 0DH | Регистр статуса RTC (# D):если бит 7=1, то питание CMOS включено, если бит 7=0 - то батарея разряжена. | 0EH | Байт диагностики загрузки (POST Byte): Биты 0 и 1 всегда равны 0. Бит 2 - Время правильное (1=верно, что сегодня не 30 февраля) Бит 3 - Неверный загрузочный жесткий диск (1=нельзя загрузиться с винчестера) Бит 4 - Ошибка размера RAM (1=POST нашла неверный размер RAM) Бит 5 - Неверная запись об оборудовании (1=неверное оборудование) Бит 6 - Неверная контрольная сумма (1=неверная сумма CMOS) Бит 7 - Утеря питания батареи CMOS (1=утеря питания) | 0FH |
Байт статуса завершения работы ПК.Применяется чаще всего после
перезагрузки ПК процедурой SETUP. Значения могут быть следующие: 0 , если была перезагр. по нажатии Ctrl-Alt-Del или неожиданный перезапуск. В любом случае - процедура POST НЕ выполняется 1 перезапуск после определения размера памяти 2 перезапускпосле теста памяти 3 перезапуск после обнаружения ошибки памяти 4 перезапуск по запросу загрузчика ОС 5 перезапуск вследствие дальнего перехода (FAR JMP) на адрес 0:0467Н 6,7,8 перезапуск после проверки защищ. режима 80286 9 перезапуск после переназначения блока памяти (ф-я 0х87 прерыв. 0х15) | 10Н | Байт типа дисковода: Биты 0-3: первый дисководБиты 4-7: второй дисковод В любом случае, значения битов могут быть следующими: 0000
= 0 = дисковод не установлен 0001 = 1 = 360К 0010 = 2 = 1,2 Мб 0011 = 3
= 720К 0100 = 4 = 1,44 Мб Например: 24Н - это диск А: размером 1,2М и
диск В: размером 1,44М | 11Н | РЕЗЕРВ | 12Н | Тип винчестера (для дисков С: и D:, когда байт наход. В промежутке от 1 до 14).Биты 0-3: первый винчестерБиты 4-7: второй винчестер В любом случае, значения битов могут быть следующими: 0000 = 0 = диск не установлен другое_значение = тип диска 1111 = см. адреса 19Н и 1АН | 13Н | РЕЗЕРВ | 14Н | Байт оборудования: Бит 0 = 1, если присутствует дисковод(ы) Бит 1 = 1, если присутствует матем. сопроцессор Биты 2, 3не используются и равны 0 Биты 5, 4 - основной видеоадаптер: · 00 - нет или EGA · 01 - 40*25 EGA, CGA, VGA · 10 - 80*25 EGA, CGA, VGA · 11 - монохромный (ч/б)Биты 6, 7 - количество дисководов - 1 (00=1, 01=2, 10=3, 11=4) | 15Н, 16Н | Базовая память 15Н - младший байт 16Н - старший байт Могут быть равны: · 0100Н = 256К · 0200Н = 512К · 0280Н = 640К | 17Н, 18Н | Дополнительная память свыше 1 Мб 17Н - младший байт 18Н - старший байт Размер записан в Кб. | 19Н | Тип диска № 0 (С:), если значение адреса (12Н & 0FH) = 0FH | 20Н | Тип диска № 1 (D:), если значение адреса (12Н & F0H) = F0H | 1BH-2DH | РЕЗЕРВ | 2ЕН, 2FH | Контрольная сумма значений адресов от 10Н по 20Н · 2ЕН - старший байт · 2FH - младший байт | 30Н-31Н | РЕЗЕРВ | 32Н | Век в формате BCD | 33H | Другая информация (специфич. для машин AT/PS-2 класса) | 34Н-3FH | РЕЗЕРВ. Как показывает практика, эта область чаще всего свободна от системных данных (но не всегда!), поэтому можете записывать сюда свои личные данные (но не много J) для сохранения между перезагрузками) |
Итак, мы рассмотрели CMOS, его логическое строение и структуру.
Конечно, в таблице приведены лишь общие для всех машин значения
параметров CMOS, но тем не менее даже с этим «набором» можно сделать
много «чего», например подключить отключенный администратором дисковод
(см. адреса 14Н, 10Н, 2ЕН, 2АР) и т.д. В любом случае: будьте крайне осторожны, не делайте ничего такого, чего потом вы не сможете вернуть обратно. Всё же буду надеяться, что данная статья принесёт вам пользу.
http://www.tdoc.ru/c/programming/assembler/cmos-programming-page4.html
|