;***** LogicIC_Checker2.asm ***********************************************
;
;	簡易ロジックＩＣチェッカ (Logic IC Checker)
;     * 各種ロジックＩＣチェック, 結果表示部（Ｕ２）*
;
;	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/28  初期バージョン 打ち切り
;	update:  Ver. 2.00   2006/07/02  PIC18F452 に変更
;	update:  Ver. 2.10   2010/11/03  invalidフラグの新設
;	bugfix:  Ver. x.xx
;
;******************************************************* PicAsm 0204 ******

;	Device: PIC18F452	Clock: 10MHz (セラロック)

;	PIC16F877A でプログラミングを進めてきたが、デバイステーブルのデータの増加
;	に伴って、プログラムメモリが足らなくなってしまった。そこでいろいろ検討した
;	結果、CPU を PIC18F452 に変更することが一番の良策との結論に至った。
;	ハードウェアの変更は一切なく現在のままで可。ソフトウェアの変更のみで対応可。
;	ただし、16F シリーズと 18F シリーズとの相違があり、苦戦が予想される。
;								     (2006/06/22)
;	16F シリーズと 18F シリーズとの変換は、基本的に CALL → RCALL, GOTO → BRA 
;	に止め、MOVFF, CPFxx, Bxx への変換は今回は止めた。また、ロジック上の変換は
;	已むを得ないため、最低限変換した。テーブル変換もはじめバイト単位の連続デー
;	タを作り、TBLRD*+ 命令で変換しようと思ったが、バイト単位の連続データを作る
;	方法がなくあきらめた。DB ではコメントが書けなくなる。	     (2006/06/24)

#ifdef comment

 <機能概要>
　　この簡易ロジックＩＣチェッカ (Logic IC Checker)は、「各種スイッチ入力, 7セグ
　LED 表示部」（以下、Ｕ１という。）、「各種ロジックＩＣチェック, 結果表示部」（
　以下、Ｕ２という。）および「各種ロジックＩＣチェック補助制御部」（以下、Ｕ３と
　いう。）の三部からなっている。

　　Ｕ２では、電源投入直後にハードウェアチェックとして、まず "ピポッ" とブザー音を
　出力し、次にＯＫ(緑)、ＮＧ(赤)、PAUSE (黄) ＬＥＤが約 1.5 秒間細かく交互に点滅し
　て、点灯チェックを行う。その後、スイッチ入力イネーブル(j0: from U4 to U1) 信号を
　Ｕ１に送出して、７セグＬＥＤをブリンク表示とし、各スイッチ入力の受け付けを可能と
　するように指示をする。

　　その後Ｕ２では、ひたすらＵ１からの、デバイス番号(j1: from U1)と その後のチェッ
　ク開始指令(j4: from U1) の受信を待つ。

　　やがて、Ｕ１でデバイス番号が設定され、Ｕ２に送信(j1: from U1) されてくると、
　Ｕ２ではそのデバイス番号が登録されているかどうかのチェックをする。

　　その結果、該当のデバイス番号が登録されていた場合には、ＯＫ(緑)ＬＥＤを約 100m 
　秒間点灯後、"ポッ" とブザー音(約 100m 秒)を出力しＯＫ表示をする。また、該当のデバ
　イス番号が登録されてなかった場合には、ＮＧ(赤)ＬＥＤを約 100m 秒間点灯後、"ブー" 
　とブザー音(約 250m 秒)を出力しＮＧ表示をする。

　　また該当のデバイス番号が登録されていた場合で特殊なＩＣピン接続の場合等には、そ
　れ以外の一般のＩＣピン接続の場合と区別をするために、ＯＫ(緑)ＬＥＤ点灯と"ポッ" 
　のブザー音を３回づつ繰り返し、ユーザの注意喚起を促している。

　　なお電源投入時に、休止解除スイッチ(PAUSE)を押しながら電源ＯＮした場合には、受信
　した４桁のデバイス番号を、結果表示後ブザー音の数で知らせる。
　（０："ブー"音(約 250m 秒)を１個、１～９："ポッ"音(約 100m 秒)を数字の数個）

　　デバイス番号のチェック結果がＯＫだった場合には、その後のＵ１からのチェック開始
　指令(j4: from U1) を受信すると、被試験ＩＣのデバイスチェックを開始する。

　　基本的なデバイスチェックはこのＵ２で行うが、オープンコレクタや３ステートなどの
　拡張チェックがある場合には、Ｕ３に拡張チェックデータを送り、そのデータ設定を依頼
　する。

　　被試験ＩＣごとに指定の、デバイスチェック個数のすべての結果がＯＫだった場合には、
　"ポッ" とブザー音(約 100m 秒)出力後、ＯＫ(緑)ＬＥＤを約２秒間点滅しＯＫ表示をする。
　また、結果がＮＧだった場合には、"ブー" とブザー音(約 250m 秒)を出力後、ＮＧ(赤)
　ＬＥＤを約２秒間点滅しＮＧ表示をする。

　　なお電源投入時に、休止解除スイッチ(PAUSE)を押しながら電源ＯＮした場合には、デバ
　イスチェック個数の１個が済むごとに休止(PAUSE)状態になり、PAUSE(黄)ＬＥＤが点灯し
　休止(PAUSE)中であることもあわせて表示する。またこのとき、１個ごとのチェック結果を
　"ポッ"、"ブー" のブザー音で知らせるとともに、Ｕ１側にもチェック結果応答(j7: to U1)
　を送出して知らせる。

　　休止(PAUSE)中であるときに、休止解除スイッチ(PAUSE)を押すことによって休止(PAUSE)
　状態を解除し、つぎに指定のデバイスチェックデータの実行が行われる。

　　また、この１個ごとのデバイスチェックが何個目のチェックかを知らせるために、Ｕ２
　からＵ１へその情報を送り、Ｕ１で 7セグLED の下２桁で表示をする。

　　なお、被試験ＩＣのデバイスチェック中は、Ｕ１へのスイッチ入力イネーブル(j0: from
　U4 to U1) 信号を無効としているが、ＯＫまたはＮＧの結果表示をした後は、再び信号を
　有効として各スイッチ入力の受け付けを可能とする。

#endif

;	PIC16F877A/PIC18F452 のピンと用途

;	 (1) MCLR:マスター・クリア入力		(40) RB7:  8 ピン入出力制御
;	 (2) RA0: ブザー音出力			(39) RB6:  7 ピン入出力制御
;	 (3) RA1: 3-8 デコーダ制御出力		(38) RB5:  6 ピン入出力制御
;	 (4) RA2: チェック開始指令入力		(37) RB4:  5 ピン入出力制御
;	 (5) RA3: 補助制御完了入力		(36) RB3:  4 ピン入出力制御
;	 (6) RA4: 補助制御指令出力		(35) RB2:  3 ピン入出力制御
;	 (7) RA5: デバイス番号入力		(34) RB1:  2 ピン入出力制御
;　	 (8) RE0: BCD コード A 出力		(33) RB0:  1 ピン入出力制御
;	 (9) RE1: BCD コード B 出力		(32) VDD: 電源 +5V DC
;	(10) RE2: BCD コード C 出力		(31) VSS: 電源 GND
;	(11) VDD: 電源 +5V DC			(30) RD7: 休止解除スイッチ入力 / チェック結果応答
;	(12) VSS: 電源 GND			(29) RD6: ポーズ信号(休止 LED) 出力
;	(13) OSC1:オシレータ水晶入力		(28) RD5: 23 ピン入出力制御
;	(14) OSC2:オシレータ水晶入力		(27) RD4: 22 ピン入出力制御
;	(15) RC0:  9 ピン入出力制御		(26) RC7: 17 ピン入出力制御
;	(16) RC1: 10 ピン入出力制御		(25) RC6: 16 ピン入出力制御
;	(17) RC2: 11 ピン入出力制御		(24) RC5: 15 ピン入出力制御
;	(18) RC3: 13 ピン入出力制御		(23) RC4: 14 ピン入出力制御
;	(19) RD0: 18 ピン入出力制御		(22) RD3: 21 ピン入出力制御
;	(20) RD1: 19 ピン入出力制御		(21) RD2: 20 ピン入出力制御

;	*注.  RA4 の出力はオープンドレインのため、外部抵抗でプルアップしないと、High が
;	      出力されない。

;==========================================================================

	list		p=pic18f452	;デバイス情報
	include		p18f452.inc	;インクルードファイル
	errorlevel	-302		;Eliminate bank warning

		config	OSC = HS	;Oscillator Selection
		config	OSCS = OFF	;Osc. Switch Enable
		config	PWRT = OFF	;Power Up Timer
		config	BOR = ON	;Brown Out Reset
		config	BORV = 25	;Brown Out Voltage
		config	WDT = OFF	;Watchdog Timer
		config	WDTPS = 128	;Watchdog Postscaler
		config	CCP2MUX = OFF	;CCP2 Mux
		config	STVR = OFF	;Stack Overflow Reset
		config	LVP = OFF	;Low Voltage ICSP
		config	DEBUG = OFF	;Background Debugger Enable
		config	CP0 = OFF	;Code Protection Block 0
		config	CP1 = OFF	;Code Protection Block 1
		config	CP2 = OFF	;Code Protection Block 2
		config	CP3 = OFF	;Code Protection Block 3
		config	CPB = OFF	;Boot Block Code Protection
		config	CPD = OFF	;Data EEPROM Code Protection
		config	WRT0 = OFF	;Write Protection Block 0
		config	WRT1 = OFF	;Write Protection Block 1
		config	WRT2 = OFF	;Write Protection Block 2
		config	WRT3 = OFF	;Write Protection Block 3
		config	WRTB = OFF	;Boot Block Write Protection
		config	WRTC = OFF	;Configuration Register Write Protection
		config	WRTD = OFF	;Data EEPROM Write Protection
		config	EBTR0 = OFF	;Table Read Protection Block 0
		config	EBTR1 = OFF	;Table Read Protection Block 1
		config	EBTR2 = OFF	;Table Read Protection Block 2
		config	EBTR3 = OFF	;Table Read Protection Block 3
		config	EBTRB = OFF	;Boot Block Table Read Protection

;==========================================================================
;	変数の定義とレジスタ割付け
;==========================================================================

;#define 	_debug

ra0		equ	h'00'		;ブザー音出力
ra1		equ	h'01'		;3-8 デコーダ制御出力(j5: to U4)
ra2		equ	h'02'		;チェック開始／中断指令入力(j4: from U1)
ra3		equ	h'03'		;補助制御完了入力(j3: from U3)
ra4		equ	h'04'		;補助制御指令出力(j2: to U3)
ra5		equ	h'05'		;デバイス番号入力(j1: from U1)
led_pau		equ	h'06'		;ポーズ信号(休止 LED)出力(j6: to U1)
rd7		equ	h'07'		;チェック結果応答出力(j7: to U1)
					;(注: jx, Ux は回路図中の記号に対応)
pausw		equ	h'07'		;休止解除(PAUSE)スイッチ

flg0		equ	d'0'		;フラグの ON ビット
flg1		equ	d'1'		;フラグの ON ビット
clk7		equ	d'7'		;クロック入力指定ビット
pul7		equ	d'7'		;1:PULL-UP/0:PULL-DOWN 指定ビット
spc6		equ	d'6'		;特殊処理指定ビット

xext		equ	d'7'		;拡張データ指定ビット位置
xinv		equ	d'6'		;出力反転指定ビット位置
xspc		equ	d'5'		;特殊処理指定ビット位置
xrep		equ	d'4'		;総繰り返し無指定ビット位置
ext		equ	h'01' << xext	;拡張データ指定ビット値
inv		equ	h'01' << xinv	;出力反転指定ビット値
spc		equ	h'01' << xspc	;特殊処理指定ビット値
rep		equ	h'01' << xrep	;総繰り返し無指定ビット値
repcnt		equ	d'3'		;総繰り返しチェック回数

xatn		equ	d'7'		;注意喚起指定ビット位置
xivd		equ	d'6'		;無効指定ビット位置
atn		equ	h'01' << xatn	;注意喚起指定ビット値
ivd		equ	h'01' << xivd	;無効指定ビット値

					;(3-8 デコーダ制御出力)
sw_enbl		equ	d'0'		;スイッチ入力イネーブル
pin14x		equ	d'1'		;ＩＣピン数 = 14 特殊 Vcc Pin
pin14y		equ	d'1'		;ＩＣピン数 = 14 特殊 Vcc Pin
pin14		equ	d'2'		;ＩＣピン数(Vcc Pin) = 14
pin16x		equ	d'1'		;ＩＣピン数 = 16 特殊 Vcc Pin
pin16y		equ	d'1'		;ＩＣピン数 = 16 特殊 Vcc Pin	(*要 GND Pin 変更)
pin16z		equ	d'1'		;ＩＣピン数 = 16 特殊 Vcc Pin = 3, Vss = 14
pin16w		equ	d'3'		;ＩＣピン数 = 16 特殊 Vcc Pin = 1
pin16		equ	d'3'		;ＩＣピン数(Vcc Pin) = 16
pin20		equ	d'4'		;ＩＣピン数(Vcc Pin) = 20
pin24		equ	d'5'		;ＩＣピン数(Vcc Pin) = 24
led_ng		equ	d'6'		;結果 NG(赤LED)
led_ok		equ	d'7'		;結果 OK(緑LED)

poh		equ	high (d'65536' - d'2389')	;ド (523.26 Hz)
pol		equ	low  (d'65536' - d'2389')	;
pih		equ	high (d'65536' - d'3189')	;ソ (392.00 Hz)
pil		equ	low  (d'65536' - d'3189')	;
buuh		equ	high (d'65536' - d'4778')	;ド (261.63 Hz)
buul		equ	low  (d'65536' - d'4778')	;
polcnt		equ	d'100'		;音長
pilcnt		equ	d'100'		;音長
buulcnt		equ	d'250'		;音長

		cblock  h'00'
digit43					;デバイス番号 1000 位 + 100 位
digit21					;デバイス番号   10 位 +   1 位
lpcnt					;送受信ビット用ループカウンタ
tblcnt					;デバイス番号テーブル用ループカウンタ
xaddr_high				;デバイス番号,デバイスチェックテーブルの先頭 high アドレス
xaddr_low				;デバイス番号,デバイスチェックテーブルの先頭 low アドレス
addr_high				;デバイスチェックデータの先頭 high アドレス
addr_low				;デバイスチェックデータの先頭 low アドレス
rdtemp					;読み出しデータの一時保存
rcv_flag				;デバイス番号受信フラグ
sdtemp					;送信バイトの一時保存
dno_flag				;デバイス番号有／無効フラグ
ext_flag				;拡張データ,出力反転,特殊処理,総繰り返し無指定フラグ
err_flag				;チェックエラーフラグ
pau_flag				;休止スイッチ有効フラグ
brk_flag				;チェック中断フラグ
repeatcnt				;総繰り返しチェックカウンタ
ic_pin_no				;ＩＣピン数(Vcc Pin)
pin_io_rb				;ピンの入出力割当 RB
pin_io_rc				;ピンの入出力割当 RC
pin_io_rd				;ピンの入出力割当 RD
pin_cl_rb				;クロック入力ピン RB
pin_cl_rc				;クロック入力ピン RC
pin_cl_rd				;クロック入力ピン RD
ck_dat_no				;チェックデータ個数
ck_dat_rb				;チェックデータ RB
ck_dat_rc				;チェックデータ RC
ck_dat_rd				;チェックデータ RD
spc_byte				;特殊処理指定バイト
cl_rep_hi				;クロック数カウンタの上位バイト
cl_rep_lo				;クロック数カウンタの下位バイト
rep_hi					;クロック数(2)カウンタの上位バイト
rep_lo					;クロック数(2)カウンタの下位バイト
wt1cnt					;ウェイト用ループカウンタ
wt2cnt					;ウェイト用ループカウンタ
wt3cnt					;ウェイト用ループカウンタ
wt4cnt					;ウェイト用ループカウンタ
const_high				;音階用分周定数 high の保存
const_low				;音階用分周定数 low の保存
w_save					;W レジスタの保存用（割り込み処理で使用）
s_save					;STATUS レジスタの保存用（割り込み処理で使用）
b_save					;BSR レジスタの保存用（割り込み処理で使用）
		endc

;==========================================================================
;	プログラム開始
;==========================================================================

		org	0		;リセットベクタ
		goto	init
		org	8		;割り込みベクタ
		goto	interrupt

;==========================================================================
;	初期化処理
;==========================================================================

init
		clrf	ADCON0		;ADCON0 の設定, A/D 未使用
		bsf	T1CON,TMR1ON	;T1CON に設定
					;タイマー１を動作
		movlw	h'06'		;ポートA, E を ディジタルモード
		movwf	ADCON1		;ADCON1 の設定
		bcf	PIE1,TMR1IE	;タイマー１割り込みを禁止

		movlw	b'00101100'	;RA5,3-2: 入力, RA4,1-0: 出力
		movwf	TRISA		;TRISA の設定
		movlw	b'11111111'
		movwf	TRISB		;RB7-0: 入力 の設定
		movwf	TRISC		;RC7-0: 入力 の設定
		movwf	TRISD		;RD7-0: 入力 の設定
		bcf	TRISD,led_pau	;休止表示 PAUSE(黄LED) 出力 の設定
		clrf	TRISE		;RE2-0: 出力 の設定
		bsf	INTCON2,RBPU	;INTCON2 の設定
					;PORTB プルアップ抵抗を使用しない
		movlw	b'00010000'	;RA1=0: 3-8 デコーダ制御出力(j5: to U4) = disable
					;RA4=1: 補助制御指令出力(j2: to U3) = disable
		movwf	PORTA		;ポートA に初期値を出力
		bcf	PORTD,led_pau	;ポーズ信号(休止 LED)出力(j6: to U1) = disable

		bsf	INTCON,PEIE	;PEIE 周辺機器割り込みを許可
		bsf	INTCON,GIE	;GIE 全割り込み許可

		clrf	pau_flag	;休止スイッチ有効フラグ = OFF
		btfss	PORTD,pausw	;休止解除スイッチ = ON か？
		bsf	pau_flag,flg0	;Yes. 休止スイッチ有効フラグ = ON

		rcall	buzzer_pipo	;"ピポッ" ブザー音出力
		bsf	PORTA,ra1	;RA1=1: 3-8 デコーダ制御出力(j5: to U4) = enable

		movlw	d'5'		;OK(緑), NG(赤),PAUSE(黄) LED 点灯チェック
		movwf	lpcnt		;ループカウンタ
lck01		movlw	led_ok		;RE2-0=111: 結果 OK(緑LED) 点灯
		movwf	PORTE		;ポートE に出力
		rcall	wait_100ms	;100m 秒 ウェイト
		movlw	led_ng		;RE2-0=110: 結果 NG(赤LED) 点灯
		movwf	PORTE		;ポートE に出力
		rcall	wait_100ms	;100m 秒 ウェイト
		bsf	PORTD,led_pau	;休止表示 PAUSE(黄LED)  点灯
		rcall	wait_100ms	;100m 秒 ウェイト
		bcf	PORTD,led_pau	;休止表示 PAUSE(黄LED)  消灯
		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		bra	lck01		;No

		movlw	sw_enbl		;RE2-0=000: スイッチ入力イネーブル(j0: from U4 to U1)
		movwf	PORTE		;ポートE に初期値を出力

;==========================================================================
;	メイン・ルーチン
;==========================================================================

main
		rcall	rx_data		;デバイス番号の受信
		btfsc	rcv_flag,flg0	;デバイス番号を受信したか？
		rcall	dev_no_check	;Yes. 受信デバイス番号の有効性チェック

		btfss	PORTA,ra2	;チェック開始／中断指令(j4: from U1) か？
		rcall	device_check	;Yes. デバイスチェック

		bra	main

;==========================================================================
;	デバイス番号を「各種スイッチ入力, 7セグLED 表示部」より受信
;	出力:	rcv_flag = 1:     デバイス番号受信フラグ
;		digit43, digit21: デバイス番号(有効)
;		rcv_flag = 0:
;		digit43, digit21: デバイス番号(無効)
;==========================================================================

; スタートビット(1) + 1000 位(4) + 100 位(4) + 10 位(4) + 1 位(4) + ストップビット(1)

;	         Start                                  　　　　 Stop 
;	￣￣￣￣＿＿＿＿￣ ￣ ￣ ￣ ￣ ￣ ￣ ￣ ￣ ￣ ￣ ￣ ￣ ￣￣￣￣￣￣

;	       ￤2m￤  4m  ↑  4m  ↑     ...     ↑  4m  ↑  4m  ￤
;	                   01      02     ...     15      16

;	           ￤            ( 8 x 2 = 16 )           ￤

rx_data
		bcf	rcv_flag,flg0	;デバイス番号受信フラグ = OFF
		btfsc	PORTA,ra5	;スタートビット受信か？
		bra	rxd02		;No

		rcall	wait_2ms	;2m 秒 ウェイト
		movlw	d'8' * d'2'	;8 ビット x 2 バイト
		movwf	lpcnt		;受信ビット用ループカウンタに設定

rxd01		rcall	wait_4ms	;4m 秒 ウェイト
		rlcf	digit21,F	;全ビット左シフト
		rlcf	digit43,F	;キャリー経由全ビット左シフト
		bsf	digit21,0	;最下位ビットに 1 をセット
		btfss	PORTA,ra5	;入力ビット = 1 か？
		bcf	digit21,0	;No. 最下位ビットに 0 を再セット
		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		bra	rxd01		;No

		rcall	wait_4ms	;ストップビットをスキップ
		bsf	rcv_flag,flg0	;デバイス番号受信フラグ = ON

rxd02		return

;==========================================================================
;	受信デバイス番号の有効性チェック
;	入力:	    digit43, digit21:    受信デバイス番号
;	出力:	OK: dno_flag = 1	 デバイス番号有／無効フラグ = 有効
;		    addr_high, addr_low: チェックデータ先頭アドレス
;		    (j7: to U1 ... 50m 秒間 "L" 信号出力)
;		    緑LED 点灯(100m 秒), "ポッ" ブザー音(100m 秒)
;		NG: dno_flag = 0	 デバイス番号有／無効フラグ = 無効
;		    (j7: to U1 ...  5m 秒間 "L" 信号出力)
;		    赤LED 点灯(100m 秒), "ブー" ブザー音(250m 秒)
;==========================================================================

dev_no_check
		movlw	high dev_no_table
		movwf	xaddr_high	;デバイス番号テーブルの先頭 high アドレス
		movlw	low dev_no_table
		movwf	xaddr_low	;デバイス番号テーブルの先頭 low アドレス

		; 受信デバイス番号とテーブル値の比較

dnck01		rcall	xaddr_read	;テーブル値   1000 位 + 100 位の読み出し
		subwf	digit43,W
		btfsc	STATUS,Z	;デバイス番号 1000 位 + 100 位 = テーブル値 か？
		bra	dnck02		;Yes

		movlw	d'4'
		bra	dnck03

dnck02		rcall	xaddr_read	;テーブル値     10 位 +   1 位の読み出し
		subwf	digit21,W
		btfsc	STATUS,Z	;デバイス番号   10 位 +   1 位 = テーブル値 か？
		bra	dnck06		;Yes. 一致した

		; テーブルアドレスの更新

		movlw	d'3'
dnck03		movwf	tblcnt		;ループカウンタを設定

dnck04		rcall	xaddr_inc	;テーブルアドレスの更新
		decfsz	tblcnt,F	;ループカウンタ - 1 = 0 か？
		bra	dnck04		;No

		; テーブル終了チェック

		movf	xaddr_high,W	;high アドレスのチェック
		sublw	high dev_no_table_end
		btfss	STATUS,C
		bra	dnck05		;error. (high dev_no_table_end - xaddr_high) < 0
		btfss	STATUS,Z 
		bra	dnck01		;next.  (high dev_no_table_end - xaddr_high) > 0

		movf	xaddr_low,W	;low アドレスのチェック
		sublw	low dev_no_table_end
		btfss	STATUS,C
		bra	dnck05		;error. (low dev_no_table_end - xaddr_low) < 0
		btfss	STATUS,Z 
		bra	dnck01		;next.  (low dev_no_table_end - xaddr_low) > 0

		; ＮＧ: 該当デバイス番号なし

dnck05		bsf	err_flag,flg0	;チェックエラーフラグ(0) = ON
		rcall	check_respons	;チェック結果ＮＧ応答出力
		movlw	led_ng		;RE2-0=110: NG(赤LED) 点灯
		movwf	PORTE		;ポートE に出力
		rcall	wait_100ms	;100m 秒 ウェイト
		movlw	sw_enbl		;RE2-0=000: スイッチ入力イネーブル, LED 消灯
		movwf	PORTE		;ポートE に出力

		rcall	buzzer_buu	;エラー時: "ブー" ブザー音出力
		bcf	dno_flag,flg0	;デバイス番号有／無効フラグ = 無効
		bra	dnck10

		; ＯＫ: 該当デバイス番号あり

dnck06		rcall	xaddr_read	;テーブル値の読み出し
		movwf	ext_flag	;拡張データ,出力反転,特殊処理指定フラグの保存
		rcall	xaddr_read	;テーブル値の読み出し
		movwf	addr_high	;デバイスチェックデータの先頭 high アドレス
		rcall	xaddr_read	;テーブル値の読み出し
		movwf	addr_low	;デバイスチェックデータの先頭 low アドレス

		bcf	err_flag,flg0	;チェックエラーフラグ(0) = OFF
		rcall	check_respons	;チェック結果ＯＫ応答出力

		movf	addr_high,W
		movwf	xaddr_high	;デバイスチェックデータの先頭 high アドレス
		movf	addr_low,W
		movwf	xaddr_low	;デバイスチェックデータの先頭 low アドレス
		rcall	xaddr_read	;テーブル値の読み出し
		movwf	lpcnt		;ワークとして使用

		; 無効指定ビットの処理 (Ver.2.10 2010/10/26 invalidフラグの新設)

		btfss	lpcnt,xivd	;無効指定 か？
		bra	dnck08		;No

		movlw	d'4'
		movwf	lpcnt		;ループカウンタに設定

dnck07		rcall	buzzer_pi	;"ピッ" ブザー音出力
		movlw	d'30'
		rcall	wait_w1ms
		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		bra	dnck07		;No
		bra	dnck05

		; 注意喚起指定ビットの処理

dnck08		movlw	d'1'
		btfsc	lpcnt,xatn	;注意喚起指定 か？
		movlw	d'3'		;Yes
		movwf	lpcnt		;ループカウンタに設定

dnck09		movlw	led_ok		;RE2-0=111: OK(緑LED) 点灯
		movwf	PORTE		;ポートE に出力
		rcall	wait_100ms	;100m 秒 ウェイト
		movlw	sw_enbl		;RE2-0=000: スイッチ入力イネーブル, LED 消灯
		movwf	PORTE		;ポートE に出力

		rcall	buzzer_po	;正常時:   "ポッ" ブザー音出力
		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		bra	dnck09		;No

		bsf	dno_flag,flg0	;デバイス番号有／無効フラグ = 有効

dnck10		btfss	pau_flag,flg0	;休止スイッチ有効フラグ = ON か？
		bra	dnck11		;No

;		受信デバイス番号の正確性確認　(ブザー音数で表示)

		bcf	PORTA,ra1	;RA1=0: 3-8 デコーダ制御出力(j5: to U4) = disable
		rcall	wait_1s		;約 1 秒 ウェイト
		swapf	digit43,W	;上位: 1000 位
		rcall	count_beep

		rcall	wait_300ms	;約 300m 秒 ウェイト
		movf	digit43,W	;下位:  100 位
		rcall	count_beep

		rcall	wait_300ms	;約 300m 秒 ウェイト
		swapf	digit21,W	;上位:   10 位
		rcall	count_beep

		rcall	wait_300ms	;約 300m 秒 ウェイト
		movf	digit21,W	;下位:    1 位
		rcall	count_beep
		bsf	PORTA,ra1	;RA1=1: 3-8 デコーダ制御出力(j5: to U4) = enable

dnck11		return

;==========================================================================

;		チェック結果の応答出力
;		(to U1 ... OK: 50m 秒間,  NG: 5m 秒間 "L" パルス信号出力)

check_respons
		bcf	TRISD,rd7	;RD7: 出力を ポート D に設定 (チェック結果応答用)
		bcf	PORTD,rd7	;RD7=0: チェック結果応答出力(j7: to U1)
		movlw	d'50'		;50m 秒 ウェイト: OK
		btfsc	err_flag,flg0	;チェックエラーフラグ(0) = OFF か？
		movlw	d'5'		; 5m 秒 ウェイト: NG
		rcall	wait_w1ms
		bsf	PORTD,rd7	;RD7=1
		bsf	TRISD,rd7	;RD7: 入力を ポート D に設定 (ポーズ信号入力用)
		movlw	d'60'		;60m 秒 ウェイト
		;*** このタイミングを取るのがまずくてＵ１で 4～5 日間
		;    悩んでしまった             (2006/06/04)          ***
		rcall	wait_w1ms
		return

;		カウンタ > 0:  "ピッ" ブザー音出力 (カウンタ数)
;		カウンタ = 0:  "ブー" ブザー音出力

count_beep
		andlw	h'0f'		;下位を取り出す
		movwf	lpcnt
		btfss	STATUS,Z 
		bra	cbp01

		rcall	buzzer_buu	; "ブー" ブザー音出力
		bra	cbp02

cbp01		rcall	buzzer_pi	; "ピッ" ブザー音出力
		rcall	wait_200ms
		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		bra	cbp01		;No

cbp02		return

		; デバイス番号テーブル,デバイスチェックデータの読み出し

xaddr_read
		rcall	xaddr_read_0	;テーブルデータの読み出し
		movwf	rdtemp		;読み出しデータの一時保存
		movf	PCL,W		;PCLATU,PCLATH を現在値に戻す
		rcall	xaddr_inc	;テーブルアドレスの更新
		movf	rdtemp,W	;読み出しデータの復帰
		return

		; テーブルアドレスの更新

xaddr_inc
		movlw	d'2'
		addwf	xaddr_low,F	;テーブルの low アドレス + 2
		btfsc	STATUS,Z
		incf	xaddr_high,F	;テーブルの high アドレス
		return

		; テーブルデータの読み出し
		; 入力:	xaddr_high: テーブルの high アドレス
		;	xaddr_low:  テーブルの low アドレス
		; 出力:	W: テーブルの該当データ

xaddr_read_0
		clrf	PCLATU
		movf	xaddr_high,W	;テーブルの high アドレス
		movwf	PCLATH
		movf	xaddr_low,W	;テーブルの low アドレス
		movwf	PCL

;==========================================================================
;	被試験ＩＣのデバイスチェック
;	入力:	dno_flag = 1:        デバイス番号有／無効フラグ = 有効
;		addr_high, addr_low: チェックデータ先頭アドレス
;	出力:	OK: "ポッ" ブザー音(100m 秒), 緑LED 点滅(約 2 秒)
;		  pau_flag = ON 時 (j7: to U1 ... 50m 秒間 "L" 信号出力)
;		NG: "ブー" ブザー音(250m 秒), 赤LED 点滅(約 2 秒)
;		  pau_flag = ON 時 (j7: to U1 ...  5m 秒間 "L" 信号出力)
;==========================================================================

device_check
;		btfss	dno_flag,flg0	;デバイス番号有／無効フラグ = 有効か？
;		bra	dvckxx		;No. NG

		movlw	repcnt		;繰り返しチェック回数 = repcnt
		btfsc	ext_flag,xrep	;総繰り返し無指定か？
		movlw	d'1'		;Yes. 繰り返しチェック回数 = 1
		btfsc	pau_flag,flg0	;休止スイッチ有効フラグ = OFF か？
		movlw	d'1'		;No. 繰り返しチェック回数 = 1
		movwf	repeatcnt	;総繰り返しチェックカウンタの設定
		clrf	spc_byte	;特殊処理指定バイトのクリア
		clrf	err_flag	;チェックエラーフラグ(0),(1)のクリア

		; 基礎データの読み出し

dvck01		movf	addr_high,W
		movwf	xaddr_high	;デバイスチェックデータの先頭 high アドレス
		movf	addr_low,W
		movwf	xaddr_low	;デバイスチェックデータの先頭 low アドレス

		rcall	pin_io_read	;;ピンの入出力割当データの読み出しと保存

		btfsc	pin_io_rd,clk7	;クロック入力指定ビット = OFF か？
		rcall	pin_cl_read	;;No. クロック入力ピンの読み出しと保存

		rcall	xaddr_read	;テーブル値の読み出し
		movwf	ck_dat_no	;チェックデータ個数の保存

		; 入出力ポートの設定, 被試験ＩＣへの電源供給

		rcall	io_port_set	;;入出力ポートの設定

		movf	ic_pin_no,W	;ＩＣピン数(Vcc Pin)を
		movwf	PORTE		;ポートE に出力
		rcall	wait_100us	;100μ秒 ウェイト

		; チェックデータの読み出し

;		チェックデータバイト RD の特殊処理指定ビット bit6(spc6)

;		 bit7(clk7) bit6(spc6)	xspc	  Function
;			0	1	 1	チェックのパス/クロックの追加指定
;			0	0	 0	ノーマル動作
;			1	0	 0	クロック入力指定
;			0	1	 0	特殊処理指定

;		特殊処理指定バイトのビット

;		 bit0-7=0:	無指定(チェックのパス指定時)
;		 bit0=1:	クロック数の指定
;		 bit1=1:	クロック入力ピンの変更指定
;		 bit2=1:	入出力ピン割当の変更指定
;		 bit3=1:	チェック続行指定
;		 bit4=1:	拡張データ変更(PULL-UP)指定
;		 bit5=1:	クロックの追加指定
;		 bit6=1:	クロック数(2)の指定	
;		 bit7=0:	予備	

dvck02		bcf	err_flag,flg0	;チェックエラーフラグ(0) = OFF
		clrf	spc_byte	;特殊処理指定バイトの初期設定
		clrf	cl_rep_hi	;クロック数の上位バイトの初期設定
		movlw	h'01'
		movwf	cl_rep_lo	;クロック数の下位バイトの初期設定

		rcall	ck_dat_read	;;チェックデータの読み出しと保存

		btfss	ck_dat_rd,spc6	;特殊処理指定ビット = ON か？
		bra	dvck08		;No

		; 特殊処理指定バイトの読み出し

		rcall	xaddr_read	;テーブル値の読み出し
		movwf	spc_byte	;特殊処理指定バイトの保存

		btfss	ext_flag,xspc	;チェックのパス指定か？
		bra	dvck03		;No.
		bcf	spc_byte,3	;チェック続行指定のクリア
		bcf	spc_byte,4	;拡張データ変更(PULL-UP)指定のクリア

dvck03		btfsc	spc_byte,0	;bit0=1: クロック数の指定か？
		bra	dvck07		;Yes

		btfsc	spc_byte,1	;bit1=1: クロック入力ピンの変更指定か？
		bra	dvck06		;Yes

		btfsc	spc_byte,2	;bit2=1: 入出力ピン割当の変更指定か？
		bra	dvck05		;Yes 

		btfsc	spc_byte,3	;bit3=1: チェック続行指定か？
		bra	dvck08		;Yes

		btfsc	spc_byte,4	;bit4=1: 拡張データ変更(PULL-UP)指定か？
		bra	dvck15		;Yes

		btfsc	spc_byte,5	;bit5=1: クロックの追加指定か？
		bra	dvck04		;Yes

		btfsc	spc_byte,6	;bit6=1: クロック数(2)の指定か？
		bra	dvck07		;Yes
		bra	dvck12		;No. チェックのパス指定

		; クロックの追加指定

dvck04		movlw	h'80'		;bit7=1: CK 指定
		btfsc	ext_flag,xspc	;クロックの追加指定か？
		iorwf	ck_dat_rd,F	;Yes. チェックデータ RD の保存
		bra	dvck08

		; 入出力ピン割当の変更

dvck05		movf	ck_dat_rb,W	;チェックデータ RB を
		movwf	pin_io_rb	;ピンの入出力割当 RB へ保存
		movf	ck_dat_rc,W	;チェックデータ RC を
		movwf	pin_io_rc	;ピンの入出力割当 RC へ保存
		movf	ck_dat_rd,W	;チェックデータ RD を
		movwf	pin_io_rd	;ピンの入出力割当 RD へ保存

		rcall	io_port_set	;;入出力ポートの再設定
		bra	dvck12

		; クロック入力ピンの変更

dvck06		movf	ck_dat_rb,W	;チェックデータ RB を
		movwf	pin_cl_rb	;クロック入力ピン RB へ保存
		movf	ck_dat_rc,W	;チェックデータ RC を
		movwf	pin_cl_rc	;クロック入力ピン RC へ保存
		movf	ck_dat_rd,W	;チェックデータ RD を
		andlw	h'3f'
		movwf	pin_cl_rd	;クロック入力ピン RD へ保存
		bra	dvck12

		; 出力クロック数の読み出し

dvck07		rcall	xaddr_read	;テーブル値の読み出し
		movwf	cl_rep_hi	;クロック数の上位バイトの保存
		rcall	xaddr_read	;テーブル値の読み出し
		movwf	cl_rep_lo	;クロック数の下位バイトの保存

		; 被試験ＩＣへのチェックデータ出力

dvck08		rcall	ck_dat_out	;;被試験ＩＣへのチェックデータ出力

		btfss	ck_dat_rd,clk7	;クロック出力指定ビット = ON か？
		bra	dvck10		;No

dvck09		btfss	spc_byte,6	;bit6=0: クロック数(2)の指定か？
		rcall	clock_out	;;No. 被試験ＩＣへのクロックデータ出力
		btfsc	spc_byte,6	;bit6=1: クロック数(2)の指定か？
		rcall	clock2_out	;;Yes. 被試験ＩＣへの高速クロックデータ 32,768 個出力

		; 出力クロック数 (カウンタ) の更新

		movlw	d'1'
		subwf	cl_rep_lo,F	;
		btfss	STATUS,C	;クロック数の下位バイト - 1 >= 0 か？
		subwf	cl_rep_hi,F	;No. クロック数の上位バイト - 1

		movf	cl_rep_hi,W	;クロック数の上位バイト
		iorwf	cl_rep_lo,W	;クロック数の下位バイト
		btfss	STATUS,Z	;クロック数 = 0 か？
		bra	dvck09		;No

		; チェックデータと被試験ＩＣ出力との比較

dvck10		movf	ck_dat_rb,W	;チェックデータ RB と
		btfsc	ext_flag,xinv	;(出力反転指定の場合は
		xorlw	h'ff'		;チェックデータを反転)
		xorwf	PORTB,W		;ポートB を比較して
		andwf	pin_io_rb,W	;出力ピンデータだけを取り出す
		btfss	STATUS,Z	;等しいか？
		bra	dvck11		;No. NG

		movf	ck_dat_rc,W	;チェックデータ RC と
		btfsc	ext_flag,xinv	;(出力反転指定の場合は
		xorlw	h'ff'		;チェックデータを反転)
		xorwf	PORTC,W		;ポートC を比較して
		andwf	pin_io_rc,W	;出力ピンデータだけを取り出す
		btfss	STATUS,Z	;等しいか？
		bra	dvck11		;No. NG

		movf	ck_dat_rd,W	;チェックデータ RD と
		btfsc	ext_flag,xinv	;(出力反転指定の場合は
		xorlw	h'ff'		;チェックデータを反転)
		xorwf	PORTD,W		;ポートD を比較して
		andwf	pin_io_rd,W	;出力ピンデータだけを取り出す
		andlw	h'3f'
		btfsc	STATUS,Z	;等しいか？
		bra	dvck12		;Yes. OK

dvck11		bsf	err_flag,flg0	;チェックエラーフラグ(0) = ON
		bsf	err_flag,flg1	;チェックエラーフラグ(1) = ON

		; チェックの結果表示と チェック停止 (ポーズ)

dvck12		rcall	result_pause	;;チェック結果とポーズ
		btfsc	brk_flag,flg0	;チェック中断フラグ = ON か？
		bra	dvck16		;Yes

		; 繰り返しチェック回数 (カウンタ) の更新

		rcall	wait_10us	;10μ秒 ウェイト
		decfsz	ck_dat_no,F	;チェックデータ個数 - 1 = 0 か？
		bra	dvck02		;No

		btfss	ext_flag,xext	;拡張データ指定か？
		bra	dvck16		;No

		; 拡張チェックデータの読み出しと出力

		rcall	xaddr_read	;テーブル値の読み出し
		movwf	ck_dat_no	;拡張チェックデータ個数の保存

dvck13		bcf	err_flag,flg0	;チェックエラーフラグ(0) = OFF
		rcall	ck_dat_read	;;拡張チェックデータの読み出しと保存
		rcall	ck_dat_out	;;被試験ＩＣへの拡張チェックデータ出力

		; 「各種ロジックＩＣチェック補助制御部」への拡張チェックデータ送信

		rcall	tx_data		;拡張チェックデータの送信
		btfsc	PORTA,ra3	;RA3: 補助制御完了入力(j3: from U3) = enable か？
		bra	$ - 2		;No

		; 拡張チェックデータと被試験ＩＣ出力との比較

		movf	ck_dat_rb,W	;拡張チェックデータ RB と
		xorwf	PORTB,W		;ポートB を比較して
		andwf	pin_io_rb,W	;出力ピンデータだけを取り出す
		btfss	STATUS,Z	;等しいか？
		bra	dvck14		;No. NG

		movf	ck_dat_rc,W	;拡張チェックデータ RC と
		xorwf	PORTC,W		;ポートC を比較して
		andwf	pin_io_rc,W	;出力ピンデータだけを取り出す
		btfss	STATUS,Z	;等しいか？
		bra	dvck14		;No. NG

		movf	ck_dat_rd,W	;拡張チェックデータ RD と
		xorwf	PORTD,W		;ポートD を比較して
		andwf	pin_io_rd,W	;出力ピンデータだけを取り出す
		andlw	h'3f'
		btfsc	STATUS,Z	;等しいか？
		bra	dvck15		;Yes. OK

dvck14		bsf	err_flag,flg0	;チェックエラーフラグ(0) = ON
		bsf	err_flag,flg1	;チェックエラーフラグ(1) = ON

		; チェックの結果表示と チェック停止 (ポーズ)

dvck15		rcall	result_pause	;;チェック結果とポーズ
		btfsc	brk_flag,flg0	;チェック中断フラグ = ON か？
		bra	dvck16		;Yes

		; 繰り返し (拡張) チェック回数 (カウンタ) の更新

		rcall	wait_10us	;10μ秒 ウェイト
		btfss	PORTA,ra3	;RA3: 補助制御完了入力(j3: from U3) = disable か？
		bra	$ - 2		;No

		decfsz	ck_dat_no,F	;拡張チェックデータ個数 - 1 = 0 か？
		bra	dvck13		;No

		; 入出力ポートの再 (初期) 設定

dvck16		movlw	b'11111111'
		movwf	TRISB		;RB7-0: 入力 の設定
		movwf	TRISC		;RC7-0: 入力 の設定
		movwf	TRISD		;RD7-0: 入力 の設定

		decfsz	repeatcnt,F	;総繰り返しチェックカウンタ - 1 = 0 か？
		bra	dvck01		;No

		btfsc	err_flag,flg1	;チェックエラーフラグ(1) = ON か？
		bra	dvck17		;Yes

		; 総合チェックＯＫ 

		rcall	buzzer_po	;正常時:   "ポッ" ブザー音出力
		movlw	led_ok		;RE2-0=111: OK(緑LED) 点灯
		bra	dvck18

		; 総合チェックＮＧ 

dvck17		rcall	buzzer_buu	;エラー時: "ブー" ブザー音出力
		movlw	led_ng		;RE2-0=110: NG(赤LED) 点灯

dvck18		movwf	PORTE		;ポートE に出力, 被試験ＩＣへの電源切断

		; LED 点滅 結果表示

		movlw	d'10'
		movwf	lpcnt		;ループカウンタ

dvck19		rcall	wait_100ms	;100m 秒 LED 点灯
		bcf	PORTA,ra1	;RA1=0: 3-8 デコーダ制御出力(j5: to U4) = disable
		rcall	wait_100ms	;100m 秒 LED 消灯
		bsf	PORTA,ra1	;RA1=1: 3-8 デコーダ制御出力(j5: to U4) = enable
		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		bra	dvck19		;No

		movlw	sw_enbl		;RE2-0=000: スイッチ入力イネーブル, LED 消灯
		movwf	PORTE		;ポートE に出力
		return

;==========================================================================

		; ピンの入出力割当データの読み出しと保存

pin_io_read
		rcall	xaddr_read	;テーブル値の読み出し
		movwf	ic_pin_no	;ＩＣピン数(Vcc Pin)の保存
		bcf	ic_pin_no,xatn	;注意喚起指定ビットの解除

		rcall	xaddr_read	;テーブル値の読み出し
		movwf	pin_io_rb	;ピンの入出力割当 RB の保存
		rcall	xaddr_read	;テーブル値の読み出し
		movwf	pin_io_rc	;ピンの入出力割当 RC の保存
		rcall	xaddr_read	;テーブル値の読み出し
		movwf	pin_io_rd	;ピンの入出力割当 RD の保存
		return

		; クロック入力ピンデータの読み出しと保存

pin_cl_read
		rcall	xaddr_read	;テーブル値の読み出し
		movwf	pin_cl_rb	;クロック入力ピン RB の保存
		rcall	xaddr_read	;テーブル値の読み出し
		movwf	pin_cl_rc	;クロック入力ピン RC の保存
		rcall	xaddr_read	;テーブル値の読み出し
		movwf	pin_cl_rd	;クロック入力ピン RD の保存
		return

		; チェックデータの読み出しと保存

ck_dat_read
		rcall	xaddr_read	;テーブル値の読み出し
		movwf	ck_dat_rb	;チェックデータ RB の保存
		rcall	xaddr_read	;テーブル値の読み出し
		movwf	ck_dat_rc	;チェックデータ RC の保存
		rcall	xaddr_read	;テーブル値の読み出し
		btfsc	spc_byte,4	;bit4=1: 拡張データ変更(PULL-UP)指定か？
		iorlw	h'80'		;Yes. PULL-UP 指定	(7447,141 の場合必要)
		movwf	ck_dat_rd	;チェックデータ RD の保存
		return

		; 入出力ポートの設定

io_port_set
		movf	pin_io_rb,W	;ピンの入出力割当 RB を
		movwf	TRISB		;ポート B に設定
		movf	pin_io_rc,W	;ピンの入出力割当 RC を
		movwf	TRISC		;ポート C に設定
		movf	pin_io_rd,W	;ピンの入出力割当 RD を
		andlw	h'3f'
		iorlw	h'80'		;bit7=1: pausw   休止解除スイッチ
					;bit6=0: led_pau 休止表示 PAUSE LED(黄)
		movwf	TRISD		;ポート D に設定
		return

		; 被試験ＩＣへのチェックデータ出力

ck_dat_out
		movf	ck_dat_rb,W	;チェックデータ RB を
		movwf	PORTB		;ポートB に出力
		movf	ck_dat_rc,W	;チェックデータ RC を
		movwf	PORTC		;ポートC に出力
		movf	ck_dat_rd,W	;チェックデータ RD を
		andlw	h'3f'
		movwf	PORTD		;ポートD に出力
		rcall	wait_10us	;10μ秒 ウェイト
		return

		; 被試験ＩＣへのクロックデータ出力
		; "L" → "H" → "L": positive edge 指定
		; "H" → "L" → "H": negative edge 指定

clock_out
		movf	pin_cl_rb,W	;クロックデータ RB を
		xorwf	PORTB,F		;ポートB に出力
		movf	pin_cl_rc,W	;クロックデータ RC を
		xorwf	PORTC,F		;ポートC に出力
		movf	pin_cl_rd,W	;クロックデータ RD を
		xorwf	PORTD,F		;ポートD に出力
		rcall	wait_10us	;10μ秒 ウェイト
		movf	pin_cl_rb,W	;クロックデータ RB を
		xorwf	PORTB,F		;ポートB に出力
		movf	pin_cl_rc,W	;クロックデータ RC を
		xorwf	PORTC,F		;ポートC に出力
		movf	pin_cl_rd,W	;クロックデータ RD を
		xorwf	PORTD,F		;ポートD に出力
		rcall	wait_10us	;10μ秒 ウェイト
		return

		; 被試験ＩＣへの高速クロックデータ 32,768 個出力
		; "L" → "H" → "L": positive edge 指定
		; "H" → "L" → "H": negative edge 指定

clock2_out
		movlw	h'80'
		movwf	rep_hi		;クロック数の上位バイトの初期設定
		clrf	rep_lo		;クロック数の下位バイトの初期設定

clk01		movf	pin_cl_rb,W	;クロックデータ RB を
		xorwf	PORTB,F		;ポートB に出力
		movf	pin_cl_rc,W	;クロックデータ RC を
		xorwf	PORTC,F		;ポートC に出力
		movf	pin_cl_rd,W	;クロックデータ RD を
		xorwf	PORTD,F		;ポートD に出力
		nop
		nop
		movf	pin_cl_rb,W	;クロックデータ RB を
		xorwf	PORTB,F		;ポートB に出力
		movf	pin_cl_rc,W	;クロックデータ RC を
		xorwf	PORTC,F		;ポートC に出力
		movf	pin_cl_rd,W	;クロックデータ RD を
		xorwf	PORTD,F		;ポートD に出力

		movlw	d'1'
		subwf	rep_lo,F	;
		btfss	STATUS,C	;クロック数の下位バイト - 1 >= 0 か？
		subwf	rep_hi,F	;No. クロック数の上位バイト - 1

		movf	rep_hi,W	;クロック数の上位バイト
		iorwf	rep_lo,W	;クロック数の下位バイト
		btfss	STATUS,Z	;クロック数 = 0 か？
		bra	clk01		;No

		return

		; チェックの結果表示と チェック停止 (ポーズ)

result_pause
		bcf	brk_flag,flg0	;チェック中断フラグ = OFF
		btfss	pau_flag,flg0	;休止スイッチ有効フラグ = ON か？
		bra	res05		;No

		rcall	wait_4ms	;4m秒 ウェイト
		;*** １度目のデバイスチェック結果が NG だった場合に
		;    これがないと、Ｕ１側で応答信号を拾えない
		;                                   (2006/06/05)    ***
		rcall	check_respons	;チェック結果応答出力
		btfsc	err_flag,flg0	;チェックエラーフラグ(0) = OFF か？
		bra	res01		;No

		rcall	buzzer_po	;正常時:   "ポッ" ブザー音出力
		bra	res02

res01		rcall	buzzer_buu	;エラー時: "ブー" ブザー音出力

res02		bsf	PORTD,led_pau	;RD6: 休止表示 PAUSE(黄LED) 点灯

res03		btfss	PORTD,pausw	;RD7: 休止解除スイッチ = OFF か？
		bra	res04		;No

		btfsc	PORTA,ra2	;チェック開始／中断指令(j4: from U1) か？
		bra	res03		;No

		bsf	brk_flag,flg0	;チェック中断フラグ = ON
		bsf	err_flag,flg1	;チェックエラーフラグ(1) = ON

res04		bcf	PORTD,led_pau	;RD6: 休止表示 PAUSE(黄LED) 消灯
		rcall	wait_250ms	;250m 秒 ウェイト

res05		return

;==========================================================================
;	拡張チェックデータを「各種ロジックＩＣチェック補助制御部」に送信
;==========================================================================

; スタートビット(1) + データ RD(8) + データ RC(8) + データ RB(8) + ストップビット(1)

tx_data
		bcf	PORTA,ra4	;スタートビット送出
		rcall	wait_4ms	;4m 秒 ウェイト

		movf	pin_io_rd,W	;初期値は PULL-DOWN 指定
		btfsc	ck_dat_rd,pul7	;1:PULL-UP/0:PULL-DOWN 指定ビット = OFF か？
		iorlw	h'80'		;No. PULL-UP 指定 付加
		rcall	tx_byte		;拡張チェックデータ RD を送出
		movf	pin_io_rc,W
		rcall	tx_byte		;拡張チェックデータ RC を送出
		movf	pin_io_rb,W
		rcall	tx_byte		;拡張チェックデータ RB を送出

		bsf	PORTA,ra4	;ストップビット送出
		rcall	wait_4ms	;4m 秒 ウェイト
		return

		; １バイト転送
tx_byte
		movwf	sdtemp		;送信バイトワークに保存
		movlw	d'8'
		movwf	lpcnt		;送信ビット用ループカウンタに設定

txb01		rlcf	sdtemp,F	;1 ビット左にシフト
		btfsc	STATUS,C
		bra	txb02

		bcf	PORTA,ra4	;'0' ビット送出
		bra	txb03

txb02		bsf	PORTA,ra4	;'1' ビット送出
		nop
txb03		rcall	wait_4ms	;4m 秒 ウェイト

		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		bra	txb01		;No

		return

;==========================================================================
;	ウェイト・ルーチン (10 MHz)
;==========================================================================

		; 10μ秒 ウェイトルーチン

wait_10us
		movlw	d'5'		;1
w10u01		movwf	wt1cnt		;1
		nop			;1
		nop			;1
w10u02		nop			;1
		decfsz	wt1cnt,F	;1,2
		bra	w10u02		;2,0	1+1+1+1+(1+1+2)*4+(1+2+0)=23
		return			;2	23+2=25
					;Total	25/10MHz*4 = 0.00001 S = 10 μS

		; 100μ秒 ウェイトルーチン

wait_100us
		movlw	d'60'		;1
		bra	w10u01		;2	1+2+(1+1+1+(1+1+2)*59+(1+2+0)+2)=247
					;Total	247/10MHz*4 = 0.0000988 S = 98.8 μS
;		movlw	d'59'		;1
;		bra	w10u01		;2	1+2+(1+1+1+(1+1+2)*58+(1+2+0)+2)=243
;					;Total	243/10MHz*4 = 0.0000972 S = 97.2 μS

		; 1m 秒 x W ウェイトルーチン

wait_w1ms
		movwf	wt3cnt		;1
w1m01		movlw	d'10'		;1
		movwf	wt2cnt		;1
		bra	$ + 2		;2
		bra	$ + 2		;2
w1m02		nop			;1
		rcall	wait_100us	;245	2+243
		decfsz	wt2cnt,F	;1,2
		bra	w1m02		;2,0	(1+245+1+2)*9+(1+245+2+0)=2489

		decfsz	wt3cnt,F	;1,2
		bra	w1m01		;2,0	(1+1+2+2+2489+1+2)*(W-1)+(1+1+2+2+2489+2+0)=2498*W-1
		return			;2	1+(2498*W-1)+2=2498*W+2
					;Total	(2498*W+2)/10MHz*4 = 999.2*W + 0.8 μS

		; 2m 秒 ウェイトルーチン

wait_2ms
		movlw	d'2'		;
		bra	wait_w1ms	;	1+2+(2498*2+2)=5001
					;Total	5001/10MHz*4 = 2000.4 μS = 2 mS

		; 4m 秒 ウェイトルーチン

wait_4ms
		movlw	d'4'		;
		bra	wait_w1ms	;	1+2+(2498*4+2)=9997
					;Total	9997/10MHz*4 = 3998.8 μS = 4 mS

		; 100m 秒 ウェイトルーチン

wait_100ms
		movlw	d'100'		;
		bra	wait_w1ms	;	1+2+(2498*100+2)=249805
					;Total	249805/10MHz*4 = 99922 μS = 99.922 mS

		; 200m 秒 ウェイトルーチン

wait_200ms
		movlw	d'200'		;
		bra	wait_w1ms	;	1+2+(2498*200+2)=499605
					;Total	499605/10MHz*4 = 199842 μS = 199.842 mS

		; 250m 秒 ウェイトルーチン

wait_250ms
		movlw	d'250'		;
		bra	wait_w1ms	;	1+2+(2498*250+2)=624505
					;Total	624505/10MHz*4 = 249802 μS = 249.802 mS

		; 300m 秒 ウェイトルーチン

wait_300ms
		rcall	wait_100ms	;
		bra	wait_200ms	;	(2+249805)+(2+499605)=749414
					;Total	749414/10MHz*4 = 299765.6 μS = 299.7656 mS

		; 約 1 秒 ウェイトルーチン

wait_1s
		movlw	d'10'		;
		movwf	wt4cnt		;
w1s01		rcall	wait_100ms	;	249805+2
		decfsz	wt4cnt,F	;
		bra	w1s01		;	1+1+(249807+1+2)*9+(249807+2+0)
		return			;	2498101+2
					;Total	2498103/10MHz*4 = 999241.2 μS = 1 S

;==========================================================================
;	ブザー音出力ルーチン
;==========================================================================

		; "ポッ" ブザー音出力

buzzer_po
		movlw	poh
		movwf	const_high	;音階用分周定数 high を設定
		movlw	pol
		movwf	const_low	;音階用分周定数 low を設定
		movlw	polcnt		;音長（ループカウンタ）
		bra	buzzer_control

		; "ピッ" ブザー音出力

buzzer_pi
		movlw	pih
		movwf	const_high	;音階用分周定数 high を設定
		movlw	pil
		movwf	const_low	;音階用分周定数 low を設定
		movlw	pilcnt		;音長（ループカウンタ）
		bra	buzzer_control

		; "ブー" ブザー音出力

buzzer_buu
		movlw	buuh
		movwf	const_high	;音階用分周定数 high を設定
		movlw	buul
		movwf	const_low	;音階用分周定数 low を設定
		movlw	buulcnt		;音長（ループカウンタ）
		bra	buzzer_control

		; "ピポッ" ブザー音出力

buzzer_pipo
		rcall	buzzer_pi	;"ピッ" ブザー音出力
		movlw	d'30'
		rcall	wait_w1ms
		rcall	buzzer_po	;"ポッ" ブザー音出力
		return

		; ブザー音出力コントロール

buzzer_control
		bsf	PIE1,TMR1IE	;タイマー１割り込みを許可
		rcall	wait_w1ms	;入力 W: 音長（ループカウンタ）
		bcf	PIE1,TMR1IE	;タイマー１割り込みを禁止
		return

;==========================================================================
;	タイマー割り込み処理
;==========================================================================

interrupt
		; レジスタの保存

		movwf	w_save		;W レジスタの保存
		movff	STATUS,s_save	;STATUS レジスタの保存
		movff	BSR,b_save	;BSR レジスタの保存

		btfss	PIR1,TMR1IF	;タイマ１オーバフロー か？
		goto	init		;No. Reset(Illegal interrupt)

		; タイマー１割り込み処理

		movf	const_high,W	;音階用分周定数 high を
		movwf	TMR1H		;TMR1H に設定
		movf	const_low,W	;音階用分周定数 low を
		movwf	TMR1L		;TMR1L に設定

		movlw	b'00000001'	;RA0: ブザー音出力, 対象ビットをセット
		xorwf	PORTA,F		;出力をビット反転

		bcf	PIR1,TMR1IF	;タイマ１オーバフロー解除

		; レジスタの復帰

		movff	b_save,BSR	;BSR レジスタの復帰
		movf	w_save,W	;W レジスタの復帰
		movff	s_save,STATUS	;STATUS レジスタの復帰

		retfie			;割り込みからの復帰

;==========================================================================

#include	LogicIC_Table.inc	;デバイスチェックデータテーブル

		end			;プログラムの終了
