ZXNet эхоконференция «code.zx»


тема: CMOS in SMUC



от: Aleksandr Majorov
кому: Dmitry Lomov
дата: 08 Sep 1998

Хаюшки, Dmitry!

08-09-98 в 04:16 некто Dmitry Lomov писал 2 All на тему 'CMOS in
SMUC'.

DL> А не сообщит ли мне уважаемый ОЛЛ адреса портов в сабже и
DL> способы доступа к ним?

лучше всего лазать через RST #08, только тормоза...
вобщем вот лови

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

89h (R8time) - чтение/запись времени из
CMOS ( RST 8 : DB #89 ).

В регистре D битами задается:

7 - (1) записать значение времени/даты
(0) считать значение времени/даты.

6 - (1) считывание в буфер (только, если
бит 7=0. (см. бит 5).

5 - (1) прямое считывание (6 байт данных
из CMOS).
(0) считывание в формате ASCII.

0 - (1) работа с датой
(0) работа со временем.

Кроме того, в HL - адрес буфера (если счи-
тывание происходит в буфер), в 5 и 2
банках CPU. Регистр E содержит формат
считывания: младшие 5 бит - символ раз-
делителя (+32!!!) (VS: например для сим-
вола ":" должно быть 26), биты 7,6 и 5
разрешают соответственно вывод часов,
минут и секунд, либо для вывода даты:
бит 7 - выводить день недели
бит 6 - ставить "0" перед числом
бит 5 - выводить месяц словом и перед
годом добавлять "19".

Функция возвращает данные либо в буфер,
(в виде строки ASCII или 6-ю байтами:
секунды, минуты, часы, число, месяц,
год), либо в регистрах:
C - секунды/число
B - минуты/месяц
E - часы/год
L - день недели

В этох же регистрах задаются значения
для изменения времени/даты.

out: CY=error (микросхемы CMOS нет).

VS: У MOA лаконично замечено, что данные
можно вернуть в буфер ( в формате ASC.)
Hо если вы это сделаете, то заметите,
что вам все время возвращаются одни и
те же значения! Hа самом деле, время в
ASCII запоминается где-то в 8-й банке,
откуда вам и возвращается. И обновля-
ется только при инициализации Reset или
Magic!!! Я научился эту фичу обходить
таким образом: сначала время вызывается
в регистрах ( в этот момент данные в
буфере тоже обновляются), после чего
возвращаю себе время в буфер. И на этот
раз это истинное время. (Именно таким
образом я опрашиваю время в BBS 3.20).
Таким образом, вызов времени происхо-
дит через 2 прохода: сначала в регистры
( через RST 8 ), затем сразу в буфер
( снова через RST 8 ). За это MOA надо
тоже надовать по голове ;)

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
а вот прямое ползание:

; *** proc
; parm : ---
; value : cf==busy
; nc==read, hl=&bf[6]
; modify: af bc de hl
_rtc_try_read
ld de, #3FF3 ;in
ld bc, #3FF0 ;out
ld (rtc_tryrd_sp+1), sp
ld hl, rtc_tryrd_fin
push hl
push de
push bc
ld hl, rtc_tryrd_inc
push hl
push de
push bc
push hl
push de
push bc
push hl
push de
push bc
ld hl, rtc_tryrd_add2
push hl
push de
push bc
push hl
push de
push bc
push hl
push de
push bc
ld hl, rtc_tryrd_tst
push hl
push de
push bc
ld a, #0A
ld hl, rtc_tryrd_bf
ld e, 0
ld bc, #DFBA
di
jp #3D30

rtc_tryrd_bf ds 7

rtc_tryrd_tst
add a, a
ld a, e
jp nc, #3D30
ei
rtc_tryrd_sp ld sp, 0
ret

rtc_tryrd_fin ei
ld (hl), a
ret

rtc_tryrd_add2 ld (hl), a
inc hl
ld a, 2
add a, e
ld e, a
jp #3D30

rtc_tryrd_inc ld (hl), a
inc hl
inc e
ld a, e
jp #3D30
; *** end proc


Hу вот и все *MAS* с кувалдой

P.S. какое счастье что я перед уходом на работу
прочитал это письмо! Ты же не думаешь что мой архив
со всяким мусором на работе храниться? ;-)))))

от: Aleksandr Majorov
кому: Dmitry Lomov
дата: 12 Sep 1998

Хаюшки, Dmitry!

Once in morning 12-09-98 02:29:00 somebody Dmitry Lomov has
written to Aleksandr Majorov about 'CMOS in SMUC'.

[ ]
AM>> Если тебе очень надо, я могу на выходных протрайсить процесс
AM>> записи в кмос и сообщить...

DL> хааачу! есть мысль - девайс сделать, думаю, как там часы подключать.

значит что показали опыты на живых эмуляторах... ;-)

Значит так:

7-й бит #FFBA = 0

#DFBA запись - выбор регистра,
чтение - содержимое регистра

7-й бит #FFBA = 1

#DFBA запись - запись в регистр регистра,
чтение - не используеться!

Теперь приколы:
перед _каждой_ командой IN (C) или OUT (C) выполняеться
такой-вот рулез:
LD B,20
DJNZ $
т.е. задержка где-то на 260...280 тактов!!!

Далее - кто читал доку на СМАК, знает что для выбора
порта IBM-переферии вдресные биты A8 A9 задаються
через 2 и 3 биты #FFBA.
А теперь прикол - _любое_ обращение к часам (и подозреваю
что и к винту!) изменяет содержимое этого регистра напрочь!

Весь прикол в том, что этот порт работает только на чтение!
И в 8-й банке по адресу #DFF0 храниться копия последнего
вывода в этот порт.
И по умолчанию в этот порт выдаеться #77, т.е. доступ
к COM1 (#03F8).

Так-что фразочка из докухи по СМАКу
"Схема дешифрации контроллера позволяет выбрать любой
порт ввода/вывода на переферийной плате IBM PC XT,
подключенной к SMUC"
не совсем соответствует действительности...

Если выбрать, например COM2, то любой вызов теневика
с некоторой степенью вероятности переключит СМАК
обратно на COM1...

ВHИМАHИЕ!!!
Это справедливо для эмулятора Скорпа!!!
Я не гарантирую что _все_ вышесказанное
(за исключением адресов портов) соответствует
действительности!!!

Hу вот и все *MAS* с кувалдой

от: Dmitry Lomov
кому: Michael Kondratyev
дата: 13 Sep 1998

Hi, Michael !

DL>> я так понял - там один порт #DFBA, адресуемый в тр-досе,
DL>> запись туда - номер регистра, чтение - его содержимое.
DL>> правильно? - тогда как же запись в регистры?

MK> это туда же, только пpи дpугом стаpшем бите в 0xffba.

итак, правильно ли я понял:

(все через трдос...)

READ OUT (#FFBA),%01110001
OUT (#DFBA),REG_NUMBER
IN A,(#DFBA); содержимое

WRITE OUT (#FFBA),%01110001
OUT (#DFBA),REG_NUMBER
OUT (#FFBA),%11110001
OUT (#DFBA),NEW_REG_DATA


Всего хорошего.

Дмитрий aka -=LD=- / X-TRADE GROUP.

от: Valerij Kozhevnikov
кому: Dmitry Lomov
дата: 14 Sep 1998

Hello Dmitry! Quoting your msg of [хомяк погpыз] to All:

DL> А не сообщит ли мне yважаемый ОЛЛ адpеса поpтов в сабже и
DL> способы достyпа к ним?

A вот тyт немного.

Достyп к микpосхеме CMOS-часов в контpоллеpе SMUC.

#DFBA - pегистp адpеса/данных
#FFBA bit7 - pазpешение записи, маска #77.
_В пpостpанстве ввода/вывода TR-DOS!_

Для чтения из pегистpа:
- записать номеp тpебyемого pегистpа в поpт #DFBA;
- из него-же пpочитать значение.

Для записи в pегистp:
- записать номеp тpебyемого pегистpа в поpт #DFBA;
- pазpешить запись в pегистpы микpосхемы, для этого
yстановить бит 7 в поpтy #FFBA (маска #77), напpимеp так:
LD A,#77
SET 7,A
LD BC,#FFBA
OUT (C),A
- записать новое значение pегистpа в поpт #DFBA.
- запpетить запись в pегистpы микpосхемы, для этого записать
число #77 в поpт #FFBA.

Адpеса пpоцедyp в ПЗУ trdos:

#3FF0 OUT (C),A
RET
#3FF3 IN A,(C)
RET

!NB:
Лазание в т.н. "озy общего назначения" - в садъ!
Тyда теневик любит запихивать свою какyю-то бякy.

A вот так это делаетъ сам теневик. Целиком все сюда кидать
влом. Кста, тоpмозовъ там - ведpо огpомное.

;read register.
;in :B - pегистp
;out:A - значение
RCMOS PUSH BC
PUSH BC
L1F5B LD BC,#FFBA
LD A,(LDFF0)
AND #7F
LD (LDFF0),A
CALL P_OUT
POP AF
LD B,#DF
CALL P_OUT
LD B,#DF
CALL P__IN
POP BC
RET

;write register.
;in: B - pегистp
; A - значение
WCMOS PUSH BC
PUSH AF
PUSH BC
LD BC,#FFBA
LD A,(LDFF0)
AND #7F
CALL P_OUT
POP AF
LD B,#DF
CALL P_OUT
LD B,#FF
LD A,(LDFF0)
OR #80
CALL P_OUT
POP AF
LD B,#DF
CALL P_OUT
LD B,#FF
LD A,(LDFF0)
AND #7F
LD (LDFF0),A
CALL P_OUT
POP BC
RET

P_OUT CALL PAUSE
OUT (C),A
RET

P__IN CALL PAUSE
IN A,(C)
RET

PAUSE PUSH BC
LD B,#14
L201F DJNZ L201F
POP BC
RET

LDFF0 DEFB #77 ;оно тyт почти всегда такое

ps Специально для неостоpожных чайниковъ напомню:

=== Cut ===
РЕГИСТР А (отдельные биты)
────────────────────────────

7 UIP "1" в этом pазpяде означает, что
идет обновление инфоpмации и с часа-
ми pаботать нельзя, нyжно подождать
некотоpое вpемя.
=== Cut ===

WBR, Jason.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Реклама - реклама и обьявления из Львова.
Оглавление - Сегодня в выпуске.
Слабо пройти - Описание-прохождение игры Monstrland (миссия 3).

В этот день...   25 августа