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

127 lines
2.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//////////////////////////////////////////////////////////////////////////
// //
// 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__