/*****************************************************
Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 12,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega16.h>
#include "s65_lib.h"
#include <delay.h>
#include <stdlib.h>
#include <STRING.H>
unsigned char keypress;
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
keypress=(PINA&0b00001110)>>1;
TCCR2=0x1D;
delay_ms(50);
TCCR2=0x18;
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
//extsync=1;

}

#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8
#define TXB8 0
#endif

#ifndef UPE
#define UPE 2
#endif

#ifndef DOR
#define DOR 3
#endif

#ifndef FE
#define FE 4
#endif

#ifndef UDRE
#define UDRE 5
#endif

#ifndef RXC
#define RXC 7
#endif

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)


#define keyc 1
#define keys 6
#define keyb 5
#define keyu 7
#define keyd 2
#define keyl 3
#define keyr 4
#define keyn 0

// USART Receiver buffer
#define RX_BUFFER_SIZE 16
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index]=data;
   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      };
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

#define ADC_VREF_TYPE 0xE0

// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}

// SPI functions
#include <spi.h>







// Declare your global variables here
unsigned char x,y,k,i,l,m,ik,xn=0,xnm,pos,ncp,inp[256],out[162],ris=1,sync=108,start=255;
unsigned char reg=1,reg1=0,reg2=0,reg3=1,kt=4,ku=3,sni=0,insyn=0,synm=1,syne=1,mc=0,me=0,ml=1,mr=160,
              vmax,vmin,he=0,hf1[6]={0,0,0,0,0,0},hfm=1; 

flash const int colp[12]={0x54fb,//sky
                          0x0000,//black 
                          0xFFFF,// white
                          0x91D4,//violet
                          0xDEE0,//yellow
                          0xAB00,//orange
                          0x001F,//blue
                          0x8410,//grey 
                          0x07E0,//green                    
                          0xF800,//red
                          0xF97F,//pink 
                          0x8200,//brown                     
                          };
                          
 flash const char z[18][5]={{25,0,0,25,1},{10,0,0,25,1},{5,0,0,25,1},{1,0,0,25,1},{1,0,0,50,1},{1,2,0,1,0},{1,8,0,5,0},
                            {1,18,0,5,0},{1,38,0,10,0},{1,98,0,25,0},{1,198,0,50,0},{1,2,0,100,0},{1,5,0,25,1},{1,10,0,50,1},
                            {1,20,0,1,0},{1,50,0,5,0},{1,100,0,5,0},{1,200,0,10,0}};
 flash const char u[8][3]={{223,100,0},{45,10,0},{89,10,0},{223,10,0},{45,1,0},{89,1,0},{223,10,1},{45,10,2}};
 flash const char txr[18][6]={"0.2uS","0.5uS","  1uS","  5uS"," 10uS"," 20uS",
                              " 50uS","100uS","0.2mS","0.5mS","  1mS","  2mS",
                              "  5mS"," 10mS"," 20mS"," 50mS","0.1 S","0.2 S"};
 flash const char txu[8][6]={" 50mV","100mV","200mV","500mV","  1 V","  2 V","  5 V"," 10 V"};
 flash const char trg[6][20]={"   Р Е Ж И М","ОСЦИЛЛОГРАФ","ГЕНЕРАТОР < 0.1 МГц","ГЕНЕРАТОР > 0.1 МГц",
                              "АНАЛИЗАТОР","НАСТРОЙКА"};
 flash const char tst[11][10]={"  Ц В Е Т","ФОНА","ТЕКСТА","ГРАФИКА",
                               "РАМКИ","СЕТКИ","КРЕСТА","Л МАРКЕРА","П МАРКЕРА","ПОДСВЕТКА","СБРОС"};
 flash const char tm[13][11]={"СМЕЩ ВЕРТ ","СМЕЩ ГОРИЗ"," ДЕЙСТВУЮЩ"," СРЕДНЕЕ  "," ВХОД ОТКР"," ВХОД ЗАКР"," СИХР РАЗР",
                              " СИХР ЗАПР"," АВТОМАТ  "," ОДИНОЧНАЯ","ПР ВНШ ИМП","ВНЕШН","ВНУТР"};
 flash const char mn[8][3]={"  ","0 ","00","nS","uS","mS","mV"," V"};
 //flash const char ht[1][17]={"ЧАСТОТА"};
 flash const char ht1[9][9]={"ВЫКЛЮЧЕН","ВКЛЮЧЕН ","ЧАСТОТА","СИНУС   ","МЕАНДР  ","ТРЕУГОЛН","ПИЛА 1  ","ПИЛА 2  ","УРОВЕНЬ "};
 //flash const int hf[5]={0,30000,9375,23438,5859}; 
 //flash const char tc[5]={0x08,0x09,0x0b,0x0c,0x0d};                      
                         // Цвета
  flash int col0[8]={0x0000,0xffff,0xffff,0x07e0,0x07e0,0xf800,0xab00,0xf97f};
  eeprom int col1[8]={0x0000,0xffff,0xffff,0x07e0,0x07e0,0xf800,0xab00,0xf97f};
  flash char kt0=4,ku0=3,sni0=0,insyn0=0,synm0=1,syne0=1,mc0=0,me0=0,ris0=1,syncd0=0;
  eeprom char kt1=4,ku1=3,sni1=0,insyn1=0,synm1=1,syne1=1,mc1=0,me1=0,ris1=1,syncd1=0;
 
  int colr[8]={0x0000,0xffff,0xffff,0x07e0,0x07e0,0xf800,0xab00,0xf97f};                                
  char text[]=" "; 
   
int cb,vml,vmr,vind,mll,mrl;
//long int hfl;
signed char syncd=0,sm1=0;



void input (void)
  {
  k=z[kt][1];
     if (kt<4)
     {
     #asm
     push r26
     push r27
     ldi r27,0x01
     ldi r26,0x77
     in r25,0x13  //0
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //1
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //2
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //3
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //4
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //5
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //6
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //7
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //8
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //9
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //10
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //11
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //12
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //13
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //14
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //15
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13 
     st x+,r25
     in r25,0x13  //224
     st x+,r25
     pop r27
     pop r26
     #endasm
     };
     if (kt==4)
     {
      #asm
     push r26
     push r27
     ldi r27,0x01
     ldi r26,0x77
loop01:in r25,0x13  //0
     st x+,r25
     cpi r26,0x77
     brne loop01
     pop r27
     pop r26
     #endasm
     };
     if ((kt>4)&(kt<11))
     {
        #asm
     push r26
     push r27
     ldi r27,0x01
     ldi r26,0x77
loop02:mov r24,r13
loop03:dec r24
     brne loop03
     in r25,0x13  //0
     st x+,r25
     cpi r26,0x77
     brne loop02
     pop r27
     pop r26
     #endasm
     }; 
     if (kt>10)
     { 
        i=z[kt][2];
        for (x=0;x<255;x++)
        {
        inp[x]=PINC;
        k=z[kt][1];
        while(k) k--,delay_us(49);
         
        };
        
     };    
  };

void syncset(void)
   {  
         bgcolor=colr[0];
         if ((keypress==keyr)&(sni<100)) sni++;          //счетчик импульсов внешнй синхронизации
         if ((keypress==keyl)&(sni>0)) sni--;            //больше-меньше
         if (keypress==keyd) insyn=!insyn;               //вход сихронизации внеш-внутр
         if (keypress==keyu) synm=!synm;                 //синхро одиночный-автоматически
         if (keypress==keys) syne=!syne;                 //разрешене синхронизации
         put_stringf(31,0,tm[7-syne],colr[1]);
         put_stringf(95,0,tm[9-synm],colr[3]);
         put_stringf(31,9,tm[10],colr[1]);
         itoa(sni,text),ColorZone(9,12,18,82,colr[0]),put_string(95,9,text,colr[5]);
         put_stringf(120,9,tm[12-insyn],colr[3]);
   };
    
void multikey(char i,char k)
  {
  delay_ms(100);
  keypress=(PINA&0b00001110)>>1;
  ColorZone(k,12,k+9,82,colr[0]);
  itoa(i,text),put_string(95,k,text,colr[3]);
  };

void multimark(void)
  {
  delay_ms(100);
  keypress=(PINA&0b00001110)>>1;
  };

void markset(void)
  {
  bgcolor=colr[0];
         while ((keypress==keyr)&(!mc)&(ml<(mr-1))) 
            {
            drmark(ml*z[kt][0],1,colr[0]),ml++;   //установка левого маркера
            multimark();
            };
         while ((keypress==keyl)&(!mc)&(ml>1))
            {
            drmark(ml*z[kt][0],1,colr[0]),ml--;
            multimark();
            };
         while ((keypress==keyr)&(mc)&(mr<ik))
            {
            drmark(mr*z[kt][0],1,colr[0]),mr++;   //установка правого маркера
            multimark();
            };
         while ((keypress==keyl)&(mc)&(mr>(ml+1))) 
            {
            drmark(mr*z[kt][0],1,colr[0]),mr--;
            multimark();
            };
         if (keypress==keyu) mc=0;                       //активный маркер левый
         if (keypress==keyd) mc=1;                       //активный маркер правый
         if (keypress==keys) 
           {
           me=!me;                 //разрешене маркеров
           if (!me) drmark(ml*z[kt][0],1,colr[0]),drmark(mr*z[kt][0],1,colr[0]);
           };
         ColorZone(0,12,18,143,colr[0]);
   };        
    
void bat(void)
  {
  bgcolor=colr[0];
      itoa((read_adc(0)-174)*3,text),*strcatf(text,mn[0]),put_string(162,0,text,red);// Напряжение батареи в процентах
      itoa((read_adc(7)>>1),text),*strcatf(text,mn[0]),put_string(162,9,text,blue);    //Ток зарядки
      };            
      
                                       
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization

PORTA=0b00110000,DDRA=0x70;
PORTB=0x01,DDRB=0xBF;
PORTC=0x00,DDRC=0x00;
PORTD=0x00,DDRD=0b11110010;

// Timer/Counter 0 initialization
// OC0 output: Non-Inverted PWM
TCCR0=0x69,TCNT0=0x00,OCR0=64;

// Timer/Counter 1 initialization
// Mode: CTC top=OCR1A
// OC1A output: Toggle
TCCR1A=0x40,TCCR1B=0x09,TCNT1H=0x00,TCNT1L=0x00;
ICR1H=0x00,ICR1L=0x00,OCR1AH=0x02,OCR1AL=0x58;
OCR1BH=0x00,OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock value: 11.719 kHz
// Mode: CTC top=OCR2
// OC2 output: Toggle on compare match
ASSR=0x00,TCCR2=0x18,TCNT2=0x00,OCR2=0x8D;

// External Interrupt(s) initialization
// INT0 Mode: Rising Edge
// INT1 Mode: Rising Edge
GICR|=0xC0;
MCUCR=0x0F;
MCUCSR=0x00;
GIFR=0xC0;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// USART Baud Rate: 57600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;
// Analog Comparator initialization
ACSR=0x80;
SFIOR=0x00;
// ADC Clock frequency: 185,500 kHz
// ADC Voltage Reference: Int., cap. on AREF
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x86;
// SPI initialization
SPCR=0x50;
SPSR=0x01;

  
       

lcd_init();

// Global enable interrupts
#asm("sei")
 for(i=0;i<9;i++) colr[i]=col1[i];
 kt=kt1,ku=ku1,sni=sni1,insyn=insyn1,synm=synm1,syne=syne1,mc=mc1,me=me1,ris=ris1,syncd=syncd1;
// Главное меню

l01:ColorZone(0,0,131,175,colr[0]),k=2;
   bgcolor=colr[0];
   for (i=0;i<6;i++)  
   {
   if(colp[i+k]==colr[0]) k++;
   put_stringf(30,(16+i*16),trg[i],colp[i+k]);
   };
   k=1;reg=1;
   while (k)
   {
   for (i=1;i<6;i++)
     {
     if (reg==i) cb=colr[1];
        else cb=colr[0];
     put_char(20,(16+i*16),0x2a,cb);
     };      
   if (keypress==keyu) reg--;
   if (reg==0) reg=5;
   if (keypress==keyd) reg++;
   if (reg==6) reg=1;
   if (keypress==keyc) 
     {
     k=0;
     ColorZone(0,0,131,175,colr[0]);
     };
   keypress=keyn;
   };
   
   
// Осциллограф
   if (reg==1)
   {
      PORTB.0=0;
      ram(colr[3]);
      for (y=0;y<162;y++) out[y]=1;
      vmax=224;
      //kt=kt1,ku=ku1,sni=sni1,insyn=insyn1,synm=synm1,syne=syne1,mc=mc1,me=me1,ris=ris1,syncd=syncd1;
    };  
      
l02:    while (reg==1)
   {  if ((vmax>226)&(ku<7)) ku++;
      vmax=0;  
      ik=160/z[kt][0],xnm=255-i;
      if(xn>xnm) xn=xnm;
      if(mr>ik) mr=ik;
      if(ml>mr) ml=1;
      i=sni+1;
   // Синхронизация
    if ((!synm)&(keypress==keyn)&(!sm1)) goto sl4;
     sm1=0;     
     if (!syne) goto sl9;
     if (insyn) goto sl2;
     if (!ris) goto sl3;
     //while ((PINC>sync)&(!PIND.2)) {};
     //while ((PINC<(sync))&(!PIND.2)) {};
      #asm
     push r26
     push r27
     ldi r27,0x03
     ldi r26,0x1A
     ld r25,x
lp2: in r24,0x13 
     cp r24,r25
     brlo lp1
     in r24,0x10
     andi r24,0x04
     breq lp2
lp1: in r24,0x13
     cp r24,r25
     brsh lp3
     in r24,0x10
     andi r24,0x04
     breq lp1
lp3: pop r27
     pop r26
     #endasm  
     goto sl9;
sl2: do  
     {
     i--;
     //while ((PIND.3)&(!PIND.2)) {};
     //while ((!PIND.3)&(!PIND.2)) {};
          #asm
lp5: in r24,0x10 
     andi r24,0x08
     breq lp4
     in r24,0x10
     andi r24,0x04
     breq lp5
lp4: in r24,0x10
     andi r24,0x08
     brne lp6
     in r24,0x10
     andi r24,0x04
     breq lp4
lp6: nop
     #endasm  
     }
     while (i); 
     goto sl9;
sl3: //while ((PINC<sync)&(!PIND.2)) {};
     //while ((PINC>(sync))&(!PIND.2)) {};
      #asm
     push r26
     push r27
     ldi r27,0x03
     ldi r26,0x1A
     ld r25,x
lp8: in r24,0x13 
     cp r24,r25
     brsh lp7
     in r24,0x10
     andi r24,0x04
     breq lp8
lp7: in r24,0x13
     cp r24,r25
     brlo lp9
     in r24,0x10
     andi r24,0x04
     breq lp7
lp9: pop r27
     pop r26
     #endasm   
sl9: input();
    // Рисование графика без флика
sl4:  drawLine(out[1],z[kt][0],out[2],2*z[kt][0],colr[0]);
      out[1]=inp[xn+1]>>1;
      if (out[1]>111) out[1]=111;
      if (out[1]<1) out[1]=1;
      for (y=2;y<(ik);y++)
      {
      if(inp[y]>vmax) vmax=inp[y];
      drawLine(out[y],y*z[kt][0],out[y+1],(y+1)*z[kt][0],colr[0]);
      out[y]=inp[y+xn]>>1;
      if (out[y]>111) out[y]=111;
      if (out[y]<1) out[y]=1;
      drawLine(out[y-1],(y-1)*z[kt][0],out[y],y*z[kt][0],colr[2]);
      };
      out[ik]=inp[xn+ik]>>1;
      if (out[ik]>111) out[ik]=111;
      if (out[ik]<1) out[ik]=1;
      drawLine(out[ik-1],(ik-1)*z[kt][0],out[ik],ik*z[kt][0],colr[2]);
                               
      grid(colr[4]);
      krest(colr[5]);
      drmark(ml*z[kt][0],me,colr[6]),drmark(mr*z[kt][0],me,colr[7]);
      
      if (PORTD.4)
       {
       putchar(0xff);
       putchar(kt),putchar(ku),putchar(sni),putchar(insyn),putchar(ris);
       for (i=0;i<255;i++) putchar(inp[i]);
       };
       
      start++;
      if (!keypress & start) goto l02;
      
      if ((sync<200)|(sync>20)) drsync(sync>>1,ris,colr[2]);
    //вычисления  
      vmin=255,vind=0;
      for (x=xn;x<(xn+ik);x++) 
      {
      if(inp[x]<vmin) vmin=inp[x];
      if(inp[x]>vmax) vmax=inp[x];
      vind=vind+(int)abs(inp[x]-112);
      };
     // if ((vmax>240)&(ku<7)) ku++;
      vind=vind/ik*u[ku][0]/u[ku][1];
      x=(vmax>>1)+(vmin>>1);
      clsync(colr[0]);
      sync=x+syncd;
      if ((sync>vmax)|(sync<vmin)) syncd=0,sync=x;
      drsync(sync>>1,ris,colr[2]);
      bat();
    // Кнопки  
      if (!reg1)                              //меню развертки и усиления
      {  
      if (keypress) sm1=1,delay_ms(50);
         bgcolor=colr[0];
      if ((keypress==keyr)&(kt<17))          //изменение развертки по горизонтали
         {
         ColorZone(20,14,130,174,colr[0]);   //больше мксек на деление
         kt++;
         };                                  
      if ((keypress==keyl)&(kt>0))           //меньше мксек на деление
         {
         ColorZone(20,14,130,174,colr[0]);
         kt--;
         };
      put_stringf(0,9,txr[kt],colr[5]);
      if ((keypress==keyd)&(ku<7)) ku++;    //усиление по вертикали
      if ((keypress==keyu)&(ku>0)) ku--;    //больше-меньше
      put_stringf(0,0,txu[ku],colr[3]); 
      put_stringf(31,0,tm[2],colr[1]);
      put_stringf(31,9,tm[3],colr[1]);
      ColorZone(0,12,18,82,colr[0]);
      itoa(((x-112)*u[ku][0]/u[ku][1]),text);
      if (ku==6) *strcatf(text,mn[1]);
      if (ku==7) *strcatf(text,mn[2]);
      *strcatf(text,mn[6]);
      put_string(96,9,text,colr[3]);
      itoa(vind,text);
      if (ku==6) *strcatf(text,mn[1]);
      if (ku==7) *strcatf(text,mn[2]);
      *strcatf(text,mn[6]);
      put_string(96,0,text,colr[5]);
      PORTA=ku<<4;
      if (keypress==keyb) 
      {
      //выход в основное меню
      kt1=kt,ku1=ku,sni1=sni,insyn1=insyn,synm1=synm,syne1=syne,mc1=mc,me1=me,ris1=ris,syncd1=syncd;
      reg=0,start=0;
      keypress=0;
      };
      if (keypress==keyc) reg1=1;           //выход в следующее меню смещения
      keypress=0;
      };
      
      if (reg1==1)                                 //меню смещений
      {  
         bgcolor=colr[0];
         put_stringf(31,0,tm[0],colr[1]);
         put_stringf(31,9,tm[1],colr[1]); 
         while ((keypress==keyl)&(xn<(xnm-1))) 
          {
          xn++;
          multikey(xn,9);
          };                                        //смещение по горизонтали
         while ((keypress==keyr)&(xn>1)) 
          {
          xn--;         //больше-меньше
          multikey(xn,9);
          };
         while ((keypress==keyu)&(OCR0<255)) 
          {
          OCR0++;  //смещение по вертикали
          multikey(OCR0,0);
          };
         while ((keypress==keyd)&(OCR0>1)) 
          {
          OCR0--;    //больше-меньше
          multikey(OCR0,0);
          };
         ColorZone(0,12,18,82,colr[0]);
         itoa(xn,text),put_string(95,9,text,colr[3]);
         itoa((OCR0-64),text),put_string(95,0,text,colr[5]);
         if (keypress==keyb) reg1=0;          //возврат в меню развертки
         if (keypress==keyc) reg1=2;               //выход в меню синхронизации
         keypress=0;
      };
      
      if (reg1==2)                                //меню синхронизации
      { 
         //bgcolor=colr[0];
         //clsync(sync>>1,colr[0]);
         if ((keypress==keyu)&(sync<(vmax-4))) syncd++; //уровень синхронизации
         if ((keypress==keyd)&(sync>(vmin+2))) syncd--;  //больше-меньше
         if (keypress==keyl) PORTD.6=!PORTD.6;           //вход переменка-постоянка
         if (keypress==keyr) ris=!ris;                   //фронт-спад
         //drsync(sync>>1,ris,colr[2]);
         ColorZone(0,12,18,143,colr[0]);
         put_stringf(31,0,tm[5-PORTD.6],colr[1]);
         itoa(((sync>>1)-55),text),put_string(95,0,text,colr[5]);
         if (keypress==keyb) reg1=1;               //возврат в меню смещений
         if (keypress==keyc) reg1=3;               //выход в меню настройки синхронизации
       keypress=0;
      };
      
      if (reg1==3)                                 //меню настройки синхронизации
      {  
         syncset();               
         if (keypress==keyb) reg1=2;        //возврат в меню меню синхронизации
         if (keypress==keyc) reg1=4;               //выход в меню настройки маркеров
       keypress=0;
      }; 
      
      if (reg1==4)                                  //меню настройки маркеров
      {  
         markset();
         vml=(inp[xn+ml]-112)*u[ku][0]/u[ku][1];
         vmr=(inp[xn+mr]-112)*u[ku][0]/u[ku][1];
         itoa(vml,text);
         //if (ku<6) *strcatf(text,mn[0]);
         if (ku==6) *strcatf(text,mn[1]);
         if (ku==7) *strcatf(text,mn[2]);
         put_string(31,0,text,colr[6]);
         itoa(vmr,text);
         //if (ku<6) *strcatf(text,mn[0]);
         if (ku==6) *strcatf(text,mn[1]);
         if (ku==7) *strcatf(text,mn[2]);
         put_string(64,0,text,colr[7]);
         itoa((abs(inp[xn+ml]-inp[xn+mr]))*u[ku][0]/u[ku][1],text);
         if (ku==6) *strcatf(text,mn[1]);
         if (ku==7) *strcatf(text,mn[2]);
         *strcatf(text,mn[6]);
         put_string(112,0,text,colr[5]);
         mll=ml*z[kt][3];
         mrl=mr*z[kt][3];
         if (kt==6 | kt==15) mll=mll>>1,mrl=mrl>>1;
         itoa(mll,text),*strcatf(text,mn[z[kt][4]]);
         put_string(31,9,text,colr[6]);
         itoa(mrl,text),*strcatf(text,mn[z[kt][4]]);
         put_string(68,9,text,colr[7]);
         itoa((mrl-mll),text),*strcatf(text,mn[z[kt][4]]);
         if (kt<5) *strcatf(text,mn[3]);
         else {
         if (kt<14) *strcatf(text,mn[4]);
         else *strcatf(text,mn[5]);
         }; 
         put_string(112,9,text,colr[2]);
         if (keypress==keyb) reg1=3;    //возврат в меню меню синхронизации
         if (keypress==keyc) reg1=0;               //выход в меню развертки и усиления
       keypress=0;
      }; 
     };
 
//Генератор до 100 кгц
   if (reg==2)
   
   {
   ColorZone(0,0,131,175,colr[0]);
   //bgcolor=colr[0];
   put_stringf(60,20,ht1[2],colr[1]);
   put_stringf(60,60,ht1[hfm+2],colr[1]);
   put_stringf(60,80,ht1[he],colr[1]);
   reg3=0;
   };
   
   while (reg==2)
   {
   for (i=0;i<5;i++)
     {
     if (reg3==i) cb=colr[1];
             else cb=colr[0];
     put_char((60+i*6),50,0x2a,cb);
     put_char((60+i*6),40,48+hf1[i],colr[1]);
     };      
   if ((keypress==keyr)&(reg3<4)) reg3++;
   if ((keypress==keyl)&(reg3>0)) reg3--;
   if ((keypress==keyu)&(hf1[reg3]<9)) hf1[reg3]++;
   if ((keypress==keyd)&(hf1[reg3]>0)) hf1[reg3]--;
   if (keypress==keyc)
    {
    hfm++;
    if (hfm>5) hfm=1;
    put_stringf(60,60,ht1[hfm+2],colr[1]);
    };
   if (keypress==keys)
    {    
     delay_ms(200);
    
     putchar(0xff);
     putchar(he); 
     putchar(hfm);
     for (i=0;i<5;i++) putchar(hf1[i]);  
     };

   if (keypress==keys) he=!he,put_stringf(60,80,ht1[he],colr[1]);  
   if (keypress==keyb) reg=0;
     keypress=keyn;
   };
    
 //Генератор более 100 кгц
   if (reg==3)
   {
   ColorZone(0,0,131,175,colr[0]);
   //bgcolor=colr[0];
   put_stringf(30,40,ht1[2],colr[2]);
   put_stringf(30,90,ht1[he],colr[1]);
   OCR1AH=0x00;
   };
   while (reg==3)
   {
   delay_ms(500);
   if ((keypress==keyu)&(OCR1AL>0x02)) OCR1AL--;
   if ((keypress==keyl)&(OCR1AL>0x12)) OCR1AL=OCR1AL-0x10;
   if ((keypress==keyd)&(OCR1AL<0xff)) OCR1AL++;
   if ((keypress==keyr)&(OCR1AL<0xee)) OCR1AL=OCR1AL+0x10;
   if (keypress==keys) he=!he,put_stringf(30,90,ht1[he],colr[1]);
   TCCR1B=0x08+he;
   ColorZone(69,0,79,175,colr[0]);
   itoa(60000/OCR1AL,text),*strcatf(text,mn[2]),put_string(30,70,text,colr[2]);
   //text="6000",put_string(30,70,text,colr[2]);
   itoa(OCR1AL,text),put_string(90,70,text,blue);
   //text="кГц",put_string(125,70,text,blue); 
   if (keypress==keyb) reg=0;
     keypress=keyn;
   };       
 
 // Анализатор      
   if (reg==4)
      {
      PORTB.0=1;
      bgcolor=colr[0];
      put_stringf(0,9,txu[3],colr[1]);
      ram(colr[3]);
      for (y=0;y<162;y++) out[y]=1;
     // kt=kt1,sni=sni1,insyn=insyn1,synm=synm1,syne=syne1,mc=mc1,me=me1,ris=ris1;
      };
l05:  while (reg==4)
      {    
      ik=160/z[kt][0],xnm=255-i;
      if(xn>xnm) xn=xnm;
      if(mr>ik) mr=ik;
      if(ml>mr) ml=1;
      i=sni+1;
   // Синхронизация
     if ((!synm)&(keypress==keyn)&(!sm1)) goto sl14;
     sm1=0;     
     if (!syne) goto sl19;
     if (insyn) goto sl12;
     if (!ris) goto sl13;
     //while ((PINC.7)&(!PIND.2)) {};
     //while ((!PINC.7)&(!PIND.2)) {};
       #asm
lp14: in r24,0x13 
     andi r24,0x80
     breq lp13
     in r24,0x10
     andi r24,0x04
     breq lp14
lp13: in r24,0x13
     andi r24,0x80
     brne lp15
     in r24,0x10
     andi r24,0x04
     breq lp13
lp15: nop
     #endasm  
     goto sl19;
sl12: do  
     {
     //while ((PIND.3)&(!PIND.2)) {};
     i--;
     //while ((!PIND.3)&(!PIND.2)) {};
       #asm
lp11: in r24,0x10 
     andi r24,0x08
     breq lp10
     in r24,0x10
     andi r24,0x04
     breq lp11
lp10: in r24,0x10
     andi r24,0x08
     brne lp12
     in r24,0x10
     andi r24,0x04
     breq lp10
lp12: nop
     #endasm 
     }
     while (i); 
     goto sl19;
sl13: //while ((!PINC.7)&(!PIND.2)) {};
      //while ((PINC.7)&(!PIND.2)) {};
        #asm
lp17: in r24,0x13 
     andi r24,0x80
     brne lp16
     in r24,0x10
     andi r24,0x04
     breq lp17
lp16: in r24,0x13
     andi r24,0x80
     breq lp18
     in r24,0x10
     andi r24,0x04
     breq lp16
lp18: nop
     #endasm  
sl19: input(); 
sl14:    // Рисование графика без флика
      k=4;
      for (i=0;i<6;i++)
        {
        l=out[1],m=out[2],m&=k,l&=k,k=k<<1;
        if (l) l=18*i+17;
        else l=18*i+2;
        if (m) m=18*i+17;
        else m=18*i+2;
        drawLine(l,z[kt][0],m,2*z[kt][0],colr[0]);
        };
      out[1]=inp[xn+1];
      for (y=2;y<(ik);y++)
      {
      k=4;
      for (i=0;i<6;i++)
        {
        l=out[y],m=out[y+1],m&=k,l&=k,k=k<<1;
        if (l) l=18*i+17;
        else l=18*i+2;
        if (m) m=18*i+17;
        else m=18*i+2;
        drawLine(l,y*z[kt][0],m,(y+1)*z[kt][0],colr[0]);
        };
      out[y]=inp[y+xn];
      k=4;
      for (i=0;i<6;i++)
        {
        l=out[y-1],m=out[y],m&=k,l&=k,k=k<<1;
        if (l) l=18*i+17;
        else l=18*i+2;
        if (m) m=18*i+17;
        else m=18*i+2;
        drawLine(l,(y-1)*z[kt][0],m,y*z[kt][0],colp[i+3]);
        };
      };
      out[ik]=inp[xn+ik];
      k=4;
      for (i=0;i<6;i++)
        {
        l=out[ik-1],m=out[ik],m&=k,l&=k,k=k<<1;
        if (l) l=18*i+17;
        else l=18*i+2;
        if (m) m=18*i+17;
        else m=18*i+2;
        drawLine(l,(ik-1)*z[kt][0],m,ik*z[kt][0],colp[i+3]);
        };        
      grid(colr[4]);
      drmark(ml*z[kt][0],me,colr[6]),drmark(mr*z[kt][0],me,colr[7]);
       if (PORTD.4)
       {
       putchar(0xff);
       putchar(kt),putchar(ku),putchar(sni),putchar(insyn),putchar(ris);
       for (i=0;i<255;i++) putchar(inp[i]);
       };
           
      start++;
      if (((keypress==0)|(keypress==keys)) & start) goto l05;
      clsync(colr[0]);
      drsync(100,ris,colr[2]);
      bat();
      
      
      if (!reg2)                              //меню развертки
      { 
      ColorZone(0,12,18,144,colr[0]); 
      if (keypress) sm1=1,delay_ms(50);
         //bgcolor=colr[0];
      if ((keypress==keyr)&(kt<17))          //изменение развертки по горизонтали
         {
         ColorZone(20,14,130,174,colr[0]);   //больше мксек на деление
         kt++;
         };                                  
      if ((keypress==keyl)&(kt>0))           //меньше мксек на деление
         {
         ColorZone(20,14,130,174,colr[0]);
         kt--;
         };
      put_stringf(0,9,txr[kt],colr[5]);
      if (keypress==keyb) 
      {
      reg=0;            //выход в основное меню
      kt1=kt,ku1=ku,sni1=sni,insyn1=insyn,synm1=synm,syne1=syne,mc1=mc,me1=me,ris1=ris,syncd1=syncd;
      };
      
      if (keypress==keyc) reg2=1;           //выход в следующее меню смещения
      keypress=0;
      };
      if (reg2==1)                                 //меню смещений
      {  
         bgcolor=colr[0];
         put_stringf(31,9,tm[1],colr[1]); 
         while ((keypress==keyl)&(xn<(xnm-1))) 
          {
          xn++;
          multikey(xn,9);
          };                                        //смещение по горизонтали
         while ((keypress==keyr)&(xn>1)) 
          {
          xn--;         //больше-меньше
          multikey(xn,9);
          };
         ColorZone(9,12,18,82,colr[0]);
         itoa(xn,text),put_string(95,9,text,colr[3]);
         if (keypress==keyb) reg2=0;          //возврат в меню развертки
         if (keypress==keyc) reg2=2;               //выход в меню синхронизации
         keypress=0;
      };
      if (reg2==2)                                //меню синхронизации
      {  
         ColorZone(0,12,18,144,colr[0]);
         if (keypress==keyr) ris=!ris;                   //фронт-спад
         if (keypress==keyb) reg2=1;               //возврат в меню смещений
         if (keypress==keyc) reg2=3;               //выход в меню настройки синхронизации
       keypress=0;
      };
       if (reg2==3)                                 //меню настройки синхронизации
      {  
         syncset();                
         if (keypress==keyb) reg2=2;        //возврат в меню меню синхронизации
         if (keypress==keyc) reg2=4;               //выход в меню настройки маркеров
       keypress=0;
      }; 
       if (reg2==4)                                  //меню настройки маркеров
      {  
         markset();
         mll=ml*z[kt][3];
         mrl=mr*z[kt][3];
         if (kt==6 | kt==15) mll=mll>>1,mrl=mrl>>1;
         itoa(mll,text),*strcatf(text,mn[z[kt][4]]);
         put_string(31,9,text,colr[6]);
         itoa(mrl,text),*strcatf(text,mn[z[kt][4]]);
         put_string(68,9,text,colr[7]);
         itoa((mrl-mll),text),*strcatf(text,mn[z[kt][4]]);
         if (kt<5) *strcatf(text,mn[3]);
         else {
         if (kt<14) *strcatf(text,mn[4]);
         else *strcatf(text,mn[5]);
         }; 
         put_string(112,9,text,colr[2]);
         if (keypress==keyb) reg2=3;    //возврат в меню меню синхронизации
         if (keypress==keyc) reg2=0;               //выход в меню развертки и усиления
       keypress=0;
      }; 
      };
      
 //Настройка
   while(reg==5)
    {
      ColorZone(0,0,131,175,colr[0]),k=0;
      //bgcolor=colr[0];
      for (i=0;i<11;i++)  
       {
       if(colp[i+k]==colr[0]) k++;
       put_stringf(30,(10+i*10),tst[i],colp[i+k]);
       };
      k=1;pos=1;
      ncp=1;
      while (k)
        {
        for (i=1;i<11;i++)
          {
           if (pos==i) cb=colr[1];
           else cb=colr[0];
           put_char(20,(8+i*10),0x2a,cb);
          };
        for (i=1;i<9;i++)
          {  
           ColorZone((10+10*i),30,18+10*i,80,colr[i-1]);
          };  
    if (keypress==keyu) pos--;
    if (pos==0) pos=10;
    if (keypress==keyd) pos++;
    if (pos==11) pos=1;
    if ((keypress==keyr)&(ncp>1)) ncp--,colr[pos-1]=colp[ncp];
    if ((keypress==keyl)&(ncp<12)) ncp++,colr[pos-1]=colp[ncp];
    if (keypress==keyb) 
     {
      for (i=0;i<9;i++) col1[i]=colr[i];
      k=0;reg=1;
     };
     
     if ((keypress==keyc)&(pos==10)) 
     {
     for(i=0;i<9;i++) colr[i]=col0[i];
     kt=kt0,ku=ku0,sni=sni0,insyn=insyn0,synm=synm0,syne=syne0,mc=mc0,me=me0,ris=ris0,syncd=syncd0;
     };
     if(colr[0]==colr[1]) colr[1]=!colr[1];
     if ((keypress==keyc)&(pos==9)) PORTD.4=!PORTD.4;  
    keypress=keyn;
    };
      };
      
      
       
      goto l01;                
      
}
