はっくはっくキッチン
Hack Hack Kitchen

AVR による PSG (AY-3-8910) 制御器

 2021/11/21

AVR を使った PSG (AY-3-8910/YM2149) 制御器 (プロトタイプ)。

./AY-3-8910-banner.jpg

動作風景

Wohl mir, dass ich Jesum habe - Jesus bleibet meine Freude (from Herz und Mund und Tat und Leben (BWV 147) by J. S. Bach)
Le Cygne (from Le Carnaval des animaux—Grande fantaisie zoologique by C. Saint-Saëns)

概要

同様のプロジェクトは他にもたくさんありますが、AY-3-8910 を AVR で制御してみました。 特に新規性はありません。

AY-3-8910 on a breadboard
AY-3-8910 on a breadboard
AY-3-8910 board
AY-3-8910 board

回路図

./AY-3-8910-sch-thumb.png
Schematic of PSG Controller (click to enlarge)

ソフトウェア

以下で構成されています:

psg-test.asm

テスト用の簡単な制御プログラム。これ単体で利用できます

psgplay.asm

メイン

psgplay-commands.asm

定数定義

tonedata.asm

bin/tone.pl によって生成された周波数データー

musicdata.asm

bin/mmlc.pl によって生成された音楽データー

bin/tone.pl

指定された PSG 動作周波数に対応した音階データーを作成します

bin/mmlc.pl

MML からバイナリーデーターを (.db として) 生成します。 後でアセンブリ言語で書き直すことを前提に書いているので、一般的でない書き方になっています

データーを事前にバイナリーに変換して AVR 内に書き込み、AVR ではそのデーターを PSG に送信するだけになっています。

ビルド方法

フューズ設定

上の回路のように AVR から PSG へクロックを供給する場合には、AVR のフューズ設定が必要です。 ATmega48 シリーズでは CKOUT を有効にするために Low Byte の 6 ビット目を 0 に変更します。 CKOUT がないものもあります (ATmega8 など)。 PSG に別途クロックを供給する場合はフューズ設定は不要です。

avrdude を使用している場合は、具体的には以下のようにします。 $(...) は自身の環境に合わせて変更して下さい。

avrdude -c $(AVRWRITER) -p $(DEVICE) -b $(AVRDUDEBAUDRATE) -U lfuse:w:0x22:m

ビルド手順

今後の課題

  • シリアル通信等で MML を AVR に送り、AVR で PSG 用のデーターに変換、送信するようにする?

  • VGM format 対応?

License

  • MIT License