MSX Datapack wiki化計画

6章 CLOCKとバッテリバックアップ・メモリ

 MSX2はCLOCK-ICを用いて時計機能を実現しています。このICはバッテリバックアップされており、MSX2本体の電源を切っても動作を続けるようになっています。また、そのために内蔵されているRAMを、MSX2ではCLOCK機能のほかにパスワードの設定やスタート時のスクリーンモードの自動設定などに利用しています。

 6.1 CLOCK-ICの機能

 このICの機能は以下の3つに分けられます。

1.CLOCK機能
■「年、月、日、曜日、時、分、秒」の設定/読み出しができます。
■時刻の表現は、24時間計/12時間計の切り換えができます。
■月の更新は、大の月と小の月を考慮します(4年に1度の閏年も判別します)。

2.アラーム機能
■アラーム時刻を設定しておくと、CLOCKがその値に一致した時点で信号を発生します。
■アラーム時刻は「XX日XX時XX分」の単位で設定できます。

3.バッテリバックアップメモリ機能
■26個の4ビットメモリを持ち、各種の情報をバッテリバックアップすることができます。
■MSX2では、このメモリに以下のようなデータを記憶させています。

 6.2 CLOCK-ICの構造

 CLOCK-ICの内部は、図6.24に示すように4つのブロックに分かれています。各ブロックは13個の4ビットレジスタで構成され、それぞれのブロック内のレジスタはO〜12のアドレスで指定します。またブロックの選択や機能コントロール用に3個の4ビットレジスタを持ち、これを13〜15のアドレスで指定します。
 各ブロックに含まれるレジスタ(#0〜#12)と、MODEレジスタ(#13)は書き込みも読み出しも可能です。TESTレジスタ(#14)とRESETレジスタ(#15)は書き込み専用で読み出しはできません。

図6.23 CLOCK-ICの構造

 6.3 MODEレジスタの機能

 MODEレジスタ(#13)は以下の3つの機能を持ちます。

1.ブロックの選択
 #O〜#12のレジスタの読み書きを行う場合は、使用するブロックを選択してから目的のアドレスをアクセスします。ブロックの選択にはMODEレジスタの下位2ビットを使用します。
 #13〜#15のレジスタは、どのブロックが選択されている時でもアクセス可能です。

2.アラーム出力のON/OFF
 MODEレジスタのビット2でアラーム出力のON/OFFを行います。ただし、MSX2ではアラームに関する仕様はオプションですから、このビットを書き換えても一般には何も起こりません。

3.CLOCKカウントの停止
 MODEレジスタのビット3を「O」にすると、秒以降のカウントを停止し(秒より前の分周段は止まらない)、時計機能をストップさせます。ビット3を「1」にするとカウントを再開します。

図6.24 MODEレジスタの機能

 6.4 TESTレジスタの機能

 TESTレジスタ(#14)は上位のカウンタを素早くカウントアップさせ、時刻や日付の繰り上がり動作を確認するために用います。このレジスタの各ビットに「1」を立てると、それぞれ日、時、分、秒のカウンタに直接214(=16384)[Hz]のパルスが入力されます。

図6.25 TESTレジスタの機能

 6.5 RESETレジスタの機能

 RESETレジスタ(#15)には以下の機能があります。

1.アラームのリセット
 ビット0を「1」にすると、すべてのアラームレジスタを0にリセットします。

2.秒合わせ
 ビット1を「1」にすると、秒以前の分周段をリセットします。この機能は1秒の始まりを正確に合わせる場合に用います。

3.クロックパルスのON/OFF
 ビット2を「0」にすると、16Hzのクロックパルス出力をONに、ビット3を「0」にすると、1Hzのクロックパルス出力をONにします。なお、両者ともMSX2ではサポートしていません。

図6.26 RESETレジスタの機能

 6.6 クロックおよびアラームの設定

1.日付と時刻の設定
 クロックの設定にはブロック0を使用します。MODEレジスタでブロック0を選択し、目的とするレジスタにデータを書き込めば日付や時刻が設定されます。また、そのレジスタの内容を読み出せば現在の時間を知ることができます。レジスタの意味とそのアドレスについては図6.27を参照してください。
 アラームの設定はブロック1を使用します。ただしアラーム時刻は日、時、分の単位しか指定できません。また、クロックがアラーム時刻に一致しても一般には何も起こりません。
 クロックの中で、年は2桁(レジスタ#11〜#12)で表されます。MSX BASICでは、この値にオフセット80を加えて西暦年数の下2桁を表すことにしています。たとえばレジスタ#11=0、レジスタ#12=0、と設定した後、BASICのGET DATE命令を用いて日付を読み出すと、「80/XX/XX」のように、年数は8Oとなります。
 曜日はO〜6で表されます。これは単に日付とともに更新される7進カウンタで、実際の曜日と0〜6の数値の対応は決まっていません。

図6.27 CLOCKとALARMの設定

2.12時間計・24時間計の選択
 時刻の表示は、昼の1時を「13時」と表す24時間計と、「午後1時」と表す12時間計のどちらかを選ぶことができます。この選択にはブロック1のレジスタ#10を使用します。図6.28に示したように、ビット0(b0)が「0」の時12時間計、「1」の時24時間計となります。
 12時間計を選んだ場合は、図6.29のように10時間カウンタ(ブロックO、#5)のb1ビットによって午前・午後を表現します。


図6.28 12時間計・24時間計の選択


図6.29 12時間計の午前・午後フラグ

3.閏年カウンタ
 ブロック1のレジスタ#11は、年のカウントとともに更新される4進カウンタです。このレジスタの下位2ビットが00Hの場合は閏年とみなされ、2月を29日までカウントします。
 MSX BASICで「SET DATE」命令を実行すると、与えた年を4で割った余りがこのレジスタに設定されます。たとえば「80/XX/XX」という日付を指定すると閏年カウンタは0になりますが、これは西暦1980年が閏年であるという事実に一致するわけです。

図6.30 閏年の判定

 6.7 バッテリバックアップ・メモリの内容

 CLOCK-ICのブロック2とブロック3は、それぞれ4ビット×13のバッテリバックアップされたメモリブロックとして用いられ、MSX2ではこの部分を以下のような用途に使っています。

1.ブロック2の内容

図6.31 ブロック2の内容

2.ブロック3の内容
 ブロック3は、ID値(レジスタ#0)の内容により、3とおりの機能を持っています。図6.32にその機能を示します。

図6.32 ブロック3の内容

 6.8 CLOCK-ICのアクセス

 クロックおよびバッテリバックアップメモリをアクセスするために、下記のようなBIOSルーチンが用意されています。このルーチンはSUB ROMにあるため、インタースロットコールを用いて呼び出します。

REDCLK(01F5H/SUB)
機能

CLOCK-ICのデータを読み出します。

コール手順

CCLOCK-ICのアドレス(図6.33参照)
戻り値
A読み出したデータ(下位4ビットのみ有効)
変更レジスタ

すべて

解説
Cレジスタで指定したアドレスのCLOCK-ICレジスタを読み出し、Aレジスタに格納します。アドレス指定には図6.33のようにブロック選択情報も含めているため、最初にMODEレジスタを設定し、次に目的のレジスタを読み出す、という手間をふむ必要はありません。

図6.33 CLOCK-ICのレジスタ指定法

WRTCLK(01F9H/SUB)
機能

CLOCK-ICへデータを書き込みます。

コール手順

CCLOCK-ICのアドレス(図6.33参照)
A書き込むデータ(下位4ビットのみ有効)
戻り値

なし

変更レジスタ
すべて
解説
Cレジスタで指定したアドレスのCLOCK-ICレジスタに、Aレジスタの内容を書き込みます。アドレスはREDCLKと同様に、図6.33のようなフォーマットで指定します。

サンプルプログラム「PROMPT.MAC」を参照して下さい。