127 lines
2.7 KiB
C++
127 lines
2.7 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
||
// //
|
||
// NES APU core //
|
||
// Norix //
|
||
// written 2001/02/22 //
|
||
// last modify ----/--/-- //
|
||
//////////////////////////////////////////////////////////////////////////
|
||
#ifndef __APU_INCLUDED__
|
||
#define __APU_INCLUDED__
|
||
|
||
#define WIN32_LEAN_AND_MEAN
|
||
#include <windows.h>
|
||
#include <math.h>
|
||
|
||
#include "typedef.h"
|
||
#include "macro.h"
|
||
|
||
#include "APU_INTERNAL.h"
|
||
#include "APU_VRC6.h"
|
||
#include "APU_VRC7.h"
|
||
#include "APU_MMC5.h"
|
||
#include "APU_FDS.h"
|
||
#include "APU_N106.h"
|
||
#include "APU_FME7.h"
|
||
|
||
#define QUEUE_LENGTH 4096
|
||
|
||
// class prototype
|
||
class NES;
|
||
|
||
class APU
|
||
{
|
||
public:
|
||
APU( NES* parent );
|
||
virtual ~APU();
|
||
|
||
void SoundSetup();
|
||
void SelectExSound( BYTE data );
|
||
|
||
BOOL SetChannelMute( INT nCH ) { m_bMute[nCH] = !m_bMute[nCH]; return m_bMute[nCH]; }
|
||
|
||
void QueueClear();
|
||
|
||
void Reset();
|
||
BYTE Read( WORD addr );
|
||
void Write( WORD addr, BYTE data );
|
||
BYTE ExRead( WORD addr );
|
||
void ExWrite( WORD addr, BYTE data );
|
||
|
||
void Sync();
|
||
void SyncDPCM( INT cycles );
|
||
|
||
void Process( LPBYTE lpBuffer, DWORD dwSize );
|
||
|
||
// For NSF player
|
||
INT GetChannelFrequency( INT ch );
|
||
LPSHORT GetSoundBuffer() { return m_SoundBuffer; }
|
||
|
||
// For State
|
||
void GetFrameIRQ( INT& Cycle, BYTE& Count, BYTE& Type, BYTE& IRQ, BYTE& Occur ) {
|
||
internal.GetFrameIRQ( Cycle, Count, Type, IRQ, Occur );
|
||
}
|
||
|
||
void SetFrameIRQ( INT Cycle, BYTE Count, BYTE Type, BYTE IRQ, BYTE Occur ) {
|
||
internal.SetFrameIRQ( Cycle, Count, Type, IRQ, Occur );
|
||
}
|
||
|
||
void SaveState( LPBYTE p );
|
||
void LoadState( LPBYTE p );
|
||
protected:
|
||
typedef struct {
|
||
INT time;
|
||
WORD addr;
|
||
BYTE data;
|
||
BYTE reserved;
|
||
} QUEUEDATA, *LPQUEUEDATA;
|
||
|
||
typedef struct {
|
||
INT rdptr;
|
||
INT wrptr;
|
||
QUEUEDATA data[QUEUE_LENGTH];
|
||
} QUEUE, *LPQUEUE;
|
||
|
||
void SetQueue( INT writetime, WORD addr, BYTE data );
|
||
BOOL GetQueue( INT writetime, QUEUEDATA& ret );
|
||
|
||
void SetExQueue( INT writetime, WORD addr, BYTE data );
|
||
BOOL GetExQueue( INT writetime, QUEUEDATA& ret );
|
||
|
||
void QueueFlush();
|
||
|
||
void WriteProcess( WORD addr, BYTE data );
|
||
void WriteExProcess( WORD addr, BYTE data );
|
||
|
||
NES* nes;
|
||
|
||
QUEUE queue;
|
||
QUEUE exqueue;
|
||
|
||
BYTE exsound_select;
|
||
|
||
double elapsed_time;
|
||
// INT elapsed_time;
|
||
|
||
// Filter
|
||
INT last_data, last_diff;
|
||
INT lowpass_filter[4];
|
||
|
||
// Sound core
|
||
APU_INTERNAL internal;
|
||
APU_VRC6 vrc6;
|
||
APU_VRC7 vrc7;
|
||
APU_MMC5 mmc5;
|
||
APU_FDS fds;
|
||
APU_N106 n106;
|
||
APU_FME7 fme7;
|
||
|
||
// Channel mute
|
||
BOOL m_bMute[16];
|
||
|
||
// <20><><EFBFBD>܂<EFBFBD>
|
||
SHORT m_SoundBuffer[0x100];
|
||
private:
|
||
};
|
||
|
||
#endif // !__APU_INCLUDED__
|