えぬえす工房
  • Search results
avatar えぬえす工房
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

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ファイルを再生している様子をアップしました。

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$21410xBBAAがセットされ、SPC700の準備が完了したことをCPUが知ることができるようにします。 このようにしてSPC700はCPUへ準備が完了したことを知らせるため、例えばSHVC-SOUNDを取り外したSFCでSPC700を使用するようなゲームを起動させるとフリーズします ($2140$2141から0xBBAAを読み出せるようになるまで待ち続けるため)

CPUがSPC700の準備が完了したことを知ったタイミングでCPUは$21400xCCを書き込むことで、SPC700は転送ルーチンへと入りCPUからサウンドプログラムを受け取ることができる状態になります。 その後、SPC700は指定された実行開始アドレスへジャンプすることで受け取ったサウンドプログラムが実行され、音声の出力等が行われます。

参考ページ

SFCのメモリマップ

SFCのレジスタ一覧

SPC700のIPL ROMの解説

Author

avatar
NV

見習いセキュリティエンジニア

Comments