summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/upd7810/upd7810.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/upd7810/upd7810.h')
-rw-r--r--src/devices/cpu/upd7810/upd7810.h150
1 files changed, 99 insertions, 51 deletions
diff --git a/src/devices/cpu/upd7810/upd7810.h b/src/devices/cpu/upd7810/upd7810.h
index 2387a3333eb..cdda6dd8077 100644
--- a/src/devices/cpu/upd7810/upd7810.h
+++ b/src/devices/cpu/upd7810/upd7810.h
@@ -49,14 +49,14 @@ public:
auto co1_func() { return m_co1_func.bind(); }
auto txd_func() { return m_txd_func.bind(); }
auto rxd_func() { return m_rxd_func.bind(); }
- auto an0_func() { return m_an0_func.bind(); }
- auto an1_func() { return m_an1_func.bind(); }
- auto an2_func() { return m_an2_func.bind(); }
- auto an3_func() { return m_an3_func.bind(); }
- auto an4_func() { return m_an4_func.bind(); }
- auto an5_func() { return m_an5_func.bind(); }
- auto an6_func() { return m_an6_func.bind(); }
- auto an7_func() { return m_an7_func.bind(); }
+ auto an0_func() { return m_an_func[0].bind(); }
+ auto an1_func() { return m_an_func[1].bind(); }
+ auto an2_func() { return m_an_func[2].bind(); }
+ auto an3_func() { return m_an_func[3].bind(); }
+ auto an4_func() { return m_an_func[4].bind(); }
+ auto an5_func() { return m_an_func[5].bind(); }
+ auto an6_func() { return m_an_func[6].bind(); }
+ auto an7_func() { return m_an_func[7].bind(); }
auto pa_in_cb() { return m_pa_in_cb.bind(); }
auto pb_in_cb() { return m_pb_in_cb.bind(); }
@@ -69,18 +69,28 @@ public:
auto pd_out_cb() { return m_pd_out_cb.bind(); }
auto pf_out_cb() { return m_pf_out_cb.bind(); }
+ void set_pa_pullups(uint8_t p) { m_pa_pullups = p; }
+ void set_pb_pullups(uint8_t p) { m_pb_pullups = p; }
+ void set_pc_pullups(uint8_t p) { m_pc_pullups = p; }
+ void set_pd_pullups(uint8_t p) { m_pd_pullups = p; }
+ void set_pf_pullups(uint8_t p) { m_pf_pullups = p; }
+
auto pt_in_cb() { return m_pt_in_cb.bind(); }
- DECLARE_WRITE8_MEMBER(pa_w);
- DECLARE_WRITE8_MEMBER(pb_w);
- DECLARE_WRITE8_MEMBER(pc_w);
- DECLARE_WRITE8_MEMBER(pd_w);
- DECLARE_WRITE8_MEMBER(pf_w);
+ void pa_w(uint8_t data, uint8_t mem_mask = ~0);
+ void pb_w(uint8_t data, uint8_t mem_mask = ~0);
+ void pc_w(uint8_t data, uint8_t mem_mask = ~0);
+ void pd_w(uint8_t data, uint8_t mem_mask = ~0);
+ void pf_w(uint8_t data, uint8_t mem_mask = ~0);
+
+ void sck_w(int state);
protected:
- void upd_internal_128_ram_map(address_map &map);
- void upd_internal_256_ram_map(address_map &map);
- void upd_internal_4096_rom_map(address_map &map);
+ void upd_internal_128_ram_map(address_map &map) ATTR_COLD;
+ void upd_internal_256_ram_map(address_map &map) ATTR_COLD;
+ void upd_internal_4096_rom_128_ram_map(address_map &map) ATTR_COLD;
+ void upd_internal_4096_rom_256_ram_map(address_map &map) ATTR_COLD;
+ void upd_internal_16k_rom_256_ram_map(address_map &map) ATTR_COLD;
// flags
enum
@@ -98,7 +108,7 @@ protected:
// IRR flags
enum
{
- INTNMI = 0x0001,
+ INTFNMI = 0x0001,
INTFT0 = 0x0002,
INTFT1 = 0x0004,
INTF1 = 0x0008,
@@ -127,14 +137,15 @@ protected:
upd7810_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor internal_map);
// device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
+ 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 40; }
- virtual uint32_t execute_input_lines() const override { return 2; }
- virtual bool execute_input_edge_triggered(int inputnum) const override { return true; }
+ virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const noexcept override { return (clocks + 3 - 1) / 3; }
+ virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const noexcept override { return (cycles * 3); }
+ virtual uint32_t execute_min_cycles() const noexcept override { return 1; }
+ virtual uint32_t execute_max_cycles() const noexcept override { return 40; }
+ virtual bool execute_input_edge_triggered(int inputnum) const noexcept override { return true; }
virtual void execute_run() override;
virtual void execute_set_input(int inputnum, int state) override;
@@ -147,12 +158,14 @@ protected:
// device_disasm_interface overrides
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+ void update_sio(int cycles);
virtual void handle_timers(int cycles);
virtual void upd7810_take_irq();
void upd7810_handle_timer0(int cycles, int clkdiv);
void upd7810_handle_timer1(int cycles, int clkdiv);
+ void upd7810_to_output_change(int state);
void upd7810_co0_output_change();
void upd7810_co1_output_change();
@@ -161,14 +174,7 @@ protected:
devcb_write_line m_co1_func;
devcb_write_line m_txd_func;
devcb_read_line m_rxd_func;
- devcb_read8 m_an0_func;
- devcb_read8 m_an1_func;
- devcb_read8 m_an2_func;
- devcb_read8 m_an3_func;
- devcb_read8 m_an4_func;
- devcb_read8 m_an5_func;
- devcb_read8 m_an6_func;
- devcb_read8 m_an7_func;
+ devcb_read8::array<8> m_an_func;
devcb_read8 m_pa_in_cb;
devcb_read8 m_pb_in_cb;
@@ -194,6 +200,8 @@ protected:
};
virtual void configure_ops();
+ virtual uint8_t read_pc();
+ virtual void write_pc(uint8_t data);
static const struct opcode_s s_op48[256];
static const struct opcode_s s_op4C[256];
@@ -230,6 +238,7 @@ protected:
static const struct opcode_s s_opXX_78c06[256];
address_space_config m_program_config;
+ memory_view m_ram_view;
PAIR m_ppc; /* previous program counter */
PAIR m_pc; /* program counter */
@@ -237,6 +246,7 @@ protected:
uint8_t m_op; /* opcode */
uint8_t m_op2; /* opcode part 2 */
uint8_t m_iff; /* interrupt enable flip flop */
+ uint8_t m_iff_pending;
uint8_t m_psw; /* processor status word */
PAIR m_ea; /* extended accumulator */
PAIR m_va; /* accumulator + vector register */
@@ -279,10 +289,12 @@ protected:
uint8_t m_pc_out;
uint8_t m_pd_out;
uint8_t m_pf_out;
- uint8_t m_cr0; /* analog digital conversion register 0 */
- uint8_t m_cr1; /* analog digital conversion register 1 */
- uint8_t m_cr2; /* analog digital conversion register 2 */
- uint8_t m_cr3; /* analog digital conversion register 3 */
+ uint8_t m_pa_pullups;
+ uint8_t m_pb_pullups;
+ uint8_t m_pc_pullups;
+ uint8_t m_pd_pullups;
+ uint8_t m_pf_pullups;
+ uint8_t m_cr[4]; /* analog digital conversion registers */
uint8_t m_txb; /* transmitter buffer */
uint8_t m_rxb; /* receiver buffer */
uint8_t m_txd; /* port C control line states */
@@ -329,8 +341,8 @@ protected:
const struct opcode_s *m_op64;
const struct opcode_s *m_op70;
const struct opcode_s *m_op74;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_opcodes;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
int m_icount;
uint8_t RP(offs_t port);
@@ -1329,14 +1341,6 @@ protected:
void STAX_H_xx();
void JR();
void CALT_7801();
- void DCR_A_7801();
- void DCR_B_7801();
- void DCR_C_7801();
- void DCRW_wa_7801();
- void INR_A_7801();
- void INR_B_7801();
- void INR_C_7801();
- void INRW_wa_7801();
void IN();
void OUT();
void MOV_A_S();
@@ -1354,6 +1358,41 @@ protected:
};
+class upd78c10_device : public upd7810_device
+{
+public:
+ // construction/destruction
+ upd78c10_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ upd78c10_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor internal_map);
+};
+
+
+class upd7811_device : public upd7810_device
+{
+public:
+ // construction/destruction
+ upd7811_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+
+class upd78c11_device : public upd78c10_device
+{
+public:
+ // construction/destruction
+ upd78c11_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+
+class upd78c14_device : public upd78c10_device
+{
+public:
+ // construction/destruction
+ upd78c14_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+
class upd7807_device : public upd7810_device
{
public:
@@ -1373,12 +1412,17 @@ public:
upd7801_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+ virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const noexcept override { return (clocks + 2 - 1) / 2; }
+ virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const noexcept override { return (cycles * 2); }
virtual void execute_set_input(int inputnum, int state) override;
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
virtual void handle_timers(int cycles) override;
virtual void upd7810_take_irq() override;
virtual void configure_ops() override;
+ virtual uint8_t read_pc() override;
+ virtual void write_pc(uint8_t data) override;
};
@@ -1389,12 +1433,12 @@ public:
upd78c05_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
- upd78c05_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ upd78c05_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor internal_map);
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override { return (clocks + 4 - 1) / 4; }
- virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override { return (cycles * 4); }
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+ 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 std::unique_ptr<util::disasm_interface> create_disassembler() override;
virtual void handle_timers(int cycles) override;
virtual void configure_ops() override;
@@ -1411,6 +1455,10 @@ public:
DECLARE_DEVICE_TYPE(UPD7810, upd7810_device)
+DECLARE_DEVICE_TYPE(UPD78C10, upd78c10_device)
+DECLARE_DEVICE_TYPE(UPD7811, upd7811_device)
+DECLARE_DEVICE_TYPE(UPD78C11, upd78c11_device)
+DECLARE_DEVICE_TYPE(UPD78C14, upd78c14_device)
DECLARE_DEVICE_TYPE(UPD7807, upd7807_device)
DECLARE_DEVICE_TYPE(UPD7801, upd7801_device)
DECLARE_DEVICE_TYPE(UPD78C05, upd78c05_device)