;-------------------------------------------------------------------------------
; decode.asm for PIC12F629
; 3チャンネルデコーダー
; GP3: 入力(負論理)
; GP0: ch1出力(正論理)
; GP1: ch2出力(正論理)
; GP2: ch3出力(正論理)
;-------------------------------------------------------------------------------

	list	P=PIC12F629
	include	"P12F629.INC"

; -- コンフィギュレーションビットの設定 --
	__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT

temp	equ	20h		;12F629では20hから64バイトがユーザーエリア
gapcnt1	equ	21h
gapcnt2	equ	22h

	org	0

	bsf	STATUS, RP0	;bank1に切り替え(以下の設定はbank1にマップされているため)
	call	3ffh		;内部発振周波数校正値の読み込み
	movwf	OSCCAL		;OCCALレジスタに校正値をセット
	movlw	b'00001000'	;BP3のみ入力GP5:4,2:0を出力に設定
	movwf	TRISIO		;TRISIOを設定しない場合の初期値はb'00111111'
				;つまり全部入力設定になっている
	movlw	b'00000000'
;		  ||||||||_______PS0: Prescaler Rate Select bits
; 		  |||||||________PS1: Prescaler Rate Select bits
; 		  ||||||_________PS2: Prescaler Rate Select bits
; 		  |||||__________PSA: Prescaler Assignment bit   今回は未使用
; 		  ||||___________T0SE: TMR0 Source Edge Select bit  今回は未使用
; 		  |||____________T0CS: TMR0 Clock Source Select bit 今回は未使用
; 		  ||_____________INTEDG: Interrupt Edge Select bit 今回は未使用
; 		  |______________GPPU: 0=GPIO pull-ups are enabled
	movwf	OPTION_REG	;OPTION_REG を設定しない場合初期値は b'11111111'
	bcf	STATUS, RP0	;bank0へ
	clrf	GPIO
	movlw	b'00000111'	;GP2:0 をデジタルI/Oに設定
	movwf	CMCON

	call	clr_cnt		;ギャップカウンタークリア

;-- ギャップ検出 --
loop	btfsc	GPIO, 3		;入力がゼロなら次をスキップ
	goto	out_h		;入力が1ならout_hへ
	movlw	d'2'		;wレジスタに2をセット 3.588msec
	subwf	gapcnt2, w	;w = gapcnt2 - w
	btfss	STATUS, C	;STATUSレジスタのキャリービットが1なら次をスキップ
	goto	lp1		;gapcnt2 < 2 ならlp1へ
	call	clr_cnt
	goto	output		;ギャップが検出されたのでoutputへ
lp1	call	clr_cnt		;ギャップカウンタークリア
	goto	loop

out_h	incf	gapcnt1, f
	btfss	STATUS, Z	;桁上げが発生したら次をスキップ
	goto	loop
	incf	gapcnt2, f
	goto	loop

;-- ギャップカウンタークリアルーチン --
clr_cnt	clrf	gapcnt1
	clrf	gapcnt2
	return

;-- 出力 --
output
;-- ch1 --
o1	bsf	GPIO, 0		;GP0 ON
	btfss	GPIO, 3		;入力が1なら次をスキップ
	goto	o1
o2	btfsc	GPIO, 3		;入力がゼロなら次をスキップ
	goto	o2
	bcf	GPIO, 0		;GP0 OFF
;-- ch2 --
o3	bsf	GPIO, 1		;GP1 ON
	btfss	GPIO, 3		;入力が1なら次をスキップ
	goto	o3
o4	btfsc	GPIO, 3		;入力がゼロなら次をスキップ
	goto	o4
	bcf	GPIO, 1		;GP1 OFF
;-- ch3 --
o5	bsf	GPIO, 2		;GP2 ON
	btfss	GPIO, 3		;入力が1なら次をスキップ
	goto	o5
o6	btfsc	GPIO, 3		;入力がゼロなら次をスキップ
	goto	o6
	bcf	GPIO, 2		;GP2 OFF

	goto	loop

; -- 発振周波数校正値呼び出しルーチン --
	org	0x3ff
	retlw	0x9c	;とりあえず手持ち個体の値をセット

	end