diff options
Diffstat (limited to 'src/devices/cpu/nec/v5x.h')
-rw-r--r-- | src/devices/cpu/nec/v5x.h | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/devices/cpu/nec/v5x.h b/src/devices/cpu/nec/v5x.h index c1b6511e8b8..4fcde8143a9 100644 --- a/src/devices/cpu/nec/v5x.h +++ b/src/devices/cpu/nec/v5x.h @@ -44,7 +44,7 @@ public: auto syndet_handler_cb() { return device().subdevice<v5x_scu_device>("scu")->syndet_handler(); } protected: - device_v5x_interface(const machine_config &mconfig, nec_common_device &device); + device_v5x_interface(const machine_config &mconfig, nec_common_device &device, bool is_16bit); // device_interface overrides virtual void interface_post_start() override; @@ -56,6 +56,27 @@ protected: virtual void install_peripheral_io() = 0; + const int AS_INTERNAL_IO = AS_OPCODES + 1; + const u8 INTERNAL_IO_ADDR_WIDTH = (1 << 3); + const u8 INTERNAL_IO_ADDR_MASK = (1 << INTERNAL_IO_ADDR_WIDTH) - 1; + const u16 OPHA_MASK = INTERNAL_IO_ADDR_MASK << INTERNAL_IO_ADDR_WIDTH; + + inline u16 OPHA() { return (m_OPHA << INTERNAL_IO_ADDR_WIDTH) & OPHA_MASK; } + inline u16 io_mask(u8 base) { return 0x00ff << ((base & 1) << 3); } + inline bool check_OPHA(offs_t a) + { + return ((m_OPSEL & OPSEL_MASK) != 0) && (m_OPHA != 0xff) && ((a & OPHA_MASK) == OPHA()); // 256 bytes boundary, ignore system io area + } + + inline u8 internal_io_read_byte(offs_t a) { return m_internal_io->read_byte(a & INTERNAL_IO_ADDR_MASK); } + inline u16 internal_io_read_word(offs_t a) { return m_internal_io->read_word_unaligned(a & INTERNAL_IO_ADDR_MASK); } + inline void internal_io_write_byte(offs_t a, u8 v) { m_internal_io->write_byte(a & INTERNAL_IO_ADDR_MASK, v); } + inline void internal_io_write_word(offs_t a, u16 v) { m_internal_io->write_word_unaligned(a & INTERNAL_IO_ADDR_MASK, v); } + + void remappable_io_map(address_map &map); + virtual u8 temp_io_byte_r(offs_t offset) = 0; + virtual void temp_io_byte_w(offs_t offset, u8 data) = 0; + DECLARE_WRITE8_MEMBER(BSEL_w) {} DECLARE_WRITE8_MEMBER(BADR_w) {} DECLARE_WRITE8_MEMBER(BRC_w) {} @@ -84,12 +105,16 @@ protected: required_device<v5x_icu_device> m_icu; required_device<v5x_scu_device> m_scu; + address_space_config m_internal_io_config; + address_space *m_internal_io; + enum opsel_mask { OPSEL_DS = 0x01, // dmau enabled OPSEL_IS = 0x02, // icu enabled OPSEL_TS = 0x04, // tcu enabled OPSEL_SS = 0x08, // scu enabled + OPSEL_MASK = OPSEL_DS | OPSEL_IS | OPSEL_TS | OPSEL_SS }; u8 m_OPSEL; @@ -117,6 +142,17 @@ protected: // device_execute_interface overrides virtual void execute_set_input(int inputnum, int state) override; + // device_memory_interface overrides + virtual space_config_vector memory_space_config() const override; + + virtual u8 temp_io_byte_r(offs_t offset) override { return nec_common_device::io_read_byte(OPHA() | (offset & INTERNAL_IO_ADDR_MASK)); } + virtual void temp_io_byte_w(offs_t offset, u8 data) override { nec_common_device::io_write_byte(OPHA() | (offset & INTERNAL_IO_ADDR_MASK), data); } + + virtual u8 io_read_byte(offs_t a) override; + virtual u16 io_read_word(offs_t a) override; + virtual void io_write_byte(offs_t a, u8 v) override; + virtual void io_write_word(offs_t a, u16 v) override; + void internal_port_map(address_map &map); DECLARE_WRITE8_MEMBER(OPCN_w); @@ -173,6 +209,17 @@ protected: // device_execute_interface overrides virtual void execute_set_input(int inputnum, int state) override; + // device_memory_interface overrides + virtual space_config_vector memory_space_config() const override; + + virtual u8 temp_io_byte_r(offs_t offset) override { return nec_common_device::io_read_byte(OPHA() | (offset & INTERNAL_IO_ADDR_MASK)); } + virtual void temp_io_byte_w(offs_t offset, u8 data) override { nec_common_device::io_write_byte(OPHA() | (offset & INTERNAL_IO_ADDR_MASK), data); } + + virtual u8 io_read_byte(offs_t a) override; + virtual u16 io_read_word(offs_t a) override; + virtual void io_write_byte(offs_t a, u8 v) override; + virtual void io_write_word(offs_t a, u16 v) override; + void internal_port_map(address_map &map); virtual void install_peripheral_io() override; |