
* Maxon C++ Library:
* Modul "tmtime"
* Jens Gelhar 07.01.93

	xdef	_gmtime,gmtime__PCUi
	xdef	_localtime,localtime__PCUi

_gmtime:
_localtime:
gmtime__PCUi:
localtime__PCUi:
	movem.l d0-d3/a0,-(a7)
	move.l 5*4+4(a7),a0
	move.l (a0),d0
	lea timebuffer(pc),a0
	move.l #$1FFFF,d1
	and.l d0,d1
	divu #60,d1
	swap d1
	clr.w (a0)
	move.w d1,2(a0)         ; tm_sec
	clr.w d1
	swap d1                 ; Minuten
	divu #60,d1
	clr.l 8(a0)
	move.w d1,8+2(a0)       ; tm_hour
	clr.w d1
	swap d1
	move.l d1,4(a0)         ; tm_min
	moveq #17,d1
	lsr.l d1,d0             ; Tage seit '78
	add.l #365,d0           ; seit '77
	move.l d0,d1
	addq.l #6,d1            ; Offset
	divu #7,d1
	clr.w d1
	swap d1
	move.l d1,24(a0)        ; tm_wday
	move.l #77,20(a0)       ; tm_year
	divu #4*365+1,d0        ; Anzahl Schaltjahrzyklen
	asl.w #2,d0
	add.w d0,20+2(a0)       ; jeweils vier Jahre
	clr.w d0
	swap d0
	cmp.w #4*365,d0         ; Sonderfall: Schaltjahr-Sylvester
	bne.b l1
	addq.w #3,20+2(a0)
	sub.w #3*365+1,d0
	bra.b l2
l1	divu #365,d0            ; sonstige Jahre
	add.w d0,20+2(a0)
	move.w d0,d1            ; #3 = Schaltjahr-Flag
	clr.w d0
	swap d0                 ; Jahrestage
l2	move.l d0,28(a0)        ; tm_yday
	moveq #0,d2             ; Monatszähler
	move.l d0,d3
	; Monatstag ermitteln:
	sub.w #31,d0            ; Januar
	blo.b DtOK
	addq.w #1,d2
	move.w d0,d3
	sub.w #28,d0            ; Februar
	blo.b DtOK
	cmp.w #3,d1
	bne.b keinSchaltjahr
	subq.w #1,d0            ; jetzt 29 Tage
	blo.b DtOK
keinSchaltjahr
	addq.w #1,d2
	move.w d0,d3
	sub.w #31,d0            ; März
	blo.b DtOK
	addq.w #1,d2
	move.w d0,d3
	sub.w #30,d0            ; April
	blo.b DtOK
	addq.w #1,d2
	move.w d0,d3
	sub.w #31,d0            ; Mai
	blo.b DtOK
	addq.w #1,d2
	move.w d0,d3
	sub.w #30,d0            ; Juni
	blo.b DtOK
	addq.w #1,d2
	move.w d0,d3
	sub.w #31,d0            ; Juli
	blo.b DtOK
	addq.w #1,d2
	move.w d0,d3
	sub.w #31,d0            ; August
	blo.b DtOK
	addq.w #1,d2
	move.w d0,d3
	sub.w #30,d0            ; September
	blo.b DtOK
	addq.w #1,d2
	move.w d0,d3
	sub.w #31,d0            ; Oktober
	blo.b DtOK
	addq.w #1,d2
	move.w d0,d3
	sub.w #30,d0            ; November
	blo.b DtOK
	addq.w #1,d2
	move.w d0,d3            ; Dezember
DtOK	move.l d2,16(a0)        ; tm_mon
	addq.w #1,d3
	move.l d3,12(a0)        ; tm_mday

	move.l #-1,32(a0)       ; tm_isdst
	movem.l (a7)+,d0-d3/a0
	move.l #timebuffer,d0
	rts

timebuffer:	blk.l 9

	end
