YAMAHA YM2203 FM音源ボード(1) KZ80マイコンで鳴らす

YM2203

かつて、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の中華な店とかでは見かける感じです。

https://amzn.to/2ImsuEt

今回知り合いに頼んで中華方面からYM2203 FM音源、YM3014B DACをゲットしてもらいました。ありがたや〜。念願のYM2203を動かしてみます。

KZ80マイコンへの搭載を計画

まずはKZ80マイコンへ搭載すべく、いつものSBC8080バスを装備したFM音源ボードを構想しました。現時点(2020/12月現在)では回路図を作ったところまでですが、githubにリポジトリを作成しました。

GitHub - kuninet/KZ80-YM2203: KZ80マイコン用 YM2203 FM音源ボード
KZ80マイコン用 YM2203 FM音源ボード. Contribute to kuninet/KZ80-YM2203 development by creating an account on 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フォーマットはネットの海を探すとフォーマットを掲載したサイトがあったりします。

VGM Specification - vgmrips

以前 偽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との接続も実施してみたいと思います。
こちらは次の記事でまとめたいと思います。

コメント