; ************************************
; * 16-bit EE Timer by PEK '2002
; *
; * AT90S2343, 2,048MHz
; ************************************


.include "2343def.inc"


; ************************************
; * Variable Definitions             
; ************************************
.def	temp	=R16
.def	eedata	=R17


; ************************************
; * Start of Code                    
; ************************************
.cseg
.org 0
	rjmp	start
.org 2	
	rjmp	counter_overflow	; Timer/Counter0 Overflow Interrupt


start:	ldi	temp,low(RAMEND)
	out	SPL,temp		; Set stack pointer to last internal RAM location

; Setup Ports
	ldi	temp,0xFF
	out	DDRB,temp		; Port B as output

; Get EEPROM data
	ldi	temp,0x00
	rcall	Read_EEPROM
	mov	XL,eedata		; Lower byte of time
	ldi	temp,0x01
	rcall	Read_EEPROM
	mov	XH,eedata		; Higher byte of time

; Setup Timer
	ldi	temp,0x02
	out	TCCR0,temp		; CK/8	
	ldi	temp,0x02
	out	TIMSK,temp		; Enable Timer/Counter0 Interrupt

	sei				; Enable global interrupts
	

high_loop:
	tst	XH			; Compare bits 15-8
	brne	high_loop

low_loop:
	tst	XL			; Compare bits 7-0
	brne	low_loop

set_output:
	sbi	PORTB,0			; Pin 0 High
	rjmp	set_output


counter_overflow:
	sbiw	XL,1			; Decrease XH:XL counter
	reti


; ************************************
; * READ from EEPROM                 *
; * temp - points to location        *
; * eedata - data byte               *
; ************************************
Read_EEPROM:
	out	EEAR,temp		; Set EEPROM Address Register

	clr	temp			; Reset EEPROM Control Register
	out	EECR,temp

	sbi	EECR,EERE		; Set EEPROM Read Enable

EEPROM_Read_Loop:
	sbic	EECR,EERE		; Wait for EERE to get low
	rjmp	EEPROM_Read_Loop

	in	eedata,EEDR		; Save data from EEPROM Data Register
	ret
