; ************************************************************************
.device ATmega8515       ; Используется МК ATmega8515
.nolist                  ; Отключенна генерации листинга,
.include "m8515def.inc"  ; вложенные файлы не будут отображены в листинге.
.list                    ; Включена генерация листинга
;*************************************************************************
; 
;= Start macro.inc =============================== 
;  Макросы тут 
;= End 	macro.inc ================================
;
;=============Symbolic register name===================
;
 .def temp=r16			;рабочая переменная
 .def var_1=r17        ;переменные
 .def var_2=r18
 ;.def var_loc1=r19        ;переменные
 ;.def var_loc2=r20
;
 
;*************************************************************************
;
; SRAM =============================================
		.DSEG		; Сегмент ОЗУ
; END SRAM =========================================
;
;*************************************************************************
;
; FLASH ROM============================================
	    .CSEG ; Начало кодового сегмента
; Interrupts ==============================================
.org 0x0000
rjmp RESET 		; Обработка сброса
.org 0x0001  	; rjmp EXT_INT0 	; внешнее прерывание IRQ0
reti
.org 0x0002 	; rjmp EXT_INT1 	; внешнее прерывание IRQ1
reti
.org 0x0003 	; rjmp TIM1_CAPT 	; Обработка захвата таймера/счетчика  T1
reti
.org 0x0004 	; rjmp TIM1_COMPA 	; Совпадение А  таймера/счетчика T1
reti
.org 0x0005 	; rjmp TIM1_COMPB 	; Совпадение В  таймера/счетчика T1
reti
.org 0x0006 	; rjmp TIM1_OVF 	; Обработка переполнения таймера/счетчика T1
reti
.org 0x0007  	; rjmp TIM0_OVF 	; Обработка переполнения таймера/счетчика T0
reti
.org 0x0008 	; rjmp SPI_STC 		; Передача по SPI завершена
reti
.org 0x0009 	; rjmp USART_RXC 	; USART RX прием завершен
reti
.org 0x000A 	; rjmp USART_UDRE 	; Регистр данных USART пуст
reti
.org 0x000B 	; rjmp USART_TXC 	; USART TX Передача завершена
reti
.org 0x000C 	; rjmp ANA_COMP 	; Обработка прерывания аналогового компаратора
reti
.org 0x000D 	; rjmp EXT_INT2 	; Обработка внешнего прерывания IRQ2 
reti
.org 0x000E 	; rjmp TIM0_COMP 	; Обработка  совпадения таймера/счетчика T0 
reti
.org 0x000f 	; rjmp EE_RDY 		; EEPROM готово
reti 
.org 0x0010 	; rjmp SPM_RDY 		; Store Program memory - готово 
reti
.org	INT_VECTORS_SIZE			; Конец таблицы прерываний
;
; End Interrupts ==========================================
;
;***************Internal Hardware Init**********************************
;
	RESET:
;==========процедура зануления ОЗУ=========================
RAM_Flush:	LDI	ZL,Low(SRAM_START)	; Адрес начала ОЗУ в индекс
		LDI	ZH,High(SRAM_START)
		CLR	R16			; Очищаем R16
Flush:		ST 	Z+,R16			; Сохраняем 0 в ячейку памяти
		CPI	ZH,High(RAMEND+1)	; Достигли конца оперативки?
		BRNE	Flush			; Нет? Крутимся дальше!
 
		CPI	ZL,Low(RAMEND+1)	; А младший байт достиг конца?
		BRNE	Flush
 
		CLR	ZL			; Очищаем индекс
		CLR	ZH
;=========процедура зануления регистров==================
LDI	ZL, 30		; Адрес самого старшего регистра	
		CLR	ZH		; А тут у нас будет ноль
		DEC	ZL		; Уменьшая адрес
		ST	Z, ZH		; Записываем в регистр 0
		BRNE	PC-2		; Пока не перебрали все не успокоились
;=============инициализация стека==========================
		LDI temp,Low(RAMEND)	; Инициализация стека
		OUT SPL,temp
 
		LDI temp,High(RAMEND)
		OUT SPH,temp
; **************End Internal Hardware Init*****************************

	Main:
		LDI	var_1,0	; Загрузка значений
		LDI	var_2,1
push var_1 ;переменная var_1 в программе помещается в стек
push var_2 ;переменная var_2 в программе помещается в стек

rcall procedure ;вызывается процедура

pop var_2 ;после нее результат извлекается из стека
pop var_1 ;второй результат извлекается из стека

loop:
rjmp loop

procedure: ;в процедуре извлекается локальная

pop r1 ; сохраняем указатель стека в r1:r0
pop r0 ;

pop r20 ;переменная var_loc2 со значением var_2
pop r19 ;и переменная var_loc1 со значением var_1

 ;расчеты, расчеты...
inc r20
inc r19

push r19  ;результат — в стек
push r20 ;результат — в стек

push r0 ; восстанавливаем указатель стека из r1:r0
push r1 ;

ret ;возврат из процедуры
;
; EEPROM ==========================================
		.ESEG		; Сегмент EEPROM
