;***** MatrixLED_Controller.asm *******************************************
;
;	ドットマトリクス LED コントローラー
;
;	Copyright (C) 2022   by M.Yamamoto. All rights reserved.
;
;	Homepage URL: http://xyama.sakura.ne.jp/hp/MatrixLED_Controller.html
;
;     ( coding:  Ver. 0.00   2022/02/06  by M.Yamamoto )
;	coding:  Ver. 1.00   2022/03/21  初期バージョン
;	update:  Ver. 1.01   2022/03/29  さくらさくら／赤とんぼ処理を追加
;	update:  Ver. 1.02   2022/04/12  <機能概要と使用法>を追加、その他
;	update:  Ver. 1.03   2022/04/24  プログラム各部の微修正
;	bugfix:  Ver. x.xx   
;
;******************************************************* PicAsm 0263 ******

;	Device: PIC16F1709	Clock: 8MHz (Internal OSC)

#ifdef comment

 <機能概要と使用法>

・本機では、最大 12 種類までのプログラム（機能）を実行することができるように構成されている。メインルーチン
　ではその 12 種類のプログラムを選択し、振り分ける処理を行う。

・そして、12 種に割り付けた現在のプログラム（機能）状況を次表に示す。なお、表の右半分は SW5 ～ SW1 までの
　各スイッチに、プログラムの機能別に与えた名称で、同位置のスイッチでも、実行をするプログラムの機能によって、
　名称が変更するので、次表のように読み替えが必要となる。

	;--------------------------------------------------------------------------
	;		各処理別のスイッチ名の読み替え
	;--------------------------------------------------------------------------

	;    rtsw_sel　　　　処理　　　　　　　　　　 SW5    SW4    SW3    SW2     SW1

	;       -    メイン、処理の振り分け　　　　　  -      -      -      -      SET
	;       1    時分秒の表示　　　　　　　　　　SIGNAL  ZERO    -    TMODE    EXIT
	;       2    年月日（曜日）の表示　　　　　　SIGNAL   -      -      -      EXIT
	;       3    温度,湿度の表示 　　　　　　　　SIGNAL   -      -      -      EXIT
	;       4    オートモードの表示　　　　　　　SIGNAL (ZERO)   -   (TMODE)   EXIT
	;       5    標準文字フォントのデモ表示　　　  -     LEFT   DOWN    UP  EXIT/RIGHT
	;       6    プロポ文字フォントのデモ表示　　  -     LEFT   DOWN    UP  EXIT/RIGHT
	;       7    かな文字フォントのデモ表示　　　  -     LEFT   DOWN    UP  EXIT/RIGHT
	;       8    さくらさくら／赤とんぼ　　　　　SIGNAL CHANGE  DOWN    UP     EXIT
	;       9    　　　　　　　　　　　　　　　　  -      -      -      -      EXIT
	;      10    　　　　　　　　　　　　　　　　  -      -      -      -      EXIT
	;      11    LED の輝度調節　　　　　　　　　  -      -     DOWN    UP     EXIT
	;      12    年月日,時分秒の設定 　　　　　　  -     BACK   DOWN    UP   SET/EXIT

◎ メイン、プログラム処理の振り分け

・メインルーチンでは、12 種類のプログラム（機能）から１つを選択し、それら個々のプログラムに振り分ける処理
　（ジャンプ）を行う。ロータリスイッチ で実行したい プログラムを選択した後、SET スイッチ を押すことによって
　選択したプログラムにジャンプ を行う。

・メインルーチンを実行中は、ユーザに実行させたいプログラムを選択するように促すために、スイッチ選択メッセージ
　が表示され、なおかつ、同メッセージの右端に位置する "99" の部分に、現在選択されているスイッチ選択番号がブリ
　ンク表示される。

		スイッチ選択メッセージ：     [ Select.SW ?_ 99 ]

・このブリンク表示はユーザの注意を引くためのもので、当メインルーチンのプログラムでは、タイマー０割り込みを使
　用してブリンクのタイミングを取っている。

・ロータリスイッチのスイッチ選択番号をどのように取得しているかは、まず、回路図の左上を参照のこと。ロータリス
　イッチの 12 の各接点にダイオードマトリクスが組み込まれていることに、既に気付かれていると思うが、この情報を
　PIC のポート C（RC4 ～ RC7）で監視し、1 ～ 12 までのバイナリ信号として取り込んでいる。

・そして、この後 SET スイッチが押されると、ロータリスイッチのスイッチ選択番号を元にして、ジャンプアドレステ
　ーブルが検索され、該当のプログラムアドレスを取得することによって、スイッチ選択番号に設定されたプログラムに
　ジャンプをする。

◎ 1. 時分秒の時計表示

・メインルーチンから当プログラムにジャンプをしてくると、"画面レイアウト図" 中の "時分秒表示" を表示テンプレ
　ートとして、現在の "時" "分" "秒" が刻々と変化をしながら表示される。デフォルトの表示は 24 時間表示で、12 
　時間表示のときに表示がされる AM / PM の位置は空白となる。

		時分秒表示：     [ AM 11:59:59 ]

・この 24 時間表示と 12 時間表示は、UP / TMODE（TIME MODE）スイッチを押すことによって、時分秒表示（オートモ
　ードを含む）のときにはいつでも切り替えることができ、押すごとに両者を切り替える、トグルスイッチになっている。

・次に、24 時間表示と 12 時間表示の対応を示すが、12 時間表示の場合だけ "時" の１桁目（左側）は、ゼロサプレス
　を行なって表示をする。

		(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

・また、毎正時プラス・マイナス５分以内のときに、ZERO スイッチを押すと、現在時刻の "分" と "秒" を "00 分 00 
　秒" に設定し直して、リアルタイムクロックモジュール RTC に書き込まれ、表示もその "00 分 00 秒" から再開始を
　する。ただし、毎正時プラス・マイナス５分以外のときには、ZERO スイッチを押しても無視をされる。

・この時計プログラムには、毎時の時報音を鳴らす機能も搭載されているが、SIGNAL スイッチによって、時報音のブザ
　ー音出力を、押すごとに有効／無効にトグル設定をする。このときの設定状態は視覚的な表示がないため、有効になっ
　たときには "ピピピッ" 音を、無効になったときには "ブー" 音を、それぞれ鳴らして知らせる。

・なお、誤操作を避けるために EXIT スイッチを 3 秒以上長押し をすると、再びメインルーチンに戻ることができる。
　（ちなみに、誤操作とは自分の意思に反して、誤ってスイッチを押してしまったような場合）

◎ 2. 年月日（曜日）の表示

・メインルーチンから当プログラムにジャンプをしてくると、"画面レイアウト図" 中の "年月日表示" を表示テンプレ
　ートとして、現在の "年" "月" "日" と "曜日" が表示されるが、毎深夜の零時に１度だけの更新で画面に動きがない
　ため、当プログラムでは "曜日" をブリンク表示（ 1 秒間 "点"、1 秒間 "滅" ）させて、画面に動きを持たせている。
　（ちなみに、画面レイアウト図中の "年月日" は、図の作成日）

		年月日表示：     [ 22.02.06 SUN ]

・当プログラムが実行中にも時計機能は動作をしていて、毎時になると時報音を鳴らすため、SIGNAL スイッチによって、
　時報音のブザー音出力を、押すごとに有効／無効にトグル設定をすることができる。このときの設定状態は視覚的な表
　示がないため、有効になったときには "ピピピッ" 音を、無効になったときには "ブー" 音を、それぞれ鳴らして知ら
　せる。

・なお、誤操作を避けるために EXIT スイッチを 3 秒以上長押し をすると、再びメインルーチンに戻ることができる。
　（ちなみに、誤操作とは自分の意思に反して、誤ってスイッチを押してしまったような場合）

◎ 3. 温度、湿度の表示

・メインルーチンから当プログラムにジャンプをしてくると、"画面レイアウト図" 中の "温度湿度表示" を表示テンプ
　レートとして、現在の "温度" と "湿度" が表示される。

		温度湿度表示：     [ xx.x℃ xx.x％ ]

・本機では、デジタル温度湿度センサーモジュール（ DHT11 ）と PIC との間を、たった１本だけのデータ線によるシリ
　アル通信によって情報を得ているが、通信中にエラーが起こった場合には、次のようなエラーメッセージがマトリクス 
　LED に表示されるとともに、"ブッブー" ブザー音が出力される。

	タイムアウトエラー： [ Error: DHT11 TO ]	チェックサム(CRC)エラー： [ Error: DHT11 PE ]

・左の例では通信中にタイムアウトエラーが起こった場合で、データ線上の "high" または "low" 電圧の続く時間が、
　仕様で決められた時間をオーバーした場合に発生する。また、右の例ではチェックサム(CRC)エラーが起こった場合で、
　DHT11 からは１度の通信で、湿度情報が 16 ビット、温度情報が 16 ビット、チェックサムが 8 ビットの、計 40 ビ
　ットが送られてくるが、それらの情報でパリティチェックを行った結果、エラーが起こった場合に発生する。

・当プログラムが実行中にも時計機能は動作をしていて、毎時になると時報音を鳴らすため、SIGNALスイッチによって、
　時報音のブザー音出力を、押すごとに有効／無効にトグル設定をすることができる。このときの設定状態は視覚的な表
　示がないため、有効になったときには "ピピピッ" 音を、無効になったときには "ブー" 音を、それぞれ鳴らして知ら
　せる。

・なお、誤操作を避けるために EXIT スイッチを 3 秒以上長押し をすると、再びメインルーチンに戻ることができる。
　（ちなみに、誤操作とは自分の意思に反して、誤ってスイッチを押してしまったような場合）

◎ 4. オートモードの表示

・オートモードでは、上３項で説明をした、時分秒、年月日、温度湿度の表示を、毎分ごとの 60 秒を次のように分割を
　して、それぞれを割り当て表示をする。

		 (____: 時間表示、NNNN: 年月日表示、OOOO: 温度,湿度表示)

		00        10        20        30        40        50        00
		.    .    .    .    .    .    .    .    .    .    .    .    .
		__________NNNNNNNNNNNNNNN_______________OOOOOOOOOOOOOOO_____

・メインルーチンから当プログラムにジャンプをしてきたときには、そのときの現在時間（秒）によって、３つの内のど
　の表示をするかが決められる。

・当プログラム（実際には３つの内のどれか）が実行中には、時計機能が動作をしてるので、毎時になると時報音を鳴ら
　すため、SIGNAL スイッチによって、時報音のブザー音出力を、押すごとに有効／無効にトグル設定をすることができ
　る。このときの設定状態は視覚的な表示がないため、有効になったときには "ピピピッ" 音を、無効になったときには
　"ブー" 音を、それぞれ鳴らして知らせる。

・なお、誤操作を避けるために EXIT スイッチを 3 秒以上長押し をすると、再びメインルーチンに戻ることができる。
　（ちなみに、誤操作とは自分の意思に反して、誤ってスイッチを押してしまったような場合）

◎ 5. 標準文字フォントのデモ表示

・この項で紹介するプログラムは、標準文字フォント（ Font5x7s.tbl ）の全 250 文字を使用して、電光掲示板のよう
　に文字が１ドットずつ横方向に流れながら表示をするプログラムで、左右どちらの方向にも自由に変更をすることが可
　能なように、横スクロールを実現させている。

・スタートは左方向への流れ（スクロール）から始まり、右端からフォントテーブル先頭のコード h'06' 文字（↓）が
　顔を出し始め、１ドットずつ左方向に移動しながら続いて２番目のコード h'07' 文字（→）が現れ、以降同様に、文
　字コードが１ずつインクリメントされた文字が現れながら、次々と１ドットずつ左方向に移動しながら表示されて行く。

・やがて、最後のコード h'ff' 文字が現れると、その後はないので１ドットずつの空白が続く。そして、コード h'ff' 
　文字が左端に消え去ったとき、すなわち、すべてが空白で埋まった後は、次には右方向への流れ（スクロール）に変わ
　って、今消え去った最後のコード h'ff' 文字が再び左端から現れ始める。

・そして、１ドットずつ右方向に移動しながら続いて最後から２番目のコード h'fe' 文字（√）が現れ、以降同様に、
　文字コードが１ずつデクリメントされた文字が現れながら、次々と１ドットずつ右方向に移動しながら表示されて行く。

・やがて、先頭のコード h'06' 文字（↓）が現れると、その前はないので１ドットずつの空白が続く。そして、コード 
　h'06' 文字（↓）が右端に消え去ったとき、すなわち、すべてが空白で埋まった後は、次には再び左方向への流れ（ス
　クロール）に変わって、今消え去った先頭のコード h'06' 文字（↓）が再び右端から現れ始める。

・これまでの動作中にユーザが何の指示も出さなければ、以上の動作を延々と繰り返すことになるが、この間にユーザが
　LEFT スイッチ、または EXIT / RIGHT スイッチを押すことによって、ユーザの意思で流れる（スクロール）方向をい
　つでも自由に変更 することができる。

・また、UP スイッチ、または DOWN スイッチを押すと、流れる（スクロール）速度（１ドットずつ移動する時間（mS））
　を変更 することができる。本機では 10mS ～ 1,500mS まで 11 段階で変更ができ、UP スイッチを押すごとに速くな
　り、DOWN スイッチを押すごとに遅くなる。デフォルトは 200mS の設定で、この 11 段階の内、変更をしてもどの段
　階になったのか表示機能がないため、上限値、下限値、デフォルト値のときには "ピッ" ブザー音を鳴らして、 音で
　ユーザに知らせている。

・最後に、この項のプログラムを終わらせる場合は、EXIT / RIGHT スイッチを 3 秒以上 "長押し" する ことによって、
　プログラムを終了させ、再びメインルーチンに戻ることができる。（この場合の "長押し" は、同一スイッチで EXIT
　/ RIGHT の区別をさせるため）

◎ 6. プロポーショナル文字フォントのデモ表示

　使用する文字フォントが プロポーショナル文字フォント（ Font5x7p.tbl ）で、フォントの種類、表示数が異なるだ
　けで、それ以外は "5. 標準文字フォントのデモ表示" と同様なので、同機能を参照のこと。

◎ 7. ひらがな文字フォントのデモ表示

　使用する文字フォントが ひらがな文字フォント（ Font8x8k.tbl ）で、フォントの種類、表示数が異なるだけで、そ
　れ以外は "5. 標準文字フォントのデモ表示" と同様なので、同機能を参照のこと。

◎ 8. さくらさくら／赤とんぼ 電子オルゴール

・メインルーチンから当プログラムにジャンプをしてくると、選曲が、まず "さくらさくら" から始まり、曲の演奏に先
　立って、初めにドットマトリクス LED に、曲名のブリンク表示（ 0.5 秒間 "点"、0.5 秒間 "滅" ）が 5 秒間続く。

・その後、曲データテーブルに書かれている各 "指示ワード" に従って、曲の演奏が始まるが、曲の各小節ごとの各音符
　に合わせて、曲の歌詞が１文字ずつドットマトリクス LED に、次々と表示がされて行く。

・やがて、１曲目の "さくらさくら" の演奏が終了すると、自動的に、２曲目の "赤とんぼ" の選曲がされ、同様に曲名
　のブリンク表示と曲の演奏、および歌詞の表示がされる。そして、２曲目が終了するとまた１曲目に戻り、この繰り返
　しがユーザの指示があるまで延々と続く。

・これらの演奏途中に、CHANGE スイッチを押すことによって、現在の演奏でない方が選曲され、上記と同様に曲名のブ
　リンク表示から始まる。CHANGE スイッチはトグルになっていて、押すごとに交互選曲を行う。

・また、UP スイッチ、または DOWN スイッチを押すと、演奏されている 曲のテンポを変更 することができる。テンポ
　のデフォルトは、曲データテーブルに書かれている 指示ワード のテンポに対して、プラスマイナス 0 であるが、こ
　のプラスマイナスの間を 15 段階で、UP スイッチを押すごとに速くなり、DOWN スイッチを押すごとに遅くなる。

・なお、この 15 段階の内、変更をしても どの段階になったのか表示機能がないため、変更したテンポが上限値、下限
　値、デフォルト値のときには "ピッ" ブザー音を鳴らして、音でユーザに知らせる。（ただし、演奏中なので分かり辛
　いかも）

・演奏途中に一時的に演奏音を止めたいような場合は、SIGNAL スイッチを押すことによって、演奏音を止めることがで
　きるが、曲の進行はそのまま続くので、１文字ずつの歌詞の表示をはじめとして、曲の選曲交代、曲名のブリンク表示
　などはそのまま続けられる。この SIGNAL スイッチもトグルになっていて、押すごとに演奏音を 止める／出す を交互
　に繰り返す。

・なお、EXIT スイッチを押すことによって、再びメインルーチンに戻ることができる。

◎ 9 ～ 10. 未定

◎ 11. LED の輝度調節

・メインルーチンから当プログラムにジャンプをしてくると、"メッセージ類の画面レイアウト図" 中の "LED 輝度調節
　メッセージ" が表示され、なおかつ、同メッセージの右端に位置する "9" の部分に、現在設定されている輝度レベル
　値がブリンク表示 される。

		LED 輝度調節メッセージ：     [ brightness = 9 ]

・このブリンク表示は、ユーザの注意を引くためのもので、メインルーチンの場合と同様に当プログラムでも、タイマー
　０割り込みを使用してブリンクのタイミングを取っている。輝度レベルは、本機で使用したＩＣ MAX7219 では 16 段
　階で変更することが可能であるが、LED の安全性を考慮してプログラムでは、0 から上限を 9 までの 10 段階に制限
　をしてある。

・UP スイッチ、または DOWN スイッチを押すことによって、輝度レベルの設定値を変更することができ、輝度レベル値
　が更新されるとともに、ブリンク表示されている輝度レベル値も更新される。

・なお、輝度レベルを調節した後、EXIT スイッチを押すことによって、再びメインルーチンに戻ることができる。

◎ 12. 年月日、時分秒の設定

・メインルーチンから当プログラムにジャンプをしてくると、まず初めに、"画面レイアウト図" 中の "年月日表示" を
　表示テンプレートとして、現在の "年" "月" "日" と "曜日" が表示され、なおかつ、左端に位置する "年" ２桁が
　ブリンク表示され、設定変更の対象項目であることを示している。

		年月日表示：     [ 22.01.01 SAT ]　　..... ~~ の位置 "年" がブリンク表示
		　　　　　　       ~~
・ここで変更が必要であれば、UP スイッチを押すごとに現在値より１ずつ増加し、また DOWN スイッチを押すごとに１
　ずつ減少するので、適宜希望する値に変更をする。また、このときの増減幅を大きくしたい場合には、 UP スイッチ、
　または DOWN スイッチを押したままにしていると、１秒当たり 4 ～ 5 の増減幅で更新をするようになる。

・"年" の設定変更が済んだら、SET スイッチを押すと、次には "月" ２桁がブリンク表示され、設定変更の対象項目が
　次に移動したことを示す。同様に変更が必要であれば、UP スイッチ、または DOWN スイッチを押すことによって、適
　宜希望する値に変更をする。

		年月日表示：     [ 22.04.01 FRI ]　　..... ~~ の位置 "月" がブリンク表示
		　　　　　　          ~~
・同様に、SET スイッチを押すと、次には "日" ２桁がブリンク表示されるので、以降同様にスイッチ操作をして行く。

		年月日表示：     [ 22.04.18 MON ]　　..... ~~ の位置 "日" がブリンク表示
		　　　　　　             ~~
・これまでのスイッチ操作で、"年" "月" "日" のどれかの値を変更すると、それらの設定値に基づいてプログラムが 
　"曜日" を自動的に変更するが、この "曜日" をユーザが変更することはできない。

・この "日" の設定変更が済んだ後に SET スイッチを押すと、次には "画面レイアウト図" 中の "時分秒表示" を表示
　テンプレートとして、現在設定されている "時" "分" "秒" に表示が変更され、なおかつ、"時" ２桁がブリンク表示
　される。

		時分秒表示：     [ AM 12:00:00 ]　　..... ~~ の位置 "時" がブリンク表示
		　　　　　　          ~~
・以降同様にして "分" "秒" と対象項目の変更をして行くが、これまでに、誤って希望の対象項目を通り過ぎてしまっ
　たときには、BACK スイッチを押すごとに１ずつ前の項目に戻ることができる。

・この対象項目と SET スイッチ、BACK スイッチの関係をまとめると、次のようになる。
		　　　　　　　　　　　 BACK  　BACK  　BACK  　BACK  　BACK
		　　　　　　　　　　　 ←─ 　 ←─ 　 ←─ 　 ←─ 　 ←─
		　　　　　　　 　　 　 SET  　 SET  　 SET  　 SET  　 SET  　 SET
		メインルーチン ─→ 年 ─→ 月 ─→ 日 ─→ 時 ─→ 分 ─→ 秒 ─→ メインルーチン
		　　　　　　　 　　 │　　　　　　　　　　　　　　　　　　　↑
		　　　　　　　　BACK└───────────────────┘

・なお、この時分秒表示で 12 時間表示の設定がされているとき には、"時" の左側の位置に AM または PM の文字が
　表示されるが、24 時間表示に設定のとき には、同位置は空白表示となる。そしてこの 12 時間表示 ／ 24 時間表示
　の設定変更は、"1. 時分秒の時計表示" プログラムの実行時のみ可能で、当プログラムで変更することはできない。
　（デフォルトは 24 時間表示）

・最後の対象項目 "秒" がブリンク表示されているときに、SET / EXIT スイッチを押すと、今まで設定をしてきた "年" 
　～ "秒" までの、すべての項目が "リアルタイムクロックモジュール RTC" に書き込み更新され、 新たな設定値で 
　RTC の時刻のカウントが始まると同時に、プログラムは再びメインルーチンに戻る 。

・
・
・

#endif

;==========================================================================

;	PIC16F1709 のピンと用途

;	  (1) VDD: 電源 +5V DC				(20) VSS: 電源 GND
;	  (2) RA5: SW4(LEFT/ZERO/BACK) スイッチ入力	(19) RA0: SW1(RIGHT/SET/EXIT) スイッチ入力
;	  (3) RA4: SW3(DOWN/TMODE) スイッチ入力		(18) RA1: SW2(UP) スイッチ入力
;	  (4) RA3: 予備入力 / Vpp			(17) RA2: INT外部割り込み入力
;	  (5) RC5: SELECT_2 BCD スイッチ入力		(16) RC0: MAX7219 DIN 出力
;	  (6) RC4: SELECT_1 BCD スイッチ入力		(15) RC1: MAX7219 LOAD 出力
;	  (7) RC3: SW5(SIGNAL) スイッチ入力		(14) RC2: MAX7219 CLK 出力
;	  (8) RC6: SELECT_4 BCD スイッチ入力		(13) RB4: I2C SDA 入出力
;	  (9) RC7: SELECT_8 BCD スイッチ入力		(12) RB5: DHT11 DATA 入出力
;	 (10) RB7: Bz 出力				(11) RB6: I2C SCL 出力

;	*注.  RA3 は入力専用で、出力ポートには使えない。

;==========================================================================

		list		p=pic16f1709		;デバイス情報
		include		p16f1709.inc		;インクルードファイル
		errorlevel	-302			;Eliminate bank warning

;==========================================================================
;		コンフィギュレーションワードの設定
;==========================================================================

	__config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
	__config _CONFIG2, _WRT_OFF & _PPS1WAY_OFF & _ZCDDIS_ON & _PLLEN_OFF & _STVREN_OFF & _BORV_HI & _LPBOR_ON & _LVP_ON

; ------------------------------------
; CONFIGURATION WORD 1 (ADDRESS:8007H)		Data Sheet DS40001729C - page 48
; ------------------------------------
;
;     CONFIG1 = 00 1001 1000 0100
;	        || |||| |||| ||||
;	bit2-0  || |||| |||| |+++---- FOSC<2:0>: オシレータ選択ビット
;	        || |||| |||| |          111 = ECH:    外部クロック、高消費電力モード(4-20 MHz):  OSC1/CLKINピンに供給
;	        || |||| |||| |          110 = ECM:    外部クロック、中消費電力モード(0.5-4 MHz): OSC1/CLKINピンに供給
;	        || |||| |||| |          101 = ECL:    外部クロック、低消費電力モード(0-0.5 MHz): OSC1/CLKINピンに供給
;	        || |||| |||| |      >   100 = INTOSC: 内部HFINTOSC CLKINピンはI/Oとして機能
;	        || |||| |||| |          011 = EXTRC:  CLKINピンに外部RC回路を接続
;	        || |||| |||| |          010 = HSOSC:  OSC1とOSC2ピンの間に高速水晶/セラミック振動子を接続
;	        || |||| |||| |          001 = XTOSC:  OSC1とOSC2ピンの間に水晶/セラミック振動子を接続
;	        || |||| |||| |          000 = LPOSC:  OSC1とOSC2ピンの間に低消費電力水晶振動子を接続
;	        || |||| |||| |
;	bit4-3  || |||| |||+ +------- WDTE<1:0>: ウォッチドッグ タイマ イネーブルビット
;	        || |||| |||             11 = ON:     WDTを有効
;	        || |||| |||             10 = NSLEEP: WDTを動作時は有効、スリープ中は無効
;	        || |||| |||             01 = SWDTEN: WDTをWDTCONレジスタのSWDTENビットで制御
;	        || |||| |||         >   00 = OFF:    WDTを無効
;	        || |||| |||           _____
;	bit5    || |||| ||+---------- PWRTE: パワーアップ タイマ イネーブルビット
;	        || |||| ||              1 = OFF: PWRTを無効
;	        || |||| ||          >   0 = ON:  PWRTを有効
;	        || |||| ||
;	bit6    || |||| |+----------- MCLRE: MCLR/VPPピン機能選択ビット
;	        || |||| |              LVPビット=0 の場合
;	        || |||| |               1 = ON:  MCLR/VPPピンの機能はMCLR、弱プルアップを有効
;	        || |||| |           >   0 = OFF: MCLR/VPPピンはデジタル入力、MCLRは無効、弱プルアップはWPUA3ビットで制御
;	        || |||| |             __
;	bit7    || |||| +------------ CP: コード保護ビット
;	        || ||||             >   1 = OFF: プログラムメモリのコード保護を無効
;	        || ||||                 0 = ON:  プログラムメモリのコード保護を有効
;	        || ||||
;	bit8    || |||+-------------- 未実装
;	        || |||
;	bit10-9 || |++--------------- BOREN<1:0>: ブラウンアウト リセット イネーブルビット
;	        || |                    11 = ON:     BORを有効
;	        || |                    10 = NSLEEP: BORを動作時は有効、スリープ中は無効
;	        || |                    01 = SBODEN: BORをBORCONレジスタのSBORENビットで制御
;	        || |                >   00 = OFF:    BORを無効
;	        || |                  ________
;	bit11   || +----------------- CLKOUTEN: クロック出力イネーブルビット
;	        ||                     FOSCビットがLP、XT、HSモードの場合
;	        ||                      このビットを無視しCLKOUT機能を無効、CLKOUTピンはI/Oとして機能
;	        ||                     FOSCビットがその他のモードの場合
;	        ||                  >   1 = OFF: CLKOUT機能を無効、CLKOUTピンはI/Oとして機能
;	        ||                      0 = ON:  CLKOUTピンのCLKOUT機能を有効
;	        ||
;	bit12   |+------------------- IESO: 内部/外部切り換えビット
;	        |                       1 = ON:  内部/外部切り換えモードを有効
;	        |                   >   0 = OFF: 内部/外部切り換えモードを無効
;	        |
;	bit13   +-------------------- FCMEN: フェイルセーフ クロックモニタ イネーブルビット
;	                                1 = ON:  フェイルセーフ クロックモニタと内部/外部切り換えの両方を有効
;	                            >   0 = OFF: フェイルセーフ クロックモニタを無効
;
; ------------------------------------
; CONFIGURATION WORD 2 (ADDRESS:8008H)		Data Sheet DS40001729C - page 50
; ------------------------------------
;
;     CONFIG2 = 11 0000 1111 1011
;	        || |||| |||| ||||
;	bit1-0  || |||| |||| ||++---- WRT<1:0>: フラッシュメモリ自己書き込み保護ビット
;	        || |||| |||| ||     >   11 = OFF:  書き込み保護を無効
;	        || |||| |||| ||         10 = BOOT: 0000h～01FFhを書き込み保護、0200h～1FFFhをPMCON制御で変更可能
;	        || |||| |||| ||         01 = HALF: 0000h～0FFFhを書き込み保護、1000h～1FFFhをPMCON制御で変更可能
;	        || |||| |||| ||         00 = ALL:  0000h～1FFFhを書き込み保護、PMCON制御によるアドレス変更を不可
;	        || |||| |||| ||
;	bit2    || |||| |||| |+------ PPS1WAY: PPSLOCKビット単方向セット イネーブルビット
;	        || |||| |||| |          1 = ON:  PPSLOCKビットは、ロック解除シーケンスを実行後に一度のみセット可、
;	        || |||| |||| |                   一度PPSLOCKがセットされると、その後PPSレジスタは変更不可
;	        || |||| |||| |      >   0 = OFF: ロック解除シーケンスを実行すれば何度でもPPSLOCKビットをセット/クリア可
;	        || |||| |||| |
;	bit6-3  || |||| |+++ +------- 未実装
;	        || |||| |
;	bit7    || |||| +------------ ZCDDIS: ZCDディセーブルビット
;	        || ||||             >   1 = ON:  ZCDを無効、有効にするにはZCDCONのZCDSENビットをセット
;	        || ||||                 0 = OFF: ZCDを常に有効
;	        || ||||
;	bit8    || |||+-------------- PLLEN: PLLイネーブルビット
;	        || |||                  1 = ON:  4xPLLを有効
;	        || |||              >   0 = OFF: 4xPLLを無効
;	        || |||
;	bit9    || ||+--------------- STVREN: スタック オーバーフロー/アンダーフロー リセット イネーブルビット
;	        || ||                   1 = ON:  スタックのオーバーフロー/アンダーフローによってリセットを発生させる
;	        || ||               >   0 = OFF: スタックのオーバーフロー/アンダーフローによってリセットを発生させない
;	        || ||
;	bit10   || |+---------------- BORV: ブラウンアウト リセット電圧選択ビット
;	        || |                    1 = LO: ブラウンアウト リセット電圧(VBOR)のトリップポイントを低に設定
;	        || |                >   0 = HI: ブラウンアウト リセット電圧(VBOR)のトリップポイントを高に設定                   
;	        || |                  _____
;	bit11   || +----------------- LPBOR: 低消費電力BORイネーブルビット
;	        ||                      1 = OFF: 低消費電力ブラウンアウト リセットを無効
;	        ||                  >   0 = ON:  低消費電力ブラウンアウト リセットを有効
;	        ||                    _____
;	bit12   |+------------------- DEBUG: インサーキット デバッガモード ビット
;	        |                   >   1 = OFF: インサーキット デバッガを無効、ICSPCLKとICSPDATは汎用I/Oピンとして機能
;	        |                       0 = ON:  インサーキット デバッガを有効、ICSPCLKとICSPDATはデバッガ専用
;	        |
;	bit13   +-------------------- LVP: 低電圧プログラミング イネーブルビット
;	                                1 = ON:  低電圧プログラミングを有効
;	                            >   0 = OFF: プログラミング時にMCLRに高電圧の印加が必要

;==========================================================================
;		定数の定義と変数のレジスタ割付け
;==========================================================================

#define 	ver_no		"1.03"

#define 	m_fsr0h		b16_hi			;FSR レジスタペア (FSRnH, FSRnL) の退避
#define 	m_fsr0l		b16_lo			;
#define 	m_fsrnh		a16_hi			;
#define 	m_fsrnl		a16_lo			;
#define 	m_fsryh		buff1			;
#define 	m_fsryl		buff2			;
#define 	m_fsrxh		buff3			;
#define 	m_fsrxl		buff4			;

#define 	lcnt1		lpcnt			;16 ÷ 16 ＝ 16 ビットの割り算 (div_16)
#define 	lcnt2		buff			;
#define 	x16_hi		buff1			;
#define 	x16_lo		buff2			;
#define 	y16_hi		buff3			;
#define 	y16_lo		buff4			;

#define 	rep_addr_high	lpcnt			;繰り返し曲データの high アドレス
#define 	rep_addr_low	buff			;繰り返し曲データの low アドレス
#define 	scale		buff1			;音階コードの保存
#define 	length		buff2			;音長の保存
#define 	tempo		buff3			;テンポ指定
#define 	repeat		buff4			;繰り返し指定

#define 	linear_buff	(h'2000' + 80 * 2)	;バッファ先頭アドレス

		radix	dec

tm0_h_val	equ	256 - 250	;ハードタイマー０カウント値（割り込み周期）(4/8Mz*16*250=2msec)
tm0_s_val	equ	100		;ソフトタイマー０カウント値                (2msec*100=200msec)

_swSET		equ	0	;SW1	;SET   スイッチ		;┐
_swEXT		equ	0	;SW1	;EXIT  スイッチ		;│
_swRIG		equ	0	;SW1	;RIGHT スイッチ		;│
_swUP		equ	1	;SW2	;UP    スイッチ		;│
_swMOD		equ	1	;SW2	;TMODE スイッチ		;│PORTA
_swDWN		equ	4	;SW3	;DOWN  スイッチ		;│
_swZER		equ	5	;SW4	;ZERO  スイッチ		;│
_swBAK		equ	5	;SW4	;BACK  スイッチ		;│
_swLEF		equ	5	;SW4	;LEFT  スイッチ		;┘

DHT		equ	5		;DHT11 DATAポート	;┐
SCL		equ	6		;I2C SCL		;│PORTB
SDA		equ	4		;I2C SDA		;│
_BZ		equ	7		;アラーム音 出力	;┘

maxDIN		equ	0		;MAX7219 DIN 制御	;┐
maxLOAD		equ	1		;MAX7219 LOAD 制御	;│PORTC
maxCLK		equ	2		;MAX7219 CLK 制御	;│
_swSIG		equ	3	;SW5	;SIGNAL スイッチ	;┘

f_rah		equ	65536 - 1136	;ラ (880.00 Hz)  at 8MHz
f_doh		equ	65536 - 1911	;ド (523.26 Hz)
f_ra		equ	65536 - 2273	;ラ (440.00 Hz)
f_so		equ	65536 - 2551	;ソ (392.00 Hz)
f_mi		equ	65536 - 3034	;ミ (329.63 Hz)
f_do		equ	65536 - 3822	;ド (261.63 Hz)
f_do_		equ	65536 - 7644	;ド (130.82 Hz)
po_tim		equ	100		;音長(ms)
pi_tim		equ	100		;音長
bu_tim		equ	100		;音長
buu_tim		equ	250		;音長

Do		equ	28		;ド
Do_		equ	29		;ド＃
Re		equ	30		;レ
Re_		equ	31		;レ＃
Mi		equ	32		;ミ
Fa		equ	33		;ファ
Fa_		equ	34		;ファ＃
So		equ	35		;ソ
So_		equ	36		;ソ＃
Ra		equ	37		;ラ
Ra_		equ	38		;ラ＃
Si		equ	39		;シ

Half		equ	1		;半音
Oct1		equ	12		;1 オクターブ
Oct2		equ	24		;2 オクターブ
Oct3		equ	36		;3 オクターブ
Oct4		equ	48		;4 オクターブ
Oct5		equ	60		;5 オクターブ

Nn		equ	h'80'		;休止符
Xx		equ	h'c0'		;テンポ
Rep		equ	h'c1'		;繰り返し
Ex1		equ	h'e0'		;拡張1
Ex2		equ	h'e1'		;拡張2
Ex3		equ	h'e2'		;拡張3

L1		equ	64		;1/1   64 x 1 x tempo = 64 mS x tempo
L2		equ	32		;1/2   32 x 1 x tempo = 32 mS x tempo
L4		equ	16		;1/4   16 x 1 x tempo = 16 mS x tempo
L8		equ	8		;1/8	8 x 1 x tempo =  8 mS x tempo
L16		equ	4		;1/16	4 x 1 x tempo =  4 mS x tempo
L32		equ	2		;1/32	2 x 1 x tempo =  2 mS x tempo
Lx		equ	1		;	1 x 1 x tempo =  1 mS x tempo

		cblock  h'20'		; (( バンク 0 ))
tm0_s_cnt				;ソフトタイマー０カウンタ
bcd_yh					;年(上位2桁) BCD カウンタ
bcd_yl			;bcd_yy		;年(下位2桁) BCD カウンタ
;bcd_yy					;年 BCD カウンタ
bcd_nn					;月 BCD カウンタ
bcd_dd					;日 BCD カウンタ
bcd_hh					;時 BCD カウンタ
bcd_mm					;分 BCD カウンタ
bcd_ss					;秒 BCD カウンタ
bcd_ww					;曜日 BCD カウンタ
temp_hh					;仮の時 BCD カウンタ
temp_mm					;仮の分 BCD カウンタ
temp_ss					;仮の秒 BCD カウンタ
uru_flg					;0:平年 / 1:閏年
cur_yh					;年(上位2桁)(変) BCD カウンタ
cur_yl					;年(下位2桁)(変) BCD カウンタ
cur_nn					;月(変) BCD カウンタ
cur_week				;週位置カウンタ（曜日 1～7）
xxx_yh					;ワーク

int_flg					;外部(INT)割り込みフラグ
					; bit7:   RTC DS1307 からデータ読み出し無効フラグ
					; bit3:   DHT11 からデータ読み出し要求フラグ
					; bit2-1: 4 秒カウンタ
					; bit0:   RTC DS1307 からデータ読み出し要求フラグ
time_flg				;時間表示フラグ
					; bit1: 0:24H/1:12H
					; bit0: 0:am/1:pm
disp_flg				;LED 表示フラグ
					; bit7: 年表示フラグ
					; bit6: 月表示フラグ
					; bit5: 日表示フラグ
					; bit4: 時表示フラグ
					; bit3: 分表示フラグ
					; bit2: 秒表示フラグ
					; bit1: 温度表示フラグ
					; bit0: 湿度表示フラグ
rtsw_sel				;ロータリスイッチ選択フラグ
					; bit7:   初期メッセージ表示指示フラグ
					; bit6:   ブリンク反転フラグ (タイマー０割り込みで設定)
					; bit5:   ブリンク変更フラグ (　　　　　〃　　　　　　)
					; bit4:   設定値 10 以上フラグ (設定値の表示時のみ使用)
					; bit3-0: ロータリスイッチ設定値 (1 ～ 12)
intensity				;輝度調節フラグ
					; bit7:   初期メッセージ表示指示フラグ
					; bit6:   ブリンク反転フラグ (タイマー０割り込みで設定)
					; bit5:   ブリンク変更フラグ (　　　　　〃　　　　　　)
					; bit4:   輝度更新フラグ
					; bit3-0: 輝度調節値 (0 ～ 9)
mode_flg				;年月日,時分秒の設定モードフラグ
					; bit7: 設定モードフラグ
					; bit6: ブリンク反転フラグ (タイマー０割り込みで設定)
					; bit5: ブリンク変更フラグ (　　　　　〃　　　　　　)
					; bit0: メイン処理フラグ
targ_flg				;対象位置ポインタフラグ
					; bit7:   対象位置の変更フラグ
					; bit6:   年月日に変更指示フラグ
					; bit5:   時分秒に変更指示フラグ
					; bit4:   対象位置のデータ変更フラグ
					; bit3:   RTC 更新指示フラグ
					; bit2-0: 位置ポインタ (0 ～ 6)
alm_flg					;アラーム音出力フラグ
					; bit7: 出力許可1フラグ
					; bit6: 出力許可2フラグ
					; bit5: 出力許可3フラグ (さくらさくら／赤とんぼで使用)
					; bit3: 時報正報音フラグ
					; bit2: 時報予報音フラグ
exit_flg				;エグジットフラグ
					; bit7: 処理打ち切りフラグ
					; bit6: 強制曲更新フラグ
					; bit0: １文字打ち切りフラグ
swit_flg				;スイッチフラグ
					; bit7: SIGNALスイッチフラグ
					; bit5: LEFT  スイッチフラグ
					; bit4: DOWN  スイッチフラグ
					; bit1: UP    スイッチフラグ
					; bit0: RIGHT スイッチフラグ
scroll_flg				;スクロールフラグ
					; bit7:   左右方向フラグ 0:左方向/1:右方向
					; bit6:   スイッチ操作無効フラグ
					; bit5-4: データフラグ 00:1/3 / 01:2/3 / 10:3/3データ
					; bit3-0: スクロール速度 (1 ～ 10)
vhcv_flg				;縦横ビット変換フラグ
					; bit7:   0:縦→横/1:横→縦
					; bit4:   曲選択フラグ 0:さくらさくら/1:赤とんぼ
					; bit3-0: 曲速度の変更値 (1 ～ 15)

lp_cnt1					;汎用ループカウンタ
lp_cnt2					;汎用ループカウンタ
lp_cnt3					;汎用ループカウンタ
lp_cnt4					;汎用ループカウンタ
lp_cnt5					;汎用ループカウンタ
a16_hi	       ;m_fsrnh			;16ビット演算引き数Ａ(上位) ／ 結果(上位)
a16_lo	       ;m_fsrnl			;16ビット演算引き数Ａ(下位) ／ 結果(上位)
b16_hi	       ;m_fsr0h			;16ビット演算引き数Ｂ(上位)
b16_lo	       ;m_fsr0l			;16ビット演算引き数Ｂ(下位)
lpcnt	       ;lcnt1,  rep_addr_high	;ループカウンタ
buff	;(00)  ;lcnt2,  rep_addr_low	;変換文字列の格納エリア
buff1	;(01)  ;x16_hi, m_fsryh, scale	;
buff2	;(02)  ;x16_lo, m_fsryl, length	;
buff3	;(03)  ;y16_hi, m_fsrxh, tempo	;
buff4	;(04)  ;y16_lo, m_fsrxl, repeat	;
work1					;ワーク
work2					;ワーク
work3					;ワーク

const_high				;音階用分周定数 high の保存
const_low				;音階用分周定数 low の保存
wt1cnt					;ウェイト用ループカウンタ
wt2cnt					;ウェイト用ループカウンタ
wt3cnt					;ウェイト用ループカウンタ

reg_addr				;MAX7219 のレジスタアドレス
reg_data				;レジスタへの書き込みデータ
maxtmp					;送信データの一時保存
mbit_cnt				;ループカウンタ
segment					;Segment データ変数
digit					;Digit データ変数
dsp_cnt					;LED に表示する桁数
nop_cnt					;該当の桁より左側の桁数
addr_high				;文字フォントデータの high アドレス
addr_low				;文字フォントデータの low アドレス
kaddr_high				;
kaddr_low				;

; (I2C_XS.sub で使用)
i2ctmp					;送受信データの一時保存
bit_cnt					;ループカウンタ

; (I2C_RTC.sub で使用)
rtc_lpcnt				;ループカウンタ
rtc_addr_high				;読み出すデータの high アドレス
rtc_addr_low				;読み出すデータの low アドレス

; (DHT22_11.sub で使用)
humidity_h				;湿度上位 8 bit
humidity_l				;湿度下位 8 bit
temperature_h				;温度上位 8 bit
temperature_l				;温度下位 8 bit
time_cnt				;
					; bit7: タイムアウトエラー
					; bit6: チェックサム(CRC)エラー
					; bit5-0: 時間計測カウンタ 
		endc

;		cblock	h'70'		;バンク 0（共通 RAM 領域）
;		endc

		cblock  h'a0'		; (( バンク 1 ))
; (I2C_RTC.sub で使用)
seconds					;00h: Seconds: 00-59, bit7: CH(Clock Halt)
minutes					;01h: Minutes: 00-59
hours					;02h: Hours:   1-12 + AM/PM, 00-23
day					;03h: Day:     1-7
date					;04h: Date:    01-31
month					;05h: Month:   01-12
year					;06h: Year:    00-99
control					;07h: Control:

; (フォントデータのバッファエリア)
fd_buff					;バッファエリアの先頭
;	     (8 *  8 = 64 byte 使用)
		endc

;		cblock  h'120'		; (( バンク 2 ))
;linear_buff				;バッファエリアの先頭
;		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'			;割り込みベクタ

interrupt	;-------

		movlp	high $			;ページ 0
		movlb	0			;バンク 0

		; 割り込み処理の振り分け

		btfsc	INTCON,INTF		;INT外部割り込み か？
		goto	int_int			;Yes

		btfsc	INTCON,TMR0IF		;タイマー０割り込み か？
		goto	int_t0			;Yes

		btfsc	PIR1,TMR1IF		;タイマー１割り込み か？
		goto	int_t1			;Yes

		btfsc	INTCON,IOCIF		;状態変化割り込み か？
		goto	int_ioc			;Yes
		goto	int_end			;(Illegal interrupt)

;---------------- INT 外部割り込み処理 ------------------------------------

int_int		bcf	INTCON,INTF		;INT 外部割り込みフラグをクリア
		bsf	int_flg,0		;bit0: RTC DS1307 から年月日、時分秒の読み出し要求フラグ = ON
		btfsc	alm_flg,7		;アラーム音出力許可1フラグ = ON か？
		bsf	alm_flg,6		;Yes. アラーム音出力許可2フラグ = ON

		movf	rtsw_sel,W
		andlw	h'0f'
		sublw	3
		btfsc	STATUS,Z		;温度,湿度の表示: rtsw_sel = 3 か？
		goto	inti_01			;Yes

		movf	rtsw_sel,W
		andlw	h'0f'
		sublw	4
		btfss	STATUS,Z		;オートモードの表示: rtsw_sel = 4 か？
		goto	int_end			;No

inti_01		movlw	b'00000010'		;bit1-2: 4 秒カウンタ
		addwf	int_flg,F		;bit3: DHT11 から温度、湿度の読み出し要求フラグ = ON
		goto	int_end

;---------------- タイマー０割り込み処理 ----------------------------------

		;（タイマー０を許可したときのみ: 割り込み周期 = 4/8Mz*16*250=2msec）

int_t0		bcf	INTCON,TMR0IF		;タイマー０割り込みフラグをクリア
		movlw	tm0_h_val		;ハードタイマー０カウント値 = (256 - 250) を
		movwf	TMR0			;TMR0 に設定
		decfsz	tm0_s_cnt,F		;ソフトタイマー０カウンタ - 1 = 0 か？
		goto	int_end			;No

		movlw	tm0_s_val		;ソフトタイマー０カウント値 = 100 を
		movwf	tm0_s_cnt		;ソフトタイマー０カウンタに設定

		movlw	1 << 6			;対象ビットをセット

		btfss	mode_flg,0		;メイン処理フラグ = ON か？
		goto	int0_01			;No

		xorwf	rtsw_sel,F		;ブリンク反転フラグを 200 mS 毎にビット反転
		bsf	rtsw_sel,5		;ブリンク変更フラグを 200 mS 毎にセット
		goto	int_end

int0_01		btfss	mode_flg,7		;年月日,時分秒の設定モードフラグ = ON か？
		goto	int0_02			;No

		xorwf	mode_flg,F		;ブリンク反転フラグを 200 mS 毎にビット反転
		bsf	mode_flg,5		;ブリンク変更フラグを 200 mS 毎にセット
		goto	int_end

int0_02		xorwf	intensity,F		;ブリンク反転フラグを 200 mS 毎にビット反転
		bsf	intensity,5		;ブリンク変更フラグを 200 mS 毎にセット
		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 << _BZ		;対象ビットをセット
		xorwf	PORTB,F			;出力をビット反転
		goto	int_end

;---------------- 状態変化割り込み処理 ------------------------------------

int_ioc		movlb	7			;バンク 7
		btfss	IOCCF,3			;RC3 か？  ... "さくらさくら／赤とんぼ" で追加使用
		goto	ioc_01			;No

		clrf	IOCCF			;
		movlw	h'80'			;bit7: RC3 フラグ = ON
		goto	ioc_02

ioc_01		movf	IOCAF,W
		clrf	IOCAF			;状態変化割り込みフラグをクリアすると
						;INTCON レジスタの IOCIF ビットもクリアされる
ioc_02		movlb	0			;バンク 0
		movwf	swit_flg		;割り込みフラグを退避
		bcf	INTCON,IOCIE		;状態変化割り込みを禁止
;		goto	int_end

int_end		retfie

;==========================================================================
;		サブルーチンファイルのインクルード
;==========================================================================

#define 	TRISX	TRISB			;PORTB で I2C を行う場合
#define 	PORTX	PORTB			;
#define 	_PIC16F1			;PIC16F1ファミリで使用
;#define 	_not_wait			;Standard mode で使用
#define 	_DS1307				;DS1307 を使用する場合 
#define 	_DHT11				;DHT11 を使用する場合

;				ドライブ、パス名は、各自の開発環境に合わせるように !!
;				（include で検索のこと、計６か所あり）

		include		D:\Project\PIC\_sub\I2C_XS.sub		;Ver.1.03 以上が必要
		include		D:\Project\PIC\_sub\I2C_RTCII.sub	;Ver.1.02 以上が必要
		include		D:\Project\PIC\_sub\DHT22_11.sub	;Ver.1.02 以上が必要

;==========================================================================
;		初期化処理
;==========================================================================

start
		clrf	STATUS			;STATUS クリア
	 	clrf	INTCON			;INTCON クリア

		; 内部クロックを 8 MHz に設定

		movlb	1			;バンク 1
		movlw	b'01110000'		;CLOCK=8MHz
		movwf	OSCCON

		; PORTA,PORTB,PORTC ポートの各機能設定

		movlb	0			;バンク 0
		clrf	PORTA			;
		clrf	PORTB			;
		clrf	PORTC			;

		movlb	2			;バンク 2
		clrf	LATA			;
		clrf	LATB			;
		clrf	LATC			;

		movlb	3			;バンク 3
		clrf	ANSELA			;
		clrf	ANSELB			;すべて デジタル I/O ポート
		clrf	ANSELC			;

		movlb	1			;バンク 1
		movlw	b'00111111'		;RA5-RA0:入力
		movwf	TRISA			;ポートA の I/O 設定
		movlw	b'00100000'		;RB5: DHT11のDATAポートを入力ポート = 外部プルアップで DHT="H"
		movwf	TRISB			;ポートB の I/O 設定
		movlw	b'11111000'		;RC7-RC3:入力, RC2-RC0:出力
		movwf	TRISC			;ポートC の I/O 設定

		movlb	4			;バンク 4
		movlw	b'00110111'		;RA5-RA4,RA2-RA0
		movwf	WPUA			;プルアップ有効
		movlw	b'11111000'		;RC7-RC3
		movwf	WPUC			;プルアップ有効

		movlb	7			;バンク 7
		movlw	b'00110011'		;RA5-RA4,RA1-RA0
		movwf	IOCAN			;ポートA の立ち下がりエッジ状態変化割り込み
	;	movlw	b'00001000'		;RC3
	;	movwf	IOCCN			;ポートC の立ち下がりエッジ状態変化割り込み

		; OPTION_REG の設定

		movlb	1			;バンク 1
		movlw	h'08'			;プルアップ有効、プリスケーラ: 使用しない
		movwf	OPTION_REG
		movlb	0			;バンク 0

		; 割り込みの設定

		movlw	b'00000001'		;CS<1:0>:   bit7-6=00: Timer1クロック源=命令クロック(FOSC/4)を選択
						;CKPS<1:0>: bit5-4=00: プリスケーラ値を1:1
						;ON:        bit0=1:    Timer1を有効
		movwf	T1CON			;Timer1制御レジスタ
	;	clrf	T1GCON			;Timer1ゲート制御レジスタ
		movlw	b'11010000'		;GIE:    bit7=1: グローバル割り込みを許可
						;PEIE:   bit6=1: ペリフェラル割り込みを許可
						;TMR0IE: bit5=0: TMR0オーバーフロー割り込みを禁止
						;INTE:   bit4=1: INT外部割り込みを許可
						;IOCIE:  bit3=0: 状態変化割り込みを禁止
		movwf	INTCON			;各割り込み要因の設定

;--------------------------------------------------------------------------

		;  各インターフェイスの初期設定

		bsf	PORTB,SDA		;SDA="H"
		bsf	PORTB,SCL		;SCL="H"

		movlw	b'00000010'		;bit1:maxLOAD="H", bit2:maxCLK="L"
		movwf	PORTC			;MAX7219 制御の初期設定
		movlp	high max_led_init
		call	max_led_init		;マトリクス LED モジュールの初期化
		movlp	high $
		call	buzzer_pipo		;"ピポッ" ブザー音出力
		bcf	PORTB,_BZ		;ブザー出力ビットを "L" にしておく

		; ドットマトリクス LED のデモ表示等を省略

		movlw	b'00110011'
		andwf	PORTA,W		
		xorlw	b'00100001'
		btfsc	STATUS,Z		;SW2(UP) & SW3(DOWN) = ON か？
		goto	rtcinit01		;Yes

		; ドットマトリクス LED のデモ表示

		movlp	high demo_display
		call	demo_display		;ページ 2
		movlp	high $

		; ドットマトリクス LED の９～０表示テスト

		movlp	high max_led_test
		call	max_led_test		;ページ 3
		movlp	high $

		; プログラム名とバージョン番号の表示

		movlp	high prog_name_display
		call	prog_name_display	;ページ 2
		movlp	high $
		movlp	high ver_display
		call	ver_display		;ページ 2
		movlp	high $

;--------------------------------------------------------------------------

		; I2C RTC（DS1307）モジュールのチェック

rtcinit01	Rtc_Read_M	seconds,1	;Seconds 読み出し

		movlb	1			;バンク 1
		movf	seconds,W
		movlb	0			;バンク 0
		movwf	work3
		btfss	work3,7			;bit7: CH(Clock Halt) = 1 か？
		goto	varinit01		;No

		movlp	high ds1307_err_display
		call	ds1307_err_display	;クロック停止エラーの表示
		movlp	high $
		call	buzzer_bubuu		;"ブッブー" ブザー音出力

rtcinit02	movlw	h'33'			;SW1～SW4 スイッチ
		andwf	PORTA,W
		xorlw	h'33'
		btfsc	STATUS,Z		;どれかのスイッチ = ON か？
		goto	rtcinit02		;No

		; I2C RTC（DS1307）モジュールの初期設定

		call	I2cRtc_Init		;I2C RTC（DS1307）モジュールの初期設定
		goto	rtcinit01

;--------------------------------------------------------------------------

		; 各変数の初期設定

#define 	bcd_yy		bcd_yl		;年(下位2桁) BCD カウンタ ***

varinit01	movlw	h'20'
		movwf	bcd_yh			;年(上位2桁) BCD カウンタ ***

		clrf	time_flg		;時間表示モードフラグ bit1=0:24H/1:12H, bit0=0:am/1:pm
		clrf	intensity		;bit7: 輝度更新フラグ, bit3-0: 輝度調節値の初期設定
		clrf	exit_flg		;エグジットフラグの初期設定
		movlw	b'10000000'
		movwf	alm_flg			;アラーム音出力許可1フラグ = ON
		movlw	5			;200 mS（デフォルト値）
		movwf	scroll_flg		;スクロールの速度, bit7=0:左方向

		Rtc_Read_M  seconds,7		;RTC DS1307 から年月日、時分秒を読み出し
		call	buffer_to_counter
		clrf	int_flg			;外部割り込みフラグの初期設定
		goto	main

;--------------------------------------------------------------------------
;		バッファと BCD カウンタ間のデータ移動
;--------------------------------------------------------------------------

		; バッファからカウンタへコピー

buffer_to_counter

		movlw	high seconds		;RTC バッファの先頭アドレス
		movwf	FSR1H			;
		movlw	low seconds		;
		movwf	FSR1L			;

		moviw	FSR1++			;Seconds
		andlw	h'7f'			;
		movwf	bcd_ss			;秒 BCD カウンタ

		moviw	FSR1++			;Minutes
		movwf	bcd_mm			;分 BCD カウンタ

		moviw	FSR1++			;Hours
		movwf	bcd_hh			;時 BCD カウンタ

		moviw	FSR1++			;Day
		movwf	bcd_ww			;曜日 BCD カウンタ

		moviw	FSR1++			;Date
		movwf	bcd_dd			;日 BCD カウンタ

		moviw	FSR1++			;Month
		movwf	bcd_nn			;月 BCD カウンタ

		moviw	FSR1++			;Year
		movwf	bcd_yy			;年 BCD カウンタ
		return

;--------------------------------------------------------------------------

		; カウンタからバッファへコピー

counter_to_buffer

		movlw	high seconds		;RTC バッファの先頭アドレス
		movwf	FSR1H			;
		movlw	low seconds		;
		movwf	FSR1L			;

		movf	bcd_ss,W		;秒 BCD カウンタ
		movwi	FSR1++			;Seconds

		movf	bcd_mm,W		;分 BCD カウンタ
		movwi	FSR1++			;Minutes

		movf	bcd_hh,W		;時 BCD カウンタ
		movwi	FSR1++			;Hours

		movf	bcd_ww,W		;曜日 BCD カウンタ
		movwi	FSR1++			;Day

		movf	bcd_dd,W		;日 BCD カウンタ
		movwi	FSR1++			;Date

		movf	bcd_nn,W		;月 BCD カウンタ
		movwi	FSR1++			;Month

		movf	bcd_yy,W		;年 BCD カウンタ
		movwi	FSR1++			;Year
		return

;==========================================================================
;==========================================================================
;			メイン・ルーチン
;==========================================================================
;==========================================================================

		; mode_flg:	年月日,時分秒の設定モードフラグ / メイン処理フラグ
				; bit7: 設定モードフラグ
				; bit6: ブリンク反転フラグ (タイマー０割り込みで設定)
				; bit5: ブリンク変更フラグ (　　　　　〃　　　　　　)
			     ;>	; bit0: メイン処理フラグ

		; rtsw_sel:	ロータリスイッチ選択フラグ
				; bit7:   初期メッセージ表示指示フラグ
				; bit6:   ブリンク反転フラグ (タイマー０割り込みで設定)
				; bit5:   ブリンク変更フラグ (　　　　　〃　　　　　　)
				; bit4:   設定値 10 以上フラグ (設定値の表示時のみ使用)
				; bit3-0: ロータリスイッチ設定値 (1 ～ 12)

;--------------------------------------------------------------------------

main		;-------

		movlw	h'01'			;メイン処理フラグ = ON
 		movwf	mode_flg		;年月日,時分秒の設定モードフラグの初期設定
		movlw	b'10100000'		;bit7: 初期メッセージ表示指示 = ON
						;bit6: ブリンク反転フラグ     = OFF
						;bit5: ブリンク変更フラグ     = ON
		movwf	rtsw_sel		;初期設定

		movlw	tm0_h_val		;ハードタイマー０カウント値を
		movwf	TMR0			;TMR0 に設定
		movlw	tm0_s_val		;ソフトタイマー０カウント値を
		movwf	tm0_s_cnt		;ソフトタイマー０カウンタに設定
		bcf	INTCON,TMR0IF		;bit2(TMR0IF)=0: タイマー０割込みフラグをクリア
		bsf	INTCON,TMR0IE		;bit5(TMR0IE)=1: タイマー０割り込みを許可

		; ロータリスイッチ設定値の LED 表示

main01		movlw	h'f0'
		andwf	rtsw_sel,F		;フラグだけ残す
		swapf	PORTC,W			;ロータリスイッチの設定値を読む
		andlw	h'0f'			;スイッチデータを取り出し
		xorlw	h'0f'			;反転する
		iorwf	rtsw_sel,F		;新しい設定値に更新

main02		movlp	high select_msg_display
		call	select_msg_display	;ロータリスイッチ選択メッセージを表示
		movlp	high $

		; SET スイッチとロータリスイッチの監視

main03		btfss	PORTA,_swSET		;SET スイッチ = ON か？
		goto	main05			;Yes

		swapf	PORTC,W			;ロータリスイッチの設定値を読む
		xorlw	h'0f'			;反転する
		xorwf	rtsw_sel,W		;現在の rtsw_sel と比較する
		andlw	h'0f'			;フラグを除く
		btfsc	STATUS,Z		;設定値 = 更新された か？
		goto	main04			;No

		call	wait_30ms		;チャッタリング吸収
		swapf	PORTC,W			;ロータリスイッチの設定値を再度読む
		xorlw	h'0f'			;反転する
		xorwf	rtsw_sel,W		;現在の rtsw_sel と比較する
		andlw	h'0f'			;フラグを除く
		btfsc	STATUS,Z		;設定値 = 更新された か？
		goto	main04			;No

		bsf	rtsw_sel,5		;ブリンク変更フラグ rtsw_sel.5 = ON
		goto	main01			;Yes

main04		movlw	20			;要調整
		call	wait_xxms
		btfss	rtsw_sel,5		;ブリンク変更フラグ rtsw_sel.5 = ON か？
		goto	main03			;No
		goto	main02			;Yes

main05		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swSET		;再度 SET スイッチ = ON か？
		goto	main03			;No

		btfss	PORTA,_swSET		;SET スイッチ = OFF か？
		goto	$ - 1			;No

		call	wait_30ms		;チャッタリング吸収

		; ロータリスイッチの設定値別処理への振り分け

		bcf	INTCON,TMR0IE		;bit5(TMR0IE)=1: タイマー０割り込みを禁止
		clrf	mode_flg		;メイン処理フラグ = OFF
		movlw	h'0f'
		andwf	rtsw_sel,F		;フラグを消去 !!

		decf	rtsw_sel,W		;0 始まりにする
		movwf	FSR1L
		lslf	FSR1L,F			;2 倍する
		movlw	low jump_addr_tbl
		addwf	FSR1L,F			;ジャンプアドレステーブルの先頭 low アドレスを足す
		clrf	FSR1H
		movlw	high jump_addr_tbl
		addwfc	FSR1H,F			;ジャンプアドレステーブルの先頭 high アドレスを足す

		moviw	0[FSR1]			;
		movwf	PCLATH			;
		moviw	1[FSR1]			;
		movwf	PCL			;ジャンプ

;--------------------------------------------------------------------------

		; 処理別ジャンプアドレステーブル
jump_addr_tbl
		dt	high time_disp_process		;rtsw_sel =  1	;(ページ 0)
		dt	low time_disp_process
		dt	high date_disp_process		;rtsw_sel =  2	;(ページ 0)
		dt	low date_disp_process
		dt	high temp_humi_disp_process	;rtsw_sel =  3	;(ページ 0)
		dt	low temp_humi_disp_process
		dt	high auto_disp_process		;rtsw_sel =  4	;(ページ 0)
		dt	low auto_disp_process
		dt	high font5x7s_process		;rtsw_sel =  5	;(ページ 1)
		dt	low font5x7s_process
		dt	high font5x7p_process		;rtsw_sel =  6	;(ページ 1)
		dt	low font5x7p_process
		dt	high font8x8kana_process	;rtsw_sel =  7	;(ページ 1)
		dt	low font8x8kana_process
		dt	high sakura_tonbo_process	;rtsw_sel =  8	;(ページ 1)
		dt	low sakura_tonbo_process
		dt	high blank_process		;rtsw_sel =  9	;(ページ 1)
		dt	low blank_process
		dt	high blank_process		;rtsw_sel = 10	;(ページ 1)
		dt	low blank_process
		dt	high bright_adj_process		;rtsw_sel = 11	;(ページ 0)
		dt	low bright_adj_process
		dt	high date_time_adj_process	;rtsw_sel = 12	;(ページ 0)
		dt	low date_time_adj_process

;--------------------------------------------------------------------------
;		各処理別のスイッチ名の読み替え
;--------------------------------------------------------------------------

;    rtsw_sel		処理			 SW5    SW4    SW3    SW2     SW1

;	 -	メイン、処理の振り分け		  -      -      -      -      SET
;	 1	時分秒の表示			SIGNAL  ZERO    -    TMODE    EXIT
;	 2	年月日（曜日）の表示		SIGNAL   -      -      -      EXIT
;	 3	温度,湿度の表示			SIGNAL   -      -      -      EXIT
;	 4	オートモードの表示		SIGNAL (ZERO)   -   (TMODE)   EXIT
;	 5	標準文字フォントのデモ表示	  -     LEFT   DOWN    UP  EXIT/RIGHT
;	 6	プロポ文字フォントのデモ表示	  -     LEFT   DOWN    UP  EXIT/RIGHT
;	 7	かな文字フォントのデモ表示	  -     LEFT   DOWN    UP  EXIT/RIGHT
;	 8	さくらさくら／赤とんぼ		SIGNAL CHANGE  DOWN    UP     EXIT
;	 9	                      		  -      -      -      -      EXIT
;	10	                      		  -      -      -      -      EXIT
;	11	LED の輝度調節			  -      -     DOWN    UP     EXIT
;	12	年月日,時分秒の設定		  -     BACK   DOWN    UP   SET/EXIT

;==========================================================================
;		rtsw_sel = 1: 時分秒の表示処理
;==========================================================================

		; int_flg:	外部(INT)割り込みフラグ
				; bit7:   RTC DS1307 からデータ読み出し無効フラグ
				; bit3:   DHT11 からデータ読み出し要求フラグ
				; bit2-1: 4 秒カウンタ
				; bit0:   RTC DS1307 からデータ読み出し要求フラグ

 		; disp_flg:	LED 表示フラグ
				; bit7: 年表示フラグ
				; bit6: 月表示フラグ
				; bit5: 日表示フラグ
			     ;>	; bit4: 時表示フラグ
			     ;>	; bit3: 分表示フラグ
			     ;>	; bit2: 秒表示フラグ
				; bit1: 温度表示フラグ
				; bit0: 湿度表示フラグ

 		; mode_flg:	年月日,時分秒の設定モードフラグ
				; bit7: 設定モードフラグ
				; bit6: ブリンク反転フラグ (タイマー０割り込みで設定)
				; bit5: ブリンク変更フラグ (　　　　　〃　　　　　　)
				; bit0: メイン処理フラグ

 		; time_flg:	時間表示フラグ
				; bit1: 0:24H/1:12H
				; bit0: 0:am/1:pm

;--------------------------------------------------------------------------

time_disp_process	;-------

		clrf	mode_flg		;bit7: 設定モードフラグ = OFF
		clrf	exit_flg		;エグジットフラグ = OFF
		movlw	b'00011100'		;時,分,秒 すべて
		movwf	disp_flg		;LED 表示フラグ = ON
		bsf	int_flg,0		;RTC DS1307 からデータ読み出し要求フラグ = ON

timdsp01	call	time_part_display	;時分秒を LED モジュールに表示
		call	time_signal		;時報音出力コントロール	
		call	alarm_sound		;アラームフラグの監視とアラーム音出力

		; 各スイッチの入力処理

		btfss	PORTA,_swMOD		;TMODE スイッチ = ON か？
		call	tm_mode_switch		;Yes

		btfss	PORTA,_swZER		;ZERO スイッチ = ON か？
		call	tm_zero_switch		;Yes

		btfss	PORTC,_swSIG		;SIGNAL スイッチ = ON か？
		call	tm_signal_switch	;Yes

		btfss	PORTA,_swEXT		;EXIT スイッチ = ON か？
		call	tm_exit_switch		;Yes

		movf	rtsw_sel,W
		sublw	4
		btfss	STATUS,Z		;オートモード rtsw_sel = 4 か？
		goto	timdsp03		;No

		btfsc	exit_flg,7		;処理打ち切りフラグ = ON か？
		goto	timdsp02		;Yes

		movlw	h'10'			;
		subwf	bcd_ss,W		;秒 BCD カウンタ
		btfsc	STATUS,Z		;bcd_ss = h'10' か？
		goto	timdsp02		;Yes

		movlw	h'40'			;
		subwf	bcd_ss,W		;秒 BCD カウンタ
		btfss	STATUS,Z		;bcd_ss = h'40' か？
		goto	timdsp01		;No

timdsp02	return

timdsp03	btfss	exit_flg,7		;処理打ち切りフラグ = ON か？
		goto	timdsp01		;No

		bcf	exit_flg,7		;処理打ち切りフラグ = OFF
		goto	main			;メイン処理に戻る

;--------------------------------------------------------------------------

time_part_display	;-------

		btfsc	int_flg,7		;RTC DS1307 からデータ読み出し無効フラグ = ON か？
		goto	tmpdsp01		;Yes

		btfss	int_flg,0		;RTC DS1307 からデータ読み出し要求フラグ = ON か？
		goto	tmpdsp02		;No

		Rtc_Read_M  seconds,7		;RTC DS1307 から年月日、時分秒を読み出し
		call	buffer_to_counter
		bcf	int_flg,0		;RTC DS1307 からデータ読み出し要求フラグ = OFF

		bsf	disp_flg,2		;bit2: 秒表示フラグ = ON

		movf	bcd_ss,W		;秒 BCD カウンタ
		btfss	STATUS,Z		;bcd_ss = 0 か？
		goto	tmpdsp01		;No

		bsf	disp_flg,3		;bit3: 分表示フラグ = ON

		movf	bcd_mm,W		;分 BCD カウンタ
		btfss	STATUS,Z		;bcd_mm = 0 か？
		goto	tmpdsp01		;No

		bsf	disp_flg,4		;bit4: 時表示フラグ = ON

tmpdsp01	movlp	high time_display
		call	time_display		;時分秒を LED モジュールに表示
		movlp	high $
		bcf	int_flg,7		;RTC DS1307 からデータ読み出し無効フラグ = OFF

tmpdsp02	return

;--------------------------------------------------------------------------
;		EXIT スイッチの処理 ... 時分秒の表示から CALL
;--------------------------------------------------------------------------

tm_exit_switch		;-------

		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swEXT		;再度 EXIT スイッチ = ON か？
		goto	tmexsw02		;No

		movlw	60			;50ms x 60 = 3 秒間の監視
		movwf	lp_cnt4			;ループカウンタ

tmexsw01	call	wait_50ms		;50m 秒 ウエイト
		call	time_part_display	;時分秒を LED モジュールに表示

		btfsc	PORTA,_swEXT		;EXIT スイッチ = OFF か？
		goto	tmexsw02		;Yes

		decfsz	lp_cnt4,F		;ループカウンタ - 1 = 0 か？
		goto	tmexsw01		;No

		bsf	exit_flg,7		;処理打ち切りフラグ = ON

tmexsw02	btfss	PORTA,_swEXT		;EXIT スイッチ = OFF か？
		goto	$ - 1			;No

		call	wait_30ms		;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;	 UP / TIME MODE スイッチの処理 ... 時分秒の表示から CALL
;--------------------------------------------------------------------------

tm_mode_switch		;-------

		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swMOD		;再度 TMODE スイッチ = ON か？
		goto	tmmod01			;No

		movlw	b'00000010'
		xorwf	time_flg,F		;時間表示モードフラグ bit1=0:24H/1:12H, bit0=0:am/1:pm
		bsf	disp_flg,4		;時表示フラグ = ON
		bsf	int_flg,7		;RTC DS1307 からデータ読み出し無効フラグ = ON

tmmod01		btfss	PORTA,_swMOD		;TMODE スイッチ = OFF か？
		goto	$ - 1			;No

		call	wait_30ms		;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;		ZERO スイッチの処理 ... 時分秒の表示から CALL
;--------------------------------------------------------------------------

tm_zero_switch		;-------

		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swZER		;再度 ZERO スイッチ = ON か？
		goto	tmzer04			;No

		movlw	h'05'
		subwf	bcd_mm,W
		btfss	STATUS,C		;分 BCD カウンタ < h'05' か？
		goto	tmzer02			;Yes

		movlw	h'55'
		subwf	bcd_mm,W
		btfss	STATUS,C		;分 BCD カウンタ >= h'55' か？
		goto	tmzer04			;No. 無視

		bcf	INTCON,INTE		;bit4(INTE)=1: INT外部割り込みを禁止
		call	bcd_hh_inc		;時 BCD カウンタのインクリメント
		movf	bcd_hh,W
		btfss	STATUS,Z		;時 BCD カウンタ = h'00' か？
		goto	tmzer03			;No

		call	bcd_dd_inc		;日 BCD カウンタのインクリメント
		movlw	h'01'
		subwf	bcd_dd,W
		btfss	STATUS,Z		;日 BCD カウンタ = h'01' か？
		goto	tmzer01			;No

		call	bcd_nn_inc		;月 BCD カウンタのインクリメント
		movlw	h'01'
		subwf	bcd_nn,W
		btfss	STATUS,Z		;月 BCD カウンタ = h'01' か？
		goto	tmzer01			;No

		call	bcd_yl_inc		;年(下位2桁) BCD カウンタのインクリメント

tmzer01		call	day_week		;該当日の曜日を取得
		movwf	bcd_ww			;曜日 BCD カウンタ
		goto	tmzer03

tmzer02		bcf	INTCON,INTE		;;bit4(INTE)=1: INT外部割り込みを禁止

tmzer03		clrf	bcd_mm			;分 BCD カウンタのクリア
		clrf	bcd_ss			;秒 BCD カウンタのクリア
		call	counter_to_buffer
		Rtc_Write_M  seconds,7		;RTC DS3231 へ年月日、時分秒を書き込み

		bsf	INTCON,INTE		;bit4(INTE)=1: INT外部割り込みを禁止解除
		movlw	b'00011100'		;時,分,秒 すべて
		movwf	disp_flg		;LED 表示フラグ = ON
		bsf	int_flg,7		;RTC DS1307 からデータ読み出し無効フラグ = ON

tmzer04		btfss	PORTA,_swZER		;ZERO スイッチ = OFF か？
		goto	$ - 1			;No

		call	wait_30ms		;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;	SIGNAL スイッチの処理 ... 時分秒,年月日,温度,湿度の表示から CALL
;--------------------------------------------------------------------------

;出力:	alm_flg: アラーム音出力フラグ ( bit2:予報音, bit3:正報音, bit7:出力許可1 )

tm_signal_switch	;------- 時分秒
dt_signal_switch	;------- 年月日
th_signal_switch	;------- 温度,湿度

		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTC,_swSIG		;再度 SIGNAL スイッチ = ON か？
		goto	tmsig01			;No

		movlw	b'10000000'
		xorwf	alm_flg,F		;アラーム音出力許可1フラグの更新

		btfsc	alm_flg,7		;アラーム音出力許可1フラグ = ON か？
		call	buzzer_pipipi		;Yes. 許可  "ピピピッ" ブザー音出力

		btfss	alm_flg,7		;アラーム音出力許可1フラグ = OFF か？
		call	buzzer_buu		;Yes. 禁止  "ブー" ブザー音出力

tmsig01		btfss	PORTC,_swSIG		;SIGNAL スイッチ = OFF か？
		goto	$ - 1			;No

		call	wait_30ms		;チャッタリング吸収
		return

;==========================================================================
;		rtsw_sel = 2: 年月日（曜日）の表示処理
;==========================================================================

		; int_flg:	外部(INT)割り込みフラグ
				; bit7:   RTC DS1307 からデータ読み出し無効フラグ
				; bit3:   DHT11 からデータ読み出し要求フラグ
				; bit2-1: 4 秒カウンタ
				; bit0:   RTC DS1307 からデータ読み出し要求フラグ

 		; disp_flg:	LED 表示フラグ
			     ;>	; bit7: 年表示フラグ
			     ;>	; bit6: 月表示フラグ
			     ;>	; bit5: 日表示フラグ
				; bit4: 時表示フラグ
				; bit3: 分表示フラグ
				; bit2: 秒表示フラグ
				; bit1: 温度表示フラグ
				; bit0: 湿度表示フラグ

 		; mode_flg:	年月日,時分秒の設定モードフラグ
				; bit7: 設定モードフラグ
				; bit6: ブリンク反転フラグ (タイマー０割り込みで設定)
				; bit5: ブリンク変更フラグ (　　　　　〃　　　　　　)
				; bit0: メイン処理フラグ

;--------------------------------------------------------------------------

date_disp_process	;-------

		clrf	mode_flg		;bit7: 設定モードフラグ = OFF
		clrf	exit_flg		;エグジットフラグ = OFF
		movlw	b'11100000'		;年,月,日 すべて
		movwf	disp_flg		;LED 表示フラグ = ON
		bsf	int_flg,0		;RTC DS1307 からデータ読み出し要求フラグ = ON

datdsp01	call	date_part_display	;年月日を LED モジュールに表示
		call	time_signal		;時報音出力コントロール	
		call	alarm_sound		;アラームフラグの監視とアラーム音出力

		; 各スイッチの入力処理

		btfss	PORTC,_swSIG		;SIGNAL スイッチ = ON か？
		call	dt_signal_switch	;Yes

		btfss	PORTA,_swEXT		;EXIT スイッチ = ON か？
		call	dt_exit_switch		;Yes

		movf	rtsw_sel,W
		sublw	4
		btfss	STATUS,Z		;オートモード rtsw_sel = 4 か？
		goto	datdsp03		;No

		btfsc	exit_flg,7		;処理打ち切りフラグ = ON か？
		goto	datdsp02		;Yes

		movlw	h'25'			;
		subwf	bcd_ss,W		;秒 BCD カウンタ
		btfss	STATUS,C		;bcd_ss < h'25' か？
		goto	datdsp01		;Yes

datdsp02	return

datdsp03	btfss	exit_flg,7		;処理打ち切りフラグ = ON か？
		goto	datdsp01		;No

		bcf	exit_flg,7		;処理打ち切りフラグ = OFF
		goto	main			;メイン処理に戻る

;--------------------------------------------------------------------------

date_part_display	;-------

		btfss	int_flg,0		;RTC DS1307 からデータ読み出し要求フラグ = ON か？
		goto	dtpdsp02		;No

		Rtc_Read_M  seconds,7		;RTC DS1307 から年月日、時分秒を読み出し
		call	buffer_to_counter
		bcf	int_flg,0		;RTC DS1307 からデータ読み出し要求フラグ = OFF

		bsf	disp_flg,5		;bit5: 日表示フラグ = ON

		movf	bcd_ss,W		;秒 BCD カウンタ
		iorwf	bcd_mm,W		;分 BCD カウンタ
		iorwf	bcd_hh,W		;時 BCD カウンタ
		btfss	STATUS,Z		;bcd_ss = bcd_mm = bcd_hh = 0 か？
		goto	dtpdsp01		;No

		movf	bcd_dd,W		;日 BCD カウンタ
		sublw	1
		btfss	STATUS,Z		;bcd_dd = 1 か？
		goto	dtpdsp01		;No

		bsf	disp_flg,6		;bit6: 月表示フラグ = ON

		movf	bcd_nn,W		;月 BCD カウンタ
		sublw	1
		btfss	STATUS,Z		;bcd_nn = 1 か？
		goto	dtpdsp01		;No

		bsf	disp_flg,7		;bit7: 年表示フラグ = ON

dtpdsp01	movlp	high date_display
		call	date_display		;年月日を LED モジュールに表示
		movlp	high $
		bcf	int_flg,7		;RTC DS1307 からデータ読み出し無効フラグ = OFF

dtpdsp02	return

;--------------------------------------------------------------------------
;		EXIT スイッチの処理 ... 年月日の表示から CALL
;--------------------------------------------------------------------------

dt_exit_switch		;-------

		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swEXT		;再度 EXIT スイッチ = ON か？
		goto	dtexsw02		;No

		movlw	60			;50ms x 60 = 3 秒間の監視
		movwf	lp_cnt4			;ループカウンタ

dtexsw01	call	wait_50ms		;50m 秒 ウエイト
		call	date_part_display	;Yes. 年月日を LED モジュールに表示

		btfsc	PORTA,_swEXT		;EXIT スイッチ = OFF か？
		goto	dtexsw02		;Yes

		decfsz	lp_cnt4,F		;ループカウンタ - 1 = 0 か？
		goto	dtexsw01		;No

		bsf	exit_flg,7		;処理打ち切りフラグ = ON

dtexsw02	btfss	PORTA,_swEXT		;EXIT スイッチ = OFF か？
		goto	$ - 1			;No

		call	wait_30ms		;チャッタリング吸収
		return

;==========================================================================
;		rtsw_sel = 3: 温度,湿度の表示処理
;==========================================================================

		; int_flg:	外部(INT)割り込みフラグ
				; bit7:   RTC DS1307 からデータ読み出し無効フラグ
				; bit3:   DHT11 からデータ読み出し要求フラグ
				; bit2-1: 4 秒カウンタ
				; bit0:   RTC DS1307 からデータ読み出し要求フラグ

 		; disp_flg:	LED 表示フラグ
				; bit7: 年表示フラグ
				; bit6: 月表示フラグ
				; bit5: 日表示フラグ
				; bit4: 時表示フラグ
				; bit3: 分表示フラグ
				; bit2: 秒表示フラグ
			     ;>	; bit1: 温度表示フラグ
			     ;>	; bit0: 湿度表示フラグ

;--------------------------------------------------------------------------

temp_humi_disp_process	;-------

		clrf	exit_flg		;エグジットフラグ = OFF
		movlw	b'00000011'		;温度,湿度 すべて
		movwf	disp_flg		;LED 表示フラグ = ON
		movlw	b'00001001'		;
		movwf	int_flg			;DHT11 からデータ読み出し要求フラグ = ON

temdsp01	call	temp_humi_part_display	;温度,湿度を LED モジュールに表示
		call	time_signal		;時報音出力コントロール	
		call	alarm_sound		;アラームフラグの監視とアラーム音出力

		; 各スイッチの入力処理

		btfss	PORTC,_swSIG		;SIGNAL スイッチ = ON か？
		call	th_signal_switch	;Yes

		btfss	PORTA,_swEXT		;EXIT スイッチ = ON か？
		call	th_exit_switch		;Yes

		movf	rtsw_sel,W
		sublw	4
		btfss	STATUS,Z		;オートモード rtsw_sel = 4 か？
		goto	temdsp03		;No

		btfsc	exit_flg,7		;処理打ち切りフラグ = ON か？
		goto	temdsp02		;Yes

		movlw	h'55'			;
		subwf	bcd_ss,W		;秒 BCD カウンタ
		btfss	STATUS,C		;bcd_ss < h'55' か？
		goto	temdsp01		;Yes

temdsp02	return

temdsp03	btfss	exit_flg,7		;処理打ち切りフラグ = ON か？
		goto	temdsp01		;No

		bcf	exit_flg,7		;処理打ち切りフラグ = OFF
		goto	main			;メイン処理に戻る

;--------------------------------------------------------------------------

temp_humi_part_display	;-------

		btfss	int_flg,0		;RTC DS1307 からデータ読み出し要求フラグ = ON か？
		goto	thpdsp01		;No

		Rtc_Read_M  seconds,7		;RTC DS1307 から年月日、時分秒を読み出し
		call	buffer_to_counter
		bcf	int_flg,0		;RTC DS1307 からデータ読み出し要求フラグ = OFF

thpdsp01	btfss	int_flg,3		;DHT11 からデータ読み出し要求フラグ = ON（４秒周期）か？
		goto	thpdsp04		;No

thpdsp02	call	dht11_measure		;DHT11 から温度、湿度を読み出し
		movlw	h'c0'
		andwf	time_cnt,W
		btfsc	STATUS,Z		;読み出しエラーがあった か？
		goto	thpdsp03		;No

		movlp	high dht11_err_display
		call	dht11_err_display	;読み出しエラーの表示
		movlp	high $
		call	buzzer_bubuu		;"ブッブー" ブザー音出力
		bcf	int_flg,3		;DHT11からデータ読み出し要求フラグ = OFF

		btfss	int_flg,3		;DHT11 からデータ読み出し要求フラグ = ON（４秒周期） か？
		goto	$ - 1			;No
		goto	thpdsp02

thpdsp03	bsf	disp_flg,1		;bit1: 温度表示フラグ = ON
		bsf	disp_flg,0		;bit0: 湿度表示フラグ = ON

		movlp	high temp_humi_display
		call	temp_humi_display	;温度,湿度を LED モジュールに表示
		movlp	high $
		bcf	int_flg,3		;DHT11 からデータ読み出し要求フラグ = OFF

thpdsp04	return

;--------------------------------------------------------------------------
;		EXIT スイッチの処理 ... 温度,湿度の表示から CALL
;--------------------------------------------------------------------------

th_exit_switch		;-------

		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swEXT		;再度 EXIT スイッチ = ON か？
		goto	thexsw02		;No

		movlw	60			;50ms x 60 = 3 秒間の監視
		movwf	lp_cnt4			;ループカウンタ

thexsw01	call	wait_50ms		;50m 秒 ウエイト
		call	temp_humi_part_display	;Yes. 温度,湿度を LED モジュールに表示

		btfsc	PORTA,_swEXT		;EXIT スイッチ = OFF か？
		goto	thexsw02		;Yes

		decfsz	lp_cnt4,F		;ループカウンタ - 1 = 0 か？
		goto	thexsw01		;No

		bsf	exit_flg,7		;処理打ち切りフラグ = ON

thexsw02	btfss	PORTA,_swEXT		;EXIT スイッチ = OFF か？
		goto	$ - 1			;No

		call	wait_30ms		;チャッタリング吸収
		return

;==========================================================================
;		rtsw_sel = 4: オートモードの表示処理
;==========================================================================

;		 (____: 時間表示、NNNN: 年月日表示、OOOO: 温度,湿度表示)

;		00        10        20        30        40        50        00
;		.    .    .    .    .    .    .    .    .    .    .    .    .
;		__________NNNNNNNNNNNNNNN_______________OOOOOOOOOOOOOOO_____

;--------------------------------------------------------------------------

auto_disp_process	;-------

autdsp01	movlw	h'10'			;
		subwf	bcd_ss,W		;秒 BCD カウンタ
		btfss	STATUS,C		;bcd_ss < h'10' か？
		goto	autdsp02		;Yes

		movlw	h'25'			;
		subwf	bcd_ss,W		;秒 BCD カウンタ
		btfss	STATUS,C		;bcd_ss < h'25' か？
		goto	autdsp03		;Yes

		movlw	h'40'			;
		subwf	bcd_ss,W		;秒 BCD カウンタ
		btfss	STATUS,C		;bcd_ss < h'40' か？
		goto	autdsp02		;Yes

		movlw	h'55'			;
		subwf	bcd_ss,W		;秒 BCD カウンタ
		btfss	STATUS,C		;bcd_ss < h'55' か？
		goto	autdsp04		;Yes

autdsp02	call	time_disp_process	;時分秒の表示
		goto	autdsp05

autdsp03	call	date_disp_process	;年月日の表示
		goto	autdsp05

autdsp04	call	temp_humi_disp_process 	;温度,湿度の表示

autdsp05	btfss	exit_flg,7		;処理打ち切りフラグ = ON か？
		goto	autdsp01		;No

		bcf	exit_flg,7		;処理打ち切りフラグ = OFF
		goto	main			;メイン処理に戻る

;==========================================================================
;		rtsw_sel = 11: LED の輝度調節機能の処理
;==========================================================================

		; intensity:	輝度調節フラグ
				; bit7:   初期メッセージ表示指示フラグ
				; bit6:   ブリンクフラグ     (タイマー０割り込みで設定)
				; bit5:   ブリンク変更フラグ (　　　　　〃　　　　　　)
				; bit4:   輝度更新フラグ
				; bit3-0: 輝度調節値 (0 ～ 9)

;--------------------------------------------------------------------------

bright_adj_process	;-------

		movlw	h'0f'			;輝度調節値だけを取り出す
		andwf	intensity,W		;
		iorlw	b'10110000'		;bit7: 初期メッセージ表示指示 = ON
						;bit6: ブリンク反転フラグ     = OFF
						;bit5: ブリンク変更フラグ     = (ON)
						;bit4: 輝度更新フラグ         = (ON)
		movwf	intensity		;初期設定

		movlw	tm0_h_val		;ハードタイマー０カウント値を
		movwf	TMR0			;TMR0 に設定
		movlw	tm0_s_val		;ソフトタイマー０カウント値を
		movwf	tm0_s_cnt		;ソフトタイマー０カウンタに設定
		bcf	INTCON,TMR0IF		;bit2(TMR0IF)=0: タイマー０割込みフラグをクリア
		bsf	INTCON,TMR0IE		;bit5(TMR0IE)=1: タイマー０割り込みを許可

		; 輝度レジスタの更新

briadj01	movlw	h'0a'			;輝度レジスタ
		movwf	reg_addr
		movf	intensity,W		;輝度調節値
		andlw	h'0f'
		movwf	reg_data
		movlp	high max_led_contr
		call	max_led_contr		;MAX7219 x 8個分の制御
		movlp	high $
		bcf	intensity,4		;輝度更新フラグ intensity.4 = OFF
		bsf	intensity,5		;ブリンク変更フラグ intensity.5 = ON

		; 輝度調節値の LED 表示

briadj02	movlp	high brightness_msg_display
		call	brightness_msg_display	;LED の輝度調節メッセージの表示
		movlp	high $

		; 各スイッチの入力チェック

briadj03	btfss	PORTA,_swEXT		;EXIT スイッチ = ON か？
		goto	briadj04		;Yes

		btfss	PORTA,_swUP		;UP スイッチ = ON か？
		call	br_up_switch		;Yes

		btfss	PORTA,_swDWN		;DOWN スイッチ = ON か？
		call	br_down_switch		;Yes

		btfsc	intensity,4		;輝度更新フラグ intensity.4 = ON か？
		goto	briadj01		;Yes

		movlw	20			;要調整
		call	wait_xxms
		btfss	intensity,5		;ブリンク変更フラグ intensity.5 = ON か？
		goto	briadj03		;No
		goto	briadj02		;Yes

briadj04	call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swEXT		;再度 EXIT スイッチ = ON か？
		goto	briadj03		;No

		; 輝度調節処理の終了

		btfss	PORTA,_swEXT		;EXIT スイッチ = OFF か？
		goto	$ - 1			;No

		call	wait_30ms		;チャッタリング吸収
		bcf	INTCON,TMR0IE		;bit5(TMR0IE)=1: タイマー０割り込みを禁止
		movlp	high main
		goto	main			;メイン処理に戻る

;--------------------------------------------------------------------------
;	      UP スイッチの処理 ... 輝度調節機能から CALL
;--------------------------------------------------------------------------

br_up_switch		;-------

		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swUP		;再度 UP スイッチ = ON か？
		goto	brupsw01		;No

		movf	intensity,W
		andlw	h'0f'
		sublw	9			;MAX h'0f' を h'09' に制限した
		btfsc	STATUS,Z		;intensity = 9 か？
		goto	brupsw01		;Yes

		incf	intensity,F		;+1 更新
		bsf	intensity,4		;輝度更新フラグ = ON

brupsw01	btfss	PORTA,_swUP		;UP スイッチ = OFF か？
		goto	$ - 1			;No

		call	wait_30ms		;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;	     DOWN スイッチの処理 ... 輝度調節機能から CALL
;--------------------------------------------------------------------------

br_down_switch		;-------

		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swDWN		;再度 DOWN スイッチ = ON か？
		goto	brdwsw01		;No

		movf	intensity,W
		andlw	h'0f'
		btfsc	STATUS,Z		;intensity = 0 か？
		goto	brdwsw01		;Yes

		decf	intensity,F		;-1 更新
		bsf	intensity,4		;輝度更新フラグ = ON

brdwsw01	btfss	PORTA,_swDWN		;DOWN スイッチ = OFF か？
		goto	$ - 1			;No

		call	wait_30ms		;チャッタリング吸収
		return

;==========================================================================
;		rtsw_sel = 12: 年月日,時分秒の設定変更処理
;==========================================================================

 		; disp_flg:	LED 表示フラグ
			     ;>	; bit7: 年表示フラグ
			     ;>	; bit6: 月表示フラグ
			     ;>	; bit5: 日表示フラグ
			     ;>	; bit4: 時表示フラグ
			     ;>	; bit3: 分表示フラグ
			     ;>	; bit2: 秒表示フラグ
				; bit1: 温度表示フラグ
				; bit0: 湿度表示フラグ

 		; mode_flg:	年月日,時分秒の設定モードフラグ
				; bit7: 設定モードフラグ
				; bit6: ブリンク反転フラグ (タイマー０割り込みで設定)
				; bit5: ブリンク変更フラグ (　　　　　〃　　　　　　)
				; bit0: メイン処理フラグ

 		; time_flg:	時間表示フラグ
				; bit1: 0:24H/1:12H
				; bit0: 0:am/1:pm

		; targ_flg:	対象位置ポインタフラグ
				; bit7:   対象位置の変更フラグ
				; bit6:   年月日に変更指示フラグ
				; bit5:   時分秒に変更指示フラグ
				; bit4:   対象位置のデータ変更フラグ
				; bit3:   RTC 更新指示フラグ
				; bit2-0: 位置ポインタ (0 ～ 6)

;--------------------------------------------------------------------------

date_time_adj_process	;-------

		bcf	INTCON,INTE		;bit4(INTE)=0: INT外部割り込みを禁止
		movlw	b'01000000'		;bit6: 年月日に変更指示フラグ = ON
		movwf	targ_flg		;初期設定

		movlw	tm0_h_val		;ハードタイマー０カウント値を
		movwf	TMR0			;TMR0 に設定
		movlw	tm0_s_val		;ソフトタイマー０カウント値を
		movwf	tm0_s_cnt		;ソフトタイマー０カウンタに設定
		bcf	INTCON,TMR0IF		;bit2(TMR0IF)=0: タイマー０割込みフラグをクリア
		bsf	INTCON,TMR0IE		;bit5(TMR0IE)=1: タイマー０割り込みを許可
;
dtadj01		movlw	b'01101111'		;bit7, bit4 をクリア
		andwf	targ_flg,F

		incf	targ_flg,F		;仮に +1 する
		btfsc	targ_flg,2		;targ_flg.2-0 >= 4 か？
		goto	dtadj03			;Yes

		; 年月日の表示

		decf	targ_flg,F		;元に戻す
		btfss	targ_flg,6		;年月日に変更指示フラグ targ_flg.6 = ON か？
		goto	dtadj02			;No

		movlw	b'10100000'		;bit7: 設定モードフラグ   = ON
						;bit6: ブリンク反転フラグ = OFF
						;bit5: ブリンク変更フラグ = (ON)
		movwf	mode_flg		;初期設定
		bcf	targ_flg,6		;年月日に変更指示フラグ targ_flg.6 = OFF

dtadj02		call	tgp_dsp_conv		;targ_flg.2-0 から disp_flg に変換

		movlp	high date_display
		call	date_display		;年月日（曜日）を表示
		movlp	high $
		bcf	mode_flg,5		;bit5: ブリンク変更フラグ = OFF
		goto	dtadj05
;
		; 時分秒の表示

dtadj03		decf	targ_flg,F		;元に戻す
		btfss	targ_flg,5		;時分秒に変更指示フラグ targ_flg.5 = ON か？
		goto	dtadj04			;No

		movlw	b'10100000'		;bit7: 設定モードフラグ   = ON
						;bit6: ブリンク反転フラグ = OFF
						;bit5: ブリンク変更フラグ = (ON)
		movwf	mode_flg		;初期設定
		bcf	targ_flg,5		;時分秒に変更指示フラグ targ_flg.5 = OFF

dtadj04		call	tgp_dsp_conv		;targ_flg.2-0 から disp_flg に変換

		movlp	high time_display
		call	time_display		;時分秒を表示
		movlp	high $
		bcf	mode_flg,5		;bit5: ブリンク変更フラグ = OFF

		; 各スイッチの入力処理

dtadj05		btfss	PORTA,_swSET		;SET スイッチ = ON か？
		call	dtaj_set_switch		;Yes

		btfss	PORTA,_swUP		;UP スイッチ = ON か？
		call	dtaj_up_switch		;Yes

		btfss	PORTA,_swDWN		;DOWN スイッチ = ON か？
		call	dtaj_down_switch	;Yes

		btfss	PORTA,_swBAK		;BACK スイッチ = ON か？
		call	dtaj_back_switch	;Yes

		movf	targ_flg,W
		andlw	h'07'
		sublw	6
		btfsc	STATUS,Z		;終了 targ_flg.2-0 = 6 か？
		goto	dtadj06			;Yes

		movlw	b'10010000'		;
		andwf	targ_flg,W
		btfss	STATUS,Z		;どれかのキー操作があった か？
		goto	dtadj01			;Yes

		movlw	18			;要調整
		call	wait_xxms
		btfss	mode_flg,5		;ブリンク変更フラグ mode_flg.5 = ON か？
		goto	dtadj05			;No
		goto	dtadj01			;Yes

		; 設定変更処理の終了

dtadj06		btfss	PORTA,_swSET		;SET スイッチ = OFF か？
		goto	$ - 1			;No

		btfss	targ_flg,3		;RTC 更新指示フラグ targ_flg.3 = ON か？
		goto	dtadj07			;No

		call	counter_to_buffer
		Rtc_Write_M  seconds,7		;RTC DS1307 へ年月日、時分秒を書き込み

dtadj07		bcf	INTCON,TMR0IE		;bit5(TMR0IE)=1: タイマー０割り込みを禁止
		bsf	INTCON,INTE		;bit4(INTE)=1: INT外部割り込みを禁止解除
		movlp	high main
		goto	main			;メイン処理に戻る

;--------------------------------------------------------------------------

		; targ_flg.2-0 から disp_flg に変換
tgp_dsp_conv
		incf	targ_flg,W		;0 始まりのため +1 する
		andlw	h'07'			;
		movwf	work3			;ワーク
		clrf	disp_flg		;初期設定
		bsf	STATUS,C		;
						;
tgpdsp01	rrf	disp_flg,F		;LED 表示フラグを設定
		decfsz	work3,F			;work3 - 1 = 0 か？
		goto	tgpdsp01		;No

		return

;--------------------------------------------------------------------------
;	     SET スイッチの処理 ... 年月日,時分秒の設定から CALL
;--------------------------------------------------------------------------

dtaj_set_switch		;-------

		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swSET		;再度 SET スイッチ = ON か？
		goto	dtaset01		;No

		incf	targ_flg,F		;対象の位置ポインタ + 1
		movf	targ_flg,W
		andlw	h'07'
		sublw	3
		btfsc	STATUS,Z		;targ_flg.2-0 = 3 か？
		bsf	targ_flg,5		;Yes. 時分秒に変更指示フラグ = ON
		bsf	targ_flg,7		;対象位置の変更フラグ        = ON

dtaset01	btfss	PORTA,_swSET		;SET スイッチ = OFF か？
		goto	$ - 1			;No

		call	wait_30ms		;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;	     UP スイッチの処理 ... 年月日,時分秒の設定から CALL
;--------------------------------------------------------------------------

dtaj_up_switch		;-------

		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swUP		;再度 UP スイッチ = ON か？
		goto	dtaup07			;No

		bsf	targ_flg,4		;対象の位置のデータ変更フラグ = ON
		bsf	targ_flg,3		;RTC 更新指示フラグ           = ON
		movf	targ_flg,W
		andlw	h'07'
		movwf	work3
		btfss	STATUS,Z		;targ_flg.2-0 = 0 か？
		goto	dtaup01			;No

		call	bcd_yl_inc		;年 BCD カウンタのインクリメント
		goto	dtaup03

dtaup01		movlw	1
		subwf	work3,W
		btfss	STATUS,Z		;targ_flg.2-0 = 1 か？
		goto	dtaup02			;No

		call	bcd_nn_inc		;月 BCD カウンタのインクリメント
		goto	dtaup03

dtaup02		movlw	2
		subwf	work3,W
		btfss	STATUS,Z		;targ_flg.2-0 = 2 か？
		goto	dtaup04			;No

		call	bcd_dd_inc		;日 BCD カウンタのインクリメント

dtaup03		call	day_week		;該当日の曜日を取得
		movwf	bcd_ww			;曜日 BCD カウンタ
		goto	dtaup07
;
dtaup04		movlw	3
		subwf	work3,W
		btfss	STATUS,Z		;targ_flg.2-0 = 3 か？
		goto	dtaup05			;No

		call	bcd_hh_inc		;時 BCD カウンタのインクリメント
		goto	dtaup07

dtaup05		movlw	4
		subwf	work3,W
		btfss	STATUS,Z		;targ_flg.2-0 = 4 か？
		goto	dtaup06			;No

		call	bcd_mm_inc		;分 BCD カウンタのインクリメント
		goto	dtaup07

dtaup06	;	movlw	5
	;	subwf	work3,W
	;	btfss	STATUS,Z		;targ_flg.2-0 = 5 か？
	;	goto	dtaup07			;No

		call	bcd_ss_inc		;秒 BCD カウンタのインクリメント

dtaup07	;	btfss	PORTA,_swUP		;UP スイッチ = OFF か？
	;	goto	$ - 1			;No

		call	wait_200ms		;早送りの速度調整
		return

;--------------------------------------------------------------------------
;	    DOWN スイッチの処理 ... 年月日,時分秒の設定から CALL
;--------------------------------------------------------------------------

dtaj_down_switch	;-------

		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swDWN		;再度 DOWN スイッチ = ON か？
		goto	dtadwn07		;No

		bsf	targ_flg,4		;対象の位置のデータ変更フラグ = ON
		bsf	targ_flg,3		;RTC 更新指示フラグ           = ON
		movf	targ_flg,W
		andlw	h'07'
		movwf	work3
		btfss	STATUS,Z		;targ_flg.2-0 = 0 か？
		goto	dtadwn01		;No

		call	bcd_yl_dec		;年 BCD カウンタのデクリメント
		goto	dtadwn03

dtadwn01	movlw	1
		subwf	work3,W
		btfss	STATUS,Z		;targ_flg.2-0 = 1 か？
		goto	dtadwn02		;No

		call	bcd_nn_dec		;月 BCD カウンタのデクリメント
		goto	dtadwn03

dtadwn02	movlw	2
		subwf	work3,W
		btfss	STATUS,Z		;targ_flg.2-0 = 2 か？
		goto	dtadwn04		;No

		call	bcd_dd_dec		;日 BCD カウンタのデクリメント

dtadwn03	call	day_week		;該当日の曜日を取得
		movwf	bcd_ww			;曜日 BCD カウンタ
		goto	dtadwn07
;
dtadwn04	movlw	3
		subwf	work3,W
		btfss	STATUS,Z		;targ_flg.2-0 = 3 か？
		goto	dtadwn05		;No

		call	bcd_hh_dec		;時 BCD カウンタのデクリメント
		goto	dtadwn07

dtadwn05	movlw	4
		subwf	work3,W
		btfss	STATUS,Z		;targ_flg.2-0 = 4 か？
		goto	dtadwn06		;No

		call	bcd_mm_dec		;分 BCD カウンタのデクリメント
		goto	dtadwn07

dtadwn06;	movlw	5
	;	subwf	work3,W
	;	btfss	STATUS,Z		;targ_flg.2-0 = 5 か？
	;	goto	dtadwn07		;No

		call	bcd_ss_dec		;秒 BCD カウンタのデクリメント

dtadwn07;	btfss	PORTA,_swDWN		;DWN スイッチ = OFF か？
	;	goto	$ - 1			;No

		call	wait_200ms		;早送りの速度調整
		return

;--------------------------------------------------------------------------
;	    BACK スイッチの処理 ... 年月日,時分秒の設定から CALL
;--------------------------------------------------------------------------

dtaj_back_switch	;-------

		call	wait_30ms		;チャッタリング吸収
		btfsc	PORTA,_swBAK		;再度 BACK スイッチ = ON か？
		goto	dtabak03		;No

		movf	targ_flg,W		;
		andlw	h'07'
		btfsc	STATUS,Z		;対象位置ポインタ = 0 か？
		goto	dtabak01		;Yes

		decf	targ_flg,F		;対象位置ポインタ - 1
		andlw	h'07'
		sublw	2
		btfsc	STATUS,Z		;対象位置ポインタ = 2 か？
		bsf	targ_flg,6		;Yes. 年月日に変更指示フラグ = ON
		goto	dtabak02

dtabak01	movlw	5			;
		movwf	targ_flg		;最大値 targ_flg = 5 に設定
		bsf	targ_flg,5		;時分秒に変更指示フラグ = ON

dtabak02	bsf	targ_flg,7		;対象位置の変更フラグ   = ON

dtabak03	btfss	PORTA,_swBAK		;BACK スイッチ = OFF か？
		goto	$ - 1			;No

		call	wait_30ms		;チャッタリング吸収
		return

;==========================================================================
;	    各 BCD カウンタのインクリメント / デクリメント計算
;==========================================================================
;--------------------------------------------------------------------------
;		日 BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_dd_inc
		call	month_days		;各月の日数計算
		subwf	bcd_dd,W
		btfss	STATUS,Z		;日 BCD カウンタ = 各月の最終日 か？
		goto	ddinc01			;No

		movlw	h'01'
		movwf	bcd_dd			;日 BCD カウンタ = h'01' 設定
		goto	ddinc02

ddinc01		movlw	high bcd_dd		;日 BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low bcd_dd		;
		movwf	FSR0L			;間接アドレスに設定
		call	inc_bcd			;BCD インクリメント

ddinc02		return

;--------------------------------------------------------------------------

;		各月の日数計算

month_days
		movlw	h'02'
		subwf	bcd_nn,W
		btfss	STATUS,Z		;月 BCD カウンタ = h'02' か？
		goto	mday02			;No

		movf	bcd_yl,W		;年(下位2桁) BCD カウンタ
		movwf	cur_yl
		movf	bcd_yh,W		;年(上位2桁) BCD カウンタ
		movwf	cur_yh
		call	uruu_check		;平年／閏年の判定
		btfss	uru_flg,0		;閏年 か？
		goto	mday01			;No

		movlw	h'29'			;閏年 2月
		goto	mday04

mday01		movlw	h'28'			;平年 2月
		goto	mday04

mday02		movlw	h'04'
		subwf	bcd_nn,W
		btfsc	STATUS,Z		;月 BCD カウンタ = h'04' か？
		goto	mday03			;Yes

		movlw	h'06'
		subwf	bcd_nn,W
		btfsc	STATUS,Z		;月 BCD カウンタ = h'06' か？
		goto	mday03			;Yes

		movlw	h'09'
		subwf	bcd_nn,W
		btfsc	STATUS,Z		;月 BCD カウンタ = h'09' か？
		goto	mday03			;Yes

		movlw	h'11'
		subwf	bcd_nn,W
		btfsc	STATUS,Z		;月 BCD カウンタ = h'11' か？
		goto	mday03			;Yes

		movlw	h'31'			;h'01', h'03', h'05', h'07', h'08', h'10', h'12'
		goto	mday04

mday03		movlw	h'30'			;h'04', h'06', h'09', h'11'

mday04		return

;--------------------------------------------------------------------------

;		平年／閏年の判定

uruu_check
		clrf	uru_flg			;平年に設定

		movf	cur_yl,W		;年(下位2桁)(変) BCD カウンタ
		call	bcd2_to_binary		;BCD (2桁) からバイナリ変換
		andlw	h'03'			;下位2ビット
		btfss	STATUS,Z		;下位2ビット = b'00' か？
		goto	uru02			;No. 平年 ... 4で割れない

		movf	cur_yl,W
		btfss	STATUS,Z		;年(下位2桁)(変) BCD カウンタ = h'00' か？
		goto	uru01			;No. 閏年 ... 100で割れない

		movf	cur_yh,W		;年(上位2桁)(変) BCD カウンタ
		call	bcd2_to_binary		;BCD (2桁) からバイナリ変換
		andlw	h'03'			;下位2ビット
		btfss	STATUS,Z		;下位2ビット = b'00' か？
		goto	uru02			;No. 平年 ... 400で割れない

uru01		bsf	uru_flg,0		;閏年に設定

uru02		return

;--------------------------------------------------------------------------

;		BCD (2桁) からバイナリ変換

bcd2_to_binary
		movwf	work2			;退避
		swapf	work2,W			;上位4ビット(10位)を BCD からバイナリ変換
		andlw	h'0f'
		movwf	work1
		lslf	work1,F			;2倍
		rlf	work1,F			;4倍
		addwf	work1,F			;5倍
		rlf	work1,F			;10倍

		movf	work2,W			;下位4ビット(単位)
		andlw	h'0f'
		addwf	work1,W			;10位 + 単位 = W レジスタ
		return

;--------------------------------------------------------------------------
;		月 BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_nn_inc
		movlw	high bcd_nn		;月 BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low bcd_nn		;
		movwf	FSR0L			;間接アドレスに設定
		call	inc_bcd			;BCD インクリメント

		movlw	h'13'
		subwf	bcd_nn,W
		btfss	STATUS,Z		;月 BCD カウンタ = h'13' か？
		goto	nninc01			;No

		movlw	h'01'
		movwf	bcd_nn			;月 BCD カウンタ = h'01' 設定

nninc01		return

#ifdef comment
;--------------------------------------------------------------------------
;		年(4桁) BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_yyyy_inc
		call	bcd_yl_inc		;年(下位2桁) BCD カウンタのインクリメント
		btfss	STATUS,C		;年(下位2桁) BCD カウンタ >= 'a0' か？
		goto	yyinc01			;No

		call	bcd_yh_inc		;年(上位2桁) BCD カウンタのインクリメント
		btfss	STATUS,C		;年(上位2桁) BCD カウンタ >= 'a0' か？
		goto	yyinc01			;No

		movlw	h'01'
		movwf	bcd_yl			;9999 → (0000) → 0001

yyinc01		return
#endif

;--------------------------------------------------------------------------
;		年(下位2桁) BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_yl_inc
		movlw	high bcd_yl		;年(下位2桁) BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low bcd_yl		;
		movwf	FSR0L			;間接アドレスに設定
		call	inc_bcd			;BCD インクリメント

		movlw	h'a0'
		subwf	bcd_yl,W
		btfss	STATUS,Z		;年(下位2桁) BCD カウンタ = 'a0' か？
		goto	ylinc01			;No

		clrf	bcd_yl			;年(下位2桁) BCD カウンタ = h'00' 設定

ylinc01		return

#ifdef comment
;--------------------------------------------------------------------------
;		年(上位2桁) BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_yh_inc
		movlw	high bcd_yh		;年(上位2桁) BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low bcd_yh		;
		movwf	FSR0L			;間接アドレスに設定
		call	inc_bcd			;BCD インクリメント

		movlw	h'a0'
		subwf	bcd_yh,W
		btfss	STATUS,Z		;年(上位2桁) BCD カウンタ = 'a0' か？
		goto	yhinc01			;No

		clrf	bcd_yh			;年(上位2桁) BCD カウンタ = h'00' 設定

yhinc01		return
#endif

;--------------------------------------------------------------------------
;		日 BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_dd_dec
		decf	bcd_dd,F		;日 BCD カウンタ -1 更新
		btfss	STATUS,Z		;日 BCD カウンタ = h'00' か？
		goto	dddec01			;No

		call	month_days		;各月の日数計算
		movwf	bcd_dd			;日 BCD カウンタ 設定
		goto	dddec02

dddec01		movf	bcd_dd,W
		andlw	h'0f'			;下位4ビット
		sublw	h'0f'
		btfss	STATUS,Z		;下位4ビット = h'0f' か？
		goto	dddec02			;No

		movlw	h'06'
		subwf	bcd_dd,F		;日 BCD カウンタ 更新

dddec02		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' か？
		goto	nndec03			;No

		movlw	h'09'

nndec02		movwf	bcd_nn			;月 BCD カウンタの設定

nndec03		return

#ifdef comment
;--------------------------------------------------------------------------
;		年(4桁) BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_yyyy_dec
		call	bcd_yl_dec		;年(下位2桁) BCD カウンタのデクリメント
		movf	bcd_yl,W
		btfsc	STATUS,Z		;年(下位2桁) BCD カウンタ <> '00' か？
		goto	yydec01			;No
		
		movlw	h'99'
		subwf	bcd_yl,W
		btfss	STATUS,Z		;年(下位2桁) BCD カウンタ = '99' か？
		goto	yydec02			;No

		call	bcd_yh_dec		;年(上位2桁) BCD カウンタのデクリメント
		goto	yydec02

yydec01		movf	bcd_yh,W
		btfss	STATUS,Z		;年(上位2桁) BCD カウンタ = '00' か？
		goto	yydec02			;No

		movlw	h'99'
		movwf	bcd_yh
		movwf	bcd_yl			;0001 → (0000) → 9999

yydec02		return
#endif

;--------------------------------------------------------------------------
;		年(下位2桁) BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_yl_dec
		decf	bcd_yl,F		;年(下位2桁) BCD カウンタ -1 更新
		incf	bcd_yl,W
		btfss	STATUS,Z		;年(下位2桁) BCD カウンタ = h'ff' か？
		goto	yldec01			;No

		movlw	h'66'
		subwf	bcd_yl,F		;年(下位2桁) BCD カウンタ 更新
		goto	yldec02

yldec01		movf	bcd_yl,W
		andlw	h'0f'			;下位4ビット
		sublw	h'0f'
		btfss	STATUS,Z		;下位4ビット = h'0f' か？
		goto	yldec02			;No

		movlw	h'06'
		subwf	bcd_yl,F		;年(下位2桁) BCD カウンタ 更新

yldec02		return

#ifdef comment
;--------------------------------------------------------------------------
;		年(上位2桁) BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_yh_dec
		decf	bcd_yh,F		;年(上位2桁) BCD カウンタ -1 更新
		incf	bcd_yh,W
		btfss	STATUS,Z		;年(上位2桁) BCD カウンタ = h'ff' か？
		goto	yhdec01			;No

		movlw	h'66'
		subwf	bcd_yh,F		;年(上位2桁) BCD カウンタ 更新
		goto	yhdec02

yhdec01		movf	bcd_yh,W
		andlw	h'0f'			;下位4ビット
		sublw	h'0f'
		btfss	STATUS,Z		;下位4ビット = h'0f' か？
		goto	yhdec02			;No

		movlw	h'06'
		subwf	bcd_yh,F		;年(上位2桁) BCD カウンタ 更新

yhdec02		return	
#endif

;--------------------------------------------------------------------------
;		秒 BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_ss_inc
		movlw	high bcd_ss		;秒 BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low bcd_ss		;
		movwf	FSR0L			;間接アドレスに設定
		call	inc_bcd			;BCDインクリメント
		movlw	h'60'
		subwf	bcd_ss,W
		btfsc	STATUS,C		;秒 BCD カウンタ < h'60' か？
		clrf	bcd_ss			;No. 秒 BCD カウンタのクリア
		return

;--------------------------------------------------------------------------
;		分 BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_mm_inc
		movlw	high bcd_mm		;分 BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low bcd_mm		;
		movwf	FSR0L			;間接アドレスに設定
		call	inc_bcd			;BCDインクリメント
		movlw	h'60'
		subwf	bcd_mm,W
		btfsc	STATUS,C		;分 BCD カウンタ < h'60' か？
		clrf	bcd_mm			;No. 分 BCD カウンタのクリア
		return

bcd_mm_inc2
		movlw	high temp_mm		;分 BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low temp_mm		;
		movwf	FSR0L			;間接アドレスに設定
		call	inc_bcd			;BCDインクリメント
		movlw	h'60'
		subwf	temp_mm,W
		btfsc	STATUS,C		;分 BCD カウンタ < h'60' か？
		clrf	temp_mm			;No. 分 BCD カウンタのクリア
		return

;--------------------------------------------------------------------------
;		時 BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_hh_inc
		movlw	high bcd_hh		;時 BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low bcd_hh		;
		movwf	FSR0L			;間接アドレスに設定
		call	inc_bcd			;BCDインクリメント
		movlw	h'24'
		subwf	bcd_hh,W
		btfsc	STATUS,C		;時 BCD カウンタ < h'24' か？
		clrf	bcd_hh			;No. 時 BCD カウンタのクリア
		return

bcd_hh_inc2
		movlw	high temp_hh		;時 BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low temp_hh		;
		movwf	FSR0L			;間接アドレスに設定
		call	inc_bcd			;BCDインクリメント
		movlw	h'24'
		subwf	temp_hh,W
		btfsc	STATUS,C		;時 BCD カウンタ < h'24' か？
		clrf	temp_hh			;No. 時 BCD カウンタのクリア
		return

;--------------------------------------------------------------------------
;		秒 BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_ss_dec
		movlw	high bcd_ss		;秒 BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low bcd_ss		;
		movwf	FSR0L			;間接アドレスに設定
		call	dec_bcd			;BCDデクリメント
		movlw	h'f9'			;h'00' - h'01' - h'06'
		subwf	bcd_ss,W
		btfss	STATUS,Z		;秒 BCD カウンタ = h'f9' か？
		goto	ssdec01			;No

		movlw	h'59'
		movwf	bcd_ss			;秒 BCD カウンタ = h'59' 設定

ssdec01		return

;--------------------------------------------------------------------------
;		分 BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_mm_dec
		movlw	high bcd_mm		;分 BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low bcd_mm		;
		movwf	FSR0L			;間接アドレスに設定
		call	dec_bcd			;BCDデクリメント
		movlw	h'f9'			;h'00' - h'01' - h'06'
		subwf	bcd_mm,W
		btfss	STATUS,Z		;分 BCD カウンタ = h'f9' か？
		goto	mmdec01			;No

		movlw	h'59'
		movwf	bcd_mm			;分 BCD カウンタ = h'59' 設定

mmdec01		return

bcd_mm_dec2
		movlw	high temp_mm		;分 BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low temp_mm		;
		movwf	FSR0L			;間接アドレスに設定
		call	dec_bcd			;BCDデクリメント
		movlw	h'f9'			;h'00' - h'01' - h'06'
		subwf	temp_mm,W
		btfss	STATUS,Z		;分 BCD カウンタ = h'f9' か？
		goto	mdec201			;No

		movlw	h'59'
		movwf	temp_mm			;分 BCD カウンタ = h'59' 設定

mdec201		return

;--------------------------------------------------------------------------
;		時 BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_hh_dec
		movlw	high bcd_hh		;時 BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low bcd_hh		;
		movwf	FSR0L			;間接アドレスに設定
		call	dec_bcd			;BCDデクリメント
		movlw	h'f9'			;h'00' - h'01' - h'06'
		subwf	bcd_hh,W
		btfss	STATUS,Z		;時 BCD カウンタ = h'f9' か？
		goto	hhdec01			;No

		movlw	h'23'
		movwf	bcd_hh			;時 BCD カウンタ = h'23' 設定

hhdec01		return

bcd_hh_dec2
		movlw	high temp_hh		;時 BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low temp_hh		;
		movwf	FSR0L			;間接アドレスに設定
		call	dec_bcd			;BCDデクリメント
		movlw	h'f9'			;h'00' - h'01' - h'06'
		subwf	temp_hh,W
		btfss	STATUS,Z		;時 BCD カウンタ = h'f9' か？
		goto	hdec201			;No

		movlw	h'23'
		movwf	temp_hh			;時 BCD カウンタ = h'23' 設定

hdec201		return

;--------------------------------------------------------------------------

;		BCD インクリメント

inc_bcd
		incf	INDF0,F			;BCD カウンタ +1 更新
		movf	INDF0,W
		andlw	h'0f'			;下位4ビット
		sublw	h'0a'
		btfss	STATUS,Z		;下位4ビット = d'10' か？
		return				;No

		movlw	h'06'
		addwf	INDF0,F			;下位4ビット = 0, 上位4ビット = +1
		return

;--------------------------------------------------------------------------

;		BCD デクリメント

dec_bcd
		movf	INDF0,W
		andlw	h'0f'			;下位4ビット
		btfsc	STATUS,Z		;下位4ビット <> h'00' か？
		goto	dec01			;No

		decf	INDF0,F			;-1 更新
		return

dec01		decf	INDF0,F			;-1 更新
		movlw	h'06'
		subwf	INDF0,F			;下位4ビット = 9
		return

;--------------------------------------------------------------------------
;		該当日の曜日を取得
;--------------------------------------------------------------------------

; 入力:		bcd_yh: 年(上位2桁)_BCD カウンタ, bcd_yl: 年(下位2桁)_BCD カウンタ,
;		bcd_nn: 月_BCD カウンタ, bcd_dd: 日_BCD カウンタ

; 出力:		cur_week: ( 0:日, 1:月, 2:火, 3:水, 4:木, 5:金, 6:土 )
;  (+1して出力)	cur_week: ( 1:日, 2:月, 3:火, 4:水, 5:木, 6:金, 7:土 )

; ワーク:	cur_yh, cur_yl, xxx_yh, work2
; call:		bcd2_to_binary, uruu_check, inc_bcd, month_day2

day_week
		movlw	h'01'
		movwf	cur_yl			;西暦元年 = '0001' とする
		clrf	cur_yh			;

		movlw	h'01'
		movwf	cur_week		;初期設定 (西暦元年1月1日 = 月曜日 とする)

		; 年の変換 (400年後毎の同月同日は同じ曜日)

		movf	bcd_yh,W		;年(上位2桁)_BCD カウンタ
		call	bcd2_to_binary		;バイナリ変換
		movwf	xxx_yh			;
						;
dweek01		movlw	4			;
		subwf	xxx_yh,W		;
		btfss	STATUS,C		;xxx_yh < 4 か？
		goto	dweek03			;Yes
						;
		btfss	STATUS,Z		;xxx_yh = 4 か？
		goto	dweek02			;No
						;
		movf	bcd_yl,W		;
		btfsc	STATUS,Z		;bcd_yl = 0 か？
		goto	dweek03			;Yes
						;
dweek02		movlw	4			;
		subwf	xxx_yh,F		;
		goto	dweek01			;

		; 年の計算

dweek03		movf	bcd_yl,W		;年(下位2桁)_BCD カウンタ
		subwf	cur_yl,W
		btfss	STATUS,Z		;cur_yl = bcd_yl か？
		goto	dweek04			;No

		movf	xxx_yh,W		;xxx_yh =< 4 (400年以下に変換)
		subwf	cur_yh,W
		btfsc	STATUS,Z		;cur_yh = xxx_yh か？
		goto	dweek05			;Yes

dweek04		movlw	365 % 7			;365 % 7 = 365 - 7 * 52 = 1
		addwf	cur_week,F
		call	uruu_check		;平年／閏年の判定
		btfsc	uru_flg,0		;平年 か？
		incf	cur_week,F		;No. 閏年

		movlw	7
		subwf	cur_week,W
		btfsc	STATUS,C		;cur_week < 7 か？
		movwf	cur_week		;No

		movlw	high cur_yl		;年(下位2桁)(変) BCD カウンタの番地
		movwf	FSR0H			;
		movlw	low cur_yl		;
		movwf	FSR0L			;間接アドレスに設定
		call	inc_bcd			;BCD インクリメント

		movlw	h'a0'
		subwf	cur_yl,W
		btfss	STATUS,Z		;年(下位2桁)(変) BCD カウンタ = h'a0' か？
		goto	dweek03			;No

		clrf	cur_yl			;年(下位2桁)(変) BCD カウンタ = h'00' 設定

		movlw	low cur_yh		;年(上位2桁)(変) BCD カウンタの番地
		movwf	FSR0L			;間接アドレスに設定
		call	inc_bcd			;BCD インクリメント
		goto	dweek03

		; 月の計算

dweek05		movlw	h'01'
		movwf	cur_nn			;月(変) BCD カウンタ

dweek06		movf	bcd_nn,W		;月_BCD カウンタ
		subwf	cur_nn,W
		btfsc	STATUS,Z		;cur_nn = bcd_nn か？
		goto	dweek08			;Yes

		movf	cur_nn,W
		call	bcd2_to_binary		;BCD (2桁) からバイナリ変換
		movwf	work2			;退避
		call	month_day2		;月データのテーブル読み出し
		addwf	cur_week,F
		movlw	h'02'
		subwf	cur_nn,W
		btfss	STATUS,Z		;cur_nn = 2 か？
		goto	dweek07			;No

		call	uruu_check		;平年／閏年の判定
		btfsc	uru_flg,0		;平年 か？
		incf	cur_week,F		;No. 閏年

dweek07		movlw	7
		subwf	cur_week,W
		btfsc	STATUS,C		;cur_week < 7 か？
		movwf	cur_week		;No

		movlw	low cur_nn		;月(変) BCD カウンタの番地
		movwf	FSR0L			;間接アドレスに設定
		call	inc_bcd			;BCD インクリメント
		goto	dweek06

		; 日の計算

dweek08		movf	bcd_dd,W		;日_BCD カウンタ
		call	bcd2_to_binary		;BCD (2桁) からバイナリ変換
		addwf	cur_week,F
		decf	cur_week,F		;-1（当日分）

dweek09		movlw	7
		subwf	cur_week,W
		btfss	STATUS,C		;cur_week < 7 か？
		goto	dweek10			;Yes

		movwf	cur_week		;No
		goto	dweek09

dweek10		incf	cur_week,F		;0～6 → 1～7 に変換

		movf	cur_week,W		;;
		return

;--------------------------------------------------------------------------

month_day2
		decf	work2,W
		movwf	addr_low
		movlw	high day_tbl
		movwf	addr_high		;先頭 high アドレス
		movlw	low day_tbl
		addwf	addr_low,F		;先頭 low アドレス
		btfsc	STATUS,C		;オーバーフローした場合は
		incf	addr_high,F		;high アドレスの更新
;		call	day_read		;day_tbl データの読み出し
;		return

;day_read
		movf	addr_high,W		;文字フォントデータの high アドレス
		movwf	PCLATH
		movf	addr_low,W		;文字フォントデータの low アドレス
		movwf	PCL

day_tbl		retlw	31 % 7			; 1:  31 % 7 = 3
		retlw	28 % 7			; 2:  28 % 7 = 0
		retlw	31 % 7			; 3:  31 % 7 = 3
		retlw	30 % 7			; 4:  30 % 7 = 2
		retlw	31 % 7			; 5:  31 % 7 = 3
		retlw	30 % 7			; 6:  30 % 7 = 2
		retlw	31 % 7			; 7:  31 % 7 = 3
		retlw	31 % 7			; 8:  31 % 7 = 3
		retlw	30 % 7			; 9:  30 % 7 = 2
		retlw	31 % 7			;10:  31 % 7 = 3
		retlw	30 % 7			;11:  30 % 7 = 2
;		retlw	31 % 7			;12:  31 % 7 = 3  (使用しない)

;==========================================================================
;		時報音出力コントロール
;==========================================================================

;  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 )

;--------------------------------------------------------------------------

;		時報音出力コントロール	

time_signal		;-------

;		btfss	alm_flg,7		;アラーム音出力許可1フラグ = ON か？
;		goto	ts102			;No

		btfss	alm_flg,6		;アラーム音出力許可2フラグ = ON か？
		goto	ts102			;No

		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	ts102			;No

		; "プッ"			;時報予報音 (440Hz)
;		call	buzzer_pu		;"プッ"
		bsf	alm_flg,2		;時報予報音フラグのセット
		goto	ts102

ts101		movf	bcd_ss,W
		iorwf	bcd_mm,W
		btfss	STATUS,Z		;bcd_ss = bcd_mm = h'00' か？
		goto	ts102			;No

		; "ポッ～～ン"			;時報正報音 (880Hz)
;		call	buzzer_poon		;"ポッ～～ン"
		bsf	alm_flg,3		;時報正報音フラグのセット

ts102		bcf	alm_flg,6		;アラーム音出力許可2フラグ = OFF
		return

;--------------------------------------------------------------------------
;		アラームフラグの監視とアラーム音出力
;--------------------------------------------------------------------------

; alm_flg: アラームフラグ
;		┌───────────  signal_switch で設定
;		│┌──────────  interrupt で設定
;		││　　　 ┌────── time_signal で設定	
;		││　　　┌┐
;		ｘｘ００．ｘｘ００
;		││　　　│└───── 時報予報音フラグ	;"プッ"
;		││　　　└────── 時報正報音フラグ	;"ポッ～～ン"
;		│└────────── アラーム音出力許可2フラグ
;		└─────────── アラーム音出力許可1フラグ

;--------------------------------------------------------------------------

alarm_sound		;-------

		movlw	h'3f'
		andwf	alm_flg,W
		btfsc	STATUS,Z		;どれかアラームフラグ = ON か？
		goto	alarm03			;No

		btfss	alm_flg,2		;時報予報音フラグ = ON か？
		goto	alarm01			;No

		call	buzzer_pu		;"プッ" ブザー音出力 (100 mS)
		goto	alarm02

alarm01		btfss	alm_flg,3		;時報正報音フラグ = ON か？
		goto	alarm03			;No

		call	buzzer_poon		;"ポッ～～ン" ブザー音出力 (1000 mS)
		bcf	PORTB,_BZ		;ブザー出力ビットを "L" にしておく

alarm02		movlw	h'80'
		andwf	alm_flg,F		;アラームフラグをクリア

alarm03		return

;==========================================================================
;		アラーム（ブザー）音出力ルーチン
;==========================================================================

		; 時報予報音 "プッ" ブザー音出力 (100 mS)
buzzer_pu
		Sound_M		f_ra, 100
		return

		; 時報正報音 "ポッ～～ン" ブザー音出力 (1000 mS)
buzzer_poon
		call	buzzer_po_1_4
		call	buzzer_po_1_4
		call	buzzer_po_1_4

		; "ポッ～～ン" 1/4 ブザー音出力
buzzer_po_1_4
		Sound_M		f_rah, 250
		return

		;"ピピピッ" ブザー音 (360 mS)
buzzer_pipipi
		call	buzzer_pi		;"ピッ" ブザー音出力
		call	wait_30ms

		;"ピピッ" ブザー音 (230 mS)
buzzer_pipi
		call	buzzer_pi		;"ピッ" ブザー音出力
		call	wait_30ms

		; "ピッ" ブザー音出力 (100 mS)
buzzer_pi
		Sound_M		f_so, pi_tim
		return

		; "ピッ" ブザー音出力 (50 mS)
buzzer_pi5
		Sound_M		f_so, 50
		return

		; "ピポッピポッ" ブザー音出力 (490 mS)
buzzer_pipo2
		call	buzzer_pipo		;"ピポッ" ブザー音出力
		call	wait_30ms

		; "ピポッ" ブザー音出力 (230 mS)
buzzer_pipo
		call	buzzer_pi		;"ピッ" ブザー音出力
		call	wait_30ms

		; "ポッ" ブザー音出力 (100 mS)
buzzer_po
		Sound_M		f_doh, po_tim
		return

		; "ブッ" ブザー音出力 (100 mS)
buzzer_bu
		Sound_M		f_do, bu_tim
		return

		; "ブー" ブザー音出力 (250 mS)
buzzer_buu
		Sound_M		f_do, buu_tim
		return

		; "ブッブー" ブザー音出力 (450 mS)
buzzer_bubuu
		call	buzzer_bu		;"ブッ" ブザー音出力
		call	wait_100ms
		call	buzzer_buu		;"ブー" ブザー音出力
		return

		; ブザー音出力コントロール
buzzer_control
		movlb	1			;バンク 1
		bsf	PIE1,TMR1IE		;タイマー１割り込みを許可
		movlb	0			;バンク 0

		call	wait_xxms		;入力 W: 音長（ループカウンタ）

		movlb	1			;バンク 1
		bcf	PIE1,TMR1IE		;タイマー１割り込みを禁止
		movlb	0			;バンク 0

						;常時に "ジー" という異音防止のため
		btfss	alm_flg,3		;時報正報音フラグ = ON のとき以外は
		bcf	PORTB,_BZ		;ブザー出力ビットを "L" にしておく
		return

;==========================================================================
;		ウェイト・ルーチン (8 MHz)
;==========================================================================

		; 10μ秒 ウェイトルーチン
wait_10us
		movlw	4			;1
		movwf	wt1cnt			;1
wu03		nop				;1
		decfsz	wt1cnt,F		;1,2
		goto	wu03			;2,0	1+1+(1+1+2)*3+(1+2+0)=17
		nop				;1
		return				;2	17+1+2=20
						;Total	20/8MHz*4 = 10 μS

		; 10m 秒 ウェイトルーチン
wait_10ms
		movlw	10
		goto	wait_xxms

		; 20m 秒 ウェイトルーチン
wait_20ms
		movlw	20
		goto	wait_xxms

		; 30m 秒 ウェイトルーチン
wait_30ms
		movlw	30
		goto	wait_xxms

		; 50m 秒 ウエイト
wait_50ms
		movlw	50
		goto	wait_xxms

		; 100m 秒 ウェイトルーチン
wait_100ms
		movlw	100
		goto	wait_xxms

		; 200m 秒 ウェイトルーチン
wait_200ms
		movlw	200
		goto	wait_xxms

		; 500m 秒 ウェイトルーチン
wait_500ms
		movlw	5
		goto	w1s01

		; 1 秒 ウェイトルーチン
wait_1sec
		movlw	10
		goto	w1s01

		; 1.5 秒 ウェイトルーチン
wait_1_5sec
		movlw	15
		goto	w1s01

		; 3 秒 ウェイトルーチン
wait_3sec
		movlw	30

w1s01		movwf	wt3cnt

w1s02		call	wait_100ms
		decfsz	wt3cnt,F
		goto	w1s02
		return

		; 1m 秒 ウェイトルーチン
wait_1ms
		movlw	1

		; xx m 秒（ 1m 秒 x W ）ウェイトルーチン
wait_xxms
		movwf	wt2cnt			;1

w1m01		movlw	221			;1
		movwf	wt1cnt			;1

w1m02		goto	$ + 1			;2
		goto	$ + 1			;2
		goto	$ + 1			;2
		decfsz	wt1cnt,F		;1,2
		goto	w1m02			;2,0	(2+2+2+1+2)*220+(2+2+2+2+0)=1988

		nop				;1
		goto	$ + 1			;2
		goto	$ + 1			;2
		decfsz	wt2cnt,F		;1,2
		goto	w1m01			;2,0	(1+1+1988+1+2+2+1+2)*(W-1)+(1+1+1988+1+2+2+2+0)=1998*W-1

		return				;2	1+(1998*W-1)+2=1998*W+2
						;Total	(1998*W+2)/8MHz*4 = (999*W + 1) μS

;==========================================================================
;		各種の演算、データ変換サブルーチン
;==========================================================================

;--------------------------------------------------------------------------
;		16 ＋ 16 ＝ 16 ビットの加算
;--------------------------------------------------------------------------

;	(a16_hi,a16_lo) + (b16_hi,b16_lo) = (a16_hi,a16_lo)

; 使用変数:	a16_hi, a16_lo: 足される数の上,下位	(終了時に答えが返る)
;		b16_hi, b16_lo: 足す数の    上,下位	(終了時に変化しない)

add_16		;----------------------------------------------------------

		movf	b16_lo,W		;下位
		addwf	a16_lo,F
		movf	b16_hi,W		;上位
		addwfc	a16_hi,F

		return

;--------------------------------------------------------------------------
;		16 － 16 ＝ 16 ビットの減算
;--------------------------------------------------------------------------

;	(a16_hi,a16_lo) - (b16_hi,b16_lo) = (a16_hi,a16_lo)

; 使用変数:	a16_hi, a16_lo: 引かれる数の上,下位	(終了時に答えが返る)
;		b16_hi, b16_lo: 引く数の    上,下位	(終了時に変化しない)

sub_16		;----------------------------------------------------------

		movf	b16_lo,W		;下位
		subwf	a16_lo,F
		movf	b16_hi,W		;上位
		subwfb	a16_hi,F

		return

;--------------------------------------------------------------------------
;		16 ÷ 16 ＝ 16 ビットの割り算
;--------------------------------------------------------------------------

;	(a16_hi,a16_lo) ÷ (b16_hi,b16_lo) = (x16_hi,x16_lo) … (y16_hi,y16_lo) 

; 使用変数:	a16_hi, a16_lo: 割られる数の上,下位	(終了時は０になる)
;		b16_hi, b16_lo: 割る数の    上,下位	(終了時に変化しない)
;		x16_hi, x16_lo: 答えの      上,下位	(答えが返る)
;		y16_hi, y16_lo: 余りの      上,下位	(余りが返る、ワークにも使用)
;		lcnt1,  lcnt2:  ループカウンタ
;		C フラグ:	エラーフラグ		(割る数が０であった場合 C=1)

div_16		;----------------------------------------------------------

		movlw	16
		movwf	lcnt1			;ループカウンタ1
		movf	b16_lo,W		;割る数下位をワークにコピー
		movwf	y16_lo
		movf	b16_hi,W		;割る数上位をワークにコピー
		movwf	y16_hi

d16_01		rlf	y16_lo,F		;左シフトする
		rlf	y16_hi,F
		btfsc	STATUS,C		;キャリフラグを見る
		goto	d16_02			;割る数の上位ビット位置検索

		decfsz	lcnt1,F
		goto	d16_01

		bsf	STATUS,C		;割る数が０である。エラー終了
		goto	d16_09

d16_02		clrf	x16_lo			;答え用変数のクリア
		clrf	x16_hi
		clrf	y16_lo			;ワーク変数のクリア
		clrf	y16_hi

		movlw	16
		movwf	lcnt2			;ループカウンタ2
		movf	lcnt1,W
		subwf	lcnt2,F			;残り、実ループの回数

d16_03		lslf	a16_lo,F
		rlf	a16_hi,F
		rlf	y16_lo,F
		rlf	y16_hi,F
		decfsz	lcnt1,F			;割られる数を初期位置までシフト
		goto	d16_03

d16_04		movf	b16_hi,W		;現位置での減算が可能かチェック
		subwf	y16_hi,W
		btfss	STATUS,C
		goto	d16_06

		movf	y16_hi,W
		subwf	b16_hi,W
		btfss	STATUS,C
		goto	d16_05

		movf	b16_lo,W
		subwf	y16_lo,W
		btfss	STATUS,C
		goto	d16_06

d16_05		movf	b16_lo,W
		subwf	y16_lo,F		;ワークから下位を引く
		btfss	STATUS,C		;キャリフラグが 1（正）なら次をスキップ
		decf	y16_hi,F		;上位 -1

		movf	b16_hi,W
		subwf	y16_hi,F		;ワークから上位を引く
		bsf	STATUS,C		;キャリフラグをセット
		goto	d16_07

d16_06		bcf	STATUS,C		;キャリフラグをクリア

d16_07		rlf	x16_lo,F		;キャリフラグの内容を答えにシフト
		rlf	x16_hi,F
		movf	lcnt2,F
		btfsc	STATUS,Z		;lcnt2 = 0 か？
		goto	d16_08			;Yes, 終了

		decf	lcnt2,F			;ビット位置を１つ下げる（右へ）
		lslf	a16_lo,F		;ワークへ１ビット左シフト
		rlf	a16_hi,F
		rlf	y16_lo,F
		rlf	y16_hi,F
		goto	d16_04

d16_08		bcf	STATUS,C		;正常終了

d16_09		return

;--------------------------------------------------------------------------
;		16 ビット数値を 10進数 5桁の文字列に変換（ゼロサプレス)
;--------------------------------------------------------------------------

; 使用変数:	a16_hi, a16_lo: 変換する 16 ビット数値
;		 	 work2: ワーク
;		         lpcnt: ループカウンタ
;		   buff + 0～4: 結果

bindec16cz_cnv	;----------------------------------------------------------

		movlw	high (buff+4+1)		;変換文字列の格納エリア
		movwf	FSR0H
		movlw	low (buff+4+1)
		movwf	FSR0L			;間接アドレスの設定

		call	bd16c			;(04) 最下位変換
		call	bd16c			;(03)
		call	bd16c			;(02)
		call	bd16c			;(01)
		call	bd16c			;(00) 最上位変換

		movlw	4			;
		movwf	lpcnt			;ループカウンタに設定

bd16cv01	moviw	0[FSR0]
		sublw	h'30'
		btfss	STATUS,Z		;(INDF) = h'30' か？
		goto	bd16cv02		;No

		movlw	' '
		movwi	FSR0++
		decfsz	lpcnt,F			;ループカウンタ - 1 = 0 か？
		goto	bd16cv01		;No

bd16cv02	return

		; ÷10（10で除算）
bd16c
		movlw	16			;16ビット繰り返し
		movwf	lpcnt			;ループカウンタに設定
		clrf	work2

bd16c01		lslf	a16_lo,F
		rlf	a16_hi,F
		rlf	work2,F
		movlw	-10			;-10 = h'f6'
		addwf	work2,W
		btfsc	STATUS,C		;C = 0 か？
		movwf	work2			;No
		btfsc	STATUS,C		;C = 0 か？
		incf	a16_lo,F		;No
		decfsz	lpcnt,F			;ループカウンタ - 1 = 0 か？
		goto	bd16c01			;No

		movf	work2,W			;余り
		addlw	h'30'			;文字コードに変換
		movwi	--FSR0
		return

;--------------------------------------------------------------------------
;		8 ビット数値を 10進数 3桁の文字列に変換（ゼロサプレス)
;--------------------------------------------------------------------------

; 使用変数:	         work1: 変換する 8 ビット数値
;		         work2: ワーク
;		         lpcnt: ループカウンタ
;		   buff + 0～2: 結果

bindec8cz_cnv	;----------------------------------------------------------

		movlw	high (buff+2+1)		;変換文字列の格納エリア
		movwf	FSR0H
		movlw	low (buff+2+1)
		movwf	FSR0L			;間接アドレスの設定

		call	bd8c			;(02) 最下位変換
		call	bd8c			;(01)
		call	bd8c			;(00) 最上位変換

		movlw	2			;
		movwf	lpcnt			;ループカウンタに設定

bd8cv01		moviw	0[FSR0]
		sublw	h'30'
		btfss	STATUS,Z		;(INDF) = h'30' か？
		goto	bd8cv02			;No

		movlw	' '
		movwi	FSR0++
		decfsz	lpcnt,F			;ループカウンタ - 1 = 0 か？
		goto	bd8cv01			;No

bd8cv02		return

		; ÷10（10で除算）
bd8c
		movlw	8			;8ビット繰り返し
		movwf	lpcnt			;シフトカウンタに設定
		clrf	work2			;一時余り格納場所のクリア

bd8c01		lslf	work1,F
		rlf	work2,F

		movlw	-10			;-10 = h'f6'
		addwf	work2,W
		btfsc	STATUS,C		;C = 0 か？
		movwf	work2			;No
		btfsc	STATUS,C		;C = 0 か？
		incf	work1,F			;No
		decfsz	lpcnt,F			;ループカウンタ - 1 = 0 か？
		goto	bd8c01			;No

		movf	work2,W			;余り
		addlw	h'30'			;文字コードに変換
		movwi	--FSR0
		return

;==========================================================================
;--------------------------------------------------------------------------
 		org	h'0800'			;(Page 1)
;--------------------------------------------------------------------------
;==========================================================================

;--------------------------------------------------------------------------
;		各処理別のスイッチ名の読み替え
;--------------------------------------------------------------------------

;    rtsw_sel		処理			 SW5    SW4    SW3    SW2     SW1

;	 -	メイン、処理の振り分け		  -      -      -      -      SET
;	 1	時分秒の表示			SIGNAL  ZERO    -    TMODE    EXIT
;	 2	年月日（曜日）の表示		SIGNAL   -      -      -      EXIT
;	 3	温度,湿度の表示			SIGNAL   -      -      -      EXIT
;	 4	オートモードの表示		SIGNAL (ZERO)   -   (TMODE)   EXIT
;	 5	標準文字フォントのデモ表示	  -     LEFT   DOWN    UP  EXIT/RIGHT
;	 6	プロポ文字フォントのデモ表示	  -     LEFT   DOWN    UP  EXIT/RIGHT
;	 7	かな文字フォントのデモ表示	  -     LEFT   DOWN    UP  EXIT/RIGHT
;	 8	さくらさくら／赤とんぼ		SIGNAL CHANGE  DOWN    UP     EXIT
;	 9	                      		  -      -      -      -      EXIT
;	10	                      		  -      -      -      -      EXIT
;	11	LED の輝度調節			  -      -     DOWN    UP     EXIT
;	12	年月日,時分秒の設定		  -     BACK   DOWN    UP   SET/EXIT

;==========================================================================
;	   rtsw_sel = 5:  5x7(8) 標準文字フォントのデモ表示処理
;==========================================================================

;	リニアデータメモリのサイズ: 80 * 12 + 48 = 1,008 バイト(max) ... PIC16F1709 の場合
;	linear_buff のサイズ:       1,008 - 80 * 2 = 848 バイト(BANK2～12を使用)

;#define 	linear_buff	(h'2000' + 80 * 2)	;バッファ先頭アドレス

;		先頭文字コード                       右限界文字コード                   終了文字コード
;		  |                                    |                                           |
;	          006   007   008                087   088   089   090                 097   098   099
;	 (64+1個) h'06' h'07' h'08'  ..(省略)..  h'57 'h'58' h'59' h'5a'  ..(省略)..  h'61' h'62' h'63' 
;	_ ...... _xxxxx_xxxxx_xxxxx_ .......... _xxxxx_xxxxx_xxxxx_xxxxx_ .......... _xxxxx_xxxxx_xxxxx_
;	|                                                    |
;     先頭=左限界アドレス                                  右限界アドレス
;    (h'2000' + 80 * 2)
;				x: 1個 1バイト,     _: h'00'コード(文字間の区切り)

		; 表示するフォントデータの 1/3 番目をリニアデータメモリのバッファへ展開

deployment_s1		;-------

		bcf	INTCON,IOCIE		;状態変化割り込みを禁止
		movlw	h'cf'
		andwf	scroll_flg,F		;bit5-4: データフラグ = 00: 1/3データ

		movlw	high linear_buff	;フォントデータ格納先リニアメモリバッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low linear_buff		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		; 左限界アドレスを記憶
		movf	FSR0H,W			;フォントデータ格納先リニアメモリバッファの左限界アドレス
		movwf	m_fsryh			;
		movf	FSR0L,W			;
		movwf	m_fsryl			;m_fsryh:m_fsryl に退避

		movlw	8 * 8 + 1		;ディスプレイの横幅ドット数 + 1
		movlp	high zz_buff
		call	zz_buff			;文字データに先行する h'00' コード
		movlp	high $

		movlw	h'06'		;006	;先頭文字コード
		movwf	lp_cnt4			;ループカウンタ4

		; フォントデータの格納
deps101		movf	lp_cnt4,W
		movlp	high font5s_read_buff
		call	font5s_read_buff	;標準フォントデータの読み出しとバッファへ格納
		movlp	high $

		incf	lp_cnt4,F		;文字コードを +1 更新

		movlw	h'58' + 1	;088+1	;右限界文字コード + 1	
		subwf	lp_cnt4,W
		btfss	STATUS,Z		;右限界文字コード + 1 か？
		goto	deps102			;No

		; 右限界アドレスを記憶
		movf	FSR0H,W			;フォントデータ格納先リニアメモリバッファの右限界アドレス
		movwf	m_fsrxh			;
		movf	FSR0L,W			;
		movwf	m_fsrxl			;m_fsrxh:m_fsrxl に退避
		goto	deps101

deps102		movlw	h'63' + 1	;099+1	;終了文字コード	 + 1
		subwf	lp_cnt4,W
		btfss	STATUS,Z		;文字コードの 1/3 終了 か？
		goto	deps101			;No

		movlb	7			;バンク 7
		clrf	IOCAF			;状態変化割り込みフラグをクリア
		movlb	0			;バンク 0
		bsf	INTCON,IOCIE		;状態変化割り込みを許可
		return

;--------------------------------------------------------------------------

;	リニアデータメモリのサイズ: 80 * 12 + 48 = 1,008 バイト(max) ... PIC16F1709 の場合
;	linear_buff のサイズ:       1,008 - 80 * 2 = 848 バイト(BANK2～12を使用)

;#define 	linear_buff	(h'2000' + 80 * 2)	;バッファ先頭アドレス

;     先頭文字コード              左限界文字コード    右限界文字コード              終了文字コード	
;	|                            |                            |                            |
;	078   079              088   089   090              171   172   173              182   183
;	h'4e' h'4f'  .(省略).  h'58' h'59' h'5a'  .(省略).  h'ab' h'ac' h'ad'  .(省略).  h'b6' h'b7'
;	xxxxx_xxxxx_ ........ _xxxxx_xxxxx_xxxxx_ ........ _xxxxx_xxxxx_xxxxx_ ........ _xxxxx_xxxxx_ 
;	|                            |                                  |
;     先頭アドレス                左限界アドレス              右限界アドレス
;    (h'2000' + 80 * 2)
;				x: 1個 1バイト,     _: h'00'コード(文字間の区切り)

		; 表示するフォントデータの 2/3 番目をリニアデータメモリのバッファへ展開

deployment_s2		;-------

		bcf	INTCON,IOCIE		;状態変化割り込みを禁止
		movlw	h'cf'
		andwf	scroll_flg,F
		bsf	scroll_flg,4		;bit5-4: データフラグ = 01: 2/3データ

		movlw	high linear_buff	;フォントデータ格納先リニアメモリバッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low linear_buff		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		movlw	h'4e'		;078	;先頭文字コード
		movwf	lp_cnt4			;ループカウンタ4

		; フォントデータの格納
deps201		movf	lp_cnt4,W
		movlp	high font5s_read_buff
		call	font5s_read_buff	;標準フォントデータの読み出しとバッファへ格納
		movlp	high $

		incf	lp_cnt4,F		;文字コードを +1 更新

		movlw	h'59'		;089	;左限界文字コード
		subwf	lp_cnt4,W
		btfss	STATUS,Z		;左限界文字コード か？
		goto	deps202			;No

		; 左限界アドレスを記憶
		movf	FSR0H,W			;フォントデータ格納先リニアメモリバッファの左限界アドレス
		movwf	m_fsryh			;
		movf	FSR0L,W			;
		movwf	m_fsryl			;m_fsryh:m_fsryl に退避
		goto	deps201			;

deps202		movlw	h'ac' + 1	;172+1	;右限界文字コード + 1
		subwf	lp_cnt4,W
		btfss	STATUS,Z		;右限界文字コード + 1 か？
		goto	deps203			;No

		; 右限界アドレスを記憶
		movf	FSR0H,W			;フォントデータ格納先リニアメモリバッファの右限界アドレス
		movwf	m_fsrxh			;
		movf	FSR0L,W			;
		movwf	m_fsrxl			;m_fsrxh:m_fsrxl に退避
		goto	deps201			;

deps203		movlw	h'b7' + 1	;183+1	;終了文字コード	+ 1
		subwf	lp_cnt4,W
		btfss	STATUS,Z		;文字コードの 2/3 終了 か？
		goto	deps201			;No

		movlb	7			;バンク 7
		clrf	IOCAF			;状態変化割り込みフラグをクリア
		movlb	0			;バンク 0
		bsf	INTCON,IOCIE		;状態変化割り込みを許可
		return

;--------------------------------------------------------------------------

;	リニアデータメモリのサイズ: 80 * 12 + 48 = 1,008 バイト(max) ... PIC16F1709 の場合
;	linear_buff のサイズ:       1,008 - 80 * 2 = 848 バイト(BANK2～12を使用)

;#define 	linear_buff	(h'2000' + 80 * 2)	;バッファ先頭アドレス

;     先頭文字コード                  左限界文字コード                       終了文字コード	
;	|                                          |                                    |
;	162   163   164                171   172   173   174                253   254   255
;	h'a2' h'a3' h'a4'  ..(省略)..  h'ab' h'ac' h'ad' h'ae'  ..(省略)..  h'fd' h'fe' h'ff' (1+64個)
;	xxxxx_xxxxx_xxxxx_ .......... _xxxxx_xxxxx_xxxxx_xxxxx_ .......... _xxxxx_xxxxx_xxxxx_ ...... _
;	|                                          |                                          |
;     先頭アドレス                       左限界アドレス                             右限界アドレス
;    (h'2000' + 80 * 2)
;				x: 1個 1バイト,     _: h'00'コード(文字間の区切り)

		; 表示するフォントデータの 3/3 番目をリニアデータメモリのバッファへ展開

deployment_s3		;-------

		bcf	INTCON,IOCIE		;状態変化割り込みを禁止
		movlw	h'cf'
		andwf	scroll_flg,F
		bsf	scroll_flg,5		;bit5-4: データフラグ = 10: 3/3 データ

		movlw	high linear_buff	;フォントデータ格納先リニアメモリバッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low linear_buff		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		movlw	h'a2'		;162	;先頭文字コード
		movwf	lp_cnt4			;ループカウンタ4

		; フォントデータの格納
deps301		movf	lp_cnt4,W
		movlp	high font5s_read_buff
		call	font5s_read_buff	;標準フォントデータの読み出しとバッファへ格納
		movlp	high $

		incf	lp_cnt4,F		;文字コードを +1 更新

		movlw	h'ad'		;173	;左限界文字コード	
		subwf	lp_cnt4,W
		btfss	STATUS,Z		;左限界文字コード か？
		goto	deps302			;No

		; 左限界アドレスを記憶
		movf	FSR0H,W			;フォントデータ格納先リニアメモリバッファの左限界アドレス
		movwf	m_fsryh			;
		movf	FSR0L,W			;
		movwf	m_fsryl			;m_fsryh:m_fsryl に退避
		goto	deps301			;No

deps302		movlw	low (h'ff' + 1)	;255+1	;終了文字コード	 + 1
		subwf	lp_cnt4,W
		btfss	STATUS,Z		;文字コードの 3/3 終了 か？
		goto	deps301			;No

		; 右限界アドレスを記憶
		movf	FSR0H,W			;フォントデータ格納先リニアメモリバッファの右限界アドレス
		movwf	m_fsrxh			;
		movf	FSR0L,W			;
		movwf	m_fsrxl			;m_fsrxh:m_fsrxl に退避

		movlw	8 * 8			;ディスプレイの横幅ドット数
		movlp	high zz_buff
		call	zz_buff			;文字データに後続する h'00' コード
		movlp	high $

		movlb	7			;バンク 7
		clrf	IOCAF			;状態変化割り込みフラグをクリア
		movlb	0			;バンク 0
		bsf	INTCON,IOCIE		;状態変化割り込みを許可
		return

;==========================================================================

;		先頭文字コード                       右限界文字コード                   終了文字コード
;		  |                                    |                                           |
;	          006   007   008                087   088   089   090                 097   098   099
;	 (64+1個) h'06' h'07' h'08'  ..(省略)..  h'57 'h'58' h'59' h'5a'  ..(省略)..  h'61' h'62' h'63' 
;	_ ...... _xxxxx_xxxxx_xxxxx_ .......... _xxxxx_xxxxx_xxxxx_xxxxx_ .......... _xxxxx_xxxxx_xxxxx_
;	|                                                    |
;     先頭=左限界アドレス                                  右限界アドレス

;     先頭文字コード              左限界文字コード    右限界文字コード              終了文字コード	
;	|                            |                            |                            |
;	078   079              088   089   090              171   172   173              182   183
;	h'4e' h'4f'  .(省略).  h'58' h'59' h'5a'  .(省略).  h'ab' h'ac' h'ad'  .(省略).  h'b6' h'b7'
;	xxxxx_xxxxx_ ........ _xxxxx_xxxxx_xxxxx_ ........ _xxxxx_xxxxx_xxxxx_ ........ _xxxxx_xxxxx_ 
;	|                            |                                  |
;     先頭アドレス                左限界アドレス              右限界アドレス

;     先頭文字コード                  左限界文字コード                       終了文字コード	
;	|                                          |                                    |
;	162   163   164                171   172   173   174                253   254   255
;	h'a2' h'a3' h'a4'  ..(省略)..  h'ab' h'ac' h'ad' h'ae'  ..(省略)..  h'fd' h'fe' h'ff' (1+64個)
;	xxxxx_xxxxx_xxxxx_ .......... _xxxxx_xxxxx_xxxxx_xxxxx_ .......... _xxxxx_xxxxx_xxxxx_ ...... _
;	|                                          |                                          |
;     先頭アドレス                       左限界アドレス                             右限界アドレス

;--------------------------------------------------------------------------

		; scroll_flg:	スクロールフラグ
				; bit7:   左右方向フラグ 0:左方向/1:右方向
				; bit6:   スイッチ操作無効フラグ
				; bit5-4: データフラグ 00:1/3 / 01:2/3 / 10:3/3データ
				; bit3-0: スクロール速度 (1 ～ 10)

;--------------------------------------------------------------------------

		; 標準文字フォントのデモ表示の開始

font5x7s_process	;-------

		; 変数の初期設定

		clrf	swit_flg		;スイッチフラグの初期設定
		clrf	exit_flg		;処理打ち切りフラグ = OFF

;		標準文字フォントデータのデモ表示の開始

		call	deployment_s1		;フォントデータの 1/3 番目をリニアメモリバッファへ展開

		movlw	high linear_buff	;リニアメモリバッファの先頭アドレス
		movwf	m_fsrnh			;
		movlw	low linear_buff		;
		movwf	m_fsrnl			;退避

f5x7s01		bcf	scroll_flg,7		;左右方向フラグ = 0 = LEFT
		bsf	scroll_flg,6		;スイッチ操作無効フラグ = ON

f5x7s02		movf	m_fsrnh,W		;退避したリニアメモリバッファのアドレスを復帰
		movwf	FSR1H			;
		movf	m_fsrnl,W		;
		movwf	FSR1L			;FSR1H:FSR1L 間接アドレスに設定

		movlw	high fd_buff		;フォントデータ表示バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		movlw	8 * 8			;ディスプレイの横幅ドット数
		movwf	lp_cnt4			;ループカウンタ4	

f5x7s03		moviw	FSR1++			;リニアメモリバッファデータ読み出し
		movwi	FSR0++			;表示バッファへ格納
		decfsz	lp_cnt4,F		;ループカウンタ4 - 1 = 0 か？
		goto	f5x7s03			;No

		; ディスプレイ表示の更新と スイッチの入力チェック

		movlp	high verti_horiz_conv_x8
		call	verti_horiz_conv_x8	;８桁分の縦横ビットのデータ変換
		call	dxled_display_x8	;ドットマトリクス LED ８桁分の表示
		movlp	high $
		call	scroll_speed		;スクロールの速度制御

		btfss	scroll_flg,6		;スイッチ操作無効フラグ = ON か？
		goto	f5x7s04			;No

		bcf	swit_flg,0		;強制的に RIGHT スイッチ = OFF
		bcf	swit_flg,5		;強制的に LEFT スイッチ = OFF
		bcf	scroll_flg,6		;スイッチ操作無効フラグ = OFF

f5x7s04		call	switch_check		;各スイッチの入力チェック

		btfsc	exit_flg,7		;処理打ち切りフラグ = ON か？
		goto	f5x7s11			;Yes

		btfsc	scroll_flg,7		;左右方向フラグ = 1 = RIGHT か？
		goto	f5x7s08			;Yes

		; 左方向に移動のときの リニアメモリバッファのアドレスの更新

		movlw	1			;退避したリニアメモリバッファのアドレス +1 更新
		addwf	m_fsrnl,F		;
		clrw				;
		addwfc	m_fsrnh,F		;

		movf	m_fsrnl,W
		subwf	m_fsrxl,W
		btfss	STATUS,Z		;リニアメモリバッファの右限界 low アドレス か？
		goto	f5x7s02			;No

		movf	m_fsrnh,W
		subwf	m_fsrxh,W
		btfss	STATUS,Z		;リニアメモリバッファの右限界 high アドレス か？
		goto	f5x7s02			;No

		; 現在 フォントデータが 3/3 番目のとき
		btfss	scroll_flg,5		;データフラグ 3/3 番目データ か？
		goto	f5x7s05			;No

		bsf	scroll_flg,7		;左右方向フラグ = 1 = RIGHT に変更
		bsf	scroll_flg,6		;スイッチ操作無効フラグ = ON
		goto	f5x7s02

		; 現在 フォントデータが 2/3 番目のとき
f5x7s05		btfss	scroll_flg,4		;データフラグ 2/3 番目データ か？
		goto	f5x7s06			;No

		call	deployment_s3		;フォントデータの 3/3 番目をリニアメモリバッファへ展開
		goto	f5x7s07

		; 現在 フォントデータが 1/3 番目のとき
f5x7s06		call	deployment_s2		;フォントデータの 2/3 番目をリニアメモリバッファへ展開

f5x7s07		movf	m_fsryh,W		;リニアメモリバッファの左限界アドレス
		movwf	m_fsrnh			;
		movf	m_fsryl,W		;
		movwf	m_fsrnl			;退避
		goto	f5x7s01

		; 右方向に移動のときの リニアメモリバッファのアドレスの更新

f5x7s08		movlw	1			;退避したリニアメモリバッファのアドレス -1 更新
		subwf	m_fsrnl,F		;
		clrw				;
		subwfb	m_fsrnh,F		;

		movf	m_fsrnl,W
		subwf	m_fsryl,W
		btfss	STATUS,Z		;リニアメモリバッファの左限界アドレス low アドレス か？
		goto	f5x7s02			;No

		movf	m_fsrnh,W
		subwf	m_fsryh,W
		btfss	STATUS,Z		;リニアメモリバッファの左限界アドレス high アドレス か？
		goto	f5x7s02			;No

		; 現在 フォントデータが 1/3 番目のとき
		movlw	h'30'
		andwf	scroll_flg,W
		btfsc	STATUS,Z		;データフラグ 00:1/3データ か？
		goto	f5x7s01			;Yes

		; 現在 フォントデータが 2/3 番目のとき
		btfss	scroll_flg,4		;データフラグ 2/3 番目データ か？
		goto	f5x7s09			;No

		call	deployment_s1		;フォントデータの 1/3 番目をリニアメモリバッファへ展開
		goto	f5x7s10

		; 現在 フォントデータが 3/3 番目のとき
f5x7s09		call	deployment_s2		;フォントデータの 2/3 番目をリニアメモリバッファへ展開

f5x7s10		movf	m_fsrxh,W		;リニアメモリバッファの右限界アドレス
		movwf	m_fsrnh			;
		movf	m_fsrxl,W		;
		movwf	m_fsrnl			;退避
		bsf	scroll_flg,6		;スイッチ操作無効フラグ = ON
		goto	f5x7s02

		; 標準文字フォントのデモ表示処理の終了

f5x7s11		bcf	INTCON,IOCIE		;状態変化割り込みを禁止
		movlw	h'cf'
		andwf	scroll_flg,F		;bit5-4: データフラグをクリア
		bcf	exit_flg,7		;処理打ち切りフラグ = OFF
		movlp	high main
		goto	main			;メイン処理に戻る

;--------------------------------------------------------------------------
;		スクロールの速度制御 ウェイトルーチン
;--------------------------------------------------------------------------

;		Ver. 1.03 で スクロール速度 = 0 = MIN を追加

scroll_speed		;-------

		movf	scroll_flg,W		;スクロール速度 (0 ～ 10)
		andlw	h'0f'
		btfss	STATUS,Z		;スクロール速度 = 0 = MIN（速い）か？
		goto	speed01			;No

		movlw	1			;スクロール速度 = 0 = MIN のとき
		movwf	wt3cnt
		movlw	10			;10 m 秒ウェイト
		goto	speed03

speed01		movwf	addr_low		;スクロール速度 (1 ～ 10) のとき
		decf	addr_low,F
		clrf	addr_high
		movlw	low speed_tbl		;スクロール速度テーブルの low アドレス
		addwf	addr_low,F
		movlw	high speed_tbl		;スクロール速度テーブルの high アドレス
		addwfc	addr_high,F

		movlp	high msg_tbl_read
		call	msg_tbl_read
		movlp	high $
		movwf	wt3cnt

speed02		movlw	25			;25 m 秒ウェイト

speed03		movlp	high wait_xxms
		call	wait_xxms		;xx m 秒（ 1m 秒 x W ）ウェイトルーチン
		movlp	high $

		decfsz	wt3cnt,F
		goto	speed02

		return

		; スクロール速度テーブル

;		dt	0			; 0:                15mS <
speed_tbl	dt	1			; 1:  25mS *  1 =   25mS
		dt	2			; 2:  25mS *  2 =   50mS
		dt	4			; 3:  25mS *  4 =  100mS
		dt	6			; 4:  25mS *  6 =  150mS
		dt	8			; 5:  25mS *  8 =  200mS <
		dt	12			; 6:  25mS * 12 =  300mS
		dt	20			; 7:  25mS * 20 =  500mS
		dt	30			; 8:  25mS * 30 =  750mS
		dt	40			; 9:  25mS * 40 = 1000mS
		dt	60			;10:  25mS * 60 = 1500mS <

;--------------------------------------------------------------------------

		; 30m 秒ウェイトルーチン
xwait_30ms
		movlp	high wait_30ms
		call	wait_30ms		;
		movlp	high $
		return

;--------------------------------------------------------------------------
;	  標準,プロポ,かなフォントのデモ中の 各スイッチの入力処理
;--------------------------------------------------------------------------

switch_check		;-------

		movf	swit_flg,W		;スイッチフラグ(割り込みで設定)
		btfsc	STATUS,Z		;スイッチ操作があった か？
		goto	swck01			;No

		btfsc	swit_flg,0		;RIGHT スイッチ = ON か？
		call	demo_right_switch	;Yes

		btfsc	swit_flg,1		;UP スイッチ = ON か？
		call	demo_up_switch		;Yes

		btfsc	swit_flg,4		;DOWN スイッチ = ON か？
		call	demo_down_switch	;Yes

		btfsc	swit_flg,5		;LEFT スイッチ = ON か？
		call	demo_left_switch	;Yes

		clrf	swit_flg		;スイッチフラグをクリア
		movlb	7			;バンク 7
		clrf	IOCAF			;状態変化割り込みフラグをクリア
		movlb	0			;バンク 0

swck01		btfss	INTCON,IOCIE		;禁止のときは
		bsf	INTCON,IOCIE		;状態変化割り込みを許可
		return

;--------------------------------------------------------------------------
;  EXIT/RIGHT スイッチの処理 ... 標準,プロポ,かなフォントのデモから CALL
;--------------------------------------------------------------------------

		; scroll_flg:	スクロールフラグ
				; bit7:   左右方向フラグ 0:左方向/1:右方向
				; bit6:   スイッチ操作無効フラグ
				; bit5-4: データフラグ 00:1/3 / 01:2/3 / 10:3/3データ
				; bit3-0: スクロール速度 (1 ～ 10)

;--------------------------------------------------------------------------

demo_right_switch	;-------

	;	call	xwait_30ms		;チャッタリング吸収
	;	btfsc	PORTA,_swRIG		;再度 RIGHT スイッチ = ON か？
	;	goto	dmrig03			;No

		movlw	100			;30ms x 100 = 3 秒間の監視
		movwf	lp_cnt3			;ループカウンタ3

dmrig01		call	xwait_30ms		;30m 秒 ウエイト
		btfsc	PORTA,_swEXT		;EXIT/RIGHT スイッチ = OFF か？
		goto	dmrig02			;Yes

		decfsz	lp_cnt3,F		;ループカウンタ3 - 1 = 0 か？
		goto	dmrig01			;No

		bsf	exit_flg,7		;処理打ち切りフラグ = ON
		goto	dmrig03

dmrig02		bsf	scroll_flg,7		;左右方向フラグ = 1 = RIGHT に更新

dmrig03		btfss	PORTA,_swRIG		;RIGHT スイッチ = OFF か？
		goto	$ - 1			;No

		call	xwait_30ms		;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;      UP スイッチの処理 ... 標準,プロポ,かなフォントのデモから CALL
;--------------------------------------------------------------------------

demo_up_switch		;-------

	;	call	xwait_30ms		;チャッタリング吸収
	;	btfsc	PORTA,_swUP		;再度 UP スイッチ = ON か？
	;	goto	dmup02			;No

		movf	scroll_flg,W
		andlw	h'0f'
;		sublw	1			;Ver. 1.03 で 1 → 0 に変更
		btfsc	STATUS,Z		;スクロール速度 = 0 = MIN（速い）か？
		goto	dmup01			;Yes

		decf	scroll_flg,F		;スクロール速度 -1 更新
		movf	scroll_flg,W
		andlw	h'0f'
;		sublw	1
		btfsc	STATUS,Z		;スクロール速度 = 0 = MIN 値 か？
		goto	dmup01			;Yes

;		movf	scroll_flg,W
;		andlw	h'0f'
		sublw	5
		btfss	STATUS,Z		;スクロール速度 = 5 = デフォルト値 か？
		goto	dmup02			;No

dmup01		movlp	high buzzer_pi5
		call	buzzer_pi5		;"ピッ" ブザー音 (50 mS)
		movlp	high $

dmup02		btfss	PORTA,_swUP		;UP スイッチ = OFF か？
		goto	$ - 1			;No

		call	xwait_30ms		;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;     DOWN スイッチの処理 ... 標準,プロポ,かなフォントのデモから CALL
;--------------------------------------------------------------------------

demo_down_switch	;-------

	;	call	xwait_30ms		;チャッタリング吸収
	;	btfsc	PORTA,_swDWN		;再度 DOWN スイッチ = ON か？
	;	goto	dmdwn02			;No

		movf	scroll_flg,W
		andlw	h'0f'
		sublw	10
		btfsc	STATUS,Z		;スクロール速度 = 10 = MAX（遅い）か？
		goto	dmdwn01			;Yes

		incf	scroll_flg,F		;スクロール速度 +1 更新
		movf	scroll_flg,W
		andlw	h'0f'
		sublw	10
		btfsc	STATUS,Z		;スクロール速度 = 10 = MAX 値 か？
		goto	dmdwn01			;Yes

		movf	scroll_flg,W
		andlw	h'0f'
		sublw	5
		btfss	STATUS,Z		;スクロール速度 = 5 = デフォルト値 か？
		goto	dmdwn02			;No

dmdwn01		movlp	high buzzer_pi5
		call	buzzer_pi5		;"ピッ" ブザー音 (50 mS)
		movlp	high $

dmdwn02		btfss	PORTA,_swDWN		;DOWN スイッチ = OFF か？
		goto	$ - 1			;No

		call	xwait_30ms		;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;     LEFT スイッチの処理 ... 標準,プロポ,かなフォントのデモから CALL
;--------------------------------------------------------------------------

demo_left_switch	;-------

	;	call	xwait_30ms		;チャッタリング吸収
	;	btfsc	PORTA,_swLEF		;再度 LEFT スイッチ = ON か？
	;	goto	dmlef01			;No

		bcf	scroll_flg,7		;左右方向フラグ = 0 = LEFT に更新

dmlef01		btfss	PORTA,_swLEF		;LEFT スイッチ = OFF か？
		goto	$ - 1			;No

		call	xwait_30ms		;チャッタリング吸収
		return

;==========================================================================
;    rtsw_sel = 6:  5x7(8) プロポーショナル文字フォントのデモ表示処理
;==========================================================================

;	リニアデータメモリのサイズ: 80 * 12 + 48 = 1,008 バイト(max) ... PIC16F1709 の場合
;	linear_buff のサイズ:       1,008 - 80 * 2 = 848 バイト(BANK2～12を使用)

;#define 	linear_buff	(h'2000' + 80 * 2)	;バッファ先頭アドレス


;	  (64個)  ! "   #     $    %     &     ' (    .(省略).  x     y    z   {   | }   ~     (64個)
;	_ ...... _x_xxx_xxxxx_xxxx_xxxxx_xxxxx_x_xxx_ ........ _xxxxx_xxxx_xxx_xxx_x_xxx_xxxx_ ...... _
;	|                                                                                    |
;     先頭アドレス                                                                         最終アドレス
;    (h'2000' + 80 * 2)		x: 1個 1バイト,  _: h'00'コード(文字間の区切り)

font5x7p_process	;-------

		; 表示する全フォントデータをリニアデータメモリのバッファへ展開（事前処理）

		movlw	high linear_buff	;フォントデータ格納先リニアメモリバッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low linear_buff		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		movlw	8 * 8			;ディスプレイの横幅ドット数
		movlp	high zz_buff
		call	zz_buff			;文字データに先行する h'00' コード
		movlp	high $

		movlw	'!'			;先頭コード('!' = h'21')
		movwf	lp_cnt4			;ループカウンタ4

f5x7p01		movf	lp_cnt4,W
		movlp	high font5p_read_buff
		call	font5p_read_buff	;プロポーショナルフォントデータの読み出しとバッファへ格納
		movlp	high $

		incf	lp_cnt4,F		;文字コードの +1 更新
		movlw	'~' + 1			;最終コード('~' = h'7e') + 1	
		subwf	lp_cnt4,W
		btfss	STATUS,Z		;文字コードの終了 か？
		goto	f5x7p01			;No

		addfsr	FSR0,-1			;最終の h'00'コード(文字間の区切り)の位置
		movf	FSR0H,W			;フォントデータ格納先リニアメモリバッファの最終アドレス
		movwf	m_fsrxh			;
		movf	FSR0L,W			;
		movwf	m_fsrxl			;m_fsrxh:m_fsrxl に退避

		movlw	8 * 8			;ディスプレイの横幅ドット数
		movlp	high zz_buff
		call	zz_buff			;文字データに後続する h'00' コード
		movlp	high $

		; 変数の初期設定等
		; 以下、かな文字フォントのデモ表示と共用

f8x8k04		clrf	swit_flg		;スイッチフラグの初期設定
		clrf	exit_flg		;処理打ち切りフラグ = OFF
		movlb	7			;バンク 7
		clrf	IOCAF			;状態変化割り込みフラグをクリア
		movlb	0			;バンク 0
		bsf	INTCON,IOCIE		;状態変化割り込みを許可

		; プロポーショナル文字フォントのデモ表示の開始

		movlw	high linear_buff	;リニアメモリバッファの先頭アドレス
		movwf	m_fsrnh			;
		movlw	low linear_buff		;
		movwf	m_fsrnl			;退避

f5x7p02		bcf	scroll_flg,7		;左右方向フラグ = 0 = LEFT
		bsf	scroll_flg,6		;スイッチ操作無効フラグ = ON

f5x7p03		movf	m_fsrnh,W		;退避したリニアメモリバッファのアドレスを復帰
		movwf	FSR1H			;
		movf	m_fsrnl,W		;
		movwf	FSR1L			;FSR1H:FSR1L 間接アドレスに設定

		movlw	high fd_buff		;フォントデータ表示バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		movlw	8 * 8			;ディスプレイの横幅ドット数
		movwf	lp_cnt4			;ループカウンタ4	

f5x7p04		moviw	FSR1++			;リニアメモリバッファデータ読み出し
		movwi	FSR0++			;表示バッファへ格納
		decfsz	lp_cnt4,F		;ループカウンタ4 - 1 = 0 か？
		goto	f5x7p04			;No

		; ディスプレイ表示の更新と スイッチの入力チェック

		movlp	high verti_horiz_conv_x8
		call	verti_horiz_conv_x8	;８桁分の縦横ビットのデータ変換
		call	dxled_display_x8	;ドットマトリクス LED ８桁分の表示
		movlp	high $
		call	scroll_speed		;スクロールの速度制御

		btfss	scroll_flg,6		;スイッチ操作無効フラグ = ON か？
		; スイッチ操作無効フラグ = ON のときには、RIGHT, LEFT スイッチの操作を無効にする
		goto	f5x7p05			;No
						;Yes. 折り返し時なので速度を 2倍遅くする
		call	scroll_speed		;再度スクロールの速度制御
		bcf	swit_flg,0		;強制的に RIGHT スイッチ = OFF
		bcf	swit_flg,5		;強制的に LEFT スイッチ = OFF
		bcf	scroll_flg,6		;スイッチ操作無効フラグ = OFF

f5x7p05		call	switch_check		;各スイッチの入力チェック

		btfsc	exit_flg,7		;処理打ち切りフラグ = ON か？
		goto	f5x7p07			;Yes

		btfsc	scroll_flg,7		;左右方向フラグ = 1 = RIGHT か？
		goto	f5x7p06			;Yes

		; 左方向に移動のときの リニアメモリバッファのアドレスの更新

		movlw	1			;退避したリニアメモリバッファのアドレス +1 更新
		addwf	m_fsrnl,F		;
		clrw				;
		addwfc	m_fsrnh,F		;

		movf	m_fsrnl,W
		subwf	m_fsrxl,W
		btfss	STATUS,Z		;リニアメモリバッファの最終 low アドレス か？
		goto	f5x7p03			;No

		movf	m_fsrnh,W
		subwf	m_fsrxh,W
		btfss	STATUS,Z		;リニアメモリバッファの最終 high アドレス か？
		goto	f5x7p03			;No

		bsf	scroll_flg,7		;左右方向フラグ = 1 = RIGHT に変更
		bsf	scroll_flg,6		;スイッチ操作無効フラグ = ON
		goto	f5x7p03

		; 右方向に移動のときの リニアメモリバッファのアドレスの更新

f5x7p06		movlw	1			;退避したリニアメモリバッファのアドレス -1 更新
		subwf	m_fsrnl,F		;
		clrw				;
		subwfb	m_fsrnh,F		;

		movf	m_fsrnl,W
		sublw	low linear_buff
		btfss	STATUS,Z		;リニアメモリバッファの先頭 low アドレス か？
		goto	f5x7p03			;No

		movf	m_fsrnh,W
		sublw	high linear_buff
		btfss	STATUS,Z		;リニアメモリバッファの先頭 high アドレス か？
		goto	f5x7p03			;No
		goto	f5x7p02			;Yes

		; プロポーショナル文字／かな文字フォントのデモ表示処理の終了

f5x7p07		bcf	INTCON,IOCIE		;状態変化割り込みを禁止
		bcf	exit_flg,7		;処理打ち切りフラグ = OFF
		movlp	high main
		goto	main			;メイン処理に戻る

;==========================================================================
;	    rtsw_sel = 7:   8x8 かな文字フォントのデモ表示処理
;==========================================================================

;	リニアデータメモリのサイズ: 80 * 12 + 48 = 1,008 バイト(max) ... PIC16F1709 の場合
;	linear_buff のサイズ:       1,008 - 80 * 2 = 848 バイト(BANK2～12を使用)

;#define 	linear_buff	(h'2000' + 80 * 2)	;バッファ先頭アドレス

;	  (64個)  あ       い       う       え        ..(省略)..  ゅ       ょ       っ       (1+64個)
;	_ ...... _xxxxxxxx_xxxxxxxx_xxxxxxxx_xxxxxxxx_ .......... _xxxxxxxx_xxxxxxxx_xxxxxxxx_ ...... _
;	|                                                                                     |
;     先頭アドレス                                                                          最終アドレス
;    (h'2000' + 80 * 2)		x: 1個 1バイト,  _: h'00'コード(文字間の区切り)

font8x8kana_process	;-------

		; 表示する全フォントデータをリニアデータメモリのバッファへ展開（事前処理）

		movlw	high linear_buff	;フォントデータ格納先リニアメモリバッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low linear_buff		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		movlw	8 * 8			;ディスプレイの横幅ドット数
		movlp	high zz_buff
		call	zz_buff			;文字データに先行する h'00' コード
		movlp	high $

		movlw	high font_a		;ひらがな文字フォント（8 x 8）データテーブルの先頭アドレス
		movwf	FSR1H			;
		movlw	low font_a		;
		movwf	FSR1L			;FSR1H:FSR1L 間接アドレスに設定

		movlw	high (font8x8k_data_tbl_end - font_a)
		movwf	addr_high
		movlw	low (font8x8k_data_tbl_end - font_a)
		movwf	addr_low		;ループカウンタ

f8x8k01		movlw	8
		movwf	lp_cnt5			;ループカウンタ5

f8x8k02		moviw	FSR1++			;ひらがな文字フォント（8 x 8）データテーブルの読み出し
		movwi	FSR0++			;リニアメモリバッファへ格納

		decfsz	lp_cnt5,F		;ループカウンタ5 - 1 = 0 か？
		goto	f8x8k02			;No

		clrw				;h'00'コード(文字間の区切り)
		movwi	FSR0++			;バッファへ格納

		movlw	8			;ループカウンタ -8 更新
		subwf	addr_low,F		;
		clrw				;
		subwfb	addr_high,F		;

		movf	addr_low,W		;
		iorwf	addr_high,W		;
		btfss	STATUS,Z		;ループカウンタ addr_low = addr_high = 0 か？
		goto	f8x8k01			;No

		movf	FSR0H,W			;フォントデータ格納先リニアメモリバッファの最終アドレス
		movwf	m_fsrxh			;
		movf	FSR0L,W			;
		movwf	m_fsrxl			;m_fsrxh:m_fsrxl に退避

		movlw	8 * 8			;ディスプレイの横幅ドット数
		movlp	high zz_buff
		call	zz_buff			;文字データに後続する h'00' コード
		movlp	high $

		; フォントデータの横→縦ビットのデータ変換

		movlw	high (linear_buff + 8 * 8) ;フォントデータ格納先リニアメモリバッファの先頭アドレス
		movwf	m_fsr0h			   ;
		movlw	low (linear_buff + 8 * 8)  ;
		movwf	m_fsr0l			   ;退避

f8x8k03		movlw	1			;1桁分
		movlp	high horiz_verti_conv
		call	horiz_verti_conv	;横→縦ビットのデータ変換
		movlp	high $

		movlw	1			;退避したリニアメモリバッファのアドレス +1 更新
		addwf	m_fsr0l,F		;h'00'コード(文字間の区切り)の分
		clrw				;
		addwfc	m_fsr0h,F		;

		movf	m_fsrxl,W
		subwf	m_fsr0l,W
		btfss	STATUS,Z		;m_fsr0l = m_fsrxl か？
		goto	f8x8k03			;No

		movf	m_fsrxh,W
		subwf	m_fsr0h,W
		btfss	STATUS,Z		;m_fsr0l = m_fsrxl か？
		goto	f8x8k03			;No

		; 以下、プロポーショナル文字フォントのデモ表示と同様なので共用する

		goto	f8x8k04

;==========================================================================
;	    rtsw_sel = 8:  さくらさくら／赤とんぼ 表示処理
;==========================================================================

		; vhcv_flg		;縦横ビット変換フラグ
					; bit7:   0:縦→横/1:横→縦
				     ;>	; bit4:   曲選択フラグ 0:さくらさくら/1:赤とんぼ
				     ;>	; bit3-0: 曲速度の変更値 (1 ～ 15)

;--------------------------------------------------------------------------

sakura_tonbo_process
play_back		;-------

		movlw	8			;bit4:   曲選択フラグの初期設定, 0:さくらさくら/1:赤とんぼ
		movwf	vhcv_flg		;bit3-0: 曲速度の変更値 (1 ～ 15) = 8: デフォルト値
		clrf	swit_flg		;スイッチフラグの初期設定
		clrf	exit_flg		;処理打ち切りフラグ = OFF
		bsf	alm_flg,5		;アラーム音出力許可3フラグ = ON
		movlb	7			;バンク 7
		movlw	b'00001000'		;┐RC3 を追加
		movwf	IOCCN			;┘
		clrf	IOCCF			;ポートC 状態変化割り込みフラグをクリア
		clrf	IOCAF			;ポートA 状態変化割り込みフラグをクリア
		movlb	0			;バンク 0
		bsf	INTCON,IOCIE		;状態変化割り込みを許可

plybk01		movlp	high wait_500ms
		call	wait_500ms		;500m 秒 ウェイト
		movlp	high $

		btfsc	vhcv_flg,4		;曲選択フラグ bit4 = 0 か？
		goto	plybk02			;No

		movlw	high sakura_sakura
		movwf	addr_high		;さくらさくら 曲データの high アドレスを設定
		movlw	low sakura_sakura
		movwf	addr_low		;さくらさくら 曲データの low アドレスを設定
		goto	plybk03

plybk02		movlw	high aka_tonbo
		movwf	addr_high		;赤とんぼ 曲データの high アドレスを設定
		movlw	low aka_tonbo
		movwf	addr_low		;赤とんぼ 曲データの low アドレスを設定

		; 曲データの読み出し

plybk03		call	song_data_read		;曲データ1 を読み出す
		movwf	scale		       ;;音階コードに保存

		movf	scale,W
		btfsc	STATUS,Z		;読み出しデータ 終了か?
		goto	plybk21			;Yes

		movf	scale,W
		andlw	h'e0'
		xorlw	h'e0'
		btfsc	STATUS,Z		;拡張機能 か？
		goto	plybk10			;Yes

		call	song_data_read		;曲データ2 を読み出す
		movwf	length		       ;;音長に保存

		; 音階コードの分析

		movlw	Nn			;音階コードが (Nn) の時は休止符
		subwf	scale,W
		btfsc	STATUS,Z		;音階コード = (Nn) か？
		goto	plybk06			;Yes

		movlw	Xx			;音階コードが (Xx) の時は テンポ指定
		subwf	scale,W
		btfss	STATUS,Z		;音階コード = (Xx) か？
		goto	plybk04			;No

		movf	length,W		;テンポを取り出す
		movwf	tempo			;テンポ指定を設定
		goto	plybk20

plybk04		movlw	Rep			;音階コードが (Rep) の時は 繰り返し指定
		subwf	scale,W
		btfss	STATUS,Z		;音階コード = (Rep) か？
		goto	plybk05			;No

		movf	addr_high,W
		movwf	rep_addr_high		;繰り返し曲データの high アドレスを保存
		movf	addr_low,W
		movwf	rep_addr_low		;繰り返し曲データの low アドレスを保存

		movf	length,W		;繰り返しを取り出す
		movwf	repeat			;繰り返し指定を設定
		goto	plybk20

		; 音符, 休符の再生

plybk05		movlw	Mi - Oct1
		subwf	scale,W			;音階コード - 20
		movwf	FSR1L
		lslf	FSR1L,W			;x2
		addlw	low scale_table
		movwf	FSR1L
		movlw	high scale_table
		movwf	FSR1H
		clrw
		addwfc	FSR1H,F

		moviw	0[FSR1]			;
		movwf	const_high		;high に保存する
		moviw	1[FSR1]			;
		movwf	const_low		;low に保存する

		btfss	alm_flg,5		;アラーム音出力許可3フラグ = ON か？
		goto	plybk06			;No

		movlb	1			;バンク 1
		bsf	PIE1,TMR1IE		;タイマー１割り込みを許可
		movlb	0			;バンク 0

plybk06		movf	vhcv_flg,W
		andlw	h'0f'			;曲速度の変更値
		movwf	work3
		movlw	8			;flg - デフォルト値
		subwf	work3,F			;

		lslf	work3,F			;x2
	;	addwf	work3,F			;x3

plybk07		lslf	work3,W			;x4
		addwf	tempo,W			;ループカウンタを設定
		movlp	high wait_xxms
		call	wait_xxms		;音長を ((tempo - ((flg - 8) * 4)) * length) 倍で再生
		movlp	high $

		decfsz	length,F		;音長 = 0 か？
		goto	plybk07			;No

		btfsc	scale,7			;休符 か？
		goto	plybk20			;Yes

		movlb	1			;バンク 1
		bcf	PIE1,TMR1IE		;タイマー１割り込みを禁止
		movlb	0			;バンク 0
		goto	plybk20

;			-8	bin		x2	  	dec	 x3	 x4

;		 1	-7	1111.1001	1111.0010	-14	-21	-28
;		 2	-6	1111.1010	1111.0100	-12	-18	-24
;		 3	-5	1111.1011	1111.0110	-10	-15	-20
;		 4	-4	1111.1100	1111.1000	 -8	-12	-16
;		 5	-3	1111.1101	1111.1010	 -6	 -9	-12
;		 6	-2	1111.1110	1111.1100	 -4	 -6	 -8
;		 7	-1	1111.1111	1111.1110	 -2	 -3	 -4

;		 8	 0	0000.0000	0000.0000	  0	  0	  0

;		 9	 1	0000.0001	0000.0010	  2	  3	  4
;		10	 2	0000.0010	0000.0100	  4	  6	  8
;		11	 3	0000.0011	0000.0110	  6	  9	 12
;		12	 4	0000.0100	0000.1000	  8	 12	 16
;		13	 5	0000.0101	0000.1010	 10	 15	 20
;		14	 6	0000.0110	0000.1100	 12	 18	 24
;		15	 7	0000.0111	0000.1110	 14	 21	 28

		; 拡張機能（曲名,歌詞を表示）

plybk10		movlw	h'03'
		andwf	scale,W
		btfss	STATUS,Z		;bit1-0 = 00  か？
		goto	plybk11			;No

		; 拡張1 (Ex1 = h'e0') のとき ... 格納先バッファのクリア

		movlw	high linear_buff	;リニアメモリバッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low linear_buff		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		movlw	8 * 8			;ディスプレイの横幅ドット数
		movlp	high zz_buff
		call	zz_buff			;リニアメモリバッファを h'00' コードでクリア
		movlp	high $

		; 次の拡張2 (Ex1 = h'e1') 以降の処理に備えて準備
		movlw	high (linear_buff + 1)	;リニアメモリバッファの先頭アドレス
		movwf	m_fsrnh			;
		movlw	low (linear_buff + 1)	;
		movwf	m_fsrnl			;m_fsrnh:m_fsrnl に退避
		goto	plybk20

plybk11		btfss	scale,0			;拡張2 か？
		goto	plybk13			;No

		; 拡張2 (Ex2 = h'e1') のとき ... 歌詞１文字ずつの表示

		movf	m_fsrnh,W		;退避したリニアメモリバッファのアドレス
		movwf	FSR0H			;
		movwf	m_fsr0h			;
		movf	m_fsrnl,W		;
		movwf	FSR0L			;FSR0H:FSR0L に復帰と
		movwf	m_fsr0l			;m_fsr0h:m_fsr0l にもコピー
		call	font8k_read_buff	;フォントデータの読み出しとバッファへ格納と
						;横→縦ビットのデータ変換
		movf	FSR0H,W			;次のリニアメモリバッファのアドレス
		movwf	m_fsrnh			;
		movf	FSR0L,W			;
		movwf	m_fsrnl			;退避
;
		movlw	high linear_buff	;リニアメモリバッファの先頭アドレス
		movwf	FSR1H			;
		movlw	low linear_buff		;
		movwf	FSR1L			;FSR1H:FSR1L 間接アドレスに設定

		movlw	high fd_buff		;フォントデータ表示バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		movlw	8 * 8			;ディスプレイの横幅ドット数
		movwf	lp_cnt4			;ループカウンタ4

plybk12		moviw	FSR1++			;リニアメモリバッファの読み出し
		movwi	FSR0++			;フォントデータ表示バッファへ格納
		decfsz	lp_cnt4,F		;ループカウンタ4 - 1 = 0 か？
		goto	plybk12			;No

		movlp	high verti_horiz_conv_x8
		call	verti_horiz_conv_x8	;８桁分の縦横ビットのデータ変換
		call	dxled_display_x8	;ドットマトリクス LED ８桁分の表示
		movlp	high $
		goto	plybk20

		; 拡張3 (Ex3 = h'e2') のとき ... 曲名の表示

plybk13		movlw	high fd_buff		;フォントデータ表示バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		movlw	8 * 8			;ディスプレイの横幅ドット数
		movlp	high zz_buff
		call	zz_buff			;フォントデータ表示バッファを h'00' コードでクリア
		movlp	high $

		btfsc	vhcv_flg,4		;曲選択フラグ bit4 = 0 か？
		goto	plybk14			;No

		movlw	high title_sakura
		movwf	kaddr_high		;曲名データテーブルの先頭 high アドレスを設定
		movlw	low title_sakura
		movwf	kaddr_low		;曲名データテーブルの先頭 low アドレスを設定

		movlw	high (fd_buff + 5)	;フォントデータ表示バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 5)	;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定
		goto	plybk15

plybk14		movlw	high title_akatonbo
		movwf	kaddr_high		;曲名データテーブルの先頭 high アドレスを設定
		movlw	low title_akatonbo
		movwf	kaddr_low		;曲名データテーブルの先頭 low アドレスを設定

		movlw	high (fd_buff + 9)	;フォントデータ表示バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 9)	;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

plybk15		movf	FSR0H,W			;フォントデータ表示バッファのアドレス
		movwf	m_fsr0h			;
		movf	FSR0L,W			;
		movwf	m_fsr0l			;m_fsr0h:m_fsr0l に退避

		call	font8k_read_buff	;フォントデータの読み出しとバッファへ格納
		btfss	STATUS,Z		;テーブル終了 か？
		goto	plybk15			;No

		movlp	high verti_horiz_conv_x8
		call	verti_horiz_conv_x8	;８桁分の縦横ビットのデータ変換
		call	dxled_display_x8	;ドットマトリクス LED ８桁分の表示
		movlp	high $
		call	blink_500ms_5s		;５秒間の点滅

		; 次の拡張1 (Ex1 = h'e0') 以降の処理に備えて準備
		btfsc	vhcv_flg,4		;曲選択フラグ bit4 = 0 か？
		goto	plybk16			;No

		movlw	high lyrics_sakura
		movwf	kaddr_high		;歌詞データテーブルの先頭 high アドレスを設定
		movlw	low lyrics_sakura
		movwf	kaddr_low		;歌詞データテーブルの先頭 low アドレスを設定
		goto	plybk20

plybk16		movlw	high lyrics_akatonbo
		movwf	kaddr_high		;歌詞データテーブルの先頭 high アドレスを設定
		movlw	low lyrics_akatonbo
		movwf	kaddr_low		;歌詞データテーブルの先頭 low アドレスを設定

		; 再生中断の監視と繰り返し処理

plybk20		call	switch_check2		;各スイッチの入力チェック

		btfsc	exit_flg,7		;処理打ち切りフラグ = ON か？
		goto	plybk23			;Yes

		btfss	exit_flg,6		;強制曲更新フラグ = ON か？
		goto	plybk03			;No

		bcf	exit_flg,6		;強制曲更新フラグ = OFF
		goto	plybk01

plybk21		decfsz	repeat,F		;繰り返し終了 か?
		goto	plybk22			;No

		movlw	h'10'
		xorwf	vhcv_flg,F		;bit4: 曲選択フラグの更新
		goto	plybk01

plybk22		movf	rep_addr_high,W
		movwf	addr_high		;繰り返し曲データの high アドレスを復帰
		movf	rep_addr_low,W
		movwf	addr_low		;繰り返し曲データの low アドレスを復帰
		goto	plybk03
	
plybk23		movlb	7			;バンク 7
		clrf	IOCCN			;追加した RC3 をクリア
		movlb	0			;バンク 0
		bcf	INTCON,IOCIE		;状態変化割り込みを禁止
		clrf	vhcv_flg		;bit4: 曲選択フラグのクリア
		bcf	alm_flg,5		;アラーム音出力許可3フラグ = OFF
		bcf	exit_flg,7		;処理打ち切りフラグ = OFF
		movlp	high main
		goto	main			;メイン処理に戻る

;--------------------------------------------------------------------------

		; 曲データの読み出し

song_data_read
		call	song_tbl_read		;テーブルデータの読み出し
		incf	addr_low,F		;曲データの low アドレスの更新
		btfsc	STATUS,Z		;オーバーフローした場合は
		incf	addr_high,F		;曲データの high アドレスの更新
		return

song_tbl_read
		movf	addr_high,W		;読み出す曲データの high アドレス
		movwf	PCLATH
		movf	addr_low,W		;読み出す曲データの low アドレス
		movwf	PCL

;--------------------------------------------------------------------------

;		500m 秒間ごとの点滅を 5 回（秒間）

blink_500ms_5s
		movlw	5			;
		movwf	lp_cnt5			;ループカウンタ5

blk0501		movlp	high wait_500ms
		call	wait_500ms		;500m 秒 ウェイト
		movlp	high $

		movlw	h'0c'			;シャットダウンレジスタ
		movwf	reg_addr
		clrf	reg_data		;シャットダウン（LED 消灯）
		movlp	high max_led_contr
		call	max_led_contr
		movlp	high $

		movlp	high wait_500ms
		call	wait_500ms		;500m 秒 ウェイト
		movlp	high $

		movlw	h'0c'			;シャットダウンレジスタ
		movwf	reg_addr
		movlw	h'01'			;通常動作
		movwf	reg_data
		movlp	high max_led_contr
		call	max_led_contr
		movlp	high $

		decfsz	lp_cnt5,F		;ループカウンタ5 - 1 = 0 か？
		goto	blk0501			;No

		return		

;--------------------------------------------------------------------------
;かな文字フォントデータの読み出しとバッファへ格納, 横→縦ビットのデータ変換
;--------------------------------------------------------------------------

font8k_read_buff	;-------

		movlw	1
		movwf	lp_cnt4			;ループカウンタ4

fr8buf01	call	font_tbl_read		;フォントアドレスデータ high の読み出し
		movwf	FSR1H
		movf	FSR1H,W
		btfsc	STATUS,Z		;テーブル終了 か？
		goto	fr8buf04		;Yes

		incf	FSR1H,W			;複数文字指示のとき
		btfss	STATUS,Z		;h'ff' + 1 = 0 か？
		goto	fr8buf02		;No

		incf	lp_cnt4,F		;ループカウンタ4 + 1
		incf	kaddr_low,F		;フォントアドレステーブルの low アドレスの更新
		btfsc	STATUS,Z		;オーバーフローした場合は
		incf	kaddr_high,F		;フォントアドレステーブルの high アドレスの更新
		goto	fr8buf01

fr8buf02	incf	kaddr_low,F		;フォントアドレステーブルの low アドレスの更新
		btfsc	STATUS,Z		;オーバーフローした場合は
		incf	kaddr_high,F		;フォントアドレステーブルの high アドレスの更新

		call	font_tbl_read		;フォントアドレスデータ low の読み出し
		movwf	FSR1L
		incf	kaddr_low,F		;フォントアドレステーブルの low アドレスの更新
		btfsc	STATUS,Z		;オーバーフローした場合は
		incf	kaddr_high,F		;フォントアドレステーブルの high アドレスの更新

		movlw	8			;8 バイト
		movwf	lp_cnt3			;ループカウンタ3

fr8buf03	moviw	FSR1++			;ひらがな文字フォント（8 x 8）データテーブルの読み出し
		movwi	FSR0++			;フォントデータ表示バッファへ格納
		decfsz	lp_cnt3,F		;ループカウンタ3 - 1 = 0 か？
		goto	fr8buf03		;No

		movlw	1			;1桁分
		movlp	high horiz_verti_conv
		call	horiz_verti_conv	;横→縦ビットのデータ変換
		movlp	high $

		clrw				;h'00'コード(文字間の区切り)
		movwi	FSR0++			;バッファへ格納
		decfsz	lp_cnt4,F		;ループカウンタ4 - 1 = 0 か？
		goto	fr8buf01		;No

		bcf	STATUS,Z		;Z フラグのクリア

fr8buf04	return

font_tbl_read
		movf	kaddr_high,W		;フォントアドレステーブルの high アドレス
		movwf	PCLATH
		movf	kaddr_low,W		;フォントアドレステーブルの low アドレス
		movwf	PCL

;--------------------------------------------------------------------------
;	   さくらさくら／赤とんぼ処理中の 各スイッチの入力処理
;--------------------------------------------------------------------------

switch_check2		;-------

		movf	swit_flg,W		;スイッチフラグ(割り込みで設定)
		btfsc	STATUS,Z		;どれかスイッチ操作があった か？
		goto	swck205			;No

		btfss	swit_flg,0		;EXIT スイッチ = ON か？
		goto	swck201			;No

		bsf	exit_flg,7		;処理打ち切りフラグ = ON
		goto	swck203

swck201		btfsc	swit_flg,1		;UP スイッチ = ON か？
		call	sak_aka_up_switch	;Yes

		btfsc	swit_flg,4		;DOWN スイッチ = ON か？
		call	sak_aka_down_switch	;Yes

		btfss	swit_flg,5		;CHANGE スイッチ = ON か？
		goto	swck202			;No

		movlw	h'10'
		xorwf	vhcv_flg,F		;bit4: 曲選択フラグの更新
		bsf	exit_flg,6		;強制曲更新フラグ = ON
		goto	swck203

swck202		btfss	swit_flg,7		;SIGNAL スイッチ = ON か？
		goto	swck203			;No

		movlw	h'20'
		xorwf	alm_flg,F		;bit5: アラーム音出力許可3フラグの更新

swck203		call	xwait_30ms		;30m 秒 ウエイト

swck204		movf	PORTA,W
		andlw	h'33'
		xorlw	h'33'
		btfss	STATUS,Z		;すべてのスイッチ = OFF か？
		goto	swck204			;No

		clrf	swit_flg		;スイッチフラグをクリア
		movlb	7			;バンク 7
		clrf	IOCAF			;状態変化割り込みフラグをクリア
		clrf	IOCCF			;
		movlb	0			;バンク 0

swck205		btfss	INTCON,IOCIE		;禁止のときは
		bsf	INTCON,IOCIE		;状態変化割り込みを許可
		return

;--------------------------------------------------------------------------
;        UP スイッチの処理 ... さくらさくら／赤とんぼ処理から CALL
;--------------------------------------------------------------------------

sak_aka_up_switch

	;	call	xwait_30ms		;チャッタリング吸収
	;	btfsc	PORTA,_swUP		;再度 UP スイッチ = ON か？
	;	goto	skup02			;No

		movf	vhcv_flg,W
		andlw	h'0f'
		sublw	1
		btfsc	STATUS,Z		;曲速度の変更値 = 1 = MIN（速い）か？
		goto	skup01			;Yes

		decf	vhcv_flg,F		;曲速度の変更値 -1 更新
		movf	vhcv_flg,W
		andlw	h'0f'
		sublw	1
		btfsc	STATUS,Z		;曲速度の変更値 = 1 = MIN 値 か？
		goto	skup01			;Yes

		sublw	8 - 1
		btfss	STATUS,Z		;曲速度の変更値 = 8 = デフォルト値 か？
		goto	skup02			;No

skup01		movlp	high buzzer_pi
		call	buzzer_pi5		;"ピッ" ブザー音 (100 mS)
		movlp	high $

skup02		btfss	PORTA,_swUP		;UP スイッチ = OFF か？
		goto	$ - 1			;No

		call	xwait_30ms		;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;       DOWN スイッチの処理 ... さくらさくら／赤とんぼ処理から CALL
;--------------------------------------------------------------------------

sak_aka_down_switch

	;	call	xwait_30ms		;チャッタリング吸収
	;	btfsc	PORTA,_swDWN		;再度 DOWN スイッチ = ON か？
	;	goto	skdwn02			;No

		movf	vhcv_flg,W
		andlw	h'0f'
		sublw	15
		btfsc	STATUS,Z		;曲速度の変更値 = 15 = MAX（遅い）か？
		goto	skdwn01			;Yes

		incf	vhcv_flg,F		;曲速度の変更値 +1 更新
		movf	vhcv_flg,W
		andlw	h'0f'
		sublw	15
		btfsc	STATUS,Z		;曲速度の変更値 = 15 = MAX 値 か？
		goto	skdwn01			;Yes

		movf	vhcv_flg,W
		andlw	h'0f'
		sublw	8
		btfss	STATUS,Z		;曲速度の変更値 = 8 = デフォルト値 か？
		goto	skdwn02			;No

skdwn01		movlp	high buzzer_pi
		call	buzzer_pi5		;"ピッ" ブザー音 (100 mS)
		movlp	high $

skdwn02		btfss	PORTA,_swDWN		;DOWN スイッチ = OFF か？
		goto	$ - 1			;No

		call	xwait_30ms		;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;		音階用分周定数を取得(一部だけの省略設定)  at 8MHz
;--------------------------------------------------------------------------

scale_table
		retlw	high (65536 - 6067)	;20: ミ
		retlw	low  (65536 - 6067)
		retlw	high (65536 - 5726)	;21: ファ
		retlw	low  (65536 - 5726)
		retlw	high (65536 - 5405)	;22: ファ＃
		retlw	low  (65536 - 5405)
		retlw	high (65536 - 5102)	;23: ソ
		retlw	low  (65536 - 5102)
		retlw	high (65536 - 4815)	;24: ソ＃
		retlw	low  (65536 - 4815)
		retlw	high (65536 - 4545)	;25: ラ
		retlw	low  (65536 - 4545)
		retlw	high (65536 - 4290)	;26: ラ＃
		retlw	low  (65536 - 4290)
		retlw	high (65536 - 4049)	;27: シ
		retlw	low  (65536 - 4049)

		retlw	high (65536 - 3822)	;28: ド    (261.63Hz)
		retlw	low  (65536 - 3822)
		retlw	high (65536 - 3608)	;29: ド＃  (277.18Hz)
		retlw	low  (65536 - 3608)
		retlw	high (65536 - 3405)	;30: レ    (293.66Hz)
		retlw	low  (65536 - 3405)
		retlw	high (65536 - 3214)	;31: レ＃  (311.13Hz)
		retlw	low  (65536 - 3214)
		retlw	high (65536 - 3034)	;32: ミ    (329.63Hz)
		retlw	low  (65536 - 3034)
		retlw	high (65536 - 2863)	;33: ファ  (349.23Hz)
		retlw	low  (65536 - 2863)
		retlw	high (65536 - 2703)	;34: ファ＃(369.99Hz)
		retlw	low  (65536 - 2703)
		retlw	high (65536 - 2551)	;35: ソ    (392.00Hz)
		retlw	low  (65536 - 2551)
		retlw	high (65536 - 2408)	;36: ソ＃  (415.30Hz)
		retlw	low  (65536 - 2408)
		retlw	high (65536 - 2273)	;37: ラ    (440.00Hz)
		retlw	low  (65536 - 2273)
		retlw	high (65536 - 2145)	;38: ラ＃  (466.16Hz)
		retlw	low  (65536 - 2145)
		retlw	high (65536 - 2025)	;39: シ    (493.88Hz)
		retlw	low  (65536 - 2025)

		retlw	high (65536 - 1911)	;40: ド
		retlw	low  (65536 - 1911)
		retlw	high (65536 - 1804)	;41: ド＃
		retlw	low  (65536 - 1804)
		retlw	high (65536 - 1703)	;42: レ
		retlw	low  (65536 - 1703)
		retlw	high (65536 - 1607)	;43: レ＃
		retlw	low  (65536 - 1607)
		retlw	high (65536 - 1517)	;44: ミ
		retlw	low  (65536 - 1517)
		retlw	high (65536 - 1432)	;45: ファ
		retlw	low  (65536 - 1432)
		retlw	high (65536 - 1351)	;46: ファ＃
		retlw	low  (65536 - 1351)
		retlw	high (65536 - 1276)	;47: ソ
		retlw	low  (65536 - 1276)

;--------------------------------------------------------------------------
;		<<< さくらさくら >>> 曲データテーブル
;--------------------------------------------------------------------------

sakura_sakura
		retlw	Ex3		;曲名の表示
		retlw	Xx		;テンポ
		retlw	40
		retlw	Rep		;繰り返し
		retlw	2

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;さ
		retlw	L4
		retlw	Nn
		retlw	Lx
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;く
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si		;ら
		retlw	L2
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;さ
		retlw	L4
		retlw	Nn
		retlw	Lx
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;く
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si		;ら
		retlw	L2

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;や
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si		;よ
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do + Oct1	;い
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si		;の
		retlw	L4

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;そ
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si		;ら
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;｜
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;は
		retlw	L2

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Mi		;み
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do		;わ
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Mi		;た
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;す
		retlw	L4

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Mi		;か
		retlw	L4
		retlw	Nn
		retlw	Lx
		retlw	Ex2		;歌詞１文字の表示
		retlw	Mi		;ぎ
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do		;｜
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si - Oct1	;り
		retlw	L2

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;か
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si		;す
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do + Oct1	;み
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si		;か
		retlw	L4

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;く
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si		;も
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;｜
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;か
		retlw	L2

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Mi		;に
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do		;お
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Mi		;い
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;ぞ
		retlw	L4

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Mi		;い
		retlw	L4
		retlw	Nn
		retlw	Lx
		retlw	Ex2		;歌詞１文字の表示
		retlw	Mi		;ず
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do		;｜
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si - Oct1	;る
		retlw	L2

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;い
		retlw	L4
		retlw	Nn
		retlw	Lx
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;ざ
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si		;や
		retlw	L2
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;い
		retlw	L4
		retlw	Nn
		retlw	Lx
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;ざ
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si		;や
		retlw	L2

		retlw	Ex1		;格納先バッファのクリア
		retlw	Nn
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Mi		;み
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;に
		retlw	L2
		retlw	Ex2		;歌詞１文字の表示
		retlw	Si		;ゆ
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;｜
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;か
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Mi		;ん
		retlw	L2
		retlw	Nn
		retlw	L2

		retlw	0

;---------------

		; 曲名フォントアドレステーブル

title_sakura
		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_ku		;く
		retlw	low font_ku		;
		retlw	high font_ra		;ら
		retlw	low font_ra		;
		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_ku		;く
		retlw	low font_ku		;
		retlw	high font_ra		;ら
		retlw	low font_ra		;
		retlw	0

;---------------

		; 歌詞データテーブル

lyrics_sakura
		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_ku		;く
		retlw	low font_ku		;
		retlw	high font_ra		;ら
		retlw	low font_ra		;
		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_ku		;く
		retlw	low font_ku		;
		retlw	high font_ra		;ら
		retlw	low font_ra		;

		retlw	high font_no		;の
		retlw	low font_no		;
		retlw	high font_ya		;や
		retlw	low font_ya		;
		retlw	high font_ma		;ま
		retlw	low font_ma		;
		retlw	high font_mo		;も
		retlw	low font_mo		;
		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_to		;と
		retlw	low font_to		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_mo		;も
		retlw	low font_mo		;

		retlw	high font_mi		;み
		retlw	low font_mi		;
		retlw	high font_wa		;わ
		retlw	low font_wa		;
		retlw	high font_ta		;た
		retlw	low font_ta		;
		retlw	high font_su		;す
		retlw	low font_su		;
		retlw	high font_ka		;か
		retlw	low font_ka		;
		retlw	high font_gi		;ぎ
		retlw	low font_gi		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ri		;り
		retlw	low font_ri		;

		retlw	high font_ka		;か
		retlw	low font_ka		;
		retlw	high font_su		;す
		retlw	low font_su		;
		retlw	high font_mi		;み
		retlw	low font_mi		;
		retlw	high font_ka		;か
		retlw	low font_ka		;
		retlw	high font_ku		;く
		retlw	low font_ku		;
		retlw	high font_mo		;も
		retlw	low font_mo		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ka		;か
		retlw	low font_ka		;

		retlw	high font_a		;あ
		retlw	low font_a		;
		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_hi		;ひ
		retlw	low font_hi		;
		retlw	high font_ni		;に
		retlw	low font_ni		;
		retlw	high font_ni		;に
		retlw	low font_ni		;
		retlw	high font_o		;お
		retlw	low font_o		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_u		;う
		retlw	low font_u		;

		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_ku		;く
		retlw	low font_ku		;
		retlw	high font_ra		;ら
		retlw	low font_ra		;
		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_ku		;く
		retlw	low font_ku		;
		retlw	high font_ra		;ら
		retlw	low font_ra		;

		retlw	high font_ha		;は
		retlw	low font_ha		;
		retlw	high font_na		;な
		retlw	low font_na		;
		retlw	high font_za		;ざ
		retlw	low font_za		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ka		;か
		retlw	low font_ka		;
		retlw	high font_ri		;り
		retlw	low font_ri		;
;
		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_ku		;く
		retlw	low font_ku		;
		retlw	high font_ra		;ら
		retlw	low font_ra		;
		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_ku		;く
		retlw	low font_ku		;
		retlw	high font_ra		;ら
		retlw	low font_ra		;

		retlw	high font_ya		;や
		retlw	low font_ya		;
		retlw	high font_yo		;よ
		retlw	low font_yo		;
		retlw	high font_i		;い
		retlw	low font_i		;
		retlw	high font_no		;の
		retlw	low font_no		;
		retlw	high font_so		;そ
		retlw	low font_so		;
		retlw	high font_ra		;ら
		retlw	low font_ra		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ha		;は
		retlw	low font_ha		;

		retlw	high font_mi		;み
		retlw	low font_mi		;
		retlw	high font_wa		;わ
		retlw	low font_wa		;
		retlw	high font_ta		;た
		retlw	low font_ta		;
		retlw	high font_su		;す
		retlw	low font_su		;
		retlw	high font_ka		;か
		retlw	low font_ka		;
		retlw	high font_gi		;ぎ
		retlw	low font_gi		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ri		;り
		retlw	low font_ri		;

		retlw	high font_ka		;か
		retlw	low font_ka		;
		retlw	high font_su		;す
		retlw	low font_su		;
		retlw	high font_mi		;み
		retlw	low font_mi		;
		retlw	high font_ka		;か
		retlw	low font_ka		;
		retlw	high font_ku		;く
		retlw	low font_ku		;
		retlw	high font_mo		;も
		retlw	low font_mo		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ka		;か
		retlw	low font_ka		;

		retlw	high font_ni		;に
		retlw	low font_ni		;
		retlw	high font_o		;お
		retlw	low font_o		;
		retlw	high font_i		;い
		retlw	low font_i		;
		retlw	high font_zo		;ぞ
		retlw	low font_zo		;
		retlw	high font_i		;い
		retlw	low font_i		;
		retlw	high font_zu		;ず
		retlw	low font_zu		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ru		;る
		retlw	low font_ru		;

		retlw	high font_i		;い
		retlw	low font_i		;
		retlw	high font_za		;ざ
		retlw	low font_za		;
		retlw	high font_ya		;や
		retlw	low font_ya		;
		retlw	high font_i		;い
		retlw	low font_i		;
		retlw	high font_za		;ざ
		retlw	low font_za		;
		retlw	high font_ya		;や
		retlw	low font_ya		;

		retlw	high font_mi		;み
		retlw	low font_mi		;
		retlw	high font_ni		;に
		retlw	low font_ni		;
		retlw	high font_yu		;ゆ
		retlw	low font_yu		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ka		;か
		retlw	low font_ka		;
		retlw	high font_n		;ん
		retlw	low font_n		;
		retlw	0

;--------------------------------------------------------------------------
;		<<< 赤とんぼ >>> 曲データテーブル
;--------------------------------------------------------------------------

aka_tonbo
		retlw	Ex3		;曲名の表示
		retlw	Xx		;テンポ
		retlw	45
		retlw	Rep		;繰り返し
		retlw	4

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do		;ゆ
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;う
		retlw	L8
		retlw	Nn
		retlw	Lx
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;や
		retlw	L4 | L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	So		;け
		retlw	L8

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;こ
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do + Oct1	;や
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa + Oct1	;け
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Re + Oct1	;｜
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do + Oct1	;の
		retlw	L4

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Re + Oct1	;あ
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;か
		retlw	L8
		retlw	Nn
		retlw	Lx
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;と
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	So		;ん
		retlw	L4
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;ぼ
		retlw	L2
		retlw	Nn
		retlw	L4

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;お
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Re + Oct1	;わ
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do + Oct1	;れ
		retlw	L4 | L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Re + Oct1	;て
		retlw	L8

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa + Oct1	;み
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Re + Oct1	;た
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do + Oct1	;の
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Re + Oct1	;｜
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do + Oct1	;は
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;｜
		retlw	L8

		retlw	Ex1		;格納先バッファのクリア
		retlw	Ex2		;歌詞１文字の表示
		retlw	Do + Oct1	;い
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;つ
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;の
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Ra		;｜
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	So		;ひ
		retlw	L8
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;｜
		retlw	L8
		retlw	Nn
		retlw	Lx
		retlw	Ex2		;歌詞１文字の表示
		retlw	Fa		;か
		retlw	L2
		retlw	Nn
		retlw	L4

		retlw	0

;---------------

		; 曲名フォントアドレステーブル

title_akatonbo
		retlw	high font_a		;あ
		retlw	low font_a		;
		retlw	high font_ka		;か
		retlw	low font_ka		;
		retlw	high font_to		;と
		retlw	low font_to		;
		retlw	high font_n		;ん
		retlw	low font_n		;
		retlw	high font_bo		;ぼ
		retlw	low font_bo		;
		retlw	0

;---------------

		; 歌詞データテーブル

lyrics_akatonbo
		retlw	high font_yu		;ゆ
		retlw	low font_yu		;
		retlw	high font_u		;う
		retlw	low font_u		;
		retlw	high font_ya		;や
		retlw	low font_ya		;
		retlw	high font_ke		;け
		retlw	low font_ke		;

		retlw	high font_ko		;こ
		retlw	low font_ko		;
		retlw	high font_ya		;や
		retlw	low font_ya		;
		retlw	high font_ke		;け
		retlw	low font_ke		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_no		;の
		retlw	low font_no		;

		retlw	high font_a		;あ
		retlw	low font_a		;
		retlw	high font_ka		;か
		retlw	low font_ka		;
		retlw	high font_to		;と
		retlw	low font_to		;
		retlw	high font_n		;ん
		retlw	low font_n		;
		retlw	high font_bo		;ぼ
		retlw	low font_bo		;

		retlw	high font_o		;お
		retlw	low font_o		;
		retlw	high font_wa		;わ
		retlw	low font_wa		;
		retlw	high font_re		;れ
		retlw	low font_re		;
		retlw	high font_te		;て
		retlw	low font_te		;

		retlw	high font_mi		;み
		retlw	low font_mi		;
		retlw	high font_ta		;た
		retlw	low font_ta		;
		retlw	high font_no		;の
		retlw	low font_no		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ha		;は
		retlw	low font_ha		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;

		retlw	high font_i		;い
		retlw	low font_i		;
		retlw	high font_tu		;つ
		retlw	low font_tu		;
		retlw	high font_no		;の
		retlw	low font_no		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_hi		;ひ
		retlw	low font_hi		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ka		;か
		retlw	low font_ka		;
;
		retlw	high font_ya		;や
		retlw	low font_ya		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ma		;ま
		retlw	low font_ma		;
		retlw	high font_no		;の
		retlw	low font_no		;

		retlw	high font_ha		;は
		retlw	low font_ha		;
		retlw	high font_ta		;た
		retlw	low font_ta		;
		retlw	high font_ke		;け
		retlw	low font_ke		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_no		;の
		retlw	low font_no		;

		retlw	high font_ku		;く
		retlw	low font_ku		;
		retlw	high font_wa		;わ
		retlw	low font_wa		;
		retlw	high font_no		;の
		retlw	low font_no		;
		retlw	high font_mi		;み
		retlw	low font_mi		;
		retlw	high font_wo		;を
		retlw	low font_wo		;

		retlw	high font_ko		;こ
		retlw	low font_ko		;
		retlw	high font_ka		;か
		retlw	low font_ka		;
		retlw	high font_go		;ご
		retlw	low font_go		;
		retlw	high font_ni		;に
		retlw	low font_ni		;

		retlw	high font_tu		;つ
		retlw	low font_tu		;
		retlw	high font_n		;ん
		retlw	low font_n		;
		retlw	high font_da		;だ
		retlw	low font_da		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ha		;は
		retlw	low font_ha		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;

		retlw	high font_ma		;ま
		retlw	low font_ma		;
		retlw	high font_bo		;ぼ
		retlw	low font_bo		;
		retlw	high font_ro		;ろ
		retlw	low font_ro		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_si		;し
		retlw	low font_si		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ka		;か
		retlw	low font_ka		;
;
		retlw	h'ff'			;２文字指示
		retlw	high font_zi		;じ   <<
		retlw	low font_zi		;
		retlw	high font_lyu		;ゅ   <<
		retlw	low font_lyu		;
		retlw	high font_u		;う
		retlw	low font_u		;
		retlw	high font_go		;ご
		retlw	low font_go		;
		retlw	high font_de		;で
		retlw	low font_de		;

		retlw	high font_ne		;ね
		retlw	low font_ne		;
		retlw	high font_e		;え
		retlw	low font_e		;
		retlw	high font_ya		;や
		retlw	low font_ya		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ha		;は
		retlw	low font_ha		;

		retlw	high font_yo		;よ
		retlw	low font_yo		;
		retlw	high font_me		;め
		retlw	low font_me		;
		retlw	high font_ni		;に
		retlw	low font_ni		;
		retlw	high font_i		;い
		retlw	low font_i		;
		retlw	high font_ki		;き
		retlw	low font_ki		;

		retlw	high font_o		;お
		retlw	low font_o		;
		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_to		;と
		retlw	low font_to		;
		retlw	high font_no		;の
		retlw	low font_no		;

		retlw	high font_ta		;た
		retlw	low font_ta		;
		retlw	high font_yo		;よ
		retlw	low font_yo		;
		retlw	high font_ri		;り
		retlw	low font_ri		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_mo		;も
		retlw	low font_mo		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;

		retlw	high font_ta		;た
		retlw	low font_ta		;
		retlw	high font_e		;え
		retlw	low font_e		;
		retlw	high font_ha		;は
		retlw	low font_ha		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_te		;て
		retlw	low font_te		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ta		;た
		retlw	low font_ta		;
;
		retlw	high font_yu		;ゆ
		retlw	low font_yu		;
		retlw	high font_u		;う
		retlw	low font_u		;
		retlw	high font_ya		;や
		retlw	low font_ya		;
		retlw	high font_ke		;け
		retlw	low font_ke		;

		retlw	high font_ko		;こ
		retlw	low font_ko		;
		retlw	high font_ya		;や
		retlw	low font_ya		;
		retlw	high font_ke		;け
		retlw	low font_ke		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_no		;の
		retlw	low font_no		;

		retlw	high font_a		;あ
		retlw	low font_a		;
		retlw	high font_ka		;か
		retlw	low font_ka		;
		retlw	high font_to		;と
		retlw	low font_to		;
		retlw	high font_n		;ん
		retlw	low font_n		;
		retlw	high font_bo		;ぼ
		retlw	low font_bo		;

		retlw	high font_to		;と
		retlw	low font_to		;
		retlw	high font_ma		;ま
		retlw	low font_ma		;
		retlw	high font_ltu		;っ
		retlw	low font_ltu		;
		retlw	high font_te		;て
		retlw	low font_te		;

		retlw	high font_i		;い
		retlw	low font_i		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ru		;る
		retlw	low font_ru		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_yo		;よ
		retlw	low font_yo		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;

		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_o		;お
		retlw	low font_o		;
		retlw	high font_no		;の
		retlw	low font_no		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_sa		;さ
		retlw	low font_sa		;
		retlw	high font_cyo		;ー
		retlw	low font_cyo		;
		retlw	high font_ki		;き
		retlw	low font_ki		;
		retlw	0

;==========================================================================
;		rtsw_sel = 9:  処理
;==========================================================================

;==========================================================================
;		rtsw_sel = 10: 処理
;==========================================================================

blank_process		;-------



		bcf	exit_flg,7		;処理打ち切りフラグ = OFF
		movlp	high main
		goto	main			;メイン処理に戻る

;==========================================================================
;--------------------------------------------------------------------------
 		org	h'1000'			;(Page 2)
;--------------------------------------------------------------------------
;==========================================================================

;==========================================================================
;		MAX7219 レジスタの基本制御
;==========================================================================

		; マトリクス LED モジュールの初期化

max_led_init
		movlw	h'0f'			;ディスプレイテストレジスタ
		movwf	reg_addr
		movlw	h'00'			;通常動作
		movwf	reg_data
		call	max_led_contr

		movlw	h'09'			;デコードモードレジスタ
		movwf	reg_addr
		movlw	h'00'			;デコードなし
		movwf	reg_data
		call	max_led_contr

		movlw	h'0a'			;輝度レジスタ
		movwf	reg_addr
		movlw	h'00'			;1/32 (minimum)
		movwf	reg_data
		call	max_led_contr

		movlw	h'0b'			;スキャン制限レジスタ
		movwf	reg_addr
		movlw	h'07'			;スキャン対象 8桁
		movwf	reg_data
		call	max_led_contr

		movlw	h'0c'			;シャットダウンレジスタ
		movwf	reg_addr
		movlw	h'01'			;通常動作
		movwf	reg_data
		call	max_led_contr

		call	digit_reg_clr		;全 Digit レジスタのクリア
		return		

;--------------------------------------------------------------------------

;		同一データ MAX7219 x 8個分の制御

max_led_contr
		bcf	PORTC,maxLOAD		;maxLOAD="L"
		movlw	8			;
		movwf	lp_cnt1			;ループカウンタにセット

maxcont01	movf	reg_addr,W		;レジスタアドレス
		call	max_byte_send
		movf	reg_data,W		;レジスタデータ
		call	max_byte_send

		decfsz	lp_cnt1,F		;8個分送信した か？
		goto	maxcont01		;No

		bsf	PORTC,maxLOAD		;maxLOAD="H"
		return		

;--------------------------------------------------------------------------

;		データ 1 バイト送信 

max_byte_send
		movwf	maxtmp			;Wレジスタの内容を保存
		movlw	8
		movwf	mbit_cnt		;ループカウンタにセット

mbsend01	bcf	PORTC,maxDIN		;maxDIN="L"
		btfsc	maxtmp,7		;送り出しデータの 7ビット目 = 1 か？
		bsf	PORTC,maxDIN		;Yes. maxDIN="H"
		bsf	PORTC,maxCLK		;maxCLK="H"
		nop
		bcf	PORTC,maxCLK		;maxCLK="L"

		rlf	maxtmp,F		;送り出しデータを 1ビット左にシフト
		decfsz	mbit_cnt,F		;8ビット送信した か？
		goto	mbsend01		;No

		return		

;--------------------------------------------------------------------------

;		全 Digit レジスタのクリア

digit_reg_clr
		clrf	reg_data		;レジスタデータ
		movlw	8			;Digit レジスタ数
		movwf	reg_addr		;ループカウンタにセット

dclr01		call	max_led_contr
		decfsz	reg_addr,F		;全 Digit レジスタに送信した か？
		goto	dclr01			;No

		return

;--------------------------------------------------------------------------

;		LED を 1 秒間消灯

led_1s_off
		movlw	h'0c'			;シャットダウンレジスタ
		movwf	reg_addr
		clrf	reg_data		;シャットダウン（LED 消灯）
		call	max_led_contr

		movlp	high wait_1sec
		call	wait_1sec		;1 秒 ウェイト
		movlp	high $

		movlw	h'0c'			;シャットダウンレジスタ
		movwf	reg_addr
		movlw	h'01'			;通常動作
		movwf	reg_data
		call	max_led_contr
		return		

;--------------------------------------------------------------------------

;		ノーオペレーション

no_operation
		movwf	lp_cnt1			;ループカウンタ1 にセット
		movf	lp_cnt1,W		;
		btfsc	STATUS,Z		;W = 0 か？
		goto	nop02			;Yes

nop01		clrw				;no-opレジスタ
		call	max_byte_send		;
		clrw				;dummy
		call	max_byte_send		;
		decfsz	lp_cnt1,F		;ループカウンタ1 - 1 = 0 か？
		goto	nop01			;No

nop02		return

;==========================================================================
;	     各種文字フォントデータの読み出しとバッファへ格納
;==========================================================================

#ifdef comment
;--------------------------------------------------------------------------
;     8x8 文字フォントデータの読み出しとビット列の反転後バッファへ格納
;   ( フォントデータ segment のビット列並びを逆に変換してバッファへ格納 )
;--------------------------------------------------------------------------

;		Font8kRead_M マクロ命令定義

Font8kRead_M	macro	@font
		movlw	high @font		;文字フォントデータの先頭 high アドレス
		movwf	FSR1H
		movlw	low @font		;文字フォントデータの先頭 low アドレス
		movwf	FSR1L
		call	font8k_read_buff	;文字フォントデータの読み出し
		endm

;--------------------------------------------------------------------------

;	  汎用変数:	work1, work2, lp_cnt1, lp_cnt2

;	  入力:		FSR1H,FSR1L:  文字フォントデータの先頭アドレス

;	  出力:	 fd_buff(8 + 1 byte): フォントデータ（ビット列並びを逆に変換）

;	(例)	movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
;		movwf	FSR0H			;
;		movlw	low fd_buff		;
;		movwf	FSR0L			;間接アドレスに設定
;		Font8kRead_M font_a		;あ

;--------------------------------------------------------------------------

font8k_read_buff	;-------

		movlw	8			;
		movwf	lp_cnt2			;ループカウンタ2（digit カウンタ）

fr8buf01	moviw	FSR1++			;文字フォントデータの読み出し
		movwf	work1			;反転前のビット列
		movlw	8			;
		movwf	lp_cnt1			;ループカウンタ1（segment カウンタ）	

fr8buf02	rlf	work1,F			;C bit を出力
		rrf	work2,F			;C bit を入力
		decfsz	lp_cnt1,F		;ループカウンタ1 - 1 = 0 か？
		goto	fr8buf02		;No

		movf	work2,W			;反転後のビット列
		movwi	FSR0++			;バッファへ格納
		decfsz	lp_cnt2,F		;ループカウンタ2 - 1 = 0 か？
		goto	fr8buf01		;No

		clrw				;h'00'
		movwi	FSR0++			;バッファへ追加格納
		return
#endif

;--------------------------------------------------------------------------
;	   5x7(8) 標準文字フォントデータの読み出しとバッファへ格納
;--------------------------------------------------------------------------

;	  汎用変数:	lp_cnt2

;	  入力:		  W: 読み出し文字コード

;	  出力:	 fd_buff(5 + 1 byte): フォントデータ

;	(例)	movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
;		movwf	FSR0H			;間接アドレスに設定
;		movlw	low fd_buff		;
;		movwf	FSR0L			;
;			:
;		call	font5s_read_buff	;標準フォントデータの読み出しとバッファへ格納

;--------------------------------------------------------------------------

font5s_read_buff	;-------

		movwf	FSR1L			;文字コード
		movlw	h'06'			;h'06'コードがテーブルの先頭
		subwf	FSR1L,F
		clrf	FSR1H

		movf	FSR1L,W			;1倍
		lslf	FSR1L,F			;2倍
		rlf	FSR1H,F			;
		rlf	FSR1L,F			;4倍
		rlf	FSR1H,F			;
		addwf	FSR1L,F			;5倍
		clrw
		addwfc	FSR1H,F			;

		movlw	low font5x7s_data_tbl	;標準文字フォントデータの先頭 low アドレス
		addwf	FSR1L,F
		movlw	high font5x7s_data_tbl	;標準文字フォントデータの先頭 high アドレス
		addwfc	FSR1H,F

		movlw	5			;
		movwf	lp_cnt2			;ループカウンタ2

fr5buf01	moviw	FSR1++			;文字フォントデータの読み出し
		movwi	FSR0++			;バッファへ格納
		decfsz	lp_cnt2,F		;ループカウンタ2 - 1 = 0 か？
		goto	fr5buf01		;No

		clrw				;h'00'
		movwi	FSR0++			;バッファへ追加格納
		return

;--------------------------------------------------------------------------
;   5x7(8) プロポーショナル文字フォントデータの読み出しとバッファへ格納
;--------------------------------------------------------------------------

;	  汎用変数:	lp_cnt2

;	  入力:		W: 読み出し文字コード

;	  出力:	 fd_buff(p + 1 byte): フォントデータ

;	(例)	movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
;		movwf	FSR0H			;間接アドレスに設定
;		movlw	low fd_buff		;
;		movwf	FSR0L			;
;			:
;		call	font5p_read_buff	;プロポーショナルフォントデータの読み出しとバッファへ格納

;--------------------------------------------------------------------------

font5p_read_buff	;-------

		movwf	FSR1L			;文字コード
		movlw	h'20'			;h'20'コードがテーブルの先頭
		subwf	FSR1L,F
		clrf	FSR1H

		lslf	FSR1L,F			;2倍
		movf	FSR1L,W			;
		rlf	FSR1H,F			;
		rlf	FSR1L,F			;4倍
		rlf	FSR1H,F			;
		addwf	FSR1L,F			;6倍
		clrw
		addwfc	FSR1H,F			;

		movlw	low font5x7p_data_tbl	;プロポーショナル文字フォントデータの先頭 low アドレス
		addwf	FSR1L,F
		movlw	high font5x7p_data_tbl	;プロポーショナル文字フォントデータの先頭 high アドレス
		addwfc	FSR1H,F

		moviw	FSR1++			;バイト幅の読み出し
		movwf	lp_cnt2			;ループカウンタ2

fr5pbuf01	moviw	FSR1++			;文字フォントデータの読み出し
		movwi	FSR0++			;バッファへ格納
		decfsz	lp_cnt2,F		;ループカウンタ2 - 1 = 0 か？
		goto	fr5pbuf01		;No

		clrw				;h'00'
		movwi	FSR0++			;バッファへ追加格納
		return

;--------------------------------------------------------------------------
;	  １行メッセージの読み出し (プロポーショナル文字フォント)
;--------------------------------------------------------------------------

;	 汎用変数:	work1

;	 exit_flg:	bit0: １文字打ち切りフラグ

;	(例)	movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
;		movwf	FSR0H			;
;		movlw	low fd_buff		;
;		movwf	FSR0L			;間接アドレスに設定
;
;		movlw	high select_msg		;メッセージの先頭アドレス
;		movwf	addr_high		;
;		movlw	low select_msg		;
;		movwf	addr_low		;間接アドレスに設定
;		bcf	exit_flg,0		;１文字打ち切りフラグ = OFF
;
;		call	message_p_read		;１行メッセージの読み出し (プロポーショナル文字フォント)

;--------------------------------------------------------------------------

message_p_read		;-------

msgrd01		call	msg_tbl_read		;テーブルデータの読み出し
		movwf	work1			;退避
		movlw	high $
		movwf	PCLATH
		incf	addr_low,F		;読み出すデータの low アドレスの更新
		btfsc	STATUS,Z		;オーバーフローした場合は
		incf	addr_high,F		;読み出すデータの high アドレスの更新

		movf	work1,W			;復帰
		btfsc	STATUS,Z		;h'00' か？	
		goto	msgrd03			;Yes

		addlw	1			;
		btfss	STATUS,Z		;h'ff' か？	
		goto	msgrd02			;No

		clrw				;h'00'
		movwi	FSR0++			;バッファへ格納
		goto	msgrd01

msgrd02		movf	work1,W			;復帰
		call	font5p_read_buff	;プロポーショナルフォントデータの読み出しとバッファへ格納
		btfss	exit_flg,0		;１文字打ち切りフラグ = ON か？
		goto	msgrd01			;No

msgrd03		return

;--------------------------------------------------------------------------

		; テーブルデータの１文字読み出し
msg_tbl_read
		movf	addr_high,W		;読み出すデータの high アドレス
		movwf	PCLATH
		movf	addr_low,W		;読み出すデータの low アドレス
		movwf	PCL

;--------------------------------------------------------------------------
;		LED モジュール８桁分の縦横ビットのデータ変換
;--------------------------------------------------------------------------

;	変換対象バッファ: fd_buff (8 x 8 = 64 バイト)

;	汎用変数:	  b16_hi, b16_lo, lp_cnt1, lp_cnt2, lp_cnt3
;	ワークバッファ:	  fd_buff + 64 (8 バイト)

;--------------------------------------------------------------------------

verti_horiz_conv_x8	;-------

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movlw	low fd_buff		;
		movwf	m_fsr0l			;退避

		movlw	8			;変換する桁数
		call	verti_horiz_conv	;ｎ桁分の縦横ビットのデータ変換
		return

;--------------------------------------------------------------------------
;  LED モジュールｎ桁分の縦横ビットのデータ変換（ビット列の反転機能付き）
;--------------------------------------------------------------------------

;	変換対象バッファ: 任意 fd_buff (8 x n バイト)
;	W レジスタ:	  変換する桁数

;	汎用変数:	  b16_hi, b16_lo, lp_cnt1, lp_cnt2, lp_cnt3
;	変換フラグ:	  vhcv_flg
;	ワークバッファ:	  fd_buff + 64 (8 バイト)

;#define 	m_fsr0h		b16_hi
;#define 	m_fsr0l		b16_lo

; 格納先バッファ                                                                ワークバッファ
; fd_buff+0      +8*1     +8*2     +8*3     +8*4     +8*5     +8*6     +8*7     +8*8   +8*8+7
;	 |        |        |        |        |        |        |        |        |      |
;	+--------+--------+--------+--------+--------+--------+--------+--------+--------+ +
;	|        |        |        |        |        |        |        |        |        | |
;	|        |        |        |        |        |        |        |        |        | | 8 bit
;	|        |        |        |        |        |        |        |        |        | |
;	+--------+--------+--------+--------+--------+--------+--------+--------+--------+ +
;	                                                                        +--------+
;	                                                                          8 byte
;--------------------------------------------------------------------------

horiz_verti_conv	;------- 横→縦ビットのデータ変換

		bsf	vhcv_flg,7		;縦横ビット変換フラグ = ON
		goto	vhcnv00

verti_horiz_conv	;------- 縦→横ビットのデータ変換

		bcf	vhcv_flg,7		;縦横ビット変換フラグ = OFF

vhcnv00		movwf	lp_cnt1			;ループカウンタ1（桁数カウンタ）

vhcnv01		movlw	high (fd_buff + 8 * 8)	;ワークバッファの先頭アドレス
		movwf	FSR1H			;
		movlw	low (fd_buff + 8 * 8)	;
		movwf	FSR1L			;FSR1H:FSR1L 間接アドレスに設定

		movlw	8			;8 バイト
		movwf	lp_cnt2			;ループカウンタ2（バイトカウンタ）

vhcnv02		movf	m_fsr0h,W		;退避したバッファの先頭アドレス
		movwf	FSR0H			;
		movf	m_fsr0l,W		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		movlw	8			;8 ビット
		movwf	lp_cnt3			;ループカウンタ3（ビットカウンタ）

vhcnv03		btfss	vhcv_flg,7		;縦横ビット変換フラグ = OFF か？
		rrf	INDF0,F			;Yes. C bit を右(LSB)から出力
		btfsc	vhcv_flg,7		;縦横ビット変換フラグ = ON か？
		rlf	INDF0,F			;Yes. C bit を左(MSB)から出力

		rrf	INDF1,F			;C bit を入力
		addfsr	FSR0,1			;間接アドレス FSR0H:FSR0L + 1
		decfsz	lp_cnt3,F		;ループカウンタ3（ビットカウンタ）- 1 = 0 か？
		goto	vhcnv03			;No

		addfsr	FSR1,1			;間接アドレス FSR1H:FSR1L + 1
		decfsz	lp_cnt2,F		;ループカウンタ2（バイトカウンタ）- 1 = 0 か？
		goto	vhcnv02			;No
;
		movlw	high (fd_buff + 8 * 8)	;ワークバッファの先頭アドレス
		movwf	FSR1H			;
		movlw	low (fd_buff + 8 * 8)	;
		movwf	FSR1L			;FSR1H:FSR1L 間接アドレスに設定

		movf	m_fsr0h,W		;退避したバッファの先頭アドレス
		movwf	FSR0H			;
		movf	m_fsr0l,W		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		movlw	8			;8 バイト
		movwf	lp_cnt2			;ループカウンタ2（バイトカウンタ）

vhcnv04		moviw	FSR1++			;ワークから
		movwi	FSR0++			;バッファへ格納
		decfsz	lp_cnt2,F		;ループカウンタ2（バイトカウンタ）- 1 = 0 か？
		goto	vhcnv04			;No

		movf	FSR0H,W			;次のフォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movf	FSR0L,W			;
		movwf	m_fsr0l			;退避
		decfsz	lp_cnt1,F		;ループカウンタ1（桁数カウンタ）- 1 = 0 か？
		goto	vhcnv01			;No

		return

;==========================================================================
;		各種表示のマトリクス LED モジュールの表示
;==========================================================================

;--------------------------------------------------------------------------
;		ドットマトリクス LED ８桁分の表示
;--------------------------------------------------------------------------

;	表示対象バッファ: fd_buff (8 x 8 = 64 バイト)

;	汎用変数:	  b16_hi, b16_lo, lp_cnt1, digit

;#define 	m_fsr0h		b16_hi
;#define 	m_fsr0l		b16_lo
;#define 	dsp_cnt		segment

;--------------------------------------------------------------------------

dxled_display_x8	;-------

		movlw	high (fd_buff + 8 * 7)	;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 8 * 7)	;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		movlw	8			;
		movwf	dsp_cnt			;LED 8 桁分の表示
		clrf	nop_cnt
		call	dxled_display		;ドットマトリクス LED n 桁分の表示
		return

;--------------------------------------------------------------------------
;		ドットマトリクス LED ｎ桁分の表示
;--------------------------------------------------------------------------

dxled_display		;-------

		movlw	h'08'			;Digit = 7
		movwf	digit			;Digit の初期値

dxdsp01		movf	FSR0H,W			;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movf	FSR0L,W			;
		movwf	m_fsr0l			;退避

		movf	dsp_cnt,W		;
		movwf	lp_cnt1			;ループカウンタにセット
		bcf	PORTC,maxLOAD		;maxLOAD="L"

dxdsp02	;	movf	nop_cnt,W
	;	addwf	dsp_cnt,W
	;	sublw	8
	;	call	no_operation		;ノーオペレーション

		movf	digit,W			;Digit = X
		call	max_byte_send		;レジスタアドレス
		movf	INDF0,W			;バッファから読み出し
		call	max_byte_send		;レジスタデータ
						;間接アドレスを１つ前の桁にする
		addfsr	FSR0,-8			;間接アドレス FSR0H:FSR0L - 8
		decfsz	lp_cnt1,F		;dsp_cnt 分表示した か？
		goto	dxdsp02			;No

		movf	nop_cnt,W
		call	no_operation		;ノーオペレーション

		bsf	PORTC,maxLOAD		;maxLOAD="H"
		movf	m_fsr0h,W		;退避したバッファの先頭アドレス
		movwf	FSR0H			;
		movf	m_fsr0l,W		;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		addfsr	FSR0,1			;間接アドレス FSR0H:FSR0L + 1
		decfsz	digit,F			;全 Digit 表示した か？
		goto	dxdsp01			;No

		return		

;--------------------------------------------------------------------------
;	   ロータリスイッチ選択メッセージを LED モジュールに表示
;--------------------------------------------------------------------------

		; rtsw_sel:	ロータリスイッチ選択フラグ
				; bit7:   初期メッセージ表示指示フラグ
				; bit6:   ブリンク反転フラグ (タイマー０割り込みで設定)
				; bit5:   ブリンク変更フラグ (　　　　　〃　　　　　　)
				; bit4:   設定値 10 以上フラグ (設定値の表示時のみ使用)
				; bit3-0: ロータリスイッチ設定値 (1 ～ 12)

;--------------------------------------------------------------------------

select_msg_display	;-------

		btfss	rtsw_sel,7		;初期メッセージ表示指示フラグ rtsw_sel.7 = ON か？
		goto	seldsp01		;No

		; ロータリスイッチ選択メッセージのバッファ格納

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;間接アドレスに設定

		movlw	high select_msg		;メッセージの先頭アドレス
		movwf	addr_high		;
		movlw	low select_msg		;
		movwf	addr_low		;間接アドレスに設定
		bcf	exit_flg,0		;１文字打ち切りフラグ = OFF

		call	message_p_read	 ;00-48	;１行メッセージの読み出し (プロポーショナル文字フォント)

		movlw	15			;
		call	zz_buff		 ;49-63	;h'00' 15 個バッファへ格納

		; ロータリスイッチ選択メッセージの縦横ビット変換と LED 表示

		call	verti_horiz_conv_x8	;８桁分の縦横ビットのデータ変換
		call	dxled_display_x8	;ドットマトリクス LED ８桁分の表示
		bcf	rtsw_sel,7		;初期メッセージ表示指示フラグ rtsw_sel.7 = OFF

;---------------

seldsp01	btfss	rtsw_sel,5		;ブリンク変更フラグ rtsw_sel.5 = ON か？
		goto	seldsp04		;No

		; ロータリスイッチ設定値 (1 ～ 12) のバッファ格納

		movlw	high (fd_buff + 8 * 6)	;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 8 * 6)	;
		movwf	FSR0L			;間接アドレスに設定

		clrw				;h'00'
		movwi	FSR0++		 ;48	;バッファへ格納
		movlw	'_'
		call	font5p_read_buff ;49-53	;プロポーショナルフォントデータの読み出しとバッファへ格納

		btfss	rtsw_sel,6	 	;ブリンク反転フラグ rtsw_sel.6 = ON か？
		goto	seldsp02		;No

		movlw	10			;ブリンク (滅)
		call	zz_buff		 ;54-63	;h'00' 10 個バッファへ格納
		goto	seldsp03		;

seldsp02	clrw				;h'00'
		movwi	FSR0++		 ;54	;バッファへ格納

		movf	rtsw_sel,W		;
		andlw	h'0f'			;
		sublw	10 - 1			;(10 - 1) - W
		btfss	STATUS,C		;(10 - 1) >= W か？	
		bsf	rtsw_sel,4	 	;No. 10 以上フラグ = ON

		movlw	' '			;ゼロサプレス
		btfsc	rtsw_sel,4	 	;10 以上フラグ = ON か？
		movlw	'1'			;Yes
		call	font5p_read_buff ;55-58	;プロポーショナルフォントデータの読み出しとバッファへ格納
		movwi	4[FSR0]		 ;63	;次が '1' のときのため

		clrw				;W=0
		btfsc	rtsw_sel,4	 	;10 以上フラグ = ON か？
		movlw	10			;Yes. W=10
		subwf	rtsw_sel,W		;単位: rtsw_sel - W
		andlw	h'0f'			;
		iorlw	h'30'			;
		call	font5p_read_buff ;59-63	;プロポーショナルフォントデータの読み出しとバッファへ格納
		bcf	rtsw_sel,4	 	;10 以上フラグ = OFF

		; ロータリスイッチ設定値 (1 ～ 12) の縦横ビット変換と LED 表示

seldsp03	movlw	high (fd_buff + 8 * 6)	;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movlw	low (fd_buff + 8 * 6)	;
		movwf	m_fsr0l			;退避
		movlw	2			;LED モジュール 2 桁分の
		call	verti_horiz_conv	;縦横ビットのデータ変換

		movlw	high (fd_buff + 8 * 7)	;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 8 * 7)	;
		movwf	FSR0L			;間接アドレスに設定
		movlw	2
		movwf	dsp_cnt			;2 桁分
		movlw	6
		movwf	nop_cnt
		call	dxled_display		;LED モジュール 2 桁分の表示
		bcf	rtsw_sel,5		;ブリンク変更フラグ rtsw_sel.5 = OFF

seldsp04	return

select_msg	dt	h'ff',"Select.SW",h'ff',"?",0

;--------------------------------------------------------------------------

		; h'00' を指定個バッファへ格納
zz_buff
		addlw	0
		btfsc	STATUS,Z		;W = 0 か？
		goto	zzbuf01			;Yes

		movwf	lp_cnt3			;ループカウンタ3 にセット
		clrw				;'h'00'
		movwi	FSR0++			;バッファへ格納
		decfsz	lp_cnt3,F		;ループカウンタ3 - 1 = 0 か？
		goto	$ - 2			;No

zzbuf01		return

;--------------------------------------------------------------------------
;		LED の輝度調節メッセージを LED モジュールに表示
;--------------------------------------------------------------------------

		; intensity:	輝度調節フラグ
				; bit7:   初期メッセージ表示指示フラグ
				; bit6:   ブリンク反転フラグ (タイマー０割り込みで設定)
				; bit5:   ブリンク変更フラグ (　　　　　〃　　　　　　)
				; bit4:   輝度更新フラグ
				; bit3-0: 輝度調節値 (0 ～ 9)

;--------------------------------------------------------------------------

brightness_msg_display	;-------

		btfss	intensity,7		;初期メッセージ表示指示フラグ intensity.7 = ON か？
		goto	bridsp01		;No

		; 輝度調節メッセージのバッファ格納

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;間接アドレスに設定

		movlw	high brightness_msg	;メッセージの先頭アドレス
		movwf	addr_high		;
		movlw	low brightness_msg	;
		movwf	addr_low		;間接アドレスに設定
		bcf	exit_flg,0		;１文字打ち切りフラグ = OFF

		movlw	3		 ;00-02	;
		call	zz_buff			;h'00' 3 個バッファへ格納
		call	message_p_read	 ;03-55	;１行メッセージの読み出し (プロポーショナル文字フォント)

		; 輝度調節メッセージの縦横ビット変換と LED 表示

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movlw	low fd_buff		;
		movwf	m_fsr0l			;退避
		movlw	7			;LED モジュール 7 桁分の
		call	verti_horiz_conv	;縦横ビットのデータ変換

		movlw	high (fd_buff + 8 * 6)	;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 8 * 6)	;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定
		movlw	7
		movwf	dsp_cnt			;7 桁分
		clrf	nop_cnt
		call	dxled_display		;LED モジュール 7 桁分の表示
		bcf	intensity,7		;初期メッセージ表示指示フラグ intensity.7 = OFF

;---------------

bridsp01	btfss	intensity,5		;ブリンク変更フラグ intensity.5 = ON か？
		goto	bridsp04		;No

		; 輝度調節値 (0 ～ 9) のバッファ格納

		movlw	high (fd_buff + 8 * 7)	;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 8 * 7)	;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		btfss	intensity,6		;ブリンク反転フラグ intensity.6 = ON か？
		goto	bridsp02		;No

		movlw	8			;ブリンク (滅)
		call	zz_buff		 ;56-63	;h'00' 8 個バッファへ格納
		goto	bridsp03		;縦横ビットのデータ変換を省略

bridsp02	clrw				;h'00'
		movwi	FSR0++		 ;56	;バッファへ格納
		movwi	6[FSR0]		 ;63	;次が '1' のときのため
		movf	intensity,W		;輝度調節値
		andlw	h'0f'
		iorlw	h'30'
		call	font5p_read_buff ;57-61	;プロポーショナルフォントデータの読み出しとバッファへ格納
		movlw	2			;
		call	zz_buff		 ;62-63	;h'00' 2 個バッファへ格納

		; 輝度調節値 (0 ～ 9) の縦横ビット変換と LED 表示

		movlw	high (fd_buff + 8 * 7)	;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movlw	low (fd_buff + 8 * 7)	;
		movwf	m_fsr0l			;退避
		movlw	1			;LED モジュール 1 桁分の
		call	verti_horiz_conv	;縦横ビットのデータ変換

bridsp03	movlw	high (fd_buff + 8 * 7)	;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 8 * 7)	;
		movwf	FSR0L			;間接アドレスに設定
		movlw	1
		movwf	dsp_cnt			;1 桁分
		movlw	7
		movwf	nop_cnt
		call	dxled_display		;LED モジュール 7 桁分の表示
		bcf	intensity,5		;ブリンク変更フラグ intensity.5 = OFF

bridsp04	return

brightness_msg	dt	"Brightness",h'ff',"=",0

;--------------------------------------------------------------------------
;		年月日（曜日）をマトリクス LED モジュールに表示
;--------------------------------------------------------------------------

 		; disp_flg:	LED 表示フラグ
			     ;>	; bit7: 年表示フラグ
			     ;>	; bit6: 月表示フラグ
			     ;>	; bit5: 日表示フラグ
				; bit4: 時表示フラグ
				; bit3: 分表示フラグ
				; bit2: 秒表示フラグ
				; bit1: 温度表示フラグ
				; bit0: 湿度表示フラグ

 		; mode_flg:	年月日,時分秒の設定モードフラグ
				; bit7: 設定モードフラグ
				; bit6: ブリンク反転フラグ (タイマー０割り込みで設定)
				; bit5: ブリンク変更フラグ (　　　　　〃　　　　　　)

;--------------------------------------------------------------------------

date_display	;-------

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;間接アドレスに設定

		btfsc	mode_flg,7		;設定モードフラグ mode_flg.7 = ON か？
		goto	dtdsp01			;Yes

		btfsc	disp_flg,7		;bit7: 年表示フラグ = ON か？
		goto	dtdsp02			;Yes
		goto	dtdsp04			;No

		; 年 フォントデータのバッファ格納

;		|                       |                       |
;		 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
;		 ＿ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿  ． ．

dtdsp01		btfss	disp_flg,7		;bit7: 年表示(ブリンク対象)フラグ = ON か？
		goto	dtdsp02			;No

		btfss	mode_flg,6		;ブリンク反転フラグ mode_flg.6 = ON か？
		goto	dtdsp02			;No

		movlw	14
		call	zz_buff		 ;00-13	;h'00' 14個バッファへ格納
		goto	dtdsp03

dtdsp02		movlw	2
		call	zz_buff		 ;00-01	;h'00' 2個バッファへ格納
		swapf	bcd_yy,W		;"YH": 年 BCD カウンタ
		andlw	h'0f'
		iorlw	h'30'
		call	font5s_read_buff ;02-07	;標準フォントデータの読み出しとバッファへ格納
		movf	bcd_yy,W		;"YL": 年 BCD カウンタ
		andlw	h'0f'
		iorlw	h'30'
		call	font5s_read_buff ;08-13	;標準フォントデータの読み出しとバッファへ格納

dtdsp03		movlw	h'60'			;'.'
		movwi	FSR0++		 ;14	;バッファへ格納
		movwi	FSR0++		 ;15	;バッファへ格納

		; 年 バッファの縦横ビット変換

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movlw	low fd_buff		;
		movwf	m_fsr0l			;退避
		movlw	2			;LED モジュール 2 桁分の
		call	verti_horiz_conv	;縦横ビットのデータ変換

;---------------

dtdsp04		movlw	high (fd_buff + 8 * 2)	;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 8 * 2)	;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		btfsc	mode_flg,7		;設定モードフラグ mode_flg.7 = ON か？
		goto	dtdsp05			;Yes

		btfsc	disp_flg,6		;bit6: 月表示フラグ = ON か？
		goto	dtdsp06			;Yes
		goto	dtdsp08			;No

		; 月 フォントデータのバッファ格納

;		|                       |                       |
;		 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
;		 ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿  ． ．＿

dtdsp05		btfss	disp_flg,6		;bit6: 月表示(ブリンク対象)フラグ = ON か？
		goto	dtdsp06			;No

		btfss	mode_flg,6		;ブリンク反転フラグ mode_flg.6 = ON か？
		goto	dtdsp06			;No

		movlw	13
		call	zz_buff		 ;16-28	;h'00' 13個バッファへ格納
		goto	dtdsp07

dtdsp06		clrw				;h'00'
		movwi	FSR0++		 ;16	;バッファへ格納
		swapf	bcd_nn,W		;"NH": 月 BCD カウンタ
		andlw	h'0f'
		iorlw	h'30'
		call	font5s_read_buff ;17-22	;標準フォントデータの読み出しとバッファへ格納
		movf	bcd_nn,W		;"NH": 月 BCD カウンタ
		andlw	h'0f'
		iorlw	h'30'
		call	font5s_read_buff ;23-28	;標準フォントデータの読み出しとバッファへ格納

dtdsp07		movlw	h'60'			;'.'
		movwi	FSR0++		 ;29	;バッファへ格納
		movwi	FSR0++		 ;30	;バッファへ格納
		clrw				;h'00'
		movwi	FSR0++		 ;31	;バッファへ格納

		; 月 バッファの縦横ビット変換

		movlw	high (fd_buff + 8 * 2)	;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movlw	low (fd_buff + 8 * 2)	;
		movwf	m_fsr0l			;退避
		movlw	2			;LED モジュール 2 桁分の
		call	verti_horiz_conv	;縦横ビットのデータ変換

;---------------

dtdsp08		movlw	high (fd_buff + 8 * 4)	;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 8 * 4)	;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		btfsc	mode_flg,7		;設定モードフラグ mode_flg.7 = ON か？
		goto	dtdsp09			;Yes

		btfsc	disp_flg,5		;bit5: 日表示フラグ = ON か？
		goto	dtdsp10			;Yes
		goto	dtdsp14			;No

		; 日 フォントデータのバッファ格納

;	|                       |                       |                       |                       |
;	 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
;	 ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ＿

dtdsp09		btfss	disp_flg,5		;bit5: 日表示(ブリンク対象)フラグ = ON か？
		goto	dtdsp10			;No

		btfss	mode_flg,6		;ブリンク反転フラグ mode_flg.6 = ON か？
		goto	dtdsp10			;No

		movlw	13
		call	zz_buff		 ;32-44	;h'00' 13個バッファへ格納
		goto	dtdsp11

dtdsp10		swapf	bcd_dd,W		;"DH": 日 BCD カウンタ
		andlw	h'0f'
		iorlw	h'30'
		call	font5s_read_buff ;32-37	;標準フォントデータの読み出しとバッファへ格納
		movf	bcd_dd,W		;"DL": 日 BCD カウンタ
		andlw	h'0f'
		iorlw	h'30'
		call	font5s_read_buff ;38-43	;標準フォントデータの読み出しとバッファへ格納
		clrw				;h'00'
		movwi	FSR0++		 ;44	;バッファへ格納
;
		btfsc	mode_flg,7		;設定モードフラグ mode_flg.7 = ON か？
		goto	dtdsp11			;Yes

		btfss	bcd_ss,0		;秒 BCD カウンタ = 偶数 か？
		goto	dtdsp11			;Yes

		movlw	19			;曜日を１秒毎にブリンク
		call	zz_buff		 ;45-63	;h'00' 19個バッファへ格納
		goto	dtdsp13

dtdsp11		decf	bcd_ww,W		;曜日 BCD カウンタ
		movwf	addr_low
		lslf	addr_low,F		;2倍
		addwf	addr_low,F		;3倍
		movlw	low week_table
		addwf	addr_low,F		;曜日データテーブルの先頭 low アドレス
		clrf	addr_high
		movlw	high week_table
		addwfc	addr_high,F		;曜日データテーブルの先頭 high アドレス

		movlw	3
		movwf	lp_cnt1			;ループカウンタにセット

dtdsp12		call	msg_tbl_read		;テーブルデータの読み出し
		incf	addr_low,F		;読み出すデータの low アドレスの更新
		btfsc	STATUS,Z		;オーバーフローした場合は
		incf	addr_high,F		;読み出すデータの high アドレスの更新
		call	font5s_read_buff ;45-50	;標準フォントデータの読み出しとバッファへ格納
					 ;51-56
					 ;57-62
		decfsz	lp_cnt1,F		;ループカウンタ1 - 1 = 0 か？
		goto	dtdsp12			;No

		clrw				;h'00'
		movwi	FSR0++		 ;63	;バッファへ格納

		; 日 バッファの縦横ビット変換

dtdsp13		movlw	high (fd_buff + 8 * 4)	;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movlw	low (fd_buff + 8 * 4)	;
		movwf	m_fsr0l			;退避
		movlw	4			;LED モジュール 4 桁分の
		call	verti_horiz_conv	;縦横ビットのデータ変換

		; 年月日（曜日）の LED 表示

dtdsp14		movlw	b'11100000'		;年,月,日
		andwf	disp_flg,W		;
		btfss	STATUS,Z		;どれか LED 表示フラグ = ON か？
		call	dxled_display_x8	;Yes
		clrf	disp_flg
		return

;--------------------------------------------------------------------------

		; 曜日データテーブル
week_table
		dt	"SUN"			;Day = 1
		dt	"MON"			;      2
		dt	"TUE"			;      3
		dt	"WED"			;      4
		dt	"THU"			;      5
		dt	"FRI"			;      6
		dt	"SAT"			;      7

;--------------------------------------------------------------------------
;		時分秒をマトリクス LED モジュールに表示
;--------------------------------------------------------------------------

 		; disp_flg:	LED 表示フラグ
				; bit7: 年表示フラグ
				; bit6: 月表示フラグ
				; bit5: 日表示フラグ
			     ;>	; bit4: 時表示フラグ
			     ;>	; bit3: 分表示フラグ
			     ;>	; bit2: 秒表示フラグ
				; bit1: 温度表示フラグ
				; bit0: 湿度表示フラグ

 		; mode_flg:	年月日,時分秒の設定モードフラグ
				; bit7: 設定モードフラグ
				; bit6: ブリンク反転フラグ (タイマー０割り込みで設定)
				; bit5: ブリンク変更フラグ (　　　　　〃　　　　　　)

 		; time_flg:	時間表示フラグ
				; bit1: 0:24H/1:12H
				; bit0: 0:am/1:pm

;--------------------------------------------------------------------------

time_display	;-------

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;間接アドレスに設定

		btfsc	mode_flg,7		;設定モードフラグ mode_flg.7 = ON か？
		goto	tmdsp01			;Yes

		btfsc	disp_flg,4		;bit4: 時表示フラグ = ON か？
		goto	tmdsp01			;Yes
		goto	tmdsp07			;No

		; 時 フォントデータのバッファ格納

;	|                       |                       |                       |                       |
;	 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
;	 ＿ ＿ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ＿ ： ： ＿

tmdsp01		movf	bcd_hh,W		;時 BCD カウンタ
		movwf	temp_hh

		movlw	3		 ;00-02
		btfss	time_flg,1		;時間表示フラグ (bit1=0:24H/1:12H) = 1 か？
		movlw	16		 ;00-15	;No
		call	zz_buff			;h'00' 3 / 16 個バッファへ格納

		btfss	time_flg,1		;時間表示フラグ (bit1=0:24H/1:12H) = 1 か？
		goto	tmdsp02			;No

		call	cnv_24to12		;24時間表示を12時間表示に変換
		movlw	'A'
		btfsc	time_flg,0		;時間表示フラグ (bit0=0:am/1:pm) = 0 か？
		movlw	'P'			;No
		call	font5s_read_buff ;03-08	;標準フォントデータの読み出しとバッファへ格納
		movlw	'M'
		call	font5s_read_buff ;09-14	;標準フォントデータの読み出しとバッファへ格納
		clrw				;h'00'
		movwi	FSR0++		 ;15	;バッファへ格納

tmdsp02		btfss	mode_flg,7		;設定モードフラグ mode_flg.7 = ON か？
		goto	tmdsp03			;No

		btfss	disp_flg,4		;bit4: 時表示(ブリンク対象)フラグ = ON か？
		goto	tmdsp03			;No

		btfss	mode_flg,6		;ブリンク反転フラグ mode_flg.6 = ON か？
		goto	tmdsp03			;No

		movlw	13
		call	zz_buff		 ;16-28	;h'00' 13個バッファへ格納
		goto	tmdsp06

tmdsp03		btfss	time_flg,1		;時間表示フラグ (bit1=0:24H/1:12H) = 1 か？
		goto	tmdsp04			;No

		movlw	h'f0'
		andwf	temp_hh,W
		movlw	' '			;ゼロサプレス
		btfsc	STATUS,Z		;"HH" = 0 か？
		goto	tmdsp05			;Yes

tmdsp04		swapf	temp_hh,W		;"HH": 時 BCD カウンタ
		andlw	h'0f'
		iorlw	h'30'

tmdsp05		call	font5s_read_buff ;16-21	;標準フォントデータの読み出しとバッファへ格納
		movf	temp_hh,W		;"HL": 時 BCD カウンタ
		andlw	h'0f'
		iorlw	h'30'
		call	font5s_read_buff ;22-27	;標準フォントデータの読み出しとバッファへ格納
		clrw				;h'00'
		movwi	FSR0++		 ;28	;バッファへ格納

tmdsp06		movlw	h'36'			;':'
		movwi	FSR0++		 ;29	;バッファへ格納
		movwi	FSR0++		 ;30	;バッファへ格納
		clrw				;h'00'
		movwi	FSR0++		 ;31	;バッファへ格納

		; 時 バッファの縦横ビット変換

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movlw	low fd_buff		;
		movwf	m_fsr0l			;退避
		movlw	4			;LED モジュール 4 桁分の
		call	verti_horiz_conv	;縦横ビットのデータ変換

;---------------

tmdsp07		movlw	high (fd_buff + 8 * 4)	;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 8 * 4)	;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		btfsc	mode_flg,7		;設定モードフラグ mode_flg.7 = ON か？
		goto	tmdsp08			;Yes

		btfsc	disp_flg,3		;bit3: 分表示フラグ = ON か？
		goto	tmdsp09			;Yes
		goto	tmdsp11			;No

		; 分 フォントデータのバッファ格納

;		|                       |                       |
;		 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
;		 ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ＿ ： ：

tmdsp08		btfss	disp_flg,3		;bit3: 分表示(ブリンク対象)フラグ = ON か？
		goto	tmdsp09			;No

		btfss	mode_flg,6		;ブリンク反転フラグ mode_flg.6 = ON か？
		goto	tmdsp09			;No

		movlw	14
		call	zz_buff		 ;32-45	;h'00' 14個バッファへ格納
		goto	tmdsp10

tmdsp09		clrw				;h'00'
		movwi	FSR0++		 ;32	;バッファへ格納
		swapf	bcd_mm,W		;"MH": 分 BCD カウンタ
		andlw	h'0f'
		iorlw	h'30'
		call	font5s_read_buff ;33-38	;標準フォントデータの読み出しとバッファへ格納
		movf	bcd_mm,W		;"ML": 分 BCD カウンタ
		andlw	h'0f'
		iorlw	h'30'
		call	font5s_read_buff ;39-44	;標準フォントデータの読み出しとバッファへ格納
		clrw				;h'00'
		movwi	FSR0++		 ;45	;バッファへ格納

tmdsp10		movlw	h'36'			;':'
		movwi	FSR0++		 ;46	;バッファへ格納
		movwi	FSR0++		 ;47	;バッファへ格納

		; 分 バッファの縦横ビット変換

		movlw	high (fd_buff + 8 * 4)	;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movlw	low (fd_buff + 8 * 4)	;
		movwf	m_fsr0l			;退避
		movlw	2			;LED モジュール 2 桁分の
		call	verti_horiz_conv	;縦横ビットのデータ変換

;---------------

tmdsp11		movlw	high (fd_buff + 8 * 6)	;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 8 * 6)	;
		movwf	FSR0L			;FSR0H:FSR0L 間接アドレスに設定

		btfsc	mode_flg,7		;設定モードフラグ mode_flg.7 = ON か？
		goto	tmdsp12			;Yes

		btfsc	disp_flg,2		;bit2: 秒表示フラグ = ON か？
		goto	tmdsp13			;Yes
		goto	tmdsp14			;No

		; 秒 フォントデータのバッファ格納

;		|                       |                       |
;		 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
;		 ＿ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ＿ ＿

tmdsp12		btfss	disp_flg,2		;bit2: 秒表示(ブリンク対象)フラグ = ON か？
		goto	tmdsp13			;No

		btfss	mode_flg,6		;ブリンク反転フラグ mode_flg.6 = ON か？
		goto	tmdsp13			;No

		movlw	16
		call	zz_buff		 ;48-63	;h'00' 16個バッファへ格納
		goto	tmdsp14			;縦横ビットのデータ変換を省略

tmdsp13		movlw	2
		call	zz_buff		 ;48-49	;h'00' 2 個バッファへ格納
		swapf	bcd_ss,W		;"SH": 秒 BCD カウンタ
		andlw	h'0f'
		iorlw	h'30'
		call	font5s_read_buff ;50-55	;標準フォントデータの読み出しとバッファへ格納
		movf	bcd_ss,W		;"SL": 秒 BCD カウンタ
		andlw	h'0f'
		iorlw	h'30'
		call	font5s_read_buff ;56-61	;標準フォントデータの読み出しとバッファへ格納
		movlw	2
		call	zz_buff		 ;62-63	;h'00' 2個バッファへ格納

		; 秒 バッファの縦横ビット変換

		movlw	high (fd_buff + 8 * 6)	;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movlw	low (fd_buff + 8 * 6)	;
		movwf	m_fsr0l			;退避
		movlw	2			;LED モジュール 2 桁分の
		call	verti_horiz_conv	;縦横ビットのデータ変換

		; 時分秒の LED 表示

tmdsp14		movlw	b'00011100'		;時,分,秒
		andwf	disp_flg,W		;
		btfss	STATUS,Z		;どれか LED 表示フラグ = ON か？
		call	dxled_display_x8	;Yes
		clrf	disp_flg
		return

;--------------------------------------------------------------------------
;		24時間表示を12時間表示に変換
;--------------------------------------------------------------------------

;(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
;                                          -----------------------------------
;     +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	;-------

		; (am)
		bcf	time_flg,0		;時間表示モードフラグ.bit0=0: am に設定

		movf	temp_hh,W
		btfss	STATUS,Z		;仮の時 BCD カウンタ = h'00' か？
		goto	cnv01			;No

		movlw	h'12'
		movwf	temp_hh			;仮の時 BCD カウンタ temp_hh = h'12'
		goto	cnv02

cnv01		movlw	h'12'
		subwf	temp_hh,W
		btfss	STATUS,C		;仮の時 BCD カウンタ < h'12' か？
		goto	cnv02			;Yes

		; (pm)
		bsf	time_flg,0		;時間表示モードフラグ.bit0=1: pm に設定

		btfsc	STATUS,Z		;仮の時 BCD カウンタ = h'12' か？
		goto	cnv02			;Yes

		movwf	temp_hh			;仮の時 BCD カウンタ temp_hh = temp_hh - 12
		movlw	h'0e'
		subwf	temp_hh,W
		btfss	STATUS,C		;仮の時 BCD カウンタ < h'0e' か？
		goto	cnv02			;Yes

		movlw	h'10'
		subwf	temp_hh,W
		btfsc	STATUS,C		;仮の時 BCD カウンタ < h'10' か？
		goto	cnv02			;No

		movlw	h'06'
		subwf	temp_hh,F		;補正

cnv02		return

;--------------------------------------------------------------------------
;		温度,湿度をマトリクス LED モジュールに表示
;--------------------------------------------------------------------------

 		; disp_flg: LED 表示フラグ	; bit7: 年表示フラグ
						; bit6: 月表示フラグ
						; bit5: 日表示フラグ
						; bit4: 時表示フラグ
						; bit3: 分表示フラグ
						; bit2: 秒表示フラグ
					     ;>	; bit1: 温度表示フラグ
					     ;>	; bit0: 湿度表示フラグ

;--------------------------------------------------------------------------

temp_humi_display	;-------

		btfss	disp_flg,1		;bit1: 温度表示フラグ = ON か？
		goto	thdsp01			;No

		; 温度フォントデータのバッファ格納

;	|                       |                       |                       |                       |
;	 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
;	 ＿ ＿ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ｘ ｘ ｘ

		movf	temperature_h,W		;温度上位 8 bit
		movwf	work1
		movlp	high bindec8cz_cnv
		call	bindec8cz_cnv		;8 ビット数値を 10進数 3桁の文字列に変換
		movlp	high $
		movf	buff1,W
		movwf	buff3			;十位を退避
		movf	buff2,W
		movwf	buff4			;単位を退避

		movf	temperature_l,W		;温度下位 8 bit
		movwf	work1
		movlp	high bindec8cz_cnv
		call	bindec8cz_cnv		;8 ビット数値を 10進数 3桁の文字列に変換
		movlp	high $

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;間接アドレスに設定

		movlw	3
		call	zz_buff		 ;00-02	;h'00' 3個バッファへ格納

		call	convert_data	 ;03-23	;変換データの標準フォントデータをバッファへ格納

		movlw	h'02' ;h'07'		;'ﾟ'
		movwi	FSR0++		 ;24	;バッファへ格納
		movlw	h'05'			;' '
		movwi	FSR0++		 ;25	;バッファへ格納
		movlw	h'02' ;h'07'		;' '
		movwi	FSR0++		 ;26	;バッファへ格納
		movlw	h'3e'			;'C'
		movwi	FSR0++		 ;27	;バッファへ格納
		movlw	h'41'			;' '
		movwi	FSR0++		 ;28	;バッファへ格納
		movwi	FSR0++		 ;29	;バッファへ格納
		movwi	FSR0++		 ;30	;バッファへ格納
		movlw	h'22'			;' '
		movwi	FSR0++		 ;31	;バッファへ格納

		; 温度フォントデータの縦横ビット変換

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movlw	low fd_buff		;
		movwf	m_fsr0l			;退避
		movlw	4			;LED モジュール 4 桁分の
		call	verti_horiz_conv	;縦横ビットのデータ変換

;---------------

thdsp01		btfss	disp_flg,0		;bit0: 湿度表示フラグ = ON か？
		goto	thdsp02			;No

		; 湿度フォントデータのバッファ格納

;	|                       |                       |                       |                       |
;	 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
;	 ＿ ＿ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ｘ ｘ ｘ ｘ ｘ ＿ ＿ ＿

		movf	humidity_h,W		;湿度上位 8 bit
		movwf	work1
		movlp	high bindec8cz_cnv
		call	bindec8cz_cnv		;8 ビット数値を 10進数 3桁の文字列に変換
		movlp	high $
		movf	buff1,W
		movwf	buff3			;十位を退避
		movf	buff2,W
		movwf	buff4			;単位を退避

		movf	humidity_l,W		;湿度下位 8 bit
		movwf	work1
		movlp	high bindec8cz_cnv
		call	bindec8cz_cnv		;8 ビット数値を 10進数 3桁の文字列に変換
		movlp	high $

		movlw	high (fd_buff + 8 * 4)	;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low (fd_buff + 8 * 4)	;
		movwf	FSR0L			;間接アドレスに設定

		movlw	3
		call	zz_buff		 ;32-34	;h'00' 3個バッファへ格納

		call	convert_data	 ;35-55	;変換データの標準フォントデータをバッファへ格納

		movlw	'%'		 	;'%'
		call	font5s_read_buff ;56-61	;標準フォントデータの読み出しとバッファへ格納
		movlw	2
		call	zz_buff		 ;62-63	;h'00' 2個バッファへ格納

		; 湿度フォントデータの縦横ビット変換

		movlw	high (fd_buff + 8 * 4)	;フォントデータ格納先バッファの先頭アドレス
		movwf	m_fsr0h			;
		movlw	low (fd_buff + 8 * 4)	;
		movwf	m_fsr0l			;退避
		movlw	4			;LED モジュール 4 桁分の
		call	verti_horiz_conv	;縦横ビットのデータ変換

		; 温度,湿度フォントデータの LED 表示

thdsp02		movlw	b'00000011'		;温度,湿度
		andwf	disp_flg,W		;
		btfss	STATUS,Z		;どれか LED 表示フラグ = ON か？
		call	dxled_display_x8	;Yes
		clrf	disp_flg
		return

;--------------------------------------------------------------------------

		; 変換データのフォントデータをバッファへ格納
convert_data
		movf	buff3,W			;
		call	font5s_read_buff ;03-08	;標準フォントデータの読み出しとバッファへ格納
					 ;35-40
		movf	buff4,W			;
		call	font5s_read_buff ;09-14	;標準フォントデータの読み出しとバッファへ格納
					 ;41-46
		movlw	h'60'			;'.'
		movwi	FSR0++		 ;15	;バッファへ格納
					 ;47
		movwi	FSR0++		 ;16	;バッファへ格納
					 ;48
		clrw				;h'00'
		movwi	FSR0++		 ;17	;バッファへ格納
					 ;49
		movf	buff2,W			;
		call	font5s_read_buff ;18-23	;標準フォントデータの読み出しとバッファへ格納
					 ;50-55
		return

;--------------------------------------------------------------------------
;		プログラム名をマトリクス LED モジュールに表示
;--------------------------------------------------------------------------

prog_name_display	;-------

		movlw	3
		movwf	lp_cnt5

pndsp01		movlw	high pname_msg		;メッセージの先頭アドレス
		movwf	addr_high		;
		movlw	low pname_msg		;
		movwf	addr_low		;間接アドレスに設定
		bcf	exit_flg,0		;１文字打ち切りフラグ = OFF

		movlw	2
		movwf	lp_cnt4

pndsp02		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;間接アドレスに設定

		call	message_p_read	 ;00-63	;１行メッセージの読み出し (プロポーショナル文字フォント)

		call	verti_horiz_conv_x8 	;８桁分の縦横ビットのデータ変換
		call	dxled_display_x8	;ドットマトリクス LED ８桁分の表示

		btfsc	exit_flg,7		;処理打ち切りフラグ = ON か？
		goto	pndsp05			;Yes

		decfsz	lp_cnt5,W		;ループカウンタ5 - 1 = 0 か？
		goto	pndsp03			;No

		movlp	high wait_3sec
		call	wait_3sec		;3 秒 ウェイト
		movlp	high $
		goto	pndsp04

pndsp03		movlp	high wait_1_5sec
		call	wait_1_5sec		;1.5 秒 ウェイト
		movlp	high $

pndsp04		decfsz	lp_cnt4,F		;ループカウンタ4 - 1 = 0 か？
		goto	pndsp02			;No

		decfsz	lp_cnt5,F		;ループカウンタ5 - 1 = 0 か？
		goto	pndsp01			;No

pndsp05		return

;pname_msg	dt	"Matrix LED",0  ,h'ff',"Controller",h'ff',0

pname_msg	dt	h'ff',"*",h'ff',"Matrix LED",h'ff',"*",0  ,h'ff',"*",h'ff',h'ff',"Controller",h'ff',h'ff',"*",0

;--------------------------------------------------------------------------
;		バージョン番号をマトリクス LED モジュールに表示
;--------------------------------------------------------------------------

ver_display		;-------

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;間接アドレスに設定

		movlw	high ver_no_msg		;メッセージの先頭アドレス
		movwf	addr_high		;
		movlw	low ver_no_msg		;
		movwf	addr_low		;間接アドレスに設定
		bcf	exit_flg,0		;１文字打ち切りフラグ = OFF

		call	message_p_read	 ;00-17	;１行メッセージの読み出し (プロポーショナル文字フォント)

		clrf	work1			;
		movlw	high ver_no_tbl		;ver_no_tbl の先頭アドレス
		movwf	FSR1H			;
		movlw	low ver_no_tbl		;
		movwf	FSR1L			;間接アドレスに設定
		call	ver_no_set	 ;18-22	;バージョン番号 数字1桁目
					 ;'1' のときは位置が変更する
		movlw	h'60'			;'.'
		movwi	FSR0++		 ;23	;バッファへ格納
		movwi	FSR0++		 ;24	;バッファへ格納
		clrw				;h'00'
		movwi	FSR0++		 ;25	;バッファへ格納

		movlw	high (ver_no_tbl + 2)	;ver_no_tbl + 2 のアドレス
		movwf	FSR1H			;
		movlw	low (ver_no_tbl + 2)	;
		movwf	FSR1L			;間接アドレスに設定
		call	ver_no_set	 ;26-30	;バージョン番号 数字2桁目
					 ;'1' のときは位置が変更する
		movlw	high (ver_no_tbl + 3)	;ver_no_tbl + 3 のアドレス
		movwf	FSR1H			;
		movlw	low (ver_no_tbl + 3)	;
		movwf	FSR1L			;間接アドレスに設定
		call	ver_no_set	 ;31-35	;バージョン番号 数字3桁目
					 ;'1' のときは位置が変更する
		movlw	2			;少なくても2個は必要
		addwf	work1,W
		call	zz_buff		 ;3x-37	;h'00' バッファへ格納

		call	message_p_read	 ;38-54	;１行メッセージの読み出し (プロポーショナル文字フォント)

		movlw	h'60'			;'.'
		movwi	FSR0++		 ;55	;バッファへ格納
		movwi	FSR0++		 ;56	;バッファへ格納

		call	message_p_read	 ;57-63	;１行メッセージの読み出し (プロポーショナル文字フォント)

		call	verti_horiz_conv_x8 	;８桁分の縦横ビットのデータ変換
		call	dxled_display_x8	;ドットマトリクス LED ８桁分の表示
		movlp	high wait_3sec
		call	wait_3sec		;3 秒 ウェイト
		movlp	high $
		call	led_1s_off		;LED を 1 秒間消灯
		return

		; バージョン番号の数字を１桁ずつバッファへ格納
ver_no_set
		moviw	0[FSR1]			;
		movwf	work2
		sublw	'1'
		btfsc	STATUS,Z		;'1' か？
		incf	work1,F			;Yes
		movf	work2,W
		call	font5p_read_buff ;xx-xx	;プロポーショナル文字フォントの読み出しとバッファへ格納
		return

ver_no_msg	dt	h'ff',"Ver",h'ff',0  ,"by",h'ff',"M",0  ,h'ff',"Y",0

ver_no_tbl	dt	ver_no			;バージョン番号

;--------------------------------------------------------------------------
;	DS1307 のクロック停止エラーをマトリクス LED モジュールに表示
;--------------------------------------------------------------------------

;		[ Error DS1307 ]		;DS1307 RTC エラーメッセージ

ds1307_err_display	;-------

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;間接アドレスに設定

		movlw	high ds1307_msg		;メッセージの先頭アドレス
		movwf	addr_high		;
		movlw	low ds1307_msg		;
		movwf	addr_low		;間接アドレスに設定
		bcf	exit_flg,0		;１文字打ち切りフラグ = OFF

		call	message_p_read		;１行メッセージの読み出し (プロポーショナル文字フォント)

		call	verti_horiz_conv_x8 	;８桁分の縦横ビットのデータ変換
		call	dxled_display_x8	;ドットマトリクス LED ８桁分の表示
		return

ds1307_msg	dt	h'ff',h'ff',h'ff',"Error:",h'ff',h'ff',"DS1307",h'ff',h'ff',0

;--------------------------------------------------------------------------
;	DHT11 から読み出しエラーをマトリクス LED モジュールに表示
;--------------------------------------------------------------------------

;		[ Error DHT11 ]	;DHT11 TO/PE エラーメッセージ

dht11_err_display	;-------

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;間接アドレスに設定

		movlw	high dht11_msg		;メッセージの先頭アドレス
		movwf	addr_high		;
		movlw	low dht11_msg		;
		movwf	addr_low		;間接アドレスに設定
		bcf	exit_flg,0		;１文字打ち切りフラグ = OFF

		call	message_p_read		;１行メッセージの読み出し (プロポーショナル文字フォント)

		btfss	time_cnt,7		;タイムアウトエラー か？
		goto	erdsp01			;No. チェックサム(CRC)エラー

		movlw	3			;3 バイトポインタを進める
		addwf	addr_low,F
		clrw
		addwfc	addr_high,F

erdsp01		call	message_p_read		;１行メッセージの読み出し (プロポーショナル文字フォント)
		;"TO" のとき１バイト多く出力されるがワークバッファなので問題なし

		call	verti_horiz_conv_x8	;８桁分の縦横ビットのデータ変換
		call	dxled_display_x8	;ドットマトリクス LED ８桁分の表示
		return

dht11_msg	dt	"Error:",h'ff',"dht11",h'ff',0  ,"PE",0  ,"TO",0

;--------------------------------------------------------------------------
;		ドットマトリクス LED のデモ表示
;--------------------------------------------------------------------------

demo_display		;-------

		movlw	h'0a'			;輝度レジスタ
		movwf	reg_addr
		movlw	h'05'			;11/32 ..... 強調表示のため少し多めに
		movwf	reg_data
		call	max_led_contr		;同一データ 8個分の制御

		call	demo1_display		;LED のドット点灯移行デモ-1
		call	demo2_display		;LED のドット点灯移行デモ-2
		call	demo3_display		;LED のドット点灯移行デモ-3

		movlw	h'0a'			;輝度レジスタ
		movwf	reg_addr
		movlw	h'00'			;1/32 ...... 最小値でもかなり明るい 
		movwf	reg_data
		movwf	intensity		;輝度調節値: デフォルト設定
		call	max_led_contr		;同一データ 8個分の制御
		call	led_1s_off		;LED を 1 秒間消灯
		return

;--------------------------------------------------------------------------

;		LED のドット点灯移行デモ-1

demo1_display
		movlw	2
		movwf	lp_cnt3			;ループカウンタ3 = 2 を設定

demo1		clrw				;0: １桁目の指定
		call	lower_upper
		clrw				;0: １桁目の指定
		call	left_right
		movlw	1			;1: ２桁目の指定
		call	left_right
		movlw	1			;1: ２桁目の指定
		call	upper_lower
		movlw	1			;1: ２桁目の指定
		call	right_left
		clrw				;0: １桁目の指定
		call	right_left

		movlw	2			;2: ３桁目の指定
		call	lower_upper
		movlw	2			;2: ３桁目の指定
		call	left_right
		movlw	3			;3: ４桁目の指定
		call	left_right
		movlw	3			;3: ４桁目の指定
		call	upper_lower
		movlw	3			;3: ４桁目の指定
		call	right_left
		movlw	2			;2: ３桁目の指定
		call	right_left

		movlw	4			;4: ５桁目の指定
		call	lower_upper
		movlw	4			;4: ５桁目の指定
		call	left_right
		movlw	5			;5: ６桁目の指定
		call	left_right
		movlw	5			;5: ６桁目の指定
		call	upper_lower
		movlw	5			;5: ６桁目の指定
		call	right_left
		movlw	4			;4: ５桁目の指定
		call	right_left

		movlw	6			;6: ７桁目の指定
		call	lower_upper
		movlw	6			;6: ７桁目の指定
		call	left_right
		movlw	7			;7: ８桁目の指定
		call	left_right
		movlw	7			;7: ８桁目の指定
		call	upper_lower
		movlw	7			;7: ８桁目の指定
		call	right_left
		movlw	6			;6: ７桁目の指定
		call	right_left

		decfsz	lp_cnt3,F		;ループカウンタ3 - 1 = 0 か？
		goto	demo1			;No

		return

;--------------------------------------------------------------------------

;		LED のドット点灯移行デモ-2

demo2_display
		movlw	2
		movwf	lp_cnt3			;ループカウンタ3 = 3 を設定

demo2		clrw				;0: １桁目の指定
		call	lower_upper
		clrw				;0: １桁目の指定
		call	left_right
		movlw	1			;1: ２桁目の指定
		call	left_right
		movlw	2			;2: ３桁目の指定
		call	left_right
		movlw	3			;3: ４桁目の指定
		call	left_right

		movlw	3			;3: ４桁目の指定
		call	upper_lower
		movlw	3			;3: ４桁目の指定
		call	right_left
		movlw	2			;2: ３桁目の指定
		call	right_left
		movlw	1			;1: ２桁目の指定
		call	right_left
		clrw				;0: １桁目の指定
		call	right_left

		movlw	4			;4: ５桁目の指定
		call	lower_upper
		movlw	4			;4: ５桁目の指定
		call	left_right
		movlw	5			;5: ６桁目の指定
		call	left_right
		movlw	6			;6: ７桁目の指定
		call	left_right
		movlw	7			;7: ８桁目の指定
		call	left_right

		movlw	7			;7: ８桁目の指定
		call	upper_lower
		movlw	7			;7: ８桁目の指定
		call	right_left
		movlw	6			;6: ７桁目の指定
		call	right_left
		movlw	5			;5: ６桁目の指定
		call	right_left
		movlw	4			;4: ５桁目の指定
		call	right_left

		decfsz	lp_cnt3,F		;ループカウンタ3 - 1 = 0 か？
		goto	demo2			;No

		return

;--------------------------------------------------------------------------

;		LED のドット点灯移行デモ-3

demo3_display
		movlw	3
		movwf	lp_cnt3			;ループカウンタ3 = 3 を設定

demo3		clrw				;0: １桁目の指定
		call	lower_upper
		clrw				;0: １桁目の指定
		call	left_right
		movlw	1			;1: ２桁目の指定
		call	left_right
		movlw	2			;2: ３桁目の指定
		call	left_right
		movlw	3			;3: ４桁目の指定
		call	left_right
		movlw	4			;4: ５桁目の指定
		call	left_right
		movlw	5			;5: ６桁目の指定
		call	left_right
		movlw	6			;6: ７桁目の指定
		call	left_right
		movlw	7			;7: ８桁目の指定
		call	left_right

		movlw	7			;7: ８桁目の指定
		call	upper_lower
		movlw	7			;7: ８桁目の指定
		call	right_left
		movlw	6			;6: ７桁目の指定
		call	right_left
		movlw	5			;5: ６桁目の指定
		call	right_left
		movlw	4			;4: ５桁目の指定
		call	right_left
		movlw	3			;3: ４桁目の指定
		call	right_left
		movlw	2			;2: ３桁目の指定
		call	right_left
		movlw	1			;1: ２桁目の指定
		call	right_left
		clrw				;0: １桁目の指定
		call	right_left

		decfsz	lp_cnt3,F		;ループカウンタ3 - 1 = 0 か？
		goto	demo3			;No

		return

;--------------------------------------------------------------------------

;		下 → 上 方向に LED が点灯移行

;		入力	W reg: 該当の桁より左側の桁数

lower_upper
		movwf	nop_cnt			;Wレジスタの内容を保存
		movlw	h'01'			;Digit = 0
		movwf	digit			;Digit の初期値
		movlw	h'01'			;Segment = G
		movwf	segment			;Segment は一定
		movlw	8
		movwf	lp_cnt2			;ループカウンタ2 にセット
		movwf	work1			;表示長フラグ = ON

lu01		call	demo_dig_seg		;
		incf	digit,F			;digit + 1 更新
		decfsz	lp_cnt2,F		;ループカウンタ2 - 1 = 0 か？
		goto	lu01			;No

		return

;--------------------------------------------------------------------------

;		上 → 下 方向に LED が点灯移行

;		入力	W reg: 該当の桁より左側の桁数

upper_lower
		movwf	nop_cnt			;Wレジスタの内容を保存
		movlw	h'08'			;Digit = 7
		movwf	digit			;Digit の初期値
		movlw	h'80'			;Segment = DP
		movwf	segment			;Segment は一定
		movlw	8
		movwf	lp_cnt2			;ループカウンタ2 にセット
		movwf	work1			;表示長フラグ = ON

ul01		call	demo_dig_seg		;
		decf	digit,F			;digit - 1 更新
		decfsz	lp_cnt2,F		;ループカウンタ2 - 1 = 0 か？
		goto	ul01			;No

		return

;--------------------------------------------------------------------------

;		左 → 右 方向に LED が点灯移行

;		入力	W reg: 該当の桁より左側の桁数

left_right
		movwf	nop_cnt			;Wレジスタの内容を保存
		movlw	h'08'			;Digit = 7
		movwf	digit			;Digit は一定
		movlw	h'01'			;Segment = G
		movwf	segment			;Segment の初期値
		movlw	8
		movwf	lp_cnt2			;ループカウンタ2 にセット
		clrf	work1			;表示長フラグ = OFF

lr01		call	demo_dig_seg		;
		lslf	segment,F		;左にシフト
		decfsz	lp_cnt2,F		;ループカウンタ2 - 1 = 0 か？
		goto	lr01			;No

		return

;--------------------------------------------------------------------------

;		右 → 左 方向に LED が点灯移行

;		入力	W reg: 該当の桁より左側の桁数

right_left
		movwf	nop_cnt			;Wレジスタの内容を保存
		movlw	h'01'			;Digit = 0
		movwf	digit			;Digit は一定
		movlw	h'80'			;Segment = DP
		movwf	segment			;Segment の初期値
		movlw	8
		movwf	lp_cnt2			;ループカウンタ2 にセット
		clrf	work1			;表示長フラグ = OFF

rl01		call	demo_dig_seg		;
		lsrf	segment,F		;右にシフト
		decfsz	lp_cnt2,F		;ループカウンタ2 - 1 = 0 か？
		goto	rl01			;No

		return

;--------------------------------------------------------------------------

;	指定 Digit レジスタに Segment データを送出と 10 m秒後にクリア

;		入力	digit:   Digit レジスタ
;			segment: Segment データ

demo_dig_seg
		bcf	PORTC,maxLOAD		;maxLOAD="L"
		movf	nop_cnt,W
		sublw	7
		call	no_operation
		movf	digit,W			;Digit = X
		call	max_byte_send		;レジスタアドレス
		movf	segment,W		;Segment = X
		call	max_byte_send		;レジスタデータ
		movf	nop_cnt,W
		call	no_operation
		bsf	PORTC,maxLOAD		;maxLOAD="H"

		movlp	high wait_10ms
		btfss	work1,3			;表示長フラグ = ON か？
		call	wait_10ms		;No.  10 m秒 ウェイトルーチン
		btfsc	work1,3			;表示長フラグ = ON か？
		call	wait_30ms		;Yes. 30 m秒 ウェイトルーチン
		movlp	high $

 		bcf	PORTC,maxLOAD		;maxLOAD="L"
		movf	nop_cnt,W
		sublw	7
		call	no_operation
		movf	digit,W			;Digit = X
		call	max_byte_send		;レジスタアドレス
		clrw				;Segment = クリア
		call	max_byte_send		;レジスタデータ
		movf	nop_cnt,W
		call	no_operation
		bsf	PORTC,maxLOAD		;maxLOAD="H"
		return

;==========================================================================
;		文字フォントデータテーブル
;==========================================================================

		include		D:\Project\PIC\_sub\Font8x8k.tbl

;==========================================================================
;--------------------------------------------------------------------------
		org	h'1800'			;(Page 3)
;--------------------------------------------------------------------------
;==========================================================================

		include		D:\Project\PIC\_sub\Font5x7s.tbl

		include		D:\Project\PIC\_sub\Font5x7p.tbl

;==========================================================================

;--------------------------------------------------------------------------
;		ドットマトリクス LED の９～０表示テスト
;--------------------------------------------------------------------------

max_led_test
		movlw	10			;
		movwf	lp_cnt3			;ループカウンタ3 にセット

dxtst01		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;間接アドレスに設定
		decf	lp_cnt3,W		;表示文字
		call	font8n_read_buff 	;１文字フォントデータの読み出しとビット列変換

		movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
		movwf	FSR0H			;
		movlw	low fd_buff		;
		movwf	FSR0L			;間接アドレスに再設定
		movlw	8			;
		movwf	digit			;ループカウンタ digit にセット

dxtst02		movf	digit,W
		movwf	reg_addr		;レジスタアドレス
		moviw	FSR0++			;バッファから読み出し
		movwf	reg_data
		movlp	high max_led_contr
		call	max_led_contr		;同一データ 8個分の制御
		movlp	high $

		decfsz	digit,F			;ループカウンタ digit - 1 = 0 か？
		goto	dxtst02			;No

		movlp	high wait_500ms
		call	wait_500ms		;500m 秒 ウェイト
		movlp	high $
		decfsz	lp_cnt3,F		;ループカウンタ3 - 1 = 0 か？
		goto	dxtst01			;No

		movlp	high led_1s_off
		call	led_1s_off		;LED を 1 秒間消灯
		movlp	high $
		return

;--------------------------------------------------------------------------
;     8x8 文字フォントデータの読み出しとビット列の反転後バッファへ格納
;   ( フォントデータ segment のビット列並びを逆に変換してバッファへ格納 )
;--------------------------------------------------------------------------

;	  汎用変数:	work1, work2, lp_cnt1, lp_cnt2

;	  入力:		W: 表示文字データ (h'00'～h'09')

;	  出力:	 fd_buff(8 byte): フォントデータ（ビット列並びを逆に変換）

;	(例)	movlw	high fd_buff		;フォントデータ格納先バッファの先頭アドレス
;		movwf	FSR0H			;
;		movlw	low fd_buff		;
;		movwf	FSR0L			;間接アドレスに設定
;		call	font8n_read_buff	;

;--------------------------------------------------------------------------

font8n_read_buff	;-------

	;	andlw	h'0f'			;下位4ビットを取り出す
		movwf	FSR1L
		lslf	FSR1L,F			;8倍する
		rlf	FSR1L,F
		rlf	FSR1L,F
		movlw	low font_0		;(font8x8k_data_tbl)
		addwf	FSR1L,F			;文字フォントデータの先頭 low アドレス
		clrf	FSR1H
		movlw	high font_0
		addwfc	FSR1H,F			;文字フォントデータの先頭 high アドレス

		movlw	8			;
		movwf	lp_cnt2			;ループカウンタ2（digit カウンタ）

fr8nbuf01	moviw	FSR1++			;文字フォントデータの読み出し
		movwf	work1			;反転前のビット列
		movlw	8			;
		movwf	lp_cnt1			;ループカウンタ1（segment カウンタ）	

fr8nbuf02	rlf	work1,F			;C bit を出力
		rrf	work2,F			;C bit を入力
		decfsz	lp_cnt1,F		;ループカウンタ1 - 1 = 0 か？
		goto	fr8nbuf02		;No

		movf	work2,W			;反転後のビット列
		movwi	FSR0++			;バッファへ格納
		decfsz	lp_cnt2,F		;ループカウンタ2 - 1 = 0 か？
		goto	fr8nbuf01		;No

		return

;==========================================================================
;		High-Endurance フラッシュメモリ
;==========================================================================

		org	h'1f80'

copyright	de	"Copyright (C) 2022 by M.Yamamoto"

;==========================================================================

		end				;プログラムの終了
