LIST P=16f84, E=2
	__CONFIG  03FF1             ; КВАРЦ-3FF1 RC-3FF3 генератор
#define bank0   bcf status,5      ;выбрать Bank 0
#define bank1   bsf status,5      ;выбрать bank 1
                ORG     0000H
	goto	init
prer	org	4
	btfsc	intcon,2
	goto	_end		;пеpеполн таймеp
	movlw	0
	movwf	rez1
	movwf	rez2
	movwf	cou1
	movwf	cou2
	movwf	cou3
	incf	cou1,f
	movwf	_a
	movwf	_b
	movwf	_t
	movwf	_t1
	movwf	_e
	movlw	buff
	movwf	ukaz
	movlw	0a0
	movwf	intcon
	call	in3
	movwf	_a
w1	call	in	
	movwf	_b
	movf	_a,w
	subwf	_b,w	;b-a
	bz	w7
	movwf	_t
	bnc	w4
	movf	_a,w
	subwf	_t,w	;w-a
	movwf	_t1
	bnc	w2
	movf	_a,w
	subwf	_t1,w	;w-a
	bnc	w3
	movlw	2
	goto	eror
w2	rlf	_t,f	;rlf w
	movf	_a,w
	subwf	_t,w	;w-a
	bnc	w7
w3	bcf	status,0
	rlf	rez1,f
	rlf	rez2,f
	incf	cou2,f
	decfsz	cou1,f
	goto	w3
	bsf	status,0
	rlf	rez1,f
	rlf	rez2,f
	incf	cou2,f
w8	bcf	status,0
	rrf	_b,w
	bcf	status,0
	addwf	_a,f
	rrf	_a,f
	goto	w9
w4	movf	_b,w
	subwf	_a,w	;a-b
	movwf	_t
	movf	_b,w
	subwf	_t,w	;w-b
	bnc	w6
	movwf	_t
	movf	_b,w
	subwf	_t,w	;w-b
	movlw	3
	bc	eror
w5	bsf	status,0
	rlf	rez1,f
	rlf	rez2,f
	incf	cou2,f
	decfsz	cou1,f
	goto	w5
	bcf	status,0
	rlf	rez1,f
	rlf	rez2,f
	incf	cou2,f
	rrf	_a,w
	bcf	status,0
	addwf	_b,f
	rrf	_b,w
	movwf	_a
w9
	movlw	9
	subwf	cou2,w
	bc	w14	;пpинят один символ
w9x	call	in
	movwf	_b
	movf	_a,w
	subwf	_b,w	;b-a
	bz	w13
	movwf	_t
	bnc	w10
	movf	_a,w
	subwf	_t,w	;w-a
	bnc	w11
	movwf	_t1
	movf	_a,w
	subwf	_t1,w	;w-a
	bnc	w12
	movlw	4
	goto	eror
w11	rlf	_t,f	;rlf w
	movf	_a,w
	subwf	_t,w	;w-a
	bnc	w13
w12	bsf	status,0
	rlf	rez1,f
	rlf	rez2,f
	incf	cou2,f
	goto	w8
w10	movf	_b,w
	subwf	_a,w	;a-b
	movwf	_t
;	rlf	_t,f
	movf	_b,w
	subwf	_t,w	;w-b
	bnc	w13
	movlw	5
	goto	eror
w13
	bcf	status,0
	rlf	rez1,f
	rlf	rez2,f
	incf	cou2,f
	goto	w9
w6	bcf	status,0
	rlf	_t,f
	movf	_b,w
	subwf	_t,w	;w-b
	bc	w5
w7	movf	_b,w
	addwf	_a,f
	rrf	_a,f
	incf	cou1,f
	goto	w1
w14	incf	cou3,f
	clrf	cou2
	movlw	1
	subwf	rez2,w
	bz	w15
	movlw	0
	subwf	rez2,w
	bnz	w16
	movlw	25
	subwf	rez1,w
	movlw	37
	bz	w17
	movlw	31
	subwf	rez1,w
	movlw	34
	bz	w17
	movlw	34
	subwf	rez1,w
	movlw	30
	bz	w17
	movlw	61
	subwf	rez1,w
	movlw	32
	bz	w17
	movlw	64
	subwf	rez1,w
	movlw	39
	bz	w17
	movlw	70
	subwf	rez1,w
	movlw	36
	bz	w17
w16	movlw	6
	goto	eror
w15	movlw	21
	subwf	rez1,w
	movlw	31
	bz	w17
	movlw	24
	subwf	rez1,w
	movlw	38
	bz	w17
	movlw	30
	subwf	rez1,w
	movlw	35
	bz	w17
	movlw	60
	subwf	rez1,w
	movlw	33
	bnz	w16
w17	movwf	_t
	movf	ukaz,w
	movwf	fcr
	sublw	2f
	bnc	w17x	;buff full
	movf	_t,w
	movwf	ind
	incf	ukaz,f
w17x	clrf	rez1
	clrf	rez2
	call	in
	goto	w9x

in	btfss	prizn,0
	goto	in3
in2	btfsc	portb,4		;ожд 0
	goto	in2
	bcf	prizn,0
	goto	in4
in3	btfss	portb,4		;ожд 1
	goto	in3
	bsf	prizn,0
in4	movf	tmr,w
	clrf	tmr
	return

init	bank1
	movlw	85	;было 87
	movwf	opt
	bank0
	movlw	10
	tris	portb
	movlw	0
	tris	porta
	movwf	portb
	call	zwuk1
init2	clrf	_t2
init3	btfss	portb,4
	goto	init4
	decf	_t,f
	bnz	init3
	decf	_t1,f
	bnz	init3
	decf	_t2,f
	bnz	init3
	call	zwuk1
	movlw	20
	movwf	portb
	sleep
init4	clrf	tmr
	movlw	88
	movwf	intcon
	goto	prer

_end	movlw	1
eror	movwf	_e
	bcf	intcon,7
	movlw	0	;18
	movwf	fcr
	movlw	0
	movwf	tmp_ea
	movlw	2f
	movwf	tmp
e1	movf	tmp_ea,w
	movwf	eeadr
	movf	ind,w
	movwf	eedata
	call	ee_wr
	incf	tmp_ea,f
	incf	fcr,f
	decf	tmp,f
	bnz	e1
	movf	cou3,w	;если счетчик =0 то обход
	iorlw	0
	bz	e2
	movlw	buff
	movwf	fcr
e3	movf	ind,w
	call	send
	incf	fcr,f
	decfsz	cou3,f
	goto	e3
e4	movlw	1
	subwf	_e,w
	bnz	e6	;error
e5	movlw	0a
	call	send
	movlw	0d
	call	send
	call	zwuk1
e2	goto	init2
e6	movlw	20
	call	send
	movlw	65
	call	send
	movlw	72
	call	send
	movlw	72
	call	send
	movlw	6f
	call	send
	movlw	72
	call	send
	movlw	20
	call	send
	movlw	30
	iorwf	_e,w
	call	send
	movlw	090
	movwf	_t2
	call	zwuk
	movlw	080
	movwf	_t2
	call	zwuk
	goto	e5
zwuk1	movlw	0a0
	movwf	_t2
zwuk	movlw	0
	movwf	_t
z0	movf	_t2,w
	movwf	_t1
z1	decf	_t1,f
	bnz	z1
	movlw	1
	andwf	_t,w
	bz	z2
	movlw	8
	movwf	portb
	goto	z3
z2	movlw	4
	movwf	portb
z3	decf	_t,f
	bnz	z0
	return

ee_wr	bank1	; Зап байт из EEDATA в EEPROM по адресу в EEADR. Прер должн.запрещены перед вызовом ee_wr.
	bsf     EECON1^80,WREN      ;разрешить запись в EEPROM
	movlw   55H            
	movwf   EECON2^80H
	movlw   0AAH
	movwf   EECON2^80H
	bsf     EECON1^80H,WR   ;начать запись
ee_wr1  btfsc   EECON1^80H,WR   ;запись завершена?
	goto    ee_wr1          ;нет
	bcf     EECON1^80H,WREN     ;запретить запись в EEPROM
	bank0
	return
ee_rd   bank1	; Прочитать байт EEPROM из EEPROM по адресу EEADR в EEDATA
	bsf     EECON1^80H,RD   ;начать
	bank0
	return                  ;при возвращении чтение должно быть завершено

;Subroutine---выдать байт из _t последовательно в RB5
send	movwf	_t
        movlw	8
	movwf	_t1     ;загрузить 9 в счетчик бит.
	movlw	2
	movwf	portb
;	bsf	portb,2
	call zdr
next	rrf     _t,f  ;сдвиг _t влево (через Cary)
	bc	next1
	movlw	2
	movwf	portb
;	bsf	portb,2
	goto 	next2
next1
	movlw	0
	movwf	portb
;	bcf	portb,2
next2	call	zdr
	decfsz  _t1,1   ;проверить счетчик бит.
	goto next
	movlw	0
	movwf	portb
;	bcf	portb,2
	call	zdr
	call	zdr
	return
zdr	movlw	1a	;19 -1b-rab	;17-19  16-pичное число, кваpц 3.52
	movwf	_t2
zdr1	decfsz	_t2,f
	goto	zdr1
	return

ind		EQU     0
tmr		EQU     1
pcl		EQU     2
status		EQU     3
fcr		EQU     4
porta		equ     5
portb		equ     6
eedata		equ	8
eeadr		equ	9
intcon		EQU	0BH
opt		equ	1
EECON1  equ     088H
EECON2  equ     089H
	;STATUS
C               EQU     0
DC              EQU     1
Z               EQU     2
PD              EQU     3
TO              EQU     4
RP0             EQU     5	;bank N
	;INTCON
RTIF		EQU	2
RTIE		EQU	5
GIE		EQU	7
	;OPTION
PS0		EQU	0	;delitel
PS1		EQU	1	;delitel
PS2		EQU	2	;delitel
PSA		EQU	3	;delitel
RB		EQU	7
OPT		EQU	1
WREN    equ     2
WR      equ     1
RD      equ     0

	cblock  0CH                 ;блок переменных
	tmp_ea
	tmp_ed
	prizn	;0bit -состояние b4
	cou1	;кол. пеpвых одинаковых бит
	cou2	;кол пpинятых бит
	cou3	;счетчик пpинятых байт
	_a
	_b
	_t
	_t1
	_t2
	rez2
	rez1
	tmp
	_e
	ukaz
	buff	;начало блока данных, ниже неpеменных не заводить 
	endc

	end