 cnt_H     		EQU         40h	   // Кол-во посылок которое неолбходимо отправить в КС
 cnt_L       	EQU         41h
 cnt_ERR_H		EQU			42h	   // счетчик ошибок в КС
 cnt_ERR_L		EQU			43h
 cnt_send_H		EQU			44h	   // счетчик отправленных посылок
 cnt_send_L		EQU			45h

 recur_reg1		EQU			20h	   // регистр1 рекуренты
 recur_reg2		EQU			21h	   // регистр2 рекуренты

	org		0000h
 		jmp		init				// переход на метку start (начало программы)
	org		0003h
		jmp		INT0_int			// переход по метке по прерыванию от внешнего источника
	org 	0023h
		jmp		UART_int
	org		0030h	

UART_int:
	mov A, SBUF
	clr RI
	reti	
						
init:
	mov SP,#70h
	mov TMOD,#21h
	mov TCON,#18h
	mov TH1,#0Fdh					// 9600 бит\сек
	mov TL1,#0Fdh

	mov DPTR,#0000h

	mov SCON,#50h	
	setb TR1	  
	mov		DPTR,#00h				// обнуляем наш программный счетчик 

start:
	mov		P0,#00h
	mov		P1,#00h
	mov		recur_reg1,#0FFh
	mov		recur_reg2,#00h

	mov		R5,#04h  // счетчик бит рекуренты

wait_for_cnt_H_UART:
	jnb		RI, wait_for_cnt_H_UART
	mov		cnt_H,SBUF
	clr RI

wait_for_cnt_L_UART:
	jnb		RI, wait_for_cnt_L_UART
	mov		cnt_L,SBUF

susa:

; >>>>>>>>>>>>>>>>>>>>>>>>>>>> Summ_1
	mov		A,recur_reg1
	anl		A,#01h
	mov 	R0,A

	mov		A,recur_reg2
	anl		A,#02h
	rr		A
	xrl		A,R0
	mov		R1,A
; >>>>>>>>>>>>>>>>>>>>>>>>>>>> Summ_2
	mov		A,recur_reg1
	anl		A,#10h
	rr		A
	rr		A
	rr		A
	rr		A
	mov 	R0,A

	mov		A,recur_reg2
	anl		A,#08h
	rr		A
	rr		A
	rr		A
	xrl		A,R0
	mov		R2,A
; >>>>>>>>>>>>>>>>>>>>>>>>>>>> Summ_3
	mov		A,recur_reg2
	anl		A,#80h

	jnb	ACC.7, xorA_R1
	mov A,#01h
xorA_R1:
	xrl		A,R1
	mov		R3,A

; >>>>>>>>>>>>>>>>>>>>>>>>>>>> Summ_4
	mov		A,recur_reg1
	anl		A,#40h 
	jnb		ACC.6, xorA_R2
	mov 	A,#01
xorA_R2:
	xrl		A,R2
	mov		R4,A

// сдвиг и замена 7го разряда 1го регистра
	mov		A,recur_reg1
	rr		A
	anl		A,#7Fh
	mov		recur_reg1,A

	mov		A,R3

	jz 		shift2
	orl		recur_reg1,#80h

// сдвиг и замена 0го разряда 2го регистра
shift2:
	mov		A,recur_reg2
	rl		A
	anl		A,#0FEh
	add		A,R4
	mov		21h,A
///////
	mov 	A,R3
	anl		A,#01h
	jz	zero
	setb	10h
zero:		   
	
	mov A,R5
	jz READY
	//сдвиг
	mov A,22h
	rl A
	mov 22h,A
	// декремент счетчика
	DEC	R5

	jmp susa
READY:	
	mov	P1,#00h
	mov A,22h
	anl A,#1Fh
	mov P1,A
	anl A,#00h
	mov 22h,A

	setb P0.5

	clr	P0.5

	//mov P1,#00h

	mov R5,#04h

	mov A,P0



wait_for_DONE:
	jnb	P0.1,wait_for_DONE

/////// увеличиваем счетчик посылок //////
	mov DPH, cnt_send_H			
	mov DPL, cnt_send_L	  
	inc DPTR			 
	mov cnt_send_H,DPH
	mov cnt_send_L,DPL
//////////////////////////////////////////
	
check_err:	
	jb P0.0,kanal_error
	jmp check_finish  

kanal_error:
/////// увеличиваем счетчик ошибок //////
	mov DPH,cnt_ERR_H
	mov DPL,cnt_ERR_L
	inc	DPTR
	mov cnt_ERR_H,DPH
	mov cnt_ERR_L,DPL
/////////////////////////////////////////

check_finish:

	mov A,cnt_send_H
	lcall Send_UART_stat

	mov A,cnt_send_L
	lcall Send_UART_stat

	mov A,cnt_ERR_H
	lcall Send_UART_stat

	mov A,cnt_ERR_L
	lcall Send_UART_stat

	mov A, cnt_send_H 
	cjne A,cnt_H,susa
	mov A, cnt_send_L
	cjne A,cnt_L,susa
/// Отправили нужое количество посылок 	  (нужно перейти в режим ожидания новой стартовой посылки)



	jmp start 

//	jmp susa


	jmp		$ 

Send_UART_stat:
	clr TI
	mov SBUF,A
	wait_flag:
		jnb	TI,wait_flag
	ret

// Прерывание от внешнего источника
INT0_int:
	clr		TI						// сбрасываем флаг передачи посл.порта.
	mov		SBUF,DPH				// записываем в последовательный порт старший байт счетчика
	wait_flag1:
	jnb		TI,wait_flag1			// ждем окончания передачи
	clr		TI						// сбрасываем флаг передачи посл.порта.
	mov		SBUF,DPL				// записываем в последовательный порт младший байт счетчика
	wait_flag2:
	jnb		TI,wait_flag2			// ждем окончания передачи
	clr		TI						// сбрасываем флаг передачи посл.порта.
	mov		SBUF,TH0				// записываем в последовательный порт старший байт регистра таймера
	wait_flag3:
	jnb		TI,wait_flag3			// ждем окончания передачи
	clr		TI						// сбрасываем флаг передачи посл.порта.
	mov		SBUF,TL0				// записываем в последовательный порт младший байт регистра таймера
	wait_flag4:
	jnb		TI,wait_flag4			// ждем окончания передачи
	clr		TI						// сбрасываем флаг передачи посл.порта.

	reti	
end.		   