/*
Date    : 11.05.2018
Author  : Ibragimov Adam                                                      
Chip type           : Atmega8
Clock frequency     : 16,000000 MHz
Memory model        : Mega
*/

.include "m8def.inc"			;загрузка предопределений для ATmega8
.list							;подключение генерации листинга

.cseg							;начало сегмента кода
.org 0x00						;начальное значение для адресации

.def temp = R16                 ; === Определения имени для регистра R16
.def loop = R17

		; === Регистры ниже используются для обработки и создания цветов =======
			   								
.def color= R18 
.def byte = R19
.def R = R20
.def G = R21
.def B = R22
			; =============================================================
rjmp restart

								; +++++++ Векторы прерываний +++++++

.org 0x001                      ; === Вектор прерывания по событию INT0
rjmp blink_l                     ; === Переходим на blink_l 
.org 0x002						; === Вектор преривания по событию INT1 
rjmp blink_r					; === Переходим на blink_r


restart:



								; ++++++ инициализация стека +++++++

ldi   R16,low(RAMEND) ;скопируем в R16 младщий байт из константы RAMEND, которая определена в m8def.inc и хранит размер SRAM
out   SPL,R16         ;скопируем значение из R16 в SPL
ldi   R17,high(RAMEND);скопируем в R16 старший байт из константы RAMEND, которая определена в m8def.inc
out   SPH,R17         ;скопируем значение из R17 в SPH

								; ++++++ Инициализация портов ВВ +++++++
ldi R16, 0b00000001
out DDRD, R16
ldi R16, 0b11111110
out PORTD, R16
		
ldi temp, 0b11000000 ; === Разрешаем внешние прерывания INT0 и INT1
out GICR, temp
ldi temp, 0b00000000 ; Настройка возникновение прерывания  
out MCUCR, temp 





								 ; +++++ Начало программы ++++++
sei
start:		
						ldi temp, 17			; == Загрузка количества светодиодов
dh: 					rcall blue				
						dec temp
						brne dh
cycle:
						rjmp cycle


blink_l:				; === Прерывание по событию INT0

blink_r:				; === Прерывание по событию INT0




						; =============== Предустановки цветов ==============================
white:	; Белый
			cli
			ldi B, 8 ; === Биты синего цвета от 0 до 8
			ldi G, 8 ; === Биты зеленого цвета от 0 до 8	
			ldi R, 8 ; === Биты красного цвета от 0 до 8
			rcall rgb
			ret

blue:		cli
			ldi B, 8 ; === Биты синего цвета от 0 до 8
			ldi G, 0 ; === Биты зеленого цвета от 0 до 8	
			ldi R, 0 ; === Биты красного цвета от 0 до 8
			rcall rgb
			ret
			/*Далее создаем нужные цвета копируя блоки что наверху и подставляя нужные цифры,
			  другого оригинального решения я не нашел, так как новичок в программировании.
			*/




						; === Обработка цветов ===============================================
RGB:
			cli
			clr color
			cpi G, 0
			breq bl_1
bl:			rcall hi
			inc color
			cp color, G
			brne bl
			cpi color, 8
			breq be
bl_1:		rcall lo
			inc color
			cpi color, 8	
			brne bl_1
be:
        	clr color
			cpi R, 0
			breq rd_1
rd:			rcall hi
			inc color
			cp color, R
			brne rd
			cpi color, 8
			breq re
rd_1:		rcall lo
			inc color
			cpi color, 8	
			brne rd_1
re:			
	
		    clr color
			cpi B, 0
			breq GR_1
gr:			rcall hi
			inc color
			cp color, B
			brne gr
			cpi color, 8
			breq gn
gr_1:		rcall lo
			inc color
			cpi color, 8	
			brne gr_1
gn:	
			ret


; ====================================== Предустановка битов =================================

hi:								; == Бит 1 ==
			cli
			sbi portd, 0
			ldi byte, 4			; == Загрузка задержки 0,85 мкс ==
h:			dec byte
			brne h			
			cbi portd, 0
			ret
lo:								; == Бит 0 ==
			cli
			sbi portd, 0
			nop
			cbi portd, 0
			ldi byte, 4			; == Загрузка задержки 0,85 мкс ==
l:			dec byte
			brne l
			ret
; =================================================================================================


rjmp start	