; ***** PIC16F648A ASM Source File For PIC-DTMF Controller *****
;                                    *** (Ver.60713, by T.S) ***
       	list	p=pic16f648a
;	include pic16f648a.inc
;      _config _osc_hs & _wdt_disable & _pwrte_enable & _mclre_internal & _boden _enable & _lvp_rb4:gpio & _cpd_disable & _cp_disable (for AKI writer)

ra	equ	h'05'
rb	equ	h'06'

outb	equ	h'20'
fr	equ	h'21'
dat	equ	h'22'
kt	equ	h'23'
ft	equ	h'24'

tim1	equ	h'25'
tim2	equ	h'26'
tim3	equ	h'27'
tim4	equ	h'28'
timdt   equ	h'29'

flg	equ	h'2a'
stml	equ	h'2b'
stmm	equ	h'2c'
stmh	equ	h'2d'
otdt	equ	h'2e'
cldt	equ	h'2f'

	org	0
	goto	start

start
	clrf	ra
	clrf	rb
	clrf	outb
	clrf	dat

	movlw	h'07'
	movwf	h'1f'
	bsf	h'03',5		;以下ポートの入出力設定
	movlw	b'111111'         ;aポート全て入力
	movwf	h'05'
	movlw	b'00000000'	;bポート全て出力
	movwf	h'06'
	bcf	h'03',5		;以上ポート入出力設定終了

; ***** メインプログラムスタート *****

main

	movlw	d'16'		;遅延タイマー約1.6秒 設定値
	movwf	timdt

jp0			;***** 着信音待ち無限ループ *****
	movf	ra,0
	movwf	fr
	btfss	fr,5
	goto	jp0

	call	timr		;←着信音約1.6秒を鳴らさない場合は削除
	movlw	h'80'
	iorwf	outb,1
	movf	outb,0
	movwf	rb

	call	timr
	movlw	h'7f'
	andwf	outb,1
	movf	outb,0
	movwf	rb


jp1			;***** 以下データの取り込みルーチン *****
	clrf	fr
	clrf	flg
	clrf	kt
	clrf	ft
jpa
	nop
	movf	ra,0
	movwf	fr
	btfsc	fr,4
	goto	jpa
jpb			;スタートデータ取り込みは無限ループ
	nop
	nop
	movf	ra,0
	movwf	fr
	btfss	fr,4
	goto	jpb
	nop
	movf	ra,0
	movwf	dat		;"*"のスタートデータ取り込み
	movlw	h'0f'
	andwf	dat,1

	movlw	h'0b'
	movwf	fr
	movf	dat,0
	xorwf	fr,0
	btfss	h'03',2
	goto	jp1		;スタートデータが "*"でないとjp1戻り

	call	routb
	btfsc	flg,0
	goto	jp1
	call	routa		;一桁目データ取り込み
	btfsc	flg,0
	goto	jp1
	movf	dat,0		;一桁目データ → ktへ
	movwf	kt

	call	routb
	btfsc	flg,0
	goto	jp1
	call	routa		;二桁目データ取り込み
	btfsc	flg,0
	goto	jp1
	movf	dat,0		;二桁目データ → ftへ
	movwf	ft

			;***** 以下取り込みデータに従い出力する *****
	movlw	h'05'
	movwf	fr
	movf	kt,0
	xorwf	fr,0
	btfsc	h'03',2
	goto	jp2

	movlw	h'01'
	movwf	fr
	movf	kt,0
	xorwf	fr,0
	btfsc	h'03',2
	goto	jp3

	movlw	h'02'
	movwf	fr
	movf	kt,0
	xorwf	fr,0
	btfsc	h'03',2
	goto	jp4

	goto	jp1

jp2			;***** 以下約1.6秒間 ON-OFF 出力のルーチン *****
	movlw	h'0a'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp20
	movlw	h'7f'
	movwf	otdt
	movlw	h'00'
	movwf	cldt
	call	onof
	goto	jp1
jp20
	movlw	h'01'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp21
	movlw	h'01'
	movwf	otdt
	movlw	h'fe'
	movwf	cldt
	call	onof
	goto	jp1
jp21
	movlw	h'02'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp22
	movlw	h'02'
	movwf	otdt
	movlw	h'fd'
	movwf	cldt
	call	onof
	goto	jp1
jp22
	movlw	h'03'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp23
	movlw	h'04'
	movwf	otdt
	movlw	h'fb'
	movwf	cldt
	call	onof
	goto	jp1
jp23
	movlw	h'04'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp24
	movlw	h'08'
	movwf	otdt
	movlw	h'f7'
	movwf	cldt
	call	onof
	goto	jp1
jp24
	movlw	h'05'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp25
	movlw	h'10'
	movwf	otdt
	movlw	h'ef'
	movwf	cldt
	call	onof
	goto	jp1
jp25
	movlw	h'06'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp26
	movlw	h'20'
	movwf	otdt
	movlw	h'df'
	movwf	cldt
	call	onof
	goto	jp1
jp26
	movlw	h'07'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp27
	movlw	h'40'
	movwf	otdt
	movlw	h'bf'
	movwf	cldt
	call	onof
	goto	jp1
jp27			;*** 以下"59"は携帯電話を切る場合である ***
	movlw	h'09'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp1
	movlw	h'80'
	movwf	otdt
	movlw	h'7f'
	movwf	cldt
	call	onof
	goto	jp0		;着信音取り込み前に戻る


jp3			;***** 以下リレー ON のルーチン *****
	movlw	h'0a'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp30
	movlw	h'7f'
	iorwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp30
	movlw	h'01'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp31
	movlw	h'01'
	iorwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp31
	movlw	h'02'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp32
	movlw	h'02'
	iorwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp32
	movlw	h'03'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp33
	movlw	h'04'
	iorwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp33
	movlw	h'04'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp34
	movlw	h'08'
	iorwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp34
	movlw	h'05'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp35
	movlw	h'10'
	iorwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp35
	movlw	h'06'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp36
	movlw	h'20'
	iorwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp36
	movlw	h'07'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp37
	movlw	h'40'
	iorwf	outb,1
	movf	outb,0
	movwf	rb
jp37
	goto	jp1


jp4			;***** 以下リレー OFF のルーチン *****
	movlw	h'0a'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp40
	movlw	h'80'
	andwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp40
	movlw	h'01'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp41
	movlw	h'fe'
	andwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp41
	movlw	h'02'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp42
	movlw	h'fd'
	andwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp42
	movlw	h'03'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp43
	movlw	h'fb'
	andwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp43
	movlw	h'04'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp44
	movlw	h'f7'
	andwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp44
	movlw	h'05'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp45
	movlw	h'ef'
	andwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp45
	movlw	h'06'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp46
	movlw	h'df'
	andwf	outb,1
	movf	outb,0
	movwf	rb
	goto	jp1
jp46
	movlw	h'07'
	movwf	fr
	movf	ft,0
	xorwf	fr,0
	btfss	h'03',2
	goto 	jp47
	movlw	h'bf'
	andwf	outb,1
	movf	outb,0
	movwf	rb
jp47

	goto	jp1


; ******** サブルーチン　onof ********

onof
	movf	otdt,0
	iorwf	outb,1
	movf	outb,0
	movwf	rb

	call	timr
	movf	cldt,0
	andwf	outb,1
	movf	outb,0
	movwf	rb

	return

; ******** サブルーチン　timr　********

timr
	movf	timdt,0
	movwf	tim1
wa10	movlw	d'243'
	movwf	tim2
wa11	movlw	d'02'
	movwf	tim3
wa12	movlw	d'0'
	movwf	tim4
wa13	nop
	decfsz	tim4,1
	goto	wa13
	decfsz	tim3,1
	goto	wa12
	decfsz	tim2,1
	goto	wa11
	decfsz	tim1,1
	goto	wa10

	return

; ******** サブルーチン　routa　********

routa
	clrf	flg
	clrf	stml
	clrf	stmm
	movlw	d'110'			;キー入力待ち約12秒、これ以上エラー
	movwf	stmh

rja0
	movf	ra,0
	movwf	fr
	btfsc	fr,4
	goto	rja1

	decfsz	stml,1
	goto	rja0
	decfsz	stmm,1
	goto	rja0
	decfsz	stmh,1
	goto	rja0
	incf	flg,1
	goto	rja2
rja1
	nop
	movf	ra,0
	movwf	dat
	movlw	h'0f'
	andwf	dat,1
rja2
	return

; ******** サブルーチン　routb　********

routb
	clrf	flg
	clrf	stml
	clrf	stmm
	movlw	d'110'			;キー入力待ち約12秒、これ以上エラー
	movwf	stmh

rjb0
	movf	ra,0
	movwf	fr
	btfss	fr,4
	goto	rjb1

	decfsz	stml,1
	goto	rjb0
	decfsz	stmm,1
	goto	rjb0
	decfsz	stmh,1
	goto	rjb0
	incf	flg,1
rjb1
	return


	end
