Duckstation/src/core/bus.h

185 lines
5.2 KiB
C
Raw Normal View History

2019-09-09 07:01:26 +00:00
#pragma once
#include "YBaseLib/String.h"
#include "types.h"
#include <array>
class StateWrapper;
2019-09-17 06:26:00 +00:00
namespace CPU {
2019-09-17 06:26:00 +00:00
class Core;
}
2019-09-09 07:01:26 +00:00
class DMA;
2019-09-17 06:26:00 +00:00
class InterruptController;
2019-09-17 09:22:39 +00:00
class GPU;
class CDROM;
class Pad;
2019-09-20 13:40:19 +00:00
class Timers;
class SPU;
2019-09-29 02:51:34 +00:00
class MDEC;
2019-09-09 07:01:26 +00:00
class System;
class Bus
{
public:
Bus();
~Bus();
bool Initialize(CPU::Core* cpu, DMA* dma, InterruptController* interrupt_controller, GPU* gpu, CDROM* cdrom, Pad* pad,
2019-09-29 02:51:34 +00:00
Timers* timers, SPU* spu, MDEC* mdec);
2019-09-09 07:01:26 +00:00
void Reset();
bool DoState(StateWrapper& sw);
bool ReadByte(PhysicalMemoryAddress address, u8* value);
bool ReadHalfWord(PhysicalMemoryAddress address, u16* value);
bool ReadWord(PhysicalMemoryAddress address, u32* value);
bool WriteByte(PhysicalMemoryAddress address, u8 value);
bool WriteHalfWord(PhysicalMemoryAddress address, u16 value);
bool WriteWord(PhysicalMemoryAddress address, u32 value);
2019-09-09 07:01:26 +00:00
template<MemoryAccessType type, MemoryAccessSize size>
bool DispatchAccess(PhysicalMemoryAddress address, u32& value);
2019-09-09 07:01:26 +00:00
void PatchBIOS(u32 address, u32 value, u32 mask = UINT32_C(0xFFFFFFFF));
2019-09-22 15:28:00 +00:00
void SetExpansionROM(std::vector<u8> data);
2019-09-09 07:01:26 +00:00
private:
enum : u32
{
EXP1_BASE = 0x1F000000,
EXP1_SIZE = 0x800000,
EXP1_MASK = EXP1_SIZE - 1,
MEMCTRL_BASE = 0x1F801000,
MEMCTRL_SIZE = 0x40,
MEMCTRL_MASK = MEMCTRL_SIZE - 1,
PAD_BASE = 0x1F801040,
PAD_SIZE = 0x10,
PAD_MASK = PAD_SIZE - 1,
SIO_BASE = 0x1F801050,
SIO_SIZE = 0x10,
SIO_MASK = SIO_SIZE - 1,
MEMCTRL2_BASE = 0x1F801060,
MEMCTRL2_SIZE = 0x10,
MEMCTRL2_MASK = MEMCTRL_SIZE - 1,
INTERRUPT_CONTROLLER_BASE = 0x1F801070,
INTERRUPT_CONTROLLER_SIZE = 0x10,
INTERRUPT_CONTROLLER_MASK = INTERRUPT_CONTROLLER_SIZE - 1,
DMA_BASE = 0x1F801080,
DMA_SIZE = 0x80,
DMA_MASK = DMA_SIZE - 1,
TIMERS_BASE = 0x1F801100,
TIMERS_SIZE = 0x40,
TIMERS_MASK = TIMERS_SIZE - 1,
CDROM_BASE = 0x1F801800,
2019-09-29 02:51:34 +00:00
CDROM_SIZE = 0x10,
CDROM_MASK = CDROM_SIZE - 1,
GPU_BASE = 0x1F801810,
GPU_SIZE = 0x10,
GPU_MASK = GPU_SIZE - 1,
2019-09-29 02:51:34 +00:00
MDEC_BASE = 0x1F801820,
MDEC_SIZE = 0x10,
MDEC_MASK = MDEC_SIZE - 1,
SPU_BASE = 0x1F801C00,
SPU_SIZE = 0x300,
SPU_MASK = 0x3FF,
EXP2_BASE = 0x1F802000,
EXP2_SIZE = 0x2000,
EXP2_MASK = EXP2_SIZE - 1,
BIOS_BASE = 0x1FC00000,
BIOS_SIZE = 0x80000
};
enum : u32
{
MEMCTRL_REG_COUNT = 9
};
union MEMCTRL
{
u32 regs[MEMCTRL_REG_COUNT];
struct
{
u32 exp1_base;
u32 exp2_base;
u32 exp1_delay_size;
u32 exp3_delay_size;
u32 bios_delay_size;
u32 spu_delay_size;
u32 cdrom_delay_size;
u32 exp2_delay_size;
u32 common_delay_size;
};
};
2019-09-09 07:01:26 +00:00
bool LoadBIOS();
template<MemoryAccessType type, MemoryAccessSize size>
bool DoRAMAccess(u32 offset, u32& value);
template<MemoryAccessType type, MemoryAccessSize size>
bool DoBIOSAccess(u32 offset, u32& value);
bool DoInvalidAccess(MemoryAccessType type, MemoryAccessSize size, PhysicalMemoryAddress address, u32& value);
2019-09-09 07:01:26 +00:00
2019-09-22 15:28:00 +00:00
bool DoReadEXP1(MemoryAccessSize size, u32 offset, u32& value);
bool DoWriteEXP1(MemoryAccessSize size, u32 offset, u32 value);
bool DoReadEXP2(MemoryAccessSize size, u32 offset, u32& value);
bool DoWriteEXP2(MemoryAccessSize size, u32 offset, u32 value);
2019-09-09 07:01:26 +00:00
bool DoReadMemoryControl(MemoryAccessSize size, u32 offset, u32& value);
bool DoWriteMemoryControl(MemoryAccessSize size, u32 offset, u32 value);
bool DoReadMemoryControl2(MemoryAccessSize size, u32 offset, u32& value);
bool DoWriteMemoryControl2(MemoryAccessSize size, u32 offset, u32 value);
bool DoReadPad(MemoryAccessSize size, u32 offset, u32& value);
bool DoWritePad(MemoryAccessSize size, u32 offset, u32 value);
2019-09-22 15:28:00 +00:00
bool DoReadSIO(MemoryAccessSize size, u32 offset, u32& value);
bool DoWriteSIO(MemoryAccessSize size, u32 offset, u32 value);
2019-09-17 09:22:39 +00:00
bool DoReadCDROM(MemoryAccessSize size, u32 offset, u32& value);
bool DoWriteCDROM(MemoryAccessSize size, u32 offset, u32 value);
bool DoReadGPU(MemoryAccessSize size, u32 offset, u32& value);
bool DoWriteGPU(MemoryAccessSize size, u32 offset, u32 value);
2019-09-09 07:01:26 +00:00
2019-09-29 02:51:34 +00:00
bool DoReadMDEC(MemoryAccessSize size, u32 offset, u32& value);
bool DoWriteMDEC(MemoryAccessSize size, u32 offset, u32 value);
2019-09-17 06:26:00 +00:00
bool DoReadInterruptController(MemoryAccessSize size, u32 offset, u32& value);
bool DoWriteInterruptController(MemoryAccessSize size, u32 offset, u32 value);
2019-09-09 07:01:26 +00:00
bool DoReadDMA(MemoryAccessSize size, u32 offset, u32& value);
bool DoWriteDMA(MemoryAccessSize size, u32 offset, u32 value);
2019-09-20 13:40:19 +00:00
bool DoReadTimers(MemoryAccessSize size, u32 offset, u32& value);
bool DoWriteTimers(MemoryAccessSize size, u32 offset, u32 value);
bool DoReadSPU(MemoryAccessSize size, u32 offset, u32& value);
bool DoWriteSPU(MemoryAccessSize size, u32 offset, u32 value);
2019-09-09 07:01:26 +00:00
2019-09-17 06:26:00 +00:00
CPU::Core* m_cpu = nullptr;
2019-09-09 07:01:26 +00:00
DMA* m_dma = nullptr;
2019-09-17 06:26:00 +00:00
InterruptController* m_interrupt_controller = nullptr;
2019-09-09 07:01:26 +00:00
GPU* m_gpu = nullptr;
2019-09-17 09:22:39 +00:00
CDROM* m_cdrom = nullptr;
Pad* m_pad = nullptr;
2019-09-20 13:40:19 +00:00
Timers* m_timers = nullptr;
SPU* m_spu = nullptr;
2019-09-29 02:51:34 +00:00
MDEC* m_mdec = nullptr;
2019-09-09 07:01:26 +00:00
std::array<u8, 2097152> m_ram{}; // 2MB RAM
std::array<u8, 524288> m_bios{}; // 512K BIOS ROM
2019-09-22 15:28:00 +00:00
std::vector<u8> m_exp1_rom;
2019-09-09 07:01:26 +00:00
MEMCTRL m_MEMCTRL = {};
u32 m_ram_size_reg = 0;
2019-09-09 07:01:26 +00:00
String m_tty_line_buffer;
};
#include "bus.inl"