.include "m8def.inc"  ; подключаем заголовочный файл для ATmega8L-8PU, (ATmega8L-8PI), PbFree PDIP28
.def     Temp=R16  ; разное
.def     Secret=R17  ; Секрет/загадка, находящийся в Экране (Экран = Screen)
.def     Voltage=R18  ; минимальная норма Вольтажа/Питания
.cseg  ; начало программного сегмента
.org 0  ; задает начальный адрес. В данном случае он = 0
ldi Secret,1  ; изначально секрет Экрана разгадан (не разгадан = 0 | разгадан = 1)
ldi Voltage,1  ; ??? минимальная норма Вольтажа/Питания ??????????????????????????????????????????????
ldi Temp,0b00000001  ; определение ножек МК портов B (1 = вывод | 0 = ввод). Порты B относятся к разному
out DDRB,Temp        ; настраивает ножки МК портов B в соответствии с данными выше
ldi Temp,0b00000000  ; убираем напряение с определённых портов/ножек
out PortB,Temp
ldi Temp,0b00000000  ; определение ножек МК портов D (1 = вывод | 0 = ввод). Порты D относятся к датчикам, определяющим местонаходжение Кристалла
out DDRD,Temp        ; настраивает ножки МК портов D в соответствии с данными выше
ldi Temp,0b00111111  ; подаём напряение на определённые порты/ножки
out PortD,Temp
ldi Temp, low(RAMEND)  ; инициализация цикла
out SPL, Temp  ; инициализация цикла
ldi Temp, high(RAMEND)  ; инициализация цикла
out SPH, Temp  ; инициализация цикла
;************_ В ОЖИДАНИИ АКТИВАЦИИ _************
Continue_Waiting_For_Start_Playing:    rcall TEST  ; Проверка Заряда Кристалла и Вольтажа????????
                                       rcall Screen  ; вызов/запуск подпрограммы Screen
                                       cpi Temp,0
                                       breq Continue_Waiting_For_Start_Playing2  ; продолжить мастерское управление Кристаллом = Кристалл ещё не игровой
                                       rjmp Start_Playing  ; мастерское управление Кристаллом законченно = Кристалл стал игровым/Активирован
                                       
Continue_Waiting_For_Start_Playing2:   rcall Jewellery  ; вызов/запуск подпрограммы Jewellery
                                       cpi Temp,0
                                       breq Continue_Waiting_For_Start_Playing3  ; продолжить мастерское управление Кристаллом = Кристалл ещё не игровой
                                       rjmp Start_Playing  ; мастерское управление Кристаллом законченно = Кристалл стал игровым/Активирован
                                       
Continue_Waiting_For_Start_Playing3:   rcall Charge  ; вызов/запуск подпрограммы Charge
                                       cpi Temp,0
                                       breq Continue_Waiting_For_Start_Playing4  ; быстро моргнуть Светодиодом (сигнал неигрового состояния Кристалла)
                                       rjmp Start_Playing  ; мастерское управление Кристаллом законченно = Кристалл стал игровым/Активирован
Continue_Waiting_For_Start_Playing4:   ldi Temp,0b00000001  ; подаём напряение на светодиод
                                       out PortB,Temp
                                       
                                     rcall wait_1 ; задержка
                                     rcall wait_1 ; задержка
                                     rcall wait_1 ; задержка
                                     rcall wait_1 ; задержка
                                     rcall wait_1 ; задержка
                                      
                                       ldi Temp,0b00000000  ; убираем напряжение с светодиода
                                       out PortB,Temp
                                       
                                     rcall wait_1 ; задержка
                                     rcall wait_1 ; задержка
                                     rcall wait_1 ; задержка
                                     rcall wait_1 ; задержка
                                     rcall wait_1 ; задержка
                                     
                                       rjmp Continue_Waiting_For_Start_Playing  ; продолжить мастерское управление Кристаллом = Кристалл ещё не игровой
;************_ ИГРА НАЧАЛАСЬ / КРИСТАЛЛ АКТИВИРОВАН _************
Start_Playing:    rjmp Searching_1  ; Кристалл активирован, перейти к метке Searching_1, чтобы выяснить где он
Searching_1:    rcall Screen; вызов/запуск подпрограммы Screen
                cpi Temp,0
                breq Searching_2  ; Кристалл Не в Экране, проверять/искать дальше
                rjmp YES_In_Screen  ; Кристалл в Экране
                  
Searching_2:    rcall Jewellery; вызов/запуск подпрограммы Jewellery
                cpi Temp,0
                breq Searching_3  ; Кристалл Не в Бижутерии, проверять/искать дальше
                rjmp YES_In_Jewellery  ; Кристалл в Бижутерии
                
Searching_3:    rcall Charge; вызов/запуск подпрограммы Jewellery
                cpi Temp,0
                breq OUTSIDE  ; Кристалл Не в Столбе, он Снаружи/вынут
                rjmp YES_In_Charge  ; Кристалл в Столбе        
                  
OUTSIDE:    cpi Secret,0  ; проверка разгадан ли Секрет Экрана
            breq Death  ; Секрет Не разгадан, Кристалл теряет Весь Заряд
            rjmp Fast_Burning  ; Секрет разгадан, Кристалл Быстро Прогорает
YES_In_Screen:    sbis PIND,4  ; получаем данные с порта Секрета/ножки PD4 и сравнение/сама проверка
                  rjmp YES_In_Screen_Yes_secret ; есть замыкание / Секрет разгадан
                  rjmp YES_In_Screen_No_secret ; нет замыкания / Секрет Не разгадан
YES_In_Screen_No_secret:    ldi Secret,0  ; записать, что Секрет Не разгадан
                            rcall TEST  ; Проверка Заряда Кристалла и Вольтажа
                            rcall Breath_Slowly  ; Дышать Медленно (яркость, зависит от Заряда Кристалла)
                           ; ???уменьшить заряд со скоростью Экрана???
                            rjmp Start_Playing  ; вернуться к определению местанахождения Кристалла
YES_In_Screen_Yes_secret:    ldi Secret,1  ; записать, что Секрет разгадан
                             rcall TEST  ; Проверка Заряда Кристалла и Вольтажа
                             rcall Breath_Quickly  ; Дышать Быстро (яркость, зависит от Заряда Кристалла)
                            ; ???уменьшить заряд со скоростью Бижутерии???
                             rjmp Start_Playing  ; вернуться к определению местанахождения Кристалла
YES_In_Jewellery:    rcall TEST  ; Проверка Заряда Кристалла и Вольтажа
                    ; ???светиться с яркостью, зависящей от Заряда Кристалла???
                    ; ???уменьшить заряд со скоростью Бижутерии???
                     rjmp Start_Playing  ; вернуться к определению местанахождения Кристалла
YES_In_Charge:    rcall TEST  ; Проверка Заряда Кристалла и Вольтажа
                 ; если Заряд Кристалла максимальный, то светиться пульсируя (rcall Pulsing) и перейти к метке Start_Playing, иначе:
                  rcall Breath_Quickly  ; Дышать Быстро (яркость, зависит от Заряда Кристалла)
                  sbis PIND,3  ; получаем данные с порта Столба с Буфером/ножки PD3 и сравнение/сама проверка
                  rjmp YES_In_Charge_with_Buffer  ; есть замыкание / Столб с Буфером
                  rjmp YES_In_Charge_with_OUT_Buffer  ; нет замыкания / Столб БЕЗ Буфера
YES_In_Charge_with_Buffer:    sbis PIND,5  ; получаем данные с порта Мастерского Столба/ножки PD5 и сравнение/сама проверка
                              rjmp YES_In_Charge_Master_Yes  ; есть замыкание / Столб Мастерский
                              rjmp YES_In_Charge_Master_No  ; нет замыкания / Столб НЕ Мастерский
YES_In_Charge_Master_Yes:     ; ???Увеличить заряд до Максимума??? 
                              rjmp Start_Playing  ; вернуться к определению местанахождения Кристалла
YES_In_Charge_Master_No:     ; ???Увеличить заряд со скоростью Столба с Буфером???
                              rjmp Start_Playing  ; вернуться к определению местанахождения Кристалла
YES_In_Charge_with_OUT_Buffer:    ; ???Увеличить заряд со скоростью Столба БЕЗ Буфером???
                                  rjmp Start_Playing  ; вернуться к определению местанахождения Кристалла
            
Fast_Burning:    rcall TEST  ; Проверка Заряда Кристалла и Вольтажа
                 rcall Pulsing; светится максимально ярко, пульсируя
                ; ???уменьшить заряд со скоростью Быстро???
                 rjmp Start_Playing  ; вернуться к определению местанахождения Кристалла
Death:    ; ??? Кристалл теряет Весь Заряд и не светится, пока его не Зарядят в Столбе (или не перезагрузят, выключив и снова включив)
Full_Death:    in Temp,2;???РЕАЛЬНЫЙ_ВОЛЬТАЖ (вместо 2)???  ; данные о Вольтаже/Питании
               cp Voltage,Temp  ; сверяем данные выше с нормой - если Вольтаж/Питание меньше нормы,
               brmi Full_Death; то Кристалл больше не засветится, пока его не перезагрузят (выключив и снова включив), и не активирутся, пока Вольтаж/Питание не нормализуют
               rjmp Start_Playing  ; иначе: вернуться к определению местанахождения Кристалла
          
;************************_ ПОДПРОГРАММЫ _****************************
;тестовая Задержка
wait_1:
   ldi r24,10
   mov   r25,r24
wait_1_1:   ldi   r24,200
   rcall   wait_1_2
   rcall   wait_1_2
   rcall   wait_1_2
   rcall   wait_1_2
   dec   r25
   brne   wait_1_1
   ret
wait_1_2:
   dec   r24
   breq   wait_1_ret
   nop
   nop
   nop
   nop
   rjmp   wait_1_2
wait_1_ret:   ret
; Проверка находится ли Крисалл в Экране?
Screen:    sbis PIND,0  ; получаем данные с порта Экрана/ножки PD0 и сравнение/сама проверка
           rjmp Screen_2_check  ; есть замыкание / Кристалл в Экране
           rjmp Screen_Finish  ; иначе: нет замыкания
Screen_2_check:    sbis PIND,1  ; получаем данные с порта Бижутерии/ножки PD1 и сравнение/сама проверка
                   rjmp Fast_Burning  ; есть замыкание / Кристалл Быстро Прогарает
                   rjmp Screen_3_check  ; иначе2: нет замыкания
Screen_3_check:    sbis PIND,2  ; получаем данные с порта Столба/ножки PD2 и сравнение/сама проверка
                   rjmp Fast_Burning  ; есть замыкание / Кристалл Быстро Прогарает
                   ldi Temp,1  ; иначе3: проверка показала, что Кристалл находится именно в Экране
                   rjmp Screen_ret
Screen_Finish:    clr Temp  ; очистить регистр Temp, результат проверки: Кристалл Не в Экране
Screen_ret:        ret  ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
                        ; с места вызова. Т.е., с команды, следующей за командой rcall
              
; Проверка находится ли Крисалл в Бижутерии?
Jewellery:    sbis PIND,1  ; получаем данные с порта Бижутерии/ножки PD1 и сравнение/сама проверка
              rjmp Jewellery_2_check  ; есть замыкание / Кристалл в Бижутерии
              rjmp Jewellery_Finish  ; иначе: нет замыкания
Jewellery_2_check:    sbis PIND,0  ; получаем данные с порта Экрана/ножки PD0 и сравнение/сама проверка
                      rjmp Fast_Burning  ; есть замыкание / Кристалл Быстро Прогарает
                      rjmp Jewellery_3_check  ; иначе2: нет замыкания
Jewellery_3_check:    sbis PIND,2  ; получаем данные с порта Столба/ножки PD2 и сравнение/сама проверка
                      rjmp Fast_Burning  ; есть замыкание / Кристалл Быстро Прогарает
                      ldi Temp,1  ; иначе3: проверка показала, что Кристалл находится именно в Бижутерии
                      rjmp Jewellery_ret
Jewellery_Finish:    clr Temp  ; очистить регистр Temp, результат проверки: Кристалл Не в Бижутерии
Jewellery_ret:        ret  ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
                           ; с места вызова. Т.е., с команды, следующей за командой rcall
               
; Проверка находится ли Крисалл в Столбе?
Charge:    sbis PIND,2  ; получаем данные с порта Столба/ножки PD2 и сравнение/сама проверка
           rjmp Charge_2_check  ; есть замыкание / Кристалл в Столбе
           rjmp Charge_Finish  ; иначе: нет замыкания
Charge_2_check:    sbis PIND,0  ; получаем данные с порта Экрана/ножки PD0 и сравнение/сама проверка
                   rjmp Fast_Burning  ; есть замыкание / Кристалл Быстро Прогарает
                   rjmp Charge_3_check  ; иначе2: нет замыкания
Charge_3_check:    sbis PIND,1  ; получаем данные с порта Бижутерии/ножки PD1 и сравнение/сама проверка
                   rjmp Fast_Burning  ; есть замыкание / Кристалл Быстро Прогарает
                   ldi Temp,1  ; иначе3: проверка показала, что Кристалл находится именно в Столбе
                   rjmp Charge_ret
Charge_Finish:    clr Temp  ; очистить регистр Temp, результат проверки: Кристалл Не в Столбе
Charge_ret:        ret  ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
                        ; с места вызова. Т.е., с команды, следующей за командой rcall
; Проверка Заряда Кристалла и Вольтажа:
TEST:    ; ???
TEST_ret:        ret  ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
                      ; с места вызова. Т.е., с команды, следующей за командой rcall
; Дышать Медленно:                         
Breath_Slowly:  ; ???                                     
Breath_Slowly_ret:        ret  ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
                               ; с места вызова. Т.е., с команды, следующей за командой rcall
; Дышать Быстро:                         
Breath_Quickly:    ; ???
Breath_Quickly_ret:        ret  ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
                                ; с места вызова. Т.е., с команды, следующей за командой rcall
; Светиться максимально ярко Пульсируя:
Pulsing:  ; ???
Pulsing_ret:        ret  ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
                         ; с места вызова. Т.е., с команды, следующей за командой rcall