;**********************************************************************
;Подпрограмма монитор.
;**********************************************************************
;Подпрограмма анализа сообщения.
an_con:
	bsf		STATUS,7		;Установка начального адреса 
	movlw	0x90			;буфера для чтения сообщения
	movwf	FSR
	clrf	tx_count		;Очистка счётчика передоваемых байт

	movfw	INDF			;Это отправка сообщения обратно?
	xorlw	'a'
	btfsc	STATUS,Z
	goto	init_tx			;ДА - отправляем сообщение обратно.

	movfw	INDF			;НЕТ - Это работа с памятью?
	xorlw	'm'
	btfss	STATUS,Z
	goto	$+.10			;НЕТ - идём дальше.
	incf	FSR,f			;ДА - Читаем следующий символ.	
	movfw	INDF			;Это чтение из памяти?
	xorlw	'r'
	btfsc	STATUS,Z
	goto	i_read_m		;ДА - читаем регистор.
	movfw	INDF			;НЕТ - Это запись в память?
	xorlw	'w'
	btfsc	STATUS,Z
	goto	writ_bite		;ДА - записываем в регистор.

	movfw	INDF			;Это читаем ячеёку EEPROM?
	xorlw	'e'
	btfss	STATUS,Z
	goto	$+.10			;НЕТ - идём дальше.
	incf	FSR,f			;ДА - Читаем следующий символ.	
	movfw	INDF			;Это чтение из EEPROM?
	xorlw	'r'
	btfsc	STATUS,Z
	goto	read_eeprom		;ДА - читаем регистор.
	movfw	INDF			;НЕТ - Это запись в память?
	xorlw	'w'
	btfsc	STATUS,Z
	goto	writ_eeprom		;ДА - записываем в регистор.

	movfw	INDF			;Это читаем ячеёку FLASH?
	xorlw	'f'
	btfss	STATUS,Z
	goto	$+.10			;НЕТ - идём дальше.
	incf	FSR,f			;ДА - Читаем следующий символ.	
	movfw	INDF			;Это чтение из FLASH?
	xorlw	'r'
	btfsc	STATUS,Z
	goto	read_flash		;ДА - читаем регистор.
	movfw	INDF			;НЕТ - Это запись в память?
	xorlw	'w'
	btfsc	STATUS,Z
	goto	writ_flash		;ДА - записываем в регистор.

con_next:
	bcf		PORTB,0
	bcf		f_stat,1		;ДА - Очищаем признак принятого сообщения
	bsf		RCSTA,4			;приём разрешен
	goto	main

;**********************************************************************
;Подпрограмма иницилизации для передачи сообщения обратно в USART.
init_tx:
	incf	FSR,f			;ДА-Установливаем адрес считывания
	decf	rx_count,w		;yстановливаем кол-во передоваемых байт
	movwf	tx_count
	goto	tx_data			;Идём на передачу данных

;**********************************************************************
;Подпрограмма работы с FLASH. 
;---------Чтение значения регистра из FLASH и отправка в UART----------
read_flash:
	call	read_buf		;Читаем старший символ адреса регистра.	
	movwf	R0	
	call	read_buf		;Читаем младший символ адреса регистра.
	movwf	R1

	movfw	R1				;Установка младшего байта адреса
	bsf		STATUS, RP1		;Входим в банк 2 
	bcf 	STATUS, RP0 		
	movwf	EEADR

	bcf		STATUS, RP1		;Входим в банк 0 
	movfw	R0				;Установка старшего байта адреса
	bsf		STATUS, RP1		;Входим в банк 2 
	movwf	EEADRH 

	bsf		STATUS, RP0		;Входим в банк 3 
	bsf 	EECON1, EEPGD	;Разрешение доступа в FLASH
	bsf 	EECON1, RD		;Иницилизировать чтение
	nop 
	nop
	bcf 	STATUS, RP0		;Входим в банк 2 
	movfw	EEDATA			;Читаем младший байт
	bcf		STATUS, RP1		;Входим в банк 0 
	movwf	R0

	bsf		STATUS, RP1		;Входим в банк 2 
	movfw	EEDATH			;Читаем старший байт
	bcf		STATUS, RP1		;Входим в банк 0 
	movwf	R1

	bsf		STATUS,7		;Установка начального адреса 
	movlw	0x90			;буфера для отправки сообщения
	movwf	FSR
	clrf	tx_count		;Очистка счётчика передоваемых байт

	movfw	R1				;Преобразуем из BIN в ASCII
	call	BIN_ASCII
	movfw	R6				;Помещаем 1 байт в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	incf	FSR,f			;Инкрементируем адрес в буфере
	movfw	R5				;Помещаем 2 байт в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	incf	FSR,f			;Инкрементируем адрес в буфере

	movfw	R0				;Преобразуем из BIN в ASCII
	call	BIN_ASCII
	movfw	R6				;Помещаем 3 байт в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	incf	FSR,f			;Инкрементируем адрес в буфере
	movfw	R5				;Помещаем 4 байт в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт

	bsf		STATUS,7		;Установка начального адреса 
	movlw	0x90			;буфера для отправки сообщения
	movwf	FSR
	goto	tx_data			;Идём на отправку данных.

;------------------Запись значения в регистр FLASH-----------------
writ_flash:	
	call	read_buf		;Читаем старший символ адреса регистра.	
	movwf	R0	
	call	read_buf		;Читаем младший символ адреса регистра.
	movwf	R1

	call	read_buf		;Читаем старший байт для записи.
	movwf	R2	
	call	read_buf		;Читаем младший байт для записи.
	movwf	R3

	movfw	R1				;Установка младшего байта адреса
	bsf		STATUS, RP1		;Входим в банк 2 
	bcf 	STATUS, RP0 		
	movwf	EEADR

	bcf		STATUS, RP1		;Входим в банк 0 
	movfw	R0				;Установка старшего байта адреса
	bsf		STATUS, RP1		;Входим в банк 2 	
	movwf	EEADRH

	bcf		STATUS, RP1		;Входим в банк 0 
	movfw	R3				;Установка младшего байта данных
	bsf		STATUS, RP1		;Входим в банк 2 
	movwf	EEDATA

	bcf		STATUS, RP1		;Входим в банк 0 
	movfw	R2				;Установка старшего байта данных
	bsf		STATUS, RP1		;Входим в банк 2 
	movwf	EEDATH

	bsf		STATUS, RP0		;Входим в банк 3 
	bsf		EECON1, EEPGD	;Разрешение доступа в FLASH
	bsf 	EECON1, WREN	;Снимаем защиту от случайной записи
	bcf 	INTCON, GIE 	;Глобальные прерывания запрещены
	movlw	0x55			;Начинаем запись байта
	movwf	EECON2
	movlw	0xAA
	movwf 	EECON2
	bsf 	EECON1, WR		;Старт процедуры записи
	btfsc 	EECON1, WR		;Ждём пока запись будет закончина
	goto 	$-1 
	nop
	nop
	bcf		EECON1, WREN  	;Ставим защиту от случайной записи
	bsf 	INTCON, GIE 	;Глобальные прерывания разрещены
;------------------------Верификация записи-------------------------

	bcf 	STATUS, RP0		;Входим в банк 0 
	bcf		STATUS, RP1
	movfw	R1				;Установка младшего байта адреса
	bsf		STATUS, RP1		;Входим в банк 2 
	bcf 	STATUS, RP0 		
	movwf	EEADR

	bcf		STATUS, RP1		;Входим в банк 0 
	movfw	R0				;Установка старшего байта адреса
	bsf		STATUS, RP1		;Входим в банк 2 
	movwf	EEADRH 

	bsf		STATUS, RP0		;Входим в банк 3 
	bsf 	EECON1, EEPGD	;Разрешение доступа в FLASH
	bsf 	EECON1, RD		;Иницилизировать чтение
	nop 
	nop
	bcf 	STATUS, RP0		;Входим в банк 2 
	movfw	EEDATA			;Читаем младший байт
	bcf		STATUS, RP1		;Входим в банк 0 
	xorwf 	R3,	W			;Сравниваем
 	btfss	STATUS,Z		;Правильно записан байт?
	goto	tr_ERR			;НЕТ - неправильно.

	bsf		STATUS, RP1		;ДА - Входим в банк 2 
	movfw	EEDATH			;Читаем старший байт
	bcf		STATUS, RP1		;Входим в банк 0 
	xorwf 	R2,	W			;Сравниваем
 	btfss	STATUS,Z		;Правильно записан байт?
	goto	tr_ERR			;НЕТ - неправильно.
	goto	tr_OK			;ДА - правильно.

;**********************************************************************
;Подпрограмма работы с EEPROM 
;---------Чтение значения регистра из EEPROM и отправка в UART---------
read_eeprom:
	call	read_buf		;Читаем адрес регистра.
	bsf 	STATUS,6		;Входим в банк 2 
	bcf 	STATUS,5 
	movwf	EEADR 
	bsf 	STATUS,5		;Входим в банк 3 
	bcf 	EECON1,7		;Разрешение доступа в EEPROM 
	bsf 	EECON1,0		;Иницилизировать чтение 
	bcf 	STATUS,5		;Входим в банк 2 
	nop
	movfw 	EEDATA			;Копируем значение регистра в аккумулятор
	bcf 	STATUS,6		;Входим в банк 0 

	call	BIN_ASCII		;Преобразуем из BIN в ASCII

	bsf		STATUS,7		;Установка начального адреса 
	movlw	0x90			;буфера для отправки сообщения
	movwf	FSR
	clrf	tx_count		;Очистка счётчика передоваемых байт

	movfw	R6				;Помещаем байт в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	incf	FSR,f			;Инкрементируем адрес в буфере

	movfw	R5				;Помещаем байт в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт

	bsf		STATUS,7		;Установка начального адреса 
	movlw	0x90			;буфера для отправки сообщения
	movwf	FSR
	goto	tx_data			;Идём на отправку данных.

;------------------Запись значения в регистр EEPROM-----------------
writ_eeprom:
	bsf		PORTB,0
	call	read_buf		;Читаем адрес регистра в EEPROM.
	movwf	R0
	bsf		STATUS, RP1		;Входим в банк 2 			
	movwf 	EEADR			;Установка адреса регистра в EEPROM

	bcf		STATUS, RP1 	;Входим в банк 0 
	call	read_buf		;Читаем байт для записи.
	movwf	R1
	bsf		STATUS, RP1		;Входим в банк 2 
	movwf	EEDATA			;Помещаем байт данных для записи

	bsf 	STATUS, RP0		;Входим в банк 3
	bcf 	EECON1,7
	bsf 	EECON1,2		;Снимаем защиту от случайной записи
	bcf 	INTCON,7		;Глобальные прерывания запрещены
	movlw	0x55			;Начинаем запись байта
	movwf	EECON2
	movlw	0xAA
	movwf 	EECON2
	bsf 	EECON1,1		;Старт процедуры записи
	btfsc 	EECON1,1		;Ждём пока запись будет закончина
	goto 	$-1 
	bcf		EECON1,2	 	;Ставим защиту от случайной записи
	bsf	 	INTCON,7		;Глобальные прерывания разрещены

;------------------------Верификация записи-------------------------
	bsf		EECON1,0		;Иницилизировать чтения 
	bcf 	STATUS, RP0		;Входим в банк 0 
	bcf		STATUS, RP1	 
	movfw	R1
	bsf		STATUS, RP1		;Входим в банк 2 
	xorwf 	EEDATA,	W	
	bcf		STATUS, RP1		;Входим в банк 0 

	btfss	STATUS,Z		;Правильно записан байт?
	goto	tr_ERR			;НЕТ - неправильно.
	goto	tr_OK			;ДА - правильно.

;**********************************************************************
;Подпрограмма работы с оперативной памятью
;и регистрами специального назначения.
;---------------Чтение значения регистра из памяти в UART-------------
i_read_m:
	call	read_buf		;Читаем старший символ адреса регистра.	
	movwf	R0	
	call	read_buf		;Читаем младший символ адреса регистра.
	call	adress			;Установка адреса регистра.

	movfw	INDF			;Берём отправляемый байт

	call	BIN_ASCII		;Преобразуем из BIN в ASCII

	bsf		STATUS,7		;Установка начального адреса 
	movlw	0x90			;буфера для отправки сообщения
	movwf	FSR
	clrf	tx_count		;Очистка счётчика передоваемых байт

	movfw	R6				;Помещаем байт в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	incf	FSR,f			;Инкрементируем адрес в буфере

	movfw	R5				;Помещаем байт в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	
	movlw	0x90			;Установка начального адреса 
	movwf	FSR				;буфера для отправки сообщения
	goto	tx_data			;Идём на передачу данных

;------------------Запись значения в регистр памяти-------------------
writ_bite:
	call	read_buf		;Читаем старший символ адреса регистра.
	movwf	R0	
	call	read_buf		;Читаем младший символ адреса регистра.
	movwf	R2
	call	read_buf		;Читаем байт для записи в регистр.
	movwf	R3

	movfw	R2				;Установка адреса регистра.
	call	adress		

	movfw	R3				;Записываем байт в регистор.
	movwf	INDF

	goto	tr_OK
;**********************************************************************
;Подпрограмма отправки сообщения "OK!" в UART.
tr_OK:
	bsf		STATUS,7		;Установка начального адреса 
	movlw	0x90			;буфера для отправки сообщения
	movwf	FSR
	clrf	tx_count		;Очистка счётчика передоваемых байт

	movlw	'O'				;Помещаем символ в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	incf	FSR,f			;Инкрементируем адрес в буфере

	movlw	'K'				;Помещаем символ в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	incf	FSR,f			;Инкрементируем адрес в буфере

	movlw	'!'				;Помещаем символ в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт

	movlw	0x90			;Установка начального адреса 		
	movwf	FSR				;буфера для отправки сообщения
	goto	tx_data			;Идём на отправку данных.

;**********************************************************************
;Подпрограмма отправки сообщения "ERROR!" в UART.
tr_ERR:
	bsf		STATUS,7		;Установка начального адреса 
	movlw	0x90			;буфера для отправки сообщения
	movwf	FSR
	clrf	tx_count		;Очистка счётчика передоваемых байт

	movlw	'E'				;Помещаем символ в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	incf	FSR,f			;Инкрементируем адрес в буфере

	movlw	'R'				;Помещаем символ в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	incf	FSR,f			;Инкрементируем адрес в буфере

	movlw	'R'				;Помещаем символ в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	incf	FSR,f			;Инкрементируем адрес в буфере

	movlw	'O'				;Помещаем символ в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	incf	FSR,f			;Инкрементируем адрес в буфере

	movlw	'R'				;Помещаем символ в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт
	incf	FSR,f			;Инкрементируем адрес в буфере

	movlw	'!'				;Помещаем символ в буфер
	movwf	INDF
	incf	tx_count,f		;Инкрементируем cчётчик передоваемых байт

	movlw	0x90			;Установка начального адреса 
	movwf	FSR				;буфера для отправки сообщения
	goto	tx_data			;Идём на отправку данных.

;**********************************************************************
;Подпрограмма передачи данных.
tx_data:
	movfw	INDF			;Отправляем первый байт
tx_data2:
	movwf   TXREG			;Предаём байт в USART
	bsf     STATUS,5		;Входим в банк 1
	btfss   TXSTA,1			;Ждём пока передадим байт
	goto    $-1
    bcf     STATUS,5		;Входим в банк 0
	incf	FSR,f			;Инкриментируем адрес считывания из буфера
	decfsz	tx_count,f		;Дикрементируем значение счётчика передоваемых байт
	goto	$+2				;Всё передали?
	goto	con_next		;ДА - уходим
	movfw	INDF			;НЕТ - Берём отправляемый байт
	goto	tx_data2		;Идём снова на передачу данных

;**********************************************************************
;Подпрограмма чтения из буфера слова и преобразования из ASCII в BIN.
read_buf:	
	incf	FSR,f			;Читаем два байта из буфера.
	movfw	INDF
	movwf	R5	
	incf	FSR,f
	movfw	INDF		
	movwf	R6
	call	ASCII_BIN		;Результат преобразования в аккумуляторе
	return

;**********************************************************************
;Подпрограмма установки адреса регистра в памяти.
adress:
	movwf	FSR
	btfsc	R0,0		
	bsf		STATUS,7
	btfss	R0,0
	bcf		STATUS,7
	return

;**********************************************************************