summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/i8085/i8085.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/i8085/i8085.h')
-rw-r--r--src/devices/cpu/i8085/i8085.h141
1 files changed, 84 insertions, 57 deletions
diff --git a/src/devices/cpu/i8085/i8085.h b/src/devices/cpu/i8085/i8085.h
index 41f681f8897..b4ab5901c1f 100644
--- a/src/devices/cpu/i8085/i8085.h
+++ b/src/devices/cpu/i8085/i8085.h
@@ -53,17 +53,17 @@ public:
I8085_HALT, I8085_IM
};
- static constexpr uint8_t STATUS_INTA = 0x01;
- static constexpr uint8_t STATUS_WO = 0x02;
- static constexpr uint8_t STATUS_STACK = 0x04;
- static constexpr uint8_t STATUS_HLTA = 0x08;
- static constexpr uint8_t STATUS_OUT = 0x10;
- static constexpr uint8_t STATUS_M1 = 0x20;
- static constexpr uint8_t STATUS_INP = 0x40;
- static constexpr uint8_t STATUS_MEMR = 0x80;
+ static constexpr u8 STATUS_INTA = 0x01;
+ static constexpr u8 STATUS_WO = 0x02;
+ static constexpr u8 STATUS_STACK = 0x04;
+ static constexpr u8 STATUS_HLTA = 0x08;
+ static constexpr u8 STATUS_OUT = 0x10;
+ static constexpr u8 STATUS_M1 = 0x20;
+ static constexpr u8 STATUS_INP = 0x40;
+ static constexpr u8 STATUS_MEMR = 0x80;
// construction/destruction
- i8085a_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ i8085a_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// static configuration helpers
template <class Object> static devcb_base &set_out_status_func(device_t &device, Object &&cb) { return downcast<i8085a_cpu_device &>(device).m_out_status_func.set_callback(std::forward<Object>(cb)); }
@@ -73,7 +73,7 @@ public:
static void static_set_clk_out(device_t &device, clock_update_delegate &&clk_out) { downcast<i8085a_cpu_device &>(device).m_clk_out_func = std::move(clk_out); }
protected:
- i8085a_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int cputype);
+ i8085a_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int cputype);
// device-level overrides
virtual void device_config_complete() override;
@@ -82,14 +82,14 @@ protected:
virtual void device_reset() override;
// device_execute_interface overrides
- virtual uint32_t execute_min_cycles() const override { return 4; }
- virtual uint32_t execute_max_cycles() const override { return 16; }
- virtual uint32_t execute_input_lines() const override { return 4; }
- virtual uint32_t execute_default_irq_vector() const override { return 0xff; }
+ virtual u32 execute_min_cycles() const override { return 4; }
+ virtual u32 execute_max_cycles() const override { return 16; }
+ virtual u32 execute_input_lines() const override { return 4; }
+ virtual u32 execute_default_irq_vector() const override { return 0xff; }
virtual void execute_run() override;
virtual void execute_set_input(int inputnum, int state) override;
- virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override { return (clocks + 2 - 1) / 2; }
- virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override { return (cycles * 2); }
+ virtual u64 execute_clocks_to_cycles(u64 clocks) const override { return (clocks + 2 - 1) / 2; }
+ virtual u64 execute_cycles_to_clocks(u64 cycles) const override { return (cycles * 2); }
// device_memory_interface overrides
virtual space_config_vector memory_space_config() const override;
@@ -100,62 +100,89 @@ protected:
virtual void state_import(const device_state_entry &entry) override;
// device_disasm_interface overrides
- virtual uint32_t disasm_min_opcode_bytes() const override { return 1; }
- virtual uint32_t disasm_max_opcode_bytes() const override { return 3; }
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual util::disasm_interface *create_disassembler() override;
+
+ enum
+ {
+ CPUTYPE_8080 = 0,
+ CPUTYPE_8080A,
+ CPUTYPE_8085A
+ };
private:
address_space_config m_program_config;
address_space_config m_io_config;
+ address_space_config m_opcode_config;
- devcb_write8 m_out_status_func;
- devcb_write_line m_out_inte_func;
- devcb_read_line m_in_sid_func;
- devcb_write_line m_out_sod_func;
+ devcb_write8 m_out_status_func;
+ devcb_write_line m_out_inte_func;
+ devcb_read_line m_in_sid_func;
+ devcb_write_line m_out_sod_func;
clock_update_delegate m_clk_out_func;
- int m_cputype; /* 0 8080, 1 8085A */
- PAIR m_PC,m_SP,m_AF,m_BC,m_DE,m_HL,m_WZ;
- uint8_t m_HALT;
- uint8_t m_IM; /* interrupt mask (8085A only) */
- uint8_t m_STATUS; /* status word */
+ inline bool is_8080() { return m_cputype == CPUTYPE_8080 || m_cputype == CPUTYPE_8080A; }
+ inline bool is_8085() { return m_cputype == CPUTYPE_8085A; }
+ int m_cputype;
+
+ PAIR m_PC,m_SP,m_AF,m_BC,m_DE,m_HL,m_WZ;
+ u8 m_halt;
+ u8 m_im; /* interrupt mask (8085A only) */
+ u8 m_status; /* status word */
- uint8_t m_after_ei; /* post-EI processing; starts at 2, check for ints at 0 */
- uint8_t m_nmi_state; /* raw NMI line state */
- uint8_t m_irq_state[4]; /* raw IRQ line states */
- uint8_t m_trap_pending; /* TRAP interrupt latched? */
- uint8_t m_trap_im_copy; /* copy of IM register when TRAP was taken */
- uint8_t m_sod_state; /* state of the SOD line */
+ u8 m_after_ei; /* post-EI processing; starts at 2, check for ints at 0 */
+ u8 m_nmi_state; /* raw NMI line state */
+ u8 m_irq_state[4]; /* raw IRQ line states */
+ u8 m_trap_pending; /* TRAP interrupt latched? */
+ u8 m_trap_im_copy; /* copy of IM register when TRAP was taken */
+ u8 m_sod_state; /* state of the SOD line */
- bool m_ietemp; /* import/export temp space */
+ bool m_ietemp; /* import/export temp space */
address_space *m_program;
- direct_read_data *m_direct;
+ direct_read_data<0> *m_direct;
+ direct_read_data<0> *m_opcode_direct;
address_space *m_io;
- int m_icount;
+ int m_icount;
/* cycles lookup */
- static const uint8_t lut_cycles_8080[256];
- static const uint8_t lut_cycles_8085[256];
- uint8_t lut_cycles[256];
+ static const u8 lut_cycles_8080[256];
+ static const u8 lut_cycles_8085[256];
+ u8 lut_cycles[256];
/* flags lookup */
- uint8_t ZS[256];
- uint8_t ZSP[256];
+ u8 lut_zs[256];
+ u8 lut_zsp[256];
void set_sod(int state);
void set_inte(int state);
- void set_status(uint8_t status);
- uint8_t get_rim_value();
+ void set_status(u8 status);
+ u8 get_rim_value();
void break_halt_for_interrupt();
- uint8_t ROP();
- uint8_t ARG();
- uint16_t ARG16();
- uint8_t RM(uint32_t a);
- void WM(uint32_t a, uint8_t v);
+ u8 read_op();
+ u8 read_arg();
+ PAIR read_arg16();
+ u8 read_mem(u32 a);
+ void write_mem(u32 a, u8 v);
+ void op_push(PAIR p);
+ PAIR op_pop();
void check_for_interrupts();
void execute_one(int opcode);
void init_tables();
+ void op_ora(u8 v);
+ void op_xra(u8 v);
+ void op_ana(u8 v);
+ u8 op_inr(u8 v);
+ u8 op_dcr(u8 v);
+ void op_add(u8 v);
+ void op_adc(u8 v);
+ void op_sub(u8 v);
+ void op_sbb(u8 v);
+ void op_cmp(u8 v);
+ void op_dad(u16 v);
+ void op_jmp(int cond);
+ void op_call(int cond);
+ void op_ret(int cond);
+ void op_rst(u8 v);
};
@@ -163,12 +190,12 @@ class i8080_cpu_device : public i8085a_cpu_device
{
public:
// construction/destruction
- i8080_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ i8080_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
- virtual uint32_t execute_input_lines() const override { return 1; }
- virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override { return clocks; }
- virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override { return cycles; }
+ virtual u32 execute_input_lines() const override { return 1; }
+ virtual u64 execute_clocks_to_cycles(u64 clocks) const override { return clocks; }
+ virtual u64 execute_cycles_to_clocks(u64 cycles) const override { return cycles; }
};
@@ -176,12 +203,12 @@ class i8080a_cpu_device : public i8085a_cpu_device
{
public:
// construction/destruction
- i8080a_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ i8080a_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
- virtual uint32_t execute_input_lines() const override { return 1; }
- virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override { return clocks; }
- virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override { return cycles; }
+ virtual u32 execute_input_lines() const override { return 1; }
+ virtual u64 execute_clocks_to_cycles(u64 clocks) const override { return clocks; }
+ virtual u64 execute_cycles_to_clocks(u64 cycles) const override { return cycles; }
};