Ejemplo n.º 1
0
void CEXIChannel::DoState(PointerWrap& p)
{
  p.DoPOD(m_Status);
  p.Do(m_DMAMemoryAddress);
  p.Do(m_DMALength);
  p.Do(m_Control);
  p.Do(m_ImmData);

  for (int device_index = 0; device_index < NUM_DEVICES; ++device_index)
  {
    std::unique_ptr<IEXIDevice>& device = m_pDevices[device_index];
    TEXIDevices type = device->m_deviceType;
    p.Do(type);

    if (type == device->m_deviceType)
    {
      device->DoState(p);
    }
    else
    {
      std::unique_ptr<IEXIDevice> save_device = EXIDevice_Create(type, m_ChannelId);
      save_device->DoState(p);
      AddDevice(std::move(save_device), device_index, false);
    }
  }
}
Ejemplo n.º 2
0
void CEXIChannel::DoState(PointerWrap &p)
{
	p.DoPOD(m_Status);
	p.Do(m_DMAMemoryAddress);
	p.Do(m_DMALength);
	p.Do(m_Control);
	p.Do(m_ImmData);

	for (int d = 0; d < NUM_DEVICES; ++d)
	{
		IEXIDevice* pDevice = m_pDevices[d].get();
		TEXIDevices type = pDevice->m_deviceType;
		p.Do(type);
		IEXIDevice* pSaveDevice = (type == pDevice->m_deviceType) ? pDevice : EXIDevice_Create(type, m_ChannelId);
		pSaveDevice->DoState(p);
		if(pSaveDevice != pDevice)
		{
			// if we had to create a temporary device, discard it if we're not loading.
			// also, if no movie is active, we'll assume the user wants to keep their current devices
			// instead of the ones they had when the savestate was created,
			// unless the device is NONE (since ChangeDevice sets that temporarily).
			if(p.GetMode() != PointerWrap::MODE_READ)
			{
				delete pSaveDevice;
			}
			else
			{
				AddDevice(pSaveDevice, d, false);
			}
		}
	}
}
Ejemplo n.º 3
0
CEXIChannel::CEXIChannel(u32 ChannelId)
    : m_DMAMemoryAddress(0), m_DMALength(0), m_ImmData(0), m_ChannelId(ChannelId)
{
  m_Control.Hex = 0;
  m_Status.Hex = 0;

  if (m_ChannelId == 0 || m_ChannelId == 1)
    m_Status.EXTINT = 1;
  if (m_ChannelId == 1)
    m_Status.CHIP_SELECT = 1;

  for (auto& device : m_pDevices)
    device = EXIDevice_Create(EXIDEVICE_NONE, m_ChannelId);
}
Ejemplo n.º 4
0
CEXIChannel::CEXIChannel(u32 ChannelId) :
	m_DMAMemoryAddress(0),
	m_DMALength(0),
	m_ImmData(0),
	m_ChannelId(ChannelId)
{
	m_Control.Hex = 0;
	m_Status.Hex = 0;

	if (m_ChannelId == 0 || m_ChannelId == 1)
		m_Status.EXTINT = 1;
	if (m_ChannelId == 1)
		m_Status.CHIP_SELECT = 1;

	for (auto& device : m_pDevices)
		device.reset(EXIDevice_Create(EXIDEVICE_NONE, m_ChannelId));

	updateInterrupts = CoreTiming::RegisterEvent("EXIInterrupt", UpdateInterrupts);
}
Ejemplo n.º 5
0
void CEXIChannel::AddDevice(const TEXIDevices device_type, const int device_num)
{
  AddDevice(EXIDevice_Create(device_type, m_ChannelId), device_num);
}
Ejemplo n.º 6
0
void CEXIChannel::AddDevice(const TEXIDevices device_type, const int device_num)
{
	IEXIDevice* pNewDevice = EXIDevice_Create(device_type, m_ChannelId);
	AddDevice(pNewDevice, device_num);
}