Из журнала 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. __________________________________________