trunk/src/mess/drivers/pc9801.c
| r19233 | r19234 | |
| 260 | 260 | : driver_device(mconfig, type, tag), |
| 261 | 261 | m_maincpu(*this, "maincpu"), |
| 262 | 262 | m_dmac(*this, "i8237"), |
| 263 | m_fdc_2hd(*this, "upd765_2hd"), |
| 264 | m_fdc_2dd(*this, "upd765_2dd"), |
| 263 | 265 | m_rtc(*this, UPD1990A_TAG), |
| 264 | 266 | m_sio(*this, UPD8251_TAG), |
| 265 | 267 | m_hgdc1(*this, "upd7220_chr"), |
| r19233 | r19234 | |
| 269 | 271 | |
| 270 | 272 | required_device<cpu_device> m_maincpu; |
| 271 | 273 | required_device<am9517a_device> m_dmac; |
| 274 | required_device<upd765a_device> m_fdc_2hd; |
| 275 | optional_device<upd765a_device> m_fdc_2dd; |
| 272 | 276 | required_device<upd1990a_device> m_rtc; |
| 273 | 277 | required_device<i8251_device> m_sio; |
| 274 | 278 | required_device<upd7220_device> m_hgdc1; |
| r19233 | r19234 | |
| 441 | 445 | void fdc_2dd_drq(bool state); |
| 442 | 446 | |
| 443 | 447 | void pc9801rs_fdc_irq(bool state); |
| 448 | void pc9801rs_fdc_drq(bool state); |
| 444 | 449 | |
| 445 | 450 | private: |
| 446 | 451 | UINT8 m_sdip_read(UINT16 port, UINT8 sdip_offset); |
| r19233 | r19234 | |
| 484 | 489 | DECLARE_WRITE_LINE_MEMBER(fdc_2hd_drq); |
| 485 | 490 | DECLARE_WRITE_LINE_MEMBER(fdc_2dd_irq); |
| 486 | 491 | DECLARE_WRITE_LINE_MEMBER(fdc_2dd_drq); |
| 487 | | DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_irq); |
| 492 | // DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_irq); |
| 488 | 493 | }; |
| 489 | 494 | |
| 490 | 495 | |
| r19233 | r19234 | |
| 771 | 776 | } |
| 772 | 777 | else // odd |
| 773 | 778 | { |
| 774 | | printf("Write to DMA bank register %d %02x\n",(offset >> 1) & 3,data); |
| 775 | | m_dma_offset[(offset >> 1) & 3] = data & 0x0f; // TODO: old was +1? Why? |
| 779 | printf("Write to DMA bank register %d %02x\n",((offset >> 1)+1) & 3,data); |
| 780 | m_dma_offset[((offset >> 1)+1) & 3] = data & 0x0f; |
| 776 | 781 | } |
| 777 | 782 | } |
| 778 | 783 | |
| r19233 | r19234 | |
| 1620 | 1625 | |
| 1621 | 1626 | static ADDRESS_MAP_START( pc9801rs_io, AS_IO, 32, pc9801_state ) |
| 1622 | 1627 | AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r, pc9801_00_w, 0xffffffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA |
| 1623 | | |
| 1628 | AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r, pc9801_20_w, 0xffffffff) // RTC / DMA registers (LS244) |
| 1624 | 1629 | AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r, pc9801_30_w, 0xffffffff) //i8251 RS232c / i8255 system port |
| 1625 | 1630 | AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r, pc9801_40_w, 0xffffffff) //i8255 printer port / i8251 keyboard |
| 1626 | 1631 | AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r, pc9801_60_w, 0xffffffff) //upd7220 character ports / <undefined> |
| r19233 | r19234 | |
| 1676 | 1681 | |
| 1677 | 1682 | static ADDRESS_MAP_START( pc9801ux_io, AS_IO, 16, pc9801_state ) |
| 1678 | 1683 | AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r, pc9801_00_w, 0xffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA |
| 1679 | | |
| 1684 | AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r, pc9801_20_w, 0xffff) // RTC / DMA registers (LS244) |
| 1680 | 1685 | AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r, pc9801_30_w, 0xffff) //i8251 RS232c / i8255 system port |
| 1681 | 1686 | AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r, pc9801_40_w, 0xffff) //i8255 printer port / i8251 keyboard |
| 1682 | 1687 | AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r, pc9801_60_w, 0xffff) //upd7220 character ports / <undefined> |
| r19233 | r19234 | |
| 1945 | 1950 | |
| 1946 | 1951 | static ADDRESS_MAP_START( pc9821_io, AS_IO, 32, pc9801_state ) |
| 1947 | 1952 | AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r, pc9801_00_w, 0xffffffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA |
| 1948 | | |
| 1953 | AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r, pc9801_20_w, 0xffffffff) // RTC / DMA registers (LS244) |
| 1949 | 1954 | AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r, pc9801_30_w, 0xffffffff) //i8251 RS232c / i8255 system port |
| 1950 | 1955 | AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r, pc9801_40_w, 0xffffffff) //i8255 printer port / i8251 keyboard |
| 1951 | 1956 | AM_RANGE(0x005c, 0x005f) AM_READ(pc9821_timestamp_r) AM_WRITENOP |
| r19233 | r19234 | |
| 2476 | 2481 | WRITE_LINE_MEMBER(pc9801_state::pc9801_tc_w ) |
| 2477 | 2482 | { |
| 2478 | 2483 | /* floppy terminal count */ |
| 2479 | | // m_fdc->tc_w(state); |
| 2484 | m_fdc_2hd->tc_w(state); |
| 2480 | 2485 | |
| 2481 | 2486 | // printf("TC %02x\n",state); |
| 2482 | 2487 | } |
| r19233 | r19234 | |
| 2513 | 2518 | WRITE_LINE_MEMBER(pc9801_state::pc9801_dack2_w){ /*printf("%02x 2\n",state);*/ set_dma_channel(machine(), 2, state); } |
| 2514 | 2519 | WRITE_LINE_MEMBER(pc9801_state::pc9801_dack3_w){ /*printf("%02x 3\n",state);*/ set_dma_channel(machine(), 3, state); } |
| 2515 | 2520 | |
| 2516 | | /* TODO: double check channel for this one */ |
| 2517 | 2521 | READ8_MEMBER(pc9801_state::fdc_r) |
| 2518 | 2522 | { |
| 2519 | | printf("2dd DACK R\n"); |
| 2520 | | |
| 2521 | | return 0xff; |
| 2523 | return m_fdc_2hd->dma_r(); |
| 2522 | 2524 | } |
| 2523 | 2525 | |
| 2524 | 2526 | WRITE8_MEMBER(pc9801_state::fdc_w) |
| 2525 | 2527 | { |
| 2526 | | printf("2dd DACK W\n"); |
| 2528 | m_fdc_2hd->dma_w(data); |
| 2527 | 2529 | } |
| 2528 | 2530 | |
| 2531 | /* TODO: check channels for this */ |
| 2529 | 2532 | static I8237_INTERFACE( dmac_intf ) |
| 2530 | 2533 | { |
| 2531 | 2534 | DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dma_hrq_changed), |
| r19233 | r19234 | |
| 2537 | 2540 | { 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) } |
| 2538 | 2541 | }; |
| 2539 | 2542 | |
| 2543 | |
| 2544 | /* |
| 2545 | ch1 cs-4231a |
| 2546 | ch2 FDC |
| 2547 | ch3 SCSI |
| 2548 | */ |
| 2549 | static I8237_INTERFACE( pc9801rs_dmac_intf ) |
| 2550 | { |
| 2551 | DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dma_hrq_changed), |
| 2552 | DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_tc_w), |
| 2553 | DEVCB_DRIVER_MEMBER(pc9801_state, pc9801_dma_read_byte), |
| 2554 | DEVCB_DRIVER_MEMBER(pc9801_state, pc9801_dma_write_byte), |
| 2555 | { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,fdc_r), DEVCB_NULL }, |
| 2556 | { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,fdc_w), DEVCB_NULL }, |
| 2557 | { 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) } |
| 2558 | }; |
| 2559 | |
| 2540 | 2560 | /**************************************** |
| 2541 | 2561 | * |
| 2542 | 2562 | * PPI interfaces |
| r19233 | r19234 | |
| 2650 | 2670 | pic8259_ir2_w(machine().device("pic8259_slave"), state); |
| 2651 | 2671 | } |
| 2652 | 2672 | |
| 2673 | void pc9801_state::pc9801rs_fdc_drq(bool state) |
| 2674 | { |
| 2675 | if(m_fdc_ctrl & 1) |
| 2676 | m_dmac->dreq2_w(state); |
| 2677 | else |
| 2678 | printf("DRQ %02x %d\n",m_fdc_ctrl,state); |
| 2679 | } |
| 2680 | |
| 2653 | 2681 | static UPD1990A_INTERFACE( pc9801_upd1990a_intf ) |
| 2654 | 2682 | { |
| 2655 | 2683 | DEVCB_NULL, |
| r19233 | r19234 | |
| 2736 | 2764 | upd765a_device *fdc; |
| 2737 | 2765 | fdc = machine().device<upd765a_device>(":upd765_2hd"); |
| 2738 | 2766 | fdc->setup_intrq_cb(upd765a_device::line_cb(FUNC(pc9801_state::pc9801rs_fdc_irq), this)); |
| 2739 | | fdc->setup_drq_cb(upd765a_device::line_cb(FUNC(pc9801_state::fdc_2hd_drq), this)); |
| 2767 | fdc->setup_drq_cb(upd765a_device::line_cb(FUNC(pc9801_state::pc9801rs_fdc_drq), this)); |
| 2740 | 2768 | } |
| 2741 | 2769 | |
| 2742 | 2770 | MACHINE_START_MEMBER(pc9801_state,pc9821) |
| r19233 | r19234 | |
| 2920 | 2948 | MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9801rs) |
| 2921 | 2949 | |
| 2922 | 2950 | MCFG_PIT8253_ADD( "pit8253", pc9801rs_pit8253_config ) |
| 2923 | | MCFG_I8237_ADD("i8237", 16000000, dmac_intf) // unknown clock |
| 2951 | MCFG_I8237_ADD("i8237", 16000000, pc9801rs_dmac_intf) // unknown clock |
| 2924 | 2952 | MCFG_PIC8259_ADD( "pic8259_master", pic8259_master_config ) |
| 2925 | 2953 | MCFG_PIC8259_ADD( "pic8259_slave", pic8259_slave_config ) |
| 2926 | 2954 | MCFG_I8255_ADD( "ppi8255_sys", ppi_system_intf ) |
| r19233 | r19234 | |
| 2981 | 3009 | MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9821) |
| 2982 | 3010 | |
| 2983 | 3011 | MCFG_PIT8253_ADD( "pit8253", pc9801rs_pit8253_config ) |
| 2984 | | MCFG_I8237_ADD("i8237", 16000000, dmac_intf) // unknown clock |
| 3012 | MCFG_I8237_ADD("i8237", 16000000, pc9801rs_dmac_intf) // unknown clock |
| 2985 | 3013 | MCFG_PIC8259_ADD( "pic8259_master", pic8259_master_config ) |
| 2986 | 3014 | MCFG_PIC8259_ADD( "pic8259_slave", pic8259_slave_config ) |
| 2987 | 3015 | MCFG_I8255_ADD( "ppi8255_sys", ppi_system_intf ) |