diff options
Diffstat (limited to 'src/devices/machine/z80dma.h')
-rw-r--r-- | src/devices/machine/z80dma.h | 114 |
1 files changed, 73 insertions, 41 deletions
diff --git a/src/devices/machine/z80dma.h b/src/devices/machine/z80dma.h index 37409927de3..b461330eab0 100644 --- a/src/devices/machine/z80dma.h +++ b/src/devices/machine/z80dma.h @@ -49,53 +49,87 @@ class z80dma_device : public device_t, { public: // construction/destruction - z80dma_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + z80dma_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); auto out_busreq_callback() { return m_out_busreq_cb.bind(); } auto out_int_callback() { return m_out_int_cb.bind(); } + auto out_ieo_callback() { return m_out_ieo_cb.bind(); } auto out_bao_callback() { return m_out_bao_cb.bind(); } auto in_mreq_callback() { return m_in_mreq_cb.bind(); } auto out_mreq_callback() { return m_out_mreq_cb.bind(); } auto in_iorq_callback() { return m_in_iorq_cb.bind(); } auto out_iorq_callback() { return m_out_iorq_cb.bind(); } - uint8_t read(); - void write(uint8_t data); - DECLARE_READ8_MEMBER( bus_r ) { return read(); } - DECLARE_WRITE8_MEMBER( bus_w ) { write(data); } - - DECLARE_WRITE_LINE_MEMBER(rdy_w); - DECLARE_WRITE_LINE_MEMBER(wait_w); - DECLARE_WRITE_LINE_MEMBER(bai_w); - -private: - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - - // device_z80daisy_interface overrides - virtual int z80daisy_irq_state() override; - virtual int z80daisy_irq_ack() override; - virtual void z80daisy_irq_reti() override; + u8 read(); + virtual void write(u8 data); + + void iei_w(int state) { m_iei = state; interrupt_check(); } + void rdy_w(int state); + void wait_w(int state) { m_wait = state; } + void bai_w(int state); + +protected: + static inline constexpr int COMMAND_RESET = 0xc3; + static inline constexpr int COMMAND_RESET_PORT_A_TIMING = 0xc7; + static inline constexpr int COMMAND_RESET_PORT_B_TIMING = 0xcb; + static inline constexpr int COMMAND_LOAD = 0xcf; + static inline constexpr int COMMAND_CONTINUE = 0xd3; + static inline constexpr int COMMAND_DISABLE_INTERRUPTS = 0xaf; + static inline constexpr int COMMAND_ENABLE_INTERRUPTS = 0xab; + static inline constexpr int COMMAND_RESET_AND_DISABLE_INTERRUPTS = 0xa3; + static inline constexpr int COMMAND_ENABLE_AFTER_RETI = 0xb7; + static inline constexpr int COMMAND_READ_STATUS_BYTE = 0xbf; + static inline constexpr int COMMAND_REINITIALIZE_STATUS_BYTE = 0x8b; + static inline constexpr int COMMAND_INITIATE_READ_SEQUENCE = 0xa7; + static inline constexpr int COMMAND_FORCE_READY = 0xb3; + static inline constexpr int COMMAND_ENABLE_DMA = 0x87; + static inline constexpr int COMMAND_DISABLE_DMA = 0x83; + static inline constexpr int COMMAND_READ_MASK_FOLLOWS = 0xbb; + + static inline constexpr int TM_TRANSFER = 0x01; + static inline constexpr int TM_SEARCH = 0x02; + static inline constexpr int TM_SEARCH_TRANSFER = 0x03; + + z80dma_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; // internal helpers - int is_ready(); + void enable(); + void disable(); + u8 num_follow() const noexcept { return m_num_follow; } + virtual int is_ready(); void interrupt_check(); void trigger_interrupt(int level); void do_read(); - int do_write(); + virtual void do_write(); void do_transfer_write(); void do_search(); - TIMER_CALLBACK_MEMBER(timerproc); + u16 ®(unsigned m, unsigned s) noexcept { return m_regs[REGNUM(m, s)]; } - void update_status(); + static constexpr unsigned REGNUM(unsigned m, unsigned s) { return (m << 3) + s; } + u16 m_addressA; + u16 m_addressB; + u16 m_count; + u16 m_byte_counter; + +private: + // device_z80daisy_interface implementation + virtual int z80daisy_irq_state() override; + virtual int z80daisy_irq_ack() override; + virtual void z80daisy_irq_reti() override; + + TIMER_CALLBACK_MEMBER(clock_w); TIMER_CALLBACK_MEMBER(rdy_write_callback); // internal state devcb_write_line m_out_busreq_cb; devcb_write_line m_out_int_cb; + devcb_write_line m_out_ieo_cb; devcb_write_line m_out_bao_cb; devcb_read8 m_in_mreq_cb; devcb_write8 m_out_mreq_cb; @@ -104,32 +138,30 @@ private: emu_timer *m_timer; - uint16_t m_regs[(6<<3)+1+1]; - uint8_t m_num_follow; - uint8_t m_cur_follow; - uint8_t m_regs_follow[5]; - uint8_t m_read_num_follow; - uint8_t m_read_cur_follow; - uint8_t m_read_regs_follow[7]; - uint8_t m_status; - uint8_t m_dma_enabled; - - uint16_t m_addressA; - uint16_t m_addressB; - uint16_t m_count; + u16 m_regs[(6 << 3) + 1 + 1]; + u8 m_num_follow; + u8 m_cur_follow; + u8 m_regs_follow[5]; + u8 m_read_num_follow; + u8 m_read_cur_follow; + u8 m_read_regs_follow[7]; + u8 m_status; + int m_dma_seq; int m_rdy; int m_force_ready; - uint8_t m_reset_pointer; + u8 m_reset_pointer; - bool m_is_read; - uint8_t m_cur_cycle; - uint8_t m_latch; + int m_wait; + int m_busrq_ack; + bool m_is_pulse; + u8 m_latch; // interrupts + int m_iei; // interrupt enable input int m_ip; // interrupt pending int m_ius; // interrupt under service - uint8_t m_vector; // interrupt vector + u8 m_vector; // interrupt vector }; |