1 // license:BSD-3-Clause 2 // copyright-holders:smf 3 #ifndef MAME_MACHINE_53C810_H 4 #define MAME_MACHINE_53C810_H 5 6 #pragma once 7 8 #include "legscsi.h" 9 10 class lsi53c810_device : public legacy_scsi_host_adapter 11 { 12 public: 13 typedef device_delegate<void (int state)> irq_delegate; 14 typedef device_delegate<void (uint32_t src, uint32_t dst, int length, int byteswap)> dma_delegate; 15 typedef device_delegate<uint32_t (uint32_t dsp)> fetch_delegate; 16 17 // construction/destruction 18 lsi53c810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); 19 set_irq_callback(T &&...args)20 template <typename... T> void set_irq_callback(T &&... args) 21 { 22 m_irq_cb.set(std::forward<T>(args)...); 23 } 24 set_dma_callback(T &&...args)25 template <typename... T> void set_dma_callback(T &&... args) 26 { 27 m_dma_cb.set(std::forward<T>(args)...); 28 } 29 set_fetch_callback(T &&...args)30 template <typename... T> void set_fetch_callback(T &&... args) 31 { 32 m_fetch_cb.set(std::forward<T>(args)...); 33 } 34 35 uint8_t reg_r(int offset); 36 void reg_w(int offset, uint8_t data); 37 38 protected: 39 // device-level overrides 40 virtual void device_start() override; 41 42 private: 43 typedef delegate<void ()> opcode_handler_delegate; 44 opcode_handler_delegate dma_opcode[256]; 45 46 irq_delegate m_irq_cb; 47 dma_delegate m_dma_cb; 48 fetch_delegate m_fetch_cb; 49 50 uint32_t FETCH(); 51 void dmaop_invalid(); 52 void dmaop_move_memory(); 53 void dmaop_interrupt(); 54 void dmaop_block_move(); 55 void dmaop_select(); 56 void dmaop_wait_disconnect(); 57 void dmaop_wait_reselect(); 58 void dmaop_set(); 59 void dmaop_clear(); 60 void dmaop_move_from_sfbr(); 61 void dmaop_move_to_sfbr(); 62 void dmaop_read_modify_write(); 63 int scripts_compute_branch(); 64 uint32_t scripts_get_jump_dest(); 65 void dmaop_jump(); 66 void dmaop_call(); 67 void dmaop_return(); 68 void dmaop_store(); 69 void dmaop_load(); 70 void dma_exec(); 71 void add_opcode(uint8_t op, uint8_t mask, opcode_handler_delegate handler); 72 uint32_t lsi53c810_dasm_fetch(uint32_t pc); 73 unsigned lsi53c810_dasm(char *buf, uint32_t pc); 74 75 uint8_t scntl0; 76 uint8_t scntl1; 77 uint8_t scntl2; 78 uint8_t scntl3; 79 uint8_t scid; 80 uint8_t sxfer; 81 uint8_t socl; 82 uint8_t istat; 83 uint8_t dstat; 84 uint8_t sstat0; 85 uint8_t sstat1; 86 uint8_t sstat2; 87 uint8_t dien; 88 uint8_t dcntl; 89 uint8_t dmode; 90 uint32_t temp; 91 uint32_t dsa; 92 uint32_t dsp; 93 uint32_t dsps; 94 uint32_t dcmd; 95 uint8_t sien0; 96 uint8_t sien1; 97 uint8_t stime0; 98 uint8_t respid; 99 uint8_t stest1; 100 uint8_t scratch_a[4]; 101 uint8_t scratch_b[4]; 102 int dma_icount; 103 int halted; 104 int carry; 105 }; 106 107 // device type definition 108 DECLARE_DEVICE_TYPE(LSI53C810, lsi53c810_device) 109 110 #endif // MAME_MACHINE_53C810_H 111