trunk/src/mess/drivers/supercon.c
| r20481 | r20482 | |
| 27 | 27 | { |
| 28 | 28 | public: |
| 29 | 29 | supercon_state(const machine_config &mconfig, device_type type, const char *tag) |
| 30 | | : driver_device(mconfig, type, tag), |
| 31 | | m_maincpu(*this, "maincpu"), |
| 32 | | m_beep(*this, BEEPER_TAG) |
| 30 | : driver_device(mconfig, type, tag) |
| 31 | , m_maincpu(*this, "maincpu") |
| 32 | , m_beep(*this, BEEPER_TAG) |
| 33 | , m_b_white(*this, "B_WHITE") |
| 34 | , m_b_black(*this, "B_BLACK") |
| 35 | , m_b_clr(*this, "B_CLR") |
| 36 | , m_status_1(*this, "STATUS_1") |
| 37 | , m_status_2(*this, "STATUS_2") |
| 38 | , m_status_3(*this, "STATUS_3") |
| 39 | , m_status_4(*this, "STATUS_4") |
| 40 | , m_status_5(*this, "STATUS_5") |
| 41 | , m_status_6(*this, "STATUS_6") |
| 42 | , m_status_7(*this, "STATUS_7") |
| 43 | , m_status_8(*this, "STATUS_8") |
| 44 | , m_board_1(*this, "BOARD_1") |
| 45 | , m_board_2(*this, "BOARD_2") |
| 46 | , m_board_3(*this, "BOARD_3") |
| 47 | , m_board_4(*this, "BOARD_4") |
| 48 | , m_board_5(*this, "BOARD_5") |
| 49 | , m_board_6(*this, "BOARD_6") |
| 50 | , m_board_7(*this, "BOARD_7") |
| 51 | , m_board_8(*this, "BOARD_8") |
| 33 | 52 | { } |
| 34 | 53 | |
| 35 | 54 | required_device<cpu_device> m_maincpu; |
| r20481 | r20482 | |
| 74 | 93 | TIMER_CALLBACK_MEMBER(mouse_click); |
| 75 | 94 | TIMER_CALLBACK_MEMBER(update_irq); |
| 76 | 95 | TIMER_DEVICE_CALLBACK_MEMBER(update_artwork); |
| 96 | void board_presave(); |
| 97 | void board_postload(); |
| 98 | |
| 99 | protected: |
| 100 | required_ioport m_b_white; |
| 101 | required_ioport m_b_black; |
| 102 | required_ioport m_b_clr; |
| 103 | required_ioport m_status_1; |
| 104 | required_ioport m_status_2; |
| 105 | required_ioport m_status_3; |
| 106 | required_ioport m_status_4; |
| 107 | required_ioport m_status_5; |
| 108 | required_ioport m_status_6; |
| 109 | required_ioport m_status_7; |
| 110 | required_ioport m_status_8; |
| 111 | required_ioport m_board_1; |
| 112 | required_ioport m_board_2; |
| 113 | required_ioport m_board_3; |
| 114 | required_ioport m_board_4; |
| 115 | required_ioport m_board_5; |
| 116 | required_ioport m_board_6; |
| 117 | required_ioport m_board_7; |
| 118 | required_ioport m_board_8; |
| 119 | void mouse_update(); |
| 77 | 120 | }; |
| 78 | 121 | |
| 79 | 122 | |
| r20481 | r20482 | |
| 202 | 245 | } |
| 203 | 246 | } |
| 204 | 247 | |
| 205 | | static void mouse_update(running_machine &machine) |
| 248 | void supercon_state::mouse_update() |
| 206 | 249 | { |
| 207 | | supercon_state *state = machine.driver_data<supercon_state>(); |
| 208 | 250 | UINT8 port_input; // m_left; |
| 209 | 251 | int i; |
| 210 | 252 | |
| 211 | 253 | /* border pieces and moving piece */ |
| 212 | 254 | |
| 213 | | port_input=machine.root_device().ioport("B_WHITE")->read(); |
| 255 | port_input = m_b_white->read(); |
| 214 | 256 | if (port_input) |
| 215 | 257 | { |
| 216 | | i=get_first_bit(port_input); |
| 217 | | state->m_moving_piece=state->m_border_pieces[i]; |
| 218 | | output_set_value("MOVING",state->m_moving_piece); |
| 258 | i = get_first_bit(port_input); |
| 259 | m_moving_piece = m_border_pieces[i]; |
| 260 | output_set_value("MOVING", m_moving_piece); |
| 219 | 261 | return; |
| 220 | 262 | } |
| 221 | 263 | |
| 222 | 264 | |
| 223 | | port_input=machine.root_device().ioport("B_BLACK")->read(); |
| 265 | port_input = m_b_black->read(); |
| 224 | 266 | if (port_input) |
| 225 | 267 | { |
| 226 | | i=get_first_bit(port_input); |
| 227 | | state->m_moving_piece=state->m_border_pieces[6+i]; |
| 228 | | output_set_value("MOVING",state->m_moving_piece); |
| 268 | i = get_first_bit(port_input); |
| 269 | m_moving_piece = m_border_pieces[6+i]; |
| 270 | output_set_value("MOVING", m_moving_piece); |
| 229 | 271 | return; |
| 230 | 272 | } |
| 231 | 273 | |
| 232 | 274 | |
| 233 | | port_input=machine.root_device().ioport("B_CLR")->read(); |
| 275 | port_input = m_b_clr->read(); |
| 234 | 276 | if (port_input) |
| 235 | 277 | { |
| 236 | | if (state->m_moving_piece) |
| 278 | if (m_moving_piece) |
| 237 | 279 | { |
| 238 | | state->m_moving_piece=0; |
| 239 | | output_set_value("MOVING",state->m_moving_piece); |
| 280 | m_moving_piece=0; |
| 281 | output_set_value("MOVING", m_moving_piece); |
| 240 | 282 | return; |
| 241 | 283 | } |
| 242 | 284 | } |
| r20481 | r20482 | |
| 332 | 374 | if (i==NOT_VALID) |
| 333 | 375 | return 0xff; |
| 334 | 376 | |
| 335 | | key_data=ioport(status_lines[i])->read(); |
| 377 | switch ( i ) |
| 378 | { |
| 379 | case 0: m_status_1->read(); break; |
| 380 | case 1: m_status_2->read(); break; |
| 381 | case 2: m_status_3->read(); break; |
| 382 | case 3: m_status_4->read(); break; |
| 383 | case 4: m_status_5->read(); break; |
| 384 | case 5: m_status_6->read(); break; |
| 385 | case 6: m_status_7->read(); break; |
| 386 | case 7: m_status_8->read(); break; |
| 387 | } |
| 336 | 388 | |
| 337 | 389 | if (key_data != 0xc0) |
| 338 | 390 | { |
| r20481 | r20482 | |
| 388 | 440 | output_set_value("MOVING",m_moving_piece); |
| 389 | 441 | } |
| 390 | 442 | |
| 391 | | key_data=ioport(board_lines[i_18])->read(); |
| 443 | switch ( i_18 ) |
| 444 | { |
| 445 | case 0: m_board_1->read(); break; |
| 446 | case 1: m_board_2->read(); break; |
| 447 | case 2: m_board_3->read(); break; |
| 448 | case 3: m_board_4->read(); break; |
| 449 | case 4: m_board_5->read(); break; |
| 450 | case 5: m_board_6->read(); break; |
| 451 | case 6: m_board_7->read(); break; |
| 452 | case 7: m_board_8->read(); break; |
| 453 | } |
| 392 | 454 | |
| 393 | 455 | if (key_data != 0xff) |
| 394 | 456 | { |
| r20481 | r20482 | |
| 511 | 573 | |
| 512 | 574 | TIMER_DEVICE_CALLBACK_MEMBER(supercon_state::update_artwork) |
| 513 | 575 | { |
| 514 | | mouse_update(machine()); |
| 576 | mouse_update(); |
| 515 | 577 | } |
| 516 | 578 | |
| 517 | 579 | TIMER_CALLBACK_MEMBER(supercon_state::update_irq) |
| 518 | 580 | { |
| 519 | | machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE); |
| 520 | | machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE); |
| 581 | m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); |
| 582 | m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); |
| 521 | 583 | } |
| 522 | 584 | |
| 523 | 585 | /* Save state call backs */ |
| 524 | 586 | |
| 525 | | static void board_presave(supercon_state *state) |
| 587 | void supercon_state::board_presave() |
| 526 | 588 | { |
| 527 | | int i; |
| 528 | | for (i=0;i<64;i++) |
| 529 | | state->m_save_board[i]=state->m_board[i]; |
| 589 | for (int i=0;i<64;i++) |
| 590 | { |
| 591 | m_save_board[i] = m_board[i]; |
| 592 | } |
| 530 | 593 | } |
| 531 | 594 | |
| 532 | | static void board_postload(supercon_state *state) |
| 595 | void supercon_state::board_postload() |
| 533 | 596 | { |
| 534 | | int i; |
| 535 | | for (i=0;i<64;i++) |
| 536 | | state->m_board[i]=state->m_save_board[i]; |
| 597 | for (int i=0;i<64;i++) |
| 598 | { |
| 599 | m_board[i] = m_save_board[i]; |
| 600 | } |
| 537 | 601 | |
| 538 | | state->set_pieces(); |
| 602 | set_pieces(); |
| 539 | 603 | } |
| 540 | 604 | |
| 541 | 605 | void supercon_state::machine_start() |
| r20481 | r20482 | |
| 544 | 608 | m_timer_update_irq->adjust( attotime::zero, 0, attotime::from_hz(1000) ); |
| 545 | 609 | m_timer_mouse_click = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(supercon_state::mouse_click),this),NULL); |
| 546 | 610 | save_item(NAME(m_save_board)); |
| 547 | | machine().save().register_postload(save_prepost_delegate(FUNC(board_postload),this)); |
| 548 | | machine().save().register_presave(save_prepost_delegate(FUNC(board_presave),this)); |
| 611 | machine().save().register_postload(save_prepost_delegate(FUNC(supercon_state::board_postload),this)); |
| 612 | machine().save().register_presave(save_prepost_delegate(FUNC(supercon_state::board_presave),this)); |
| 549 | 613 | } |
| 550 | 614 | |
| 551 | 615 | void supercon_state::machine_reset() |