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音源で 音楽を奏でることができました!!

コメント