trunk/src/mame/video/gameplan.c
r18175 | r18176 | |
114 | 114 | * |
115 | 115 | *************************************/ |
116 | 116 | |
117 | | static WRITE8_DEVICE_HANDLER( video_data_w ) |
| 117 | WRITE8_MEMBER(gameplan_state::video_data_w) |
118 | 118 | { |
119 | | gameplan_state *state = space.machine().driver_data<gameplan_state>(); |
120 | 119 | |
121 | | state->m_video_data = data; |
| 120 | m_video_data = data; |
122 | 121 | } |
123 | 122 | |
124 | 123 | |
125 | | static WRITE8_DEVICE_HANDLER( gameplan_video_command_w ) |
| 124 | WRITE8_MEMBER(gameplan_state::gameplan_video_command_w) |
126 | 125 | { |
127 | | gameplan_state *state = space.machine().driver_data<gameplan_state>(); |
128 | 126 | |
129 | | state->m_video_command = data & 0x07; |
| 127 | m_video_command = data & 0x07; |
130 | 128 | } |
131 | 129 | |
132 | 130 | |
133 | | static WRITE8_DEVICE_HANDLER( leprechn_video_command_w ) |
| 131 | WRITE8_MEMBER(gameplan_state::leprechn_video_command_w) |
134 | 132 | { |
135 | | gameplan_state *state = space.machine().driver_data<gameplan_state>(); |
136 | 133 | |
137 | | state->m_video_command = (data >> 3) & 0x07; |
| 134 | m_video_command = (data >> 3) & 0x07; |
138 | 135 | } |
139 | 136 | |
140 | 137 | |
r18175 | r18176 | |
146 | 143 | } |
147 | 144 | |
148 | 145 | |
149 | | static WRITE_LINE_DEVICE_HANDLER( video_command_trigger_w ) |
| 146 | WRITE_LINE_MEMBER(gameplan_state::video_command_trigger_w) |
150 | 147 | { |
151 | | gameplan_state *driver_state = device->machine().driver_data<gameplan_state>(); |
152 | 148 | |
153 | 149 | if (state == 0) |
154 | 150 | { |
155 | | switch (driver_state->m_video_command) |
| 151 | switch (m_video_command) |
156 | 152 | { |
157 | 153 | /* draw pixel */ |
158 | 154 | case 0: |
159 | 155 | /* auto-adjust X? */ |
160 | | if (driver_state->m_video_data & 0x10) |
| 156 | if (m_video_data & 0x10) |
161 | 157 | { |
162 | | if (driver_state->m_video_data & 0x40) |
163 | | driver_state->m_video_x = driver_state->m_video_x - 1; |
| 158 | if (m_video_data & 0x40) |
| 159 | m_video_x = m_video_x - 1; |
164 | 160 | else |
165 | | driver_state->m_video_x = driver_state->m_video_x + 1; |
| 161 | m_video_x = m_video_x + 1; |
166 | 162 | } |
167 | 163 | |
168 | 164 | /* auto-adjust Y? */ |
169 | | if (driver_state->m_video_data & 0x20) |
| 165 | if (m_video_data & 0x20) |
170 | 166 | { |
171 | | if (driver_state->m_video_data & 0x80) |
172 | | driver_state->m_video_y = driver_state->m_video_y - 1; |
| 167 | if (m_video_data & 0x80) |
| 168 | m_video_y = m_video_y - 1; |
173 | 169 | else |
174 | | driver_state->m_video_y = driver_state->m_video_y + 1; |
| 170 | m_video_y = m_video_y + 1; |
175 | 171 | } |
176 | 172 | |
177 | | driver_state->m_videoram[driver_state->m_video_y * (HBSTART - HBEND) + driver_state->m_video_x] = driver_state->m_video_data & 0x0f; |
| 173 | m_videoram[m_video_y * (HBSTART - HBEND) + m_video_x] = m_video_data & 0x0f; |
178 | 174 | |
179 | 175 | break; |
180 | 176 | |
181 | 177 | /* load X register */ |
182 | 178 | case 1: |
183 | | driver_state->m_video_x = driver_state->m_video_data; |
| 179 | m_video_x = m_video_data; |
184 | 180 | break; |
185 | 181 | |
186 | 182 | /* load Y register */ |
187 | 183 | case 2: |
188 | | driver_state->m_video_y = driver_state->m_video_data; |
| 184 | m_video_y = m_video_data; |
189 | 185 | break; |
190 | 186 | |
191 | 187 | /* clear screen */ |
192 | 188 | case 3: |
193 | 189 | /* indicate that the we are busy */ |
194 | 190 | { |
195 | | driver_state->m_via_0->write_ca1(1); |
| 191 | m_via_0->write_ca1(1); |
196 | 192 | } |
197 | 193 | |
198 | | memset(driver_state->m_videoram, driver_state->m_video_data & 0x0f, driver_state->m_videoram_size); |
| 194 | memset(m_videoram, m_video_data & 0x0f, m_videoram_size); |
199 | 195 | |
200 | 196 | /* set a timer for an arbitrarily short period. |
201 | 197 | The real time it takes to clear to screen is not |
202 | 198 | important to the software */ |
203 | | device->machine().scheduler().synchronize(timer_expired_delegate(FUNC(gameplan_state::clear_screen_done_callback),driver_state)); |
| 199 | machine().scheduler().synchronize(timer_expired_delegate(FUNC(gameplan_state::clear_screen_done_callback),this)); |
204 | 200 | |
205 | 201 | break; |
206 | 202 | } |
r18175 | r18176 | |
224 | 220 | } |
225 | 221 | |
226 | 222 | |
227 | | static READ8_DEVICE_HANDLER( vblank_r ) |
| 223 | READ8_MEMBER(gameplan_state::vblank_r) |
228 | 224 | { |
229 | 225 | /* this is needed for trivia quest */ |
230 | 226 | return 0x20; |
r18175 | r18176 | |
233 | 229 | |
234 | 230 | const via6522_interface gameplan_via_0_interface = |
235 | 231 | { |
236 | | DEVCB_NULL, DEVCB_HANDLER(vblank_r), /*inputs : A/B */ |
| 232 | DEVCB_NULL, DEVCB_DRIVER_MEMBER(gameplan_state,vblank_r), /*inputs : A/B */ |
237 | 233 | DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, /*inputs : CA/B1,CA/B2 */ |
238 | | DEVCB_HANDLER(video_data_w), DEVCB_HANDLER(gameplan_video_command_w), /*outputs: A/B */ |
239 | | DEVCB_NULL, DEVCB_NULL, DEVCB_LINE(video_command_trigger_w), DEVCB_NULL, /*outputs: CA/B1,CA/B2 */ |
| 234 | DEVCB_DRIVER_MEMBER(gameplan_state,video_data_w), DEVCB_DRIVER_MEMBER(gameplan_state,gameplan_video_command_w), /*outputs: A/B */ |
| 235 | DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_LINE_MEMBER(gameplan_state,video_command_trigger_w), DEVCB_NULL, /*outputs: CA/B1,CA/B2 */ |
240 | 236 | DEVCB_LINE(via_irq) /*irq */ |
241 | 237 | }; |
242 | 238 | |
243 | 239 | |
244 | 240 | const via6522_interface leprechn_via_0_interface = |
245 | 241 | { |
246 | | DEVCB_NULL, DEVCB_HANDLER(vblank_r), /*inputs : A/B */ |
| 242 | DEVCB_NULL, DEVCB_DRIVER_MEMBER(gameplan_state,vblank_r), /*inputs : A/B */ |
247 | 243 | DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, /*inputs : CA/B1,CA/B2 */ |
248 | | DEVCB_HANDLER(video_data_w), DEVCB_HANDLER(leprechn_video_command_w), /*outputs: A/B */ |
249 | | DEVCB_NULL, DEVCB_NULL, DEVCB_LINE(video_command_trigger_w), DEVCB_NULL, /*outputs: CA/B1,CA/B2 */ |
| 244 | DEVCB_DRIVER_MEMBER(gameplan_state,video_data_w), DEVCB_DRIVER_MEMBER(gameplan_state,leprechn_video_command_w), /*outputs: A/B */ |
| 245 | DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_LINE_MEMBER(gameplan_state,video_command_trigger_w), DEVCB_NULL, /*outputs: CA/B1,CA/B2 */ |
250 | 246 | DEVCB_LINE(via_irq) /*irq */ |
251 | 247 | }; |
252 | 248 | |
253 | 249 | |
254 | 250 | const via6522_interface trvquest_via_0_interface = |
255 | 251 | { |
256 | | DEVCB_NULL, DEVCB_HANDLER(vblank_r), /*inputs : A/B */ |
| 252 | DEVCB_NULL, DEVCB_DRIVER_MEMBER(gameplan_state,vblank_r), /*inputs : A/B */ |
257 | 253 | DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, /*inputs : CA/B1,CA/B2 */ |
258 | | DEVCB_HANDLER(video_data_w), DEVCB_HANDLER(gameplan_video_command_w), /*outputs: A/B */ |
259 | | DEVCB_NULL, DEVCB_NULL, DEVCB_LINE(video_command_trigger_w), DEVCB_NULL, /*outputs: CA/B1,CA/B2 */ |
| 254 | DEVCB_DRIVER_MEMBER(gameplan_state,video_data_w), DEVCB_DRIVER_MEMBER(gameplan_state,gameplan_video_command_w), /*outputs: A/B */ |
| 255 | DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_LINE_MEMBER(gameplan_state,video_command_trigger_w), DEVCB_NULL, /*outputs: CA/B1,CA/B2 */ |
260 | 256 | DEVCB_NULL /*irq */ |
261 | 257 | }; |
262 | 258 | |
trunk/src/mame/video/vectrex.c
r18175 | r18176 | |
35 | 35 | A_Y, |
36 | 36 | }; |
37 | 37 | |
38 | | |
39 | 38 | /********************************************************************* |
40 | 39 | |
41 | | Prototypes |
42 | | |
43 | | *********************************************************************/ |
44 | | |
45 | | static DECLARE_WRITE8_DEVICE_HANDLER (v_via_pa_w); |
46 | | static DECLARE_WRITE8_DEVICE_HANDLER(v_via_pb_w); |
47 | | static DECLARE_WRITE8_DEVICE_HANDLER (v_via_ca2_w); |
48 | | static DECLARE_WRITE8_DEVICE_HANDLER (v_via_cb2_w); |
49 | | |
50 | | |
51 | | /********************************************************************* |
52 | | |
53 | 40 | Local variables |
54 | 41 | |
55 | 42 | *********************************************************************/ |
56 | 43 | |
57 | 44 | const via6522_interface vectrex_via6522_interface = |
58 | 45 | { |
59 | | DEVCB_HANDLER(vectrex_via_pa_r), DEVCB_HANDLER(vectrex_via_pb_r), /* read PA/B */ |
| 46 | DEVCB_DRIVER_MEMBER(vectrex_state,vectrex_via_pa_r), DEVCB_DRIVER_MEMBER(vectrex_state,vectrex_via_pb_r), /* read PA/B */ |
60 | 47 | DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, /* read ca1, cb1, ca2, cb2 */ |
61 | | DEVCB_HANDLER(v_via_pa_w), DEVCB_HANDLER(v_via_pb_w), /* write PA/B */ |
62 | | DEVCB_NULL, DEVCB_NULL, DEVCB_HANDLER(v_via_ca2_w), DEVCB_HANDLER(v_via_cb2_w), /* write ca1, cb1, ca2, cb2 */ |
| 48 | DEVCB_DRIVER_MEMBER(vectrex_state,v_via_pa_w), DEVCB_DRIVER_MEMBER(vectrex_state,v_via_pb_w), /* write PA/B */ |
| 49 | DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(vectrex_state,v_via_ca2_w), DEVCB_DRIVER_MEMBER(vectrex_state,v_via_cb2_w), /* write ca1, cb1, ca2, cb2 */ |
63 | 50 | DEVCB_LINE(vectrex_via_irq), /* IRQ */ |
64 | 51 | }; |
65 | 52 | |
r18175 | r18176 | |
317 | 304 | } |
318 | 305 | |
319 | 306 | |
320 | | static WRITE8_DEVICE_HANDLER(v_via_pb_w) |
| 307 | WRITE8_MEMBER(vectrex_state::v_via_pb_w) |
321 | 308 | { |
322 | | vectrex_state *state = space.machine().driver_data<vectrex_state>(); |
323 | 309 | if (!(data & 0x80)) |
324 | 310 | { |
325 | 311 | /* RAMP is active */ |
326 | | if ((state->m_ramp & 0x80)) |
| 312 | if ((m_ramp & 0x80)) |
327 | 313 | { |
328 | 314 | /* RAMP was inactive before */ |
329 | 315 | |
330 | | if (state->m_lightpen_down) |
| 316 | if (m_lightpen_down) |
331 | 317 | { |
332 | 318 | /* Simple lin. algebra to check if pen is near |
333 | 319 | * the line defined by (A_X,A_Y). |
r18175 | r18176 | |
348 | 334 | * a |
349 | 335 | */ |
350 | 336 | double a2, b2, ab, d2; |
351 | | ab = (state->m_pen_x - state->m_x_int) * state->m_analog[A_X] |
352 | | +(state->m_pen_y - state->m_y_int) * state->m_analog[A_Y]; |
| 337 | ab = (m_pen_x - m_x_int) * m_analog[A_X] |
| 338 | +(m_pen_y - m_y_int) * m_analog[A_Y]; |
353 | 339 | if (ab > 0) |
354 | 340 | { |
355 | | a2 = (double)(state->m_analog[A_X] * state->m_analog[A_X] |
356 | | +(double)state->m_analog[A_Y] * state->m_analog[A_Y]); |
357 | | b2 = (double)(state->m_pen_x - state->m_x_int) * (state->m_pen_x - state->m_x_int) |
358 | | +(double)(state->m_pen_y - state->m_y_int) * (state->m_pen_y - state->m_y_int); |
| 341 | a2 = (double)(m_analog[A_X] * m_analog[A_X] |
| 342 | +(double)m_analog[A_Y] * m_analog[A_Y]); |
| 343 | b2 = (double)(m_pen_x - m_x_int) * (m_pen_x - m_x_int) |
| 344 | +(double)(m_pen_y - m_y_int) * (m_pen_y - m_y_int); |
359 | 345 | d2 = b2 - ab * ab / a2; |
360 | | if (d2 < 2e10 && state->m_analog[A_Z] * state->m_blank > 0) |
361 | | state->m_lp_t->adjust(attotime::from_double(ab / a2 / (space.machine().device("maincpu")->unscaled_clock() * INT_PER_CLOCK))); |
| 346 | if (d2 < 2e10 && m_analog[A_Z] * m_blank > 0) |
| 347 | m_lp_t->adjust(attotime::from_double(ab / a2 / (machine().device("maincpu")->unscaled_clock() * INT_PER_CLOCK))); |
362 | 348 | } |
363 | 349 | } |
364 | 350 | } |
365 | 351 | |
366 | | if (!(data & 0x1) && (state->m_via_out[PORTB] & 0x1)) |
| 352 | if (!(data & 0x1) && (m_via_out[PORTB] & 0x1)) |
367 | 353 | { |
368 | 354 | /* MUX has been enabled */ |
369 | | space.machine().scheduler().timer_set(attotime::from_nsec(ANALOG_DELAY), timer_expired_delegate(FUNC(vectrex_state::update_signal),state)); |
| 355 | machine().scheduler().timer_set(attotime::from_nsec(ANALOG_DELAY), timer_expired_delegate(FUNC(vectrex_state::update_signal),this)); |
370 | 356 | } |
371 | 357 | } |
372 | 358 | else |
373 | 359 | { |
374 | 360 | /* RAMP is inactive */ |
375 | | if (!(state->m_ramp & 0x80)) |
| 361 | if (!(m_ramp & 0x80)) |
376 | 362 | { |
377 | 363 | /* Cancel running timer, line already finished */ |
378 | | if (state->m_lightpen_down) |
379 | | state->m_lp_t->adjust(attotime::never); |
| 364 | if (m_lightpen_down) |
| 365 | m_lp_t->adjust(attotime::never); |
380 | 366 | } |
381 | 367 | } |
382 | 368 | |
383 | 369 | /* Cartridge bank-switching */ |
384 | | if (state->m_64k_cart && ((data ^ state->m_via_out[PORTB]) & 0x40)) |
| 370 | if (m_64k_cart && ((data ^ m_via_out[PORTB]) & 0x40)) |
385 | 371 | { |
386 | | device_t &root_device = space.machine().root_device(); |
| 372 | device_t &root_device = machine().root_device(); |
387 | 373 | |
388 | 374 | root_device.membank("bank1")->set_base(root_device.memregion("maincpu")->base() + ((data & 0x40) ? 0x10000 : 0x0000)); |
389 | 375 | } |
r18175 | r18176 | |
391 | 377 | /* Sound */ |
392 | 378 | if (data & 0x10) |
393 | 379 | { |
394 | | device_t *ay8912 = space.machine().device("ay8912"); |
| 380 | device_t *ay8912 = machine().device("ay8912"); |
395 | 381 | |
396 | 382 | if (data & 0x08) /* BC1 (do we select a reg or write it ?) */ |
397 | | ay8910_address_w(ay8912, space, 0, state->m_via_out[PORTA]); |
| 383 | ay8910_address_w(ay8912, space, 0, m_via_out[PORTA]); |
398 | 384 | else |
399 | | ay8910_data_w(ay8912, space, 0, state->m_via_out[PORTA]); |
| 385 | ay8910_data_w(ay8912, space, 0, m_via_out[PORTA]); |
400 | 386 | } |
401 | 387 | |
402 | | if (!(data & 0x1) && (state->m_via_out[PORTB] & 0x1)) |
403 | | vectrex_multiplexer (space.machine(), (data >> 1) & 0x3); |
| 388 | if (!(data & 0x1) && (m_via_out[PORTB] & 0x1)) |
| 389 | vectrex_multiplexer (machine(), (data >> 1) & 0x3); |
404 | 390 | |
405 | | state->m_via_out[PORTB] = data; |
406 | | space.machine().scheduler().timer_set(attotime::from_nsec(ANALOG_DELAY), timer_expired_delegate(FUNC(vectrex_state::update_signal),state), data & 0x80, &state->m_ramp); |
| 391 | m_via_out[PORTB] = data; |
| 392 | machine().scheduler().timer_set(attotime::from_nsec(ANALOG_DELAY), timer_expired_delegate(FUNC(vectrex_state::update_signal),this), data & 0x80, &m_ramp); |
407 | 393 | } |
408 | 394 | |
409 | 395 | |
410 | | static WRITE8_DEVICE_HANDLER(v_via_pa_w) |
| 396 | WRITE8_MEMBER(vectrex_state::v_via_pa_w) |
411 | 397 | { |
412 | | vectrex_state *state = space.machine().driver_data<vectrex_state>(); |
413 | 398 | /* DAC output always goes to Y integrator */ |
414 | | state->m_via_out[PORTA] = data; |
415 | | space.machine().scheduler().timer_set(attotime::from_nsec(ANALOG_DELAY), timer_expired_delegate(FUNC(vectrex_state::update_signal),state), data, &state->m_analog[A_Y]); |
| 399 | m_via_out[PORTA] = data; |
| 400 | machine().scheduler().timer_set(attotime::from_nsec(ANALOG_DELAY), timer_expired_delegate(FUNC(vectrex_state::update_signal),this), data, &m_analog[A_Y]); |
416 | 401 | |
417 | | if (!(state->m_via_out[PORTB] & 0x1)) |
418 | | vectrex_multiplexer (space.machine(), (state->m_via_out[PORTB] >> 1) & 0x3); |
| 402 | if (!(m_via_out[PORTB] & 0x1)) |
| 403 | vectrex_multiplexer (machine(), (m_via_out[PORTB] >> 1) & 0x3); |
419 | 404 | } |
420 | 405 | |
421 | 406 | |
422 | | static WRITE8_DEVICE_HANDLER(v_via_ca2_w) |
| 407 | WRITE8_MEMBER(vectrex_state::v_via_ca2_w) |
423 | 408 | { |
424 | | vectrex_state *state = space.machine().driver_data<vectrex_state>(); |
425 | 409 | if (data == 0) |
426 | | space.machine().scheduler().timer_set(attotime::from_nsec(ANALOG_DELAY), timer_expired_delegate(FUNC(vectrex_state::vectrex_zero_integrators),state)); |
| 410 | machine().scheduler().timer_set(attotime::from_nsec(ANALOG_DELAY), timer_expired_delegate(FUNC(vectrex_state::vectrex_zero_integrators),this)); |
427 | 411 | } |
428 | 412 | |
429 | 413 | |
430 | | static WRITE8_DEVICE_HANDLER(v_via_cb2_w) |
| 414 | WRITE8_MEMBER(vectrex_state::v_via_cb2_w) |
431 | 415 | { |
432 | | vectrex_state *state = space.machine().driver_data<vectrex_state>(); |
433 | 416 | int dx, dy; |
434 | 417 | |
435 | | if (state->m_cb2 != data) |
| 418 | if (m_cb2 != data) |
436 | 419 | { |
437 | 420 | |
438 | 421 | /* Check lightpen */ |
439 | | if (state->m_lightpen_port != 0) |
| 422 | if (m_lightpen_port != 0) |
440 | 423 | { |
441 | | state->m_lightpen_down = state->ioport("LPENCONF")->read() & 0x10; |
| 424 | m_lightpen_down = ioport("LPENCONF")->read() & 0x10; |
442 | 425 | |
443 | | if (state->m_lightpen_down) |
| 426 | if (m_lightpen_down) |
444 | 427 | { |
445 | | state->m_pen_x = state->ioport("LPENX")->read() * (state->m_x_max / 0xff); |
446 | | state->m_pen_y = state->ioport("LPENY")->read() * (state->m_y_max / 0xff); |
| 428 | m_pen_x = ioport("LPENX")->read() * (m_x_max / 0xff); |
| 429 | m_pen_y = ioport("LPENY")->read() * (m_y_max / 0xff); |
447 | 430 | |
448 | | dx = abs(state->m_pen_x - state->m_x_int); |
449 | | dy = abs(state->m_pen_y - state->m_y_int); |
| 431 | dx = abs(m_pen_x - m_x_int); |
| 432 | dy = abs(m_pen_y - m_y_int); |
450 | 433 | if (dx < 500000 && dy < 500000 && data > 0) |
451 | | space.machine().scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(vectrex_state::lightpen_trigger),state)); |
| 434 | machine().scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(vectrex_state::lightpen_trigger),this)); |
452 | 435 | } |
453 | 436 | } |
454 | 437 | |
455 | | space.machine().scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(vectrex_state::update_signal),state), data, &state->m_blank); |
456 | | state->m_cb2 = data; |
| 438 | machine().scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(vectrex_state::update_signal),this), data, &m_blank); |
| 439 | m_cb2 = data; |
457 | 440 | } |
458 | 441 | } |
459 | 442 | |
r18175 | r18176 | |
466 | 449 | |
467 | 450 | const via6522_interface spectrum1_via6522_interface = |
468 | 451 | { |
469 | | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_HANDLER(vectrex_via_pa_r), DEVCB_HANDLER(vectrex_s1_via_pb_r), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
470 | | /*outputs: A/B,CA/B1,CA/B2 */ DEVCB_HANDLER(v_via_pa_w), DEVCB_HANDLER(v_via_pb_w), DEVCB_NULL, DEVCB_NULL, DEVCB_HANDLER(v_via_ca2_w), DEVCB_HANDLER(v_via_cb2_w), |
| 452 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_DRIVER_MEMBER(vectrex_state,vectrex_via_pa_r), DEVCB_DRIVER_MEMBER(vectrex_state,vectrex_s1_via_pb_r), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
| 453 | /*outputs: A/B,CA/B1,CA/B2 */ DEVCB_DRIVER_MEMBER(vectrex_state,v_via_pa_w), DEVCB_DRIVER_MEMBER(vectrex_state,v_via_pb_w), DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(vectrex_state,v_via_ca2_w), DEVCB_DRIVER_MEMBER(vectrex_state,v_via_cb2_w), |
471 | 454 | /*irq */ DEVCB_LINE(vectrex_via_irq), |
472 | 455 | }; |
473 | 456 | |
trunk/src/mame/machine/williams.c
r18175 | r18176 | |
19 | 19 | static void williams_main_firq(device_t *device, int state); |
20 | 20 | static void williams_snd_irq(device_t *device, int state); |
21 | 21 | static void williams_snd_irq_b(device_t *device, int state); |
22 | | static DECLARE_WRITE8_DEVICE_HANDLER( williams_snd_cmd_w ); |
23 | | static DECLARE_WRITE8_DEVICE_HANDLER( playball_snd_cmd_w ); |
24 | | static DECLARE_WRITE8_DEVICE_HANDLER( blaster_snd_cmd_w ); |
25 | 22 | |
26 | | /* input port mapping */ |
27 | | static DECLARE_WRITE8_DEVICE_HANDLER( williams_port_select_w ); |
28 | | static DECLARE_READ8_DEVICE_HANDLER( williams_input_port_49way_0_5_r ); |
29 | | static DECLARE_READ8_DEVICE_HANDLER( williams_49way_port_0_r ); |
30 | | |
31 | 23 | /* newer-Williams routines */ |
32 | | static DECLARE_WRITE8_DEVICE_HANDLER( williams2_snd_cmd_w ); |
33 | 24 | static void mysticm_main_irq(device_t *device, int state); |
34 | 25 | static void tshoot_main_irq(device_t *device, int state); |
35 | 26 | |
36 | | /* Lotto Fun-specific code */ |
37 | | static DECLARE_WRITE8_DEVICE_HANDLER( lottofun_coin_lock_w ); |
38 | 27 | |
39 | | /* Turkey Shoot-specific code */ |
40 | | static DECLARE_READ8_DEVICE_HANDLER( tshoot_input_port_0_3_r ); |
41 | | static DECLARE_WRITE8_DEVICE_HANDLER( tshoot_lamp_w ); |
42 | | static DECLARE_WRITE8_DEVICE_HANDLER( tshoot_maxvol_w ); |
43 | 28 | |
44 | | /* Joust 2-specific code */ |
45 | | static DECLARE_WRITE8_DEVICE_HANDLER( joust2_snd_cmd_w ); |
46 | | static DECLARE_WRITE8_DEVICE_HANDLER( joust2_pia_3_cb1_w ); |
47 | | |
48 | | |
49 | 29 | /************************************* |
50 | 30 | * |
51 | 31 | * Generic old-Williams PIA interfaces |
r18175 | r18176 | |
66 | 46 | const pia6821_interface williams_muxed_pia_0_intf = |
67 | 47 | { |
68 | 48 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_INPUT_PORT("IN0"), DEVCB_INPUT_PORT("IN1"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
69 | | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_HANDLER(williams_port_select_w), |
| 49 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(williams_state,williams_port_select_w), |
70 | 50 | /*irqs : A/B */ DEVCB_NULL, DEVCB_NULL |
71 | 51 | }; |
72 | 52 | |
73 | 53 | /* Generic 49-way joystick PIA 0 for Sinistar/Blaster */ |
74 | 54 | const pia6821_interface williams_49way_pia_0_intf = |
75 | 55 | { |
76 | | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_HANDLER(williams_49way_port_0_r), DEVCB_INPUT_PORT("IN1"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
| 56 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_DRIVER_MEMBER(williams_state,williams_49way_port_0_r), DEVCB_INPUT_PORT("IN1"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
77 | 57 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
78 | 58 | /*irqs : A/B */ DEVCB_NULL, DEVCB_NULL |
79 | 59 | }; |
r18175 | r18176 | |
81 | 61 | /* Muxing 49-way joystick PIA 0 for Blaster kit */ |
82 | 62 | const pia6821_interface williams_49way_muxed_pia_0_intf = |
83 | 63 | { |
84 | | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_HANDLER(williams_input_port_49way_0_5_r), DEVCB_INPUT_PORT("IN1"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
85 | | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_HANDLER(williams_port_select_w), |
| 64 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_DRIVER_MEMBER(williams_state,williams_input_port_49way_0_5_r), DEVCB_INPUT_PORT("IN1"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
| 65 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(williams_state,williams_port_select_w), |
86 | 66 | /*irqs : A/B */ DEVCB_NULL, DEVCB_NULL |
87 | 67 | }; |
88 | 68 | |
r18175 | r18176 | |
90 | 70 | const pia6821_interface williams_pia_1_intf = |
91 | 71 | { |
92 | 72 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_INPUT_PORT("IN2"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
93 | | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_HANDLER(williams_snd_cmd_w), DEVCB_NULL, DEVCB_NULL, |
| 73 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_DRIVER_MEMBER(williams_state,williams_snd_cmd_w), DEVCB_NULL, DEVCB_NULL, |
94 | 74 | /*irqs : A/B */ DEVCB_LINE(williams_main_irq), DEVCB_LINE(williams_main_irq) |
95 | 75 | }; |
96 | 76 | |
r18175 | r18176 | |
121 | 101 | const pia6821_interface lottofun_pia_0_intf = |
122 | 102 | { |
123 | 103 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_INPUT_PORT("IN0"), DEVCB_INPUT_PORT("IN1"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
124 | | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_DEVICE_MEMBER("ticket", ticket_dispenser_device, write), DEVCB_HANDLER(lottofun_coin_lock_w), DEVCB_NULL, |
| 104 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_DEVICE_MEMBER("ticket", ticket_dispenser_device, write), DEVCB_DRIVER_MEMBER(williams_state,lottofun_coin_lock_w), DEVCB_NULL, |
125 | 105 | /*irqs : A/B */ DEVCB_NULL, DEVCB_NULL |
126 | 106 | }; |
127 | 107 | |
r18175 | r18176 | |
137 | 117 | const pia6821_interface playball_pia_1_intf = |
138 | 118 | { |
139 | 119 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_INPUT_PORT("IN2"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
140 | | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_HANDLER(playball_snd_cmd_w), DEVCB_NULL, DEVCB_NULL, |
| 120 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_DRIVER_MEMBER(williams_state,playball_snd_cmd_w), DEVCB_NULL, DEVCB_NULL, |
141 | 121 | /*irqs : A/B */ DEVCB_LINE(williams_main_irq), DEVCB_LINE(williams_main_irq) |
142 | 122 | }; |
143 | 123 | |
r18175 | r18176 | |
145 | 125 | const pia6821_interface blaster_pia_1_intf = |
146 | 126 | { |
147 | 127 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_INPUT_PORT("IN2"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
148 | | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_HANDLER(blaster_snd_cmd_w), DEVCB_NULL, DEVCB_NULL, |
| 128 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_DRIVER_MEMBER(williams_state,blaster_snd_cmd_w), DEVCB_NULL, DEVCB_NULL, |
149 | 129 | /*irqs : A/B */ DEVCB_LINE(williams_main_irq), DEVCB_LINE(williams_main_irq) |
150 | 130 | }; |
151 | 131 | |
r18175 | r18176 | |
169 | 149 | const pia6821_interface williams2_muxed_pia_0_intf = |
170 | 150 | { |
171 | 151 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_INPUT_PORT("IN0"), DEVCB_INPUT_PORT("IN1"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
172 | | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_HANDLER(williams_port_select_w), DEVCB_NULL, |
| 152 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(williams_state,williams_port_select_w), DEVCB_NULL, |
173 | 153 | /*irqs : A/B */ DEVCB_NULL, DEVCB_NULL |
174 | 154 | }; |
175 | 155 | |
r18175 | r18176 | |
177 | 157 | const pia6821_interface williams2_pia_1_intf = |
178 | 158 | { |
179 | 159 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_INPUT_PORT("IN2"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
180 | | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_HANDLER(williams2_snd_cmd_w), DEVCB_NULL, DEVCB_DEVICE_LINE_MEMBER("pia_2", pia6821_device, ca1_w), |
| 160 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_DRIVER_MEMBER(williams_state,williams2_snd_cmd_w), DEVCB_NULL, DEVCB_DEVICE_LINE_MEMBER("pia_2", pia6821_device, ca1_w), |
181 | 161 | /*irqs : A/B */ DEVCB_LINE(williams_main_irq), DEVCB_LINE(williams_main_irq) |
182 | 162 | }; |
183 | 163 | |
r18175 | r18176 | |
209 | 189 | const pia6821_interface mysticm_pia_1_intf = |
210 | 190 | { |
211 | 191 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_INPUT_PORT("IN2"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
212 | | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_HANDLER(williams2_snd_cmd_w), DEVCB_NULL, DEVCB_DEVICE_LINE_MEMBER("pia_2", pia6821_device, ca1_w), |
| 192 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_DRIVER_MEMBER(williams_state,williams2_snd_cmd_w), DEVCB_NULL, DEVCB_DEVICE_LINE_MEMBER("pia_2", pia6821_device, ca1_w), |
213 | 193 | /*irqs : A/B */ DEVCB_LINE(mysticm_main_irq), DEVCB_LINE(mysticm_main_irq) |
214 | 194 | }; |
215 | 195 | |
216 | 196 | /* Turkey Shoot PIA 0 */ |
217 | 197 | const pia6821_interface tshoot_pia_0_intf = |
218 | 198 | { |
219 | | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_HANDLER(tshoot_input_port_0_3_r), DEVCB_INPUT_PORT("IN1"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
220 | | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_HANDLER(tshoot_lamp_w), DEVCB_HANDLER(williams_port_select_w), DEVCB_NULL, |
| 199 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_DRIVER_MEMBER(williams_state,tshoot_input_port_0_3_r), DEVCB_INPUT_PORT("IN1"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
| 200 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_DRIVER_MEMBER(williams_state,tshoot_lamp_w), DEVCB_DRIVER_MEMBER(williams_state,williams_port_select_w), DEVCB_NULL, |
221 | 201 | /*irqs : A/B */ DEVCB_LINE(tshoot_main_irq), DEVCB_LINE(tshoot_main_irq) |
222 | 202 | }; |
223 | 203 | |
r18175 | r18176 | |
225 | 205 | const pia6821_interface tshoot_pia_1_intf = |
226 | 206 | { |
227 | 207 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_INPUT_PORT("IN2"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
228 | | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_HANDLER(williams2_snd_cmd_w), DEVCB_NULL, DEVCB_DEVICE_LINE_MEMBER("pia_2", pia6821_device, ca1_w), |
| 208 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_DRIVER_MEMBER(williams_state,williams2_snd_cmd_w), DEVCB_NULL, DEVCB_DEVICE_LINE_MEMBER("pia_2", pia6821_device, ca1_w), |
229 | 209 | /*irqs : A/B */ DEVCB_LINE(tshoot_main_irq), DEVCB_LINE(tshoot_main_irq) |
230 | 210 | }; |
231 | 211 | |
r18175 | r18176 | |
233 | 213 | const pia6821_interface tshoot_snd_pia_intf = |
234 | 214 | { |
235 | 215 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
236 | | /*outputs: A/B,CA/B2 */ DEVCB_DEVICE_MEMBER("pia_1", pia6821_device, portb_w), DEVCB_DEVICE_MEMBER("wmsdac", dac_device, write_unsigned8), DEVCB_DEVICE_LINE_MEMBER("pia_1", pia6821_device, cb1_w), DEVCB_HANDLER(tshoot_maxvol_w), |
| 216 | /*outputs: A/B,CA/B2 */ DEVCB_DEVICE_MEMBER("pia_1", pia6821_device, portb_w), DEVCB_DEVICE_MEMBER("wmsdac", dac_device, write_unsigned8), DEVCB_DEVICE_LINE_MEMBER("pia_1", pia6821_device, cb1_w), DEVCB_DRIVER_MEMBER(williams_state,tshoot_maxvol_w), |
237 | 217 | /*irqs : A/B */ DEVCB_LINE(williams_snd_irq), DEVCB_LINE(williams_snd_irq) |
238 | 218 | }; |
239 | 219 | |
r18175 | r18176 | |
241 | 221 | const pia6821_interface joust2_pia_1_intf = |
242 | 222 | { |
243 | 223 | /*inputs : A/B,CA/B1,CA/B2 */ DEVCB_INPUT_PORT("IN2"), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, |
244 | | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_HANDLER(joust2_snd_cmd_w), DEVCB_HANDLER(joust2_pia_3_cb1_w), DEVCB_DEVICE_LINE_MEMBER("pia_2", pia6821_device, ca1_w), |
| 224 | /*outputs: A/B,CA/B2 */ DEVCB_NULL, DEVCB_DRIVER_MEMBER(joust2_state,joust2_snd_cmd_w), DEVCB_DRIVER_MEMBER(joust2_state,joust2_pia_3_cb1_w), DEVCB_DEVICE_LINE_MEMBER("pia_2", pia6821_device, ca1_w), |
245 | 225 | /*irqs : A/B */ DEVCB_LINE(williams_main_irq), DEVCB_LINE(williams_main_irq) |
246 | 226 | }; |
247 | 227 | |
r18175 | r18176 | |
558 | 538 | pia_2->cb1_w((param == 0xff) ? 0 : 1); |
559 | 539 | } |
560 | 540 | |
561 | | WRITE8_DEVICE_HANDLER( williams_snd_cmd_w ) |
| 541 | WRITE8_MEMBER(williams_state::williams_snd_cmd_w) |
562 | 542 | { |
563 | | williams_state *state = device->machine().driver_data<williams_state>(); |
564 | 543 | /* the high two bits are set externally, and should be 1 */ |
565 | | space.machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::williams_deferred_snd_cmd_w),state), data | 0xc0); |
| 544 | machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::williams_deferred_snd_cmd_w),this), data | 0xc0); |
566 | 545 | } |
567 | 546 | |
568 | | WRITE8_DEVICE_HANDLER( playball_snd_cmd_w ) |
| 547 | WRITE8_MEMBER(williams_state::playball_snd_cmd_w) |
569 | 548 | { |
570 | | williams_state *state = device->machine().driver_data<williams_state>(); |
571 | | space.machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::williams_deferred_snd_cmd_w),state), data); |
| 549 | machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::williams_deferred_snd_cmd_w),this), data); |
572 | 550 | } |
573 | 551 | |
574 | 552 | TIMER_CALLBACK_MEMBER(williams_state::blaster_deferred_snd_cmd_w) |
r18175 | r18176 | |
582 | 560 | pia_2r->portb_w(r_data); pia_2r->cb1_w((r_data == 0xff) ? 0 : 1); |
583 | 561 | } |
584 | 562 | |
585 | | WRITE8_DEVICE_HANDLER( blaster_snd_cmd_w ) |
| 563 | WRITE8_MEMBER(williams_state::blaster_snd_cmd_w) |
586 | 564 | { |
587 | | williams_state *state = device->machine().driver_data<williams_state>(); |
588 | | space.machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::blaster_deferred_snd_cmd_w),state), data); |
| 565 | machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::blaster_deferred_snd_cmd_w),this), data); |
589 | 566 | } |
590 | 567 | |
591 | 568 | |
r18175 | r18176 | |
596 | 573 | pia_2->porta_w(param); |
597 | 574 | } |
598 | 575 | |
599 | | static WRITE8_DEVICE_HANDLER( williams2_snd_cmd_w ) |
| 576 | WRITE8_MEMBER(williams_state::williams2_snd_cmd_w) |
600 | 577 | { |
601 | | williams_state *state = device->machine().driver_data<williams_state>(); |
602 | | space.machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::williams2_deferred_snd_cmd_w),state), data); |
| 578 | machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::williams2_deferred_snd_cmd_w),this), data); |
603 | 579 | } |
604 | 580 | |
605 | 581 | |
r18175 | r18176 | |
610 | 586 | * |
611 | 587 | *************************************/ |
612 | 588 | |
613 | | WRITE8_DEVICE_HANDLER( williams_port_select_w ) |
| 589 | WRITE8_MEMBER(williams_state::williams_port_select_w) |
614 | 590 | { |
615 | | williams_state *state = space.machine().driver_data<williams_state>(); |
616 | | state->m_port_select = data; |
| 591 | m_port_select = data; |
617 | 592 | } |
618 | 593 | |
619 | 594 | CUSTOM_INPUT_MEMBER(williams_state::williams_mux_r) |
r18175 | r18176 | |
651 | 626 | * 1000 = right/down full |
652 | 627 | */ |
653 | 628 | |
654 | | READ8_DEVICE_HANDLER( williams_49way_port_0_r ) |
| 629 | READ8_MEMBER(williams_state::williams_49way_port_0_r) |
655 | 630 | { |
656 | 631 | static const UINT8 translate49[7] = { 0x0, 0x4, 0x6, 0x7, 0xb, 0x9, 0x8 }; |
657 | | return (translate49[space.machine().root_device().ioport("49WAYX")->read() >> 4] << 4) | translate49[space.machine().root_device().ioport("49WAYY")->read() >> 4]; |
| 632 | return (translate49[machine().root_device().ioport("49WAYX")->read() >> 4] << 4) | translate49[machine().root_device().ioport("49WAYY")->read() >> 4]; |
658 | 633 | } |
659 | 634 | |
660 | 635 | |
661 | | READ8_DEVICE_HANDLER( williams_input_port_49way_0_5_r ) |
| 636 | READ8_MEMBER(williams_state::williams_input_port_49way_0_5_r) |
662 | 637 | { |
663 | | williams_state *state = space.machine().driver_data<williams_state>(); |
664 | | if (state->m_port_select) |
665 | | return williams_49way_port_0_r(device, space, 0); |
| 638 | if (m_port_select) |
| 639 | return williams_49way_port_0_r(space, 0); |
666 | 640 | else |
667 | | return state->ioport("IN3")->read(); |
| 641 | return ioport("IN3")->read(); |
668 | 642 | } |
669 | 643 | |
670 | 644 | |
r18175 | r18176 | |
929 | 903 | * |
930 | 904 | *************************************/ |
931 | 905 | |
932 | | static WRITE8_DEVICE_HANDLER( lottofun_coin_lock_w ) |
| 906 | WRITE8_MEMBER(williams_state::lottofun_coin_lock_w) |
933 | 907 | { |
934 | | coin_lockout_global_w(space.machine(), data & 1); /* bit 5 of PIC control port A */ |
| 908 | coin_lockout_global_w(machine(), data & 1); /* bit 5 of PIC control port A */ |
935 | 909 | } |
936 | 910 | |
937 | 911 | |
r18175 | r18176 | |
942 | 916 | * |
943 | 917 | *************************************/ |
944 | 918 | |
945 | | static READ8_DEVICE_HANDLER( tshoot_input_port_0_3_r ) |
| 919 | READ8_MEMBER(williams_state::tshoot_input_port_0_3_r) |
946 | 920 | { |
947 | 921 | /* merge in the gun inputs with the standard data */ |
948 | | int data = space.machine().root_device().ioport("IN0")->read(); |
| 922 | int data = machine().root_device().ioport("IN0")->read(); |
949 | 923 | int gun = (data & 0x3f) ^ ((data & 0x3f) >> 1); |
950 | 924 | return (data & 0xc0) | gun; |
951 | 925 | |
r18175 | r18176 | |
954 | 928 | } |
955 | 929 | |
956 | 930 | |
957 | | static WRITE8_DEVICE_HANDLER( tshoot_maxvol_w ) |
| 931 | WRITE8_MEMBER(williams_state::tshoot_maxvol_w) |
958 | 932 | { |
959 | 933 | /* something to do with the sound volume */ |
960 | | logerror("tshoot maxvol = %d (%s)\n", data, space.machine().describe_context()); |
| 934 | logerror("tshoot maxvol = %d (%s)\n", data, machine().describe_context()); |
961 | 935 | } |
962 | 936 | |
963 | 937 | |
964 | | static WRITE8_DEVICE_HANDLER( tshoot_lamp_w ) |
| 938 | WRITE8_MEMBER(williams_state::tshoot_lamp_w) |
965 | 939 | { |
966 | 940 | /* set the grenade lamp */ |
967 | 941 | output_set_value("Grenade_lamp", (~data & 0x4)>>2 ); |
r18175 | r18176 | |
1002 | 976 | } |
1003 | 977 | |
1004 | 978 | |
1005 | | static WRITE8_DEVICE_HANDLER( joust2_pia_3_cb1_w ) |
| 979 | WRITE8_MEMBER(joust2_state::joust2_pia_3_cb1_w) |
1006 | 980 | { |
1007 | | joust2_state *state = space.machine().driver_data<joust2_state>(); |
1008 | | state->m_joust2_current_sound_data = (state->m_joust2_current_sound_data & ~0x100) | ((data << 8) & 0x100); |
1009 | | state->m_cvsd_sound->write(space.machine().driver_data()->generic_space(), 0, state->m_joust2_current_sound_data); |
| 981 | m_joust2_current_sound_data = (m_joust2_current_sound_data & ~0x100) | ((data << 8) & 0x100); |
| 982 | m_cvsd_sound->write(machine().driver_data()->generic_space(), 0, m_joust2_current_sound_data); |
1010 | 983 | } |
1011 | 984 | |
1012 | 985 | |
1013 | | static WRITE8_DEVICE_HANDLER( joust2_snd_cmd_w ) |
| 986 | WRITE8_MEMBER(joust2_state::joust2_snd_cmd_w) |
1014 | 987 | { |
1015 | | joust2_state *state = space.machine().driver_data<joust2_state>(); |
1016 | | state->m_joust2_current_sound_data = (state->m_joust2_current_sound_data & ~0xff) | (data & 0xff); |
1017 | | state->m_cvsd_sound->write(space.machine().driver_data()->generic_space(), 0, state->m_joust2_current_sound_data); |
1018 | | space.machine().scheduler().synchronize(timer_expired_delegate(FUNC(joust2_state::joust2_deferred_snd_cmd_w),state), state->m_joust2_current_sound_data); |
| 988 | m_joust2_current_sound_data = (m_joust2_current_sound_data & ~0xff) | (data & 0xff); |
| 989 | m_cvsd_sound->write(machine().driver_data()->generic_space(), 0, m_joust2_current_sound_data); |
| 990 | machine().scheduler().synchronize(timer_expired_delegate(FUNC(joust2_state::joust2_deferred_snd_cmd_w),this), m_joust2_current_sound_data); |
1019 | 991 | } |
trunk/src/mame/machine/carpolo.c
r18175 | r18176 | |
287 | 287 | |
288 | 288 | // FIXME: Remove trampolines |
289 | 289 | |
290 | | static WRITE_LINE_DEVICE_HANDLER( coin1_interrupt_clear_w ) |
| 290 | WRITE_LINE_MEMBER(carpolo_state::coin1_interrupt_clear_w) |
291 | 291 | { |
292 | | carpolo_state *drvstate = device->machine().driver_data<carpolo_state>(); |
293 | | drvstate->m_ttl7474_2s_1->clear_w(state); |
| 292 | m_ttl7474_2s_1->clear_w(state); |
294 | 293 | } |
295 | 294 | |
296 | | static WRITE_LINE_DEVICE_HANDLER( coin2_interrupt_clear_w ) |
| 295 | WRITE_LINE_MEMBER(carpolo_state::coin2_interrupt_clear_w) |
297 | 296 | { |
298 | | carpolo_state *drvstate = device->machine().driver_data<carpolo_state>(); |
299 | | drvstate->m_ttl7474_2s_2->clear_w(state); |
| 297 | m_ttl7474_2s_2->clear_w(state); |
300 | 298 | } |
301 | 299 | |
302 | | static WRITE_LINE_DEVICE_HANDLER( coin3_interrupt_clear_w ) |
| 300 | WRITE_LINE_MEMBER(carpolo_state::coin3_interrupt_clear_w) |
303 | 301 | { |
304 | | carpolo_state *drvstate = device->machine().driver_data<carpolo_state>(); |
305 | | drvstate->m_ttl7474_2u_1->clear_w(state); |
| 302 | m_ttl7474_2u_1->clear_w(state); |
306 | 303 | } |
307 | 304 | |
308 | | static WRITE_LINE_DEVICE_HANDLER( coin4_interrupt_clear_w ) |
| 305 | WRITE_LINE_MEMBER(carpolo_state::coin4_interrupt_clear_w) |
309 | 306 | { |
310 | | carpolo_state *drvstate = device->machine().driver_data<carpolo_state>(); |
311 | | drvstate->m_ttl7474_2u_2->clear_w(state); |
| 307 | m_ttl7474_2u_2->clear_w(state); |
312 | 308 | } |
313 | 309 | |
314 | 310 | WRITE8_MEMBER(carpolo_state::carpolo_ball_screen_interrupt_clear_w) |
r18175 | r18176 | |
354 | 350 | * |
355 | 351 | *************************************/ |
356 | 352 | |
357 | | static WRITE8_DEVICE_HANDLER( pia_0_port_a_w ) |
| 353 | WRITE8_MEMBER(carpolo_state::pia_0_port_a_w) |
358 | 354 | { |
359 | | carpolo_state *state = space.machine().driver_data<carpolo_state>(); |
360 | 355 | /* bit 0 - Coin counter |
361 | 356 | bit 1 - Player 4 crash sound |
362 | 357 | bit 2 - Player 3 crash sound |
r18175 | r18176 | |
366 | 361 | bit 6 - Player 1 crash sound |
367 | 362 | bit 7 - Ball hit pulse sound */ |
368 | 363 | |
369 | | coin_counter_w(space.machine(), 0, data & 0x01); |
| 364 | coin_counter_w(machine(), 0, data & 0x01); |
370 | 365 | |
371 | 366 | |
372 | | state->m_ttl7474_1f_1->clear_w((data & 0x08) >> 3); |
373 | | state->m_ttl7474_1d_1->clear_w((data & 0x08) >> 3); |
374 | | state->m_ttl7474_1c_1->clear_w((data & 0x08) >> 3); |
375 | | state->m_ttl7474_1a_1->clear_w((data & 0x08) >> 3); |
| 367 | m_ttl7474_1f_1->clear_w((data & 0x08) >> 3); |
| 368 | m_ttl7474_1d_1->clear_w((data & 0x08) >> 3); |
| 369 | m_ttl7474_1c_1->clear_w((data & 0x08) >> 3); |
| 370 | m_ttl7474_1a_1->clear_w((data & 0x08) >> 3); |
376 | 371 | } |
377 | 372 | |
378 | 373 | |
379 | | static WRITE8_DEVICE_HANDLER( pia_0_port_b_w ) |
| 374 | WRITE8_MEMBER(carpolo_state::pia_0_port_b_w) |
380 | 375 | { |
381 | | carpolo_state *state = space.machine().driver_data<carpolo_state>(); |
382 | 376 | /* bit 0 - Strobe speed bits sound |
383 | 377 | bit 1 - Speed bit 0 sound |
384 | 378 | bit 2 - Speed bit 1 sound |
r18175 | r18176 | |
386 | 380 | bit 6 - Select pedal 0 |
387 | 381 | bit 7 - Select pdeal 1 */ |
388 | 382 | |
389 | | ttl74153_a_w(state->m_ttl74153_1k, data & 0x40); |
390 | | ttl74153_b_w(state->m_ttl74153_1k, data & 0x80); |
| 383 | ttl74153_a_w(m_ttl74153_1k, data & 0x40); |
| 384 | ttl74153_b_w(m_ttl74153_1k, data & 0x80); |
391 | 385 | |
392 | | ttl74153_update(state->m_ttl74153_1k); |
| 386 | ttl74153_update(m_ttl74153_1k); |
393 | 387 | } |
394 | 388 | |
395 | | static READ8_DEVICE_HANDLER( pia_0_port_b_r ) |
| 389 | READ8_MEMBER(carpolo_state::pia_0_port_b_r) |
396 | 390 | { |
397 | | carpolo_state *state = space.machine().driver_data<carpolo_state>(); |
398 | 391 | /* bit 4 - Pedal bit 0 |
399 | 392 | bit 5 - Pedal bit 1 */ |
400 | 393 | |
401 | | return (ttl74153_output_r(state->m_ttl74153_1k, 0) << 5) | |
402 | | (ttl74153_output_r(state->m_ttl74153_1k, 1) << 4); |
| 394 | return (ttl74153_output_r(m_ttl74153_1k, 0) << 5) | |
| 395 | (ttl74153_output_r(m_ttl74153_1k, 1) << 4); |
403 | 396 | } |
404 | 397 | |
405 | 398 | |
406 | | static READ8_DEVICE_HANDLER( pia_1_port_a_r ) |
| 399 | READ8_MEMBER(carpolo_state::pia_1_port_a_r) |
407 | 400 | { |
408 | | carpolo_state *state = space.machine().driver_data<carpolo_state>(); |
409 | 401 | UINT8 ret; |
410 | 402 | |
411 | 403 | /* bit 0 - Player 4 steering input (left or right) |
r18175 | r18176 | |
417 | 409 | bit 6 - Player 2 forward/reverse input |
418 | 410 | bit 7 - Player 1 forward/reverse input */ |
419 | 411 | |
420 | | ret = (state->m_ttl7474_1a_2->output_r() ? 0x01 : 0x00) | |
421 | | (state->m_ttl7474_1c_2->output_r() ? 0x02 : 0x00) | |
422 | | (state->m_ttl7474_1d_2->output_r() ? 0x04 : 0x00) | |
423 | | (state->m_ttl7474_1f_2->output_r() ? 0x08 : 0x00) | |
424 | | (state->ioport("IN2")->read() & 0xf0); |
| 412 | ret = (m_ttl7474_1a_2->output_r() ? 0x01 : 0x00) | |
| 413 | (m_ttl7474_1c_2->output_r() ? 0x02 : 0x00) | |
| 414 | (m_ttl7474_1d_2->output_r() ? 0x04 : 0x00) | |
| 415 | (m_ttl7474_1f_2->output_r() ? 0x08 : 0x00) | |
| 416 | (ioport("IN2")->read() & 0xf0); |
425 | 417 | |
426 | 418 | return ret; |
427 | 419 | } |
428 | 420 | |
429 | 421 | |
430 | | static READ8_DEVICE_HANDLER( pia_1_port_b_r ) |
| 422 | READ8_MEMBER(carpolo_state::pia_1_port_b_r) |
431 | 423 | { |
432 | | carpolo_state *state = space.machine().driver_data<carpolo_state>(); |
433 | 424 | UINT8 ret; |
434 | 425 | |
435 | 426 | /* bit 4 - Player 4 steering input (wheel moving or stopped) |
r18175 | r18176 | |
437 | 428 | bit 6 - Player 2 steering input (wheel moving or stopped) |
438 | 429 | bit 7 - Player 1 steering input (wheel moving or stopped) */ |
439 | 430 | |
440 | | ret = (state->m_ttl7474_1a_1->output_r() ? 0x10 : 0x00) | |
441 | | (state->m_ttl7474_1c_1->output_r() ? 0x20 : 0x00) | |
442 | | (state->m_ttl7474_1d_1->output_r() ? 0x40 : 0x00) | |
443 | | (state->m_ttl7474_1f_1->output_r() ? 0x80 : 0x00); |
| 431 | ret = (m_ttl7474_1a_1->output_r() ? 0x10 : 0x00) | |
| 432 | (m_ttl7474_1c_1->output_r() ? 0x20 : 0x00) | |
| 433 | (m_ttl7474_1d_1->output_r() ? 0x40 : 0x00) | |
| 434 | (m_ttl7474_1f_1->output_r() ? 0x80 : 0x00); |
444 | 435 | |
445 | 436 | return ret; |
446 | 437 | } |
r18175 | r18176 | |
449 | 440 | const pia6821_interface carpolo_pia0_intf = |
450 | 441 | { |
451 | 442 | DEVCB_NULL, /* port A in */ |
452 | | DEVCB_HANDLER(pia_0_port_b_r), /* port B in */ |
| 443 | DEVCB_DRIVER_MEMBER(carpolo_state,pia_0_port_b_r), /* port B in */ |
453 | 444 | DEVCB_NULL, /* line CA1 in */ |
454 | 445 | DEVCB_NULL, /* line CB1 in */ |
455 | 446 | DEVCB_NULL, /* line CA2 in */ |
456 | 447 | DEVCB_NULL, /* line CB2 in */ |
457 | | DEVCB_HANDLER(pia_0_port_a_w), /* port A out */ |
458 | | DEVCB_HANDLER(pia_0_port_b_w), /* port B out */ |
459 | | DEVCB_LINE(coin1_interrupt_clear_w), /* line CA2 out */ |
460 | | DEVCB_LINE(coin2_interrupt_clear_w), /* port CB2 out */ |
| 448 | DEVCB_DRIVER_MEMBER(carpolo_state,pia_0_port_a_w), /* port A out */ |
| 449 | DEVCB_DRIVER_MEMBER(carpolo_state,pia_0_port_b_w), /* port B out */ |
| 450 | DEVCB_DRIVER_LINE_MEMBER(carpolo_state,coin1_interrupt_clear_w), /* line CA2 out */ |
| 451 | DEVCB_DRIVER_LINE_MEMBER(carpolo_state,coin2_interrupt_clear_w), /* port CB2 out */ |
461 | 452 | DEVCB_NULL, /* IRQA */ |
462 | 453 | DEVCB_NULL /* IRQB */ |
463 | 454 | }; |
r18175 | r18176 | |
465 | 456 | |
466 | 457 | const pia6821_interface carpolo_pia1_intf = |
467 | 458 | { |
468 | | DEVCB_HANDLER(pia_1_port_a_r), /* port A in */ |
469 | | DEVCB_HANDLER(pia_1_port_b_r), /* port B in */ |
| 459 | DEVCB_DRIVER_MEMBER(carpolo_state,pia_1_port_a_r), /* port A in */ |
| 460 | DEVCB_DRIVER_MEMBER(carpolo_state,pia_1_port_b_r), /* port B in */ |
470 | 461 | DEVCB_NULL, /* line CA1 in */ |
471 | 462 | DEVCB_NULL, /* line CB1 in */ |
472 | 463 | DEVCB_NULL, /* line CA2 in */ |
473 | 464 | DEVCB_NULL, /* line CB2 in */ |
474 | 465 | DEVCB_NULL, /* port A out */ |
475 | 466 | DEVCB_NULL, /* port B out */ |
476 | | DEVCB_LINE(coin3_interrupt_clear_w), /* line CA2 out */ |
477 | | DEVCB_LINE(coin4_interrupt_clear_w), /* port CB2 out */ |
| 467 | DEVCB_DRIVER_LINE_MEMBER(carpolo_state,coin3_interrupt_clear_w), /* line CA2 out */ |
| 468 | DEVCB_DRIVER_LINE_MEMBER(carpolo_state,coin4_interrupt_clear_w), /* port CB2 out */ |
478 | 469 | DEVCB_NULL, /* IRQA */ |
479 | 470 | DEVCB_NULL /* IRQB */ |
480 | 471 | }; |
trunk/src/mame/machine/mcr68.c
r18175 | r18176 | |
21 | 21 | |
22 | 22 | static void subtract_from_counter(running_machine &machine, int counter, int count); |
23 | 23 | |
24 | | |
25 | | |
26 | | |
27 | | static DECLARE_WRITE8_DEVICE_HANDLER( zwackery_pia0_w ); |
28 | | static DECLARE_WRITE8_DEVICE_HANDLER( zwackery_pia1_w ); |
29 | | static WRITE_LINE_DEVICE_HANDLER( zwackery_ca2_w ); |
30 | | static WRITE_LINE_DEVICE_HANDLER( zwackery_pia_irq ); |
31 | | |
32 | | |
33 | | |
34 | | |
35 | | |
36 | 24 | /************************************* |
37 | 25 | * |
38 | 26 | * 6821 PIA declarations |
39 | 27 | * |
40 | 28 | *************************************/ |
41 | 29 | |
42 | | static READ8_DEVICE_HANDLER( zwackery_port_1_r ) |
| 30 | READ8_MEMBER(mcr68_state::zwackery_port_1_r) |
43 | 31 | { |
44 | | UINT8 ret = space.machine().root_device().ioport("IN1")->read(); |
| 32 | UINT8 ret = machine().root_device().ioport("IN1")->read(); |
45 | 33 | |
46 | | downcast<pia6821_device *>(device)->set_port_a_z_mask(ret); |
| 34 | downcast<pia6821_device *>(machine().device("pia1"))->set_port_a_z_mask(ret); |
47 | 35 | |
48 | 36 | return ret; |
49 | 37 | } |
50 | 38 | |
51 | 39 | |
52 | | static READ8_DEVICE_HANDLER( zwackery_port_3_r ) |
| 40 | READ8_MEMBER(mcr68_state::zwackery_port_3_r) |
53 | 41 | { |
54 | | UINT8 ret = space.machine().root_device().ioport("IN3")->read(); |
| 42 | UINT8 ret = machine().root_device().ioport("IN3")->read(); |
55 | 43 | |
56 | | downcast<pia6821_device *>(device)->set_port_a_z_mask(ret); |
| 44 | downcast<pia6821_device *>(machine().device("pia2"))->set_port_a_z_mask(ret); |
57 | 45 | |
58 | 46 | return ret; |
59 | 47 | } |
r18175 | r18176 | |
67 | 55 | DEVCB_NULL, /* line CB1 in */ |
68 | 56 | DEVCB_NULL, /* line CA2 in */ |
69 | 57 | DEVCB_NULL, /* line CB2 in */ |
70 | | DEVCB_HANDLER(zwackery_pia0_w), /* port A out */ |
| 58 | DEVCB_DRIVER_MEMBER(mcr68_state,zwackery_pia0_w), /* port A out */ |
71 | 59 | DEVCB_NULL, /* port B out */ |
72 | 60 | DEVCB_NULL, /* line CA2 out */ |
73 | 61 | DEVCB_NULL, /* port CB2 out */ |
74 | | DEVCB_LINE(zwackery_pia_irq), /* IRQA */ |
75 | | DEVCB_LINE(zwackery_pia_irq) /* IRQB */ |
| 62 | DEVCB_DRIVER_LINE_MEMBER(mcr68_state,zwackery_pia_irq), /* IRQA */ |
| 63 | DEVCB_DRIVER_LINE_MEMBER(mcr68_state,zwackery_pia_irq) /* IRQB */ |
76 | 64 | }; |
77 | 65 | |
78 | 66 | |
79 | 67 | const pia6821_interface zwackery_pia1_intf = |
80 | 68 | { |
81 | | DEVCB_HANDLER(zwackery_port_1_r), /* port A in */ |
| 69 | DEVCB_DRIVER_MEMBER(mcr68_state,zwackery_port_1_r), /* port A in */ |
82 | 70 | DEVCB_DRIVER_MEMBER(mcr68_state, zwackery_port_2_r), /* port B in */ |
83 | 71 | DEVCB_NULL, /* line CA1 in */ |
84 | 72 | DEVCB_NULL, /* line CB1 in */ |
85 | 73 | DEVCB_NULL, /* line CA2 in */ |
86 | 74 | DEVCB_NULL, /* line CB2 in */ |
87 | | DEVCB_HANDLER(zwackery_pia1_w), /* port A out */ |
| 75 | DEVCB_DRIVER_MEMBER(mcr68_state,zwackery_pia1_w), /* port A out */ |
88 | 76 | DEVCB_NULL, /* port B out */ |
89 | | DEVCB_LINE(zwackery_ca2_w), /* line CA2 out */ |
| 77 | DEVCB_DRIVER_LINE_MEMBER(mcr68_state,zwackery_ca2_w), /* line CA2 out */ |
90 | 78 | DEVCB_NULL, /* port CB2 out */ |
91 | 79 | DEVCB_NULL, /* IRQA */ |
92 | 80 | DEVCB_NULL /* IRQB */ |
r18175 | r18176 | |
95 | 83 | |
96 | 84 | const pia6821_interface zwackery_pia2_intf = |
97 | 85 | { |
98 | | DEVCB_HANDLER(zwackery_port_3_r), /* port A in */ |
| 86 | DEVCB_DRIVER_MEMBER(mcr68_state,zwackery_port_3_r), /* port A in */ |
99 | 87 | DEVCB_INPUT_PORT("DSW"), /* port B in */ |
100 | 88 | DEVCB_NULL, /* line CA1 in */ |
101 | 89 | DEVCB_NULL, /* line CB1 in */ |
r18175 | r18176 | |
263 | 251 | * |
264 | 252 | *************************************/ |
265 | 253 | |
266 | | WRITE8_DEVICE_HANDLER( zwackery_pia0_w ) |
| 254 | WRITE8_MEMBER(mcr68_state::zwackery_pia0_w) |
267 | 255 | { |
268 | 256 | /* bit 7 is the watchdog */ |
269 | | if (!(data & 0x80)) space.machine().watchdog_reset(); |
| 257 | if (!(data & 0x80)) machine().watchdog_reset(); |
270 | 258 | |
271 | 259 | /* bits 5 and 6 control hflip/vflip */ |
272 | 260 | /* bits 3 and 4 control coin counters? */ |
r18175 | r18176 | |
274 | 262 | } |
275 | 263 | |
276 | 264 | |
277 | | WRITE8_DEVICE_HANDLER( zwackery_pia1_w ) |
| 265 | WRITE8_MEMBER(mcr68_state::zwackery_pia1_w) |
278 | 266 | { |
279 | | mcr68_state *state = space.machine().driver_data<mcr68_state>(); |
280 | | state->m_zwackery_sound_data = (data >> 4) & 0x0f; |
| 267 | m_zwackery_sound_data = (data >> 4) & 0x0f; |
281 | 268 | } |
282 | 269 | |
283 | 270 | |
284 | | WRITE_LINE_DEVICE_HANDLER( zwackery_ca2_w ) |
| 271 | WRITE_LINE_MEMBER(mcr68_state::zwackery_ca2_w) |
285 | 272 | { |
286 | | mcr68_state *drvstate = device->machine().driver_data<mcr68_state>(); |
287 | | address_space &space = device->machine().device("maincpu")->memory().space(AS_PROGRAM); |
288 | | drvstate->m_chip_squeak_deluxe->write(space, 0, (state << 4) | drvstate->m_zwackery_sound_data); |
| 273 | address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM); |
| 274 | m_chip_squeak_deluxe->write(space, 0, (state << 4) | m_zwackery_sound_data); |
289 | 275 | } |
290 | 276 | |
291 | 277 | |
292 | | static WRITE_LINE_DEVICE_HANDLER( zwackery_pia_irq ) |
| 278 | WRITE_LINE_MEMBER(mcr68_state::zwackery_pia_irq) |
293 | 279 | { |
294 | | mcr68_state *drvstate = device->machine().driver_data<mcr68_state>(); |
295 | | pia6821_device *pia = downcast<pia6821_device *>(device); |
296 | | drvstate->m_v493_irq_state = pia->irq_a_state() | pia->irq_b_state(); |
297 | | update_mcr68_interrupts(device->machine()); |
| 280 | pia6821_device *pia = machine().device<pia6821_device>("pia0"); |
| 281 | m_v493_irq_state = pia->irq_a_state() | pia->irq_b_state(); |
| 282 | update_mcr68_interrupts(machine()); |
298 | 283 | } |
299 | 284 | |
300 | 285 | |
trunk/src/mame/machine/qix.c
r18175 | r18176 | |
13 | 13 | #include "includes/qix.h" |
14 | 14 | |
15 | 15 | |
16 | | |
17 | | |
18 | | |
19 | | /************************************* |
20 | | * |
21 | | * Static function prototypes |
22 | | * |
23 | | *************************************/ |
24 | | |
25 | | static DECLARE_READ8_DEVICE_HANDLER( qixmcu_coin_r ); |
26 | | static DECLARE_WRITE8_DEVICE_HANDLER( qixmcu_coinctrl_w ); |
27 | | static DECLARE_WRITE8_DEVICE_HANDLER( qixmcu_coin_w ); |
28 | | |
29 | | static DECLARE_WRITE8_DEVICE_HANDLER( qix_coinctl_w ); |
30 | | |
31 | | static DECLARE_WRITE8_DEVICE_HANDLER( slither_76489_0_w ); |
32 | | static DECLARE_WRITE8_DEVICE_HANDLER( slither_76489_1_w ); |
33 | | |
34 | | static DECLARE_READ8_DEVICE_HANDLER( slither_trak_lr_r ); |
35 | | static DECLARE_READ8_DEVICE_HANDLER( slither_trak_ud_r ); |
36 | | |
37 | | |
38 | | |
39 | 16 | /*************************************************************************** |
40 | 17 | |
41 | 18 | Qix has 6 PIAs on board: |
r18175 | r18176 | |
128 | 105 | DEVCB_NULL, /* line CA2 in */ |
129 | 106 | DEVCB_NULL, /* line CB2 in */ |
130 | 107 | DEVCB_NULL, /* port A out */ |
131 | | DEVCB_HANDLER(qix_coinctl_w), /* port B out */ |
| 108 | DEVCB_DRIVER_MEMBER(qix_state,qix_coinctl_w), /* port B out */ |
132 | 109 | DEVCB_NULL, /* line CA2 out */ |
133 | 110 | DEVCB_NULL, /* port CB2 out */ |
134 | 111 | DEVCB_NULL, /* IRQA */ |
r18175 | r18176 | |
147 | 124 | const pia6821_interface qixmcu_pia_0_intf = |
148 | 125 | { |
149 | 126 | DEVCB_INPUT_PORT("P1"), /* port A in */ |
150 | | DEVCB_HANDLER(qixmcu_coin_r), /* port B in */ |
| 127 | DEVCB_DRIVER_MEMBER(qix_state,qixmcu_coin_r), /* port B in */ |
151 | 128 | DEVCB_NULL, /* line CA1 in */ |
152 | 129 | DEVCB_NULL, /* line CB1 in */ |
153 | 130 | DEVCB_NULL, /* line CA2 in */ |
154 | 131 | DEVCB_NULL, /* line CB2 in */ |
155 | 132 | DEVCB_NULL, /* port A out */ |
156 | | DEVCB_HANDLER(qixmcu_coin_w), /* port B out */ |
| 133 | DEVCB_DRIVER_MEMBER(qix_state,qixmcu_coin_w), /* port B out */ |
157 | 134 | DEVCB_NULL, /* line CA2 out */ |
158 | 135 | DEVCB_NULL, /* port CB2 out */ |
159 | 136 | DEVCB_NULL, /* IRQA */ |
r18175 | r18176 | |
169 | 146 | DEVCB_NULL, /* line CA2 in */ |
170 | 147 | DEVCB_NULL, /* line CB2 in */ |
171 | 148 | DEVCB_NULL, /* port A out */ |
172 | | DEVCB_HANDLER(qixmcu_coinctrl_w), /* port B out */ |
| 149 | DEVCB_DRIVER_MEMBER(qix_state,qixmcu_coinctrl_w), /* port B out */ |
173 | 150 | DEVCB_NULL, /* line CA2 out */ |
174 | 151 | DEVCB_NULL, /* port CB2 out */ |
175 | 152 | DEVCB_NULL, /* IRQA */ |
r18175 | r18176 | |
187 | 164 | |
188 | 165 | const pia6821_interface slither_pia_1_intf = |
189 | 166 | { |
190 | | DEVCB_HANDLER(slither_trak_lr_r), /* port A in */ |
| 167 | DEVCB_DRIVER_MEMBER(qix_state,slither_trak_lr_r), /* port A in */ |
191 | 168 | DEVCB_NULL, /* port B in */ |
192 | 169 | DEVCB_NULL, /* line CA1 in */ |
193 | 170 | DEVCB_NULL, /* line CB1 in */ |
194 | 171 | DEVCB_NULL, /* line CA2 in */ |
195 | 172 | DEVCB_NULL, /* line CB2 in */ |
196 | 173 | DEVCB_NULL, /* port A out */ |
197 | | DEVCB_HANDLER(slither_76489_0_w), /* port B out */ |
| 174 | DEVCB_DRIVER_MEMBER(qix_state,slither_76489_0_w), /* port B out */ |
198 | 175 | DEVCB_NULL, /* line CA2 out */ |
199 | 176 | DEVCB_NULL, /* port CB2 out */ |
200 | 177 | DEVCB_NULL, /* IRQA */ |
r18175 | r18176 | |
203 | 180 | |
204 | 181 | const pia6821_interface slither_pia_2_intf = |
205 | 182 | { |
206 | | DEVCB_HANDLER(slither_trak_ud_r), /* port A in */ |
| 183 | DEVCB_DRIVER_MEMBER(qix_state,slither_trak_ud_r), /* port A in */ |
207 | 184 | DEVCB_NULL, /* port B in */ |
208 | 185 | DEVCB_NULL, /* line CA1 in */ |
209 | 186 | DEVCB_NULL, /* line CB1 in */ |
210 | 187 | DEVCB_NULL, /* line CA2 in */ |
211 | 188 | DEVCB_NULL, /* line CB2 in */ |
212 | 189 | DEVCB_NULL, /* port A out */ |
213 | | DEVCB_HANDLER(slither_76489_1_w), /* port B out */ |
| 190 | DEVCB_DRIVER_MEMBER(qix_state,slither_76489_1_w), /* port B out */ |
214 | 191 | DEVCB_NULL, /* line CA2 out */ |
215 | 192 | DEVCB_NULL, /* port CB2 out */ |
216 | 193 | DEVCB_NULL, /* IRQA */ |
r18175 | r18176 | |
249 | 226 | * |
250 | 227 | *************************************/ |
251 | 228 | |
252 | | WRITE_LINE_DEVICE_HANDLER( qix_vsync_changed ) |
| 229 | WRITE_LINE_MEMBER(qix_state::qix_vsync_changed) |
253 | 230 | { |
254 | | pia6821_device *pia = device->machine().device<pia6821_device>("sndpia0"); |
| 231 | pia6821_device *pia = machine().device<pia6821_device>("sndpia0"); |
255 | 232 | pia->cb1_w(state); |
256 | 233 | } |
257 | 234 | |
r18175 | r18176 | |
344 | 321 | * |
345 | 322 | *************************************/ |
346 | 323 | |
347 | | READ8_DEVICE_HANDLER( qixmcu_coin_r ) |
| 324 | READ8_MEMBER(qix_state::qixmcu_coin_r) |
348 | 325 | { |
349 | | qix_state *state = space.machine().driver_data<qix_state>(); |
350 | 326 | |
351 | | logerror("6809:qixmcu_coin_r = %02X\n", state->m_68705_port_out[0]); |
352 | | return state->m_68705_port_out[0]; |
| 327 | logerror("6809:qixmcu_coin_r = %02X\n", m_68705_port_out[0]); |
| 328 | return m_68705_port_out[0]; |
353 | 329 | } |
354 | 330 | |
355 | 331 | |
356 | | static WRITE8_DEVICE_HANDLER( qixmcu_coin_w ) |
| 332 | WRITE8_MEMBER(qix_state::qixmcu_coin_w) |
357 | 333 | { |
358 | | qix_state *state = space.machine().driver_data<qix_state>(); |
359 | 334 | |
360 | 335 | logerror("6809:qixmcu_coin_w = %02X\n", data); |
361 | 336 | /* this is a callback called by pia6821_device::write(), so I don't need to synchronize */ |
362 | 337 | /* the CPUs - they have already been synchronized by qix_pia_w() */ |
363 | | state->m_68705_port_in[0] = data; |
| 338 | m_68705_port_in[0] = data; |
364 | 339 | } |
365 | 340 | |
366 | 341 | |
367 | | static WRITE8_DEVICE_HANDLER( qixmcu_coinctrl_w ) |
| 342 | WRITE8_MEMBER(qix_state::qixmcu_coinctrl_w) |
368 | 343 | { |
369 | | qix_state *state = space.machine().driver_data<qix_state>(); |
370 | 344 | |
371 | 345 | /* if (!(data & 0x04)) */ |
372 | 346 | if (data & 0x04) |
373 | 347 | { |
374 | | space.machine().device("mcu")->execute().set_input_line(M68705_IRQ_LINE, ASSERT_LINE); |
| 348 | machine().device("mcu")->execute().set_input_line(M68705_IRQ_LINE, ASSERT_LINE); |
375 | 349 | /* temporarily boost the interleave to sync things up */ |
376 | 350 | /* note: I'm using 50 because 30 is not enough for space dungeon at game over */ |
377 | | space.machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(50)); |
| 351 | machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(50)); |
378 | 352 | } |
379 | 353 | else |
380 | | space.machine().device("mcu")->execute().set_input_line(M68705_IRQ_LINE, CLEAR_LINE); |
| 354 | machine().device("mcu")->execute().set_input_line(M68705_IRQ_LINE, CLEAR_LINE); |
381 | 355 | |
382 | 356 | /* this is a callback called by pia6821_device::write(), so I don't need to synchronize */ |
383 | 357 | /* the CPUs - they have already been synchronized by qix_pia_w() */ |
384 | | state->m_coinctrl = data; |
| 358 | m_coinctrl = data; |
385 | 359 | logerror("6809:qixmcu_coinctrl_w = %02X\n", data); |
386 | 360 | } |
387 | 361 | |
r18175 | r18176 | |
469 | 443 | } |
470 | 444 | |
471 | 445 | |
472 | | WRITE8_DEVICE_HANDLER( qix_pia_w ) |
| 446 | WRITE8_MEMBER(qix_state::qix_pia_w) |
473 | 447 | { |
474 | | qix_state *state = device->machine().driver_data<qix_state>(); |
475 | 448 | /* make all the CPUs synchronize, and only AFTER that write the command to the PIA */ |
476 | 449 | /* otherwise the 68705 will miss commands */ |
477 | | space.machine().scheduler().synchronize(timer_expired_delegate(FUNC(qix_state::pia_w_callback),state), data | (offset << 8), (void *)downcast<pia6821_device *>(device)); |
| 450 | machine().scheduler().synchronize(timer_expired_delegate(FUNC(qix_state::pia_w_callback),this), data | (offset << 8), (void *)downcast<pia6821_device *>(machine().device("pia0"))); |
478 | 451 | } |
479 | 452 | |
480 | 453 | |
r18175 | r18176 | |
485 | 458 | * |
486 | 459 | *************************************/ |
487 | 460 | |
488 | | static WRITE8_DEVICE_HANDLER( qix_coinctl_w ) |
| 461 | WRITE8_MEMBER(qix_state::qix_coinctl_w) |
489 | 462 | { |
490 | | coin_lockout_w(space.machine(), 0, (~data >> 2) & 1); |
491 | | coin_counter_w(space.machine(), 0, (data >> 1) & 1); |
| 463 | coin_lockout_w(machine(), 0, (~data >> 2) & 1); |
| 464 | coin_counter_w(machine(), 0, (data >> 1) & 1); |
492 | 465 | } |
493 | 466 | |
494 | 467 | |
r18175 | r18176 | |
499 | 472 | * |
500 | 473 | *************************************/ |
501 | 474 | |
502 | | static WRITE8_DEVICE_HANDLER( slither_76489_0_w ) |
| 475 | WRITE8_MEMBER(qix_state::slither_76489_0_w) |
503 | 476 | { |
504 | | qix_state *state = space.machine().driver_data<qix_state>(); |
505 | | |
506 | 477 | /* write to the sound chip */ |
507 | | state->m_sn1->write(space.machine().device<legacy_cpu_device>("maincpu")->space(), 0, data); |
| 478 | m_sn1->write(space.machine().device<legacy_cpu_device>("maincpu")->space(), 0, data); |
508 | 479 | |
509 | 480 | /* clock the ready line going back into CB1 */ |
510 | | pia6821_device *pia = downcast<pia6821_device *>(device); |
| 481 | pia6821_device *pia = downcast<pia6821_device *>(machine().device("pia1")); |
511 | 482 | pia->cb1_w(0); |
512 | 483 | pia->cb1_w(1); |
513 | 484 | } |
514 | 485 | |
515 | 486 | |
516 | | static WRITE8_DEVICE_HANDLER( slither_76489_1_w ) |
| 487 | WRITE8_MEMBER(qix_state::slither_76489_1_w) |
517 | 488 | { |
518 | | qix_state *state = space.machine().driver_data<qix_state>(); |
519 | 489 | |
520 | 490 | /* write to the sound chip */ |
521 | | state->m_sn2->write(space.machine().device<legacy_cpu_device>("maincpu")->space(), 0, data); |
| 491 | m_sn2->write(machine().device<legacy_cpu_device>("maincpu")->space(), 0, data); |
522 | 492 | |
523 | 493 | /* clock the ready line going back into CB1 */ |
524 | | pia6821_device *pia = downcast<pia6821_device *>(device); |
| 494 | pia6821_device *pia = downcast<pia6821_device *>(machine().device("pia2")); |
525 | 495 | pia->cb1_w(0); |
526 | 496 | pia->cb1_w(1); |
527 | 497 | } |
r18175 | r18176 | |
534 | 504 | * |
535 | 505 | *************************************/ |
536 | 506 | |
537 | | static READ8_DEVICE_HANDLER( slither_trak_lr_r ) |
| 507 | READ8_MEMBER(qix_state::slither_trak_lr_r) |
538 | 508 | { |
539 | | qix_state *state = space.machine().driver_data<qix_state>(); |
540 | 509 | |
541 | | return state->ioport(state->m_flip ? "AN3" : "AN1")->read(); |
| 510 | return ioport(m_flip ? "AN3" : "AN1")->read(); |
542 | 511 | } |
543 | 512 | |
544 | 513 | |
545 | | static READ8_DEVICE_HANDLER( slither_trak_ud_r ) |
| 514 | READ8_MEMBER(qix_state::slither_trak_ud_r) |
546 | 515 | { |
547 | | qix_state *state = space.machine().driver_data<qix_state>(); |
548 | 516 | |
549 | | return state->ioport(state->m_flip ? "AN2" : "AN0")->read(); |
| 517 | return ioport(m_flip ? "AN2" : "AN0")->read(); |
550 | 518 | } |
trunk/src/mame/machine/beezer.c
r18175 | r18176 | |
4 | 4 | #include "includes/beezer.h" |
5 | 5 | |
6 | 6 | |
7 | | static DECLARE_READ8_DEVICE_HANDLER( b_via_0_pa_r ); |
8 | | static DECLARE_READ8_DEVICE_HANDLER( b_via_0_pb_r ); |
9 | | static DECLARE_WRITE8_DEVICE_HANDLER( b_via_0_pa_w ); |
10 | | static DECLARE_WRITE8_DEVICE_HANDLER( b_via_0_pb_w ); |
11 | | static READ_LINE_DEVICE_HANDLER( b_via_0_ca2_r ); |
12 | 7 | |
13 | | static DECLARE_READ8_DEVICE_HANDLER( b_via_1_pa_r ); |
14 | | static DECLARE_READ8_DEVICE_HANDLER( b_via_1_pb_r ); |
15 | | static DECLARE_WRITE8_DEVICE_HANDLER( b_via_1_pa_w ); |
16 | | static DECLARE_WRITE8_DEVICE_HANDLER( b_via_1_pb_w ); |
17 | | |
18 | | |
19 | 8 | /* VIA 0 (aka "PPCNP74", U6 @1C on schematics) |
20 | 9 | enabled at CE00-CFFF of main m6809 cpu when bankswitch is set to 0 |
21 | 10 | port A: |
r18175 | r18176 | |
41 | 30 | */ |
42 | 31 | const via6522_interface b_via_0_interface = |
43 | 32 | { |
44 | | /*inputs : A/B */ DEVCB_HANDLER(b_via_0_pa_r), DEVCB_HANDLER(b_via_0_pb_r), |
45 | | /*inputs : CA/B1,CA/B2 */ DEVCB_NULL, DEVCB_DEVICE_LINE_MEMBER("via6522_1", via6522_device, read_ca2), DEVCB_LINE(b_via_0_ca2_r), DEVCB_DEVICE_LINE_MEMBER("via6522_1", via6522_device, read_ca1), |
46 | | /*outputs: A/B */ DEVCB_HANDLER(b_via_0_pa_w), DEVCB_HANDLER(b_via_0_pb_w), |
| 33 | /*inputs : A/B */ DEVCB_DRIVER_MEMBER(beezer_state,b_via_0_pa_r), DEVCB_DRIVER_MEMBER(beezer_state,b_via_0_pb_r), |
| 34 | /*inputs : CA/B1,CA/B2 */ DEVCB_NULL, DEVCB_DEVICE_LINE_MEMBER("via6522_1", via6522_device, read_ca2), DEVCB_DRIVER_LINE_MEMBER(beezer_state, b_via_0_ca2_r), DEVCB_DEVICE_LINE_MEMBER("via6522_1", via6522_device, read_ca1), |
| 35 | /*outputs: A/B */ DEVCB_DRIVER_MEMBER(beezer_state,b_via_0_pa_w), DEVCB_DRIVER_MEMBER(beezer_state,b_via_0_pb_w), |
47 | 36 | /*outputs: CA/B1,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_DEVICE_LINE_MEMBER("via6522_1", via6522_device, write_ca1), |
48 | 37 | /*irq */ DEVCB_CPU_INPUT_LINE("maincpu", M6809_IRQ_LINE) |
49 | 38 | }; |
r18175 | r18176 | |
73 | 62 | */ |
74 | 63 | const via6522_interface b_via_1_interface = |
75 | 64 | { |
76 | | /*inputs : A/B */ DEVCB_HANDLER(b_via_1_pa_r), DEVCB_HANDLER(b_via_1_pb_r), |
| 65 | /*inputs : A/B */ DEVCB_DRIVER_MEMBER(beezer_state,b_via_1_pa_r), DEVCB_DRIVER_MEMBER(beezer_state,b_via_1_pb_r), |
77 | 66 | /*inputs : CA/B1,CA/B2 */ DEVCB_DEVICE_LINE_MEMBER("via6522_0", via6522_device, read_cb2), DEVCB_NULL, DEVCB_DEVICE_LINE_MEMBER("via6522_0", via6522_device, read_cb1), DEVCB_NULL, |
78 | | /*outputs: A/B */ DEVCB_HANDLER(b_via_1_pa_w), DEVCB_HANDLER(b_via_1_pb_w), |
| 67 | /*outputs: A/B */ DEVCB_DRIVER_MEMBER(beezer_state,b_via_1_pa_w), DEVCB_DRIVER_MEMBER(beezer_state,b_via_1_pb_w), |
79 | 68 | /*outputs: CA/B1,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_DEVICE_LINE_MEMBER("via6522_0", via6522_device, write_cb1), DEVCB_NULL, |
80 | 69 | /*irq */ DEVCB_CPU_INPUT_LINE("audiocpu", M6809_IRQ_LINE) |
81 | 70 | }; |
82 | 71 | |
83 | | static READ_LINE_DEVICE_HANDLER( b_via_0_ca2_r ) |
| 72 | READ_LINE_MEMBER(beezer_state::b_via_0_ca2_r) |
84 | 73 | { |
85 | 74 | return 0; // TODO: TDISP on schematic, same as D5 bit of scanline count from 74LS161 counter at 7A; attach properly |
86 | 75 | |
87 | 76 | } |
88 | 77 | |
89 | | static READ8_DEVICE_HANDLER( b_via_0_pa_r ) |
| 78 | READ8_MEMBER(beezer_state::b_via_0_pa_r) |
90 | 79 | { |
91 | | beezer_state *state = space.machine().driver_data<beezer_state>(); |
92 | | return (state->m_banklatch&0x38)<<2; // return X,Y,Z bits TODO: the Z bit connects somewhere else... where? |
| 80 | return (m_banklatch&0x38)<<2; // return X,Y,Z bits TODO: the Z bit connects somewhere else... where? |
93 | 81 | } |
94 | 82 | |
95 | | static READ8_DEVICE_HANDLER( b_via_0_pb_r ) |
| 83 | READ8_MEMBER(beezer_state::b_via_0_pb_r) |
96 | 84 | { |
97 | | beezer_state *state = space.machine().driver_data<beezer_state>(); |
98 | | return state->m_pbus; |
| 85 | return m_pbus; |
99 | 86 | } |
100 | 87 | |
101 | | static WRITE8_DEVICE_HANDLER( b_via_0_pa_w ) |
| 88 | WRITE8_MEMBER(beezer_state::b_via_0_pa_w) |
102 | 89 | { |
103 | | beezer_state *state = space.machine().driver_data<beezer_state>(); |
104 | 90 | if ((data & 0x08) == 0) |
105 | | space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE); |
| 91 | machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE); |
106 | 92 | else |
107 | | space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, CLEAR_LINE); |
| 93 | machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, CLEAR_LINE); |
108 | 94 | |
109 | 95 | if ((data & 0x04) == 0) |
110 | 96 | { |
111 | 97 | switch (data & 0x03) |
112 | 98 | { |
113 | 99 | case 0: |
114 | | state->m_pbus = state->ioport("IN0")->read(); |
| 100 | m_pbus = ioport("IN0")->read(); |
115 | 101 | break; |
116 | 102 | case 1: |
117 | | state->m_pbus = state->ioport("IN1")->read() | (state->ioport("IN2")->read() << 4); |
| 103 | m_pbus = ioport("IN1")->read() | (ioport("IN2")->read() << 4); |
118 | 104 | break; |
119 | 105 | case 2: |
120 | | state->m_pbus = state->ioport("DSWB")->read(); |
| 106 | m_pbus = ioport("DSWB")->read(); |
121 | 107 | break; |
122 | 108 | case 3: |
123 | | state->m_pbus = state->ioport("DSWA")->read(); // Technically DSWA isn't populated on the board and is pulled to 0xFF with resistor pack, but there IS a DSWA port in the driver so we may as well use it. |
| 109 | m_pbus = ioport("DSWA")->read(); // Technically DSWA isn't populated on the board and is pulled to 0xFF with resistor pack, but there IS a DSWA port in the driver so we may as well use it. |
124 | 110 | break; |
125 | 111 | } |
126 | 112 | } |
127 | 113 | } |
128 | 114 | |
129 | | static WRITE8_DEVICE_HANDLER( b_via_0_pb_w ) |
| 115 | WRITE8_MEMBER(beezer_state::b_via_0_pb_w) |
130 | 116 | { |
131 | | beezer_state *state = space.machine().driver_data<beezer_state>(); |
132 | | state->m_pbus = data; |
| 117 | m_pbus = data; |
133 | 118 | } |
134 | 119 | |
135 | | static READ8_DEVICE_HANDLER( b_via_1_pa_r ) |
| 120 | READ8_MEMBER(beezer_state::b_via_1_pa_r) |
136 | 121 | { |
137 | | beezer_state *state = space.machine().driver_data<beezer_state>(); |
138 | | return state->m_pbus; |
| 122 | return m_pbus; |
139 | 123 | } |
140 | 124 | |
141 | | static READ8_DEVICE_HANDLER( b_via_1_pb_r ) |
| 125 | READ8_MEMBER(beezer_state::b_via_1_pb_r) |
142 | 126 | { |
143 | | return 0x1F | (beezer_noise_r(space.machine().device("custom"), space, 0)?0x40:0); |
| 127 | return 0x1F | (beezer_noise_r(machine().device("custom"), space, 0)?0x40:0); |
144 | 128 | } |
145 | 129 | |
146 | | static WRITE8_DEVICE_HANDLER( b_via_1_pa_w ) |
| 130 | WRITE8_MEMBER(beezer_state::b_via_1_pa_w) |
147 | 131 | { |
148 | | beezer_state *state = space.machine().driver_data<beezer_state>(); |
149 | | state->m_pbus = data; |
| 132 | m_pbus = data; |
150 | 133 | } |
151 | 134 | |
152 | | static WRITE8_DEVICE_HANDLER( b_via_1_pb_w ) |
| 135 | WRITE8_MEMBER(beezer_state::b_via_1_pb_w) |
153 | 136 | { |
154 | | beezer_timer1_w(space.machine().device("custom"), space, 0, data&0x80); |
| 137 | beezer_timer1_w(machine().device("custom"), space, 0, data&0x80); |
155 | 138 | //if ((data&0x1f) != 0x01) |
156 | 139 | // popmessage("via1 pb low write of 0x%02x is not supported! contact mamedev!", data&0x1f); |
157 | 140 | } |