;----------------------------------------------------------------------------
; decode.asm for tiny15L
; 3チャンネルデコーダー
; PB2: 入力(負論理)
; PB3: ch1出力(正論理)
; PB4: ch2出力(正論理)
; PB1: ch3出力(正論理)]
;----------------------------------------------------------------------------

.include	"c:\avrtools\appnotes\tn15def.inc"

.def	temp	= r16		;r0からr31までが汎用レジスタ
.def	gapcnt1	= r17		;だがすべての命令が使えるのはr16からr31まで
.def	gapcnt2 = r18

.org	0

	rjmp	reset		;パワーオンリセット
	reti			;ATtiny15Lには8つの割り込みがあるがすべて未使用
	reti
	reti
	reti
	reti
	reti
	reti
	reti

reset:
;-- OSCCALレジスタに発振周波数校正値をセット --
	ldi	temp, $3F
	out	EEAR, temp
	sbi	EECR, EERE
	in	temp, EEDR
	out	OSCCAL, temp

	ldi	temp, 0b00011011
	out	DDRB, temp	;PB0,PB1,PB3,PB4を出力に設定
	ldi	temp, 0b00000100
	out	PORTB, temp	;PB2 pull-up
	clr	gapcnt1
	clr	gapcnt2
	
;-- ギャップ検出 ---------------
loop:	in	temp, PINB
	sbrc	temp, 2		;Skip if Bit in Register is Cleared
				;入力がゼロなら次をスキップ
	rjmp	out_h		;入力が1ならout_hへ
	cpi	gapcnt2, 3	;今回のギャップ検出ループでは3.84msecとなる
	clr	gapcnt1
	clr	gapcnt2
	brlo	loop		;
	rjmp	output		;output処理へ
out_h:	inc	gapcnt1
	brbs	1, lp1		;Branch if Bit in SREG is Set
	rjmp	loop		;Zフラグが1(桁上がり)ならlp1へ
lp1:	inc	gapcnt2
	rjmp	loop

;-- 出力 -----------------------
output:
;-- ch1 --
	sbi	PORTB, 3       	;PB3 ON
o1:	in	temp, PINB
	sbrs	temp, 2		;入力が1なら次をスキップ
	rjmp	o1
o2:	in	temp, PINB
	sbrc	temp, 2		;入力がゼロなら次をスキップ
	rjmp	o2
	cbi	PORTB, 3      	;PB3 OFF
;-- ch2 --
	sbi	PORTB, 4      	;PB4 ON
o3:	in	temp, PINB
	sbrs	temp, 2		;入力が1なら次をスキップ
	rjmp	o3
o4:	in	temp, PINB
	sbrc	temp, 2		;入力がゼロなら次をスキップ
	rjmp	o4
	cbi	PORTB, 4       	;PB4 OFF
;-- ch3 --
	sbi	PORTB, 1      	;PB1 ON
o5:	in	temp, PINB
	sbrs	temp, 2		;入力が1なら次をスキップ
	rjmp	o5
o6:	in	temp, PINB
	sbrc	temp, 2		;入力がゼロなら次をスキップ
	rjmp	o6
	cbi	PORTB, 1      	;PB1 OFF
	rjmp	loop