.include "tn10def.inc"

	.def	Temp1=R16
	.def	Temp2=R17
	.def	Temp3=R18
	.def	Temp4=R19
	.def	Temp=R20

.dseg

CountRate:	.byte 1
MelAddL:	.byte 1
MelAddH:	.byte 1

;******************************************************************************
.macro	stsi		;save_immediate <SRAM_cell>,<k>
	ldi Temp,@1
	sts @0,Temp
.endmacro

.macro	rdm
	ldi ZH,High(@0*2+0x4000)
	ldi ZL,Low(@0*2)
	add ZL,XL
	adc ZH,XH
	;lpm
	;mov Temp3,r0
	ld Temp3,Z
.endmacro
;******************************************************************************

.cseg
.org 0

rjmp RESET 				; Reset 
reti ;rjmp EXT_INT0 	; External Interrupt Request 0
reti ;rjmp PCINT 		; PCINT 
reti ;rjmp TIM0_CAPT 	; Timer0 Capture Event  
reti ;rjmp TIM0_OVF 	; Timer0 Overflow 
reti ;rjmp TIM0_COMPA 	; Timer0 CompareA 
reti ;rjmp TIM0_COMPB 	; Timer0 CompareB 
reti ;rjmp ANA_COMP 	; Analog Comparator
reti ;rjmp WDT 			; Watchdog Time-out
reti ;rjmp VLM 			; Vcc Level Monitor 
reti ;rjmp ADC_C 		; ADC Conversion Complete

reset:	
    ldi Temp1,high(RAMEND)
	out SPH,Temp1 
	ldi Temp1,low(RAMEND)
	out SPL,Temp1

	ldi Temp1,0xD8
	out CCP,Temp1
	
	ldi Temp1,0b00000000
	out CLKPSR,Temp1

	cli
	inc Temp3

	ldi temp1,0xff			;port init
	out ddrb,temp1
	ldi temp1,0b00000001
	out portb,Temp1
                            ;timers init
	ldi temp1,0b01000000	;OC0a toggle at compare
	out tccr0a,temp1
	ldi temp1,0b00001010
	out tccr0b,temp1    	;clear on compare, clk=C/8

	ldi Temp1,1
	sts CountRate,Temp1


;**********************************************************************************************
;Partiture reader

;input:
;output: Temp3 - code of current note

Partiture:    
    ldi XL,0
	ldi XH,0
	ldi Temp1,0
	ldi Temp2,0

Play:
	rdm HymnUSSR
	cpi Temp3,0xff	;comparing with "end" flag
	breq Partiture

	sts MelAddL,XL
	sts MelAddH,XH
	rcall Note

	lds XL,MelAddL
	lds XH,MelAddH
	;adiw XL,1
	ld Temp4,X+

	rdm HymnUSSR
	rcall Wait
	;adiw XL,1
	ld Temp4,X+

	rjmp Play


HymnUSSR:	
	.db 19,24,24,32							;союз
	.db 19,24,21,8,23,32					;неруши
	.db 16,12,254,4,16,16,21,32				;мый респу
	.db 19,24,17,8,19,32					;блик свобо
	.db 12,12,254,4,12,16,14,32				;дных сплоти
	.db 14,16,16,16,17,32					;ла наве
	.db 17,16,19,16,21,32					;ки вели
	.db 23,24,24,8,26,16					;кая Русь
	.db 19,4,254,2,19,4,254,2,16,16,254,2	;та-та-тааа
	.db 19,16,28,32							;да здра
	.db 26,24,24,8,26,32					;вствует со
	.db 23,16,19,16,24,32					;зданный во
	.db 23,24,21,8,23,32					;лей наро
	.db 19,16,16,16,21,32					;да вели
	.db 19,16,17,16,19,32					;кий могу
	.db 14,16,12,16,24,32					;чий Сове
	.db 23,16,21,16,19,16					;тский Союз
	.db 19,4,254,2,19,4,254,2,21,16,23,16	;та-та-тааа
	.db 28,64,26,16,24,16,23,16,24,16,26,16	;Сла-а-а-а вься-а-а-а-те
	.db 254,2,19,4,254,2,19,4,254,2,19,12	;та-та-та че
	.db 254,4,18,12,254,4,19,12,254,4		;ство тата
	.db 19,16,21,16,23,16					;ти-та
	.db 24,64,23,16,21,16,19,16,21,16,23,16	;На-а-а-а ше-е сва-а-бо
	.db 254,2,16,4,254,2,16,4,254,2,16,12	;та-та-та дно
	.db 254,4,16,12,254,4,16,12,254,4		;е-е-е тата
	.db 16,16,17,16,19,16					;ти-та
	.db 21,32,17,16,19,16,21,32				;дружбы наро
	.db 17,24,19,8,21,32					;дов надё
	.db 17,16,21,16,26,64					;жный оплот
	.db 29,64,28,16,26,16,24,16,26,16,28,48	;Па-а-а-а рти-и-я-а Ле
	.db 24,12,254,4,24,64					;нина-а-а-а
	.db 26,64,24,16,23,16,21,16,23,16,24,48	;Си-и-и-и ла-а на-а-ро
	.db 21,12,254,4,21,16,19,16,21,16,23,16	;дная-а-а-а
	.db 24,32,23,24,21,8,19,32				;нас к торжеству
	.db 14,8,254,8,12,16,24,32				;коммуни-и
	.db 23,16,21,16,19,12,254,4,17,8,254,4,255,0	;зма ведёт!


;  до(263) до#(285) ре(297) ре#(316) ми(330) фа(351) фа#(375) соль(395) соль#(422)ля(440) ля#(474) си(494)
;  0       1        2       3        4       5       6        7         8         9       10       11
;  12      13       14      15       16      17      18       19        20        21      22       23
;  24      25       26      27       28      29      30       31        32        33      34       35


;****************************************************

Note:	
	ldi ZH,High(Notelist*2+0x4000)
	ldi ZL,Low(Notelist*2)

	ldi Temp1,0
	clc
	rol Temp3
	rol Temp1

	add ZL,Temp3
	adc ZH,Temp1

	;lpm
	;mov Temp2,r0
	;adiw ZL,1
	ld Temp2,Z
	ld Temp4,Z+

	;lpm
	;mov Temp1,r0
	ld Temp1,Z

	rcall NotePlay
	ret


;	    до(263)   до#(285)  ре(297)   ре#(316)  ми(330)   фа(351)   фа#(375)  соль(395) соль#(422)ля(440)   ля#(474)  си(494)
;	    0         1         2         3         4         5         6         7         8         9         10        11
Notelist:	
	.db 0x02,0x50,0x02,0x24,0x02,0x0e,0x01,0xed,0x01,0xd9,0x01,0xbc,0x01,0xa0,0x01,0x8b,0x01,0x72,0x01,0x63,0x01,0x49,0x01,0x3c;сред. октава
;       12        13        14        15        16        17        18        19        20        21        22        23
	.db 0x01,0x28,0x01,0x12,0x01,0x07,0x00,0xf6,0x00,0xec,0x00,0xde,0x00,0xd0,0x00,0xc5,0x00,0xb9,0x00,0xb1,0x00,0xa4,0x00,0x9e;бол. октава
;	    24        25        26        27        28        29        30        31        32        33        34        35
	.db 0x00,0x94,0x00,0x89,0x00,0x83,0x00,0x7b,0x00,0x76,0x00,0x6f,0x00,0x68,0x00,0x62,0x00,0x5c,0x00,0x58,0x00,0x52,0x00,0x4f;1 октава


NotePlay:	
	ldi Temp3,0
	out tcnt0h,Temp3
	out tcnt0l,Temp3
	out ocr0ah,temp2
	out ocr0al,temp1
	ret

;************************************************************

Wait:	
	push Temp1
	push Temp2

	ldi Temp1,0
	ldi Temp2,0

l:	dec temp1
	brne l

	dec temp2
	brne l

	dec temp3
	brne l

	pop Temp2
	pop Temp1
	ret
