[書き込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
s | s | s | s | T | R | r | t |
このレジスタの振る舞いについては、完全にテストしていない。
このレジスタを使って再生を行うと、 タイマーの指定時間経過ごとに S-DSP が音声を生成する時に "同期" が変更されることも含めて、 あらゆる種類の普通でない変化が得られる。 SPC700 と S-DSP のバージョンによって異なる変化があっても、 少しも驚くことではない。
最高のアドバイスとして言えることは、 SPC700 のコードで、このレジスタをいじらないことだ。 そして、このレジスタに 0x0A 以外の値が書き込まれている時、 たくさんの警告を S-APU エミュレータから表示した方が良い。
電源ON時、このレジスタは 0x0A になる。 P フラグがセットされている時にこのレジスタに書き込むと、 何も変化が無いように見える。
[書き込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
r | - | b | a | - | 2 | 1 | 0 |
電源ON時、リセット時ともに、このレジスタは 0xB0 に設定されるようです。
[読み込み/書き込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
a | a | a | a | a | a | a | a |
[読み込み/書き込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
d | d | d | d | d | d | d | d |
これらのレジスタは、 DSP へのアクセスを制御する。 0x00F2 へ値が書き込まれた時、値に対応する DSP のレジスタを 0x00F3 から読み込むことができる。 もしくは、新しい値を 0x00F3 から書き込むことができる。 0x7F を超えたアドレスは無視され、アドレスは 0x7F でマスクされて 読み込まれる。
[読み込み/書き込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
x | x | x | x | x | x | x | x |
メイン側のI/O 0x2040 とのデータの読み込み/書き込みを行います。
[読み込み/書き込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
x | x | x | x | x | x | x | x |
メイン側のI/O 0x2041 とのデータの読み込み/書き込みを行います。
[読み込み/書き込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
x | x | x | x | x | x | x | x |
メイン側のI/O 0x2042 とのデータの読み込み/書き込みを行います。
[読み込み/書き込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
x | x | x | x | x | x | x | x |
メイン側のI/O 0x2043 とのデータの読み込み/書き込みを行います。
これらのレジスタは、 5A22 S-CPU との通信に使います。 これら 4 つのアドレスで、8 つのレジスタにアクセスします。 4 つが S-CPU への書き込み時にのみ使用され、 残り 4 つが S-CPU からの読み込み時に使用されます。 出力ポートに書き込んだ値は、対になる入力ポートの値には影響しません。 SPC700 は、CONTROL レジスタを使うことによってのみ 入力ポートをクリアすることができます。
S-CPU が読み込み中のポートに SPC700 が書き込みした場合、 S-CPU は、古い値と新しい値を論理 OR した結果を読み取ります。 読み込み動作の正確なサイクル数は不明ですが、 6 サイクルの S-CPU のメモリアクセスの内、 最後の 3 マスターサイクルと推測できます。 もしかすると逆の時にそれが起こるかもしれませんが、 詳細は不明です。
[読み込み/書き込み]
[読み込み/書き込み]
これらのレジスタは、0xF0 のビット 1 がセットされている場合と、 S-DSP エコーバッファの書き込みが変更されていない場合を除いて RAM のように動作する。
[書き込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
t | t | t | t | t | t | t | t |
[書き込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
t | t | t | t | t | t | t | t |
[書き込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
t | t | t | t | t | t | t | t |
[読み込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 0 | 0 | 0 | x | x | x | x |
[読み込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 0 | 0 | 0 | x | x | x | x |
[読み込み]
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | 0 | 0 | 0 | x | x | x | x |
SPC700 は 3 つのタイマーを持つ。 その内、T0 と T1 の 2 つは、ベースレートが 128 クロックサイクル (~ 8000Hz) で、 T2 は、ベースレートが 16 クロックサイクル (~ 64000Hz) になっている。
タイマー T0, T1, T2 はそれぞれ、下位 8 ビットプログラマブルインターバルタイマーと、 その上位に連結された上位 4 ビットアップカウンタで構成され、 それぞれ独立にプログラム可能。
8ビットタイマー 4ビットアップカウンタ 分解能 最大カウント値 最大カウント値 タイマーTO、T1 125 μsec 32 msec 512 msec タイマーT2 15.6 μsec 4 msec 64 msec
それぞれのタイマーは、 3 つのステージから成る。
ステージ 1 は、コンスタントに発生し、止めたりリセットしたりすることはできない。 ステージ 2 は、タイマーが有効になっている時に、 ステージ 1 の "Tick" ごとにインクリメントされる。 TnTARGET に設定した値とステージ 2 の新しい値が等しい時、 "Tick" がステージ 3 に伝えられ、ステージ 2 は 0 に初期化される。 ステージ 3 は、TnOUT から読み込み、読み込み時に値は 0 に初期化される。
ステージ 1 では、T0 と T1 の Tick が同時に起こり、 T2 も同じように、同時に起こる。 TEST レジスタを使って再生していない時、 2 サイクル後にこれを、 S-DSP がエコーバッファの右のチャネルに書き込む。 T2 ももちろん、エコーバッファの書き込み後、 18 サイクル後にステージ 1 の Tick が起こる。
TnTARGET に設定する 0x00 は、 256 Tick と一致する。 また、出力値は 4 ビットに制限される。
タイマーの実行中に、目標値の変更を行うことができる。 しかし、ステージ 2 カウンターが 2 の時に T=1 にセットした場合、 ステージ 3 の Tick は、ステージ 2 のカウンタが溢れてラップし、 1 に戻ってくるまで起こらなくなる。
TnTARGET の読み込みは常に 0 を返す。 TnOUT レジスタへの書き込みは効果が無い。 (ほとんどの"書き込み"オペコードと、読み込みも)
電源ON時、3 つ全ての TnOUT の値が 0x0F になる。 リセット時には 0x00 になる。
電源ON時、3 つ全ての TnTARGET の値が 0 になる。 リセット時は、前の値を保持する。
ステージ 1 の Tick 後、ステージ 2 カウンタの新しい値と TnTARGET レジスタへ書き込んだ値が同じ場合、競合状態を起こす。 詳細は blargg-TnTARGET-glitch-email.txt 参照。