;	ckrecover.asm	(c) 2008 JA5FP
	list      p=12f675			; 
	#include	<p12f675.inc>		;
	errorlevel  -302			; 
	__CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT 

bps		EQU		0x20			;	1200bps:0 2400bps:1 4800bps:2 9600bps:3
t_low	EQU		0x21			;	'L'期間変数
t_high	EQU		0x22			;	'H'期間変数
		ORG		0x000		;
		goto	main			;
		ORG		0x004		;	割込みあれば
		BCF		PIR1,CMIF		;	フラグリセット
		goto	tol			;	基準タイミングに同期

main		BSF		STATUS,RP0	;Bank1
		call	0x3ff		;	内部発振器の
		MOVWF	OSCCAL		;	キャリブレート
		MOVLW	b'00001110'	;	CIN-,GP2,GP3を
		MOVWF	TRISIO		;	入力
		MOVLW	b'00000010'	;	GP1を
		MOVWF	ANSEL		;	アナログ入力
		MOVLW	b'00000100'	;	GP2を
		MOVWF	WPU			;	プルアップ
		MOVLW	b'00001000'	;	コンパレータ割込みを
		MOVWF	PIE1			;	使用
		CLRF	OPTION_REG	;
		BCF		STATUS,RP0	;Bank0
		BSF		INTCON,PEIE	;	ペリフェラル割込を使用
		MOVLW	b'00010100'	;	CIN-(GP1)が入力の
		MOVWF	CMCON		;	非反転コンパレータを構成

loop		MOVLW	b'00001100'	;	マスク
		ANDWF	GPIO,W		;	GP2,GP3の状態を
		MOVWF	bps			;	bpsに取得
		BCF		STATUS,C		;	bps変数に変換するため	
		RRF		bps,F		;	桁移動
		RRF		bps,F		;
		MOVF	bps,W		;	t_highを設定
		call	v_high		;
		MOVWF	t_high		;
		MOVF	bps,W		;	t_lowを設定
		call	v_low		;
		MOVWF	t_low		;
		MOVF	CMCON,W		;	COUTの状態合わせ
		BCF		PIR1,CMIF		;	割込フラグを落とす
		BSF		INTCON,GIE	;	割込みを許可
sing		DECFSZ	t_high,F		;	同期に対応する期間
		goto	sing			;
tol		BCF		INTCON,GIE	;	割込み禁止
		BCF		GPIO,GP5		;	強制的にGP5を'L'に
ling		DECFSZ	t_low,F		;	'L'期間
		goto	ling			;
		BSF		GPIO,GP5		;	クロックパルス発生
		BTFSS	CMCON,COUT	;	
		goto	d_low		;	
		BSF		GPIO,GP4		;
		NOP					;
		goto	loop			;
d_low	BCF		GPIO,GP4		;
		goto	loop			;

v_high	ADDWF	PCL,F		;t_high変換ルーチン
		RETLW	0x80			;	1200bps
		RETLW	0x3b			;	2400bps
		RETLW	0x18			;	4800bps
		RETLW	0x08			;	9600bps
v_low	ADDWF	PCL,F		;t_low変換ルーチン
		RETLW	0x8b			;	1200bps
		RETLW	0x45			;	2400bps
		RETLW	0x23			;	4800bps
		RETLW	0x10			;	9600bps

		END					;


