trunk/src/mess/drivers/apc.c
| r19044 | r19045 | |
| 111 | 111 | DECLARE_READ8_MEMBER(apc_dma_r); |
| 112 | 112 | DECLARE_WRITE8_MEMBER(apc_dma_w); |
| 113 | 113 | |
| 114 | UINT8 m_keyb_press, m_keyb_status; |
| 115 | DECLARE_INPUT_CHANGED_MEMBER(key_stroke); |
| 116 | |
| 114 | 117 | DECLARE_WRITE_LINE_MEMBER(apc_master_set_int_line); |
| 115 | 118 | DECLARE_READ8_MEMBER(get_slave_ack); |
| 116 | 119 | DECLARE_WRITE_LINE_MEMBER(apc_dma_hrq_changed); |
| r19044 | r19045 | |
| 330 | 333 | |
| 331 | 334 | READ8_MEMBER(apc_state::apc_kbd_r) |
| 332 | 335 | { |
| 333 | | //printf("%08x\n",offset); |
| 334 | | return 0; |
| 336 | UINT8 res; |
| 337 | |
| 338 | switch(offset) |
| 339 | { |
| 340 | case 0: res = m_keyb_press; break; |
| 341 | case 1: res = m_keyb_status; break; |
| 342 | default: |
| 343 | res = 0; |
| 344 | //printf("KEYB %08x\n",offset); |
| 345 | break; |
| 346 | } |
| 347 | |
| 348 | return res; |
| 335 | 349 | } |
| 336 | 350 | |
| 337 | 351 | WRITE8_MEMBER(apc_state::apc_kbd_w) |
| 338 | 352 | { |
| 339 | | printf("%08x %02x\n",offset,data); |
| 353 | printf("KEYB %08x %02x\n",offset,data); |
| 340 | 354 | } |
| 341 | 355 | |
| 342 | 356 | WRITE8_MEMBER(apc_state::apc_dma_segments_w) |
| r19044 | r19045 | |
| 395 | 409 | // ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 396 | 410 | AM_RANGE(0x00, 0x1f) AM_READWRITE8(apc_dma_r, apc_dma_w,0xff00) |
| 397 | 411 | AM_RANGE(0x20, 0x23) AM_DEVREADWRITE8_LEGACY("pic8259_master", pic8259_r, pic8259_w, 0x00ff) // i8259 |
| 398 | | AM_RANGE(0x28, 0x2f) AM_READWRITE8(apc_port_28_r, apc_port_28_w, 0xffff) |
| 412 | AM_RANGE(0x28, 0x2f) AM_READWRITE8(apc_port_28_r, apc_port_28_w, 0xffff) // i8259 (even) / pit8253 (odd) |
| 399 | 413 | // 0x30, 0x37 serial port 0/1 (i8251) (even/odd) |
| 400 | 414 | AM_RANGE(0x38, 0x3f) AM_WRITE8(apc_dma_segments_w,0x00ff) |
| 401 | 415 | AM_RANGE(0x40, 0x43) AM_READWRITE8(apc_gdc_r, apc_gdc_w, 0xffff) |
| r19044 | r19045 | |
| 410 | 424 | // AM_DEVREADWRITE8("upd7220_btm", upd7220_device, read, write, 0x00ff) |
| 411 | 425 | ADDRESS_MAP_END |
| 412 | 426 | |
| 427 | /* TODO: key repeat, remove port impulse! */ |
| 428 | INPUT_CHANGED_MEMBER(apc_state::key_stroke) |
| 429 | { |
| 430 | if(newval && !oldval) |
| 431 | { |
| 432 | m_keyb_press = (UINT8)(FPTR)(param) & 0xff; |
| 433 | //m_keyb_status |= 1; //TODO: what this really signals? busy? |
| 434 | pic8259_ir4_w(machine().device("pic8259_master"), 1); |
| 435 | } |
| 436 | |
| 437 | if(oldval && !newval) |
| 438 | { |
| 439 | m_keyb_press = 0; |
| 440 | m_keyb_status &= ~1; |
| 441 | pic8259_ir4_w(machine().device("pic8259_master"), 0); |
| 442 | } |
| 443 | } |
| 444 | |
| 445 | |
| 413 | 446 | static INPUT_PORTS_START( apc ) |
| 447 | PORT_START("KEY0") |
| 448 | PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_UNUSED) |
| 449 | PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x31) |
| 450 | PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x32) |
| 451 | PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x33) |
| 452 | PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x34) |
| 453 | PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x35) |
| 454 | PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x36) |
| 455 | PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x37) |
| 456 | |
| 457 | PORT_START("KEY1") |
| 458 | PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("BREAK") PORT_CODE(KEYCODE_ESC) PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x96) |
| 459 | |
| 460 | |
| 414 | 461 | /* dummy active high structure */ |
| 415 | 462 | PORT_START("SYSA") |
| 416 | 463 | PORT_DIPNAME( 0x01, 0x00, "SYSA" ) |
| r19044 | r19045 | |
| 480 | 527 | pic8259_ir3_w(machine().device("pic8259_slave"), state); |
| 481 | 528 | } |
| 482 | 529 | |
| 530 | static IRQ_CALLBACK(irq_callback) |
| 531 | { |
| 532 | return pic8259_acknowledge( device->machine().device( "pic8259_master" )); |
| 533 | } |
| 534 | |
| 483 | 535 | void apc_state::machine_start() |
| 484 | 536 | { |
| 537 | machine().device("maincpu")->execute().set_irq_acknowledge_callback(irq_callback); |
| 538 | |
| 485 | 539 | m_fdc->set_rate(500000); |
| 486 | 540 | m_fdc->setup_intrq_cb(upd765a_device::line_cb(FUNC(apc_state::fdc_irq), this)); |
| 487 | 541 | m_fdc->setup_drq_cb(upd765a_device::line_cb(FUNC(apc_state::fdc_drq), this)); |
| r19044 | r19045 | |
| 489 | 543 | |
| 490 | 544 | void apc_state::machine_reset() |
| 491 | 545 | { |
| 546 | m_keyb_status = m_keyb_press = 0; |
| 492 | 547 | } |
| 493 | 548 | |
| 494 | 549 | |
| r19044 | r19045 | |
| 568 | 623 | irq assignment: |
| 569 | 624 | |
| 570 | 625 | 8259 master: |
| 571 | | ir0 |
| 626 | ir0 (enabled at POST, unknown purpose) |
| 572 | 627 | ir1 |
| 573 | 628 | ir2 |
| 574 | | ir3 |
| 629 | ir3 (enabled after CP/M loading, serial?) |
| 575 | 630 | ir4 keyboard (almost trusted, check code at fe64a) |
| 576 | 631 | ir5 |
| 577 | 632 | ir6 |
| r19044 | r19045 | |
| 588 | 643 | ir7 |
| 589 | 644 | */ |
| 590 | 645 | |
| 591 | | |
| 592 | 646 | WRITE_LINE_MEMBER(apc_state::apc_master_set_int_line) |
| 593 | 647 | { |
| 594 | 648 | //printf("%02x\n",interrupt); |
| 649 | // printf("irq %d\n",state); |
| 595 | 650 | machine().device("maincpu")->execute().set_input_line(0, state ? HOLD_LINE : CLEAR_LINE); |
| 596 | 651 | } |
| 597 | 652 | |