.include "8515def.inc"

.equ	AdrWr	= $100		; Адрес, по которому будет выполнено программирование
.equ	AdrRd	= $101		; Адрес, по которому должно быть выполнено чтение

.def	EEdrd	= r0		; Байт, считанный из памяти EEPROM 
.def	EEdwr	= r16		; Байт, подлежащий программированию в память EEPROM
.def	Temp	= r17		; Вспомогательный регистр

RESET:				
	rjmp	Initial		; Переход к части инициализации

EEWrite:			; ***** Подпрограмма "Запись в EEPROM"
	sbic	EECR,EEWE	; Если EEWE не лог. 0, то
	rjmp	EEWrite		;   ожидать дальше
	ldi	Temp,High(AdrWr); Старший байт адреса записи в EEPROM - 
	out	EEARH, Temp	;   в регистр адреса 
	ldi	Temp,Low(AdrWr)	; Младший байт адреса записи в EEPROM -
	out	EEARL, Temp	;   в регистр адреса
	out	EEDR,EEdwr	; Байт данных - в регистр данных 
	sbi	EECR,EEMWE	; Разряд EEMWE разрешает программирование
	sbi	EECR,EEWE	; Разряд EEWE установлен: начало программирования
				; Команда выполняется в течение 4-х тактов,  
				; поскольку задержка ЦП составляет 2 такта
	ret

EERead:				; ***** Подпрограмма "Чтение EEPROM"
	sbic	EECR, EEWE	; Если EEWE не лог. 0, то
	rjmp	EERead		;   ждать дальше
	ldi	Temp,High(AdrRd); Старший байт адреса чтения EEPROM - 
	out	EEARH, Temp	;   в регистр адреса
	ldi	Temp,Low(AdrRd)	; Младший байт адреса чтения EEPROM -
	out	EEARL, Temp	;   в регистр адреса 
	sbi	EECR, EERE	; Установить разряд EERE – начать процесс чтения.
				; Команда выполняется 4 такта, поскольку ЦП
				; задержан на 2 такта
	in	EEdrd, EEDR	; Чтение байта данных
	ret

Initial:
	ldi	Temp, Low(RAMEND)
	out	SPL, Temp
	ldi	Temp, High(RAMEND)
	out	SPH, Temp	; Установить указатель стека
	ldi	Temp, $ff	; Направление передачи данных - вывод
	out	DDRA, Temp	; В регистр направления передачи данных
	ldi	Temp, $00	; Направление передачи данных - ввод
	out	DDRC, Temp	; В регистр направления передачи данных 
	out	PortC, Temp	; Выбрать вход с тремя состояниями
	in	EEdwr, PinC	; Загрузить байт данных из порта C
	rcall	EEWrite		; Программируем байт по адресу $100
	rcall	EERead		; Чтение байта данных по адресу $101
	out	PortA, EEdrd	; Считанный байт передать в порт А
Endlos:
	rjmp	Endlos		; Символически для продолжения программы
