ArduinoとZ80自作マイコンで動いたFM音源 YM2151をSBC6303でも動かしてみたいと思います。
拡張基板の作成
Arduinoのシールドとして作ったYM2151 FM音源ボード を載せる子基板を作成しました。
…実は以前作った拡張RAMボードに載せようとおもって40pinヘッダをずらそうと奮闘して壊してしまったのでイチから作り直しました。
拡張RAM以外の部分のFM音源シールドを接続する回路図はこんな感じです。
- 68系はメモリーマップドI/Oなので拡張RAMのRDとWRは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音源で 音楽を奏でることができました!!
コメント