;***** LogicIC_Checker1.asm ***********************************************
;
;	簡易ロジックＩＣチェッカ (Logic IC Checker)
;     * 各種スイッチ入力, 7セグLED 表示部（Ｕ１）*
;
;	Copyright (C) 2006-2010   by M.Yamamoto. All rights reserved.
;
;     ( coding:  Ver. 0.00   2006/04/21  by M.Yamamoto )
;	coding:  Ver. 1.00   2006/06/05  初期バージョン
;	update:  Ver. 2.10   2010/10/02  チャッタリング処理の改善
;	bugfix:  Ver. x.xx
;
;******************************************************* PicAsm 0203 ******

;	Device: PIC16F628A	Clock: 4MHz (Internal OSC)

#ifdef comment

 <機能概要>
　　この簡易ロジックＩＣチェッカ (Logic IC Checker)は、「各種スイッチ入力, 7セグ
　LED 表示部」（以下、Ｕ１という。）、「各種ロジックＩＣチェック, 結果表示部」（
　以下、Ｕ２という。）および「各種ロジックＩＣチェック補助制御部」（以下、Ｕ３と
　いう。）の三部からなっている。

　　Ｕ１では、電源投入直後に約２秒間、ファームウェアのバージョンを７セグＬＥＤに表
　示する。その後、００００を７セグＬＥＤに表示し、Ｕ２からＵ４経由でスイッチ入力イ
　ネーブル(j0: from U4) 信号を受け取ると待機状態になり、Ｕ１は７セグＬＥＤをブリン
　ク表示とし各スイッチ入力を受け付ける。

　　デバイス番号の指定は、SW1: 1 位 ～ SW4: 1000 位の各桁スイッチおよび udsw: UP/
　DOWN スイッチで行い、７４シリーズでは７４を除いた数値を、前側を０の右づめで指定
　する(７４１３８→０１３８)。４０００・４５００シリーズではそのまま４桁を指定する。

　　その後、setsw: SET スイッチを押すと、デバイス番号をＵ２に送信(j1: to U2)し、
　Ｕ２では登録デバイス番号かどうかをチェックして、その結果をＯＫ／ＮＧ ＬＥＤ表示、
　およびブザー音で知らせる。

　　デバイス番号がＮＧであった場合には、続いて７セグＬＥＤをブリンク表示し、正しい
　デバイス番号の入力を促す。なおこの状態では cksw: CHECK スイッチを受け付けない。

　　デバイス番号がＯＫであった場合には、７セグＬＥＤがブリンク表示から点灯しきりと
　なり、指定されたデバイス番号が登録されていることを知らせる。

　　その次に、cksw: CHECK スイッチを押すと、チェック開始指令出力(j4: to U2)をＵ２
　に送信し、各デバイス別のチェックが開始される。チェック中は、各スイッチ入力を受け
　付けなくなる。また、チェック結果は同様にＯＫ／ＮＧ ＬＥＤ表示、およびブザー音で
　知らせる。

　　Ｕ２でのチェックが終了すると、Ｕ２からＵ４経由でのスイッチ入力イネーブル(j0: 
　from U4) 信号が再び送られ、Ｕ１では各スイッチ入力を受け付ける。

 <各スイッチの機能と操作法>
　　スイッチ入力イネーブル(j0: from U4) 信号が有効な場合のみ、次の各スイッチ入力を
　受け付ける。

・SW1: 1 位の桁スイッチ
　　４桁のデバイス番号の内、 1 位の桁を指定する場合に用いる。
　　１回押すごとに１づつカウントアップされ、対応する 1 位の桁の７セグＬＥＤ(赤)に表
　示される。なお、このときに udsw: UP/DOWN スイッチと併用した場合は、１づつカウント
　ダウンされる。 ( 0, 1, …… 8, 9, 0, 1, …… / 9, 8, …… 2, 1, 0, 9, …… )

・SW2: 10 位の桁スイッチ
　　４桁のデバイス番号の内、10 位の桁を指定する場合に用いる。
　　１回押すごとに１づつカウントアップされ、対応する 10 位の桁の７セグＬＥＤ(赤)に
　表示される。なお、このときに udsw: UP/DOWN スイッチと併用した場合は、１づつカウン
　トダウンされる。 ( 0, 1, …… 8, 9, 0, 1, …… / 9, 8, …… 2, 1, 0, 9, …… )

・SW3: 100 位の桁スイッチ
　　４桁のデバイス番号の内、100 位の桁を指定する場合に用いる。
　　１回押すごとに１づつカウントアップされ、対応する 100 位の桁の７セグＬＥＤ(赤)に
　表示される。なお、このときに udsw: UP/DOWN スイッチと併用した場合は、１づつカウン
　トダウンされる。 ( 0, 1, …… 8, 9, 0, 1, …… / 9, 8, …… 2, 1, 0, 9, …… )

・SW4: 1000 位の桁スイッチ
　　４桁のデバイス番号の内、1000 位の桁を指定する場合に用いる。
　　１回押すごとに１づつカウントアップされ、対応する 1000 位の桁の７セグＬＥＤ(赤)
　に表示される。なお、このときに udsw: UP/DOWN スイッチと併用した場合は、１づつカウ
　ントダウンされる。 ( 0, 1, …… 8, 9, 0, 1, …… / 9, 8, …… 2, 1, 0, 9, …… )

・udsw: UP/DOWN/BREAK スイッチ
　　SW1: 1 位の桁 ～ SW4: 1000 位の桁スイッチとともに使用し、udsw: UP/DOWN スイッチ
　を押しながら各桁スイッチを押した場合には、各桁が１づつカウントダウンされる。
　　また、被試験ＩＣのデバイスチェック時で休止(PAUSE)状態になった時に、このスイッチ
　を押下することでデバイスチェックを中断することができる。

・setsw: SET スイッチ
　　デバイス番号をＵ２に送信(j1: to U2)する。
 "スタートビット(1) + 1000 位(4) + 100 位(4) + 10 位(4) + 1 位(4) + ストップビット(1)"
　　なお、このときに udsw: UP/DOWN スイッチと併用した場合は、デバイス番号の送信は行
　われず、1 位の桁 ～ 1000 位の桁のすべての７セグＬＥＤ(赤) が００００にクリアされる。

・cksw: CHECK スイッチ
　　チェック開始指令出力(j4: to U2)を有効とし、Ｕ２に送信する。

・pausw: PAUSE スイッチ
　　このスイッチだけはＵ２で管理しており、電源投入時に PAUSE スイッチを押しながら電
　源ＯＮした場合に以降有効となり、デバイス番号チェック時には、４桁のデバイス番号を
　ブザー音の数で知らせたり、また被試験ＩＣのデバイスチェック時には、各チェックデータ
　ごとに結果表示した後、休止(PAUSE)状態になったのをこのスイッチの押下で解除する。

 <７セグＬＥＤの機能>
　　通常は SW1: 1 位の桁 ～ SW4: 1000 位の各桁スイッチで指定された、デバイス番号を４
　桁で表示する。各桁スイッチで入力中、または setsw: SET スイッチ押下でのデバイス番号
　チェック結果がＮＧだった場合には、ブリンク表示となりデバイス番号がまだ確定できてい
　ない状態を表す。

　　またチェック結果がＯＫだった場合には、ブリンク表示から点灯しきりとなりデバイス番
　号が確定状態であることを表す。なお、cksw: CHECK スイッチ押下でのデバイスチェックの
　終了後もこの状態は持続する。いったん各桁スイッチのどれかを押下すると、確定状態が解
　除され７セグＬＥＤは再びブリンク表示となる。

　　被試験ＩＣのデバイスチェック中でポーズ指定がされている場合には、４桁の７セグＬＥ
　Ｄの内下２桁で、被試験ＩＣごとに指定された複数のチェックデータの内、何個目のチェッ
　クが行われたかを知らせる。また４桁の内上１桁目はこの時のチェック結果を表示し、ＯＫ
　の場合はａセグメントが、ＮＧの場合はｄセグメントが点灯してそれらを表示する。

#endif

;	PIC16F628A のピンと用途

;	 (1) RA2: 7セグLED  100 位出力		(18) RA1: 7セグLED 10 位出力
;	 (2) RA3: 7セグLED 1000 位出力		(17) RA0: 7セグLED  1 位出力
;	 (3) RA4: デバイス番号出力　		(16) RA7: ポーズ信号入力
;	 (4) RA5: スイッチ入力イネーブル	(15) RA6: チェック開始／中断指令出力
;	 (5) VSS: 電源 GND			(14) VDD: 電源 +5V DC
;	 (6) RB0: a 出力 /    1 位スイッチ入力	(13) RB7: チェック結果応答入力
;	 (7) RB1: b 出力 /   10 位スイッチ入力	(12) RB6: g 出力 /   CHECK スイッチ入力
;	 (8) RB2: c 出力 /  100 位スイッチ入力	(11) RB5: f 出力 /     SET スイッチ入力
;	 (9) RB3: d 出力 / 1000 位スイッチ入力	(10) RB4: e 出力 / UP/DOWN/BREAK スイッチ入力

;	*注.  RA4 の出力はオープンドレインのため、外部抵抗でプルアップしないと、High が
;	      出力されない。
;	      RA5 は入力専用で、出力ポートには使えない。

;==========================================================================

	list		p=pic16f628a		;デバイス情報
	include		p16f628a.inc		;インクルードファイル
	errorlevel	-302			;Eliminate bank warning

;==========================================================================
;	コンフィギュレーションの設定
;==========================================================================

	__config  h'3f10'

;	          _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF
;	        & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTOSC_OSC_NOCLKOUT

;==========================================================================
;	変数の定義とレジスタ割付け
;==========================================================================

ra0		equ	h'00'		;   1 位の桁 7セグLED
ra1		equ	h'01'		;  10 位の桁 7セグLED
ra2		equ	h'02'		; 100 位の桁 7セグLED
ra3		equ	h'03'		;1000 位の桁 7セグLED
ra4		equ	h'04'		;デバイス番号出力(j1: to U2)
ra5		equ	h'05'		;スイッチ入力イネーブル(j0: from U4)
ra6		equ	h'06'		;チェック開始／中断指令出力(j4: to U2)
ra7		equ	h'07'		;ポーズ信号(j6: from U2)
rb7		equ	h'07'		;チェック結果応答入力(j7: from U2) 
					;(注: jx, Ux は回路図中の記号に対応)
 
sw1		equ	h'00'		;   1 位の桁スイッチ
sw2		equ	h'01'		;  10 位の桁スイッチ
sw3		equ	h'02'		; 100 位の桁スイッチ
sw4		equ	h'03'		;1000 位の桁スイッチ
udsw		equ	h'04'		;UP/DOWN/BREAK スイッチ
setsw		equ	h'05'		;    SET スイッチ
cksw		equ	h'06'		;  CHECK スイッチ
pausw		equ	h'07'		;  PAUSE スイッチ

seg7_0		equ	b'11000000'	;-gfedcba Pattern 0
seg7_1		equ	b'11111001'	;         Pattern 1
seg7_2		equ	b'10100100'	;         Pattern 2
seg7_3		equ	b'10110000'	;         Pattern 3
seg7_4		equ	b'10011001'	;         Pattern 4
seg7_5		equ	b'10010010'	;         Pattern 5
seg7_6		equ	b'10000010'	;         Pattern 6
seg7_7		equ	b'11111000'	;         Pattern 7
seg7_8		equ	b'10000000'	;         Pattern 8
seg7_9		equ	b'10010000'	;         Pattern 9
seg7_v		equ	b'11100011'	;         Pattern v
seg7_a		equ	b'11111110'	;         Pattern a
seg7_d		equ	b'11110111'	;         Pattern d
seg7_off	equ	b'11111111'	;         LED off

flg0		equ	d'0'		;フラグの ON ビット
flg1		equ	d'1'		;フラグの ON ビット
flg2		equ	d'2'		;フラグの ON ビット
chatt		equ	d'50'		;チャッタリング吸収用ウエイト時間
					;300μ*4=1.2msec --> (1.2msec x 50 = 60msec)
chatt2		equ	d'130'		;ＳＷ連続誤動作吸収用ウエイト時間
					;300μ*4=1.2msec --> (1.2msec x 130 = 156msec)
res_tim         equ     d'22'           ;チェック結果応答時間(1.2msec x 22 = 26.4msec)
cntdat		equ	d'256' - d'250'	;TMR0 にセットする初期値（割り込み周期）
tm_adj		equ	d'250'		;タイムアウトスキップ回数
					;4/4Mz*250*8=2msec --> (2msec x 250 = 500msec)

		cblock  h'20'
initflg					;初期フラグ(カウンタ)
digit4					;1000 位カウンタ
digit3					; 100 位カウンタ
digit2					;  10 位カウンタ
digit1					;   1 位カウンタ
digit43					;デバイス番号 1000 位 + 100 位
digit21					;デバイス番号   10 位 +   1 位
chatcnt					;チャッタリング吸収カウンタ
chat2cnt				;ＳＷ連続誤動作吸収カウンタ
tmoutcnt				;タイムアウトカウンタ
updwnflg				;UP/DOWN フラグ
blinkflg				;7セグLED 点滅フラグ
sdendflg				;デバイス番号送信済みフラグ(0),(1)
pauseflg				;ポーズ信号フラグ(0),(1),(2)
resckflg				;応答信号チェックフラグ
pau_flag				;休止スイッチ有効フラグ
sdtemp					;送信バイトの一時保存
lpcnt					;送信ビット用ループカウンタ
rescnt1					;応答信号カウンタ
rescnt2					;応答信号カウンタ
wtcnt1					;ウェイト用ループカウンタ
wtcnt2					;ウェイト用ループカウンタ
wtcnt3					;ウェイト用ループカウンタ
		endc

		cblock  h'70'
w_save					;W レジスタの退避用
s_save					;STATUS レジスタの退避用
		endc

;==========================================================================
;	プログラム開始
;==========================================================================

		org	0		;リセットベクタ
		goto	init
		org	4		;割り込みベクタ
		goto	interrupt

;==========================================================================
;	W に指定された 0～9 の数字を ポートB にセットする
;     （PCL を操作する場合はプログラムを配置する位置に配慮すること）
;==========================================================================

seg7_set
		call	ptndat
		movwf	PORTB
		return

ptndat		addwf	PCL,F		;プログラム・カウンタに加算（相対ジャンプ）

		retlw	seg7_0		;0
		retlw	seg7_1		;1
		retlw	seg7_2		;2
		retlw	seg7_3		;3
		retlw	seg7_4		;4
		retlw	seg7_5		;5
		retlw	seg7_6		;6
		retlw	seg7_7		;7
		retlw	seg7_8		;8
		retlw	seg7_9		;9
		retlw	seg7_v		;10	Version
		retlw	seg7_a		;11	OK
		retlw	seg7_d		;12	NG

		; 全セグ消灯パタン
seg7_off_set
		movlw	seg7_off	;b'11111111'
		movwf	PORTB
		return

;==========================================================================
;	初期化処理
;==========================================================================

init
		bcf	STATUS,RP1	;バンク 0
		bcf	STATUS,RP0
		clrf	PORTA		;
		movlw	b'00000111'	;RA3-0 を Digital I/O
		movwf	CMCON		;CMCON の設定

;		bcf	STATUS,RP1	;バンク 1
		bsf	STATUS,RP0
		movlw	b'10100000'	;RA6,RA4-0: 出力, RA7,5: 入力
		movwf	TRISA		;ポートA の I/O 設定
		movlw	b'10000000'	;RB6-0: 出力, RB7: 入力
		movwf	TRISB		;ポートB の I/O 設定

		movlw	b'00001010'	;bit7-4: 使われていない
					;bit3=1: 内部発振周波数は 4MHz
					;bit2:   使われていない
					;bit1=1: パワーオンリセットする
					;bit0=0: ブラウンアウトリセットしない
		movwf	PCON    	;PCON に設定

		movlw	b'10000010'	;bit7=1: PORTB は PULL-UP しない
					;bit6=0: GP2 の割込みは立下りエッジ
					;bit5=0: TMR0 クロックは内部供給
					;bit4=0: TMR0 L から H でカウント
					;bit3=0: プリスケーラを TMR0 に使用
					;bit2-0=010: プリスケーラ比 1:8
		movwf	OPTION_REG	;OPTION_REG に設定

;		bcf	STATUS,RP1	;バンク 0
		bcf	STATUS,RP0
		movlw	b'01011111'
					;RA3-0=1111: 1000-1 位の 7セグLED = 全桁消灯
					;RA4=1: デバイス番号出力(j1: to U2) = disable
					;RA6=1: チェック開始指令出力(j4: to U2) = disable
		movwf	PORTA		;ポートA に初期値を出力
		movlw	b'11111111'	;RB6-0=1111111: 7セグLED 全セグ消灯
		movwf	PORTB		;ポートB に初期値を出力
		movlw	tm_adj		;タイムアウトスキップ回数 (2msec x tm_adj)
		movwf	tmoutcnt	;タイムアウトカウンタに設定
		movlw	cntdat		;割り込み周期値
		movwf	TMR0		;タイマに初期値を設定
		bsf	INTCON,T0IE	;T0IE タイマー０割り込み許可
		bsf	INTCON,GIE	;GIE 全割り込み許可

		clrf	pau_flag	;休止スイッチ有効フラグ = OFF
		btfss	PORTB,pausw	;休止解除スイッチ = ON か？
		bsf	pau_flag,flg0	;Yes. 休止スイッチ有効フラグ = ON
					;(2 秒間 Version No の表示)
		movlw	d'10'		;v: version
		movwf	digit4		;1000 位カウンタの設定
		movlw	d'2'
		movwf	digit3		; 100 位カウンタの設定
		movlw	d'1'
		movwf	digit2		;  10 位カウンタの設定
		movlw	d'0'
		movwf	digit1		;   1 位カウンタの設定
		movlw	d'4'		;500msec x 4 = 2 秒
		movwf	initflg		;初期フラグ(カウンタ)に設定

		clrf	chatcnt		;チャッタリング吸収カウンタの初期設定
		clrf	chat2cnt	;ＳＷ連続誤動作吸収カウンタの初期設定
		clrf	updwnflg	;UP/DOWN フラグの初期設定
		clrf	sdendflg	;デバイス番号送信済みフラグ(0),(1)の初期設定
		clrf	blinkflg	;点滅フラグの初期設定
		clrf	pauseflg	;ポーズ信号フラグ(0),(1),(2)の初期設定
		clrf	rescnt1		;応答信号カウンタ1 の初期設定
		clrf	rescnt2		;応答信号カウンタ2 の初期設定

;==========================================================================
;	メイン・ルーチン
;==========================================================================

		; デバイス番号の 7セグLED 表示
main

		; (1000 位の桁の処理)
		call	seg7_off_set
		bsf	PORTA,ra0	;   1 位の桁を消灯
		bcf	PORTA,ra3	;1000 位の桁を点灯
		btfsc	sdendflg,flg1	;デバイス番号送信済みフラグ(1) = OFF か？
		goto	m02		;No

		btfss	blinkflg,flg0	;点滅フラグ = ON か？
		goto	m03		;No

m01		call	seg7_off_set
		goto	m04

m02		btfss	pauseflg,flg1	;ポーズ信号フラグ(1) = ON か？
		goto	m03		;No

		btfss	PORTA,ra7	;ポーズ信号入力(j6: from U2) = "H" か？
		goto	m01		;No

m03		movf	digit4,W	;1000 位カウンタ値のパタンを
		call	seg7_set	;ポートB にセット

m04		call	wait_300us	;１桁の表示時間

		; (100 位の桁の処理)
		call	seg7_off_set
		bsf	PORTA,ra3	;1000 位の桁を消灯
		bcf	PORTA,ra2	; 100 位の桁を点灯
		btfsc	sdendflg,flg1	;デバイス番号送信済みフラグ(1) = OFF か？
		goto	m06		;No

		btfss	blinkflg,flg0	;点滅フラグ = ON か？
		goto	m06		;No

m05		call	seg7_off_set
		goto	m07

m06		btfsc	pauseflg,flg1	;ポーズ信号フラグ(1) = OFF か？
		goto	m05		;No

		movf	digit3,W	; 100 位カウンタ値のパタンを
		call	seg7_set	;ポートB にセット

m07		call	wait_300us	;１桁の表示時間

		; (10 位の桁の処理)
		call	seg7_off_set
		bsf	PORTA,ra2	; 100 位の桁を消灯
		bcf	PORTA,ra1	;  10 位の桁を点灯
		btfsc	sdendflg,flg1	;デバイス番号送信済みフラグ(1) = OFF か？
		goto	m08		;No

		btfss	blinkflg,flg0	;点滅フラグ = ON か？
		goto	m08		;No

		call	seg7_off_set
		goto	m09

m08		movf	digit2,W	;  10 位カウンタ値のパタンを
		call	seg7_set	;ポートB にセット

m09		call	wait_300us	;１桁の表示時間

		; (1 位の桁の処理)
		call	seg7_off_set
		bsf	PORTA,ra1	;  10 位の桁を消灯
		bcf	PORTA,ra0	;   1 位の桁を点灯
		btfsc	sdendflg,flg1	;デバイス番号送信済みフラグ(1) = OFF か？
		goto	m10		;No

		btfss	blinkflg,flg0	;点滅フラグ = ON か？
		goto	m10		;No

		call	seg7_off_set
		goto	m11

m10		movf	digit1,W	;   1 位カウンタ値のパタンを
		call	seg7_set	;ポートB にセット

m11		call	wait_300us	;１桁の表示時間

		; (振り分け)
		movf	initflg,W
		btfss	STATUS,Z	;初期フラグ(カウンタ) = 0 か？
		goto	main		;No

		call	seg7_off_set
		bsf	PORTA,ra0	;   1 位の桁を消灯
		;*** 必須: RA0-4 すべて "H" にする必要あり (1.5 日間 悩んだ 06/01) ***

		btfsc	PORTA,ra5	;スイッチ入力イネーブル(j0: from U4) か？
		goto	m16		;No

		; 各種スイッチのチェック

		bsf	INTCON,T0IE	;T0IE タイマー０割り込み許可

		movf	chat2cnt,F
		btfsc	STATUS,Z	;ＳＷ連続誤動作吸収カウンタ = 0 か？
		goto	m12		;Yes

		decfsz	chat2cnt,F	;ＳＷ連続誤動作吸収カウンタ - 1 = 0 か？
		goto	m13		;No

m12		bsf	STATUS,RP0	;バンク 1
		movlw	b'11111111'
		movwf	TRISB		;ポートB の I/0 設定: すべて入力
		bcf	STATUS,RP0	;バンク 0

		btfss	PORTB,sw1	;   1 位の桁スイッチ = ON か？
		call	sw1_on		;Yes
		btfss	PORTB,sw2	;  10 位の桁スイッチ = ON か？
		call	sw2_on		;Yes
		btfss	PORTB,sw3	; 100 位の桁スイッチ = ON か？
		call	sw3_on		;Yes
		btfss	PORTB,sw4	;1000 位の桁スイッチ = ON か？
		call	sw4_on		;Yes

		btfss	PORTB,udsw	;UP/DOWN/BREAK スイッチ = ON か？
		call	udsw_on		;Yes
		btfsc	PORTB,udsw	;UP/DOWN/BREAK スイッチ = OFF か？
		call	udsw_off	;Yes

		btfss	PORTB,setsw	;SET スイッチ = ON か？
		call	setsw_on	;Yes. デバイス番号の送信(j1: to U2)
		btfss	PORTB,cksw	;CHECK スイッチ = ON か？
		call	cksw_on		;Yes. チェック開始指令出力(j4: to U2) 

		bsf	STATUS,RP0	;バンク 1
		movlw	b'10000000'	;RB6-0: 出力, RB7: 入力
		movwf	TRISB		;ポートB の I/O 設定
		bcf	STATUS,RP0	;バンク 0

		; 7セグLED をデバイス番号表示に戻す

m13		btfss	pau_flag,flg0	;休止スイッチ有効フラグ = ON か？
		goto	m14		;No

		btfss	pauseflg,flg2	;ポーズ信号フラグ(2) = ON か？
		goto	m14		;No

		movf	digit21,W	;10,1 位の退避データ
		andlw	h'0f'		;
		movwf	digit1		;   1 位の桁の復帰
		swapf	digit21,W	;上位と下位を入れ替え
		andlw	h'0f'		;
		movwf	digit2		;  10 位の桁の復帰

		movf	digit43,W	;1000,100 位の退避データ
		andlw	h'0f'		;
		movwf	digit3		; 100 位の桁の復帰
		swapf	digit43,W	;上位と下位を入れ替え
		andlw	h'0f'		;
		movwf	digit4		;1000 位の桁の復帰
		clrf	pauseflg	;ポーズ信号フラグ(0),(1),(2)のクリア

		; デバイス番号チェックの結果受信

m14		btfss	sdendflg,flg0	;デバイス番号送信済みフラグ(0) = ON か？
		goto	m15		;No	(bit0: デバイス番号送信済み)

		btfsc	sdendflg,flg1	;デバイス番号送信済みフラグ(1) = OFF  か？
		goto	m15		;No	(bit1: デバイス番号チェックOK)

		call	check_respons	;デバイス番号チェックの結果

m15		goto	main

		; 被試験ＩＣのデバイスチェックの結果受信

m16		bcf	INTCON,T0IE	;T0IE タイマー０割り込み禁止
		clrf	blinkflg	;点滅フラグをクリア

		btfss	pau_flag,flg0	;休止スイッチ有効フラグ = ON か？
		goto	m20		;No

		btfss	PORTA,ra7	;ポーズ信号入力(j6: from U2) = "H" か？
		call	check_respons	;No. デバイスチェックの結果

		; ポーズ信号のチェックとカウント
		; pauseflg.bit0: ポーズ信号のカウント制御用
		; pauseflg.bit1: 7セグLED の表示制御用
		; pauseflg.bit2: 退避データの復帰制御用

		bsf	pauseflg,flg2	;ポーズ信号フラグ(2) = ON
		btfss	PORTA,ra7	;ポーズ信号入力(j6: from U2) = "H" か？
		goto	m18		;No

		btfsc	pauseflg,flg0	;ポーズ信号フラグ(0) = OFF か？
		goto	m19		;No

		incf	digit1,F	; 1 位の桁の +1 更新
		movf	digit1,W
		sublw	d'9'
		btfsc	STATUS,C	; 1 位の桁 > 9 か？
		goto	m17		;No

		incf	digit2,F	;Yes. 10 位の桁の +1 更新
		clrf	digit1		; 1 位の桁 = 0

m17		bsf	pauseflg,flg0	;ポーズ信号フラグ(0) = ON
		bsf	pauseflg,flg1	;ポーズ信号フラグ(1) = ON
		goto	m19

m18		bcf	pauseflg,flg0	;ポーズ信号フラグ(0) = OFF

		; UP/DOWN/BREAK スイッチ (チェック中断) のチェック
		;*** スイッチの "L" 入力を判定するためには、
		;    RA0-4 のすべてを "H" にしておく必要あり
		;    (1.5 日間 悩んだ 2006/06/01)            ***

m19		bsf	STATUS,RP0	;バンク 1
		bsf	TRISB,udsw	;UP/DOWN/BREAK スイッチ: I/0 入力設定
		bcf	STATUS,RP0	;バンク 0

		clrf	updwnflg	;UP/DOWN フラグ = OFF
		btfss	PORTB,udsw	;UP/DOWN/BREAK スイッチ = ON か？
		call	udsw_on		;Yes. チェック中断指令出力(j4: to U2)

		bsf	STATUS,RP0	;バンク 1
		bcf	TRISB,udsw	;UP/DOWN/BREAK スイッチ: I/0 出力設定
		bcf	STATUS,RP0	;バンク 0

m20		goto	main

;==========================================================================
;	デバイス番号チェック／被試験ＩＣのデバイスチェックの結果受信
;==========================================================================

;	(from U2 ... OK: 50m 秒間,  NG: 5m 秒間 "L" パルス信号出力)

;	           OK                             NG 
;	￣￣￣￣＿＿＿＿￣￣￣￣￣ ￣ ￣ ￣￣￣￣＿＿￣￣￣￣￣￣

;	       ￤ 50mS ￤ 60mS* ￤              ￤5m￤ 60mS* ￤
;	        ￤t1 ￤t2 ￤                     ￤t1 ￤t2 ￤

;	　 "L" 計測時間:      t1 = 1.2mS * res_tim = 1.2 * 22 = 26.4 mS
;	残 "L" 吸収時間:      t2 = 1.2mS * res_tim = 1.2 * 22 = 26.4 mS
;	                 t1 + t2 =                26.4 + 26.4 = 52.8 mS

		;*** Ｕ２で 60mS* のタイミングを取るのがまずくて、 4～5 日間
		;    悩んでしまった
		;   (電源投入時に PAUSE スイッチを押しながら電源ＯＮした場合
		;    の、デバイス番号チェックが NG だった場合に、 PAUSE スイ
		;    ッチを押下すると不具合が発生する)       (2006/06/04)    ***
		;(Ｕ２側)
		;call	check_respons	;チェック結果ＮＧ応答出力
		;	(この間を 60mS 程度のタイミングを取る)
		;	(短すぎると不具合が発生する)
		;movlw	led_ng		;RE2-0=110: NG(赤LED) 点灯
		;movwf	PORTE		;ポートE に出力
		;	(この直後に ra5:(j0: from U4) = "H" となる)

check_respons
		movf	rescnt2,W
		sublw	res_tim
		btfsc	STATUS,Z	;応答信号カウンタ2 <> res_tim か？
		goto	crp04		;No

		; t1 の(アップ)カウント

crp01		btfsc	PORTB,rb7	;チェック結果応答(j7: from U2) = "L" か？
		goto	crp02		;No		      アクティブ "L"

		incf	rescnt1,F	;応答信号カウンタ1 の +1 更新
		goto	crp03

crp02		movf	rescnt1,W
		btfsc	STATUS,Z	;応答信号カウンタ1 = 0 か？
		goto	crp07		;Yes

crp03		incf	rescnt2,F	;応答信号カウンタ2 の +1 更新
		movf	rescnt2,W
		sublw	res_tim
		btfss	STATUS,Z	;応答信号カウンタ2 = res_tim か？
		goto	crp07		;No

		; (アップ)カウント値の OK/NG 判定

		movf	rescnt2,W	;
		subwf	rescnt1,W
		bsf	resckflg,flg0	;OK: 応答信号チェックフラグ = ON
		btfss	STATUS,Z	;応答信号カウンタ1 = 応答信号カウンタ2 か？
		bcf	resckflg,flg0	;NG: 応答信号チェックフラグ = OFF

		movf	rescnt2,W
		movwf	rescnt1		;応答信号カウンタ1 = 応答信号カウンタ2 に設定
		goto	crp07

		; t2 の(ダウン)カウント

crp04		decfsz	rescnt1,F	;応答信号カウンタ1 - 1 = 0 か？
		goto	crp07		;No

		clrf	rescnt2		;応答信号カウンタ2 のクリア
		btfsc	PORTA,ra5	;スイッチ入力イネーブル(j0: from U4) = "L" か？
		goto	crp06		;No

		; デバイス番号チェック結果

		btfss	resckflg,flg0	;応答信号チェックフラグ = ON か？
		goto	crp05		;No

		bsf	sdendflg,flg1	;OK: デバイス番号送信済みフラグ(1)   = ON
		goto	crp07		;      (bit1: デバイス番号チェックOK = ON)

crp05		bcf	sdendflg,flg0	;NG: デバイス番号送信済みフラグ(0)  = OFF
		goto	crp07		;      (bit0: デバイス番号送信済み  = OFF)

		; 被試験ＩＣデバイスチェック結果

crp06		movlw	d'11'		;OK 表示: Pattern a
		btfss	resckflg,flg0	;応答信号チェックフラグ = ON か？
		movlw	d'12'		;NG 表示: Pattern d
		movwf	digit4		;1000 位 に設定

crp07		return

;==========================================================================
;	SW1: 1 位の桁スイッチ = ON の処理
;==========================================================================

sw1_on
		movf	chatcnt,W
		btfss	STATUS,Z	;チャッタリング吸収カウンタ <> 0 か？
		goto	s1on01		;Yes

		movlw	chatt + 1	;チャッタリング吸収用ウエイト時間を
		movwf	chatcnt		;チャッタリング吸収カウンタに設定

s1on01		decfsz	chatcnt,F	;チャッタリング吸収カウンタ - 1 = 0 か？
		goto	s1on04		;No

		clrf	sdendflg	;デバイス番号送信済みフラグ(0),(1)のクリア
		btfsc	updwnflg,flg0	;UP/DOWN フラグ = 0 か？
		goto	s1on02		;No

		incf	digit1,F	;1 位カウンタの +1 更新
		movlw	d'10'
		subwf	digit1,W	;digit1 >= 10 か？
		btfsc	STATUS,C
		clrf	digit1		;Yes, 1 位カウンタ = 0 に設定
		goto	s1on03

s1on02		movlw	d'1'
		subwf	digit1,F	;1 位カウンタの -1 更新
		btfsc	STATUS,C	;digit1 >= 0 か？
		goto	s1on03		;Yes

		movlw	d'9'
		movwf	digit1		;1 位カウンタ = 9 に設定

s1on03		movlw	chatt2		;ＳＷ連続誤動作吸収用ウエイト時間を
		movwf	chat2cnt	;ＳＷ連続誤動作吸収カウンタに設定

s1on04		return

;==========================================================================
;	SW2: 10 位の桁スイッチ = ON の処理
;==========================================================================

sw2_on
		movf	chatcnt,W
		btfss	STATUS,Z	;チャッタリング吸収カウンタ <> 0 か？
		goto	s2on01		;Yes

		movlw	chatt + 1	;チャッタリング吸収用ウエイト時間を
		movwf	chatcnt		;チャッタリング吸収カウンタに設定

s2on01		decfsz	chatcnt,F	;チャッタリング吸収カウンタ - 1 = 0 か？
		goto	s2on04		;No

		clrf	sdendflg	;デバイス番号送信済みフラグ(0),(1)のクリア
		btfsc	updwnflg,flg0	;UP/DOWN フラグ = 0 か？
		goto	s2on02		;No

		incf	digit2,F	;10 位カウンタの +1 更新
		movlw	d'10'
		subwf	digit2,W	;digit2 >= 10 か？
		btfsc	STATUS,C
		clrf	digit2		;Yes, 10 位カウンタ = 0 に設定
		goto	s2on03

s2on02		movlw	d'1'
		subwf	digit2,F	;10 位カウンタの -1 更新
		btfsc	STATUS,C	;digit2 >= 0 か？
		goto	s2on03		;Yes

		movlw	d'9'
		movwf	digit2		;10 位カウンタ = 9 に設定

s2on03		movlw	chatt2		;ＳＷ連続誤動作吸収用ウエイト時間を
		movwf	chat2cnt	;ＳＷ連続誤動作吸収カウンタに設定

s2on04		return

;==========================================================================
;	SW3: 100 位の桁スイッチ = ON の処理
;==========================================================================

sw3_on
		movf	chatcnt,W
		btfss	STATUS,Z	;チャッタリング吸収カウンタ <> 0 か？
		goto	s3on01		;Yes

		movlw	chatt + 1	;チャッタリング吸収用ウエイト時間を
		movwf	chatcnt		;チャッタリング吸収カウンタに設定

s3on01		decfsz	chatcnt,F	;チャッタリング吸収カウンタ - 1 = 0 か？
		goto	s3on04		;No

		clrf	sdendflg	;デバイス番号送信済みフラグ(0),(1)のクリア
		btfsc	updwnflg,flg0	;UP/DOWN フラグ = 0 か？
		goto	s3on02		;No

		incf	digit3,F	;100 位カウンタの +1 更新
		movlw	d'10'
		subwf	digit3,W	;digit3 >= 10 か？
		btfsc	STATUS,C
		clrf	digit3		;Yes, 100 位カウンタ = 0 に設定
		goto	s3on03

s3on02		movlw	d'1'
		subwf	digit3,F	;100 位カウンタの -1 更新
		btfsc	STATUS,C	;digit3 >= 0 か？
		goto	s3on03		;Yes

		movlw	d'9'
		movwf	digit3		;100 位カウンタ = 9 に設定

s3on03		movlw	chatt2		;ＳＷ連続誤動作吸収用ウエイト時間を
		movwf	chat2cnt	;ＳＷ連続誤動作吸収カウンタに設定

s3on04		return

;==========================================================================
;	SW4: 1000 位の桁スイッチ = ON の処理
;==========================================================================

sw4_on
		movf	chatcnt,W
		btfss	STATUS,Z	;チャッタリング吸収カウンタ <> 0 か？
		goto	s4on01		;Yes

		movlw	chatt + 1	;チャッタリング吸収用ウエイト時間を
		movwf	chatcnt		;チャッタリング吸収カウンタに設定

s4on01		decfsz	chatcnt,F	;チャッタリング吸収カウンタ - 1 = 0 か？
		goto	s4on04		;No

		clrf	sdendflg	;デバイス番号送信済みフラグ(0),(1)のクリア
		btfsc	updwnflg,flg0	;UP/DOWN フラグ = 0 か？
		goto	s4on02		;No

		incf	digit4,F	;1000 位カウンタの +1 更新
		movlw	d'10'
		subwf	digit4,W	;digit4 >= 10 か？
		btfsc	STATUS,C
		clrf	digit4		;Yes, 1000 位カウンタ = 0 に設定
		goto	s4on03

s4on02		movlw	d'1'
		subwf	digit4,F	;1000 位カウンタの -1 更新
		btfsc	STATUS,C	;digit4 >= 0 か？
		goto	s4on03		;Yes

		movlw	d'9'
		movwf	digit4		;1000 位カウンタ = 9 に設定

s4on03		movlw	chatt2		;ＳＷ連続誤動作吸収用ウエイト時間を
		movwf	chat2cnt	;ＳＷ連続誤動作吸収カウンタに設定

s4on04		return

;==========================================================================
;	udsw: UP/DOWN/BREAK スイッチ = ON の処理
;==========================================================================

udsw_on
		btfsc	updwnflg,flg0	;UP/DOWN フラグ = OFF か？
		goto	udon03		;No

		movf	chatcnt,W
		btfss	STATUS,Z	;チャッタリング吸収カウンタ <> 0 か？
		goto	udon01		;Yes

		movlw	chatt + 1	;チャッタリング吸収用ウエイト時間を
		movwf	chatcnt		;チャッタリング吸収カウンタに設定

udon01		decfsz	chatcnt,F	;チャッタリング吸収カウンタ - 1 = 0 か？
		goto	udon03		;No

		btfsc	PORTA,ra5	;スイッチ入力イネーブル(j0: from U4) = "L" か？
		goto	udon02		;No

		bsf	updwnflg,flg0	;UP/DOWN フラグ = ON
		goto	udon03

udon02		bcf	PORTA,ra6	;RA6=0: チェック中断指令出力(j4: to U2) = enable
		call	wait_4ms	;4m 秒 ウェイト
		bsf	PORTA,ra6	;RA6=1: チェック中断指令出力(j4: to U2) = disable

udon03		return

;==========================================================================
;	udsw: UP/DOWN/BREAK スイッチ = OFF の処理
;==========================================================================

udsw_off
		btfss	updwnflg,flg0	;UP/DOWN フラグ = ON か？
		goto	udof02		;No

		movf	chatcnt,W
		btfss	STATUS,Z	;チャッタリング吸収カウンタ <> 0 か？
		goto	udof01		;Yes

		movlw	chatt + 1	;チャッタリング吸収用ウエイト時間を
		movwf	chatcnt		;チャッタリング吸収カウンタに設定

udof01		decfsz	chatcnt,F	;チャッタリング吸収カウンタ - 1 = 0 か？
		goto	udof02		;No

		bcf	updwnflg,flg0	;UP/DOWN フラグ = OFF

udof02		return

;==========================================================================
;	setsw: SET スイッチ = ON の処理
;==========================================================================

setsw_on
		movf	chatcnt,W
		btfss	STATUS,Z	;チャッタリング吸収カウンタ <> 0 か？
		goto	sson01		;Yes

		movlw	chatt + 1	;チャッタリング吸収用ウエイト時間を
		movwf	chatcnt		;チャッタリング吸収カウンタに設定

sson01		decfsz	chatcnt,F	;チャッタリング吸収カウンタ - 1 = 0 か？
		goto	sson03		;No

		btfsc	updwnflg,flg0	;UP/DOWN フラグ = OFF か？
		goto	sson02		;No

		call	tx_data		;デバイス番号を送信(j1: to U2)
		bsf	sdendflg,flg0	;デバイス番号送信済みフラグ(0) = ON
		goto	sson03

sson02		clrf	sdendflg	;デバイス番号送信済みフラグ(0),(1)のクリア
		clrf	digit4		;1000 位の桁カウンタのクリア
		clrf	digit3		; 100 位の桁カウンタのクリア
		clrf	digit2		;  10 位の桁カウンタのクリア
		clrf	digit1		;   1 位の桁カウンタのクリア

sson03		return

;==========================================================================
;	cksw: CHECK スイッチ = ON の処理
;==========================================================================

cksw_on
		btfss	sdendflg,flg1	;デバイス番号送信済みフラグ(1) = ON か？
		goto	cson02		;No

		movf	chatcnt,W
		btfss	STATUS,Z	;チャッタリング吸収カウンタ <> 0 か？
		goto	cson01		;Yes

		movlw	chatt + 1	;チャッタリング吸収用ウエイト時間を
		movwf	chatcnt		;チャッタリング吸収カウンタに設定

cson01		decfsz	chatcnt,F	;チャッタリング吸収カウンタ - 1 = 0 か？
		goto	cson02		;No

		bcf	PORTA,ra6	;RA6=0: チェック開始指令出力(j4: to U2) = enable
		call	wait_4ms	;4m 秒 ウェイト
		bsf	PORTA,ra6	;RA6=1: チェック開始指令出力(j4: to U2) = disable
		clrf	blinkflg	;点滅フラグ = OFF

		btfss	pau_flag,flg0	;休止スイッチ有効フラグ = ON か？
		goto	cson02		;No

		swapf	digit4,W	;上位と下位を入れ替え
		iorwf	digit3,W	;
		movwf	digit43		;デバイス番号 1000 位 + 100 位を退避
		clrf	digit4		;1000 位の桁カウンタのクリア
		clrf	digit3		; 100 位の桁カウンタのクリア

		swapf	digit2,W	;上位と下位を入れ替え
		iorwf	digit1,W	;
		movwf	digit21		;デバイス番号 10 位 + 1 位を退避
		clrf	digit2		;  10 位の桁カウンタのクリア
		clrf	digit1		;   1 位の桁カウンタのクリア

cson02		return

;==========================================================================
;	デバイス番号を「各種ロジックＩＣチェック, 結果表示部」に送信
;==========================================================================

; スタートビット(1) + 1000 位(4) + 100 位(4) + 10 位(4) + 1 位(4) + ストップビット(1)

tx_data
		swapf	digit4,W	;上位と下位を入れ替え
		iorwf	digit3,W	;
		movwf	digit43		;デバイス番号 1000 位 + 100 位
		swapf	digit2,W	;上位と下位を入れ替え
		iorwf	digit1,W	;
		movwf	digit21		;デバイス番号   10 位 +   1 位

		bcf	INTCON,T0IE	;T0IE タイマー０割り込み禁止
		bcf	PORTA,ra4	;スタートビット送出
		call	wait_4ms	;4m 秒 ウェイト

		movf	digit43,W
		call	tx_byte		;デバイス番号 1000 位 + 100 位を送出
		movf	digit21,W
		call	tx_byte		;デバイス番号   10 位 +   1 位を送出

		bsf	PORTA,ra4	;ストップビット送出
		call	wait_4ms	;4m 秒 ウェイト
		bsf	INTCON,T0IE	;T0IE タイマー０割り込み許可
		return

		; １バイト転送
tx_byte
		movwf	sdtemp		;送信バイトワークに保存
		movlw	d'8'
		movwf	lpcnt		;送信ビット用ループカウンタに設定

txb01		rlf	sdtemp,F	;1 ビット左にシフト
		btfsc	STATUS,C
		goto	txb02

		bcf	PORTA,ra4	;'0' ビット送出
		goto	txb03

txb02		bsf	PORTA,ra4	;'1' ビット送出
		nop
txb03		call	wait_4ms	;4m 秒 ウェイト

		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		goto	txb01		;No

		return

;==========================================================================
;	ウェイト・ルーチン (4 MHz)
;==========================================================================

		; 100μ秒 ウェイトルーチン

;wait_100us
		movlw	d'32'		;1
		goto	wt01		;2	(1+2+1+(1+2)*32-1+2)
					;Total	101/4MHz*4 = 0.000101 S = 100 μS

		; 200μ秒 ウェイトルーチン

;wait_200us
		movlw	d'64'		;1
		goto	wt01		;2	(1+2+1+(1+2)*64-1+2)
					;Total	197/4MHz*4 = 0.000197 S = 200 μS

		; 300μ秒 ウェイトルーチン（１桁の表示時間）

wait_300us
		movlw	d'99'		;1
wt01		movwf	wtcnt1		;1
wt02		decfsz	wtcnt1,F	;1,2
		goto	wt02		;2,0	1+1+(1+2)*98+(2+0)=298

		return			;2	298+2=300
					;Total	300/4MHz*4 = 0.0003 S = 300 μS

		; 1m 秒 ウェイトルーチン

wait_1ms
		movlw	4		;1
		movwf	wtcnt1		;1
wtm01		movlw	d'49'		;1
		movwf	wtcnt2		;1
wtm02		goto	$+1		;2
		decfsz	wtcnt2,F	;1,2
		goto	wtm02		;2,0	1+1+(2+1+2)*48+(2+2+0)=246

		decfsz	wtcnt1,F	;1,2
		goto	wtm01		;2,0	1+1+(246+1+2)*3+(246+2+0)=997

		return			;2	997+2=999
					;Total	999/4MHz*4 = 0.000999 S = 1 mS

		; 2m 秒 ウェイトルーチン

;wait_2ms
		movlw	4		;1
		movwf	wtcnt1		;1
wt2m01		movlw	d'99'		;1
		movwf	wtcnt2		;1
wt2m02		goto	$+1		;2
		decfsz	wtcnt2,F	;1,2
		goto	wt2m02		;2,0	1+1+(2+1+2)*98+(2+2+0)=496

		decfsz	wtcnt1,F	;1,2
		goto	wt2m01		;2,0	1+1+(496+1+2)*3+(496+2+0)=1997

		return			;2	1997+2=1999
					;Total	1999/4MHz*4 = 0.001999 S = 2 mS

		; 4m 秒 ウェイトルーチン

wait_4ms
		movlw	8		;1
		movwf	wtcnt1		;1
wt4m01		movlw	d'99'		;1
		movwf	wtcnt2		;1
wt4m02		goto	$+1		;2
		decfsz	wtcnt2,F	;1,2
		goto	wt4m02		;2,0	1+1+(2+1+2)*98+(2+2+0)=496

		decfsz	wtcnt1,F	;1,2
		goto	wt4m01		;2,0	1+1+(496+1+2)*7+(496+2+0)=3993

		return			;2	3993+2=3995
					;Total	3995/4MHz*4 = 0.003995 S = 4 mS

		; 250m 秒 ウェイトルーチン

wait_250ms
		movlw	d'246'		;1
		movwf	wtcnt3		;1
wt250m01	call	wait_1ms	;1011	2+999
		decfsz	wtcnt3,F	;1,2
		goto	wt250m01	;2,0	1+1+(1011+1+2)*245+(1011+2+0)=249445

		return			;2	249445+2=249447
					;Total	249447/4MHz*4 = 0.249447 S = 249 μS

;==========================================================================
;	割り込み処理
;==========================================================================

interrupt
		movwf	w_save		;W レジスタの保存
		movf	STATUS,W
		movwf	s_save		;STATUS レジスタの保存
		bcf	STATUS,RP0	;バンク 0
		btfss	INTCON,T0IF	;タイマ０オーバフロー か？
		goto	init		;No. Reset(Illegal interrupt)

		; タイムアウト割り込み処理

		bcf	INTCON,T0IF	;タイマオーバフロー解除
		movlw	cntdat
		movwf	TMR0		;タイマ初期値を設定

		decfsz	tmoutcnt,F	;タイムアウトカウンタ - 1 = 0 か？
		goto	int02		;No

		movlw	tm_adj		;タイムアウトスキップ回数 (2msec x tm_adj)
		movwf	tmoutcnt	;タイムアウトカウンタに設定

		movf	initflg,W
		btfsc	STATUS,Z	;初期フラグ(カウンタ) <> 0 か？
		goto	int01		;No

		decfsz	initflg,F	;初期フラグ(カウンタ) - 1 = 0 か？
		goto	int02		;No

		clrf	digit4		;1000 位カウンタの初期設定
		clrf	digit3		; 100 位カウンタの初期設定
		clrf	digit2		;  10 位カウンタの初期設定
		clrf	digit1		;   1 位カウンタの初期設定
		bsf	blinkflg,flg0	;点滅フラグ = ON
		bcf	INTCON,T0IE	;T0IE タイマー０割り込み禁止
		goto	int02

int01		movlw	b'00000001'
		xorwf	blinkflg,F	;点滅フラグの更新
		clrf	chatcnt		;チャッタリング吸収カウンタをクリア

int02		movf	s_save,W
		movwf	STATUS		;STATUS レジスタの復帰
		swapf	w_save,F
		swapf	w_save,W	;W レジスタの復帰

		retfie			;割り込みからの復帰

;==========================================================================
;		EEPROM エリア
;==========================================================================

		org	h'2100'

eep_st		de	"Copyright (C) 2010 by M.Yamamoto"

;==========================================================================

		end			;プログラムの終了
