я так понял, что вся работа с часами идет через драйвер timer2.drv. он находится в USER15.
- - - Добавлено - - -
а в описании наоборот... :( https://zx-pk.ru/threads/609-zx_mult...l=1#post985757
надо будет исправить, если всё подтвердится.
Вид для печати
я так понял, что вся работа с часами идет через драйвер timer2.drv. он находится в USER15.
- - - Добавлено - - -
а в описании наоборот... :( https://zx-pk.ru/threads/609-zx_mult...l=1#post985757
надо будет исправить, если всё подтвердится.
Это не поможет?
Код:IF1
.PRINTX . .
.PRINTX . T i m e Utilities ; Micco Software (c) 1992.
.PRINTX . .
.PRINTX . Познянский Михаил Борисович tel: 365-09-83 .
ENDIF
.8080
DRCOMP SET 1
.Z80
;==============================================
; В этой программе устанавливается и выводится
; ТЕКУЩЕЕ ВРЕМЯ !!! Special version for CONCURENT
;============================================== BIOS
INCLUDE BIOS.H ;
INCLUDE DSPK.H ;
INCLUDE DRIVER.H ;
INCLUDE DEVICE.H ;
main: di
ld bc,0a00h+27h
call writreg
ld b,0ah
call readreg
res 7,a
cp 27h
EI
jp z,mnn1
XOR A
LD (NOTIMER),A
LD C,9
LD DE,NTTSTR
CALL 5
mnn1:
ld a,(82h)
cp 48
jp C,pech
cp 58
jp NC,pech
ld bc,9
ld hl,82h
ld de,string
ldir
ld hl,string
ld b,(hl)
inc hl
ld c,(hl)
call rdstr
cp 3
jp z,pech
ld a,b
cp 24
jp NC,pech
ld (hour),a
inc hl
ld b,(hl)
inc hl
ld c,(hl)
call rdstr
cp 3
jp z,pech
ld a,b
cp 60
jp NC,pech
ld (min),a
inc hl
ld b,(hl)
inc hl
ld c,(hl)
call rdstr
cp 3
jp nz,sss1
ld b,0
sss1: ld a,b
cp 60
jp NC,pech
ld (sec),a
;===== анализ ком. строки закончен.Теперь уст. времени
;ЗДЕСЬ ЗАПИСЬ В ЯЧЕЙКИ BIOS ВРЕМЕНИ
LD C,TIME
CALL GETADR
INC HL
LD DE,SEC
LD A,(DE)
LD (HL),A
INC HL
DEC DE
LD A,(DE)
LD (HL),A
INC HL
DEC DE
LD A,(DE)
LD (HL),A
LD A,(NOTIMER)
AND A
JP Z,PECH
ld hl,hour
ld b,(hl)
inc hl
ld c,(hl)
inc hl
ld d,(hl)
call settim
pech: LD A,(NOTIMER)
AND A
JP Z,PPP1
di
ld b,0dh
call readreg
ei
bit 7,a
jp nz,ppp1
ld de,sboi
ld c,9
call 5
ppp1:
;ЗДЕСЬ ЧТЕНИЕ ИЗ ЯЧЕЕК BIOS ВРЕМЕНИ
LD C,TIME
CALL GETADR
INC HL
LD DE,SEC
LD A,(HL)
LD (DE),A
INC HL
DEC DE
LD A,(HL)
LD (DE),A
INC HL
DEC DE
LD A,(HL)
LD (DE),A
ld c,9
ld de,str1
call 5
ld a,(hour)
call calc
ld e,':'
ld c,2
call 5
ld a,(min)
call calc
ld e,':'
ld c,2
call 5
ld a,(sec)
call calc
;=============ALARM
JP END
di
ld b,0bh
call readreg
bit 5,a
ei
jp z,aloff
ld de,str3
ld c,9
call 5
ld a,(bhour)
call calc
ld e,':'
ld c,2
call 5
ld a,(bmin)
call calc
ld e,':'
ld c,2
call 5
ld a,(bsec)
call calc
jp end
aloff: ld c,9
ld de,str4
call 5
end: ld c,9
ld de,str2
call 5
jp 0
;==========================
; УСТАНОВКА ВРЕМЕНИ
;ПАРАМЕТРЫ:
; b - часы
; c - минуты
; d - секунды
;==========================
settim:di
push de
push bc
ld bc,0a00h+27h
call writreg
ld bc,0b00h+80h+2h+4h+8h
call writreg
pop bc
ld a,b
push bc
ld b,4
ld c,a
call writreg
pop bc
ld b,2
call writreg
pop de
ld b,0
ld c,d
call writreg
ld b,0bh
call readreg
and 127
ld c,a
ld b,0bh
call writreg
ld b,0dh
call readreg
ei
ret
;==================
rdstr: ld a,c
cp 48
jp m,rds1
cp 58
jp p,rds1
inc hl
sub 48
ld e,a
ld a,b
cp 48
jp m,rds2
cp 58
jp p,rds2
cp 48
jp z,rds3
sub 48
ld b,a
XOR A
rds4: add a,10
djnz rds4
add a,e
ld e,a
rds3: ld b,e
XOR A
ret
rds1: ld a,b
cp 48
jp m,rds2
cp 58
jp p,rds2
sub 48
ld b,a
XOR A
ret
rds2: ld a,3
ld b,0
ret
;==================
CALC:
OUTDEC:
OR A
JR Z,OD0
LD B,A
XOR A
OD1:INC A
DAA
DJNZ OD1
OD0:LD B,A
RRCA
RRCA
RRCA
RRCA
AND 00001111B
JR NZ,OD2
xor a
OD2:CALL OUTFIG
LD A,B
AND 00001111B
OUTFIG:
ADD A,'0'
LD C,A
PUSH BC
.OUTCHAR
POP BC
RET
;==================
readtime: di
ld b,0ah
call readreg
rla
jp c,readtime
ld b,0
call readreg
ld (sec),a
ld b,1
call readreg
ld (bsec),a
ld b,2
call readreg
ld (min),a
ld b,3
call readreg
ld (bmin),a
ld b,4
call readreg
ld (hour),a
ld b,5
call readreg
ld (bhour),a
ei
ret
;==================
writreg: ld d,b
ld e,c
ld bc,0ffffh
out (c),d
ld bc,0ffefh
out (c),e
ret
;================
readreg: ld d,b
ld bc,0ffffh
out (c),d
ld bc,0ffefh
in a,(c)
ret
;==================
hour: db 0
min: db 0
sec: db 0
bhour: db 0
bmin: db 0
bsec: db 0
NOTIMER: DB 1
NTTSTR: DB 0DH,0AH,1BH,']'
DB ' Плата таймера отсутствует !!!'
DB 0DH,0AH,24H
str1: db 0dh,0ah,1BH,']'
db ' Текущее время: '
db 24h
str3: db 0dh,0ah,0ah
db ' Будильник : '
db 24h
str4: db 0dh,0ah,0ah
db ' Будильник выключен !!!'
db 24h
str2: db 0dh,0ah,0ah
db ' Micco Software (c) Oct-1992'
db 0dh,0ah,24h
sboi: db 0dh,0ah,1BH,']'
db ' Информация в таймере не достоверна!!!'
db 0dh,0ah,24h
string: ds 9
;========================================================
end
Код:;╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞╞
;²²²² Отображение времени ²²²²
;╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛╛
INCLUDE DEVICE.H ;
INCLUDE DRIVER.H ;
INCLUDE BIOS.H ;
INCLUDE DSPK.H ;
INCLUDE CHARS.H ;
DRCOMP EQU 0
OUTCHAR MACRO CHR
PUSH DE
.OUTCHAR CHR
POP DE
ENDM
ASEG
ORG 100H
.Z80
.PHASE DRVEXEC
;²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²
LD HL,DRV
LD C,INTRSEC
CALL DRVINSTALL
RET
INCLUDE DRIVER.INC
DRV: .DEPHASE
;²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²
.PHASE TIMLOC
JP IR0
JP IR0
JP IR0
DB 10,12
DW TIMLOC,LSTCMRS
DB 2
IR0:
.SAVEDSP BUFFER
LD C,TIME
CALL GETADR
INC HL
INC HL
INC HL
EX DE,HL
CALL PRINT
DB ESC,'Y',20H,20H+55 ; position
DB ESC,'l' ; color off
DB ESC,']' ; koi8
DB ESC,'d',2
DB ' ',EOT
CALL OUTDEC ; hour
OUTCHAR ':'
CALL OUTDEC ; min
OUTCHAR ':'
CALL OUTDEC ; sec
.LOADDSP BUFFER
RET
OUTDEC:
LD A,(DE)
DEC DE
OR A
JR Z,OD0
LD B,A
XOR A
OD1:
INC A
DAA
DJNZ OD1
OD0:
LD B,A
RRCA
RRCA
RRCA
RRCA
AND 00001111B
JR NZ,OD2
XOR A
OD2:
CALL OUTFIG
LD A,B
AND 00001111B
OUTFIG:
ADD A,'0'
LD C,A
PUSH BC
OUTCHAR
POP BC
RET
BUFFER:
;²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²
.DEPHASE
END
Немного оффтопа:
http://jpegshare.net/images/5c/84/5c...873275ab8c.png
Что за микросхемачасовреального времени?
Да поможет, но и в конец запутает.
Согласно этой информации адреса портов:
Регистр адреса RTC = 0xFFFF (не 0xFF)
Регистр данных RTC = 0xFFEF (не 0xDF)
Желательно бы еще и исходник драйвера RTC.
Часы же работают, значит в нем адресация верная, а вот в программе TESTIMER.COM адреса не такие, поэтому она и не работает.
Надо бы раз и навсегда выяснить где правильная информация.
Лучше всего это сделать по реальной, рабочей схеме подключения RTC.
Адреса портов, как и указано в доках
TREG equ 0BFh
TDAT equ 0DFh
т.е. порт данных DF, порт выбора регистра BF. Проверено на реале 100500 раз. На старые системы для Профи не ориентируйтесь. Часы там бесполезны (нахрена они вообще добавляли часы если кроме как в утилите которая показывала время они нигде более не использовались). В PQDOS часы нужны, они поддержаны на уровне ROM-BIOS и драйвера, а так же ДОС. Файлы получают дату время при модификации.
старший байт адреса порта не важен! xxBF xxDF
Дешифратор зашит в ППЗУ 556РТ4 так просто по схеме не разобраться, в режиме SINCLAR RTC доступен по портам:
"AS" номер регистра /w BF
"DS" данные (bas=0) DF
http://gifok.net/images/2018/11/14/2...6-00-12.md.png
Обращение к ВГ93 Beta Disk Interface по стандартным портам , при установке бита D5=1 порта #DFFD (сигнал CP/M Режим PROFI ) отключает ПЗУ TRDOS и включает порты BDI на доступ из ОЗУ и ещё при установке бита D4=1 порта #7FFD ( сигнал ROM14=1) модифицирует доступ к расширенной периферии порты BDI и другая периферия работает по новым портам.
Чтобы исключить конфликт RTC и BDI по порту системный регистр (RQ93) в режиме CP/M RTC доступен по другим портам:
"AS" номер регистра /w FF
"DS" данные (bas=0) 9F
P.S.
Постоянна у меня путаница с портами RTC , в документе режиме SINCLAR оправлю :v2_dizzy_botan:
Конечно, я уже давал его раза 2, но ещё раз дам.
;──────────────── ──────────────── ───────
;──────────────── ──────────────── ───────
; RTC Physical functions
;──────────────── ──────────────── ───────
;──────────────── ──────────────── ───────
RTCReg equ 0BFh
RTCDat equ 0DFh
RTCinit:
call RTC_timer ;ожидаем доступ к RTC
; ret c ;микросхема 512ВИ1 отсутствует
ld bc,0A27h
call Wr.RTC ;r.0A=27h
;Далее проверяем, нарушалось ли питание микросхемы.
;Т.е. корректны ли дата/время?
xor a ;read seconds
call Rd.RTC
cp 60 ;sec>=60? (0..59 vaild)
jr nc,POWbad;yes! time invalid!
ld a,2 ;r.minutes
call Rd.RTC
cp 60
jr nc,POWbad
ld a,4
call Rd.RTC
cp 24
jr nc,POWbad
ld a,7
call Rd.RTC
cp 32
jr nc,POWbad
ld a,8 ;месяц
call Rd.RTC
cp 13 ;CF=1 if ok
ccf
ld a,0 ;питание не нарушалось, дата/время корректны
ret nc
POWbad: ld hl,TimeShabl
pbad: ld b,(hl)
ld a,b
cp 0FFh ;if A=FF then C=0 (nc)
ret z ;Нарушалось питание
inc hl
ld c,(hl)
inc hl
call Wr.RTC
jr Pbad
Rd.RTC: out (RTCreg),a
in a,(RTCdat)
ret
GetByteFromCMOS:
call RTC_timer
ret c
ld a,e
jr Rd.RTC
SetByteToCMOS:
ld d,a ;data for write
call RTC_timer
ld b,e
ld c,d
Wr.RTC: ld a,b
out (RTCreg),a
ld a,c
out (RTCdat),a
Ret
RTC_timer:
call Clr_Ticks ;A=0, NC
ld bc,RTCdat
ei
tb1: ld a,0Ah
call Rd.RTC ;
or a
ret p ;Выход, если часы доступны
ld a,(Ticks)
cp 3 ;Будем ждять снятия busy максимум
jr c,tb1 ;60 ms, после этого времени выход
ld a,0ffh
scf ;с флагом ошибки.
pop bc
ret
ForDate:
ld a,9
jr Fortime+2
ForTime:
ld a,4
out (RTCReg),a
ld c,RTCDat
ret
;════════════════ ════════════════ ═
;Выход:
;d=месяц (1-12)
;l=год (0-99) xx12
;h=год (0-99) 20xx
;════════════════ ════════════════ ═
getdate:
call RTC_timer
call ForDate
in l,(c)
dec a ;a=8
out (RTCReg),a
in d,(c)
dec a ;a=7
out (RTCReg),a
in e,(c)
ld a,21h
out (RTCReg),a
in h,(c)
xor a
ret
;════════════════ ════════════════ ═
;Вход:
;d=месяц (1-12)
;l=год (0-99) xx12
;h=год (0-99) 20xx
;════════════════ ════════════════ ═
Setdate:call RTC_timer
call ForDate ;a=9 - year:00-99
out (c),l
dec a ;8-месяц
out (RTCReg),a
out (c),d
dec a ;7-day
out (RTCReg),a
out (c),e
ld a,30h ;30h - century
out (RTCReg),a
out (c),h
ret
;════════════════ ════════════════ ═
;Вход:
;h=час (0-23)
;l=минута (0-59)
;d=секунда (0-59)
;════════════════ ════════════════ ═
gettime:
call RTC_timer
call ForTime ;Подготовили регистры
in h,(c) ;hour
ld a,2
out (RTCReg),a
in l,(c) ;minutes
xor a
out (RTCReg),a
in d,(c) ;secundes
ret
;════════════════ ════════════════ ═
;Выход:
;h=час (0-23)
;l=минута (0-59)
;d=секунда (0-59)
;════════════════ ════════════════ ═
SetTime:
call RTC_timer ;bc=rtcdat
ld a,0Ah
out (RTCreg),a
ld e,27h
out (c),e
inc a ;0B
out (RTCreg),a
ld e,6+128
out (c),e
call ForTime ;4
out (c),h ;hour
ld a,2
out (RTCReg),a
out (c),l ;minutes
xor a
out (RTCReg),a
out (c),d ;secundes
ld a,0Bh
out (RTCreg),a
ld a,00000110b
out (c),a
ret
;════════════════ ════════════════ ═
;Вход:
;h=час (0-23)
;l=минута (0-59)
;d=секунда (0-59)
;════════════════ ════════════════ ═
Setalarm:
call RTC_timer
ld b,5
ld c,h
call Wr.RTC
ld b,3
ld c,l
call Wr.RTC
ld b,1
ld c,d
call Wr.RTC
ld a,0Bh
out (RTCReg),a
in e,(c)
set 3,e ;разреш.прямоуг.импульсы
set 5,e ;разреш.прерывание по ALARM
out (c),e
xor a
ret
GetAlarm:
ret
ResAlarm:
call RTC_timer
ld a,0Bh
call Rd.RTC
and 11010111b
out (RTCDat),a
ret
RdCMOSdump:
ld e,0Eh
rdcm1: push hl
push de
call GetByteFromCMOS
jr c,rdcm2
ld (hl),a
pop de
inc e
pop hl
inc hl
bit 6,e ;=64?
jr z,rdcm1
ret
rdcm2: pop de
pop hl
ret
WrCMOSdump:
ld e,0Eh ;начальная ячейка
wrcm1: push hl
push de
ld a,(hl)
call SetByteToCMOS
pop de
inc e
pop hl
inc hl
bit 6,e ;=64?
jr z,wrcm1
ret
;================================================= ===========