;***** MatrixLED_Clock.asm ************************************************
;
;	ドットマトリクス 8 x 8 LED 表示時計
;
;	Copyright (C) 2007-2019   by M.Yamamoto. All rights reserved.
;
;     ( coding:  Ver. 0.00   2007/05/13  by M.Yamamoto )
;	coding:  Ver. 1.00   2007/05/17  初期バージョン
;	update:  Ver. 1.10   2007/05/22  時報音出力の機能追加
;	update:  Ver. 1.11   2007/09/10  オートモードでの表示時間配分の変更
;	update:  Ver. 2.00   2013/10/27  ソースコードの全面見直し
;	update:  Ver. 2.10   2014/08/26  12／24時間の両表示に対応
;	update:  Ver. 2.20   2014/09/05  電源投入直後のカレンダー機能改善
;	bugfix:  Ver. 2.30   2014/10/15  うるう年の計算誤りを修正
;	bugfix:  Ver. 2.40   2019/04/15  12時間表示時のam/pm表示の不具合を修正
;	update:  Ver. 2.41   2019/04/16  コメントを修正
;
;******************************************************* PicAsm 0212 ******

;	Device: PIC16F876	Clock: 12.8MHz (クリスタルモジュール)

; Ver. 2.00 への経緯と対策
; ------------------------

;	Ver.1.11 以降 いろいろな不具合を含んだまま、ずっと放置をしてあった。

;	・以前のバージョンまでは、各入力スイッチ（MODE, SET, UP, DOWN／ZERO）の動作に対する反応がい
;	　まいちで、どうしても納得がいかなかった。
;	・MODE スイッチによって切り替えた現在のモードの不明確さと、SET スイッチによって選択した現在
;	　の選択項目の不明確さ。
;	・時報音出力の機能追加によって設けた圧電ブザーから、常時出力されるジーーーという雑音の処置
;	　対策が未解決。
;	・気温表示機能とディマー機能が未実施、等々……。

;	これらについては、Ver.2.00 で大きな支障がない程度に、ほぼ解決させた。

; 時報音の出力について
; --------------------

;	本来、NHKの時報は正弦波の 440Hz (予報音) と 880Hz (正報音) で構成されているが、この正確な正
;	弦波を作り出すのは容易ではない。したがってここでは擬似的に、矩形波で間に合わせることにする。

;	以前のバージョンでは、時報音の出力にタイマー１割り込みを使用して作成したサウンドで実現して
;	いたが、その音がかなり濁ったような音で、到底澄んだ音にはならず、聞くに忍びない。
;	理由はある程度分かっている（基本の秒を作り出すために、タイマー０割り込みを使用して実現して
;	いるが、それが邪魔をしているのだ）のだが、当然ながらこれを止めるわけにはいかない。
;	そこで、割り込みを使用したサウンドを止め、ElectronicMetronomeII.asm で好結果を得た、サウン
;	ド・サブルーチン（Sound.sub）を本プログラムでも使用してみることにした。

;	しかし、当初、期待した音はまったく出ず、何か間欠的なポツ、ポツ、というような音しか聞こえて
;	こなかった。どこかバグっているのかと思っていろいろと調べてみると、どうやら高い音は大丈夫そ
;	うで、低い音になるとポツ、ポツ、というような音になってしまうようだ。

;	そこで、サウンド・テストルーチンを本プログラム内に組み込んで、サウンド・サブルーチン（Sound
;	.sub）の下限の発振可能周波数を調べてみたところ、Device: PIC16F876、Clock: 12.8MHz の条件で、
;	626Hz までであることが分かった。（ちなみに、Device: PIC16F648A、Clock: 8MHz の条件では、391Hz
;	までで、ElectronicMetronomeII.asm 内に同様なサウンド・テストルーチンを組み込んで調べた。）

;	下限が 626Hz というのは、音階でいうとミ（659.26Hz）までで、レ＃（622.26Hz）以前の低い音程は
;	発振できない。したがってこのままでは時報の正報音（880Hz）は問題ないが、予報音（440Hz）を出力
;	することができない。

;	上記のように、タイマー１割り込みを使用したサウンドでは、酷く濁った音で聞くに忍びないため、サ
;	ウンド・サブルーチンを使わざるを得ないが、かと言って 440Hz を発振することができない。

;	440Hz の倍数にこだわることもないのかもしれないが、とりあえず、１オクターブずつ上げて、予報音
;	に 880Hz 、正報音に 1760Hz を割り当ててみた。

;	なお、これらの一連のテストルーチンは、本来の時計機能等に支障をきたさないように、当分の間、ソ
;	ースプログラム内に組み込んだままにしておくこととする。

; Ver. 2.40 での修正
; ------------------

;	下記<機能と使用法>の(24H)と(12H)の対応図において、↑位置に示す am/pmの表示が妥当でなかった不
;	具合を修正した。下記には修正前後を比較して記してあるが、修正前は作者の認識違いで、左↑位置の
;	amと右↑位置のpmがそれぞれ逆に表示をしていた。
;	詳細は、作者のホームページ "７セグメントＬＥＤ表示時計" の "１２時間表示の扱いについて" の項
;	（http://xyama.sakura.ne.jp/hp/Clock7LED.html#12-hour）を参照のこと。

;	またバグではないが、従来、１２／２４時間の両表示ともに先頭の１桁目（左端）は、ゼロサプレス表
;	示を行っていたのを、１２時間表示時だけに改め２４時間表示時には行わないように修正をした。 
;	作者の他デジタル時計との統一性と、１２／２４時間表示の区別の視認性を高めることを目的する。

;==========================================================================

#ifdef comment

 <機能と使用法>

・本機の電源を投入すると、"ピポッ" と開始ブザー音を出力後、ドットマトリクス LED のデモ
　表示が数秒間行われ、続いてプログラムのバージョン番号がＬＥＤに約３秒間表示される。

　　　バージョン番号　　Ｖer．　ｘ．ｘｘ

・次に、0.5秒間づつ０から９までの数字を順次更新しながら、ドットマトリクス LED の０～９
　表示テストを計５秒間行う。その後、１秒間の空白を置いた後時計機能が開始され、時間表示
　が行われる。

・時計表示は１２／２４時間の両表示機能を持ち、12H / 24H SELECT スイッチによりいつでも
　切り替えることができる。 また、他に年月日の表示と気温の表示の機能を持っている。

　　　時間表示		ｘｘ：ｘｘ：ｘｘ
　　　年月日表示	ｘｘ．ｘｘ．ｘｘ
　　　気温表示		＿＿＿ｘｘ．ｘ℃

・１２時間表示の場合、左列の :（コロン）の上側 LEDで AM を、また下側 LEDで PM を、１秒
　間隔で点滅を繰り返すことで、それぞれを表現している。

　　　　　　　　　　　　　　┌─ AM
　　　　　　　　　　　　　　↓
　　　１２時間表示　　　ｘｘ：ｘｘ：ｘｘ
　　　　　　　　　　　　　　↑
　　　　　　　　　　　　　　└─ PM

・次に、１２時間表示と２４時間表示の対応を示す。 なお、１２時間表示の場合だけ先頭の１桁
　目（左端）は、ゼロサプレスを行なって表示をする。

　　　(24H)   0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23　┐            ;;
　　　(12H)  12  1  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11  │(←修正前)  ;;
　　　       pm am am am am am am am am am am am am pm pm pm pm pm pm pm pm pm pm pm　┘            ;;
											            ;;Ver. 2.40 にて修正
　　　(24H)  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23　┐            ;;
　　　(12H)  12  1  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11  │(←修正後)  ;;
　　　       am am am am am am am am am am am am pm pm pm pm pm pm pm pm pm pm pm pm　┘            ;;
　　　       ↑                                  ↑

・また、上記の時間、年月日、気温の３つの表示は MODE スイッチを押下することで自由に切り
　替わり、そのスイッチの押下ごとに、 時間表示、年月日表示、気温表示、オートモードに加え
　て、時報付の時間表示の順に５つのモードを繰り返す。

　　┌→ 時間表示 → 年月日表示 → 気温表示 → オートモード → 時間表示(時報付) ─┐
　　└──────────────────────────────────────┘

・この時、MODE スイッチを何度も続けて押していると、現在のモードが何なのか分かり辛くなる
　時があるため、ドットマトリクス LED の１桁目（最左端桁）でその時のモードを表示する。
　 （特に時間表示、オートモード、 時間表示(時報付) の３つのモードでは、ともに時間が表示
　されるので 区別が付けにくい）

・すなわち、MODE スイッチを押した直後に、１桁目の横１列の８個の LED が次のように数秒間
　だけ表示される。その後１桁目の LED は通常の表示に戻る。
　（例ではオートモードを表す。●は点灯、○は消灯）

　　　（例）　　○○○○○○○○
　　　　　　　　○○○○○○○○
　　　　　　　　○○○○○○○○
　　　　　　　　○○○○○○○○　←　時間表示(時報付)
　　　　　　　　●●●●●●●●　←　オートモード
　　　　　　　　○○○○○○○○　←　気温表示
　　　　　　　　○○○○○○○○　←　年月日表示
　　　　　　　　○○○○○○○○　←　時間表示

・オートモードでは、時間表示中に以下の振る舞いを行う。

　　　毎05～09秒と35～39秒の間：　年月日表示
　　　毎20～24秒と50～54秒の間：　気温表示

　　　 (___: 時間表示、NNN: 年月日表示、KKK: 気温表示)

　　　00        10        20        30        40        50        00
　　　.    .    .    .    .    .    .    .    .    .    .    .    .
　　　_____NNNNN__________KKKKK__________NNNNN__________KKKKK_____

・年月日、時分の設定変更は、上記５つのどのモード時でも可能で、PICにプログラムを書き込んだ
　直後の電源の投入時には、 14年09月01日、00時00分00秒（１２時間表示の場合は AM 12時00分00秒）	;;Ver. 2.41 にて修正
　からスタートするので、SET または BACK スイッチと、 UP または DOWN スイッチによって適宜
　変更を行う。

・このように、SET スイッチ等で年月日の設定変更を行うと、その値のバックアップがとられて次回
　（同一日であれば）に電源の投入をし直した時には、 その設定値で年月日、時分、および 00秒
　からスタートする。 また、年月日の設定変更を行なった場合ばかりでなく、 毎日日付が更新さ
　れた時点でも、やはり同様に年月日、時分のバックアップがとられるため、次回に電源の投入を
　し直した時には、 そのバックアップ値で年月日、時分、および 00秒からスタートする。

・SET スイッチは、押下するごとに年、月、日、時、分と次項目に移動するので、該当の項目を
　選択後 UP または DOWN スイッチによって値を設定する。最後の分設定後にもう一度 SET スイ
　ッチを押下すると、00秒から時計動作がスタートし、必ず時報なしの時間表示モードに戻る。

　　　　　　　　　　　　　 SET  　 SET  　 SET  　 SET  　 SET  　 SET
　　　５つのどれかのモード ─→ 年 ─→ 月 ─→ 日 ─→ 時 ─→ 分 ─→ 時報なしの時間表示モード

・この SET スイッチによって項目を選択中に、誤って希望する項目を通り過ぎてしまったような
　場合に、BACK スイッチを押下することによって、ひとつ前の項目に戻ることができる。 MODE / 
　BACK スイッチは、年月日、時分の設定中にはこのような機能を有する。

　　　　　　　　　　　　　 SET   　BACK  　BACK  　BACK  　BACK  　SET
　　　５つのどれかのモード ─→ 年 ←─ 月 ←─ 日 ←─ 時 ←─ 分 ─→ 時報なしの時間表示モード
　　　　　　　　　　　　　　　　│　　　　　　　　　　　　　　　↑
　　　　　　　　　　　　　　BACK└───────────────┘

・この時も選択された項目が分かり易いように、次のように表示される。
　（ｘｘ部分が選択項目、＿＿は消灯桁）

　　　　　ｘｘ．＿＿．＿＿　　　年が選択
　　　　　＿＿．ｘｘ．＿＿　　　月が選択
　　　　　＿＿．＿＿．ｘｘ　　　日が選択
　　　　　ｘｘ：＿＿：＿＿　　　時が選択
　　　　　＿＿：ｘｘ：＿＿　　　分が選択

・SET スイッチによって項目の時／分を選択中で１２時間表示の場合、左列の :（コロン）の上
　側 LED点灯 + 下側 LED消灯で AM を、 上側 LED消灯 + 下側 LED点灯で PM を、それぞれ表現
　している。 なお、この場合の先頭の１桁目（左端）のゼロサプレスは、 １２／２４時間表示
　のどちらの場合にも行なわない。

・ZERO／DOWN  スイッチは、年月日、時分の設定中は上記のように DOWN スイッチとして機能す
　るが、それ以外では毎正時プラス・マイナス５分以内に押されると 00分00秒に設定するため
　の ZERO スイッチとして機能する。

・年月日カレンダー機能について、うるう年の計算は 2001年～2399年までの範囲で対応してい
　る。ただし、年の表示は下２桁のみになる。

・その他の機能として、周囲の明るさに応じてドットマトリクス LED の表示を減光するディマー
　機能を持ち、周囲が明るいときはドットマトリクス LED の表示も明るく、周囲が暗くなると暗
　く表示される。

#endif

;	PIC16F876 のピンと用途

;	  (1) MCLR: マスター・クリア入力	(28) RB7: LED7 ROW 出力
;	  (2) RA0:  CDS ディマーアナログ入力	(27) RB6: LED6 ROW 出力
;	  (3) RA1:  温度センサアナログ入力　	(26) RB5: LED5 ROW 出力
;	  (4) RA2:  Bz出力／SW5(12/24 SEL)入力	(25) RB4: LED4 ROW 出力
;	  (5) RA3:  VREF+アナログ入力		(24) RB3: LED3 ROW 出力
;	  (6) RA4:  3-8 COL1 選択 BCD A 出力	(23) RB2: LED2 ROW 出力
;	  (7) RA5:  3-8 COL1 選択 BCD B 出力	(22) RB1: LED1 ROW 出力
;	  (8) VSS:  電源 GND			(21) RB0: LED0 ROW 出力
;	  (9) OSC1: オシレータ水晶入力		(20) VDD: 電源 +5V DC
;	 (10) OSC2: オシレータ水晶入力		(19) VSS: 電源 GND
;	 (11) RC0:  4-16 COL2 選択 BCD A 出力 	(18) RC7: SW4(MODE/BACK) スイッチ入力
;	 (12) RC1:  4-16 COL2 選択 BCD B 出力 	(17) RC6: SW3(SET) スイッチ入力
;	 (13) RC2:  4-16 COL2 選択 BCD C 出力 	(16) RC5: SW2(UP) スイッチ入力
;	 (14) RC3:  4-16 COL2 選択 BCD D 出力 	(15) RC4: SW1(ZERO／DOWN) スイッチ入力

;==========================================================================

	list		p=pic16f876		;デバイス情報
	include		p16f876.inc		;インクルードファイル
	errorlevel	-302			;Eliminate bank warning

;==========================================================================
;		コンフィギュレーションの設定
;==========================================================================
 
      __config _HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF

;==========================================================================
;		変数の定義とレジスタ割付け
;==========================================================================

#define		_sound_sub		;サウンドサブルーチンを使用時

ver_no		equ	h'240'		;バージョン番号: 2.40

sec1cnt		equ	d'3125'		;1秒 / (1/(12.8M/4) * 4(プリスケーラ値) * 256) = 3125
speaker		equ	2		;RA2: スピーカ

#ifndef	_sound_sub
pih		equ	high (d'65536' - d'4081')	;ソ (392.00 Hz)
pil		equ	low  (d'65536' - d'4081')	;
poh		equ	high (d'65536' - d'3057')	;ド (523.26 Hz)
pol		equ	low  (d'65536' - d'3057')	;
pilcnt		equ	d'100'		;音長
pu_h		equ	high (d'65536' - d'3636')	;ラ (440.00 Hz)
pu_l		equ	low  (d'65536' - d'3636')	;
pn_h		equ	high (d'65536' - d'1818')	;ラ (880.00 Hz)
pn_l		equ	low  (d'65536' - d'1818')	;
pu_ch		equ	high (sec1cnt / d'10')		;音長 high
pu_cl		equ	low  (sec1cnt / d'10')		;音長 low
pn_ch		equ	high (sec1cnt)			;音長 high
pn_cl		equ	low  (sec1cnt)			;音長 low
#else
f_do		equ	d'262'		;ド	261.63Hz
f_do_		equ	d'277'		;ド＃	277.18Hz
f_re		equ	d'294'		;レ	293.66Hz
f_re_		equ	d'311'		;レ＃	311.13Hz
f_mi		equ	d'330'		;ミ	329.63Hz
f_fa		equ	d'349'		;ファ	349.23Hz
f_fa_		equ	d'370'		;ファ＃	369.99Hz
f_so		equ	d'392'		;ソ	392.00Hz
f_so_		equ	d'415'		;ソ＃	415.30Hz
f_ra		equ	d'440'		;ラ	440.00Hz
f_ra_		equ	d'466'		;ラ＃	466.16Hz
f_si		equ	d'494'		;シ	493.88Hz

f_doh		equ	d'523'		;ド	523.26Hz
f_doh_		equ	d'554'		;ド＃	554.36Hz
f_reh		equ	d'587'		;レ	587.32Hz
f_reh_		equ	d'622'		;レ＃	622.26Hz
f_mih		equ	d'659'		;ミ	659.26Hz
f_fah		equ	d'698'		;ファ	698.46Hz
f_fah_		equ	d'740'		;ファ＃	739.98Hz
f_soh		equ	d'784'		;ソ	784.00Hz
f_soh_		equ	d'831'		;ソ＃	830.60Hz
f_rah		equ	d'880'		;ラ	880.00Hz
f_rah_		equ	d'932'		;ラ＃	932.32Hz
f_sih		equ	d'988'		;シ	987.76Hz

f_do2		equ	d'1047'		;ド	1046.52Hz
f_do2_		equ	d'1109'		;ド＃	1108.72Hz
f_re2		equ	d'1175'		;レ	1174.64Hz
f_re2_		equ	d'1245'		;レ＃	1244.52Hz
f_mi2		equ	d'1319'		;ミ	1318.52Hz
f_fa2		equ	d'1397'		;ファ	1396.92Hz
f_fa2_		equ	d'1480'		;ファ＃	1479.96Hz
f_so2		equ	d'1568'		;ソ	1568.00Hz
f_so2_		equ	d'1661'		;ソ＃	1661.20Hz
f_ra2		equ	d'1760'		;ラ	1760.00Hz
f_ra2_		equ	d'1865'		;ラ＃	1864.64Hz
f_si2		equ	d'1976'		;シ	1975.52Hz
#endif
		cblock  h'20'
bcd_yy					;年 BCD カウンタ
bcd_nn					;月 BCD カウンタ
bcd_dd					;日 BCD カウンタ
bcd_hh					;時 BCD カウンタ
bcd_mm					;分 BCD カウンタ
bcd_ss					;秒 BCD カウンタ
work1					;ワーク
dspdigit				;表示桁指定フラグ
updtflg					;更新フラグ, bit0:時分秒更新, bit1:年月日更新, bit2:ディマー制御, bit3:EEPROM制御
cnt_high				;１秒カウンタ high
cnt_low					;１秒カウンタ low
NumH					;16-bit binary number high
NumL					;16-bit binary number low
temp_yy					;仮の年 BCD カウンタ
temp_nn					;仮の月 BCD カウンタ
temp_dd					;仮の日 BCD カウンタ
TenK					;変換後BCD 10000位  ／  temp_hh
Thou					;変換後BCD  1000位  ／  temp_mm
Hund					;変換後BCD   100位  ／  temp_ss
Tens					;変換後BCD    10位
Ones					;変換後BCD     1位
work2					;ワーク
modeflg					;MODEフラグ, 0:時間, 1:年月日, 2:気温, 3:オートモード, 4:時間(時報付)
modeflg2				;MODE更新フラグ
modecnt					;モードNo表示時間カウンタ
timeflg					;時間表示フラグ  bit0=0:24H/1:12H, bit1=0:am/1:pm
blinkflg				;12時間表示時の AM/PM 表示点滅タイミング
swstate					;スイッチの1:ON／0:OFF状態
chatter					;チャタリング吸収カウンタ
tempfsr					;仮のFSR
wtcnt1					;ウェイト用ループカウンタ
wtcnt2					;ウェイト用ループカウンタ
coldata					;col カラムデータ
rowdata					;row ロウデータ
addr_high				;文字フォントデータの先頭アドレス high
addr_low				;文字フォントデータの先頭アドレス low
lpcnt					;ループカウンタ
lpcnt2					;ループカウンタ
work					;ワーク
;#ifndef	_sound_sub
length					;音長（ループカウンタ）
const_high				;音階用分周定数 high の保存
const_low				;音階用分周定数 low の保存
ts_high					;音長カウンタ high
ts_low					;音長カウンタ low
;#else
port_x					;5:PORTA, 6:PORTB, 7:PORTC, 8:PORTD, 9:PORTE
port_bit				;0:bit0,  1:bit1,  2:bit2,  3:bit3,  4:bit4,  5:bit5,  6:bit6,  7:bit7
freq_lo					;low  周波数(Hz)
freq_hi					;high
time_lo					;low  時間(ms)
time_hi					;high
sigflg					;時報音出力フラグ, bit0:予報音, :bit1:正報音
;#endif
		endc

		cblock	h'60'
;#ifdef	_sound_sub
sound00					;
sound01					;ポートアドレス (5:PORTA, 6:PORTB, 7:PORTC, 8:PORTD, 9:PORTE)
sound02					;Sound出力ポートの bit 位置 (反転値)
sound03					;Sound出力ポートの bit 位置
sound04					;
sound05					;
sound06					;
sound07					;
sound08					;
sound09					;
sound0a					;
sound0b					;
sound0c					;
;#endif

f_save					;FSR レジスタの退避用
		endc

		cblock	h'70'
;#ifdef	_sound_sub
sound70					;
sound71					;
sound72					;
sound73					;
sound74					;
sound75					;
sound76					;
sound77					;
sound78					;
sound79					;
sound7a					;
sound7b					;
sound7c					;
;#endif

w_save					;W レジスタの退避用
s_save					;STATUS レジスタの退避用
p_save					;PCLATH レジスタの退避用
		endc

#define		temp_hh		TenK
#define		temp_mm		Thou
#define		temp_ss		Hund

;==========================================================================
;		マクロ命令定義
;==========================================================================

;		Sound_Play_M マクロ

Sound_Play_M	macro	@frq,@tim
		movlw	low  @frq	;出力周波数(Hz)
		movwf	freq_lo
		movlw	high @frq
		movwf	freq_hi
		movlw	low  @tim	;出力時間(ms)
		movwf	time_lo
		movlw	high @tim
		movwf	time_hi

		bsf	STATUS,RP0	;バンク 1
		bcf	TRISA,speaker	;音出しの直前に出力ポートにする（雑音対策）
		bcf	STATUS,RP0	;バンク 0

		call	Sound_Play	;サウンドを鳴らす

		bsf	STATUS,RP0	;バンク 1
		bsf	TRISA,speaker	;再び入力ポートにしておく（雑音対策）
		bcf	STATUS,RP0	;バンク 0
		endm

;==========================================================================
;		プログラム開始
;==========================================================================

		org	0		;リセットベクタ
		goto	init
		org	4		;割り込みベクタ
		goto	interrupt

#ifdef	_sound_sub
;==========================================================================
;		サブルーチンファイルのインクルード
;==========================================================================

		org	h'08'

sys_clk		equ	d'12800'	;システムクロック(KHz)を指定

		include		C:\Data\Project\PIC\_sub\Sound.sub
#endif
;==========================================================================
;		初期化処理
;==========================================================================

init
		bcf	STATUS,RP0	;バンク 0
		clrf	PORTA
		clrf	PORTB
		clrf	PORTC
#ifndef	_sound_sub
		movlw	b'00000001'	;bit7-6: 未使用
					;bit5-4=00: プリスケーラのスケール値 1:1
					;bit3=0: 専用の発振器を使う場合に指定
					;bit2=0: 外部入力クロック指定時に有効
					;bit1=0: 内部クロックを使う
					;bit0=1: タイマー１を動作
		movwf	T1CON		;T1CON に設定
#endif
		bsf	STATUS,RP0	;バンク 1
		bcf	PIE1,TMR1IE	;タイマー１割り込みを禁止

		movlw	b'11010001'	;PBPU=1: プルアップ抵抗を使用しない
					;INTEDG=1: RB0/INTピンの立ち上がりで割り込み
					;T0SE=1: RA4/T0CKIピンの立ち下がりでカウントアップ
					;PS=001: プリスケーラのスケール値 1:4
		movwf	OPTION_REG

		movlw	b'00001011'	;RA5-4,2: 出力, RA3,1-0: 入力
		movwf	TRISA
		bsf	TRISA,speaker	;;音を出す直前まで入力ポートにしておく（雑音対策）
		movlw	b'00000000'	;RB7-0: 出力
		movwf	TRISB
		movlw	b'11110000'	;RC7-4: 入力, RC3-0: 出力
		movwf	TRISC

		movlw	h'05'		;ADFM=0: Ａ／Ｄ変換結果をADRESレジスタに左寄せで格納
		movwf	ADCON1		;PCFG=0101: RA5,2: D, RA1,0: A, RA3: VREF+

		bcf	STATUS,RP0	;バンク 0
#ifndef	_sound_sub
		movlw	h'60'		;GIE=0: 全割り込み禁止, PEIE=1: 周辺機器割り込み許可,
					;T0IE=1: タイマー(TMR0)オーバーフロー割り込み許可
#else
		movlw	h'20'		;PEIE=0: 周辺機器割り込み禁止
#endif
		movwf	INTCON
		movlw	h'80'		;ADCS=10: Ａ／Ｄ変換クロックを指定 Fosc/32
		movwf	ADCON0		;CHS=000: チャネル０(RA0), ADON=0: Ａ／Ｄ変換モジュール電源ＯＦＦ
#ifdef	_sound_sub
		movlw	PORTA		;5:PORTA
		movwf	port_x
		movlw	speaker		;2:bit2
		movwf	port_bit

		call	Sound_Init	;サウンドの初期化
		clrf	sigflg		;時報音出力フラグのクリア
#endif

		; EEPROM データ（カレンダーデータのバックアップ）の読み出し

		movlw	bcd_yy		;bcd_yy のアドレス
		movwf	FSR

		movlw	5		;bcd_yy ～ bcd_mm
		movwf	lpcnt		;ループカウンタを設定

		bsf	STATUS,RP1	;バンク 2
		movlw	eep_size	;EEPROM 格納先頭アドレス
		movwf	EEADR		;EEPROM の記録アドレスを設定

ini01		bsf	STATUS,RP1	;バンク 2
		bsf	STATUS,RP0	;バンク 3
		bsf	EECON1,RD	;読み出し制御 = ON
		bcf	STATUS,RP0	;バンク 2
		movf	EEDATA,W	;データの読み出し
		incf	EEADR,F		;EEPROM アドレス +1 更新

		bcf	STATUS,RP1	;バンク 0
		movwf	INDF		;bcd_yy ～ bcd_mm を設定
		incf	FSR,F		;間接アドレス +1 更新

		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		goto	ini01		;No.

;		clrf	bcd_hh		;時分秒 BCD カウンタの初期設定 (00時00分00秒)
;		clrf	bcd_mm
		clrf	bcd_ss

		clrf	modeflg		;MODEフラグの初期設定
		clrf	modeflg2	;MODE更新フラグの初期設定
		clrf	updtflg		;更新フラグの初期設定
		clrf	cnt_high	;１秒カウンタの初期設定
		clrf	cnt_low
#ifndef	_sound_sub
		clrf	ts_high		;音長カウンタの初期設定
		clrf	ts_low
#endif
		clrf	swstate		;スイッチのON／OFF状態の初期設定
		bsf	INTCON,GIE	;全割り込み禁止解除

		; ドットマトリクス LED のデモ表示と Ver 表示

		movlw	h'ff'
		movwf	PORTB		;LED off
		call	buzzer_pipo	;"ピポッ" ブザー音出力

;*****************************************************************************************
;*****************************************************************************************
;											**
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;		**
;#define	_debug2			;サウンド・テストルーチン2を使用時		**
#ifdef	_debug2
		bcf	INTCON,GIE	;全割り込み禁止

www0		call	w1000ms
		Sound_Play_M	f_rah, d'100'	; "プッ"
		call	w900ms
		Sound_Play_M	f_rah, d'100'	; "プッ"
		call	w900ms
		Sound_Play_M	f_rah, d'100'	; "プッ"
		call	w900ms
		Sound_Play_M	f_ra2, d'1000'	; "ポッ～～ン"
		goto	www0		;無限ループ

w900ms		movlw	d'9'		;ループカウンタ
		goto	www1

w1000ms		movlw	d'10'		;ループカウンタ
www1		movwf	lpcnt

www2		movlw	d'100'		;100 m秒
		call	wait_1xms	;1 m秒 ウェイトルーチン
		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		goto	www2		;No.

		return
#endif
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;#define	_debug			;サウンド・テストルーチンを使用時
#ifdef	_debug
		bcf	INTCON,GIE	;全割り込み禁止

		movlw	d'250'
		call	wait_1xms
		movlw	d'250'
		call	wait_1xms

;		サウンド・テストルーチン

		movlw	d'100'		;ループカウンタ（とりあえずの回数）
		movwf	lpcnt

		bcf	STATUS,RP0	;
		bsf	STATUS,RP1	;バンク2
		clrf	EEADR		;書き込み先頭アドレスを設定
		bcf	STATUS,RP1	;バンク0

;		movlw	low d'1200'	;開始周波数(Hz)
		movlw	low d'650'	;開始周波数(Hz)
		movwf	cnt_low
;		movlw	high d'1200'
		movlw	high d'650'
		movwf	cnt_high

xx1		movf	cnt_low,W	;出力周波数(Hz)
		movwf	freq_lo
		movf	cnt_high,W
		movwf	freq_hi
		movlw	low  d'1000'	;出力時間(ms)
		movwf	time_lo
		movlw	high d'1000'
		movwf	time_hi

		bsf	STATUS,RP0	;バンク 1
		bcf	TRISA,speaker	;音出しの直前に出力ポートにする（雑音対策）
		bcf	STATUS,RP0	;バンク 0

		call	Sound_Play	;サウンドを鳴らす

		bsf	STATUS,RP0	;バンク 1
		bsf	TRISA,speaker	;再び入力ポートにしておく（雑音対策）
		bcf	STATUS,RP0	;バンク 0

		movlw	d'100'
		call	wait_1xms	;

		; EEPROM へ 出力周波数の書き込み

		movlw	d'02'
		movwf	lpcnt2

		movf	cnt_high,W
		goto	$+2

xx2		movf	cnt_low,W
		bsf	STATUS,RP1	;バンク2
		movwf	EEDATA		;書き込みデータを設定
		bsf	STATUS,RP0	;バンク3
		bcf	EECON1,EEPGD	;データEEPROMメモリ
		bsf	EECON1,WREN	;書き込みイネーブル = ON
		movlw	h'55'
		movwf	EECON2		;h'55' を EECON2 に書き込む
		movlw	h'aa'
		movwf	EECON2		;h'aa' を EECON2 に書き込む
		bsf	EECON1,WR	;書き込み開始
		btfsc	EECON1,WR	;書き込み 終了か?
		goto	$-1		;No

		bcf	EECON1,WREN	;書き込みイネーブル = OFF
		bcf	STATUS,RP0	;バンク2
		incf	EEADR,F
		bcf	STATUS,RP1	;バンク0
		decfsz	lpcnt2,F	;ループカウンタ - 1 = 0 か？
		goto	xx2		;No.

;		movlw	d'10'		;更新周波数 = -10Hz
		movlw	d'01'		;更新周波数 = -1Hz
		subwf	cnt_low,F
		btfss	STATUS,C	;cnt_low >= 0 か？
		decf	cnt_high,F	;No.

		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		goto	xx1		;No.

;	( テスト結果-1 (-10の時) )	.....	h'0276' = d'630' Hz までＯＫ

;		00	04	B0	04	A6	04	9C	04	92
;		08	04	88	04	7E	04	74	04	6A
;		10	04	60	04	56	04	4C	04	42
;		18	04	38	04	2E	04	24	04	1A
;		20	04	10	04	06	03	FC	03	F2
;		28	03	E8	03	DE	03	D4	03	CA
;		30	03	C0	03	B6	03	AC	03	A2
;		38	03	98	03	8E	03	84	03	7A
;		40	03	70	03	66	03	5C	03	52
;		48	03	48	03	3E	03	34	03	2A
;		50	03	20	03	16	03	0C	03	02
;		58	02	F8	02	EE	02	E4	02	DA
;		60	02	D0	02	C6	02	BC	02	B2
;		68	02	A8	02	9E	02	94	02	8A
;		70	02	80	02	76	FF	FF	FF	FF

;	( テスト結果-2 (-1の時) )	.....	h'0272' = d'626' Hz までＯＫ

;		00	02	8A	02	89	02	88	02	87
;		08	02	86	02	85	02	84	02	83
;		10	02	82	02	81	02	80	02	7F
;		18	02	7E	02	7D	02	7C	02	7B
;		20	02	7A	02	79	02	78	02	77
;		28	02	76	02	75	02	74	02	73
;		30	02	72	FF	FF	FF	FF	FF	FF

;f_doh		equ	d'523'		;ド	523.26Hz
;f_doh_		equ	d'554'		;ド＃	554.36Hz
;f_reh		equ	d'587'		;レ	587.32Hz
;f_reh_		equ	d'622'		;レ＃	622.26Hz

;f_mih		equ	d'659'		;ミ	659.26Hz  <<<<<
;f_fah		equ	d'698'		;ファ	698.46Hz
;f_fah_		equ	d'740'		;ファ＃	739.98Hz
;f_soh		equ	d'784'		;ソ	784.00Hz

#endif											**
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;		**
;											**
;*****************************************************************************************
;*****************************************************************************************

		call	demo1_display	;LED のドット点灯移行デモ-1
		call	demo2_display	;LED のドット点灯移行デモ-2

		movlw	h'bc'		;Ver
		movwf	temp_hh
		movlw	high ver_no	;バージョン番号
		movwf	temp_mm
		movlw	low ver_no	;
		movwf	temp_ss
		movlw	h'dd'		;(xx._x.xx)表示
		movwf	dspdigit	;表示桁指定フラグの設定
		bcf	updtflg,0	;時分秒更新フラグのクリア
		clrf	bcd_ss		;秒 BCD カウンタの初期設定

ini02		movlw	temp_hh
		movwf	tempfsr		;間接アドレスの先頭番地の設定
		call	dxled_display	;ドットマトリクス LED の表示
		movlw	h'03'		;3 秒間のウエイト
		subwf	bcd_ss,W
		btfss	STATUS,C	;秒 BCD カウンタ >= h'03' か？
		goto	ini02		;No

		; ドットマトリクス LED の０～９表示テスト

		movlw	h'ff'
		movwf	PORTB		;LED off
		clrf	bcd_ss		;秒 BCD カウンタの初期設定

ini03		movlw	h'01'		;1 秒間のウエイト
		subwf	bcd_ss,W
		btfss	STATUS,C	;秒 BCD カウンタ >= h'01' か？
		goto	ini03		;No

		clrf	temp_hh		;全桁の表示データを０クリア
		clrf	temp_mm
		clrf	temp_ss
		movlw	h'fc'		;(xx xx xx)表示
		movwf	dspdigit	;表示桁指定フラグの設定
		bcf	updtflg,0	;時分秒更新フラグのクリア

ini04		movlw	temp_hh
		movwf	tempfsr		;間接アドレスの先頭番地の設定
		movlw	high (sec1cnt / 2)
		movwf	cnt_high	;h'0C35'/2 = d'3125'/2 = d'1562' = h'061a'
		movlw	low  (sec1cnt / 2)
		movwf	cnt_low
		call	dxled_display	;ドットマトリクス LED の表示 (0.5 秒間隔)
		movlw	h'99'
		subwf	temp_hh,W
		btfsc	STATUS,Z	;全桁の０～９表示テスト終了か？
		goto	ini05		;Yes

		movlw	h'11'		;全桁の表示データを＋１
		addwf	temp_hh,F
		addwf	temp_mm,F
		addwf	temp_ss,F
		goto	ini04		;全桁の０～９表示テストの繰り返し

ini05		movlw	h'ff'
		movwf	PORTB		;LED off
		clrf	bcd_ss		;秒 BCD カウンタの初期設定

ini06		movlw	h'01'		;1 秒間のウエイト
		subwf	bcd_ss,W
		btfss	STATUS,C	;秒 BCD カウンタ >= h'01' か？
		goto	ini06		;No

		clrf	bcd_ss		;秒 BCD カウンタの初期設定
		clrf	modecnt		;モードNo表示時間カウンタの初期設定
		goto	main

;==========================================================================

;		"ピポッ" ブザー音出力

buzzer_pipo
#ifndef	_sound_sub
		movlw	pih		;"ピッ" ブザー音出力
		movwf	const_high	;音階用分周定数 high を設定
		movlw	pil
		movwf	const_low	;音階用分周定数 low を設定
		movlw	pilcnt
		movwf	length		;音長（ループカウンタ）を設定
		call	buzzer_control

		movlw	d'30'
		call	wait_1xms

		movlw	poh		;"ポッ" ブザー音出力
		movwf	const_high	;音階用分周定数 high を設定
		movlw	pol
		movwf	const_low	;音階用分周定数 low を設定
		movlw	pilcnt
		movwf	length		;音長（ループカウンタ）を設定

		; ブザー音出力コントロール
buzzer_control
		bsf	STATUS,RP0	;バンク 1
		bcf	TRISA,speaker	;音出しの直前に出力ポートにする（雑音対策）
		bsf	PIE1,TMR1IE	;タイマー１割り込みを許可
		bcf	STATUS,RP0	;バンク 0

		movf	length,W	;音長（ループカウンタ）を設定
		call	wait_1xms

		bsf	STATUS,RP0	;バンク 1
		bcf	PIE1,TMR1IE	;タイマー１割り込みを禁止
		bsf	TRISA,speaker	;再び入力ポートにしておく（雑音対策）
		bcf	STATUS,RP0	;バンク 0
		return
#else
		Sound_Play_M	f_soh, d'100'	;"ピッ" ブザー音出力
		movlw	d'30'
		call	wait_1xms
		Sound_Play_M	f_do2, d'100'	;"ポッ" ブザー音出力
		return
#endif

;--------------------------------------------------------------------------

;		LED のドット点灯移行デモ-1

demo1_display
		movlw	h'00'		;00: "HH","HL" 桁の指定
		call	demo1

		movlw	h'10'		;01: "MH","ML" 桁の指定
		call	demo1

		movlw	h'20'		;10: "SH","SL" 桁の指定

demo1		movwf	PORTA
		call	lower_upper
		call	left_right
		call	upper_lower
		call	right_left
		return

;--------------------------------------------------------------------------

;		LED のドット点灯移行デモ-2

demo2_display
		movlw	d'3'
		movwf	lpcnt2		;ループカウンタ = 3 を設定

demo2		clrf	PORTA		;00: "HH","HL" 桁の指定
		call	lower_upper
		call	left_right

		movlw	h'10'
		movwf	PORTA		;01: "MH","ML" 桁の指定
		call	left_right

		movlw	h'20'
		movwf	PORTA		;10: "SH","SL" 桁の指定
		call	left_right
		call	upper_lower
		call	right_left

		movlw	h'10'
		movwf	PORTA		;01: "MH","ML" 桁の指定
		call	right_left

		clrf	PORTA		;00: "HH","HL" 桁の指定
		call	right_left

		decfsz	lpcnt2,F	;ループカウンタ - 1 = 0 か？
		goto	demo2		;No

		return

;--------------------------------------------------------------------------

;		下 → 上 方向に LED が点灯移行

lower_upper
		clrf	PORTC		;col カラムデータを出力
		movlw	h'fe'
		movwf	rowdata		;row 表示データ
		movlw	d'8'
		movwf	lpcnt		;ループカウンタ = 8 を設定

lu01		movlw	h'ff'
		movwf	PORTB		;LED off
		movf	rowdata,W
		movwf	PORTB		;row 表示データを出力

		movlw	d'10'		;10 m秒
		call	wait_1xms	;1 m秒 ウェイトルーチン

		bsf	STATUS,C
		rlf	rowdata,F	;col カラムデータの更新
		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		goto	lu01		;No

		return

;--------------------------------------------------------------------------

;		上 → 下 方向に LED が点灯移行

upper_lower
		movlw	h'0f'
		movwf	PORTC		;col カラムデータを出力
		movlw	h'7f'
		movwf	rowdata		;row 表示データ
		movlw	d'8'
		movwf	lpcnt		;ループカウンタ = 8 を設定

ul01		movlw	h'ff'
		movwf	PORTB		;LED off
		movf	rowdata,W
		movwf	PORTB		;row 表示データを出力

		movlw	d'10'		;10 m秒
		call	wait_1xms	;1 m秒 ウェイトルーチン

		bsf	STATUS,C
		rrf	rowdata,F	;col カラムデータの更新
		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		goto	ul01		;No

		return

;--------------------------------------------------------------------------

;		左 → 右 方向に LED が点灯移行

left_right
		clrf	coldata
		movlw	d'16'
		movwf	lpcnt		;ループカウンタ = 16 を設定

lr01		movlw	h'ff'
		movwf	PORTB		;LED off
		movf	coldata,W
		movwf	PORTC		;col カラムデータを出力
		movlw	h'7f'
		movwf	PORTB		;row 表示データを出力

		movlw	d'10'		;10 m秒
		call	wait_1xms	;1x m秒 ウェイトルーチン

		incf	coldata,F	;col カラムデータの更新
		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		goto	lr01		;No

		return

;--------------------------------------------------------------------------

;		右 → 左 方向に LED が点灯移行

right_left
		movlw	d'16'
		movwf	lpcnt		;ループカウンタ = 16 を設定

rl01		movlw	h'ff'
		movwf	PORTB		;LED off
		decf	lpcnt,W
		movwf	PORTC		;col カラムデータを出力
		movlw	h'fe'
		movwf	PORTB		;row 表示データを出力

		movlw	d'10'		;10 m秒
		call	wait_1xms	;1x m秒 ウェイトルーチン

		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		goto	rl01		;No

		return

;==========================================================================
;		メイン・ルーチン
;
; MODEフラグ:  0:時間, 1:年月日, 2:気温, 3:オート, 4:時間(時報付), (5:SET)
;==========================================================================

main
		btfsc	updtflg,3	;EEPROM制御フラグ = OFF か？
		call	eeprom_write	;No. カレンダーデータのバックアップ (EEPROMへ書き込み)

		call	dimrflg_cntrl	;ディマーフラグ制御
		movlw	h'00'
		subwf	modeflg,W
		btfsc	STATUS,Z	;MODEフラグ <> 0(時間)表示 か？
		goto	mai01		;No

		movlw	h'04'
		subwf	modeflg,W
		btfss	STATUS,Z	;MODEフラグ = 4(時間(時報付))表示 か？
		goto	mai02		;No

;-------------- ドットマトリクス LED の(時間)表示

mai01		call	cnv_24to12	;24時間表示を12時間表示に変換と
					;時 BCD カウンタの番地を間接アドレスの先頭番地に設定
		movlw	h'fe'		;時間(xx:xx:xx)表示指定
		movwf	dspdigit	;表示桁指定フラグの設定

		btfss	timeflg,0	;時間表示フラグ bit0=1:12H か？			;;Ver. 2.40 にて追加
		goto	mai07		;No. ゼロサプレスをしない			;;

		movf	tempfsr,W	;間接アドレスの先頭番地
		movwf	FSR
		movf	INDF,W
		andlw	h'f0'		;上位4ビット
		btfsc	STATUS,Z	;時 BCD カウンタ > h'00' か？
		bcf	dspdigit,7	;No. ゼロサプレス "HH"桁を非表示(_x:xx:xx) dspdigit = h'7e'
		goto	mai07		;ドットマトリクス LED の表示へ

mai02		movlw	h'01'
		subwf	modeflg,W
		btfss	STATUS,Z	;MODEフラグ = 1(年月日)表示 か？
		goto	mai04		;No

;-------------- ドットマトリクス LED の(年月日)表示

mai03		movlw	bcd_yy		;年 BCD カウンタの番地
		movwf	tempfsr		;間接アドレスの先頭番地の設定
		movlw	h'fd'		;年月日(xx.xx.xx)表示指定
		movwf	dspdigit	;表示桁指定フラグの設定
		goto	mai07		;ドットマトリクス LED の表示へ

mai04		movlw	h'02'
		subwf	modeflg,W
		btfss	STATUS,Z	;MODEフラグ = 2(気温)表示 か？
		goto	mai06		;No

;-------------- ドットマトリクス LED の(気温)表示

mai05		call	temperature	;気温測定
		movlw	TenK
		movwf	tempfsr		;間接アドレスの先頭番地の設定
		movlw	h'3d'		;気温(__ xx.x℃)表示指定
		movwf	dspdigit	;表示桁指定フラグの設定
		movlw	h'10'
		subwf	Thou,W
		btfss	STATUS,C	;Thou >= 10 か？
		bcf	dspdigit,5	;No. ゼロサプレス "MH"桁を非表示(__ _x.x℃) dspdigit = h'1d'
		movlw	h'0a'		;℃
		iorwf	Hund,F
		goto	mai07		;ドットマトリクス LED の表示へ

;-------------- オートモードの処理

		; (___: 時間表示)
		; (NNN: 時間表示中、毎05～09秒と35～39秒の間が年月日表示)
		; (KKK: 時間表示中、毎20～24秒と50～54秒の間が気温表示)

		;  00        10        20        30        40        50        00
		;  .    .    .    .    .    .    .    .    .    .    .    .    .
		;  _____NNNNN__________KKKKK__________NNNNN__________KKKKK_____

mai06		movlw	h'00' - h'05'
		addwf	bcd_ss,W
		btfss	STATUS,C	;bcd_ss > h'05' か？
		goto	mai01		;No. (時間)表示へ

		movlw	h'00' - (h'09' + 1)
		addwf	bcd_ss,W
		btfss	STATUS,C	;bcd_ss > h'10' か？
		goto	mai03		;No. (年月日)表示へ

		movlw	h'00' - h'20'
		addwf	bcd_ss,W
		btfss	STATUS,C	;bcd_ss > h'20' か？
		goto	mai01		;No. (時間)表示へ

		movlw	h'00' - (h'24' + 1)
		addwf	bcd_ss,W
		btfss	STATUS,C	;bcd_ss > h'25' か？
		goto	mai05		;No. (気温)表示へ

		movlw	h'00' - h'35'
		addwf	bcd_ss,W
		btfss	STATUS,C	;bcd_ss > h'35' か？
		goto	mai01		;No. (時間)表示へ

		movlw	h'00' - (h'39' + 1)
		addwf	bcd_ss,W
		btfss	STATUS,C	;bcd_ss > h'40' か？
		goto	mai03		;No. (年月日)表示へ

		movlw	h'00' - h'50'
		addwf	bcd_ss,W
		btfss	STATUS,C	;bcd_ss > h'50' か？
		goto	mai01		;No. (時間)表示へ

		movlw	h'00' - (h'54' + 1)
		addwf	bcd_ss,W
		btfss	STATUS,C	;bcd_ss > h'55' か？
		goto	mai05		;No. (気温)表示へ
		goto	mai01		;Yes.(時間)表示へ

mai07		call	dxled_display	;ドットマトリクス LED の表示

#ifdef	_sound_sub
		btfss	sigflg,0	;時報音出力フラグ = 予報音か？
		goto	mai0x		;No
		Sound_Play_M	f_rah, d'100'	; "プッ"
		goto	mai0y

mai0x		btfss	sigflg,1	;時報音出力フラグ = 正報音か？
		goto	mai0y		;No
		Sound_Play_M	f_ra2, d'1000'	; "ポッ～～ン"

mai0y		clrf	sigflg		;時報音出力フラグのクリア
#endif
;-------------- スイッチのON／OFF状態フラグのチェック

		btfss	swstate,7	;MODEスイッチ = ON か？
		goto	mai08		;No

;-------------- MODEスイッチの処理

		incf	modeflg,F	;MODEフラグ +1 更新
		movlw	h'05'
		subwf	modeflg,W
		btfsc	STATUS,Z	;MODEフラグ <> 5 か？
		clrf	modeflg		;No. modeflg = 0
		bsf	modeflg2,7	;モード更新フラグセット
		goto	mai12

mai08		btfss	swstate,6	;SETスイッチ = ON か？
		goto	mai09		;No

;--------------  SETスイッチの処理

		call	set_switch	;SETスイッチの処理
		goto	mai12

mai09		btfss	swstate,4	;ZEROスイッチ = ON か？
		goto	mai12		;No

;-------------- ZEROスイッチの処理

		movlw	h'06'
		subwf	bcd_mm,W
		btfss	STATUS,C	;分 BCD カウンタ >= h'06' か？
		goto	mai10		;No

		movlw	h'55'
		subwf	bcd_mm,W
		btfss	STATUS,C	;分 BCD カウンタ >= h'55' か？
		goto	mai12		;No

		bcf	INTCON,GIE	;全割り込み禁止
		call	bcd_hh_inc	;時 BCD カウンタのインクリメント
		goto	mai11

mai10		bcf	INTCON,GIE	;全割り込み禁止

mai11		clrf	bcd_mm		;分 BCD カウンタのクリア
		clrf	bcd_ss		;秒 BCD カウンタのクリア
		clrf	cnt_high	;１秒カウンタの初期設定
		clrf	cnt_low
		bsf	INTCON,GIE	;全割り込み禁止解除

mai12		clrf	swstate		;スイッチ入力の保存をクリア
		btfss	updtflg,1	;年月日更新フラグ = ON か？
		goto	main		;No

;-------------- 年月日の更新

		call	bcd_dd_inc	;日 BCD カウンタのインクリメント
		bcf	updtflg,1	;年月日更新フラグのクリア
		bsf	updtflg,3	;EEPROM制御フラグのセット
		movlw	h'01'
		subwf	bcd_dd,W
		btfss	STATUS,Z	;日 BCD カウンタ = h'01' か？
		goto	main		;No

		call	bcd_nn_inc	;月 BCD カウンタのインクリメント
		movlw	h'01'
		subwf	bcd_nn,W
		btfss	STATUS,Z	;月 BCD カウンタ = h'01' か？
		goto	main		;No

		call	bcd_yy_inc	;年 BCD カウンタのインクリメント
		goto	main

;==========================================================================

;		カレンダーデータのバックアップ (EEPROMへ書き込み)
;		( bcd_yy, bcd_nn, bcd_dd, bcd_hh, bcd_mm )

eeprom_write
		bcf	updtflg,3	;EEPROM制御フラグのクリア

		movlw	bcd_yy		;bcd_yy のアドレス
		movwf	FSR

		movlw	5		;bcd_yy ～ bcd_mm
		movwf	lpcnt		;ループカウンタを設定

		bsf	STATUS,RP1	;バンク 2
		movlw	eep_size	;EEPROM 格納先頭アドレス
		movwf	EEADR		;EEPROM の記録アドレスを設定
		bcf	STATUS,RP1	;バンク 0

eepw01		movf	INDF,W		;データの読み出し
		incf	FSR,F		;間接アドレス +1 更新

		bsf	STATUS,RP1	;バンク 2
		movwf	EEDATA		;書き込みデータを設定
		bsf	STATUS,RP0	;バンク 3
		bcf	EECON1,EEPGD	;データEEPROMメモリ
		bsf	EECON1,WREN	;書き込みイネーブル = ON
		movlw	h'55'
		movwf	EECON2		;h'55' を EECON2 に書き込む
		movlw	h'aa'
		movwf	EECON2		;h'aa' を EECON2 に書き込む
		bsf	EECON1,WR	;書き込み開始
		btfsc	EECON1,WR	;書き込み 終了か?
		goto	$-1		;No

		bcf	EECON1,WREN	;書き込みイネーブル = OFF
		bcf	STATUS,RP0	;バンク 2
		incf	EEADR,F		;EEPROM 格納アドレス +1 更新

		bcf	STATUS,RP1	;バンク 0
		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		goto	eepw01		;No.

		return

;==========================================================================

;		ディマーフラグ制御

dimrflg_cntrl
		bsf	STATUS,RP0	;バンク 1
		bcf	ADCON1,ADFM	;Ａ／Ｄ変換結果を左詰め
		bcf	STATUS,RP0	;バンク 0
		movlw	h'81'		;ADCS=10: Ａ／Ｄ変換クロックを指定 Fosc/32, 
		movwf	ADCON0		;CHS=000: チャネル０(RA0), ADON=1: Ａ／Ｄ変換モジュール電源ＯＮ
		call	wait_22us	;アクィジション時間
		bsf	ADCON0,GO_DONE	;Ａ／Ｄ変換起動／処理中

dfcnt01		btfsc	ADCON0,GO_DONE	;変換完了(ハードでクリア) か？
		goto	dfcnt01		;No
					;       (左詰め)        (右詰め)
		movlw	h'76'		;h'76' = 0111.0110.xx → 01.1101.10xx = h'1d8' = d'472'
		subwf	ADRESH,W	;472 * 5.0 /1024 = 2.3046875
		btfsc	STATUS,C	;ADRESH <  h'76' ( 2.3046875 V ) か？
		goto	dfcnt02		;No.	>=

		bsf	updtflg,2	;ディマー制御フラグのセット (暗)
		goto	dfcnt03		

dfcnt02		movlw	h'8a'		;h'8a' = 1000.1010.xx → 10.0010.10xx = h'228' = d'552'
		subwf	ADRESH,W	;552 * 5.0 /1024 = 2.6953125
		btfss	STATUS,C	;ADRESH >= h'8a' ( 2.6953125 V ) か？
		goto	dfcnt03		;No.	<

		bcf	updtflg,2	;ディマー制御フラグのクリア (明)

dfcnt03		bcf	ADCON0,ADON	;Ａ／Ｄ変換モジュール電源ＯＦＦ
		return		

;==========================================================================

;		気温の測定

temperature
		bsf	STATUS,RP0	;バンク 1
		bsf	ADCON1,ADFM	;Ａ／Ｄ変換結果を右詰め
		bcf	STATUS,RP0	;バンク 0
		movlw	h'89'		;ADCS=10: Ａ／Ｄ変換クロックを指定 Fosc/32, 
		movwf	ADCON0		;CHS=001: チャネル１(RA1), ADON=1: Ａ／Ｄ変換モジュール電源ＯＮ
		call	wait_22us	;アクィジション時間
		bsf	ADCON0,GO_DONE	;GO/DONE=1: Ａ／Ｄ変換起動／処理中

temp01		btfsc	ADCON0,GO_DONE	;変換完了(ハードでクリア) か？
		goto	temp01		;No

		movf	ADRESH,W	;high
		movwf	NumH
		bsf	STATUS,RP0	;バンク 1
		movf	ADRESL,W	;low
		bcf	STATUS,RP0	;バンク 0
		movwf	NumL
		bcf	ADCON0,ADON	;Ａ／Ｄ変換モジュール電源ＯＦＦ

		call	Convert		;Binary-to-BCD 変換
					;TenK:Thou:Hund:Tens:Ones
		movf	Hund,W
		movwf	Thou
		swapf	Thou,F		;"MH" 桁: 上位4ビット
		movf	Tens,W
		iorwf	Thou,F		;"ML" 桁: 下位4ビット
		movf	Ones,W
		movwf	Hund
		swapf	Hund,F		;"SH" 桁: 上位4ビット
		return		

;==========================================================================

;		24時間表示を12時間表示に変換と
;		時 BCD カウンタの番地を 間接アドレスの先頭番地に設定

;(24H) 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
;(12H) 12 01 02 03 04 05 06 07 08 09 10 11 12 01 02 03 04 05 06 07 08 09 10 11
;      am am am am am am am am am am am am pm pm pm pm pm pm pm pm pm pm pm pm		;;Ver. 2.40 にて修正
;                                          -----------------------------------
;     +12                                 -12
;    ( 12 ef f0 f1 f2 f3 f4 f5 f6 f7 fe ff 00 01 02 03 04 05 06 07 0e 0f 10 11 )

cnv_24to12
		clrf	timeflg		;時間表示フラグ bit0=0:24H/1:12H, bit1=0:am/1:pm
;
		bsf	STATUS,RP0	;バンク 1
		bsf	TRISA,speaker	;RA2: 入力
		bcf	STATUS,RP0	;バンク 0
;
		movlw	bcd_hh		;時 BCD カウンタの番地
		btfsc	PORTA,speaker	;12 / 24 SELECTスイッチ = ON("L") か？
		goto	cnv03		;No

		movf	bcd_hh,W	;時 BCD カウンタ
		movwf	temp_hh		;仮の時 BCD カウンタ
		movf	bcd_mm,W	;分 BCD カウンタ
		movwf	temp_mm
		movf	bcd_ss,W	;秒 BCD カウンタ
		movwf	temp_ss
		bsf	timeflg,0	;12時間表示

		movf	temp_hh,W
		btfss	STATUS,Z	;仮の時 BCD カウンタ = h'00' か？
		goto	cnv01		;No

	;;	movlw	h'24'								;;
	;;	movwf	temp_hh		;仮の時 BCD カウンタ temp_hh = h'24'		;;
	;;										;;Ver. 2.40 にて修正
		movlw	h'12'								;;
		movwf	temp_hh		;仮の時 BCD カウンタ temp_hh = h'12'		;;
		goto	cnv02		;     (am)					;;

cnv01		movlw	h'12'
		subwf	temp_hh,W
	;;	btfsc	STATUS,Z	;仮の時 BCD カウンタ <> h'12' か？		;;
	;;	goto	cnv02		;No						;;
	;;										;;
	;;	btfss	STATUS,C	;仮の時 BCD カウンタ > h'12' か？		;;
	;;	goto	cnv02		;No						;;Ver. 2.40 にて修正
	;;										;;
		btfss	STATUS,C	;仮の時 BCD カウンタ < h'12' か？		;;
		goto	cnv02		;Yes. (am)					;;
											;;
	;;	movwf	temp_hh		;仮の時 BCD カウンタ temp_hh = temp_hh - 12	;;
		bsf	timeflg,1	;pm表示
											;;
		btfsc	STATUS,Z	;仮の時 BCD カウンタ = h'12' か？		;;
		goto	cnv02		;Yes. (pm)					;;Ver. 2.40 にて修正
											;;
		movwf	temp_hh		;仮の時 BCD カウンタ temp_hh = temp_hh - 12	;;
		movlw	h'0e'
		subwf	temp_hh,W
		btfss	STATUS,C	;仮の時 BCD カウンタ >= h'0e' か？
		goto	cnv02		;No

		movlw	h'10'
		subwf	temp_hh,W
		btfsc	STATUS,C	;仮の時 BCD カウンタ < h'10' か？
		goto	cnv02		;No

		movlw	h'06'
		subwf	temp_hh,F	;補正
;;
cnv02		movlw	temp_hh		;仮の時 BCD カウンタの番地

cnv03		movwf	tempfsr		;間接アドレスの先頭番地に設定
		return		

;==========================================================================
;		SETスイッチの処理	
;==========================================================================

set_switch
		bcf	INTCON,GIE	;全割り込み禁止
		movlw	h'05'
		movwf	modeflg		;5: SET モードに設定
		bcf	modeflg2,7	;モード更新フラグをリセット

		movf	bcd_yy,W	;年 BCD カウンタ
		movwf	temp_yy		;仮の年 BCD カウンタ
		movf	bcd_nn,W	;月 BCD カウンタ
		movwf	temp_nn		;仮の月 BCD カウンタ
		movf	bcd_dd,W	;日 BCD カウンタ
		movwf	temp_dd		;仮の日 BCD カウンタ

;-------------- 年の処理

		movlw	bcd_yy		;年 BCD カウンタの番地
		movwf	tempfsr		;間接アドレスの先頭番地の設定

set01		movlw	h'c1'		;"HH","HL" 桁 + "."
		movwf	dspdigit	;表示桁指定フラグの設定
		call	dxled_display	;ドットマトリクス LED の表示

		btfsc	swstate,7	;BACKスイッチ = OFF か？
		goto	set11		;No

		btfsc	swstate,6	;SETスイッチ = OFF か？
		goto	set03		;No

		btfss	swstate,5	;UPスイッチ = ON か？
		goto	set02		;No

		call	bcd_yy_inc	;年 BCD カウンタのインクリメント
		goto	set01

set02		btfss	swstate,4	;DOWNスイッチ = ON か？
		goto	set01		;No

		call	bcd_yy_dec	;年 BCD カウンタのデクリメント
		goto	set01

;-------------- 月の処理

set03		movlw	h'31'		;"MH","ML" 桁 + "."
		movwf	dspdigit	;表示桁指定フラグの設定
		call	dxled_display	;ドットマトリクス LED の表示

		btfsc	swstate,7	;BACKスイッチ = OFF か？
		goto	set01		;No

		btfsc	swstate,6	;SETスイッチ = OFF か？
		goto	set06		;No

		btfss	swstate,5	;UPスイッチ = ON か？
		goto	set04		;No

		call	bcd_nn_inc	;月 BCD カウンタのインクリメント
		goto	set03

set04		btfss	swstate,4	;DOWNスイッチ = ON か？
		goto	set03		;No

		call	bcd_nn_dec	;月 BCD カウンタのデクリメント
		goto	set03

;-------------- 日の処理

set05		movlw	bcd_yy		;年 BCD カウンタの番地
		movwf	tempfsr		;間接アドレスの先頭番地の設定

set06		movlw	h'0d'		;"SH","SL" 桁 + "."
		movwf	dspdigit	;表示桁指定フラグの設定
		call	dxled_display	;ドットマトリクス LED の表示

		btfsc	swstate,7	;BACKスイッチ = OFF か？
		goto	set03		;No

		btfsc	swstate,6	;SETスイッチ = OFF か？
		goto	set08		;No

		btfss	swstate,5	;UPスイッチ = ON か？
		goto	set07		;No

		call	bcd_dd_inc	;日 BCD カウンタのインクリメント
		goto	set06

set07		btfss	swstate,4	;DOWNスイッチ = ON か？
		goto	set06		;No

		call	bcd_dd_dec	;日 BCD カウンタのデクリメント
		goto	set06

;-------------- 時の処理

set08		call	cnv_24to12	;24時間表示を12時間表示に変換と
					;時 BCD カウンタの番地を間接アドレスの先頭番地に設定
		movlw	h'c2'		;"HH","HL" 桁 + ":"
		movwf	dspdigit	;表示桁指定フラグの設定
		call	dxled_display	;ドットマトリクス LED の表示

		btfsc	swstate,7	;BACKスイッチ = OFF か？
		goto	set05		;No

		btfsc	swstate,6	;SETスイッチ = OFF か？
		goto	set11		;No

		btfss	swstate,5	;UPスイッチ = ON か？
		goto	set10		;No

		movlw	bcd_hh		;時 BCD カウンタの番地
		movwf	FSR		;間接アドレスの先頭番地の設定
		call	inc_bcd		;BCDインクリメント
		movlw	h'24'
		subwf	bcd_hh,W
		btfsc	STATUS,C	;時 BCD カウンタ < h'24' か？
		clrf	bcd_hh		;No. 時 BCD カウンタのクリア
		goto	set08

set10		btfss	swstate,4	;DOWNスイッチ = ON か？
		goto	set08		;No

		movlw	bcd_hh		;時 BCD カウンタの番地
		movwf	FSR		;間接アドレスの先頭番地の設定
		call	dec_bcd		;BCDデクリメント
		movlw	h'f9'		;h'00' - h'01' - h'06'
		subwf	bcd_hh,W
		btfss	STATUS,Z	;時 BCD カウンタ = h'f9' か？
		goto	set08		;No

		movlw	h'23'
		movwf	bcd_hh		;時 BCD カウンタ = h'23' 設定
		goto	set08

;-------------- 分の処理

set11		call	cnv_24to12	;24時間表示を12時間表示に変換と
					;時 BCD カウンタの番地を間接アドレスの先頭番地に設定
		movlw	h'32'		;"MH","ML" 桁 + ":"
		movwf	dspdigit	;表示桁指定フラグの設定
		call	dxled_display	;ドットマトリクス LED の表示

		btfsc	swstate,7	;BACKスイッチ = OFF か？
		goto	set08		;No

		btfsc	swstate,6	;SETスイッチ = OFF か？
		goto	set14		;No

		btfss	swstate,5	;UPスイッチ = ON か？
		goto	set13		;No

		movlw	bcd_mm		;分 BCD カウンタの番地
		movwf	FSR		;間接アドレスの先頭番地の設定
		call	inc_bcd		;BCDインクリメント
		movlw	h'60'
		subwf	bcd_mm,W
		btfsc	STATUS,C	;分 BCD カウンタ < h'60' か？
		clrf	bcd_mm		;No. 分 BCD カウンタのクリア
		goto	set11

set13		btfss	swstate,4	;DOWNスイッチ = ON か？
		goto	set11		;No

		movlw	bcd_mm		;分 BCD カウンタの番地
		movwf	FSR		;間接アドレスの先頭番地の設定
		call	dec_bcd		;BCDデクリメント
		movlw	h'f9'		;h'00' - h'01' - h'06'
		subwf	bcd_mm,W
		btfss	STATUS,Z	;分 BCD カウンタ = h'f9' か？
		goto	set11		;No

		movlw	h'59'
		movwf	bcd_mm		;分 BCD カウンタ = h'59' 設定
		goto	set11

set14		movf	bcd_yy,W	;年 BCD カウンタ
		subwf	temp_yy,W	;仮の年 BCD カウンタ
		btfss	STATUS,Z	;年 BCD カウンタ = 仮の年 BCD カウンタ か？
		goto	set15		;No

		movf	bcd_nn,W	;月 BCD カウンタ
		subwf	temp_nn,W	;仮の月 BCD カウンタ
		btfss	STATUS,Z	;月 BCD カウンタ = 仮の月 BCD カウンタ か？
		goto	set15		;No

		movf	bcd_dd,W	;日 BCD カウンタ
		subwf	temp_dd,W	;仮の日 BCD カウンタ
		btfsc	STATUS,Z	;日 BCD カウンタ <> 仮の日 BCD カウンタ か？
		goto	set16		;No

set15		bsf	updtflg,3	;EEPROM制御フラグのセット

set16		clrf	modeflg		;MODEフラグの初期設定
		clrf	cnt_high	;１秒カウンタの初期設定
		clrf	cnt_low
		clrf	bcd_ss		;秒 BCD カウンタのクリア
		bsf	INTCON,GIE	;全割り込み禁止解除
		return		

;==========================================================================
;		ドットマトリクス LED の表示とスイッチチェック
;==========================================================================

		; ドットマトリクス LED の表示

		; 入力:	tempfsr:  表示文字列の先頭番地
		;	dspdigit: bit7: "HH" 桁の指定
		;		  bit6: "HL" 桁の指定
		;		  bit5: "MH" 桁の指定
		;		  bit4: "ML" 桁の指定
		;		  bit3: "SH" 桁の指定
		;		  bit2: "SL" 桁の指定
		;		  bit1: :("Colon") の指定
		;		  bit0: .("Period")の指定
dxled_display
		movlw	h'05'
		subwf	modeflg,W
		btfss	STATUS,Z	;MODEフラグ = 5(SET) か？
		goto	dxdsp01		;No

		clrf	swstate		;スイッチ入力の保存をクリア

dxdsp01		clrf	PORTA		;00: "HH","HL" 桁の指定
		movf	tempfsr,W	;間接アドレスの先頭番地
		movwf	FSR

		btfsc	modeflg2,7	;モード更新フラグ = off か？
		goto	dxdsp02		;No

		btfss	dspdigit,7	;表示桁指定フラグ = 7 ("HH") on か？
		goto	dxdsp03		;No

dxdsp02		clrf	coldata		;col カラムデータの設定
		btfsc	modeflg2,7	;モード更新フラグ = off か？
		bsf	coldata,7	;No. モードNo表示指定をセット

		swapf	INDF,W		;上位4ビット
		call	font_data_set	;"HH" 桁: 1 文字フォントデータパタンの表示

dxdsp03		btfss	dspdigit,6	;表示桁指定フラグ = 6 ("HL") on か？
		goto	dxdsp04		;No

		movlw	h'08'
		movwf	coldata		;col カラムデータの設定
		movf	INDF,W		;下位4ビット
		call	font_data_set	;"HL" 桁: 1 文字フォントデータパタンの表示

dxdsp04		movlw	h'10'
		movwf	PORTA		;01: "MH","ML" 桁の指定
		incf	FSR,F		;間接アドレス +1 更新
		btfss	dspdigit,5	;表示桁指定フラグ = 5 ("MH") on か？
		goto	dxdsp05		;No

		clrf	coldata		;col カラムデータの設定
		swapf	INDF,W		;上位4ビット
		call	font_data_set	;"MH" 桁: 1 文字フォントデータパタンの表示

dxdsp05		btfss	dspdigit,4	;表示桁指定フラグ = 4 ("ML") on か？
		goto	dxdsp06		;No

		movlw	h'08'
		movwf	coldata		;col カラムデータの設定
		movf	INDF,W		;下位4ビット
		call	font_data_set	;"ML" 桁: 1 文字フォントデータパタンの表示

dxdsp06		movlw	h'20'
		movwf	PORTA		;10: "SH","SL" 桁の指定
		incf	FSR,F		;間接アドレス +1 更新
		btfss	dspdigit,3	;表示桁指定フラグ = 3 ("SH") on か？
		goto	dxdsp07		;No

		clrf	coldata		;col カラムデータの設定
		swapf	INDF,W		;上位4ビット
		call	font_data_set	;"SH" 桁: 1 文字フォントデータパタンの表示

dxdsp07		btfss	dspdigit,2	;表示桁指定フラグ = 2 ("SL") on か？
		goto	dxdsp08		;No

		movlw	h'08'
		movwf	coldata		;col カラムデータの設定
		movf	INDF,W		;下位4ビット
		call	font_data_set	;"SL" 桁: 1 文字フォントデータパタンの表示

		; :("Colon") / .("Period") の LED表示

dxdsp08		movlw	h'ff'
		movwf	PORTB		;LED off
		movlw	h'30'
		movwf	PORTA		;11: :("Colon") or .("Period")の指定

		btfss	dspdigit,1	;表示桁指定フラグ = 1 ("Colon") on か？
		goto	dxdsp10		;No

		movlw	h'0f'		;:("Colon")指定
		btfss	timeflg,0	;12時間表示 か？
		goto	dxdsp12		;No

		movlw	h'05'
		subwf	modeflg,W
		btfss	STATUS,Z	;MODEフラグ = 5(SET モード) か？
		goto	dxdsp09		;No.

		movlw	h'0b'		;am指定, :("Colon")右列上下 + 左列上側 LED点灯
		btfss	timeflg,1	;pm表示 か？
		goto	dxdsp12		;No

		movlw	h'07'		;pm指定, :("Colon")右列上下 + 左列下側 LED点灯
		goto	dxdsp12

dxdsp09		movlw	h'0f'		;:("Colon")指定
		btfss	blinkflg,0	;12時間表示時の AM/PM 表示点滅タイミング
		goto	dxdsp12		;No

		movlw	h'07'		;am指定, :("Colon")左列上側 LED点滅
		btfss	timeflg,1	;pm表示 か？
		goto	dxdsp12		;No

		movlw	h'0b'		;pm指定, :("Colon")左列下側 LED点滅
		goto	dxdsp12

dxdsp10		movlw	h'00'		;無表示指定
		btfss	dspdigit,0	;表示桁指定フラグ = 0 ("Period") on か？
		goto	dxdsp12		;No. 無表示

		movlw	h'05'
		subwf	modeflg,W
		btfsc	STATUS,Z	;MODEフラグ <> 5(SET モード) か？
		goto	dxdsp11		;No.

;		movlw	h'04'		; 左. ("Period")指定
;		btfss	dspdigit,3	;表示桁指定フラグ = 3 ("SH") on か？
;		goto	dxdsp12		;No

		movlw	h'01'		; 右 .("Period")指定
		btfss	dspdigit,6	;表示桁指定フラグ = 6 ("HL") on か？
		goto	dxdsp12		;No. .("Period")指定 ... 気温(__ xx.x℃)

dxdsp11		movlw	h'05'		; 両..("Period")指定 ... 年月日(xx.xx.xx) or Ver(xx._x.xx)

dxdsp12		xorlw	h'ff'		;ビット反転
		movwf	PORTB		;
		call	wait_50us	;50μ秒 ウェイトルーチン
		movlw	h'ff'
		movwf	PORTB		;LED off

		; スイッチ入力の読み込み

		movf	chatter,F	;チャタリング吸収カウンタ
		btfsc	STATUS,Z	;chatter = 0 か？
		goto	dxdsp13		;Yes

		decf	chatter,F	;チャタリング吸収カウンタの -1 更新
		goto	dxdsp14

dxdsp13		movf	PORTC,W		;一度に各スイッチ入力を読み込み
		andlw	h'f0'		;スイッチ入力だけの
		xorlw	h'f0'		;反転値を取り出して
		movwf	swstate		;保存する
		btfsc	STATUS,Z	;すべてのスイッチ = OFF か？
		goto	dxdsp14		;Yes

		movlw	d'150'
		movwf	chatter		;チャタリング吸収カウンタを設定
		bsf	updtflg,0	;時分秒更新フラグのセット
					;(直ちにサブルーチンを抜け出るため)
dxdsp14		movlw	h'05'
		subwf	modeflg,W
		btfsc	STATUS,Z	;MODEフラグ <> 5(SET モード) か？
		goto	dxdsp15		;No

		btfss	updtflg,0	;時分秒更新フラグ = ON か？
		goto	dxled_display	;No.

		bcf	updtflg,0	;時分秒更新フラグのクリア

dxdsp15		return		

;==========================================================================

		; 1 文字フォントデータパタンの表示

		; 入力:	　    W: 表示文字データ (h'x0'～h'x9', h'xa'～h'xc')
		;	coldata: カラムデータ   (h'00'／h'08' ... 通常表示指定)
		;				(h'80'        ... モードNo表示指定)

font_data_set
		andlw	h'0f'		;下位4ビットを取り出す
		movwf	addr_low

		btfsc	coldata,7	;通常表示指定か？
		goto	foset01		;No. モードNo表示指定

		movlw	high font_data_tbl
		movwf	addr_high	;文字フォントデータの先頭 high アドレス

		bcf	STATUS,C
		rlf	addr_low,F	;8倍する
		rlf	addr_low,F
		rlf	addr_low,F
		movlw	low font_data_tbl
		addwf	addr_low,F	;文字フォントデータの先頭 low アドレス
		btfsc	STATUS,C	;オーバーフローした場合は
		incf	addr_high,F	;文字フォントデータアドレス high の更新
		goto	foset03

foset01		movf	modeflg,W	;モードNoを
		movwf	lpcnt		;シフトカウンタに設定
		incf	lpcnt,F
		movlw	h'fe'		;初期値
		movwf	work

foset02		decf	lpcnt,F
		btfsc	STATUS,Z	;シフトカウンタ - 1 <> 0 か？
		goto	foset03		;No

		bsf	STATUS,C
		rlf	work,F		;モードNo に対応したビットを設定
		goto	foset02

foset03		movlw	d'8'
		movwf	lpcnt		;ループカウンタ = 8 を設定

foset04		movlw	h'ff'
		movwf	PORTB		;LED off
		btfss	updtflg,2	;ディマー制御フラグ = ON か？
		goto	foset05		;No

		call	wait_100us	;100μ秒 ウェイトルーチン

foset05		movf	coldata,W
		andlw	h'7f'
		movwf	PORTC		;col カラムデータを出力

		btfsc	coldata,7	;通常表示指定か？
		goto	foset06		;No. モードNo表示指定

		call	font_read	;文字フォントデータの読み出し
		movwf	work
		movlw	high $		;この場所の high アドレスを
		movwf	PCLATH		;PCLATH に設定

foset06		movf	work,W
		movwf	PORTB		;row 読み出しデータを出力

		call	wait_50us	;50μ秒 ウェイトルーチン

		incf	coldata,F	;col カラムデータの更新
		incf	addr_low,F	;文字フォントデータアドレス low の更新
		btfsc	STATUS,Z	;オーバーフローした場合は
		incf	addr_high,F	;文字フォントデータアドレス high の更新

		decfsz	lpcnt,F		;ループカウンタ - 1 = 0 か？
		goto	foset04		;No

		movlw	h'ff'
		movwf	PORTB		;LED off
		return

		; 文字フォントデータの読み出し
		; 入力:	addr_high: 文字フォントデータ high アドレス
		;	addr_low:  文字フォントデータ low アドレス
		; 出力:	W: 文字フォントデータ

font_read
		movf	addr_high,W	;文字フォントデータの high アドレス
		movwf	PCLATH
		movf	addr_low,W	;文字フォントデータの low アドレス
		movwf	PCL

;==========================================================================

;		日 BCD カウンタのインクリメント

bcd_dd_inc
		incf	bcd_dd,F	;日 BCD カウンタ +1 更新
		movf	bcd_dd,W
		movwf	work1
		movlw	h'0f'
		andwf	work1,F		;下位4ビット
		movlw	h'0a'
		subwf	work1,W
		btfss	STATUS,Z	;work1 = 10 か？
		goto	ddinc01		;No

		movlw	h'06'
		addwf	bcd_dd,F	;下位4ビット = 0, 上位4ビット = +1

ddinc01		call	month_days	;各月の日数計算
		movwf	work1		;各月の日数
		movf	bcd_dd,W
		subwf	work1,W
		btfss	STATUS,C	;日 BCD カウンタ =< work1 か？
		goto	ddinc02		;No
		return		

ddinc02		movlw	h'01'
		movwf	bcd_dd		;日 BCD カウンタ = h'01' 設定
		return		

;--------------------------------------------------------------------------

;		各月の日数計算

month_days
		movlw	h'02'
		subwf	bcd_nn,W
		btfss	STATUS,Z	;月 BCD カウンタ = h'02' か？
		goto	mday03		;No

;;;;;		movlw	h'00'
;		subwf	bcd_yy,W
;		btfsc	STATUS,Z	;年 BCD カウンタ <> h'00' か？
;		goto	mday01		;No
;
;		movf	bcd_yy,W
; (bug)		movwf	work1
;		movlw	h'03'
;		andwf	work1,F		;下位2ビット
;		movlw	h'00'
;		subwf	work1,W
;		btfsc	STATUS,Z	;work1 <> 0 か？
;;;;;		goto	mday02		;No

;;;;;		( bugfix: Ver. 2.30 2014/10/15 )

		swapf	bcd_yy,W	;上位4ビット(10位)を BCD からバイナリ変換
		andlw	h'0f'
		movwf	work1
		bcf	STATUS,C
		rlf	work1,F		;2倍
		rlf	work1,F		;4倍
		addwf	work1,F		;5倍
		rlf	work1,F		;10倍

		movf	bcd_yy,W	;下位4ビット(単位)
		andlw	h'0f'
		addwf	work1,W		;10位 + 単位 = W レジスタ

		andlw	h'03'		;下位2ビット
		btfss	STATUS,Z	;下位2ビット = b'00' か？
		goto	mday01		;No. 平年 ... 4で割れない

		movf	bcd_yy,W
		btfss	STATUS,Z	;年 BCD カウンタ = h'00' か？
		goto	mday02		;No. 閏年 ... 100で割れない
;;;;;					;2000年は対応外 400で割れるから閏年

mday01		movlw	h'28'		;平年 2月
		goto	mday05

mday02		movlw	h'29'		;閏年 2月
		goto	mday05

mday03		movlw	h'04'
		subwf	bcd_nn,W
		btfsc	STATUS,Z	;月 BCD カウンタ <> h'04' か？
		goto	mday04		;No

		movlw	h'06'
		subwf	bcd_nn,W
		btfsc	STATUS,Z	;月 BCD カウンタ <> h'06' か？
		goto	mday04		;No

		movlw	h'09'
		subwf	bcd_nn,W
		btfsc	STATUS,Z	;月 BCD カウンタ <> h'09' か？
		goto	mday04		;No

		movlw	h'11'
		subwf	bcd_nn,W
		btfsc	STATUS,Z	;月 BCD カウンタ <> h'11' か？
		goto	mday04		;No

		movlw	h'31'		;h'01', h'03', h'05', h'07', h'08', h'10', h'12'
		goto	mday05

mday04		movlw	h'30'		;h'04', h'06', h'09', h'11'

mday05		return

;--------------------------------------------------------------------------

;		月 BCD カウンタのインクリメント

bcd_nn_inc
		incf	bcd_nn,F	;月 BCD カウンタ +1 更新
		movf	bcd_nn,W
		movwf	work1
		movlw	h'0f'
		andwf	work1,F		;下位4ビット
		movlw	h'0a'
		subwf	work1,W
		btfss	STATUS,Z	;work1 = 10 か？
		goto	nninc01		;No
		movlw	h'06'
		addwf	bcd_nn,F	;下位4ビット = 0, 上位4ビット = +1

nninc01		movlw	h'13'
		subwf	bcd_nn,W
		btfss	STATUS,C	;月 BCD カウンタ >= h'13' か？
		goto	nninc02		;No

		movlw	h'01'
		movwf	bcd_nn		;月 BCD カウンタ = h'01' 設定

nninc02		return		

;--------------------------------------------------------------------------

;		年 BCD カウンタのインクリメント

bcd_yy_inc
		incf	bcd_yy,F	;年 BCD カウンタ +1 更新
		movf	bcd_yy,W
		movwf	work1
		movlw	h'0f'
		andwf	work1,F		;下位4ビット
		movlw	h'0a'
		subwf	work1,W
		btfss	STATUS,Z	;work1 = 10 か？
		goto	yyinc01		;No

		movlw	h'06'
		addwf	bcd_yy,F	;下位4ビット = 0, 上位4ビット = +1

yyinc01		movlw	h'a0'
		subwf	bcd_yy,W
		btfss	STATUS,C	;年 BCD カウンタ >= 'a0' か？
		goto	yyinc02		;No

		clrf	bcd_yy		;年 BCD カウンタ = h'00' 設定

yyinc02		return		

;--------------------------------------------------------------------------

;		日 BCD カウンタのデクリメント

bcd_dd_dec
		decf	bcd_dd,F	;日 BCD カウンタ -1 更新
		btfsc	STATUS,Z	;日 BCD カウンタ <> h'00' か？
		goto	dddec01		;No

		movf	bcd_dd,W
		movwf	work1
		movlw	h'0f'
		andwf	work1,F		;下位4ビット
		subwf	work1,W
		btfss	STATUS,Z	;work1 = h'0f' か？
		return			;No

		movlw	h'06'
		subwf	bcd_dd,F	;日 BCD カウンタ 更新
		return		

dddec01		call	month_days	;各月の日数計算
		movwf	bcd_dd		;日 BCD カウンタ 設定
		return		

;--------------------------------------------------------------------------

;		月 BCD カウンタのデクリメント

bcd_nn_dec
		decf	bcd_nn,F	;月 BCD カウンタ -1 更新
		btfss	STATUS,Z	;月 BCD カウンタ = h'00' か？
		goto	nndec01		;No

		movlw	h'12'
		goto	nndec02

nndec01		movlw	h'0f'
		subwf	bcd_nn,W
		btfss	STATUS,Z	;月 BCD カウンタ = h'0f' か？
		return			;No

		movlw	h'09'

nndec02		movwf	bcd_nn		;月 BCD カウンタの設定
		return		

;--------------------------------------------------------------------------

;		年 BCD カウンタのデクリメント

bcd_yy_dec
		decf	bcd_yy,F	;年 BCD カウンタ -1 更新
		movlw	h'ff'
		subwf	bcd_yy,W
		btfss	STATUS,Z	;年 BCD カウンタ = h'ff' か？
		goto	yydec01		;No

		movlw	h'66'
		goto	yydec02

yydec01		movf	bcd_yy,W
		movwf	work1
		movlw	h'0f'
		andwf	work1,F		;下位4ビット
		subwf	work1,W
		btfss	STATUS,Z	;work1 = h'0f' か？
		return			;No

		movlw	h'06'

yydec02		subwf	bcd_yy,F	;年 BCD カウンタ 更新
		return		

;--------------------------------------------------------------------------

;		BCDデクリメント

dec_bcd
		decf	INDF,F		;-1 更新
		movf	INDF,W
		movwf	work2
		movlw	h'0f'
		andwf	work2,F		;下位4ビット
		subwf	work2,W
		btfss	STATUS,Z	;work2 = h'0f' か？
		return			;No

		movlw	h'06'
		subwf	INDF,F		;下位4ビット = 9
		return		

;==========================================================================
;		ウェイト・ルーチン (12.8 MHz)
;==========================================================================

;		22μ秒 ウェイトルーチン

wait_22us
		movlw	d'22'		;1
		goto	wt01		;2
					;Total	65/12.8MHz*4 = 20.3125 μS

;		50μ秒 ウェイトルーチン

wait_50us
		movlw	d'52'		;1
		goto	wt01		;2
					;Total	161/12.8MHz*4 = 50.3125 μS

;		100μ秒 ウェイトルーチン

wait_100us
		movlw	d'105'		;1
wt01		movwf	wtcnt1		;1

wt02		decfsz	wtcnt1,F	;1,2
		goto	wt02		;2,0	1+1+(1+2)*104+(2+0)=316

		return			;2	316+2=318
					;Total	318/12.8MHz*4 = 99.375 μS

;		1x m秒 ウェイトルーチン

wait_1xms
		movwf	wtcnt1		;1

wt03		movlw	h'00'		;1
		movwf	wtcnt2		;1

wt04		nop			;1
		nop			;1
		nop			;1
		nop			;1
		nop			;1
		nop			;1
		nop			;1
		nop			;1
		nop			;1
		decfsz	wtcnt2,F	;1,2
		goto	wt04		;2,0	1+1+(1*9+1+2)*256-1=3073

		decfsz	wtcnt1,F	;1,2
		goto	wt03		;2,0	1+(wtcnt1)*(3073+1+2)-1=(wtcnt1)*3076

		return			;2	(wtcnt1)*3076+2
					;Total	((wtcnt1)*3076+2)/12.8MHz*4 = 961.875 μS (wtcnt1=1)

;==========================================================================
;		割り込み処理
;==========================================================================

interrupt
		; レジスタの保存

		movwf	w_save		;W レジスタの保存
		swapf	STATUS,W
		clrf	STATUS
		movwf	s_save		;STATUS レジスタの保存
		movf	PCLATH,W
		movwf	p_save		;PCLATH レジスタの保存
		clrf	PCLATH
		movf	FSR,W
		movwf	f_save		;FSR レジスタの保存

		btfsc	INTCON,T0IF	;タイマ０オーバフロー か？
		goto	t0int01		;Yes

#ifndef	_sound_sub
		btfsc	PIR1,TMR1IF	;タイマ１オーバフロー か？
		goto	t1int01		;Yes
#endif
		goto	int_end		;No

		; タイマー０割り込み

t0int01		bcf	INTCON,T0IF	;タイマ０オーバフロー解除

		incfsz	cnt_low,F	;１秒カウンタcnt_low = +1 更新
		goto	$+2
		incf	cnt_high,F

		call	time_signal_2	;時報音出力コントロール-2

		; 1秒 チェック		;1秒 / (1/(12.8M/4) * 4(プリスケーラ値) * 256) = 3125
 
		movlw	low sec1cnt	;low (h'0C35' = d'3125') = h'35'
		subwf	cnt_low,W
		btfss	STATUS,Z	;１秒カウンタcnt_low = h'35' か？
		goto	int_end		;No

		movlw	high sec1cnt	;high (h'0C35' = d'3125') = h'0c'
		subwf	cnt_high,W
		btfss	STATUS,C	;１秒カウンタcnt_high >= h'0c' か？
		goto	int_end		;No

		movlw	h'01'
		xorwf	blinkflg,F	;12時間表示時の AM/PM 表示点滅タイミング

		clrf	cnt_high	;１秒カウンタの初期設定
		clrf	cnt_low
		call	bcd_ssmmhh_inc	;時分秒 BCD カウンタのインクリメント
		bsf	updtflg,0	;時分秒更新フラグのセット

		movf	modecnt,W
		btfsc	STATUS,Z	;モードNo表示時間カウンタ <> 0 か？
		goto	t0int02		;No

		decfsz	modecnt,F	;モードNo表示時間カウンタ - 1 = 0 か？
		goto	t0int03		;No

		bcf	modeflg2,7	;モード更新フラグをリセット
		goto	t0int03

t0int02		btfss	modeflg2,7	;モード更新フラグ = 1 か？
		goto	t0int03		;No

		movlw	d'02'
		movwf	modecnt		;モードNo表示時間カウンタ設定

t0int03		call	time_signal_1	;時報音出力コントロール-1
		goto	int_end

#ifndef	_sound_sub
		; タイマー１割り込み

t1int01		bcf	PIR1,TMR1IF	;タイマ１オーバフロー解除

		movf	const_high,W	;音階用分周定数 high を
		movwf	TMR1H		;TMR1H に設定
		movf	const_low,W	;音階用分周定数 low を
		movwf	TMR1L		;TMR1L に設定

		movlw	1 << speaker	;対象ビットをセット
		xorwf	PORTA,F		;出力をビット反転
#endif
		; 割り込み処理の終了

int_end		movf	f_save,W
		movwf	FSR		;FSR レジスタの復帰
		movf	p_save,W
		movwf	PCLATH		;PCLATH レジスタの復帰
		swapf	s_save,W
		movwf	STATUS		;STATUS レジスタの復帰
		swapf	w_save,F
		swapf	w_save,W	;W レジスタの復帰

		retfie			;割り込みからの復帰	

;==========================================================================

;		時分秒 BCD カウンタのインクリメント

bcd_ssmmhh_inc
		movlw	bcd_ss		;秒 BCD カウンタの番地
		movwf	FSR		;間接アドレスの先頭番地の設定
		call	inc_bcd		;秒 bcd_ss BCDインクリメント
		movlw	h'60'
		subwf	bcd_ss,W
		btfss	STATUS,C	;bcd_ss >= h'60' か？
		return			;No

		clrf	bcd_ss		;bcd_ss = h'00'
		movlw	bcd_mm		;分 BCD カウンタの番地
		movwf	FSR		;間接アドレスの先頭番地の設定
		call	inc_bcd		;分 bcd_mm BCDインクリメント
		movlw	h'60'
		subwf	bcd_mm,W
		btfss	STATUS,C	;bcd_mm >= h'60' か？
		return			;No

		clrf	bcd_mm		;bcd_mm = h'00'

;--------------------------------------------------------------------------

;		時 BCD カウンタのインクリメント

bcd_hh_inc
		movlw	bcd_hh		;時 BCD カウンタの番地
		movwf	FSR		;間接アドレスの先頭番地の設定
		call	inc_bcd		;時 bcd_hh BCDインクリメント
		movlw	h'24'
		subwf	bcd_hh,W
		btfss	STATUS,C	;bcd_hh >= h'24' か？
		return			;No

		bsf	updtflg,1	;年月日更新フラグのセット
		clrf	bcd_hh		;bcd_hh = h'00'
		return		

;--------------------------------------------------------------------------

;		BCDインクリメント

inc_bcd
		incf	INDF,F		;+1 更新
		movf	INDF,W
		movwf	work2
		movlw	h'0f'
		andwf	work2,F		;下位4ビット
		movlw	h'0a'
		subwf	work2,W
		btfss	STATUS,Z	;work2 = 10 か？
		return			;No

		movlw	h'06'
		addwf	INDF,F		;下位4ビット = 0, 上位4ビット = +1
		return

;==========================================================================
;		時報音出力コントロール
;==========================================================================

;  NHKの時報は、1000ミリ秒以上の無音、予報音3回、正報音1回、1000ミリ秒以上の無音という構成になっている。 
;  予報音は、一定音量の440Hzの正弦波を100ミリ秒発振させ、その後900ミリ秒の無音を置く。
;  これを1セットとして、正時の3秒前から3回繰り返している。
;  正報音は、880Hzの正弦波を発振させ、1000ミリ秒間一定の音量に保ち、次の2000ミリ秒で減衰させている。
;  出典: フリー百科事典『ウィキペディア（Wikipedia）』 ( http://ja.wikipedia.org/wiki/%E6%99%82%E5%A0%B1 )

;		時報音出力コントロール-1	

time_signal_1
		movlw	d'4'
		subwf	modeflg,W	;MODEフラグ
		btfss	STATUS,Z	;modeflg = d'4' 時間(時報付) か？
		goto	ts103		;No

#ifndef	_sound_sub
		movf	ts_high,W
		iorwf	ts_low,W
		btfss	STATUS,Z	;音長カウンタ high = low = 0 か？
		goto	ts103		;No
#endif
		movlw	h'59'
		subwf	bcd_mm,W	;分 BCD カウンタ
		btfss	STATUS,Z	;bcd_mm = h'59' か？
		goto	ts101		;No

		movlw	h'57'
		subwf	bcd_ss,W	;秒 BCD カウンタ
		btfss	STATUS,C	;bcd_ss >= h'57' か？
		goto	ts101		;No

		; "プッ"		;予報音 (440Hz)
#ifndef	_sound_sub
		movlw	pu_h
		movwf	const_high	;音階用分周定数 high を設定
		movlw	pu_l
		movwf	const_low	;音階用分周定数 low を設定
		movlw	pu_ch
		movwf	ts_high		;音長カウンタ high を設定
		movlw	pu_cl
		movwf	ts_low		;音長カウンタ low を設定
		goto	ts102
#else
;		Sound_Play_M	f_rah, d'100'	; "プッ"
		bsf	sigflg,0	;予報音フラグのセット
		goto	ts103
#endif
ts101		movf	bcd_ss,W
		iorwf	bcd_mm,W
		btfss	STATUS,Z	;bcd_ss = bcd_mm = h'00' か？
		goto	ts103		;No

		; "ポッ～～ン"		;正報音 (880Hz)
#ifndef	_sound_sub
		movlw	pn_h
		movwf	const_high	;音階用分周定数 high を設定
		movlw	pn_l
		movwf	const_low	;音階用分周定数 low を設定
		movlw	pn_ch
		movwf	ts_high		;音長カウンタ high を設定
		movlw	pn_cl
		movwf	ts_low		;音長カウンタ low を設定

ts102		bsf	STATUS,RP0	;バンク 1
		bcf	TRISA,speaker	;音出しの直前に出力ポートにする（雑音対策）
		bsf	PIE1,TMR1IE	;タイマー１割り込みを許可
		bcf	STATUS,RP0	;バンク 0
#else
;		Sound_Play_M	f_ra2, d'1000'	; "ポッ～～ン"
		bsf	sigflg,1	;正報音フラグのセット
#endif
ts103		return

;--------------------------------------------------------------------------

;		時報音出力コントロール-2	

time_signal_2
#ifndef	_sound_sub
		movf	ts_high,W
		iorwf	ts_low,W
		btfsc	STATUS,Z	;音長カウンタ high + low <> 0 か？
		goto	ts201		;No. (high = low = 0)

		movf	ts_low,W
		btfsc	STATUS,Z	;音長カウンタ low <> 0 か？
		decf	ts_high,F	;No. 音長カウンタ high = -1 更新

		decfsz	ts_low,F	;音長カウンタ low = -1 更新
		goto	ts201		;(low <> 0)

		movf	ts_high,W
		btfss	STATUS,Z	;音長カウンタ high = 0 か？
		goto	ts201		;No

		bsf	STATUS,RP0	;バンク 1
		bcf	PIE1,TMR1IE	;タイマー１割り込みを禁止
		bsf	TRISA,speaker	;再び入力ポートにしておく（雑音対策）
		bcf	STATUS,RP0	;バンク 0
#endif
ts201		return

;==========================================================================
;	Binary-to-BCD.  Written by John Payson.
;	Enter with 16-bit binary number in NumH:NumL.
;	Exits with BCD equivalent in TenK:Thou:Hund:Tens:Ones.
;==========================================================================

Convert
		swapf	NumH,W
		andlw	h'0f'
		addlw	h'f0'
		movwf	Thou
		addwf	Thou,F
		addlw	h'e2'
		movwf	Hund
		addlw	h'32'
		movwf	Ones

		movf	NumH,W
		andlw	h'0f'
		addwf	Hund,F
		addwf	Hund,F
		addwf	Ones,F
		addlw	h'e9'
		movwf	Tens
		addwf	Tens,F
		addwf	Tens,F

		swapf	NumL,W
		andlw	h'0f'
		addwf	Tens,F
		addwf	Ones,F

		rlf	Tens,F
		rlf	Ones,F
		comf	Ones,F
		rlf	Ones,F

		movf	NumL,W
		andlw	h'0f'
		addwf	Ones,F
		rlf	Thou,F

		movlw	h'07'
		movwf	TenK

		movlw	h'0a'

Lb1		addwf	Ones,F
		decf	Tens,F
		btfss	STATUS,C
		goto	Lb1

Lb2		addwf	Tens,F
		decf	Hund,F
		btfss	STATUS,C
		goto	Lb2

Lb3		addwf	Hund,F
		decf	Thou,F
		btfss	STATUS,C
		goto	Lb3

Lb4		addwf	Thou,F
		decf	TenK,F
		btfss	STATUS,C
		goto	Lb4
		return		

;==========================================================================
;		文字フォントデータテーブル
; 
; http://www5b.biglobe.ne.jp/~YASUSI/gallery/electronics/060605/060605.htm
; の matrix_font.gif から一部を無断拝借使用
;==========================================================================

font_data_tbl
		retlw	h'81'		;0
		retlw	h'00'
		retlw	h'7e'	;h'7a'
		retlw	h'7e'	;h'66'
		retlw	h'7e'	;h'5e'
		retlw	h'00'
		retlw	h'81'
		retlw	h'ff'

		retlw	h'ff'		;1
		retlw	h'ff'
		retlw	h'be'
		retlw	h'00'
		retlw	h'00'
		retlw	h'fe'
		retlw	h'ff'
		retlw	h'ff'

		retlw	h'9e'		;2
		retlw	h'1c'
		retlw	h'78'
		retlw	h'72'
		retlw	h'66'
		retlw	h'0e'
		retlw	h'9e'
		retlw	h'ff'

		retlw	h'b9'		;3
		retlw	h'38'
		retlw	h'6e'
		retlw	h'6e'
		retlw	h'46'
		retlw	h'10'
		retlw	h'b9'
		retlw	h'ff'

		retlw	h'e3'		;4
		retlw	h'c3'
		retlw	h'bb'
		retlw	h'00'
		retlw	h'00'
		retlw	h'fb'
		retlw	h'fb'
		retlw	h'ff'

		retlw	h'0d'		;5
		retlw	h'0c'
		retlw	h'6e'
		retlw	h'6e'
		retlw	h'6e'
		retlw	h'60'
		retlw	h'f1'
		retlw	h'ff'

		retlw	h'81'		;6
		retlw	h'00'
		retlw	h'6e'
		retlw	h'6e'
		retlw	h'6e'
		retlw	h'20'
		retlw	h'b1'
		retlw	h'ff'

		retlw	h'3f'		;7
		retlw	h'3f'
		retlw	h'78'
		retlw	h'70'
		retlw	h'67'
		retlw	h'0f'
		retlw	h'1f'
		retlw	h'ff'

		retlw	h'91'		;8
		retlw	h'10'
		retlw	h'6e'
		retlw	h'6e'
		retlw	h'6e'
		retlw	h'10'
		retlw	h'91'
		retlw	h'ff'

		retlw	h'8d'		;9
		retlw	h'04'
		retlw	h'76'
		retlw	h'76'
		retlw	h'76'
		retlw	h'00'
		retlw	h'81'
		retlw	h'ff'

		retlw	h'3f'		;℃
		retlw	h'3f'
		retlw	h'c1'
		retlw	h'80'
		retlw	h'be'
		retlw	h'be'
		retlw	h'be'
		retlw	h'dd'

		retlw	h'07'		;V
		retlw	h'03'
		retlw	h'f9'
		retlw	h'fc'
		retlw	h'f9'
		retlw	h'03'
		retlw	h'07'
		retlw	h'ff'

		retlw	h'f1'		;er
		retlw	h'ea'
		retlw	h'ea'
		retlw	h'f3'
		retlw	h'ff'
		retlw	h'e0'
		retlw	h'f7'
		retlw	h'ef'

;==========================================================================
;		EEPROM エリア
;==========================================================================

		org	h'2100'

eep_st		de	"Copyright (C) 2007-2019 by M.Yamamoto"

		de	h'ff'

eep_size	equ	$ - eep_st	;EEPROM データサイズ

e_bcd_yy	de	h'14'		;年 BCD カウンタ
e_bcd_nn	de	h'09'		;月 BCD カウンタ
e_bcd_dd	de	h'01'		;日 BCD カウンタ
e_bcd_hh	de	h'00'		;時 BCD カウンタ
e_bcd_mm	de	h'00'		;分 BCD カウンタ

;==========================================================================

		end			;プログラムの終了
