;***** LanCableCK.asm *****************************************************
;
;	LAN ケーブル 導通チェッカー
;
;	Copyright (C) 2005-2019   by M.Yamamoto. All rights reserved.
;
;     ( coding:  Ver. 0.00   2005/07/14  by M.Yamamoto )
;	coding:  Ver. 1.00   2005/07/18  初期バージョン
;	bugfix:  Ver. 1.01   2005/08/02  総合結果(4MHz 時)の LED 表示
;	update:  Ver. 1.10   2005/07/20  割り込み(LED 消灯)処理追加
;	update:  Ver. 1.20   2005/07/20  内部発振周波数 48KHz に対応
;	update:  Ver. 1.30   2005/07/23  エラー種別表示の追加
;	update:  Ver. 1.40   2005/08/02  ブザー音出力の追加
;	update:  Ver. 1.41   2005/08/04  comment <機能と使用法>を追加
;	bug:	 Ver. 1.42   2019/10/18  下の !!!!! 注意 !!!!! を追加
;
;******************************************************* PicAsm 0200 ******

;	!!!!! 注意 !!!!!	!!!!! 注意 !!!!!	!!!!! 注意 !!!!!	!!!!! 注意 !!!!!
;
; このプログラム（ソースファイル）では内部発振周波数が 48KHz となっているが、これはどうやら間違いのようです。
;
; 最近、十何年ぶりかにこのソースファイルを見る機会があったのですが、PIC16F648A の内部発振モードでは
; マニュアルを見ると 4 MHz と 37 kHz の２種類しかありません。
;
; このプログラムの作成時に、何の資料を見て 48KHz としたのか今となっては全く分かりませんが、明らかに間違いです。
;
; そのため、ウエイトタイムルーチンやブザー音出力ルーチンでは、基準となる発振周波数を 48KHz としてプログラミングを
; しているため、実際の 37 kHz とは異なっています。
;
; しかし、本機ではウエイトタイムやブザー音の周波数が実際とは異なっていても、あまり大きな問題とはならないため、
; このプログラムを直すことは止めにしました。
;
; もし、このプログラムを参考にする場合には、その点を踏まえた上でご利用ください。
;
;	!!!!! 注意 !!!!!	!!!!! 注意 !!!!!	!!!!! 注意 !!!!!	!!!!! 注意 !!!!!

#ifdef comment

 <機能と使用法>

・当 LAN ケーブル導通チェッカーでは、10BASE-T、100BASE-TX のストレートケーブル、
　クロスケーブルの導通を自動的にチェックし、オープン、ショート、リバースのエラー
　を検出するのを目的とする。ただし、スプリットペアの検出はできない。
・まず、電源スイッチ (Power) を ON にすると、"ピポッ" とブザー音が出力され、導通
　チェック機能が開始されるのを待つ。
・そこで被試験ケーブルを、RJ-45 コネクタの信号送信側 (TX) - 受信側 (RX) 間に接続
　し、試験スイッチ (Test) を 押下 (ON) する。
・すると被試験ケーブルの１番ピンから８番ピンまでを、自動的に順次 (250m 秒ずつ) 導
　通チェックをする。そのとき LED1(緑) から LED8(緑) までが、そのチェック順に点灯、
　消灯され、チェックしているピン番号を視覚で知らせる。
・被試験ケーブルがストレートケーブルで結線が正常の場合には、1, 2, 3, 4, 5, 6, 7, 8
　のピン番号順に点灯、消灯される。
　一方、クロスケーブルで結線が正常の場合には、3, 6, 1, 4, 5, 2, 7, 8 のピン番号順
　に点灯、消灯される。
・導通チェックが８番ピンまで済むと (250m 秒 x 8 = 2 秒後) 、その総合結果を LED 表
　示とブザー音で知らせる。
　ケーブルの結線が正常の場合には、LED1(緑) から LED8(緑) までのすべてが点灯され、
　"ポッ" とブザー音が短く (100m 秒) 出力される。
　また、クロスケーブルの場合には、上記 LED に加え Cross Cable(緑) の LED が点灯さ
　れる。
・結線に誤りがある場合には、該当のピン番号に相当する LEDx(緑) が消灯となり、該当
　のエラー (Error) LED(赤) 、Open ／ Short ／ Reversed のいづれか、または複数が点
　灯されるとともに、"ブー" とブザー音が長く (250m 秒) 出力される。
　なお、クロスケーブルで結線に誤りがある場合には、ストレートケーブルと解釈して誤
　りが LED 表示される。
・被試験ケーブルが複数ある場合には、RJ-45 コネクタに接続し直し試験スイッチ (Test)
　を 押下 (ON) することで、導通チェックを繰り返し行える。
・導通チェックを終了した後で電源スイッチ (Power) を ON にしたままでいると、該当の
　LED が点灯されたままで電池が消耗される。
　それを軽減するため、導通チェック後約 30 秒が経過すると、自動的にすべての LED を
　消灯するとともに、"ピポッ" とブザー音が出力され、それを知らせる。
　（ただし、電源は入ったままであるが電池の消耗は微少 (数百μA) になる。）
　また、その後も試験スイッチ (Test) を 押下 (ON) することで、導通チェックを繰り返
　し行うことができる。

#endif

;	PIC16F648A のピンと用途

;	(1) RA2  BIN2 出力 / ERR3 LED 出力	(18) RA1  BIN1 出力 / ERR2 LED 出力
;	(2) RA3  BUFF 制御 出力			(17) RA0  BIN0 出力 / ERR1 LED 出力
;	(3) RA4  TEST スイッチ 入力　		(16) RA7  ブザー音 出力
;	(4) MCLR リセット入力			(15) RA6  クロスケーブル LED 出力
;	(5) Vss  電源 GND			(14) Vdd  電源 +5V DC
;	(6) RB0  PIN1 入力 / LED1 出力		(13) RB7  PIN8 入力 / LED8 出力
;	(7) RB1  PIN2 入力 / LED2 出力		(12) RB6  PIN7 入力 / LED7 出力
;　	(8) RB2  PIN3 入力 / LED3 出力		(11) RB5  PIN6 入力 / LED6 出力
;	(9) RB3  PIN4 入力 / LED4 出力		(10) RB4  PIN5 入力 / LED5 出力

;==========================================================================

	list		p=pic16f648a		;デバイス情報
	include		p16f648a.inc		;インクルードファイル
	errorlevel	-302			;Eliminate bank warning

;==========================================================================
;	コンフィギュレーションの設定
;==========================================================================

	__config  h'3f30'

;	          _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF
;	        & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT

;==========================================================================
;	変数、定数の定義とレジスタ割付
;==========================================================================

#define 	_48khz			;内部発振周波数 48KHz とした場合

		cblock	h'20'
pin_select				;チェックするピン番号
pin_strat				;予測出力ピン番号（ストレートケーブル用）
pin_cross				;予測出力ピン番号（クロスケーブル用）
result_strat				;チェック総合結果（ストレートケーブル用）
result_cross				;チェック総合結果（クロスケーブル用）
reg1					;汎用レジスタ
reg2					;汎用レジスタ
reg3					;汎用レジスタ
sec_count				;LED 消灯までの秒数カウンタ
cnt_high				;1 秒の上位カウンタ high
cnt_low					;1 秒の下位カウンタ low
err_type				;エラー種別フラグ
const_high				;音階用分周定数 high の保存
const_low				;音階用分周定数 low の保存
length					;音長（ループカウンタ）
pipo_flag				;"ピポッ" ブザー音出力フラグ
		endc

		cblock	h'70'
w_save					;W レジスタの保存用（割り込み処理で使用）
s_save					;STATUS レジスタの保存用（割り込み処理で使用）
		endc

#ifdef _48khz
tmrcnt		equ	d'256' - d'240'	;タイマカウンタにセットする初期値（割り込み周期）
secdath		equ	high d'50'	;50 回で 1 秒
secdatl		equ	low  d'50'	;4/48000*240*50= 1 秒
poh		equ	0		;ダミー
pol		equ	d'11' / 3	;
pih		equ	0		;ダミー
pil		equ	d'15' / 3	;
buuh		equ	0		;ダミー
buul		equ	d'23' / 3	;
pilcnt		equ	d'25'		;音長
buulcnt		equ	d'65'		;音長
#else
tmrcnt		equ	d'256' - d'200'	;タイマカウンタにセットする初期値（割り込み周期）
secdath		equ	high d'5000'	;5000 回で 1 秒
secdatl		equ	low  d'5000'	;4/4000000*200*5000= 1 秒
poh		equ	high (d'65536' - d'956')	;ド (523.26 Hz)
pol		equ	low  (d'65536' - d'956')	;
pih		equ	high (d'65536' - d'1276')	;ソ (392.00 Hz)
pil		equ	low  (d'65536' - d'1276')	;
buuh		equ	high (d'65536' - d'1911')	;ド (261.63 Hz)
buul		equ	low  (d'65536' - d'1911')	;
pilcnt		equ	d'100'		;音長
buulcnt		equ	d'250'		;音長
#endif

seccnt		equ	d'30'		;LED 消灯までの秒数

;==========================================================================
;	プログラム開始
;==========================================================================

		org	0		;リセットベクタ
		goto	init
		org	4		;割り込みベクタ
		goto	interrupt

;==========================================================================
;	SFR レジスタ等の初期設定
;==========================================================================

init
		; OPTION_REG (Bank1) の 設定

		bcf	STATUS,RP1
		bsf	STATUS,RP0	;BANK 1
		movlw	b'00001000'	;bit7=0: PORTB は PULL-UP する
					;bit6=0: GP2 の割込みは立下りエッジ
					;bit5=0: TMR0 クロックは内部供給
					;bit4=0: TMR0 L から H でカウント
					;bit3=1: プリスケーラは使用しない
					;bit2-0: プリスケーラ比
		movwf	OPTION_REG	;OPTION_REG に設定

		; PCON (Bank1) の 設定

#ifdef _48khz
		movlw	b'00000010'	;bit3=0: 内部発振周波数は 48KHz
#else
		movlw	b'00001010'	;bit7-4: 使われていない
					;bit3=1: 内部発振周波数は 4MHz
					;bit2:   使われていない
					;bit1=1: パワーオンリセットする
					;bit0=0: ブラウンアウトリセットはしない
#endif
		movwf	PCON    	;PCON に設定

		; CMCON (Bank0) の 設定

		bcf	STATUS,RP0	;BANK 0
		clrf	PORTA
		movlw	b'00000111'	;コンパレータは OFF
		movwf	CMCON   	;CMCON に設定

		; T1CON (Bank0) の 設定

		bsf	STATUS,RP0	;BANK 1
		bcf	PIE1,TMR1IE	;タイマー１割り込みを禁止

		bcf	STATUS,RP0	;BANK 0
		movlw	b'00000001'	;bit7-6: 未使用
					;bit5-4=00: プリスケーラのスケール値 1:1
					;bit3=0: 専用の発振器を使う場合に指定
					;bit2=0: 外部入力クロック指定時に有効
					;bit1=0: 内部クロックを使う
					;bit0=1: タイマー１を動作
		movwf	T1CON		;T1CON に設定

		; PORTA (Bank1) の初期化

		bsf	STATUS,RP0	;BANK 1
		movlw	b'00010000'	;bit4: 入力、bit7-6,3-0: 出力
		movwf	TRISA
		bcf	STATUS,RP0	;BANK 0

	movlw	b'01000000'		;;;;;;
	;	movlw	b'01001000'	;bit6=1: クロスケーブル LED 消灯
					;bit3=1: BUFF 制御 = Disable
					;bit2-0=000: エラー種別 LED 消灯
		movwf	PORTA

		; PORTB (Bank1) の初期化

		bsf	STATUS,RP0	;BANK 1
		clrf	TRISB		;bit7-0: 出力
		bcf	STATUS,RP0	;BANK 0

		movlw	b'11111111'	;bit7-0: LED 全消灯
		movwf	PORTB

		bcf	INTCON,T0IE	;T0IE タイマー０割り込み禁止
		bsf	INTCON,PEIE	;PEIE 周辺機器割り込みを許可
		bsf	INTCON,GIE	;GIE 全割り込み許可
	bsf	PORTA,3			;;;;;;;;

		bsf	pipo_flag,0	;"ピポッ" ブザー音出力フラグをセット

;==========================================================================
;	メインプログラム
;==========================================================================

main
		movf	pipo_flag,W
		btfsc	STATUS,Z	;"ピポッ" ブザー音出力フラグはセットか？
		goto	m01		;No.

		call	buzzer_pipo	;"ピポッ" ブザー音出力
		clrf	pipo_flag	;"ピポッ" ブザー音出力フラグをクリア

m01		btfsc	PORTA,4		;TEST スイッチは押されたか？
		goto	main		;No

		movlw	d'30'		;30mS ウエイト
		call	wait_1ms	;
		btfsc	PORTA,4		;TEST スイッチは押されたか？
		goto	main		;No

		; チェック開始前準備

		bcf	INTCON,T0IE	;T0IE 割り込み禁止

		bsf	STATUS,RP0	;BANK 1
		movlw	b'11111111'	;bit7-0: 入力
		movwf	TRISB
		bcf	STATUS,RP0	;BANK 0

		movlw	b'0000'		;bit3=0: BUFF 制御 = Enable
					;bit2-0=000: チェックするピン番号
		movwf	pin_select	;チェックするピン番号の初期設定
		movlw	b'00000001'	
		movwf	pin_strat	;ストレートケーブル用予測出力ピン番号の初期設定
		clrf	result_strat	;ストレートケーブル用チェック総合結果の初期設定
		clrf	result_cross	;クロスケーブル用チェック総合結果の初期設定
		clrf	err_type	;エラー種別フラグの初期設定

		; チェック開始
check_lp
		movf    pin_select,W	;bit2-0: チェックするピン番号の選択
		iorlw	b'01000000'	;bit6=1: クロスケーブル LED 消灯
					;bit3=0: BUFF 制御 = Enable
		movwf	PORTA

		nop			;4MHz 時には 1個以上を必要 (bugfix: Ver. 1.01)
		nop			;
		nop			;
		comf    PORTB,W         ;bit7-0 ビット反転読み込み
		xorwf	pin_strat,W	;結果の判定
		iorwf	result_strat,F	;ストレートケーブル用チェック総合結果に保存

		call	err_type_ck	;エラー種別のチェック

		movf	pin_select,W
		call	cross_cable	;クロスケーブル用予測出力ピン番号に変換
		movwf	pin_cross
		comf    PORTB,W         ;bit7-0 ビット反転読み込み
		xorwf	pin_cross,W	;結果の判定
		iorwf	result_cross,F	;クロスケーブル用チェック総合結果に保存

		movlw	d'250'		;250mS ウエイト
		call	wait_1ms	;

		incf	pin_select,F	;チェックするピン番号の更新
		bcf	STATUS,C
		rlf	pin_strat,F	;予測出力ピン番号の更新

		btfss	STATUS,C	;チェック終了か？
		goto	check_lp	;No

		; チェック総合結果の表示
		; PORTB: 点灯LED(緑) bit: OK, 消灯LED bit: NG
		; PORTA: クロスケーブル(緑). エラー種別(赤)

;		bsf	PORTA,3		;bit3=1: BUFF 制御 = Disable
		movlw	b'01001000'	;bit6=1: クロスケーブル LED 消灯
					;bit3=1: BUFF 制御 = Disable
					;bit2-0=000: エラー種別 LED 消灯
		movwf	PORTA		;チェック総合結果の表示時の初期設定

		bsf	STATUS,RP0	;BANK 1
		clrf	TRISB		;bit7-0: 出力
		bcf	STATUS,RP0	;BANK 0

		movf	result_cross,W	;クロスケーブル用チェック総合結果
		btfss	STATUS,Z	;総合結果 OK か？
		goto	m02		;No.

		movwf	PORTB		;チェック総合結果の表示
		bcf	PORTA,6		;bit6=0: クロスケーブル LED 点灯
		goto	m03

m02		movf	result_strat,W	;ストレートケーブル用チェック総合結果
		movwf	PORTB		;チェック総合結果の表示
		movf	err_type,W	;bit2-0: エラー種別
		iorlw	b'01001000'	;bit6=1: クロスケーブル LED 消灯
					;bit3=1: BUFF 制御 = Disable
		movwf	PORTA

		movf	err_type,W
		btfss	STATUS,Z	;エラー種別 = not error か？
		goto	m04		;No.

m03		call	buzzer_po	;正常時:   "ポッ" ブザー音出力
		goto	m05

m04		call	buzzer_buu	;エラー時: "ブー" ブザー音出力

		; タイマー０の設定

m05		clrf	sec_count	;秒数カウンタのクリア
		movlw	secdath
		movwf	cnt_high	;1 秒の上位カウンタ high をセット
		movlw	secdatl
		movwf	cnt_low		;1 秒の下位カウンタ low をセット
		movlw	tmrcnt		;割り込み周期値
		movwf	TMR0		;タイマに初期値をセット
		bsf	INTCON,T0IE	;T0IE 割り込み許可

		goto	main

;==========================================================================
;	エラー種別のチェック
;	 err_type.bit0: open
;	 err_type.bit1: short
;	 err_type.bit2: reversed
;	 err_type.bit_: split pairs
;==========================================================================

err_type_ck
		comf    PORTB,W         ;bit7-0 ビット反転読み込み
		btfss	STATUS,Z	;'1' bit があるか？
		goto	ck01		;Yes.

		bsf	err_type,0	;種別: open error
		goto	ck04

ck01		movwf	reg2		;読み込みデータをワークレジスタへ
		bcf	STATUS,C	;C フラグのクリア

ck02		rrf	reg2,F		;1 bit 右にシフト
		btfss	STATUS,C	;C フラグ = 1 か？
		goto	ck02		;No.

		movf	reg2,F
		btfsc	STATUS,Z	;ワークレジスタ = 0 か？
		goto	ck03		;Yes.

		bsf	err_type,1	;種別: short error
		goto	ck04

ck03		comf    PORTB,W         ;もう一度 bit7-0 ビット反転読み込み
		xorwf	pin_strat,W	;'1' bit の位置をチェック
		btfsc	STATUS,Z	;正しい (W = 0) か？
		goto	ck04		;Yes. not error

		bsf	err_type,2	;種別: reversed error

ck04		return

;==========================================================================
;	クロスケーブル用予測出力ピン番号に変換
;==========================================================================

cross_cable
		andlw	0fh
		addwf	PCL,F		;プログラム・カウンタに加算

					;3, 6, 1, 4, 5, 2, 7, 8

		dt	b'00000100', b'00100000', b'00000001', b'00001000'
		dt	b'00010000', b'00000010', b'01000000', b'10000000'

;==========================================================================
;	ブザー音出力ルーチン     ( クロック 4MHz / 48KHz )
;==========================================================================

		; "ポッ" ブザー音出力
buzzer_po
		movlw	poh
		movwf	const_high	;音階用分周定数 high を設定
		movlw	pol
		movwf	const_low	;音階用分周定数 low を設定
		movlw	pilcnt
		movwf	length		;音長（ループカウンタ）を設定
		goto	buzzer_control

		; "ピッ" ブザー音出力
buzzer_pi
		movlw	pih
		movwf	const_high	;音階用分周定数 high を設定
		movlw	pil
		movwf	const_low	;音階用分周定数 low を設定
		movlw	pilcnt
		movwf	length		;音長（ループカウンタ）を設定
		goto	buzzer_control

		; "ブー" ブザー音出力
buzzer_buu
		movlw	buuh
		movwf	const_high	;音階用分周定数 high を設定
		movlw	buul
		movwf	const_low	;音階用分周定数 low を設定
		movlw	buulcnt
		movwf	length		;音長（ループカウンタ）を設定
		goto	buzzer_control

		; "ピポッ" ブザー音出力
buzzer_pipo
		call	buzzer_pi	;"ピッ" ブザー音出力
		movlw	d'30'
		call	wait_1ms
		call	buzzer_po	;"ポッ" ブザー音出力
		return

		; ブザー音出力コントロール
buzzer_control
#ifdef _48khz				;48KHz 時はタイマー１割り込みを使用しない
		bsf	PORTA,7		;ブザー音 "1" 出力
		movf	const_low,W	;1
		movwf	reg3		;1
bz01		decfsz	reg3,F		;1,2
		goto	bz01		;2,0	1+1+(1+2)*(W-1)+(2+0)=1+3W

		bcf	PORTA,7		;ブザー音 "0" 出力
		movf	const_low,W	;1
		movwf	reg3		;1
bz02		decfsz	reg3,F		;1,2
		goto	bz02		;2,0	1+1+(1+2)*(W-1)+(2+0)=1+3W

		decfsz	length,F
		goto	buzzer_control
#else
		bsf	STATUS,RP0	;BANK 1
		bsf	PIE1,TMR1IE	;タイマー１割り込みを許可
		bcf	STATUS,RP0	;BANK 0

		movf	length,W	;音長（ループカウンタ）を設定
		call	wait_1ms

		bsf	STATUS,RP0	;BANK 1
		bcf	PIE1,TMR1IE	;タイマー１割り込みを禁止
		bcf	STATUS,RP0	;BANK 0
#endif
		return

;==========================================================================
;	ウエイトタイム作成ルーチン     ( クロック 4MHz / 48KHz )
;==========================================================================

;  4MHz:   t = 4 / 4000000 = 1 μS
; 48KHz:   t = 4 / 48000 = 0.0833 mS = 83.3 μS

		; 1 mS のウエイト
wait_1ms
#ifdef _48khz
		movwf	reg1		;1
wt01		nop			;1
		goto	$+1		;2
		goto	$+1		;2
		goto	$+1		;2
		goto	$+1		;2
		decfsz	reg1,F		;1,2
		goto	wt01		;2,0	1+(9+1+2)*(W-1)+(9+2+0)=12*W
		return			;2	12*W+2
					;	(12*W+2)/48000*4 S
#else
		movwf	reg1		;1
wt01		movlw	4		;1
		movwf	reg2		;1
wt02		movlw	d'49'		;1
		movwf	reg3		;1
wt03		goto	$+1		;2
		decfsz	reg3,F		;1,2
		goto	wt03		;2,0	1+1+(2+1+2)*48+(2+2+0)=246
		decfsz	reg2,F		;1,2
		goto	wt02		;2,0	1+1+(246+1+2)*3+(246+2+0)=997
		decfsz	reg1,F		;1,2
		goto	wt01		;2,0	1+(997+1+2)*(W-1)+(997+2+0)=1000*W
		return			;2	1000*W+2
					;	(1000*W+2)/4000000*4 S
#endif

;==========================================================================
;	割り込み処理
;==========================================================================

interrupt
		; レジスタの保存

		movwf	w_save		;W レジスタの保存
		movf	STATUS,W
		movwf	s_save		;STATUS レジスタの保存
		bcf	STATUS,RP0	;バンク 0

		btfss	INTCON,T0IF	;タイマ０オーバフロー か？
		goto	int02		;No

;	タイマー０割り込み

		movlw	tmrcnt
		movwf	TMR0		;タイマ初期値をセット
		bcf	INTCON,T0IF	;タイマオーバフロー解除

		; LED 制御（消灯までの秒数カウント）開始

		movlw	1
		subwf	cnt_low,F	;1 秒の下位カウンタ low - 1
		btfss	STATUS,C	;C=1（0 or 正）なら次をスキップ
		decf	cnt_high,F	;1 秒の上位カウンタ high - 1

		movf	cnt_high,W
		iorwf	cnt_low,W
		btfss	STATUS,Z	;cnt_high = cnt_low = 00h か？
		goto	int03		;No

		; cnt_high = 00h and cnt_low = 00h 

		incf	sec_count,F	;秒数カウンタ + 1
		movlw	seccnt
		subwf	sec_count,W	;秒数カウンタ = seccnt か？
		btfss	STATUS,Z
		goto	int01		;秒数カウンタ <> seccnt ならジャンプ

		; sec_count = seccnt, LED 全消灯

		movlw	b'11111111'	;bit7-0: LED 全消灯
		movwf	PORTB
		movlw	b'01001000'	;bit6=1: クロスケーブル LED 消灯
					;bit3=1: BUFF 制御 = Disable
					;bit2-0=000: エラー種別 LED 消灯
		movwf	PORTA
		bsf	pipo_flag,0	;"ピポッ" ブザー音出力フラグをセット

		bcf	INTCON,T0IE	;T0IE 割り込み禁止
		goto	int03

		; 1 秒カウンタの再設定

int01		movlw	secdath		;割り込みカウントデータ
		movwf	cnt_high	;1 秒の上位カウンタ high をセット
		movlw	secdatl
		movwf	cnt_low		;1 秒の下位カウンタ low をセット
		goto	int03

;	タイマー１割り込み

int02		btfss	PIR1,TMR1IF	;タイマ１オーバフロー か？
		goto	int03		;No

		movf	const_high,W	;音階用分周定数 high を
		movwf	TMR1H		;TMR1H に設定
		movf	const_low,W	;音階用分周定数 low を
		movwf	TMR1L		;TMR1L に設定

		movlw	b'10000000'	;対象ビットをセット
		xorwf	PORTA,F		;出力をビット反転

		bcf	PIR1,TMR1IF	;タイマ１オーバフロー解除

		; レジスタの復帰

int03		movf	s_save,W
		movwf	STATUS		;STATUS レジスタの復帰
		swapf	w_save,F
		swapf	w_save,W	;W レジスタの復帰

		retfie			;割り込みからの復帰


		end			;プログラムの終了
