'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 8000000                                          'internal RC oscilator

Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B00001110 : Portd = &B11111111

Config Timer0 = Timer , Prescale = 8
Enable Timer0 : On Timer0 Prztimer0

Enable Interrupts
'********** Konfiguracja uC Koniec  ************

'******************  Nazwy *******************
'***********************************************
Rd Alias Portb.7
Gd Alias Portb.6
Bd Alias Portb.5

Rdt Alias Portd.3
Gdt Alias Portd.1
Bdt Alias Portd.2

I1 Alias Pind.4
I2 Alias Pind.5
Isw Alias Pind.0


'*************  Nazwy Koniec  ****************

'******************  Zmienne *******************
'***********************************************
Dim Licznik As Byte
Dim Rgb(3) As Byte
Dim Rgb2(3) As Byte
Dim Pomoc As Byte
Dim Flaga As Bit
Dim Dzielnik As Word
Dim Dzielnik2 As Byte
Dim Szybkosc As Byte

Dim N As Byte

Dim Arg As Word
Dim Wartosc As Word
Dim Pozycja As Word

Dim Rgb_mode As Bit
Dim Cur_color As Byte

Dim Sw_l As Byte , Sw_f As Byte
Dim Tryb As Byte , Rezultat As Integer

Dim Autosave As Byte , X As Byte
'*************  Zmienne Koniec  ****************

'************ Warunki Poczatkowe ***************
'***********************************************
Cur_color = 1
Autosave = 250

Readeeprom X , 1
If X <= 10 Then Rgb2(1) = X Else Rgb2(1) = 1
Readeeprom X , 2
If X <= 10 Then Rgb2(2) = X Else Rgb2(2) = 1
Readeeprom X , 3
If X <= 10 Then Rgb2(3) = X Else Rgb2(3) = 1
Readeeprom X , 4
If X <= 100 And X >= 1 Then Szybkosc = X Else Szybkosc = 1



'*******  Warunki Poczatkowe Koniec  ***********

'**************  Petla glowna ******************
'***********************************************
Do

 Rezultat = 0
 Select Case Tryb
  Case 0:
   If I1 = 1 And I2 = 1 Then Incr Tryb                      'jezeli dwa rozwarte
  Case 1:
   If I1 = 1 And I2 = 0 Then
    Rezultat = 1
    Incr Tryb
   End If
   If I1 = 0 And I2 = 1 Then
    Rezultat = -1
    Incr Tryb
   End If
  Case 2:
   If I1 = 0 And I2 = 0 Then Incr Tryb
  Case 3:
   If I1 = 1 And I2 = 0 Then
    Rezultat = -1
    Tryb = 0
   End If
   If I1 = 0 And I2 = 1 Then
    Rezultat = 1
    Tryb = 0
   End If
 End Select

If Rezultat <> 0 Then
  Autosave = 0

  If Rezultat = 1 Then
    If Rgb_mode = 1 Then
      Decr Szybkosc
      If Szybkosc <= 1 Then Szybkosc = 1
    Else
      Incr Rgb2(cur_color)
      If Rgb2(cur_color) >= 10 Then Rgb2(cur_color) = 10
    End If
  Else
    If Rgb_mode = 1 Then
      Incr Szybkosc
      If Szybkosc >= 100 Then Szybkosc = 100
    Else
      Decr Rgb2(cur_color)
      If Rgb2(cur_color) >= 250 Then Rgb2(cur_color) = 0
    End If
  End If


End If




 If Flaga = 1 Then                                          'co 32ms
   Flaga = 0

    'autosave
    If Autosave < 250 Then
      Incr Autosave
      If Autosave = 250 Then
        X = Rgb2(1)
        Writeeeprom X , 1
        X = Rgb2(2)
        Writeeeprom X , 2
        X = Rgb2(3)
        Writeeeprom X , 3
        X = Szybkosc
        Writeeeprom X , 4

      End If
    End If


   'animacja
   If Rgb_mode = 1 Then
     Incr Dzielnik2
     If Dzielnik2 >= Szybkosc Then
       Dzielnik2 = 0

       Rdt = 0
       Gdt = 0
       Toggle Bdt

       Incr Pozycja
       If Pozycja = 900 Then Pozycja = 0
       Gosub Pozycja_do_rgb
     End If
   Else
     For N = 1 To 3
       Rgb(n) = Rgb2(n) * Rgb2(n)
     Next N
     Select Case Cur_color
       Case 1 :
         Rdt = 1
         Gdt = 0
         Bdt = 0
       Case 2 :
         Rdt = 0
         Gdt = 1
         Bdt = 0
       Case 3 :
         Rdt = 0
         Gdt = 0
         Bdt = 1
     End Select
   End If

   'switch w impulsatorze
   If Isw = 0 Then
     If Sw_l < 100 Then
       Incr Sw_l
       If Sw_l = 4 Then Sw_f = 1
       If Sw_l = 50 Then Sw_f = 2
     End If
   Else
     Sw_l = 0
     If Sw_f = 1 Then
       Sw_f = 0
       Incr Cur_color
       If Cur_color = 4 Then Cur_color = 1
     End If
     If Sw_f = 2 Then
       Sw_f = 0
       Toggle Rgb_mode
     End If
   End If



 End If

Loop
End
'************ Petla glowna Koniec **************

'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:
 Timer0 = 128
 Incr Licznik
 If Licznik = 100 Then Licznik = 0

 If Licznik >= Rgb(1) Then Reset Rd Else Set Rd
 If Licznik >= Rgb(2) Then Reset Gd Else Set Gd
 If Licznik >= Rgb(3) Then Reset Bd Else Set Bd

 Incr Dzielnik
 If Dzielnik = 250 Then
   Dzielnik = 0
   Set Flaga
 End If

Return
'******** Przerwanie timer 0 Koniec ************

'************   Inne Etykiety    ***************
'***********************************************
Przelicz:                                                   'funkcja \_ _ _ _/^^^
  If Arg > 899 Then Arg = Arg - 900

  If Arg > 100 And Arg < 500 Then Wartosc = 0
  If Arg <= 100 Then Wartosc = 100 - Arg
  If Arg >= 500 And Arg <= 600 Then Wartosc = Arg - 500
  If Arg > 600 Then Wartosc = 100
Return


Pozycja_do_rgb:
  Arg = Pozycja
  Gosub Przelicz
  Rgb(1) = Wartosc
  Arg = Pozycja + 300
  Gosub Przelicz
  Rgb(2) = Wartosc
  Arg = Pozycja + 600
  Gosub Przelicz
  Rgb(3) = Wartosc
Return