CMOS+ISDOS

ZXNet echo conference «real.speccy»

From Kirill Frolov To All 16 July 1998

*** ПOСЛАHО В ZX.SPECTRUM
*** ПОСЛАHО В REAL.SPECCY
*** ПОСЛАHО В CODE.ZX

├┤i, All !

Часы к спектруму уже подключили успешно :-) Hо при этом оказалось
5 вариантов подключения :-( Богатство выбора это хорошо, а вот
их программироание страдает. Особенно в iS-DOS не хочется появления
кривых программ пользующихся только одним известным только им типом
часов. Поэтому есть идея выработать единый стандарт на работу с
энергонезависимыми часами или их эмуляторами на прерыванях. Т.К.
всякие решения типа набора счетчиков или часов не прерываниях крайне
несерьезны, то есть смысл рассчитывать в основном на часы основанные
на микросхеме 512ВИ1 или аналогах. Однако среди неплохих решений
могут быть реализации часов на специализированных микросхемах 176
серии, как в аоне "пульсар", поэтому сразу прошу если есть такие -
ответить мне немедленно ! 512ВИ1 с ними не совместима никак.
Если рассчитывать на часы совместмые с 512ВИ1, то лучшим способом
будет некий драйвер обеспечивающий взаимодействие с всеми регистрами
микросхемы вне зависимисти от метода её подключения или запрещающий
доступ в некоторые регистры, если это невозможно. В системе iS-DOS
зарезервировано 3 типа устройств : блочные, символьные вывода,
символьные ввода. Каждых может быть по 8 штук. Для их поддержания
и в других целях существуют 5 типов каналов: драйвера устройств
3 типов (24 канала), каналы драйверов этих устройств (24 канала),
резидентные задачи (16 каналов) и каналы программы (192 канала).
Для драйвера 512ВИ1 микросхемы нужен отдельный канал. Драйвера
блочных и символьных устройств ввода-вывода отпадают хотя-бы по
той причине, что некоторые программы могут захотеть их использовать
по назначению. Hельзя исполззовать и каналы предназначенные для
использования их программами - они могут быть удалены. Самым простым
будет использование каналов резидентных задач. Т.е. драйвер микросхемы
станет просто резидентной задачей. Hо не все так просто - есть проблема
нахождения и успешной идентификации такого драйвера среди остальных
резидентов. Единственным надежным способом с моей точки зрения
является поиск резидента по части имени, зарезервированной только
для драйверов микросхемы. Идентификация по номеру канала не может
быть использована из-за перемещаемости драйверов и того, что нужный
канало может быть уже занят. Единственный недостаток - под резидентные
задачи отведено всего 16 каналов, а следовательно не может быть
установлено более 16 задач. Однако у меня за все время использования
iS-DOS случай нехватки каналов произошел всего однажды.
При использовании программой драйвера параметры могут передаваться
через регистры или память. В случае работы через указатель должна
передать либо вызывающая программа, либо сам драйвер.
Остается еще немаловажный вопрос - с каким типом данных будет
работать программа через драйвер. Мне кажетсе целесообразным в
качестве такового использовать регистры микросхемы. Т.е. есть
флаг режима работы чтение/запись и номер регистра. В случае записи
еще нужны и записываемые данные. Драйвер должен возвращать 2 ошибки:
1.невозможность в данный момент прочитать данные - требуется повторное
обращение через некоторое время. 2.невозможность прочитать или записать
данные этого регистра в любой момент времени (защита записи нпример).
Если драйвер не будет предоставлять всем программам доступ ко всем
регистрам (для зашиты от недопустимых действий этих программ), то
для возможности пользоваться этими регистрами программам, которым
это необходимо можно предусмотреть передачу некого идентификационного
кода от программы к драйверу перед работой с ним.

Я предлогаю всем четко определиться в вышеизложенном вопросе и
написать ответ. Hа данный момент я предпологаю такое использование
драйвера как было описано. Драйвер вызывается по адресу загрузки +4
или по адресу лежащему в памяти со смещением +2 относительно адреса
загрузки, если там не ноль (см. описание резидентной задачи).
Вызов по адресу лежащему в ячейке памяти со смещением +0 относительно
адреса загрузки производится при снятии драйвера или перемещении.
При вызове драйвера для работы с микросхемой в регистре B должен
находится номер регистра 00...3Fhex. В случае если ведется запись,
то в регистре A передается значение. В случае чтения там возвращается
результат. Режим работы запись/чтение определяется флагом C. 1-запись,
0-чтение. Если драйвер не может произвести запись или чтение данного
регистра в любой момент времени, то он устанавливает флаг C, a если
часы не готовы, то сбрасывает флаг Z. При вызове драйвера необходимо
установить регистр C=#FF - это будет признаком того, что он не вызван
из коммандной строки, например для ручной установки некоторых режимов
его работы.

Чтобы уменьшить время на вызов драйвера и не потерять при вызове
регистры AF и B необходимо в начале программы один раз определить
в памяти наличие драйвера и адрес по которому его надо вызывать.


; Oпределение наличия драйвера и адреса. Программа возвращает
; флаг C с ошибкой 37 ("нет резидентной задачи") если драйвера
; в системе не установлено. Драйвер должен иметь фиксированное
; имя - однако если надо, то можно искать не только по
; фиксированному имени .
; В случае успешного поиска возвращается адрес запуска драйвера.

DEFCDA LD HL,NAME ; имя драйвера
LD BC,#1651 ; поиск канала по имени драйвера
LD A,#D8 ; начиная с канала A
RST 16 ; будут просмотрены B каналов.
RET C ; не найден A=Error:37
EXX
INC HL ; по адресу в канале
INC HL ; со смещением +4
INC HL ; находится адрес загрузки
INC HL ; резидентной задачи.
LD E,(HL)
INC HL
LD D,(HL) ; по адресу со смещением +2
INC DE ; относительно адреса загрузки
INC DE ; резидентной задачи находится
EX DE,HL ; адрес её пуска.
LD E,(HL)
INC HL ; если вместо адреса пуска там
LD D,(HL) ; находится 0, то адресом пуска
LD A,D ; считается адрес загрузки
OR A ; резидентной задачи +4.
EX DE,HL
RET NZ ; не 0. это адрес пуска.
INC DE
EX DE,HL ; если ноль, то адрес пуска +4.
RET

NAME DEFM "realtime" ; 8 символов.

Имя драйвера realtime.res

Hе лишним будет повесить драйвер на прерывания и корректировать
системную дату по адресу коммандной строки -3.

W!z Be$7 W!$heZ, FK0.

Reply to: Kirill_Fro...@zxnet.spb.ru