;******************************************************************************************
;  音響LSI(YAMAHA YMZ294)用　サンプル
;      シリアルポートから入力された音を出す
;   Project      :
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H18.05.02
;   History      :
;******************************************************************************************
;  (1)Descript I/O 
;    PORTA
;      PORTA(0) : Output YMZ294(WR) 
;      PORTA(1) : Output YMZ294(CS) 
;      PORTA(2) : Output YMZ294(A0) 
;      PORTA(3) : Output YMZ294(IC) 
;      PORTA(4) : None connect 
;      PORTA(5) : None connect 
;      PORTA(6) : Serial Port(Rx) 
;      PORTA(7) : Serial Port(Tx) 
;    PORTB
;      PORTB(0) : Output YMZ294(D0) 
;      PORTB(1) : Output YMZ294(D1) 
;      PORTB(2) : Output YMZ294(D2) 
;      PORTB(3) : Output YMZ294(D3) 
;      PORTB(4) : Output YMZ294(D4) 
;      PORTB(5) : Output YMZ294(D5) 
;      PORTB(6) : Output YMZ294(D6) 
;      PORTB(7) : Output YMZ294(D7)
; 
;******************************************************************************************
	LIST	P=PIC16F88,ST=OFF,R=DEC
	INCLUDE	"P16F88.inc"	
	__CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO
	__CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF

ADR	EQU	20H	; Adress
DAT	EQU	21H	; Data
LP	EQU	22H
CNT0	EQU	23H
CNT1	EQU	24H
CNT2	EQU	25H
DAT0	EQU	26H
DAT1	EQU	27H
IODAT	EQU	28H
CHRDAT	EQU	29H
RECWAT	EQU	2AH
RECLP	EQU	2BH
SENDWAT	EQU	2CH
SENDLP	EQU	2DH
CNT	EQU	2EH
TMP1	EQU	2FH
;
	ORG	0
	GOTO	START
	ORG	4
	GOTO	START
START
; Bank0での設定
	BANKSEL	PORTA	; PortAのBankを選択する
	CLRF	PORTA	; PortAの初期化(Bank0)
	CLRF	PORTB	; PortBの初期化(Bank0,1,2,3)

; Bank1での設定
	BANKSEL	ANSEL	; ANSELのBankを選択する(Bank1)
	MOVLW	B'01111110'	;内部OSC選択,内部OSCに8MHzを選択
	MOVWF	OSCCON
	MOVLW	B'00000000'	;Degitalに設定
	MOVWF	ANSEL	; Degital Inputに設定(Bank1)
	MOVLW	B'01000000'
	MOVWF	TRISA	; PortAのI/O設定(Bank1)
	MOVLW	B'00000000'
	MOVWF	TRISB	; PortBのI/O設定(Bank1)
	MOVLW	B'10000000'	; 7:10Bitを右詰めで得る,6:?(どっちでも),5-4:ReferはVoltage-GND,3-0:None
	MOVWF	ADCON1	;(Bank1)
; Bank0に戻す
	BANKSEL	PORTA	; PortAのBankを選択する
;
	BSF	PORTA,7
;
;  1.SSGのリセット
	CALL	SSGRES
;  2.シリアルポートの接続メッセージを出力する
	CALL	MESCON
;
MAIN
;  3.曲を鳴らす
;   (1)キーボードの入力を待つ
	CALL	REC
;   (2)文字を加工する
	CALL	CNVNUM
;   (3)演奏する
	CALL	PRG01
;
	GOTO	MAIN

;******************************************************************************************
;   Function Name : PRG01
;   Title         : 設定されたキャラクタに対応する音を出す
;   Input         : 
;   Output        : 
;******************************************************************************************
PRG01
	MOVFW	CHRDAT
	XORLW	H'01'
	BTFSS	STATUS,Z
	GOTO	PRG0101
; ド
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'DD'
	MOVWF	DAT0
	CALL	SETSND
;	CALL	TIMS
	RETURN
PRG0101
	MOVFW	CHRDAT
	XORLW	H'02'
	BTFSS	STATUS,Z
	GOTO	PRG0102
; レ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'A9'
	MOVWF	DAT0
	CALL	SETSND
;	CALL	TIMS
	RETURN
PRG0102
	MOVFW	CHRDAT
	XORLW	H'03'
	BTFSS	STATUS,Z
	GOTO	PRG0103
; ミ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'7B'
	MOVWF	DAT0
	CALL	SETSND
;	CALL	TIMS
	RETURN
PRG0103
	MOVFW	CHRDAT
	XORLW	H'04'
	BTFSS	STATUS,Z
	GOTO	PRG0104
; ファ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'66'
	MOVWF	DAT0
	CALL	SETSND
;	CALL	TIMS
	RETURN
PRG0104
	MOVFW	CHRDAT
	XORLW	H'05'
	BTFSS	STATUS,Z
	GOTO	PRG0105
; ソ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'3F'
	MOVWF	DAT0
	CALL	SETSND
;	CALL	TIMS
	RETURN
PRG0105
	MOVFW	CHRDAT
	XORLW	H'06'
	BTFSS	STATUS,Z
	GOTO	PRG0106
; ラ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'1C'
	MOVWF	DAT0
	CALL	SETSND
;	CALL	TIMS
	RETURN
PRG0106
	MOVFW	CHRDAT
	XORLW	H'07'
	BTFSS	STATUS,Z
	GOTO	PRG0107
; シ　　
	MOVLW	H'00'
	MOVWF	DAT1
	MOVLW	H'FD'
	MOVWF	DAT0
	CALL	SETSND
;	CALL	TIMS
	RETURN
PRG0107
	MOVFW	CHRDAT
	XORLW	H'08'
	BTFSS	STATUS,Z
	GOTO	PRG0108
; ド　　
	MOVLW	H'00'
	MOVWF	DAT1
	MOVLW	H'EF'
	MOVWF	DAT0
	CALL	SETSND
;	CALL	TIMS
	RETURN
PRG0108
	MOVFW	CHRDAT
	XORLW	H'09'
	BTFSS	STATUS,Z
	GOTO	PRG0109
; レ　　
	MOVLW	H'00'
	MOVWF	DAT1
	MOVLW	H'D5'
	MOVWF	DAT0
	CALL	SETSND
;	CALL	TIMS
	RETURN
PRG0109
; ミ　　
	MOVLW	H'00'
	MOVWF	DAT1
	MOVLW	H'BE'
	MOVWF	DAT0
	CALL	SETSND
;	CALL	TIMS
;
	RETURN

;******************************************************************************************
;   Function Name : CNVNUM
;   Title         : キャラクタコードの4ビットを取り出す
;   Input         : 
;   Output        : 
;******************************************************************************************
CNVNUM
	MOVFW	IODAT
	ANDLW	B'00001111'
	MOVWF	CHRDAT
	RETURN

;******************************************************************************************
;   Function Name : DEMO1
;   Title         : デモ１(ドレミファソラシド)
;   Input         : 
;   Output        : 
;******************************************************************************************
DEMO1
; ド
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'DD'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; レ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'A9'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; ミ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'7B'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; ファ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'66'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; ソ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'3F'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; ラ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'1C'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; シ　　
	MOVLW	H'00'
	MOVWF	DAT1
	MOVLW	H'FD'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; ド　　
	MOVLW	H'00'
	MOVWF	DAT1
	MOVLW	H'EF'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
;
	RETURN

;******************************************************************************************
;   Function Name : DEMO2
;   Title         : デモ２(海)
;   Input         : 
;   Output        : 
;******************************************************************************************
DEMO2
; ラ
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'1C'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; ソ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'3F'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; ファ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'66'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; レ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'A9'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; ソ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'3F'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; ファ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'66'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; レ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'A9'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; ド　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'DD'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
;
; ド
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'DD'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; ファ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'66'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; ファ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'66'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; ソ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'3F'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
	CALL	TIMS
	CALL	TIMS
	CALL	TIMS
	CALL	TIMS
;
;
;
;
; ラ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'1C'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; ラ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'1C'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; ド　　
	MOVLW	H'00'
	MOVWF	DAT1
	MOVLW	H'EF'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; ラ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'1C'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; ラ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'1C'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; ソ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'3F'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; ファ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'66'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; レ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'A9'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; レ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'A9'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
; ド　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'DD'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; ソ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'3F'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
; ファ　　
	MOVLW	H'01'
	MOVWF	DAT1
	MOVLW	H'66'
	MOVWF	DAT0
	CALL	SETSND
	CALL	TIMS
	CALL	TIMS
	CALL	TIMS
	CALL	TIMS
	CALL	TIMS
	CALL	TIMS
	CALL	TIMS
	CALL	TIMS
;

	RETURN

;******************************************************************************************
;   Function Name : SETSND
;   Title         : 音を出す
;   Input         : 
;   Output        : 
;   Description   :
;     ラ(220Hz)   ;568 > 238h
;     ラ#(233Hz)  ;536 > 218h
;     シ(247Hz)   ;506 > 1FAh
;     ド(262Hz)   ;477 > 1DDh
;     ド#(277Hz)  ;451 > 1C3h
;     レ(294Hz)   ;425 > 1A9h
;     レ#(311Hz)  ;402 > 192h
;     ミ(330Hz)   ;379 > 17Bh 
;     ファ(349Hz) ;358 > 166h
;     ファ#(370Hz);338 > 152h
;     ソ(392Hz)   ;319 > 13Fh
;     ソ#(415Hz)  ;301 > 12Dh
;     ラ(440HzHz) ;284 > 11Ch
;     ラ#(466Hz)  ;268 > 10Ch
;     シ(494Hz)   ;253 > 0FDh
;     ド(523Hz)   ;239 > 0EFh
;     ド#(554Hz)  ;226 > 0E2h
;     レ(587Hz)   ;213 > 0D5h
;     レ#(622Hz)  ;201 > 0C9h
;     ミ(659Hz)   ;190 > 0BEh
;******************************************************************************************
SETSND
; 0.設定
	CALL	INTSSG
; 1.$01
	MOVLW	H'01'
	MOVWF	ADR
;
	MOVFW	DAT1
	MOVWF	DAT
;
	CALL	WRTSSG
;
; 2.$00
	MOVLW	H'00'
	MOVWF	ADR
;
	MOVFW	DAT0
	MOVWF	DAT
;
	CALL	WRTSSG
;
	RETURN

;******************************************************************************************
;   Function Name : INTSSG
;   Title         : SSGの初期設定
;   Input         : 
;   Output        : 
;******************************************************************************************
INTSSG
;  1.ミキサーの設定($07)
	MOVLW	H'07'
	MOVWF	ADR
;
	MOVLW	B'00111000'
	MOVWF	DAT
;
	CALL	WRTSSG
;
;  2.ボリューム設定($08～$0A)
;   (1)チャンネルA($08)
	MOVLW	H'08'
	MOVWF	ADR
;
	MOVLW	B'00011111'
	MOVWF	DAT
;
	CALL	WRTSSG
;
;   (2)チャンネルB($09)
	MOVLW	H'09'
	MOVWF	ADR
;
	MOVLW	B'00011111'
	MOVWF	DAT
;
	CALL	WRTSSG
;
;   (3)チャンネルC($0A)
	MOVLW	H'0A'
	MOVWF	ADR
;
	MOVLW	B'00011111'
	MOVWF	DAT
;
	CALL	WRTSSG
;
;  3.エンベローブ周波数の設定($0B～$0C)
;   (1)15-8($0C)
	MOVLW	H'0C'
	MOVWF	ADR
;
	MOVLW	H'0A'
	MOVWF	DAT
;
	CALL	WRTSSG
;
;   (2)0-7($0B)
	MOVLW	H'0B'
	MOVWF	ADR
;
	MOVLW	H'2C'
	MOVWF	DAT
;
	CALL	WRTSSG
;
;  4.エンベローブの設定($0D)
	MOVLW	H'0D'
	MOVWF	ADR
;
	MOVLW	B'00000000'
	MOVWF	DAT
;
	CALL	WRTSSG
;
	RETURN
;
;******************************************************************************************
;   Function Name : WRTSSG
;   Title         : SSGにアドレスとデータを設定する
;   Input         : 
;   Output        : 
;******************************************************************************************
WRTSSG
;  1.アドレスを書き込む
	MOVLW	B'10001000'	;SSGLPにアドレスを書き込む設定
	MOVWF	PORTA		;SSGLPにアドレスを書き込む設定
	MOVFW	ADR		;SSGLPにアドレスを書き込む	
	MOVWF	PORTB		;SSGLPにアドレスを書き込む
	MOVLW	B'10001011'	;SSGLPにアドレスを書き込む指示
	MOVWF	PORTA		;SSGLPにアドレスを書き込む指示
;  2.データを書き込む
	MOVLW	B'10001100'	;SSGLPにデータを書き込む設定
	MOVWF	PORTA		;SSGLPにデータを書き込む設定
	MOVFW	DAT		;SSGLPにデータを書き込む	
	MOVWF	PORTB		;SSGLPにデータを書き込む
	MOVLW	B'10001111'	;SSGLPにデータを書き込む指示
	MOVWF	PORTA		;SSGLPにデータを書き込む指示
;
	RETURN
;
;
;******************************************************************************************
;   Function Name : SSGRES
;   Title         : SSGをリセットする
;   Input         : 
;   Output        : 
;   Description   :  リセットパルスは5μS以上(200KHz)必要
;                    8MHz/4 =(200)=> 10KHz 以上
;******************************************************************************************
SSGRES
;  1.ICを'0'にする
	BCF	PORTA,3
;  2.5μS以上待つ
	MOVLW	H'FF'
	MOVWF	LP
SSGRES1
	NOP
	NOP
	DECFSZ	LP,F
	GOTO	SSGRES1
;
;  3.ICを'1'に戻す
	BSF	PORTA,3
;
	RETURN
;
;
;******************************************************************************************
;   Function Name : TIM1S
;   Title         : タイマー(約1秒)
;   Input         : 
;   Output        :
;******************************************************************************************
TIM1S
	CALL	TIMS
	CALL	TIMS
	CALL	TIMS
	CALL	TIMS
	RETURN
;******************************************************************************************
;   Function Name : TIMS
;   Title         : タイマー(約0.25秒)
;   Input         : 
;   Output        :
;   Description   : 8/4MHz =(200)=> 10KHz =(100)=> 100Hz =(100)=> 1Hz  
;******************************************************************************************
TIMS
;	MOVLW	H'64'
	MOVLW	H'19'
	MOVWF	CNT2
TIMS2
	MOVLW	H'64'
	MOVWF	CNT1
TIMS1
	MOVLW	H'64'
	MOVWF	CNT0
TIMS0
	DECFSZ	CNT0,F
	GOTO	TIMS0 
	DECFSZ	CNT1,F
	GOTO	TIMS1
	DECFSZ	CNT2,F
	GOTO	TIMS2
	RETURN
;

;******************************************************************************************
;   Function Name : MESCON
;   Title         : CONNECT OKメッセージ
;   Input         : 
;   Output        :
;******************************************************************************************
MESCON
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'P'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'I'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'C'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
;
	MOVLW	'C'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'o'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'n'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'n'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'e'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'c'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	't'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'e'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'd'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'O'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'K'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'>'
	MOVWF	IODAT
	CALL	SEND
;
;
;
;
;
	MOVLW	'P'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'u'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	's'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'h'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'1'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'-'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'0'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'K'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'e'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'y'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'>'
	MOVWF	IODAT
	CALL	SEND
	RETURN

;******************************************************************************************
;   Function Name : REC
;   Title         : ＲＳ２３２Ｃ受信サブルーチン(PORTA6)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
REC
; (0)変数初期化
	CLRF	IODAT
; (1)受信データを待つ
REC0	BTFSC	PORTA,6
	GOTO	REC0
; (2)1/2ビット分待つ
	MOVLW	H'21'	; 9600BPS OSC;8.000MHz仕様
	MOVWF   RECWAT
REC1	DECFSZ	RECWAT,F
	GOTO	REC1
; (3)データ受信(8ビット分)
	MOVLW	8
	MOVWF	RECLP
	NOP
REC2	MOVLW	H'42'	; 9600BPS OSC;8.000MHz仕様
	MOVWF	RECWAT
REC3	DECFSZ	RECWAT,F
	GOTO	REC3
	NOP
	BTFSS	PORTA,6	; ビットデータが0の時, 0を立てる
	BCF	STATUS,C
	BTFSC	PORTA,6	; ビットデータが1の時, 1を立てる
	BSF	STATUS,C
	RRF	IODAT,F	; 変数内でビットをシフトする
	DECFSZ	RECLP,F
	GOTO	REC2
	NOP
	NOP
;
	RETURN

;******************************************************************************************
;   Function Name : SEND
;   Title         : ＲＳ２３２Ｃ送信サブルーチン(PORTA7)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
; (1)送信開始
SEND	
	MOVFW	IODAT
	MOVWF	TMP1
;
	BCF	PORTA,7	; 送信開始
	MOVLW	H'42'	; 9600BPS OSC;8.000MHz仕様
	MOVWF	SENDWAT
SEND1	DECFSZ	SENDWAT,F
	GOTO	SEND1
;
; (2)データ送信(8ビット)
	MOVLW	8	; 8ビットデータ分、送信する
	MOVWF	SENDLP
	NOP
SEND2	RRF	IODAT,F
	NOP
	BTFSS	STATUS,C ; ビットデータが0の時, 0を立てる	
	BCF	PORTA,7
	BTFSC	STATUS,C ; ビットデータが1の時, 1を立てる
	BSF	PORTA,7

	MOVLW	H'42'	; 9600BPS OSC;8.000MHz仕様
	MOVWF	SENDWAT
SEND3	DECFSZ	SENDWAT,F
	GOTO	SEND3

	DECFSZ	SENDLP,F
	GOTO	SEND2
; (3)終了
	BSF	PORTA,7	; フラグを戻す
; (4)少し待つ
	CALL	TIMER
; (5)退避変数を戻す
	MOVFW	TMP1
	MOVWF	IODAT
	RETURN
;
;******************************************************************************************
;   Function Name : TIMER
;   Title         : タイマー(1000回ループ)
;   Input         : 
;   Output        :
;******************************************************************************************
TIMER
	MOVLW	H'0A'
	MOVWF	CNT1
TIMER1
	MOVLW	H'64'
	MOVWF	CNT
TIMER2
	DECFSZ	CNT,F
	GOTO	TIMER2 
	DECFSZ	CNT1,F
	GOTO	TIMER1

	RETURN

	END
