UINT8 plus4_state::read_memory(address_space &space, offs_t offset, int ba, int scs, int phi2, int user, int _6551, int addr_clk, int keyport, int kernal) { int cs0 = 1, cs1 = 1, c1l = 1, c1h = 1, c2l = 1, c2h = 1; UINT8 data = m_ted->read(space, offset, cs0, cs1); //logerror("offset %04x user %u 6551 %u addr_clk %u keyport %u kernal %u cs0 %u cs1 %u\n", offset,user,_6551,addr_clk,keyport,kernal,cs0,cs1); if (!scs && m_vslsi) { data = m_vslsi->read(space, offset & 0x03); } else if (!user) { if (m_spi_user) { data = m_spi_user->read(space, 0); } data &= ~0x04; data |= m_cassette->sense_r() << 2; } else if (!_6551 && m_acia) { data = m_acia->read(space, offset & 0x03); } else if (!keyport) { data = m_spi_kb->read(space, 0); } else if (!cs0) { switch (m_addr & 0x03) { case CS0_BASIC: data = m_kernal->base()[offset & 0x7fff]; break; case CS0_FUNCTION_LO: if (m_function != nullptr) { data = m_function->base()[offset & 0x7fff]; } break; case CS0_C1_LOW: c1l = 0; break; case CS0_C2_LOW: c2l = 0; if (m_c2 != nullptr) { data = m_c2->base()[offset & 0x7fff]; } break; } } else if (!cs1) { if (kernal) { data = m_kernal->base()[offset & 0x7fff]; } else { switch ((m_addr >> 2) & 0x03) { case CS1_KERNAL: data = m_kernal->base()[offset & 0x7fff]; break; case CS1_FUNCTION_HI: if (m_function != nullptr) { data = m_function->base()[offset & 0x7fff]; } break; case CS1_C1_HIGH: c1h = 0; break; case CS1_C2_HIGH: c2h = 0; if (m_c2 != nullptr) { data = m_c2->base()[offset & 0x7fff]; } break; } } } else if (offset < 0xfd00 || offset >= 0xff20)