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);
}