#pragma once #include "common/bitfield.h" #include "common/fifo_queue.h" #include "types.h" #include #include class StateWrapper; class InterruptController; class PadDevice; class Pad { public: Pad(); ~Pad(); bool Initialize(InterruptController* interrupt_controller); void Reset(); bool DoState(StateWrapper& sw); PadDevice* GetDevice(u32 slot) { return m_devices[slot].get(); } void SetDevice(u32 slot, std::shared_ptr dev) { m_devices[slot] = dev; } u32 ReadRegister(u32 offset); void WriteRegister(u32 offset, u32 value); private: static constexpr u32 NUM_SLOTS = 2; union JOY_CTRL { u16 bits; BitField TXEN; BitField SELECT; BitField RXEN; BitField ACK; BitField RESET; BitField RXIMODE; BitField TXINTEN; BitField RXINTEN; BitField ACKINTEN; BitField SLOT; }; union JOY_STAT { u32 bits; BitField TXRDY; BitField RXFIFONEMPTY; BitField TXDONE; BitField ACKINPUTLEVEL; BitField ACKINPUT; BitField INTR; BitField TMR; }; union JOY_MODE { u16 bits; BitField reload_factor; BitField character_length; BitField parity_enable; BitField parity_type; BitField clk_polarity; }; void SoftReset(); void UpdateJoyStat(); void DoTransfer(); InterruptController* m_interrupt_controller = nullptr; JOY_CTRL m_JOY_CTRL = {}; JOY_STAT m_JOY_STAT = {}; JOY_MODE m_JOY_MODE = {}; InlineFIFOQueue m_RX_FIFO; InlineFIFOQueue m_TX_FIFO; std::array, NUM_SLOTS> m_devices; };