Play-/Source/iop/Iop_SubSystem.h
Jean-Philip Desjardins 11e8566ed3 Check SPU IRQs every 1000 ticks.
Prevents IRQs from being spammed. Helps Klonoa 2 and MMX7.
2021-06-04 09:54:51 -04:00

77 lines
1.5 KiB
C++

#pragma once
#include "../MIPS.h"
#include "../MA_MIPSIV.h"
#include "../COP_SCU.h"
#include "Iop_BiosBase.h"
#include "Iop_Dev9.h"
#include "Iop_Dmac.h"
#include "Iop_Intc.h"
#include "Iop_RootCounters.h"
#include "Iop_Speed.h"
#include "Iop_SpuBase.h"
#include "Iop_Spu.h"
#include "Iop_Spu2.h"
#include "Iop_Sio2.h"
#include "zip/ZipArchiveWriter.h"
#include "zip/ZipArchiveReader.h"
namespace Iop
{
class CSubSystem
{
public:
CSubSystem(bool ps2Mode);
virtual ~CSubSystem();
void Reset();
int ExecuteCpu(int);
bool IsCpuIdle();
void CountTicks(int);
void NotifyVBlankStart();
void NotifyVBlankEnd();
void SaveState(Framework::CZipArchiveWriter&);
void LoadState(Framework::CZipArchiveReader&);
uint8* m_ram;
uint8* m_scratchPad;
uint8* m_spuRam;
CIntc m_intc;
CRootCounters m_counters;
CDmac m_dmac;
CSpuBase m_spuCore0;
CSpuBase m_spuCore1;
CSpu m_spu;
CSpu2 m_spu2;
CDev9 m_dev9;
CSpeed m_speed;
#ifdef _IOP_EMULATE_MODULES
CSio2 m_sio2;
#endif
CMIPS m_cpu;
CMA_MIPSIV m_cpuArch;
CCOP_SCU m_copScu;
BiosBasePtr m_bios;
private:
enum
{
SPEED_REG_BEGIN = 0x10000000,
SPEED_REG_END = 0x1001FFFF,
HW_REG_BEGIN = 0x1F801000,
HW_REG_END = 0x1F9FFFFF
};
void SetupPageTable();
uint32 ReadIoRegister(uint32);
uint32 WriteIoRegister(uint32, uint32);
void CheckPendingInterrupts();
int m_dmaUpdateTicks;
int m_spuIrqUpdateTicks;
};
}