; CB80 CBTOD routine, fixed for seconds and for CP/M plus
;
; The original CBTOD routine in CB80 version 2.0 has a number of
; bugs:
; 1. BDOS function 155 is used instead of 105. 155 does not exist.
; 2. The routine, after changing to BDOS call 105, will only work
; with MP/M, not with CP/M plus.
; 3. the TIME$ function returns HHMM00 instead of HHMMSS.
;
; This file CBTOD.ASM fixes all of the above problems. It has not been
; officially blessed by DRI and application of this file to your copy
; of CB80 is at your own risk!
;
; HOW TO:
; 1. Use RMAC or M80 to assemble CBTOD.ASM into CBTOD.REL
; 2. rename your existing CB80.IRL library to something different,
; such as OLIB.IRL (preserve the .IRL type)
; 3. Use LIB as follows: LIB CB80[I]=OLIB.IRL<CBTOD>
; 4. Enjoy the DATE$ and TIME$ functions in CP/M plus.
;
; NOTE NOTE NOTE
; TO STRESS AGAIN, THIS CODE HAS NOT BEEN AUTHORIZED BY DRI AND WILL
; WORK WITH CB80 VERSION 2.0 ONLY!!!
;
; The original code below has been reconstructed with LIB.COM
;
public ?time,?date
extrn ?gets
;
?time: call p0093
lxi b,3003h
mvi d,0fh
lxi h,d0002
p000b: mov a,m
xthl
mov e,a
rrc
rrc
rrc
rrc
ana d
ora b
mov m,a
inx h
mov a,e
ana d
ora b
mov m,a
inx h
xthl
inx h
dcr c
jnz p000b
pop h
pop h
ret
;
?date: call p0093
mvi a,44h
push psw
mvi h,4dh
push h
p002d: pop d
pop psw
rrc
push psw
mvi a,1ch
aci 0
sta p0087+1
inr d
push d
mvi c,0ch
lxi d,p0087
lhld d0000
p0042: xchg
mov a,e
sub m
mov e,a
mov a,d
sbi 0
jm p005d
mov d,a
ora e
jz p005d
inx h
xchg
shld d0000
dcr c
jnz p0042
jmp p002d
;
p005d: pop d
pop psw
pop h
lda d0000
push psw
mvi a,13
sub c
push psw
push d
mvi b,10
mvi c,3
p006d: pop psw
mvi d,-1
p0070: sub b
inr d
jnc p0070
add b
mov e,a
mov a,d
ori '0'
mov m,a
inx h
mov a,e
ori '0'
mov m,a
inx h
dcr c
jnz p006d
pop h
ret
;
p0087: db 1fh
ds 1
;
db 1fh,1eh,1fh,1eh,1fh
db 1fh,1eh,1fh,1eh,1fh
;
p0093: lxi h,8
call ?gets
pop d
push h
mvi m,80h
inx h
mvi m,6
inx h
push h
push d
mvi c,12
call 5
mov a,h
ani 5
jnz dotim
mov a,l
cpi 30h ;cp/m plus?
jc p00b6 ;no, skip
dotim: mvi c,69h ;mp/m time/date call
lxi d,d0000
call 5
sta d0004
ret
;
p00b6: pop psw
pop d
mvi c,6
mvi a,' ' ;filler for no time call
p00bc: stax d
inx d
dcr c
jnz p00bc
pop h
ret
;
dseg
;
d0000: ds 2
d0002: ds 1
d0003: ds 1
d0004: ds 1
end
ov a,e
sub m
mov e,a
mov a,d
sbi 0
jm p005d
mov d,a
ora e
jz p005d
inx h
xchg
shld d0000
dcr c