SBC6303ルーズキットでYM2151 FM音源

ArduinoとZ80自作マイコンで動いたFM音源 YM2151をSBC6303でも動かしてみたいと思います。

拡張基板の作成

Arduinoのシールドとして作ったYM2151 FM音源ボード を載せる子基板を作成しました。
…実は以前作った拡張RAMボードに載せようとおもって40pinヘッダをずらそうと奮闘して壊してしまったのでイチから作り直しました。

拡張RAM以外の部分のFM音源シールドを接続する回路図はこんな感じです。

  • 68系はメモリーマップドI/Oなので拡張RAMのRDWRはSBC6303の拡張コネクタに出力していただいていますのでZ80より回路は更に簡単です。74HC138によるアドレスのデコードだけです。
    • アドレスもなんとなく$C000あたりにしてみました。

各基板はこんな感じです。

演奏ソフト BASIC 〜 MC6800 ASM

電大版TinyBASICで試しに演奏ソフトを書いてみました。音楽データは$3000からLILBUGのLコマンドで配置しておきます。
WAITがインチキですけど音が出たので一安心。

1 REM -------------------
2 REM YM2151 PLAY FOR SBC6303
3 REM -------------------
4 REM 
10 W=$3000:X=$4393
20 FOR I=W TO X
30 GOSUB 100
40 NEXT I
50 END
100 REM - HANTEI - 
110 IF #(I)=$54 GOTO 200
120 IF #(I)=$61 GOTO 300
130 IF #(I)=$62 GOTO 310
140 IF #(I)=$63 GOTO 320
150 IF #(I)=$64 GOTO 320
160 IF #(I)=$66 GOTO 50
170 GOSUB 330:RET
200 REM - PLAY - 
210 I=I+1:#($C000)=#(I) 
220 I=I+1:#($C001)=#(I)
230 RET
299 REM - WAIT -
300 FOR J=1 TO 1 : NEXT J:RET
310 FOR J=1 TO 2 : NEXT J:RET
320 FOR J=1 TO 3 : NEXT J:RET
330 FOR J=1 TO 4 : NEXT J:RET

やはりZ80マイコンのときといっしょで、アセンブラで書かないとちゃんとした演奏はできなさそう。
MC6800のアセンブラ表とにらめっこしながらArduinoやZ80のアセンブラソースとほぼ同じコードを書いてみました。
Z80のつもりで書くと16bitレジスタペアが少ないとか、分岐命令が+/-127バイト程度だったりとかヒッカカリポイントは多数…

通称prontfデバグと、LILBUGのT(トレース)コマンドで無事稼働しました。
ソースをまたgistにUPしました。長いですが以下のようなソースになります。

アセンブリはクロスアセンブラASを使ってMac上で実施しました。
(ソースファイル名はPLAY.ASM)

$ asl -cpu 6800 -L PLAY.ASM
$ p2hex -r \$-\$ -F Moto PLAY.p

音楽データは FCB命令でバイナリデータを並べたものを別途準備。
MacのCoolTERMを使用して1文字あたり1msのウェイトを入れてLILBUGのLコマンドへ転送しました。

MC6800のコードで書いたのはSBC6800でも将来動いたら良いなぁという気持ちもあったりしたのです。
無事 FM音源で 音楽を奏でることができました!!

広告

Z80版 YM2151 VGMファイル プレーヤー

前回作成したZ80マイコン用 YM2151音源のプレーヤをZ80アセンブラで作成してみました。

作成と言っても、こちらのサイトのArduinoスケッチをストレートコンバートしたものです。 ^^)>

Arduino で YAMAHA YM2151 を VGM ファイルで演奏させる
http://another.maple4ever.net/archives/2441/

Z80版プレーヤ アセンブラソース

作成したZ80マイコン用 YM2151音源のプレーヤのソースは こちらです。(ちょっと長いです)
gistにUPしています。数十年ぶりにZ80 CPUのインストラクションを調べながら作ったので無駄なコードがたくさんあると思います。

  • 音楽データはArduino用ヘッダファイルに16進形式でサンプル音楽が入っているので、別Z80 ASMファイルへawkでコンバートしました。
  • 音楽データは 9000hから配置することで決め打ちにしています。
  • Z80のI/O番地 20hにYM2151を配置したので 20h/21hへデータを出力しています。
  • 休符のためのウェイトルーチンは私の作ったZ80マイコン用に調整したので他の環境の場合は再調整が必要です。

アセンブリ

Windows上で、zmacを使ってクロスアセンブルしました。

> zmac --oo lst,hex Z80-VGM-PLAY.ASM

インテルHEX形式のオブジェクトが生成されますので、これを流し込めばOK!
先日紹介した機械語モニターのLコマンドで流し込みします。

ちょっと音楽ファイルはファイルが大きめなので、TeraTERMの設定で1文字づつウェイトを入れながら流し込まないとZ80マイコンで取りこぼしてしまいました。1文字1ms待つ設定にしたら、昔のマイコンのカセットテープばりに時間がかかりますw

実行

機械語モニターのLコマンドでロードが完了したら、8000hから始まるプログラムを実行します。

G8000

BASICではDATA文の途中で演奏が止まってしまいましたが、Z80機械語で作ったプレーヤーでは最後まで演奏できました!!

YM2151 FM音源LSIをZ80で動かす

知り合いの方からYM2151 FM音源チップと専用DAC YM3012をいただきました。
いつもLEDチカチカだけでは つまらないのでマイコンで音楽を奏でてみたい!

まずはArduino+ブレッドボードで…

チップをゆずってくれた方のArduinoスケッチで、まずはYM2151 FM音源チップ+DAC YM3012が鳴るか試してみたいと思いました。
いつもどおり、ブレッドボードで仮組みしてみます。アンプは4回路入っているものだったら1つで済みます。たぶん音にこだわらなければ 何でも良いです。私はLMC660AINを使いました。250円ぐらいだったかな…

h1romas4/arduino-vgmplayer
https://github.com/h1romas4/arduino-vgmplayer

回路図はこちらとほぼ同じです。

無事チップは稼働しました!! なんか音色が懐かしいです。
出力はLINE出力なのでCDラジカセのLINE入力へ。LINE入力装備の機器も手持ちが少なくなって厳しくなってきました….

Arduinoのスケッチを読むとわかりますが、データバス(D0〜D7)とRD/WRIC(リセット)とA0(アドレスバス)を、ホストとなるマイコンになったつもりでHレベルにしたりLレベルにしたりという操作をソフトウェアで頑張っています。

Arduino用 YM2151シールドの作成

ブレッドボードで試作した回路といっしょのものをYM2151シールドとして、秋月電子で購入した Arduino用ユニバーサル基板に作成してみます。
この基板、安いですがわりと大きめでちょっと余裕をもった部品配置にできそうです。
DACとアンプICの間は太い線で…と思ったらちょっと太すぎました。あとDACのあたりに大きめのコンデンサをつけるのを忘れて、裏面に10μFの表面実装部品を急遽はんだ付けしました。手持ちが合って良かった….

こちらも はんだ付けの不良2箇所があったのですが修正して無事音楽を奏でることが出来ました。
※配線作業は8時間ぐらい…

Z80自作マイコンでFM音源を鳴らしたい!!

FM音源といえば8ビットマイコン時代から装備した機器があったので、先日自作したZ80マイコンに装備したみたい!!という野望が当初からありました。

拡張端子が無い問題

先日自作したZ80マイコンにはSBC6303のような拡張バスを接続する端子は装備していませんでした。(CPUとROM/RAM/ACIAで基板がギリギリ…)

そこで、地元の部品店でも売っていた 40PラッピングICソケットで嵩上げしてみたいと思います。
ちなみに、まだ作成途中ですが 40PラッピングICソケットで嵩上げして8255A基板を作ろうとしている写真がこちら。

Z80自作マイコン用 Arduinoシールドアダプタ

名前が長いですけど、Arduinoで動かしたYM2151基板をそのままZ80マイコンにつなげてしまうアダプタを作成しました。

  • 40Pラッピング用ICソケットでZ80 CPUを嵩上げ。(外部I/O端子の代わりです)
  • 電源(5V/GND)とデータバス(D0〜D7)をYM2151シールド向け端子へ接続。
  • Z80のRD(READ)とWR(WRITE)をIOREQと合わせてIORDIOWRを作ります。外部デバイスとのI/O命令が出たという信号です。
  • I/Oアドレスのデコードに74HC138を使用してアドレスバス (A7、A6、A5)をデコードします。(IOREQは)RDWR側で入れたのでちょっと手抜き..
    • YM2151 FM音源チップのCE(チップイネーブル)はArduinoで動かすときはGNDへ常時落としていましたが、Z80につなぐにあたって真面目にI/Oアドレスをデコードすることにしたので、YM2151シールド上のジャンパでGNDか別ピンにまわすか選べるようにしました。(YM2151シールドの黄色いジャンパです)

Z80自作マイコン用 Arduinoシールドアダプタの回路図はこんな感じです。
左側はZ80 CPUの信号線です。

Z80マイコンへシールドアダプタとシールドを装備

Z80マイコンへシールドアダプタとシールドを装備すると3階建てになっちゃいました。
2Fと3Fの基板はちょっと小さめなので支えるものが少なくて不安定ですが….

BASICで音楽演奏!!

さて、そもそもZ80からコントロールして音が出るか?というところが不安です。ArduinoではC言語ですが、同じようなロジックでBASICを組んでみました。音楽データを読み込みつつ、OUT命令を出しまくるやつです。音楽になるかどうかは分かりませんが、音は鳴るはず…
※実はユニバーサル基板で作成する前に、ブレッドボードで試作してみましたがまったく音が出ずちょっと凹んでいたのは内緒です。

参考にさせていただいたこちらのサイトC言語ヘッダファイルに音楽データのバイナリデータが定義されています。これをBASICのDATA文で定義して I/Oアドレス 20h/21hへ送れば音が出るはず。

BASICのソースはgistに上げました。リンクはこちらです。(DATA文が長いので、リンク先を見てください。)

こちらの動画のように無事(?)音が出ました。

BASICのDATA文の制約で16進数が直接記述できないとか、DATA文の長さ??制約で途中で演奏が止まっちゃったりしてますけど、自作Z80マイコンで無事 FM音源から音が出て感動です!!

音源装備という点だけは、かつてメインマイコンだったPC-8001を超えた?!かな!?(w