AxibugEmuOnline/References/VirtuaNESex_src_191105/NES/ApuEX/APU_MMC5.h
2024-08-05 17:58:53 +08:00

96 lines
1.9 KiB
C++

//////////////////////////////////////////////////////////////////////////
// //
// Nintendo MMC5 //
// Norix //
// written 2001/09/18 //
// last modify ----/--/-- //
//////////////////////////////////////////////////////////////////////////
#ifndef __APU_MMC5_INCLUDED__
#define __APU_MMC5_INCLUDED__
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#include "typedef.h"
#include "macro.h"
#include "APU_INTERFACE.h"
class APU_MMC5 : public APU_INTERFACE
{
public:
APU_MMC5();
~APU_MMC5();
void Reset( FLOAT fClock, INT nRate );
void Setup( FLOAT fClock, INT nRate );
void Write( WORD addr, BYTE data );
INT Process( INT channel );
void SyncWrite( WORD addr, BYTE data );
BYTE SyncRead ( WORD addr );
BOOL Sync( INT cycles );
INT GetFreq( INT channel );
INT GetStateSize();
void SaveState( LPBYTE p );
void LoadState( LPBYTE p );
protected:
typedef struct {
BYTE reg[4];
BYTE enable;
INT vbl_length;
INT phaseacc;
INT freq;
INT output_vol;
BYTE fixed_envelope;
BYTE holdnote;
BYTE volume;
BYTE env_vol;
INT env_phase;
INT env_decay;
INT adder;
INT duty_flip;
} RECTANGLE, *LPRECTANGLE;
typedef struct {
// For sync
BYTE reg[4];
BYTE enable;
BYTE holdnote;
BYTE dummy[2];
INT vbl_length;
} SYNCRECTANGLE, *LPSYNCRECTANGLE;
INT RectangleRender( RECTANGLE& ch );
RECTANGLE ch0, ch1;
SYNCRECTANGLE sch0, sch1;
BYTE reg5010;
BYTE reg5011;
BYTE reg5015;
INT cycle_rate;
INT FrameCycle;
BYTE sync_reg5015;
FLOAT cpu_clock;
// Tables
static INT vbl_length[32];
static INT duty_lut[4];
static INT decay_lut[16];
static INT vbl_lut[32];
private:
};
#endif // !__APU_MMC5_INCLUDED__