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); } } }
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); } } } }
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); }
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); }
void CEXIChannel::AddDevice(const TEXIDevices device_type, const int device_num) { AddDevice(EXIDevice_Create(device_type, m_ChannelId), device_num); }
void CEXIChannel::AddDevice(const TEXIDevices device_type, const int device_num) { IEXIDevice* pNewDevice = EXIDevice_Create(device_type, m_ChannelId); AddDevice(pNewDevice, device_num); }