trunk/src/emu/bus/dmv/k806.c
| r241950 | r241951 | |
| 28 | 28 | static MACHINE_CONFIG_FRAGMENT( dmv_k806 ) |
| 29 | 29 | MCFG_CPU_ADD("mcu", I8741, XTAL_6MHz) |
| 30 | 30 | MCFG_CPU_IO_MAP(k806_io) |
| 31 | |
| 32 | MCFG_TIMER_DRIVER_ADD_PERIODIC("mouse_timer", dmv_k806_device, mouse_timer, attotime::from_hz(1000)) |
| 31 | 33 | MACHINE_CONFIG_END |
| 32 | 34 | |
| 33 | 35 | static INPUT_PORTS_START( dmv_k806 ) |
| r241950 | r241951 | |
| 46 | 48 | PORT_DIPNAME( 0x380, 0x00, "K806 Mouse" ) PORT_DIPLOCATION("J:!8,J:!9,J:!10") |
| 47 | 49 | PORT_DIPSETTING( 0x000, "Hawley, Alps" ) |
| 48 | 50 | PORT_DIPSETTING( 0x380, "Depraz" ) |
| 51 | |
| 52 | PORT_START("MOUSE") |
| 53 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Righ Mouse Button") PORT_CODE(MOUSECODE_BUTTON1) |
| 54 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Middte Mouse Button") PORT_CODE(MOUSECODE_BUTTON3) |
| 55 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Left Mouse Button") PORT_CODE(MOUSECODE_BUTTON2) |
| 56 | |
| 57 | PORT_START("MOUSEX") |
| 58 | PORT_BIT( 0xfff, 0x000, IPT_MOUSE_X ) PORT_SENSITIVITY(20) PORT_KEYDELTA(0) |
| 59 | |
| 60 | PORT_START("MOUSEY") |
| 61 | PORT_BIT( 0xfff, 0x000, IPT_MOUSE_Y ) PORT_SENSITIVITY(20) PORT_KEYDELTA(0) |
| 49 | 62 | INPUT_PORTS_END |
| 50 | 63 | |
| 51 | 64 | //************************************************************************** |
| r241950 | r241951 | |
| 66 | 79 | : device_t(mconfig, DMV_K806, "K806 mouse", tag, owner, clock, "dmv_k806", __FILE__), |
| 67 | 80 | device_dmvslot_interface( mconfig, *this ), |
| 68 | 81 | m_mcu(*this, "mcu"), |
| 69 | | m_jumpers(*this, "JUMPERS") |
| 82 | m_jumpers(*this, "JUMPERS"), |
| 83 | m_mouse_buttons(*this, "MOUSE"), |
| 84 | m_mouse_x(*this, "MOUSEX"), |
| 85 | m_mouse_y(*this, "MOUSEY") |
| 70 | 86 | { |
| 71 | 87 | } |
| 72 | 88 | |
| r241950 | r241951 | |
| 85 | 101 | |
| 86 | 102 | void dmv_k806_device::device_reset() |
| 87 | 103 | { |
| 104 | m_mouse.phase = 0; |
| 105 | m_mouse.xa = m_mouse.xb = ASSERT_LINE; |
| 106 | m_mouse.ya = m_mouse.yb = ASSERT_LINE; |
| 107 | m_mouse.x = m_mouse.y = 0; |
| 108 | m_mouse.prev_x = m_mouse.prev_y = 0; |
| 88 | 109 | } |
| 89 | 110 | |
| 90 | 111 | //------------------------------------------------- |
| r241950 | r241951 | |
| 126 | 147 | { |
| 127 | 148 | UINT8 jumpers = m_jumpers->read(); |
| 128 | 149 | if (BIT(jumpers, ifsel) && ((!BIT(offset, 3) && BIT(jumpers, 5)) || (BIT(offset, 3) && BIT(jumpers, 6)))) |
| 150 | { |
| 129 | 151 | m_mcu->upi41_master_w(space, offset & 1, data); |
| 152 | m_bus->m_out_int_cb(CLEAR_LINE); |
| 153 | } |
| 130 | 154 | } |
| 131 | 155 | |
| 132 | 156 | READ8_MEMBER( dmv_k806_device::port1_r ) |
| r241950 | r241951 | |
| 140 | 164 | // -x-- ---- YB / X1 |
| 141 | 165 | // x--- ---- not used |
| 142 | 166 | |
| 143 | | // TODO |
| 144 | | return 0xff; |
| 167 | UINT8 data = m_mouse_buttons->read() & 0x07; |
| 168 | |
| 169 | data |= (m_mouse.xa != CLEAR_LINE ? 0 : 0x08); |
| 170 | data |= (m_mouse.xb != CLEAR_LINE ? 0 : 0x10); |
| 171 | data |= (m_mouse.ya != CLEAR_LINE ? 0 : 0x20); |
| 172 | data |= (m_mouse.yb != CLEAR_LINE ? 0 : 0x40); |
| 173 | |
| 174 | return data; |
| 145 | 175 | } |
| 146 | 176 | |
| 147 | 177 | READ8_MEMBER( dmv_k806_device::portt1_r ) |
| r241950 | r241951 | |
| 152 | 182 | WRITE8_MEMBER( dmv_k806_device::port2_w ) |
| 153 | 183 | { |
| 154 | 184 | m_bus->m_out_int_cb((data & 1) ? CLEAR_LINE : ASSERT_LINE); |
| 155 | | }; |
| 185 | } |
| 186 | |
| 187 | /*------------------------------------------------------------------- |
| 188 | |
| 189 | Generate a sequence of pulses that have their phases shifted |
| 190 | by 90 degree for simulate the mouse movement. |
| 191 | |
| 192 | Right Left |
| 193 | -+ +---+ +---+ +--- ---+ +---+ +---+ +- |
| 194 | XA | | | | | | | | | | | | |
| 195 | +---+ +---+ +---+ +---+ +---+ +---+ |
| 196 | |
| 197 | ---+ +---+ +---+ +- -+ +---+ +---+ +--- |
| 198 | XB | | | | | | | | | | | | |
| 199 | +---+ +---+ +---+ +---+ +---+ +---+ |
| 200 | |
| 201 | Down Up |
| 202 | -+ +---+ +---+ +--- ---+ +---+ +---+ +- |
| 203 | YA | | | | | | | | | | | | |
| 204 | +---+ +---+ +---+ +---+ +---+ +---+ |
| 205 | |
| 206 | ---+ +---+ +---+ +- -+ +---+ +---+ +--- |
| 207 | YB | | | | | | | | | | | | |
| 208 | +---+ +---+ +---+ +---+ +---+ +---+ |
| 209 | |
| 210 | -------------------------------------------------------------------*/ |
| 211 | |
| 212 | TIMER_DEVICE_CALLBACK_MEMBER(dmv_k806_device::mouse_timer) |
| 213 | { |
| 214 | switch(m_mouse.phase) |
| 215 | { |
| 216 | case 0: |
| 217 | m_mouse.xa = m_mouse.x > m_mouse.prev_x ? CLEAR_LINE : ASSERT_LINE; |
| 218 | m_mouse.xb = m_mouse.x < m_mouse.prev_x ? CLEAR_LINE : ASSERT_LINE; |
| 219 | m_mouse.ya = m_mouse.y > m_mouse.prev_y ? CLEAR_LINE : ASSERT_LINE; |
| 220 | m_mouse.yb = m_mouse.y < m_mouse.prev_y ? CLEAR_LINE : ASSERT_LINE; |
| 221 | break; |
| 222 | case 1: |
| 223 | m_mouse.xa = m_mouse.xb = m_mouse.x != m_mouse.prev_x ? CLEAR_LINE : ASSERT_LINE; |
| 224 | m_mouse.ya = m_mouse.yb = m_mouse.y != m_mouse.prev_y ? CLEAR_LINE : ASSERT_LINE; |
| 225 | break; |
| 226 | case 2: |
| 227 | m_mouse.xa = m_mouse.x < m_mouse.prev_x ? CLEAR_LINE : ASSERT_LINE; |
| 228 | m_mouse.xb = m_mouse.x > m_mouse.prev_x ? CLEAR_LINE : ASSERT_LINE; |
| 229 | m_mouse.ya = m_mouse.y < m_mouse.prev_y ? CLEAR_LINE : ASSERT_LINE; |
| 230 | m_mouse.yb = m_mouse.y > m_mouse.prev_y ? CLEAR_LINE : ASSERT_LINE; |
| 231 | break; |
| 232 | case 3: |
| 233 | m_mouse.xa = m_mouse.xb = ASSERT_LINE; |
| 234 | m_mouse.ya = m_mouse.yb = ASSERT_LINE; |
| 235 | m_mouse.prev_x = m_mouse.x; |
| 236 | m_mouse.prev_y = m_mouse.y; |
| 237 | m_mouse.x = m_mouse_x->read(); |
| 238 | m_mouse.y = m_mouse_y->read(); |
| 239 | break; |
| 240 | } |
| 241 | |
| 242 | m_mouse.phase = (m_mouse.phase + 1) & 3; |
| 243 | } |