.include "m8def.inc"

.def	Temp0=R16
.def	Temp1=R17
.def	Temp2=R18
.def	Temp3=R19
.def	Temp4=R20
.def	Temp5=R21
.def	Temp6=R22

.dseg 

.cseg

.org 0

rjmp RESET ; Reset Handler
reti ;rjmp EXT_INT0 ; IRQ0 Handler
reti ;rjmp EXT_INT1 ; IRQ1 Handler
reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
reti ;rjmp TIM2_OVF ; Timer2 Overflow Handler
reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
reti ;rjmp USART_RXC ; USART RX Complete Handler
reti ;rjmp USART_UDRE ; UDR Empty Handler
reti ;rjmp USART_TXC ; USART TX Complete Handler
reti ;rjmp ADC_CC ; ADC Conversion Complete Handler
reti ;rjmp EE_RDY ; EEPROM Ready Handler
reti ;rjmp ANA_COMP ; Analog Comparator Handler
reti ;rjmp TWSI ; Two-wire Serial Interface Handler
reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler

RESET:
		ldi Temp0,high(RAMEND)
		out SPH,Temp0 
		ldi Temp0,low(RAMEND)
		out SPL,Temp0

		ldi Temp0,0b00101100		; 2-SS(CS), 3-MOSI(SDI), 4-MISO(SDO)вход, 5-SCK(SCL)   
		out DDRB,Temp0	
		
		sbi PORTB,2			// Вывод SS на +5 
		sbi PORTB,4 			// На MISO подключаем подтягивающий резистор 
		ldi temp0,0b11010001 		// Настраиваем SPI, SPIE и SPE = 1 это разрешит прерывания и протокол;
		out SPCR,temp0 			// MSTR = 1 говорит что мы руководим посылкой, SPR = 01 предделитель SPI
		
		clr temp3
		
		sei  
		
		ldi Temp1,0b11000000		; данные 				


		sub temp2,temp2			; clear remainder and carry
		ldi temp3,3			; init loop counter

shift_1:	
		rol Temp1			; shift left dividend
		dec temp3			; decrement counter
		brne shift_2			; if done
		;ret				; return
		rjmp spi_load							

shift_2:	
		rol temp2			; shift dividend into remainder		
		brcc shift_3			; if result negative		
		clc				; clear carry to be shifted into result
		rjmp shift_1			; else

shift_3:	
		sec				; set carry to be shifted into result

		
		mov temp4,temp2
		andi temp4,0b00000001

		cpi temp4,1
		breq up
		cbi PORTB,3			; MOSI(SDI)
		rjmp pc+2		
up:		
		sbi PORTB,3			; MOSI(SDI)	
		
		sbi PORTB,5			; SCK(SCL)		
		nop	
		cbi PORTB,5			; SCK(SCL)
		
		rjmp shift_1	
		
spi_load:

		ldi temp0,0b11100101		; данные 				
		out SPDR,temp0 			; отправляем бит по SPI
		

cycle:         
		rjmp cycle	
		 
SPI_STC:
		cli 								
		sbis SPSR, SPIF 					
		rjmp SPI_STC

		 
		sei		
		
		reti
