From 3bb9487dfc066e2b63d3b4b001bf24b6123734c8 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 18 Feb 2024 22:25:12 +0100 Subject: [PATCH] h8: appears to be better for performance without virtual calls for r/w functions --- src/devices/cpu/h8/h8.cpp | 36 +++++++++++++++++++++++++------- src/devices/cpu/h8/h8.h | 12 +++++------ src/devices/cpu/h8/h8s2000.cpp | 38 ---------------------------------- src/devices/cpu/h8/h8s2000.h | 7 ------- 4 files changed, 34 insertions(+), 59 deletions(-) diff --git a/src/devices/cpu/h8/h8.cpp b/src/devices/cpu/h8/h8.cpp index 8e68c2a7b71..6b0c004e2f6 100644 --- a/src/devices/cpu/h8/h8.cpp +++ b/src/devices/cpu/h8/h8.cpp @@ -474,33 +474,51 @@ void h8_device::state_string_export(const device_state_entry &entry, std::string } } +// FIXME: one-state bus cycles are only provided for on-chip ROM & RAM in H8S/2000 and H8S/2600. +// All other accesses take *at least* two states each, and additional wait states are often programmed for external memory! + u16 h8_device::read16i(u32 adr) { - m_icount -= 2; + if(m_has_exr) + m_icount--; + else + m_icount -= 2; return m_cache.read_word(adr & ~1); } u8 h8_device::read8(u32 adr) { - m_icount -= 2; + if(m_has_exr) + m_icount--; + else + m_icount -= 2; return m_program.read_byte(adr); } void h8_device::write8(u32 adr, u8 data) { - m_icount -= 2; + if(m_has_exr) + m_icount--; + else + m_icount -= 2; m_program.write_byte(adr, data); } u16 h8_device::read16(u32 adr) { - m_icount -= 2; + if(m_has_exr) + m_icount--; + else + m_icount -= 2; return m_program.read_word(adr & ~1); } void h8_device::write16(u32 adr, u16 data) { - m_icount -= 2; + if(m_has_exr) + m_icount--; + else + m_icount -= 2; m_program.write_word(adr & ~1, data); } @@ -563,9 +581,11 @@ void h8_device::set_irq(int irq_vector, int irq_level, bool irq_nmi) void h8_device::internal(int cycles) { - // all internal operations take an even number of states (at least 2 each) - // this only applies to: H8/300, H8/300L, H8/300H (not H8S) - m_icount -= cycles + 1; + // on H8/300, H8/300L, H8/300H (not H8S), all internal operations take an even number of states (at least 2 each) + if(!m_has_exr) + m_icount -= cycles + 1; + else + m_icount -= cycles; } void h8_device::illegal() diff --git a/src/devices/cpu/h8/h8.h b/src/devices/cpu/h8/h8.h index ab59c2c2e7c..885ca100c80 100644 --- a/src/devices/cpu/h8/h8.h +++ b/src/devices/cpu/h8/h8.h @@ -191,12 +191,12 @@ protected: virtual int trapa_setup(); virtual void irq_setup() = 0; - virtual u16 read16i(u32 adr); - virtual u8 read8(u32 adr); - virtual void write8(u32 adr, u8 data); - virtual u16 read16(u32 adr); - virtual void write16(u32 adr, u16 data); - virtual void internal(int cycles); + u16 read16i(u32 adr); + u8 read8(u32 adr); + void write8(u32 adr, u8 data); + u16 read16(u32 adr); + void write16(u32 adr, u16 data); + void internal(int cycles); void prefetch_switch(u32 pc, u16 ir) { m_NPC = pc & 0xffffff; m_PC = pc+2; m_PIR = ir; } void prefetch_done(); void prefetch_done_noirq(); diff --git a/src/devices/cpu/h8/h8s2000.cpp b/src/devices/cpu/h8/h8s2000.cpp index 7d056a63835..b8e8f18e8c6 100644 --- a/src/devices/cpu/h8/h8s2000.cpp +++ b/src/devices/cpu/h8/h8s2000.cpp @@ -15,42 +15,4 @@ std::unique_ptr h8s2000_device::create_disassembler() return std::make_unique(); } -// FIXME: one-state bus cycles are only provided for on-chip ROM & RAM in H8S/2000 and H8S/2600. -// All other accesses take *at least* two states each, and additional wait states are often programmed for external memory! - -u16 h8s2000_device::read16i(u32 adr) -{ - m_icount--; - return m_cache.read_word(adr & ~1); -} - -u8 h8s2000_device::read8(u32 adr) -{ - m_icount--; - return m_program.read_byte(adr); -} - -void h8s2000_device::write8(u32 adr, u8 data) -{ - m_icount--; - m_program.write_byte(adr, data); -} - -u16 h8s2000_device::read16(u32 adr) -{ - m_icount--; - return m_program.read_word(adr & ~1); -} - -void h8s2000_device::write16(u32 adr, u16 data) -{ - m_icount--; - m_program.write_word(adr & ~1, data); -} - -void h8s2000_device::internal(int cycles) -{ - m_icount -= cycles; -} - #include "cpu/h8/h8s2000.hxx" diff --git a/src/devices/cpu/h8/h8s2000.h b/src/devices/cpu/h8/h8s2000.h index 3d1274fb726..2acf28abcd3 100644 --- a/src/devices/cpu/h8/h8s2000.h +++ b/src/devices/cpu/h8/h8s2000.h @@ -29,13 +29,6 @@ protected: virtual std::unique_ptr create_disassembler() override; - virtual u16 read16i(u32 adr) override; - virtual u8 read8(u32 adr) override; - virtual void write8(u32 adr, u8 data) override; - virtual u16 read16(u32 adr) override; - virtual void write16(u32 adr, u16 data) override; - virtual void internal(int cycles) override; - virtual void do_exec_full() override; virtual void do_exec_partial() override;