りんけーじ - 開発資料 - PSX - RTC


この資料について

ここには FlareStorm の開発の際に PlayStation の RTC の動作を解析した情報を載せていきます。
最初は psx.padua.org の解析の情報をもとに進めてきました。以下の解析の情報はその資料をもとに、私自身が解析したものです。
一応書いておきますが、以下の情報は推測を含み、間違っているものもあるかもしれません。
解析は SCPH-1000 で行っています。
ビットは最下位ビットをビット 0 とします。

ハードウェアレジスタ

RTC は 3 つあり、独立に動作しています。
各カウンタにつき、3 つのレジスタがあります。
ベースアドレスRTC
0x1F801100RTC 0
0x1F801110RTC 1
0x1F801120RTC 2
全てのレジスタへのアクセスは、通常は Half-Word です。Word でもアクセスできますが、上位 16 ビットは 0x1F80 などの意味の無いものとなります。
オフセットロード時ストア時
0x0000現在のカウンタ値カウンタをセット
0x0004 下位 10 ビット(マスク 0x3FF) : 現在のモード
0x0400 : 不明(常に 1 ?)
0x0800 : カウンタがターゲット値を通過した
0x1000 : カウンタが 0xFFFF を越えて 0 に戻った
他は不明
モードをセット, カウンタを 0 にクリア
0x0008現在のターゲット値ターゲット値をセット

モード

モードのビット動作
0x0001 カウント停止 (RTC2 のみ)
他は未調査
0x0008 ターゲット値有効
0x0010 割り込み有効
0x0040 不明
0x0100 RTC0, 詳細不明, 画面幅に比例したカウント(詳細は調査中)
RTC1, 水平同期ブランクカウントモード
0x0200 カウンタ 1/8 分周 (RTC2 のみ)

基本動作

CPU の 1 クロックごとに 1 ずつカウンタの値が増加する。1/8 分周が指定されていれば、8 クロックで 1 増加する。
水平同期ブランクカウントモードであれば、画面出力の水平同期ブランクの度に 1 増加する。
モードのターゲット値有効のフラグが立っていれば、ターゲット値まで増加した後は 0 へ戻る。それ以外では 0xFFFF まで増加する。
ターゲットの値より大きな値をカウントレジスタにセットすると、一度 0xFFFF まで通常動作した後、0 からターゲット値の間での動作になる。

モードレジスタの詳細

モードレジスタに値を書くと、モードが設定されて、さらにカウンタが 0 に戻る。
モードレジスタの上位にあるフラグは、その条件が成立したときに立ち、モードレジスタのロードによってクリアされる。
RTC2 をターゲット = 0、モード = 1(停止) とすると、モードのセットによってカウントが 0 になり、それがターゲット値と等しいためにモードレジスタの 0x0800 のビットが立ったままになる。

割り込み

モードレジスタのフラグ 0x0010 を立てておくと、カウントが 0 に戻るときに割り込みが発生する。
フラグ 0x0040 が割り込みに関係していると書かれている資料もあるが、確認できなかった。
(割り込みが発生したかどうかは 0x1F801070 の値で調べました)

修正・更新履歴