2019-09-09 07:01:26 +00:00
|
|
|
#pragma once
|
2019-10-04 05:00:32 +00:00
|
|
|
#include "settings.h"
|
2019-09-09 07:01:26 +00:00
|
|
|
#include "types.h"
|
2019-09-20 06:47:41 +00:00
|
|
|
#include <memory>
|
2019-09-09 07:01:26 +00:00
|
|
|
|
2019-09-14 10:28:47 +00:00
|
|
|
class ByteStream;
|
|
|
|
class StateWrapper;
|
|
|
|
|
2019-09-12 14:18:13 +00:00
|
|
|
class HostInterface;
|
|
|
|
|
2019-10-04 05:00:32 +00:00
|
|
|
namespace CPU {
|
2019-09-12 02:53:04 +00:00
|
|
|
class Core;
|
|
|
|
}
|
|
|
|
|
|
|
|
class Bus;
|
|
|
|
class DMA;
|
2019-09-17 06:26:00 +00:00
|
|
|
class InterruptController;
|
2019-09-12 02:53:04 +00:00
|
|
|
class GPU;
|
2019-09-17 09:22:39 +00:00
|
|
|
class CDROM;
|
2019-09-20 06:47:41 +00:00
|
|
|
class Pad;
|
|
|
|
class PadDevice;
|
2019-09-20 13:40:19 +00:00
|
|
|
class Timers;
|
2019-09-24 13:44:38 +00:00
|
|
|
class SPU;
|
2019-09-29 02:51:34 +00:00
|
|
|
class MDEC;
|
2019-09-12 02:53:04 +00:00
|
|
|
|
2019-09-09 07:01:26 +00:00
|
|
|
class System
|
|
|
|
{
|
|
|
|
public:
|
2019-10-04 05:00:32 +00:00
|
|
|
System(HostInterface* host_interface, const Settings& settings);
|
2019-09-09 07:01:26 +00:00
|
|
|
~System();
|
|
|
|
|
2019-10-26 02:55:56 +00:00
|
|
|
// Accessing components.
|
2019-09-12 14:18:13 +00:00
|
|
|
HostInterface* GetHostInterface() const { return m_host_interface; }
|
2019-10-04 05:00:32 +00:00
|
|
|
CPU::Core* GetCPU() const { return m_cpu.get(); }
|
|
|
|
Bus* GetBus() const { return m_bus.get(); }
|
2019-10-26 02:55:56 +00:00
|
|
|
DMA* GetDMA() const { return m_dma.get(); }
|
|
|
|
InterruptController* GetInterruptController() const { return m_interrupt_controller.get(); }
|
2019-10-04 05:00:32 +00:00
|
|
|
GPU* GetGPU() const { return m_gpu.get(); }
|
2019-10-26 02:55:56 +00:00
|
|
|
CDROM* GetCDROM() const { return m_cdrom.get(); }
|
|
|
|
Pad* GetPad() const { return m_pad.get(); }
|
|
|
|
Timers* GetTimers() const { return m_timers.get(); }
|
2019-10-10 16:20:21 +00:00
|
|
|
SPU* GetSPU() const { return m_spu.get(); }
|
2019-10-26 02:55:56 +00:00
|
|
|
MDEC* GetMDEC() const { return m_mdec.get(); }
|
2019-09-12 14:18:13 +00:00
|
|
|
|
2019-09-13 16:07:31 +00:00
|
|
|
u32 GetFrameNumber() const { return m_frame_number; }
|
2019-09-27 15:09:31 +00:00
|
|
|
u32 GetInternalFrameNumber() const { return m_internal_frame_number; }
|
2019-10-04 10:48:29 +00:00
|
|
|
u32 GetGlobalTickCounter() const { return m_global_tick_counter; }
|
2019-09-13 16:07:31 +00:00
|
|
|
void IncrementFrameNumber() { m_frame_number++; }
|
2019-09-27 15:09:31 +00:00
|
|
|
void IncrementInternalFrameNumber() { m_internal_frame_number++; }
|
2019-09-13 16:07:31 +00:00
|
|
|
|
2019-10-04 05:00:32 +00:00
|
|
|
Settings& GetSettings() { return m_settings; }
|
|
|
|
|
2019-09-09 07:01:26 +00:00
|
|
|
bool Initialize();
|
|
|
|
void Reset();
|
|
|
|
|
2019-09-14 10:28:47 +00:00
|
|
|
bool LoadState(ByteStream* state);
|
|
|
|
bool SaveState(ByteStream* state);
|
|
|
|
|
2019-10-26 02:55:56 +00:00
|
|
|
/// Recreates the GPU component, saving/loading the state so it is preserved. Call when the GPU renderer changes.
|
|
|
|
bool RecreateGPU();
|
|
|
|
|
2019-09-09 07:01:26 +00:00
|
|
|
void RunFrame();
|
|
|
|
|
2019-09-14 03:22:05 +00:00
|
|
|
bool LoadEXE(const char* filename);
|
2019-09-22 15:28:00 +00:00
|
|
|
bool SetExpansionROM(const char* filename);
|
2019-09-14 03:22:05 +00:00
|
|
|
|
2019-09-20 13:59:48 +00:00
|
|
|
void SetDowncount(TickCount downcount);
|
|
|
|
void Synchronize();
|
2019-09-17 04:25:25 +00:00
|
|
|
|
2019-10-17 14:20:38 +00:00
|
|
|
// Adds ticks to the global tick counter, simulating the CPU being stalled.
|
|
|
|
void StallCPU(TickCount ticks);
|
|
|
|
|
2019-09-29 15:07:38 +00:00
|
|
|
void SetController(u32 slot, std::shared_ptr<PadDevice> dev);
|
|
|
|
void SetMemoryCard(u32 slot, std::shared_ptr<PadDevice> dev);
|
2019-09-20 06:47:41 +00:00
|
|
|
|
2019-09-20 10:14:00 +00:00
|
|
|
bool HasMedia() const;
|
|
|
|
bool InsertMedia(const char* path);
|
|
|
|
void RemoveMedia();
|
|
|
|
|
2019-09-09 07:01:26 +00:00
|
|
|
private:
|
2019-09-14 10:28:47 +00:00
|
|
|
bool DoState(StateWrapper& sw);
|
2019-10-26 02:55:56 +00:00
|
|
|
bool CreateGPU();
|
2019-09-14 10:28:47 +00:00
|
|
|
|
2019-09-12 14:18:13 +00:00
|
|
|
HostInterface* m_host_interface;
|
2019-09-12 02:53:04 +00:00
|
|
|
std::unique_ptr<CPU::Core> m_cpu;
|
|
|
|
std::unique_ptr<Bus> m_bus;
|
|
|
|
std::unique_ptr<DMA> m_dma;
|
2019-09-17 06:26:00 +00:00
|
|
|
std::unique_ptr<InterruptController> m_interrupt_controller;
|
2019-09-12 02:53:04 +00:00
|
|
|
std::unique_ptr<GPU> m_gpu;
|
2019-09-17 09:22:39 +00:00
|
|
|
std::unique_ptr<CDROM> m_cdrom;
|
2019-09-20 06:47:41 +00:00
|
|
|
std::unique_ptr<Pad> m_pad;
|
2019-09-20 13:40:19 +00:00
|
|
|
std::unique_ptr<Timers> m_timers;
|
2019-09-24 13:44:38 +00:00
|
|
|
std::unique_ptr<SPU> m_spu;
|
2019-09-29 02:51:34 +00:00
|
|
|
std::unique_ptr<MDEC> m_mdec;
|
2019-09-13 16:07:31 +00:00
|
|
|
u32 m_frame_number = 1;
|
2019-09-27 15:09:31 +00:00
|
|
|
u32 m_internal_frame_number = 1;
|
2019-10-04 10:48:29 +00:00
|
|
|
u32 m_global_tick_counter = 0;
|
2019-10-04 05:00:32 +00:00
|
|
|
|
|
|
|
Settings m_settings;
|
2019-09-09 07:01:26 +00:00
|
|
|
};
|