かつて、PC-8801SRなどに搭載されていたYAMAHA YM2203 FM音源ICを鳴らしてみました。
YAMAHA YM2203 FM音源IC
YM2203ですが、かつては色々なパソコンに音源ICとして搭載されてまして、私が昔持っていた機種だとPC-8801のSR以降 (私が持っていたのはPC-8801FH)に搭載されていろんなゲーム音楽を奏でてくれた素敵なICです。また、PC-8001がメインマシンだった当時、知人がYM2203をPC-8001で鳴らしていて羨ましかった覚えがあります。(当時はどうつないでいいか分からず….)
いまでもネットの海を彷徨うとYM2203のデータシートを見ることができます。SSG(PSG互換)3声とFM音源という2種類の音源を搭載しています。また、FM音源は以前作ったFM音源ボードで使ったYM2151同様専用DAC(デジタル-アナログ変換) ICを通してアナログ音声を出す仕組みとなっています。
電子部品通販店ではなかなか手に入らないICでして、オークションとかAmazonの中華な店とかでは見かける感じです。
今回知り合いに頼んで中華方面からYM2203 FM音源、YM3014B DACをゲットしてもらいました。ありがたや〜。念願のYM2203を動かしてみます。
KZ80マイコンへの搭載を計画
まずはKZ80マイコンへ搭載すべく、いつものSBC8080バスを装備したFM音源ボードを構想しました。現時点(2020/12月現在)では回路図を作ったところまでですが、githubにリポジトリを作成しました。
そのうち、プリント基板化してやろうという構想です。ただ、YM2203自体動かしたことがないので、先達のみなさまの回路図を参考にしたものの、ちゃんと鳴るものか心配でした。
回路図を引いてみて、FM音源ICの接続部分を見てみるとYM2203と以前のFM音源ボードのYM2151の信号線が酷似している事に気づきました。まずはYM2151がこちら。
で、YM2203がこちらです。
どちらのFM音源ICも、以下のような信号線でコントロール可能です。きっと同じメーカーのICだからですね。
信号線 | 説明 |
phM(PHY-M) | メインクロック(3.579545MHz) |
#IC | イニシャル・リセット(負論理) |
#WR(#IOWR) | 書き込み(負論理) |
#RD(#IORD) | 読み出し(負論理) |
#CE | チップセレクト(負論理) |
A0 | アドレスバス A0 |
D0〜D7 | データバス D0〜D7 |
つまり、YM2151の信号線を引き出して、YM2203へ接続してやれば音楽を奏でることが可能というわけです。またFM音源ICから2進数形式でシリアル出力されたデータをアナログへ変えるDACですが、同じYAMAHAのDACということもありYM2151をモノラルで鳴らす場合に今回ゲットしたYM3014Bで鳴らすという記事をwikipediaでも見かけました。(要出典になってるけど…^^))
では逆にYM2151用の2ch DAC YM3012の片チャンネル分で、YM2203のFM音源部分も行けるはず。
KZ80-YM2151 FM音源ボードの子基板として 作成
YM2151の信号線でYM2203を鳴らすことができそうということで、以前作ったKZ80マイコン用 YM2151 FM音源ボードに子基板としてYM2203を搭載するボードを試作してみました。
YM2151を搭載していたICソケットから 足長のピンヘッダーで子基板を持ち上げて、YM2203の該当する端子へ接続します。また、DAC(DA変換IC)は下のKZ80-YM2151ボードのYM3012を使いますので、そこもYM2151の足に戻すようにします。
将来的に子基板側に 専用DACのYM3014Bなども搭載したかったので、一部の信号線はジャンパで切り替えできるようにしました。
また上記のようにYM2203には、SSG(PSG互換)の音源も搭載されていてFM音源からDACを通した音声とミキシングする必要があります。写真に写っている緑色のケーブルがSSG(PSG互換)の音声ケーブルでして、KZ80-YM2151基板の出力部分あたりで結合してミキシングしています。
(別の記事で書きますが、上記のミキシング回路だと 音量が小さくなってしまうという問題があります)
VGMプレーヤープログラムの改良
ハードウェアはできたと思われるので、音楽を鳴らすVGMプレーヤーソフトを改良します。VGMフォーマットはネットの海を探すとフォーマットを掲載したサイトがあったりします。
以前 偽MSX1作戦のときのPSG音源(&ジョイスティック)ボードを作ったときにも、VGMプレーヤーを直してまして、同じような修正をしたいと思います。
音楽データのVGMデータというやつは、音源ICごとに特定のヘキサコードコマンド+レジスタ値+データ値というものがありまして音色だとか音程だとかが記録されているようです。$6x台のデータや$70なんかは休符のデータなので適当な時間待つ必要があります。
VGMプレーヤープログラムとしては、音源LSIによって特定のヘキサコードコマンドを判定する部分を直してあげると、他の部分は流用可能です。
上記サイトを見ると、音源ICごとのコマンドのヘキサデータは以下のようになってます。YM2203の場合は$55ですね。
音源IC | コマンド |
YM2151 | $54 |
AY-3-8910(YM2149) | $A0 |
YM2203 | $55 |
VGMプレーヤはZ80アセンブラで書かれていますが、それほど行数はないので以下に全ソースを掲載してしまいます。以下のソースはgithubにもUPしてますんで、最新版はそちらをご覧ください。
;
; YM2203 VGM PLAY FOR KZ80
;
CPU Z80
TARGET: equ "Z80"
MUSIC EQU 4200H
OPM_ADDR EQU 040H
OPM_DATA EQU 041H
;
ORG 4100H
;
JP MAIN
;
MAIN:
CALL MAIN1
;
RET ; PGM END
;
MAIN1:
LD HL,MUSIC
LOOP:
LD A,(HL) ; GET COMMAND
CP 055H
JP Z,PLAY
CP 061H
JP Z,WAIT1
CP 062H
JP Z,WAIT2
CP 063H
JP Z,WAIT3
CP 064H
JP Z,WAIT3
CP 066H
JP Z,END_RTN
;
CP 70H
JP Z,WAIT4
JP NZ,CHK_WAIT
NEXT:
INC HL
JP LOOP
;
END_RTN:
RET ; GOTO MAIN
;
PLAY:
INC HL
LD D,(HL)
INC HL
LD E,(HL)
WRITEOPN:
; STATUS CHECK WAIT
IN A,(OPM_ADDR)
RLCA
JR C,WRITEOPN
; REG OUT
LD A,D
OUT (OPM_ADDR),A
LD A,(IX+0) ;DUMMY
; DATA OUT
LD A,E
OUT (OPM_DATA),A
JP NEXT
;
WAIT1:
INC HL
LD E,(HL)
INC HL
LD D,(HL)
CALL WAIT
JP NEXT
;
WAIT2:
LD DE,735
CALL WAIT
JP NEXT
;
WAIT3:
LD DE,882
CALL WAIT
JP NEXT
;
CHK_WAIT:
CP 80H
JP NC,NEXT
WAIT4:
AND 0FH
INC A
LD D,0
LD E,A
CALL WAIT
JP NEXT
;
WAIT:
CALL WAIT1MS
DEC DE
LD A,D
OR E
JR NZ,WAIT
RET
;
WAIT1MS:
LD BC,1
WAIT1MSLOOP:
DEC BC
NOP ;DUMMY (clock 4)
LD A,C
OR B
JR NZ,WAIT1MSLOOP
RET
;
END
YM2151 FM音源IC版との違いは “LOOP:” のあたりのコマンド判定処理で $55を判定するように変更したところと、”WRITEOPN:” あたりの YM2203のステータスチェックルーチンのところを判定する修正しました。
YM2151では音源ICのBUSYステータスはI/Oポートのデータポート側から取得していましたが、YM2203では仕様が違いましてアドレスポート側を読む必要があります。そこだけ変更しています。
一発では鳴らず
VGMプレーヤーの改良も済んで、マクロアセンブラASでアセンブリしたIntelHexファイルを機械語モニターで流し込んで、いざ音楽を…..と思ったら鳴りませんでした。なにやら、SSG(PSG互換)のバックミュージック部分なのか「ブーブーブー」という音は聞こえている気がします。作った日はすでに遅い時間だったためいったん諦め。寝る間際に2ch DAC YM3012のデータシートを眺めていて、以下のタイミングチャートが気になりまして…
YM3012 データシート
DACのSAM1とSAM2という信号線が、FM音源ICから来るシリアルデータのタイミングをとるものらしいのですが、YM2203はこれに類する信号線が1本しかないので SAM2が未配線でした。orz
YM2151ソケットの19番ピンです。
また、YM3012のデータシートには以下の記載もありまして、1chで使う場合はSAM2をVss(本基板の場合はGND)へつなげということが書いてあるじゃないですか。まさに1本配線忘れです。
ああ1本はんだ付けして試したいぃぃと思いつつ、その日は寝ました。(X_X)
YM3012 データシート
上記の部分の助言を Twitterで まどちん●(@madscient)さんからも頂きました。ありがとうございます!!!
いつもながら英語のデータシートだったため、私がよく読めてなかったのが原因でした。
配線1本追加で鳴った!!
翌日、DAC YM3012のSAM2端子につながる、YM2151ソケットの19番ピンをGNDに落としたところ無事 VGM音楽データを鳴らすことができました!!
教訓としてはいつものことですが、データシートは(英語でも)ちゃんと読みましょうというところでした。
YM2203 FM音源ICが動くことが確認できたので、一緒に届いた DACの YM3014Bも動かしてみたいと思います。また、長年の夢でありますPC-8001との接続も実施してみたいと思います。
こちらは次の記事でまとめたいと思います。
コメント