
;================= SET TIME ===========================
SETTIME:	
	push	r17		;store used registers	
	ldi	XL,bind1	;Set "HOURS" position
	ldi	r17,60		;"1Hour"=>const
	clr	r18		;Clear "Clear Flag"

ST0:	rcall	DISPTIME	;Display Time	
	st	X+,r31		;Flashing position
	st	X,r31		;Flashing position
	dec	XL		;Restore position
	clr	KeyD		;
	;---------- Wait Key Pressed ------------------
ST1:	tst	KeyD		;? KeyD=0 ?
	breq	ST1		; if Yes then repeat 
	;----------------------------------------------
	cpi	KeyD,0x01	;KeyD=K0 "+"
	breq	STM01		;goto SUB 

	cpi	KeyD,0x02	;KeyD=K1 "-"
	breq	STM02		;goto SUB 

	cpi	KeyD,0x04	;KeyD=K2 "Next"
	breq	STM04		;goto SUB 

	cpi	KeyD,0x84	;KeyD=K2 "Next"_long
	breq	STM84		;goto SUB 
	;----------------------------------------------
STE:	rjmp	ST0		;LOOP
;=======================================================

;============== SetTime Key handlers ===================
STM01:	add	TIME_L,r17	;Add const
	adc	TIME_H,r31	;Add carry

	ldi	r16,0xA0	;
	cp	TIME_L,r16	;IF TIME<24h00m
	ldi	r16,0x05	;
	cpc	TIME_H,r16	;
	brlo	stm01E		;THEN GO OUT

	sub	TIME_L,r17	;Sub const
	sbc	TIME_H,r31	;Sub carry
stm01E:	rjmp	STE	
	;------------------------------------
STM02:	sub	TIME_L,r17	;Sub const
	sbc	TIME_H,r31	;Sub carry
			;
	cp	TIME_L,r31	;IF TIME=00h00m
	cpc	TIME_H,r31	;
	brge	stm02E		;THEN GO OUT

	add	TIME_L,r17	;Add const
	adc	TIME_H,r31	;Add carry
stm02E:	rjmp	STE	
	;------------------------------------
STM04:	cpi	XL,bind1	;?"HOURS" position
	brne	stm041		;IF NO then GO over
	inc	XL		;next position
	inc	XL		;next position	
	ldi	r17,1		;"1Minute"=>const
	rjmp	STE	

stm041:	cpi	XL,bind1+2	;?"MINUTES" position
	brne	stm042		;IF NO then GO over
	inc	XL		;next position
	inc	XL		;next position	

stm042:	pop	r17		;restore used registers
	RET
	;------------------------------------
STM84:	ser	r18		;Set "Clear Flag"
	rjmp	stm042		;GO OUT
;=================== E N D ==============================================



;======== SUB "DISPLAY TIME" TIME_L/TIME_H => INDICATOR ==================

DISPTIME:
	push	XL		;store used registers	
	push	TIME_H		;store used registers	
	push	TIME_L		;store used registers	
	push	r17		;store used registers	
	;------------ Convert BIN=> DDEC ----------------
	rcall	TIME_BDD	;Convert TIME_BIN=>TIME_BDD
	;--------------- Show DDEC ----------------
	rcall	SYNCHRO
	;------------------------------------------
	ldi	XL,BIND0	;Set pos in BIND0
	mov	r16,TIME_H	;move HIGH byte BIN
	rcall	WBDD_BIND	;Sent two nibble to BIND
	
	mov	r16,TIME_L	;move LOW byte BIN
	rcall	WBDD_BIND	;Sent two nibble to BIND
	;----------------------------	
	;------------ First SYM control ----------------
	mov	r16,TIME_H		;move HIGH byte BIN
	andi	r16,0xF0		;IF FIRST DIGIT=0
	brne	dst1			;THEN FADE IT
	sts	bind0,r31		;" "=> first position
	sts	bind1,r31		;" "=> first position
dst1:
	;------------------------------------------------	
	pop	r17		;restore used registers
	pop	TIME_L		;store used registers	
	pop	TIME_H		;store used registers	
	pop	XL		;restore used registers
	ret
;=========================================================================


;=============== SUB Convert TIME_BIN=>TIME_BDD ==========================

TIME_BDD:	push	XL			;store used registers	
		push	r17			;store used registers	
		push	r18			;store used registers	
		mov	r17,TIME_L		;move LOW byte BIN
		mov	r18,TIME_H		;move HIGH byte BIN
		ldi	ZL,low(clcconst*2)	;set Z pointer to DECconst in FLASH
		rcall	bdd

	lds	r16,ddec+1	;mov TIME_H HIGH=>temp
	swap	r16		;SWAP nibbles
	lds	TIME_H,ddec+2	;mov TIME_H LOW=>temp
	or	TIME_H,r16	;glue TIME_H HIGH & TIME_H LOW

	lds	r16,ddec+3	;mov TIME_L HIGH=>temp
	swap	r16		;SWAP nibbles
	lds	TIME_L,ddec+4	;mov TIME_L LOW=>temp
	or	TIME_L,r16	;glue TIME_L HIGH & TIME_L LOW

		pop	r18			;restore used registers
		pop	r17			;restore used registers
		pop	XL			;restore used registers
		RET
;=========================================================================


;================ SUB "SYNCHRONIZATION" ==================================
SYNCHRO:	inc 	DL1	;set delay  
		rcall	delay	;Wait 
		RET	
;=========================================================================
	
