;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		ＰＩＣ１６Ｆ１７０９ＢＡＳＩＣ　ＤＦＲ９０
;
;							2020年01月	Ver2	JA0QON
;
;	基本的なサブルーチンを設定済み
;		DFR0090asm Ver2
;		wait Ver32.1a
;
;	ディスプレイ
;		DFR0090 SPI 8桁7セグLEDモジュール
;		SPIデフォルト ポート
;		RA0=DATA
;		RA1=LATCH
;		RA2=CLOCK
;		ポート変更はマクロ定義で行う
;
;		PIC16F1709 32MHZ 内部発振
;
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

		LIST	P=PIC16F1709
		INCLUDE	P16F1709.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)マニュアル52ページ
;					設定
;bit13		LVP		0	低電圧プログラミング設定
;						1=有効
;			_____		0=無効、高電圧必要
;bit12		DEBUG	1	インサーキット･デバッガ モード設定
;						1=無効
;						0=有効、RA0-1をデバッガに使用
;bit11				0	Unimplemented
;bit10		BORV	0	ブラウンアウト･リセット電圧選択ビット（Vbor参照)
;						1=低電圧で動作
;						0=高電圧で動作
;bit9		STVREN	0	スタック･オーバーフロー･リセット設定
;						1=有効
;						0=無効
;bit8		PLLEN	0	PLL設定
;						1=4xPLL有効
;						0=4xPLL無効
;bit7       ZCDDIS  1   ZCDディセーブルビット
;                       1=ZCDを無効にする、ZCDCONで有効可
;                       0=ZCDを常に有効にする
;bit6-3					Unimplemented:read as 1
;bit2		PPS1WAY 0   PPSLOCKビット単方向セット･イネーブルビット
;                       1=ロック解除シーケンスを実行後に1度だけ解除できる
;                       0=ロック解除シーケンスを実行すると何度でも解除できる
;bit1-0		WRT		11	フラッシュメモリ プロテクション設定
;						11=無効
;						10=0h-1FFh有効、200H?1FFFHはPMCONで制御可
;						01=0h-FFFh有効、1000H?1FFFHはPMCONで制御可
;						00=0h-1FFFh有効、PMCON制御不可
;
;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  0  1  1
;
;
	__CONFIG _CONFIG2,	B'0001000011111011'



;		ワークエリア定義
;
;		BANK0	20h-7Fh
;
;		使用していないのもあります
;

;ウエイトルーチン内専用ワーク
cnt0		equ		020H		;時間待ちルーチン用専用ワーク
cnt1		equ		021H
cnt2		equ		022H
cnt3		equ		023H
;汎用ローカルワーク
tmp0		equ		024H		;サブルーチン内限定汎用ワーク
tmp1		equ		025H		;そのルーチン内でCALL命令は許さない
tmp2		equ		026H
tmp3		equ		027H
;汎用中域ワーク
wrk0		equ		028H        ;１下層のみCALL命令を許す
wrk1		equ		029H
wrk2		equ		02AH
wrk3		equ		02BH
;演算用ワーク
hex0		equ		030H		;演算用広域汎用ワーク
hex1		equ		031H		;32bit演算の入出力に使用
hex2		equ		032H		;
hex3		equ		033H		;
hexw0		equ		034H		;
hexw1		equ		035H		;
hexw2		equ		036H		;
hexw3		equ		037H		;
;機能専用広域ワーク
FLG			equ		040H		;8桁7セグLED表示設定フラグ
FLG1		equ		041H		;
DSPM		equ		042H		;ディスプレイモード スイッチフラグ
DSP_ADR		equ		043H		;仮想VRAMアドレス
ASC0		equ		044H		;文字列変換用ワーク
ASC1		equ		045H
BSLW0		equ		046H
BSLW1		equ		047H
BSLSP		equ		048H
MSAD0		equ		049H		;文字列指定用広域ワーク下位8bit
MSAD1		equ		04AH		;文字列指定用広域ワーク上位8bit
icw0		equ		04BH		;I2C制御用ワーク
icw1		equ		04CH
;演算用ワーク
div0		equ		038H		;
div1		equ		039H		;
div2		equ		03AH		;
div3		equ		03BH		;
divw0		equ		03CH		;
divw1		equ		03DH		;
divw2		equ		03EH		;
divw3		equ		03FH		;
hexd		equ		040H		;
;可変ウエイト用ワーク
delay0		equ		041H
delay1		equ		042H
;ロータリーエンコーダ専用ワーク
REDAT       equ     060h        ;ロータリーエンコーダ・ビットデータ
RESP0       equ     061h        ;変化ステップ量 下位バイト
RESP1		equ		062h		;
RESP2		equ		063h		;
rew0        equ     064h        ;専用ワーク
rew1        equ     065h        ;専用ワーク
;メインループ用広域ワーク
FDA0        equ     066H		;32ビット基本動作用
FDA1        equ     067H		;
FDA2		equ     068H		;
FDA3		equ     069H		;
FDB0		equ		06AH		;32ビット副動作用
FDB1		equ		06BH		;
FDB2		equ		06CH		;
FDB3		equ		06EH		;
;Wレジスタ退避用ワーク
BKWG		equ		070H

;
;7セグLED専用広域ワーク
;
DBUF0		equ		0A0H		;SPI送信データ編集用バッファ１
DBUF1		equ		0A1H
DBUF2		equ		0A2H
DBUF3		equ		0A3H
DBUF4		equ		0A4H
DBUF5		equ		0A5H
DBUF6		equ		0A6H
DBUF7		equ		0A7H
;
DBUF8		equ		0A8H		;SPI送信データ編集用バッファ２
DBUF9		equ		0A9H
DBUF10		equ		0AAH
DBUF11		equ		0ABH
DBUF12		equ		0ACH
DBUF13		equ		0ADH
DBUF14		equ		0AEH
DBUF15		equ		0AFH
;
VRAM0		equ		0B0H		;仮想VRAM1
VRAM1		equ		0B1H
VRAM2		equ		0B2H
VRAM3		equ		0B3H
VRAM4		equ		0B4H
VRAM5		equ		0B5H
VRAM6		equ		0B6H
VRAM7		equ		0B7H
VRAM8		equ		0B8H
VRAM9		equ		0B9H
VRAM10		equ		0BAH
VRAM11		equ		0BBH
VRAM12		equ		0BCH
VRAM13		equ		0BDH
VRAM14		equ		0BEH
VRAM15		equ		0BFH
;
VRAM16		equ		0C0H		;仮想VRAM2
VRAM17		equ		0C1H
VRAM18		equ		0C2H
VRAM19		equ		0C3H
VRAM20		equ		0C4H
VRAM21		equ		0C5H
VRAM22		equ		0C6H
VRAM23		equ		0C7H
VRAM24		equ		0C8H
VRAM25		equ		0C9H
VRAM26		equ		0CAH
VRAM27		equ		0CBH
VRAM28		equ		0CCH
VRAM29		equ		0CDH
VRAM30		equ		0CEH
VRAM31		equ		0CFH
;
SEGLED		equ		0D0H		;接続7セグLED数、4-16
dsw			equ		0D1H		;各種処理ワーク
colum		equ		0D2H		;桁処理ワーク
colw0		equ		0D3H		;桁位置処理ワーク
colw1		equ		0D4H		;
b1wk0		equ		0D5H		;BANK1用汎用ワーク
b1wk1		equ		0D6H		;
;BCD_B1用専用ワーク
digit12     equ     0D8H        ;BCD変換出力1，2桁
digit34     equ     0D9H		;BCD変換出力3，4桁
digit56     equ     0DAH        ;BCD変換出力5，6桁
digit78     equ     0DBH        ;BCD変換出力7，8桁
digit9A     equ     0DCH        ;BCD変換出力9，10桁
bcdw0		equ		0DDH		;BCD補正処理ワーク
bcdw1		equ		0DEH
shift		equ		0DFH
;FSRレジスタ退避用専用ワーク
fswk0		equ		0E0H
fswk1		equ		0E1H
fswk2		equ		0E2H
fswk3		equ		0E3H
;BSRレジスタ退避用専用ワーク
bswk		equ		0E4H

;SPIポート定義
SPI_DATH	MACRO				;SPI_DATAをHにする
			movf	BSR,W
			movlb	01H
			movwf	bswk		;BSRレジスタ退避用(BANK1に存在)
			movlb	02H
			bsf		LATA,0		;DATA PORT=1
			movlb	01H
			movf	bswk,W
			movwf	BSR
			ENDM
SPI_DATL	MACRO				;SPI_DATAをLにする
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movlb	02H
			bcf		LATA,0		;DATA PORT=0
			movlb	01H
			movf	bswk,W
			movwf	BSR
			ENDM
SPI_LATH	MACRO				;SPI_LATCHをHにする
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movlb	02H
			bsf		LATA,1		;LATCH PORT=1
			movlb	01H
			movf	bswk,W
			movwf	BSR
			ENDM
SPI_LATL	MACRO				;SPI_LATCHをLにする
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movlb	02H
			bcf		LATA,1		;LATCH PORT=0
			movlb	01H
			movf	bswk,W
			movwf	BSR
			ENDM
SPI_CLKH	MACRO
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movlb	02H
			bsf		LATA,2		;CLOCK PORT=1
			movlb	01H
			movf	bswk,W
			movwf	BSR
			ENDM
SPI_CLKL	MACRO
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movlb	02H
			bcf		LATA,2		;CLOCK PORT=0
			movlb	01H
			movf	bswk,W
			movwf	BSR
			ENDM
;LEDポート定義
LED1ON		MACRO
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movlb	02H
			bsf		LATA,4
			movlb	01H
			movf	bswk,W
			movwf	BSR
			ENDM
LED1OFF		MACRO
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movlb	02H
			bcf		LATA,4
			movlb	01H
			movf	bswk,W
			movwf	BSR
			ENDM
LED2ON		MACRO
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movlb	02H
			bsf		LATA,5
			movlb	01H
			movf	bswk,W
			movwf	BSR
			ENDM
LED2OFF		MACRO
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movlb	02H
			bcf		LATA,5
			movlb	01H
			movf	bswk,W
			movwf	BSR
			ENDM


;
			ORG		0h			;リセットベクタ
			goto	init
			ORG		04h			;割り込みベクタ

;
;		割込み処理ルーチン
;
;		割込み発生から割込みベクタまで3サイクル程度（同期割込み）
;		FSRxはコアレジスタなので、自動で PUSH-POPされる
;		よって、割り込み終了後、元の設定値に戻る
;
INT
;
INTOUT
;
			retfie				;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC16F1709　イニシャライズ
;
;		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は選択の余地が無い。
;
;		PORTA(BANK0　00CH）
;			bit5	RA5		GPI/O,CLKIN
;			bit4	RA4		GPI/O,AN3
;			bit3	RA3		Degital Input Only
;			bit2	RA2		GPI/O,AN2,DAC1OUT2
;			bit1	RA1		GPI/O,AN1
;			bit0	RA0		GPI/O,AN0,DAC1OUT
;
;		PORTB(BANK0　00DH）
;			bit7	RB7		GPI/O
;			bit6	RB6		GPI/O,SCL
;			bit5	RB5		GPI/O,AN11,OPA1IN+
;			bit4	RB4		GPI/O,AN10,OPA1IN-,SDA
;			bit0-3	Unimplemented(read=0)
;
;		PORTC(BANK0　00EH）
;			bit7	RC7		GPI/O,AN9,OPA2IN+
;			bit6	RC6		GPI/O,AN8,OPA2IN-
;			bit5	RC5		GPI/O
;			bit4	RC4		GPI/O
;			bit3	RC3		GPI/O,AN7,OPA2OUT
;			bit2	RC2		GPI/O,AN6,OPA1OUT
;			bit1	RC1		GPI/O,AN5
;			bit0	RC0		GPI/O,AN4
;
;		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)
;			bit4-7	RA5-4	1=入力、0=出力
;			bit0-3	Unimplemented(read=0)
;
;		TRISC(BANK1　08EH)
;			bit0-7	RC0-7	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)
;			bit4-7	RB4-7	出力データ保持
;			bit0-3	Unimplemented(read=0)
;		（このラッチデータはTRISBレジスタ設定で各ピンに反映される）
;
;		LATC(BANK2　10EH)　データラッチレジスタ
;			bit0-7	RC0-7	出力データ保持
;		（このラッチデータはTRISCレジスタ設定で各ピンに反映される）
;
;
;		ANSELA(BANK3　18CH)
;			bit7-5	Unimplemented(read=0)
;			bit4	ANSA3/RA4	アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			bit3	Unimplemented(read=0)
;			bit2-0	ANSA2-0/RA2-0アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			＊デフォルトでは、すべて1(アナログ入力)となっている
;
;		ANSELB(BANK3 18DH)
;			bit7-6	Unimplemented(read=0)
;			bit5-4	ANSB5-4/RB5-4	アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			bit3-0	Unimplemented(read=0)
;			＊デフォルトでは、すべて1(アナログ入力)となっている
;
;		ANSELC(BANK3　18EH)
;			bit0-7	ANSC5-0/RC5-0アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			＊デフォルトでは、すべて1(アナログ入力)となっている
;
;		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電圧選択ビット
;							11 = FVR出力　4x(4.096V)#2
;							10 = FVR出力　2x(2.048V)#2
;							01 = FVR出力 1x(1.024V)
;							00 = FVR出力OFF
;			bit1-0	ADFVR	ADCへのFVR電圧選択ビット
;							11 = FVR出力　4x(4.096V)#2
;							10 = FVR出力　2x(2.048V)#2
;							01 = FVR出力 1x(1.024V)
;							00 = FVR出力OFF
;
;							#1)16F1705/16F1709では常に"1"
;							#2)FVR電圧出力はVDDを超える事は出来ない
;
;		DAC1CON0レジスタ(BANK2　118H)
;		bit7	DACEN	DAC1イネーブルビット　P156 Fig17-1参照
;						1=許可
;						0=禁止
;		bit6	Unimplemented(read=0)
;		bit5	DAC1OE1	DAC1電圧出力1イネーブルビット
;						1=DAC1出力電圧をDACOUT1ピンにも出力される
;						0=DAC1出力電圧をDACOUT1ピンから切り離す
;		bit4	DAC1OE2	DAC1電圧出力2イネーブルビット
;						1=DAC1出力電圧をDACOUT2ピンにも出力される
;						0=DAC1出力電圧をDACOUT2ピンから切り離す
;		bit3-2	DAC1PSS	DAC1 正入力接続選択ビット
;						00 = VDD
;						01 = VREF+ピン(RA1)
;						10 = FVRバッファ2出力
;						11 = 使用不可
;		bit1	Un		Read as '0'
;       bit0    DAC1NSS DAC1 負入力選択ビット
;                       1=VREF-ピン(RA0)
;                       0=GND
;
;		ADCON0レジスタ（BANK1　09DH)
;		bit7	Unimplemented(read=0)
;		bit6-2	CHSx	アナログチャンネル指定
;						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
;						01000 = Reserved.No channel connected
;						    ・
;						11011 = Reserved.No channel connected
;						11100 = FVRバッファ２出力
;						11101 = 温度表示器
;						11110 = DAC1出力
;						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-2	Unimplemented(read=0)
;		bit1-0	ADPREF	参照正電圧指定
;						00 = VDD
;						01 = Reserved
;						10 = 外部VREF+ (RA1)
;						11 = 内部FVRモジュール
;
;       オペアンプ制御レジスタ(OPA1,OPA2)
;       OPAxCON(BANK10 0511H,0515H)
;		bit7	OPAxEN	OPAxイネーブルビット
;						1=有効
;						0=無効
;		bit6	OPAxSP  オペアンプ速度/消費電力選択ビット
;                       1=高GBWPモードで動作
;                       0=低GBWPモードで動作
;		bit5	Unimplemented(read=0)
;		bit4	OPAxUG	オペアンプ ユニティゲイン選択ビット
;						1=OPA出力を反転入力に接続。
;                         OPAxIN-ピンは汎用I/Oとして使用できる
;						0=反転入力をOPAxIN-ピンに接続する
;		bit3-2	Unimplemented(read=0)
;		bit1-0	OPAxCH	非反転チャンネル選択ビット
;						11 = 非反転入力にFVRバッファ2出力を接続
;						10 = 非反転入力にDAC_outputを接続
;						11 = 非反転入力にOPAxIN+を接続
;
;		OPTION_REG(BANK1　095H)
;					_____
;			bit7=1	WPUEN	プルアップ グローバル設定ビット
;							0=有効,1=無効
;			bit6=0	INTEDG	INTピン割り込み信号エッジ
;							1=↑
;							0=↓
;			bit5=0	TMR0CS	TMR0クロックソース選択ビット
;							1=外部入力RA2/T0CKI
;							0=内部システムクロック(Fosc/4)
;			bit4=1	TMR0SE	TMR0ソースエッジ選択ビット
;							1=RA4/T0CKIピンが↑の時インクリメント
;							0=RA4/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
;
;		INTCONレジスタ(#2)　コア　00BH
;			bit7	GIE		全割込制御
;							1許可、0禁止
;			bit6	PEIE	周辺装置割込制御
;							1許可、0禁止
;			bit5	TMR0IE	タイマ0割込許可制御
;							1許可、0禁止
;			bit4	INTE	RA2外部割込許可制御
;							1許可、0禁止
;			bit3	IOCIE	I/Oポート状態変化割込許可制御
;							1許可、0禁止
;			bit2	TMR0IF	タイマ0割込みフラグ(#1)
;							1オーバーフロー
;							0オーバーフローなし
;			bit1	INTF	RA2外部割込みフラグ(#1)
;							1割込み発生
;							0割込み発生なし
;			bit0	IOCIF	I/Oポート状態変化割込フラグ(#1)
;							1割込発生
;							0割込無
;
;							#1)ソフトウエアでリセット必要
;							#2)初期値=0なので、初期設定で0設定する必要は無い
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

init
;			各レジスタ初期設定(PIC16F1709)
			movlb	0h			;BANK0
			movlw	000h		;00000000B
			movwf	INTCON		;全割込みOFF
			movlb	0h			;BANK0
			clrf	PORTA		;Init PORT
			clrf	PORTB
			clrf	PORTC
			movlb   02h         ;BANK2
			clrf	LATA
			clrf	LATB
			clrf	LATC
			;クロック
			movlb	01H			;BANK１
			movlw	0F0H		;1111000B
			movwf	OSCCON		;内部発振器は8MHZに設定
								;4xPLL=ON
			;TMR0およびプルアップ
			movlw	083H		;10000011b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↓
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/16にセット
			;10ビットADC
;			movlw	020h		;0010000B
;			movwf	ADCON1		;左詰め、基準電圧VDD
								;ADCクロック　Fosc/32=1us(32MHZ)
			;I/Oポート(TRIS→BANK1、ANSEL→BANK3)
			movlw	00H			;00000000B
			movwf	TRISA		;RA0-5出力
			movlw	0FFH
			movwf	TRISB
			movlw	03FH		;00000111B
			movwf	TRISC		;RC0-7入力
			movlb	03H			;BANK3
			movlw	00H			;00000000B
			movwf	ANSELA		;RA0-5=デジタル
			movlw	00H
			movwf	ANSELB
			movlw	00H			;00000000B
			movwf	ANSELC		;RC0-5=デジタル

			;FVR(BANK2)
;			movlb	02h			;BANK2
;			movlw	088h		;10001000B
;			movwf	FVRCON		;FVRイネーブル
								;DACとCPSに2.048V
								;ADCにはOFF

;			8ビットDAC(BANK2)
;			movlw	088h		;10001000B
;			movwf	DAC1CON0	;DAC1イネーブル
;			movlb	0h			;基準電圧はFVR
								;DACOUTピン切り離し

;			オペアンプ1(BANK10)
;			movlb	0ah			;BANK10
;			movlw	0d2h		;11010010B
;			movwf	OPA1CON		;OPA1イネーブル
;			movlb	0h			;高GBWPモード、ユニティゲイン
								;IN+=DAC1_OUTPUT
;			注意	オペアンプ出力ピンはアナログ入力に設定する事

;			レジスタ初期設定終了
			clrf	BSR


;			初期値セット
			;SPI接続LED数の設定
			movlb	01H
			movlw	010H
			movwf	SEGLED		;7セグLED数
			movlb	00H
			;
			clrf	hex0
			clrf	hex1
			clrf	hex2
			clrf	hex3
;
;		メインループ
;
;

coldst
			movlw	04FH		;FLG=01001111B
			movwf	FLG			;8桁、ゼロブランキングON
								;4,7桁ドット有
			call	SET_SMODE
			clrf	DSP_ADR
			call	CLR_ALL
			LED2ON
			call	wait1s
			LED2OFF
			call	wait100m
;			goto	mloop2
			goto	mloop3
mloop0		;Aモード動作試験
			LED1ON
			movlw	04EH
			movwf	hex0
			movlw	061H
			movwf	hex1
			movlw	0BCH
			movwf	hex2
			movlw	00H
			movwf	hex3
			;
			call	BCD_B1		;BCDに変換
			call	SET_SBUF8	;データ整理
			call	XFER_SR8L	;モジュールに送信
			call	wait1s
			call	wait1s
			call	wait1s
			call	wait1s
			call	wait1s
			LED1OFF
			call	wait500m
			;
			LED1ON
			movlw	041H
			movwf	hex0
			movlw	028H
			movwf	hex1
			movlw	0AFH
			movwf	hex2
			movlw	01H
			movwf	hex3		;28.256.321MHZ
			;
			call	BCD_B1		;BCDに変換
			call	SET_SBUF8	;データ整理
			call	XFER_SR8L	;モジュールに送信
			call	wait1s
			call	wait1s
			call	wait1s
			call	wait1s
			call	wait1s
			LED1OFF
			call	wait500m
			;
			LED1ON
			movlw	05EH
			movwf	hex0
			movlw	0FCH
			movwf	hex1
			movlw	0D7H
			movwf	hex2
			movlw	00H
			movwf	hex3		;14.154.846MHZ
			;
			call	BCD_B1		;BCDに変換
			call	SET_SBUF8	;データ整理
			call	XFER_SR8L	;モジュールに送信
			call	wait1s
			call	wait1s
			call	wait1s
			call	wait1s
			call	wait1s
			LED1OFF
			call	wait500m
			;
			goto	mloop0

;
;
mloop1		movlw	064h
			movwf	hexw0
			clrf	hexw1
			clrf	hexw2
			clrf	hexw3
			call	ADD32B
			call	BCD_B1		;BCDに変換
			call	SET_SBUF8	;データ整理
			call	XFER_SR8L	;モジュールに送信
			call	wait100m
			LED1OFF
;			call	wait1s
			goto	mloop1

;
;		PUTC動作試験
;
mloop2
			LED1ON
			movlw	0
			movwf	DSP_ADR

			LED1ON
			movlw	'.'			;1C
			call	PUTC
			LED1OFF
			call	wait1s

			movlw	'1'			;2C
			call	PUTC
			LED1OFF
			call	wait1s
			LED1ON
			movlw	'2'			;3C
			call	PUTC
			LED1OFF
			call	wait1s
			LED1ON
			movlw	'3'			;4C
			call	PUTC
			LED1OFF
			call	wait1s

			LED1ON
			movlw	'E'			;5C
			call	PUTC
			LED1OFF
			call	wait1s
			LED1ON
			movlw	'F'			;6C
			call	PUTC
			LED1OFF
			call	wait1s
			LED1ON
			movlw	'.'			;7C
			call	PUTC
			LED1OFF
			call	wait1s
			LED1ON
			movlw	'P'			;8C
			call	PUTC
			LED1OFF
			call	wait1s
			;
			LED1ON
			movlw	'o'			;9C
			call	PUTC
			LED1OFF
			call	wait1s

			call	LED_ERR
			call	wait1s

			LED1ON
			movlw	'U'			;10C
			call	PUTC
			LED1OFF
			call	wait1s
			LED1ON
			movlw	'u'			;11C
			call	PUTC
			LED1OFF
			call	wait1s
			LED1ON
			movlw	'4'			;12C
			call	PUTC
			LED1OFF
			call	wait1s
			LED1ON
			movlw	'5'			;13C
			call	PUTC
			LED1OFF
			call	wait1s
			LED1ON
			movlw	'6'			;14C
			call	PUTC
			LED1OFF
			call	wait1s
			LED1ON
			movlw	'n'			;15C
			call	PUTC
			LED1OFF
			call	wait1s
			;
			call	CLR_ALL
			call	wait1s
			goto	mloop2

mloop3		;PUTL　TEST
			LED1ON
			movlw	0H
			movwf	DSP_ADR
			movlw	LOW MSG01
			movwf	MSAD0
			movlw	HIGH MSG01
			movwf	MSAD1
			call	PUTL
			LED1OFF
			call	wait1s
			call	wait1s
			call	wait1s
			call	wait1s
			call	wait1s
			call	CLR_ALL
			;
			LED1ON
			movlw	0H
			movwf	DSP_ADR
			movlw	LOW MSG02
			movwf	MSAD0
			movlw	HIGH MSG02
			movwf	MSAD1
			call	PUTL
			LED1OFF
			call	wait1s
			call	wait1s
			call	wait1s
			call	wait1s
			call	wait1s
			call	CLR_ALL
			goto	mloop3

MSG01		DT	"_CA 1.258709"
			DW	0				;EndCord
MSG02		DT	"89756.12345PLC"
			DW	0


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		DFR0090制御プログラム ライブラリ
;
;		ASMバージョン	v2		JA0QON
;
;		Ａモード：	v1と同じ使用方法
;					32bit数値を8桁7セグLEDに表示
;					現在の所、DFR0090を1ユニット対応です
;					サブルーチン名がv1とは変更されているので注意(機能は同じ)
;		Ｂモード：	v2で新設されたモードでLCDでの使用方法を模しています
;					文字コードを指定の仮想VRAMアドレスに表示します
;					DFR0090を2ユニット接続分(16桁)まで対応します
;
;		使用方法は当局ホームページを参照
;		あるいは、各サブルーチンのコメントを参照
;
;		SPIデフォルト ポート
;		RA0=DATA
;		RA1=LATCH
;		RA2=CLOCK
;		ポート変更はマクロ定義で行う
;
;		注意点
;		専用の各種バッファ、変数、ワーク領域はRAMレジスタBANK1を使用
;		接続7セグLED数は変数「SEGLED」で指定(BANK1)、
;		指定数値は8桁(08H)或いは16桁(10H)
;		仮想VRAMは「DSP_ADR」で指定(BANK0)、0-15まで指定可能
;		DSP_ADR=0で最上位桁、DSP_ADR=8あるいはDSP_ADR=15で最下位桁
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			動作モードセット設定(Ａモード専用)
;
;	入力制御フラグ	FLG　この内容は保存される
;	　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桁点燈
;	　警告LED		FLG=1xxxxxxx　LED点灯する
;					FLG=0xxxxxxx　LED点灯しない
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SET_SMODE
			movf	FLG,W
			movlb	01H			;BANK01
			andlw	07H
			movwf	colum
			movlb	0H			;BANK0
			iorlw	0H
			btfss	STATUS,Z
			bra		stmd0
			movlw	07H			;桁指定無いので8桁にする
			movlb	01H			;BANK01
			movwf	colum
			movlb	0H			;BANK0
stmd0		btfss	FLG,7		;オーバーフローLED制御
			goto	stmd1
			LED2ON
			return

stmd1
			LED2OFF				;LED OFF
			return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		Ａモード専用データ処理サブルーチン
;		8桁BCDを制御フラグに従い処理、データバッファに出力
;		第2ユニット以降は一切考慮しない
;
;	入力データ	5バイト(10桁分)BCD　この内容は保存される
;				digit12
;				digit34
;				digit56
;				digit78
;				digit9A（表示されない）
;
;	表示桁		colum　この内容は保存される
;	
;	入力制御フラグ	FLG　この内容は保存される
;		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桁点燈
;	警告LED			FLG=1xxxxxxx　LED点灯する
;					FLG=0xxxxxxx　LED点灯しない
;
;	上位桁から書き込みます
;
;		DBUFx　	各桁バッファ データフォーマット
;			bit0-3	表示する数値データ	bit0-3=0H-FH
;			bit4	ドット表示			0=OFF、1=ON
;			bit5	ブランク			0=OFF、1=ON
;			bit6	予約
;			bit7　　予約
;			*桁データは専用サブルーチンにて、転送ビットデータに変換されます
;
;	使用ワーク	bufw0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SET_SBUF8
;			表示する数値データを全バッファに書込み
			movlb	01H
			swapf	digit78,W
			andlw	0FH
			movwf	DBUF7		;8桁目に数値データ書込み
;			movlb	00H

;			movlb	01H
			movf	digit78,W
			andlw	0FH
			movlb	01H
			movwf	DBUF6		;7桁目に数値データ書込み
;			movlb	00H

;			movlb	01H
			swapf	digit56,W
			andlw	0FH
			movlb	01H
			movwf	DBUF5		;6桁目に数値データ書込み
;			movlb	00H

;			movlb	01H
			movf	digit56,W
			andlw	0FH
			movlb	01H
			movwf	DBUF4		;5桁目に数値データ書込み
;			movlb	00H

;			movlb	01H
			swapf	digit34,W
			andlw	0FH
			movlb	01H
			movwf	DBUF3		;4桁目に数値データ書込み
;			movlb	00H

;			movlb	01H
			movf	digit34,W
			andlw	0FH
			movlb	01H
			movwf	DBUF2		;3桁目に数値データ書込み
;			movlb	00H

;			movlb	01H
			swapf	digit12,W
			andlw	0FH
			movlb	01H
			movwf	DBUF1		;2桁目に数値データ書込み
			movlb	00H

			btfss	FLG,7
			goto	setb01		;ノーマル処理
;			オーバーフロー表示処理
			movlw	0EH			;最下位桁に`E`を表示
			movlb	01H
			movwf	DBUF0
			movlb	00H
			goto	setb02

setb01
			movlb	01H
			movf	digit12,W
			andlw	0FH
			movwf	DBUF0		;1桁目に数値データ書込み
			movlb	00H

;			その他指定処理を全バッファに行う
;			呼び出し順番によっては上手く機能しなくなるので注意
setb02		call	ZBK			;ゼロブランキング処理
			call	SPOS		;指定表示桁数処理
			call	ADDOT		;ドット表示処理

;			オーバーフローチェック
;			警告LEDを発光させる、7セグ表示は残り8桁分を表示
			movlb	01H
			movf	digit9A,W	;ここにデータがある場合O.Fとなる
			movlb	00H
			iorlw	0H
			btfss	STATUS,Z
			bra		sbfer
			LED2OFF			
			return
sbfer		LED2ON				;オーバーフロー発生
			retlw	0FFH

;
;			ゼロブランキング処理
;
;		入力	DBUFx　（数値データ設定済であること)
;				FLG	ビット3　ZBKフラグ
;		使用ワーク	無
;
ZBK
			btfss	FLG,3		;ZBK命令フラグチェック
			return				;命令無いので終了
			movlb	01H
			movf	DBUF7,W		;
			movlb	00H
			andlw	0FH			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlb	01H
			bsf		DBUF7,5		;ブランキングセット

			movf	DBUF6,W		;
			movlb	00H
			andlw	0FH			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlb	01H
			bsf		DBUF6,5		;ブランキングセット

			movf	DBUF5,W		;
			movlb	00H
			andlw	0FH			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlb	01H
			bsf		DBUF5,5		;ブランキングセット

			movf	DBUF4,W		;
			movlb	00H
			andlw	0FH			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlb	01H
			bsf		DBUF4,5		;ブランキングセット

			movf	DBUF3,W		;
			movlb	00H
			andlw	0FH			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlb	01H
			bsf		DBUF3,5		;ブランキングセット

			movf	DBUF2,W		;
			movlb	00H
			andlw	0FH			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlb	01H
			bsf		DBUF2,5		;ブランキングセット

			movf	DBUF1,W		;
			movlb	00H
			andlw	0FH			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlb	01H
			bsf		DBUF1,5		;ブランキングセット
			movlb	00H
			return				;DBUF0はゼロブランキングしない



;
;			表示桁位置調整サブルーチン
;			データバッファへの準備ルーチンから呼ばれる事を想定
;
;			指定表示桁数になるまでバッファのデータを右シフトする
;			余った左側桁は「0」に書換える
;			はみ出た下位桁は破棄される
;
;		入力		DBUFx	調整処理するデータバッファ
;					colum	設定表示桁数
;		出力		DBUFx	調整処理されたデータバッファ
;		使用ワーク	colw0	桁位置ワーク
;

SPOS
			movlw	07H
			movlb	01H			;BANK01
			subwf	colum,W		;バイトシフト回数設定
			movlb	00H
			btfsc	STATUS,C	;ボローなら処理開始
			return				;表示桁変更無で終了
			movlb	01H			;BANK01
			movf	colum,W		;バイトシフト回数設定
			sublw	07H			;W=07-W
			movwf	colw0
;			movlb	00H			;BANK0
spos01		;1バイト右シフト
;			movlb	01H			;BANK01
			movf	DBUF1,W		;DB1→DB0
			movlb	0H			;BANK0
			btfsc	FLG,7
			call	sposer
			movlb	01H			;BANK01
			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
			movlb	0H			;BANK0
			retlw	0h

;			W_REGの下位4ビットをEHにする
sposer
			andlw	0F0H
			iorlw	0EH
			movlb	0H			;BANK0
			return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			ドットを表示するか否かの処理ルーチン
;
;		入力	FLG		
;
;		出力	DBUFx,4=0		ドット点燈無
;		出力	DBUFx,4=1		ドット点燈有
;
;		FLG
;		ドット表示位置		flg=x111xxxx
;							bit4=1	2,5桁点燈
;							bit5=1	3,6桁点燈
;							bit6=1	4,7桁点燈
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ADDOT
			movlb	01H			;BANK01
			bcf		DBUF0,4		;ドット点灯ビットリセット
			bcf		DBUF1,4		;
			bcf		DBUF2,4		;
			bcf		DBUF3,4		;
			bcf		DBUF4,4		;
			bcf		DBUF5,4		;
			bcf		DBUF6,4		;
			bcf		DBUF7,4		;
			movlb	0H			;BANK0

			;2,5桁点燈指令チェック
			btfss	FLG,4		;2,5点燈指令か？
			goto	adt2		;違うので次ビットチェック
			;2,5桁目点燈処理
			movlb	01H			;BANK01
			bsf		DBUF1,4		;2桁目ドット点燈
			bsf		DBUF4,4		;5桁目ドット点燈
			movlb	0H			;BANK0
			return

adt2		;3,6桁点燈指令チェック
			movlb	0H			;BANK0
			btfss	FLG,5		;3,6点燈指令か？
			goto	adt4		;違うので次ビットチェック
			;3桁目点燈処理
			movlb	01H			;BANK01
			bsf		DBUF2,4		;3桁目ドット点燈
			bsf		DBUF5,4		;6桁目ドット点燈
			movlb	0H			;BANK0
			return

adt4		;4,7桁点燈指令チェック			
			btfss	FLG,6		;4,7点燈指令か？
			return				;点灯無終了
			;4桁点燈処理
			movlb	01H			;BANK01
			bsf		DBUF3,4		;4桁目ドット点燈
			bsf		DBUF6,4		;7桁目ドット点燈
			movlb	0H			;BANK0
			return

;
;		上位8桁を表示させる
;		表示位置指定はできない
;		表示データは、ワークレジスタDBUFxに事前に準備
;
;		入力		DBUF0-DBUF7
;
;		番号は桁番号と一致、例)DBUF7=8桁目（最上位桁）
;

XFER_SR8L
			movlb	01H			;BANK01
			movf	DBUF0,W		;桁データをレジスタに転送
			movlb	0H			;BANK0
			call	XFER_SR1	;ラッチはしない
			movlb	01H			;BANK01
			movf	DBUF1,W
			movlb	0H			;BANK0
			call	XFER_SR1
			movlb	01H			;BANK01
			movf	DBUF2,W
			movlb	0H			;BANK0
			call	XFER_SR1
			movlb	01H			;BANK01
			movf	DBUF3,W
			movlb	0H			;BANK0
			call	XFER_SR1
			movlb	01H			;BANK01
			movf	DBUF4,W
			movlb	0H			;BANK0
			call	XFER_SR1
			movlb	01H			;BANK01
			movf	DBUF5,W
			movlb	0H			;BANK0
			call	XFER_SR1
			movlb	01H			;BANK01
			movf	DBUF6,W
			movlb	0H			;BANK0
			call	XFER_SR1
			movlb	01H			;BANK01
			movf	DBUF7,W
			movlb	0H			;BANK0
			call	XFER_SR1
			
			call	PTLAT		;ラッチする=新データ表示する
			movlb	0H			;BANK0
			return


;
;		Wregの1ケタ数値データを最上位桁に表示(ラッチ)させる
;		旧データはシフトしていき、最下位桁は破棄されます。
;
;		使用変数	wrk0、wrk1
;
XFER_SR1L
			call	CHG_CODE
			movwf	wrk1		;中間コード
			andlw	07FH
			call	SEG_DATA	;中間コードをセグ・データに変換
			movwf	wrk0		;SEG_DATA
			btfsc	wrk1,7		;DOT
			bcf		wrk0,0
			movf	wrk0,W
			;A/B共用Wregのセグメントデータを最上位シフトレジスタに送信・ラッチ
XFER_WL
			call	XFER_W
;			ラッチパルス送出
;			コールするだけでOK
PTLAT
			SPI_LATH
			call	wait01u
			SPI_LATL
			call	wait01u
			return

;
;		Wregの1ケタデータを最上位桁シフトレジスタに転送するがラッチしない
;		7セグ表示は旧データのままで、更新されたデータは表示されない
;		レジスタの旧データはシフトしていき、最下位桁分は破棄されます。
;		バイトデータのLSBから順にSPIバスに出力していく
;
;		使用変数	wrk0、wrk1
;
XFER_SR1	;Aモード用
			call	CHG_CODE	;旧データを中間コードに変換
			movwf	wrk1		;中間コード
			andlw	07FH
			call	SEG_DATA	;中間コードをセグ・データに変換
			movwf	wrk0		;SEG_DATA
			btfsc	wrk1,7		;DOT
			bcf		wrk0,0
			movf	wrk0,W
			;A/B共用Wregのセグメントデータを最上位シフトレジスタに送信
XFER_W		movwf	wrk0		;セグメントビットデータ
			movlw	08H
			movwf	wrk1		;カウンタ
			SPI_CLKL
			SPI_LATL
xfrlp
			lsrf	wrk0,F		;右シフト、C=LSB
			btfsc	STATUS,C
			goto	xfr01
			
xfr00		;DATA=0送出
			SPI_DATL
			call	wait01u		;ウエイト1us
			SPI_CLKH
			call	wait01u		;ウエイト1us
			SPI_CLKL
			goto	xfren
			
xfr01		;DATA=1送出
			SPI_DATH
			call	wait01u		;ウエイト1us
			SPI_CLKH
			call	wait01u		;ウエイト1us
			SPI_CLKL

xfren							;
			decfsz	wrk1
			goto	xfrlp
			return				;ラッチしないで終了


;
;		全表示およびバッファをクリア
;
;		DBUFは07FH
;		VRAM:DATは020H
;		VRAM:DOTは00H
;		DSP_ADRは00H
;
CLR_ALL
			call	PUSH_F0
			clrf	DSP_ADR		;仮想VRAMポインタをホーム位置へ
			;DBUF処理
			movlb	01H			;BANK1
			movf	SEGLED,W	;接続LED数
			movwf	colw0
			movlw	LOW DBUF0	;DBUF下位アドレス
			movwf	FSR0L		;FSR0に設定
			movlw	HIGH DBUF0
			movwf	FSR0H
			movlw	07FH		;DBUF用ブランクデータ
			;
CLRB01		movwi	FSR0++		;DBUF処理ループ
			decf	colw0,F
			btfss	STATUS,Z
			bra		CLRB01
			;VRAM処理
			movf	SEGLED,W	;接続LED数
			movwf	colw0
			movlw	LOW VRAM0
			movwf	FSR0L
			movlw	HIGH VRAM0
			movwf	FSR0H
CLRB02
			movlw	020H		;VRAMx:DATに20H
			movwi	FSR0++
			movlw	00H
			movwi	FSR0++		;VRAMx:DOTに00H
			decf	colw0,F
			btfss	STATUS,Z
			bra		CLRB02
			;HC595にブランクデータを送出
			movlb	00H
			call	POP_F0
			call	CLR_SR16L
			return



;
;		１桁分のブランクデータをHC595シフトレジスタに送信する
;		表示（ラッチ）はしない
;
CLR_SR1
;			ブランクデータ転送準備
			movlw	08H			;8
			movwf	wrk0
			SPI_CLKL
			call	wait01u
			SPI_LATL
			call	wait01u
			SPI_DATH
			call	wait01u
;			データ転送ループ
c1r01
			SPI_CLKH
			call	wait01u
			SPI_CLKL
			call	wait01u
			decfsz	wrk0
			goto	c1r01
			return

;
;		8桁分のブランクデータをHC595に送信・ラッチします
;
CLR_SR8L
;			ブランクデータ送信準備
			movlw	08H			;8×8
			movwf	wrk1
;			データ転送ループ
c8c01
			SPI_CLKH
			call	wait01u
			SPI_CLKL
			call	wait01u
			decfsz	wrk1
			goto	c8c01
;			終了処理（ラッチする）
			bra		c16c02

;
;		16桁分のブランクデータをHC595に送信・ラッチします
;
CLR_SR16L
;			ブランクデータ送信準備
			movlw	010H			;
			movwf	wrk1
;			データ転送ループ
c16c01
			call	CLR_SR1
			decfsz	wrk1
			goto	c16c01
;			終了処理（ラッチする）
c16c02		call	wait01u
			SPI_LATH
			call	wait01u
			SPI_LATL
			call	wait01u
			SPI_DATL
			return




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		Ａモード桁データを中間コードに変換
;			Aモード用サブルーチン
;
;	入力		Wレジスタに桁データ(DBUFx)を入れてコール
;
;	出力		Wレジスタ値に対応する中間コードを出力
;				
;		DBUFx　	Aモード各桁バッファ データフォーマット
;			bit0-3	表示する数値データ	bit0-3=0H-FH
;			bit4	ドット表示			0=OFF、1=ON
;			bit5	ブランク			0=OFF、1=ON
;			bit6	予約
;			bit7　　予約
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CHG_CODE
			
			movwf	tmp0		;Wreg保存
			movlw	0FH
			andwf	tmp0,W		;数値データ抽出
			movwf	tmp1		;0-9はこのまま
			;
chgca		movlw	0AH
			xorwf	tmp1,W
			btfss	STATUS,Z
			bra		chgcb
			movlw	10H			;'A'
			movwf	tmp1
			bra		chgdt

chgcb		movlw	0BH
			xorwf	tmp1,W
			btfss	STATUS,Z
			bra		chgcc
			movlw	011H		;'b'
			movwf	tmp1
			bra		chgdt

chgcc		movlw	0CH
			xorwf	tmp1,W
			btfss	STATUS,Z
			bra		chgcd
			movlw	012H		;'C'
			movwf	tmp1
			bra		chgdt

chgcd		movlw	0DH
			xorwf	tmp1,W
			btfss	STATUS,Z
			bra		chgce
			movlw	14H			;'d'
			movwf	tmp1
			bra		chgdt

chgce		movlw	0EH
			xorwf	tmp1,W
			btfss	STATUS,Z
			bra		chgcf
			movlw	15H			;'E'
			movwf	tmp1
			bra		chgdt

chgcf		movlw	0FH
			xorwf	tmp1,W
			btfss	STATUS,Z
			bra		chgdt
			movlw	16H			;'F'
			movwf	tmp1
;			bra		chgdt

chgdt		;DOT
			btfss	tmp0,4		;DOTフラグ
			bra		chgbr
			bsf		tmp1,7
;			bra		chgbr

chgbr		btfss	tmp0,5		;ブランク制御フラグチェック
			bra		chgen		;
			movlw	0AH			;sp
			movwf	tmp1
;			bra		chgen
chgen
			movf	tmp1,W
			return

;
;		ＨＣ５９５接続７セグＬＥＤのセグメントデータを生成
;		
;
;	入力		Wreg	中間コード(XC8版と同じ)
;						現在は00H-24Hまでで、それ以上のNOはFFHを返す
;	出力		Wreg	セグメントデータ(XC8版データと同じ)
;						ドット用データ(bit0)は関与しない
;						これをLSBから順番にSPI_DATAポートに出力する事
;				
;	SIポート	データビット=1	Qx=1　セグメント発光OFF
;				データビット=0	Qx=0　セグメント発光ON
;				ビットデータはQAから順に入り、QHへデータがシフトしていく。
;				よって、8回データ取り込みで全セグメント分設定となる。
;				また、QHからシフトしたデータは次のQAへシフトする。
;				よって、データは最上位桁（左側）から順に最下位桁へシフトしていく。
;
;	ＨＣ５９５モジュール内セグメント
;
;		a				QA=a(bit7)	QE=e(bit3)
;	f		b			QB=b(bit6)	QF=f(bit2)
;		g				QC=c(bit5)	QG=g(bit1)
;	e		c			QD=d(bit4)	QH=Dp(bit0)
;		d		Dp		
;
SEG_DATA
			movwf	tmp0	;中間コードを一時保存
			movlw	026H	;使用可能中間コード総数+1
			subwf	tmp0,W	;F-W=W 8bit減算(補数加算)
			btfsc	STATUS,C;キャリーフラグチェック
			retlw	0FFH	;F>=Wならば(C=1)FFHを返す
			movf	tmp0,W	;中間コードをWregに戻す
			brw				;F<Wならば(C=0)下記各種値を返す
			;
			retlw	003H	;Code00	'0'
			retlw	09FH	;Code01	'1'
			retlw	025H	;Code02	'2'
			retlw	00DH	;Code03	'3'
			retlw	099H	;Code04	'4'
			retlw	049H	;Code05	'5'
			retlw	041H	;Code06	'6'
			retlw	01FH	;Code07	'7'
			retlw	001H	;Code08	'8'
			retlw	019H	;Code09	'9'
			;
			retlw	0FFH	;Code0A	' 'SP
			retlw	0FDH	;Code0B	'-'
			retlw	0FEH	;Code0C	'.'Dot
			retlw	035H	;Code0D	'?'
			retlw	005H	;Code0E	'@'
			retlw	0EFH	;Code0F	'_'
			;
			retlw	011H	;Code10	'A'
			retlw	0C1H	;Code11	'b'
			retlw	063H	;Code12	'C'
			retlw	0E5H	;Code13	'c'
			retlw	085H	;Code14	'd'
			retlw	061H	;Code15	'E'
			retlw	071H	;Code16	'F'
			retlw	091H	;Code17	'H'
			retlw	0D1H	;Code18	'h'
			retlw	087H	;Code19	'J'
			retlw	0E3H	;Code1A	'L'
			retlw	0D5H	;Code1B	'n'
			retlw	0C5H	;Code1C	'o'
			retlw	031H	;Code1D	'P'
			retlw	083H	;Code1E	'U'
			retlw	0C7H	;Code1F	'u'
			;
			;以下のデータは変更の可能性あり
			retlw	07FH	;Code20	'~'Up bar
			retlw	0E7H	;Code21	' '左下L
			retlw	0CFH	;Code22	' '右下逆L
			retlw	0F5H	;Code23	'r'
			retlw	0D7H	;Code24	' '下小11
			retlw	093H	;Code25	' '大11
			;使用不可
			retlw	0FFH	;Code7E	' 'Other
			retlw	0FFH	;Code7F	' 'NULL


;
;		指定の位置から文字列を表示
;			Bモード用
;
;	表示開始位置指定	DSP_ADR
;	表示文字列アドレス	MSAD0(LOW),MSAD1(HIGH)
;						エンドコードは00H
;
;

PUTL
			movf	MSAD0,W		;FSR0にMSG先頭アドレスセット
			movwf	FSR0L		;
			movf	MSAD1,W
			movwf	FSR0H
			;
PTL01		moviw	FSR0++
			iorlw	00H
			btfsc	STATUS,Z
			bra		PTLEN
			;
			call	WRTD		;VRAMに書き込み
			movlw	010H		;表示可能16桁を超えた場合の処理
			subwf	DSP_ADR,W	;F-W=W 8bit減算(補数加算)
			btfsc	STATUS,C	;キャリーフラグチェック
			bra		PTLEN			;F>=Wならば(C=1)終了
			bra		PTL01		;C=0(ボロー）ならば継続
			;
PTLEN		
			call	COMPL		;DBUFに中間コード生成
			call	XFER_SRA	;DBUFの中間コードをセグデータに変換・送信
			retlw	00H

;
;		Wregの文字コードを指定のアドレスに表示
;
;		入力	Wreg文字コード
;				DSP_ADR表示位置
;				DSP_ADRはルーチン内でインクリメントされる
;				ただし、'.'(DOT)はインクリメントされない
;

PUTC
			call	WRTD
			call	COMPL		;
			call	XFER_SRA
			return
;
;		Wregの文字コードを指定のVRAMアドレスに書き込む
;		シフトレジスタには送信はされない
;
;		入力	Wreg文字コード
;				DSP_ADR表示位置
;				DSP_ADRはルーチン内でインクリメントされる
;				ただし、'.'(DOT)はインクリメントされない
;
WRTD
			movlb	01H			;BANK1
			movwf	dsw			;表示文字コード保存
			movlb	0H			;BANK0
			call	PUSH_F0
			movlw	LOW VRAM0	;FSR0にVRAM先頭アドレスセット
			movwf	FSR0L		;VRAM:B0H-CFH(BANK1)
			movlw	HIGH VRAM0
			movwf	FSR0H
			;DSP_ADRをVRAMアドレス(DAT:DOT)とする
			lslf	DSP_ADR,W
			movlb	01H			;BANK1
			movwf	colw0		;colw0=DATバイトを相対ポイント
			movwf	colw1
			incf	colw1,F		;colw1=DOTバイトを相対ポイント
			movlw	'.'			;dotコード
			xorwf	dsw,W		;表示文字コードがdot?
			movlb	0H			;BANK0
			btfss	STATUS,Z	;dsw='.' then Z=1
			bra		ndot
			;Dot表示処理
			movlb	01H
			movlw	0H
			iorwf	colw0,W		;dotアドレスが先頭？
			btfss	STATUS,Z
			bra		dotnt
dottop
			movlb	00H
			movlw	'.'
			movwf	INDF0		;この時点でFSR0=VRAM先頭アドレス
			incf	DSP_ADR,F
			bra		wren
			;dot表示が先頭ではない
dotnt		decf	colw0,W		;前の桁位置のDOTxを表示させる
			movlb	0H			;BANK0
			movwf	hexw0
			clrf	hexw1		;hexw0-1=1つ前のVRAMアドレスのDOTアドレス
			movf	FSR0L,W
			movwf	hex0
			movf	FSR0H,W
			movwf	hex1		;hex0-1=FSR0(先頭)+colw0
			call	ADD16B
			movf	hex0,W
			movwf	FSR0L
			movf	hex1,W
			movwf	FSR0H		;FSR0=1つ前のVRAMアドレスのDOTアドレスをポイント
			;
			movlw	'.'
			movwf	INDF0		;DOTx='.'
			bra		wren
ndot		;表示文字コードはdot以外
			movf	FSR0L,W
			movwf	hex0
			movf	FSR0H,W
			movwf	hex1		;hex0-1=FSR0
			;
			movlb	01H			;BANK1
			movf	colw0,W
			movlb	0H			;BANK0
			movwf	hexw0
			clrf	hexw1		;hexw0-1=DATアドレス
			call	ADD16B
			movf	hex0,W
			movwf	FSR0L
			movf	hex1,W
			movwf	FSR0H		;FSR0=VRAMアドレスのDATアドレスをポイント
			;
			movlb	01H			;BANK1
			movf	dsw,W		;表示文字コードをリロード
			movlb	0H
			movwi	FSR0++		;DATx=文字コード
			movlw	0H
			movwf	INDF0		;DOTx=0
			incf	DSP_ADR,F
			;
wren		call	POP_F0		;FSR0
			return

;
;		バッファの文字コードを中間コードに変換
;
;		VRAMの文字コードを中間コードに変換
;		その中間コードはDBUFに出力
;		VRAMの文字コードは保存される
;		処理桁数は「SEGLED」で指定
;
;中間コードは00H-7FHでbit7はDOTフラグとして使用
;DATxは中間コードに変換DOTxに'.'があると、その中間コードにDOTフラグを付与
;
;
COMPL
			call	PUSH_FS
			movlw	LOW VRAM0	;FSR0にVRAMアドレス先頭セット
			movwf	FSR0L
			movlw	HIGH VRAM0
			movwf	FSR0H
			;
			movlw	LOW DBUF0	;FSR1にDBUFアドレス先頭セット
			movwf	FSR1L
			movlw	HIGH DBUF0
			movwf	FSR1H
			;
			movlb	01H			;BANK1
			clrf	colw0		;アクセスカウンタ
			movf	SEGLED,W	;存在LED桁数(8,16)
			movwf	colw1		;
			;
comlp		moviw	FSR0++
			movwf	b1wk0		;VRAM:DAT取得(文字コード)
			moviw	FSR0++
			movwf	b1wk1		;VRAM:DOT取得
			;
			movf	b1wk0,W
			movlb	0H			;BANK0
			call	MD_CODE		;VRAM:DAT(文字コード)を中間コードに変換
			movlb	01H			;BANK1
			movwf	b1wk0		;中間コードを一旦保存
			;
			movlw	'.'
			xorwf	b1wk1,W		;VRAM:DOTが'.'かチェック
			btfsc	STATUS,Z
			bsf		b1wk0,7		;取得中間コードにDOTフラグ付与
			;
			movf	b1wk0,W
			movwi	FSR1++		;処理済み中間コードをDBUFに保存
			incf	colw0,F		;アクセスカウンタ
			movf	colw1,W		;カウンタ停止条件(存在LED桁数)
			xorwf	colw0,W		;colw0==colw1 ?
			btfss	STATUS,Z
			bra		comlp		;ループ
			movlb	00H			;BANK0
			call	POP_FS
			return


;
;		文字コードを中間コードに変換
;
;	入出力	Wreg
;	中間コード出力
;			00H - 09H 有効数字文字
;			0AH= SP
;			0BH= -
;			0CH= .
;			0DH= ?
;			0EH= @
;			0FH= _
;			10H - 1FH その他有効文字
;			7EH=無効文字コード
;			7FH=終了コード 文字コード00Hの検出
;			bit7=1その桁の文字と共にDOTを発光させる
;			bit7=0その桁の文字のみでDOTは発光させない
;
MD_CODE
			movwf	tmp0		;表示文字コード保存
			;
			movlw	020H		;SP
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	0AH			;
			;
			movlw	02DH		;-
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	0BH
			;
			;
			movlw	02EH		;DOT
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	0CH			;
			;
			movlw	030H		;0
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	00H			;
			;
			movlw	031H		;1
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	01H			;
			;
			movlw	032H		;2
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	02H			;
			;
			movlw	033H		;3
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	03H			;
			;
			movlw	034H		;4
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	04H			;
			;
			movlw	035H		;5
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	05H			;
			;
			movlw	036H		;6
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	06H			;
			;
			movlw	037H		;7
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	07H			;
			;
			movlw	038H		;8
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	08H			;
			;
			movlw	039H		;9
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	09H			;
			;
			movlw	03FH		;?
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	0DH			;
			;
			movlw	040H		;@
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	0EH			;
			;
			movlw	041H		;A
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	010H		;
			;
			movlw	061H		;a
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	010H		;a=A
			;
			movlw	042H		;B
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	011H		;B=b
			;
			movlw	062H		;b
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	011H		;
			;
			movlw	043H		;C
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	012H		;
			;
			movlw	063H		;c
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	013H		;
			;
			movlw	044H		;D
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	014H		;D=d
			;
			movlw	064H		;d
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	014H		;
			;
			movlw	045H		;E
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	015H		;
			;
			movlw	065H		;e
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	015H		;e=E
			;
			movlw	046H		;F
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	016H		;
			;
			movlw	066H		;f
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	016H		;f=F
			;
			movlw	048H		;H
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	017H		;
			;
			movlw	068H		;h
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	018H		;
			;
			movlw	04AH		;J
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	019H		;
			;
			movlw	06AH		;j
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	019H		;j=J
			;
			movlw	04CH		;L
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	01AH		;
			;
			movlw	06CH		;l
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	01AH		;l=L
			;
			movlw	04EH		;N
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	01BH		;N=n
			;
			movlw	06EH		;n
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	01BH		;
			;
			movlw	04FH		;O
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	01CH		;
			;
			movlw	06FH		;o
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	01CH		;
			;
			movlw	050H		;P
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	01DH		;
			;
			movlw	070H		;p
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	01DH		;p=P
			;
			movlw	052H		;r
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	023H		;
			;
			movlw	072H		;r
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	023H		;
			;
			movlw	055H		;U
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	01EH		;
			;
			movlw	075H		;u
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	01FH		;
			;
			movlw	05FH		;_
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	0FH			;
			;
			movlw	07EH		;~
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	020H		;
			;
			movlw	00H			;NULL
			xorwf	tmp0,W
			btfsc	STATUS,Z
			retlw	07FH		;
			;
			retlw	07EH		;other

;
;		7セグＬＥＤへ送信・表示
;
;
;	LED_BUFの中間コードをセグメントデータに変換、
;	HC595シフトレジスタにすべて送信後、ラッチさせる
;	8 or 16桁分の処理を一気に行う
;
XFER_SRA
			call	PUSH_F1
			;
			movlb	01H
			movf	SEGLED,W
			movwf	b1wk0
			movlw	08H
			xorwf	b1wk0,W
			btfss	STATUS,Z
			bra		led16c
led8c		movlw	LOW DBUF7	;FSR1にDBUF後尾アドレスセット
			movwf	FSR1L
			movlw	HIGH DBUF7
			movwf	FSR1H
			bra		xflp0
led16c		movlw	010H
			xorwf	b1wk0,W
			btfss	STATUS,Z
			bra		ledcerr
			;
			movlw	LOW DBUF15	;FSR1にDBUF後尾アドレスセット
			movwf	FSR1L
			movlw	HIGH DBUF15
			movwf	FSR1H
			bra		xflp0
			;
ledcerr
			call	LED_ERR
			call	wait1s
			retlw	0FFH
			;
xflp0		movlb	01H			;BANK1
			movf	SEGLED,W	;接続LED数
			movwf	colw0		;DBUFアクセスカウンタ
			;
xflp1		moviw	FSR1--		;W=(FSR1)
			movwf	b1wk0		;中間コード取得
			movlw	07FH
			andwf	b1wk0,W		;中間コードのDOTフラグ除去
			movlb	0H			;BANK0
			call	SEG_DATA	;中間コード対応セグメントデータ取得
			movlb	01H			;BANK1
			movwf	b1wk1		;セグメントデータ保存
			btfsc	b1wk0,7		;DOTフラグチェック
			bcf		b1wk1,0		;セグメントのドットビットセット(bit0=0,ON)
			movf	b1wk1,W
			movlb	0H			;BANK0
			call	XFER_W		;シフトレジスタへ1バイト送信(Wreg)
			movlb	01H			;BANK1
			;
			decf	colw0,F		;桁カウンタ
			btfss	STATUS,Z
			bra		xflp1		;loop
			movlb	0H
			call	POP_F1
			call	PTLAT		;ラッチ
			return

;
;		最上位桁に”Ｅｒｒ”表示
;		VRAMやDBUFは変更しない
;		直接セグメントデータを送信・ラッチ
;
LED_ERR
			movlw	0DH
			movwf	tmp0
lerr1
			movlw	0FFH		;スペース
			call	XFER_W
			decfsz	tmp0,F
			bra		lerr1

			movlw	'r'			;'r'
			call	MD_CODE
			call	SEG_DATA
			call	XFER_W

			movlw	'r'			;'r'
			call	MD_CODE
			call	SEG_DATA
			call	XFER_W

			movlw	'E'			;'E'
			call	MD_CODE
			call	SEG_DATA
			call	XFER_W

			call	PTLAT
			return


;
;	ＦＳＲレジスタ退避・復元
;
;	呼び出し元のBSRは保存される
;	fswk0-fswk3
;
PUSH_F0
			movf	BSR,W
			movlb	01H
			movwf	bswk		;BSR保存
			movf	FSR0L,W
			movwf	fswk0		;FSR0保存
			movf	FSR0H,W
			movwf	fswk1
			movf	bswk,W		;CALL時のBSR戻し
			movwf	BSR
			return
POP_F0
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movf	fswk0,W
			movwf	FSR0L
			movf	fswk1,W
			movwf	FSR0H
			movf	bswk,W
			movwf	BSR
			movlb	0H
			return
PUSH_F1
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movf	FSR1L,W
			movwf	fswk2
			movf	FSR1H,W
			movwf	fswk3
			movf	bswk,W
			movwf	BSR
			movlb	0H
			return
POP_F1
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movf	fswk2,W
			movwf	FSR1L
			movf	fswk3,W
			movwf	FSR1H
			movf	bswk,W
			movwf	BSR
			movlb	0H
			return
PUSH_FS
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movf	FSR0L,W
			movwf	fswk0
			movf	FSR0H,W
			movwf	fswk1
			movf	FSR1L,W
			movwf	fswk2
			movf	FSR1H,W
			movwf	fswk3
			movf	bswk,W
			movwf	BSR
			movlb	0H
			return
POP_FS
			movf	BSR,W
			movlb	01H
			movwf	bswk
			movf	fswk0,W
			movwf	FSR0L
			movf	fswk1,W
			movwf	FSR0H
			movf	fswk2,W
			movwf	FSR1L
			movf	fswk3,W
			movwf	FSR1H
			movf	bswk,W
			movwf	BSR
			movlb	0H
			return
;
PUSHW
			movwf	BKWG		;Wreg保存
			return
;
POPW		movf	BKWG,W
			return




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		４バイトバイナリの10桁BCDへの変換
;		MicroChip社のアプリケーションノートより
;			Ver.B1
;
;		入力		4バイト(32ビット)16進バイナリ
;				hex0
;				hex1
;				hex2
;				hex3
;
;		出力		5バイト(10桁)ＢＣＤ
;				digit12(BANK1)
;				digit34(BANK1)
;				digit56(BANK1)
;				gidit78(BANK1)
;				gidit9A(BANK1)
;
;		使用ワーク
;				hexw0			入力データ保存用
;				hexw1
;				hexw2
;				hexw3
;				shift(BANK1)	シフトカウンタ
;				bcdw0(BANK1)	補正処理ワーク
;				bcdw1(BANK1)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCD_B1
			bcf		STATUS,C	;キャリーリセット
			movlw	020H		;シフトカウンタ初期化
			movlb	01H
			movwf	shift		;4バイト分32回の指定
			clrf	digit12		;BCDデータエリア初期化
			clrf	digit34
			clrf	digit56
			clrf	digit78
			clrf	digit9A
			movlb	0H			;BANK0
			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
			movlb	01H			;BANK01
			rlf		digit12,F	;BCDデータ左シフト
			rlf		digit34,F
			rlf		digit56,F
			rlf		digit78,F
			rlf		digit9A,F
			decfsz	shift,F		;
			goto	adjst		;BCD調整処理へ
			movlb	0H			;BANK0
			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
			movlb	0H			;BANK0
			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



;
;		数字コードを数値に変換
;
;		入出力はWreg
;		数字コード以外はFFHに変換
;
ASCTONUM
			movwf	wrk0
			movlw	030h		;'0'
			subwf	wrk0,W		;W=wrk0-W
			btfss	STATUS,C
			bra		NUMERR		;wrk0<W
			movwf	wrk1
			sublw	039h		;W=39H('9')-W　？？
			btfss	STATUS,C
			bra		NUMERR
			movf	wrk1,W
			return
NUMERR		retlw	0FFh

;
;		16進8bitバイナリ数値を文字コードに変換
;
;		入力	Wreg:00H-FFH
;		出力	ASC0:下位4bit分の文字コード'0-9'、'A-F'
;				ASC1:上位4bit分の文字コード'0-9'、'A-F'
;
;		使用ワーク	wrk0,wrk1
;
NUTOASC
			movwf	wrk0		;Wreg退避
			andlw	0FH
			movwf	wrk1		;下位4bit分のみ
			movlw	0Ah
			subwf	wrk1,W		;W=F-W
			btfsc	STATUS,C	;/borrow
			bra		NUA1
NUA0		movf	wrk1,W
			addlw	030h
			movwf	ASC0
			bra		NUA2
NUA1;		下位4bit A-F
			movf	wrk1,W
			addlw	037h
			movwf	ASC0

NUA2		;上位4bitチェック
			swapf	wrk0,W
			andlw	0FH
			movwf	wrk1		;上位4bit分のみ
			movlw	0Ah
			subwf	wrk1,W		;W=F-W
			btfsc	STATUS,C	;/borrow
			bra		NUA4
NUA3		movf	wrk1,W
			addlw	030H
			movwf	ASC1
			return
NUA4;		上位4bit A-F
			movf	wrk1,W
			addlw	037H
			movwf	ASC1
			return



;			32ビットバイナリ加算(整数符号無）
;
;		事前に(hex0-3)、(hexw0-3)に数値を入れておく事
;		演算結果でエラー(桁上がり）が発生しても対処はしない
;		hexw(0-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=FFHの場合、演算結果は保障されない
;		hexw(0-3)は保存される
;
;		演算
;		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	0FFh		;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	0FFh
;			hex2-hexw2の減算
			movf	hexw2,W
			subwf	hex2,F
			movlw	01h
			btfss	STATUS,C
			subwf	hex3,F
			btfss	STATUS,C
			retlw	0FFh
;			hex3-hexw3の減算
			movf	hexw3,W
			subwf	hex3,F
			btfss	STATUS,C
			retlw	0FFh
			retlw	0h

;		16ビットバイナリ加算　ver1.2(バグ修正版)
;		hex(0-1)=hex(0-1)+hexw(0-1)
;		W=0の時、正常終了
;		W=FFHの時、エラー発生（キャリー）、演算結果は保障されない
;		hexw(0-1)は保存される
ADD16B
			movf	hexw0,W		;W=hexw0
			addwf	hex0,F		;hex0=hex0+hexw0
			movlw	01h			;この命令はフラグ変化しない
			btfss	STATUS,C
			goto	ad11		;キャリー無で次の加算
			addwf	hex1,F		;キャリー発生、hex1=hex1+1
			btfsc	STATUS,C
			retlw	0FFH			;桁上がり発生、加算エラー終了
ad11		movf	hexw1,W		;W=hexw1
			addwf	hex1,F		;hex1=hex1+hexw1
			btfsc	STATUS,C
			retlw	0FFH		;キャリー発生、加算エラー終了
			retlw	0h			;加算正常終了


;		16ビットバイナリ減算　Ver1.1(バグ修正版)
;		hex(0-1)=hex(0-1)-hexw(0-1)
;		W=0の時、正常終了
;		W=FFHの時、エラー発生（ボロー）、演算結果は保障されない
;		hexw(0-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	0FFH			;ボロー発生、減算エラー終了

sb11		movf	hexw1,W		;W=hexw1
			subwf	hex1,F		;hex1=hex1-hexw1
			btfss	STATUS,C
			retlw	0FFh		;ボロー発生、減算エラー終了
			retlw	0h			;減算正常終了



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			指定ディレイ　ミリセカンド　32MHZ
;
;		delay0、delay1の16bitで指定
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DELAY_MS
			movf	delay1,W
			iorwf	delay0,W
			btfsc	STATUS,Z
			retlw	0h
dms01
			movlw	01h			;フラグ変化しない
			subwf	delay0,F	;delay0=delay0-1
			btfss	STATUS,C	;
			bra		dms02		;ボロー発生,桁下がり処理へ
			call	wait1m
			bra		dms01

dms02		movlw	01h			;
			subwf	delay1,F	;delay1=delay1-1
			btfss	STATUS,C
			retlw	0h			;ボロー発生、正常終了
			call	wait1m		;dalay0=256の補正
			movlw	0ffh
			movwf	delay0		;delay0=255
			bra		dms01		;





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン	32MHZ用
;									JA0QON	Ver32.1a
;		1cycle	= 0.125us
;		使用ワークレジスタ	cnt0-cnt3
;		BSR		=0(BANK0)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wait100u						;呼び出しも含めて、100us
								;call is 2cycles
			clrf	BSR
			movlw	09h			;1
			movwf	cnt2		;1
			movlb	0h
;			nop
			nop					;3
w100u		nop					;
			call	wait10u		;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
			clrf	BSR
			call	wait10u
			call	wait10u
			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
			clrf	BSR
			movlw	05h
			movwf	cnt2
w5m			call	wait1m
			decfsz	cnt2,F
			goto	w5m
			return

wait10m							; 10ms
			clrf	BSR
			movlw	d'10'
			movwf	cnt2
w10m		call	wait1m
			decfsz	cnt2,F
			goto	w10m
			return

wait20m							; 20ms
			clrf	BSR
			movlw	d'20'
			movwf	cnt2
w20m		call	wait1m
			decfsz	cnt2,F
			goto	w20m
			return
wait50m							; 50ms
			clrf	BSR
			movlw	d'50'
			movwf	cnt2
w50m		call	wait1m
			decfsz	cnt2,F
			goto	w50m
			return

wait100m						; 100ms
			clrf	BSR
			movlw	d'100'
			movwf	cnt2
w100m		call	wait1m
			decfsz	cnt2,F
			goto	w100m
			return

wait500m						; 500ms
			clrf	BSR
			movlw	05h
			movwf	cnt3
w500m		call	wait100m
			decfsz	cnt3,F
			goto	w500m
			return

wait1s							; 1s
			clrf	BSR
			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
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
wait1m
			clrf	BSR
			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サイクル消費する
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wait10u
			clrf	BSR
			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

wait05u
			clrf	BSR
			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

wait02u
			clrf	BSR
			movlw	04h			;2us=0.125us*16cycles
			movwf	cnt0		;
w02u0		decfsz	cnt0,F		;2+3*3+2+1+2=16cycles
			goto	w02u0
;			nop
			return				;
wait01u
			clrf	BSR			;1us=0.125us*8cycles
			nop					;2+4+2=8cycles
			nop
			nop
			return

			END					;これ以降アッセンブルされない


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン
;
;		clock	= 8MHz(0.125us)
;		1cycle	= 0.5us
;		使用レジスタ	= cnt0,cnt1,cnt2,cnt3
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wait100u						;呼び出しも含めて、100us
								;call is 2cycles
			movlw	09h			;1
			movwf	cnt2		;1
			nop
			nop
			nop					;3
w1u			nop					;
			call	wait10u		;10*8=80us(ここだけ命令ステップを数えない）
			decfsz	cnt2,F		;4*7+3=31cycles
			goto	w1u
			return				;2+5+31+2=40cycles=20us

wait50u							;呼び出しも含めて、50us
			call	wait25u
wait25u							;呼び出しも含めて、25us
			call	wait10u
			call	wait10u
			nop					;5us=0.5us*10cycles			
			nop					;
			nop
			nop
			nop
			nop
			return				;2+6+2=10cycles=5us

wait2m
			movlw	02h
			movwf	cnt2
w2m			call	wait1m
			decfsz	cnt2,F
			goto	w2m
			return

wait5m							; 5ms delay
			movlw	05h
			movwf	cnt2
w5m			call	wait1m
			decfsz	cnt2,F
			goto	w5m
			return

wait10m							; 10ms delay
			movlw	d'10'
			movwf	cnt2
w10m		call	wait1m
			decfsz	cnt2,F
			goto	w10m
			return

wait20m							; 20ms delay
			movlw	d'20'
			movwf	cnt2
w20m		call	wait1m
			decfsz	cnt2,F
			goto	w20m
			return
wait50m							; 50ms delay
			movlw	d'50'
			movwf	cnt2
w50m		call	wait1m
			decfsz	cnt2,F
			goto	w50m
			return

wait100m						; 100ms delay
			movlw	d'100'
			movwf	cnt2
w100m		call	wait1m
			decfsz	cnt2,F
			goto	w100m
			return

wait500m						; 500ms delay
			movlw	05h
			movwf	cnt3
w500m		call	wait100m
			decfsz	cnt3,F
			goto	w500m
			return

wait1s							; 1s delay
			movlw	d'10'
			movwf	cnt3
w1s			call	wait100m
			decfsz	cnt3,F
			goto	w1s
			return

;			Wregで指定した回数10msウェイトルーチンを呼び出す
waitx
			movwf	work1		;
wtx			call	wait10m
			decfsz	work1
			goto	wtx
			return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1ms 基本ウェイト 
;
;		clock	= 8MHz(0.125usec)
;		1cycle	= 0.5usec
;		1ms		= 0.5usec * 2000cycles
;
;		# 'goto' and 'call' and 'return' - 2cycles
;			使用変数　cnt0,cnt1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
wait1m
			movlw		02h
			movwf		cnt0		;
;			外周ループ
d1m0		movlw		0c7h		;199d
			movwf		cnt1		;
;			内周ループ
d1m1		nop						;
			nop						;5cycles*cnt1
			decfsz		cnt1,F		;5*199=995c/s
			goto		d1m1		;
;
			decfsz		cnt0,F		;(d1m1-1+3)*cnt0
			goto		d1m0		;(995-1+5)*2=1998cycles
			return					;other=3cycles
									;Total 2001*0.5usec=約1ms

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			10us 基本ウェイト
;			呼び出しも含めて、10usとなる。
;
;		clock	= 8MHZ(0.125us)
;		1cycle	= 0.5us
;		10us	= 0.5us * 20cycles
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

									;"call" inst = 2cycles
wait10u
			movlw		05h			;1
			movwf		cnt0		;1
d10u0								;3*4+2=14
			decfsz		cnt0,F		;
			goto		d10u0		;
			return					;2+1+1+14+2=20cycles
