タイマー

FF04 - DIV - 分周レジスタ (読み込み/書き込み可能)


このレジスタは 16,384 Hz でインクリメントされています (スーパーゲームボーイでは 16,779 Hz)。
ゲームボーイカラーの倍速モードでは、 32,768 Hz になります。

何らかの値がこのレジスタへ書き込まれた時、 00h にリセットされます。

FF05 - TIMA - タイマーカウンタ (読み込み/書き込み可能)


このレジスタの値は、 TAC レジスタ (FF07) で設定されたクロック周波数でインクリメントされます。
値がオーバーフローした時 (FFh を超えた時)、 TMA レジスタ (FF06) で指定した値にリセットされ、割り込み要求が出されます。

FF06 - TMA - タイマーモジュロ (読み込み/書き込み可能)


TIMA レジスタがオーバーフローした時、この値がセットされます。

FF07 - TAC - タイマー制御 (読み込み/書き込み可能)


 Bits 7-3 - 未使用
 Bit    2 - タイマー停止状態  (0 = 停止, 1 = 開始)
 Bits 1-0 - 入力クロック選択
            00:   4,096 Hz    (~4,194 Hz SGB)   1,024 分周
            01: 262,144 Hz  (~268,400 Hz SGB)      16 分周
            10:  65,536 Hz   (~67,110 Hz SGB)      64 分周
            11:  16,384 Hz   (~16,780 Hz SGB)     256 分周

TAC は、タイマ機能を制御するレジスタです。

ビット 2 が 1 にセットされているとき、Bit 1-0 で選択した入力クロックがカウントされ、 TIMA レジスタが増加します。
入力クロックは、システムクロックが分周されたものを 4 つの中から選択できます。

タイマ割り込み間隔の例


1 秒間に 4,096 回の間隔で割り込みを発生させたいとき:

4,096 Hz = 4.096 KHz / 1

 LD A, -1         ;入力クロックを 1 分周
 LD ($FF06), A
 LD A, 4          ;入力クロックに 4.096 KHz を選択
 LD ($FF07), A

1 秒間に 65,536 回の間隔で割り込みを発生させたいとき:

65,536 Hz = 262.144 KHz / 4

 LD A, -4         ;入力クロックを 4 分周
 LD ($FF06), A
 LD A, 5          ;入力クロックに 262.144 KHz を選択
 LD ($FF07), A

または

65,536 Hz = 65.536 KHz / 1

 LD A, -1         ;入力クロックを 1 分周
 LD ($FF06), A
 LD A, 6          ;入力クロックに 65.536 KHz を選択
 LD ($FF07), A

INT 50 - タイマー割り込み


タイマーがオーバーフローするたびに (TIMA が FFh を超えるたびに)、
IF レジスタ (FF0F) のビット 2 がセットされ、割り込み要求が出されます。
割り込みが有効になっている時、 CPU は 0050 の割り込みベクタを呼び出します。

注意


上で説明したタイマーはゲームボーイの内蔵タイマーです。
MBC3 のバッテリで動く、リアルタイムクロックのことではありません。
メモリバンクコントローラ のところで詳しく書きます。
最終更新:2017年08月28日 14:53