にゃごすwiki

techhan/5.6

%第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では、このメモリに以下のようなデータを記憶させている。

  1. CRT表示の上下左右の調整値
  2. SCREEN、WIDTH、COLORの初期設定値
  3. BEEPの音色と音量
  4. タイトル画面の色
  5. 国別コード
  6. パスワード
  7. BASICのプロンプト どれかひとつが有効
  8. タイトル文字

 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)は書き込み専用で読み出しはできません。


図5.25 CLOCK-ICの構造



 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”にするとカウントを再開します。


図5.26 MODEレジスタの機能



 6.4 TESTレジスタの機能


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


図5.27 TESTレジスタの機能



 6.5 RESETレジスタの機能


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

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

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

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


図5.28 RESETレジスタの機能



 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の数値の対応は決まっていません。


図5.29 CLOCKとALARMの設定


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


図5.30 12時間計/24時間計の選択



図5.31 12時間計の午前/午後フラグ



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


図5.32 閏年の判定



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


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

●ブロック2の内容


図5.33 ブロック2の内容



●ブロック3の内容
 ブロック3は、ID値(レジスタ#O)の内容により、3通りの機能を持っています。図5.34にその機能を示します。


図5.34 ブロック3の内容



 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レジスタを設定し、次に目的のレジスタを読み出す、という手間をかける必要はない。


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


●WRTCLK(01F9H/SUB)……………CLOCK-ICのデータの書き込み
入力:C←CLOCK-ICのアドレス(図5.35参照)
   A←書き込むデータ(下位4ビットのみ有効)
出力:−
機能:Cレジスタで指定したアドレスのCLOCK-ICレジスタに、Aレジスタの内容を書き込む。アドレスはREDCLKと同様に図5.35のようなフォーマットで指定する。

このBIOSルーチンの使用例をリスト5.10に示します。

リスト5.10 プロンプトの設定

;============================================================
;
;  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