2017/04/11
SHVC-SOUNDをPCへ接続する
初期型のスーパーファミコン(SFC)に搭載されている音源モジュールであるSHVC-SOUNDをPCに接続してみました。
SFC音源の概要
SFCにはSPC700と呼ばれる音源チップが搭載されています。 SPC700の基本スペックは以下の通りです。
項目 | 説明 |
---|---|
メーカー | ソニー |
サンプリング周波数 | 32kHz |
変調方式 | 16bit ADPCM |
RAM | 64KB |
同時発音数 | 8ch |
当時としては高性能な音源であると言われていますが、RAMが64KBしかない等の使いづらい点もあります。
SHVC-SOUNDとは
SHVC-SOUNDは、初期型のSFCにのみ搭載されている取り外し可能なSPC700のドーターボードです。 中期型以降のSFCでは、メイン基板に直接SPC700が実装される形になったので取り外すことはできなくなっています。
SHVC-SOUNDを入手する主な方法は、初期型のSFCを分解して取り外すことです。
なお、初期型のSFCの特徴は以下の通りです。 中身の基板だけ取り替えられている可能性もあるため、最後の特徴以外は参考程度にお願いします。
- 製造番号がS1から始まる
- 底のゴムが4つ
- 中期型以降と比べると、金属パーツが多いため重い
SHVC-SOUNDをPCへ接続させる
SHVC-SOUNDは単体で動作することができるため、PCへ接続する試みは昔から行われています。 昔はパラレルポートを使用した方法がよく使われていたようですが、現在ではArduinoを使用した方法があります。
ここではパラレルポートを使用した回路を元に、SHVC-SOUNDをArduinoを通してPCへ接続しました。回路図は以下の通りです。
ArduinoのD2~D9にデータバス、D10以降にアドレスバスとWR/RDを配線しています。 オーディオ出力回路の部分はパラレルポートを使用した回路を参考にしています。 必要であればVSNDにサウンド用の電源を接続することも可能ですが、ここではVccを接続しています。
SHVC-SOUNDとSFCのメイン基板を接続しているソケットは通常のピンソケットではないため、SFCのメイン基板から取り外して入手するのが良いと思います。ピンピッチは2.0mmです。
次にソフトウェアを用意する必要がありますが、SNES_APU_SDのソフトウェア一式を使用します。
PC側のソフトウェアはリポジトリに含まれているapuplay_binary.zip
としてまとめられているものが使用できます。
一方Arduino側のスケッチはSNES_APU_SD/SNES_APU_SD.ino
を使用するのですが、ピン配置がリポジトリのものとは異なるためその部分を変更する必要があります。
パッチをgistに置いておきます。
実際にapuplayを使用して.spcファイルを再生している様子をアップしました。
SHVC-SOUNDで.spcファイルを再生、昨日アップしたのは音が小さかったから撮り直した pic.twitter.com/5kloK8noTn
— NV(*´ω`*) (@nvsofts) April 10, 2017
SHVC-SOUNDで.spcファイルを再生 pic.twitter.com/ihXqK1hOzw
— NV(*´ω`*) (@nvsofts) April 9, 2017
2017/04/16追記: SHVC-SOUNDを制御するためのソフトウェアを作成しました。GitHubにアップしてあります。
参考: SFCにおけるSPC700の扱い
SFCには2つのアドレスバスがあります。
- バスA: 24bit幅、主にカートリッジへのアクセスに使用される
- バスB: 8bit幅、主にPPU(Picture Processing Unit)やSPC700へのアクセスに使用される
バスBが8bit幅で狭すぎないかと思うかもしれませんが、バスBはアドレスが$21xx
であるようなメモリへのアクセスでのみ使用されるため大丈夫です。
SPC700は$2140
〜$2143
の範囲に割り当てられています。
しかし、SPC700へ配線されているアドレスバスがPA0、PA1、PA6、PA7の4つしかないため実際は$2144
〜$217F
の範囲にもミラーとして存在しています。
レジスタ名 | アドレス | タイミング |
---|---|---|
SPC700 I/Oレジスタ0 | $2140 |
常時 |
SPC700 I/Oレジスタ1 | $2141 |
常時 |
SPC700 I/Oレジスタ2 | $2142 |
常時 |
SPC700 I/Oレジスタ3 | $2143 |
常時 |
SPC700がリセットされると、まず最初にIPL ROMと呼ばれるブートROMイメージを実行します。
IPL ROMによって$2140
〜$2141
に0xBBAA
がセットされ、SPC700の準備が完了したことをCPUが知ることができるようにします。
このようにしてSPC700はCPUへ準備が完了したことを知らせるため、例えばSHVC-SOUNDを取り外したSFCでSPC700を使用するようなゲームを起動させるとフリーズします
($2140
〜$2141
から0xBBAA
を読み出せるようになるまで待ち続けるため)
CPUがSPC700の準備が完了したことを知ったタイミングでCPUは$2140
に0xCC
を書き込むことで、SPC700は転送ルーチンへと入りCPUからサウンドプログラムを受け取ることができる状態になります。
その後、SPC700は指定された実行開始アドレスへジャンプすることで受け取ったサウンドプログラムが実行され、音声の出力等が行われます。