summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/mc68hc11/mc68hc11.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/mc68hc11/mc68hc11.h')
-rw-r--r--src/devices/cpu/mc68hc11/mc68hc11.h168
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