"ПРОБЛЕМА ВВОДА 2000 ГОДА
В КОМПЬЮТЕР С УСТАРЕВШЕЙ
ВЕРСИЕЙ BIOS"
Главная \ Радиолюбительский софт \ Разное\
О. ЖЛУТКО, пос. Керчевский Пермской обл.
Журнал "Радио" №2 2001г.
Под таким заголовком в "Радио" были
опубликованы небольшие заметки, посвященные
корректному формированию системной даты на IBM PC,
у которых установлена BIOS ранних версий. Вниманию
читателей предлагается еще один вариант
подобной программы. Основное ее отличие от ранее
описанных состоит в том, что нет необходимости
ежегодно изменять какиелибо параметры или
вводить какую-либо информацию, коррекция даты
происходит автоматически.
С подобной проблемой столкнулся и автор. В
компьютере с материнской платой TOMATO BOARD и BIOS AWARD
версии 1996 г. при включении питания выводился 1996 г.
После загрузки WINDOWS он интерпретировался в 2096 г.
Странным показалась не сама проблема перехода на
2000 г., а то, что она проявилась на сравнительно
новом компьютере (машины гораздо более старшие
вошли в 2000 г. без проблем).
Вообще-то в CMOS поле ввода года —четыре знака.
Можно предположить, что в этой ситуации виноват
не BIOS вполне уважаемой фирмы, а производители
материнской платы, установившие в свое изделие
устаревшие системные часы. Однако проблема
оставалась, и ее как-то нужно было решать.
Первым побуждением, как и у И. Осипова, был ввод в
autoexec.bat строки с запросом новой системной даты. Но
мелкий текст на черном фоне и необходимость
вводить дату в определенном формате вызывали у
пользователей определенные трудности (как это ни
покажется странным), и от этого способа пришлось
отказаться.
Следующий шаг — создание программы с красивым
ярким окном, где запрашивался текущий год в
формате четырех цифр. Эта программа также
вызывалась из autoexec.bat при начальной загрузке. В
ней был организован простейший контроль
вводимой информации, и она позволяла в будущем
перейти на новый 2001 г. самим пользователям.
Однако постоянный ввод какой-либо информации при
старте создает некоторые неудобства, заставляя
находиться рядом с компьютером. Следует отметить,
что загрузка WINDOWS 95 на PC486DX4-100 — процесс весьма
долгий, как, впрочем, и любой другой современной
ОС.
В постоянных поисках решения, как программно
организовать второй календарь, автоматически
переводящий систему на новый год, был найден
выход. Дело в том, что системный календарь
правильно отображает текущее число и месяц, на
этом и построена программа.
Она названа New_Date и написана на Foxpro 2.5, хотя без
проблем ее можно перевести на любой язык
программирования высокого уровня. Выбор именно
Foxpro вызван развитостью функций работы с датой.
Исходный текст программы приведен в таблице.
Некоторые пояснения для тех, кто плохо знаком с
Foxpro и подобными системами управления базами
данных (СУБД).
Сначала необходимо средствами Foxpro создать файл
New_Date.dat. Это обычный DBF-файл, содержащий всего одно
текстовое (character) поле New_Date длиной десять
символов. Использование текстового поля для
хранения даты требует применения функций
преобразования, однако позволяет вводить
информацию в него не только средствами СУБД, но и
другими. Например, оболочка "DOS Навигатор"
позволяет вводить данные в числовые и текстовые
ноля DBF-файлов. К тому же в стандартном поле DATA год
хранится в двузначном формате, что не очень
информативно. Впрочем, сама программа может
работать и с полем DATA,
что не будет ошибкой и исключит применение в
дальнейшем функции CTODO.
********* Программа проверки и установки системной
даты*********
CLEAR && Очищаем экран
SET DATE GERMAN && Устанавливаем формат даты ДД.ММ.ГГ
на Новый год
SET CENTURY ON && Устанавливаем число знаков в
интерпретации
&& года; "ON" - Foxpro работает с 4 знаками
&& Определяем переменные
PUBLIC old_mes, old_god, new_day, new_mes, new_god, new_date
&& old_mes, old_god - сохраненные в БД месяц и год
&& new_day, new_mes, new_god - новые значения числа,
месяца, года
&& new_dale - новая дата в текстовом формате
&& И присваиваем им начальные значения
STORE 0 ТО old_mes, old_god
STORE "" ТО new_day, new_mes, new_god, new_date
USE old_date.dat && Загружаем базу данных, содержащую
дату
&& последней загрузки системы
oM_mes = MONTH(CTOD(old_date.old_date)) && Выделяем и
запоминаем
&& месяц из сохраненной даты
old_god = YEAR(CTOD<old_date.old_date)) && Выделяем и
запоминаем произошло
&& год из сохраненной даты
&& Проверка на "Новый год"
IF MONTH(DATE()) < old_me«
old_god = old_god + 1
ENDIF
&& Формируем новую системную дату.
new_day = ALLTRIM(STR(DAY(DATE()))) && Формируем число
IF LEN(new_day) < 2
new_day = "О" * new_day && Преобразуем его до 2
знаков
ENDIF
new_mes = ALLTRIM(STR(MONTH(DATE()))» && Формируем месяц
IF LEN(new_me») < 2
new_mes = "О" + new_mes && Преобразуем его до 2
знаков
ENDIF
new_god = ALLTRIM(STR(old_god)) && Формируем год
&& запоминаем новую дату в базе данных и в
переменной new_date
REPLACE old_date.old_date WITH (new_day *"." + new_mes + "." *
new_god)
new_date = old_date.old_date
USE && Закрываем файл БД
I date &new_date && Устанавливаем новую дату
средствами ОС
CLEAR && Очищаем экран
QUIT && Окончание программы
Дату можно хранить и в MEM файле как переменную, и в
текстовом файле. В последнем случае необходимо
пользоваться операторами FOPEN(), FCLOSEO, FPUT(), FGET().
Перед первым запуском программы необходимо
вручную занести в поле базы данных (БД) текущую
дату в формате ДД.ММ.ГГГГ (точки-разделители
обязательны).
В самом начале программы настраивается среда
Foxpro:
SET DATE GERMAN приводит формат даты к привычному
видуДД.ММ.ГГ;
SET CENTURY ON "заставляет" Foxpro обрабатывать год в
формате четырех цифр. Введение команды является
обязательным, иначе программа работать не будет.
Далее из сохраненной даты выделяют месяц и год и
записывают в переменных. То же происходит и с
системной датой, только запоминают число и месяц.
При проверке на "Новый год" сравнивают
сохраненный месяц, выделенный из системной даты.
Если сохраненный месяц больше системного,
значение года увеличивают на 1.
Например, последний раз компьютер включали 25.12.2000
г., а текущее включение произошло 15.01.2001 г. Тогда
сохраненный месяц (12) — больше текущего (1) и к
сохраненному году (2000) добавляют 1. Во всех других
случаях значение года сохраненной даты
используют для формирования новой системной.
Затем вновь сформированную системную дату
записывают в файл БД.
Foxpro не имеет собственных возможностей установки
системной даты и времени, поэтому для обновления
даты воспользуемся средствами ОС с функцией
подстановки. Следует помнить, что для
подстановки в команду DATE ОС требуется только
текстовая строка, иначе будет выведено сообщение
об ошибке!
Конечно, эту программу можно "перекроить" в
зависимости от собственного стиля
программирования. Ее текст приведен лишь как
иллюстрация к алгоритму организации в
компьютере второго календаря с автоматической
сменой года.