; ***************************************************************
; Программа синтезатора FM2007 двухстрочный индикатор
; Mega8,  LMX2316.
; Начало разработки - 24 марта 2007 г.
; Первая рабочая версия 
; А.Денисов Москва.
; Добавление диапазона 250 МГц для САТКОМА
; модернизация 21 Августа 2011
; Author: UFO
; !!!!!!!!!!!!!!!!!НУЖНО ИЗМЕНИТЬ ПРОМЕЖУТОЧНУЮ ЧАСТОТУ РАВНУЮ 10700 КГЦ НА 45000КГЦ И ЧАСТОТУ ОСЦИЛЛЯТОРА С 10245КГЦ НА 10800. в КОММЕНТАРИЯХ УПОМЯНАЕТСЯ В САМОМ  КОНЦЕ КАК ПОНИМАЮ В РАЗДЕЛЕ КОНСТАНТ, НО КУДА ТАМ ЧТО ССЫЛАЕТСЯ И ЧТО МЕНЯТЬ СОВСЕМ НЕПОНЯТНО
; ***************************************************************
;Fuses 
;       BLEV    = 1
;       BODEN   = 1
;       SUT     = 2
;       CKSEL   = 4
;       BLB1    = 3
;       BLB0    = 3
;       RSTDSBL = 1
;       WDTON   = 1
;       CKOPT   = 1
;       EESV    = 1
;       BSIZ    = 0
;       BRST    = 1
;
.EQU IF10700 = 1		;промежуточная частота = 10700
;.EQU IF10700 = 0		;промежуточная частота = 10695

.include "m8def.inc"
.include "macro.avr"
.LIST
.LISTMAC            

.EQU ftakt=9000000
.EQU c5ms=ftakt/800     ; 5 ms
.EQU c50us=ftakt/80000  ; 50 us 
.EQU c500us=ftakt/20000  ; 200 us 
;
.EQU delsav=70
;
;---------------------------------------------
;Внешние выводы управления
;
.equ  sq_out   = PINB0     ;Выход шумодава
.equ  tone     = PINB1     ;Выход подтональника
;.equ  tx_out   = PINB2     ;Выход тангенты
.equ  tx_in    = PINB2     ;Вход тангенты
.equ  syn_stb  = PINB3     ;Строб синтезатора
.equ  pwr_out  = PINB4     ;Выход рег. мощности
.equ  mic_out  = PINB5     ;Выход рег. микрофона
;.equ  tx_in    = PINB6     ;Вход тангенты
;.equ  bnd_out  = PINB7     
;
.equ  min_stp  = PINC0     ;Шаг минус
.equ  pls_stp  = PINC1     ;Шаг плюс
.equ  fun      = PINC2     ;Клавиатура 1
.equ  scn      = PINC3     ;Клавиатура 2
.equ  chn      = PINC4     ;Клавиатура 3
.equ  bnd      = PINC5     ;Клавиатура 4
;
.equ  syn_dat  = PIND0     ;Данные синтезатора
.equ  syn_clk  = PIND1     ;Синхро синтезатора
.equ  dat2     = PIND2     ;
.equ  dat3     = PIND3     ;
.equ  wr1      = PIND4     ;Запись в индикатор
.equ  rs       = PIND5     ;Адрес индикатора
.equ  key_snd  = PIND6     ;Писк клавиатуры
.equ  bnd_out  = PIND7     ;Выход переключения диапазона
;
;---------------------------------------------
; Память программ
.CSEG
;
.def char1      = r0    ;
.def char2      = r1    ;
.def char3      = r2    ;
.def char4      = r3    ;
.def char5      = r4    ;
.def char6      = r5    ;
						;
.def char7      = r6    ;ячейки индикатора
.def char8      = r7    ;
.def char9      = r8    ;1
.def char10     = r9    ;4
.def char11     = r10   ;5
.def char12     = r11   ;3
.def char13     = r12   ;0
.def char14     = r13   ;0
.def char15     = r14   ;.
.def char16     = r15   ;0
;
.def H_byte     = r16   ;буфер преобразования
.def M_byte     = r17   ;
.def L_byte     = r18   ;
;
.def rsst0      = r19   ;
.def rsst1      = r20   ;
.def rsst2      = r21   ;
;
.def num        = r22   ;количество записей в ЕЕПРОМ
.def len        = r23   ;длина записи в ЕЕПРОМ
.def addr_H     = r24   ;адрес данных в ЕЕПРОМ (H)
.def addr_L     = r25   ;адрес данных в ЕЕПРОМ (L)
;
.def one	    = r26   ;
.def save       = r27   ;
.def temp       = r28   ;
.def acc        = r29   ;
;
; ***************************************************************
; ОЗУ
;Сегмент данных
        .DSEG
        .ORG 0x60
;
;=======================================================
;Данные, загружаемые из ЕЕПРОМ
;
rx0:     .byte     1       ;Частота приема
rx1:     .byte     1       ;
;
tx0:     .byte     1       ;Частота передачи
tx1:     .byte     1       ;
;
tn0:     .byte     1       ;Подтональник
tn1:     .byte     1
;
lfr0:    .byte     1       ;Нижняя граница перестройки
lfr1:    .byte     1       ;
;
hfr0:    .byte     1       ;Верхняя граница перестройки
hfr1:    .byte     1       ;
;
lscan0:  .byte     1       ;Нижняя граница сканирования
lscan1:  .byte     1       ;
;
hscan0:  .byte     1       ;Верхняя граница сканирования
hscan1:  .byte     1       ;
;
chan:    .byte     1       ;Номер канала
step:    .byte     1       ;Шаг
mode:    .byte     1       ;Режим
;
pwr:     .byte     1       ;Переключатели мощности передатчика, микрофона
;                                                   ;50 - 51 - 53
if0:     .byte     1       ;Промежуточная частота
if1:     .byte     1       ;
;
osc0:    .byte     1       ;Промежуточная частота
osc1:    .byte     1       ;
;
;-----------------------------------------
tim_sav:  .byte    1       ;Задержка cохранения данных в ЕЕПРОМ

pwr_edt:  .byte    1       ;признак редактирования уровня мощности.
mic_edt:  .byte    1       ;признак редактирования уровня микрофона.
;
rxfr:	  .byte	   1 	   ;признак редактирования первой частоты
edtrx:	  .byte	   1 	   ;признак изменения первой частоты

tmprx0:	  .byte	   1
tmprx1:	  .byte	   1
split:	  .byte	   1	   ;режим работы через спутник (crossband)
revers:	  .byte	   1	   ;реверс в режиме репитера

rej10:	  .byte	   1	   ;частоты, пропускаемые при сканировании 
rej11:	  .byte	   1

rej20:	  .byte	   1
rej21:	  .byte	   1

rej30:	  .byte	   1
rej31:	  .byte	   1

rej40:	  .byte	   1
rej41:	  .byte	   1
	
go:	  	  .byte	   1		;переменный шаг при быстрой перестройке
;
; ***************************************************************
; Память программ (ROM)

        .CSEG
        .ORG    0x00

; Точка старта программы
        rjmp    Start           ;Reset-vector
;
;               Вектора прерываний
;
        reti	   		        ;INT0
        reti      			    ;INT1
        reti      			    ;TIMER2 COMP
        reti     		        ;TIMER2 OVF
        reti      			    ;TIMER1 CAPT
        reti      			    ;TIMER1 COMPA
        reti      			    ;TIMER1 COMPB
        reti     			    ;TIMER1 OVF
        rjmp    save_freq       ;TIMER0 OVF
        reti         			;SPI STC
        reti         			;USART, RXC
        reti         			;USART, UDRE
        reti         			;USART, TXC
        reti        			;ADC
        reti          			;EE_RDY
        reti          			;ANA_COMP
        reti          		 	;TWI
        reti          			;SPM_RDY
save_freq:
		push	addr_H
		push	addr_L
		push	ZH
		push	ZL
        push    acc
        push    temp
		in		acc,sreg
		push	acc
        lds     acc,tim_sav
        cpi     acc,delsav              ;задержка в 3 секунды
        jz      end_int

        inc     acc
        sts     tim_sav,acc
        cpi     acc,delsav
        jnz      end_int
;================================
		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc              ;куда пишем
        ldi     addr_L,250
        lds     acc,mode
        rcall   write_byte
;
        lds     acc,mode
        tst     acc
        jz      save_vfoi

        ldi     addr_L,248
        lds     acc,chan                ;что пишем
        rcall   write_bytei
        rjmp    end_int
save_vfoi:
        ldi     addr_L,234
        ldi     temp,6                  ;сколько байт
        ldi     ZH,high(rx0)            ;что пишем
        ldi     ZL,low(rx0)
save_v1i:
        ld      acc,Z+
        rcall   write_bytei
        inc     addr_L
        djnz    temp,save_v1i
;================================
end_int:
		pop		acc
		out		sreg,acc
        pop     temp
        pop     acc
		pop		ZL
		pop		ZH
		pop		addr_L
		pop		addr_H
        reti

write_bytei:
        sbic    EECR,EEWE       ;Предыдущая запись закончена?
        rjmp    write_bytei
        out     EEARH,addr_H    ;Старший байт адреса
        out     EEARL,addr_L    ;Младший байт адреса
        out     EEDR,acc        ;Данные
        sbi     EECR,EEMWE
        sbi     EECR,EEWE       ;запуск записи
        ret
;


;
;=============================================
;---------------------------------------------
; Задержка 1.2 с
;---------------------------------------------
delay1200ms:
        ldi     temp,255 ; 255 * 5 ms wait
        rjmp    longdel1
;---------------------------------------------
; Задержка 200 мс
;---------------------------------------------
delay200ms:
        ldi     temp,40 ; 40 * 5 ms wait
        rjmp    longdel1

;---------------------------------------------
; Задержка 100 мс
;---------------------------------------------
delay100ms:
        ldi     temp,20 ; 20 * 5 ms wait
        rjmp    longdel1
;---------------------------------------------
; Задержка 50 мс
;---------------------------------------------
delay50ms:
        ldi     temp,10 ; 10 * 5 ms wait
longdel1:
        rcall   Delay5ms
        djnz    temp,longdel1
        ret
;---------------------------------------------
; Задержка 5 мс
;---------------------------------------------
delay5ms:
        push    ZH
        push    ZL
        ldi     ZH,high(c5ms)
        ldi     ZL,low(c5ms)
delay5ms1:
        sbiw    ZL,1
        brne    Delay5ms1
        pop     ZL
        pop     ZH
        ret
;
;---------------------------------------------
; Задержка 500 мкс
;---------------------------------------------
delay500us:
        push    ZH
        push    ZL
        ldi     ZH,high(c500us)
        ldi     ZL,low(c500us)
delay500us1:
        sbiw    ZL,1
        brne    delay500us1
        pop     ZL
        pop     ZH
        ret


;---------------------------------------------
; Задержка 50 мкс
;---------------------------------------------
delay50us:
		push	temp
        ldi     temp,c50us
delay50us1:
        nop
        djnz    temp,Delay50us1
		pop		temp
        ret

;---------------------------------------------
;сохранение текущих значений
save_all:
		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc              ;куда пишем
        ldi     addr_L,250
        lds     acc,mode
        rcall   write_byte
;
        lds     acc,mode
        tst     acc
        jz      save_vfo
save_chan:
        ldi     addr_L,248
        lds     acc,chan                ;что пишем
        rcall   write_byte
        rjmp    end_sav
save_vfo:
        ldi     addr_L,234
save_v:
        ldi     temp,6                  ;сколько байт
save_v2:
        ldi     ZH,high(rx0)            ;что пишем
        ldi     ZL,low(rx0)
save_v1:
        ld      acc,Z+
        rcall   write_byte
        inc     addr_L
        djnz    temp,save_v1
end_sav:
        ret
;
;---------------------------------------------
;Формирование управляющего слова для LMX2316
prep_syn:

        ldi     rsst0,0x00      ;Кварц 
        lds     rsst1,osc0
        lds     rsst2,osc1

        clc
        rol     rsst2      ;сдвинуть на 2 бита влево, control bits = 00)
        rol     rsst1
        rol     rsst0		

        clc
        rol     rsst2
        rol     rsst1
        rol     rsst0

        rcall   outwrd


        cpi    one,0x02     ;если равно 0х02 тоесть диапазон 430 MHz
		brne   obchod1
	    ldi    H_byte,0x01  ;то сюда запишем 1
		rjmp   next1        ;и продолжаем выполнять програму с точки next1 
obchod1:
        mov     H_byte,one      ;подготовка индикации

  next1:                         
        sbis    pinb,tx_in      ; Тангента нажата?
        rjmp    txm             ; да - передача

		                    ; нет - прием 
        cpi    one,0x02     ;если равно 0х02 тоесть диапазон 430 MHz
		brne   obchod11
		ldi    rsst0,0x01       ;correct my
        rjmp   next11
obchod11:
        mov     rsst0,one       
 next11:		 
        lds     acc,rx0
        mov     rsst1,acc       ;загружаем приемную частоту
        mov     M_byte,acc      ;копия для индикации
        lds     acc,rx1
        mov     rsst2,acc       ;(control bits = 01)
        mov     L_byte,acc      ;копия для индикации

		clc
		lds		acc,if1
		sub		rsst2,acc	;вычитаем промежуточную
		lds		acc,if0		;частоту  
		sbc		rsst1,acc

        rcall   calcsst
        rjmp    outwrd1

txm:                       ;передача
        cpi    one,0x02     ;если равно 0х02 тоесть диапазон 430 MHz
		brne   obchod2
		ldi    rsst0,0x01       ;correct my
        rjmp   next2
obchod2:
        mov     rsst0,one      ;передача 
 next2:		 
        lds     acc,tx0
        mov     rsst1,acc       ;загружаем передающую частоту
        mov     M_byte,acc      ;копия для индикации
        lds     acc,tx1
        mov     rsst2,acc       ;(control bits = 01)
        mov     L_byte,acc      ;копия для индикации
        rcall   calcsst
outwrd1:
        rcall   outwrd

        ldi     rsst0,0x00      ;Инициализация.
        ldi     rsst1,0x00
        ldi     rsst2,0x82
outwrd:                         ;Вывод в 2306 управляющего слова
        mov     acc,rsst0
        rcall   outdat
        mov     acc,rsst1
        rcall   outdat
        mov     acc,rsst2
        rcall   outdat
        nop                     ; задержка
        nop                     ; задержка
        nop                     ; задержка
                                ;строб - запись слова
                                ;во внутренние регистры 2316
        sbi     portb,syn_stb   ;CLK=1 _-
        sbi     portb,syn_stb   ;CLK=1 _-
        nop                     ; задержка
        nop                     ; задержка
        nop                     ; задержка
        cbi     portb,syn_stb   ;CLK=0 -_
		cbi     portb,syn_stb   ;CLK=0 -_
        nop                     ; задержка
        nop                     ; задержка
        nop                     ; задержка
        ret
;---------------------------------------------
;
calcsst:		;для LMX2316
        clc
        rol     rsst2
        rol     rsst1
        rol     rsst0

		sec

        rol     rsst2
        rol     rsst1
        rol     rsst0

        ret
;
;---------------------------------------------
;Выдать байт в 2306 Байт в acc
outdat:
        ldi     temp,8          ;загрузить 8 в счетчик бит.
outs11:
        clc                     ;сброс cary
        rol     acc             ;сдвиг acc влево через C
        brcc    noc1

        sbi     portd,syn_dat   ;установить DATA=1
        rjmp    drdy1
noc1:
        cbi     portd,syn_dat   ;установить DATA=0
drdy1:
        nop
        nop
;
        sbi     portd,syn_clk   ;CLK=1 _-
;
        nop
        nop
;
        cbi     portd,syn_clk   ;CLK=0 -_
;
        nop
        nop
;
        djnz    temp,outs11     ;проверить счетчик бит.
;
        ret
;
;-------------------------------------------------------
;Заполнение буфера индикатора символом "пробел"
clrrow:
        ldi     acc,0x20
        mov     char1,acc
        mov     char2,acc
        mov     char3,acc
        mov     char4,acc
        mov     char5,acc
        mov     char6,acc
        mov     char7,acc
        mov     char8,acc
clrrow1:
        clr     char9
        clr     char10
        clr     char11
        clr     char12
        clr     char13
        clr     char14
        clr     char15
        clr     char16
        ret


displ00:
        rcall   clrrow
		rjmp	display
;
;-------------------------------------------------------
;Преобразование BIN to BCD и вывод на индикатор
;-------------------------------------------------------
;
displ:
        rcall   clrrow

		lds		acc,split
		cpi		acc,'s'
		jnz		displ11
		mov		char8,acc
displ11:
        sbic	pinb,tx_in        ;передача
		rjmp	rxdispl
		ldi		acc,'T'
		mov		char1,acc
		rjmp	displ1
rxdispl:
		ldi		acc,'R'
		mov		char1,acc
displ1:
		ldi		acc,'x'
		mov		char2,acc
        lds     acc,mode
        tst     acc
        jz      display
;
        clr     acc
        lds     temp,chan       ;преобразование адреса
div10:
        cpi     temp,60
        jc      div101
        inc     acc
        subi    temp,60
        rjmp    div10
div101:
        mov     char4,acc
		ldi		acc,'0'
		add		char4,acc

        clr     acc
div1:
        inc     acc
        subi    temp,6
        jnc     div1
        cpi     acc,10
        jnz     dis0
        inc     char4
        clr     acc
dis0:
        mov     char5,acc
		ldi		acc,'0'
		add		char5,acc
dis00:
        lds     acc,tn0
        tst     acc
        jz      rep
dis2:
		ldi		acc,'t'
        mov     char7,acc
rep:
        lds     acc,tx1
        lds     temp,rx1
        cp      temp,acc
        jnz     rep_on
        lds     acc,tx0
        lds     temp,rx0
        cp      temp,acc
        jz      display
rep_on:
        ldi     acc,'R'
        mov     char6,acc

		lds		acc,revers
		cpi		acc,' '
		jz		display
		mov		char8,acc
;
;-------------------------------------------------------
;Умножение на 25 для индикации
;-------------------------------------------------------
display:
		push	R0
		push	R1
        ldi     acc,25
        mul     L_byte,acc
        mov     L_byte,R0
        push    R1
        mul     M_byte,acc
        mov     M_byte,R0
        mov     temp,R1
        pop     R1
		add     M_byte,R1
		jnc		no_cc
		inc		temp
no_cc:
		mul		H_byte,acc
		mov		H_byte,R0
        adc     H_byte,temp
		pop		R1
		pop		R0
;-------------------------------------------------------
        clc                             ; clear the carry bit
        ldi     temp,24
loop24:
        rol     L_byte
        rol     M_byte
        rol     H_byte
        rol     char16
        rol     char15
        rol     char14
        rol     char13
        dec     temp
        tst     temp
        jz      cod_LCD
        rjmp    adjDEC
cod_LCD:
; формируем код для LCD индикатора
		ldi		temp,0x30
        mov     acc,char13
        andi    acc,0x0f
		add		acc,temp
        mov     char9,acc

        mov     acc,char14
        swap    acc
        andi    acc,0x0f
		add		acc,temp
        mov     char10,acc

        mov     acc,char14
        andi    acc,0x0f
		add		acc,temp
        mov     char11,acc

        mov     acc,char15
        swap    acc
        andi    acc,0x0f
		add		acc,temp
        mov     char12,acc

        mov     acc,char15
        andi    acc,0x0f
		add		acc,temp
        mov     char13,acc

        mov     acc,char16
        swap    acc
        andi    acc,0x0f
		add		acc,temp
        mov     char14,acc

        mov     acc,char16
        andi    acc,0x0f

		add		acc,temp
        mov     char16,acc

		ldi		acc,'.'
		mov		char15,acc
;
;-------------------------------------------------------
;Вывод на индикатор содержимого буфера
outbuf:
        clr     temp                     ;флаг гашения нулей
        ldi     acc,0x80                ; Адрес начала строки
		rcall	outcom

        mov     acc,char1
        rcall   outbyt
        mov     acc,char2
        rcall   outbyt
        mov     acc,char3
        rcall   outbyt
        mov     acc,char4
        rcall   outbyt
        mov     acc,char5
        rcall   outbyt
        mov     acc,char6
        rcall   outbyt
        mov     acc,char7
        rcall   outbyt
        mov     acc,char8
        rcall   outbyt
        mov     acc,char9

        cpi     acc,0x30
        jz      outc9
		mov		temp,acc
		rjmp	outc91	 
outc9:
        ldi     acc,0x20
outc91:
        rcall   outbyt

        mov     acc,char10
        tst     temp
        jnz     outc101
        cpi     acc,0x30
        jz      outc10
		mov		temp,acc
		rjmp	outc101	 
outc10:
        ldi     acc,0x20
outc101:
        rcall   outbyt
        mov     acc,char11
        rcall   outbyt

        mov     acc,char12
        rcall   outbyt

        mov     acc,char13
        rcall   outbyt

        mov     acc,char14
        rcall   outbyt

        mov     acc,char15
        rcall   outbyt

        mov     acc,char16
        rjmp    outbyt
;
;-------------------------------------------------------
;
adjDEC:
        mov     acc,char16
        rcall   adjBCD
        mov     char16,acc
;
        mov     acc,char15
        rcall   adjBCD
        mov     char15,acc
;
        mov     acc,char14
        rcall   adjBCD
        mov     char14,acc
;
        mov     acc,char13
        rcall   adjBCD
        mov     char13,acc

        rjmp    loop24
;
adjBCD:
        push    temp
        ldi     temp,3
        add     temp,acc
        jnb     temp,3,bcd1
        mov     acc,temp
bcd1:
        ldi     temp,0x30
        add     temp,acc
        jnb     temp,7,bcd2         ; test if result > 7
        mov     acc,temp        	; save as MSD
bcd2:
        pop     temp
        ret
;
;-------------------------------------------------------
;Инициализация ЕЕПРОМ
;C 0 до 233 - 39 каналов для режима каналов
;       Структура:
;       два байта для RX частоты
;       два байта для TX частоты
;       два байта для частоты подтональника
;       Сначала все равны = 146025 (запрещенная частота)
mem_init:
        ldz     init
        rcall   outstr1         ;начальная заставка
;
        ldz     dat
        rcall   outstr2
; Частоты диапазона 144 мгц
        ldz     ch1_144                 ;первый канал на 144
        clr     addr_H
        clr     addr_L
        ldi     len,6
        ldi     num,1
        rcall   mem_write
;
        ldz     ch_144                  ;остальные каналы на 144
        ldi     len,6
        ldi     num,38
        rcall   mem_write
;
        ldz     ch_144_all              ;конец памяти на 144
        ldi     len,22
        ldi     num,1
        rcall   mem_write

; Частоты диапазона 144 мгц
        ldz     ch1_430                         ;первый канал на 430
        ldi     addr_H,1
        clr     addr_L
        ldi     len,6
        ldi     num,1
        rcall   mem_write
;
        ldz     ch_430                  ;остальные каналы на 430
        ldi     len,6
        ldi     num,38
        rcall   mem_write
;
        ldz     ch_430_all              ;конец памяти на 430
        ldi     len,22
        ldi     num,1
        rcall   mem_write
;-------------------------------------------------------
;Ждем отжатия всех клавишь
free_kbd:
        in      acc,pinc                ;клавиатура
        andi    acc,0b00111111
        cpi     acc,0b00111111
        jnz     free_kbd
        in      acc,pinb                ;тангента
        andi    acc,0b00000100
        jz      free_kbd
        rjmp    delay50ms
;-------------------------------------------------------
;Массовая запись в ЕЕПРОМ
;в Z - адрес откуда берем данные
;в addr_H, addr_L  - адрес в памяти, куда пишем
;в len - длина записи в байтах
;в num - количество записей
mem_write:
        push    len                     ;сохраняем длину записей
        push    ZH
        push    ZL
next_byt:
        lpm     acc,z+          ;читаем байт из памяти программ
        rcall   write_byte      ;пишем в ЕЕПРОМ
        inc     addr_L          ;Адрес = +1
        brne    no_c            ;addr_L = 0? Был перенос?
        inc     addr_H          ;Да, увеличиваем старший байт
no_c:
        djnz    len,next_byt    ;следующий байт записи
;
        pop     ZL
        pop     ZH
        pop     len                     ;следующая запись
        djnz    num,mem_write
        ret
;-------------------------------------------------------
;подпрограмма загрузки частот текущего канала в ОЗУ
read_chan:
		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc              ;куда пишем                ;откуда читаем
        lds     addr_L,chan
        rjmp    rlast
;
;-------------------------------------------------------
;подпрограмма загрузки последней частоты в ОЗУ
read_last:
		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc              ;куда пишем               ;откуда читаем
        ldi     addr_L,234
rlast:
        ldi     temp,6                  ;
rlast2:
        ldi     ZH,high(rx0)    ;куда пишем
        ldi     ZL,low(rx0)
rlast1:
        rcall   read_byte
        st      Z+,acc
        inc     addr_L
        djnz    temp,rlast1
        ret
;
;-------------------------------------------------------
;подпрограмма загрузки частот из ЕЕПРОМ в ОЗУ
ram_load:
		mov		acc,one
		clc
		ror		acc
        mov     addr_H,acc       ;откуда читаем
        ldi     addr_L,234
        ldi     temp,22
        rjmp    rlast2
;-------------------------------------------------------
;подпрограмма записи в энергонезависимую память
;входные данные : addr_H, addr_L - aдрес - куда писать,
;acc - что писать
;-------------------------------------------------------
write_byte:
        sbic    EECR,EEWE               ;Предыдущая запись закончена?
        rjmp    write_byte
        cli
        out     EEARH,addr_H    ;Старший байт адреса
        out     EEARL,addr_L    ;Младший байт адреса
        out     EEDR,acc                ;Данные
        sbi     EECR,EEMWE
        sbi     EECR,EEWE               ;запуск записи
        sei
        ret
;
;-------------------------------------------------------
;подпрограмма считывания байта из энергонезависимой памяти
;входные данные  addr_H, addr_L - aдрес откуда читать
;выходные данные acc - считанные данные
;-------------------------------------------------------
read_byte:
        sbic    EECR,EEWE               ;Предыдущая запись закончена?
        rjmp    read_byte
        cli
        out     EEARH,addr_H    ;Старший байт адреса
        out     EEARL,addr_L    ;Младший байт адреса
        sbi     EECR,EERE
        in      acc,EEDR  		;Чтение
        sei
        ret
;-------------------------------------------------------
;подпрограмма обнуления задержки сохранения текущей частоты
clr_del:
        push    acc
        clr     acc
        sts     tim_sav,acc
        pop     acc
        ret
;
;-------------------------------------------------------
;подпрограмма контроля границ сканирования
;бит "С" на выходе - превышение границ
limit_scan:
        lds     char13,lscan0                    ;нижняя граница
        lds     char14,lscan1
        lds     char15,hscan0                    ;верхняя граница
        lds     char16,hscan1
        rjmp    limits
;-------------------------------------------------------
;подпрограмма контроля границ перестройки
;бит "С" на выходе - превышение границ
limit_step:
        lds     char13,lfr0                      ;нижняя граница
        lds     char14,lfr1
        lds     char15,hfr0                      ;верхняя граница
        lds     char16,hfr1
limits:
        lds     acc,rx0
        lds     temp,rx1
lim:
        push    acc
        push    temp
        sub     temp,char14
        sbc     acc,char13
        pop     temp
        pop     acc
        jc		end_lim
        sub     char16,temp
        sbc     char15,acc
end_lim:
        ret
;-------------------------------------------------------
;подпрограмма вывода на индикатор в конфигурации
cdispl:
        lpm     acc,z+
        mov     char1,acc
        lpm     acc,z+
        mov     char2,acc
        lpm     acc,z+
        mov     char3,acc
        rcall   clrrow1

        rjmp    display
;
;---------------------------------------------
; Вывод знака в индикатор
;---------------------------------------------
outbyt:
        push    acc                  ; Сохранение байта

        swap    acc                  ; обмен нибблов
        andi    acc,0x0F             ; обнуление мл. ниббла
		ori		acc,0x20			 ; RS=1 - данные
        rcall   outnib           	 ; вывод ст. ниббла
;
        pop     acc                  ; восстановление байта
        andi    acc,0x0F             ; обнуление мл. ниббла
		ori		acc,0x20
;---------------------------------------------
; Вывод ниббла из acc в индикатор
;---------------------------------------------
outnib:
;+++++++++++++++++++++++++++++++++++++++++++++
;Переключение диапазонов 
		tst		one			;Portd7=1 - 144мгц
		jnz		o430		;Portd7=0 - 430мгц
		ori		acc,0x80	;бит переключения диапазонов
;+++++++++++++++++++++++++++++++++++++++++++++
o430:
		ori		acc,0x10		 	 ; set E
        out     portd,acc            ; вывод байта
		nop
		nop
        cbi     portd,wr1            ; снятие Е
		rjmp	delay50us
;
;---------------------------------------------
; "Холодная" инициализация
;---------------------------------------------
coldinit:
        ldi     acc,0x30
cold1:
		swap	acc
        rcall   outnib          ; 1 Инициализация
        rcall   Delay5ms        ; задержка 5 мс
        rjmp    Delay5ms        ; задержка 5 мс
;---------------------------------------------
; Вывод команды в индикатор
;---------------------------------------------
outcom:
		cli
        push    acc             ; Сохранение байта
        swap    acc             ; обмен нибблов 
        andi    acc,0x0F        ; 
        rcall   outnib          ; вывод ст. ниббла
;
        pop     acc             ; восстановление байта
        andi    acc,0x0F        ; 
        rcall   outnib  		; вывод мл. ниббла
		sei
		rjmp	delay5ms
;---------------------------------------------
; Вывод текста на индикатор во 2 строку
; В Z адрес строки В ПАМЯТИ ПРОГРАММ, 
; в конце строки 0х00
;---------------------------------------------
outstr2:
        ldi     acc,0b11000000 ; Set DD-RAM-Adress
        rjmp    outstr
;---------------------------------------------
; Вывод текста на индикатор в 1 строку
; В Z адрес строки В ПАМЯТИ ПРОГРАММ, 
; в конце строки 0х00
;---------------------------------------------
outstr1:
        ldi     acc,0b10000000 ; Set DD-RAM-Adress
outstr:
        rcall   outcom
outstr11:
        lpm     acc,z+           ; Get a char
        tst     acc                      ; Null-Char?
        rz
        cpi     acc,0x0d
        rz
        rcall   outbyt          
        rjmp    outstr11   
;---------------------------------------------
; Обнуление 2 строки индикатора
clr2row:
        ldi     acc,0b11000000     ; Set DD-RAM-Adress
        rcall   outcom
		ldi		temp,16
clr2row1:
        ldi     acc,' '            ; Get a char
        rcall   outbyt
		djnz	temp,clr2row1     
        ret		
;

;----------------------------------------------
;Загрузка знакогенератора для приема
fontrx:
		ldi		temp,72		;
		ldz		fnt
		rjmp	font
;----------------------------------------------
;Загрузка знакогенератора для передачи
fonttx:
		ldi		temp,40		;
		ldz		fnttx	;
;----------------------------------------------
;Загрузка знакогенератора
font:
		ldi		acc,0x40		;
        rcall   outcom		;
font1:						;грузим знакогенератор
        lpm     acc,z+      ; Get a char
        rcall   outbyt		;
        djnz	temp,font1		;
		ret
;----------------------------------------------
;Замер С-метра		    
s_meter:
		ldi		acc,0xe7			;Старт АЦП
		out		ADMUX,acc

		in		acc,ADCSR
		ori		acc,0x40
		out		ADCSR,acc
s_met:
		in		acc,ADCSR
		andi	acc,0x10
		jz		s_met

		ldi		num,13
        ldi     acc,0b11000000	;вторая строка
        rcall   outcom

		in		temp,ADCH
		clc
		sbrc	temp,7
		ldi		temp,0x7f
		ror		temp
		ror		temp			;уменьшаем дискретность
		andi	temp,0x1f

		push	temp			;сохраняем для баллов и половинного значка
		ror		temp	
		andi	temp,0x1f
		jz		out_sm2
out_sm1:
		ldi		acc,8
		rcall   outbyt
		dec		num
		jz		out_ball
		djnz	temp,out_sm1
out_sm2:
		pop		temp			;есть половинка?
		push	temp
		ror		temp
		jnc		out_space
		ldi		acc,7
		rcall   outbyt
		dec		num
		jz		out_ball
out_space:				
		ldi		acc,0x20
		rcall   outbyt
		djnz	num,out_space
out_ball:						;вывод баллов в цифрах
        ldz     bal_db
		pop		temp			;восстанавливаем значение
		clc
		rol		temp
		rol		temp			;умножаем на 4 (число знаков в таблице баллов)
		ldi		acc,0
		add		ZL,temp
		adc		ZH,acc

        ldi     acc,0b11000000 + 13 ;Адрес позиции вывода баллов
        rjmp    outstr
;----------------------------------------------
;Плюс - минус шаг.		
plus_step:
		ldi		acc,' '
		sts		revers,acc			;сброс режима реверс
		rcall	plus_
		ldi		acc,10
pl_s1:
        sbic    pinc,pls_stp
		rjmp	delay50ms
		rcall	delay50ms
		dec		acc
		jnz		pl_s1
pl_s2:
		rcall	plus_
        sbic    pinc,pls_stp
		rjmp	delay50ms
		rcall	delay100ms
		rjmp	pl_s2
		rjmp	delay50ms

minus_step:
		ldi		acc,' '
		sts		revers,acc			;сброс режима реверс
		rcall	minus_
		ldi		acc,10
mn_s1:
        sbic    pinc,min_stp
		rjmp	delay50ms
		rcall	delay50ms
		dec		acc
		jnz		mn_s1
mn_s2:
		rcall	minus_
        sbic    pinc,min_stp
		rjmp	delay50ms
		rcall	delay100ms
		rjmp	mn_s2


minus_:
		rcall	clr_del
		rcall	pisk
        lds     acc,mode
        tst     acc
        cz      minus_vfo
        lds     acc,mode
        tst     acc
		cnz		minus_chan
        rcall   prep_syn
        rjmp    displ
minus_chan:                                             ;режим каналов
        lds     acc,chan
        tst     acc
        jz      chan204
        subi    acc,6
        rjmp    chanm
chan204:
        ldi     acc,204
chanm:
        sts     chan,acc
        rcall   read_chan
        rcall   limit_step
        jc      minus_chan
        ret
minus_vfo:                                              ;плавная перестройка
        lds     temp,step
        lds     acc,rx1
        sub     acc,temp
        sts     rx1,acc
        sts     tx1,acc
        lds     acc,rx0
        ldi     temp,0
        sbc     acc,temp
        sts     rx0,acc
        sts     tx0,acc
        rcall   limit_step
        rnc
        lds     acc,hfr0
        sts     rx0,acc
        sts     tx0,acc
        lds     acc,hfr1
        sts     rx1,acc
        sts     tx1,acc
		ret

plus_:
		rcall	clr_del
		rcall	pisk
        lds     acc,mode
        tst     acc
        cz      plus_vfo
        lds     acc,mode
        tst     acc
		cnz		plus_chan
        rcall   prep_syn
        rjmp    displ
plus_chan:                       ;режим каналов
        lds     acc,chan
        cpi     acc,204
        jz      chan0
        ldi     temp,6
        add     acc,temp
        rjmp    chanp
chan0:
        clr     acc
chanp:
        sts     chan,acc
        rcall   read_chan
        rcall   limit_step
        jc      plus_chan
        ret
plus_vfo:                                               ;плавная перестройка
        lds     temp,step
        lds     acc,rx1
        add     acc,temp
        sts     rx1,acc
        sts     tx1,acc
        lds     acc,rx0
        ldi     temp,0
        adc     acc,temp
        sts     rx0,acc
        sts     tx0,acc
        rcall   limit_step
        rnc     
        lds     acc,lfr0
        sts     rx0,acc
        sts     tx0,acc
        lds     acc,lfr1
        sts     rx1,acc
        sts     tx1,acc
        ret
;
;---------------------------------------------
; "Писк" нажатия клавиш
;---------------------------------------------
pisk:
		ldi		temp,100
pisk1:
		sbis	portd,key_snd
		rjmp	bitis1
		cbi		portd,key_snd
		rjmp	bitis0
bitis1:
		sbi		portd,key_snd
bitis0:
		rcall	delay500us
		djnz	temp,pisk1
		cbi		portd,key_snd
		ret
;
;---------------------------------------------
; Обмен диапазонами
;---------------------------------------------
swapband:
		rcall	save_all
        ldi     addr_H,1
        ldi     addr_L,251
        rcall   read_byte			;какой диапазон был последний
		ldi		temp,0x20
		eor		acc,temp
		push	acc
        ldi     addr_H,1
        ldi     addr_L,251
        rcall   write_byte

		pop		acc

		swap	acc
		andi	acc,0x03      

		mov		one,acc
        rcall   RAM_load

        lds     acc,pwr
		andi	acc,0x03
		swap	acc
		ori		acc,0b01000101

		out		portb,acc			;выводим на выводы порта регулировку микрофона и мощности

        lds     acc,mode
        tst     acc
        cnz     read_chan
		rcall	clr2row
		ret
;
;*********************************************************************
;*###################################################################*
;*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*
;*###################################################################*
;*-------------------------------------------------------------------*
;*------------------- Начало программы ------------------------------*
;*-------------------------------------------------------------------*
;*###################################################################*
;*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*
;*###################################################################*
;*********************************************************************
start:
        cli                        ; запрет прерываний

        ldi     acc,LOW(RAMEND)    ; Настройка стека
        out     SPL,acc
        ldi     acc,HIGH(RAMEND)   ; Настройка стека
        out     SPH,acc
                                   ; DDRX 0-вход 1-выход
                                   ; PORTX 0-нет подтяжки 1-есть
                                   ; Настройка портов на вход/выход
;
        ldi     acc,0b00111000     ; Порт В
        out     ddrb,acc
;
        ldi     acc,0b00110101     ; подтяжка
        out     portb,acc
;
        ldi     acc,0b00000000     ; Порт С
        out     ddrc,acc
;
        ldi     acc,0b11111111     ; подтяжка
        out     portc,acc

        ldi     acc,0b11111111     ; Порт D
        out     ddrd,acc
;
        ldi     acc,0b00000000     ; подтяжка
        out     portd,acc
;
;---------------------------------------------------------------------
; Инициализация индикатора
; адрес начала первой строки - 080Н
; адрес начала второй строки - 0С0Н
;
        rcall   coldinit       ; 1 Инициализация
        rcall   coldinit       ; 2 Инициализация
        rcall   coldinit       ; 3 Инициализация
;
        ldi     acc,0x20
        rcall   cold1         ; Переключаем на 4-битный интерфейс
;
        ldi     acc,0x28
        rcall   outcom         ;4-битный интерфейс, 2-строки, шрифт-5х7 точек
;
        ldi     acc,0x0c       ;включить дисплей, выключить курсор
        rcall   outcom
;
        ldi     acc,0x28
        rcall   outcom         ;4-битный интерфейс, 2-строки, шрифт-5х7 точек
;
        ldi     acc,0x01	 	;очистить дисплей и установить курсор в
        rcall   outcom			;начальную позицию
;
        ldi     acc,5
        out     TCCR0,acc
        ldi     acc,1
        out     TIMSK,acc
;
        ldi     acc,delsav         ;после включения
        sts     tim_sav,acc        ;сохраняться не нужно
;
        in      acc,pinc
        andi    acc,0b00000100
        cz      mem_init

        clr     addr_H
        ldi     addr_L,251
        rcall   read_byte
        andi    acc,0xf0
        cpi     acc,0x50
        cnz     mem_init
;-----------------------------------------------------
;горячий рестарт программы
hot_start:
        cli                        ; запрет прерываний

        ldi     acc,LOW(RAMEND)    ; Настройка стека
        out     SPL,acc
        ldi     acc,HIGH(RAMEND)   ; Настройка стека
        out     SPH,acc

		ldi		acc,' '
		sts		split,acc			;сброс режима сплит

		ldi		acc,0xe7			;Старт АЦП
		out		ADMUX,acc

		ldi		acc,0xc6
		out		ADCSR,acc

		rcall	free_kbd
        rcall   delay50ms

        ldi     addr_H,1
        ldi     addr_L,251
        rcall   read_byte		;какой диапазон был последний

		swap	acc
		andi	acc,0x0f  
		mov		one,acc
        rcall   RAM_load

        lds     acc,pwr
		andi	acc,0x03
		swap	acc
		ori		acc,0b01000101

		out		portb,acc			;выводим на выводы порта регулировку микрофона и мощности

        lds     acc,mode
        tst     acc
        cnz     read_chan
last_vfo:
		rcall	clr2row
;
main_loop:
		ldi		acc,' '
		sts		revers,acc			;сброс режима реверс
main_l:
        rcall   prep_syn
		rcall	fontrx
        sei                     ;разрешаем прерывания
        rcall   displ
inp_loop:
        sbis    pinc,pls_stp
        rcall   plus_step
        sbis    pinc,min_stp
        rcall   minus_step
inp_kbd:
		rcall	s_meter
                                ;обслуживание клавиатуры
 ;++++++++++++++++++++++++++++++++++++++++++++++++++++
        sbis    pinc,fun
        rjmp    fun_kbd                 ;function
 ;++++++++++++++++++++++++++++++++++++++++++++++++++++
        sbis    pinc,chn
        rjmp    chn_kbd                 ;chan-vfo
 ;++++++++++++++++++++++++++++++++++++++++++++++++++++
        sbis    pinc,scn
        rjmp    scn_kbd                 ;scan
 ;++++++++++++++++++++++++++++++++++++++++++++++++++++
        sbis    pinc,bnd
        rjmp    bnd_kbd                 ;Band
 ;++++++++++++++++++++++++++++++++++++++++++++++++++++
        sbis    pinb,tx_in
        rjmp    transmit                ;transmit
 ;++++++++++++++++++++++++++++++++++++++++++++++++++++
        rjmp    inp_loop
;
;function
fun_kbd:
		cli
		rcall	pisk
        ldz     mfun
        rcall   outstr2
		rcall	free_kbd
fun_kbd1:
        sbis    pinc,fun
 ;....................................................
        rjmp    fun_exit                  ;выход
        sbis    pinc,chn
 ;....................................................
        rjmp    tune_chan                 ;настройка каналов
        sbis    pinc,scn
 ;....................................................
        rjmp    tune_scan                 ;границы сканирования
        sbis    pinc,bnd
 ;....................................................
        rjmp    tune_band                 ;границы диапазона
        sbis    pinc,min_stp
 ;....................................................
        rjmp    tune_step                 ;настройка шага
        sbis    pinc,pls_stp
 ;....................................................
        rjmp    tune_step                 ;настройка шага
        sbis    pinb,tx_in
 ;....................................................
        rjmp    fun_exit                  ;выход
        rjmp    fun_kbd1
fun_exit:	
		rcall	pisk
        rjmp    hot_start                 ;выход
;тангента
transmit:
		rcall	delay50ms
		mov		acc,char8
		cpi		acc,'s'
		cz		swapband

		clr		addr_L
		ldi		addr_H,0xff
        cli
        cbi     ddrb,tone                 ;стоп подтональника

		rcall	fonttx
		clr		acc
		sts		mic_edt,acc	
		sts		pwr_edt,acc		      	  ;признак первого входа в редактирование
		rcall	delay50ms
        rcall   prep_syn                  ;частота в LMX и на индикатор
        rcall   displ

		rcall	txline

        lds     acc,tn0
        tst     acc                     ;есть подтональник?
        jz      notone                  ;нет

        out     OCR1AH,acc
        lds     acc,tn1
        out     OCR1AL,acc

        ldi     acc,0x0a
        out     TCCR1B,acc
        ldi     acc,0x40
        out     TCCR1A,acc
        sbi     ddrb,tone               ;старт подтональника
notone:
		cpi		addr_H,0xff
		jz		not1
		rcall	delay5ms
		ldi		acc,1
		add		addr_L,acc
		clr		acc
		adc		addr_H,acc
		cpi		addr_H,0x01
		cz		redraw	
not1:
;        cbi     portb,tx_out            ;выход тангенты
        sbic	pinb,tx_in              ;ждем отжатия.
		rjmp	notone1
		sbis	pinc,pls_stp
		rcall	tune_pwr
		sbis	pinc,min_stp
		rcall	tune_mic
		sbis	pinc,fun
		rcall	ton1750					
		rjmp	notone
notone1:
        cbi     ddrb,tone               ;стоп подтональника
;        sbi     portb,tx_out             ;выход тангенты
		rcall	clr2row

		lds		acc,pwr_edt
		tst		acc
		jnz		edt_eep
		lds		acc,mic_edt
		tst		acc
		jnz		edt_eep
		rjmp	no_edt
edt_eep:
		rcall	save_pwr_mic
no_edt:
		rcall	delay50ms
        sei

		mov		acc,char8
		cpi		acc,'s'
		cz		swapband

        rjmp    main_l
redraw:
		rcall	save_pwr_mic
		clr		addr_L
		ldi		addr_H,0xff
		clr		acc
		sts		mic_edt,acc	
		sts		pwr_edt,acc		      	  ;признак первого входа в редактирование
        rcall   prep_syn                  ;частота в LMX и на индикатор
        rjmp    displ
;
;-----------------------------------------------
save_pwr_mic:
        lds     temp,pwr
		andi	temp,0x03			;обнуляем лишние биты
		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc              
        ldi     addr_L,251

		mov		acc,one
		swap	acc
		tst		acc
		jnz		w430
		ori		temp,0x50
		mov		acc,temp
		rjmp	w144				
w430:
		ori		temp,0x20
		mov		acc,temp
w144:
        rjmp   write_byte
;
;-----------------------------------------------
;тональный вызов 1750 гц
ton1750:
		ldz		call1750
		rcall	outstr2

        ldi     acc,0x01
        out     OCR1AH,acc
        ldi     acc,0x6e
        out     OCR1AL,acc

        ldi     acc,0x0a
        out     TCCR1B,acc
        ldi     acc,0x40
        out     TCCR1A,acc
        sbi     ddrb,tone               ;старт подтональника
ton17:
		sbis	pinc,fun
		rjmp	ton17
        cbi     ddrb,tone               ;стоп подтональника

        lds     acc,tn0
        tst     acc                     ;есть подтональник?
        jz      txline                  ;нет

        out     OCR1AH,acc
        lds     acc,tn1
        out     OCR1AL,acc

        ldi     acc,0x0a
        out     TCCR1B,acc
        ldi     acc,0x40
        out     TCCR1A,acc
        sbi     ddrb,tone               ;старт подтональника

;
;-----------------------------------------------
;вывод указателя мощности и микрофона
txline:
		lds		acc,pwr
		andi	acc,0x03
		cpi		acc,3
		jz		txl3
		cpi		acc,2
		jz		txl2
		cpi		acc,1
		jz		txl1
		ldz		tlml
mtx:
		rjmp	outstr2
txl3:
		ldz		thmh
		rjmp	mtx
txl2:
		ldz		tlmh
		rjmp	mtx
txl1:
		ldz		thml
		rjmp	mtx
;
;-----------------------------------------------
;клавиша переключения диапазона
bnd_kbd:
		rcall	pisk

		mov		acc,char8
		cpi		acc,'r'		;если есть реверс, то его нужно выключить
		jnz		bnd1

		lds		acc,tx0
		lds		temp,rx0
		sts		rx0,acc
		sts		tx0,temp
		lds		acc,tx1
		lds		temp,rx1
		sts		rx1,acc
		sts		tx1,temp
		ldi		acc,' '
		sts		revers,acc
bnd1:
		mov		acc,char8
		cpi		acc,'s'		;если сплит уже включен, его нужно выключить
		jnz		bnd2
		ldi		acc,' '
		rjmp	sets2
bnd2:
		ldi		acc,20
sets1:
        sbic    pinc,bnd
		rjmp	nosplit
		rcall	delay50ms
		dec		acc
		jnz		sets1
		ldi		acc,'s'
sets2:
		sts		split,acc
		rcall	pisk
        rcall   prep_syn
        rcall   displ
		rcall	free_kbd
		rjmp	main_loop
nosplit:
		rcall	save_all
        ldi     addr_H,1
        ldi     addr_L,251
        rcall   read_byte			;какой диапазон был последний
		ldi		temp,0x20
		eor		acc,temp
        ldi     addr_H,1
        ldi     addr_L,251
        rcall   write_byte
        rcall   free_kbd                ;ждем отжатия.
        rjmp    hot_start
;
;-----------------------------------------------
;клавиша сканирование
scn_kbd:
        cli
		rcall	pisk
        rcall   free_kbd 

		mov		acc,one			;загружаем частоты для пропуска.
		clc						;
		ror		acc				;
		mov     addr_H,acc      ;        
        ldi     addr_L,210		;
        rcall   read_byte
		sts		rej10,acc

        ldi     addr_L,211
        rcall   read_byte
		sts		rej11,acc

        ldi     addr_L,216
        rcall   read_byte
		sts		rej20,acc

        ldi     addr_L,217
        rcall   read_byte
		sts		rej21,acc

        ldi     addr_L,222
        rcall   read_byte
		sts		rej30,acc

        ldi     addr_L,223
        rcall   read_byte
		sts		rej31,acc

        ldi     addr_L,228
        rcall   read_byte
		sts		rej40,acc

        ldi     addr_L,229
        rcall   read_byte
		sts		rej41,acc
;//////////////////////////////////////////////////////////////////
        rcall   free_kbd                ;ждем отжатия.
        rcall   delay50ms
scn_loop:
        rcall   delay5ms
        rcall   delay5ms
        rcall   clr_del
        lds     acc,mode
        tst     acc
        jz      scan_vfo
scan_chan:                                              ;режим каналов
        lds     acc,chan
        cpi     acc,210
        jz      scan0
        ldi     temp,6
        add     acc,temp
        rjmp    scanp
scan0:
        clr     acc
scanp:
        sts     chan,acc
        rcall   read_chan
		rcall	reject
		jc		scan_chan
        rcall   limit_step
        jc      scan_chan
        rjmp    scan_s
scan_vfo:                                               ;плавная перестройка
        lds     temp,step
        lds     acc,rx1
        add     acc,temp
        sts     rx1,acc
        sts     tx1,acc
        lds     acc,rx0
        ldi     temp,0
        adc     acc,temp
        sts     rx0,acc
        sts     tx0,acc
		rcall	reject
		jc		scan_vfo
        rcall   limit_scan
        jnc     scan_s
        lds     acc,lscan0
        sts     rx0,acc
        sts     tx0,acc
        lds     acc,lscan1
        sts     rx1,acc
        sts     tx1,acc
scan_s:
        rcall   prep_syn
        rcall   displ
		ldz		mscn
		rcall	outstr2
                                        ;выход по нажатию на клавишу или тангенту
        in      acc,pinc                ;клавиатура
        andi    acc,0b00111111
        cpi     acc,0b00111111
        jnz     stop_scan
        in      acc,pinb                ;тангента
        andi    acc,0b00000100
        jz      stop_scan
;
        ldi     temp,64
        rcall   scan_delay              ;;смотрим шумодав
;
        rcall   delay50ms

                                        ;выход по нажатию на клавишу или тангенту
        in      acc,pinc                ;клавиатура
        andi    acc,0b00111111
        cpi     acc,0b00111111
        jnz     stop_scan
        in      acc,pinb                ;тангента
        andi    acc,0b00000100
        jz      stop_scan
;
        ldi     temp,64
        rcall   scan_delay              ;;смотрим шумодав
                                
        rcall   delay50ms

                                        ;выход по нажатию на клавишу или тангенту
        in      acc,pinc                ;клавиатура
        andi    acc,0b00111111
        cpi     acc,0b00111111
        jnz     stop_scan
        in      acc,pinb                ;тангента
        andi    acc,0b00000100
        jz      stop_scan
;
        ldi     temp,64
        rcall   scan_delay              ;;смотрим шумодав

        rcall   delay50ms

                                        ;выход по нажатию на клавишу или тангенту
        in      acc,pinc                ;клавиатура
        andi    acc,0b00111111
        cpi     acc,0b00111111
        jnz     stop_scan
        in      acc,pinb                ;тангента
        andi    acc,0b00000100
        jz      stop_scan
;
        ldi     temp,64
        rcall   scan_delay              ;;смотрим шумодав

        rjmp    scn_loop
stop_scan:
        rcall   free_kbd                ;ждем отжатия.
		rcall	clr_del
        rcall   delay100ms
        rjmp    main_loop
;
scan_delay:
        in      acc,pinb
        andi    acc,0b00000001
        rnz
                                        ;5 сек слушаем
        in      acc,pinc                ;клавиатура
        andi    acc,0b00111111
        cpi     acc,0b00111111
        jnz     sscan
        in      acc,pinb                ;тангента
        andi    acc,0b00000100
        jz      sscan

        push    temp
		rcall	s_meter
        pop     temp

        rcall   delay5ms
        rcall   delay5ms
        rcall   delay5ms
        djnz    temp,scan_delay
        ret
sscan:
        pop     temp
        rjmp    stop_scan    

;-----------------------------------------------
; Проверка на запрещенные частоты
reject:
		lds		acc,rx0
		lds		temp,rej10
		cp		acc,temp
		jnz		re1
		lds		acc,rx1
		lds		temp,rej11
		cp		acc,temp
		jnz		re1
		sec
		ret
re1:
		lds		acc,rx0
		lds		temp,rej20
		cp		acc,temp
		jnz		re2
		lds		acc,rx1
		lds		temp,rej21
		cp		acc,temp
		jnz		re2
		sec
		ret
re2:
		lds		acc,rx0
		lds		temp,rej30
		cp		acc,temp
		jnz		re3
		lds		acc,rx1
		lds		temp,rej31
		cp		acc,temp
		jnz		re3
		sec
		ret
re3:
		lds		acc,rx0
		lds		temp,rej40
		cp		acc,temp
		jnz		re4
		lds		acc,rx1
		lds		temp,rej41
		cp		acc,temp
		jnz		re4
		sec
		ret
re4:
		clc
		ret


;-----------------------------------------------
;переключение канал-плавно 
chn_kbd:
		rcall	pisk

		mov		acc,char8
		cpi		acc,'s'
		jz		norevers	;реверс не в сплите

		mov		acc,char6
		cpi		acc,'R'
		jnz		norevers	;реверс только в режиме репитерных каналов

		mov		acc,char8
		cpi		acc,'r'
		jz		revers_off	;реверс нужно выключить
rev0:
		ldi		acc,20
rev1:
        sbic    pinc,chn
		rjmp	norevers
		rcall	delay50ms
		dec		acc
		jnz		rev1
rev2:
		lds		acc,tx0
		lds		temp,rx0
		sts		rx0,acc
		sts		tx0,temp
		lds		acc,tx1
		lds		temp,rx1
		sts		rx1,acc
		sts		tx1,temp
		ldi		acc,'r'
		sts		revers,acc
		rcall	pisk
rev3:
        rcall   prep_syn
        rcall   displ
        rcall   free_kbd           ;ждем отжатия клавиш
		rcall	delay50ms
		rjmp	main_l
revers_off:
		lds		acc,tx0
		lds		temp,rx0
		sts		rx0,acc
		sts		tx0,temp
		lds		acc,tx1
		lds		temp,rx1
		sts		rx1,acc
		sts		tx1,temp
		ldi		acc,' '
		sts		revers,acc
		rjmp	rev3

norevers:
        rcall   save_all
        lds     acc,mode
        com     acc
        sts     mode,acc
        tst     acc
        jz      to_vfo
        rcall   read_chan
        rjmp    to_chan
to_vfo:
        rcall   read_last
to_chan:
        rcall   prep_syn
        rcall   displ
        rcall   save_all
        rcall   free_kbd           ;ждем отжатия клавиш
        rjmp    main_loop
;
;-----------------------------------------------
;настройка каналов
tune_chan:
        cli                        ;запрет прерываний
		rcall	pisk
        clr     acc                ;1 канал при старте
        sts     chan,acc
		com     acc                ;режим каналов
        sts     mode,acc
chl3:
        rcall   read_chan          ;чтение частоты канала
        rcall   prep_syn           ;формирование делителей
        rcall   displ              ;вывод на индикатор
		ldz		mchan
		rcall	outstr2
        rcall   free_kbd           ;ждем отжатия клавиш
chl1:
        in      acc,pinc
        sbis    pinc,chn			;Канал  - 
        rjmp    stop_ch_tn          ;выход из режима
        sbis    pinc,fun
        rjmp    set_chan            ;редактирование текущего канала
		sbis	pinc,min_stp
        rjmp    minchan
		sbic	pinc,pls_stp
		rjmp	chl1
plchan:								;следующий канал
		rcall	pisk
        lds     acc,chan
        cpi     acc,6*38
        jnz     chl4
        ldi     acc,-6
chl4:
        ldi     temp,6
        add     acc,temp
        sts     chan,acc
        rjmp    chl3
minchan:							;предыдущий канал
		rcall	pisk
        lds     acc,chan
        tst     acc
        jnz     mch1
        ldi     acc,6*39
mch1:
        subi    acc,6
        sts     chan,acc
        rjmp    chl3
stop_ch_tun:
stop_ch_tn:
		rcall	pisk
		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc   
        lds     addr_L,chan
        rcall   save_v
        rcall   free_kbd        ;ждем отжатия клавиш
		rjmp	start			;холодный перезапуск
;-----------------------------------------------
;настройка текущего канала
set_chan:
		rcall	pisk
		rcall	delay50ms
        rcall   free_kbd                ;ждем отжатия клавиш

        ldz     mrxfr
		clr		acc
		sts		rxfr,acc				;признак 1 частоты
		sts		edtrx,acc				;еще не редактировалась

        rcall   tune_chn                ;настройка RX-TX

		rcall	pisk

        rcall   free_kbd                ;ждем отжатия клавиш
		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc   
        lds     addr_L,chan
        rcall   save_v
        rcall   free_kbd                ;ждем отжатия клавишь
rfr:
 
        rcall   free_kbd                ;ждем отжатия клавиш
		ldz     mtxfr

		ldi		acc,0xff
		sts		rxfr,acc		  		    ;признак 2 частоты

        rcall   tune_chn                ;настройка TX

		rcall	pisk

		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc   
        lds     addr_L,chan
        rcall   save_v
ton11:
        rcall   free_kbd        ;ждем отжатия клавишь

        rcall   clrrow			;очищаем строку

        lds     M_byte,tn0
        lds     L_byte,tn1

        ldz     tab_ton			;ищем, какой стоял подтональник
tab_loop:
		lpm		acc,Z+
		cp		acc,L_byte
		jnz		next_ton
		lpm		acc,Z+
		cp		acc,M_byte
		jz		found_ton
next_t:
		lpm		acc,Z+
		lpm		acc,Z+
		lpm		acc,Z+
		lpm		acc,Z+
		rjmp	tab_loop
next_ton:
		lpm		acc,Z+
		rjmp	next_t
found_ton:
		rcall	displ_ton
;---------------------------------------------------
;редактирование частоты подтональника.
tune_ton:
		ldi		save,60
tune_t:
        sbis    pinc,fun
        rjmp    tune_ton1              ;выход;
        sbis    pinc,chn			;Канал  - 
        rjmp    stop_ch_tn          ;перезагрузка
		sbis	pinc,min_stp
        rjmp    ton_minus
		sbic	pinc,pls_stp
        rjmp    tune_ton
ton_plus:
		ldi		temp,HIGH(end_table*2)
		ldi		acc,LOW(end_table*2)
		cp		temp,ZH
		jnz		ton_plus1
		cp		acc,ZL
		jnz		ton_plus1
		ldz		tab_ton
ton_plus1:
		lpm		acc,Z+
		sts		tn1,acc
		lpm		acc,Z+
		sts		tn0,acc

		rcall	displ_ton
		rcall	pisk
		mov		temp,save
		rcall	longdel1
		ldi		save,10
		rjmp	tune_t						
ton_minus:
		ldi		temp,HIGH(tab_ton1*2)
		ldi		acc,LOW(tab_ton1*2)
		cp		temp,ZH
		jnz		ton_minus1
		cp		acc,ZL
		jnz		ton_minus1
		ldz		last_ton
		rjmp	ton_plus1
ton_minus1:
		subi	ZL,12
		sbci	ZH,0
		rjmp	ton_plus1
tune_ton1:
		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc   
        lds     addr_L,chan
        rcall   save_v
tune_ton11:
        rcall   free_kbd        ;ждем отжатия клавишь
		rjmp	chl3
;----------------------------------------------------
;вывод на индикатор частоты подтональника
displ_ton:

		push	ZH
		push	ZL

        ldz     mtone
        rcall   outstr2

		pop		ZL
		pop		ZH

		ldi		acc,' '
		mov		char9,acc
		mov		char10,acc				
		mov		char11,acc
		lpm		acc,Z+
		mov		char12,acc
		lpm		acc,Z+
		mov		char13,acc
		lpm		acc,Z+
		mov		char14,acc
		ldi		acc,'.'
		mov		char15,acc
		lpm		acc,Z+
		mov		char16,acc
        rjmp   outbuf
;
;-----------------------------------------------
;настройка текущего параметра.
tune_chn:
        push    ZH
        push    ZL
        rcall   outstr2
        pop     ZL
        pop     ZH

		lds		acc,rxfr
		cpi		acc,0
		jz		tune_chn2

		lds		acc,rx0			;меняем местами RX-TX для второго параметра
		lds		temp,tx0
		sts		tx0,acc
		sts		rx0,temp
		lds		acc,rx1
		lds		temp,tx1
		sts		tx1,acc
		sts		rx1,temp

tune_chn2:
		ldi		acc,40
		sts		go,acc
		ldi		save,60	
tune_chn1:
		rcall	prep_syn
		rcall	displ
        sbis    pinc,fun
        rjmp	retret              ;выход
        sbis    pinc,chn			;Канал  - 
        rjmp	stop_tun            ;перезагрузка

		sbis	pinc,min_stp
        rjmp    mpar
		sbic	pinc,pls_stp
		rjmp	tune_chn2

ppar:
        ldi     acc,1
		sts		edtrx,acc
		lds		L_byte,rx1
		lds		M_byte,rx0
        add     L_byte,acc
        clr     acc
        adc     M_byte,acc
		sts		rx0,M_byte
		sts		rx1,L_byte
tune_chn11:
		rcall	pisk
		rcall	prep_syn
		rcall	displ
		mov		temp,save
		tst		temp
		jz		tune_chn1
		rcall	longdel1
		rcall	gominus
        rjmp    tune_chn1
mpar:
        ldi     acc,1
		sts		edtrx,acc
		lds		L_byte,rx1
		lds		M_byte,rx0
        subi    L_byte,1
        sbci    M_byte,0
		sts		rx0,M_byte
		sts		rx1,L_byte
        rjmp    tune_chn11
stop_tun:
		lds		acc,rxfr
		cpi		acc,0
		jnz		txfr

		lds		acc,edtrx
		cpi		acc,0
		jz		txfr1

		lds		acc,rx1
		sts		tx1,acc
		lds		acc,rx0
		sts		tx0,acc
		rjmp	stop_ch_tun
txfr:
		lds		acc,rx0			;меняем местами RX-TX для второго параметра
		lds		temp,tx0
		sts		tx0,acc
		sts		rx0,temp
		lds		acc,rx1
		lds		temp,tx1
		sts		tx1,acc
		sts		rx1,temp
txfr1:
		rjmp	stop_ch_tun
retret:
		lds		acc,rxfr
		cpi		acc,0
		jnz		txfrret

		lds		acc,edtrx
		cpi		acc,0
		rz

		lds		acc,rx1
		sts		tx1,acc
		lds		acc,rx0
		sts		tx0,acc
		ret
txfrret:
		lds		acc,rx0			;меняем местами RX-TX для второго параметра
		lds		temp,tx0
		sts		tx0,acc
		sts		rx0,temp
		lds		acc,rx1
		lds		temp,tx1
		sts		tx1,acc
		sts		rx1,temp
		ret

gominus:
		lds		save,go
		tst		save
		jz		gom
		dec		save
		sts		go,save
		ldi		save,5
gom:
		ret


;-----------------------------------------------
;настройка микрофона
tune_mic:
		clr		addr_L
		clr		addr_H

		ldz		mmic
		rcall	outstr1

		rcall	pisk

		lds		acc,mic_edt
		tst		acc
		jz		no_tun_mic

        lds     acc,pwr
		ldi		temp,0b00000010
		eor		acc,temp
		sts		pwr,acc
no_tun_mic:
		ldi		acc,0xff
		sts		mic_edt,acc
		lds		acc,pwr
		andi	acc,0x03
		swap	acc
		ori		acc,0b11000101
		tst		one
		jz		bnd144_1
		ori		acc,0x80
bnd144_1:
		out		portb,acc
		rcall	txline
himic22:
		sbic	pinc,min_stp
		rjmp	himic11
		rjmp	himic22
himic11:
		rjmp	delay50ms
;
;-----------------------------------------------
;настройка мощности
tune_pwr:
		clr		addr_L
		clr		addr_H
		ldz		mpwr
		rcall	outstr1

		rcall	pisk

		lds		acc,pwr_edt
		tst		acc
		jz		no_tun_pwr

        lds     acc,pwr
		ldi		temp,0b00000001
		eor		acc,temp
		sts		pwr,acc
no_tun_pwr:
		ldi		acc,0xff
		sts		pwr_edt,acc
		lds		acc,pwr
		andi	acc,0b00000011
		swap	acc
		ori		acc,0b11000101
		tst		one
		jz		bnd144_2
		ori		acc,0x80
bnd144_2:
		out		portb,acc
		rcall	txline
hpwr22:
		sbic	pinc,pls_stp
		rjmp	hpwr11
		rjmp	hpwr22
hpwr11:
		rjmp	delay50ms
;
;-----------------------------------------------
;настройка шага
tune_step:
		rcall	pisk
		rcall	delay50ms
        rcall   free_kbd                ;ждем отжатия клавиш

        ldz     mstep

		ldi		acc,248
        sts     chan,acc
		ldi     acc,0xff                ;режим каналов
        sts     mode,acc

;-----------
        rcall   outstr2
        rcall   read_chan          ;чтение частоты канала
		clr		acc
		sts		tn0,acc
		sts		tn1,acc
		sts		rx0,acc
        mov     M_byte,acc           ;подготовка индикации
        mov     H_byte,acc          
        lds     acc,rx1
        mov     L_byte,acc     
        rcall   displ00
tune_st1:
		ldi		save,60
tune_st2:
        sbis    pinc,fun
        rjmp	step_stop           ;выход
        sbis    pinc,chn			;Канал  - 
        rjmp	step_stop           ;выход
		 
		sbis	pinc,min_stp
        rjmp    min_st
		sbic	pinc,pls_stp
		rjmp	tune_st1
plus_st:
        ldi     acc,1
		lds		L_byte,rx1
        add     L_byte,acc
		sts		rx1,L_byte
pl_st_mn:
		rcall	pisk
		clr		acc
		sts		tn0,acc
		sts		tn1,acc
		sts		rx0,acc
        mov     M_byte,acc           ;подготовка индикации
        mov     H_byte,acc           
        lds     acc,rx1
        mov     L_byte,acc      

        rcall   displ00
		mov		temp,save
		rcall	longdel1
		ldi		save,10
		rjmp	tune_st2
min_st:
		lds		L_byte,rx1
        subi    L_byte,1
		sts		rx1,L_byte
		rjmp	pl_st_mn
step_stop:
		rcall	pisk
        rcall   free_kbd                ;ждем отжатия.
		lds		acc,rx1
		sts		tmprx1,acc

		ldi		acc,248
        sts     chan,acc
		ldi     acc,0xff                ;режим каналов
        sts     mode,acc
;
        rcall   read_chan          ;чтение частоты канала
		lds		acc,tmprx1
		sts		rx1,acc

		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc   
        lds     addr_L,chan
		ldi		temp,2
        rcall   save_v2
        rjmp	start
;
;-----------------------------------------------
;настройка границ диапазона
tune_band:
		rcall	pisk
		rcall	delay50ms
        rcall   free_kbd                ;ждем отжатия клавиш

        ldz     mlband

		ldi		acc,240
        sts     chan,acc
		ldi     acc,0xff                ;режим каналов
        sts     mode,acc

        rcall   tune_1f                ;настройка RX-TX
		rcall	pisk
;
		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc   
        lds     addr_L,chan
		ldi		temp,4
        rcall   save_v2
        rcall   free_kbd                ;ждем отжатия клавишь
 
		ldz     mhband

        rcall   tune_2f                ;настройка TX
		rcall	pisk

		lds		acc,rx0
		sts		tmprx0,acc
		lds		acc,rx1
		sts		tmprx1,acc

		ldi		acc,240
        sts     chan,acc
		ldi     acc,0xff           ;режим каналов
        sts     mode,acc
        rcall   read_chan          ;чтение частоты канала

		lds		acc,tmprx0
		sts		tx0,acc
		lds		acc,tmprx1
		sts		tx1,acc

		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc   
        lds     addr_L,chan
		ldi		temp,4
        rcall   save_v2
        rcall   free_kbd        ;ждем отжатия клавишь
		rjmp	start
;
;-----------------------------------------------
;настройка границ сканирования
tune_scan:
		rcall	pisk
		rcall	delay50ms
        rcall   free_kbd                ;ждем отжатия клавиш

        ldz     mlscan

		ldi		acc,244
        sts     chan,acc
		ldi     acc,0xff                ;режим каналов
        sts     mode,acc

        rcall   tune_1f                ;настройка RX-TX
		rcall	pisk
;
		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc   
        lds     addr_L,chan
		ldi		temp,4
        rcall   save_v2
        rcall   free_kbd                ;ждем отжатия клавишь
 
		ldz     mhscan

        rcall   tune_2f                ;настройка TX
		rcall	pisk

		lds		acc,rx0
		sts		tmprx0,acc
		lds		acc,rx1
		sts		tmprx1,acc

		ldi		acc,244
        sts     chan,acc
		ldi     acc,0xff           ;режим каналов
        sts     mode,acc
        rcall   read_chan          ;чтение частоты канала

		lds		acc,tmprx0
		sts		tx0,acc
		lds		acc,tmprx1
		sts		tx1,acc
tsk_reset:
		mov		acc,one
		clc
		ror		acc
		mov     addr_H,acc   
        lds     addr_L,chan
		ldi		temp,4
        rcall   save_v2
        rcall   free_kbd        ;ждем отжатия клавишь
		rjmp	start
; 
;-----------------------------------------------
;настройка 1 частоты
tune_1f:
        rcall   outstr2
        rcall   read_chan          ;чтение частоты канала
		clr		acc
		sts		tn0,acc
		sts		tn1,acc
        rcall   prep_syn           ;формирование делителей
        rcall   displ00
tume_1f1:
		ldi		acc,40
		sts		go,acc
		ldi		save,60
tune_1f2:
        sbis    pinc,fun
        ret                             ;выход
        sbis    pinc,chn			;Канал  - 
        rjmp	tsk_reset                ;перезагрузка
		 
		sbis	pinc,min_stp
        rjmp    min_1f
		sbic	pinc,pls_stp
		rjmp	tume_1f1
plus_1f:
        ldi     acc,1
		lds		L_byte,rx1
		lds		M_byte,rx0
        add     L_byte,acc
        clr     acc
        adc     M_byte,acc
		sts		rx0,M_byte
		sts		rx1,L_byte
pl_1f_mn:
		rcall	pisk
        rcall   prep_syn           ;формирование делителей
        rcall   displ00
		mov		temp,save
		tst		temp
		jz		tune_1f2
		rcall	longdel1
		rcall	gominus
		rjmp	tune_1f2
min_1f:
        ldi     acc,1
		lds		L_byte,rx1
		lds		M_byte,rx0
        subi    L_byte,1
        sbci    M_byte,0
		sts		rx0,M_byte
		sts		rx1,L_byte
		rjmp	pl_1f_mn

;-----------------------------------------------
;настройка 2 частоты
tune_2f:
        rcall   outstr2
        rcall   read_chan          ;чтение частоты канала
		clr		acc
		sts		tn0,acc
		sts		tn1,acc
		lds		acc,tx0
		sts		rx0,acc

		lds		acc,tx1
		sts		rx1,acc

        rcall   prep_syn           ;формирование делителей
        rcall   displ00
tume_2f1:
		ldi		save,60       
tune_2f2:
        sbis    pinc,fun
        ret                             ;выход
        sbis    pinc,chn			;Канал  - 
        ret			                ;перезагрузка
		 
		sbis	pinc,min_stp
        rjmp    min_2f
		sbic	pinc,pls_stp
		rjmp	tume_2f1
plus_2f:
        ldi     acc,1
		lds		L_byte,rx1
		lds		M_byte,rx0
        add     L_byte,acc
        clr     acc
        adc     M_byte,acc
		sts		rx0,M_byte
		sts		rx1,L_byte
pl_2f_mn:
		rcall	pisk
        rcall   prep_syn           ;формирование делителей
        rcall   displ00
		mov		temp,save
		rcall	longdel1
		ldi		save,5             
		rjmp	tune_2f2
min_2f:
        ldi     acc,1
		lds		L_byte,rx1
		lds		M_byte,rx0
        subi    L_byte,1
        sbci    M_byte,0
		sts		rx0,M_byte
		sts		rx1,L_byte
		rjmp	pl_2f_mn

;#####################################################################
;Загружаемые символы знакогенератора
;-------------------------------------------------------
;
fnttx:
	.db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	;код 0
;
	.db	0x00,0x00,0x1f,0x1f,0x00,0x1f,0x1f,0x00	;код 1 - ====
	.db	0x00,0x00,0x1f,0x1f,0x00,0x00,0x00,0x00	;код 2 - ----
	.db	0x00,0x00,0x00,0x00,0x00,0x1f,0x1f,0x00	;код 3 - ____
	.db	0x1c,0x12,0x1c,0x10,0x0a,0x15,0x15,0x11	;код 4 - P/M


fnt:
	.db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	;код 0
;
	.db	0x00,0x00,0x01,0x03,0x01,0x01,0x01,0x00	;код 1 - '1'
	.db	0x00,0x00,0x06,0x09,0x02,0x04,0x0f,0x00	;код 2 - '2'
	.db	0x00,0x00,0x0f,0x01,0x02,0x01,0x0f,0x00	;код 3 - '3'
	.db	0x00,0x00,0x03,0x05,0x0f,0x01,0x01,0x00	;код 4 - '4'
;
	.db	0x00,0x00,0x06,0x09,0x09,0x09,0x06,0x00	;код 5 - '0'
	.db	0x00,0x00,0x06,0x08,0x0e,0x09,0x06,0x00	;код 6 - '6'
	.db	0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x00	;код 7 - '>'
	.db	0x00,0x00,0x00,0x1b,0x1b,0x1b,0x1b,0x00	;код 8 - '>>'
;
;-------------------------------------------------------
;Сообщения и константы в памяти программ
;---------------------------------------------
;Cообщения
init:
		.DB 	" - SATCOM Sat - ",0x00,0x00
dat:
		.DB 	"Build 21.08.2011",0x00,0x00
mchan:
		.DB 	"Channel select  ",0x00,0x00		
mstep:
        .db     "Step select     ",0x00,0x00            ;St
mlscan:
        .db     "Scan LOW limit  ",0x00,0x00            ;ScL
mhscan:
        .db     "Scan HIGH limit ",0x00,0x00            ;ScH
mlband:
        .db     "Band LOW limit  ",0x00,0x00            ;bnL
mhband:
        .db     "Band HIGH limit ",0x00,0x00            ;bnH
mrxfr:
        .db     "RX frequency    ",0x00,0x00            ;rF
mtxfr:
        .db     "TX frequency    ",0x00,0x00            ;tF
mtone:
        .db     "SubTone         ",0x00,0x00            ;ton
mmic:
        .db     "Microphone level",0x00,0x00
mpwr:
        .db     "Power level     ",0x00,0x00
mfun:
        .db     "Function        ",0x00,0x00
thmh:
        .db     4,1,1,1,1,1,1,1,1,1,1,1,"    ",0x00,0x00
thml:
        .db     4,1,1,1,1,1,2,2,2,2,2,2,"    ",0x00,0x00
tlmh:
        .db     4,1,1,1,1,1,3,3,3,3,3,3,"    ",0x00,0x00
tlml:
        .db     4,1,1,1,1,1,"          ",0x00,0x00
call1750:
		.db		"Call 1750       ",0x00,0x00
mscn:
        .db     "Scanning...     ",0x00,0x00
; Децибелы превышения и баллы
bal_db:
		.db		' ',' ',' ', 0     	; 
		.db		'2','+',' ', 0		;2+      
		.db		'3',' ',' ', 0		;3
		.db		'3','+',' ', 0		;3+
		.db		'4',' ',' ', 0		;4
		.db		'4','+',' ', 0		;4+
		.db		'5',' ',' ', 0	    ;5
		.db		'5','+',' ', 0		;5+
		.db		'6',' ',' ', 0      ;6
		.db		'6','+',' ', 0		;6+
		.db		'7',' ',' ', 0      ;7
		.db		'7','+',' ', 0		;7+
		.db		'8',' ',' ', 0      ;8
		.db		'8','+',' ', 0		;8+
		.db		'9',' ',' ', 0      ;9+00
		.db		'9', 5,  3,  0	    ;9+03
		.db		'9', 5,  6,  0      ;9+06
		.db		'9', 1,  5,  0	    ;9+10
		.db		'9', 1,  3,  0      ;9+13
		.db		'9', 1,  6,  0		;9+16
		.db		'9', 2,  5,  0   	;9+20
		.db		'9', 2,  3,  0		;9+23
		.db		'9', 2,  6,  0   	;9+26
		.db		'9', 3,  5,  0		;9+30
		.db		'9', 3,  3,  0   	;9+33
		.db		'9', 3,  6,  0		;9+36
		.db		'9', 4,  5,  0   	;9+40
		.db		'9', 4,  3,  0		;9+43
		.db		'9', 4,  6,  0   	;9+46
		.db		'9','+','+', 0		;9++
		.db		'9','+','+', 0     	;9++
		.db		'9','+','+', 0		;9++
;
;=======================================================
;Константы
;=======================================================
;Таблица подтональников
;Коэффициенты рассчитаны для тактовой частоты
;процессора = 4000 кгц
;-------------------------------------------------------
;
tab_ton:
        .dw      9552
        .db      " ","6","7","0"   ;67.0
tab_ton1:
        .dw      8901
        .db      " ","7","1","9"   ;71.9

        .dw      8602
        .db      " ","7","4","4"   ;74.4

        .dw      8312
        .db      " ","7","7","0"   ;77.0

        .dw      8030
        .db      " ","7","9","7"   ;79.7

        .dw      7758
        .db      " ","8","2","5"   ;82.5

        .dw      7494
        .db      " ","8","5","4"   ;85.4

        .dw      7232
        .db      " ","8","8","5"   ;88.5

        .dw      6995
        .db      " ","9","1","5"   ;91.5

        .dw      6751
        .db      " ","9","4","8"   ;94.8

        .dw      6571
        .db      " ","9","7","4"   ;97.4

        .dw      6400
        .db      "1","0","0","0"    ;100.0

        .dw      6184
        .db      "1","0","3","5"    ;103.5

        .dw      5970
        .db      "1","0","7","2"    ;107.2

        .dw      5771
        .db      "1","1","0","9"    ;110.9

        .dw      5575
        .db      "1","1","4","8"    ;114.8

        .dw      5387
        .db      "1","1","8","8"    ;118.8

        .dw      5203
        .db      "1","2","3","0"    ;123.0

        .dw      5027
        .db      "1","2","7","3"    ;127.3

        .dw      4658
        .db      "1","3","1","8"    ;131.8

        .dw      4689
        .db      "1","3","6","5"    ;136.5

        .dw      4529
        .db      "1","4","1","3"    ;141.3

        .dw      4378
        .db      "1","4","6","2"    ;146.2

        .dw      4227
        .db      "1","5","1","4"    ;151.4

        .dw      4084
        .db      "1","5","6","7"    ;156.7

        .dw      3946
        .db      "1","6","2","2"    ;162.2

        .dw      3812
        .db      "1","6","7","9"    ;167.9

        .dw      3682
        .db      "1","7","3","8"    ;173.8

        .dw      3558
        .db      "1","7","9","9"    ;179.9

        .dw      3437
        .db      "1","8","6","2"    ;186.2

        .dw      3320
        .db      "1","9","2","8"    ;192.8

        .dw      3145
        .db      "2","0","3","5"    ;203.5

        .dw      3037
        .db      "2","1","0","7"    ;210.7

        .dw      2934
        .db      "2","1","8","1"    ;218.1

        .dw      2836
        .db      "2","2","5","7"    ;225.7

        .dw      2740
        .db      "2","3","3","6"    ;233.6

        .dw      2647
        .db      "2","4","1","8"    ;241.8

        .dw      2557
        .db      "2","5","0","3"    ;250.3
last_ton:
        .dw      0
        .db      "0","0","0","0"
end_table:
;
;-------------------------------------------------------
;Структура памяти по-умолчанию
;-------------------------------------------------------
;144 мегагерца
ch1_144:
 ;      .db     0xe3,0x9e,0xe2,0xae,0x20,0x78  ;145675/145075 - 77 первый канал
        .db     0xe2,0xb8,0xe2,0xb8,0,0  ;145100/145100 первый канал
ch_144:
        .db     0xe2,0xe0,0xe2,0xe0,0,0 ;145200/145200 остальные каналы
ch_144_all:
        .db     0xe3,0x58,0xe3,0x58,0,0 ;145500/145500 последняя частота (234-239)
        .db     0xe1,0x00,0xe4,0x20     ;144000/146000 границы диапазона (240-243)
        .db     0xe1,0xc8,0xe3,0xd0     ;144500/145800 границы сканирования (244-247)
        .db     0x00,0x0a               ;номер последнего ипользовавшегося канала (248),
                                        ;шаг - 10 * 2.5 кгц = 25 кгц (249)
        .db     0x00,0x50               ;0 - VFO mode, 1 - channel mode (250),
                                        ;5X-индикатор ЕЕПРОМ, (251)
										;0bXXXX00Х0 - низкая мощность,
										;0bXXXX00Х1 - высокая мощность,
										;0bXXXX000Х - низкая чувствительность микрофона,
										;0bXXXX001Х - высокая чувствительность микрофона,
.IF IF10700==1    
        .db     0x10,0xb8               ;промежуточная частота 10700 (252),(253)
        .db     0x10,0x02               ;осциллятор 10245 (254-255)
.ELSE
        .db     0x10,0xb6               ;промежуточная частота 10695 (252),(253)
        .db     0x10,0x00               ;осциллятор 10240 (254-255)
.ENDIF

; диапазон 250 (430) мгц --------------------  
ch1_430:		
        .db     0x91,0x7c,0xd1,0x8c,0,0 ;256950/297950 первый канал
ch_430:
        .db     0x8f,0x4c,0xcf,0x5c,0,0 ;255550/296550 остальные каналы
ch_430_all:

        .db     0x91,0x7c,0xd1,0x8c,0,0 ;256950/297950 последняя частота (234-239)
        .db     0x77,0x00,0xfe,0xf0     ;240000/327000 границы диапазона (240-243)
        .db     0x7b,0xb0,0xa5,0xe0     ;243000/270000 границы сканирования (244-247)
        .db     0x00,0x0a               ;номер последнего ипользовавшегося канала (248),
                                        ;шаг - 10 * 2.5 кгц = 25 кгц (249)
        .db     0x00,0x00               ;0 - VFO mode, 1 - channel mode (250),
                                        ;0X-индикатор 144, 2X-индикатор 430 (251)
										;0bXXXX00Х0 - низкая мощность,
									    ;0bXXXX00Х1 - высокая мощность,
									    ;0bXXXX000Х - низкая чувствительность микрофона,
										;0bXXXX001Х - высокая чувствительность микрофона,  
.IF IF10700==1    
        .db     0x10,0xb8               ;промежуточная частота 10700 (252),(253)
        .db     0x10,0x02               ;осциллятор 10245 (254-255)
.ELSE
        .db     0x10,0xb6               ;промежуточная частота 10695 (252),(253)
        .db     0x10,0x00               ;осциллятор 10240 (254-255)
.ENDIF
.exit