// license:BSD-3-Clause // copyright-holders:Olivier Galibert #include "emu.h" #include "emumem_hep.h" #include "emumem_hws.h" template emu::detail::handler_entry_size_t handler_entry_read_before_time::read(offs_t offset, uX mem_mask) const { return this->m_next->read(offset, mem_mask); } template emu::detail::handler_entry_size_t handler_entry_read_before_time::read_interruptible(offs_t offset, uX mem_mask) const { u64 tc = m_cpu.total_cycles(); u64 ac = m_ws(offset, tc); if(ac < tc) ac = tc; if(m_cpu.access_before_time(ac, tc)) return 0; return this->m_next->read_interruptible(offset, mem_mask); } template std::pair, u16> handler_entry_read_before_time::read_flags(offs_t offset, uX mem_mask) const { return this->m_next->read_flags(offset, mem_mask); } template u16 handler_entry_read_before_time::lookup_flags(offs_t offset, uX mem_mask) const { return this->m_next->lookup_flags(offset, mem_mask); } template std::string handler_entry_read_before_time::name() const { return util::string_format("(bt %s) %s", m_ws.name(), this->m_next->name()); } template handler_entry_read_before_time *handler_entry_read_before_time::instantiate(handler_entry_read *next) const { return new handler_entry_read_before_time(this->m_space, this->m_mph, next, m_ws); } template void handler_entry_write_before_time::write(offs_t offset, uX data, uX mem_mask) const { this->m_next->write(offset, data, mem_mask); } template void handler_entry_write_before_time::write_interruptible(offs_t offset, uX data, uX mem_mask) const { u64 tc = m_cpu.total_cycles(); u64 ac = m_ws(offset, tc); if(ac < tc) ac = tc; if(m_cpu.access_before_time(ac, tc)) return; this->m_next->write_interruptible(offset, data, mem_mask); } template u16 handler_entry_write_before_time::write_flags(offs_t offset, uX data, uX mem_mask) const { return this->m_next->write_flags(offset, data, mem_mask); } template u16 handler_entry_write_before_time::lookup_flags(offs_t offset, uX mem_mask) const { return this->m_next->lookup_flags(offset, mem_mask); } template std::string handler_entry_write_before_time::name() const { return util::string_format("(bt %s) %s", m_ws.name(), this->m_next->name()); } template handler_entry_write_before_time *handler_entry_write_before_time::instantiate(handler_entry_write *next) const { return new handler_entry_write_before_time(this->m_space, this->m_mph, next, m_ws); } template class handler_entry_read_before_time<0, 1>; template class handler_entry_read_before_time<0, 0>; template class handler_entry_read_before_time<1, 3>; template class handler_entry_read_before_time<1, 0>; template class handler_entry_read_before_time<1, -1>; template class handler_entry_read_before_time<2, 3>; template class handler_entry_read_before_time<2, 0>; template class handler_entry_read_before_time<2, -1>; template class handler_entry_read_before_time<2, -2>; template class handler_entry_read_before_time<3, 0>; template class handler_entry_read_before_time<3, -1>; template class handler_entry_read_before_time<3, -2>; template class handler_entry_read_before_time<3, -3>; template class handler_entry_write_before_time<0, 1>; template class handler_entry_write_before_time<0, 0>; template class handler_entry_write_before_time<1, 3>; template class handler_entry_write_before_time<1, 0>; template class handler_entry_write_before_time<1, -1>; template class handler_entry_write_before_time<2, 3>; template class handler_entry_write_before_time<2, 0>; template class handler_entry_write_before_time<2, -1>; template class handler_entry_write_before_time<2, -2>; template class handler_entry_write_before_time<3, 0>; template class handler_entry_write_before_time<3, -1>; template class handler_entry_write_before_time<3, -2>; template class handler_entry_write_before_time<3, -3>; template emu::detail::handler_entry_size_t handler_entry_read_before_delay::read(offs_t offset, uX mem_mask) const { return this->m_next->read(offset, mem_mask); } template emu::detail::handler_entry_size_t handler_entry_read_before_delay::read_interruptible(offs_t offset, uX mem_mask) const { if(m_cpu.access_before_delay(m_ws(offset), this)) return 0; return this->m_next->read_interruptible(offset, mem_mask); } template std::pair, u16> handler_entry_read_before_delay::read_flags(offs_t offset, uX mem_mask) const { return this->m_next->read_flags(offset, mem_mask); } template u16 handler_entry_read_before_delay::lookup_flags(offs_t offset, uX mem_mask) const { return this->m_next->lookup_flags(offset, mem_mask); } template std::string handler_entry_read_before_delay::name() const { return util::string_format("(bd %s) %s", m_ws.name(), this->m_next->name()); } template handler_entry_read_before_delay *handler_entry_read_before_delay::instantiate(handler_entry_read *next) const { return new handler_entry_read_before_delay(this->m_space, this->m_mph, next, m_ws); } template void handler_entry_write_before_delay::write(offs_t offset, uX data, uX mem_mask) const { this->m_next->write(offset, data, mem_mask); } template void handler_entry_write_before_delay::write_interruptible(offs_t offset, uX data, uX mem_mask) const { if(m_cpu.access_before_delay(m_ws(offset), this)) return; this->m_next->write_interruptible(offset, data, mem_mask); } template u16 handler_entry_write_before_delay::write_flags(offs_t offset, uX data, uX mem_mask) const { return this->m_next->write_flags(offset, data, mem_mask); } template u16 handler_entry_write_before_delay::lookup_flags(offs_t offset, uX mem_mask) const { return this->m_next->lookup_flags(offset, mem_mask); } template std::string handler_entry_write_before_delay::name() const { return util::string_format("(bd %s) %s", m_ws.name(), this->m_next->name()); } template handler_entry_write_before_delay *handler_entry_write_before_delay::instantiate(handler_entry_write *next) const { return new handler_entry_write_before_delay(this->m_space, this->m_mph, next, m_ws); } template class handler_entry_read_before_delay<0, 1>; template class handler_entry_read_before_delay<0, 0>; template class handler_entry_read_before_delay<1, 3>; template class handler_entry_read_before_delay<1, 0>; template class handler_entry_read_before_delay<1, -1>; template class handler_entry_read_before_delay<2, 3>; template class handler_entry_read_before_delay<2, 0>; template class handler_entry_read_before_delay<2, -1>; template class handler_entry_read_before_delay<2, -2>; template class handler_entry_read_before_delay<3, 0>; template class handler_entry_read_before_delay<3, -1>; template class handler_entry_read_before_delay<3, -2>; template class handler_entry_read_before_delay<3, -3>; template class handler_entry_write_before_delay<0, 1>; template class handler_entry_write_before_delay<0, 0>; template class handler_entry_write_before_delay<1, 3>; template class handler_entry_write_before_delay<1, 0>; template class handler_entry_write_before_delay<1, -1>; template class handler_entry_write_before_delay<2, 3>; template class handler_entry_write_before_delay<2, 0>; template class handler_entry_write_before_delay<2, -1>; template class handler_entry_write_before_delay<2, -2>; template class handler_entry_write_before_delay<3, 0>; template class handler_entry_write_before_delay<3, -1>; template class handler_entry_write_before_delay<3, -2>; template class handler_entry_write_before_delay<3, -3>; template emu::detail::handler_entry_size_t handler_entry_read_after_delay::read(offs_t offset, uX mem_mask) const { return this->m_next->read(offset, mem_mask); } template emu::detail::handler_entry_size_t handler_entry_read_after_delay::read_interruptible(offs_t offset, uX mem_mask) const { auto r = this->m_next->read_interruptible(offset, mem_mask); m_cpu.access_after_delay(m_ws(offset)); return r; } template std::pair, u16> handler_entry_read_after_delay::read_flags(offs_t offset, uX mem_mask) const { return this->m_next->read_flags(offset, mem_mask); } template u16 handler_entry_read_after_delay::lookup_flags(offs_t offset, uX mem_mask) const { return this->m_next->lookup_flags(offset, mem_mask); } template std::string handler_entry_read_after_delay::name() const { return util::string_format("(ad %s) %s", m_ws.name(), this->m_next->name()); } template handler_entry_read_after_delay *handler_entry_read_after_delay::instantiate(handler_entry_read *next) const { return new handler_entry_read_after_delay(this->m_space, this->m_mph, next, m_ws); } template void handler_entry_write_after_delay::write(offs_t offset, uX data, uX mem_mask) const { this->m_next->write(offset, data, mem_mask); } template void handler_entry_write_after_delay::write_interruptible(offs_t offset, uX data, uX mem_mask) const { this->m_next->write_interruptible(offset, data, mem_mask); m_cpu.access_after_delay(m_ws(offset)); } template u16 handler_entry_write_after_delay::write_flags(offs_t offset, uX data, uX mem_mask) const { return this->m_next->write_flags(offset, data, mem_mask); } template u16 handler_entry_write_after_delay::lookup_flags(offs_t offset, uX mem_mask) const { return this->m_next->lookup_flags(offset, mem_mask); } template std::string handler_entry_write_after_delay::name() const { return util::string_format("(ad %s) %s", m_ws.name(), this->m_next->name()); } template handler_entry_write_after_delay *handler_entry_write_after_delay::instantiate(handler_entry_write *next) const { return new handler_entry_write_after_delay(this->m_space, this->m_mph, next, m_ws); } template class handler_entry_read_after_delay<0, 1>; template class handler_entry_read_after_delay<0, 0>; template class handler_entry_read_after_delay<1, 3>; template class handler_entry_read_after_delay<1, 0>; template class handler_entry_read_after_delay<1, -1>; template class handler_entry_read_after_delay<2, 3>; template class handler_entry_read_after_delay<2, 0>; template class handler_entry_read_after_delay<2, -1>; template class handler_entry_read_after_delay<2, -2>; template class handler_entry_read_after_delay<3, 0>; template class handler_entry_read_after_delay<3, -1>; template class handler_entry_read_after_delay<3, -2>; template class handler_entry_read_after_delay<3, -3>; template class handler_entry_write_after_delay<0, 1>; template class handler_entry_write_after_delay<0, 0>; template class handler_entry_write_after_delay<1, 3>; template class handler_entry_write_after_delay<1, 0>; template class handler_entry_write_after_delay<1, -1>; template class handler_entry_write_after_delay<2, 3>; template class handler_entry_write_after_delay<2, 0>; template class handler_entry_write_after_delay<2, -1>; template class handler_entry_write_after_delay<2, -2>; template class handler_entry_write_after_delay<3, 0>; template class handler_entry_write_after_delay<3, -1>; template class handler_entry_write_after_delay<3, -2>; template class handler_entry_write_after_delay<3, -3>;