Эта статья прислана на конкурс.
i8088 (автор играет на конкурсе под псевдонимом)
1. Введение
2. Теория фантомных часов
3. Схема и изготовление часов
4. Программное обеспечение (ПО)
5. Проблема 21-го века
6. Проблема стабильности работы
7. Заключение
1. Общеизвестно, что PC/XT платы не имеют встроенных часов (исключая некоторые не совсем стандартные платы и XT ноутбуки). Поскольку работать без часов крайне неудобно, я стал рассматривать варианты оснащения имеющихся XT плат часами реального времени (RTC).
Самый простой и доступный вариант - использовать широко распространенные 8-bit мультикарты, содержащие обычно параллельный и последовательные порты, FDC, RTC и GAME порт. Однако этот вариант мне категорически не хотелось использовать из-за game порта. К тому же на 8-битных мультикартах game-port обычно торчит разъемом наружу, а не выведен на внутренний коннектор, как на 16-битных картах. Отдельные ISA карты RTC существуют, однако в моём распоряжении их не имелось. Схема там несложная, и можно собрать такую карту с часами самостоятельно, однако просматривая сайт minuszerodegrees.net, я обнаружил один очень интересный вариант "фантомных часов":
2. Речь идет о микросхеме SmartWatch DS1216E (нужна именно с индексом "E"!), содержащей "фантомные" часы. Микросхема эта имеет встроенную батарею (как и широко известный Dallas DS1287/12887) и вставляется в панель для BIOS, а сама микросхема BIOS уже в панель на DS1216E.
Микросхема DS1216E (фото с сайта minuszerodegrees.net)
Каким же образом чтение из микросхемы не вызывает конфликта с микросхемой BIOS? И как же осуществаляется запись регистров микросхемы, ведь на панели BIOS XT нет сигнала записи?
DS1216E является гибридной сборкой, содержащей Phantom Time Chip типа DS1215 (или его аналог), кварц, батарею (так же, как внутри Dallas DS12887, можно обнаружить микросхему DS12885).
В случае, если сама DS1216E не выбрана, то эта микросхема передает сигнал #CEO (CE out) выборки основного BIOS транзитом с входа #CEI (CE in). Иначе, если выбрана DS1216E, сигнал #CEO для основного чипа BIOS будет неактивный, т.е. выбрана или одна, или другая микросхема. Конфликта выходов не возникает.
Сама же внутренняя микросхема типа DS1215 (в зависимости от соединения выводов) может работать в режиме ROM или RAM. Режим ROM в данном случае означает не невозможность записи, а просто то, что запись в микросхему осуществляется без использования сигнала записи #WE на панели для ПЗУ, куда вставлена DS1216E (на платах XT никаких сигналов записи на панелях ПЗУ нет). А вот режим RAM требует наличия сигнала записи #WE на панели для ПЗУ, для данного применения этот режим непригоден, и здесь мы его рассматривать не будем.
В сборке DS1216E внутренняя микросхема сконфигурирована в режим ROM, собственно, именно поэтому необходима именно версия "E" (есть еще ROM версия "F", но она в корпусе DIP32). Далее будем рассматривать, как работает микросхема в режиме ROM, т.к. это единственно пригодный режим для построения XT RTC. Режим ROM является единствено возможным режимом для DS1216E.
А сама выборка осуществляется весьма остроумным способом. Вот как это работает в общих чертах. Программно доступ к часам в ROM режиме устанавливается с использованием линий адреса A2 и A0, а также сигналов выборки #OE и #CE. Связь с часами устанавливается путем выполнения 64-х последовательных циклов записи специального 64-битного ключа (C5, 3A, A3, 5C, C5, 3A, A3, 5C) младшими битами вперед. Это делается посредством передачи корректных данных последовательно по линии адреса A0 (т.е., линия адреса фактически используется для передачи данных). При этом для осуществления цикла записи линия A2 должна удерживаться на низком уровне. Для установления связи с часами нужно выполнить 64 цикла записи ключа, как описано выше. После приема корректного ключа часы выбираются, и возможна запись регистров часов (по линии A0) или чтение регистров по линии DQ0, в зависимости от уровня на линии A2 (низкий уровень выбирает режим записи, высокий - чтения). Отсюда понятно, почему эти часы названы фантомными - часы вроде и есть, но не адресуются привычным образом в адресном пространстве, и могут разделять место с обычным ПЗУ. Регистров в часах всего 8, читаются и записываются они одним 64-битным циклом. Вероятность случайной подачи ключевой последовательности при работе программ чрезвычайно мала: менее чем один случай из 10^19.
Микросхемы DS1216 сравнительно дорогие, и необходимая нам версия E стоит дороже других (напомню, что "E" нужна потому, что только эта версия работает как ROM, т.е., не использует сигнал записи WE#, котрого нет на панели BIOS XT). Микросхемы эти содержат залитые компаундом батареи. С большой вероятностью эти батареи будут уже севшие (т.к. микросхемы старые), и придется их отключать и ставить внешнюю (в статье на minuszerodegrees.net об этом тоже написано). Это все не сложно, но самое дешевое предложение на одну штуку DS1216E я нашел за ~15$, что мне показалось определенно дороговато за одну микросхему (пусть даже и новую, но старого года выпуска) с наверняка севшими батареями.
Однако, как уже упоминалось, все эти микросхемы с батареями используют по факту один и тот же чип DS1215 (или аналог), он просто конфигурируется по-разному (внешними подсоединениями ножек). Появилась идея приобрести микросхему DS1215 и сделать модуль RTC самостоятельно. Микросхемы DS1215 оказались значительно дешевле (~10$ за целых 5 шт). Они были заказаны и получены.
3. При использовании DS1215, модуль RTC нужно будет сделать самому (схема есть в datasheet), причем если на плате XT пустует панель для установки ROM-BASIC (как обычно и бывает), то наша задача упрощается, т.к. панель сверху переходника для установки исходного чипа ПЗУ можно вообще не делать - установка базового адреса решается в ПО, т.е. ставить модуль именно в панель BIOS нет необходимости (именно так я и сделал модуль). Можно использовать и свободные панели ROM на ISA картах (которые доступны в адресном пространстве центрального процесора), например, сетевых. На переходнике еще будут кварц, батарея, блокировочный конденсатор. Схема соединений для ROM режима есть в datasheet, здесь приведу ее с моими комментариями.
Подключение DS1215 как ROM (из datasheet)
Режим ROM (когда не нужен сигнал записи на панели ПЗУ) задается подключением входа ROM/RAM к источнику VCCO (вывод 15). В случае транзитного подключения микросхемы BIOS как на рисунке, выход #CEO (#CE out для выборки микросхемы главного BIOS) подключается к входу #CE микросхемы BIOS. Ннапомню, что это нужно для отключения микросхемы BIOS от шины, если DS1215 примет правильную ключевую последовательность. В случае установки часов в свободную панель (обычно для BASIC) выход #CEO не используется.
Батарею можно использовать одну, подключить к входу BAT1 (вывод 4), тогда BAT2 (вывод 14) соединить с корпусом. Сигнал сброса #RST следует подключить к высокому уровню (линии +5V). Я еще добавил в цепь батареи RC фильтр (резистор 1 кОм и конденсатор 0.1 мкФ), но это не обязательно. Ну и конечно, блокировочный конденсатор по питанию не будет лишним. На рисунке не показано соединение выводов GND (5 и 8), их, конечно, нужно соединить с общим проводом.
Кварцевый резонатор обычный часовой на 32768Hz, производитель рекомедует использовать кристалл с емкостью 6 пФ, подключение внешних емкостей не рекомендуется. Точность хода часов будет в основном зависеть от экземпляра резонатора.
После изготовления модуля я вставил его выводы в обычную DIP-28 панель для микросхемы, а уже её — в панель на материнке. Это предотвращает порчу контактов панели на материнке, хотя и несколько снижает надежность контакта. Вот что получилось (вариант для установки в пустующую панель для BASIC):
Материнка с установленным в панель для BASIC-а модулем RTC
Установленный в плату модуль более крупно
4. В качестве ПО для обслуживания часов я выбрал SMWCLOCK.COM. Эта программа автоматически ищет часы и написана полностью на ассемблере MASM4 (исходный текст имеется, что является
большим плюсом). Причем написана она, на мой взгляд, очень аккуратно, прям по книжкам!
Использование программы SMWCLOCK.COM .
При первом запуске или при необходимости коррекции времени надо сперва поставить корректную дату и время в DOS, как обычно, командами DATE/TIME . Далее надо записать правильное время в DS1215 - это команда калибровки SMWCLOCK C . При первой установке батареи часовой генератор может не работать, но после этой команды он запустится, что можно видеть по подключенному к резонатору осциллографу. Установку времени в "фантомных" часах по DOS time можно сделать в любой момент, например, для коррекции времени в RTC после новой установки DOS времени.
При эксплуатации для автоматической установки времени при загрузке машины надо просто в AUTOEXEC.BAT записать (с правильным путем к файлу, конечно): SMWCLOCK S
Это значит SET DOS TIME , т.е. установить DOS время и дату по времени и дате, прочитанному из RTC.
В любой момент можно прочитать время из DS1215 (например, для сверки с временем DOS), просто дав команду SMWCLOCK (или SMWCLOCK F ), что примерно одно и то же.
Далее расскажу об обнаруженных проблемах в программе и способах их решения.
5. При пользовании программой сразу же обнаружилась проблема с годами 21-го века в виде неверного сохранения года. И отображение года тоже было неверное, например, 2000 как 19A0 и т.п.
Дело здесь в том, что в DS1215 отсутствует байт века, и получается, что считаем годы от 1900 до 1999 (DOS поддерживает даты от 1980 до 2099 года). Я решил сместить шкалу времени на 80, т.е. например, для 2010 года просто запишем в часы 30 (1930 год для часов), а при чтении к прочитанным данным добавлять 80. Поскольку 1980 год, как и 1900, високосный, учет числа дней в феврале будет работать верно. Такой вариант должен работать от 1980 до 2079 года. Изменения в исходный текст были внесены, и после отладки программа заработала как предполагалось.
6. SMWCLOCK ищет часы начиная с адреса C0000h с инкрементом в 2000h (8KB). Из-за специфического метода доступа к часам понятие базового адреса довольно условное, т.к. базовым адресом может в принципе считаться любой адрес, вызывающий срабатывание дешифратора выборки соответствующей микросхемы (панели для микросхемы) на материнской плате или ISA карте.
Я проверял работу программы, устанавливая RTC модуль вместо штатного BIOS расширения на имеющейся у меня ISA карте FDC. Базовый адрес всегда точно распознавался как CA000h (такой адрес выставлен перемычками на карте). Также часы успешно были распознаны при установке в панель boot-ROM сетевой карты, базовый адрес выставлялся перемычками как D0000h и D4000h и всегда распознавался верно.
Однако при установке RTC модуля в панель BASIC на плате XT JATON JXM-10MHZ-V3 (она как раз на вышеприведенных фото) базовый адрес иногда распознается как F6000h, иногда F8000h и редко как FC000h и даже FA000h, на работоспособность это в принципе особо не влияет (диапазон адресов, при котором дешифратор выбирают BACIC: F6000h - FDFFFh), но сам факт нестабильного определения адреса косвенно указывает на проблему. На этой же плате при чтении часов изредка происходило разрушение регистра года (а очень редко и других регистров). На другой XT плате HED-918 определение базового адреса работало стабильно, и сбоев информации в часах не наблюдалось.
Стабильность данных и определения базового адреса часов я проверял простым командным файлом с бесконечным циклом вызова SMWC (я переименовал программу). Запускать BAT файл для проверки надо на длительное время, а прервать как обычно, ^C.
=================================
@echo off
:loop
smwc f
if exist test.bat goto loop
=================================
Вот что удалось выяснить относительно причины сбоев на XT JATON. ПО в процессе поиска RTC пробует модифицировать регистр года восемь раз (сохранив заранее оригинальное значение). Если после каждой модификации всегда считывается такое же модифицированное значение, то считается, что RTC найден (из-за особенностей доступа к часам фактически обновляются все 8 регистров). После этого оригинальное значение записывается обратно.
Оказалось, что иногда даже просто попытка чтения часов возвращает неверные данные, вплоть до одних "FF", при этом не проходят даже простые начальные проверки (это первоначальные тесты, еще до попыток временной модификации года). Проверяется, что данные в часах не все "FF", и также проверяется, что из битов регистров, где всегда должен быть нуль, читаются именно нули. Поэтому и "плавает" базовый адрес.
При временной же модификации года, вероятно, иногда происходит сбой. Если он будет при записи, то произойдет порча регистра(ов) и переход на поиск часов по следующему адресу, а если при чтении, то переход на следующую итерацию с "испорченным" регистром года.
Для снижения вероятности сбоев я сменил восьмикратный цикл записи/чтения года на двухкратный. Однако для полного устранения сбоев чтения на XT JATON я сделал специальную версию программы. Эта версия отличается тем, что базовый адрес часов жестко выставлен на F6000 и проблемные тесты модификации регистра года удалены. Оставлены только начальные тесты — проверка, что данные в часах не все "FF" и проверка, что биты, где всегда должен быть нуль, равны именно нулю. В случае неудачи попытка чтения часов повторяется 2048 раз, что практически более чем достаточно. В случае же отсутствия часов или если они находятся по другому адресу, программа задержится на попытках поиска часов примерно на ~6 секунд (при тактовой частоте 4.77MHz), что я считаю допустимым.
Теоретически, даже после этой модификации, ошибка при чтении тоже возможна — если начальные проверки проходят, но данные просто прочитались неверно, но практически я такого не наблюдал. Возможна ошибка при установке времени в RTC (калибровки часов по DOS времени), но это редкая операция, и можно просто повторить запись (ошибок при калибровке я пока тоже не наблюдал).
Дальнейшие попытки узнать причину сбоев показали, что на входе #OE панели для ПЗУ BASIC-а и также основного ПЗУ BIOS-а (входы #CE микросхем на этой плате заземлены) наблюдаются пачки импульсов низкого уровня с периодом 15мкс, длительность пачек и пауз примерно ~500ms. Это происходит даже при запрещенных прерываниях. 15мкс — это как раз период регенерации ОЗУ, для которого на XT задействован канал 0 DMA контроллера. Регенерация запускается по импульсам от канала 1 таймера i8253, константа счетчика 12h. Я предполагаю, что DMA контроллер при регенерации делает обращение по адресам ПЗУ в F000 сегменте, что для ПЗУ безвредно, но может нарушить работу наших часов, если импульс придет в "неудачный момент". Возможно, это связано с наличием у этой платы виртуальной памяти (384KB), которая предположительно может использоваться и как shadow для F000 сегмента. Отключение виртуальной памяти перемычками результата не дало. И мне непонятно, почему 15мкс пачки периодически прекращаются. На плате HED-918 ничего такого не наблюдается, и при запрещенных прерываниях ПЗУ BIOS-а и BASIC-а не выбраны. Часы на ней работают стабильно.
Я пробовал прямо перед чтением/записью часов добавить код чтения первого канала таймера i8253 и не запускать операции с часами, если значение в счетчике слишком мало (счетчики i8253 вычитающие). Однако длительность чтения/записи часов больше 15мкс, и это лишь слегка уменьшило вероятность сбоя. Оптимально было бы отслеживать начало паузы между пачками импульсов, но я не знаю как программно определить ее начало.
7. Конечно, предложенное решение проблемы со стабильностью на XT JATON далеко от идеала, и в случае нахождения более удачного решения будет соответствующее сообщение в теме обсуждения статьи. В будущем можно еще изготовить "транзитный переходник" для установки в панель BIOS (необязательно BIOS-а материнки, можно и любой карты расширения с установленным ПЗУ, к которому есть доступ в адресном пространстве центрального процессора). Надеюсь, что эта небольшая статья будет полезна для любителей XT.
В приложенный архив включены три программы - оригинальная (самораспаковывающийся архив SWATCH.EXE), модифицированная и специальная версия с фиксированным адресом. Во избежание путаницы название модифицированной программы изменено на SMWC.COM, а специальной версии с фиксированным адресом F6000h - SMWCF.COM. Все программы транслировались с помощью асемблера MASM2. Скачать архив.
Обсудить статью в специально созданной ветке форума. Эта статья прислана на конкурс.
© Текст, фотографии — i8088 (автор играет на конкурсе под псевдонимом)
© Железные призраки прошлого — 2019 г.
Опубликовано 08.02.2019 г.
Дополнения или поправки на phantom@sannata.ru
|