#include <avr/io.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include "program_novy.h"

unsigned char data_rec;	// premenná, do ktorej sa ukladajú prijaté dáta (po zachytení adresy)
unsigned char gencall;	// premenná, do ktorej sa ukladajú prijaté dáta (po zachytení všeobecného volania)

unsigned char gencall3=0b11000000;	// obsah dát, ktoré odosiela riadiaca doska pri 	
unsigned char gencall2=0b10000000;	// všeobecnom volaní (záleží na hodnote nack)
unsigned char gencall1=0b01000000;
unsigned char gencall0=0b00000000;


unsigned char adresa = 1;		// hodnota adresy, ktorá sa aktuálne priraďuje (počiatočná hodnota 1)
unsigned char adresadek = 0;	// hodnota poslednej priadenej adresy

extern unsigned char ch,k;		// pomocné premenné
unsigned char i,j;				// premenné určujúce index v poli dosky, pri procese priraďovania adries
unsigned char nack=1;			// počet nepotvrdených dosiek, počiatočná hodnota 1
unsigned char dosky [8][8];		// pole, ktorého sa zapisujú adresy a poloha dosiek v zoskupení

unsigned char setL= 0b00000010;	// dáta, ktoré posiela riadiaca doska pri procese prideľovania adries
unsigned char setD= 0b00000011;	// podľa hodnoty premennej nack 
unsigned char setR= 0;
unsigned char setU= 0b00000001;

extern unsigned char master;   	// premenná, ktorá určuje status dosky : 0->podriadená, 1->riadiaca		

unsigned char init = 0b11111;	// štartovacia adresa pre podriadené dosky 

unsigned char status_write;		// výstupná hodnota funkcie odosielanie (určuje či adresovaná doska rozoznala svoju adresu)
unsigned char kont = 0;			// pomocná premenná, zapíše sa do nej oddelený kód pinu
unsigned char init_end=0;		// premenná určuje či sa proces pridelovania adries už skončil(1) alebo nie (0)
extern unsigned char offset;	// parameter svetelného efektu, časový offset
extern unsigned char data_slave;// premenná, ktorú podriadená doska odosiela riadiacej, určuje či a kde vznikol svetelných efekt 
unsigned char offset1 = (4<<4);	// premenná určuje hodnotu offset (v rámci odoslané bytu sa nachádza vo vyššom nibli, preto bitový posun)


void twi_init (void);			// funkcia, ktorá riadi proces prideľovania adries
unsigned char twi_start_address(unsigned char slave,unsigned char rw);	// funkcia na odosielanie adresy a R/W bitu
void twi_write(unsigned char data );	// funkcia na odoslanie dát
void twi_stop( void );			// vyšle na zbernicu ukončovací signál
unsigned char twi_read (void);	// funkcia uloží prijaté dáta

void delay (void);				// funkcia zdržania (prázdny cyklus)
void pin_init(void);			// funkcia na určenie statusu dosky
void registry_master(void);		// nastavenie registrov pre riadiacu dosku
void registry_slave(void);		// nastavenie registrov pore podriadenú dosku


void gen (unsigned char gencall);	// funkcia na analýzu dát prijatých po všeobecnom volaní
void data_receive (unsigned char data_rec);	// funkcia na analýzu dát prijatých po rozoznaní adresy dosky
void set_parameters	(unsigned char max1,unsigned char offset);	// funkcia zapíše parametre efektu do pola fronta
void twi_zapis (unsigned char adresa, unsigned char data);	// odoslanie adresy a dát
void dosky_switch (unsigned char receive, unsigned char index1, unsigned char index2);	//zariadi poslanie informácii o reakciu pre susedné dosky


ISR (TWI_vect);					// obsluha prerušenia po činnosti na zbernici


void registry_master (void)		// nastavenie registrov pre riadiacu dosku
{
	DDRC = (0<<PC0)|(0<<PC1);
	PORTC = (1<<PC0)|(1<<PC1);	// aktivácia pull-up rezistorov
	
	TWBR =	72; 				// nastavenie frekvencie hodinového signálu -> 100 kHz
	TWSR = (0<<TWPS1)|(0<<TWPS0);	// nastavenie preddeličiek -> 0
}


void registry_slave (void)		// nastavenie registrov pore podriadenú dosku
{
	TWAR = (init<<TWA0)|(1<<TWGCE);		// nastavenie adresového registra
		// TWA -> adresa, štartovacia hodnota
		// TWGCE -> povolenie zachytenia všeobecného volania
	TWCR = (1<<TWEN)|(1<<TWEA)|(1<<TWIE);

	DDRD &= ~(!0<<PD2);	
	DDRC &= ~(!0<<PC3);
}


void pin_init(void)			// funkcia na určenie statusu dosky
{
	DDRB = (0<<PB1);			//pin horný ako vstupný a v 1
	PORTB = (1<<PB1);
	DDRC = (1<<PC3)|(0<<PC4);	// pin dolný ako výstupný v 0 (PC3), pin ľavý ako vstupný v 1 (PC4)
	PORTC = (0<<PC3)|(1<<PC4);	
	DDRD = (1<<PD2);			//pin pravý ako výstupný v 0
	PORTD = (0<<PD2);

	for (k=0;k<255;k++)		// čakanie na ostatné dosky
		{
			delay();
			delay();
			delay();
			delay();
			delay();
			delay();
			delay();
			delay();
		}

		
	if (bit_is_set(PINB,1))				// testovanie horného pinu
		{
			if (bit_is_set(PINC,4))		// testovanie ľavého pinu
				{
					master=1;			// ak sú oba nastavené, dlaždica je v lavom hornom rohu => riadiace doska
				}
			else
				{
					master=0;
				
				}				
		}

	else 
		{
			master=0;					// ak je jeden z nich na nízkej úrovni => podriadená doska
		}	
	
	for (k=0;k<255;k++)		// čakanie na ďalšie dosky
		{
			delay();
			delay();
			delay();
			delay();
			delay();
			delay();
			delay();
			delay();
		}

}


void twi_init (void)		// funkcia, ktorá riadi proces prideľovania adries
{	
	DDRD |= (1<<PD2); 		// nastaví si pin pravý ako výstupný, do 0
	PORTD &= ~(!0<<PD2);
	DDRC &= ~(!0<<PC3);

	dosky [0][0] = 0xFF;	// riadiaca doska sa zapíše do pola dosky, na index 0,0

	for (k=0;k<255;k++)		// čakanie kým si podriadené dosky nastavia registre
		{
			delay();
			delay();
			delay();
		}

	i=0;					// vynulovanie indexov
	j=0;
	
	while ((nack>0)&(nack<3))	// cyklus beží ak je nack kladné alebo menšie ako 3
		{		
																		
			switch (nack-1)
				{
					case 0:	j++;							// posunutie indexu pola doska doprava
							status_write = twi_start_address(0,0);		// prvé oslovenie slaves 
							twi_write((gencall0+adresa));	// podriadená doska má skontrolovať či je ľavý pin v 0, ak áno nastaví si adresu akú prijal
							break;

					case 1: j--;							// posunutie naspäť a dole
							i++;
							status_write = twi_start_address(0,0);
							twi_write((gencall1+adresa));	// podriadená doska má skontrolovať či je horný pin v 0, ak áno nastaví si adresu akú prijal
							break;
				}

			// čakanie na dokončenie operácií na podriadenej doske
		

			delay();
					
			status_write = twi_start_address(adresa,0);	// odošle na danú adresu (slave čo susedí s masterom by si ju mal nastaviť)
			twi_write(setR);							// podriadená doska má si nastaviť pin UP do 1

			
			if (status_write == 1)						// ak zachytí ACK, tj. podriadená doska si nastavil adresu
				{
					dosky [i][j] = adresa;				// zápis do poľa dosky
					adresa++;							// adresa sa inkrementuje, premenná nack do 0 (0 nepotvrdených)
					nack = 0;
					status_write = 0;
				}
			else 
				{
							// riadiaca doska si nastaví ako výstupný a do 0 pin LEFT
					DDRC |= (1<<PC3);
					PORTC &= ~(!0<<PC3);
					nack++;	
					status_write = 0;					// keď je počet nepotvrdených 3, tj. Master nemá suseda, cyklus skončí, a inicializácia nepokračuje
				}
		}		

	
	DDRC &= ~(!0<<PC3);	// riadiaca doska si piny nastaví na vstupné
	DDRD &= ~(!0<<PD2);


	while ((nack < 4) & (adresa>1)) 	// smyčka beží dovtedy dokial existujú susedné dosky, tj. počet nepotvrdených je menší ako 3
		{
		
			adresadek = adresa -1;		// adresadek je aposledná nastavená adresa
	
			switch (nack)				// rovnaká funkcia ako v predošlej smyčke
				{
					case 0:	j++;
							status_write = twi_start_address(0,0);			
							twi_write((gencall0+adresa));
							break;

					case 1: j--;
							i++;
							status_write = twi_start_address(0,0);
							twi_write((gencall1+adresa));
							break;

					case 2:	i--;
							j--;
							status_write = twi_start_address(0,0); 
							twi_write((gencall2+adresa));
							break;

					case 3:	j++;
							i++;
							status_write = twi_start_address(0,0);
							twi_write((gencall3+adresa));
							break;
				}	

			delay();
		
			status_write = twi_start_address(adresa,0);	// odošle na danú adresu (slave čo susedí s masterom by si ju mal nastaviť)
			twi_write(setR);			// podriadená doska má si nastaviť pravý pin do 1

		
			if (status_write == 1)					// ak zachytí ACK, inkrementuje adresu
					{
						if ((i<8)&(j<8)&(i>=0)&(j>=0))	// overenie či nie je index mimo pola dosky
							{
								dosky [i][j] = adresa;	// zápis do pola dosky
								adresa++;				// adresa sa inkrementuje, pravý pin do 0
								nack= 0;				// vynuluje sa počet nepotvrdených,tj. v ďalšom kroku sa budú hladať dosky napravo od poslednej naadresovanej 
								status_write = 0 ;
							}
						else 
							{
								nack = 4;				// ukončenie inicializácie
								status_write = 0 ;
							}
					}
			else 
					{
						switch (nack)					// ak sa na danej adrese nikto neozval
						{
							case 0:	status_write = twi_start_address(adresadek,0);	// riadiaca doska pošle predošlej naadresovanej doske, aby si nastavila iný pin (postupne piny D,L,U)
									twi_write(setD);	// podla počtu nepotvrdených dosiek
									
									break;
			 
							case 1:	status_write = twi_start_address(adresadek,0);
									twi_write(setL);
									
									break;

							case 2: status_write = twi_start_address(adresadek,0);
									twi_write(setU);
									
									break;

							default : nack++;						// ak je počet nepotvrdených 4, tj. okolo posledne naadresovanej dosky už nie je iná doska bez adresy
						}											// inicializácia sa ukončí
				
						delay();
						nack++;
			
					}
		}
	
	if (adresa > 1)			// koniec inicializácie (ak je adresa = 1, master nemá susedov)
		{
			status_write = twi_start_address(0,0); 	// oznámenie podriadeným doskám, že inicializácia skončila
			twi_write(0b11111111);

			
			twi_stop();
			adresadek = adresa-1;	// zapísanie max. hodnoty adresy (ak je len jedna doska adresadek =0)
		}
}



//-------------------------------------------------------------------------------------------
//Funkcie pre komunikáciu po zbernici I2C
//-------------------------------------------------------------------------------------------

// funkcia na odosielanie adresy a R/W bitu
unsigned char twi_start_address(unsigned char slave, unsigned char rw ) 
{
	TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)|(1<<TWEA) ;
							// vyslání startovací podmínky
							// TWINT...TWI Interrupt Flag
							// TWSTA...TWI Start Condition Bit
							// TWEN....TWI Enable Bit
	while( !( TWCR & (1<<TWINT))) ;
							// čekání na dokončení operace, tj. TWINT=1

	TWDR = (slave<<1)+ rw ;		// načtení adresy a write bitu do datového registru
	TWCR = (1<<TWINT) | (1<<TWEN) ;
							// vyslání slave adresy + write bitu
							// TWINT...TWI Interrupt Flag
							// TWEN....TWI Enable Bit
	while( !( TWCR & (1<<TWINT))) ;
							// čekání na dokončení operace, tj. TWINT=1
	
	status_write = (TWSR & 0xF8);	// uloženie statusu (maskovanie bitov preddeličky)

	if (status_write == 0x18)	//	prijatie ACK
		{
			return 1;
		}
	else if (status_write == 0x20)	// prijatie NACK
		{
			return 2;
		}

	else 						// iný status
		{
			return 0;
		}
}

// funkcia na odoslanie dát
void twi_write( unsigned char data )
{
	TWDR = data ;			// načtení datového paketu do datového registru
	TWCR = (1<<TWINT) | (1<<TWEN) ;
							// vyslání datového paketu
							// TWINT...TWI Interrupt Flag
							// TWEN....TWI Enable Bit
	while( !( TWCR & (1<<TWINT))) ;
							// čekání na dokončení operace, tj. TWINT=1
}

// vyšle na zbernicu ukončovací signál
void twi_stop( void )
{
	TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN) ;
							// vyslání ukončovací podmínky
							// TWINT...TWI Interrupt Flag
							// TWSTO...TWI Stop Condition Bit
							// TWEN....TWI Enable Bit
}

// funkcia uloží prijaté dáta
unsigned char twi_read (void)
{
	TWCR = (1<<TWINT) | (1<<TWEN) ;

	while( !( TWCR & (1<<TWINT))) ;

	return TWDR;
}

// funkcia oneskoreni (prázdny cykly)
void delay (void)
{
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
	for (ch=0; ch<255;ch++);
}


//----------------------------------------------------------------------------------------------
//TWI_Slave : obluha prerušia a funkcie
//----------------------------------------------------------------------------------------------

ISR(TWI_vect)
{
	switch (TWSR & 0xF8)
	{
		// TWINT...TWI Interrupt Flag ... znak prerušenia
		// TWEA... TWI Enable Acknowlegment bit ... povolenie odoslania potvrdenia
		// TWEN....TWI Enable Bit ... aktivácia TWI
		// TWIE....TWI Interupt Enable Bit ... povolenie prerušenia pri činnosti TWI

		//GENERAL CALL
		case 0x70:
					TWCR = (1<<TWINT)|(1<<TWEN)|(0<<TWEA)|(1<<TWIE) ;		// data budú prijaté, poslaný NACK
					break;

		case 0x98:		
					gencall = TWDR;											// uloženie prijatých dát
										
					gen(gencall);	// volanie funkcie na analýzu prijatých dát						

					TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE) ;		// data boli prijaté, poslaný NACK,prepnutie do neadresovaného módu
					break;				


		//SLAVE RECEIVER
		case 0x60:
					TWCR = (1<<TWINT)|(1<<TWEN)|(0<<TWEA)|(1<<TWIE) ;		// data budú prijaté, poslaný  NACK
					break;

		case 0x88:
					data_rec = TWDR;										//uloženie prijatých dát
						
					data_receive (data_rec);	// volanie funkcie na analýzu prijatých dát

					TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE) ;		// data boli prijaté, poslaný NACK, prepnutie do neadresovaného módu
					break;


		//SLAVE TRANSMITTER
		case 0xA8:
					TWDR = data_slave;										// uloženie dát na poslanie do TWDR
					data_slave = 0;											// nulovanie premennej
					TWCR = (1<<TWINT)|(1<<TWEN)|(0<<TWEA)|(1<<TWIE) ;		// odoslanie dát
					break;

		case 0xC0:															// prechod do neadresovaného módu
					TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE) ;
					break;
					
		default : 	// všeobecná odozva
					TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(1<<TWIE) ;
					break;
	}
}


void gen (unsigned char gencall)	// funkcia pre kontrolu pinov pri určovaní adries	
{
	
	if (gencall != 0xFF)	// kontrola či nebolo prijatá inf. o ukončení procesu prideľovania adries
		{
			if (TWAR == ((init<<1)+1))
			{

			adresa = (gencall & 0b00111111);	//oddelenie adresy a kódu pinu z prijatých dát
			kont = (gencall >> 6);

	

			switch (kont)
			{
				case 0:	
						DDRC &= ~(!0<<PC4);				//kontroluje pin ľavý
						PORTC |= (1<<PC4);

						
						if(bit_is_clear(PINC,4))
							{
										TWAR = (adresa<<TWA0)|(1<<TWGCE);
										TWCR = (1<<TWEN)|(1<<TWEA)|(1<<TWIE);
							}

						break;
						
					
				case 1:
						DDRB &= ~(!0<<PB1);				//kontroluje pin horný
						PORTB |= (1<<PB1);


						if(bit_is_clear(PINB,1))
							{
										TWAR = (adresa<<TWA0)|(1<<TWGCE);
										TWCR = (1<<TWEN)|(1<<TWEA)|(1<<TWIE);
							}

						break;

				case 2:									// kontroluje pin pravý
						DDRD &= ~(!0<<PD2);
						PORTD |= (1<<PD2);


						if(bit_is_clear(PIND,2))
							{
										TWAR = (adresa<<TWA0)|(1<<TWGCE);		//nastaví novú adresu
										TWCR = (1<<TWEN)|(1<<TWEA)|(1<<TWIE);
							}

						break;
					

				case 3:								// kontroluje pin dolný
						DDRC &= ~(!0<<PC3);			
						PORTC |= (1<<PC3);


						if(bit_is_clear(PINC,3))
							{
										TWAR = (adresa<<TWA0)|(1<<TWGCE);
									 	TWCR = (1<<TWEN)|(1<<TWEA)|(1<<TWIE);
							}
	
						break;
			}
			}
		}

	else 			// ak majú prijaté dáta hodnotu 0xFF, koniec inicializácie
		{
				init_end = 1;
		}

}


void data_receive (unsigned char data_rec)	// funkcia na analýzu dát prijatých po rozoznaní adresy dosky	
{
	if (init_end==0)			// funkcia ktorá nastavuje piny podla prijatých dát (počas inicializácie)
		{
			switch (data_rec)
				{
					case 0:	DDRC &= ~(!0<<PC3);
							DDRC &= ~(!0<<PC4); 
							DDRB &= ~(!0<<PB1);

							DDRD |= (1<<PD2); // nastaví si pin pravý ako výstupný, do 0
							PORTD &= ~(!0<<PD2);
							break;	

					case 1:	DDRC &= ~(!0<<PC4);
							DDRB |= (1<<PB1); // nastaví si pin horný ako výstupný, do 0
							PORTB &= ~(!0<<PB1);
							break;

					case 2:	DDRC &= ~(!0<<PC3);
							DDRC |= (1<<PC4); // nastaví si pin ľavý ako výstupný, do 0
							PORTC &= ~(!0<<PC4);
							break;

					case 3:	DDRD &= ~(!0<<PD2); 
							DDRC |= (1<<PC3); // nastaví si pin dolný ako výstupný, do 0
							PORTC &= ~(!0<<PC3);
							break;

				}
		}
	else					// po inicializácii oddelí offset a kód fototranzistoru a nastaví efekt
		{
			offset = (data_rec >> 4);
			data_rec = (data_rec & 0b00001111);
			set_parameters (data_rec,offset);
		}

}

unsigned char find (unsigned char poradie)	// vyhľadanie adresy v poli dosky, súradnice uložené v premennej pomoc
{											// 4bity prvá súradnica, 4b druhá
	for (ch=0;ch<8;ch++)
		{
			for (k=0;k<8;k++)
				{
					if (dosky [ch][k] == poradie)
						{
							ch = (ch<<4);
							pomoc = (k+ch) ; 
							break;
						}
				
				}
		}

	return pomoc;		// vrátenie súradníc

}

void twi_zapis (unsigned char adresa, unsigned char data)		// odoslanie adresy a dát
{
	if (adresa  == 0xFF )										// ak je adresa 0xFF je to doska riadiaca
		{
			data_master_passive = (data+1);						// nastavenie efektu pre riadiacu dosku
		}

	else if (adresa >0)											//ak je adresa nenulová rozna od 0xFF tak sa jej pošlú príslušné data
		{
			status_write = twi_start_address(adresa,0);		
			twi_write(data);								
		}	
}

// funkcia zariadi poslanie informácii o reakciu pre susedné dosky
void dosky_switch (unsigned char receive, unsigned char index1, unsigned char index2)
{
	switch (receive)	// podla obsahu dát riadiaca doska odosiela ostatným doskám čo majú robiť
		{
			case 0:
					if (index1<7)			     //doska dole
						{
							adresa = dosky [index1+1][index2]; 	// o efekte, tj. akým efektom majú pokračovať (číslo fototr.) a
							twi_zapis (adresa,2+offset1);		// o kolko sa má oneskoriť oproti doske, na ktorej efekt začal 
						}	

					if ((index1<7)&(index2<7))	 //doska vpravo dole
						{
							adresa = dosky [index1+1][index2+1];
							twi_zapis (adresa,3+offset1);
						}
			
					if (index2<7)				//doska vpravo
						{
							adresa = dosky [index1][index2+1];
							twi_zapis (adresa,4);
						}

					if (index1>0)				//doska hore
						{
							adresa = dosky [index1-1][index2];
							twi_zapis (adresa,6+offset1);
						}
					
					if ((index2<7)&(index1>0))	//doska vpravo hore		
						{
							adresa = dosky [index1-1][index2+1];
							twi_zapis (adresa,5+offset1);
						}

					
					if ((index2>0)&(index1>0))	//doska vľavo hore
						{
							adresa = dosky [index1-1][index2-1];
							twi_zapis (adresa,0+offset1);	
						}

					if (index2>0)				// doska vľavo
						{
							adresa = dosky [index1][index2-1];
							twi_zapis (adresa,0+offset1);
						}
			
					if ((index1<7)&(index2>0))	//doska vľavo dole
						{
							adresa = dosky [index1+1][index2-1];
							twi_zapis (adresa,0+offset1);
						}

					break;

			case 1:
					if (index2<7)				//doska vpravo
						{
							adresa = dosky [index1][index2+1];
							twi_zapis (adresa,3);
						}

					if (index1>0)				//doska hore
						{
							adresa = dosky [index1-1][index2];
							twi_zapis (adresa,7);
						}
					
					if ((index2<7)&(index1>0))	//doska vpravo hore		
						{
							adresa = dosky [index1-1][index2+1];
							twi_zapis (adresa,5);
						}


					if (index1<7)				//doska dole
						{
							adresa = dosky [index1+1][index2];
							twi_zapis (adresa,2+offset1);
						}
					
					if ((index2>0)&(index1>0))	//doska vľavo hore
						{
							adresa = dosky [index1-1][index2-1];
							twi_zapis (adresa,0+offset1);	
						}

					if (index2>0)				// doska vľavo
						{
							adresa = dosky [index1][index2-1];
							twi_zapis (adresa,0+offset1);
						}
			
					if ((index1<7)&(index2>0))	//doska vľavo dole
						{
							adresa = dosky [index1+1][index2-1];
							twi_zapis (adresa,2+offset1);
						}	

					if ((index1<7)&(index2<7)) //doska vpravo dole
						{
							adresa = dosky [index1+1][index2+1];
							twi_zapis (adresa,2+offset1);
						}

					break;
		
			case 2: 									
					if (index2>0) 				//doska naľavo
						{	
							adresa = dosky [index1][index2-1];	
							twi_zapis (adresa,0+offset1);		
						}
					
					if ((index1>0)&(index2>0))	//doska vľavo hore		
						{
							adresa = dosky [index1-1][index2-1];
							twi_zapis (adresa,0+offset1);	
						}					

					if (index1>0)				//doska hore
						{
							adresa = dosky [index1-1][index2];
							twi_zapis (adresa,6);
						}						

					if ((index2<7)&(index1>0))	//doska vpravo hore		
						{
							adresa = dosky [index1-1][index2+1];
							twi_zapis (adresa,4+offset1);
						}
					
					if (index2<7)				//doska vpravo
						{  					
							adresa = dosky [index1][index2+1];
							twi_zapis (adresa,4+offset1);				
						}
		

					if ((index1<7)&(index2>0))	//doska vľavo dole
						{
							adresa = dosky [index1+1][index2-1];
							twi_zapis (adresa,2+offset1);
						}	

					if ((index1<7)&(index2<7)) //doska vpravo dole
						{
							adresa = dosky [index1+1][index2+1];
							twi_zapis (adresa,2+offset1);
						}

					if (index1<7)				//doska dole
						{
							adresa = dosky [index1+1][index2];
							twi_zapis (adresa,2+offset1);
						}

					break;


			case 3:
					if ((index2>0)&(index1>0))	//doska vľavo hore
						{
							adresa = dosky [index1-1][index2-1];
							twi_zapis (adresa,7);	
						}

					if (index1>0)				//doska hore
						{
							adresa = dosky [index1-1][index2];
							twi_zapis (adresa,5);
						}

					if (index2>0)				// doska vľavo
						{
							adresa = dosky [index1][index2-1];
							twi_zapis (adresa,1);
						}


					if ((index1<7)&(index2>0))	//doska vľavo dole
						{
							adresa = dosky [index1+1][index2-1];
							twi_zapis (adresa,2+offset1);
						}	

					if ((index1<7)&(index2<7)) //doska vpravo dole
						{
							adresa = dosky [index1+1][index2+1];
							twi_zapis (adresa,3+offset1);
						}

					if (index1<7)				//doska dole
						{
							adresa = dosky [index1+1][index2];
							twi_zapis (adresa,2+offset1);
						}

					if ((index2<7)&(index1>0))	//doska vpravo hore		
						{
							adresa = dosky [index1-1][index2+1];
							twi_zapis (adresa,4+offset1);
						}
					
					if (index2<7)				//doska vpravo
						{  					
							adresa = dosky [index1][index2+1];
							twi_zapis (adresa,4+offset1);				
						}

					break;

			case 4:	
					if ((index2>0)&(index1>0))	//doska vľavo hore
						{
							adresa = dosky [index1-1][index2-1];
							twi_zapis (adresa,6+offset1);	
						}
					
					if (index1>0)				//doska hore
						{
							adresa = dosky [index1-1][index2];
							twi_zapis (adresa,6+offset1);
						}

					if (index2>0)				// doska vľavo
						{
							adresa = dosky [index1][index2-1];
							twi_zapis (adresa,0);
						}
			
					if ((index1<7)&(index2>0))	//doska vľavo dole
						{
							adresa = dosky [index1+1][index2-1];
							twi_zapis (adresa,2+offset1);
						}

					if (index1<7)				//doska dole
						{
							adresa = dosky [index1+1][index2];
							twi_zapis (adresa,2+offset1);
						}	
				
						
					if ((index1<7)&(index2<7)) //doska vpravo dole
						{
							adresa = dosky [index1+1][index2+1];
							twi_zapis (adresa,4+offset1);
						}

					if ((index2<7)&(index1>0))	//doska vpravo hore		
						{
							adresa = dosky [index1-1][index2+1];
							twi_zapis (adresa,4+offset1);
						}
					
					if (index2<7)				//doska vpravo
						{  					
							adresa = dosky [index1][index2+1];
							twi_zapis (adresa,4+offset1);				
						}	
				
					break;

			case 5:
					if (index2>0)				// doska vľavo
						{
							adresa = dosky [index1][index2-1];
							twi_zapis (adresa,7);
						}
					
					if ((index1<7)&(index2>0))	//doska vľavo dole
						{
							adresa = dosky [index1+1][index2-1];
							twi_zapis (adresa,1);
						}

					if (index1<7)				//doska dole
						{
							adresa = dosky [index1+1][index2];
							twi_zapis (adresa,3);
						}	


					if ((index1<7)&(index2<7)) //doska vpravo dole
						{
							adresa = dosky [index1+1][index2+1];
							twi_zapis (adresa,4+offset1);
						}

					if ((index2<7)&(index1>0))	//doska vpravo hore		
						{
							adresa = dosky [index1-1][index2+1];
							twi_zapis (adresa,5+offset1);
						}
					
					if (index2<7)				//doska vpravo
						{  					
							adresa = dosky [index1][index2+1];
							twi_zapis (adresa,4+offset1);				
						}

					if ((index2>0)&(index1>0))	//doska vľavo hore
						{
							adresa = dosky [index1-1][index2-1];
							twi_zapis (adresa,6+offset1);	
						}
					
					if (index1>0)				//doska hore
						{
							adresa = dosky [index1-1][index2];
							twi_zapis (adresa,6+offset1);
						}					
					
					break;

			case 6:
					if (index2>0)				// doska vľavo
						{
							adresa = dosky [index1][index2-1];
							twi_zapis (adresa,0+offset1);
						}
					
					if ((index1<7)&(index2>0))	//doska vľavo dole
						{
							adresa = dosky [index1+1][index2-1];
							twi_zapis (adresa,0+offset1);
						}

					if (index1<7)				//doska dole
						{
							adresa = dosky [index1+1][index2];
							twi_zapis (adresa,2);
						}	

					if ((index1<7)&(index2<7)) //doska vpravo dole
						{
							adresa = dosky [index1+1][index2+1];
							twi_zapis (adresa,4+offset1);
						}
			
					if (index2<7)				//doska vpravo
						{
							adresa = dosky [index1][index2+1];
							twi_zapis (adresa,4+offset1);
						}


					if ((index2>0)&(index1>0))	//doska vľavo hore
						{
							adresa = dosky [index1-1][index2-1];
							twi_zapis (adresa,6+offset1);	
						}
					
					if (index1>0)				//doska hore
						{
							adresa = dosky [index1-1][index2];
							twi_zapis (adresa,6+offset1);
						}	

   					if ((index2<7)&(index1>0))	//doska vpravo hore		
						{
							adresa = dosky [index1-1][index2+1];
							twi_zapis (adresa,6+offset1);
						}
					
					break;

			case 7:
					if (index1<7)				//doska dole
						{
							adresa = dosky [index1+1][index2];
							twi_zapis (adresa,1);
						}	

					if ((index1<7)&(index2<7)) //doska vpravo dole
						{
							adresa = dosky [index1+1][index2+1];
							twi_zapis (adresa,3);
						}
			
					if (index2<7)				//doska vpravo
						{
							adresa = dosky [index1][index2+1];
							twi_zapis (adresa,5);
						}

					if (index2>0)				// doska vľavo
						{
							adresa = dosky [index1][index2-1];
							twi_zapis (adresa,0+offset1);
						}
					
					if ((index1<7)&(index2>0))	//doska vľavo dole
						{
							adresa = dosky [index1+1][index2-1];
							twi_zapis (adresa,0+offset1);
						}

					if ((index2>0)&(index1>0))	//doska vľavo hore
						{
							adresa = dosky [index1-1][index2-1];
							twi_zapis (adresa,7+offset1);	
						}

					if (index1>0)				//doska hore
						{
							adresa = dosky [index1-1][index2];
							twi_zapis (adresa,6+offset1);
						}	

   					if ((index2<7)&(index1>0))	//doska vpravo hore		
						{
							adresa = dosky [index1-1][index2+1];
							twi_zapis (adresa,6+offset1);
						}
					
					break;
		}
}			

