1 // license:GPL-2.0+ 2 // copyright-holders:Dirk Best,Carl 3 /*************************************************************************** 4 5 Intel 8089 I/O Processor 6 7 I/O channel 8 9 ***************************************************************************/ 10 11 #ifndef MAME_CPU_I8080_I8089_CHANNEL_H 12 #define MAME_CPU_I8080_I8089_CHANNEL_H 13 14 #pragma once 15 16 17 //************************************************************************** 18 // TYPE DEFINITIONS 19 //************************************************************************** 20 21 // forward declaration 22 class i8089_device; 23 24 class i8089_channel_device : public device_t 25 { 26 public: 27 // construction/destruction 28 i8089_channel_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 29 sintr()30 auto sintr() { return m_write_sintr.bind(); } 31 32 // set register 33 void set_reg(int reg, uint32_t value, int tag = -1); 34 35 int execute_run(); 36 void attention(); 37 38 // channel status 39 bool executing(); 40 bool transferring(); 41 bool priority(); 42 int chan_prio(); 43 bool chained(); 44 bool lock(); 45 void ca(); 46 47 DECLARE_WRITE_LINE_MEMBER( ext_w ); 48 DECLARE_WRITE_LINE_MEMBER( drq_w ); 49 50 // register 51 enum 52 { 53 GA, // 20-bit general purpose address a 54 GB, // 20-bit general purpose address b 55 GC, // 20-bit general purpose address c 56 BC, // byte count 57 TP, // 20-bit task pointer 58 IX, // byte count 59 CC, // mask compare 60 MC, // channel control 61 62 // internal use register 63 CP, // 20-bit control block pointer 64 PP, // 20-bit parameter pointer 65 PSW, // program status word 66 67 NUM_REGS 68 }; 69 70 struct 71 { 72 uint32_t w; // 20-bit address 73 bool t; // tag-bit 74 } 75 m_r[11]; 76 77 protected: 78 // device-level overrides 79 virtual void device_start() override; 80 virtual void device_reset() override; 81 82 private: 83 84 // opcodes 85 void add_rm(int r, int m, int o); 86 void add_mr(int m, int r, int o); 87 void addb_rm(int r, int m, int o); 88 void addb_mr(int m, int r, int o); 89 void addbi_ri(int r, int8_t i); 90 void addbi_mi(int m, int8_t i, int o); 91 void addi_ri(int r, int16_t i); 92 void addi_mi(int m, int16_t i, int o); 93 void and_rm(int r, int m, int o); 94 void and_mr(int m, int r, int o); 95 void andb_rm(int r, int m, int o); 96 void andb_mr(int m, int r, int o); 97 void andbi_ri(int r, int8_t i); 98 void andbi_mi(int m, int8_t i, int o); 99 void andi_ri(int r, int16_t i); 100 void andi_mi(int m, int16_t i, int o); 101 void call(int m, int16_t d, int o); 102 void clr(int m, int b, int o); 103 void dec_r(int r); 104 void dec_m(int m, int o); 105 void decb(int m, int o); 106 void hlt(); 107 void inc_r(int r); 108 void inc_m(int m, int o); 109 void incb(int m, int o); 110 void jbt(int m, int b, int16_t d, int o); 111 void jmce(int m, int16_t d, int o); 112 void jmcne(int m, int16_t d, int o); 113 void jnbt(int m, int b, int16_t d, int o); 114 void jnz_r(int r, int16_t d); 115 void jnz_m(int m, int16_t d, int o); 116 void jnzb(int m, int16_t d, int o); 117 void jz_r(int r, int16_t d); 118 void jz_m(int m, int16_t d, int o); 119 void jzb(int m, int16_t d, int o); 120 void lpd(int p, int m, int o); 121 void lpdi(int p, int s, int o); 122 void mov_mr(int m, int r, int o); 123 void mov_rm(int r, int m, int o); 124 void mov_mm(int m1, int m2, int o1, int o2); 125 void movb_mr(int m, int r, int o); 126 void movb_rm(int r, int m, int o); 127 void movb_mm(int m1, int m2, int o1, int o2); 128 void movbi_ri(int r, int8_t i); 129 void movbi_mi(int m, int8_t i, int o); 130 void movi_ri(int r, int16_t i); 131 void movi_mi(int m, int16_t i, int o); 132 void movp_mp(int m, int p, int o); 133 void movp_pm(int p, int m, int o); 134 void nop(); 135 void not_r(int r); 136 void not_m(int m, int o); 137 void not_rm(int r, int m, int o); 138 void notb_m(int m, int o); 139 void notb_rm(int r, int m, int o); 140 void or_rm(int r, int m, int o); 141 void or_mr(int m, int r, int o); 142 void orb_rm(int r, int m, int o); 143 void orb_mr(int m, int r, int o); 144 void orbi_ri(int r, int8_t i); 145 void orbi_mi(int m, int8_t i, int o); 146 void ori_ri(int r, int16_t i); 147 void ori_mi(int m, int16_t i, int o); 148 void setb(int m, int b, int o); 149 void do_sintr(); 150 void tsl(int m, int8_t i, int8_t d, int o); 151 void wid(int s, int d); 152 void xfer(); 153 void invalid(int opc); 154 155 // instruction fetch 156 int16_t displacement(int wb); 157 uint32_t offset(int aa, int mm, int w); 158 int8_t imm8(); 159 int16_t imm16(); 160 161 void examine_ccw(uint8_t ccw); 162 163 devcb_write_line m_write_sintr; 164 165 i8089_device *m_iop; 166 167 int m_icount; 168 169 // dma 170 void terminate_dma(int offset); 171 172 bool m_xfer_pending; 173 uint16_t m_dma_value; 174 int m_dma_state; 175 bool m_drq, m_store_hi, m_load_hi; 176 177 // dma state 178 enum 179 { 180 DMA_IDLE, 181 DMA_WAIT_FOR_SOURCE_DRQ, 182 DMA_FETCH, 183 DMA_TRANSLATE, 184 DMA_WAIT_FOR_DEST_DRQ, 185 DMA_STORE, 186 DMA_STORE_BYTE_HIGH, 187 DMA_COMPARE, 188 DMA_TERMINATE 189 }; 190 191 int m_prio; 192 193 // priority 194 enum 195 { 196 PRIO_DMA = 1, 197 PRIO_DMA_TERM = 1, 198 PRIO_PROG_CHAIN = 1, 199 PRIO_CHAN_ATTN, 200 PRIO_PROG, 201 PRIO_IDLE 202 }; 203 }; 204 205 206 // device type definition 207 DECLARE_DEVICE_TYPE(I8089_CHANNEL, i8089_channel_device) 208 209 #endif // MAME_CPU_I8080_I8089_CHANNEL_H 210