diff options
Diffstat (limited to 'src/devices/machine/z80dma.h')
-rw-r--r-- | src/devices/machine/z80dma.h | 78 |
1 files changed, 55 insertions, 23 deletions
diff --git a/src/devices/machine/z80dma.h b/src/devices/machine/z80dma.h index 14725329bd0..7bbb91760ac 100644 --- a/src/devices/machine/z80dma.h +++ b/src/devices/machine/z80dma.h @@ -61,32 +61,67 @@ public: auto out_iorq_callback() { return m_out_iorq_cb.bind(); } uint8_t read(); - void write(uint8_t data); - - DECLARE_WRITE_LINE_MEMBER(iei_w) { m_iei = state; interrupt_check(); } - DECLARE_WRITE_LINE_MEMBER(rdy_w); - DECLARE_WRITE_LINE_MEMBER(wait_w); - DECLARE_WRITE_LINE_MEMBER(bai_w); - -private: - // device-level overrides + virtual void write(uint8_t data); + + void iei_w(int state) { m_iei = state; interrupt_check(); } + void rdy_w(int state); + void wait_w(int 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, uint32_t clock); + + // device_t implementation 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; - // internal helpers - int is_ready(); + bool is_dma_enabled() const noexcept { return m_dma_enabled; } + 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(); + uint16_t ®(unsigned m, unsigned s) noexcept { return m_regs[REGNUM(m, s)]; } + + static constexpr unsigned REGNUM(unsigned m, unsigned s) { return (m << 3) + s; } + + uint16_t m_addressA; + uint16_t m_addressB; + uint16_t m_count; + uint16_t 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(timerproc); void update_status(); @@ -105,7 +140,7 @@ private: emu_timer *m_timer; - uint16_t m_regs[(6<<3)+1+1]; + uint16_t m_regs[(6 << 3) + 1 + 1]; uint8_t m_num_follow; uint8_t m_cur_follow; uint8_t m_regs_follow[5]; @@ -115,23 +150,20 @@ private: uint8_t m_status; uint8_t m_dma_enabled; - uint16_t m_addressA; - uint16_t m_addressB; - uint16_t m_count; - int m_rdy; int m_force_ready; uint8_t m_reset_pointer; bool m_is_read; + bool m_is_pulse; uint8_t m_cur_cycle; uint8_t m_latch; // interrupts - bool m_iei; + int m_iei; // interrupt enable input int m_ip; // interrupt pending int m_ius; // interrupt under service - uint8_t m_vector; // interrupt vector + uint8_t m_vector; // interrupt vector }; |