;
; Oliver Schmidt, 22.08.2006
;
; time_t _systime (void);
; /* Similar to time(), but:
;  *   - Is not ISO C
;  *   - Does not take the additional pointer
;  *   - Does not set errno when returning -1
;  */
;

        .include        "time.inc"
	.include	"zeropage.inc"
	.include	"mli.inc"

__systime:
	; Update time
	lda	#GET_TIME_CALL
	ldx	#GET_TIME_COUNT
	jsr	callmli
	bcs	err

	lda	DATELO+1
	lsr
	php			; Save month msb
	cmp	#70		; Year < 70?
	bcs	:+		; No, leave alone
	adc	#100		; Move 19xx to 20xx
:	sta	TM + tm::tm_year
	lda	DATELO
	tax			; Save day
	plp			; Restore month msb
	ror
	lsr
	lsr
	lsr
	lsr
	beq	err		; [1..12] allows for validity check
	tay
	dey			; Move [1..12] to [0..11]
	sty	TM + tm::tm_mon
	txa			; Restore day
	and	#%00011111
	sta	TM + tm::tm_mday

	lda	TIMELO+1
	sta	TM + tm::tm_hour
	lda	TIMELO
	sta	TM + tm::tm_min

	lda	#<TM
	ldx	#>TM
	jmp	_mktime

err:	lda	#$FF
	tax
	sta	sreg
	sta	sreg+1
	rts			; Return -1

	.bss

TM:	.tag	tm
