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); }
//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]))); }