trunk/src/mess/drivers/pc9801.c
| r19283 | r19284 | |
| 475 | 475 | DECLARE_WRITE_LINE_MEMBER(pc9801_dack1_w); |
| 476 | 476 | DECLARE_WRITE_LINE_MEMBER(pc9801_dack2_w); |
| 477 | 477 | DECLARE_WRITE_LINE_MEMBER(pc9801_dack3_w); |
| 478 | | DECLARE_READ8_MEMBER(fdc_r); |
| 479 | | DECLARE_WRITE8_MEMBER(fdc_w); |
| 478 | DECLARE_READ8_MEMBER(fdc_2hd_r); |
| 479 | DECLARE_WRITE8_MEMBER(fdc_2hd_w); |
| 480 | DECLARE_READ8_MEMBER(fdc_2dd_r); |
| 481 | DECLARE_WRITE8_MEMBER(fdc_2dd_w); |
| 480 | 482 | DECLARE_READ8_MEMBER(ppi_sys_porta_r); |
| 481 | 483 | DECLARE_READ8_MEMBER(ppi_sys_portb_r); |
| 482 | 484 | DECLARE_READ8_MEMBER(ppi_prn_portb_r); |
| r19283 | r19284 | |
| 1187 | 1189 | m_fdc_2hd_ctrl = data; |
| 1188 | 1190 | pc9801_fdc_2hd_update_ready(NULL, 0); |
| 1189 | 1191 | |
| 1190 | | //machine().device<floppy_connector>("upd765_2hd:0")->get_device()->mon_w(!(data & 0x40)); |
| 1191 | | //machine().device<floppy_connector>("upd765_2hd:1")->get_device()->mon_w(!(data & 0x40)); |
| 1192 | machine().device<floppy_connector>("upd765_2hd:0")->get_device()->mon_w(data & 0x40 ? ASSERT_LINE : CLEAR_LINE); |
| 1193 | machine().device<floppy_connector>("upd765_2hd:1")->get_device()->mon_w(data & 0x40 ? ASSERT_LINE : CLEAR_LINE); |
| 1192 | 1194 | break; |
| 1193 | 1195 | } |
| 1194 | 1196 | } |
| r19283 | r19284 | |
| 1239 | 1241 | machine().device<upd765a_device>("upd765_2dd")->reset(); |
| 1240 | 1242 | |
| 1241 | 1243 | m_fdc_2dd_ctrl = data; |
| 1242 | | //floppy_mon_w(floppy_get_device(machine(), 0), (data & 8) ? CLEAR_LINE : ASSERT_LINE); |
| 1243 | | //floppy_mon_w(floppy_get_device(machine(), 1), (data & 8) ? CLEAR_LINE : ASSERT_LINE); |
| 1244 | | //floppy_drive_set_ready_state(floppy_get_device(machine(), 0), (data & 8), 0); |
| 1245 | | //floppy_drive_set_ready_state(floppy_get_device(machine(), 1), (data & 8), 0); |
| 1244 | machine().device<floppy_connector>("upd765_2dd:0")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE); |
| 1245 | machine().device<floppy_connector>("upd765_2dd:1")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE); |
| 1246 | 1246 | break; |
| 1247 | 1247 | } |
| 1248 | 1248 | } |
| r19283 | r19284 | |
| 1516 | 1516 | |
| 1517 | 1517 | pc9801_fdc_2hd_update_ready(NULL, 0); |
| 1518 | 1518 | |
| 1519 | | machine().device<floppy_connector>("upd765_2hd:0")->get_device()->mon_w(!(data & 0x08)); |
| 1520 | | machine().device<floppy_connector>("upd765_2hd:1")->get_device()->mon_w(!(data & 0x08)); |
| 1519 | machine().device<floppy_connector>("upd765_2hd:0")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE); |
| 1520 | machine().device<floppy_connector>("upd765_2hd:1")->get_device()->mon_w(data & 0x08 ? ASSERT_LINE : CLEAR_LINE); |
| 1521 | 1521 | return; |
| 1522 | 1522 | } |
| 1523 | 1523 | } |
| r19283 | r19284 | |
| 2496 | 2496 | { |
| 2497 | 2497 | /* floppy terminal count */ |
| 2498 | 2498 | m_fdc_2hd->tc_w(state); |
| 2499 | // TODO: 2dd? |
| 2499 | 2500 | |
| 2500 | 2501 | // printf("TC %02x\n",state); |
| 2501 | 2502 | } |
| r19283 | r19284 | |
| 2505 | 2506 | address_space &program = m_maincpu->space(AS_PROGRAM); |
| 2506 | 2507 | offs_t addr = (m_dma_offset[m_dack] << 16) | offset; |
| 2507 | 2508 | |
| 2508 | | // printf("%08x\n",addr); |
| 2509 | printf("%08x\n",addr); |
| 2509 | 2510 | |
| 2510 | 2511 | return program.read_byte(addr); |
| 2511 | 2512 | } |
| r19283 | r19284 | |
| 2516 | 2517 | address_space &program = m_maincpu->space(AS_PROGRAM); |
| 2517 | 2518 | offs_t addr = (m_dma_offset[m_dack] << 16) | offset; |
| 2518 | 2519 | |
| 2519 | | // printf("%08x %02x\n",addr,data); |
| 2520 | printf("%08x %02x\n",addr,data); |
| 2520 | 2521 | |
| 2521 | 2522 | program.write_byte(addr, data); |
| 2522 | 2523 | } |
| r19283 | r19284 | |
| 2532 | 2533 | WRITE_LINE_MEMBER(pc9801_state::pc9801_dack2_w){ /*printf("%02x 2\n",state);*/ set_dma_channel(machine(), 2, state); } |
| 2533 | 2534 | WRITE_LINE_MEMBER(pc9801_state::pc9801_dack3_w){ /*printf("%02x 3\n",state);*/ set_dma_channel(machine(), 3, state); } |
| 2534 | 2535 | |
| 2535 | | READ8_MEMBER(pc9801_state::fdc_r) |
| 2536 | READ8_MEMBER(pc9801_state::fdc_2hd_r) |
| 2536 | 2537 | { |
| 2537 | 2538 | return m_fdc_2hd->dma_r(); |
| 2538 | 2539 | } |
| 2539 | 2540 | |
| 2540 | | WRITE8_MEMBER(pc9801_state::fdc_w) |
| 2541 | WRITE8_MEMBER(pc9801_state::fdc_2hd_w) |
| 2541 | 2542 | { |
| 2542 | 2543 | m_fdc_2hd->dma_w(data); |
| 2543 | 2544 | } |
| 2544 | 2545 | |
| 2545 | | /* TODO: check channels for this */ |
| 2546 | READ8_MEMBER(pc9801_state::fdc_2dd_r) |
| 2547 | { |
| 2548 | return m_fdc_2dd->dma_r(); |
| 2549 | } |
| 2550 | |
| 2551 | WRITE8_MEMBER(pc9801_state::fdc_2dd_w) |
| 2552 | { |
| 2553 | m_fdc_2dd->dma_w(data); |
| 2554 | } |
| 2555 | |
| 2556 | |
| 2557 | /* TODO: check channels 0 - 1 */ |
| 2546 | 2558 | static I8237_INTERFACE( dmac_intf ) |
| 2547 | 2559 | { |
| 2548 | 2560 | DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dma_hrq_changed), |
| 2549 | 2561 | DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_tc_w), |
| 2550 | 2562 | DEVCB_DRIVER_MEMBER(pc9801_state, pc9801_dma_read_byte), |
| 2551 | 2563 | DEVCB_DRIVER_MEMBER(pc9801_state, pc9801_dma_write_byte), |
| 2552 | | { DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,fdc_r), DEVCB_DRIVER_MEMBER(pc9801_state,fdc_r), DEVCB_DRIVER_MEMBER(pc9801_state,fdc_r) }, |
| 2553 | | { DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,fdc_w), DEVCB_DRIVER_MEMBER(pc9801_state,fdc_w), DEVCB_DRIVER_MEMBER(pc9801_state,fdc_w) }, |
| 2564 | { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,fdc_2hd_r), DEVCB_DRIVER_MEMBER(pc9801_state,fdc_2dd_r) }, |
| 2565 | { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,fdc_2hd_w), DEVCB_DRIVER_MEMBER(pc9801_state,fdc_2dd_w) }, |
| 2554 | 2566 | { DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dack0_w), DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dack1_w), DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dack2_w), DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dack3_w) } |
| 2555 | 2567 | }; |
| 2556 | 2568 | |
| r19283 | r19284 | |
| 2566 | 2578 | DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_tc_w), |
| 2567 | 2579 | DEVCB_DRIVER_MEMBER(pc9801_state, pc9801_dma_read_byte), |
| 2568 | 2580 | DEVCB_DRIVER_MEMBER(pc9801_state, pc9801_dma_write_byte), |
| 2569 | | { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,fdc_r), DEVCB_NULL }, |
| 2570 | | { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,fdc_w), DEVCB_NULL }, |
| 2581 | { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,fdc_2hd_r), DEVCB_NULL }, |
| 2582 | { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,fdc_2hd_w), DEVCB_NULL }, |
| 2571 | 2583 | { DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dack0_w), DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dack1_w), DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dack2_w), DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dack3_w) } |
| 2572 | 2584 | }; |
| 2573 | 2585 | |
| r19283 | r19284 | |
| 2648 | 2660 | |
| 2649 | 2661 | void pc9801_state::fdc_2hd_irq(bool state) |
| 2650 | 2662 | { |
| 2651 | | printf("IRQ 2HD %d\n",state); |
| 2663 | // printf("IRQ 2HD %d\n",state); |
| 2652 | 2664 | pic8259_ir3_w(machine().device("pic8259_slave"), state); |
| 2653 | 2665 | } |
| 2654 | 2666 | |
| 2655 | 2667 | void pc9801_state::fdc_2hd_drq(bool state) |
| 2656 | 2668 | { |
| 2657 | 2669 | printf("%02x DRQ\n",state); |
| 2670 | m_dmac->dreq2_w(state); |
| 2658 | 2671 | } |
| 2659 | 2672 | |
| 2660 | 2673 | void pc9801_state::fdc_2dd_irq(bool state) |
| r19283 | r19284 | |
| 2670 | 2683 | void pc9801_state::fdc_2dd_drq(bool state) |
| 2671 | 2684 | { |
| 2672 | 2685 | printf("%02x DRQ\n",state); |
| 2686 | m_dmac->dreq3_w(state); |
| 2673 | 2687 | } |
| 2674 | 2688 | |
| 2675 | 2689 | void pc9801_state::pc9801rs_fdc_irq(bool state) |
| 2676 | 2690 | { |
| 2677 | 2691 | /* 0xffaf8 */ |
| 2678 | 2692 | |
| 2679 | | //cprintf("%02x %d\n",m_fdc_ctrl,state); |
| 2693 | //printf("%02x %d\n",m_fdc_ctrl,state); |
| 2680 | 2694 | |
| 2681 | 2695 | if(m_fdc_ctrl & 1) |
| 2682 | 2696 | pic8259_ir3_w(machine().device("pic8259_slave"), state); |
| r19283 | r19284 | |
| 2775 | 2789 | fdc->setup_intrq_cb(upd765a_device::line_cb(FUNC(pc9801_state::fdc_2dd_irq), this)); |
| 2776 | 2790 | fdc->setup_drq_cb(upd765a_device::line_cb(FUNC(pc9801_state::fdc_2dd_drq), this)); |
| 2777 | 2791 | } |
| 2792 | m_fdc_2hd->set_rate(500000); |
| 2793 | m_fdc_2dd->set_rate(250000); |
| 2778 | 2794 | } |
| 2779 | 2795 | |
| 2780 | 2796 | MACHINE_START_MEMBER(pc9801_state,pc9801rs) |