/*
 * flash.asm
 *
 *  Created: 24.05.2013 22:12:33
 *   Author: donec
 */ 
.include "tn2313def.inc"
.device ATtiny2313
;
;.def	tmp5 			= r0
;.def	tmp6 			= r1
.def	sreg1			= r2		
.def	adr_sled_str0	= r3		
.def	adr_sled_str1	= r4		
.def	adr_sled_str2	= r5		
;.def	oborot			= r6		
.def	sreg_temp		= r7	
;.def	kol_reseve		= r8		
;.def		= r9
;.def		= r10
;.def	adr_kon3	= r11		
;.def	ost1		= r12		
;.def	ost2		= r13
;.def	ost3		= r14
;.def	n_zub 		= r15		
;
.def	tmp1			= r16		
.def	tmp2			= r17		
.def	spi_usidr		= r18		
.def	spi_cmd1		= r19		
.def	spi_cmd2		= r20		
.def	adr_tabl		= r21		
.def	adr_kon0		= r22		
.def	adr_kon1		= r23
.def	adr_kon2		= r24		
.def	oborot			= r25		
.def	adr_nach0		= r26		; XL
.def	adr_nach1		= r27		; XH
.def	adr_nach2		= r28		; YL
.def	kol_reseve		= r29		; YH
;.def	oborph		= r30		; ZL
;.def	oborpl		= r31		; ZH
;
.equ flash_start	=	0x000200
.cseg
.org 0
;
reset:  cli
		rjmp start_prog;			= 0x0001	
		rjmp reset;					= 0x0002	
		rjmp reset;					= 0x0003	
		rjmp Comp_matchA;  			= 0x0004	Timer/Counter1 Compare Match A
		rjmp reset;					= 0x0005	
		rjmp Overflow;				= 0x0006	Timer/Counter0 Overflow
		rjmp reset;					= 0x0007	
		rjmp reset;	URXCaddr		= 0x0008	
		rjmp reset;	URXC0addr		= 0x0009	
		rjmp reset;	UDREaddr		= 0x000a	
		rjmp reset;	UDRE0addr		= 0x000b	
		rjmp reset;	UTXCaddr		= 0x000c	
		rjmp reset;	UTXC0addr		= 0x000d	
		rjmp reset;	ACIaddr			= 0x000e	
		rjmp reset;	PCIaddr			= 0x000f	; 
		rjmp reset;	OC1Baddr		= 0x0010	; 
		rjmp reset;	OC0Aaddr		= 0x0011	; 
		rjmp reset;	OC0Baddr		= 0x0012	; 
;
start_prog:	ldi tmp1,low(ramend)
			out spl,tmp1
;
			sbi ACSR,ACD			;отключить питание компаратора
;

ldi r16,0x05
out TCCR1B,r16
ldi r16,0x02
out TCCR1A,r16
ldi r16,high(6000)
ldi r17,low(6000)
out OCR1AH,r16
out OCR1AL,r17



		ldi tmp1,0b00010000		;активировать /RESET (бит 3) и деактивировать /CS (бит 4)
		out PORTB,tmp1
		ldi tmp2,0b11011111		;порт на вывод
		out DDRB,tmp2

		ldi tmp2,0b00001010		;порт на ввод
		out DDRD,tmp2
		ldi tmp1,0b00111000
		out PORTD,tmp1
;
		ldi spi_cmd1,(1<<USIWM0)|(1<<USITC)				;нарастающий фронт без сдвига данных
		ldi spi_cmd2,(1<<USIWM0)|(1<<USITC)|(1<<USICLK)	;спадающий фронт со сдвигом данных
		ldi tmp1,(1<<USIWM0)							;сконфигурировать выход SPI как трехпроводный
		out usicr,tmp1
;
		ldi tmp1,7						;установить скорость UART 57600 бод
		clr tmp2
		out UBRRH,tmp2
		out UBRRL,tmp1
		ldi r16, (1<<RXEN)|(1<<TXEN)	;включить прием и передачу
		out UCSRB,r16
		ldi r16,(3<<UCSZ0)|(1<<USBS)	; Set frame format: 8data, 2 stop bit
		out UCSRC,r16
;
		ldi tmp2,(1<<CS12)|(1<<CS10)|(1<<WGM12)	;делитель на 1024, режим СТС сравнение с OCR1A
		out TCCR1B,tmp2
		ldi tmp2,(1<<OCIE1A)|(1<<TOIE0)	;включить прерывания по сравнению OCR1A и переполнению счетчика 0
		out TIMSK,tmp2
		ldi tmp1,4						;14-1 раз в секунду, 7-2 раза в секунду, 4-3,5 раза в секунду
		out OCR1AH,tmp1
		out OCR1AL,tmp1
;
		rcall delay
		rcall delay
		rcall delay
		sbi portb,pb3			;деактивировать /reset flash
;
		in tmp1,PIND
		andi tmp1,0b00110000
		brne s1
		rjmp format_flash		;обе перемычки установлены - форматирование flash
;
s1:		cpi tmp1,0b00100000		;PD4 - 0, вывод 8 (переключатель 2 включен)
		brne s2
		rjmp peredacha			;передача данных
;
s2:		cpi tmp1,0b00010000		;PD5 - 0, вывод 9 (переключатель 1 включен)
		brne m2
		rjmp priem				;прием данных
;
;********************************************************************
;вывод таблицы FAT													*
;********************************************************************
m2:					clr tmp1
					clr adr_nach0
					clr adr_nach1
					clr adr_nach2
					rcall busy				;ожидание готовности flash
					cbi portb,pb4			;установить CS
					ldi spi_usidr,0x03		;команда непрерывного чтения flash
					rcall kom_adr			;передать команду и адрес, адрес с нуля
;
fat0:				rcall spi_obmen			;чтение байта
fat1:				sbis  UCSRA,UDRE		;ожидание готовности UART
					rjmp  fat1
					out UDR,spi_usidr		;отправить на комп
;
					rcall spi_obmen			;чтение байта
fat2:				sbis  UCSRA,UDRE		;ожидание готовности UART
					rjmp  fat2
					out UDR,spi_usidr		;отправить на комп
;
					inc tmp1
					brne fat0
;
					sbi portb,pb4			;сбросить CS
;
m3:					rjmp m3					;обе перемычки сняты - stop
;
.include "spi.asm"
.include "Peredacha.asm"
.include "Priem.asm"
.include "Format.asm"



