diff options
Diffstat (limited to 'src/devices/cpu/upd7810/upd7810.h')
-rw-r--r-- | src/devices/cpu/upd7810/upd7810.h | 150 |
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) |