;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		実験用周波数カウントユニット 
;		8桁7セグLEDモジュールDFR0090出力版
;
;		PIC12F683 10MHZ
;
;		count_test3_dfr0090.asm
;
;		直接７セグモジュールDFR0090を制御し表示させる
;		よってデータ送信は行わない
;		プリスケーラはx16のみ
;		ゲートタイムは1秒と0.1秒をSWで切替
;
;	ピンダイアグラム
;	1	VDD						
;	2	GP5/T1CKI/OSC1/CLKIN
;	3	GP4/AN3/T1G/OSC2/CLKOUT
;	4	GP3/MCLR/VPP（GPIO入力のみ）
;	5	GP2/AN2/T0CKI/INT/COUNT/CCP1
;	6	GP1/AN1/CIN-/VREF/CSPCLK
;	7	GP0/AN0/CIN+/CSPDAT/ULPWU
;	8	VSS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



		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	今回は、011Bを使用
;						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  1
;

		__CONFIG	B'0000000000010011'
	

;
;		ワークエリア定義(GPR領域に設定)
;
;		使用していないのもあります
;
;	GPR領域（RAMで構成されており、プログラム中に自由に書き換え可能）
;	BANK0				BANK1
;	20H-6FH(80バイト)		A0H-BFH（32バイト）
;	70H-7FH（16バイト）		F0H-FFH（共通領域で70H-7FHと同じ）
;

hex0		equ		020h		;取得HEXバイナリデータ
hex1		equ		021h
hex2		equ		022h
hex3		equ		023h
hexw0		equ		024h		;16進バイナリ保存用
hexw1		equ		025h
hexw2		equ		026h
hexw3		equ		027h
digit12		equ		028h		;BCDデータワーク1,2桁
digit34		equ		029h		;BCDデータワーク3,4桁
digit56		equ		02ah		;BCDデータワーク5,6桁
digit78		equ		02bh		;BCDデータワーク7,8桁
digit9A		equ		02ch		;BCDデータワーク9,10桁
cnt0		equ		02dh		;ウエイト用ワーク
cnt1		equ		02eh
cnt2		equ		02fh
cnt3		equ		030h
TMC			equ		031h		;タイマオーバーフローカウンタ
flg			equ		032h		;エラー＆設定フラグ
shift		equ		033h		;シリアルデータ受信カウンタ
colum		equ		034h		;現在の桁位置
mode		equ		035h		;実行モード設定用
blk			equ		036h		;ゼロブランキング制御フラグ
bitc		equ		037h		;受信ビットカウンタ
tmp0		equ		038h		;雑用ワーク
tmp1		equ		039h
wrk0		equ		03ah
wrk1		equ		03bh
bcdw0		equ		03ch		;BCD補正処理ワーク
bcdw1		equ		03dh
cary1		equ		03eh
cary2		equ		03fh
cary3		equ		034h
bsyc0		equ		038h
bsyc1		equ		039h
colw0		equ		03fh		;桁位置処理ワーク
colw1		equ		040h		;
segw0		equ		041h		;
ihex0		equ		042h		;ISR用受信バッファ
ihex1		equ		043h		;
ihex2		equ		044h		;
ihex3		equ		045h		;
iflg		equ		046h		;ISR用受信バッファ
icnt0		equ		048h		;ISR内ウエイト用
icnt1		equ		049h		;ISR内ウエイト用
;
band		equ		03dh		;プリスケーラ設定
gtime		equ		03eh		;ｹﾞｰﾄタイム設定
pscnt		equ		03fh		;プリスケーラ残カウント
tcnt0		equ		039h		;タイマ0用ワーク
tcnt1		equ		03ah		;
tcnt2		equ		03bh		;
;
DBUF0		equ		070h		;データ編集用バッファ
DBUF1		equ		071h
DBUF2		equ		072h
DBUF3		equ		073h
DBUF4		equ		074h
DBUF5		equ		075h
DBUF6		equ		076h
DBUF7		equ		077h
;


;
;		PIC12F683　プログラムメモリ領域
;
;		0000H-07FFH（2Kワード）
;
;		この領域はRAMで構成されてはいません。
;		すべてフラッシュROM領域であり、プログラム内で書込み不可です
;
			ORG		0h			;リセットベクタ
			goto	init
				
			ORG		04h			;割込みベクタ
			goto	init

			org		05h			;プログラム領域
			



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		DFR0090モジュール用セグメントデータへの変換
;
;	注意			このルーチンのアドレス範囲の設定が必要
;				PCLATHにその上位アドレスを入れること
;	入力			Wレジスタに桁データ(DBUFx)を入れてコール
;				ドット消灯の場合、00H~0FH
;				ドット点灯の場合、10H~1FH
;
;	使用ワーク		segw0
;				
;	出力			Wレジスタに8ビット分ポート出力データを入れてリターン
;				これをLSBから順番にSI(DATA)ポートに出力する事
;				
;	SIポート		データビット=1	Qx=1　セグメント発光OFF
;				データビット=0	Qx=0　セグメント発光ON
;				ビットデータはQAから順に入り、QHへデータがシフトしていく。
;				よって、8回データ取り込みで全セグメント分設定となる。
;				また、QHからシフトしたデータは次のQAへシフトする。
;				よって、データは最上位桁（左側）から順に最下位桁へシフトしていく。
;
;	モジュール内セグメント
;
;		a				QA=a	QE=e
;	f		b			QB=b	QF=f
;		g				QC=c	QG=g
;	e		c			QD=d	QH=Dp
;		d		Dp		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_7seg
			
			movwf	segw0		;Wreg保存
			btfsc	segw0,5		;ブランク制御フラグチェック
			retlw	0ffh		;ブランク返し
			andlw	01fh		;下位5ビット取り出し
			addwf	PCL,F

;			ドット無
			retlw	B'00000011'	;Code 0 abcdef
			retlw	B'10011111'	;Code 1 bc
			retlw	B'00100101'	;Code 2 abdeg
			retlw	B'00001101'	;Code 3 abcdg
			retlw	B'10011001'	;Code 4 bcfg
			retlw	B'01001001'	;Code 5 acdfg
			retlw	B'01000001'	;Code 6 acdefg
			retlw	B'00011111'	;Code 7 abc
			retlw	B'00000001'	;Code 8 abcdefg
			retlw	B'00011001'	;Code 9 abcfg
			retlw	B'00010001'	;Code A abcefg
			retlw	B'11000001'	;Code B cdefg
			retlw	B'01100011'	;Code C adef
			retlw	B'10000101'	;Code D bcdeg
			retlw	B'01100001'	;Code E adefg
			retlw	B'01110001'	;Code F aefg

;			ドット有
			retlw	B'00000010'	;Code 0 abcdef
			retlw	B'10011110'	;Code 1 bc
			retlw	B'00100100'	;Code 2 abdeg
			retlw	B'00001100'	;Code 3 abcdg
			retlw	B'10011000'	;Code 4 bcfg
			retlw	B'01001000'	;Code 5 acdfg
			retlw	B'01000000'	;Code 6 acdefg
			retlw	B'00011110'	;Code 7 abc
			retlw	B'00000000'	;Code 8 abcdefg
			retlw	B'00011000'	;Code 9 abcfg

			retlw	B'00010000'	;Code A abcefg
			retlw	B'11000000'	;Code B cdefg
			retlw	B'01100010'	;Code C adef
			retlw	B'10000100'	;Code D bcdeg
			retlw	B'01100000'	;Code E adefg
			retlw	B'01110000'	;Code F aefg



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			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	0ch			;00001100b
			movwf	TRISIO		;GP2,3入力　GP0,1,4出力モード
			bcf		STATUS,RP0	;バンク０に切替

main
			call	get_mode	;基本設定
			call	fcount		;周波数カウント
			call	correct		;データ補正
			call	bcd			;BCD変換
			call	setbuf		;データ整理
			call	putl		;モジュールに送信
			goto	main


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			動作モードセット
;
;		ゲートタイムSW	ON 1秒(GP3=0)、8桁表示
;					OFF 0.1秒(GP3=1)、6桁表示
;
;		使用ワーク
;				狭帯域(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
;				2桁表示指令		flg=xxxxx001
;				4桁表示指令		flg=xxxxx011
;				6桁表示指令		flg=xxxxx101
;				8桁表示指令		flg=xxxxx111
;				ドット表示指令		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	gtime
;			btfss	GPIO,3		;プリスケーラ設定SWチェック
;			goto	ps_off		;GP3=0(SW_ON) 
;			goto	ps_on008
			goto	ps_on016	;GP3=1(SW_OFF)
			
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_on256	;プリスケーラ　ON(1/256)
			bsf		band,2		;256倍モード(BAND=4)
			bsf		STATUS,RP0	;バンク１に切替え
			movlw	0f7H		;11110111b
			movwf	OPTION_REG	;プリスケーラ1/256分周にセット
			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桁ドット表示指定
			movlw	05h
			movwf	colum
			return
ckg00		bsf		gtime,0		;GP=0(SW_ON) set 1s
			movlw	04fh		;01001111b
        	movwf	flg			;8桁表示、4,7桁ドット表示指定
			movlw	07h
			movwf	colum
			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フラグをクリア
;			gate_open オープン後2サイクル経過
			bsf		STATUS,RP0	;バンク１に切替
			bsf		TRISIO,2	;GP2入力モード（ゲートオープン）
			bcf		STATUS,RP0	;バンク０に切替
			call	count100m	;249995cycles
			
;			gate_closed　クローズまで2サイクル経過
			nop					;時間微調整
			bsf		STATUS,RP0	;バンク１に切替
			bcf		TRISIO,2	;GP2出力モード(ゲートクローズ)
			bcf		STATUS,RP0	;バンク０に切替
			bcf		GPIO,2		;GP2=0
			return

;
;			ゲートタイム1sec=2500000cycles
;
gate1s
			bcf		flg,7		;OverFlowフラグをクリア
			movlw	0aH			;10回
			movwf	tmp0

;			gate_open
			bsf		STATUS,RP0	;バンク１に切替
			bsf		TRISIO,2	;GP2入力モード
			bcf		STATUS,RP0	;バンク０に切替


g1s0
			call	count100m	;249998cycles　01
			nop
			nop
			call	count100m	;249998cycles　02
			nop
			nop
			call	count100m	;249998cycles　03
			nop
			nop
			call	count100m	;249998cycles　04
			nop
			nop
			call	count100m	;249998cycles　05
			nop
			nop
			call	count100m	;249998cycles　06
			nop
			nop
			call	count100m	;249998cycles　07
			nop
			nop
			call	count100m	;249998cycles　08
			nop
			nop
			call	count100m	;249998cycles　09
			nop
			nop
			call	count100m	;249998cycles　10
			
;			gate_closed　クローズまで2サイクル経過
			bsf		STATUS,RP0	;バンク１に切替
			bcf		TRISIO,2	;GP2出力モード(ゲートクローズ)
			bcf		STATUS,RP0	;バンク０に切替
			bcf		GPIO,2		;GP2=0
			return



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		タイマー０への入力パルス　カウントループ
;
;		ゲートオン、オフの時間も考慮し、100ms間の入力パルスカウントとなる様に設定する事
;		f=10MHZ only	249998cycles(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/256
;
;		使用ワーク
;				狭帯域(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
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

correct
;			プリスケーラモード確認
			btfsc	band,2		;bit2
			goto	x256		;bit2=1 then x256
			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
			btfsc	gtime,0		;
			return
			call	x10
			return

;			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		;オーバーフローフラグをON
			bcf		flg,7		;オーバーフローフラグをOFF
			btfsc	gtime,0		;
			return
			call	x10
			return

;			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		;オーバーフローフラグをON
			bcf		flg,7		;オーバーフローフラグをOFF
			btfsc	gtime,0		;
			return
			call	x10
			return

x256
			bcf		flg,7		;オーバーフローフラグをOFF
			movlw	0h
			iorwf	hex3,W
			btfsc	STATUS,Z
			bsf		flg,2
			movf	hex2,W
			movwf	hex3
			movf	hex1,W
			movwf	hex2
			movf	TMR0,W
			movwf	hex1
			clrf	hex0		;最下位８ビットは切り捨て
			btfsc	gtime,0		;
			return
			call	x10
			return


;
;			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


			btfsc	STATUS,C	;オーバーフローか？
			bsf		flg,7		;オーバーフローフラグをON
			bcf		flg,7		;オーバーフローフラグをOFF
			return


;			32ビット加算
;
;		(hex0-3) = (hex0-3) + (hexw0-3)
;

add32b
			movf	hexw0,W
			addwf	hex0,F
			movlw	01h
			btfss	STATUS,C
			goto	adb1
			addwf	hex1,F
			btfsc	STATUS,C
			addwf	hex2,F
			btfsc	STATUS,C
			addwf	hex3,F
			
adb1		movf	hexw1,W
			addwf	hex1,F
			movlw	01h
			btfss	STATUS,C
			goto	adb2
			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
			return




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		表示データバッファのセッティング
;
;	入力データ		5バイト(10桁分)BCD　この内容は保存される
;				digit12
;				digit34
;				digit56
;				digit78
;				digit9A（表示されない）
;
;	表示桁		colum　この内容は保存される
;	
;	入力制御フラグ	flg　この内容は保存される
;	　2桁表示指令	flg=xxxxx001
;	　4桁表示指令	flg=xxxxx011
;	　6桁表示指令	flg=xxxxx101
;	　8桁表示指令	flg=xxxxx111
;	　ゼロブランキング	flg=xxxx0xxx　
;					bit3=0	しない
;				flg=xxxx1xxx
;					bit3=1	　する
;	　ドット表示指令	flg=x000xxxx　表示なし
;					bit4=1	2,5桁点燈
;					bit5=1	3,6桁点燈
;					bit6=1	4,7桁点燈
;	　警告LED		flg=1xxxxxxx　LED点灯する
;				flg=0xxxxxxx　LED点灯しない
;
;			上位桁から書き込みます
;
;		DBUFx　	各桁バッファ データフォーマット
;		bit0-3	表示する数値データ		bit012=0H-FH
;		bit4	ドット表示			0=OFF、1=ON
;		bit5	ブランク			0=OFF、1=ON
;		bit6	予約
;		bit7　　	予約
;		*桁データは専用サブルーチンにて、転送ビットデータに変換されます
;
;	使用ワーク	bufw0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

setbuf
;			表示する数値データを全バッファに書込み
			swapf	digit78,W
			andlw	0fh
			movwf	DBUF7		;8桁目に数値データ書込み

			movf	digit78,W
			andlw	0fh
			movwf	DBUF6		;7桁目に数値データ書込み
			
			swapf	digit56,W
			andlw	0fh
			movwf	DBUF5		;6桁目に数値データ書込み

			movf	digit56,W
			andlw	0fh
			movwf	DBUF4		;5桁目に数値データ書込み
			
			swapf	digit34,W
			andlw	0fh
			movwf	DBUF3		;4桁目に数値データ書込み

			movf	digit34,W
			andlw	0fh
			movwf	DBUF2		;3桁目に数値データ書込み
			
			swapf	digit12,W
			andlw	0fh
			movwf	DBUF1		;2桁目に数値データ書込み

			btfss	flg,7
			goto	setb01		;ノーマル処理
;			オーバーフロー表示処理
			movlw	0eh			;最下位桁に`E`を表示
			movwf	DBUF0
			goto	setb02

setb01		movf	digit12,W
			andlw	0fh
			movwf	DBUF0		;1桁目に数値データ書込み

;			その他指定処理を全バッファに行う
;			呼び出し順番によっては上手く機能しなくなるので注意
setb02		call	zbk			;ゼロブランキング処理
			call	spos		;指定表示桁数処理
			call	addot		;ドット表示処理

			return
			
;			カウントオーバーフローチェック
;			警告LEDを発光させる、7セグ表示は残り8桁分を表示
;			movf	digit9A,W	;ここにデータがある場合O.Fとなる
;			iorlw	0h
;			btfss	STATUS,Z
;			goto	sbfer
;			bcf		PORTA,5			
;			return
;sbfer		bsf		PORTA,5		;オーバーフロー発生
;			retlw	01h

;
;			ゼロブランキング処理
;
;		入力		DBUFx　（数値データ設定済であること)
;				flg	ビット3　ZBKフラグ
;		使用ワーク	無
;
zbk
			btfss	flg,3		;ZBK命令フラグチェック
			return				;命令無いので終了
			movf	DBUF7,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			bsf		DBUF7,5		;ブランキングセット

			movf	DBUF6,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			bsf		DBUF6,5		;ブランキングセット

			movf	DBUF5,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			bsf		DBUF5,5		;ブランキングセット

			movf	DBUF4,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			bsf		DBUF4,5		;ブランキングセット

			movf	DBUF3,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			bsf		DBUF3,5		;ブランキングセット

			movf	DBUF2,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			bsf		DBUF2,5		;ブランキングセット

			movf	DBUF1,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			bsf		DBUF1,5		;ブランキングセット

			return				;DBUF0はゼロブランキングしない



;
;			表示桁位置調整サブルーチン
;			データバッファへの準備ルーチンから呼ばれる事を想定
;
;			指定表示桁数になるまでバッファのデータを右シフトする
;			余った左側桁は「0」に書換える
;			はみ出た下位桁は破棄される
;
;		入力		DBUFx	調整処理するデータバッファ
;				colum	設定表示桁数
;		出力		DBUFx	調整処理されたデータバッファ
;		使用ワーク	colw0	桁位置ワーク
;

spos
			movlw	07h
			subwf	colum,W		;バイトシフト回数設定
			btfsc	STATUS,C	;ボローなら処理開始
			return				;表示桁変更無で終了
			movf	colum,W		;バイトシフト回数設定
			sublw	07h			;W=07-W
			movwf	colw0
spos01		;1バイト右シフト
			movf	DBUF1,W		;DB1→DB0
			btfsc	flg,7
			call	sposer
			movwf	DBUF0
			bcf		DBUF0,5		;ブランクビットリセット
			
			movf	DBUF2,W		;DB2→DB1
			movwf	DBUF1
			
			movf	DBUF3,W		;DB3→DB2
			movwf	DBUF2
			
			movf	DBUF4,W		;DB4→DB3
			movwf	DBUF3
			
			movf	DBUF5,W		;DB5→DB4
			movwf	DBUF4
			
			movf	DBUF6,W		;DB6→DB5
			movwf	DBUF5
			
			movf	DBUF7,W		;DB7→DB6
			movwf	DBUF6
			
			movlw	020h		;bit5=1、他ビット=0
			movwf	DBUF7		;ブランクビットセット
			
			decf	colw0,F
			btfss	STATUS,Z
			goto	spos01
			retlw	0h

;			W_REGの下位4ビットをEHにする
sposer
			andlw	0f0h
			iorlw	0eh
			return
			

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			ドットを表示するか否かの処理ルーチン
;
;		入力	flg		
;
;		出力	DBUFx,4=0		ドット点燈無
;		出力	DBUFx,4=1		ドット点燈有
;
;		flg
;			ドット表示位置		flg=x111xxxx
;							bit4=1	2,5桁点燈
;							bit5=1	3,6桁点燈
;							bit6=1	4,7桁点燈
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

addot
			bcf		DBUF0,4		;ドット点灯ビットリセット
			bcf		DBUF1,4		;
			bcf		DBUF2,4		;
			bcf		DBUF3,4		;
			bcf		DBUF4,4		;
			bcf		DBUF5,4		;
			bcf		DBUF6,4		;
			bcf		DBUF7,4		;

			;2,5桁点燈指令チェック
			btfss	flg,4		;2,5点燈指令か？
			goto	adt2		;違うので次ビットチェック
			;2,5桁目点燈処理
			bsf		DBUF1,4		;2桁目ドット点燈
			bsf		DBUF4,4		;5桁目ドット点燈
			return

adt2		;3,6桁点燈指令チェック
			btfss	flg,5		;3,6点燈指令か？
			goto	adt4		;違うので次ビットチェック
			;3桁目点燈処理
			bsf		DBUF2,4		;3桁目ドット点燈
			bsf		DBUF5,4		;6桁目ドット点燈
			return

adt4		;4,7桁点燈指令チェック			
			btfss	flg,6		;4,7点燈指令か？
			return				;点灯無終了
			;4桁点燈処理
			bsf		DBUF3,4		;4桁目ドット点燈
			bsf		DBUF6,4		;7桁目ドット点燈
			return



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		8桁すべて表示させる
;		表示位置指定はできない
;		表示データは、ワークレジスタDBUFxに事前に準備必要
;
;		入力		DBUF0-DBUF7
;
;		番号は桁番号と一致、例)DBUF7=8桁目（最上位桁）
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

putl
			movf	DBUF0,W		;桁データをレジスタに転送
			call	putr		;ラッチはしない=旧データ表示のまま
			movf	DBUF1,W
			call	putr
			movf	DBUF2,W
			call	putr
			movf	DBUF3,W
			call	putr
			movf	DBUF4,W
			call	putr
			movf	DBUF5,W
			call	putr
			movf	DBUF6,W
			call	putr
			movf	DBUF7,W
			call	putr
			
			call	ptlat		;ラッチする=新データ表示する
			return


;
;		Wregの1ケタデータを最上位桁に表示(ラッチ)させる
;		もちろん、旧データはシフトしていき、最下位桁は破棄されます。
;
;		GP0=DATA(SI)
;		GP1=CLOCK(SCK)
;		GP4=LATCH(RCK)
;
;		使用変数	wrk0、wrk1
;
putc
			call	get_7seg
			movwf	wrk0		;セグメントビットデータ
			movlw	08h			;8ビット分送出カウンタ
			movwf	wrk1		;カウンタ
			bcf		GPIO,1		;SCK=0
			nop
			bcf		GPIO,4		;RCK=0
ptclp
			rrf		wrk0		;C=LSB
			btfsc	STATUS,C
			goto	ptc01
			
ptc00		;SI=0送出
			bcf		GPIO,0		;SI=0
			call	w02u		;ウエイト1usec
			bsf		GPIO,1		;SCK=1
			call	w02u		;ウエイト1usec
			bcf		GPIO,1		;SCK=0
			goto	ptcen
			
ptc01		;SI=1送出
			bsf		GPIO,0		;SI=1
			call	w02u		;ウエイト1usec
			bsf		GPIO,1		;SCK=1
			call	w02u		;ウエイト1usec
			bcf		GPIO,1		;SCK=0

ptcen		;
			decfsz	wrk1
			goto	ptclp		;残ビット有
;			ラッチパルス送出して終了
			bsf		GPIO,4		;RCK=1
			call	w02u
			bcf		GPIO,4		;RCK=0
			return

;
;		Wregの1ケタデータを最上位桁レジスタに転送するがラッチしない
;		7セグ表示は旧データのままで、更新されたデータは表示されない
;		レジスタの旧データはシフトしていき、最下位桁分は破棄されます。
;
;		GP0=DATA(SI)
;		GP1=CLOCK(SCK)
;		GP4=LATCH(RCK)
;
;		使用変数	wrk0、wrk1
;
putr
			call	get_7seg
			movwf	wrk0		;セグメントビットデータ
			movlw	08h
			movwf	wrk1		;カウンタ
			bcf		GPIO,1		;SCK=0
			nop
			bcf		GPIO,4		;RCK=0
ptrlp
			rrf		wrk0		;C=LSB
			btfsc	STATUS,C
			goto	ptr01
			
ptr00		;SI(DATA)=0送出
			bcf		GPIO,0		;SI=0
			call	w02u		;ウエイト1usec
			bsf		GPIO,1		;SCK=1
			call	w02u		;ウエイト1usec
			bcf		GPIO,1		;SCK=0
			goto	ptren
			
ptr01		;SI(DATA)=1送出
			bsf		GPIO,0		;SI=1
			call	w02u		;ウエイト1usec
			bsf		GPIO,1		;SCK=1
			call	w02u		;ウエイト1usec
			bcf		GPIO,1		;SCK=0

ptren							;
			decfsz	wrk1
			goto	ptrlp
			return				;ラッチしないで終了

;			ラッチパルス送出
;
;			コールするだけでOK
;			
ptlat		bsf		GPIO,4		;RCK=1
			call	w02u
			bcf		GPIO,4		;RCK=0
			call	w02u
			return

;
;		１桁分のブランクデータを転送する
;		表示（ラッチ）はしない
;
clc
;			ブランクデータ転送準備
			movlw	08h			;8
			movwf	wrk0
			bcf		GPIO,1		;CLOCK(SCK)=0set
			call	w02u
			bcf		GPIO,4		;LATCH(RCK)=0set
			call	w02u
			bsf		GPIO,0		;DATA(SI)=1set
			call	w02u
;			データ転送ループ
clc01		bsf		GPIO,1		;CLOCK(SCK)=1set
			call	w02u
			bcf		GPIO,1		;CLOCK(SCK)=0set
			call	w02u
			decfsz	wrk0
			goto	clc01
			return

;
;		8桁すべてブランク表示とする
;
cll
;			ブランクデータ転送準備
			movlw	040h		;8×8
			movwf	wrk0
			bcf		GPIO,1		;CLOCK(SCK)=0set
			call	w02u
			bcf		GPIO,4		;LATCH(RCK)=0set
			call	w02u
			bsf		GPIO,0		;DATA(SI)=1set
			call	w02u
;			データ転送ループ
cll01		bsf		GPIO,1		;CLOCK(SCK)=1set
			call	w02u
			bcf		GPIO,1		;CLOCK(SCK)=0set
			call	w02u
			decfsz	wrk0
			goto	cll01
;			終了処理（ラッチする）
			call	w02u
			bsf		GPIO,4		;LATCH(RCK)=1set
			call	w02u
			bcf		GPIO,4		;LATCH(RCK)=0set
			call	w02u
			bcf		GPIO,0		;DATA(SI)=0set
			return




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		４バイトバイナリの10桁BCDへの変換
;		MicroChip社のアプリケーションノートより
;
;		入力		4バイト(32ビット)16進バイナリ
;				hex0
;				hex1
;				hex2
;				hex3
;
;		出力		5バイト(10桁)ＢＣＤ
;				digit12
;				digit34
;				digit56
;				gidit78
;				gidit9A
;
;		使用ワーク
;				hexw0	入力データ保存用
;				hexw1
;				hexw2
;				hexw3
;				shift	シフトカウンタ
;				bcdw0	補正処理ワーク
;				bcdw1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
bcd
			BCF		STATUS,C	;キャリーリセット
			MOVLW	020H		;シフトカウンタ初期化
			MOVWF	shift		;4バイト分32回の指定 
			CLRF	digit12		;BCDデータエリア初期化
			CLRF	digit34
			CLRF	digit56
			CLRF	digit78
			CLRF	digit9A
			movf	hex0,W
			movwf	hexw0
			movf	hex1,W
			movwf	hexw1
			movf	hex2,W
			movwf	hexw2
			movf	hex3,W
			movwf	hexw3
			
			;変換ループ処理
loop
			RLF		hexw0,F		;16進データ左シフト
			RLF		hexw1,F
			RLF		hexw2,F
			RLF		hexw3,F
			RLF		digit12,F	;BCDデータ左シフト
			RLF		digit34,F
			RLF		digit56,F
			RLF		digit78,F
			RLF		digit9A,F
			DECFSZ	shift,F		;
			GOTO	adjst		;BCD調整処理へ
			RETURN
			
			;BCDデータ全桁補正処理
adjst
			MOVF	digit12,W	;digit12
			CALL	adjbcd
			MOVWF	digit12
			MOVF	digit34,W	;digit34
			CALL	adjbcd
			MOVWF	digit34
			MOVF	digit56,W	;digit56
			CALL	adjbcd
			MOVWF	digit56
			MOVF	digit78,W	;digit78
			CALL	adjbcd
			MOVWF	digit78
			MOVF	digit9A,W	;digit9A
			CALL	adjbcd
			MOVWF	digit9A
			GOTO	loop

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1バイト2桁分必要に応じて+3補正処理
;
;			入力		W_reg
;			出力		W_reg
;
;			使用ワーク	bcdw0
;					bcdw1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
adjbcd
			MOVWF	bcdw0		;元データをbcdw0に保存
			MOVLW	3			;W=3
			ADDWF	bcdw0,W		;W=3+bcdw0
			MOVWF	bcdw1		;下桁を+3した上下桁をbcdw1に保存
			BTFSC	bcdw1,3		;if 下桁<7 then next_skip
			MOVWF	bcdw0		;下桁を+3した上下桁をbcdw0に保存 
		
			MOVLW	030H		;W+30
			ADDWF	bcdw0,W		;W=上桁+3
			MOVWF	bcdw1		;それをいったんbcdw1に保存
			BTFSC	bcdw1,7		;if 上桁<7 then next_skip
			MOVWF	bcdw0		;上桁を+3した上下桁をbcdw0に保存
			MOVF	bcdw0,W		;W_regに入れてリターン
			RETURN





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン	10MHZ用
;
;		1cycle	= 0.4us(2.5MHZ)
;		使用レジスタ	= cnt0,cnt1,cnt2,cnt3
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


wait100u						;呼び出しも含めて、100usec
								;call is 2cycles
			movlw	08h			;1
			movwf	cnt2		;1
w1u			nop					;
			nop					;
			call	w10u		;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	w10u
			decfsz	cnt2,F		;4*4+3=19cycles
			goto	w05u
			return				;2+19+4=25cycles=10us


wait5m							; 5msec delay
			movlw	05h
			movwf	cnt2
w5m			call	w1m
			decfsz	cnt2,F
			goto	w5m
			return

wait10m							; 10msec delay
			movlw	d'10'
			movwf	cnt2
w10m		call	w1m
			decfsz	cnt2,F
			goto	w10m
			return

wait20m							; 20msec delay
			movlw	d'20'
			movwf	cnt2
w20m		call	w1m
			decfsz	cnt2,F
			goto	w20m
			return

wait50m							; 50msec delay
			movlw	d'50'
			movwf	cnt2
w50m		call	w1m
			decfsz	cnt2,F
			goto	w50m
			return

wait100m						; 100msec delay
			movlw	d'100'
			movwf	cnt2
w100m		call	w1m
			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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1ms 基本ウェイト
;			呼び出しを含めて1msとなる。 
;
;		clock	= 10MHz(0.1usec)
;		1cycle	= 0.4usec
;		1ms		= 0.4usec * 2500cycles
;
;			使用変数　cnt0,cnt1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
w1m
			movlw	02h
			movwf	cnt0		;loop0 2times
w1m0		movlw	d'249'		;
			movwf	cnt1		;loop1 249times

w1m1		nop					;5cycles*cnt1
			nop					;5*249=1245
			decfsz	cnt1,F		;
			goto	w1m1		;

			decfsz	cnt0,F		;(d1m1-1+3)*cnt0
			goto	w1m0		;(1245-1+5)*2=2498cycles
			return				;other=3cycles
								;Total 2501*0.4usec=1msec

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			10us以下 基本ウェイト
;			呼び出し（call　w10u)も含めて、10usとなる。
;
;		clock	= 10MHZ(0.1usec)
;		1cycle	= 0.4us
;		10us	= 0.4us * 25cycles
;		使用変数　cnt0,cnt1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

								;"call" inst = 2cycles
w10u
			movlw	05h			;1
			movwf	cnt0		;1
w10u0		nop					;4*4+3=19
			decfsz	cnt0,F		;
			goto	w10u0		;
			return				;2+1+1+19+2=25cycles

w04u		
			nop					;4us=0.4us*1cycles
			nop
			nop			
			nop					
			nop
			nop
			return				;2+6+2=10cycles=4us

w02u		
			nop					;2us=0.4us*5cycles			
			return				;2+1+2=5cycles

			


			END
			
			


