; 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

