;***** ElapsedClock.asm ***************************************************
;
;	アラーム音通知型経過時計
;
;	Copyright (C) 2016   by M.Yamamoto. All rights reserved.
;
;     ( coding:  Ver. 0.00   2016/08/14  by M.Yamamoto )
;	coding:  Ver. 1.00   2016/08/24  初期バージョン
;	coding:  Ver. 1.01   2016/12/16  コメントの修正
;	bugfix:  Ver. x.xx
;
;******************************************************* PicAsm 0240 ******

;	Device: PIC12F635	Clock: 8MHz (Internal OSC)

#ifdef comment

 <機能概要>

・本機は、アラーム音で時間の経過を通知する経過時計である。利用法はいろいろと考えられるが、たとえば、何かの作業をするときに、刻々と経
　過して行く時間を、目をその作業から離すことなくアラーム音で把握しながら作業をしたい、というような場合などに使用するのを目的とする。

（当初、まったくの音のみで通知をするものを、とも考えたが、簡易型のために言葉による音声ではないため、アラーム（ブザー）音の組み合わせ
　だけでは表現にも限度があり、一部ＬＥＤによる視覚の力も借りることにした。しかし、本機は電池駆動とするため消費電流にも考慮が必要。）

（もともと、簡易型の音のみということで８ピンのＰＩＣを使用することから始まっていて、それでもピン３本が余っているために、これでＬＥＤ
　を表示させようという発想のため、表現が中途半端になった感もある。１８ピンのＰＩＣを使用すれば多桁の７セグＬＥＤの表示が可能である。）

・さて、まず、本機の電源をＯＮにすると、ＬＥＤ (00) ～ (50) が約３秒間点滅を繰り返した後、開始音としての "ドミソド" ブザー音が出力さ
　れる。その後本機は、２つあるスイッチの操作待ち状態となって、ユーザのスイッチ操作を待ち続ける。

・２つあるスイッチの内、１つは START スイッチであり、このスイッチの操作によって経過時計の動作が開始される。経過時計が動作すると刻々と
　"秒" が刻まれ続け、上記のように "音" と "光" でそのときの時間経過を知らせる。

・毎 "秒" の更新ごとに "ピッ"、"ピッ"、"ピッ"、"ピッ"、・・・ と "秒" アラーム音が断続的に鳴り続け、かつ、そのときの経過している 
　"十分" に対応したＬＥＤ (00) ～ (50) の内の１つがが、偶数秒時には１秒間点灯し、奇数秒時には１秒間滅灯を繰り返す。

・また、"秒" アラーム音に加え、毎 "十秒" ごとには "ポッ" という "十秒" アラーム音が鳴る。このとき "十秒" アラーム音の方が優先で "秒" 
　アラーム音は鳴らない。（"秒"アラーム = "ピッ": ソ音 (約 392 Hz)、"十秒"アラーム = "ポッ": ド音 (約 523 Hz)）

・同様に、毎 "分" ごとには "ポポッ" という "分" アラーム音が鳴り、毎 "十分" ごとにはまず、それまで対応していたＬＥＤ (00) ～ (50) の
　点滅が１つ更新されて新しくなるとともに、"ポポポポッ" という "十分" アラーム音が鳴る。そしてかつ、その後に "ピポッ" という "十分" 数
　アラーム音がその数だけ鳴り続いて、何十分経過したかを知らせる。

・これらのアラーム音をまとめると次のようになり、優先順位は下に行くほど高く、同時に発生した低い優先順位のものは無視される。

	毎 "秒" の更新ごと	"ピッ"
	毎 "十秒" の更新ごと	"ポッ"
	毎 "分" の更新ごと	"ポポッ"
	毎 "十分" の更新ごと	"ポポポポッ"、"ピポッ"（ 0 ～ 5 回 ）

・本機では、経過時間は "59 分 59 秒" が最大であるが、その１秒後には、再び "00 分 00 秒" の START スイッチの押下直後の状態に戻って、以
　上のように、アラーム音とＬＥＤ (00) ～ (50) の点滅を繰り返して、時間経過のカウントを永遠にし続ける。

・このように、経過時計が動作中は時間の経過とともに１秒ごとに何らかのアラーム音が鳴り続けることになるが、場合によっては、毎 "秒" ごと
　の "秒" アラーム音が煩わしく感じる場合があり、そのようなときには、２つあるスイッチの内の SUPPRESS スイッチを操作することによって、
　"秒" アラーム音だけを抑止して鳴らないようにすることができる。

・この SUPPRESS スイッチは、START スイッチによる経過時計の動作の開始前後を問わずいつでも機能する。また、この SUPPRESS スイッチは押下
　するごとにその機能のＯＮ／ＯＦＦを繰り返してトグル動作をする。また、このスイッチを操作したときには "ブブッ" という操作音が鳴る。

・また、START スイッチは上記のように、経過時計の動作の開始前には文字通り START スイッチとして機能するが、一方、経過時計の動作中に押下
　すると CANCEL スイッチとして機能し、経過時計の動作が停止する。このとき "ブッブー" という操作音を鳴らす。これに対して、START スイッ
　チとしての機能のときには、特に操作音を鳴らすことはないが、この操作直後に "ポポポポッ" という "十分" アラーム音が鳴ってそれに代用を
　している。

・CANCEL スイッチの操作で停止した経過時計も、次の START スイッチの操作で、再び "00 分 00 秒" から経過時計の動作が開始される。

（本機では、２つのスイッチに対してのチャッタリングや２重検知の防止策として、私の他のプログラムのように特別な専用遅延（ウェイト）ルー
　チンは設けず、各スイッチに対する適度な長さのブザー音を挿入することで、それらを吸収している。）

#endif

;==========================================================================

;	PIC12F635 のピンと用途

;		① Vdd	電源 +5V DC		⑧ Vss	電源 GND
;		② GP5	START/CANCEL SW 入力	⑦ GP0	BCD-0 bit 出力
;		③ GP4	アラーム音 出力	　	⑥ GP1	BCD-1 bit 出力
;		④ GP3	SUPPRESS SW 入力	⑤ GP2	BCD-2 bit 出力

;	      GP3 は入力専用で、出力ポートには使えない。

;==========================================================================

		list		P=PIC12F635	;デバイス情報
		include        "P12F635.INC"	;インクルードファイル
		errorlevel	-302		;Eliminate bank warning

		__config	_CPD_OFF & _CP_OFF & _BOD_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT

;==========================================================================
;		変数、定数の定義とレジスタ割付け
;==========================================================================

;#define 	xx_debug			;TMR0 基準時間の調整中: 補正値(xx)

		radix	dec

tm0_h_val	equ	256 - 200		;ハードタイマー０カウント値 (4 / 8MHz * 200 = 100μS)
xx		equ	-700			;補正値
tm0_s_val	equ	10000 + xx		;ソフトタイマー０のカウント値
suppsw		equ	3			;GP3: SUPPRESS スイッチ
stsw		equ	5			;GP5: START(CANCEL) スイッチ
buzzer		equ	4			;GP4: アラーム音 出力

f_doh		equ	65536 - 1911		;ド (523.26 Hz)  at 8MHz
f_so		equ	65536 - 2551		;ソ (392.00 Hz)
f_mi		equ	65536 - 3034		;ミ (329.63 Hz)
f_do		equ	65536 - 3822		;ド (261.63 Hz)
po_tim		equ	100			;音長(ms)
pi_tim		equ	100			;音長
bu_tim		equ	100			;音長
buu_tim		equ	250			;音長
dms_tim		equ	200			;音長

		cblock	h'40'
tm0_cnt_h					;ソフトタイマー０の high カウンタ
tm0_cnt_l					;ソフトタイマー０の low  カウンタ
const_high					;音階用分周定数 high の保存
const_low					;音階用分周定数 low の保存
start_flg					;START フラグ（カウント中表示）
alm_flg						;アラームフラグ
cnt_alm_m10					;"十分"数アラームカウンタ
supp_flg					;"秒"アラーム音抑止フラグ
cnt_min10					;経過"十分"カウンタ
cnt_min01					;経過"分"カウンタ
cnt_sec10					;経過"十秒"カウンタ
cnt_sec01					;経過"秒"カウンタ
led_cnt						;LED デモ表示用カウンタ
wt1cnt						;ウェイト用ループカウンタ
wt2cnt						;ウェイト用ループカウンタ
wt3cnt						;ウェイト用ループカウンタ
		endc

		cblock	h'70'
w_save						;W レジスタの退避用
s_save						;STATUS レジスタの退避用
		endc

;==========================================================================
;		マクロ命令定義
;==========================================================================

;		Sound_M マクロ

Sound_M		macro	@scale,@time
		movlw	high @scale	;出力音階
		movwf	const_high
		movlw	low @scale
		movwf	const_low
		movlw	@time		;出力時間(ms)
		call	buzzer_control	;ブザー音出力コントロール
		endm

;==========================================================================
;		プログラム開始
;==========================================================================

		org	h'0000'		;リセットベクタ
		goto	start

		org	h'0004'		;割り込みベクタ
		goto	interrupt

;==========================================================================
;		初期化処理
;==========================================================================

start
		clrf	STATUS		;STATUS クリア
	 	clrf	INTCON		;INTCON クリア

		; GPIO をデジタルI/O に設定

		clrf	GPIO
		movlw	h'07'		;Comparator mode Off
		movwf	CMCON0		;GP2-0 はデジタルI/O

		bsf	STATUS,RP0	;バンク 1
		movlw	h'28'		;GP0-GP2,GP4: 出力, GP3,GP5: 入力
		movwf	TRISIO

		; 内部クロックを 8 MHz に設定

		movlw	h'70'		;CLOCK=8MHz
		movwf	OSCCON

		; タイマー０,１割り込みの設定

		movlw	h'88'		;プリスケーラ: 使用しない
		movwf	OPTION_REG

		bcf	PIE1,TMR1IE	;TMR1IE: タイマー１割り込みを禁止
		bcf	STATUS,RP0	;バンク 0
		bcf	INTCON,T0IE	;T0IE: タイマー０割り込みを禁止

		movlw	b'00000001'	;bit7-6: 未使用
					;bit5-4=00: プリスケーラのスケール値 1:1
					;bit3=0: 専用の発振器を使う場合に指定
					;bit2=0: 外部入力クロック指定時に有効
					;bit1=0: 内部クロックを使う
					;bit0=1: タイマー１を動作
		movwf	T1CON		;T1CON の設定

		bsf	INTCON,PEIE	;PEIE 周辺機器割り込みを許可
		bsf	INTCON,GIE	;GIE: グローバル割り込み許可

		; 各変数の初期設定

		clrf	supp_flg	;"秒"アラーム音抑止フラグの初期設定
		clrf	start_flg	;START フラグの初期設定

		call	led_demo	;LED 点滅デモ
		call	dl_mi_so_dh	;"ドミソド" ブザー音出力

;==========================================================================
;		メイン・ルーチン
;==========================================================================

;		START スイッチは CANCEL スイッチも兼ねている
;		カウント動作前に ON すると START スイッチとして機能
;		カウント動作中に ON すると CANCEL スイッチとして機能

;		SUPPRESS スイッチは "秒"アラーム音を抑止するものでトグル動作

main
		btfsc	GPIO,suppsw	;SUPPRESS スイッチ = ON か？
		goto	m01		;No

		movlw	b'00000001'
		xorwf	supp_flg,F	;"秒"アラーム音抑止フラグをセット／リセット
		call	buzzer_bubu	;"ブブッ" ブザー音出力 (230 mS)
		movlw	200
		call	wait_w1ms

m01		btfsc	start_flg,0	;START フラグ = ON （カウント中）か？

#ifndef xx_debug
		goto	m02		;Yes
#else
		goto	m02x
#endif
		btfsc	GPIO,stsw	;START スイッチ = ON か？
		goto	main		;No

		; START スイッチ = ON の処理

		clrf	cnt_min10	;経過"十分"カウンタの初期設定
		clrf	cnt_min01	;経過"分"カウンタの初期設定
		clrf	cnt_sec10	;経過"十秒"カウンタの初期設定
		clrf	cnt_sec01	;経過"秒"カウンタの初期設定
		clrf	alm_flg		;アラームフラグの初期設定
		clrf	cnt_alm_m10	;"十分"数アラームカウンタの初期設定
		bsf	start_flg,0	;START フラグをセット（カウント中表示）

		movlw	tm0_h_val	;ハードタイマー０カウント値
		movwf	TMR0		;タイマー０ TMR0 の設定
		movlw	high tm0_s_val	;ソフトタイマー０のカウント値
		movwf	tm0_cnt_h	;ソフトタイマー０の high カウンタの設定
		movlw	low tm0_s_val	;ソフトタイマー０のカウント値
		movwf	tm0_cnt_l	;ソフトタイマー０の low  カウンタの設定
		bsf	INTCON,T0IE	;タイマー０割り込みを許可
#ifndef xx_debug
		goto	m03
#else
		movlw	6		;;74HC138 の未使用端子 Y6(9 pin) へ出力
		movwf	GPIO		;; "L" 出力の時間が丁度１時間になるように
		goto	main		;; 補正値(xx) を調整する
;
m02x		btfss	alm_flg,0	;bit0: "秒"カウンタ更新フラグ = 1 か？
		goto	main		;No

		clrf	alm_flg		;"秒"カウンタ更新フラグをクリア

		movf	cnt_sec01,W	;経過"秒"カウンタ = 0 か？
		btfss	STATUS,Z
		goto	main		;No

		movf	cnt_sec10,W	;経過"十秒"カウンタ = 0 か？
		btfss	STATUS,Z
		goto	main		;No

		movf	cnt_min01,W	;経過"分"カウンタ = 0 か？
		btfss	STATUS,Z
		goto	main		;No

		movf	cnt_min10,W	;経過"十分"カウンタ = 0 か？
		btfss	STATUS,Z
		goto	main		;No
		goto	m11		;Yes. 終了
#endif

		; カウント中の処理

m02		btfss	GPIO,stsw	;START スイッチ = ON （キャンセル操作）か？
		goto	m11		;Yes. 終了

		btfss	alm_flg,0	;bit0: "秒"カウンタ更新フラグ = 1 か？
		goto	main		;No

m03		movlw	h'07'		;奇数秒: LED すべてを消灯
		btfss	cnt_sec01,0	;秒カウンタ = 奇数 か？
		movf	cnt_min10,W	;偶数秒: LED (00) ～ (50) の内１つを点灯
		movwf	GPIO		;"十分" LED の点滅制御

		; アラームフラグの設定

;		　　　　　　　　┌─── "秒"カウンタ更新フラグ（割り込み処理内でセットされる）
;		　　　　　　　　│
;		００００．ｘｘｘｘ	;alm_flg: アラームフラグ		;cnt_alm_m10: "十分"数アラーム
;		　　　　　││││
;		　　　　　│││└─── "秒"アラームフラグ	;"ピッ"
;		　　　　　││└──── "十秒"アラームフラグ	;"ポッ"
;		　　　　　│└───── "分"アラームフラグ	;"ポポッ"
;		　　　　　└────── "十分"アラームフラグ	;"ポポポポッ"	;"ピポッ"

		movf	cnt_sec01,W
		btfss	STATUS,Z	;経過"秒"カウンタ = 0 か？
		goto	m04		;No

		bcf	STATUS,C
		rlf	alm_flg,F	;bit1: "十秒"アラームフラグ = 1

		movf	cnt_sec10,W
		btfss	STATUS,Z	;経過"十秒"カウンタ = 0 か？
		goto	m04		;No

		rlf	alm_flg,F	;bit2: "分"アラームフラグ = 1

		movf	cnt_min01,W
		btfss	STATUS,Z	;経過"分"カウンタ = 0 か？
		goto	m04		;No

		rlf	alm_flg,F	;bit3: "十分"アラームフラグ = 1

		; アラーム音の出力

m04		movf	cnt_alm_m10
		btfsc	STATUS,Z	;"十分"数アラームカウンタ = 0 か？
		goto	m06		;Yes

m05		;call	alm_min10s	;"十分"数アラーム音の出力
		call	buzzer_pipo	;"ピポッ" ブザー音出力
		movlw	250
		call	wait_w1ms

		decfsz	cnt_alm_m10,F	;cnt_alm_m10 - 1
		goto	m05
		goto	m10

m06		rrf	alm_flg,F	;"秒"アラームフラグ = 1 か？
		btfss	STATUS,C
		goto	m07		;No

		btfss	supp_flg,0	;"秒"アラーム音抑止フラグ = ON か？
		;call	alm_sec01	;No. "秒"アラーム音の出力
		call	buzzer_pi	;"ピッ" ブザー音出力
		goto	m10

m07		rrf	alm_flg,F	;"十秒"アラームフラグ = 1 か？
		btfss	STATUS,C
		goto	m08		;No

		;call	alm_sec10	;"十秒"アラーム音の出力
		call	buzzer_po	;"ポッ" ブザー音出力
		goto	m10

m08		rrf	alm_flg,F	;"分"アラームフラグ = 1 か？
		btfss	STATUS,C
		goto	m09		;No

		;call	alm_min01	;"分"アラーム音の出力
		call	buzzer_popo	;"ポポッ" ブザー音出力
		goto	m10

m09		;rrf	alm_flg,F	;"十分"アラームフラグ = 1 か？
		;btfss	STATUS,C
		;goto	m10		;No

		;call	alm_min10	;"十分"アラーム音の出力
		call	buzzer_popopopo	;"ポポポポッ" ブザー音出力 (490 mS)

		movf	cnt_min10,W	;アラーム数を
		movwf	cnt_alm_m10	;"十分"数アラームカウンタにセット

m10		clrf	alm_flg		;アラームフラグをクリア
		goto	main

		; 終了処理

m11		bcf	INTCON,T0IE	;タイマー０割り込みを禁止
		clrf	start_flg	;START フラグをクリア
		movlw	h'07'		;LED すべてを消灯
		movwf	GPIO		;

		call	buzzer_bubuu	;"ブッブー" ブザー音出力 (450 mS)
		goto	main

;==========================================================================
;		LED 点滅デモ・ルーチン
;==========================================================================

		; LED 点滅デモ
led_demo
		call	led_demo1
		call	led_demo2
		call	led_demo1
		call	led_demo2
		call	led_demo1
		return

		; (00) → (10) → (20) → (30) → (40) → (50) 
led_demo1
		movlw	6
		movwf	led_cnt		;LED デモ表示用カウンタ

ldm1_01		movf	led_cnt,W
		sublw	6
		movwf	GPIO		;LED (00) ～ (50) を順に点灯
		call	wait_50ms
		movlw	h'07'
		movwf	GPIO		;LED すべてを消灯
		call	wait_50ms
		decfsz	led_cnt,F	;led_cnt - 1
		goto	ldm1_01

		return

		; (50) → (40) → (30) → (20) → (10) → (00) 
led_demo2
		movlw	6
		movwf	led_cnt		;LED デモ表示用カウンタ

ldm2_01		decf	led_cnt,W
		movwf	GPIO		;LED (50) ～ (00) を順に点灯
		call	wait_50ms
		movlw	h'07'
		movwf	GPIO		;LED すべてを消灯
		call	wait_50ms
		decfsz	led_cnt,F	;led_cnt - 1
		goto	ldm2_01

		return

;==========================================================================
;		アラーム（ブザー）音出力ルーチン
;==========================================================================

		; "ピッ" ブザー音出力
buzzer_pi
		Sound_M		f_so, pi_tim
		return

		; "ポッ" ブザー音出力
buzzer_po
		Sound_M		f_doh, po_tim
		return

		; "ピポッ" ブザー音出力 (230 mS)
buzzer_pipo
		call	buzzer_pi	;"ピッ" ブザー音出力
		call	wait_30ms
		call	buzzer_po	;"ポッ" ブザー音出力
		return

		; "ポポポポッ" ブザー音出力 (490 mS)
buzzer_popopopo
		call	buzzer_popo	;"ポポッ" ブザー音出力
		call	wait_30ms

		; "ポポッ" ブザー音出力 (230 mS)
buzzer_popo
		call	buzzer_po	;"ポッ" ブザー音出力
		call	wait_30ms
		call	buzzer_po	;"ポッ" ブザー音出力
		return

		; "ブッ" ブザー音出力
buzzer_bu
		Sound_M		f_do, bu_tim
		return

		; "ブブッ" ブザー音出力 (230 mS)
buzzer_bubu
		call	buzzer_bu	;"ブッ" ブザー音出力
		call	wait_30ms
		call	buzzer_bu	;"ブッ" ブザー音出力
		return

		; "ブー" ブザー音出力
buzzer_buu
		Sound_M		f_do, buu_tim
		return

		; "ブッブー" ブザー音出力 (450 mS)
buzzer_bubuu
		call	buzzer_bu	;"ブッ" ブザー音出力
		movlw	100
		call	wait_w1ms
		call	buzzer_buu	;"ブー" ブザー音出力
		return

		; "ドミソド" ブザー音出力 (1,150 mS)
dl_mi_so_dh
		Sound_M		f_do, dms_tim
		call	wait_50ms

		Sound_M		f_mi, dms_tim
		call	wait_50ms

		Sound_M		f_so, dms_tim
		call	wait_50ms

		Sound_M		f_doh, dms_tim
		Sound_M		f_doh, dms_tim
		return

		; ブザー音出力コントロール
buzzer_control
		bsf	STATUS,RP0	;バンク 1
		bsf	PIE1,TMR1IE	;タイマー１割り込みを許可
		bcf	STATUS,RP0	;バンク 0

		call	wait_w1ms	;入力 W: 音長（ループカウンタ）

		bsf	STATUS,RP0	;バンク 1
		bcf	PIE1,TMR1IE	;タイマー１割り込みを禁止
		bcf	STATUS,RP0	;バンク 0
		return

;==========================================================================
;		ウェイト・ルーチン (at 8 MHz)
;==========================================================================

		; 1m 秒 x W ウェイトルーチン
wait_w1ms
		movwf	wt2cnt		;1

w1m01		movlw	221		;1
		movwf	wt3cnt		;1

w1m02		goto	$ + 1		;2
		goto	$ + 1		;2
		goto	$ + 1		;2
		decfsz	wt3cnt,F	;1,2
		goto	w1m02		;2,0	(2+2+2+1+2)*220+(2+2+2+2+0)=1988

		goto	$ + 1		;2
		goto	$ + 1		;2
		decfsz	wt2cnt,F	;1,2
		goto	w1m01		;2,0	(1+1+1988+2+2+1+2)*(W-1)+(1+1+1988+2+2+2+0)=1997*W-1

		return			;2	1+(1997*W-1)+2=1997*W+2
					;Total	(1997*W+2)/8MHz*4 = (998.5*W + 1) μS

		; 30m 秒 ウェイトルーチン
wait_30ms
		movlw	30		;1
		goto	wait_w1ms	;2	1+2+1+(1997*W-1)+2=1997*W+5
					;Total	(1997*30+5)/8MHz*4 = 29.9575 mS

		; 50m 秒 ウェイトルーチン
wait_50ms
		movlw	50		;1
		goto	wait_w1ms	;2	1+2+1+(1997*W-1)+2=1997*W+5
					;Total	(1997*50+5)/8MHz*4 = 49.9275 mS

;==========================================================================
;		割り込み処理
;==========================================================================

interrupt
		; レジスタの保存

		movwf	w_save		;W レジスタの保存
		movf	STATUS,W
		movwf	s_save		;STATUS レジスタの保存

		bcf	STATUS,RP0	;バンク 0
		btfsc	INTCON,T0IF	;タイマー０割り込み か？
		goto	int_t0		;Yes

		btfsc	PIR1,TMR1IF	;タイマー１割り込み か？
		goto	int_t1		;Yes
		goto	int_end		;(Illegal interrupt)

		; タイマー０割り込み処理

int_t0		bcf	INTCON,T0IF	;タイマー０割込みフラグをクリア

		movlw	tm0_h_val	;ハードタイマー０カウント値
		movwf	TMR0		;タイマー０ TMR0 の設定

		movlw	1
		subwf	tm0_cnt_l,F	;ソフトタイマー０の low  カウンタ - 1
		btfsc	STATUS,Z	;ソフトタイマー０の low  カウンタ = 0 か？
		goto	int01		;Yes

		btfsc	STATUS,C	;ソフトタイマー０の low  カウンタ > 0 か？
		goto	int_end		;Yes

		subwf	tm0_cnt_h,F	;ソフトタイマー０の high カウンタ - 1
		goto	int_end	

int01		movf	tm0_cnt_h,F
		btfss	STATUS,Z	;ソフトタイマー０の high カウンタ = 0 か？
		goto	int_end		;No

		movlw	high tm0_s_val	;ソフトタイマー０のカウント値
		movwf	tm0_cnt_h	;ソフトタイマー０の high カウンタの設定
		movlw	low tm0_s_val	;ソフトタイマー０のカウント値
		movwf	tm0_cnt_l	;ソフトタイマー０の low  カウンタの設定
;
		bsf	alm_flg,0	;bit0: "秒"カウンタ更新フラグ = 1

		incf	cnt_sec01,F	;秒カウンタ + 1
		movlw	10
		subwf	cnt_sec01,W
		btfss	STATUS,C	;秒カウンタ >= 10 か？
		goto	int_end		;No

		clrf	cnt_sec01	;秒カウンタ = 0

		incf	cnt_sec10,F	;十秒カウンタ + 1
		movlw	6
		subwf	cnt_sec10,W
		btfss	STATUS,C	;十秒カウンタ >= 6 か？
		goto	int_end		;No

		clrf	cnt_sec10	;十秒カウンタ = 0

		incf	cnt_min01,F	;分カウンタ + 1
		movlw	10
		subwf	cnt_min01,W
		btfss	STATUS,C	;分カウンタ >= 10 か？
		goto	int_end		;No

		clrf	cnt_min01	;分カウンタ = 0

		incf	cnt_min10,F	;十分カウンタ + 1
		movlw	6
		subwf	cnt_min10,W
		btfss	STATUS,C	;十分カウンタ >= 6 か？
		goto	int_end		;No

		clrf	cnt_min10	;十分カウンタ = 0
		goto	int_end

		; タイマー１割り込み処理

int_t1		bcf	PIR1,TMR1IF	;タイマー１割込みフラグをクリア

		movf	const_high,W	;音階用分周定数 high を
		movwf	TMR1H		;TMR1H に設定
		movf	const_low,W	;音階用分周定数 low を
		movwf	TMR1L		;TMR1L に設定

		movlw	1 << buzzer	;対象ビットをセット
		xorwf	GPIO,F		;出力をビット反転
;		goto	int_end

		; レジスタの復帰

int_end		movf	s_save,W
		movwf	STATUS		;STATUS レジスタの復帰
		swapf	w_save,F
		swapf	w_save,W	;W レジスタの復帰

		retfie

;==========================================================================

		end			;プログラムの終了
