trunk/src/mess/drivers/c64.c
| r20480 | r20481 | |
| 10 | 10 | - some CIA tests |
| 11 | 11 | |
| 12 | 12 | - 64C PLA dump |
| 13 | | - clean up inputs |
| 14 | 13 | - Multiscreen crashes on boot |
| 15 | 14 | |
| 16 | 15 | 805A: lda $01 |
| r20480 | r20481 | |
| 47 | 46 | |
| 48 | 47 | void c64_state::check_interrupts() |
| 49 | 48 | { |
| 50 | | int restore = BIT(m_special->read(), 7); |
| 49 | int restore = !BIT(m_restore->read_safe(0xff), 0); |
| 51 | 50 | |
| 52 | 51 | int irq = m_cia1_irq || m_vic_irq || m_exp_irq; |
| 53 | 52 | int nmi = m_cia2_irq || restore || m_exp_nmi; |
| r20480 | r20481 | |
| 356 | 355 | //------------------------------------------------- |
| 357 | 356 | |
| 358 | 357 | static INPUT_PORTS_START( c64 ) |
| 359 | | PORT_INCLUDE( common_cbm_keyboard ) // ROW0 -> ROW7 |
| 358 | PORT_START( "ROW0" ) |
| 359 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Crsr Down Up") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR(UCHAR_MAMEKEY(UP)) |
| 360 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F5)) |
| 361 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F3)) |
| 362 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) |
| 363 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F7)) |
| 364 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Crsr Right Left") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) |
| 365 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) |
| 366 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("INST DEL") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) |
| 360 | 367 | |
| 361 | | PORT_INCLUDE( c64_special ) // SPECIAL |
| 368 | PORT_START( "ROW1" ) |
| 369 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Shift (Left)") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| 370 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') |
| 371 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') |
| 372 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') |
| 373 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') |
| 374 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') |
| 375 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') |
| 376 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') |
| 362 | 377 | |
| 363 | | PORT_INCLUDE( c64_controls ) // CTRLSEL, JOY0, JOY1, PADDLE0 -> PADDLE3, TRACKX, TRACKY, LIGHTX, LIGHTY, OTHER |
| 378 | PORT_START( "ROW2" ) |
| 379 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') |
| 380 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') |
| 381 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') |
| 382 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') |
| 383 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') |
| 384 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') |
| 385 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') |
| 386 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') |
| 387 | |
| 388 | PORT_START( "ROW3" ) |
| 389 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') |
| 390 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') |
| 391 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') |
| 392 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') |
| 393 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') |
| 394 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') |
| 395 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') |
| 396 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') |
| 397 | |
| 398 | PORT_START( "ROW4" ) |
| 399 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') |
| 400 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') |
| 401 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') |
| 402 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') |
| 403 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
| 404 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') |
| 405 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') |
| 406 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') |
| 407 | |
| 408 | PORT_START( "ROW5" ) |
| 409 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') |
| 410 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') |
| 411 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(':') PORT_CHAR('[') |
| 412 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') |
| 413 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') |
| 414 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') |
| 415 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') |
| 416 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('+') |
| 417 | |
| 418 | PORT_START( "ROW6" ) |
| 419 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') |
| 420 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x91 Pi") PORT_CODE(KEYCODE_DEL) PORT_CHAR(0x2191) PORT_CHAR(0x03C0) |
| 421 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('=') |
| 422 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Shift (Right)") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| 423 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CLR HOME") PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(HOME)) |
| 424 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(';') PORT_CHAR(']') |
| 425 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('*') |
| 426 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('\xA3') |
| 427 | |
| 428 | PORT_START( "ROW7" ) |
| 429 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RUN STOP") PORT_CODE(KEYCODE_HOME) |
| 430 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') |
| 431 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CBM") PORT_CODE(KEYCODE_LALT) |
| 432 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') |
| 433 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') |
| 434 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR(UCHAR_SHIFT_2) |
| 435 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x90") PORT_CODE(KEYCODE_TILDE) PORT_CHAR(0x2190) |
| 436 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') |
| 437 | |
| 438 | PORT_START( "RESTORE" ) |
| 439 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RESTORE") PORT_CODE(KEYCODE_PRTSCR) |
| 440 | |
| 441 | PORT_START( "LOCK" ) |
| 442 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) |
| 364 | 443 | INPUT_PORTS_END |
| 365 | 444 | |
| 366 | 445 | |
| r20480 | r20481 | |
| 372 | 451 | PORT_INCLUDE( c64 ) |
| 373 | 452 | |
| 374 | 453 | PORT_MODIFY( "ROW5" ) |
| 375 | | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0x00E5) PORT_CHAR(0x00C5) |
| 376 | | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(']') |
| 377 | | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') |
| 378 | | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') |
| 454 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0x00E5) PORT_CHAR(0x00C5) |
| 455 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(']') |
| 456 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') |
| 457 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') |
| 379 | 458 | |
| 380 | 459 | PORT_MODIFY( "ROW6" ) |
| 381 | | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(0x00E4) PORT_CHAR(0x00C4) |
| 382 | | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(0x00F6) PORT_CHAR(0x00D6) |
| 383 | | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('@') |
| 384 | | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR(':') PORT_CHAR('*') |
| 460 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(0x00E4) PORT_CHAR(0x00C4) |
| 461 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(0x00F6) PORT_CHAR(0x00D6) |
| 462 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('@') |
| 463 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR(':') PORT_CHAR('*') |
| 385 | 464 | INPUT_PORTS_END |
| 386 | 465 | |
| 387 | 466 | |
| r20480 | r20481 | |
| 390 | 469 | //------------------------------------------------- |
| 391 | 470 | |
| 392 | 471 | static INPUT_PORTS_START( c64gs ) |
| 393 | | PORT_INCLUDE( c64 ) |
| 394 | | |
| 395 | | // 2008 FP: This has to be cleaned up later |
| 396 | | // C64gs should simply not scan these inputs |
| 397 | | // as a temporary solution, we keep PeT IPT_UNUSED shortcut |
| 398 | | |
| 399 | | PORT_MODIFY( "ROW0" ) // no keyboard |
| 400 | | PORT_BIT (0xff, 0x00, IPT_UNUSED ) |
| 401 | | PORT_MODIFY( "ROW1" ) // no keyboard |
| 402 | | PORT_BIT (0xff, 0x00, IPT_UNUSED ) |
| 403 | | PORT_MODIFY( "ROW2" ) // no keyboard |
| 404 | | PORT_BIT (0xff, 0x00, IPT_UNUSED ) |
| 405 | | PORT_MODIFY( "ROW3" ) // no keyboard |
| 406 | | PORT_BIT (0xff, 0x00, IPT_UNUSED ) |
| 407 | | PORT_MODIFY( "ROW4" ) // no keyboard |
| 408 | | PORT_BIT (0xff, 0x00, IPT_UNUSED ) |
| 409 | | PORT_MODIFY( "ROW5" ) // no keyboard |
| 410 | | PORT_BIT (0xff, 0x00, IPT_UNUSED ) |
| 411 | | PORT_MODIFY( "ROW6" ) // no keyboard |
| 412 | | PORT_BIT (0xff, 0x00, IPT_UNUSED ) |
| 413 | | PORT_MODIFY( "ROW7" ) // no keyboard |
| 414 | | PORT_BIT (0xff, 0x00, IPT_UNUSED ) |
| 415 | | PORT_MODIFY( "SPECIAL" ) // no keyboard |
| 416 | | PORT_BIT (0xff, 0x00, IPT_UNUSED ) |
| 417 | 472 | INPUT_PORTS_END |
| 418 | 473 | |
| 419 | 474 | |
| r20480 | r20481 | |
| 426 | 481 | // vic2_interface vic_intf |
| 427 | 482 | //------------------------------------------------- |
| 428 | 483 | |
| 429 | | INTERRUPT_GEN_MEMBER( c64_state::frame_interrupt ) |
| 430 | | { |
| 431 | | check_interrupts(); |
| 432 | | cbm_common_interrupt(&device); |
| 433 | | } |
| 434 | | |
| 435 | 484 | WRITE_LINE_MEMBER( c64_state::vic_irq_w ) |
| 436 | 485 | { |
| 437 | 486 | m_vic_irq = state; |
| r20480 | r20481 | |
| 517 | 566 | |
| 518 | 567 | */ |
| 519 | 568 | |
| 520 | | UINT8 cia0portb = m_cia1->pb_r(); |
| 569 | UINT8 data = 0xff; |
| 521 | 570 | |
| 522 | | return cbm_common_cia0_port_a_r(m_cia1, cia0portb); |
| 571 | // joystick |
| 572 | UINT8 joy_b = m_joy2->joy_r(); |
| 573 | |
| 574 | data &= (0xf0 | (joy_b & 0x0f)); |
| 575 | data &= ~(!BIT(joy_b, 5) << 4); |
| 576 | |
| 577 | // keyboard |
| 578 | UINT8 cia1_pb = m_cia1->pb_r(); |
| 579 | UINT8 row[8] = { m_row0->read(), m_row1->read(), m_row2->read(), m_row3->read(), |
| 580 | m_row4->read(), m_row5->read(), m_row6->read(), m_row7->read() }; |
| 581 | int lock = BIT(m_lock->read(), 0); |
| 582 | row[1] &= (lock << 7 | 0x7f); |
| 583 | |
| 584 | for (int i = 0; i < 8; i++) |
| 585 | { |
| 586 | if (!BIT(cia1_pb, i)) |
| 587 | { |
| 588 | if (!BIT(row[7], i)) data &= ~0x80; |
| 589 | if (!BIT(row[6], i)) data &= ~0x40; |
| 590 | if (!BIT(row[5], i)) data &= ~0x20; |
| 591 | if (!BIT(row[4], i)) data &= ~0x10; |
| 592 | if (!BIT(row[3], i)) data &= ~0x08; |
| 593 | if (!BIT(row[2], i)) data &= ~0x04; |
| 594 | if (!BIT(row[1], i)) data &= ~0x02; |
| 595 | if (!BIT(row[0], i)) data &= ~0x01; |
| 596 | } |
| 597 | } |
| 598 | |
| 599 | return data; |
| 523 | 600 | } |
| 524 | 601 | |
| 525 | 602 | READ8_MEMBER( c64_state::cia1_pb_r ) |
| r20480 | r20481 | |
| 539 | 616 | |
| 540 | 617 | */ |
| 541 | 618 | |
| 542 | | UINT8 cia0porta = m_cia1->pa_r(); |
| 619 | UINT8 data = 0xff; |
| 543 | 620 | |
| 544 | | return cbm_common_cia0_port_b_r(m_cia1, cia0porta); |
| 621 | // joystick |
| 622 | UINT8 joy_a = m_joy1->joy_r(); |
| 623 | |
| 624 | data &= (0xf0 | (joy_a & 0x0f)); |
| 625 | data &= ~(!BIT(joy_a, 5) << 4); |
| 626 | |
| 627 | // keyboard |
| 628 | UINT8 cia1_pa = m_cia1->pa_r(); |
| 629 | UINT8 row[8] = { m_row0->read(), m_row1->read(), m_row2->read(), m_row3->read(), |
| 630 | m_row4->read(), m_row5->read(), m_row6->read(), m_row7->read() }; |
| 631 | int lock = BIT(m_lock->read(), 0); |
| 632 | row[1] &= (lock << 7 | 0x7f); |
| 633 | |
| 634 | if (!BIT(cia1_pa, 7)) data &= row[7]; |
| 635 | if (!BIT(cia1_pa, 6)) data &= row[6]; |
| 636 | if (!BIT(cia1_pa, 5)) data &= row[5]; |
| 637 | if (!BIT(cia1_pa, 4)) data &= row[4]; |
| 638 | if (!BIT(cia1_pa, 3)) data &= row[3]; |
| 639 | if (!BIT(cia1_pa, 2)) data &= row[2]; |
| 640 | if (!BIT(cia1_pa, 1)) data &= row[1]; |
| 641 | if (!BIT(cia1_pa, 0)) data &= row[0]; |
| 642 | |
| 643 | return data; |
| 545 | 644 | } |
| 546 | 645 | |
| 547 | 646 | WRITE8_MEMBER( c64_state::cia1_pb_w ) |
| r20480 | r20481 | |
| 576 | 675 | DEVCB_DRIVER_MEMBER(c64_state, cia1_pb_w) |
| 577 | 676 | }; |
| 578 | 677 | |
| 678 | READ8_MEMBER( c64gs_state::cia1_pa_r ) |
| 679 | { |
| 680 | /* |
| 579 | 681 | |
| 682 | bit description |
| 683 | |
| 684 | PA0 JOY B0 |
| 685 | PA1 JOY B1 |
| 686 | PA2 JOY B2 |
| 687 | PA3 JOY B3 |
| 688 | PA4 BTNB |
| 689 | PA5 |
| 690 | PA6 |
| 691 | PA7 |
| 692 | |
| 693 | */ |
| 694 | |
| 695 | UINT8 data = 0xff; |
| 696 | |
| 697 | // joystick |
| 698 | UINT8 joy_b = m_joy2->joy_r(); |
| 699 | |
| 700 | data &= (0xf0 | (joy_b & 0x0f)); |
| 701 | data &= ~(!BIT(joy_b, 5) << 4); |
| 702 | |
| 703 | return data; |
| 704 | } |
| 705 | |
| 706 | READ8_MEMBER( c64gs_state::cia1_pb_r ) |
| 707 | { |
| 708 | /* |
| 709 | |
| 710 | bit description |
| 711 | |
| 712 | PB0 JOY A0 |
| 713 | PB1 JOY A1 |
| 714 | PB2 JOY A2 |
| 715 | PB3 JOY A3 |
| 716 | PB4 BTNA/_LP |
| 717 | PB5 |
| 718 | PB6 |
| 719 | PB7 |
| 720 | |
| 721 | */ |
| 722 | |
| 723 | UINT8 data = 0xff; |
| 724 | |
| 725 | // joystick |
| 726 | UINT8 joy_a = m_joy1->joy_r(); |
| 727 | |
| 728 | data &= (0xf0 | (joy_a & 0x0f)); |
| 729 | data &= ~(!BIT(joy_a, 5) << 4); |
| 730 | |
| 731 | return data; |
| 732 | } |
| 733 | |
| 734 | static MOS6526_INTERFACE( c64gs_cia1_intf ) |
| 735 | { |
| 736 | DEVCB_DRIVER_LINE_MEMBER(c64_state, cia1_irq_w), |
| 737 | DEVCB_NULL, |
| 738 | DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, sp1_w), |
| 739 | DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, cnt1_w), |
| 740 | DEVCB_DRIVER_MEMBER(c64gs_state, cia1_pa_r), |
| 741 | DEVCB_NULL, |
| 742 | DEVCB_DRIVER_MEMBER(c64gs_state, cia1_pb_r), |
| 743 | DEVCB_DRIVER_MEMBER(c64_state, cia1_pb_w) |
| 744 | }; |
| 745 | |
| 746 | |
| 580 | 747 | //------------------------------------------------- |
| 581 | 748 | // MOS6526_INTERFACE( cia2_intf ) |
| 582 | 749 | //------------------------------------------------- |
| r20480 | r20481 | |
| 920 | 1087 | |
| 921 | 1088 | void c64_state::machine_start() |
| 922 | 1089 | { |
| 923 | | cbm_common_init(); |
| 924 | | |
| 925 | 1090 | // find memory regions |
| 926 | 1091 | m_basic = memregion("basic")->base(); |
| 927 | 1092 | m_kernal = memregion("kernal")->base(); |
| r20480 | r20481 | |
| 1011 | 1176 | MCFG_CPU_PROGRAM_MAP(c64_mem) |
| 1012 | 1177 | MCFG_M6510_PORT_CALLBACKS(READ8(c64_state, cpu_r), WRITE8(c64_state, cpu_w)) |
| 1013 | 1178 | MCFG_M6510_PORT_PULLS(0x17, 0xc8) |
| 1014 | | MCFG_CPU_VBLANK_INT_DRIVER(SCREEN_TAG, c64_state, frame_interrupt) |
| 1015 | 1179 | MCFG_QUANTUM_PERFECT_CPU(M6510_TAG) |
| 1016 | 1180 | |
| 1017 | 1181 | // video hardware |
| r20480 | r20481 | |
| 1112 | 1276 | MCFG_CPU_PROGRAM_MAP(c64_mem) |
| 1113 | 1277 | MCFG_M6510_PORT_CALLBACKS(READ8(c64_state, cpu_r), WRITE8(c64_state, cpu_w)) |
| 1114 | 1278 | MCFG_M6510_PORT_PULLS(0x17, 0xc8) |
| 1115 | | MCFG_CPU_VBLANK_INT_DRIVER(SCREEN_TAG, c64_state, frame_interrupt) |
| 1116 | 1279 | MCFG_QUANTUM_PERFECT_CPU(M6510_TAG) |
| 1117 | 1280 | |
| 1118 | 1281 | // video hardware |
| r20480 | r20481 | |
| 1134 | 1297 | MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c1530", NULL) |
| 1135 | 1298 | MCFG_CBM_IEC_ADD(iec_intf, "c1541") |
| 1136 | 1299 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL) |
| 1137 | | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL) |
| 1300 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, "joy", NULL) |
| 1138 | 1301 | MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, VIC6569_CLOCK, expansion_intf, c64_expansion_cards, NULL, NULL) |
| 1139 | 1302 | MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL) |
| 1140 | 1303 | |
| r20480 | r20481 | |
| 1191 | 1354 | MCFG_CPU_PROGRAM_MAP(c64_mem) |
| 1192 | 1355 | MCFG_M6510_PORT_CALLBACKS(READ8(c64gs_state, cpu_r), WRITE8(c64gs_state, cpu_w)) |
| 1193 | 1356 | MCFG_M6510_PORT_PULLS(0x07, 0xc0) |
| 1194 | | |
| 1195 | | MCFG_CPU_VBLANK_INT_DRIVER(SCREEN_TAG, c64_state, frame_interrupt) |
| 1196 | 1357 | MCFG_QUANTUM_PERFECT_CPU(M6510_TAG) |
| 1197 | 1358 | |
| 1198 | 1359 | // video hardware |
| r20480 | r20481 | |
| 1208 | 1369 | |
| 1209 | 1370 | // devices |
| 1210 | 1371 | MCFG_PLS100_ADD(PLA_TAG) |
| 1211 | | MCFG_MOS6526_ADD(MOS6526_1_TAG, VIC6569_CLOCK, 50, cia1_intf) |
| 1372 | MCFG_MOS6526_ADD(MOS6526_1_TAG, VIC6569_CLOCK, 50, c64gs_cia1_intf) |
| 1212 | 1373 | MCFG_MOS6526_ADD(MOS6526_2_TAG, VIC6569_CLOCK, 50, cia2_intf) |
| 1213 | 1374 | MCFG_CBM_IEC_BUS_ADD(iec_intf) |
| 1214 | 1375 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL) |
| 1215 | | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL) |
| 1376 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, "joy", NULL) |
| 1216 | 1377 | MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, VIC6569_CLOCK, expansion_intf, c64_expansion_cards, NULL, NULL) |
| 1217 | 1378 | MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL) |
| 1218 | 1379 | |