#pragma once #include "common/bitfield.h" #include "common/fifo_queue.h" #include "types.h" #include #include class StateWrapper; class System; class InterruptController; class Controller; class MemoryCard; class SIO { public: SIO(); ~SIO(); void Initialize(System* system, InterruptController* interrupt_controller); void Reset(); bool DoState(StateWrapper& sw); u32 ReadRegister(u32 offset); void WriteRegister(u32 offset, u32 value); private: union SIO_CTRL { u16 bits; BitField TXEN; BitField DTROUTPUT; BitField RXEN; BitField TXOUTPUT; BitField ACK; BitField RTSOUTPUT; BitField RESET; BitField RXIMODE; BitField TXINTEN; BitField RXINTEN; BitField ACKINTEN; }; union SIO_STAT { u32 bits; BitField TXRDY; BitField RXFIFONEMPTY; BitField TXDONE; BitField RXPARITY; BitField RXFIFOOVERRUN; BitField RXBADSTOPBIT; BitField RXINPUTLEVEL; BitField DSRINPUTLEVEL; BitField CTSINPUTLEVEL; BitField INTR; BitField TMR; }; union SIO_MODE { u16 bits; BitField reload_factor; BitField character_length; BitField parity_enable; BitField parity_type; BitField stop_bit_length; }; void SoftReset(); System* m_system = nullptr; InterruptController* m_interrupt_controller = nullptr; SIO_CTRL m_SIO_CTRL = {}; SIO_STAT m_SIO_STAT = {}; SIO_MODE m_SIO_MODE = {}; u16 m_SIO_BAUD = 0; };