;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		ＡＤ９８５０ ＤＤＳモジュール試運転プログラム
;
;							2015年11月	Ver1.00	JA0QON
;
;		PIC16F1828 20ピンPIC使用
;		生成周波数をロータリーエンコーダで可変
;       MAX2701 8桁7セグLEDモジュールで周波数表示
;		ロータリースイッチで周波数ステップ設定
;
;		その他
;		RIT機能
;		IF用差分機能
;
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

		LIST	P=PIC16F1828
		INCLUDE	P16F1828.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=有効　Foscが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  1  0  0
;
;
	__CONFIG _CONFIG1,	B'0000100110000100'

;
;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  1  1  1  1  1  1  1  1
;
;
	__CONFIG _CONFIG2,	B'0001000011111111'


;		ワークエリア定義
;
;		BANK0	20h-7Fh
;
;		使用していないのもあります
;

hex0		equ		020h		;32ビットバイナリデータ
hex1		equ		021h		;
hex2		equ		022h
hex3		equ		023h
hexw0		equ		024h		;32ビットバイナリ演算用
hexw1		equ		025h
hexw2		equ		026h
hexw3		equ		027h
cnt0		equ		028h		;時間待ちルーチン用
cnt1		equ		029h
cnt2		equ		02ah
cnt3		equ		02bh
tmp0		equ		02ch		;汎用ワーク
tmp1		equ		02dh
flg			equ		02eh		;エラー＆設定フラグ
MODE		equ		02fh		;実行モード設定
DSPM		equ		030h		;ディスプレイモード スイッチフラグ
ADM0		equ		031h		;ADC下位データ
ADM1		equ		032h		;ADC上位データ
ADM2		equ		033h		;ADC保存過去データ
FRQ0		equ		034h		;32ビットDDS周波数データ
FRQ1        equ     035h        ;
FRQ2		equ		036h		;
FRQ3		equ		037h		;
TBAL        equ     038h        ;参照テーブル先頭アドレス下位8ビット
TBAH        equ     039h        ;同上位8ビット
;
digit12     equ     03ah        ;BCD変換出力1，2桁
digit34     equ     03bh		;BCD変換出力3，4桁
digit56     equ     03ch        ;BCD変換出力5，6桁
digit78     equ     03dh        ;BCD変換出力7，8桁
digit9A     equ     03eh        ;BCD変換出力9，10桁
bcdw0		equ		03fh		;BCD補正処理ワーク
bcdw1		equ		040h
wrk0		equ		041h        ;演算用汎用ワーク
wrk1		equ		042h
shift       equ     043h        ;ビットシフト用ワーク
blk			equ		044h		;ゼロブランキング制御フラグ
colum		equ		045h		;現在の桁位置
colw0		equ		046h		;桁位置処理ワーク
colw1		equ		047h		;
;
CMD0		equ		048h		;コマンドパケット下位8ビット
CMD1		equ		049h		;コマンドパケット上位8ビット
DBUF0		equ		04ah		;SPI送信データ編集用バッファ
DBUF1		equ		04bh
DBUF2		equ		04ch
DBUF3		equ		04dh
DBUF4		equ		04eh
DBUF5		equ		04fh
DBUF6		equ		050h
DBUF7		equ		051h
;
REDAT       equ     052h        ;ロータリーエンコーダ・ビットデータ
RESP0       equ     053h        ;変化ステップ量 下位バイト
RESP1		equ		054h		;
RESP2		equ		055h		;
rew0        equ     056h        ;専用ワーク
rew1        equ     057h        ;専用ワーク
;
FDA0        equ     058h		;32ビット アップダウン カウンタ
FDA1        equ     059h		;基本動作周波数用
FDA2		equ     05ah		;
FDA3		equ     05bh		;
FDB0		equ		05ch		;DDS用動作周波数
FDB1		equ		05dh		;
FDB2		equ		05eh		;
FDB3		equ		05fh		;
IFQ0		equ     060h		;中間周波数用差分データ
IFQ1		equ     061h		;
IFQ2		equ     062h		;
IFQ3		equ     063h		;

;
			ORG		0h          ;リセットベクタ
			goto	init
			ORG		04h         ;割り込みベクタ
INT			goto	init
;			TMR0リスタート処理
INTOUT		retfie				;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC16F1828　イニシャライズ
;
;		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/RA0
;						00001 = AN1/RA1
;						00010 = AN2/RA2
;						00011 = AN3/RA4
;						00100 = AN4/RC0
;						00101 = AN5/RC1
;						00110 = AN6/RC2
;						00111 = AN7/RC3
;						01000 = AN8/RC6
;						01001 = AN9/RC7
;						01010 = AN10/RB4
;						01011 = AN11/RB5
;						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モジュール
;
;		FVRCONレジスタ(BANK2　117H)
;			bit7	FVREN	FVRイネーブルビット
;							1有効、0無効
;			bit6	FVRRDY	FVR準備フラグビット(#1)書込み不可
;							1使用可能、0使用不可能あるいは禁止されている
;			bit5	TSEN	温度表示器イネーブルビット
;							1有効、0無効
;			bit4	TSRNG	温度表示器測定レンジ選択ビット
;							1=High Range:Vout=VDD-4VT
;							0=Low Range:Vout=VDD-2VT
;			bit3-2	CDAFVR	コンパレータとDACへのFVR電圧選択ビット
;							00 = FVR出力OFF
;							01 = FVR出力 1x(1.024V)
;							10 = FVR出力　2x(2.048V)#2
;							11 = FVR出力　4x(4.096V)#2
;			bit1-0	ADFVR	ADCへのFVR電圧選択ビット
;							00 = FVR出力OFF
;							01 = FVR出力 1x(1.024V)
;							10 = FVR出力　2x(2.048V)#2
;							11 = FVR出力　4x(4.096V)#2
;
;							#1)12F1824/16F1828では常に"1"
;							#2)FVR電圧出力はVDDを超える事は出来ない
;
;
;	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
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


init
;			各レジスタ初期設定(PIC16F1828)

			;クロック設定
			movlb	01h			;BANK１に切替
			movlw	0f0h		;1111000B
			movwf	OSCCON		;内部発振器は8MHZに設定
								;4xPLL=ON
			;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
			movlw	010h		;10H=00010000
			movwf	ANSELA		;RA4アナログ、RA0-3,5デジタルI/O
			clrf	ANSELA		;デジタル
			clrf	ANSELB		;RB4-7デジタルI/O
			clrf	ANSELC		;RC0-7デジタルI/O
			movlb	01h			;BANK1
			movlw	038h		;3CH=00111000B
			movwf	TRISA		;RA3-5入力、RA0-2出力
			movlw	08fh
			movwf	TRISB		;RB4-6出力、RB7入力
			movlw	0fbh		;FBH＝11111011B
			movwf	TRISC		;C2出力、C0,C1,C3-C7入力

			;TMR0およびプルアップ設定
			movlb	01h			;BANK1
			movlw	0a7H		;10100111B
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース外部
								;TMR0カウントエッジ↓
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/256にセット

			;ADC
			movlb	01h			;BANK1
			movlw	0E0h		;11100000B
			movwf	ADCON1		;10bit変換、左詰め、基準電圧VDD
								;ADCクロック　Fosc/64=2us(32MHZ)

			;FVR
;			movlb	02h			;BANK2
;			movlw	082h		;10000010B
;			movwf	FVRCON		;FVRイネーブル
								;DACとCPSはOFF
								;ADCに4.096V
			
;			設定終了
			movlb	0h

;
;			MAX2719コマンド一覧
;
;	Bモード（デコード有）アドレッシング
;		上位	下位（D15-D0の16ビット)
;		x0H	xxH		NOP
;		x1H	00H-07H	0桁0-9表示（ドット無）
;		x1H	80H-87H	0桁0-9表示（ドット有）
;		x1H	*0H-*7H	*bit7=1でドット有、bit4-6は何でもいい
;		x1H	F0H-F7H	0桁0-9表示（ドット有）
;
;		x2H	**H-**H	1桁、下位7ビットは上記と同じ
;		x3H	**H-**H	2桁、下位7ビットは上記と同じ
;		x4H	**H-**H	4桁、下位7ビットは上記と同じ
;		x5H	**H-**H	5桁、下位7ビットは上記と同じ
;		x6H	**H-**H	6桁、下位7ビットは上記と同じ
;		x7H	**H-**H	7桁、下位7ビットは上記と同じ
;		x8H	**H-**H	8桁、下位7ビットは上記と同じ
;
;	機能設定
;		x9H	**H		デコードモードレジスタ設定
;			00H		7-0桁デコード無(初期設定値)
;			01H		0桁デコード有、7-1桁デコード無
;		xAH	**H		輝度レジスタ設定
;			x0H		1/32(初期設定値)
;			x1H		3/32
;			x2H		5/32
;			x3H		7/32
;			x4H		9/32
;			x5H		11/32
;			x6H		13/32
;			x7H		15/32
;			x8H		17/32
;			x9H		19/32
;			xAH		21/32
;			xBH		23/32
;			xCH		25/32
;			xDH		27/32
;			xEH		29/32
;			xFH		31/32
;
;		xBH	**H		スキャンリミットレジスタ設定（注1）
;			x0H		0桁目のみ(初期設定値)
;			x1H		0&1桁
;			x2H		012桁
;			x3H		0123桁
;			x4H		01234桁
;			x5H		012345桁
;			x6H		0123456桁
;			x7H		01234567桁
;
;		xCH	**H		シャットダウンレジスタ設定
;			x0H		シャットダウンモード(初期設定値)
;			x1H		ノーマルオペレーションモード
;
;		xFH	**H		ディスプレイテストレジスタ設定
;			x0H		ノーマルオペレーションモード(初期設定値)
;			x1H		ディスプレイテストモード
;
;   コードBフォントの使用方法
;		DBUFx　	各桁バッファ データフォーマット（Bモードに適用）
;		bit0-3	表示する十進数値データ	0H-9H→0-9(注2)
;				0AH→-、0BH→E、OCH→H、0DH→L、0EH→P
;				0FH=Blank(注3)
;		bit4	不使用
;		bit5	不使用
;		bit6	不使用
;		bit7    ドット表示	0=OFF、1=ON
;
;		注1）基本的に8桁表示設定で使用するのが良いと思われる
;		注2）表示数値データはMAX2719内部でLED表示ビットデータに変換されます
;		注3）ブランク命令はa-gセグメントのみ有効、DPセグメントには適応されない
;

;			MAX2719イニシャライズ

MAX_INI		call	wait1s      ;MAX2719電源投入安定化待ち
			movlw	0fh			;ディスプレイテストレジスタアドレス
			movwf	CMD1
			movlw	01h
			movwf	CMD0		;テストモード
			call	SEND_CMD
			call	wait100m

			movlw	0fh			;ディスプレイテストレジスタアドレス
			movwf	CMD1
			clrf	CMD0		;ノーマルオペレーション
			call	SEND_CMD

			movlw	0bh			;スキャンレジスタアドレス
			movwf	CMD1
			movlw	07h			;8桁表示セット
			movwf	CMD0
			call	SEND_CMD

			movlw	0ah			;輝度レジスタアドレス
			movwf	CMD1
			movlw	07h			;輝度設定　15/32
			movwf	CMD0
			call	SEND_CMD

			movlw	09h			;デコードモードレジスタアドレス
			movwf	CMD1
			movlw	0ffh		;8桁Bモード
			movwf	CMD0
			call	SEND_CMD
			call	BRKL		;全表示ブランク

			movlw	0ch			;シャットダウンモードレジスタアドレス
			movwf	CMD1
			movlw	01h			;ノーマルモードへ移行
			movwf	CMD0
			call	SEND_CMD

;
;			AD9850イニシャライズ
;
;		DDSモジュール用ポート
;		RB4=LAT(FQ_UP)
;		RB5=CLK(W_CLK)
;		RB6=DAT(D7)
;		RC2=RESET
;
DDS_INI
			bcf		PORTC,2		;RESETポート
			bcf		PORTB,6		;DATポート
			nop
			bcf		PORTB,4		;LATポート
			nop
			bcf		PORTB,5		;CLKポート
			nop
			bsf		PORTC,2		;AD9850リセット
			call	w10u
			bcf		PORTC,2
			call	wait1s
			bsf		PORTB,5		;CLKパルス送出
			call	w10u
			bcf		PORTB,5
			call	w10u
			bsf		PORTB,4		;LATパルス送出
			call	w10u
			bcf		PORTB,4

;
;			初期動作基本設定
;
;	IF周波数補正設定
;		MODE bit(6-7) = 10	+IF周波数出力(上ヘテロダイン)
;					  = 01	-IF周波数出力(下ヘテロダイン)
;					  = 00	IF補正は行わない
;							両方のbitを1にすると、bit7は無視
;		IFQ(0-3)			IF周波数を32bitバイナリで指定
;			例）	IF=455KHZの場合、IFQ(0-3)=0006F158H
;
;	RIT制御
;		RA5	0=RIT OFF、1=RIT ON
;		RA4	ADC入力　-64 - +63ステップ
;		変化量/STEPは下記モードビットで指定
;		MODEフラグ
;			bit(0-3)=0000	RIT機能OFF
;					=0001	2HZ/STEP
;					=0011	4HZ/STEP
;					=0111	8HZ/STEP
;					=1111	16HZ/STEP
;			bit4	=0		RITボリウム右回転で周波数アップ、1=逆
;			bit5	=0		システム使用
;			bit(6-7)=00		IF差分機能OFF
;					=01		+IF差分機能ON(上ヘテロダイン)
;					=10		指定不可
;					=11		-IF差分機能ON(下ヘテロダイン)
;
MOD_INI
			movlw	007H		;MODEフラグ各ビットを指定（必須）
			movwf	MODE		;RIT_ON、8HZ/STEP、IF_OFF
			iorlw	0h
			btfsc	STATUS,Z
			bra		MDI01		;IF･RIT動作設定しない
;			IF差分周波数指定
			movlw	058h		;IFQx=IF周波数を32bitで設定
			movwf	IFQ0
			movlw	0F1h
			movwf	IFQ1
			movlw	06h
			movwf	IFQ2
			clrf	IFQ3		;IFQx=455KHZ=0006F158H

;			初期動作周波数設定
MDI01
			movlw	080h		;FDAx=初期動作周波数を32bitで設定
			movwf	FDA0
			movlw	096h
			movwf	FDA1
			movlw	098h
			movwf	FDA2
			clrf	FDA3		;FDAx=10MHZ=00989680H（暫定値）

;			ディスプレイ機能初期設定
			movlw	04fh		;01001111b
        	movwf	flg			;8桁表示、4,7桁ドット表示指定
								;ゼロブランキングする
;			その他初期設定
			clrf	hex0
			clrf	hex1
			clrf	hex2
			clrf	hex3
			clrf	ADM0
			clrf	ADM1
			clrf	ADM2
			clrf	RESP0
			clrf	RESP1
			clrf	RESP2
			clrf	DSPM
			call	RE_DATA

;
;		メインループ
;
;
mloop		;メインループ
			call	GET_MODE	;カウンタステップ設定
			call	RE_DATA     ;生成周波数カウンタ FDAxを出力
			iorlw   0h			;W=0以外ならカウント有
								;W=1でREのみカウント有
								;W=2でADCのみカウント有
								;W=3でRE、ADC両方カウント有
			btfss	STATUS,Z
			goto	mlp01		;RE,ADC変化有
			;RIT_SWの変化
			btfsc	DSPM,1		;RIT_SW変化チェック
			goto	mlp01		;RIT_SW変化有、DDS再設定
			;RIT_SW変化無
			btfsc	DSPM,0		;DSP_SW変化あったか？
			goto	mlp02		;DSP_SW変化有
;			DSP_SW変化無
			btfsc	DSPM,4		;現在DSPmode(RA3値)
			goto	mloop		;RIT周波数非表示モード
;
			btfss	MODE,5		;RIT SW、1=ON 0=OFF
			goto	DSPNR
			goto	DSPRT		;RIT周波数表示モード
;			ＤＤＳ周波数設定
mlp01		call	GEN_HEX		;FDAxからHEXx生成
			call	GET_DDS		;HEXxから配列行の各種桁データ取得
			call	SEND_DDS	;DDSへ送信
mlp02		btfss	MODE,5		;RIT SW、1=ON 0=OFF
			bra		DSPNR
			btfss	DSPM,4		;現在DSPmode(RA3値)
			goto	DSPRT		;RIT周波数表示モード
								;RIT周波数非表示モード

;			動作周波数表示（DDS出力周波数とは限らない)
DSPNR
			call	FDAHEX		;FDAxをHEXxにコピー
            call    BCD
			call	SETBUF		;データ整理
			call	PUTL		;LEDモジュールに送信
			goto	mloop

;			RIT周波数表示（DDS出力周波数と同じとは限らない）
DSPRT
			call	FDAHEX
			call	RITM		;hex(0-3)=RIT補正処理
            call    BCD
			call	SETBUF		;データ整理
			call	PUTL		;LEDモジュールに送信
			goto	mloop


;
;		各種オプション設定
;
;	ロータリーエンコーダ　１ステップ量設定
;	ステップ量はロータリースイッチより設定取得を想定
;	スイッチポートは6ビット
;		各ポートすべて1なら1HZ
;		RC5	10HZステップ	0=ON、1=OFF
;		RC4	100HZステップ	0=ON、1=OFF
;		RC3	1KHZステップ	0=ON、1=OFF
;		RC6	10KHZステップ	0=ON、1=OFF
;		RC7	100KHZステップ	0=ON、1=OFF
;		RB7	1MHZステップ	0=ON、1=OFF
;
;		出力
;		RESP(0-2)の24ビットでステップ数を設定
;
;	IF周波数補正設定
;		MODE bit(6-7) = 10	+IF周波数出力(上ヘテロダイン)
;					  = 01	-IF周波数出力(下ヘテロダイン)
;					  = 00	IF補正は行わない
;							両方のbitを1にすると、bit7は無視
;		IFQ(0-3)			IF周波数を32bitバイナリで指定
;			例）	IF=455KHZの場合、IFQ(0-3)=0006F158H
;
;	RIT制御
;		RA5	0=RIT OFF、1=RIT ON　トグルスイッチ等使用を想定
;		RA4	ADC入力　-64 - +63ステップ
;		変化量/STEPは下記モードビットで指定
;		MODEフラグ
;			bit(0-3)=0000	RIT機能OFF
;					=0001	2HZ/STEP
;					=0011	4HZ/STEP
;					=0111	8HZ/STEP
;					=1111	16HZ/STEP
;			bit4	=0		RITボリウム右回転周波数アップ、1=反転
;			bit5	=0		RITスイッチの反映、1=ON
;			bit(6-7)=00		IF差分機能OFF
;					=01		+IF差分機能ON(上ヘテロダイン)
;					=10		指定不可
;					=11		-IF差分機能ON(下ヘテロダイン)
;
;	ディスプレイ モード 動作フラグ
;		ポート		RA3		1=標準周波数表示、0=RIT補正周波数表示
;							タクトスイッチ等使用を想定
;		DSPM		bit7	RA5前回データ
;					bit6	RA5新データ
;					bit5	RA3前回データ
;					bit4	RA3取得新データ
;					bit3-2	0
;					bit1	0の時 bit6=bit7、1の時 bit6!=bit7
;					bit0	0の時 bit4=bit5、1の時 bit4!=bit5
;					
GET_MODE
;			DSPmode
dp000		btfss	PORTA,3		;1回目取得
			bra		dp010		;1回目RA3=0
			call	wait5m		;1回目RA3=1
			btfss	PORTA,3		;RA3=1かどうか再チェック
			bra		dp000		;2回目不一致、再取得
			;RA3=1決定
			bsf		DSPM,4		;RA3=1(SW_OFF)新取得データ
			btfss	DSPM,5		;旧データチェック
			bra		dp022		;旧RA3=0、不一致
			bra		dp021		;旧RA3=1、一致
			;
dp010		call	wait5m		;1回目RA3=0
			btfsc	PORTA,3		;RA3=0かどうか再チェック
			goto	dp000		;2回目不一致、再取得
			;RA3=0決定
			bcf		DSPM,4		;RA3=0(SW_ON)新取得データ
			btfsc	DSPM,5		;旧ビットデータ
			bra		dp012		;旧RA3=1、不一致
dp011		;一致、SW_ONのまま
			bcf		DSPM,0
			goto	RITPORT
dp012		;不一致処理、SW_ONになった
			bcf		DSPM,5		;旧ビット書き換え
			bsf		DSPM,0		;bit4!=bit5
			goto	RITPORT
dp021		;一致、SW_OFFのまま
			bcf		DSPM,0
			goto	RITPORT
dp022		;不一致、SW_OFFになった
			bsf		DSPM,5
			bsf		DSPM,0
			
;			RIT PORT チェック
RITPORT
			btfss	PORTA,5		;1=RIT OFF、0=RIT ON
			bra		riton		;RA5=0
			bsf		DSPM,6		;RA5=1
			bcf		MODE,5		;RIT OFF
			btfss	DSPM,7
			bra		rt022		;旧RA5=0不一致、SW_OFFになった
			bra		rt021		;旧RA5=1一致、SW_OFFのまま
			;
riton		bcf		DSPM,6		;RA5=0
			bsf		MODE,5		;RIT ON
			btfsc	DSPM,7
			bra		rt012		;旧RA5=1不一致
								;旧RA5=0一致
rt011		;一致、SW_ONのまま
			bcf		DSPM,1
			goto	gmd01
rt012		;不一致処理、SW_ONになった
			bcf		DSPM,7		;旧ビット書き換え
			bsf		DSPM,1		;bit6!=bit7
			goto	gmd01
rt021		;一致、SW_OFFのまま
			bcf		DSPM,1
			goto	gmd01
rt022		;不一致、SW_OFFになった
			bsf		DSPM,7		;旧ビット書き換え
			bsf		DSPM,1		;bit6!=bit7
			
;			RE STEP
gmd01		btfss	PORTC,5		;10HZ
			bra		step10
			btfss	PORTC,4		;100HZ
			bra		step100
			btfss	PORTC,3		;1KHZ
			bra		step1k
			btfss	PORTC,6		;10KHZ
			bra		step10k
			btfss	PORTC,7		;100KHZ
			bra		step100k
			btfss	PORTB,7		;1MHZ
			bra		step1m
;
step01		movlw	01h
			movwf	RESP0
			movlw	0h
			movwf	RESP1
			movlw	0h
			movwf	RESP2		;RESPx=000001H=1
			return
;
step10		movlw	0ah
			movwf	RESP0
			movlw	0h
			movwf	RESP1
			movlw	0h
			movwf	RESP2		;RESPx=00000AH=10
			return
;
step100		movlw	064h
			movwf	RESP0
			movlw	0h
			movwf	RESP1
			movlw	0h
			movwf	RESP2		;RESPx=000064H=100
			return
;
step1k		movlw	0e8h
			movwf	RESP0
			movlw	03h
			movwf	RESP1
			movlw	0h
			movwf	RESP2		;RESPx=0003E8H=1000
			return
step10k		movlw	010h
			movwf	RESP0
			movlw	027h
			movwf	RESP1
			movlw	0h
			movwf	RESP2		;RESPx=002710H=10K
			return
;
step100k	movlw	0a0h
			movwf	RESP0
			movlw	086h
			movwf	RESP1
			movlw	01h
			movwf	RESP2		;RESPx=0186A0H=100K
			return
;
step1m		movlw	040h
			movwf	RESP0
			movlw	042h
			movwf	RESP1
			movlw	0fh
			movwf	RESP2		;RESPx=0F4240H=1M
			return

;
;			HEXデータ補正
;
;	入力		FDA(0-3)
;	出力		hex(0-3)
;
GEN_HEX
			call	FDAHEX		;hex(0-3)=FDA(0-3)

;			IF差分補正
			movf	MODE,W
			andlw	0c0h		;C0H=11000000B
			btfss	STATUS,Z
			call	IFSM

;			RIT処理
GEN_HEXR	movf	MODE,W
			andlw	0fh			;RIT処理ビット
			btfss	STATUS,Z
			call	RITM		;hex(0-3)=補正処理
			return

;		FDAxをHEXxにコピー
FDAHEX		movf	FDA0,W
			movwf	hex0
			movf	FDA1,W
			movwf	hex1
			movf	FDA2,W
			movwf	hex2
			movf	FDA3,W
			movwf	hex3
			return


;
;           ＡＤ９８５０ ＤＤＳ用周波数データ生成プログラム
;							Ver 1.0	OCT/2015	JA0QON
;
;					hexx(32bit)に生成周波数を入力して呼び出す事
;					FRQx(32bit)に対応するDDSデータを出力する
;
;			入力	hex(0-3)	32ビット周波数データ
;								データは破壊される
;
;			出力	FRQ(0-3)	32ビットDDSデータ
;
;			使用データ１配列	1行4桁(4バイト)、80行構成
;           使用ワーク  fdw0、fdw1
;
GET_DDS
;           ＤＤＳデータクリア
			clrf	FRQ0
			clrf	FRQ1
			clrf	FRQ2
			clrf	FRQ3
;
			call	BCD			;十進数に変換
;			配列メモリアドレス設定			
			swapf	digit78,W
			andlw	0fh			;8桁目の十進データ
			movwf	hex0		;
			lslf	hex0,F
			lslf	hex0,F		;hex0=4*hex0
			clrf	hex1
			movlw	018h
			movwf	hexw0
			movlw	01h			;
			movwf	hexw1		;桁オフセット値(280)
			call	ADD16B		;hex(0-1)=4*hexo+280
			call	LDDT		;桁DDSデータFRQxに加算

			movf	digit78,W
			andlw	0fh
			movwf	hex0
			lslf	hex0,F
			lslf	hex0,F		;4倍
			clrf	hex1		;7桁目
			movlw	0f0h		;240
			movwf	hexw0
			clrf	hexw1
			call	ADD16B		;hex(0-1)=4*hex0+240
			call	LDDT		;桁DDSデータFRQxに加算

			swapf	digit56,W
			andlw	0fh
			movwf	hex0		;6桁目
			lslf	hex0,F
			lslf	hex0,F		;4倍
			clrf	hex1
			movlw	0c8h		;200
			movwf	hexw0
			clrf	hexw1
			call	ADD16B		;hex(0-1)=4*hexo+200
			call	LDDT		;桁DDSデータFRQxに加算

			movf	digit56,W
			andlw	0fh
			movwf	hex0		;5桁目
			lslf	hex0,F
			lslf	hex0,F		;4倍
			clrf	hex1
			movlw	0a0h		;160
			movwf	hexw0
			clrf	hexw1
			call	ADD16B		;hex(0-1)=4*hexo+160
			call	LDDT		;桁DDSデータFRQxに加算

			swapf	digit34,W
			andlw	0fh
			movwf	hex0		;4桁目
			lslf	hex0,F
			lslf	hex0,F		;4倍
			clrf	hex1
			movlw	078h		;120
			movwf	hexw0
			clrf	hexw1
			call	ADD16B		;hex(0-1)=4*hexo+120
			call	LDDT		;桁DDSデータFRQxに加算

			movf	digit34,W
			andlw	0fh
			movwf	hex0		;3桁目
			lslf	hex0,F
			lslf	hex0,F		;4倍
			clrf	hex1
			movlw	050h		;80
			movwf	hexw0
			clrf	hexw1
			call	ADD16B		;hex(0-1)=4*hexo+80
			call	LDDT		;桁DDSデータFRQxに加算

			swapf	digit12,W
			andlw	0fh
			movwf	hex0		;2桁目
			lslf	hex0,F
			lslf	hex0,F		;4倍
			clrf	hex1
			movlw	028h		;40
			movwf	hexw0
			clrf	hexw1
			call	ADD16B		;hex(0-1)=4*hexo+40
			call	LDDT		;桁DDSデータFRQxに加算

			movf	digit12,W
			andlw	0fh
			movwf	hex0		;1桁目は相対オフセットは要らない
			lslf	hex0,F
			lslf	hex0,F		;4倍
			clrf	hex1		;hex(0-1)=4*hexo
			call	LDDT		;桁DDSデータFRQxに加算
			return


;			
;			配列アドレス演算およびデータ取得
;		hex(0-1)で指定された桁オフセット値を、絶対アドレスに加算
;		そこから4バイトの桁DDSデータを取得
;		取得データはFRQに加算される
;
;		入力	hex(0-1)	配列桁位置
;		出力	FRQ(0-3)	DDSデータ
;
LDDT
			movlw	00h
			movwf	hexw0
			movlw	088h
			movwf	hexw1		;配列アドレス 絶対オフセット値
			call	ADD16B		;Wreg値を加算
			movf	hex0,W
			movwf	FSR0L
			movf	hex1,W
			movwf	FSR0H		;配列行絶対アドレス設定
;			配列行へアクセス実行
			moviw	FSR0++
			movwf	hexw0		;DDSデータ0-8
			moviw	FSR0++
			movwf	hexw1		;DDSデータ9-15ビット
			moviw	FSR0++
			movwf	hexw2		;
			moviw	FSR0++
			movwf	hexw3		;
;
			movf	FRQ0,W
			movwf	hex0
			movf	FRQ1,W
			movwf	hex1
			movf	FRQ2,W
			movwf	hex2
			movf	FRQ3,W
			movwf	hex3
			call	ADD32B
			movf	hex0,W
			movwf	FRQ0
			movf	hex1,W
			movwf	FRQ1
			movf	hex2,W
			movwf	FRQ2
			movf	hex3,W
			movwf	FRQ3
			return

;
;			ＩＦ周波数補正処理
;
;	入力
;		hex(0-3)	補正前周波数
;		IFQ(0-3)	IF補正周波数
;		MODE(6-7)	上下ヘテロダイン設定
;	出力
;		hex(0-3)
;
;	IF周波数補正設定
;		MODE bit(6-7) = 10	+IF周波数出力(上ヘテロダイン)
;					  = 01	-IF周波数出力(下ヘテロダイン)
;					  = 00	IF補正は行わない
;							両方のbitを1にすると、bit7は無視
;
IFSM
			btfss	MODE,7		;上ヘテロダイン フラグ
			goto	ifsm02
			movf	IFQ0,W
			movwf	hexw0
			movf	IFQ1,W
			movwf	hexw1
			movf	IFQ2,W
			movwf	hexw2
			movf	IFQ3,W
			movwf	hexw3
			call	ADD32B
			return
ifsm02
			btfss	MODE,6		;下ヘテロダイン フラグ
			return
			movf	IFQ0,W
			movwf	hexw0
			movf	IFQ1,W
			movwf	hexw1
			movf	IFQ2,W
			movwf	hexw2
			movf	IFQ3,W
			movwf	hexw3
			call	SUB32B
			return

;
;			ＲＩＴ処理
;
;		MODE(0-3)	RITステップ指定
;					=0000	何もしない
;					=0001	2HZ/STEP
;					=0011	4HZ/STEP
;					=0111	8HZ/STEP
;					=1111	16HZ/STEP
;		MODE,4		=0 VR右回転で生成周波数UP
;					=1 逆
;		ADC値は7ビットで取得
;		40Hから上は + シフト　0から+63 STEP
;		3FHから下は - シフト　-1から-64 STEP
;
;		入力		ADM0		ADC値
;				hex(0-3)	中心周波数
;		出力		hex(0-3)	RIT調整周波数
;		使用ワーク
;		wrk0、wrk1
;
RITM
			btfss	MODE,5		;RIT SW、1=ON 0=OFF
			return				;RIT=OFFなので何もしない
			clrf	wrk1
			movf	ADM0,W		;取得データはADM0
			movwf	wrk0
			movlw	040h		;RIT中心値
			subwf	wrk0,F
			btfsc	STATUS,C	;ボローチェック
			bra		ritadd

ritsub		;マイナスの絶対値
			movlw	0ffh		;
			xorwf	wrk0,F
			incf	wrk0,F		;

			bcf		STATUS,C	;
			rlf		wrk0,F		;X2
			rlf		wrk1,F		;
			btfss	MODE,1
			bra		rtsbc		;
			rlf		wrk0,F		;X4
			rlf		wrk1,F		;
			btfss	MODE,2
			bra		rtsbc
			rlf		wrk0,F		;X8
			rlf		wrk1,F		;
			btfss	MODE,3
			bra		rtsbc
			rlf		wrk0,F		;X16
			rlf		wrk1,F		;
rtsbc		movf	wrk0,W
			movwf	hexw0
			movf	wrk1,W
			movwf	hexw1
			clrf	hexw2
			clrf	hexw3
			btfsc	MODE,4		;RIT回転方向
			bra		rtsbc01
			call	SUB32B
			return
rtsbc01		call	ADD32B
			return
;
ritadd
			bcf		STATUS,C	;
			rlf		wrk0,F		;X2
			rlf		wrk1,F		;
			btfss	MODE,1
			bra		rtadc		;
			rlf		wrk0,F		;X4
			rlf		wrk1,F		;
			btfss	MODE,2
			bra		rtadc
			rlf		wrk0,F		;X8
			rlf		wrk1,F		;
			btfss	MODE,3
			bra		rtadc
			rlf		wrk0,F		;X16
			rlf		wrk1,F		;
rtadc		movf	wrk0,W
			movwf	hexw0
			movf	wrk1,W
			movwf	hexw1
			clrf	hexw2
			clrf	hexw3
			btfsc	MODE,4
			bra		rtabc01
			call	ADD32B
			return
rtabc01		call	SUB32B
			return


;
;		AD9850　パケット送出サブルーチン
;
;		事前にFRQxに周波数データを入れておくこと
;		FRQxのデータは保存される
;
;		DDSモジュール用ポート
;		RB4=LAT(FQ_UP)
;		RB5=CLK(W_CLK)
;		RB6=DAT(D7)
;		RC2=RESET（このルーチンでは使用しない)
;
;		パケット送出シークェンス（１コマンドパケットは40ビット幅)
;		(1)CLK=0、LAT=0
;		(2)DATにデータビットをセット（bit0からbit39へ順番にセット)
;		(3)CLK=L→HでDATのデータビットはシフトレジスタにロードされる
;		(4)CLK=H→Lにして、(2)に行く、これを40回繰り返す
;		(5)LAT=L→Hで40bitのシフトレジスタ内容がラッチされる
;		(6)CLK=0、LAT=0にして終了
;
;		使用ワーク
;			FRQ0-3	DDSデータ
;			tmp0	カウントワーク
;			tmp1	コマンドワーク

SEND_DDS
			bcf		PORTB,5		;CLK=0
			nop
			bcf		PORTB,4		;LAT=0
			movf	FRQ0,W		;下位から8ビット分送出データ
			call	sendds
			movf	FRQ1,W
			call	sendds
			movf	FRQ2,W
			call	sendds
			movf	FRQ3,W
			call	sendds
			movlw	0h
			call	sendds
;			ラッチパルス送出して終了
			bsf		PORTB,4		;LAT=1
			call	w10u
			bcf		PORTB,4		;LAT=0
			call	w10u
			return

sendds		;シフトレジスタに8ビット分送出、ラッチはしない
			movwf	tmp1
			movlw	08h			;8ビット分
			movwf	tmp0		;カウンタ
sddlp		lsrf	tmp1,F		;C=LSB
			btfsc	STATUS,C
			goto	sdd01

sdd00		;DATA=0送出
			bcf		PORTB,6		;DAT=0
			call	w10u		;ウエイト10us
			bsf		PORTB,5		;CLK=1
			call	w10u		;ウエイト10us
			bcf		PORTB,5		;CLK=0
			goto	sdden

sdd01		;DATA=1送出
			bsf		PORTB,6		;DAT=1
			call	w10u		;ウエイト10us
			bsf		PORTB,5		;CLK=1
			call	w10u		;ウエイト10us
			bcf		PORTB,5		;CLK=0

sdden		;
			decfsz	tmp0,F
			goto	sddlp		;残ビットチェック
			call	w10u		;ウエイト1us
			return



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		ロータリーエンコーダ入力パルス　カウントサブルーチン
;
;		想定部品	ALPS	EC12E2420801(クリックタイプ）
;						EC12E2420803(ノンクリックタイプ)
;						チャタリング	3ms(max),R=10KΩ
;						バウンズ	2ms(max),R=10KΩ
;		エンコーダA端子		RC0
;		エンコーダB端子		RC1
;		カウント出力データ	FDA0
;							FDA1
;							FDA2
;							FDA3
;
;		エンコーダ右回り	アップカウント
;		エンコーダ左回り	ダウンカウント
;       カウントステップ    RESP0-RESP2(24bit)に事前設定
;
;
;		状態変化無ならWreg=0でリターン
;		状態変化有ならWreg=1、REDAT下位2ビットに記録
;       REDAT   エンコーダ用ビットデータ
;		旧ビットデータは左シフトされ、オーバーフロービットは破棄される
;		t(0)	→bit1,0(REA,REB)
;		t(-1)	→bit3,2(REA,REB)
;		t(-3)	→bit5,4(REA,REB)
;		t(-4)	→bit7,6(REA,REB)
;
;		使用専用ワーク	rew0,rew1,REDAT,RESTP
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

RE_DATA
;			ポートデータチェック
;			rew0	取得データ（下位2ビット有効）
			movf	PORTC,W     ;RC0,RC1ポート読込(1'st)
			andlw	03h
			movwf	rew0        ;bit0=REA,bit1=REB
			call	w1m			;チャタリング終了待ち3ms
			call	w1m
			call	w1m
			movf	PORTC,W		;RC0,RC1ポート読込(2'st)
			andlw	03h
			movwf	rew1		;
			xorwf	rew0,W		;1'stと2'stを比較
			btfss	STATUS,Z	;Z=1ならば取得データ有効
			goto	RE_DATA     ;データ読込エラー リトライ

;			ポートデータ新旧比較
			movf	REDAT,W
			movwf	rew1		;過去データをコピー
			movlw	03h
			andwf	rew1,W		;不要ビットをクリア
			xorwf	rew0,W		;新旧データ比較
			btfsc	STATUS,Z	;Z=0ならば状態変化有
			goto	re_end0		;状態変化無

;			保存データ更新
;			過去データ      REDAT
;			一時保存ワーク  rew1
			movf	REDAT,W		;過去ビット保存データ
			movwf	rew1		;過去データ一時保存
			lslf	REDAT,F		;新データ挿入のため2ビット左シフト
			lslf	REDAT,F		;bit0-1はクリアされます
			movf	rew0,W
			iorwf	REDAT,F		;保存データ更新
                                ;bit0→REA新取得データ
                                ;bit1→REB新取得データ
                                ;bit2→REA旧データ
                                ;bit3→REB旧データ

;			回転方向判別
;           rew1=過去データ
;           rew0=現在データ
;           判別式D=rew1*2 XOR rew0
;           D(bit1)=0ならCW（時計回り）
;           D(bit1)=1ならCCW（反時計回り）
			movlw	03h			;
			andwf	rew1,F		;rew1=F(-1)の2ビットのみとする
			lslf	rew1,W		;F(-1)ビットを左シフト
			xorwf	rew0,F		;(取得ビット)XOR(旧ビット)
			btfsc	rew0,1		;Lなら時計回転
			goto	ccw			;Hなら反時計回転

;			右回転処理
;   		FDA(0-3)を指定ステップでインクリメント
;			RESP(0-2)=アップダウンステップ
cw			movf	RESP0,W     ;1カウントの加算ステップ数
			movwf	hexw0
			movf	RESP1,W
			movwf	hexw1
			movf	RESP2,W
			movwf	hexw2
			clrf	hexw3
			call	FDAHEX
			call	ADD32B		;ステップ周波数分を加算
            movf	hex0,W
            movwf	FDA0
            movf	hex1,W
            movwf	FDA1
			movf	hex2,W
			movwf	FDA2
			movf	hex3,W
			movwf	FDA3
			goto	re_end1		;デバッグ用
;           最大行番号越えをチェック
            movf	hex0,W
            movwf	hexw0
            movf	hex1,W
            movwf	hexw1
			movf	hex2,W
			movwf	hexw2
			movf	hex3,W
			movwf	hexw3		;hexw=hex
            movlw   0h
            movwf   hex0
            movlw   05Ah
            movwf   hex1
			movlw	062h
			movwf	hex2
			movlw	02h
			movwf	hex3		;hex=2625A00H=40,000,000
            call	SUB32B		;hex=hex-hexw、W=1ならボロー発生
			iorlw	0h			;ボローチェック
			btfsc	STATUS,C
			goto	re_end1		;状態変化有、正常終了
;           ボロー発生、最大周波数保護
            movlw   0h
            movwf   FDA0
            movlw   5Ah
            movwf   FDA1
			movlw	062h
			movwf	FDA2
			movlw	02h
			movwf	FDA3		;FDAx=2625A00H=40,000,000（最大周波数）
			goto	re_end0		;状態変化無、カウンタ最大値

;			左回転処理		FDA(0-1)を指定ステップでデクリメント
ccw			movf	RESP0,W		;1カウントの減算ステップ数
			movwf	hexw0
			movf	RESP1,W
			movwf	hexw1
			movf	RESP2,W
			movwf	hexw2
			clrf	hexw3
			call	FDAHEX
			call	SUB32B		;ステップ周波数分を減算
            iorlw	0h			;ボローチェック
            btfss	STATUS,C
            goto	ccwer
            movf	hex0,W
            movwf	FDA0
            movf	hex1,W
            movwf	FDA1
			movf	hex2,W
			movwf	FDA2
			movf	hex3,W
			movwf	FDA3
			goto	re_end1		;状態変化有、終了
ccwer		clrf	FDA0		;
			clrf	FDA1
			clrf	FDA2
			clrf	FDA3
			goto	re_end0		;状態変化無、カウンタリセット

;		RE変化無での終了処理
re_end0
			movf	MODE,W		;RIT機能設定チェック
			andlw	0fh
			btfsc	STATUS,Z
			retlw	0h			;RIT設定無、REも変化無
			call	GET_ADC
			iorlw	0h
			btfsc	STATUS,Z
			retlw	0h			;RE、ADC、共に変化無
			retlw	02h			;ADCのみ変化有
;		RE変化有での終了処理
re_end1
			movf	MODE,W		;RIT機能設定チェック
			andlw	0fh
			btfsc	STATUS,Z
			retlw	01h			;RIT設定無、REは変化有
			call	GET_ADC
			iorlw	0h
			btfsc	STATUS,W
			retlw	01h			;RE変化有、ADC変化無
			retlw	03h			;RE、ADC、共に変化有

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;			Ａ／Ｄ変換サブルーチン
;
;		アナログ入力ポート		RA4/AN3
;		結果格納方法		右詰め/10bit取得
;		出力データ			ADM0(1/8、つまり7bitに変換される)
;
;	ADCON0レジスタ(BANK1　09DH)
;		bit7	Unimplemented(read=0)
;		bit6-2	CHS		アナログ入力チャンネル選択ビット
;						00000 = AN0/RA0
;						00001 = AN1/RA1
;						00010 = AN2/RA2
;						00011 = AN3/RA4
;						00100 = AN4/RC0
;						00101 = AN5/RC1
;						00110 = AN6/RC2
;						00111 = AN7/RC3
;						01000 = AN8/RC6
;						01001 = AN9/RC7
;						01010 = AN10/RB4
;						01011 = AN11/RB5
;						11101 = 温度インジケータ
;						11110 = DAC出力
;						11111 = FVRバッファ1出力
;		bit1	GO/DONE	A/D変換ステータスビット
;						1=変換開始指令（１にすると変換動作開始）
;						0=変換完了(変換完了すると０になる）
;		bit0	ADON	A/D変換ステータスビット
;						1=A/Dコンバータ動作
;						0=A/Dコンバータ停止
;
;
;		出力			ADM0	旧データ
;						ADM1	新データ
;						W=0		データ更新無
;						W=1		データ更新有
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;			VRによる分電圧取得
GET_ADC
			btfss	MODE,5		;RIT動作フラグ
			retlw	0h			;RIT_OFFで何もせず終了
			movlb	01h
			movlw	0Dh			;00001101b
								;左詰め、基準電圧VDD、
								;AN3(RA4)選択、ADON_ON
			movwf	ADCON0		;電圧サンプリング開始
			call	w10u		;サンプリング電圧安定化待ち
			call	w10u
			movlb	01h
			bsf		ADCON0,GO	;A/D変換開始指令
aloop
			btfsc	ADCON0,GO	;A/D変換完了待ち
			goto	aloop		;GO=0ならば次へ
			bcf		ADCON0,ADON	;A/DコンバータOFF

			movf	ADRESH,W	;データ上位2ビット
			movlb	0h
			movwf	ADM1
			movlb	01h
			movf	ADRESL,W	;データ下位8ビット
			movlb	0h
			movwf	ADM0
;			取得データ安定化(減算)処理
			lsrf	ADM1,F		;10bitにする場合は、ここ以下5行削除
			rrf		ADM0,F
			lsrf	ADM1,F		;9bitにする場合は、ここ以下3行削除
			rrf		ADM0,F		;
			lsrf	ADM0,F		;最終処理データ(7bit)
								;8bitにする場合はこの行を削除
			movf	ADM2,W		;旧取得値
			xorwf	ADM0,W		;新旧比較
			btfsc	STATUS,Z
			bra		gaden01		;同じ(無効)なのでW=0でリターン
			movf	ADM0,W
			movwf	ADM2		;過去データ更新
			retlw	01h			;違う(有効)ならW=1でリターン
gaden01
			retlw	0h




;
;		表示データバッファのセッティング
;
;	入力データ		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点灯しない
;
;			上位桁から書き込みます
;
;		コードBフォントの使用方法
;		DBUFx　	各桁バッファ データフォーマット（Bモードに適用）
;		bit0-3	表示する十進数値データ	0H-9H→0-9(注1)
;				0AH→-、0BH→E、OCH→H、0DH→L、0EH→P
;				0FH=Blank(注2)
;		bit4	不使用
;		bit5	不使用
;		bit6	不使用
;		bit7　　	ドット表示	0=OFF、1=ON
;		注1)表示数値データはMAX2719内部でLED表示ビットデータに変換されます
;		注2)ブランク命令はa-gセグメントのみ有効、DPセグメントには適応されない
;
;	使用ワーク	bufw0
;

SETBUF
;			表示する十進数値データを全バッファに書込み
			swapf	digit78,W
			andlw	0fh			;8桁目のみのデータを抽出
			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桁目に数値データ書込み

			movf	digit12,W
			andlw	0fh
			movwf	DBUF0		;1桁目に数値データ書込み

;			その他指定処理を全バッファに行う
;			呼び出し順番によっては上手く機能しなくなるので注意
			call	ZBK			;ゼロブランキング処理
			call	SPOS		;指定表示桁数処理
			call	ADDOT		;ドット表示処理

;			オーバーフローチェック
;			警告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フラグ
;		使用ワーク	無
;
;		方法		数値データ=0FHとする(CMD0)（注1）
;				その場合、DPセグメントは処理されない
;
;
;		注1）	表示桁数とゼロブランキングについて
;			ゼロブランキング処理にスキャンレジスタ使用はNG
;
;
ZBK
			btfss	flg,3		;ZBK命令フラグチェック
			return				;命令無いので終了
			movf	DBUF7,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF7		;ブランキングセット

			movf	DBUF6,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF6		;ブランキングセット

			movf	DBUF5,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF5		;ブランキングセット

			movf	DBUF4,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF4		;ブランキングセット

			movf	DBUF3,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF3		;ブランキングセット

			movf	DBUF2,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF2		;ブランキングセット

			movf	DBUF1,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF1		;ブランキングセット

			return				;DBUF0はゼロブランキングしない



;
;			表示桁位置調整サブルーチン
;			データバッファへの準備ルーチンから呼ばれる事を想定
;
;			指定表示桁数になるまでバッファのデータを右シフトする
;			余った左側桁は「0」に書換える
;			はみ出た下位桁は破棄される
;
;		入力          DBUFx   調整処理するデータバッファ
;                   colum   設定表示桁数（ここでflgから設定される）
;		出力        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
			movwf	DBUF0

			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	0fh			;
			movwf	DBUF7		;ブランクセット

			decf	colw0,F
			btfss	STATUS,Z
			goto	spos01
			retlw	0h


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			ドットを表示するか否かの処理ルーチン
;
;		入力	flg
;
;		出力	DBUFx,7=0		ドット点燈無
;		出力	DBUFx,7=1		ドット点燈有
;
;		flg
;			ドット表示位置		flg=x111xxxx
;							bit4=1	2,5桁点燈
;							bit5=1	3,6桁点燈
;							bit6=1	4,7桁点燈
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ADDOT
			bcf		DBUF0,7		;ドット点灯ビットリセット
			bcf		DBUF1,7		;
			bcf		DBUF2,7		;
			bcf		DBUF3,7		;
			bcf		DBUF4,7		;
			bcf		DBUF5,7		;
			bcf		DBUF6,7		;
			bcf		DBUF7,7		;

			;2,5桁点燈指令チェック
			btfss	flg,4		;2,5点燈指令か？
			goto	adt2		;違うので次ビットチェック
			;2桁目点燈処理
			movf	DBUF1,W
			call	ckbrk
			iorlw	0h
			btfsc	STATUS,Z
			bsf		DBUF1,7		;2桁目ドット点燈
			;5桁目点燈処理
			movf	DBUF4,W
			call	ckbrk
			iorlw	0h
			btfsc	STATUS,Z
			bsf		DBUF4,7		;5桁目ドット点燈
			return

adt2		;3,6桁点燈指令チェック
			btfss	flg,5		;3,6点燈指令か？
			goto	adt4		;違うので次ビットチェック
			;3桁目点燈処理
			movf	DBUF2,W
			call	ckbrk
			iorlw	0h
			btfsc	STATUS,Z
			bsf		DBUF2,7		;3桁目ドット点燈
			;6桁目点燈処理
			movf	DBUF5,W
			call	ckbrk
			iorlw	0h
			btfsc	STATUS,Z
			bsf		DBUF5,7		;6桁目ドット点燈
			return

adt4		;4,7桁点燈指令チェック
			btfss	flg,6		;4,7点燈指令か？
			return				;点灯無終了
			;4桁点燈処理
			movf	DBUF3,W
			call	ckbrk
			iorlw	0h
			btfsc	STATUS,Z
			bsf		DBUF3,7		;4桁目ドット点燈
			;7桁目点燈処理
			movf	DBUF6,W
			call	ckbrk
			iorlw	0h
			btfsc	STATUS,Z
			bsf		DBUF6,7		;7桁目ドット点燈
			return


;
;		ブランキング処理済みかどうかチェック
;
;		入力	WregにDBUFxのデータ
;		出力	W=0、表示有効データあり
;			W=1、ブランク処理済み桁
;

ckbrk		;
			andlw	0fh
			movwf	tmp0
			incf	tmp0,F
			btfss	tmp0,4
			retlw	0h
			retlw	01h


;
;		8桁すべて表示させる
;		表示位置指定はできない
;		表示データは、バッファレジスタDBUFxに事前に準備必要
;
;		入力		DBUF0-DBUF7
;
;		番号は桁番号と一致、例)DBUF7=8桁目（最上位桁）
;
;	Bモード（デコード有）アドレッシング
;		上位	下位（D15-D0の16ビット)
;		x0H	xxH		NOP
;		x1H	00H-07H	0桁0-9表示（ドット無）
;		x1H	80H-87H	0桁0-9表示（ドット有）
;		x1H	*0H-*7H	*bit7=1でドット有、bit4-6は何でもいい
;		x1H	F0H-F7H	0桁0-9表示（ドット有）
;
;		x2H	**H-**H	1桁、下位7ビットは上記と同じ
;		x3H	**H-**H	2桁、下位7ビットは上記と同じ
;		x4H	**H-**H	4桁、下位7ビットは上記と同じ
;		x5H	**H-**H	5桁、下位7ビットは上記と同じ
;		x6H	**H-**H	6桁、下位7ビットは上記と同じ
;		x7H	**H-**H	7桁、下位7ビットは上記と同じ
;		x8H	**H-**H	8桁、下位7ビットは上記と同じ
;


PUTL
			movf	DBUF0,W		;桁データをレジスタに転送
			movwf	CMD0
			movlw	01h
			movwf	CMD1
			call	SEND_CMD

			movf	DBUF1,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			movf	DBUF2,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			movf	DBUF3,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			movf	DBUF4,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			movf	DBUF5,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			movf	DBUF6,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			movf	DBUF7,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			return



;
;		8桁すべてブランク表示とする
;
BRKL
			movlw	0fh			;ブランクコマンド
			movwf	CMD0
			movlw	01h
			movwf	CMD1
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			return


;
;		MAX2719　コマンドパケット送出サブルーチン
;
;		事前にCMD0、CMD1に命令コードを入れておくこと
;		CMDxのデータは保存される
;
;		RA0=DAT(DIN)
;		RA1=LAT(LOAD)
;		RA2=CLK(CLK)
;
;		パケット送出シークェンス（１コマンドパケットは１６ビット幅)
;		(1)CLK=0、LAT=0
;		(2)DATにデータビットをセット（bit15からbit0へ順番にセット)
;		(3)CLK=L→HでDATのデータビットはシフトレジスタにロードされる
;		(4)CLK=H→Lにして、(2)に行く、これを16回繰り返す
;		(5)LAT=L→Hで16bitのシフトレジスタ内容がラッチされる
;		(6)CLK=0、LAT=0にして終了
;
;		使用ワーク
;			CMD0	命令コード下位8ビット
;			CMD1	命令コード上位8ビット
;			tmp0	カウントワーク
;			tmp1	コマンドワーク

SEND_CMD
			bcf		PORTA,2		;CLK=0
			nop
			bcf		PORTA,1		;LAT=0
			movf	CMD1,W
			movwf	tmp1		;上位8ビット送出データ
			call	sendbt
			movf	CMD0,W
			movwf	tmp1		;下位8ビット送出データ
			call	sendbt

;			ラッチパルス送出して終了
			bsf		PORTA,1		;LAT=1
			call	w01u
			bcf		PORTA,1		;LAT=0
			call	w01u
			return

sendbt		;シフトレジスタに8ビット分送出、ラッチはしない
			movlw	08h			;8ビット分
			movwf	tmp0		;カウンタ
sbtlp		lslf	tmp1,F		;C=MSB
			btfsc	STATUS,C
			goto	sbt01

sbt00		;DATA=0送出
			bcf		PORTA,0		;DAT=0
			call	w01u		;ウエイト1us
			bsf		PORTA,2		;CLK=1
			call	w01u		;ウエイト1us
			bcf		PORTA,2		;CLK=0
			goto	sbten

sbt01		;DATA=1送出
			bsf		PORTA,0		;DAT=1
			call	w01u		;ウエイト1us
			bsf		PORTA,2		;CLK=1
			call	w01u		;ウエイト1us
			bcf		PORTA,2		;CLK=0

sbten		;
			decfsz	tmp0,F
			goto	sbtlp		;残ビットチェック
			call	w01u		;ウエイト1us
			return


;
;		Wregの8ビットデータを送信し、ラッチはしない
;
;		これによりMAX2719シフトレジスタの上位8ビットに転送される
;		それまでの上位8ビットデータは下位8ビットにシフトする。
;		旧下位8ビットデータはDOUTから破棄されます。
;
;		RA0=DATA(DIN)
;		RA1=LATCH(LOAD)
;		RA2=CLOCK(CLK)
;
;		使用変数	wrk0、wrk1
;

PUTW
			movwf	wrk0		;送信8ビットデータ
			movlw	08h			;8ビット分送出カウンタ
			movwf	wrk1		;カウンタ
			bcf		PORTA,2		;CLK=0
			nop
			bcf		PORTA,1		;LAT=0
ptwlp
			lslf	wrk0,F		;C=LSB
			btfsc	STATUS,C
			goto	ptw01

ptw00		;DATA=0送出
			bcf		PORTA,0		;DAT=0
			call	w01u		;ウエイト1usec
			bsf		PORTA,2		;CLK=1
			call	w01u		;ウエイト1usec
			bcf		PORTA,2		;CLK=0
			goto	ptwen

ptw01		;DATA=1送出
			bsf		PORTA,0		;DAT=1
			call	w01u		;ウエイト1usec
			bsf		PORTA,2		;CLK=1
			call	w01u		;ウエイト1usec
			bcf		PORTA,2		;CLK=0

ptwen		;
			decfsz	wrk1,F
			goto	ptwlp		;残ビット有
			return


;			ラッチパルス送出
;
;			コールするだけでOK
;
PTLAT		bsf		PORTA,1		;LAT=1
			call	w01u
			bcf		PORTA,1		;LAT=0
			call	w01u
			return


;
;			32ビットバイナリ10倍演算(符号無整数)
;
;		入力	hex(0-3)	32ビット
;		出力　hex(0-3)
;
;		使用ワーク	hexw0-3	4バイト
;

MLT32_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


			btfss	STATUS,C	;オーバーフローか？
			retlw   0h
            retlw   01h

;
;       16ビットバイナリ　4倍演算（符号無整数)
;
;       hex0,hex1=(hex0,hex1)*2
;	W=0の時、正常終了
;	W=1の時、エラー発生、演算結果は保障されない
;
MLT16_X4
			bcf		STATUS,C	;Cフラグクリア
			rlf		hex0,F		;左ローテート（下位8ビット×２）
			rlf		hex1,F		;左ローテート（上位8ビット×２）
			btfsc	STATUS,C
			retlw	01h			;演算オーバーフロー発生
			rlf		hex0,F		;左ローテート（下位8ビット×２）
			rlf		hex1,F		;左ローテート（上位8ビット×２）
			btfss	STATUS,C
			retlw	0h			;演算正常終了
			retlw	01h			;演算オーバーフロー発生


;			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			;減算正常終了


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		４バイトバイナリの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






;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン	32MHZ用
;
;		1cycle	= 0.125us
;		使用レジスタ	= cnt2,cnt3
;		BSR		=0(BANK0)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wait100u						;呼び出しも含めて、100us
								;call is 2cycles
			movlw	09h			;1
			movwf	cnt2		;1
			movlb	0h
			nop
			nop					;3
w100u		nop					;
			call	w10u		;10*9=90us(ここだけ命令ステップを数えない）
			decfsz	cnt2,F		;4*8+3=31cycles
			goto	w100u
			return				;2+5+31+2=40cycles=20us

wait50u							;呼び出しも含めて、50us
			call	wait25u
wait25u							;呼び出しも含めて、25us
			call	w10u
			call	w10u
			movlw	0bh			;5us=0.125us*40cycles
			movwf	cnt2		;
w25u		decfsz	cnt2,F		;ループ 2+10*3+2=34cycles
			goto	w25u
			nop
			nop
			return				;2+34+2+2=40cycles=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	= 32MHz(0.03125usec)
;		1cycle	= 0.125usec
;		1ms		= 0.125usec * 8000cycles
;
;			使用変数　cnt0,cnt1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
w1m
			movlb	0h
			movlw	08h
			movwf	cnt0		;
;			外周ループ
w1m0		movlw	0c7h		;199d
			movwf	cnt1		;
;			内周ループ
w1m1		nop					;
			nop					;5cycles*cnt1
			decfsz	cnt1,F		;2+5*198+4=996c/s
			goto	w1m1		;
;
			decfsz	cnt0,F		;
			goto	w1m0		;2+7*999+998=7993cycles
			nop
			return					;other=(3+4)cycles
									;Total 8000*0.125us=1ms


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			10us 基本ウェイト
;			呼び出し（call　w10u)も含めて、10usとなる。
;
;		clock	= 32MHZ(0.03125us)
;		1cycle	= 0.125us
;		10us	= 0.125us * 80cycles
;		使用変数　cnt0,cnt1
;		'goto','call','return'は2サイクル消費する
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

w10u
			movlb	0h
			movlw	018h		;18H=24
			movwf	cnt0		;
w10u0		decfsz	cnt0,F		;3*23+2=71
			goto	w10u0		;
			nop
			nop
			return				;2+3+71+2+2=80cycles

w05u
			movlw	0bh			;5us=0.125us*40cycles
			movwf	cnt0		;
w05u0		decfsz	cnt0,F		;ループ 2+3*10+2=34cycles
			goto	w05u0
			nop
			nop
			return				;2+34+2+2=40cycles=5us

w02u
			movlw	04h			;2us=0.125us*16cycles
			movwf	cnt0		;
w02u0		decfsz	cnt0,F		;2+3*3+2+1+2=16cycles
			goto	w02u0
			nop
			return				;
w01u
			nop					;1us=0.125us*8cycles
			nop					;2+4+2=8cycles
			nop
			nop
			return

;
;		ＤＤＳ演算用データ
;		演算ルーチンVer1.0用
;
;		標準バージョン（DDSクロック125.000000MHZ用）
;		DDSクロックがずれている場合、補正バージョンが必要です
;
           ORG     0800h

N0000       ;FRQ=00HZ
			DW		00h			;FRQ0
			DW		00h			;FRQ1
			DW		00H			;FRQ2
			DW		00H			;FRQ3
N0001       ;FRQ=01HZ
            DW      022h		;FRQ0
            DW      00H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0002       ;FRQ=02HZ
            DW      045H		;FRQ0
            DW      00H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0003       ;FRQ=03HZ
            DW      067H		;FRQ0
            DW      00H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0004       ;FRQ=04HZ
            DW      089H		;FRQ0
            DW      00H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0005       ;FRQ=05HZ
            DW      0ACH		;FRQ0
            DW      00H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0006       ;FRQ=06HZ
            DW      0CEH		;FRQ0
            DW      00h         ;FRQ1
            DW      00H         ;FRQ2
            DW      00H         ;FRQ3
N0007       ;FRQ=07HZ
            DW      0F1H		;FRQ0
            DW      00H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0008       ;FRQ=08HZ
            DW      013H		;FRQ0
            DW      01H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0009       ;FRQ=09HZ
            DW      035H		;FRQ0
            DW      01H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
;
N0010		;FRQ=00HZ
			DW		00h			;FRQ0
			DW		00h			;FRQ1
			DW		00H			;FRQ2
			DW		00H			;FRQ3
N0011       ;FRQ=10HZ
            DW      058H		;FRQ0
            DW      01H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0012       ;FRQ=20HZ
            DW      0AFH		;FRQ0
            DW      02H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0013       ;FRQ=30HZ
            DW      007H		;FRQ0
            DW      04H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0014       ;FRQ=40HZ
            DW      05EH		;FRQ0
            DW      05H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0015       ;FRQ=50HZ
            DW      0B6H		;FRQ0
            DW      06H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0016       ;FRQ=60HZ
            DW      0EH			;FRQ0
            DW      08H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0017       ;FRQ=70HZ
            DW      065H		;FRQ0
            DW      09H			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0018       ;FRQ=80HZ
            DW      0BDH		;FRQ0
            DW      0AH			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0019       ;FRQ=90HZ
            DW      014H		;FRQ0
            DW      0CH			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
;

N0020		;FRQ=00HZ
			DW		00h			;FRQ0
			DW		00h			;FRQ1
			DW		00H			;FRQ2
			DW		00H			;FRQ3
N0021       ;FRQ=100HZ
            DW      06CH		;FRQ0
            DW      0DH			;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0022       ;FRQ=200HZ
            DW      0D8H		;FRQ0
            DW      01AH		;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0023       ;FRQ=300HZ
            DW      044H		;FRQ0
            DW      028H		;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0024       ;FRQ=400HZ
            DW      0B0H		;FRQ0
            DW      035H		;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0025       ;FRQ=500HZ
            DW      01CH		;FRQ0
            DW      043H		;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0026       ;FRQ=600HZ
            DW      088H		;FRQ0
            DW      050H		;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0027       ;FRQ=700HZ
            DW      0F4H		;FRQ0
            DW      05DH		;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0028       ;FRQ=800HZ
            DW      060H		;FRQ0
            DW      06BH		;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
N0029       ;FRQ=900HZ
            DW      0CCH		;FRQ0
            DW      078H		;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
;
K0030		;FRQ=00HZ
			DW		00h			;FRQ0
			DW		00h			;FRQ1
			DW		00H			;FRQ2
			DW		00H			;FRQ3
K0031       ;FRQ=1KHZ
            DW      038H		;FRQ0
            DW      086H		;FRQ1
            DW      00H			;FRQ2
            DW      00H			;FRQ3
K0032       ;FRQ=2KHZ
            DW      06FH		;FRQ0
            DW      0CH			;FRQ1
            DW      01H			;FRQ2
            DW      00H			;FRQ3
K0033       ;FRQ=3KHZ
            DW      0A7H		;FRQ0
            DW      092H		;FRQ1
            DW      01H			;FRQ2
            DW      00H			;FRQ3
K0034       ;FRQ=4KHZ
            DW      0DFH		;FRQ0
            DW      018H		;FRQ1
            DW      02H			;FRQ2
            DW      00H			;FRQ3
K0035       ;FRQ=5KHZ
            DW      017H		;FRQ0
            DW      09FH		;FRQ1
            DW      02H			;FRQ2
            DW      00H			;FRQ3
K0036       ;FRQ=6KHZ
            DW      04EH		;FRQ0
            DW      025H		;FRQ1
            DW      03H			;FRQ2
            DW      00H			;FRQ3
K0037       ;FRQ=7KHZ
            DW      086H		;FRQ0
            DW      0ABH		;FRQ1
            DW      03H			;FRQ2
            DW      00H			;FRQ3
K0038       ;FRQ=8KHZ
            DW      0BEH		;FRQ0
            DW      031H		;FRQ1
            DW      04H			;FRQ2
            DW      00H			;FRQ3
K0039       ;FRQ=9KHZ
            DW      0F6H		;FRQ0
            DW      0B7H		;FRQ1
            DW      04H			;FRQ2
            DW      00H			;FRQ3
;
K0040		;FRQ=00HZ
			DW		00h			;FRQ0
			DW		00h			;FRQ1
			DW		00H			;FRQ2
			DW		00H			;FRQ3
K0041       ;FRQ=10KHZ
			DW		02DH		;FRQ0
			DW		03EH		;FRQ1
			DW		05H			;FRQ2
			DW		00H			;FRQ3
K0042       ;FRQ=20KHZ
			DW		05BH		;FRQ0
			DW		07CH		;FRQ1
			DW		0AH			;FRQ2
			DW		00H			;FRQ3
K0043       ;FRQ=30KHZ
			DW		088H		;FRQ0
			DW		0BAH		;FRQ1
			DW		0FH			;FRQ2
			DW		00H			;FRQ3
K0044       ;FRQ=40KHZ
			DW		0B6H		;FRQ0
			DW		0F8H		;FRQ1
			DW		014H		;FRQ2
			DW		00H			;FRQ3
K0045       ;FRQ=50KHZ
			DW		0E3H		;FRQ0
			DW		036H		;FRQ1
			DW		01AH		;FRQ2
			DW		00H			;FRQ3
K0046       ;FRQ=60KHZ
			DW		010H		;FRQ0
			DW		075H		;FRQ1
			DW		01FH		;FRQ2
			DW		00H			;FRQ3
K0047       ;FRQ=70KHZ
			DW		03EH		;FRQ0
			DW		0B3H		;FRQ1
			DW		024H		;FRQ2
			DW		00H			;FRQ3
K0048       ;FRQ=80KHZ
			DW		06BH		;FRQ0
			DW		0F1H		;FRQ1
			DW		029H		;FRQ2
			DW		00H			;FRQ3
K0049       ;FRQ=90KHZ
			DW		098H		;FRQ0
			DW		02FH		;FRQ1
			DW		02FH		;FRQ2
			DW		00H			;FRQ3
;
K0050		;FRQ=00HZ
			DW		00h			;FRQ0
			DW		00h			;FRQ1
			DW		00H			;FRQ2
			DW		00H			;FRQ3
K0051       ;FRQ=100KHZ
			DW		0C6H		;FRQ0
			DW		06DH		;FRQ1
			DW		034H		;FRQ2
			DW		00H			;FRQ3
K0052       ;FRQ=200KHZ
			DW		08CH		;FRQ0
			DW		0DBH		;FRQ1
			DW		068H		;FRQ2
			DW		00H			;FRQ3
K0053		;FRQ=300KHZ
			DW		052H		;FRQ0
			DW		049H		;FRQ1
			DW		09DH		;FRQ2
			DW		00H			;FRQ3
K0054		;FRQ=400KHZ
			DW		017H		;FRQ0
			DW		0B7H		;FRQ1
			DW		0D1H		;FRQ2
			DW		00H			;FRQ3
K0055		;FRQ=500KHZ
			DW		0DDH		;FRQ0
			DW		024H		;FRQ1
			DW		006H		;FRQ2
			DW		01H			;FRQ3
K0056		;FRQ=600KHZ
			DW		0A3H		;FRQ0
			DW		092H		;FRQ1
			DW		03AH		;FRQ2
			DW		01H			;FRQ3
K0057		;FRQ=700KHZ
			DW		069H		;FRQ0
			DW		000H		;FRQ1
			DW		06FH		;FRQ2
			DW		01H			;FRQ3
K0058		;FRQ=800KHZ
			DW		02FH		;FRQ0
			DW		06EH		;FRQ1
			DW		0A3H		;FRQ2
			DW		01H			;FRQ3
K0059		;FRQ=900KHZ
			DW		0F5H		;FRQ0
			DW		0DBH		;FRQ1
			DW		0D7H		;FRQ2
			DW		01H			;FRQ3
;
M0060		;FRQ=00HZ
			DW		00h			;FRQ0
			DW		00h			;FRQ1
			DW		00H			;FRQ2
			DW		00H			;FRQ3
M0061		;FRQ=1MHZ
			DW		0BAH		;FRQ0
			DW		049H		;FRQ1
			DW		00CH		;FRQ2
			DW		02H			;FRQ3
M0062		;FRQ=2MHZ
			DW		075H		;FRQ0
			DW		093H		;FRQ1
			DW		018H		;FRQ2
			DW		04H			;FRQ3
M0063		;FRQ=3MHZ
			DW		02FH		;FRQ0
			DW		0DDH		;FRQ1
			DW		024H		;FRQ2
			DW		06H			;FRQ3
M0064		;FRQ=4MHZ
			DW		0E9H		;FRQ0
			DW		026H		;FRQ1
			DW		031H		;FRQ2
			DW		08H			;FRQ3
M0065		;FRQ=5MHZ
			DW		0A4H		;FRQ0
			DW		070H		;FRQ1
			DW		03DH		;FRQ2
			DW		0AH			;FRQ3
M0066		;FRQ=6MHZ
			DW		05EH		;FRQ0
			DW		0BAH		;FRQ1
			DW		049H		;FRQ2
			DW		0CH			;FRQ3
M0067		;FRQ=7MHZ
			DW		019H		;FRQ0
			DW		004H		;FRQ1
			DW		056H		;FRQ2
			DW		0EH			;FRQ3
M0068		;FRQ=8MHZ
			DW		0D3H		;FRQ0
			DW		04DH		;FRQ1
			DW		062H		;FRQ2
			DW		010H		;FRQ3
M0069		;FRQ=9MHZ
			DW		08DH		;FRQ0
			DW		097H		;FRQ1
			DW		06EH		;FRQ2
			DW		012H		;FRQ3
;
M0070		;FRQ=00HZ
			DW		00h			;FRQ0
			DW		00h			;FRQ1
			DW		00H			;FRQ2
			DW		00H			;FRQ3
M0071		;FRQ=10MHZ
			DW		048H		;FRQ0
			DW		0E1H		;FRQ1
			DW		07AH		;FRQ2
			DW		014H		;FRQ3
M0072		;FRQ=20MHZ
			DW		08FH		;FRQ0
			DW		0C2H		;FRQ1
			DW		0F5H		;FRQ2
			DW		028H		;FRQ3
M0073		;FRQ=30MHZ
			DW		0D7H		;FRQ0
			DW		0A3H		;FRQ1
			DW		070H		;FRQ2
			DW		03DH		;FRQ3
M0074		;FRQ=40MHZ
			DW		01FH		;FRQ0
			DW		085H		;FRQ1
			DW		0EBH		;FRQ2
			DW		051H		;FRQ3
M0075		;FRQ=50MHZ
			DW		066H		;FRQ0
			DW		066H		;FRQ1
			DW		066H		;FRQ2
			DW		066H		;FRQ3
M0076		;FRQ=60MHZ
			DW		0AEH		;FRQ0
			DW		047H		;FRQ1
			DW		0E1H		;FRQ2
			DW		07AH		;FRQ3
M0077		;FRQ=70MHZ
			DW		0F6H		;FRQ0
			DW		028H		;FRQ1
			DW		05CH		;FRQ2
			DW		08FH		;FRQ3
M0078		;FRQ=80MHZ
			DW		03DH		;FRQ0
			DW		00AH		;FRQ1
			DW		0D7H		;FRQ2
			DW		0A3H		;FRQ3
M0079		;FRQ=90MHZ
			DW		085H		;FRQ0
			DW		0EBH		;FRQ1
			DW		051H		;FRQ2
			DW		0B8H		;FRQ3
;
            END
