OPN系FM音源チップを制御します
OPN3L(YMF288-M)を制御します。
OPNA(YM2608)やOPN(YM2203)にも使用可能だと思われますがテストしていません。
OPNの場合は拡張FM部を正しく指定してください。
ADPCM系はテストしていません。
読出しも未実装です。コメントアウトしてありますが確認とれていません。
このプログラムは YMF288変換基板+Arduinoで簡易S98プレーヤを作る(その1)(http://d.hatena.ne.jp/m_yanase/20130901/1378020818) を参考にしています。
FMOPN.cpp
- Committer:
- netwing
- Date:
- 2016-01-12
- Revision:
- 1:df099d954a8f
- Child:
- 2:ea441ce9e405
File content as of revision 1:df099d954a8f:
#include "mbed.h" #include "FMOPN.h" #define bitRead(value, bit) (((value) >> (bit)) & 0x01) OPN3L::OPN3L( PinName _D0, PinName _D1, PinName _D2, PinName _D3, PinName _D4, PinName _D5, PinName _D6, PinName _D7, PinName RST, PinName A0, PinName A1, PinName CS ) : _BIT0(_D0), _BIT1(_D1), _BIT2(_D2), _BIT3(_D3), _BIT4(_D4), _BIT5(_D5), _BIT6(_D6), _BIT7(_D7), _RST(RST), _A0(A0), _A1(A1), _CS(CS) { } // Reset void OPN3L::reset() { _RST = 0; wait_us(100); _RST = 1; wait_ms(100); } // Register Write void OPN3L::reg_write(unsigned char ifadr, unsigned char adr, unsigned char dat) { law_write(ifadr, adr, dat); switch (adr) { // データライト後のWait case 0x28: { // FM Address 0x28 wait_us(WT_FM_DA); // min: 24us wait break; } case 0x10: { // RHYTHM Address 0x10 wait_us(WT_RHYTHM_DA); // min: 22us wait break; } default: { // Other Address wait_us(2); // min.1.9us wait } } } //Write void OPN3L::law_write(unsigned char ifadr, unsigned char adr, unsigned char dat) { adr_write(ifadr,adr); dat_write(dat); } //Write Address void OPN3L::adr_write(unsigned char ifadr, unsigned char adr) { _A0 = 0; // Address Bus set _A1 = bitRead(ifadr, 0); write_data(adr); // Address set _CS = 0; wait_us(1); // min: 200ns wait _CS = 1; wait_us(2); // min: 1.9us wait } //Write Data void OPN3L::dat_write(unsigned char dat) { _A0 = 1; // Address Bus set write_data(dat); // Data set _CS = 0; wait_us(1); // min: 200ns wait _CS = 1; } //Operated signal line void OPN3L::write_data(unsigned char dat) { _BIT0 = bitRead(dat, 0); _BIT1 = bitRead(dat, 1); _BIT2 = bitRead(dat, 2); _BIT3 = bitRead(dat, 3); _BIT4 = bitRead(dat, 4); _BIT5 = bitRead(dat, 5); _BIT6 = bitRead(dat, 6); _BIT7 = bitRead(dat, 7); }