IO ポート (サウンド) > SPC

0x00F0 - TEST (テスト機能)

[書き込み]

D7 D6 D5 D4 D3 D2 D1 D0
s s s s T R r t
  • ssss : CPU スピード調整 (タイマー速度には影響しない)
    • 0 = 通常 CPU 速度
    • 1 = 3/5 通常速度
    • 2 = 3/9 通常速度
    • 3 = 3/17 通常速度
    • 4 = 3/4 通常速度
    • 5 = 3/6 通常速度
    • 6 = 3/10 通常速度
    • 7 = 3/18 通常速度
    • 8 = 3/6 通常速度
    • 9 = 3/8 通常速度
    • A = 3/12 通常速度
    • B = 3/20 通常速度
    • C = 3/10 通常速度
    • D = 3/12 通常速度
    • E = 3/16 通常速度
    • F = 3/24 通常速度 0 以外に設定した場合、SPC700 をロックすることがあります。
  • r : このフラグをクリアした時、RAM への書き込みを禁止する。 0xF0 ~ 0xFF への書き込みのみが有効になる。 これは、S-DSP バッファへの書き込みも禁止する。
  • R : 不明 基本的にこのフラグをセットした時には SPC700 がロックされる。 おそらく、RAM からの読み込みを禁止し、SPC700 は ゴミの入った命令を何度も繰り返して終了する。
  • T/t : 不明 しかし、T=1 と t=0 でない限り、タイマーは停止する。

このレジスタの振る舞いについては、完全にテストしていない。

このレジスタを使って再生を行うと、 タイマーの指定時間経過ごとに S-DSP が音声を生成する時に "同期" が変更されることも含めて、 あらゆる種類の普通でない変化が得られる。 SPC700 と S-DSP のバージョンによって異なる変化があっても、 少しも驚くことではない。

最高のアドバイスとして言えることは、 SPC700 のコードで、このレジスタをいじらないことだ。 そして、このレジスタに 0x0A 以外の値が書き込まれている時、 たくさんの警告を S-APU エミュレータから表示した方が良い。

電源ON時、このレジスタは 0x0A になる。 P フラグがセットされている時にこのレジスタに書き込むと、 何も変化が無いように見える。

0x00F1 - CONTROL (I/Oとタイマーの調整)

[書き込み]

D7 D6 D5 D4 D3 D2 D1 D0
r - b a - 2 1 0
  • r : 1 の時、64 バイトの IPL ROM が 0xFFC0 ~ 0xFFFF から読み込み可能になります。 0 の時、この領域が普通の RAM になります。 0xFFC0 ~ 0xFFFF への書き込みは、このフラグの設定に関係なく、 RAM に影響します。
  • a : 1 を書き込んだ時、入力ポートの 0x00F4 と 0x00F5 が 0x00 にクリアされます。
  • b : 1 を書き込んだ時、入力ポートの 0x00F6 と 0x00F7 が 0x00 にクリアされます。 1 度だけ 0 にする処理が行われます。S-CPU から読み込む値には影響しません。 1 が書き込まれた時にはいつでも 0 化処理が行われます。 0 から 1 に変更する時ではありません。
  • 012 : タイマー 0, 1, 2 を有効にします。 レジスタ 0x00FA ~ 0x00FF を参照してください。 0 から 1 へ移行があった場合、タイマーステージ 2 と 3 が 両方とも 0 にリセットされます。しかし、ステージ 1 "カウンタ" は リセットされません。

電源ON時、リセット時ともに、このレジスタは 0xB0 に設定されるようです。

0x00F2 - DSPADDR (DSP通信アドレス)

[読み込み/書き込み]

D7 D6 D5 D4 D3 D2 D1 D0
a a a a a a a a

0x00F3 - DSPDATA (DSP通信データ)

[読み込み/書き込み]

D7 D6 D5 D4 D3 D2 D1 D0
d d d d d d d d

これらのレジスタは、 DSP へのアクセスを制御する。 0x00F2 へ値が書き込まれた時、値に対応する DSP のレジスタを 0x00F3 から読み込むことができる。 もしくは、新しい値を 0x00F3 から書き込むことができる。 0x7F を超えたアドレスは無視され、アドレスは 0x7F でマスクされて 読み込まれる。

0x00F4 - CPUI0, CPUO0 (CPU入力/出力 0)

[読み込み/書き込み]

D7 D6 D5 D4 D3 D2 D1 D0
x x x x x x x x

メイン側のI/O 0x2040 とのデータの読み込み/書き込みを行います。

0x00F5 - CPUI1, CPUO1 (CPU入力/出力 1)

[読み込み/書き込み]

D7 D6 D5 D4 D3 D2 D1 D0
x x x x x x x x

メイン側のI/O 0x2041 とのデータの読み込み/書き込みを行います。

0x00F6 - CPUI2, CPUO2 (CPU入力/出力 2)

[読み込み/書き込み]

D7 D6 D5 D4 D3 D2 D1 D0
x x x x x x x x

メイン側のI/O 0x2042 とのデータの読み込み/書き込みを行います。

0x00F7 - CPUI3, CPUO03 (CPU入力/出力 3)

[読み込み/書き込み]

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 マスターサイクルと推測できます。 もしかすると逆の時にそれが起こるかもしれませんが、 詳細は不明です。

0x00F8 (普通の RAM)

[読み込み/書き込み]

0x00F9 (普通の RAM)

[読み込み/書き込み]

これらのレジスタは、0xF0 のビット 1 がセットされている場合と、 S-DSP エコーバッファの書き込みが変更されていない場合を除いて RAM のように動作する。

0x00FA - T0TARGET (タイマー0スケーリングターゲット)

[書き込み]

D7 D6 D5 D4 D3 D2 D1 D0
t t t t t t t t

0x00FB - T1TARGET (タイマー1スケーリングターゲット)

[書き込み]

D7 D6 D5 D4 D3 D2 D1 D0
t t t t t t t t

0x00FC - T2TARGET (タイマー2スケーリングターゲット)

[書き込み]

D7 D6 D5 D4 D3 D2 D1 D0
t t t t t t t t

0x00FD - T0OUT (タイマー0出力)

[読み込み]

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 x x x x

0x00FE - T1OUT (タイマー1出力)

[読み込み]

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 x x x x

0x00FF - T2OUT (タイマー2出力)

[読み込み]

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 : 128:1 (T0, T1) もしくは 16:1 (T2) 8 ビットタイマー
  • ステージ 2 : 0 ~ 255 の範囲を取る、ラップアラウンドカウンタ
  • ステージ 3 : タイマー出力用の 4 ビットアップカウンタ

ステージ 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 参照。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2017年02月20日 19:18