;******************************************************************************
; start of code
;******************************************************************************

.include <m8def.inc>
.dseg


    .cseg 

	.org 0
		rjmp	RESET

	.org INT0addr
		reti ; int0
	.org ICP1addr
		rjmp	ICP1_INT

;******************************************************************************
; code
;******************************************************************************


RESET:	
        ldi		r16,LOW(RAMEND) 	;setup stack pointer
		out 	SPL,r16
		ldi		r16,HIGH(RAMEND)
		out		SPH,r16
		

		ldi r17,0   	;адрес ячейки со старшим байтом первой частоты 
		out EEARL, r17
		out EEARH, r17
		sbi EECR,EERE    
		in  r26,EEDR	 
		inc r17
		out EEARL, r17
		sbi EECR,EERE    
		in  r25,EEDR	 
		inc r17
		out EEARL, r17
		sbi EECR,EERE    
		in  r24,EEDR
		
	 
		
		clr r18		;В р18 хранится указатель на строку в еепром. (0х00-первая, 0х10-вторая, 0х20 третья)		
		clr r17		;В р17 хранится указатель на байт в еепром. 

		ldi		r16,0x38 		; PC3, 4 ,5
		out		DDRC,r16		; as output
		sbi		PORTC, PC3		;Зажечь светодиод на PC3 (freq 1)

		ldi		r16,0x01		
		out		PINB, r16 		;подтягивающий резистор на кнопку


		ser		r16			; 
		out		DDRD,r16		; 
		
		; set sine table
		ldi		r31,high(sine*2)	; setup Z pointer hi
		ldi		r30,low(sine*2)		; setup Z pointer lo
		; clear accumulator 
		ldi 	r29,0x00			; clear accumulator 
		ldi 	r28,0x00			; clear accumulator 

;		ldi 	r16, 80
;		out		GIMSK,r16
;		sei						; global enable interrupts
		ldi		r16,0x80
		out		TCCR1B,r16
		ldi		r16,0x20
		out		TIMSK,r16
		sei

; main loop
LOOP1:
		add		r28,r24			; 1
		adc		r29,r25			; 1
		adc		r30,r26			; 1
		lpm		    			; 3
		out		PORTD,r0		; 1
		rjmp	LOOP1				; 2 => 9 cycles
	
ICP1_INT:
		cli
		cbi		PORTC, PC3		;Потушить светодиоды индикации
		cbi		PORTC, PC4		
		cbi		PORTC, PC5		
		inc 	r18             		;увеличить счетчик . Если меньше 2-х, считать еепром по счетчику  	
		cpi	r18,3
		brsh    reset_r18
		cpi	r18,1
		breq	SET_10
		cpi	r18,2
		breq	SET_20
		
CONTINUE:
		out EEARL, r17
		sbi EECR,EERE    
		in  r26,EEDR	 
		inc r17
		out EEARL, r17
		sbi EECR,EERE    
		in  r25,EEDR	 
		inc r17
		out EEARL, r17
		sbi EECR,EERE    
		in  r24,EEDR
		rcall DELAY_1
		sei
		reti

RESET_R18:
		clr	r18
		clr	r17
		sbi	PORTC, PC3
		rjmp    CONTINUE
		ret
SET_10: 
		
		ldi	r17,0x10
		sbi	PORTC, PC4
		rjmp    CONTINUE
		ret
SET_20:
		ldi	r17,0x20
		sbi	PORTC, PC5
		rjmp    CONTINUE		
		ret

DELAY_1:
          ldi  R19, $BB
WGLOOP0:  ldi  R20, $4D
WGLOOP1:  ldi  R21, $FF
WGLOOP2:  dec  R21
          brne WGLOOP2
          dec  R20
          brne WGLOOP1
          dec  R19
          brne WGLOOP0
          ldi  R19, $02
WGLOOP3:  dec  R19
          brne WGLOOP3
          nop
	  ret


;******************************************************************************
; таблица синуса
;******************************************************************************
	.org 0x200
	
sine:		
	.DB 	0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae
	.DB 	0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8
	.DB 	0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5
	.DB 	0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff
	.DB 	0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7
	.DB 	0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc
	.DB 	0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3
	.DB 	0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83
	.DB 	0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51
	.DB 	0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27
	.DB 	0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a
	.DB 	0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00
	.DB 	0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08
	.DB 	0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23
	.DB 	0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c
	.DB 	0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c





