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 | } |