;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		周波数カウントユニット用プログラム	ＪＡ０ＱＯＮ
;
;		PIC12F683 10MHZ
;
;		12f683_count02.asm
;
;		
;		受信機用中間周波数差分対応
;		割り込み出力に対応
;		プリスケーラはx16を使用
;		ゲートタイムは1秒と0.1秒をSWで切替
;		カウントのズレを修正
;
;		I/O	GP0=x	DATA OUTPUT
;			GP1=0	IF_OFFSET ON
;			GP1=1	IF_OFFSET OFF
;			GP2=x	FREQ INPUT
;			GP3=0	GATE TIME 1sec
;			GP3=1	GATE TIME 0.1sec
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



		LIST	P=PIC12F683
		INCLUDE	P12F683.INC
		
;CONFIGURATION WORD(ADDRESS:2007H)
;bit13-12		Unimplemented
;bit11			FCMEN	0セット、使いません。
;						1=enabled,0=disabled
;bit10			IESO	0セット
;						1=enabled,0=disabled
;bit9-8			BODEN	00セット
;						00=disabled
;bit7			CPD		データメモリプロテクション　0セット
;						1=enabled,0=disabled
;bit6			CP		プログラムメモリプロテクション　0セット　
;						1=enabled,0=disabled
;bit5			MCLRE	0セット
;						1=enabled,0=disabled(Digital input)
;bit4			PWRTE	power_up timer　1セット、使います。
;						1=enabled,0=disabled
;bit3			WDTE	Watchdog Timer　0セット、使いません。
;						1=enabled,0=disabled
;bit2-0			FOSC	今回は、010Bを使用
;						111=RC:2pinでRC発振、3pinCLKOUT、I/O不可
;						110=RCIO:　〃　GP4I/O可
;						101=INTOSC:内部発振　3pinCLKOUT、GP5I/O可
;						100=INTOSCIO:内部発振、GP4-5I/O可
;						011=EC:2pin外部クロック入力、GP4I/O可
;						010=HS：外部発振子、I/O不可
;						001=XT：　〃
;						000=LP：　〃
;
;bit	15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
;data    0  0  0  0  0  0  0  0  0  0  0  1  0  0  1  0
;

		__CONFIG	B'0000000000010010'
	

;		ワークエリア定義
;
;		使用していないのもあります
;

hex0		equ			020h		;カウントしたデータ32ビット16進バイナリ
hex1		equ			021h		;
hex2		equ			022h
hex3		equ			023h
colum		equ			028h		;現在の桁位置
cnt0		equ			029h		;時間待ちルーチン用
cnt1		equ			02ah
cnt2		equ			02bh
cnt3		equ			02ch
tmp0		equ			02dh		;雑用
tmp1		equ			02eh
bcdw0		equ			02fh		;BCD変換ルーチン用
bcdw1		equ			030h
cary1		equ			031h
cary2		equ			032h
cary3		equ			033h
shift		equ			034h		;BCD変換ルーチンでのシフトカウンタ用
work1		equ			035h
work2		equ			036h
bsyc0		equ			037h
bsyc1		equ			038h
tcnt0		equ			039h
tcnt1		equ			03ah
tcnt2		equ			03bh
flg			equ			03ch		;エラー＆設定フラグ
band		equ			03dh		;プリスケーラ設定
gtime		equ			03eh		;ｹﾞｰﾄタイム設定
pscnt		equ			03fh		;プリスケーラ残カウント
hexw0		equ			040h
hexw1		equ			041h
hexw2		equ			042h
hexw3		equ			043h
het			equ			044h		;
;

			ORG			0h
			goto		init
			ORG			04h
			goto		init

			org			05h
			


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC12F683　イニシャライズ			
;
;		CMCON0_REG
;			bit7=0	Unimplemented
;			bit6=x	COUT	コンパレータ出力ﾋﾞｯﾄ
;			bit5=0	Unimplemented
;			bit4=x	CINV
;			bit3=1	CIS
;			bit2-0	CM		コンパレータモード	111	Off
;										入力はデジタル
;										他モードは使用しない
;
;		ANSEL_REG
;			bit7=1	Unimplemented
;			bit6-4	ADCS	A/Dコンバータクロック選択
;			bit3-0	ANS		アナログ選択ビット
;							1=アナログ入力
;							0=デジタルI/O
;
;		TRISIO_REG	1=input mode,0=output mode
;			bit7=0	Unimplemented
;			bit6=0	Unimplemented
;			bit5=0	GP5	I/O	設定条件あり、コンフィグレーションワード参照
;			bit4=1	GP4	I/O　設定条件あり、　〃
;			bit3=1	GP3	Inputのみ
;			bit2=1	GP2	I/O
;			bit1=0	GP1	I/O
;			bit0=0	GP0	I/O
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	
init
			bcf			STATUS,RP0	;Bank0
			clrf		GPIO		;Init GPIO
			movlw		07h
			movwf		CMCON0		;コンパレータoff、アナログポート→デジタル
			bsf			STATUS,RP0	;バンク１に切替
			clrf		ANSEL		;デジタルI/O
			bcf			ADCON0,ADON	;ADコンバータOFF
			movlw		0f8H		;11111000b
			movwf		OPTION_REG	;プリスケーラ無しにセット
			movlw		0eh			;00001110b
			movwf		TRISIO		;GP1,2,3入力　GP0出力モード
			bcf			STATUS,RP0	;バンク０に切替
			nop
			bcf			GPIO,1		;LED OFF
			nop
			bsf			GPIO,0		;DATA BUSY
;			goto		main_dbg

main
			call		get_mode
			call		fcount
			call		correct
			call		tx_data		;割込み受信用
			goto		main


;
;データ転送デバッグ用仮メイン
;

main_dbg
			clrf		hex0
			clrf		hex1
			clrf		hex2
			clrf		hex3
			movlw		07h
			movwf		flg			;8digit
			bsf			flg,6		;4,7dot
;			bsf			GPIO,1		;LED ON
			call		tx_data
;			bcf			GPIO,1		;LED OFF
			call		wait1s

			movlw		0c7h
			movwf		hex0
			movlw		08ah
			movwf		hex1
			movlw		0a9h
			movwf		hex2		;11111111
			clrf		hex3
			movlw		07h
			movwf		flg			;8digit
			bsf			flg,6		;4,7dot
;			bsf			GPIO,1		;LED ON
			call		tx_data
;			bcf			GPIO,1		;LED OFF
			call		wait1s

			movlw		08eh
			movwf		hex0
			movlw		015h
			movwf		hex1
			movlw		053h
			movwf		hex2
			movlw		01h
			movwf		hex3		;22222222
			movlw		07h
			movwf		flg			;8digit
			bsf			flg,6		;4,7dot
;			bsf			GPIO,1		;LED ON
			call		tx_data
;			bcf			GPIO,1		;LED OFF
			call		wait1s

			movlw		055h
			movwf		hex0
			movlw		0a0h
			movwf		hex1
			movlw		0fch
			movwf		hex2
			movlw		01h
			movwf		hex3		;33333333
			movlw		07h
			movwf		flg			;8digit
			bsf			flg,6		;4,7dot
;			bsf			GPIO,1		;LED ON
			call		tx_data
;			bcf			GPIO,1		;LED OFF
			call		wait1s

			movlw		01ch
			movwf		hex0
			movlw		02bh
			movwf		hex1
			movlw		0a6h
			movwf		hex2
			movlw		02h
			movwf		hex3		;44444444
			movlw		07h
			movwf		flg			;8digit
			bsf			flg,6		;4,7dot
;			bsf			GPIO,1		;LED ON
			call		tx_data
;			bcf			GPIO,1		;LED OFF
			call		wait1s

			movlw		0e3h
			movwf		hex0
			movlw		0b5h
			movwf		hex1
			movlw		04fh
			movwf		hex2
			movlw		03h
			movwf		hex3		;55555555
			movlw		07h
			movwf		flg			;8digit
			bsf			flg,6		;4,7dot
;			bsf			GPIO,1		;LED ON
			call		tx_data
;			bcf			GPIO,1		;LED OFF
			call		wait1s

			movlw		0aah
			movwf		hex0
			movlw		040h
			movwf		hex1
			movlw		0f9h
			movwf		hex2
			movlw		03h
			movwf		hex3		;66666666
			movlw		07h
			movwf		flg			;8digit
			bsf			flg,6		;4,7dot
;			bsf			GPIO,1		;LED ON
			call		tx_data
;			bcf			GPIO,1		;LED OFF
			call		wait1s

			movlw		071h
			movwf		hex0
			movlw		0cbh
			movwf		hex1
			movlw		0a2h
			movwf		hex2
			movlw		04h
			movwf		hex3		;77777777
			movlw		07h
			movwf		flg			;8digit
			bsf			flg,6		;4,7dot
;			bsf			GPIO,1		;LED ON
			call		tx_data
;			bcf			GPIO,1		;LED OFF
			call		wait1s

			movlw		038h
			movwf		hex0
			movlw		056h
			movwf		hex1
			movlw		04ch
			movwf		hex2
			movlw		05h
			movwf		hex3		;88888888
			movlw		07h
			movwf		flg			;8digit
			bsf			flg,6		;4,7dot
;			bsf			GPIO,1		;LED ON
			call		tx_data
;			bcf			GPIO,1		;LED OFF
			call		wait1s

			movlw		0ffh
			movwf		hex0
			movlw		0e0h
			movwf		hex1
			movlw		0f5h
			movwf		hex2
			movlw		05h
			movwf		hex3		;99999999
			movlw		07h
			movwf		flg			;8digit
			bsf			flg,6		;4,7dot
;			bsf			GPIO,1		;LED ON
			call		tx_data
;			bcf			GPIO,1		;LED OFF
			call		wait1s

			movlw		04eh
			movwf		hex0
			movlw		061h
			movwf		hex1
			movlw		0bch
			movwf		hex2
			movlw		0h
			movwf		hex3		;12345678
			movlw		07h
			movwf		flg			;8digit
			bsf			flg,6		;4,7dot
;			bsf			GPIO,1		;LED ON
			call		tx_data
;			bcf			GPIO,1		;LED OFF
			call		wait1s

			movlw		0b1h
			movwf		hex0
			movlw		07fh
			movwf		hex1
			movlw		039h
			movwf		hex2
			movlw		05h
			movwf		hex3		;87654321
			movlw		07h
			movwf		flg			;8digit
			bsf			flg,6		;4,7dot
;			bsf			GPIO,1		;LED ON
			call		tx_data
;			bcf			GPIO,1		;LED OFF
			call		wait1s
			goto		main_dbg




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			動作モードセット
;
;		HET SW		ON -455KHZ(GP1=0)、OFF +-0(GP1=1)
;		ゲートタイムSW	ON 1秒(GP3=0)、OFF 0.1秒(GP3=1)
;
;		使用ワーク
;				狭帯域(1/1)モード	band=0	0000B
;				広帯域(1/8)モード	band=1	0001B
;				広帯域(1/16)モード	band=2	0010B
;				広帯域(1/256)モード	band=4	0100B
;				0.1秒ゲートタイム		gtime=0
;				１秒ゲートタイム		gtime=1
;				カウンタモード			het=0(SW_OFF=1)
;				受信周波数表示モード	het=1(SW_ON=0)
;
;				2桁表示指令		flg=xxxxx001
;				4桁表示指令		flg=xxxxx011
;				6桁表示指令		flg=xxxxx101
;				8桁表示指令		flg=xxxxx111
;				ゼロブランキング動作指令	flg=xxxx1xxx
;				ドット表示指令		flg=x000xxxx　表示なし
;									bit4=1	2,5桁点燈
;									bit5=1	3,6桁点燈
;									bit6=1	4,7桁点燈
;				オーバーフロー		flg=1xxxxxxx
;
;		OPTION_REG
;			bit7=1	GPPU	GPIOプルアップOFF
;							0=enabled,1=disabled
;			bit6=1	INTEGE	INT割り込み信号エッジ↑
;							1=↑,0=↓
;			bit5=1	T0CS	TMR0クロックは外部
;							1=外部入力GP2,0=内部
;			bit4=0	T0SE	TMR0カウントエッジ↑
;							1=↑,0=↓
;			bit3=1	PSA		プリスケーラ無し
;							1=WDT,0=TMR0
;			bit2-0	PS		プリスケーラ分周比	000 1/2
;										001	1/4
;										010	1/8
;										011	1/16
;										100	1/32
;										101	1/64
;										110	1/128
;										111	1/256
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_mode
			clrf		flg
			clrf		band
			clrf		het			;het=0　汎用カウンタモード
			clrf		gtime
			btfss		GPIO,1		;HET_SWチェック
			bsf			het,0		;het=1　受信周波数表示モード
			goto		ps_on016	;
			
ps_on008	;プリスケーラ　ON(1/8)
			bsf			band,0		;8倍モード(band=1)
			bsf			STATUS,RP0	;バンク１に切替え
			movlw		0f2H		;11110010b
			movwf		OPTION_REG	;プリスケーラ1/8分周にセット
			bcf			STATUS,RP0	;バンク0に戻る
			goto		ckgtm

ps_on016	;プリスケーラ　ON(1/16)
			bsf			band,1		;16倍モード(band=1)
			bsf			STATUS,RP0	;バンク１に切替え
			movlw		0f3H		;11110011b
			movwf		OPTION_REG	;プリスケーラ1/16分周にセット
			bcf			STATUS,RP0	;バンク0に戻る
			goto		ckgtm

ps_off		;プリスケーラ　OFF
			clrf		band		;1倍モード(BAND=0)
			bsf			STATUS,RP0	;バンク１に切替え
			movlw		0f8H		;11111000b
			movwf		OPTION_REG	;プリスケーラ無しにセット
        	bcf         STATUS,RP0	;バンク０に戻る

ckgtm		;ｹﾞｰﾄタイム　設定
			btfss		GPIO,3		;ゲートタイムSWチェック
			goto		ckg00		;GP=0(SW_ON)
			clrf		gtime		;GP=1(SW_OFF)set 0.1s
			movlw		01dh		;00011101b
			movwf		flg			;6桁表示、2,5桁ドット表示指定
			return
ckg00		bsf			gtime,0		;GP=0(SW_ON) set 1s
			movlw		04fh		;01001111b
        	movwf		flg			;8桁表示、4,7桁ドット表示指定
			return		

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;			入力パルス　カウントサブルーチン
;
;		入力ポート		GP2
;		ゲート解放時間	1s、100ms
;		出力データ		hex0
;					hex1
;					hex2
;					hex3
;
;		ゲートSW		H=100ms、L=1s
;
;		使用ワーク		;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fcount
;			GP2　gate_off
			bsf			STATUS,RP0	;バンク１に切替
			bcf			TRISIO,2	;GP2出力モード
			bcf			STATUS,RP0	;バンク０に切替
			bcf			GPIO,2		;GP2=0
;			reset
			clrf		hex0		;データエリアリセット
			clrf		hex1
			clrf		hex2
			clrf		hex3
			clrf		TMR0		;タイマー０カウンタリセット
			btfss		gtime,0		;gtime=1 then 1s 
			goto		gate100m	;gtime=0 then 100ms
			goto		gate1s		;
;
;			ゲートタイム100ms=250000cycles
;
gate100m
			bcf			flg,7		;OverFlowフラグをクリア
			bsf			GPIO,1		;LED ON

;			gate_open オープン後2サイクル経過
			bsf			STATUS,RP0	;バンク１に切替
			bsf			TRISIO,2	;GP2入力モード(ゲートオープン)
			bcf			STATUS,RP0	;バンク０に切替
			call		count100m	;249998cycles
			
;			gate_closed　クローズまで2サイクル経過
			nop						;時間微調整
			bsf			STATUS,RP0	;バンク１に切替
			bcf			TRISIO,2	;GP2出力モード(ゲートクローズ)
			bcf			STATUS,RP0	;バンク０に切替
			bcf			GPIO,2		;GP2=0
			nop
			bcf			GPIO,1		;LED OFF
			return

;
;			ゲートタイム1sec=2500000cycles
;
gate1s
			bcf			flg,7		;OverFlowフラグをクリア
;			movlw		0aH			;10回
;			movwf		tmp0
			bsf			GPIO,1		;LED ON

;			gate_open
			bsf			STATUS,RP0	;バンク１に切替
			bsf			TRISIO,2	;GP2入力モード
			bcf			STATUS,RP0	;バンク０に切替


g1s0
			call		count100m	;249998cycle-01
			nop
			nop
			call		count100m	;249998cycle-02
			nop
			nop
			call		count100m	;249998cycle-03
			nop
			nop
			call		count100m	;249998cycle-04
			nop
			nop
			call		count100m	;249998cycle-05
			nop
			nop
			call		count100m	;249998cycle-06
			nop
			nop
			call		count100m	;249998cycle-07
			nop
			nop
			call		count100m	;249998cycle-08
			nop
			nop
			call		count100m	;249998cycle-09
			nop
			nop
			call		count100m	;249998cycle-10
			
;			gate_closed　クローズまで2サイクル経過
			bsf			STATUS,RP0	;バンク１に切替
			bcf			TRISIO,2	;GP2出力モード(ゲートクローズ)
			bcf			STATUS,RP0	;バンク０に切替
			bcf			GPIO,2		;GP2=0
			nop
			bcf			GPIO,1		;LED OFF
			return



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		タイマー０への入力パルス　カウントループ
;
;		ゲートオン、オフの時間も考慮し、100ms間の入力パルスカウントとなる様に設定する事
;		f=10MHZ only	249995cycles(call&return命令含む)
;
;		入力		無し
;
;		出力		hex1	中位8ビット
;				hex2	上位8ビット
;				hex3	最上位8ビット
;						下位8ビットはゲートクローズ後、TMR0から読み出すこと
;
;	INTCONレジスタ
;		bit7	GIE		全割込制御		1許可、0禁止
;		bit6	PEIE	周辺割込制御	1許可、0禁止
;		bit5	T0IE	タイマ0割込許可制御
;		bit4	INTE	GP2外部割込許可制御
;		bit3	GPIE	GPIOポート状態変化割込許可制御	1許可、0禁止	
;		bit2	T0IF	タイマ0割込みフラグ	1オーバーフロー、0オーバーフローなし(#1)
;		bit1	INTF	GP2外部割込みフラグ(#1)
;		bit0	GPIF	GPポート状態変化割込フラグ 1割込発生、0割込無(#1)
;
;		#1)ソフトウエアでリセット必要
;
;		使用ワーク		tcnt1	外周カウンタ　
;					tcnt2	内周カウンタ　
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



count100m							;100ms=100000us=250000cycles
									;呼び出しで4c/s、ｹﾞｰﾄで4c/s
			movlw		08dh		;外周カウンタ141
			movwf		tcnt1

cnt101m		movlw		044H		;内周カウンタ=68
			movwf		tcnt2		;
;
;	タイマ0のオーバーフローした時の桁上げカウント処理
;	下桁8ビットはゲートクローズ後、TMR0から読み込みすること
;

cnt102m
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			nop
			btfss		INTCON,T0IF	;タイマ０オーバーフラグチェック
			goto		if_off		;T0IF=0 then 
			bcf			INTCON,T0IF	;T0IFフラグをリセット
			movlw		01h			;add,sub命令でなければキャリー使えない
			goto		if_on		;T0IF=1なので繰上げ処理へ
if_off		nop						;時間差調整
			nop						;　〃
			movlw		0h			;
if_on		addwf		hex1,F		;hex1=hex1+W_REG
			rlf			hex1,W		;キャリービットがWの0ビット目に入る
			andlw		01h			;キャリー以外をマスク
			addwf		hex2,F		;hex2=hex2+Carry(Wreg)
			rlf			hex2,W		;
			andlw		01h
			addwf		hex3,F		;23c/s

;			内周ループカウンタ　16cycles/loop
			decfsz		tcnt2,F		;内周ループ終了か？
			goto		cnt102m		;26*68=1768c/s
			nop						;時間差調整

;			外周ループカウンタ　13*xxcycles/loop
cnt103m		decfsz		tcnt1,F		;(1768+2+3)*tcnt1+6
			goto		cnt101m		;(1773)*141+2-1=249994cycles
									;CALLとRETURNで4cycles
			return					;合計249998cycles
									;




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		計測値の桁補正　1/1　1/8　1/16
;
;		使用ワーク
;				狭帯域(1/1)モード	band=0	0000B
;				広帯域(1/8)モード	band=1	0001B
;				広帯域(1/16)モード	band=2	0010B
;				広帯域(1/256)モード	band=4	0100B
;				0.1秒ゲートタイム		gtime=0
;				１秒ゲートタイム		gtime=1
;				IF補正			het=1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

correct
;			プリスケーラモード確認
;			btfsc		band,1		;bit1
			goto		x16			;bit1=1 then x16
;			btfsc		band,0		;bit0=0 then x1
;			goto		x8			;bit0=1 then x8

;			プリスケーラ　OFF
x1
			movf		TMR0,W		;
			movwf		hex0
			bcf			flg,7		;オーバーフローフラグをOFF
			btfss		gtime,0		;if gtime=1 tnen 1sec
			call		x10
			btfss		het,0
			retlw		0h
			call		loc455k
			iorlw		01h
			btfss		STATUS,Z
			bsf			flg,7
			retlw		0h

;			1/8プリスケーラ　ON
x8
			movf		TMR0,W		;下桁8ビット
			movwf		hex0		;プリスケーラ８倍
			bcf			STATUS,C	;
			rlf			hex0,F		;２倍を３回実行する
			rlf			hex1,F
			rlf			hex2,F
			rlf			hex3,F
			bcf			STATUS,C	;
			rlf			hex0,F
			rlf			hex1,F
			rlf			hex2,F
			rlf			hex3,F
			bcf			STATUS,C
			rlf			hex0,F
			rlf			hex1,F
			rlf			hex2,F
			rlf			hex3,F
			btfsc		STATUS,C
			bsf			flg,7		;オーバーフロー

			btfss		gtime,0		;if gtime=1 tnen 1sec
			call		x10
			btfss		het,0
			retlw		0h
			call		loc455k
			iorlw		01h
			btfss		STATUS,Z
			bsf			flg,7
			retlw		0h

;			1/16プリスケーラ　ON
x16
			movf		TMR0,W		;下桁8ビット
			movwf		hex0		;プリスケーラ16倍
			bcf			STATUS,C	;
			rlf			hex0,F		;２倍を4回実行する
			rlf			hex1,F
			rlf			hex2,F
			rlf			hex3,F
			bcf			STATUS,C	;
			rlf			hex0,F
			rlf			hex1,F
			rlf			hex2,F
			rlf			hex3,F
			bcf			STATUS,C
			rlf			hex0,F
			rlf			hex1,F
			rlf			hex2,F
			rlf			hex3,F
			bcf			STATUS,C
			rlf			hex0,F
			rlf			hex1,F
			rlf			hex2,F
			rlf			hex3,F
			btfsc		STATUS,C
			bsf			flg,7		;オーバーフロー
			btfss		gtime,0		;if gtime=1 tnen 1sec
			call		x10
			btfss		het,0
			retlw		0h
			call		offset
			andlw		01h
			btfss		STATUS,Z
			bsf			flg,7
			retlw		0h




;
;			32ビット10倍演算
;
;		入力	hex3-0	32ビット
;		出力　hex3-0	
;
;		使用ワーク	hexw0-3	4バイト
;

x10
;			データ保存
			movf		hex0,W
			movwf		hexw0
			movf		hex1,W
			movwf		hexw1
			movf		hex2,W
			movwf		hexw2
			movf		hex3,W
			movwf		hexw3			

;			32ビットデータを8倍

			bcf			STATUS,C	;
			rlf			hex0,F		;2倍を3回実行する
			rlf			hex1,F
			rlf			hex2,F
			rlf			hex3,F
			bcf			STATUS,C	;
			rlf			hex0,F
			rlf			hex1,F
			rlf			hex2,F
			rlf			hex3,F
			bcf			STATUS,C
			rlf			hex0,F
			rlf			hex1,F
			rlf			hex2,F
			rlf			hex3,F

			call		add32b		;元データを加算
			call		add32b
			retlw		0h


;			32ビットバイナリ加算
;
;		(hex0-3) = (hex0-3) + (hexw0-3)
;

add32b
			movf		hexw0,W		;hex0=hex0+hexw0
			addwf		hex0,F
			movlw		01h
			btfss		STATUS,C	;if c=1 then hex1=hex1+1	
			goto		adb1
			addwf		hex1,F
			btfsc		STATUS,C	;if c=1 then hex2=hex2+1
			addwf		hex2,F
			btfsc		STATUS,C	;if c=1 then hex3=hex3+1
			addwf		hex3,F
			
adb1		movf		hexw1,W
			addwf		hex1,F
			movlw		01h
			btfsc		STATUS,C
			addwf		hex2,F
			btfsc		STATUS,C
			addwf		hex3,F
			
adb2		movf		hexw2,W
			addwf		hex2,F
			movlw		01h
			btfsc		STATUS,C
			addwf		hex3,F
			movf		hexw3,W
			addwf		hex3,F
			retlw		0h

;
;		455KHz減算
;
;		hex(0-3)=hex(0-3)-455KHZ
;
;		W=0で減算成功
;		W=1でエラー発生
;
offset

loc455k
			movf		hex3,W		;４バイト目のデータ存在チェック
			andlw		0ffh
			btfss		STATUS,Z
			goto		loc01
			
			movf		hex2,W		;３バイト目上位４ビットのデータ存在チェック
			movwf		hexw2
			andlw		0f0h
			btfss		STATUS,Z
			goto		loc01
			
			swapf		hexw2,W		;３バイト目下位４ビットを上位４ビットへ
			andlw		0f0h
			movwf		hexw2

			movf		hex1,W		;500KHz=7a120h
			andlw		0f0h		;07a100h以下はエラーと判定
			movwf		hexw1
			swapf		hexw1,W
			iorwf		hexw2,W
			sublw		07ah
			btfsc		STATUS,C
			retlw		01h			;減算エラー･リターン
			
loc01								;減算開始
			movlw		058h		;455KHz=455000HZ
			movwf		hexw0		;=0006f158h
			movlw		0f1h
			movwf		hexw1
			movlw		06h
			movwf		hexw2
			clrf		hexw3

;
;
;			32ビットバイナリ減算
;
;		(hex0-3) = (hex0-3) - (hexw0-3)
;

sub32b
			movf		hexw0,W		;hex0=hex0-hexw0
			subwf		hex0,F
			movlw		01h
			btfsc		STATUS,C	;if c=0 then hex1=hex1-1
			goto		sbb1
			subwf		hex1,F
			btfss		STATUS,C	;if c=0 then hex2=hex2-1
			subwf		hex2,F
			btfss		STATUS,C	;if c=0 then hex3=hex3-1
			subwf		hex3,F

sbb1		movf		hexw1,W
			subwf		hex1,F
			movlw		01h
			btfss		STATUS,C
			subwf		hex2,F
			btfss		STATUS,C
			subwf		hex3,F

sbb2		movf		hexw2,W
			subwf		hex2,F
			movlw		01h
			btfss		STATUS,C
			subwf		hex3,F
			movf		hexw3,W
			subwf		hex3,F
			retlw		0h








;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			シリアルデータ転送サブルーチン(ビット幅10us版)
;
;		入力		hex0	16進バイナリ24ビット
;				hex1
;				hex2
;				hex3
;				flg
;		出力		W=0	送信成功
;				W=1	送信失敗
;
;		データ線	GP0		1bit width = 10us
;		使用ワーク	tmp0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

tx_data
;
;		送信開始
;

tx_start
		bcf			GPIO,0		;スタートビット　セット
		movlw		05h
		movwf		tmp0
txb13	decfsz		tmp0
		goto		txb13		;2+3*4+2=16c/s

;		hex3
		movlw		08H			;
		movwf		shift		;左シフトカウンタ

txb10	nop						;tx loopここから送信まで7c/s
		nop
		rlf			hex3,F		;左シフトで最上位ビットはキャリーへ
		btfss		STATUS,C	;キャリービット　チェック
		GOTO		send10
		nop
send11	bsf			GPIO,0		;DATA 1 send
		goto		txb11
send10	bcf			GPIO,0		;DATA 0 send
		nop
		nop						;txb0からここまで9c/s
txb11			
		movlw		04h			;時間調整
		movwf		bsyc0		;2+3*3+2=13cycles
txb12	decfsz		bsyc0,F
		goto		txb12
		
		decfsz		shift,F		;(shift-1)=0 then return 
		goto		txb10		;(9+3）+13=25cycles
								;最終ビット送出から17c/s経過

;		hex2

		movlw		08H			;
		movwf		shift		;左シフトカウンタ

txb20	nop						;tx loopここから送信まで7c/s
		nop
		rlf			hex2,F		;左シフトで最上位ビットはキャリーへ
		btfss		STATUS,C	;キャリービット　チェック
		GOTO		send20
		nop
send21	bsf			GPIO,0		;DATA 1 send
		goto		txb21
send20	bcf			GPIO,0		;DATA 0 send
		nop
		nop						;txb0からここまで9c/s
txb21			
		movlw		04h			;時間調整
		movwf		bsyc0		;2+3*3+2=13cycles
txb22	decfsz		bsyc0,F
		goto		txb22
		
		decfsz		shift,F		;(shift-1)=0 then return 
		goto		txb20		;(9+3）+13=25cycles
								;最終ビット送出から17c/s経過


;		hex1

		movlw		08H			;
		movwf		shift		;左シフトカウンタ

txb30	nop						;tx loopここから送信まで7c/s
		nop
		rlf			hex1,F		;左シフトで最上位ビットはキャリーへ
		btfss		STATUS,C	;キャリービット　チェック
		GOTO		send30
		nop
send31	bsf			GPIO,0		;DATA 1 send
		goto		txb31
send30	bcf			GPIO,0		;DATA 0 send
		nop
		nop						;txb0からここまで9c/s
txb31			
		movlw		04h			;時間調整
		movwf		bsyc0		;2+3*3+2=13cycles
txb32	decfsz		bsyc0,F
		goto		txb32
		
		decfsz		shift,F		;(shift-1)=0 then return 
		goto		txb30		;(9+3）+13=25cycles
								;最終ビット送出から17c/s経過

;		hex0

		movlw		08H			;
		movwf		shift		;左シフトカウンタ

txb40	nop						;tx loopここから送信まで7c/s
		nop
		rlf			hex0,F		;左シフトで最上位ビットはキャリーへ
		btfss		STATUS,C	;キャリービット　チェック
		GOTO		send40
		nop
send41	bsf			GPIO,0		;DATA 1 send
		goto		txb41
send40	bcf			GPIO,0		;DATA 0 send
		nop
		nop						;txb0からここまで9c/s
txb41			
		movlw		04h			;時間調整
		movwf		bsyc0		;2+3*3+2=13cycles
txb42	decfsz		bsyc0,F
		goto		txb42
		
		decfsz		shift,F		;(shift-1)=0 then return 
		goto		txb40		;(9+3）+13=25cycles
								;最終ビット送出から17c/s経過

;		FLG

		movlw		08H			;
		movwf		shift		;左シフトカウンタ

txb50	nop						;tx loopここから送信まで7c/s
		nop
		rlf			flg,F		;左シフトで最上位ビットはキャリーへ
		btfss		STATUS,C	;キャリービット　チェック
		GOTO		send50
		nop
send51	bsf			GPIO,0		;DATA 1 send
		goto		txb51
send50	bcf			GPIO,0		;DATA 0 send
		nop
		nop						;txb0からここまで9c/s
txb51			
		movlw		04h			;時間調整
		movwf		bsyc0		;2+3*3+2=13cycles
txb52	decfsz		bsyc0,F
		goto		txb52
		
		decfsz		shift,F		;(shift-1)=0 then return 
		goto		txb50		;(9+3）+13=25cycles
								;最終ビット送出から17c/s経過

;
;		送信終了
;

		bsf			GPIO,0		;ストップビット　セット
		call		d10u
		retlw		0h			;送信終了




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			シリアルデータ転送サブルーチン(ビット幅50us版)
;
;		入力		hex0	16進バイナリ24ビット
;				hex1
;				hex2
;				hex3
;				flg
;		出力		W=0	送信成功
;				W=1	送信失敗
;
;
;		データ線	GP0		1bit width = 50us
;				RX（受信）	GP3 =0	受信不可
;						GP3 =1	受信可
;
;		使用ワーク	bsyc0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

txs_data
;
;		送信準備OK
;
;		DATAとRXラインを使用して送信タイミングを合わせる
;

		bcf			GPIO,0		;TX_ON(データラインと兼用）

;
;		応答待ち
;
stbs1
		call		d10u
		btfss		GPIO,3		;RX line check
		goto		stbs1
;
;		送信開始
;
;		割込み使用の場合はここからスタート
;

txs_start
		bcf			GPIO,0		;スタートビット　セット
		call		wait50u		;　
		movf		hex3,W		;DATAビット
		call		txs_byte
		movf		hex2,W
		call		txs_byte
		movf		hex1,W
		call		txs_byte
		movf		hex0,W
		call		txs_byte
		movf		flg,W
		call		txs_byte

;
;		送信終了
;

		bsf			GPIO,0		;ストップビット　セット
		call		wait50u
		retlw		0h			;送信終了

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;		１バイト転送サブルーチン
;
;		上位ビットから送信します
;
;		1ビット幅は概ね50usで送出
;
;		使用ワーク	shift
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


								;
txs_byte
		movwf		tmp0		;送信バイトをワークへ保存
		movlw		08H			;
		movwf		shift		;左シフトカウンタ

txsb0							;tx loop
		rlf			tmp0,F		;左シフトで最上位ビットはキャリーへ
		btfss		STATUS,C	;キャリービット　チェック
		GOTO		sends0
		nop
sends1	bsf			GPIO,0		;DATA 1 send
		goto		txsb1
sends0	bcf			GPIO,0		;DATA 0 send
		nop
		nop
txsb1	call		d10u		;40us delay
		call		d10u
		call		d10u
		call		d10u
		
		movlw		04h			;時間調整
		movwf		bsyc0		;2+3*3+2=13cycles/5.2us
txsb2	decfsz		bsyc0,F
		goto		txsb2
		
		decfsz		shift,F		;(shift-1)=0 then return 
		goto		txsb0		;(7+3）+13=23cycles/9.2us
		return					;





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン
;
;		clock = 10MHz(0.1usec)
;		use work reg = cnt0,cnt1,cnt2,cnt3
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


wait100u							;呼び出しも含めて、100usec
									;call is 2cycles
			movlw		08h			;1
			movwf		cnt2		;1
w1u			nop						;
			nop						;
			call		d10u		;10*8=80usec(ここだけ命令ステップを数えない）
			decfsz		cnt2,F		;5*8+4=44cycles
			goto		w1u
			return					;2+44+4=50cycles=20usec
			
wait50u								;呼び出しも含めて、50us
			movlw		04h
			movwf		cnt2
w05u		nop
			call		d10u
			decfsz		cnt2,F		;4*4+3=19cycles
			goto		w05u
			return					;2+19+4=25cycles=10us


wait5m								; 5msec delay
			movlw		05h
			movwf		cnt2
w5m			call		d1m
			decfsz		cnt2,F
			goto		w5m
			return

wait10m								; 10msec delay
			movlw		d'10'
			movwf		cnt2
w10m		call		d1m
			decfsz		cnt2,F
			goto		w10m
			return

wait20m								; 20msec delay
			movlw		d'20'
			movwf		cnt2
w20m		call		d1m
			decfsz		cnt2,F
			goto		w20m
			return

wait50m								; 50msec delay
			movlw		d'50'
			movwf		cnt2
w50m		call		d1m
			decfsz		cnt2,F
			goto		w50m
			return

wait100m							; 100msec delay
			movlw		d'100'
			movwf		cnt2
w100m		call		d1m
			decfsz		cnt2,F
			goto		w100m
			return

wait500m							; 500msec delay
			movlw		05h
			movwf		cnt3
w500m		call		wait100m
			decfsz		cnt3,F
			goto		w500m
			return

wait1s								; 1sec delay
			movlw		d'10'
			movwf		cnt3
w1s			call		wait100m
			decfsz		cnt3,F
			goto		w1s
			return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1msec Base delay 
;
;		clock = 10MHz(0.1usec)
;		1cycle = 0.4usec
;		1msec = 0.4usec * 2500cycles
;
;		# goto and call and return - 2cycles
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
d1m
			movlw		02h
			movwf		cnt0		;loop0 2times
d1m0		movlw		d'249'		;
			movwf		cnt1		;loop1 249times

d1m1		nop						;5cycles*cnt1
			nop						;5*249=1245
			decfsz		cnt1,F		;
			goto		d1m1		;

			decfsz		cnt0,F		;(d1m1-1+3)*cnt0
			goto		d1m0		;(1245-1+5)*2=2498cycles
			return					;other=3cycles
									;Total 2501*0.4usec=1msec

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			10usec Base delay
;			呼び出しも含めて、10usecとなる。
;
;		clock = 10MHZ(0.1usec)
;		1cycle = 0.4usec
;		10usec = 0.4usec * 25cycles
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

									;"call" inst = 2cycles
d10u
			movlw		05h			;1
			movwf		cnt0		;1
d10u0		nop						;4*4+3=19
			decfsz		cnt0,F		;
			goto		d10u0		;
			return					;2+1+1+19+2=25cycles
			


			end
			
			


