summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/z80dma.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/z80dma.h')
-rw-r--r--src/devices/machine/z80dma.h78
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 &REG(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
};