;
; ARKDATE - support for Time and Date stamping
;
; 11/28/88 BEM -- changed to overlay structure
;
; Patch your time routine entry into the jump at TDate_ (for systems without
; individual file stamping) or at FDate (for systems that DO have date stamps
; on each file).  Your routine should call CDate_ to convert the date to the
; ARK format.  The TDate_ call is made immediately after printing the signon
; message, and may include a message indicating what date-stamping routine is
; used.  You may call the Puts function to output a null-terminated message 
; addressed by HL.  Note that Puts will convert a LF (ASCII 0Ah) to a CR-LF
; sequence.

yr	DB	88						     ; [103h]
mo	DB 	11						     ; [104h]
iday	DB	27						     ; [105h]
hour	db	16						     ; [106h]
min	db	0						     ; [107h]

	public TDate_, FDate_
TDate_:	JMP TDOSDate	; Today's-Date (called at init-time)           [108h]
FDate_:	db 0C9h,00,00	; File-Date (called immediately after F_OPEN)  [10Bh]
CDate_: JMP get_date 	; convert and save date                        [10Eh]
Puts:	JMP puts	; print the null-terminated string at HL       [111h]

; Start of user-supplied date routine                                  [114h]

;  Get Z80-DOS date, convert to YYMMDDHHMM and save at 0103h
;   DO NOT CHANGE IX,IY, or BC.  Any and all other registers can be
;   destroyed.
TDOSDate:
	db	0ddh, 0e5h	; push	ix
	db	0fdh, 0e5h	; push	iy
	push	b
	lxi	h,TDOSMsg
	call	Puts
	xra	a
	sta	osflag
	mvi	c,105		; DOS+ GET DATE ROUTINE
	lxi	d,mo		;  BUFFER AREA
	call	5
	mov	a,h
	ora	l		; return == 0??
	jz	jtoc4
	sta	osflag
	lhld	mo		;GET THE JULIAN DATE
	lxi	d,06F0DH	; ADJUST FM DIGITAL RESEARCH 
	dad	d		; FORMAT TO ALGORITHM
	lxi	d,4		;4*JDATE +3
	call	mulww		; DE*HL TO (DE,HL) 
	lxi	b,3
	dad	b
	jnc	jtoc1
	inx	d
jtoc1:		
	lxi	b,1461		;y = (4*JDATE+3)/1461
	call	divlw		; (DE,HL)/BC TO DE(Q) AND HL(R)
	push 	d		;SAVE y, HL HAS d (REMAINDER)
	lxi	b,4		;d = d/4 +1
	lxi	d,0
	call	divlw
	inx	d
	lxi	h,5		;5 * d - 3
	call	mulww		; DE*HL TO (DE,HL)
	lxi	b,3
	ora	a
	db	0EDh,042h	; SBC	HL,BC
	jnc	jtoc2
	dcx	d
jtoc2:		
	lxi	b,153	 	;m = (5*d - 3)/153
	call	divlw
	push	d		;SAVE m, HL HAS d (REMAINDER)        
	lxi	b,5		;DAY = d/5 + 1
	lxi	d,0
	call	divlw
	inx	d
	mov	a,e
	sta	iday
	pop	h		;m
	pop	d		;y
	mov	a,l		;MONTH = m + 3
	adi	3
	cpi	12+1		;IF MONTH > 12
	jc	jtoc3
	sui	12		;  MONTH = MONTH - 12
	inx	d		;  y = y + 1
jtoc3:
	sta	mo
	mov	a,e
	sta	yr
jtoc4:	ora	a
	call	CDate_		; make it readable to ARK
	pop	b
	db	0fdh, 0e1h	; pop	iy
	db	0ddh, 0e1h	; pop	ix
	ret

mulww:		; 16 * 16 MULTIPLICATON    DE*HL TO (DE,HL) 
	mov	b,h
	mov	c,l
	lxi	h,0	
	mvi	a,10H
mulw1:		
	dad	h
	xchg
	db	0EDh,06Ah		; ADC	HL,HL
	xchg
	jnc	mulw2	
	dad	b
	jnc	mulw2	
	inx	d
mulw2:		
	dcr	a
	jnz	mulw1	
	ret

divlw:		; 32-BIT DIVIDE   (DE,HL)/BC TO DE(Q) AND HL(R)
	xchg
	mvi	a,10H
divl1:
	xchg
	dad	h
	xchg	
	db	0EDh,06Ah		; ADC	HL,HL
	db	0EDh,042h		; SBC	HL,BC
	jnc	divl3	
	dad	b
divl2:
	dcr	a
	jnz	divl1	
	ret
divl3:
	inx	d
	jmp	divl2	
;
;
osflag:	db	0

TDOSMsg	db	'Turbo-DOS version',10,0

	ds	200h
get_date:
;   PUT DATE IN ARC FORMAT (YYYYYYYM MMMDDDDD)
	lda	mo
	mov	L,A
	lda	yr
	sui	80
	db	0CBh, 025h		; SLA	L
	db	0CBh, 025h		; SLA	L
	db	0CBh, 025h		; SLA	L
	db	0CBh, 025h		; SLA	L
	db	0CBh, 025h		; SLA	L
	RAL				; RLA
	mov	h,a
	lda	iday
	ani	01Fh
	ora	l
	mov	l,a
	shld	arcdate_		; SAVE IN ARK.COM
;   PUT TIME IN ARC FORMAT (HHHHHMMM MMMSSSSS)  IGNORING SECONDS
	lxi	h,hour
	lda	osflag
	ora	a
	jnz	get_d0			; if OS supports TOD, Jmp
	mov	d,m			; else get hour...
	inx	h
	mov	e,m
	jmp	get_d1
get_d0:	xra	a
	db	0EDh,06fh		; RLD	  : A = 1, (HL) = 80
	mov	d,a
	db	0CBh,027h		; SLA	A : A = 2
	db	0CBh,027h		; SLA	A : A = 4
	add	d				  ; A = 5
	db	0CBh,027h		; SLA	A : A = A
	mov	d,a				  ; D =0ah
	xra	a
        db	0EDh,067h		; RRD     : A = 0, (HL) = 08
	mov	a,m				  
	add	d				  ; A = 12
	mov	d,a
	inx	h			; OOOPS!!! -- replaced for ARK 0.33
	xra	a
	db	0EDh,06fh		; RLD	
	mov	e,a
	db	0CBh,027h		; SLA	A
	db	0CBh,027h		; SLA	A
	add	e
	db	0CBh,027h		; SLA	A
	mov	e,a
	xra	a
	db	0EDh,067h		; RRD
	mov	a,m
	add	e
	mov	e,a
get_d1:	db	0CBh,023h		; SLA	E
	db	0CBh,023h		; SLA	E
	db	0CBh,023h		; SLA	E
	db	0CBh,012h		; RL	D
	db	0CBh,023h		; SLA	E
	db	0CBh,012h		; RL	D
	db	0CBh,023h		; SLA	E
	db	0CBh,012h		; RL	D
;   SAVE IN ARK.COM
	xchg
	shld	arctime_
	ret


	extrn	arcdate_, arctime_, puts
	end
