trunk/src/mess/machine/victor9kb.c
| r242340 | r242341 | |
| 25 | 25 | | X X X X X X X X X X X X X X X X X X X X | |
| 26 | 26 | | X X marking X X X X X X X X | |
| 27 | 27 | |----------------------------------------------------------------------------------------| |
| 28 | | |
| 29 | 28 | |
| 29 | |
| 30 | 30 | Notes: |
| 31 | 31 | All IC's shown. |
| 32 | 32 | XTAL - 3.579545Mhz Crystal, marked "48-300-010" (front of xtal) and "3.579545Mhz" (back of xtal) |
| r242340 | r242341 | |
| 54 | 54 | /3Y 6 | | 9 4A |
| 55 | 55 | GND 7 |_______| 8 /4Y |
| 56 | 56 | |
| 57 | | |
| 57 | |
| 58 | 58 | P8021 Pinout |
| 59 | 59 | ------------------ |
| 60 | 60 | _____ _____ |
| r242340 | r242341 | |
| 134 | 134 | P20 26 - 22-908 pin 19 (/CLR) AND 22-950 pin 5 (/STB) AND (804x chip pin 35, P24) |
| 135 | 135 | P21 27 - 74LS14 pin 9 (4A) AND (804x chip pin 36, P25) |
| 136 | 136 | VCC 28 - VCC |
| 137 | | |
| 137 | |
| 138 | 138 | 74LS14 to elsewhere connections |
| 139 | 139 | ------------------------------- |
| 140 | 140 | 1A 1 - 100 Ohm resistor - J1 pin 4 |
| r242340 | r242341 | |
| 152 | 152 | 6A 13 - 74LS14 pin 10 |
| 153 | 153 | VCC 14 - VCC |
| 154 | 154 | |
| 155 | | |
| 155 | |
| 156 | 156 | J1 (aka CN1) connections: |
| 157 | 157 | ------------------------- |
| 158 | 158 | 1 - VCC |
| r242340 | r242341 | |
| 212 | 212 | S09 - UNUSED (under the [8] key, no metal contact on key) |
| 213 | 213 | S10 - [9] |
| 214 | 214 | S11 - [10] |
| 215 | | |
| 215 | |
| 216 | 216 | S12 - CLR/HOME |
| 217 | 217 | S13 - (Degree symbol U+00B0)/(+- symbol U+00B1)/(Pi symbol U+03C0) |
| 218 | 218 | S14 - !/1/| |
| r242340 | r242341 | |
| 234 | 234 | S30 - % (white keypad key) |
| 235 | 235 | S31 - (division symbol U+00F7) (white keypad key) |
| 236 | 236 | S32 - (multiplication symbol U+00D7) (white keypad key) |
| 237 | | |
| 237 | |
| 238 | 238 | S33 - (up arrow, SCRL, down arrow)//VTAB |
| 239 | 239 | S34 - TAB//BACK |
| 240 | 240 | S35 - Q |
| r242340 | r242341 | |
| 256 | 256 | S51 - 8 (white keypad key) |
| 257 | 257 | S52 - 9 (white keypad key) |
| 258 | 258 | S53 - - (white keypad key) |
| 259 | | |
| 259 | |
| 260 | 260 | S54 - (OFF,RVS,ON)//ESC |
| 261 | 261 | S55 - LOCK//CAPS LOCK |
| 262 | 262 | S56 - A |
| r242340 | r242341 | |
| 278 | 278 | S72 - 5 (white keypad key) |
| 279 | 279 | S73 - 6 (white keypad key) |
| 280 | 280 | S74 - + (white keypad key) |
| 281 | | |
| 281 | |
| 282 | 282 | S75 - (OFF,UNDL,ON) |
| 283 | 283 | S76 - SHIFT (left shift) |
| 284 | 284 | S77 - UNUSED (under the left SHIFT key, no metal contact on key) |
| r242340 | r242341 | |
| 299 | 299 | S92 - 2 (white keypad key) |
| 300 | 300 | S93 - 3 (white keypad key) |
| 301 | 301 | S94 - ENTER (white keypad key) |
| 302 | | |
| 302 | |
| 303 | 303 | S95 - RPT |
| 304 | 304 | S96 - ALT |
| 305 | 305 | S97 - (spacebar) |
| r242340 | r242341 | |
| 310 | 310 | S102 - 00 (white keypad key) ('double zero') |
| 311 | 311 | S103 - . (white keypad key) |
| 312 | 312 | S104 - UNUSED (under the ENTER (keypad) key, no metal contact on key) |
| 313 | | |
| 313 | |
| 314 | 314 | Note that the five unused key contacts: |
| 315 | 315 | S09, S47, S67, S77 and S104 |
| 316 | 316 | may be used on international variants of the Victor 9000/Sirius 1 Keyboard. |
| r242340 | r242341 | |
| 324 | 324 | Y0 12 13 33 34 54 55 75 76 |
| 325 | 325 | Y1 14 15 35 36 56 57 77 78 |
| 326 | 326 | Y2 16 17 37 38 58 59 79 80 |
| 327 | | Y3 18 19 39 40 60 61 81 82 |
| 327 | Y3 18 19 39 40 60 61 81 82 |
| 328 | 328 | Y4 20 21 41 42 62 63 83 84 |
| 329 | 329 | Y5 22 23 43 44 64 65 85 86 |
| 330 | 330 | Y6 24 25 45 46 66 67 87 88 |
| r242340 | r242341 | |
| 345 | 345 | // MACROS / CONSTANTS |
| 346 | 346 | //************************************************************************** |
| 347 | 347 | |
| 348 | | #define I8021_TAG "z3" |
| 348 | #define I8021_TAG "z3" |
| 349 | 349 | |
| 350 | #define LOG 0 |
| 350 | 351 | |
| 351 | 352 | |
| 353 | |
| 352 | 354 | //************************************************************************** |
| 353 | 355 | // DEVICE DEFINITIONS |
| 354 | 356 | //************************************************************************** |
| 355 | 357 | |
| 356 | | const device_type VICTOR9K_KEYBOARD = &device_creator<victor9k_keyboard_device>; |
| 358 | const device_type VICTOR9K_KEYBOARD = &device_creator<victor_9000_keyboard_t>; |
| 357 | 359 | |
| 358 | 360 | |
| 359 | 361 | //------------------------------------------------- |
| r242340 | r242341 | |
| 370 | 372 | // rom_region - device-specific ROM region |
| 371 | 373 | //------------------------------------------------- |
| 372 | 374 | |
| 373 | | const rom_entry *victor9k_keyboard_device::device_rom_region() const |
| 375 | const rom_entry *victor_9000_keyboard_t::device_rom_region() const |
| 374 | 376 | { |
| 375 | 377 | return ROM_NAME( victor9k_keyboard ); |
| 376 | 378 | } |
| r242340 | r242341 | |
| 380 | 382 | // ADDRESS_MAP( kb_io ) |
| 381 | 383 | //------------------------------------------------- |
| 382 | 384 | |
| 383 | | static ADDRESS_MAP_START( victor9k_keyboard_io, AS_IO, 8, victor9k_keyboard_device ) |
| 385 | static ADDRESS_MAP_START( victor9k_keyboard_io, AS_IO, 8, victor_9000_keyboard_t ) |
| 384 | 386 | AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(kb_p1_r, kb_p1_w) |
| 385 | 387 | AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(kb_p2_w) |
| 386 | 388 | AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(kb_t1_r) |
| r242340 | r242341 | |
| 402 | 404 | // machine configurations |
| 403 | 405 | //------------------------------------------------- |
| 404 | 406 | |
| 405 | | machine_config_constructor victor9k_keyboard_device::device_mconfig_additions() const |
| 407 | machine_config_constructor victor_9000_keyboard_t::device_mconfig_additions() const |
| 406 | 408 | { |
| 407 | 409 | return MACHINE_CONFIG_NAME( victor9k_keyboard ); |
| 408 | 410 | } |
| r242340 | r242341 | |
| 474 | 476 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 475 | 477 | |
| 476 | 478 | PORT_START("Y6") |
| 477 | | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) |
| 478 | | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) |
| 479 | | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) |
| 480 | | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) |
| 481 | | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) |
| 482 | | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) |
| 483 | | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) |
| 484 | | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) |
| 479 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 480 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 481 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 482 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 483 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 484 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 485 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 486 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| 485 | 487 | |
| 486 | 488 | PORT_START("Y7") |
| 487 | 489 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) |
| r242340 | r242341 | |
| 549 | 551 | // input_ports - device-specific input ports |
| 550 | 552 | //------------------------------------------------- |
| 551 | 553 | |
| 552 | | ioport_constructor victor9k_keyboard_device::device_input_ports() const |
| 554 | ioport_constructor victor_9000_keyboard_t::device_input_ports() const |
| 553 | 555 | { |
| 554 | 556 | return INPUT_PORTS_NAME( victor9k_keyboard ); |
| 555 | 557 | } |
| r242340 | r242341 | |
| 561 | 563 | //************************************************************************** |
| 562 | 564 | |
| 563 | 565 | //------------------------------------------------- |
| 564 | | // victor9k_keyboard_device - constructor |
| 566 | // victor_9000_keyboard_t - constructor |
| 565 | 567 | //------------------------------------------------- |
| 566 | 568 | |
| 567 | | victor9k_keyboard_device::victor9k_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 569 | victor_9000_keyboard_t::victor_9000_keyboard_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 568 | 570 | device_t(mconfig, VICTOR9K_KEYBOARD, "Victor 9000 Keyboard", tag, owner, clock, "victor9kb", __FILE__), |
| 569 | 571 | m_maincpu(*this, I8021_TAG), |
| 570 | 572 | m_y0(*this, "Y0"), |
| r242340 | r242341 | |
| 580 | 582 | m_ya(*this, "YA"), |
| 581 | 583 | m_yb(*this, "YB"), |
| 582 | 584 | m_yc(*this, "YC"), |
| 583 | | m_kbrdy_handler(*this), |
| 584 | | m_kbdata_handler(*this), |
| 585 | m_kbrdy_cb(*this), |
| 586 | m_kbdata_cb(*this), |
| 585 | 587 | m_y(0), |
| 586 | 588 | m_kbrdy(-1), |
| 587 | 589 | m_kbdata(-1), |
| r242340 | r242341 | |
| 594 | 596 | // device_start - device-specific startup |
| 595 | 597 | //------------------------------------------------- |
| 596 | 598 | |
| 597 | | void victor9k_keyboard_device::device_start() |
| 599 | void victor_9000_keyboard_t::device_start() |
| 598 | 600 | { |
| 599 | 601 | // resolve callbacks |
| 600 | | m_kbrdy_handler.resolve_safe(); |
| 601 | | m_kbdata_handler.resolve_safe(); |
| 602 | m_kbrdy_cb.resolve_safe(); |
| 603 | m_kbdata_cb.resolve_safe(); |
| 602 | 604 | |
| 603 | 605 | // state saving |
| 606 | save_item(NAME(m_p1)); |
| 604 | 607 | save_item(NAME(m_y)); |
| 608 | save_item(NAME(m_stb)); |
| 609 | save_item(NAME(m_y12)); |
| 605 | 610 | save_item(NAME(m_kbrdy)); |
| 606 | 611 | save_item(NAME(m_kbdata)); |
| 607 | 612 | save_item(NAME(m_kback)); |
| r242340 | r242341 | |
| 609 | 614 | |
| 610 | 615 | |
| 611 | 616 | //------------------------------------------------- |
| 612 | | // device_reset - device-specific reset |
| 613 | | //------------------------------------------------- |
| 614 | | |
| 615 | | void victor9k_keyboard_device::device_reset() |
| 616 | | { |
| 617 | | } |
| 618 | | |
| 619 | | |
| 620 | | //------------------------------------------------- |
| 621 | 617 | // kback_w - |
| 622 | 618 | //------------------------------------------------- |
| 623 | 619 | |
| 624 | | WRITE_LINE_MEMBER( victor9k_keyboard_device::kback_w ) |
| 620 | WRITE_LINE_MEMBER( victor_9000_keyboard_t::kback_w ) |
| 625 | 621 | { |
| 626 | | //logerror("KBACK %u\n", state); |
| 627 | | m_kback = state; |
| 622 | if (LOG) logerror("KBACK %u\n", state); |
| 623 | |
| 624 | m_kback = !state; |
| 628 | 625 | } |
| 629 | 626 | |
| 630 | 627 | |
| r242340 | r242341 | |
| 632 | 629 | // kb_p1_r - |
| 633 | 630 | //------------------------------------------------- |
| 634 | 631 | |
| 635 | | READ8_MEMBER( victor9k_keyboard_device::kb_p1_r ) |
| 632 | READ8_MEMBER( victor_9000_keyboard_t::kb_p1_r ) |
| 636 | 633 | { |
| 637 | 634 | UINT8 data = 0xff; |
| 638 | 635 | |
| r242340 | r242341 | |
| 650 | 647 | case 9: data &= m_y9->read(); break; |
| 651 | 648 | case 0xa: data &= m_ya->read(); break; |
| 652 | 649 | case 0xb: data &= m_yb->read(); break; |
| 653 | | case 0xc: data &= m_yc->read(); break; |
| 654 | 650 | } |
| 655 | 651 | |
| 652 | if (!m_y12) |
| 653 | { |
| 654 | data &= m_yc->read(); |
| 655 | } |
| 656 | |
| 656 | 657 | return data; |
| 657 | 658 | } |
| 658 | 659 | |
| r242340 | r242341 | |
| 661 | 662 | // kb_p1_w - |
| 662 | 663 | //------------------------------------------------- |
| 663 | 664 | |
| 664 | | WRITE8_MEMBER( victor9k_keyboard_device::kb_p1_w ) |
| 665 | WRITE8_MEMBER( victor_9000_keyboard_t::kb_p1_w ) |
| 665 | 666 | { |
| 666 | | if ((data & 0xf0) == 0x20) |
| 667 | | { |
| 668 | | m_y = data & 0x0f; |
| 669 | | } |
| 670 | | |
| 671 | | //logerror("%s P1 %02x\n", machine().describe_context(), data); |
| 667 | m_p1 = data; |
| 672 | 668 | } |
| 673 | 669 | |
| 674 | 670 | |
| r242340 | r242341 | |
| 676 | 672 | // kb_p2_w - |
| 677 | 673 | //------------------------------------------------- |
| 678 | 674 | |
| 679 | | WRITE8_MEMBER( victor9k_keyboard_device::kb_p2_w ) |
| 675 | WRITE8_MEMBER( victor_9000_keyboard_t::kb_p2_w ) |
| 680 | 676 | { |
| 681 | 677 | /* |
| 682 | 678 | |
| 683 | 679 | bit description |
| 684 | 680 | |
| 685 | | P20 ? |
| 681 | P20 22-908 CLR, 22-950 STB |
| 686 | 682 | P21 KBRDY |
| 687 | | P22 ? |
| 683 | P22 Y12 |
| 688 | 684 | P23 KBDATA |
| 689 | 685 | |
| 690 | 686 | */ |
| 691 | 687 | |
| 692 | | int kbrdy = BIT(data, 1); |
| 693 | | |
| 694 | | if (m_kbrdy != kbrdy) |
| 688 | // keyboard rows 0-11 |
| 689 | if (!BIT(data, 0)) |
| 695 | 690 | { |
| 696 | | m_kbrdy = kbrdy; |
| 697 | | m_kbrdy_handler(m_kbrdy); |
| 691 | m_y = m_p1 & 0x0f; |
| 698 | 692 | } |
| 699 | 693 | |
| 700 | | int kbdata = BIT(data, 3); |
| 694 | // keyboard row 12 |
| 695 | m_y12 = BIT(data, 2); |
| 701 | 696 | |
| 702 | | if (m_kbdata != kbdata) |
| 703 | | { |
| 704 | | m_kbdata = kbdata; |
| 705 | | m_kbdata_handler(m_kbdata); |
| 706 | | } |
| 697 | // keyboard ready |
| 698 | m_kbrdy_cb(BIT(data, 1)); |
| 707 | 699 | |
| 708 | | //logerror("%s P2 %01x\n", machine().describe_context(), data&0x0f); |
| 700 | // keyboard data |
| 701 | m_kbdata_cb(BIT(data, 3)); |
| 709 | 702 | } |
| 710 | 703 | |
| 711 | 704 | |
| r242340 | r242341 | |
| 713 | 706 | // kb_t1_r - |
| 714 | 707 | //------------------------------------------------- |
| 715 | 708 | |
| 716 | | READ8_MEMBER( victor9k_keyboard_device::kb_t1_r ) |
| 709 | READ8_MEMBER( victor_9000_keyboard_t::kb_t1_r ) |
| 717 | 710 | { |
| 718 | 711 | return m_kback; |
| 719 | 712 | } |
trunk/src/mess/machine/victor9kb.h
| r242340 | r242341 | |
| 25 | 25 | //************************************************************************** |
| 26 | 26 | |
| 27 | 27 | #define MCFG_VICTOR9K_KBRDY_HANDLER(_devcb) \ |
| 28 | | devcb = &victor9k_keyboard_device::set_kbrdy_handler(*device, DEVCB_##_devcb); |
| 28 | devcb = &victor_9000_keyboard_t::set_kbrdy_cb(*device, DEVCB_##_devcb); |
| 29 | 29 | |
| 30 | 30 | #define MCFG_VICTOR9K_KBDATA_HANDLER(_devcb) \ |
| 31 | | devcb = &victor9k_keyboard_device::set_kbdata_handler(*device, DEVCB_##_devcb); |
| 31 | devcb = &victor_9000_keyboard_t::set_kbdata_cb(*device, DEVCB_##_devcb); |
| 32 | 32 | |
| 33 | 33 | |
| 34 | 34 | //************************************************************************** |
| 35 | 35 | // TYPE DEFINITIONS |
| 36 | 36 | //************************************************************************** |
| 37 | 37 | |
| 38 | | // ======================> victor9k_keyboard_device |
| 38 | // ======================> victor_9000_keyboard_t |
| 39 | 39 | |
| 40 | | class victor9k_keyboard_device : public device_t |
| 40 | class victor_9000_keyboard_t : public device_t |
| 41 | 41 | { |
| 42 | 42 | public: |
| 43 | 43 | // construction/destruction |
| 44 | | victor9k_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 44 | victor_9000_keyboard_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 45 | 45 | |
| 46 | | template<class _Object> static devcb_base &set_kbrdy_handler(device_t &device, _Object object) { return downcast<victor9k_keyboard_device &>(device).m_kbrdy_handler.set_callback(object); } |
| 47 | | template<class _Object> static devcb_base &set_kbdata_handler(device_t &device, _Object object) { return downcast<victor9k_keyboard_device &>(device).m_kbdata_handler.set_callback(object); } |
| 46 | template<class _Object> static devcb_base &set_kbrdy_cb(device_t &device, _Object object) { return downcast<victor_9000_keyboard_t &>(device).m_kbrdy_cb.set_callback(object); } |
| 47 | template<class _Object> static devcb_base &set_kbdata_cb(device_t &device, _Object object) { return downcast<victor_9000_keyboard_t &>(device).m_kbdata_cb.set_callback(object); } |
| 48 | 48 | |
| 49 | 49 | // optional information overrides |
| 50 | 50 | virtual const rom_entry *device_rom_region() const; |
| r242340 | r242341 | |
| 62 | 62 | protected: |
| 63 | 63 | // device-level overrides |
| 64 | 64 | virtual void device_start(); |
| 65 | | virtual void device_reset(); |
| 66 | 65 | |
| 67 | 66 | private: |
| 68 | 67 | required_device<cpu_device> m_maincpu; |
| r242340 | r242341 | |
| 80 | 79 | required_ioport m_yb; |
| 81 | 80 | required_ioport m_yc; |
| 82 | 81 | |
| 83 | | devcb_write_line m_kbrdy_handler; |
| 84 | | devcb_write_line m_kbdata_handler; |
| 82 | devcb_write_line m_kbrdy_cb; |
| 83 | devcb_write_line m_kbdata_cb; |
| 85 | 84 | |
| 85 | UINT8 m_p1; |
| 86 | 86 | UINT8 m_y; |
| 87 | int m_stb; |
| 88 | int m_y12; |
| 87 | 89 | int m_kbrdy; |
| 88 | 90 | int m_kbdata; |
| 89 | 91 | int m_kback; |