AxibugEmuOnline/virtuanessrc097-master/NES/ApuEX/APU_FME7.h

108 lines
4.5 KiB
C
Raw Normal View History

<EFBFBD><EFBFBD>//////////////////////////////////////////////////////////////////////////
// //
// SunSoft FME7 //
// Norix //
// written 2001/09/18 //
// last modify ----/--/-- //
//////////////////////////////////////////////////////////////////////////
#ifndef __APU_FME7_INCLUDED__
#define __APU_FME7_INCLUDED__
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#include "typedef.h"
#include "macro.h"
#include "APU_INTERFACE.h"
#include "nes.h"
class APU_FME7 : public APU_INTERFACE
{
public:
APU_FME7();
~APU_FME7();
void Reset( FLOAT fClock, INT nRate );
void Setup( FLOAT fClock, INT nRate );
void Write( WORD addr, BYTE data );
INT Process( INT channel );
INT GetFreq( INT channel );
INT GetStateSize();
void SaveState( LPBYTE p );
void LoadState( LPBYTE p );
protected:
typedef struct {
BYTE reg[3];
BYTE volume;
INT freq;
INT phaseacc;
INT envadr;
LPBYTE envtbl;
LPSBYTE envstep;
} ENVELOPE, *LPENVELOPE;
typedef struct {
INT freq;
INT phaseacc;
INT noiserange;
BYTE noiseout;
} NOISE, *LPNOISE;
typedef struct {
BYTE reg[3];
BYTE enable;
BYTE env_on;
BYTE noise_on;
BYTE adder;
BYTE volume;
INT freq;
INT phaseacc;
INT output_vol;
} CHANNEL, *LPCHANNEL;
void EnvelopeRender();
void NoiseRender();
INT ChannelRender( CHANNEL& ch );
ENVELOPE envelope;
NOISE noise;
CHANNEL op[3];
BYTE address;
INT vol_table[0x20];
INT cycle_rate;
FLOAT cpu_clock;
// Tables
static BYTE envelope_pulse0[];
static BYTE envelope_pulse1[];
static BYTE envelope_pulse2[];
static BYTE envelope_pulse3[];
static SBYTE envstep_pulse[];
static BYTE envelope_sawtooth0[];
static BYTE envelope_sawtooth1[];
static SBYTE envstep_sawtooth[];
static BYTE envelope_triangle0[];
static BYTE envelope_triangle1[];
static SBYTE envstep_triangle[];
static LPBYTE envelope_table[16];
static LPSBYTE envstep_table[16];
private:
};
#endif // !__APU_FME7_INCLUDED__