trunk/src/mess/drivers/ngen.c
| r242996 | r242997 | |
| 67 | 67 | #include "machine/pit8253.h" |
| 68 | 68 | #include "machine/z80dart.h" |
| 69 | 69 | #include "machine/wd_fdc.h" |
| 70 | #include "machine/wd2010.h" |
| 70 | 71 | #include "bus/rs232/rs232.h" |
| 71 | 72 | #include "machine/ngen_kb.h" |
| 72 | 73 | #include "machine/clock.h" |
| 74 | #include "imagedev/harddriv.h" |
| 73 | 75 | |
| 74 | 76 | class ngen_state : public driver_device |
| 75 | 77 | { |
| r242996 | r242997 | |
| 89 | 91 | m_fdc(*this,"fdc"), |
| 90 | 92 | m_fd0(*this,"fdc:0"), |
| 91 | 93 | m_fdc_timer(*this,"fdc_timer"), |
| 92 | | m_hdc_timer(*this,"hdc_timer") |
| 94 | m_hdc(*this,"hdc"), |
| 95 | m_hdc_timer(*this,"hdc_timer"), |
| 96 | m_hd_buffer(*this,"hd_buffer_ram") |
| 93 | 97 | {} |
| 94 | 98 | |
| 95 | 99 | DECLARE_WRITE_LINE_MEMBER(pit_out0_w); |
| r242996 | r242997 | |
| 129 | 133 | DECLARE_READ8_MEMBER(irq_cb); |
| 130 | 134 | DECLARE_WRITE8_MEMBER(hdc_control_w); |
| 131 | 135 | DECLARE_WRITE8_MEMBER(disk_addr_ext); |
| 136 | DECLARE_READ8_MEMBER(hd_buffer_r); |
| 137 | DECLARE_WRITE8_MEMBER(hd_buffer_w); |
| 132 | 138 | |
| 133 | 139 | protected: |
| 134 | 140 | virtual void machine_reset(); |
| 141 | virtual void machine_start(); |
| 135 | 142 | |
| 136 | 143 | private: |
| 137 | 144 | required_device<i80186_cpu_device> m_maincpu; |
| r242996 | r242997 | |
| 147 | 154 | optional_device<wd2797_t> m_fdc; |
| 148 | 155 | optional_device<floppy_connector> m_fd0; |
| 149 | 156 | optional_device<pit8253_device> m_fdc_timer; |
| 157 | optional_device<wd2010_device> m_hdc; |
| 150 | 158 | optional_device<pit8253_device> m_hdc_timer; |
| 159 | optional_shared_ptr<UINT8> m_hd_buffer; |
| 151 | 160 | |
| 152 | 161 | void set_dma_channel(int channel, int state); |
| 153 | 162 | |
| r242996 | r242997 | |
| 470 | 479 | case 0x0a: |
| 471 | 480 | case 0x0b: |
| 472 | 481 | if(mem_mask & 0x00ff) |
| 473 | | m_fdc_timer->write(space,offset,data & 0xff); |
| 482 | m_fdc_timer->write(space,offset-0x08,data & 0xff); |
| 474 | 483 | break; |
| 475 | 484 | case 0x10: |
| 476 | 485 | case 0x11: |
| r242996 | r242997 | |
| 480 | 489 | case 0x15: |
| 481 | 490 | case 0x16: |
| 482 | 491 | case 0x17: |
| 492 | if(mem_mask & 0x00ff) |
| 493 | m_hdc->write(space,offset-0x10,data & 0xff); |
| 483 | 494 | logerror("WD1010 register %i write %02x mask %04x\n",offset-0x10,data & 0xff,mem_mask); |
| 484 | 495 | break; |
| 485 | 496 | case 0x18: |
| r242996 | r242997 | |
| 487 | 498 | case 0x1a: |
| 488 | 499 | case 0x1b: |
| 489 | 500 | if(mem_mask & 0x00ff) |
| 490 | | m_hdc_timer->write(space,offset,data & 0xff); |
| 501 | m_hdc_timer->write(space,offset-0x18,data & 0xff); |
| 491 | 502 | break; |
| 492 | 503 | } |
| 493 | 504 | } |
| r242996 | r242997 | |
| 510 | 521 | case 0x0a: |
| 511 | 522 | case 0x0b: |
| 512 | 523 | if(mem_mask & 0x00ff) |
| 513 | | ret = m_fdc_timer->read(space,offset); |
| 524 | ret = m_fdc_timer->read(space,offset-0x08); |
| 514 | 525 | break; |
| 515 | 526 | case 0x10: |
| 516 | 527 | case 0x11: |
| r242996 | r242997 | |
| 520 | 531 | case 0x15: |
| 521 | 532 | case 0x16: |
| 522 | 533 | case 0x17: |
| 534 | if(mem_mask & 0x00ff) |
| 535 | ret = m_hdc->read(space,offset-0x10); |
| 523 | 536 | logerror("WD1010 register %i read, mask %04x\n",offset-0x10,mem_mask); |
| 524 | 537 | break; |
| 525 | 538 | case 0x18: |
| r242996 | r242997 | |
| 527 | 540 | case 0x1a: |
| 528 | 541 | case 0x1b: |
| 529 | 542 | if(mem_mask & 0x00ff) |
| 530 | | ret = m_hdc_timer->read(space,offset); |
| 543 | ret = m_hdc_timer->read(space,offset-0x18); |
| 531 | 544 | break; |
| 532 | 545 | } |
| 533 | 546 | |
| r242996 | r242997 | |
| 585 | 598 | m_disk_page = data & 0x7f; |
| 586 | 599 | } |
| 587 | 600 | |
| 601 | READ8_MEMBER(ngen_state::hd_buffer_r) |
| 602 | { |
| 603 | return m_hd_buffer[offset]; |
| 604 | } |
| 605 | |
| 606 | WRITE8_MEMBER(ngen_state::hd_buffer_w) |
| 607 | { |
| 608 | m_hd_buffer[offset] = data; |
| 609 | } |
| 610 | |
| 588 | 611 | WRITE_LINE_MEMBER( ngen_state::dma_hrq_changed ) |
| 589 | 612 | { |
| 590 | 613 | m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); |
| r242996 | r242997 | |
| 603 | 626 | { |
| 604 | 627 | if(state) |
| 605 | 628 | { |
| 606 | | if(m_hdc_control & 0x04) // ROM transfer? |
| 629 | if(m_hdc_control & 0x04) // ROM transfer |
| 607 | 630 | m_hdc_control &= ~0x04; // switch it off when done |
| 608 | 631 | } |
| 609 | 632 | } |
| r242996 | r242997 | |
| 689 | 712 | return m_pic->acknowledge(); |
| 690 | 713 | } |
| 691 | 714 | |
| 715 | void ngen_state::machine_start() |
| 716 | { |
| 717 | m_hd_buffer.allocate(1024*8); // 8kB buffer RAM for HD controller |
| 718 | } |
| 719 | |
| 692 | 720 | void ngen_state::machine_reset() |
| 693 | 721 | { |
| 694 | 722 | m_port00 = 0; |
| r242996 | r242997 | |
| 837 | 865 | MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE("maincpu",i80186_cpu_device,drq1_w)) |
| 838 | 866 | MCFG_WD_FDC_FORCE_READY |
| 839 | 867 | MCFG_DEVICE_ADD("fdc_timer", PIT8253, 0) |
| 840 | | MCFG_PIT8253_CLK0(XTAL_20MHz / 20) |
| 841 | | MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic",pic8259_device,ir7_w)) |
| 868 | MCFG_PIT8253_CLK0(XTAL_20MHz / 20) |
| 869 | MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic",pic8259_device,ir7_w)) // clocked on FDC data register access |
| 842 | 870 | MCFG_PIT8253_CLK1(XTAL_20MHz / 20) |
| 843 | | MCFG_PIT8253_OUT1_HANDLER(DEVWRITELINE("pic",pic8259_device,ir7_w)) |
| 844 | | MCFG_PIT8253_CLK2(XTAL_20MHz / 20) |
| 845 | | MCFG_PIT8253_OUT2_HANDLER(DEVWRITELINE("pic",pic8259_device,ir7_w)) |
| 846 | | // TODO: WD1010 HDC (not implemented) |
| 871 | MCFG_PIT8253_OUT1_HANDLER(DEVWRITELINE("pic",pic8259_device,ir7_w)) // 1MHz |
| 872 | MCFG_PIT8253_CLK2(XTAL_20MHz / 10) |
| 873 | MCFG_PIT8253_OUT2_HANDLER(DEVWRITELINE("pic",pic8259_device,ir7_w)) |
| 874 | // TODO: WD1010 HDC (not implemented), use WD2010 for now |
| 875 | MCFG_DEVICE_ADD("hdc", WD2010, XTAL_20MHz / 4) |
| 876 | MCFG_WD2010_IN_BCS_CB(READ8(ngen_state,hd_buffer_r)) |
| 877 | MCFG_WD2010_OUT_BCS_CB(WRITE8(ngen_state,hd_buffer_w)) |
| 878 | MCFG_WD2010_IN_DRDY_CB(VCC) |
| 879 | MCFG_WD2010_IN_INDEX_CB(VCC) |
| 880 | MCFG_WD2010_IN_WF_CB(VCC) |
| 881 | MCFG_WD2010_IN_TK000_CB(VCC) |
| 882 | MCFG_WD2010_IN_SC_CB(VCC) |
| 847 | 883 | MCFG_DEVICE_ADD("hdc_timer", PIT8253, 0) |
| 884 | MCFG_PIT8253_CLK2(XTAL_20MHz / 10) // 2MHz |
| 848 | 885 | MCFG_FLOPPY_DRIVE_ADD("fdc:0", ngen_floppies, "525qd", floppy_image_device::default_floppy_formats) |
| 886 | MCFG_HARDDISK_ADD("hard0") |
| 849 | 887 | |
| 850 | 888 | MACHINE_CONFIG_END |
| 851 | 889 | |