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-13
Revision:
2:ea441ce9e405
Parent:
1:df099d954a8f

File content as of revision 2:ea441ce9e405:

#include "mbed.h"
#include "FMOPN.h"
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
FMOPN::FMOPN(
    PinName _D0,
    PinName _D1,
    PinName _D2,
    PinName _D3,
    PinName _D4,
    PinName _D5,
    PinName _D6,
    PinName _D7,
    PinName RST,
    PinName A0,
    PinName A1,
    PinName CS,
    PinName WR,
    PinName RD
) : _BUS(_D0,_D1,_D2,_D3,_D4,_D5,_D6,_D7), _RST(RST), _A0(A0), _A1(A1), _CS(CS), _WR(WR), _RD(RD)
{
}

// Reset
void FMOPN::reset()
{
    _RST = 0;
    wait_us(100);
    _RST = 1;
    wait_ms(100);
}


// Register Write
void FMOPN::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
        }
    }
}
////Read
//unsigned char FMOPN::reg_read(unsigned char ifadr, unsigned char adr)
//{   
//    DigitalOut LED(LED1,1);
//    _BUS.output();
//    _WR = 0;
//    _RD = 1;
//    adr_write(ifadr,adr);
//    _BUS.input();
//    _WR = 1;
//    _RD = 0;
//    unsigned char dar=dat_read();
//    return dar;
//}

//Write
void FMOPN::law_write(unsigned char ifadr, unsigned char adr, unsigned char dat)
{   
    _BUS.output();
    _WR = 0;
    _RD = 1;
    adr_write(ifadr,adr);
    dat_write(dat);

}

//Write Address
void FMOPN::adr_write(unsigned char ifadr, unsigned char adr)
{
    _A0 = 0;     // Address Bus set
    _A1 =  bitRead(ifadr, 0);
    _BUS = adr;         // Address set
    _CS = 0;
    wait_us(1);     //  min: 200ns wait
    _CS = 1;
    wait_us(2);     //  min: 1.9us wait
}

//Write Data
void FMOPN::dat_write(unsigned char dat)
{
    _A0 = 1;     // Address Bus set
    _BUS = dat;         // Data set
    _CS = 0;
    wait_us(1);     //  min: 200ns wait
    _CS = 1;
}
////Read Data
//unsigned char FMOPN::dat_read()
//{
//    _A0 = 1;     // Address Bus set
//    _CS = 0;
//    unsigned char d=_BUS;
//    _CS = 1;
//    return d;
//}