Пример #1
0
        void port_cb_w <std_size_t_N>()  //template <std::size_t N> void port_cb_w();
            where std_size_t_N : u32_const, new()
        {
            size_t N = new std_size_t_N().value;

            u8 data = m_port_open_drain[N] ? (u8)(m_port_latch[N] | ~m_port_ddr[N]) : m_port_latch[N];
            u8 mask = m_port_open_drain[N] ? (u8)(~m_port_latch[N] & m_port_ddr[N]) : m_port_ddr[N];

            m_port_cb_w[N].op_u8(0, data, mask);
        }
Пример #2
0
        //template <std::size_t N> void port_input_w(uint8_t data) { m_port_input[N] = data & ~m_port_mask[N]; }


        u8 port_r <std_size_t_N>()  //template <std::size_t N> u8 port_r();
            where std_size_t_N : u32_const, new()
        {
            size_t N = new std_size_t_N().value;

            if (!m_port_cb_r[N].isnull())
            {
                u8 newval = (u8)(m_port_cb_r[N].op_u8(0, (u8)(~m_port_ddr[N] & ~m_port_mask[N])) & ~m_port_mask[N]);
                if (newval != m_port_input[N])
                {
                    LOGIOPORT("read PORT{0}: new input = {1} & {2} (was {3})\n",
                              'A' + N, newval, ~m_port_ddr[N] & ~m_port_mask[N], m_port_input[N]);
                }

                m_port_input[N] = newval;
            }

            return((u8)(m_port_mask[N] | (m_port_latch[N] & m_port_ddr[N]) | (m_port_input[N] & ~m_port_ddr[N])));
        }