Из журнала Deja Vu #08, Кемерово, 1999
(C) Мистер Глюк
__________________________________________
Ода часам
.........
Схема прилагается.
:-L не мешай, курю...
Прошло много лет,и,по-моему,самое время
кое о чем рассказать.
Часы.
Пришла в голову одному человеку(не мне)
мысль подключить часы. Так бы она и погиб-
ла (мысль), да я ее поддержал. Этот же че-
ловек и презентовал мне для опытов саму
м/с 512ви1, снабдил литературой и смылся,
вот засел я за ее описание и ужаснулся.
Блин! А ведь умная штука!!!
Сначала я ее хотел подключить как ay,
благо система аналогичная - регистр адреса
и регистр данных. Здесь меня постиг один
облом - ни в одной книжке не сказано, что
при втором режиме доступа (а есть еще и
первый, но на синклере его реализовать бу-
дет затруднительно),после установления ад-
реса нельзя отключать линию СЕ, иначе она
забудет, какой регистр вам нужен, и будет
работать с регистром 0 (секунды),и при по-
пытке работать с выбранным регистром полу-
чите регистр секунд.
Второй облом постиг меня в процессе эк-
сплуатации,когда схема была запущена и от-
лажена, прошита ПЗУ, написан boot,установ-
лен резидент в iS-DOSе. По невыясненной до
сих пор причине иногда (у меня 3 раза) вы-
летает диод,который блокирует батарейку от
разряда на +5 платы компа. При этом (пов-
торюсь, у меня)все батарейки уходят в нир-
вану, и в лучшем случае просто загибаются
(в худшем - одна вытекла),жертв и разруше-
ний нет.
После того,как я вновь разорился на ба-
тарейки, я решил судьбу вновь не испыты-
вать, и отключил питание от платы компа,
питая часы всегда от батареек - учитывая
ничтожный ток - их должно хватить на пару
лет...
На сегодняшний день часы эти существуют
в единственном экземпляре, и софта практи-
чески нет. НО! Есть Пзу, где они исправно
тикают, и по-моему, пока (заметьте, ПОКА)
этого достаточно.
Переделке многих прог (главным образом
системных) мешает...ничего не мешает,прос-
то делать это некому.
Не обязательно вешать чсы на im2, ибо
теперь точность хода не зависит от частоты
вызова программы - в ПЗУ часы вообще
развязаны с прерываниями - как видно, ра-
ботает ничем не хуже.
Теперь об iS-DOSе. По-моему, вызывать
часы каждое прерывание нет нужды. Обновле-
ние информации происходит раз в секунды,
и поэтому последняя версия резидента пере-
печатывает время только тогда, когда сме-
няются секунды и всего один раз - выглядит
это точно также, но убиваются (да, и здесь
убийство!) сразу n зайцев:
1) разгружается прерывание,что для тор-
мозного iS-DOS'а немаловажно;
2) вероятность сглюкивания cls'а умень-
шается в 50 раз.
Поясню: при очистке экрана ldir'ом, ес-
ли придет прерывание в момент переноса
байта под часами, то весь экран будет за-
полнен одним числом - выглядит противно.
После переделки драйвера эффект практичес-
ки не наблюдается(и на старуху бывает раз-
долбуха).
Доступ к часам осуществляется посредст-
вом установки 7-го бита порта #FFFC, иначе
в адресном пространстве портов компа часов
нет.
После установки вышеозначенного бита в
1 возможен доступ к портам микросхемы: -
- #EFF7 - регистр данных, #DFF7 - регистр
адреса.
В регистр адреса записывается адрес не-
обходимох ячейки, в регистр данных записы-
ваются данные для записи в установленную
ячейку м/с, а также считываются данные из
выбранной ячейки.
Следует помнить, что после сброса 7-го
бита #FFFC м/с забудет, какой регистр вы
установили, поэтому работу с часами реко-
мендую проводить по нижеприведенному алго-
ритму.
Пример 1, он же последний.
; запись в регистр
; H- номер регистра, L - число для записи
LD BC,#FFFC
LD A,#80
OUT (C),A
; включили доступ к м/с и устанавливаем рег-ры
LD BC,#DFF7
OUT (C),H; устанавливаем ячейку.
LD B,#EF
OUT (C),L; заносим значение в ячейку.
; все выключаем
XOR A
LD BC,#FFFC
OUT (C),A
RET
Теперь о том, что из себя представляет
м/с. Для программера это устр-во имеет 64
ячейки памяти,часть из которых занята слу-
жебными регистрами.
адрес
#00 - секунды
#01 - секунды будильника
#02 - минуты
#03 - минуты будильника
#04 - часы
#05 - часы будильника
#06 - день недели
#07 - число
#08 - месяц
#09 - две последние цифры года
#0A - служебный регистр
#0B - то же
#0C - то же
#0D - то же
#0E отсюда и до конца (#3F) - озу пользо-
вателя.
...
#3F
Озу пользователя мною частично исполь-
зовано:
#0E - режим запуска boot'ов (48/128/вся
память);
#0F - сейчас не использую(в ранних верси-
ях был атрибут часов);
#10 - номер дисковода;
#11 - байт #АА - контроль наличия м/с и
необходимости вывода часов. Кнопка "2" в
Глюке инвертирует этот байт;
#12 - флаг "user message", если = "G", то
вместо стандартного "MR GLUK RESET SERVICE
V5.1" будет выводится мессага из часов.
Она начинается с адреса #13 и заканчи-
вается байтом #ff, длина не более 30 байт,
контрольные коды не допускаются(будут взя-
ты из пзу'шного знакогенератора и выведе-
ны).
Теперь подробнее. Строго говоря, пример
1 несколько не точен. Им можно пользовать-
ся только для байтов #0A-#3F,а для служеб-
ных байтов часов процесс доступа к м/с
нескольно иной.
Дело в том, что операция чтения/записи
может прийтись на момент обновления инфор-
мации в часах, а это происходит каждую се-
кунду, что чревато боком.
Для обхода подобной ситуации есть спе-
циальный бит в одном из служебных регист-
ров,который предугадывает процесс обновле-
ния. Если бит = ок, то некоторое время
(нормируется,да я забыл) м/с гарантирован-
но не будет обновляться. Из практики выяс-
нилось, что этого времени достаточно для
считывания/записи любой ячейки.
В Глюке, если происходит обновление в
часах, то цикл пропускается,визуально это-
го не заметно ( часы выводятся чаще, чем 1
раз в секунду, хотя в iS-DOS'е с этим по-
кончено).
Итак, после всего вышеизложенного стало
ясно, что после собирания схемы просто так
в Глюке часы не пойдут. Что нужно для то-
го, чтобы они пошли:
* занести в #11 байт #AA,в #0A- %00100000,
в #0B - %00000010, в регистры часов, минут
и секунд - время, дату тоже желательно.
М/с сама считает сколько дней в месяце,ви-
сокосные годы тоже учитываются,можно авто-
матически в определенные дни сделать так,
что произойдет перевод с летнего времени
на зимнее, да я это не использовал (только
перевод не сделал, а остальное все само.
Также будильник я не пробовал - знаю, что
он включается 5-м битом #0B, а сам не ис-
пользовал). Если, однако, возникнет жела-
ние его использовать, то над днем недели
выводится символ часиков, если будильник
включен - а вдруг кому надо? - так я уже
сделал.
По схеме.
DD1 - 555ЛЕ1, DD2 - 555ЛЛ1, в качестве
DD3 лучше использовать 555ТМ8, но можно и
ТМ2, однако,ТМ8 имеет 4 бита,а ТМ2 - толь-
ко два. Если вас интересуют дальнейшие до-
работки по megascreen порту, то ставьте
ТМ8.
Глюк запирает озу свыше 128 1-м битом
#FFFC, ROM-disc активируется 6-м битом, 0-
-ой бит включает дополнительный графичес-
кий режим, 5-ый бит подключает пзу тырдоса
и дает возможность работать с регистрами
ВГ-шки непосредственно.
После сборки схемы возникнет неприятное
явление - #fffc является четным адресом, и
во избежание дрыгания бордюром надо поста-
вить блокировку выборки порта #fe при вы-
борке #fffc - все камни кидать в Пуги, ибо
такой идиотский адрес порта расширения
графики придумал не я, а он, а я только
продолжил биты,дабы не городить новых пор-
тов.
Точность хода можно регулировать, для
этого нужно вместо одного из конденсаторов
поставить подстроечник.
По поводу ROM-DISCа. Реальной схемы та-
к я не сделал. Но! Все необходимое имеется
в Глюке. Доступ осуществлен следующим об-
разом:
* устанавливается 6 - ой бит #fffc,что от-
ключает стандартное пзу и подключает р-
-диск, проверяется байт по адресу 0, если
он не равен #ff(не вставлена м/с) и не ра-
вен #f3 (нет никакого р-диска, стандартное
пзу)то происходит RST 0 при живой системе;
т.е можно пользоваться интерфейсом из глю-
ка (так задумывалось). Т.о., р-диск имеет
размер 64 кб, что мало, но недорого.
Весьма перспективна м/с 27010 (128 кб),
что позволяет иметь и р-диск и основное
пзу в одном корпусе, и не нужна схема ком-
мутации. Путем задействования свободных
битов порта, размер р-диска можно увеличи-
вать до необходимого предела.
Сейчас я все это считаю гиблым делом.
Кстати, для коммутации окон р-диска и
нужен 5-ый бит #fffc - коммутирует а15 р-
-диска, а14 управляется через порт #7ffd,
как бит basic128.
__________________________________________