;1997/06/10 11:21
;1997/06/13 01:33
;Kawashima
;
;秋月のDTMF-Kitを流用してDTMFをRS-232C出力する
;プログラムで、N81設定です、ボーレートは4800bps
;
;Device	16C84
;File	T2RS_01.ASM
;OSC	XT(4.9152MHz)
;WDT	Off
;PuT	On
;CP	Off
;ID	Check-sum
;
;
;******************************************************
;	Include
;******************************************************
	include	"PIC16C84.INC"
;
;
;******************************************************
;	Define
;******************************************************
I_DTMF_DAT	equ	PORTB		; Bit0..3
I_DTMF_STD	equ	PORTA		; Bit4
O_RS_TXD	equ	PORTA		; Bit2
O_LCD_RS	equ	PORTA		; Bit1
O_LCD_E		equ	PORTA		; Bit0
O_LCD_DAT	equ	PORTB		; Bit4..7
O_LED		equ	PORTA		; Bit3
;
; X = 4.9152MHz, プリスケーラなし, TMR0 = 256
; ( X / 4 ) / 256 = 4800Hz → 0.2ms周期で割り込み発生
TIME_INT_BASE	equ	( 10 * 1000 / 4800 )
TIME_10MS	equ	( 10 * 10 / TIME_INT_BASE )
TIME_500MS	equ	( 500 / 10 )	; TimeBase 10ms
;
;
;******************************************************
;	Ram
;******************************************************
R_TOP		equ	( 00Ch )	;
R_TIME_10MS	equ	( R_TOP + 0 )	; 10msカウンタ
R_TIME_500MS	equ	( R_TOP + 1 )	; 500msカウンタ(Base 10msカウンタ)
R_TXD		equ	( R_TOP + 2 )	; 送信データ(0x00のみ送信要求なしコード)
R_SMODE		equ	( R_TOP + 3 )	; 送信シーケンスカウンタ
R_DTMF0		equ	( R_TOP + 4 )	; DTMF ScanBuff Now
R_DTMF1		equ	( R_TOP + 5 )	; DTMF ScanBuff Old-1
R_DTMF2		equ	( R_TOP + 6 )	; DTMF ScanBuff Old-2
R_DTMF_TMP	equ	( R_TOP + 7 )	; DTMF ScanFilter Math temporary
;
;
;******************************************************
;	Power On Reset
;******************************************************
	org	PIC84_RES
	goto	start			;
;
;
;******************************************************
;	Interrupt
;******************************************************
	org	PIC84_INT
	goto	int			;
;
;
;******************************************************
;	Start program
;******************************************************
start
	call	init_hard		;
	call	init_soft		;
;
	bsf	INTCON,GIE		; 全体の割り込み許可
;
;
;******************************************************
;	Main program
;******************************************************
main
	nop				;
	goto	main			; BackGroundは、なんも処理をしない
;
;
;******************************************************
;	Interrupt routine
;
;	BackGroud処理がないので、PushPop処理省略
;******************************************************
int
	bcf	INTCON,T0IF		; Clear T0IF flag
;
;	< RS-232C 送信処理 >
	movf	R_SMODE,W		;
	addwf	PCL,F			; PCL = PCL + W
	goto	int_txd_0		;
	goto	int_txd_1		;
	goto	int_txd_2		;
	goto	int_txd_3		;
	goto	int_txd_4		;
	goto	int_txd_5		;
	goto	int_txd_6		;
	goto	int_txd_7		;
	goto	int_txd_8		;
	goto	int_txd_9		;
	goto	int_txd_10		;
	goto	int_txd_11		;
;
int_txd_0
	movf	R_TXD,F			;
	btfss	STATUS,Z		; If R_TXD == null then skip
	goto	int_txd_inc		;
	goto	int_txd_ext		;
;
int_txd_1
	bcf	O_RS_TXD,2		; Set StartBit
	goto	int_txd_inc		;
;
int_txd_2
int_txd_3
int_txd_4
int_txd_5
int_txd_6
int_txd_7
int_txd_8
int_txd_9
;	rlf	R_TXD,F			; Rotete left f through carry
	rrf	R_TXD,F			; Rotete right f through carry
	btfss	STATUS,C		; If CY == 1 then skip
	goto	int_txd_9_10		;
	bsf	O_RS_TXD,2		; Set Data'1'
	goto	int_txd_inc		;
;
int_txd_9_10
	bcf	O_RS_TXD,2		; Set Data'0'
	goto	int_txd_inc		;
;
int_txd_10
	bsf	O_RS_TXD,2		; Set StopBit
	goto	int_txd_inc		;
;
int_txd_11
	clrf	R_SMODE			; smode = 0
	clrf	R_TXD			; Set 送信データnull
	goto	int_txd_ext		;
;
int_txd_inc
	incf	R_SMODE,F		; smode++
;
int_txd_ext
;
;	< 10msタイマー処理 >
	decfsz	R_TIME_10MS,F		;
	goto	int_exit		;
	movlw	TIME_10MS		;
	movwf	R_TIME_10MS		;
;
;	< DTMF 監視処理 (10ms毎に起動) >
	movf	I_DTMF_DAT,W		; Scan
	andlw	0x0f			; Mask Bit0..3
	movwf	R_DTMF0			;
	movf	I_DTMF_STD,W		;
	andlw	0x10			; Mask Bit4
	iorwf	R_DTMF0,F		; Set DTMF Code
;
	movf	R_DTMF0,W		; SoftFilter
	xorwf	R_DTMF1,W		;
	movwf	R_DTMF_TMP		;
	comf	R_DTMF_TMP,F		;
	movf	R_DTMF1,W		;
	xorwf	R_DTMF2,W		;
	andwf	R_DTMF_TMP,F		; ここで変化bitは1になっている
;
	movf	R_DTMF0,W		; DMTFのStDの_|~を取りたいのでこうする
	andwf	R_DTMF_TMP,F		;
	btfss	R_DTMF_TMP,4		; If StD = 0→1(DTMF信号有効) then skip
	goto	int_dtmf_ext		;
	movf	R_DTMF0,W		;
	andlw	0x0f			; Mask Bit0..3
	call	dtmf2asc		; 変換(DTMFcode→ASCIIcode)
;
	movf	R_TXD,F			;
	btfss	STATUS,Z		; If R_TXD == null then skip
	goto	int_dtmf_ext		;
	movwf	R_TXD			; Set 送信コード(送信要求込み)
;
int_dtmf_ext
	movf	R_DTMF1,W		; Renewal ScanBuff's
	movwf	R_DTMF2			;
	movf	R_DTMF0,W		;
	movwf	R_DTMF1			;
;
;	< 500msタイマー処理 >
	decfsz	R_TIME_500MS,F		;
	goto	int_exit		;
	movlw	TIME_500MS		;
	movwf	R_TIME_500MS		;
;
;	< DebugLed 反転処理 (500ms毎に起動) >
	movlw	B'00001000'		;
	xorwf	O_LED,F			;
;
int_exit
	retfie				; 割り込み終了
;
;
;******************************************************
;	Initial routine ( Hard )
;******************************************************
init_hard
; --- < ﾎﾟｰﾄ設定 > ---
;     < ﾎﾟｰﾄ出力値設定 >
	bcf	STATUS,RP0		; Sel Bank0
	movlw	B'00000111'		;
	movwf	PORTA			; PortA Data = 0x07
	movlw	B'00000000'		;
	movwf	PORTB			; PortB Data = 0x00
;
;     < ﾎﾟｰﾄI/O設定 >
	bsf	STATUS,RP0		; Sel Bank1
;	bcf	STATUS,RP0		; Sel Bank0
	movlw	B'00010000'		;
	movwf	TRISA			; RA[5-0] is "---i_oooo"
;	TRIS	PORTA			;
	movlw	B'00001111'		;
	movwf	TRISB			; RB[7-0] is "oooo_iiii"
;	TRIS	PORTB			;
;
	movlw	B'10001111'		; /RBPU INTEDG RTS RTE PSA PS2 PS1 PS0
;	OPTION				; 1     0      0   0   1   1   1   1
	movwf	OPTION_REG		; 1     0      0   0   1   1   1   1
					; /RBPU :PortB pull-up = disable
					; INTEDG:Interrupt edge RB0/INT ~|_
					; T0CS  :TMR0 clock source CLOCKOUT
					; T0SE  :TMR0 clock edge RA4/T0CKI _|~ (dummy)
					; PSA   :Prescaler assignment bit = WDT
					; PS    :PRESCALER VALUE TMR0 RATE 1:128 (dummy)
;
;     < 割り込み設定 >
	bcf	STATUS,RP0		; Sel Bank0
	clrf	TMR0			; Set TMR0 cnt
	bsf	INTCON,T0IE		; Enable TMR0 Int
	bcf	INTCON,T0IF		; Clear TMR0 OverFlow IntFlag
;
	return				;
;
;
;******************************************************
;	Initial routine ( Soft )
;******************************************************
init_soft
;	< 10msタイマー処理 >
	movlw	TIME_10MS		;
	movwf	R_TIME_10MS		;
;
;	< 500msタイマー処理 >
	movlw	TIME_500MS		;
	movwf	R_TIME_500MS		;
;
;	< RS-232C 送信処理 >
	clrf	R_SMODE			; smode = 0
	clrf	R_TXD			; Set 送信データnull
;
	movf	I_DTMF_DAT,W		;
	andlw	0x0f			; Mask Bit0..3
	movwf	R_DTMF0			;
	movf	I_DTMF_STD,W		;
	andlw	0x10			; Mask Bit4
	iorwf	R_DTMF0,F		;
	movf	R_DTMF0,W		; Set Startup data
	movwf	R_DTMF1			;
	movwf	R_DTMF2			;
;
	return				;
;
;
;******************************************************
;	dtmf2asc
;
;	DTMFcodeをASCIIcodeに変換する
;	Input :Wreg(DTMFcode)
;	Output:Wreg(ASCIIcode)
;	注意:Wregの内容は0x00～0x0fにすること
;******************************************************
dtmf2asc
	addwf	PCL,F			; PCL = PCL + W
	retlw	'D'			;
	retlw	'8'			;
	retlw	'4'			;
	retlw	'#'			;
	retlw	'2'			;
	retlw	'0'			;
	retlw	'6'			;
	retlw	'B'			;
	retlw	'1'			;
	retlw	'9'			;
	retlw	'5'			;
	retlw	'A'			;
	retlw	'3'			;
	retlw	'*'			;
	retlw	'7'			;
	retlw	'C'			;
;
;
	END
