//%第1版第6刷 P.297- //!!!6章 CLOCKとバッテリバックアップ・メモリ  MSX2はCLOCK-ICを用いて時計機能を実現しています。このICはバッテリバックアップされており、MSX2本体の電源を切っても動作を続けるようになっています。またそのために内蔵されている少量のRAMを、MSX2ではCLOCK機能のほかにPASSWORDの設定やスタート時のスクリーンモードの自動設定などに利用しています。 !!6.1 CLOCK-ICの機能  このICの機能は以下の3つに分けられます。 '''●CLOCK機能''' *「年、月、日、曜日、時、分、秒」の設定/読み出しができる。 *時刻の表現は、24時間計/12時間計の切り換えができる。 *月の更新は、大の月と小の月を考慮する(4年に1度の閏年も判別する)。 '''●アラーム機能''' *アラーム時刻を設定しておくと、CLOCKがその値に一致した時点で信号を発生する。 *アラーム時刻は「XX日 XX時 XX分」の単位で設定できる。 '''●バッテリバックアップ・メモリ機能''' *26個の4ビットメモリを持ち、各種の情報をバッテリバックアップすることができる。 *MSX2では、このメモリに以下のようなデータを記憶させている。 +CRT表示の上下左右の調整値 +SCREEN、WIDTH、COLORの初期設定値 +BEEPの音色と音量 +タイトル画面の色 +国別コード +パスワード +BASICのプロンプト どれかひとつが有効 +タイトル文字 !!6.2 CLOCK-ICの構造  CLOCK-ICの内部は、図5.25に示すように4つのブロックに分かれています。各ブロックは13個の4ビットレジスタで構成され、それぞれのブロック内のレジスタはO〜12のアドレスで指定します。またブロックの選択や機能コントロール用に3個の4ビットレジスタを持ち、これを13〜15のアドレスで指定します。  各ブロックに含まれるレジスタ(#0〜#12)と、MODEレジスタ(#13)は書き込みも読み出しも可能です。TESTレジスタ(#14)とRESETレジスタ(#15)は書き込み専用で読み出しはできません。 {{div_begin style='text-align:center;'}} {{svg 図5.25.svg,,size:550x380}} '''図5.25 CLOCK-ICの構造''' {{div_end}} !!6.3 MODEレジスタの機能 MODEレジスタ(#13)は以下の3つの機能を持ちます。 '''●ブロックの選択'''  #O〜#12のレジスタの読み書きを行う場合は、まず使用するブロックを選択してから目的のアドレスをアクセスしなければなりません。ブロックの選択にはMODEレジスタの下位2ビットを使用します。  なお、#13〜#15のレジスタは、どのブロックが選択されている時でもアクセス可能です。 '''●アラーム出力のON/OFF'''  MODEレジスタのビット2でアラーム出力のON/OFFを行います。ただしMSX2の標準仕様ではアラームに関するサポートはしていませんから、このビットを書き換えても一般には何も起こりません。 '''●CLOCKカウントの停止'''  MODEレジスタのビット3を“O”にすると、秒以降のカウントを停止し(秒より前の分周段は止まらない)、時計機能をストップさせます。ビット3を“1”にするとカウントを再開します。 {{div_begin style='text-align:center;'}} {{svg 図5.26.svg,,size:330x270}} '''図5.26 MODEレジスタの機能''' {{div_end}} !!6.4 TESTレジスタの機能  TESTレジスタ(#14)は上位のカウンタを素早くカウントアップさせ、時刻や日付の繰り上がり動作を確認するために用います。このレジスタの各ビットに“1”を立てると、それぞれ日、時、分、秒のカウンタに直接2^14(=16384)[Hz]のパルスが入力されます。 {{div_begin style='text-align:center;'}} {{svg 図5.27.svg,,size:360x130}} '''図5.27 TESTレジスタの機能''' {{div_end}} !!6.5 RESETレジスタの機能  RESETレジスタ(#15)には以下の機能があります。 '''●アラームのリセット'''  ビット0を“1”にすると、すべてのアラームレジスタを0にリセットします。 '''●秒合わせ'''  ビット1を“1”にすると、秒以前の分周段をリセットします。この機能は1秒の始まりを正確に合わせる場合に用います。 '''●クロックパルスのON/OFF'''  ビット2を“0”にすると、16Hzのクロックパルス出力をONに、ビット3を“0”にすると、1Hzのクロックパルス出力をONにします。なお、両者ともMSX2標準仕様ではサポートしていません。 {{div_begin style='text-align:center;'}} {{svg 図5.28.svg,,size:410x170}} '''図5.28 RESETレジスタの機能''' {{div_end}} !!6.6 クロックおよびアラームの設定 '''●日付と時刻の設定'''  クロックの設定にはブロック0を使用します。MODEレジスタでブロック0を選択し、目的とするレジスタにデータを書き込めば日付や時刻が設定されます。また、そのレジスタの内容を読み出せば現在の時間を知ることができます。レジスタの意味とそのアドレスについては図5,29を参照してください。  アラームの設定はブロック1を使用します。ただしアラーム時刻は日、時、分の単位しか指定できません。また、クロックがアラーム時刻に一致しても一般には何も起こりません。  クロックの中で、年は2桁(レジスタ#11〜#12)で表されます。MSX-BASICでは、この値にオフセット80を加えて西暦年数の下2桁を表すことにしています。たとえばレジスタ#11=0、レジスタ#12=0、と設定した後BASICのGET DATE命令を用いて日付を読み出すと、“80//XX/XX”のように、年数は8Oとなっているはずです。  曜日はO〜6で表されます。これは単に日付とともに更新される7進カウンタにすぎず、実際の曜日と0〜6の数値の対応は決まっていません。 {{div_begin style='text-align:center;'}} {{svg 図5.29.svg,,size:660x500}} '''図5.29 CLOCKとALARMの設定''' {{div_end}} '''●12時間計/24時間計の選択'''  時刻の表示は、昼の1時を「13時」と表す24時間計と、「午後1時」と表す12時間計のどちらかを選ぶことができます。この選択にはブロック1のレジスタ#10を使用します。図5.30に示したように、B0が“0”の時12時間計、“1”の時24時間計となります。  12時間計を選んだ場合は、図5.31のように10時間カウンタ(ブロックO、#5)のB1ビットによって午前/午後を表現します。 {{div_begin style='text-align:center;'}} {{svg 図5.30.svg,,size:340x130}} '''図5.30 12時間計/24時間計の選択''' {{div_end}} {{div_begin style='text-align:center;'}} {{svg 図5.31.svg,,size:340x130}} '''図5.31 12時間計の午前/午後フラグ''' {{div_end}} '''●閏年カウンタ'''  ブロック1のレジスタ#11は、年のカウントとともに更新される4進カウンタです。このレジスタの下位2ビットが00Hの場合は閏年とみなされ、2月を29日までカウントします。  MSX-BASICで“SET DATE”命令を実行すると、与えた年を4で割った余りがこのレジスタに設定されます。たとえば“80/XX/XX”という日付を指定すると閏年カウンタは0になりますが、これは西暦1980年が閏年であるという事実に一致するわけです。 {{div_begin style='text-align:center;'}} {{svg 図5.32.svg,,size:340x100}} '''図5.32 閏年の判定''' {{div_end}} !!6.7 バッテリバックアップ・メモリの内容  CLOCK-ICのブロック2とブロック3は、それぞれ4ビット×13のバッテリバックアップされたメモリブロックとして用いられ、MSX2ではこの部分を以下のような用途に使用しています。 '''●ブロック2の内容''' {{div_begin style='text-align:center;'}} {{svg 図5.33.svg,,size:560x460}} '''図5.33 ブロック2の内容''' {{div_end}} '''●ブロック3の内容'''  ブロック3は、ID値(レジスタ#O)の内容により、3通りの機能を持っています。図5.34にその機能を示します。 {{div_begin style='text-align:center;'}} {{svg 図5.34.svg,,size:430x690}} '''図5.34 ブロック3の内容''' {{div_end}} !!6.8 CLOCK-ICのアクセス  クロックおよびバッテリバックアップ・メモリをアクセスするために、下記のようなBIOSルーチンが用意されています。このルーチンはSUB-ROMに存在するため、一般にはインタースロットコールを用いて呼び出します。 '''●REDCLK(01F5H/SUB)'''……………CLOCK-ICのデータの読み出し 入力:C←CLOCK-ICのアドレス(図5.35参照) 出力:A←読み出したデータ(下位4ビットのみ有効) 機能:Cレジスタで指定したアドレスのCLOCK-ICレジスタを読み出し、Aレジスタに格納する。アドレス指定には図5.35のようにブロック選択情報も含めているため、MODEレジスタを設定し、次に目的のレジスタを読み出す、という手間をかける必要はない。 {{div_begin style='text-align:center;'}} {{svg 図5.35.svg,,size:420x90}} '''図5.35 CLOCK-ICのレジスタ指定法''' {{div_end}} '''●WRTCLK(01F9H/SUB)'''……………CLOCK-ICのデータの書き込み 入力:C←CLOCK-ICのアドレス(図5.35参照)    A←書き込むデータ(下位4ビットのみ有効) 出力:− 機能:Cレジスタで指定したアドレスのCLOCK-ICレジスタに、Aレジスタの内容を書き込む。アドレスはREDCLKと同様に図5.35のようなフォーマットで指定する。 このBIOSルーチンの使用例をリスト5.10に示します。 {{div_begin style='text-align:right;'}} '''リスト5.10 プロンプトの設定''' {{div_end}} ;============================================================ ; ; List 5.10 set prompt massage ; ;============================================================ ; WRTCLK EQU 01F9H EXTROM EQU 015FH ORG 0B000H ;----- program start ----- BASICのプロンプトを設定する START: LD C,00110000B ;address data LD A,2 ;ID := prompt mode CALL WRTRAM :write to back-up RAM LD B,6 ;loop counter LD HL.STRING ;prompt data L01: LD A,(HL) ;read string data AND 0FH ;A := hi 4 bit INC C ;address inc CALL WRTRAM ;write data to back-up RAM LD A,(HL) RRCA RRCA RRCA RRCA AND 0FH INC C ;address inc CALL WRTRAM ;write low 4 bit INC HL DJNZ L01 RET ;----- write data to back-up RAM ----- PUSH HL PUSH BC LD IX,WRTCLK CALL EXTROM ;use interslot call POP BC POP HL RET ;----- string data ----- DB 'Ready?' END