diff options
Diffstat (limited to 'src/devices/cpu/mc68hc11/mc68hc11.h')
-rw-r--r-- | src/devices/cpu/mc68hc11/mc68hc11.h | 168 |
1 files changed, 125 insertions, 43 deletions
diff --git a/src/devices/cpu/mc68hc11/mc68hc11.h b/src/devices/cpu/mc68hc11/mc68hc11.h index 6452c20f8e3..a7248de563b 100644 --- a/src/devices/cpu/mc68hc11/mc68hc11.h +++ b/src/devices/cpu/mc68hc11/mc68hc11.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Ville Linde, Angelo Salese, hap +// copyright-holders:Ville Linde, Angelo Salese, AJR #ifndef MAME_CPU_MC68HC11_MC68HC11_H #define MAME_CPU_MC68HC11_MC68HC11_H @@ -8,15 +8,18 @@ enum { MC68HC11_IRQ_LINE = 0, - MC68HC11_TOC1_LINE = 1 + MC68HC11_XIRQ_LINE = 1 }; DECLARE_DEVICE_TYPE(MC68HC11A1, mc68hc11a1_device) DECLARE_DEVICE_TYPE(MC68HC11D0, mc68hc11d0_device) +DECLARE_DEVICE_TYPE(MC68HC11E1, mc68hc11e1_device) +DECLARE_DEVICE_TYPE(MC68HC811E2, mc68hc811e2_device) +DECLARE_DEVICE_TYPE(MC68HC11F1, mc68hc11f1_device) DECLARE_DEVICE_TYPE(MC68HC11K1, mc68hc11k1_device) DECLARE_DEVICE_TYPE(MC68HC11M0, mc68hc11m0_device) -class mc68hc11_cpu_device : public cpu_device +class mc68hc11_cpu_device : public cpu_device, public device_nvram_interface { public: // port configuration @@ -47,30 +50,41 @@ public: auto in_spi2_data_callback() { return m_spi2_data_input_cb.bind(); } auto out_spi2_data_callback() { return m_spi2_data_output_cb.bind(); } + void set_default_config(uint8_t data) { assert(!configured()); m_config = data & m_config_mask; } + protected: - mc68hc11_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int reg_bits, uint16_t internal_ram_size, uint8_t init_value, address_map_constructor reg_map); + mc68hc11_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint16_t ram_size, uint16_t reg_block_size, uint16_t rom_size, uint16_t eeprom_size, uint8_t init_value, uint8_t config_mask, uint8_t option_mask); - // device-level overrides - virtual void device_resolve_objects() override; - virtual void device_start() override; - virtual void device_reset() override; + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; - // device_execute_interface overrides - virtual uint32_t execute_min_cycles() const override { return 1; } - virtual uint32_t execute_max_cycles() const override { return 41; } - virtual uint32_t execute_input_lines() const override { return 2; } + // device_execute_interface implementation + virtual uint32_t execute_min_cycles() const noexcept override { return 1; } + virtual uint32_t execute_max_cycles() const noexcept override { return 41; } + virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const noexcept override { return (clocks + 4 - 1) / 4; } + virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const noexcept override { return (cycles * 4); } virtual void execute_run() override; virtual void execute_set_input(int inputnum, int state) override; - // device_memory_interface overrides + // device_memory_interface implementation virtual space_config_vector memory_space_config() const override; - // device_state_interface overrides + // device_nvram_interface implementation + virtual bool nvram_read(util::read_stream &file) override; + virtual bool nvram_write(util::write_stream &file) override; + virtual void nvram_default() override; + + // device_state_interface implementation virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; - // device_disasm_interface overrides + // device_disasm_interface implementation virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; + void set_irq_state(uint8_t irqn, bool state); + + virtual void mc68hc11_reg_map(memory_view::memory_view_entry &block, offs_t base) = 0; + template <int P> uint8_t port_r(); template <int P> void port_w(uint8_t data); template <int P> uint8_t ddr_r(); @@ -78,15 +92,24 @@ protected: uint8_t pioc_r(); uint8_t tcnt_r(offs_t offset); void tcnt_w(offs_t offset, uint8_t data); - uint8_t toc1_r(offs_t offset); - void toc1_w(offs_t offset, uint8_t data); + uint8_t toc_r(offs_t offset); + void toc_w(offs_t offset, uint8_t data); + uint8_t tctl1_r(); + void tctl1_w(uint8_t data); + uint8_t tctl2_r(); + void tctl2_w(uint8_t data); uint8_t tmsk1_r(); void tmsk1_w(uint8_t data); uint8_t tflg1_r(); void tflg1_w(uint8_t data); + uint8_t tflg2_r(); + void tflg2_w(uint8_t data); + uint8_t tmsk2_r(); void tmsk2_w(uint8_t data); uint8_t pactl_r(); void pactl_w(uint8_t data); + uint8_t pactl_ddra_r(); + void pactl_ddra_w(uint8_t data); template <int N> uint8_t spcr_r(); template <int N> uint8_t spsr_r(); template <int N> uint8_t spdr_r(); @@ -95,8 +118,15 @@ protected: void adctl_w(uint8_t data); uint8_t adr_r(offs_t offset); uint8_t opt2_r(); + uint8_t config_r(); + uint8_t config_1s_r(); + void config_w(uint8_t data); uint8_t init_r(); void init_w(uint8_t data); + uint8_t init2_r(); + void init2_w(uint8_t data); + uint8_t option_r(); + void option_w(uint8_t data); uint8_t scbd_r(offs_t offset); uint8_t sccr1_r(); uint8_t sccr2_r(); @@ -106,8 +136,6 @@ protected: private: address_space_config m_program_config; - address_space_config m_data_config; - address_space_config m_io_config; union { struct { @@ -137,37 +165,54 @@ private: uint8_t m_adctl; int m_ad_channel; - uint8_t m_irq_state[2]; - memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache; - address_space *m_program; - address_space *m_data; - address_space *m_io; - devcb_read8 m_port_input_cb[8]; - devcb_write8 m_port_output_cb[8]; - devcb_read8 m_analog_cb[8]; + uint32_t m_irq_state; + bool m_irq_asserted; + + memory_access<16, 0, 0, ENDIANNESS_BIG>::cache m_cache; + memory_access<16, 0, 0, ENDIANNESS_BIG>::specific m_program; + devcb_read8::array<8> m_port_input_cb; + devcb_write8::array<8> m_port_output_cb; + devcb_read8::array<8> m_analog_cb; devcb_read8 m_spi2_data_input_cb; devcb_write8 m_spi2_data_output_cb; int m_icount; - int m_ram_position; - int m_reg_position; + memory_view m_ram_view; + memory_view m_reg_view; + memory_view m_eeprom_view; + optional_shared_ptr<uint8_t> m_eeprom_data; - const uint16_t m_reg_block_size; // size of internal I/O space const uint16_t m_internal_ram_size; + const uint16_t m_reg_block_size; // size of internal I/O space + const uint16_t m_internal_rom_size; + const uint16_t m_internal_eeprom_size; const uint8_t m_init_value; // default value for INIT register + const uint8_t m_config_mask; + const uint8_t m_option_mask; uint8_t m_wait_state; uint8_t m_stop_state; + uint8_t m_tctl1; + uint8_t m_tctl2; uint8_t m_tflg1; uint8_t m_tmsk1; - uint16_t m_toc1; + uint16_t m_toc[5]; uint16_t m_tcnt; // uint8_t m_por; - uint8_t m_pr; + uint8_t m_tflg2; + uint8_t m_tmsk2; uint8_t m_pactl; + uint8_t m_init; + uint8_t m_init2; +protected: + uint8_t m_config; + uint8_t m_option; + +private: uint64_t m_frc_base; + uint64_t m_reset_time; typedef void (mc68hc11_cpu_device::*ophandler)(); struct hc11_opcode_list_struct @@ -183,7 +228,7 @@ private: ophandler hc11_optable_page3[256]; ophandler hc11_optable_page4[256]; - void ram_map(address_map &map); + void internal_map(address_map &map) ATTR_COLD; uint8_t FETCH(); uint16_t FETCH16(); @@ -342,6 +387,7 @@ private: void hc11_eorb_ext(); void hc11_eorb_indx(); void hc11_eorb_indy(); + void hc11_fdiv(); void hc11_idiv(); void hc11_inca(); void hc11_incb(); @@ -518,12 +564,12 @@ public: mc68hc11a1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - virtual void device_reset() override; + virtual void device_reset() override ATTR_COLD; - uint8_t pactl_r(); - void pactl_w(uint8_t data); + virtual void mc68hc11_reg_map(memory_view::memory_view_entry &block, offs_t base) override; - void io_map(address_map &map); + uint8_t pactl_ddra7_r(); + void pactl_ddra7_w(uint8_t data); }; class mc68hc11d0_device : public mc68hc11_cpu_device @@ -533,12 +579,48 @@ public: mc68hc11d0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - virtual void device_reset() override; + virtual void device_reset() override ATTR_COLD; - uint8_t pactl_r(); - void pactl_w(uint8_t data); + virtual void mc68hc11_reg_map(memory_view::memory_view_entry &block, offs_t base) override; + +private: + uint8_t reg01_r(); +}; + +class mc68hc11e1_device : public mc68hc11_cpu_device +{ +public: + // construction/destruction + mc68hc11e1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual void device_reset() override ATTR_COLD; + + virtual void mc68hc11_reg_map(memory_view::memory_view_entry &block, offs_t base) override; +}; + +class mc68hc811e2_device : public mc68hc11_cpu_device +{ +public: + // construction/destruction + mc68hc811e2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual void device_reset() override ATTR_COLD; + + virtual void mc68hc11_reg_map(memory_view::memory_view_entry &block, offs_t base) override; +}; + +class mc68hc11f1_device : public mc68hc11_cpu_device +{ +public: + // construction/destruction + mc68hc11f1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual void device_reset() override ATTR_COLD; - void io_map(address_map &map); + virtual void mc68hc11_reg_map(memory_view::memory_view_entry &block, offs_t base) override; }; class mc68hc11k1_device : public mc68hc11_cpu_device @@ -548,7 +630,7 @@ public: mc68hc11k1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - void io_map(address_map &map); + virtual void mc68hc11_reg_map(memory_view::memory_view_entry &block, offs_t base) override; }; class mc68hc11m0_device : public mc68hc11_cpu_device @@ -558,7 +640,7 @@ public: mc68hc11m0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - void io_map(address_map &map); + virtual void mc68hc11_reg_map(memory_view::memory_view_entry &block, offs_t base) override; }; #endif // MAME_CPU_MC68HC11_MC68HC11_H |