;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		ＴＳ５２０Ｓ／Ｖ用デジタルディスプレイ　Ver０．１	ＪＡ０ＱＯＮ
;
;		実験用基板　専用プログラム
;
;		PIC16F1829 12.8MHZ（X'TAL使用）
;		出力　秋月電子 DFR0090 8桁7セグ表示モジュール
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



		LIST	P=PIC16F1829
		INCLUDE	P16F1829.INC

;		
;CONFIGURATION WORD 1(ADDRESS:8007H)
;					設定
;bit13		FCMEN	0	Fail-Safe Clock Monitor
;						1=有効,0=無効
;bit12		IESO	0	内部･外部切替スイッチモード
;			________	1=有効,0=無効
;bit11		CLKOUTEN 1	クロック出力イネーブルビット
;						1=無効　RA4I/O使用可
;						0=有効　クロックがCLKPUTピンに出力される
;bit10-9	BOREN	00	ブラウンアウト設定
;						11=有効
;						10=スリープ時以外有効
;			___			00=無効
;bit8		CPD		1	データメモリプロテクション
;			__			1=無効,0=有効
;bit7		CP		1	プログラムメモリプロテクション　
;						1=無効,0=有効
;bit6		MCLRE	0	RA3/MCLRピン選択ビット
;			_____		1=MCLR有効,0=RA3有効(Digital input)
;bit5		PWRTE	0	power_up timer　使います。
;						1=無効,0=有効
;bit4-3		WDTE	00	Watchdog Timer
;						11=有効
;						10=ランニング中に有効、スリープ中は無効
;						01=レジスタによるコントロール
;						00=無効
;bit2-0		FOSC	010	発振器選択ビット
;						111=ECH:外部クロック入力（4-32MHZ)、RA4I/O可
;						110=ECM:外部クロック入力（0.5-4MHZ)、RA4I/O可
;						101=ECL:外部クロック入力（0-0.5MHZ)、RA4I/O可
;						100=INTOSC:内部発振、RA4-RA5I/O可
;						011=EXTRC:外部RC発振、RA4I/O可、RA5不可
;						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  1  0  0  1  1  0  0  0  0  0  1  0
;
;
	__CONFIG _CONFIG1,	B'0000100110000010'
;
;CONFIGURATION WORD 2(ADDRESS:8008H)
;					設定
;bit13		LVP		0	低電圧プログラミング設定
;						1=有効
;			_____		0=無効、高電圧必要
;bit12		DEBUG	1	インサーキット･デバッガ モード設定
;						1=無効
;						0=有効、RA0-1をデバッガに使用
;bit11					Unimplemented
;bit10		BORV	0	ブラウンアウト･リセット電圧選択ビット（Vbor参照)
;						1=低電圧で動作
;						0=高電圧で動作
;bit9		STVREN	0	スタック･オーバーフロー･リセット設定
;						1=有効
;						0=無効
;bit8		PLLEN	0	PLL設定
;						1=4xPLL有効
;						0=4xPLL無効
;bit7-5					Unimplemented
;bit4					Reserved
;bit3-2					Unimplemented
;bit1-0		WRT		11	フラッシュメモリ プロテクション設定（EECONレジスタ参照)
;						11=無効
;						10=0h-1FFh有効
;						01=0h-3FFh有効
;						00=0h-7FFh有効
;
;bit	15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
;data    0  0  0  1  0  0  0  0  0  0  0  0  0  0  1  1
;
;
	__CONFIG _CONFIG2,	B'0001000000000011'

;
;	STATUSレジスタの各フラグビット
;
;bit7-5					unimplemented
;			__
;bit4		TO			タイムアウトビット
;						1=電源起動後、CLRWDT命令実行後、SLEEP命令実行後
;			__			0=WDTタイムアウト発生
;bit3		PD			パワーダウンビット
;						1=電源起動後、CLRW命令実行後
;						0=SLEEP命令実行
;bit2		Z			ゼロビット
;						1=演算結果がゼロ
;						0=演算結果がゼロ以外
;						          ____________
;bit1		DC			Ｄｉｇｉｔ Carry/Digit Borrow
;						1=キャリー発生、ボロー無
;						0=キャリー無、ボロー発生
;						　　　　　　______
;bit0		C			Carry/Borrow
;						1=キャリー発生、ボロー無
;						0=キャリー無、ボロー発生
;


;		ワークエリア定義
;
;		BANK0	20h-7Fh
;
;		使用していないのもあります
;

hex0		equ		020h		;RF入力HEXデータ
hex1		equ		021h		;
hex2		equ		022h
hex3		equ		023h
hex0c		equ		024h		;CAR入力HEXデータ
hex1c		equ		025h		;
hex2c		equ		026h
hex3c		equ		027h
hex0h		equ		028h		;HET入力HEXデータ
hex1h		equ		029h		;
hex2h		equ		02ah
hex3h		equ		02bh
hex0v		equ		02ch		;VFO入力HEXデータ
hex1v		equ		02dh		;
hex2v		equ		02eh
hex3v		equ		02fh
rhex0		equ		030h		;外部入力HEXデータ
rhex1		equ		031h		;
rhex2		equ		032h		;
rhex3		equ		033h		;
hexw0		equ		034h		;HEXデータ演算用ワーク
hexw1		equ		035h		;引数受け渡しにも使用
hexw2		equ		036h		;
hexw3		equ		037h		;
digit12		equ		038h		;BCD変換した十進データ
digit34		equ		039h		;
digit56		equ		03ah		;
digit78		equ		03bh		;
digit9A		equ		03ch		;
cnt0		equ		03dh		;時間待ちルーチン専用
cnt1		equ		03eh		;これは使い回ししない事
cnt2		equ		03fh
cnt3		equ		040h
tcnt0		equ		041h		;タイマ用カウンタ
tcnt1		equ		042h		;割り込みルーチン内用にも使用
tcnt2		equ		043h		;
pscnt		equ		044h		;プリスケーラ残カウント用
bcdw0		equ		045h		;BCD変換ルーチン用ワーク
bcdw1		equ		046h
wrk0		equ		047h		;Wregデータ退避用
wrk1		equ		048h
tmp0		equ		049h		;雑用、いつどこで使用してもOK
tmp1		equ		04ah		;
ofst		equ		04bh		;
rflg		equ		04ch
segw0		equ		04dh		;セグメントデータ用
shift		equ		04eh		;シフトカウンタ用
bsyc0		equ		04fh
bsyc1		equ		050h
flg			equ		051h		;表示モジュールへの伝達フラグ
DFLG		equ		052h		;サブ基板よりの伝達フラグ
MODE		equ		053h		;メインループ動作状況フラグ
DBUF0		equ		054h		;桁表示データバッファ
DBUF1		equ		055h
DBUF2		equ		056h
DBUF3		equ		057h
DBUF4		equ		058h		;
DBUF5		equ		059h
DBUF6		equ		05ah
DBUF7		equ		05bh
CMD0		equ		05ch		;モジュールへのコマンド用
CMD1		equ		05dh		;
colum		equ		05eh		;現在の桁位置ワーク
colw0		equ		05fh		;桁制御用ワーク

;

			ORG		0h			;リセットベクタ
			goto	init
			ORG		04h			;割り込みベクタ
			goto	init

			ORG		05h			;プログラムエリア
			


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC16F1829　イニシャライズ
;
;		OSCCON(BANK1　099H)
;			bit7	SPLLEN	ソフトウエアPLL設定ビット
;							1 = 4xPLL有効
;							0 = 4xPLL無効(リセット後)
;			＊コンフィグレーションワードPLLEN=1の時、この設定は無視される。
;			bit6-3	IRCF	内部発振器クロック選択ビット
;							000x = 31KHZ LF
;							0010 = 31.25KHZ MF
;							0011 = 31.25KHZ HF
;							0100 = 62.5KHZ MF
;							0101 = 125KHZ MF
;							0110 = 250KHZ MF
;							0111 = 500KHZ MF（デフォルト）
;							1000 = 125kHZ HF
;							1001 = 250kHZ HF
;							1010 = 500kHZ HF
;							1011 = 1MHZ HF
;							1100 = 2MHZ HF
;							1101 = 4MHZ HF
;							1110 = 8MHZ or 32MHZ HF
;							1111 = 16MHZ HF
;			bit2			Unimplemented
;			bit1-0	SCS		システムクロック選択ビット
;							1x = 内部発振器
;							01 = タイマ1発振器
;							00 = FOSCで指定された発振器(リセット後)
;			(注)詳細はマニュアルあるいは当局HP内解説を参照
;							HF=HFINTOSC（16MHZ)
;							MF=MFINTOSC(500KHZ)
;							LF=LFINTOSC(32KHZ)
;
;
;			32MHZ内部発振設定
;		コンフィグレーションワード1		FOSC=100
;		OSCCON				SCS=00
;		OSCCON				IRCF=1110
;		OSCCON				SPLLEN=1(#1)
;		コンフィグレーションワード2		PLLEN=1(#1)
;						(#1)設定はどちらかでOKだが、PLLEN=1とすると、
;							OSCCONのSPLLEN=0の設定は無効となる。
;							また、8MHZのHFINTOSCは選択の余地が無い。
;
;		各ポートのデジタル入出力は、TTL入力、CMOS出力が基本
;		PORTA(BANK0　00CH）
;			bit7-6	Unimplemented(read=0)
;			bit5	RA5		デジタルI/O
;			bit4	RA4		デジタルI/O、アナログ入力
;			bit3	RA3		デジタルInputのみ(TTL)
;			bit2	RA2		デジタルI/O（CMOSシュミット）、アナログ入力
;			bit2	RA1		デジタルI/O、アナログ入力
;			bit0	RA0		デジタル･アナログI/O,DAコンバータ出力
;
;		PORTB(BANK0　00DH）
;			bit7-6	RB7-6	デジタルI/O
;			bit5-4	RB5-4	デジタルI/O、アナログ入力
;			bit3-0	Unimplemented(read=0)
;
;		PORTC(BANK0　00EH）
;			bit7-6	RC7-6	デジタルI/O、アナログ入力
;			bit5-4	RC5-4	デジタルI/O
;			bit3	RC3-0	デジタルI/O、アナログ入力
;
;		TRISA(BANK1　08CH)
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-4	1=入力、0=出力
;			bit3	RA3		常に1
;			bit2	RA2-0	1=入力、0=出力
;
;		TRISB(BANK1　08DH)
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RB7-4	1=入力、0=出力
;
;		TRISC(BANK1　08EH)　マニュアル130ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-0	1=入力、0=出力
;
;		LATA(BANK2　10CH)
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-4	出力データ保持
;			bit3	Unimplemented(read=0)
;			bit2	RA2-0	出力データ保持
;							（このラッチデータはTRISAレジスタ設定で各ピンに反映される）
;
;		LATB(BANK2　10DH)
;			bit7-4	RAB7-4	出力データ保持
;			bit3-0	Unimplemented(read=0)
;							（このラッチデータはTRISBレジスタ設定で各ピンに反映される）
;
;		LATC(BANK2　10EH)
;			bit7-6	Unimplemented(read=0)
;			bit5-0	RA5-4	出力データ保持
;							（このラッチデータはTRISCレジスタ設定で各ピンに反映される）
;
;
;		ANSELA(BANK3　18CH)
;			bit7-5	Unimplemented(read=0)
;			bit4	ANSA3/RA4	アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			bit3	Unimplemented(read=0)
;			bit2-0	ANA2-0/RA2-0アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			＊デフォルトでは、すべて1(アナログ入力)となっている
;
;		ANSELB(BANK3　18DH)
;			bit7-4	ANSC3-0/RC3-0　アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			bit3-0	Unimplemented(read=0)
;			＊デフォルトではアナログ入力となっている
;
;		ANSELC(BANK3　18EH)　マニュアル131ページ
;			bit7-4	Unimplemented(read=0)
;			bit3-0	ANSC3-0/RC3-0　アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			＊デフォルトではアナログ入力となっている
;
;		WPUA(BANK4　20CH)　ポートAプルアップ設定ビット
;			bit7-6	Unimplemented(read=0)
;			bit5-0			1=PORTA各ビットプルアップ有効
;					 _____	0=PORTA各ビットプルアップ無効
;					*WPUENビットが有効の時のみ、設定有効となる。
;
;		WPUB(BANK4　20DH)　ポートBプルアップ設定ビット
;			bit7-4			1=PORTB各ビットプルアップ有効
;					 _____	0=PORTB各ビットプルアップ無効
;			bit3-0	Unimplemented(read=0)
;					*WPUENビットが有効の時のみ、設定有効となる。
;
;		WPUC(BANK4　20EH)　ポートCプルアップ設定ビット
;			bit7-0			1=PORTC各ビットプルアップ有効
;					 _____	0=PORTC各ビットプルアップ無効
;					*WPUENビットが有効の時のみ、設定有効となる。
;
;		INLVLA(BANK7　38CH)　ポートA入力レベル設定レジスタ
;			bit7-6	Unimplemented(read=0)
;			bit5-0	RA5-0	ST/TTL選択ビット
;								1=シュミットトリガー(ST)入力
;								0=TTL入力
;
;		INLVLB(BANK7　38DH)　ポートB入力レベル設定レジスタ
;			bit7-4	RB7-4	ST/TTL選択ビット
;								1=シュミットトリガー(ST)入力
;								0=TTL入力
;			bit3-0	Unimplemented(read=0)
;
;		INLVLB(BANK7　38EH)　ポートC入力レベル設定レジスタ
;			bit7-0	RC7-0	ST/TTL選択ビット
;								1=シュミットトリガー(ST)入力
;								0=TTL入力
;
;		ADCON0レジスタ(BANK1　09DH)
;		bit7	Unimplemented(read=0)
;		bit6-2	CHS		アナログ入力チャンネル選択ビット
;						00000 = AN0
;						00001 = AN1
;						00010 = AN2
;						00011 = AN3
;						00100 = AN4
;						00101 = AN5
;						00110 = AN6
;						00111 = AN7
;						01000 = AN8
;						01001 = AN9
;						01010 = AN10
;						01011 = AN11
;						11101 = 温度インジケータ
;						11110 = DAC出力
;						11111 = FVRバッファ1出力
;		bit1	GO/DONE	A/D変換ステータスビット
;						1=変換開始指令（１にすると変換動作開始）
;						0=変換完了(変換完了すると０になる）
;		bit0	ADON	A/D変換ステータスビット
;						1=A/Dコンバータ動作
;						0=A/Dコンバータ停止
;
;		ADCON1レジスタ(BANK1　09EH)
;		bit7	ADFM	変換結果格納指定
;						1=右詰
;						0=左詰め
;		bit6-4	ADCS	A/D変換クロック選択ビット
;						000	= Fosc/2
;						001 = Fosc/8
;						010 = Fosc/32
;						011 = Frc
;						100 = Fosc/4
;						101 = Fosc/16
;						110 = Fosc/64
;						111 = Frc
;		bit3	Unimplemented(read=0)
;		bit2	ADNREF	参照負電圧指定
;						0 = VSS
;						1 = 外部VREF- (RA0)
;		bit1-0	ADPREF	参照正電圧指定
;						00 = VDD
;						01 = Reserved
;						10 = 外部VREF+ (RA1)
;						11 = 内部FVRモジュール
;
;
;		OPTION_REG(BANK1　095H)
;					_____
;			bit7=1	WPUEN	プルアップ グローバル設定ビット
;							0=有効,1=無効
;			bit6=0	INTEDG	INTピン割り込み信号エッジ↑
;							1=↑
;							0=↓
;			bit5=1	TMR0CS	TMR0クロックソース選択ビット
;							1=外部入力RA2/T0CKI
;							0=内部システムクロック(Fosc/4)
;			bit4=0	TMR0SE	TMR0ソースエッジ選択ビット
;							1=RA2/T0CKIピンが↑の時インクリメント
;							0=RA2/T0CKIピンが↓の時インクリメント
;			bit3=0	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←
;
;		CPSCON0(BANK0　01EH)
;			bit7=0	CPSON	CPSモジュール･イネーブルビット
;							1=有効
;							0=無効
;			bit6=0	CPSRM	静電容量式センシング参照電圧モードビット
;							1=CPSモジュールをHIレンジに設定
;							　　オシレータの参照電圧にDACとFVRを使用
;							0=CPSモジュールをLOWレンジに設定
;							　　オシレータ内蔵の参照電圧を使用
;			bit5-4	Unimplemented(read=0)
;			bit3-2	CPSRNG	静電容量式センシング電流レンジビット
;							CPSRM=0の場合
;							00=オシレータはOFF
;							01=オシレータをLOWレンジに設定、充放電電流は0.1uA
;							10=オシレータをMediumレンジに設定、充放電電流は1.2uA
;							11=オシレータをHighレンジに設定、充放電電流は18uA
;							CPSRM=1の場合
;							00=オシレータはON、ノイズ検出モード、充放電電流は供給されない
;							01=オシレータをLOWレンジに設定、充放電電流は9uA
;							10=オシレータをMediumレンジに設定、充放電電流は30uA
;							11=オシレータをHighレンジに設定、充放電電流は100uA
;			bit1=0	CPSOUT	静電容量式センシングオシレータ ステータスビット
;							1=オシレータが電流をソース（ピンから電流を出力）
;							0=オシレータが電流をシンク（ピンから電流を入力）
;			bit0=0	T0XCS	Timer0外部クロック源選択ビット
;							TMR0CS=1の場合
;							コア/Timer0モジュールのどの外部クロックからTimer0にクロックを
;							供給するかをTOXCSビットで制御する
;							1=Timer0のクロック源に静電容量式センシングオシレータを使う
;							0=Timer0のクロック源にT0CKIピンを使う
;							TMR0CS=0の場合
;							Timer0のクロック源にコア/Timer0モジュールで制御する
;							すなわち、Fosc/4
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		DFR0090モジュール用セグメントデータへの変換(TS520用)
;
;	注意			このルーチンのアドレス範囲の設定が必要
;				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'11100011'	;Code L def
			retlw	B'01100011'	;Code C adef
			retlw	B'10000011'	;Code U bcdef
			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'11100010'	;Code L def
			retlw	B'01100010'	;Code C adef
			retlw	B'10000010'	;Code U bcdef
			retlw	B'01100000'	;Code E adefg
			retlw	B'01110000'	;Code F aefg


	
init
;			各レジスタ初期設定

			;I/Oポート初期化
			movlb	0h			;BANK0
			clrf	PORTA		;Init PORT
			clrf	PORTB
			clrf	PORTC
			movlb	02h			;BANK2
			clrf	LATA		;出力ラッチﾚｼﾞｽﾀ
			clrf	LATB
			clrf	LATC
			movlb	03h			;BANK3
			clrf	ANSELA		;RA0-5,デジタルI/O
			clrf	ANSELB		;RB4-7,デジタルI/O
			clrf	ANSELC		;RC0-7,デジタルI/O
			movlb	01h			;BANK1
			movlw	03ch		;3CH=00111100B
			movwf	TRISA		;RA2-5入力、RA0-2出力
			movlw	08fh
			movwf	TRISB		;RB4-6出力、RB7入力
			movlw	0f8h		;C0,C1,C2出力
			movwf	TRISC		;C3-C7入力

			;TMR0およびプルアップ設定
			movlb	01h			;BANK1
			movlw	0a7H		;10100111B
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース外部
								;TMR0カウントエッジ↓
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/256にセット
			movlb	0h
			
;			メイン
;


coldst
			clrf	flg
			clrf	hex0
			clrf	hex1
			clrf	hex2
			clrf	hex3
			call	cll
			call	wait1s		;1秒ウエイト
;			goto	DEBUG01

mloop
			call	get_mode	;W=0の時運用モード
			iorlw	0h			;W=0以外の時各種モード
			btfss	STATUS,Z
			goto	mloop1

;
;			運用表示モードA（メインモード）
;
;		VFOは100msゲート取得データ
;		HETは100msゲート取得データ
;		CARは固定値データ(100msゲート同等値)
;
;		表示
;		周波数は7桁表示　xxM.xxxK.xx(最小単位10HZ)
;		変調モード表示に8桁目を使用（C.U.L.E)
;

			call	set_opa		;Aモード用動作設定
			call	sel_het		;アナログSWはHETに設定
			call	fcount		;HET周波数カウント
			call	psh_het		;カウントデータを保存

			call	sel_vfo		;アナログSWはVFO入力
			call	fcount		;VFO周波数カウント
			call	psh_vfo

			call	cor_op		;運用モード用データ補正・演算
			call	BCD
			call	setbuf		;表示用データ準備
			call	setmod		;変調モード表示追加
			call	PUTL		;LEDモジュールに送信
			goto	mloop

;			各種モード分岐（サブモード）
;		分岐方法
;			W=1		VFOモード
;			W=2 	HETモード
;			W=4 	CARモード
;			W=8		OPBモード
;			W=16	OPCモード
;		VFO/HET/CARモード
;		ゲートタイムは1秒、分解能は1HZ
;		周波数表示は8桁すべて使用
;		補正処理は行わない、実測値表示
;		OPB/OPCモードは、それぞれを参照
;

mloop1
			movwf	tmp0
			btfss	tmp0,0
			goto	mloop2
;			VFO周波数表示モード
			call	set_vfo
			call	fcount
			call	BCD
			call	setbuf
			call	PUTL
			goto	mloop
mloop2
			btfss	tmp0,1
			goto	mloop3
;			HET周波数表示モード
			call	set_het
			call	fcount
			call	BCD
			call	setbuf
			call	PUTL
			goto	mloop
mloop3
			btfss	tmp0,2
			goto	mloop4
;			CAR周波数表示モード
			call	set_car
			call	fcount
			call	BCD
			call	setbuf
			call	PUTL
			goto	mloop
mloop4
			btfss	tmp0,3
			goto	mloop5
;
;			運用表示モードB
;
;		VFOは100msゲート取得データ
;		HET/CARは固定値データ(100msゲート同等値)
;
;		表示
;		周波数は7桁表示　xxM.xxxK.xx(最小単位10HZ)
;		変調モード表示に8桁目を使用（C.U.L.E)

			call	set_opb		;Bモード用動作設定
			call	sel_vfo		;アナログSWはVFO入力
			call	fcount		;VFO周波数カウント
			call	psh_vfo

			call	cor_op		;運用モード用データ補正・演算
			call	BCD
			call	setbuf		;表示用データ準備
			call	setmod		;変調モード表示追加
			call	PUTL		;LEDモジュールに送信
			goto	mloop


mloop5
			btfss	tmp0,4
			goto	mloop6
;
;			運用表示モードC
;		VFO/HET/CARはは100msゲート取得データ
;
;		表示
;		周波数は7桁表示　xxM.xxxK.xx(最小単位10HZ)
;		変調モード表示に8桁目を使用（C.U.L.E)
;

			call	set_opc		;運用モードC用動作設定
			call	sel_het		;アナログSWはHETに設定
			call	fcount		;HET周波数カウント
			call	psh_het		;カウントデータを保存

			call	sel_vfo		;アナログSWはVFO入力
			call	fcount		;VFO周波数カウント
			call	psh_vfo

			call	sel_car		;アナログSWはVFO入力
			call	fcount		;VFO周波数カウント
			call	psh_car

			call	cor_op		;運用モード用データ補正・演算
			call	BCD
			call	setbuf		;表示用データ準備
			call	setmod		;変調モード表示追加
			call	PUTL		;LEDモジュールに送信
			goto	mloop
mloop6
;			現在の所、この設定は無い
			goto	mloop

;
;	STEP1 LEDモジュールのテスト、制御ルーチンデバッグ用
;

DEBUG01		;
			call	dbg011		;hex0-3データ生成
			call	BCD
			call	setbuf
			call	PUTL
			goto	DEBUG01

dbg011		movlw	04fh		;flg=01001111B
			movwf	flg			;8桁、ゼロブランキングON
			movf	hex0,W		;4,7桁ドット有
			xorlw	0ffh
			btfsc	STATUS,Z
			bsf		flg,7
			movf	hex0,W
			xorlw	010h
			btfsc	STATUS,Z
			bcf		flg,7

			incf	hex0,F
			btfss	STATUS,Z	;桁上がりか？
			return
			
			incf	hex1,F
			btfss	STATUS,Z
			return
			
			incf	hex2,F
			btfss	STATUS,Z
			return
			
			incf	hex3,F
			btfss	STATUS,Z
			return
			clrf	hex0
			clrf	hex1
			clrf	hex2
			clrf	hex3
			return

;
;	STEP2 プリスケーラ残ビット取得ルーチンのデバッグ
;
;	SPゲートのNAND2の機能テスト、プリスケーラ残ビット取得ルーチンのデバッグ用

DEBUG02		;
			call	set_het
			call	CNT_SIM
			call	readps
			call	BCD
			call	setbuf
			call	PUTL
			call	wait1s
			goto	DEBUG02

;
;	STEP3 カウント基本部分のデバッグ
;
;	RFゲートのNAND1およびSPゲートのNAND2の機能テスト
;	入力はCARポート、プリスケーラOFF、1秒ゲートでカウント
;	プリスケーラを使用しないでの、TMR0カウントルーチンのデバッグ
;	2MHZ程度までカウント可能


DEBUG03		;
			;TMR0再設定
			movlb	01h			;BANK1
			movlw	0a8H		;10101000B
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース外部
								;TMR0カウントエッジ↓
								;プリスケーラ割当→WDT
								;プリスケーラ分周1/2にセット
			movlb	0h
;			SPゲートはオープン			各ゲートは2入力NAND
			bcf		PORTA,0		;RF_GATE=0、NAND1=1
			nop
			bsf		PORTA,1		;SP_GATE=1,NAND2=0
			call	set_car
;			カウンタ初期設定
			clrf	hex0		;データエリアリセット
			clrf	hex1
			clrf	hex2
			clrf	hex3
			bcf		flg,7		;OverFlowフラグをクリア
;			clrf	TMR0		;タイマー０カウンタ及びプリスケーラリセット
			bcf		INTCON,T0IF	;T0IFフラグをリセット
			bcf		STATUS,C	;キャリーフラグをリセット
;
			bsf		PORTA,0		;RF_GATEオープン
			clrf	TMR0		;タイマー０カウンタ及びプリスケーラリセット
			call	count100m	;319998cycle-01
			nop
			nop
			call	count100m	;319998cycle-02
			nop
			nop
			call	count100m	;319998cycle-03
			nop
			nop
			call	count100m	;319998cycle-04
			nop
			nop
			call	count100m	;319998cycle-05
			nop
			nop
			call	count100m	;319998cycle-06
			nop
			nop
			call	count100m	;319998cycle-07
			nop
			nop
			call	count100m	;319998cycle-08
			nop
			nop
			nop
			call	count100m	;319998cycle-09
			nop
			call	count100m	;319998cycle-10
			bcf		PORTA,0		;RF_GATEクローズ

			movf	TMR0,W		;カウントデータ整理
			movwf	hex0
			movf	hex2,W
			movwf	hex1
			movf	hex3,W
			movwf	hex2
			clrf	hex3

			call	BCD
			call	setbuf
			call	PUTL
			goto	DEBUG03

;			カウントルーチンのシミュレーションA
;			RFゲートはOFF、SPゲートより32パルスを入力
;			これにより、プリスケーラ残ビット取得ルーチンのデバッグとなる。
CNT_SIM		
;			ゲートOFF				各ゲートは2入力NAND
			bcf		PORTA,0		;RF_GATE=0、NAND1=1
			nop
			bcf		PORTA,1		;SP_GATE=0,NAND2=1
;			カウンタ初期設定
			clrf	hex0		;データエリアリセット
			clrf	hex1
			clrf	hex2
			clrf	hex3
			movlw	020h
			movwf	tmp0
			bcf		flg,7		;OverFlowフラグをクリア
			clrf	TMR0		;タイマー０カウンタ及びプリスケーラリセット
			bcf		INTCON,T0IF	;T0IFフラグをリセット
			bcf		STATUS,C	;キャリーフラグをリセット
;
			bsf		PORTA,1		;SP_GATEオープン
			clrf	TMR0		;タイマー０カウンタ及びプリスケーラリセット

csim01
			nop
			bcf		PORTA,1		;NAND2=0→1
			nop
			bsf		PORTA,1		;NAND2=1→0、ここでで1カウントされる
			nop
			decfsz	tmp0,F
			goto	csim01
			bcf		PORTA,1		;SPゲートOFF、NAND2=1
			return

;
;	STEP4 一連のカウンタルーチン　デバッグ用
;


DEBUG04		;
			call	set_het
			call	fcount
			call	BCD
			call	setbuf
			call	PUTL
			goto	DEBUG04


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			動作モードセット(100ms+プリスケーラON、1s+プリスケーラON）
;
;		プリスケーラ		1/256固定
;		ゲートタイムSW	RA3=0 運用Bモード、RA3=1　運用Aモード(標準）
;		モード設定SW	RB7=0　(予備)シリアル通信RX
;					RC7=0 （予備）シリアル通信DATA
;					RC6=0 CAR周波数カウンタモード、
;					RC3=0 VFO周波数カウンタモード、
;					RC4=0 HET周波数カウンタモード、
;					RC5=0 運用周波数表示モード、
;
;		使用ゼネラルワーク
;			現在取得バイナリデータ（３２ビット）
;				hex0
;				hex1
;				hex2
;				hex3
;			保存HETバイナリデータ(32ビット)
;				hex0h
;				hex1h
;				hex2h
;				hex3h
;			保存VFOバイナリデータ(32ビット)
;				hex0v
;				hex1v
;				hex2v
;				hex3v
;			保存CARバイナリデータ(32ビット)
;				hex0c
;				hex1c
;				hex2c
;				hex3c
;			外部入力バイナリデータ(32ビット)
;				rhex0
;				rhex1
;				rhex2
;				rhex3
;			hex(x)を十進化したデータ
;				1，2桁目			digit12
;				3，4桁目			digit34
;				5，6桁目			digit56
;				7，8桁目			digit78
;				9，10桁目			digit9A
;
;			現在動作モードフラグ
;				表示モード			MODE=0,0 運用周波数表示指定
;								MODE=0,1 個別周波数表示指定
;				CW表示指定		MODE=1,1　8桁目に'C'表示
;				LSB表示指定		MODE=2,1　8桁目に'L'表示
;				USB表示指定		MODE=3,1　8桁目に'U'表示
;				入力エラー表示指定	MODE=4,1　8桁目に'E'表示
;				CAR固定値使用		MODE=5,0　10msゲート使用
;				CAR実測値使用		MODE=5,1 100msゲート使用
;				HET固定値使用		MODE=6,0　10msゲート使用
;				HET実測値使用		MODE=6,1 100msゲート使用
;				ゲートタイム			MODE=7,0 0.1秒
;				ゲートタイム			MODE=7,1 1秒
;
;			8桁７セグLEDディスプレイ用指令フラグ
;				2桁表示指令		flg=xxxxx001
;				4桁表示指令		flg=xxxxx011
;				6桁表示指令		flg=xxxxx101
;				8桁表示指令		flg=xxxxx111
;				ゼロブランキング		flg=xxxx0xxx　しない
;								flg=xxxx1xxx　する
;				ドット表示指令		flg=x000xxxx　表示なし
;									bit4=1	2,5桁点燈
;									bit5=1	3,6桁点燈
;									bit6=1	4,7桁点燈
;				オーバーフロー		flg=1xxxxxxx
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;
;		各種スイッチのチェック
;
;		戻り値		Wreg=0H　　OPA選択
;				Wreg=1H 　VFO選択
;				Wreg=2H 　HET選択
;				Wreg=4H 　CAR選択
;				Wreg=8H　　OPB選択
;				Wreg=10H　OPC選択
;				Wreg=E0H　エラー

get_mode
			clrf	flg
			clrf	MODE
;			bsf		PORTA,4		;LED_OFF
			btfss	PORTC,5		;OPA_ONの時RC5=0
			retlw	0h			;OPA運用モード

			btfss	PORTC,3		;VFO_ONの時RC3=0
			retlw	01h			;VFO単独モード

			btfss	PORTC,4		;HET_ONの時RC4=0
			retlw	02h			;モード

			btfss	PORTC,6		;CAR_ONの時RC6=0
			retlw	04h

			btfss	PORTC,7		;OPB_ONの時RC7=0
			retlw	08h

			btfss	PORTB,7		;OPC_ONの時RB7=0
			retlw	010h
			retlw	0e0h		;エラー

;
;		運用モードA/B/C設定
;
set_opa
			movlw	040h		;01000000B
			movwf	MODE
								;運用周波数モード
								;CARは固定値
								;HETは実測値
								;ゲートタイム100ms		
			movlw	02fh		;0001111b
        	movwf	flg			;8桁表示、3,6桁ドット表示指定
								;ゼロブランキングする
			return
set_opb		;Bモード設定
			movlw	0h			;01000000B
			movwf	MODE
								;運用周波数モード
								;CARは固定値
								;HETは固定値
								;ゲートタイム100ms		
			movlw	02fh		;0001111b
        	movwf	flg			;8桁表示、3,6桁ドット表示指定
								;ゼロブランキングする
			return
set_opc		;Cモード設定
			movlw	060h		;01100000B
			movwf	MODE
								;運用周波数モード
								;CARは実測値
								;HETは実測値
								;ゲートタイム100ms		
			movlw	02fh		;0001111b
        	movwf	flg			;8桁表示、3,6桁ドット表示指定
								;ゼロブランキングする
			return



;
;		単独モード用設定
;		これらモードの場合、カウントデータはhex0-3を使用する
;
set_het		;HET表示モード
			movlw	081h		;10000001B
								;個別周波数表示指定
								;CW,LSB,USB表示無
								;ゲートタイム1秒
			movwf	MODE
			movlw	04fh		;01001111b
        	movwf	flg			;8桁表示、4,7桁ドット表示指定
								;ゼロブランキングする
			call	sel_het		;入力アナログSWはHET
			return

set_vfo		;VFO表示モード
			movlw	081h		;10000001B
								;個別周波数表示指定
								;CW,LSB,USB表示無
								;ゲートタイム1秒
			movwf	MODE
			movlw	04fh		;01001111b
        	movwf	flg			;8桁表示、4,7桁ドット表示指定
								;ゼロブランキングする
			call	sel_vfo		;入力アナログSWはVFO
			return

set_car		;CAR表示モード
			movlw	081h		;10000001B
								;個別周波数表示指定
								;CW,LSB,USB表示無
								;ゲートタイム1秒
			movwf	MODE
			movlw	04fh		;01001111b
        	movwf	flg			;8桁表示、4,7桁ドット表示指定
								;ゼロブランキングする
			call	sel_car		;入力アナログSWはCAR
			return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			RFアナログスイッチ入力選択サブルーチン
;
;		RC0		CAR入力
;		RC1		VFO入力
;		RC2		HET入力
;
;		入力RFポート選択アナログスイッチ制御
;		HET入力ポート	RC0=0、RC1=0、RC2=1
;		VFO入力ポート	RC0=0、RC1=1、RC2=0
;		CAR入力ポート	RC0=1、RC1=0、RC2=0
;					注意：上記以外の組合せでの使用不可
;						事前にポート設定しておくこと
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

sel_het		;HET選択
			movlb	02h
			bcf		LATC,0
			bcf		LATC,1
			bsf		LATC,2
			movlb	0h
			return

sel_vfo		;VFO選択
			movlb	02h
			bcf		LATC,0
			bcf		LATC,2
			bsf		LATC,1
			movlb	0h
			return

sel_car		;CAR選択
			movlb	02h
			bcf		LATC,1
			bcf		LATC,2
			bsf		LATC,0
			movlb	0h
			return

;
;		周波数別源データ(hex0-3)退避および復活
;
psh_het
			movf	hex0,W
			movwf	hex0h
			movf	hex1,W
			movwf	hex1h
			movf	hex2,W
			movwf	hex2h
			movf	hex3,W
			movwf	hex3h
			return

psh_vfo	;
			movf	hex0,W
			movwf	hex0v
			movf	hex1,W
			movwf	hex1v
			movf	hex2,W
			movwf	hex2v
			movf	hex3,W
			movwf	hex3v
			return

psh_car	;
			movf	hex0,W
			movwf	hex0c
			movf	hex1,W
			movwf	hex1c
			movf	hex2,W
			movwf	hex2c
			movf	hex3,W
			movwf	hex3c
			return

pop_het	;
			movf	hex0h,W
			movwf	hex0
			movf	hex1h,W
			movwf	hex1
			movf	hex2h,W
			movwf	hex2
			movf	hex3h,W
			movwf	hex3
			return

pop_vfo	;
			movf	hex0v,W
			movwf	hex0
			movf	hex1v,W
			movwf	hex1
			movf	hex2v,W
			movwf	hex2
			movf	hex3v,W
			movwf	hex3
			return

pop_car	;
			movf	hex0c,W
			movwf	hex0
			movf	hex1c,W
			movwf	hex1
			movf	hex2c,W
			movwf	hex2
			movf	hex3c,W
			movwf	hex3
			return

popw_het	;
			movf	hex0h,W
			movwf	hexw0
			movf	hex1h,W
			movwf	hexw1
			movf	hex2h,W
			movwf	hexw2
			movf	hex3h,W
			movwf	hexw3
			return

popw_vfo	;
			movf	hex0v,W
			movwf	hexw0
			movf	hex1v,W
			movwf	hexw1
			movf	hex2v,W
			movwf	hexw2
			movf	hex3v,W
			movwf	hexw3
			return

popw_car	;
			movf	hex0c,W
			movwf	hexw0
			movf	hex1c,W
			movwf	hexw1
			movf	hex2c,W
			movwf	hexw2
			movf	hex3c,W
			movwf	hexw3
			return



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;			入力パルス　カウントサブルーチン(12.8MHZ専用)
;
;		入力RFポート選択アナログスイッチ制御
;		HET入力ポート	RC0=1、RC1=0、RC2=0
;		VFO入力ポート	RC0=0、RC1=1、RC2=0
;		CAR入力ポート	RC0=0、RC1=0、RC2=1
;					注意：上記以外の組合せでの使用不可
;						事前にポート設定しておくこと
;
;		RF入力ゲート制御（2入力NAND1）、RA0で制御
;		RFゲート		RA0=0,NAND1=1(ゲート1クローズ)
;					RA0=1,NAND1=x(ゲート1オープン)
;
;		サイドパルス注入ゲート制御（2入力NAND2）、RA1で制御
;		SPゲート		RA1=0,NAND2=1(ゲート2クローズ)
;					RA1=1,NAND2=x(ゲート2オープン)
;
;		パルスカウントポート	RA2/T0CKI
;		カウントタイミング	↓（立ち下がり）
;		ゲート解放時間	1s、100ms
;		出力データ		hex0
;					hex1
;					hex2
;					hex3
;					禁忌：RA2への出力設定不可
;
;		使用ワーク		;
;
;		参考
;		1Cycle	=	0.3125us
;		100ms	=	320000cycles（32万サイクル）
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fcount
;			カウント準備

;			SPゲートのみオープン		各ゲートは2入力NAND
			bcf		PORTA,0		;RF_GATE=0、NAND1=1
			bsf		PORTA,1		;SP_GATE=1,NAND2=0
;			カウンタ初期設定
			clrf	hex0		;データエリアリセット
			clrf	hex1
			clrf	hex2
			clrf	hex3
			bcf		flg,7		;OverFlowフラグをクリア
			bcf		INTCON,T0IF	;T0IFフラグをリセット
			bcf		STATUS,C	;キャリーフラグをリセット
			btfsc	MODE,7		;ゲートタイムをチェック 
			goto	gate1s		;(MODE,7)=1 then 1s
;
;			0.1秒ゲートでカウント開始
;
;			ゲートタイム100ms=320000cycles
;

gate100m
;			bcf		PORTA,4		;ゲートオープンLED ON
			bsf		PORTA,0		;RF_GATEオープン
			clrf	TMR0		;タイマー０カウンタ及びプリスケーラリセット
			call	count100m	;319998cycles
			bcf		PORTA,0		;RF_GATEクローズ
;			bsf		PORTA,4		;LED OFF
			call	postcnt		;
			call	readps		;プリスケーラ残ビット読み出し
			return

;
;			ゲートタイム1sec=3200000cycles
;
gate1s
			nop
			bsf		PORTA,0		;RF_GATEオープン
			clrf	TMR0		;タイマー０カウンタ及びプリスケーラリセット
			call	count100m	;319998cycle-01
			nop
			call	count100m	;319998cycle-02
			nop
			nop
			call	count100m	;319998cycle-03
			nop
			nop
			call	count100m	;319998cycle-04
			nop
			nop
			call	count100m	;319998cycle-05
			nop
			nop
			call	count100m	;319998cycle-06
			nop
			nop
			call	count100m	;319998cycle-07
			nop
			nop
			call	count100m	;319998cycle-08
			nop
			nop
			call	count100m	;319998cycle-09
			nop
			nop
			call	count100m	;319998cycle-10
			bcf		PORTA,0		;RF_GATEクローズ
;			bsf		PORTA,4		;LED OFF
			call	postcnt
			call	readps		;プリスケーラ読み出し
			return



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		タイマー０への入力パルス　カウントループ
;
;		ゲートオン、オフの時間も考慮し、100ms間の入力パルスカウントとなる様に設定する事
;		Fosc=12.8MHZ only	319998cycles(call&return命令含む)
;
;		入力		無し
;
;		出力		hex0	最下位8ビット（プリスケーラ残ビット）
;				hex1	下位8ビット(TMR0)
;				hex2	中位8ビット
;				hex3	上位8ビット
;
;	INTCONレジスタ
;		bit7	GIE		全割込制御
;						1許可、0禁止
;		bit6	PEIE	周辺割込制御
;						1許可、0禁止
;		bit5	TMR0IE	タイマ0割込許可制御
;						1許可、0禁止
;		bit4	INTE	RA2外部割込許可制御
;						1許可、0禁止
;		bit3	IOCIE	状態変化割込許可制御
;						1許可、0禁止	
;		bit2	TMR0IF	タイマ0割込みフラグ(#1)
;						1オーバーフロー、0オーバーフローなし
;		bit1	INTF	RA2外部割込みフラグ(#1)
;						1割込み発生、0割込み発生なし
;		bit0	IOCIF	状態変化割込フラグ(#1)
;						1割込発生、0割込無
;
;		#1)ソフトウエアでリセット必要
;
;		使用ワーク		tcnt1	外周カウンタ　
;					tcnt2	内周カウンタ　
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



count100m						;100ms=100000us=320000cycles
			movlw	060h		;外周カウンタ96
			movwf	tcnt1

cnt101m		clrf	tcnt2		;内周カウンタ=256
;
;	タイマ0のオーバーフローした時の桁上げカウント処理
;	下位(HEX1)8ビットはゲートクローズ後、TMR0から読み込みすること
;	50MHZ→20ns、256回カウントで5.12us
;	1cycls=0.3125us=312.5ns
;	最初のT0IFフラグが立つのは16サイクル程度（50MHZ)

cnt102m
			btfss	INTCON,T0IF	;タイマ0オーバーフラグチェック
			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	hex2,F		;hex2=hex2+W_REG(=1or0)
			rlf		hex2,W		;キャリービットがWの0ビット目に入る
			andlw	01h			;キャリー以外をマスク
			addwf	hex3,F		;hex3=hex3+Carry(Wreg)
								;cnt102mからここまで11cycles
;			内周ループカウンタ　13cycles/loop
			decfsz	tcnt2,F		;内周ループ終了か？
			goto	cnt102m		;
			nop					;13*256=3328c/s
								;内周ループアウト時、3329c/s
;			外周ループカウンタ　13*xxcycles/loop
cnt103m		decfsz	tcnt1,F		;(1+13*tcnt2+3)*tcnt1-1+2
			goto	cnt101m		;(3332)*96+2-1=319873cycles
								;あと127c/s

			movlw	09h			;
			movwf	tcnt2
cnt104m
			btfss	INTCON,T0IF	;タイマ0オーバーフラグチェック
			goto	if_off2		;T0IF=0 then 
			bcf		INTCON,T0IF	;T0IFフラグをリセット
			movlw	01h			;add,sub命令でなければキャリー使えない
			goto	if_on2		;T0IF=1なので繰上げ処理へ
if_off2		nop					;時間差調整
			nop					;　〃
			movlw	0h			;
if_on2		addwf	hex2,F		;hex2=hex2+W_REG(=1or0)
			rlf		hex2,W		;キャリービットがWの0ビット目に入る
			andlw	01h			;キャリー以外をマスク
			addwf	hex3,F		;hex3=hex3+Carry(Wreg)
								;cnt104mからここまで11cycles
;			内周ループカウンタ　13cycles/loop
			decfsz	tcnt2,F		;内周ループ終了か？
			goto	cnt104m		;
			nop					;13*9=117c/s
								;内周ループアウト時、119c/s
			nop					;
			nop					;時間調整2c/s
								;CALLとRETURNで4cycles
			return				;合計319998cycles
								;

;
;		ゲートタイム10ms（Fosc=12.8MHZ)
;
;		これは固定値データを選択するための短時間カウンタ
;		呼び出しは単独で使用し、MODEによる制御はしない
;		事前にRFアナログスイッチでの選択を終了しておく事
;
;		出力
;		hex(0-3)に収納される
;
;		50MHZ→20ns、256回カウントで5.12us
;		1cycls=0.3125us=312.5ns
;		最初のT0IFフラグが立つのは16サイクル程度（50MHZ)
;		13cycles=312.5×13=4062.5ns
;		よって63MHZ程度がカウントループの限界点と思われる
;		10ms=10000us=32000cycles
count10m
;			SPゲートのみオープン		各ゲートは2入力NAND
			bcf		PORTA,0		;RF_GATE=0、NAND1=1
			bsf		PORTA,1		;SP_GATE=1,NAND2=0
;			カウンタ初期設定
			clrf	hex0		;データエリアリセット
			clrf	hex1		;時間調整も兼ねます
			clrf	hex2
			clrf	hex3
			bcf		flg,7		;OverFlowフラグをクリア
			bcf		INTCON,T0IF	;T0IFフラグをリセット
			bcf		STATUS,C	;キャリーフラグをリセット
;			bcf		PORTA,4		;ゲートオープンLED ON
			bsf		PORTA,0		;RF_GATEオープン
			clrf	TMR0		;タイマー０カウンタ及びプリスケーラリセット

;			カウント開始
			movlw	0d8h		;外周カウンタ216
			movwf	tcnt1
			nop
cnt11m
			movlw	0bh
			movwf	tcnt2		;内周カウンタ=11
cnt12m
			btfss	INTCON,T0IF	;タイマ0オーバーフラグチェック
			goto	if_off3		;T0IF=0 then 
			bcf		INTCON,T0IF	;T0IFフラグをリセット
			movlw	01h			;add,sub命令でなければキャリー使えない
			goto	if_on3		;T0IF=1なので繰上げ処理へ
if_off3		nop					;時間差調整
			nop					;　〃
			movlw	0h			;
if_on3		addwf	hex2,F		;hex2=hex2+W_REG(=1or0)
			rlf		hex2,W		;キャリービットがWの0ビット目に入る
			andlw	01h			;キャリー以外をマスク
			addwf	hex3,F		;hex3=hex3+Carry(Wreg)
								;cnt102mからここまで11cycles
;			内周ループカウンタ　13cycles/loop
			decfsz	tcnt2,F		;内周ループ終了か？
			goto	cnt12m		;
			nop					;13*11=143c/s
								;内周ループアウト時、145c/s
;			外周ループカウンタ　13*xxcycles/loop
cnt13m		decfsz	tcnt1,F		;(2+13*tcnt2+3)*tcnt1-1+3
			goto	cnt11m		;(148)*216+2=31970cycles
			nop					;あと30c/s
			nop					;あと28c/s
cnt14m		;調整ゲートタイム
			movlw	02h
			movwf	tcnt2		;カウンタ=2
cnt15m
			btfss	INTCON,T0IF	;タイマ0オーバーフラグチェック
			goto	if_off4		;T0IF=0 then 
			bcf		INTCON,T0IF	;T0IFフラグをリセット
			movlw	01h			;add,sub命令でなければキャリー使えない
			goto	if_on4		;T0IF=1なので繰上げ処理へ
if_off4		nop					;時間差調整
			nop					;　〃
			movlw	0h			;
if_on4		addwf	hex2,F		;hex2=hex2+W_REG(=1or0)
			rlf		hex2,W		;キャリービットがWの0ビット目に入る
			andlw	01h			;キャリー以外をマスク
			addwf	hex3,F		;hex3=hex3+Carry(Wreg)
;			ループカウンタ　13cycles/loop
			decfsz	tcnt2,F		;ループ終了か？
			goto	cnt15m		;
			nop					;13*2=26c/s
								;ループアウト時、28c/s

cnt16m		bcf		PORTA,0		;RF_GATEクローズ
								;合計32000cycles
;			bsf		PORTA,4		;LED OFF
			call	postcnt		;TME0をhex1に保存
			call	readps		;プリスケーラ残ビット読み出し
			return				;
								;


;
;
;		取りこぼしビットチェック
;
;		最後のT0IFフラグチェック後からゲートクローズのまでの時間に
;		フラグが変化したかをチェックし、必要なら補正処理
;
;		呼出条件
;		ゲートクローズ直後
;
;		多分不要かも・・・
;
postcnt
			movf	TMR0,W		;下桁を保存
			movwf	hex1

			btfss	INTCON,T0IF	;タイマ0オーバーフラグチェック
			return				;T0IF=0なので終了 
			;T0IF=1なので繰上げ処理
			bcf		INTCON,T0IF	;T0IFフラグをリセット
			movlw	01h			;add,sub命令でなければキャリー使えない
			addwf	hex2,F		;hex2=hex2+W_REG(=1or0)
			rlf		hex2,W		;キャリービットがWの0ビット目に入る
			andlw	01h			;キャリー以外をマスク
			addwf	hex3,F		;hex3=hex3+Carry(Wreg)
			return				;補正終了
			

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		プリスケーラ残ビット読み出し
;
;		T0CKI(RA2)にパルスを１回ずつ注入し、
;		TMR0の値がインクリメントされるまで繰り返す
;
;		実行条件	RF_GATE(RA0)がクローズされている事
;				NAND1=1
;				SP_GATE(RA1)はオープンのままである事
;				以上の条件により、NAND2=0となっている
;				RA2(TMR0)が入力設定のまま
;				T0CKIは↓でカウントされる
;
;		出力		hex0
;				TMR0の内容は+1される
;
;		使用ワーク	pscnt
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

readps
			clrf	pscnt		;プリスケーラ残カウント数ワーク
rdps1		;パルス注入、カウントアップループ
			nop
			bcf		PORTA,1		;NAND2=0→1
			nop
			bsf		PORTA,1		;NAND2=1→0、ここでで1カウントされる
			nop
			decf	pscnt,F
			movf	hex1,W		;記録されたTMR0値
			subwf	TMR0,W		;W=新TMR0-旧TMR0
			btfsc	STATUS,Z
			goto	rdps1		;新TMR0-旧TMR0=0なので繰り返し
			;TMR0が1つカウントアップした、＝プリスケーラが満タンになった
			movf	pscnt,W
			movwf	hex0		;プリスケーラ残カウント数をhex0に保存
			bcf		PORTA,1		;SPゲートOFF、NAND2=1
			return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			計測値の補正演算処理
;
;			hex0-hex3の32ビットに対して演算
;
;			現在動作モードフラグ
;				表示モード			MODE=0,0 運用周波数表示指定
;								MODE=0,1 個別周波数表示指定
;				CW表示指定		MODE=1,1
;				LSB表示指定		MODE=2,1
;				USB表示指定		MODE=3,1
;				入力エラー表示指定	MODE=4,1　8桁目に'E'表示
;				CAR固定値使用		MODE=5,0　10msゲート使用
;				CAR実測値使用		MODE=5,1 100msゲート使用
;				HET固定値使用		MODE=6,0　10msゲート使用
;				HET実測値使用		MODE=6,1 100msゲート使用
;				ゲートタイム			MODE=7,0 0.1秒
;				ゲートタイム			MODE=7,1 1秒
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;			運用モード用データ補正
;
;		演算はすべて100msカウントモードのデータを前提
;
;		事前にhex(0-3)xにデータを格納しておく事
;		出力	hex(0-3)に演算データが格納される
;		それは運用周波数で100msカウントデータと同等品です
;
;		MODE制御
;		MODE=5,0でCARは固定値（標準）
;		MODE=5,1でCARは取得値
;		MODE=6,0でHETは固定値
;		MODE=6,1でHETは取得値(標準)
;		固定値設定の場合、hex(0-3)xの値は使用せず、ここで設定
cor_op
;			HET選択
			btfss	MODE,6
			goto	cop0		;固定値で演算
			call	TSBAND		;取得値で演算
			goto	cop1
;			HET固定値
cop0		call	sel_het		;アナログSWはHETに設定
			call	count10m	;HET周波数カウント
			call	x10			;100msに桁合わせ
			call	psh_het		;カウントデータを保存
			call	TSBAND		;hex(0-3)=固定値
			call	psh_het		;固定値データを設定
;			CAR選択
cop1		call	car_mod		;変調モードチェック
			btfsc	MODE,5
			goto	cop2		;取得値で演算
			movlw	02ch		;3395KHz=52E2CH
			movwf	hex0		;
			movlw	02eh
			movwf	hex1
			movlw	005h
			movwf	hex2
			clrf	hex3
			call	psh_car
			goto	cop3
;			HET-VFO-CAR演算処理
cop2		call	cor_car		;CARー取得値補正
cop3		call	pop_het		;hex（0-3)=hex(0h-3h)
			call	popw_vfo	;hexw(0-3)=hex(0v-3v)
			call	sub32b		;hex(0-3)=HET-VFO
			call	popw_car	;hexw（0-3)=hex(0c-3c)
			call	sub32b		;hex(0-3)=HET-VFO-CAR
			return

;
;		CAR実測値用データ修正
;
;		入力データはF/10HZ（100msゲート用)となっている
;		LSB	339350HZ=52D96H
;		CWR	339440HZ=52DF0H（CWRとCWTは分別しない）
;		CWT	339500HZ=52E2CH
;		USB	339650HZ=52EC2H
;
;		出力
;		LSB	CAR=CAR+150(96H)
;		CWR	CAR=CAR+70(46H)
;		CWT	CAR=CAR
;		USB	CAR=CAR-150(96H)

cor_car
			call	pop_car		;hex(0-3)=CAR
			movlw	064h		;hexw(0-3)=339300
			movwf	hexw0		;339300=52D64H
			movlw	02dh
			movwf	hexw1
			movlw	05h
			movwf	hexw2
			clrf	hexw3
			call	sub32b		;hex(0-3)=CAR-339300
								;LSBの時hex(0-3)=50
								;CWRの時hex(0-3)=140
								;CWTの時hex(0-3)=200
								;USBの時hex(0-3)=350
								;いずれも hex(2-3)=0
			iorlw	0h			;W=0で減算成功
			btfss	STATUS,Z
			goto	ccer		;W=1ならボロー発生、エラー

;			LSBチェック
			movlw	064h		;hexw(0-1)=100=64H
			movwf	hexw0		;339400以下はLSBと判定
			movlw	0h
			movwf	hexw1
			call	sub16b		;hex(0-1)=hex(0-1)-100
			iorlw	0h			;W=0で減算成功
			btfsc	STATUS,Z
			goto	cc01		;W=0でCWRチェックへ
;			LSB補正
			movlw	096h		;CAR=CAR+150(96H)
			movwf	hexw0
			clrf	hexw1
			clrf	hexw2
			clrf	hexw3
			call	pop_car
			call	add32b
			call	psh_car
			retlw	0h

;			CWRチェック				ここまでhex=hex-100
cc01		movlw	046h		;hexw(0-1)=70=46H
			movwf	hexw0		;339401-339470はCWRと判定
			movlw	0h
			movwf	hexw1
			call	sub16b		;hex(0-1)=hex(0-1)-70
			iorlw	0h
			btfsc	STATUS,Z
			goto	cc02		;W=0でCWTチェックへ
;			CWR補正
			movlw	046h		;CAR=CAR+70(46H)
			movwf	hexw0
			clrf	hexw1
			clrf	hexw2
			clrf	hexw3
			call	pop_car
			call	add32b
			call	psh_car
			retlw	0h

;			CWTチェック				ここまでhex=hex-170
cc02		movlw	082h		;hexw(0-1)=130=82H
			movwf	hexw0		;339471-339600はCWTと判定
			movlw	0h
			movwf	hexw1
			call	sub16b		;hex(0-1)=hex(0-1)-130
			iorlw	0h
			btfsc	STATUS,Z
			goto	cc03		;W=0でUSBチェックへ
;			CWR補正
			retlw	0h

;			USBチェック				ここまでhex=hex-300
cc03		movlw	064h		;hexw(0-1)=100=64H
			movwf	hexw0		;339601-339800はUSBと判定
			movlw	0h
			movwf	hexw1
			call	sub16b		;hex(0-1)=hex(0-1)-100
			iorlw	0h
			btfsc	STATUS,Z
			goto	ccer
;			USB補正
			movlw	096h		;CAR=CAR-150(96H)
			movwf	hexw0
			clrf	hexw1
			clrf	hexw2
			clrf	hexw3
			call	pop_car
			call	sub32b
			call	psh_car
			retlw	0h
ccer
			retlw	01h			;判定不能、エラーリターン

;
;		TS520変調モード判定ルーチン
;
;		CAR判定
;		判定条件	CAR周波数は±50HZ以内に調整の事
;				本基板のクロックも12.8MHZ±10HZ以内に調整の事
;				事前にhex0c-hex3cに32ビットデータを入力の事
;				データは100msゲートタイムそのままを使用
;		出力
;			hex(0-3)は破壊される
;			3395.0KHZ	CW･TUNEモード、送信モード
;						CW･受信モード
;			3396.5KHZ	USBモード
;			3393.5KHZ	LSBモード
;
;		入力データはF/10HZとなっている
;		LSB	339350HZ=52D96H
;		CWR	339440HZ=52DF0H（CWRとCWTは分別しない）
;		CWT	339500HZ=52E2CH
;		USB	339650HZ=52EC2H
;

car_mod
			btfsc	MODE,5		;MODE,5=0で固定値
			goto	cm1			;取得値で処理
;			固定値なので、CAR暫定取得
			call	sel_car
			call	count10m
			call	x10			;hex(0-3)=CAR
			goto	cm2
cm1			call	pop_car		;hex(0-3)=CAR
cm2			movlw	064h		;hexw(0-3)=339300
			movwf	hexw0		;339300=52D64H
			movlw	02dh
			movwf	hexw1
			movlw	05h
			movwf	hexw2
			clrf	hexw3
			call	sub32b		;hex(0-3)=CAR-339300
								;LSBの時hex(0-3)=50
								;CWRの時hex(0-3)=140
								;CWTの時hex(0-3)=200
								;USBの時hex(0-3)=350
								;いずれも hex(2-3)=0
			iorlw	0h			;W=0で減算成功
			btfss	STATUS,Z
			goto	carer		;W=1ならボロー発生、エラー
			movlw	064h		;hexw(0-1)=100=64H
			movwf	hexw0		;339400以下はLSBと判定
			movlw	0h
			movwf	hexw1
			call	sub16b		;hex(0-1)=hex(0-1)-70
			iorlw	0h			;W=0で減算成功
			btfss	STATUS,Z
			goto	LSB			;W=1ならLSB（ボロー発生）

			movlw	0c8h		;hexw(0-1)=200=C8H
			movwf	hexw0		;339401-339600はCWと判定
			movlw	0h
			movwf	hexw1
			call	sub16b		;hex(0-1)=hex(0-1)-200
			iorlw	0h
			btfss	STATUS,Z
			goto	CWT

			movlw	0c8h		;hexw(0-1)=200=C8H
			movwf	hexw0		;339601-339800はUSBと判定
			movlw	0h
			movwf	hexw1
			call	sub16b		;hex(0-1)=hex(0-1)-100
			iorlw	0h
			btfss	STATUS,Z
			goto	USB
carer		bsf		MODE,4
			retlw	01h			;判定不能、エラーリターン

;			現在動作モードフラグ
;				表示モード			MODE=0,0 運用周波数表示指定
;								MODE=0,1 個別周波数表示指定
;				CW表示指定		MODE=1,1
;				LSB表示指定		MODE=2,1
;				USB表示指定		MODE=3,1
;				入力エラー表示指定	MODE=4,1　8桁目に'E'表示
;				CAR固定値使用		MODE=5,0　10msゲート使用
;				CAR実測値使用		MODE=5,1 100msゲート使用
;				HET固定値使用		MODE=6,0　10msゲート使用
;				HET実測値使用		MODE=6,1 100msゲート使用
;				ゲートタイム			MODE=7,0 0.1秒
;				ゲートタイム			MODE=7,1 1秒
;
USB			
			bcf		MODE,1
			bcf		MODE,2
			bsf		MODE,3
			retlw	0h			
LSB
			bcf		MODE,1
			bsf		MODE,2
			bcf		MODE,3
			retlw	0h			
CWT
			bsf		MODE,1
			bcf		MODE,2
			bcf		MODE,3
			retlw	0h			


;
;		TS520用運用バンド判定ルーチン
;
;		入力条件
;		hex0h-hex3hにHET100msゲートデータを入れておく
;		出力
;		hex0-3にHET固定値データ（100msゲートデータに合わせてある）
;
;		資料（100ms、1/10となっている）
;		バンド		設定周波数		入力カウント
;		1.9MHZ	10.695MHZ	1069500
;		3.5MHZ	12.395MHZ	1239500
;		7MHZ	15.895MHZ	1589500
;		14MHZ	22.895MHZ	2289500
;		15MHZ	23.895MHZ	2389500
;		21MHZ	29.895MHZ	2989500
;		28MHZ	36.895MHZ	3689500
;		28.5MHZ	37.395MHZ	3739500
;		29.1MHZ	37.995MHZ	3799500

TSBAND
;			HET入力チェック
			call	pop_het		;hex(0-3)=HET
			movlw	040h		;hexw(0-3)=1000000
			movwf	hexw0		;1000000=F4240H
			movlw	042h
			movwf	hexw1
			movlw	0fh
			movwf	hexw2
			clrf	hexw3
			call	sub32b		;hex(0-3)=HET-1000000
			iorlw	0h
			btfss	STATUS,Z
			goto	BANDER		;HET入力エラー
								;ここまでの差引　1000000
								;1.9MBの時hex(0-3)=69500残
			btfsc	MODE,6		;固定値使用か
			return				;取得値使用なので、ここで終了
;			1.9MHZ(1069500)バンドチェック
			movlw	09ch		;hexw(0-3)=89500
			movwf	hexw0		;89500=15D9CH
			movlw	05dh
			movwf	hexw1
			movlw	01h
			movwf	hexw2
			clrf	hexw3
			call	sub32b		;hex(0-3)=hex(0-3)-89500
			iorlw	0h
			btfss	STATUS,Z
			goto	BAND1R9		;1.9MHZバンド
								;ここまでの差引　1089500
								;3.5MBの時hex(0-3)=150000残
;			3.5MHZ(1239500)バンドチェック
			movlw	010h		;hexw(0-3)=170000
			movwf	hexw0		;170000=29810H
			movlw	098h
			movwf	hexw1
			movlw	02h
			movwf	hexw2
			clrf	hexw3
			call	sub32b		;hex(0-3)=hex(0-3)-170000
			iorlw	0h
			btfss	STATUS,Z
			goto	BAND3R5		;3.5MHZバンド
								;ここまでの差引　1259500
								;7MBの時hex(0-3)=330000残
;			7MHZ(1589500)バンドチェック
			movlw	030h		;hexw(0-3)=350000
			movwf	hexw0		;350000=55730H
			movlw	057h
			movwf	hexw1
			movlw	05h
			movwf	hexw2
			clrf	hexw3
			call	sub32b		;hex(0-3)=hex(0-3)-350000
			iorlw	0h
			btfss	STATUS,Z
			goto	BAND7		;7MHZバンド
								;ここまでの差引　1609500
								;14MBの時hex(0-3)=680000残
;			14MHZ(2289500)バンドチェック
			movlw	060h		;hexw(0-3)=700000
			movwf	hexw0		;700000=AAE60H
			movlw	0aeh
			movwf	hexw1
			movlw	0ah
			movwf	hexw2
			clrf	hexw3
			call	sub32b		;hex(0-3)=hex(0-3)-700000
			iorlw	0h
			btfss	STATUS,Z
			goto	BAND14		;14MHZバンド
								;ここまでの差引　2309500
								;15MBの時hex(0-3)=80000残
;			15MHZ(2389500)バンドチェック
			movlw	0a0h		;hexw(0-3)=100000
			movwf	hexw0		;100000=186A0H
			movlw	086h
			movwf	hexw1
			movlw	01h
			movwf	hexw2
			clrf	hexw3
			call	sub32b		;hex(0-3)=hex(0-3)-100000
			iorlw	0h
			btfss	STATUS,Z
			goto	BAND15		;15MHZバンド
								;ここまでの差引　2409500
								;21MBの時hex(0-3)=580000残
;			21MHZ(2989500)バンドチェック
			movlw	0c0h		;hexw(0-3)=600000
			movwf	hexw0		;600000=927C0H
			movlw	027h
			movwf	hexw1
			movlw	09h
			movwf	hexw2
			clrf	hexw3
			call	sub32b		;hex(0-3)=hex(0-3)-600000
			iorlw	0h
			btfss	STATUS,Z
			goto	BAND21		;21MHZバンド
								;ここまでの差引　3009500
								;28MBの時hex(0-3)=680000残
;			28MHZ(3689500)バンドチェック
			movlw	060h		;hexw(0-3)=700000
			movwf	hexw0		;700000=AAE60H
			movlw	0aeh
			movwf	hexw1
			movlw	0ah
			movwf	hexw2
			clrf	hexw3
			call	sub32b		;hex(0-3)=hex(0-3)-700000
			iorlw	0h
			btfss	STATUS,Z
			goto	BAND28		;28MHZバンド
								;ここまでの差引　3709500
								;28.5MBの時hex(0-3)=30000残
;			28.5MHZ(3739500)バンドチェック
			movlw	050h		;hexw(0-3)=50000
			movwf	hexw0		;50000=C350H
			movlw	0c3h
			movwf	hexw1
			movlw	0h
			movwf	hexw2
			clrf	hexw3
			call	sub32b		;hex(0-3)=hex(0-3)-50000
			iorlw	0h
			btfss	STATUS,Z
			goto	BAND28R5	;28.5MHZバンド
								;ここまでの差引　3759500
								;29.1MBの時hex(0-3)=40000残

;			29.1MHZ(3799500)バンドチェック
			movlw	060h		;hexw(0-3)=60000
			movwf	hexw0		;60000=EA60H
			movlw	0eah
			movwf	hexw1
			movlw	0h
			movwf	hexw2
			clrf	hexw3
			call	sub32b		;hex(0-3)=hex(0-3)-60000
			iorlw	0h
			btfss	STATUS,Z
			goto	BAND29R1	;29.1MHZバンド
								;ここまでの差引　3819500
BANDER
			bsf		MODE,4
			retlw	01h			;エラー

BAND1R9		;1.9MHZバンド(1069500)
			movlw	0bch			;1069500=1051BCH	
			movwf	hex0
			movlw	051h
			movwf	hex1
			movlw	010h
			movwf	hex2
			clrf	hex3
			retlw	0h

BAND3R5		;3.5MHZバンド(1239500)
			movlw	0cch			;1239500=12E9CCH	
			movwf	hex0
			movlw	0e9h
			movwf	hex1
			movlw	012h
			movwf	hex2
			clrf	hex3
			retlw	0h

BAND7		;7MHZバンド(1589500)
			movlw	0fch			;1589500=1840FCH	
			movwf	hex0
			movlw	040h
			movwf	hex1
			movlw	018h
			movwf	hex2
			clrf	hex3
			retlw	0h

BAND14		;14MHZバンド(2289500)
			movlw	05ch			;2289500=22EF5CH	
			movwf	hex0
			movlw	0efh
			movwf	hex1
			movlw	022h
			movwf	hex2
			clrf	hex3
			retlw	0h

BAND15		;15MHZバンド(2389500)
			movlw	0fch			;2389500=2475FCH	
			movwf	hex0
			movlw	075h
			movwf	hex1
			movlw	024h
			movwf	hex2
			clrf	hex3
			retlw	0h

BAND21		;21MHZバンド(2989500)
			movlw	0bch			;2989500=2D9DBCH	
			movwf	hex0
			movlw	09dh
			movwf	hex1
			movlw	02dh
			movwf	hex2
			clrf	hex3
			retlw	0h

BAND28		;28MHZバンド(3689500)
			movlw	01ch			;3689500=384C1CH	
			movwf	hex0
			movlw	04ch
			movwf	hex1
			movlw	038h
			movwf	hex2
			clrf	hex3
			retlw	0h

BAND28R5	;28.5MHZバンド(3739500)
			movlw	06ch			;3739500=390F6CH	
			movwf	hex0
			movlw	00fh
			movwf	hex1
			movlw	039h
			movwf	hex2
			clrf	hex3
			retlw	0h

BAND29R1	;29.1MHZバンド(3799500)
			movlw	0cch			;3799500=39F9CCH	
			movwf	hex0
			movlw	0f9h
			movwf	hex1
			movlw	039h
			movwf	hex2
			clrf	hex3
			retlw	0h

;
;			32ビットバイナリ10倍演算(符号無整数)
;
;		入力	hex(0-3)	32ビット
;		出力　hex(0-3)	
;
;		使用ワーク	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)、(hexw0-3)に数値を入れておく事
;		演算結果でエラー(桁上がり）が発生しても対処はしない
;
;		演算
;		hex(0-3) = hex(0-3) + hexw(0-3)
;

add32b
			movf	hexw0,W		;hex0=hex0+hexw0
			addwf	hex0,F		;桁上がりでC=1
			movlw	01h			;この命令はフラグ変化しない
			btfss	STATUS,C	;if c=1 then hex1=hex1+1	
			goto	ad31		;桁上がり無
;			(hex0+W)に桁上がり発生、処理
			addwf	hex1,F		;hex1=hex1+1
			btfsc	STATUS,C	;桁上がり無なら、goto ad31
			addwf	hex2,F		;桁上がり発生、hex2=hex2+1
			btfsc	STATUS,C	;桁上がり無なら、goto ad31
			addwf	hex3,F		;桁上がり発生、hex3=hex3+1
								;ここで桁上がり発生しても対処しない
ad31		movf	hexw1,W
			addwf	hex1,F
			movlw	01h
			btfsc	STATUS,C
			addwf	hex2,F
			btfsc	STATUS,C
			addwf	hex3,F
			
ad32		movf	hexw2,W
			addwf	hex2,F
			movlw	01h
			btfsc	STATUS,C
			addwf	hex3,F
			movf	hexw3,W
			addwf	hex3,F
			retlw	0h


;
;
;			32ビットバイナリ減算(整数符号無)
;
;		事前にhex(0-3)、hexw(0-3)に数値を入れておく事
;		演算結果でエラー(マイナス）の場合W=1、OKの時はW=0でリターン
;		W=1の場合、演算結果は保障されない
;
;		演算
;		hex(0-3) = hex(0-3) - hexw(0-3)
;

sub32b
;			hex0-hexw0の減算
			movf	hexw0,W		;hex0=hex0-W(hexw0)
			subwf	hex0,F		;W>HEX0の時、ボロー(C=0)
								;W<=HEX0の時、無(C=1)
			movlw	01h			;この命令はフラグ変化しない
			btfss	STATUS,C	;C=1なら、hex1-hexw1へ
;			(hex0-W)にボロー発生、hex1に桁借り処理
			subwf	hex1,F		;hex1=hex1-1
			btfss	STATUS,C	;C=1なら、goto sb31
			subwf	hex2,F		;(hex1-1)にボロー発生、hex2に桁借り
			btfss	STATUS,C	;C=1なら、goto sb31
			subwf	hex3,F		;(hex2-1）ボロー発生、hex3に桁借り
			btfss	STATUS,C
			retlw	01h			;hex3にボロー発生、エラー終了

;			hex1-hexw1の減算
sb31		movf	hexw1,W		;
			subwf	hex1,F
			movlw	01h
			btfss	STATUS,C
			subwf	hex2,F
			btfss	STATUS,C
			subwf	hex3,F
			btfss	STATUS,C
			retlw	01h
;			hex2-hexw2の減算
			movf	hexw2,W
			subwf	hex2,F
			movlw	01h
			btfss	STATUS,C
			subwf	hex3,F
			btfss	STATUS,C
			retlw	01h
;			hex3-hexw3の減算
			movf	hexw3,W
			subwf	hex3,F
			btfss	STATUS,C
			retlw	01h
			retlw	0h

;		16ビットバイナリ加算
;	hex(0-1)=hex(0-1)+hexw(0-1)
;	W=0の時、正常終了
;	W=1の時、エラー発生（キャリー）、演算結果は保障されない
add16b
			movf	hexw0,W		;W=hexw0
			addwf	hex0,F		;hex0=hex0+hexw0
			btfss	STATUS,C
			goto	ad11		;キャリー無で次の加算
			incf	hex1,F		;キャリー発生、hex1=hex1+1
			btfsc	STATUS,C
			retlw	01h			;キャリー発生、加算エラー終了
ad11		movf	hexw1,W		;W=hexw1
			addwf	hex1,F		;hex1=hex1+hexw1
			btfsc	STATUS,C
			retlw	01h			;キャリー発生、加算エラー終了
			retlw	0h			;加算正常終了


;		16ビットバイナリ減算
;	hex(0-1)=hex(0-1)-hexw(0-1)
;	W=0の時、正常終了
;	W=1の時、エラー発生（ボロー）、演算結果は保障されない
sub16b
			movf	hexw0,W		;W=hexw0
			subwf	hex0,F		;hex0=hex0-hexw0
			movlw	01h			;フラグ変化しない
			btfsc	STATUS,C
			goto	sb11		;ボロー無で次の減算
			subwf	hex1,F		;ボロー発生、hex1=hex1-1
			btfss	STATUS,C
			retlw	01h			;ボロー発生、減算エラー終了

sb11		movf	hexw1,W		;W=hexw1
			subwf	hex1,F		;hex1=hex1-hexw1
			btfss	STATUS,C
			retlw	01h			;ボロー発生、減算エラー終了
			retlw	0h			;減算正常終了


	

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		表示データバッファのセッティング（TS520専用)
;
;	入力データ		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
;	数値データ	BH→"L"、DH→"U"に変更
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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		;ドット表示処理

;			オーバーフローチェック
;			警告LEDを発光させる、7セグ表示は残り8桁分を表示
			movf	digit9A,W	;ここにデータがある場合O.Fとなる
			iorlw	0h
			btfss	STATUS,Z
			goto	sbfer
			bcf		PORTB,7			
			return
sbfer		bsf		PORTB,7		;オーバーフロー発生
			retlw	01h

;
;			ゼロブランキング処理
;
;		入力		DBUFx　（数値データ設定済であること)
;				flg	ビット3　ZBKフラグ
;		出力		DBUFx内ブランクビットをセット
;				実際はGET_7SEGルーチンがブランクデータを返す
;		使用ワーク	無
;
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
			movf	flg,W
			andlw	0fh			;設定桁数
			movwf	colum
			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

;
;			変調モード表示付加サブルーチン
;
;		最上位桁に変調モード表示を付加させる
;		CWモード	"C"		数値はCH
;		LSBモード	"L"		数値はBH
;		USBモード	"U"		数値はDH
;		入力エラー	"E"		数値はEH
;		注意		通常のバッファリングが終了してから呼び出す事
;				CW表示指定		MODE=1,1
;				LSB表示指定		MODE=2,1
;				USB表示指定		MODE=3,1
;				エラー表示指定		MODE=4,1

setmod
			btfss	MODE,4
			goto	cwmod
			movlw	0eh
			movwf	DBUF7
			retlw	0h

cwmod		btfss	MODE,1
			goto	lsbmod
			movlw	0ch
			movwf	DBUF7
			retlw	0h

lsbmod		btfss	MODE,2
			goto	usbmod
			movlw	0bh
			movwf	DBUF7
			retlw	0h

usbmod		btfss	MODE,3
			retlw	01h
			movlw	0dh
			movwf	DBUF7
			retlw	0h



;
;		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ケタデータを最上位桁に表示(ラッチ)させる
;		もちろん、旧データはシフトしていき、最下位桁は破棄されます。
;
;		RB4=LATCH(RCK)
;		RB5=CLOCK(SCK)
;		RB6=DATA(SI)
;
;		使用変数	wrk0、wrk1
;
putc
			call	get_7seg
			movwf	wrk0		;セグメントビットデータ
			movlw	08h			;8ビット分送出カウンタ
			movwf	wrk1		;カウンタ
			bcf		PORTB,5		;SCK=0
			nop
			bcf		PORTB,4		;RCK=0
ptclp
			lsrf	wrk0,F		;C=LSB
			btfsc	STATUS,C
			goto	ptc01
			
ptc00		;SI=0送出
			bcf		PORTB,6		;SI=0
			call	w01u		;ウエイト1usec
			bsf		PORTB,5		;SCK=1
			call	w01u		;ウエイト1usec
			bcf		PORTB,5		;SCK=0
			goto	ptcen
			
ptc01		;SI=1送出
			bsf		PORTB,6		;SI=1
			call	w01u		;ウエイト1usec
			bsf		PORTB,5		;SCK=1
			call	w01u		;ウエイト1usec
			bcf		PORTB,5		;SCK=0

ptcen		;
			decfsz	wrk1,F
			goto	ptclp		;残ビット有
;			ラッチパルス送出して終了
			bsf		PORTB,4		;RCK=1
			call	w01u
			bcf		PORTB,4		;RCK=0
			return

;
;		Wregの1ケタデータを最上位桁レジスタに転送するがラッチしない
;		7セグ表示は旧データのままで、更新されたデータは表示されない
;		レジスタの旧データはシフトしていき、最下位桁分は破棄されます。
;
;		RB5=CLOCK(SCK)
;		RB6=DATA(SI)
;		RB4=LATCH(RCK)
;
;		使用変数	wrk0、wrk1
;
putr
			call	get_7seg
			movwf	wrk0		;セグメントビットデータ
			movlw	08h
			movwf	wrk1		;カウンタ
			bcf		PORTB,5		;SCK=0
			nop
			bcf		PORTB,4		;RCK=0
ptrlp
			lsrf	wrk0,F		;C=LSB
			btfsc	STATUS,C
			goto	ptr01
			
ptr00		;SI=0送出
			bcf		PORTB,6		;SI=0
			call	w01u		;ウエイト1usec
			bsf		PORTB,5		;SCK=1
			call	w01u		;ウエイト1usec
			bcf		PORTB,5		;SCK=0
			goto	ptren
			
ptr01		;SI=1送出
			bsf		PORTB,6		;SI=1
			call	w01u		;ウエイト1usec
			bsf		PORTB,5		;SCK=1
			call	w01u		;ウエイト1usec
			bcf		PORTB,5		;SCK=0

ptren							;
			decfsz	wrk1,F
			goto	ptrlp
			return				;ラッチしないで終了

;			ラッチパルス送出
;
;			コールするだけでOK
;			
ptlat		bsf		PORTB,4		;RCK=1
			call	w01u
			bcf		PORTB,4		;RCK=0
			call	w01u
			return

;
;		１桁分のブランクデータを転送する
;		表示（ラッチ）はしない
;
clc
;			ブランクデータ転送準備
			movlw	08h			;8
			movwf	wrk0
			bcf		PORTB,5		;CLOCK(SCK)=0set
			call	w01u
			bcf		PORTB,4		;LATCH(RCK)=0set
			call	w01u
			bsf		PORTB,6		;DATA(SI)=1set
			call	w01u
;			データ転送ループ
clc01		bsf		PORTB,5		;CLOCK(SCK)=1set
			call	w01u
			bcf		PORTB,5		;CLOCK(SCK)=0set
			call	w01u
			decfsz	wrk0,F
			goto	clc01
			return

;
;		8桁すべてブランク表示とする
;
cll
;			ブランクデータ転送準備
			movlw	040h		;8×8
			movwf	wrk0
			bcf		PORTB,5		;CLOCK(SCK)=0set
			call	w01u
			bcf		PORTB,4		;LATCH(RCK)=0set
			call	w01u
			bsf		PORTB,6		;DATA(SI)=1set
			call	w01u
;			データ転送ループ
cll01		bsf		PORTB,5		;CLOCK(SCK)=1set
			call	w01u
			bcf		PORTB,5		;CLOCK(SCK)=0set
			call	w01u
			decfsz	wrk0,F
			goto	cll01
;			終了処理（ラッチする）
			call	w01u
			bsf		PORTB,4		;LATCH(RCK)=1set
			call	w01u
			bcf		PORTB,4		;LATCH(RCK)=0set
			call	w01u
			bcf		PORTB,6		;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
			
			;変換ループ処理
bdloop
			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	bdloop

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			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




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン	12.8MHZ用
;
;		1cycle	= 0.3125us
;		使用レジスタ	= cnt2,cnt3
;		BSR		=0(BANK0)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wait100u						;呼び出しも含めて、100us
								;call is 2cycles
			movlw	06h			;
			movwf	cnt2		;
			movlb	0h			;BANK0
			nop
			nop					
w100u		nop					;
			call	w10u		;10*9=90us(ここだけ命令ステップを数えない）
			decfsz	cnt2,F		;4*5+3=23cycles
			goto	w100u
			return				;2+5+23+2=32cycles=10us

wait50u							;呼び出しも含めて、50us
			call	wait25u
wait25u							;呼び出しも含めて、25us
			call	w10u
			call	w10u
			movlw	04h			;5us=0.3125us*16cycles			
			movwf	cnt2		;
w25u		decfsz	cnt2,F		;2+3*2+2=10cycles
			goto	w25u
			nop
			nop
			return				;2+2+10+2=16cycles=5us

wait5m							; 5ms 
			movlb	0h
			movlw	05h
			movwf	cnt2
w5m			call	w1m
			decfsz	cnt2,F
			goto	w5m
			return

wait10m							; 10ms
			movlb	0h
			movlw	d'10'
			movwf	cnt2
w10m		call	w1m
			decfsz	cnt2,F
			goto	w10m
			return

wait20m							; 20ms
			movlb	0h
			movlw	d'20'
			movwf	cnt2
w20m		call	w1m
			decfsz	cnt2,F
			goto	w20m
			return
wait50m							; 50ms
			movlb	0h
			movlw	d'50'
			movwf	cnt2
w50m		call	w1m
			decfsz	cnt2,F
			goto	w50m
			return

wait100m						; 100ms
			movlb	0h
			movlw	d'100'
			movwf	cnt2
w100m		call	w1m
			decfsz	cnt2,F
			goto	w100m
			return

wait500m						; 500ms
			movlb	0h
			movlw	05h
			movwf	cnt3
w500m		call	wait100m
			decfsz	cnt3,F
			goto	w500m
			return

wait1s							; 1s
			movlb	0h
			movlw	d'10'
			movwf	cnt3
w1s			call	wait100m
			decfsz	cnt3,F
			goto	w1s
			return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1ms 基本ウェイト
;			呼び出しを含めて1msとなる。 
;
;		clock	= 12.8MHZ(0.078125us)
;		1cycle	= 0.3125usec
;		1ms		= 0.3125usec * 3200cycles
;
;			使用変数　cnt0,cnt1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
w1m
			movlb	0h
			movlw	04h			;外周回数 4
			movwf	cnt0		;

;			外周ループ
w1m0		movlw	09fh		;内周回数 159
			movwf	cnt1		;

;			内周ループ
w1m1		nop					;
			nop					;5cyc*(cnt1-1)+4
			decfsz	cnt1,F		;
			goto	w1m1		;5*157+4=789c/s
;
			decfsz	cnt0,F		;
			goto	w1m0		;(5+内周)*(外周-1)+内周+4
								;（5+789）*3+789+4=3175cycles

			movlw	08h			;18サイクル消費
			movwf	cnt0		;2+7*2+2=18
w1m2		decfsz	cnt1,F
			goto	w1m2
								;3175+18=3193cycles
			return				;other=(3+4)cycles
								;Total 3200*0.3125us=1000us
									

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			10us 基本ウェイト
;			呼び出し（call　w10u)も含めて、10usとなる。
;
;		clock	= 12.8MHZ(0.078125us)
;		1cycle	= 0.3125us
;		10us	= 0.3125us * 32cycles
;		使用変数　cnt0,cnt1
;		'goto','call','return'は2サイクル消費する
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

w10u
			movlb	0h
			movlw	08h			;
			movwf	cnt0		;
w10u0		decfsz	cnt0,F		;3*7+2=23
			goto	w10u0		;
			nop
			nop
			return				;2+3+23+2+2=32cycles

w05u		
			movlb	0h			;5us=0.125us*16cycles
			movlw	03h			;			
			movwf	cnt0		;
w05u0		decfsz	cnt0,F		;ループ 3*2+2=8cycles
			goto	w05u0
			nop
			return				;2+3+8+1+2=16cycles=5us

w02u		
			nop					;1.875us=0.3125us*6cycles			
			nop
			return				;

w01u							;正確な1usは不可
			return				;1.25us=0.3125us*4cycles
;
			END
			
