CMOS (RE: Lara Croft 1.5)

ZXNet echo conference «real.speccy»

From Aleksandr Majorov To All 14 August 1998

11-08-98 17:54:57 Tim Kelly ==> Roman Milukov

Hi, Tim!
[ ]

TK> Дайте стандарт *MAS* в эху или мне, плс. А-то тут чел хорошую штуку
сделал,
TK> можно дополнить. Hо к этой эхе штука отношения не имеет.

ща кину, только в самом деле - лучше внешний драйвер...
Hапример я свои часы держу в BIN'е, это удобнее для всякого
рода автоматики, а вы похоже в BCD-шнике...

А еще имеются часы в СМАКе...
;-)))

Вобщем вот дока по "моим" часам:

...адреса портов CMOS-часов будут распологаться
в TR-DOS области.

Выбор регистра #D8
Чтение из регистра #58
Запись в регистр #58

==============================================
!!! хотя лучше
Выбор регистра #F9
Чтение из регистра #79
Запись в регистр #79

я щас юзаю эти, на всякий случай, малоли что ;-)
==============================================

При испольновании Скорпиона для запи-
си/чтения данных можно использовать п/п
TR-DOS:

#3FF0 - OUT (C),A
RET

#3FF3 - IN A,(C)
RET


Hа компьютерах, у которых в ПЗУ TR-DOS
нет подобных команд рекомендуется следую-
щая программа:

;запись данных в регистр
;in:
;[C] - номер регистра CMOS-часов
;[B] - записываемое значение
WRREG LD A,C
CALL SETREG
LD A,B
LD C,#58
JR OUTPAR


;чтение данных из регистра
;in
;[C] - номер регистра CMOS-часов

;out:
;[A] - считаное из регистра значение
RDREG LD A,C
CALL SETREG
LD A,#D8
LD C,#1F
CALL OUTPAR
LD C,#58
LD IX,#3EF3
CALL JPTR
LD A,H
RET

SETREG LD C,#D8
OUTPAR LD IX,#2A53
JPTR PUSH IX
JP #3D2F
-------------------------------------------------

А вот по скорпу со смаком

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 лаконично замечено, что данные можно вернуть
в буфер ( в формате ASCII.) 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* с кувалдой