////Atmega5 - řídící čip pro laserový terč 3 (modré diody)
////0x0200 - čislo programu
////0x0201 - počet střel v programu
////0x0202 - počet střel v programu na začátku pro kontolu
////R25 používám na pammatování počtu impulsu programu
////R24 si pamatuje, kolik impulsů přišlo z Atmeg1-4

////////počká na stisknutí tlačítka a předá informaci o programu do všech šesti zbývajících Atmeg
//pak čeká na impuls do TSOP (má 4 TSOP a kterékoliv může spustit střelu), poté má 15ms na to, 
// aby přijal impuls od Atmeg1-4, přijme - hit, nepříjme - miss. 
// provede impulsy do časomíry a počítadla (časomíra pouuze zásah, počítadlo i počet bodů)
// první výstřel pošle start do časomíry, poslední výstřel stopne časomíru, další výstřel 
// nebo stisknutí tlačítka resetují program a pošlou impuls RESET - od  místa posílání impulsu PROGRAM.


.include "m8def.inc"

.org 0x00
 	rjmp zac // skon na začátek programu
.org 0x18
	rjmp timer // skok na obsluhu přerušení
.org 0x100

timer:	dec R29
		cpi R29, 0
		breq stoptimer		
		reti

stoptimer: rjmp n_stophit


////////////////////////////////////////////////////////////
//hlavni program
//////////////////////////////////////

zac:  	ldi R16, HIGH(RAMEND) // inicializace STACK POINTERu
		out SPH, R16
		ldi R16, LOW(RAMEND)
		out SPL, R16

		ldi R16, 0x0F	//B vystupni - B0,B1 - signály do Atmeg6 a 7  (B1 - Atmega6) B4-B7 - signály z TSOP 1-4
		out DDRB, R16					// - B2 - reproduktor,,, B3 signály program do Atmeg1-4
		ldi R16, 0x00	//C0-C3 vstupni - vstupní signály z Atmeg1-4 (C0 - Atmega1)     
		out DDRC, R16		
		ldi R16, 0x00	//D0-D7 vstupní - 8 tlačítek programů
		out DDRD, R16
		ldi R16, 0xFF
		out PORTD, R16	//pull up rezistory pro tlačítka
		
			//nastaveni casovace pro program pocitani casu//
		ldi R17, 0x00
		out TCCR1A, R17
		ldi R16, 0b00001101		//nastavení clk/1024 pro timer
		out TCCR1B, R16
		ldi R16, 0x00
		out OCR1AH, R16
		ldi R16, 0x30
		out OCR1AL, R16
		ldi R16, 0x10
		out TIMSK, R16 // povolení zdroje přerušení


		ldi R16, 0 // uložení čísla 0 na všechny
		sts 0x0200, r16
		sts 0x0201, r16
		sts 0x0202, r16
		sts 0x0203, r16
		sts 0x0206, r16
 
		ldi R19, 0			//nulovani registrů
		ldi R17, 0
		ldi R18, 0
		ldi R20, 0
		ldi R21, 0
		ldi R22, 0
		ldi R23, 0
		ldi R24, 0
		ldi R25, 0

		//rjmp miss

		//rjmp vyhodnocenihit

	//	rjmp zasah
	//	rcall cekej2ms		//kontrola delky zpozdeni
	//	rcall cekej04
	//	rcall cekejkontrola
	//	rcall cekej200
		
program:		in R16, PIND				//podle stisknutého tlačítka 
				cpi R16, 0b11111110
				breq p1				
				cpi R16, 0b11111101
				breq p2
				cpi R16, 0b11111011
				breq p3
				cpi R16, 0b11110111
				breq p4
				cpi R16, 0b11101111
				breq p5
				cpi R16, 0b11011111
				breq p6
				cpi R16, 0b10111111
				breq p7
				cpi R16, 0b01111111
				breq p8
				rjmp program

p1:		rcall cekejkontrola
		in R16, PIND
		cpi R16, 0b11111110			
		brne program			//overeni stisknuti tlacitka
		rjmp program1

p2:		rcall cekejkontrola
		in R16, PIND
		cpi R16, 0b11111101
		brne program
		rjmp program2

p3: 	rcall cekejkontrola
		in R16, PIND
		cpi R16, 0b11111011
		brne program
		rjmp program3

p4:		rcall cekejkontrola
		in R16, PIND
		cpi R16, 0b11110111
		brne program
		rjmp program4

p5: 	rcall cekejkontrola
		in R16, PIND
		cpi R16, 0b11101111
		brne program
		rjmp program5

p6: 	rcall cekejkontrola
		in R16, PIND
		cpi R16, 0b11011111
		brne program
		rjmp program6

p7: 	rcall cekejkontrola
		in R16, PIND
		cpi R16, 0b10111111
		brne program	
		rjmp program7

p8: 	rcall cekejkontrola
		in R16, PIND
		cpi R16, 0b01111111
		brne program
		rjmp program8

				
program1: 	ldi R16, 10				
			sts 0x0201, R16			//nahrani poctu strel na 0x0201
			sts 0x0202, R16
			ldi R16, 1
			sts 0x0200, R16			//nahrani programu na 0x0200
			rjmp signal_67
				
program2: 	ldi R16, 20
			sts 0x0201, R16	
			sts 0x0202, R16
			ldi R16, 2
			sts 0x0200, R16
			rjmp signal_67
				
program3: 	ldi R16, 5
			sts 0x0201, R16
			sts 0x0202, R16
			ldi R16, 3
			sts 0x0200, R16	
			rjmp signal_67
				
program4: 	ldi R16, 5
			sts 0x0201, R16	
			sts 0x0202, R16
			ldi R16, 4
			sts 0x0200, R16
			rjmp signal_67
				
program5: 	ldi R16, 5
			sts 0x0202, R16
			sts 0x0201, R16	
			ldi R16, 5
			sts 0x0200, R16
			rjmp signal_67

				
program6: 	ldi R16, 32
			sts 0x0201, R16	
			sts 0x0202, R16
			ldi R16, 6
			sts 0x0200, R16
			rjmp signal_67
				
program7: 	ldi R16, 32
			sts 0x0201, R16
			sts 0x0202, R16
			ldi R16, 7
			sts 0x0200, R16
			rjmp signal_67
				
program8: 	ldi R16, 5
			sts 0x0201, R16
			sts 0x0202, R16
			ldi R16, 8
			sts 0x0200, R16
			rjmp signal_67

skok1: rjmp program

////////////////////////////////////////////////////////////
////////poslání impulsu daného programu do Atmegy6 a 7//////
/////////////////////////////////////////////////////////////


signal_67:	ldi R17, 0b00001011		//poslání impulsů do ostatních atmeg!!!
			in R16, PINB			//maska B portu
			or R17, R16				//0bxxxx1x11 - R17
			andi R16, 0b11110100	//0bxxxxx0x00 - R16
			
			ldi ZH, 2			//adresa 0x0200		
			ldi ZL, 0			
			ld R25, Z			//počet impulsu do R25
			
smycka1:	out PORTB, R17		//smycka jednoho 400us impulsu
			rcall cekej04
			out PORTB, R16
			rcall cekej04
			dec R25				//zaridi akuratni pocet impulsicku
			cpi R25, 0
			brne smycka1
			rcall cekej1
			rjmp TSOP			

//////////////////////////////////////////////////////////////
//////ted by měli být oba displeje pripravene k cinnosti//////
//////////////////////////////////////////////////////////////
////////no a melo by se cekat nez prijde signal z TSOP/////
////////////////////////////////////////////////////////////////
TSOP:		in 		R16, PINB
			andi 	R16, 	0b10000000
			cpi 	R16, 	0b10000000
			breq TSOPkontola
			in 		R16, PINB
			andi 	R16, 	0b01000000
			cpi 	R16, 	0b01000000	
			breq TSOPkontola
			in 		R16, PINB
			andi 	R16, 	0b00100000
			cpi 	R16, 	0b00100000			//dvojitá kontrola signálu z TSOP!
			breq TSOPkontola
			in 		R16, PINB
			andi 	R16, 	0b00010000
			cpi 	R16, 	0b00010000	
			breq TSOPkontola

			rjmp TSOP

TSOPkontola: rcall cekejkontrola
			in 		R16, PINB
			andi 	R16, 	0b10000000
			cpi 	R16, 	0b10000000
			breq zasah
			in 		R16, PINB
			andi 	R16, 	0b01000000
			cpi 	R16, 	0b01000000			//dvojitá kontrola signálu z TSOP!
			breq zasah
			in 		R16, PINB
			andi 	R16, 	0b00100000
			cpi 	R16, 	0b00100000	
			breq zasah
			in 		R16, PINB
			andi 	R16, 	0b00010000
			cpi 	R16, 	0b00010000	
			breq zasah

///////////////////////////////////////////////////////
////////přišel signál z TSOP a teď se musí kontolovat terč a přijmout signál z něho
////////////////////////////////////////////////////////


zasah:			ldi R17, 5				//teď to kontoluje asi 15ms
	z1:			ldi R18, 0
				
	z2:			in 		R16, PINC
				andi 	R16, 0b00000001 //maska ostatních pinů
				cpi 	R16, 0b00000001
				breq atmegakontrola
				in 		R16, PINC
				andi 	R16, 0b00000010 //maska ostatních pinů
				cpi 	R16, 0b00000010
				breq atmegakontrola
				in 		R16, PINC
				andi 	R16, 0b00000100 //maska ostatních pinů
				cpi 	R16, 0b00000100
				breq atmegakontrola
				in 		R16, PINC
				andi 	R16, 0b00001000 //maska ostatních pinů
				cpi 	R16, 0b00001000
				breq atmegakontrola

				dec R18
				brne z2
				dec R17
				brne z1
				rjmp miss
							//odkud přišel signál

atmegakontrola: rcall cekejkontrola			//kontrola aspoň 60us signál z terče
				in 		R16, PINC
				andi 	R16, 0b00000001 //maska ostatních pinů
				cpi 	R16, 0b00000001
				breq atmega1
				in 		R16, PINC
				andi 	R16, 0b00000010 //maska ostatních pinů
				cpi 	R16, 0b00000010
				breq atmega2
				in 		R16, PINC
				andi 	R16, 0b00000100 //maska ostatních pinů
				cpi 	R16, 0b00000100
				breq atmega3
				in 		R16, PINC
				andi 	R16, 0b00001000 //maska ostatních pinů
				cpi 	R16, 0b00001000
				breq atmega4
				
				rjmp z1		//pokud kontrola selze, vrati se zpet do ziskavani signalu z atmeg
							//z1 tam je proto, aby se to zase nekontrolovalo 16ms to by se mohlo nějakým šumem zacyklit.


				
///////////////////////////////////////////////////////////////////
//////////kdyz se trefim, pocita impulsy z atmeg1-4///////////ú
////////////////////////////////////////////////////
////////////z kazdeho segmentu se to pocita zvlast////////
////////////////////////////////////////////////////////
atmega1: 		rjmp trefil1
atmega2:		rjmp trefil2
atmega3:		rjmp trefil3
atmega4:		rjmp trefil4



trefil1:		ldi R24, 0		//vynulování počítadla impulsu 
				rjmp nula1
plus1:			inc R24						//za každý impuls se přičte 1
				ldi R23, 0					//pocitani, jestli uz dlouho nebyl impuls		
nula1:			in 		R16, 	PINC		
				andi 	R16, 	0b00000001
				cpi 	R16, 	0b00000000	//overi, že impuls ustal
				brne nula1
				rcall cekejkontrola
				in 		R16, 	PINC		
				andi 	R16, 	0b00000001
				cpi 	R16, 	0b00000000	//pro jistotku 2x
				brne nula1
jednicka1:		inc R23			//timto pocitadlem se zjisti jestli uz neuplynulo
				cpi R23, 150		//vice nez 1ms od posledniho impulsu a tedy 
				breq hit1	//by bylo na case ukoncit zjistovani impulsu a spocitat vysledek
				in 		R16, 	PINC		
				andi 	R16, 	0b00000001	
				cpi 	R16, 	0b00000001
				brne jednicka1
				rcall cekejkontrola
				in 		R16, 	PINC		
				andi 	R16, 	0b00000001
				cpi 	R16, 	0b00000001	//pro jistotu dvakrát kvůli šumu
				brne jednicka1
				rjmp plus1

hit1: rjmp hit

//////////////////////////////////////////////////////////////////////////////

trefil2:		ldi R24, 0		//vynulování počítadla impulsu 
				rjmp nula2
plus2:			inc R24						//za každý impuls se přičte 1
				ldi R23, 0					//pocitani, jestli uz dlouho nebyl impuls		
nula2:			in 		R16, 	PINC		
				andi 	R16, 	0b00000010
				cpi 	R16, 	0b00000000	//overi, že impuls ustal
				brne nula2
				rcall cekejkontrola
				in 		R16, 	PINC		
				andi 	R16, 	0b00000010
				cpi 	R16, 	0b00000000	//pro jistotku 2x
				brne nula2
jednicka2:		inc R23			//timto pocitadlem se zjisti jestli uz neuplynulo
				cpi R23, 150		//vice nez 1ms od posledniho impulsu a tedy 
				breq hit2	//by bylo na case ukoncit zjistovani impulsu a spocitat vysledek
				in 		R16, 	PINC		
				andi 	R16, 	0b00000010	
				cpi 	R16, 	0b00000010
				brne jednicka2
				rcall cekejkontrola
				in 		R16, 	PINC		
				andi 	R16, 	0b00000010
				cpi 	R16, 	0b00000010	//pro jistotu dvakrát kvůli šumu
				brne jednicka2
				rjmp plus2

hit2: rjmp hit

//////////////////////////////////////////////////////////////////////////////

trefil3:		ldi R24, 0		//vynulování počítadla impulsu 
				rjmp nula3
plus3:			inc R24						//za každý impuls se přičte 1
				ldi R23, 0					//pocitani, jestli uz dlouho nebyl impuls		
nula3:			in 		R16, 	PINC		
				andi 	R16, 	0b00000100
				cpi 	R16, 	0b00000000	//overi, že impuls ustal
				brne nula3
				rcall cekejkontrola
				in 		R16, 	PINC		
				andi 	R16, 	0b00000100
				cpi 	R16, 	0b00000000	//pro jistotku 2x
				brne nula3
jednicka3:		inc R23			//timto pocitadlem se zjisti jestli uz neuplynulo
				cpi R23, 150		//vice nez 1ms od posledniho impulsu a tedy 
				breq hit3	//by bylo na case ukoncit zjistovani impulsu a spocitat vysledek
				in 		R16, 	PINC		
				andi 	R16, 	0b00000100	
				cpi 	R16, 	0b00000100
				brne jednicka3
				rcall cekejkontrola
				in 		R16, 	PINC		
				andi 	R16, 	0b00000100
				cpi 	R16, 	0b00000100	//pro jistotu dvakrát kvůli šumu
				brne jednicka3
				rjmp plus3

hit3: rjmp hit

//////////////////////////////////////////////////////////////////////////////

trefil4:		ldi R24, 0		//vynulování počítadla impulsu 
				rjmp nula4
plus4:			inc R24						//za každý impuls se přičte 1
				ldi R23, 0					//pocitani, jestli uz dlouho nebyl impuls		
nula4:			in 		R16, 	PINC		
				andi 	R16, 	0b00001000
				cpi 	R16, 	0b00000000	//overi, že impuls ustal
				brne nula4
				rcall cekejkontrola
				in 		R16, 	PINC		
				andi 	R16, 	0b00001000
				cpi 	R16, 	0b00000000	//pro jistotku 2x
				brne nula4
jednicka4:		inc R23			//timto pocitadlem se zjisti jestli uz neuplynulo
				cpi R23, 150		//vice nez 1ms od posledniho impulsu a tedy 
				breq hit4	//by bylo na case ukoncit zjistovani impulsu a spocitat vysledek
				in 		R16, 	PINC		
				andi 	R16, 	0b00001000	
				cpi 	R16, 	0b00001000
				brne jednicka4
				rcall cekejkontrola
				in 		R16, 	PINC		
				andi 	R16, 	0b00001000
				cpi 	R16, 	0b00001000	//pro jistotu dvakrát kvůli šumu
				brne jednicka4
				rjmp plus4

hit4: rjmp hit

//////////////////////////////////////////////////////////////////////////////

////////no a ted to musím poslat do casomiry a pocitadla///////
hit:  	ldi ZH, 02
		ldi ZL, 00
		ld R16, Z /// nahraje číslo programu
		cpi R16, 1
		breq normal
		cpi R16, 2
		breq normal
		cpi R16, 3
		breq normal
		cpi R16, 4
		breq normal
		cpi R16, 5
		breq normal
		cpi R16, 6
		breq pvolna
		cpi R16, 7
		breq pdostovky
		cpi R16, 8
		breq pomocnacas

pvolna:		rjmp volna		//ruzné chování různých progamů
pdostovky:	rjmp dostovky	
pomocnacas:		rjmp nacas

		

////////////////////////////////////////////////////////////////////
////////////klasické chování pogramů////////////////////////////////
////////////////////////////////////////////////////////////////////
/////////neboli trefil jsem se a potřebuji poslat signály do časomíry a do pocitadla/////
/////////pokud je to první strela posilam signál START do casomiry/////////
////////odečtu počet střel a zkotroluji poslední střelu popř pošlu STOP//////////
////////zahraju zvuk po uspěšné střele.//////

normal: 	ldi ZH, 02
			ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
			ld R16, Z
			ldi ZH, 02
			ldi ZL, 02		//pozice 0x0202 (počet zbývajících střel pro porovnání)
			ld R17, Z
			cp R16, R17
			breq start		//pokud je to první střela, pošle impuls START do casomiry (A7)
body:		in R16, PORTB
			mov R17, R16
			ori R16, 0b00000011	//připravení bitu na impulsy do časomíry a čitače

			out PORTB, R16			//nejprve samotný impuls zasah do obou periferii	
			rcall cekej04
			out PORTB, R17			//s 2ms přestávkou
			rcall cekej2ms
			andi R16, 0b00000010	//dalsi impulsy posilam jenom do citace

bodypocet:	out PORTB, R16		//a teď už pocitam zasahy pocinaje nulou
			rcall cekej04
			out PORTB, R17
			rcall cekej04
			dec R24				//poslani urciteho poctu impulsu
			cpi R24, 0
			brne bodypocet
			rjmp vyhodnocenihit			//impulsy poslane, zařvi že ses trefil

start:		in R16, PORTB
			mov R17, R16
			ori R16, 0b00000001	//připravení bitu na impulsy do časomíry
			out PORTB, R16		//jednička
			rcall cekej2ms
			out PORTB, R17		//nula     impuls START
			rcall cekej2ms
			rjmp body			//pak pošle normální impuls ZASAHU

//////////////////////////////////////////////////////////////////////////////ú
//////////konec posílání ipulsů normálními programy////////////////////////
///////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////
/////////////speciální programy/////////////////////////////////////
/////////////////////////////////////////////////////////


volna:		ldi ZH, 02
			ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
			ld R16, Z
			ldi ZH, 02
			ldi ZL, 02		//pozice 0x0202 (počet zbývajících střel pro porovnání)
			ld R17, Z
			cp R16, R17
			breq v_start		//pokud je to první střela, pošle impuls START do casomiry (A7)
v_body:		in R16, PORTB
			mov R17, R16
			ori R16, 0b00000011	//připravení bitu na impulsy do časomíry a čitače

			out PORTB, R16			//nejprve samotný impuls zasah do obou periferii	
			rcall cekej04
			out PORTB, R17			//s 2ms přestávkou
			rcall cekej2ms
			andi R16, 0b00000010	//dalsi impulsy posilam jenom do citace

v_bodypocet:out PORTB, R16		//a teď už pocitam zasahy pocinaje nulou
			rcall cekej04
			out PORTB, R17
			rcall cekej04
			dec	R24				//poslani správného počtu impulsů
			cpi R24, 0
			brne v_bodypocet
			rjmp v_vyhodnocenihit			//impulsy poslane, zařvi že ses trefil

v_start:	in R16, PORTB
			mov R17, R16
			ori R16, 0b00000001	//připravení bitu na impulsy do časomíry
			out PORTB, R16		//jednička
			rcall cekej2ms
			out PORTB, R17		//nula     impuls START
			rcall cekej2ms
			rjmp v_body			//pak pošle normální impuls ZASAHU

v_vyhodnocenihit:	rcall cekej2ms // aby se ukončilo pocitani impulsu
					//ldi ZH, 02
					//ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
					//ld R16, Z
					//dec R16	 
					//cpi R16, 0
					//breq v_resetdiod	//poslední střela opet rozsvítí všechny diody
					ldi R16, 3			//musí tam dát nějaký počet střel jinak by to pořád startoval
					sts 0x0201, R16
					rcall zvukhit
					rjmp TSOP		//pokud to není poslední strela skočí zpět na zjistovani z TSOP

//v_resetdiod:	ldi R16, 31
//				sts 0x0201, R16		//nahrání opět plného počtu diod a skok zpátky
//				rcall zvukhit
//				rjmp TSOP




/////////////////////////////////////////////////////////////////////////
///////////konec programu volny hit//////////////////////////////////////
////////////////////////////////////////////////////////////////////ú

dostovky:	add R23, R24	//do registru 23 se bude počítat, kolik bylo trefeno
			ldi ZH, 02
			ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
			ld R16, Z
			ldi ZH, 02
			ldi ZL, 02		//pozice 0x0202 (počet zbývajících střel pro porovnání)
			ld R17, Z
			cp R16, R17
			breq d_start		//pokud je to první střela, pošle impuls START do casomiry (A7)
d_body:		in R16, PORTB
			mov R17, R16
			ori R16, 0b00000011	//připravení bitu na impulsy do časomíry a čitače

			out PORTB, R16			//nejprve samotný impuls zasah do obou periferii	
			rcall cekej04
			out PORTB, R17			//s 2ms přestávkou
			rcall cekej2ms
			andi R16, 0b00000010	//dalsi impulsy posilam jenom do citace

d_bodypocet:out PORTB, R16		//a teď už pocitam zasahy pocinaje nulou
			rcall cekej04
			out PORTB, R17
			rcall cekej04
			dec	R24				//¨poslani
			cpi R24, 0
			brne d_bodypocet
			rjmp d_vyhodnocenihit			//impulsy poslane, zařvi že ses trefil
			
d_start:	in R16, PORTB
			mov R17, R16
			ori R16, 0b00000001	//připravení bitu na impulsy do časomíry
			out PORTB, R16		//jednička
			rcall cekej2ms
			out PORTB, R17		//nula     impuls START
			rcall cekej2ms
			rjmp d_body			//pak pošle normální impuls ZASAHU
		 

d_vyhodnocenihit:	rcall cekej2ms // aby se ukončilo pocitani impulsu

					cpi R23, 100
					brcs d_stophit //pokud překročíme stovku, STOPne program					
					
					rcall zvukhit
					rjmp TSOP		//pokud to není poslední strela skočí zpět na zjistovani z TSOP

d_stophit:		rcall cekej24
				in R16, PORTB
				mov R17, R16			//17 nula
				ori R16, 0b00000011		//16 - jednička
				out PORTB, R16
				rcall cekej2ms
				out PORTB, R17		//STOP impuls
				rcall zvukhit
				rjmp reset

/////////////////////////////////////////////////////////////
///////////konec hit do stovky///////////////////////////////
/////////////////////////////////////////////////////////////
////////////na cas////////////////////////
/////////////////////////////////////////úú

nacas:	 	ldi ZH, 02
			ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
			ld R16, Z
			ldi ZH, 02
			ldi ZL, 02		//pozice 0x0202 (počet zbývajících střel pro porovnání)
			ld R17, Z
			cp R16, R17
			breq n_start		//pokud je to první střela, pošle impuls START do casomiry (A7)
n_body:		in R16, PORTB
			mov R17, R16
			ori R16, 0b00000011	//připravení bitu na impulsy do časomíry a čitače

			out PORTB, R16			//nejprve samotný impuls zasah do obou periferii	
			rcall cekej04
			out PORTB, R17			//s 2ms přestávkou
			rcall cekej2ms
			andi R16, 0b00000010	//dalsi impulsy posilam jenom do citace

n_bodypocet:out PORTB, R16		//a teď už pocitam zasahy pocinaje nulou
			rcall cekej04
			out PORTB, R17
			rcall cekej04
			dec R24				//poslani
			cpi R24, 0
			brne n_bodypocet
			rjmp n_vyhodnocenihit			//impulsy poslane, zařvi že ses trefil

n_start:	sei				//začíná timer
			ldi R29, 201	//bacha je to cast pointeru Y tak to nepřepisuj
			in R16, PORTB	//za 200 cyklů timeru se program STOPne
			mov R17, R16
			ori R16, 0b00000001	//připravení bitu na impulsy do časomíry
			out PORTB, R16		//jednička
			rcall cekej2ms
			out PORTB, R17		//nula     impuls START
			rcall cekej2ms
			rjmp n_body

n_vyhodnocenihit:rcall cekej2ms // aby se ukončilo pocitani impulsu
				ldi ZH, 02
				ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
				ld R16, Z
				dec R16	 
				cpi R16, 0
				breq n_stophit	//poslední střela spustí STOP impuls a pokračuje na reset
				sts 0x0201, R16
				rcall zvukhit
				rjmp TSOP		//pokud to není poslední strela skočí zpět na zjistovani z TSOP

n_stophit:		cli				//konec pocitani casu, uz proběhlo 5 strel 
				rcall cekej24
				in R16, PORTB
				mov R17, R16			//17 nula
				ori R16, 0b00000011		//16 - jednička
				out PORTB, R16
				rcall cekej2ms
				out PORTB, R17		//STOP impuls
				rcall zvukhit
				rjmp reset

		

///////////////////////////////////////////////////////////////////////úú
///////////////vyhodnoceni normalniho hitu////////////////////////úúú
/////////////////////////////////////////////////////////////////ú

vyhodnocenihit:rcall cekej2ms // aby se ukončilo pocitani impulsu
				ldi ZH, 02
				ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
				ld R16, Z
				dec R16	 
				cpi R16, 0
				breq stophit	//poslední střela spustí STOP impuls a pokračuje na reset
				sts 0x0201, R16
				rcall zvukhit
				rjmp TSOP		//pokud to není poslední strela skočí zpět na zjistovani z TSOP

stophit:		rcall cekej24
				in R16, PORTB
				mov R17, R16			//17 nula
				ori R16, 0b00000011		//16 - jednička
				out PORTB, R16
				rcall cekej2ms
				out PORTB, R17		//STOP impuls
				rcall zvukhit
				rjmp reset



///////////////////////////////////////////////////////////////
////////////co delat pri netrefeni terce///////////////////
/////////////////////////////////////////////////////////////////
////////
miss:		ldi ZH, 02
			ldi ZL, 00
			ld R16, Z /// nahraje číslo programu
			cpi R16, 1
			breq normalmiss
			cpi R16, 2
			breq normalmiss
			cpi R16, 3
			breq normalmiss
			cpi R16, 4
			breq normalmiss
			cpi R16, 5
			breq normalmiss
			cpi R16, 6
			breq volnamiss
			cpi R16, 7
			breq normalmiss /// pri missu nemůže dosáhnout stovky takže neřeším
			cpi R16, 8
			breq pomocnacasmiss

		//ruzné chování různých progamů
pvolnamiss:		rjmp volnamiss
//ppetibojmiss: 	rjmp petibojmiss
//pdostovkymiss:	rjmp dostovkymiss	
pomocnacasmiss:		rjmp nacasmiss


normalmiss: ldi ZH, 02
			ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
			ld R16, Z
			ldi ZH, 02
			ldi ZL, 02		//pozice 0x0202 (počet zbývajících střel pro porovnání)
			ld R17, Z
			cp R16, R17
			breq startmiss		//pokud je to první střela, pošle impuls START do casomiry (A7)
			

bodymiss:	in R16, PORTB
			mov R17, R16
			ori R16, 0b00000011	//připravení bitu na impulsy do časomíry a čitače
			out PORTB, R16			//nejprve samotný impuls zasah do obou periferii	
			rcall cekej04
			out PORTB, R17			//s 2ms přestávkou
			rcall cekej2ms
			andi R16, 0b00000010	//dalsi impulsy posilam jenom do citace

			out PORTB, R16		//a pak jeden impuls jako ze to byla nula
			rcall cekej04
			out PORTB, R17
			rcall cekej04
			
			rjmp vyhodnocenimiss		//impulsy poslane, zařvi že ses netrefil

startmiss:	in R16, PORTB
			mov R17, R16
			ori R16, 0b00000001	//připravení bitu na impulsy do časomíry
			out PORTB, R16		//jednička
			rcall cekej2ms
			out PORTB, R17		//nula     impuls START
			rcall cekej2ms
			rjmp bodymiss			//pak pošle normální impuls ZASAHU

////////////////////////////////////////////////////////////////////////////////////////
//////////specialni programy/////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////

volnamiss:	ldi ZH, 02
			ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
			ld R16, Z
			ldi ZH, 02
			ldi ZL, 02		//pozice 0x0202 (počet zbývajících střel pro porovnání)
			ld R17, Z
			cp R16, R17
			breq v_startmiss		//pokud je to první střela, pošle impuls START do casomiry (A7)
			

v_bodymiss:	in R16, PORTB
			mov R17, R16
			ori R16, 0b00000011	//připravení bitu na impulsy do časomíry a čitače
			out PORTB, R16			//nejprve samotný impuls zasah do obou periferii	
			rcall cekej04
			out PORTB, R17			//s 2ms přestávkou
			rcall cekej2ms
			andi R16, 0b00000010	//dalsi impulsy posilam jenom do citace

			out PORTB, R16		//a pak jeden impuls jako ze to byla nula
			rcall cekej04
			out PORTB, R17
			rcall cekej04
			
			rjmp v_vyhodnocenimiss		//impulsy poslane, zařvi že ses netrefil

v_startmiss:in R16, PORTB
			mov R17, R16
			ori R16, 0b00000001	//připravení bitu na impulsy do časomíry
			out PORTB, R16		//jednička
			rcall cekej2ms
			out PORTB, R17		//nula     impuls START
			rcall cekej2ms
			rjmp bodymiss


v_vyhodnocenimiss:	//ldi ZH, 02
					//ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
					//ld R16, Z
					//dec R16	 
					//cpi R16, 0
					//breq v_resetdiodmiss	//poslední střela restuje svícení diod
					ldi R16, 3			//musí tam dát nějaký počet střel aby to pořád nestartovalo
					sts 0x0201, R16
					rcall zvukmiss
					rjmp TSOP		//pokud to není poslední strela skočí zpět na zjistovani z TSOP

//v_resetdiodmiss:	ldi R16, 31
//					sts 0x0201, R16		//nahrání opět plného počtu diod a skok zpátky
//					rcall zvukhit
//					rjmp TSOP

//////////////////////////////////////////////////////////////////////////////
/////////////konec miss při volní střelbě///////////////////////////////
////////////////////////////////////////////////////////////////////////


//petibojmiss:
//dostovkymiss:

/////////////////////////////////////////////////////////////////////////////
///////////miss při časovači//////////////////////////////
/////////////////////////////////////////////////////////////////

nacasmiss:	ldi ZH, 02
			ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
			ld R16, Z
			ldi ZH, 02
			ldi ZL, 02		//pozice 0x0202 (počet zbývajících střel pro porovnání)
			ld R17, Z
			cp R16, R17
			breq n_startmiss		//pokud je to první střela, pošle impuls START do casomiry (A7)
			

n_bodymiss:	in R16, PORTB
			mov R17, R16
			ori R16, 0b00000011	//připravení bitu na impulsy do časomíry a čitače
			out PORTB, R16			//nejprve samotný impuls zasah do obou periferii	
			rcall cekej04
			out PORTB, R17			//s 2ms přestávkou
			rcall cekej2ms
			andi R16, 0b00000010	//dalsi impulsy posilam jenom do citace

			out PORTB, R16		//a pak jeden impuls jako ze to byla nula
			rcall cekej04
			out PORTB, R17
			rcall cekej04
			
			rjmp n_vyhodnocenimiss		//impulsy poslane, zařvi že ses netrefil

n_startmiss:sei
			ldi R29, 201
			in R16, PORTB
			mov R17, R16
			ori R16, 0b00000001	//připravení bitu na impulsy do časomíry
			out PORTB, R16		//jednička
			rcall cekej2ms
			out PORTB, R17		//nula     impuls START
			rcall cekej2ms
			rjmp n_bodymiss			//pak pošle normální impuls ZASAHU

n_vyhodnocenimiss:ldi ZH, 02
				ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
				ld R16, Z
				dec R16	 
				cpi R16, 0
				breq n_stopmiss	//poslední střela spustí STOP impuls a pokračuje na reset
				sts 0x0201, R16
				rcall zvukmiss
				rjmp TSOP		//pokud to není poslední strela skočí zpět na zjistovani z TSOP

n_stopmiss:		cli
				rcall cekej24
				in R16, PORTB
				mov R17, R16			//17 nula
				ori R16, 0b00000011		//16 - jednička
				out PORTB, R16
				rcall cekej2ms
				out PORTB, R17		//STOP impuls
				rcall zvukmiss
				rjmp reset

//////////////////////////////////////////////////////////////////////
///////////konec vyhodnoceni miss casomira///////////////////////
////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////
////////normální vyhodnocení miss//////////////////////////////////
////////////////////////////////////////////////////////////////////

vyhodnocenimiss:ldi ZH, 02
				ldi ZL, 01		//pozice 0x0201 (počet zbývajících střel)
				ld R16, Z
				dec R16	 
				cpi R16, 0
				breq stopmiss	//poslední střela spustí STOP impuls a pokračuje na reset
				sts 0x0201, R16
				rcall zvukmiss
				rjmp TSOP		//pokud to není poslední strela skočí zpět na zjistovani z TSOP

stopmiss:		rcall cekej24
				in R16, PORTB
				mov R17, R16			//17 nula
				ori R16, 0b00000011		//16 - jednička
				out PORTB, R16
				rcall cekej2ms
				out PORTB, R17		//STOP impuls
				rcall zvukmiss
				rjmp reset
		


///////////////////////////////////////////////////////////////
/////RESET///////////////////////////////////////////////////
//////////////////reset pocka na přístí ránu z pušky (pouze TSOP) //////////////////////////
//////////////////a vyresetuje cely program////////////////////////////////////ú
/////////////pokud zmačknu tlačítko tak program přepne, pokud ne, resetuje se stejný program při další střele///////
reset:			rcall cekej200
resettlacitka:	in R16, PIND				//podle stisknutého tlačítka 
				cpi R16, 0b11111110			//pri resetu z tlacitka se spusti novy program
				breq pr1				
				cpi R16, 0b11111101
				breq pr2
				cpi R16, 0b11111011
				breq pr3
				cpi R16, 0b11110111
				breq pr4
				cpi R16, 0b11101111
				breq pr5
				cpi R16, 0b11011111
				breq pr6
				cpi R16, 0b10111111
				breq pr7
				cpi R16, 0b01111111
				breq pr8
				rjmp TSOPreset

	pr1: 	rcall resetimpuls
			rjmp program1		//skoky
	pr2: 	rcall resetimpuls
			rjmp program2
	pr3: 	rcall resetimpuls
			rjmp program3
	pr4: 	rcall resetimpuls
			rjmp program4
	pr5: 	rcall resetimpuls
			rjmp program5
	pr6: 	rcall resetimpuls
			rjmp program6
	pr7: 	rcall resetimpuls
			rjmp program7
	pr8: 	rcall resetimpuls
			rjmp program8
	
TSOPreset:	in 		R16, PINB				///pri RESETu střelou se resetuje stejný program
			andi 	R16, 	0b10000000
			cpi 	R16, 	0b10000000
			breq TSOPkontola2
			in 		R16, PINB
			andi 	R16, 	0b01000000
			cpi 	R16, 	0b01000000	
			breq TSOPkontola2
			in 		R16, PINB
			andi 	R16, 	0b00100000
			cpi 	R16, 	0b00100000			//dvojitá kontrola signálu z TSOP!
			breq TSOPkontola2
			in 		R16, PINB
			andi 	R16, 	0b00010000
			cpi 	R16, 	0b00010000	
			breq TSOPkontola2
			rjmp resettlacitka

TSOPkontola2: rcall cekej04
			in 		R16, PINB
			andi 	R16, 	0b10000000
			cpi 	R16, 	0b10000000
			breq RESETstejny
			in 		R16, PINB
			andi 	R16, 	0b01000000
			cpi 	R16, 	0b01000000			//dvojitá kontrola signálu z TSOP!
			breq RESETstejny
			in 		R16, PINB
			andi 	R16, 	0b00100000
			cpi 	R16, 	0b00100000	
			breq RESETstejny
			in 		R16, PINB
			andi 	R16, 	0b00010000
			cpi 	R16, 	0b00010000	
			breq RESETstejny

RESETstejny:ldi ZH, 02	
			ldi ZL, 0
			ld R16, Z
				cpi R16, 1
				breq pr1				
				cpi R16, 2
				breq pr2
				cpi R16, 3
				breq pr3
				cpi R16, 4
				breq pr4
				cpi R16, 5
				breq pr5
				cpi R16, 6
				breq pr6
				cpi R16, 7
				breq pr7
				cpi R16, 8
				breq pr8
				rjmp TSOPreset
//////////////////////////////////////////////////////////////////////////
/////RESET konec/////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////
///zpozdeni////////////////////////////////////////
////////////////////////////////////////////////////////////////

cekej1:
			ldi R17, 5			//cca 1s (R17 5)
	d1:		ldi R18, 0
	d2:		ldi R19, 0
	d3:		dec R19
		
			brne d3
			dec R18
			brne d2
			dec R17
			brne d1
	
				ret

cekej200:			//cca 200ms 
			
			ldi R18, 0
	b1:		ldi R19, 0
	b2:		dec R19
		
			brne b2
			dec R18
			brne b1
			
				ret

cekej24:
			 						//cca 24mss (R17 neni)
			ldi R18, 60
	g1:		ldi R19, 0
	g2:		dec R19
		
			brne g2
			dec R18
			brne g1
			
				ret

cekej2ms:			//2ms skoro přesně (R18 = 3, R19 = 221
			ldi R18, 3
	c1:		ldi R19, 221
	c2:		dec R19
			brne c2
			dec R18
			brne c1
				ret

cekej04:		//cca 400us (R19 = 132)
			ldi R20, 132
	w1:		dec R20
			brne w1
			ret

cekejkontrola:		//cca 54us (R19 = 18)
			ldi R20, 18
	v1:		dec R20
			brne v1
			ret

f1kHz:		 						//projede za 0,5ms 
			ldi R18, 5				//neboli vytvoří frekvenci 1kHz
	e1:		ldi R19, 32				//protože musim zapnout PORT, 0,5ms počkat
	e2:		dec R19					//vypnout port a znovu počkat takže dohromady 1ms
			brne e2	
			dec R18
			brne e1
			
			ret

f2kHz:		 						//projede za 0,24ms 
			ldi R18, 5				//neboli vytvoří frekvenci 2kHz
	a1:		ldi R19, 15
	a2:		dec R19
			brne a2	
			dec R18
			brne a1
			
			ret

resetimpuls:	rcall cekej1
				in R16, PORTB
				mov R17, R16			//17 nula
				ori R16, 0b00000011		//16 - jednička
				out PORTB, R16
				rcall cekej2ms
				out PORTB, R17
				rcall cekej2ms		//STOP impuls

				ldi R16, 0 // uložení čísla 0 na všechny
				sts 0x0200, r16
				sts 0x0201, r16
				sts 0x0202, r16
				sts 0x0203, r16
				sts 0x0206, r16
 
				ldi R19, 0			//nulovani registrů
				ldi R17, 0
				ldi R18, 0
				ldi R20, 0
				ldi R21, 0
				ldi R22, 0
				ldi R23, 0
				ldi R24, 0
				ldi R25, 0

				rcall cekej1



				ret

////////////////////////////////////////////////////////////////
//////////podprogram zvuk při trefě////////////////////////////ú
///////////////////////////////////////////////////////

zvukhit:		in R16, PINB
				mov R17, R16			//nula
				ori R16, 0b00000100 	//jednicka - maska pro reproduktor
				ldi R20, 0xFF
zvukhit2:		out PORTB, R16
				rcall f2kHz
				out PORTB, R17
				rcall f2kHz
				dec R20
				brne zvukhit2
				ret


////////////////////////////////////////////////////////////////
//////////podprogram zvuk při tresouci se ruce////////////////////////////ú
///////////////////////////////////////////////////////

zvukmiss:		in R16, PINB
				mov R17, R16			//nula
				ori R16, 0b00000100 	//jednicka - maska pro reproduktor
				ldi R20, 0x20
zvukmiss1:		out PORTB, R16
				rcall f1kHz
				out PORTB, R17
				rcall f1kHz
				dec R20
				brne zvukmiss1

				rcall cekej24 
				rcall cekej24 
				ldi R27, 0x20

zvukmiss2: 		out PORTB, R16		//zvuk 1kHz 2x
				rcall f1kHz
				out PORTB, R17
				rcall f1kHz
				dec R27
				brne zvukmiss2								

				ret



