Please soap me
ZXNet echo conference «zxnet.soft»
From Stanislav Yudin → To All 24 August 2002
Greetings, All!
Who has the subject:
1. SMUC clock driver for Lara.
2. Wild, collected under SMUC.
With best wishes, Stanislav Yudin.
From Kirill Frolov → To Stanislav Yudin 25 August 2002
Press RESET immediately, Stanislav!
24 Aug 02 22:24, Stanislav Yudin wrote to All:
SY> 1. SMUC clock driver for Lara.
I think I wrote. Now I see that the code is lame and in general it’s a glitch.
Therefore, here is a piece for SMUC, from the MMD driver:
=== Cut ===
;---------------------------------------
;
;WORKING WITH THE CLOCK AT SMUC
OUT_C PUSH BC
PUSH HL
PUSH AF
LD A,C
LD HL,#2A53
LD BC,#DFBA ; SET REGISTER
CALL JPTRD
LD B,#FF
LD A,(MASK)
OR#80
CALL JPTRD; WRITE ENABLE
LD B,#DF
POP AF
CALL JPTRD; WRITE DATA
LD B,#FF
LD A,#77
MASK EQU $-1
AND #7F
CALL JPTRD; LOCK WRITE CMOS
POP HL
POP B.C.
RET
IN_C PUSH BC
PUSH HL
LD A,C
PUSH AF
LD HL,#2A53
LD BC,#FFBA
LD A,(MASK)
AND #7F
CALL JPTRD
POP AF
LD B,#DF
CALL JPTRD
LD HL,#3FF3
CALL JPTRD
POP HL
POP B.C.
RET
JPTRD PUSH HL
JP #3D2F
BCD_BIN PUSH BC
LD B,A
AND #F0
RRCA
LD C,A
RRCA
RRCA
ADD A,C
LD C,A
LD A,B
AND #0F
ADD A,C
POP B.C.
RET
BIN_BCD PUSH BC
LD BC,#FF0A
INC B
SUB CJR NC,$-2
ADD A,C
LD C,A
LD A,B
RLCA
RLCA
RLCA
RLCA
OR C
POP BC
RET
;***********************************
;УСТАHОВИТЬ ВРЕМЯ
;[H]-[L]-[D]-[B]-[C]-[E]-[A]
;ГГ ММ ДД ЧЧ ММ СС ДЕЬ_ЕДЕЛИ
D_SET_TIME PUSH AF
PUSH BC
LD BC,1000
D_SET1 PUSH BC
LD C,#0A
CALL IN_C
RLCA
POP BC
JR NC,D_SET2
DEC BC
LD A,B
OR C
JR NZ,D_SET1
D_SET2 LD C,#0B
CALL IN_C
AND %01111001
OR %10000110 ; BIN 24 SET MODE
CALL OUT_C
LD C,#0D
CALL IN_C
LD C,#0C
CALL IN_C
LD A,E
; CALL BIN_BCD
LD C,#00
CALL OUT_C
LD A,D
; CALL BIN_BCD
LD C,#07
CALL OUT_C
POP DE
LD A,E
; CALL BIN_BCD
LD C,#02
CALL OUT_C
LD A,D
; CALL BIN_BCD
LD C,#04
CALL OUT_C
LD A,L
; CALL BIN_BCD
LD C,#08
CALL OUT_C
LD A,H
; CALL BIN_BCD
LD C,#09
CALL OUT_C
POP AF
LD C,#06
AND 7
CALL OUT_C
LD C,#0B
CALL IN_C
AND %01111001
OR %00000010
CALL OUT_C
XOR A
RET
;---------------------------
;СЧИТАТЬ ВРЕМЯ
;[H]-[L]-[D]-[B]-[C]-[E]-[A]
;ГГ ММ ДД ЧЧ ММ СС ДЕЬ_ЕДЕЛИ
D_RD_TIME XOR A
LD (ANTIGLUK),A
LD BC,10000
D_RDT1 PUSH BCLD C,#0A
CALL IN_C
RLCA
POP BC
JR NC,D_RDT2
DEC BC
LD A,B
OR C
JR NZ,D_RDT1
SCF
RET
D_RDT2 LD C,#0B
CALL IN_C
AND %00100101
OR %00000110 ; BIN 24
CALL OUT_C
LD C,#08
CALL IN_C
; CALL BCD_BIN
LD L,A
LD C,#09
CALL IN_C
; CALL BCD_BIN
LD H,A
LD C,#02
CALL IN_C
; CALL BCD_BIN
LD E,A
LD C,#04
CALL IN_C
; CALL BCD_BIN
LD D,A
PUSH DE
LD C,#00
CALL IN_C
; CALL BCD_BIN
LD E,A
LD C,#07
CALL IN_C
; CALL BCD_BIN
LD D,A
LD C,#06
CALL IN_C
; CALL BCD_BIN
POP BC
OR A
RET
;---------------------------
;ДОБАВИТЬ К ТАЙМЕРУ [A] ЕДЕHИЦ
D_ADD_ALR PUSH AF
CALL #C036
LD C,A
POP AF
ADD A,C
JP NC,#C030
LD A,255
JP #C030
;---------------------------
;УСТАHОВИТЬ ТАЙМЕР А [A] ЕДЕHИЦ
D_SET_ALR
PUSH AF
LD BC,10000
D_SALRM1 PUSH BC
LD C,#0A
CALL IN_C
RLCA
POP BC
JR NC,D_SALRM2
DEC BC
LD A,B
OR C
JR NZ,D_SALRM1
POP AF
SCF
RET
D_SALRM2
LD C,#02
CALL IN_C
; CALL BCD_BIN
LD L,A ;МИ
POP AF
LD C,A
LD B,0LD H,B
ADD HL,BC
LD C,#04
CALL IN_C ;ЧАСЫ
; CALL BCD_BIN
LD BC,60
STT OR A
SBC HL,BC
JR C,STT1
INC A
JR STT
STT1 ADD HL,BC
LD H,A
LD (DTFREE),HL
LD C,#07
CALL IN_C ;ДЕЬ
; CALL BCD_BIN
LD (TDAY),A
LD A,1
LD (FLAG),A
RET
;*************************************
;ЕСЛИ ВРЕМЯ ИСТЕКЛО, CY=1
;[A] - СКОЛЬКО ЕДИHИЦ ОСТАЛОСЬ
LD BC,10000
D_RD_ALR PUSH BC
LD C,#0A
CALL IN_C
RLCA
POP BC
JR NC,D_RD_ALR1
DEC BC
LD A,B
OR C
JR NZ,D_RD_ALR
RET
D_RD_ALR1
FLAG EQU $+1
LD A,0
OR A
SCF
RET Z
LD C,#07
CALL IN_C ;ДЕЬ
; CALL BCD_BIN
TDAY EQU $+1
CP 0
LD D,0
JR Z,$+4
LD D,24
LD C,#02
CALL IN_C ;МИ
; CALL BCD_BIN
LD E,A
LD C,#04
CALL IN_C ;ЧАСЫ
; CALL BCD_BIN
ADD A,D
LD D,A
DTFREE EQU $+1
LD HL,0
LD A,L
CP E
JR NC,WFREE1
ADD A,60
DEC H
WFREE1 SUB E
LD E,A
LD A,H
SUB D
LD D,A
JR C,NO_TIME
LD B,60
XOR A
WFT1 ADD A,D
JR C,WFTER
DJNZ WFT1
ADD A,E
JR NC,WFT2
WFTER LD A,255
WFT2 OR A
RET NZ
NO_TIME XOR A
LD (FLAG),A
SCF
D_RET RET; А ЭТО СИСТЕМА "АHТИГЛЮК", ТО ЕСТЬ
; WATCH-DOG ТАЙМЕР -- СБРАСЫВАЕТ ПРИ ЗАВИСАHИИ
ANTIGLUK RET
ANTIGL0 LD C,#0A
CALL IN_C
RLCA
JR C,ANTIGL0
LD C,#02
CALL IN_C
LD E,A
LD C,#04
CALL IN_C
LD D,A
LD A,3
ADD A,E
; DAA
LD E,A
CP 60
JR C,ANTIGL1
SUB 60
; DAA
LD E,A
LD A,D
ADD A,1
; DAA
LD D,A
CP 24
JR C,ANTIGL1
SUB 24
; DAA
LD D,A
ANTIGL1 LD A,#FF
LD C,#01
CALL OUT_C
LD A,E
LD C,#03
CALL OUT_C
LD A,D
LD C,#05
CALL OUT_C
LD C,#0B
CALL IN_C
AND %00100101
OR %00100110 ; BIN 24 ALARM
JP OUT_C
ANTIGLUK_OFF LD C,#0B
CALL IN_C
AND %00000101
OR %00000110
CALL OUT_C
LD C,#0C
CALL IN_C
LD C,#D
JP IN_C
=== Cut ===
Драйвер для глюка:
=== Cut ===
;Hачиная с версии 3.8 есть поддержка драйвера для Cmos часов.
;Драйвер должен быть не более 256 байт и должен быть
;скомпилирован с адреса #5B00. У драйвера есть три точки входа:
;#5B00 - инициализация часов + загрузка времени в буфер,
; адресованный регуистровой парой HL
;#5B02 - запись времени из буфера (HL) в часы. Эта процедура
; вызывается только после выхода по ENTER'у из меню; time editing
;#5B04 - This procedure is called every interrupt. She should
; update time in buffer at HL address. and exit
; the procedure must set the NC flag in order to
; time redraw occurred (C - do not redraw for
; this interrupt). If #C9 is located at this address, then
; The native time processing procedure will be called.
;Time buffer format (HL):
;year, month, date, hour, minute, second
;and each field is allocated two bytes.
;The year must be real (1999,2000, etc., not 98.99)
;Month must be from 1 to 12
;The number must be from 1 to 31 (30,29,28)
;The driver must be on the disk from which the editor is loaded and
;must have the name CmosDrv.C
; make "CmosDrv",#5b00
jr cmos2buf
jr buf2cmos
ld d,#0c
call read
and %00010000
scf
ret z
cmos2buf call wrdy
ld d,#09 ; year
call readl
ld e,#6c ; 1900=#076c
cp 99; 2000=#07d0
jr nc,year1
ld e,#d0
year1 add a,e
ld(hl),a
inc hl
ld a,#07
adc a,0
ld(hl),a
inc hl
ld e,0
dec d ; month
call readhl
dec d ; day
call readhl
ldd,4; hour
call readhl
ld d,2 ; min call readhl
ld d,e ; sec
call readhl
xor a
ret
readhl call readl
ld (hl),a
inc hl
ld (hl),e
inc hl
ret
readl call read
read_o nop ; bcd->bin ?
ld b,a
and #f0
rrca
ld c,a
rrca
rrca
add a,c
ld c,a
ld a,b
and #0f
add a,c
ret
buf2cmos call wrdy
ld d,#0b
call read
or #80
call write ; stop time
ld e,(hl)
inc hl
ld d,(hl)
inc hl
ex de,hl
ld bc,100
or a
year2 sbc hl,bc
jr nc,year2
add hl,bc
ex de,hl
ld d,#09
ld a,e
call writel ; year
dec d
call writehl ; month
dec d
call writehl ; day
ld d,#04
call writehl ; hour
ld d,#02
call writehl ; min
ld d,0
call writehl ; sec
ld d,#0b
call read
and #7f
call write ; start time
xor a
ret
writehl ld a,(hl)
inc hl
inc hl
writel call bin2bcd
write ld bc,#dff7
out (c),d
ld b,#bf
out (c),a
ret
bin2bcd nop ; lock
write_o equ $-1
ld b,10
ld c,#ff
div10 sub b
inc c
jr nc,div10
add a,b
ld b,a
ld a,c
add a,a
add a,a
add a,a
add a,a
or b
ret
read ld bc,#dff7
out (c),d
ld b,#bf
in a,(c)
ret
wrdy ld d,#0a
wrdy1 call read
rla
jr c,wrdy1
inc d
call read
and %00000100
jr z,wrdy2
ld a,#c9
wrdy2 ld (read_o),a
ld(write_o),a
ret
=== Cut ===
SY> 2. Wild, collected under SMUC.
This doesn't happen. The thing is, Dickie is always used alone,
but different versions of DosX are installed for different equipment. You need DosX
under SMUC.
You probably have a computer (IBM-PC) - you can take the source code
and rebuild yourself whichever version you want. For assembly you need MOA-shoes
ma80 assembler and mlink linker. Say e-soap - I’ll wash out the raw materials and assembler.
Only my version may be outdated, 1.0, like, 1999.
From Valerij Kozhevnikoff → To Stanislav Yudin 27 August 2002
Здравствуй, Stanislav!
24 Авг 02 22:24, Stanislav Yudin -> All:
SY> 1. Драйвер часов SMUC для Лары.
Этот через RST 8, ибо давно написан. Hо работает.
section 1 of file cmosdrv.$c < uuencoded by Necromancer's Dos Navigator >
begin 644 cmosdrv.$c
M0VUONO(R-&(R-.(R/E%J#/B3C;X