diff options
Diffstat (limited to 'src/devices/machine/sis85c496.cpp')
-rw-r--r-- | src/devices/machine/sis85c496.cpp | 381 |
1 files changed, 286 insertions, 95 deletions
diff --git a/src/devices/machine/sis85c496.cpp b/src/devices/machine/sis85c496.cpp index 87b01edf2e6..75602d8fcd3 100644 --- a/src/devices/machine/sis85c496.cpp +++ b/src/devices/machine/sis85c496.cpp @@ -14,17 +14,27 @@ #include "emu.h" #include "sis85c496.h" + #include "bus/pc_kbd/keyboards.h" #include "speaker.h" -DEFINE_DEVICE_TYPE(SIS85C496, sis85c496_host_device, "sis85c496", "SiS 85C496/497 chipset") +DEFINE_DEVICE_TYPE(SIS85C496_HOST, sis85c496_host_device, "sis85c496_host", "SiS 85C496/497 chipset") void sis85c496_host_device::config_map(address_map &map) { pci_host_device::config_map(map); map(0x40, 0x40).rw(FUNC(sis85c496_host_device::dram_config_r), FUNC(sis85c496_host_device::dram_config_w)); map(0x44, 0x45).rw(FUNC(sis85c496_host_device::shadow_config_r), FUNC(sis85c496_host_device::shadow_config_w)); + map(0x48, 0x4f).lrw8( + NAME([this] (offs_t offset) { return m_dram_boundary[offset]; }), + NAME([this] (offs_t offset, u8 data) { + logerror("SiS496: DRAM boundary [%02x] set %02x\n", offset, data); + m_dram_boundary[offset] = data; + }) + ); + map(0x58, 0x59).rw(FUNC(sis85c496_host_device::ide_vesa_config_r), FUNC(sis85c496_host_device::ide_vesa_config_w)); map(0x5a, 0x5a).rw(FUNC(sis85c496_host_device::smram_ctrl_r), FUNC(sis85c496_host_device::smram_ctrl_w)); + map(0xc0, 0xc3).rw(FUNC(sis85c496_host_device::pirqrc_r), FUNC(sis85c496_host_device::pirqrc_w)); map(0xc8, 0xcb).rw(FUNC(sis85c496_host_device::mailbox_r), FUNC(sis85c496_host_device::mailbox_w)); map(0xd0, 0xd0).rw(FUNC(sis85c496_host_device::bios_config_r), FUNC(sis85c496_host_device::bios_config_w)); map(0xd1, 0xd1).rw(FUNC(sis85c496_host_device::isa_decoder_r), FUNC(sis85c496_host_device::isa_decoder_w)); @@ -34,27 +44,22 @@ void sis85c496_host_device::internal_io_map(address_map &map) { pci_host_device::io_configuration_access_map(map); map(0x0000, 0x001f).rw("dma8237_1", FUNC(am9517a_device::read), FUNC(am9517a_device::write)); - map(0x0020, 0x003f).rw("pic8259_master", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + map(0x0020, 0x0021).rw("pic8259_master", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); +// map(0x0022, 0x0023) 85C497 super I/O map(0x0040, 0x005f).rw("pit8254", FUNC(pit8254_device::read), FUNC(pit8254_device::write)); map(0x0060, 0x0063).rw(FUNC(sis85c496_host_device::at_keybc_r), FUNC(sis85c496_host_device::at_keybc_w)); map(0x0064, 0x0067).rw("keybc", FUNC(at_keyboard_controller_device::status_r), FUNC(at_keyboard_controller_device::command_w)); - map(0x0070, 0x007f).rw("rtc", FUNC(ds12885_device::read), FUNC(ds12885_device::write)); + map(0x0070, 0x0070).lr8(NAME([this] () { return m_ds12885->get_address(); })).w(FUNC(sis85c496_host_device::rtc_address_nmi_w)); + map(0x0071, 0x0071).rw("rtc", FUNC(ds12885_device::data_r), FUNC(ds12885_device::data_w)); map(0x0080, 0x009f).rw(FUNC(sis85c496_host_device::at_page8_r), FUNC(sis85c496_host_device::at_page8_w)); - map(0x00a0, 0x00bf).rw("pic8259_slave", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + map(0x00a0, 0x00a1).rw("pic8259_slave", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0x00c0, 0x00df).rw(FUNC(sis85c496_host_device::at_dma8237_2_r), FUNC(sis85c496_host_device::at_dma8237_2_w)); - map(0x00e0, 0x00ef).noprw(); + // map(0x00e0, 0x00ef) MCA bus (cfr. Bochs) or PnP + map(0x00eb, 0x00eb).lw8(NAME([] (offs_t offset, u8 data) { })); } void sis85c496_host_device::device_add_mconfig(machine_config &config) { - PIT8254(config, m_pit8254, 0); - m_pit8254->set_clk<0>(4772720/4); // heartbeat IRQ - m_pit8254->out_handler<0>().set(FUNC(sis85c496_host_device::at_pit8254_out0_changed)); - m_pit8254->set_clk<1>(4772720/4); // DRAM refresh - m_pit8254->out_handler<1>().set(FUNC(sis85c496_host_device::at_pit8254_out1_changed)); - m_pit8254->set_clk<2>(4772720/4); // PIO port C pin 4, and speaker polling enough - m_pit8254->out_handler<2>().set(FUNC(sis85c496_host_device::at_pit8254_out2_changed)); - AM9517A(config, m_dma8237_1, XTAL(14'318'181)/3); m_dma8237_1->out_hreq_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq0_w)); m_dma8237_1->out_eop_callback().set(FUNC(sis85c496_host_device::at_dma8237_out_eop)); @@ -89,7 +94,7 @@ void sis85c496_host_device::device_add_mconfig(machine_config &config) m_dma8237_2->out_dack_callback<3>().set(FUNC(sis85c496_host_device::pc_dack7_w)); PIC8259(config, m_pic8259_master, 0); - m_pic8259_master->out_int_callback().set(FUNC(sis85c496_host_device::cpu_int_w)); + m_pic8259_master->out_int_callback().set_inputline(m_maincpu, 0); m_pic8259_master->in_sp_callback().set_constant(1); m_pic8259_master->read_slave_ack_callback().set(FUNC(sis85c496_host_device::get_slave_ack)); @@ -97,22 +102,60 @@ void sis85c496_host_device::device_add_mconfig(machine_config &config) m_pic8259_slave->out_int_callback().set(m_pic8259_master, FUNC(pic8259_device::ir2_w)); m_pic8259_slave->in_sp_callback().set_constant(0); + PIT8254(config, m_pit8254, 0); + m_pit8254->set_clk<0>(4772720/4); // heartbeat IRQ + m_pit8254->out_handler<0>().set(m_pic8259_master, FUNC(pic8259_device::ir0_w)); + m_pit8254->set_clk<1>(4772720/4); // DRAM refresh + m_pit8254->out_handler<1>().set(FUNC(sis85c496_host_device::at_pit8254_out1_changed)); + m_pit8254->set_clk<2>(4772720/4); // PIO port C pin 4, and speaker polling enough + m_pit8254->out_handler<2>().set(FUNC(sis85c496_host_device::at_pit8254_out2_changed)); + + // TODO: PS/2 AT_KEYBOARD_CONTROLLER(config, m_keybc, XTAL(12'000'000)); m_keybc->hot_res().set(FUNC(sis85c496_host_device::cpu_reset_w)); m_keybc->gate_a20().set(FUNC(sis85c496_host_device::cpu_a20_w)); - m_keybc->kbd_irq().set("pic8259_master", FUNC(pic8259_device::ir1_w)); - m_keybc->kbd_clk().set("pc_kbdc", FUNC(pc_kbdc_device::clock_write_from_mb)); - m_keybc->kbd_data().set("pc_kbdc", FUNC(pc_kbdc_device::data_write_from_mb)); + m_keybc->kbd_irq().set(m_pic8259_master, FUNC(pic8259_device::ir1_w)); + m_keybc->kbd_clk().set(m_pc_kbdc, FUNC(pc_kbdc_device::clock_write_from_mb)); + m_keybc->kbd_data().set(m_pc_kbdc, FUNC(pc_kbdc_device::data_write_from_mb)); - PC_KBDC(config, m_pc_kbdc, 0); + PC_KBDC(config, m_pc_kbdc, pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL); m_pc_kbdc->out_clock_cb().set("keybc", FUNC(at_keyboard_controller_device::kbd_clk_w)); m_pc_kbdc->out_data_cb().set("keybc", FUNC(at_keyboard_controller_device::kbd_data_w)); - PC_KBDC_SLOT(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL).set_pc_kbdc_slot(subdevice("pc_kbdc")); DS12885(config, m_ds12885); m_ds12885->irq().set(m_pic8259_slave, FUNC(pic8259_device::ir0_w)); m_ds12885->set_century_index(0x32); + // TODO: ISA bus clock, irqs + ISA16(config, m_isabus, 0); + m_isabus->set_memspace(m_maincpu, AS_PROGRAM); + m_isabus->set_iospace(m_maincpu, AS_IO); + m_isabus->irq3_callback().set(FUNC(sis85c496_host_device::pc_irq3_w)); + m_isabus->irq4_callback().set(FUNC(sis85c496_host_device::pc_irq4_w)); + m_isabus->irq5_callback().set(FUNC(sis85c496_host_device::pc_irq5_w)); + m_isabus->irq6_callback().set(FUNC(sis85c496_host_device::pc_irq6_w)); + m_isabus->irq7_callback().set(FUNC(sis85c496_host_device::pc_irq7_w)); + m_isabus->irq2_callback().set(FUNC(sis85c496_host_device::pc_irq9_w)); + m_isabus->irq10_callback().set(FUNC(sis85c496_host_device::pc_irq10_w)); + m_isabus->irq11_callback().set(FUNC(sis85c496_host_device::pc_irq11_w)); + m_isabus->irq12_callback().set(FUNC(sis85c496_host_device::pc_irq12m_w)); + m_isabus->irq14_callback().set(FUNC(sis85c496_host_device::pc_irq14_w)); + m_isabus->irq15_callback().set(FUNC(sis85c496_host_device::pc_irq15_w)); + m_isabus->drq0_callback().set(m_dma8237_1, FUNC(am9517a_device::dreq0_w)); + m_isabus->drq1_callback().set(m_dma8237_1, FUNC(am9517a_device::dreq1_w)); + m_isabus->drq2_callback().set(m_dma8237_1, FUNC(am9517a_device::dreq2_w)); + m_isabus->drq3_callback().set(m_dma8237_1, FUNC(am9517a_device::dreq3_w)); + m_isabus->drq5_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq1_w)); + m_isabus->drq6_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq2_w)); + m_isabus->drq7_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq3_w)); + m_isabus->iochck_callback().set(FUNC(sis85c496_host_device::iochck_w)); + + IDE_CONTROLLER_32(config, m_ide[0]).options(ata_devices, "hdd", nullptr, false); + m_ide[0]->irq_handler().set(m_pic8259_slave, FUNC(pic8259_device::ir6_w)); + + IDE_CONTROLLER_32(config, m_ide[1]).options(ata_devices, "cdrom", nullptr, false); + m_ide[1]->irq_handler().set(m_pic8259_slave, FUNC(pic8259_device::ir7_w)); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50); @@ -120,7 +163,7 @@ void sis85c496_host_device::device_add_mconfig(machine_config &config) sis85c496_host_device::sis85c496_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_host_device(mconfig, SIS85C496, tag, owner, clock), + : pci_host_device(mconfig, SIS85C496_HOST, tag, owner, clock), m_maincpu(*this, finder_base::DUMMY_TAG), m_pic8259_master(*this, "pic8259_master"), m_pic8259_slave(*this, "pic8259_slave"), @@ -130,7 +173,9 @@ sis85c496_host_device::sis85c496_host_device(const machine_config &mconfig, cons m_keybc(*this, "keybc"), m_speaker(*this, "speaker"), m_ds12885(*this, "rtc"), - m_pc_kbdc(*this, "pc_kbdc"), + m_pc_kbdc(*this, "kbd"), + m_isabus(*this, "isabus"), + m_ide(*this, "ide%u", 1U), m_at_spkrdata(0), m_pit_out2(0), m_dma_channel(0), m_cur_eop(false), m_dma_high_byte(0), m_at_speaker(0), m_refresh(false), m_channel_check(0), m_nmi_enabled(0) { } @@ -149,8 +194,10 @@ void sis85c496_host_device::device_start() { pci_host_device::device_start(); - memory_space = &m_maincpu->space(AS_PROGRAM); - io_space = &m_maincpu->space(AS_IO); + set_spaces(&m_maincpu->space(AS_PROGRAM), &m_maincpu->space(AS_IO)); + + m_pci_root->set_pin_mapper(pci_pin_mapper(*this, FUNC(sis85c496_host_device::pin_mapper))); + m_pci_root->set_irq_handler(pci_irq_handler(*this, FUNC(sis85c496_host_device::irq_handler))); memory_window_start = 0; memory_window_end = 0xffffffff; @@ -167,6 +214,8 @@ void sis85c496_host_device::device_start() m_smramctrl = 0; ram.resize(ram_size/4); + + save_item(NAME(m_shadctrl)); } void sis85c496_host_device::reset_all_mappings() @@ -190,6 +239,18 @@ void sis85c496_host_device::device_reset() m_isa_decoder = 0xff; m_shadctrl = 0; m_smramctrl = 0; + m_ide_vesa_ctrl = 0; + + memset(m_pirqrc, 0x80, sizeof(m_pirqrc)); +} + +void sis85c496_host_device::device_config_complete() +{ + auto isabus = m_isabus.finder_target(); + isabus.first.subdevice<isa16_device>(isabus.second)->set_memspace(m_maincpu, AS_PROGRAM); + isabus.first.subdevice<isa16_device>(isabus.second)->set_iospace(m_maincpu, AS_IO); + + pci_device::device_config_complete(); } void sis85c496_host_device::map_bios(address_space *memory_space, uint32_t start, uint32_t end) @@ -222,12 +283,12 @@ void sis85c496_host_device::map_extra(uint64_t memory_window_start, uint64_t mem if (m_smramctrl & 0x08) { memory_space->install_ram(0x000e0000, 0x000effff, &ram[0x000b0000/4]); - logerror("Sis496: SMRAM at Exxxx, phys Bxxxx\n"); + logerror("SiS496: SMRAM at Exxxx, phys Bxxxx\n"); } else { memory_space->install_ram(0x000e0000, 0x000effff, &ram[0x000a0000/4]); - logerror("Sis496: SMRAM at Exxxx, phys Axxxx\n"); + logerror("SiS496: SMRAM at Exxxx, phys Axxxx\n"); } // map the high BIOS at FFFExxxx if enabled @@ -313,21 +374,40 @@ void sis85c496_host_device::map_extra(uint64_t memory_window_start, uint64_t mem // is SMRAM enabled at 6xxxx? if ((m_smramctrl & 0x12) == 0x02) { - fatalerror("Sis486: SMRAM enabled at 6xxxx, not yet supported!\n"); + throw emu_fatalerror("SiS496: SMRAM enabled at 6xxxx, not yet supported!\n"); } + // TODO: determined by ISA decoder + m_isabus->remap(AS_PROGRAM, 0, 1 << 24); + m_isabus->remap(AS_IO, 0, 0xffff); + if (m_isa_decoder & 0x01) { logerror("SiS496: ISA base 640K enabled\n"); memory_space->install_ram(0x00000000, 0x0009ffff, &ram[0x00000000/4]); } + if (BIT(m_ide_vesa_ctrl, 8)) + { + // TODO: doesn't seem to work right for anything after IDE[0] primary + // bit 9: swaps IDE channels + io_space->install_readwrite_handler(0x170, 0x177, read32s_delegate(*m_ide[1], FUNC(ide_controller_32_device::cs0_r)), write32s_delegate(*m_ide[1], FUNC(ide_controller_32_device::cs0_w))); + + io_space->install_readwrite_handler(0x1f0, 0x1f7, read32s_delegate(*m_ide[0], FUNC(ide_controller_32_device::cs0_r)), write32s_delegate(*m_ide[0], FUNC(ide_controller_32_device::cs0_w))); + + //if (!BIT(m_ide_vesa_ctrl, 6)) + io_space->install_readwrite_handler(0x370, 0x377, read32s_delegate(*m_ide[1], FUNC(ide_controller_32_device::cs1_r)), write32s_delegate(*m_ide[1], FUNC(ide_controller_32_device::cs1_w))); + + //if (!BIT(m_ide_vesa_ctrl, 7)) + io_space->install_readwrite_handler(0x3f0, 0x3f7, read32s_delegate(*m_ide[0], FUNC(ide_controller_32_device::cs1_r)), write32s_delegate(*m_ide[0], FUNC(ide_controller_32_device::cs1_w))); + } + // 32 megs of RAM (todo: don't hardcode) memory_space->install_ram(0x00100000, 0x01ffffff, &ram[0x00100000/4]); } // Southbridge -READ8_MEMBER( sis85c496_host_device::get_slave_ack ) +uint8_t sis85c496_host_device::get_slave_ack(offs_t offset) { if (offset==2) // IRQ = 2 return m_pic8259_slave->acknowledge(); @@ -341,27 +421,19 @@ void sis85c496_host_device::at_speaker_set_spkrdata(uint8_t data) m_speaker->level_w(m_at_spkrdata & m_pit_out2); } - - -WRITE_LINE_MEMBER( sis85c496_host_device::at_pit8254_out0_changed ) -{ - if (m_pic8259_master) - m_pic8259_master->ir0_w(state); -} - -WRITE_LINE_MEMBER( sis85c496_host_device::at_pit8254_out1_changed ) +void sis85c496_host_device::at_pit8254_out1_changed(int state) { if(state) m_refresh = !m_refresh; } -WRITE_LINE_MEMBER( sis85c496_host_device::at_pit8254_out2_changed ) +void sis85c496_host_device::at_pit8254_out2_changed(int state) { m_pit_out2 = state ? 1 : 0; m_speaker->level_w(m_at_spkrdata & m_pit_out2); } -READ8_MEMBER( sis85c496_host_device::at_page8_r ) +uint8_t sis85c496_host_device::at_page8_r(offs_t offset) { uint8_t data = m_at_pages[offset % 0x10]; @@ -384,7 +456,7 @@ READ8_MEMBER( sis85c496_host_device::at_page8_r ) } -WRITE8_MEMBER( sis85c496_host_device::at_page8_w ) +void sis85c496_host_device::at_page8_w(offs_t offset, uint8_t data) { m_at_pages[offset % 0x10] = data; @@ -409,7 +481,7 @@ WRITE8_MEMBER( sis85c496_host_device::at_page8_w ) } -WRITE_LINE_MEMBER( sis85c496_host_device::pc_dma_hrq_changed ) +void sis85c496_host_device::pc_dma_hrq_changed(int state) { m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); @@ -417,7 +489,7 @@ WRITE_LINE_MEMBER( sis85c496_host_device::pc_dma_hrq_changed ) m_dma8237_2->hack_w( state ); } -READ8_MEMBER(sis85c496_host_device::pc_dma_read_byte) +uint8_t sis85c496_host_device::pc_dma_read_byte(offs_t offset) { address_space& prog_space = m_maincpu->space(AS_PROGRAM); // get the right address space if(m_dma_channel == -1) @@ -430,7 +502,7 @@ READ8_MEMBER(sis85c496_host_device::pc_dma_read_byte) } -WRITE8_MEMBER(sis85c496_host_device::pc_dma_write_byte) +void sis85c496_host_device::pc_dma_write_byte(offs_t offset, uint8_t data) { address_space& prog_space = m_maincpu->space(AS_PROGRAM); // get the right address space if(m_dma_channel == -1) @@ -441,7 +513,7 @@ WRITE8_MEMBER(sis85c496_host_device::pc_dma_write_byte) } -READ8_MEMBER(sis85c496_host_device::pc_dma_read_word) +uint8_t sis85c496_host_device::pc_dma_read_word(offs_t offset) { address_space& prog_space = m_maincpu->space(AS_PROGRAM); // get the right address space if(m_dma_channel == -1) @@ -456,7 +528,7 @@ READ8_MEMBER(sis85c496_host_device::pc_dma_read_word) } -WRITE8_MEMBER(sis85c496_host_device::pc_dma_write_word) +void sis85c496_host_device::pc_dma_write_word(offs_t offset, uint8_t data) { address_space& prog_space = m_maincpu->space(AS_PROGRAM); // get the right address space if(m_dma_channel == -1) @@ -467,24 +539,24 @@ WRITE8_MEMBER(sis85c496_host_device::pc_dma_write_word) } -READ8_MEMBER( sis85c496_host_device::pc_dma8237_0_dack_r ) { return 0; } //m_isabus->dack_r(0); } -READ8_MEMBER( sis85c496_host_device::pc_dma8237_1_dack_r ) { return 0; } //m_isabus->dack_r(1); } -READ8_MEMBER( sis85c496_host_device::pc_dma8237_2_dack_r ) { return 0; } //m_isabus->dack_r(2); } -READ8_MEMBER( sis85c496_host_device::pc_dma8237_3_dack_r ) { return 0; } //m_isabus->dack_r(3); } -READ8_MEMBER( sis85c496_host_device::pc_dma8237_5_dack_r ) { return 0; } //m_isabus->dack_r(5); } -READ8_MEMBER( sis85c496_host_device::pc_dma8237_6_dack_r ) { return 0; } //m_isabus->dack_r(6); } -READ8_MEMBER( sis85c496_host_device::pc_dma8237_7_dack_r ) { return 0; } //m_isabus->dack_r(7); } +uint8_t sis85c496_host_device::pc_dma8237_0_dack_r() { return 0; } //m_isabus->dack_r(0); } +uint8_t sis85c496_host_device::pc_dma8237_1_dack_r() { return 0; } //m_isabus->dack_r(1); } +uint8_t sis85c496_host_device::pc_dma8237_2_dack_r() { return 0; } //m_isabus->dack_r(2); } +uint8_t sis85c496_host_device::pc_dma8237_3_dack_r() { return 0; } //m_isabus->dack_r(3); } +uint8_t sis85c496_host_device::pc_dma8237_5_dack_r() { return 0; } //m_isabus->dack_r(5); } +uint8_t sis85c496_host_device::pc_dma8237_6_dack_r() { return 0; } //m_isabus->dack_r(6); } +uint8_t sis85c496_host_device::pc_dma8237_7_dack_r() { return 0; } //m_isabus->dack_r(7); } -WRITE8_MEMBER( sis85c496_host_device::pc_dma8237_0_dack_w ){ } //m_isabus->dack_w(0, data); } -WRITE8_MEMBER( sis85c496_host_device::pc_dma8237_1_dack_w ){ } //m_isabus->dack_w(1, data); } -WRITE8_MEMBER( sis85c496_host_device::pc_dma8237_2_dack_w ){ } //m_isabus->dack_w(2, data); } -WRITE8_MEMBER( sis85c496_host_device::pc_dma8237_3_dack_w ){ } //m_isabus->dack_w(3, data); } -WRITE8_MEMBER( sis85c496_host_device::pc_dma8237_5_dack_w ){ } //m_isabus->dack_w(5, data); } -WRITE8_MEMBER( sis85c496_host_device::pc_dma8237_6_dack_w ){ } //m_isabus->dack_w(6, data); } -WRITE8_MEMBER( sis85c496_host_device::pc_dma8237_7_dack_w ){ } //m_isabus->dack_w(7, data); } +void sis85c496_host_device::pc_dma8237_0_dack_w(uint8_t data) { } //m_isabus->dack_w(0, data); } +void sis85c496_host_device::pc_dma8237_1_dack_w(uint8_t data) { } //m_isabus->dack_w(1, data); } +void sis85c496_host_device::pc_dma8237_2_dack_w(uint8_t data) { } //m_isabus->dack_w(2, data); } +void sis85c496_host_device::pc_dma8237_3_dack_w(uint8_t data) { } //m_isabus->dack_w(3, data); } +void sis85c496_host_device::pc_dma8237_5_dack_w(uint8_t data) { } //m_isabus->dack_w(5, data); } +void sis85c496_host_device::pc_dma8237_6_dack_w(uint8_t data) { } //m_isabus->dack_w(6, data); } +void sis85c496_host_device::pc_dma8237_7_dack_w(uint8_t data) { } //m_isabus->dack_w(7, data); } -WRITE_LINE_MEMBER( sis85c496_host_device::at_dma8237_out_eop ) +void sis85c496_host_device::at_dma8237_out_eop(int state) { m_cur_eop = state == ASSERT_LINE; //if(m_dma_channel != -1) @@ -508,16 +580,139 @@ void sis85c496_host_device::pc_select_dma_channel(int channel, bool state) } -WRITE_LINE_MEMBER( sis85c496_host_device::pc_dack0_w ) { pc_select_dma_channel(0, state); } -WRITE_LINE_MEMBER( sis85c496_host_device::pc_dack1_w ) { pc_select_dma_channel(1, state); } -WRITE_LINE_MEMBER( sis85c496_host_device::pc_dack2_w ) { pc_select_dma_channel(2, state); } -WRITE_LINE_MEMBER( sis85c496_host_device::pc_dack3_w ) { pc_select_dma_channel(3, state); } -WRITE_LINE_MEMBER( sis85c496_host_device::pc_dack4_w ) { m_dma8237_1->hack_w( state ? 0 : 1); } // it's inverted -WRITE_LINE_MEMBER( sis85c496_host_device::pc_dack5_w ) { pc_select_dma_channel(5, state); } -WRITE_LINE_MEMBER( sis85c496_host_device::pc_dack6_w ) { pc_select_dma_channel(6, state); } -WRITE_LINE_MEMBER( sis85c496_host_device::pc_dack7_w ) { pc_select_dma_channel(7, state); } +void sis85c496_host_device::pc_dack0_w(int state) { pc_select_dma_channel(0, state); } +void sis85c496_host_device::pc_dack1_w(int state) { pc_select_dma_channel(1, state); } +void sis85c496_host_device::pc_dack2_w(int state) { pc_select_dma_channel(2, state); } +void sis85c496_host_device::pc_dack3_w(int state) { pc_select_dma_channel(3, state); } +void sis85c496_host_device::pc_dack4_w(int state) { m_dma8237_1->hack_w( state ? 0 : 1); } // it's inverted +void sis85c496_host_device::pc_dack5_w(int state) { pc_select_dma_channel(5, state); } +void sis85c496_host_device::pc_dack6_w(int state) { pc_select_dma_channel(6, state); } +void sis85c496_host_device::pc_dack7_w(int state) { pc_select_dma_channel(7, state); } + +void sis85c496_host_device::pc_irq1_w(int state) { m_pic8259_master->ir1_w(state); } +void sis85c496_host_device::pc_irq3_w(int state) { m_pic8259_master->ir3_w(state); } +void sis85c496_host_device::pc_irq4_w(int state) { m_pic8259_master->ir4_w(state); } +void sis85c496_host_device::pc_irq5_w(int state) { m_pic8259_master->ir5_w(state); } +void sis85c496_host_device::pc_irq6_w(int state) { m_pic8259_master->ir6_w(state); } +void sis85c496_host_device::pc_irq7_w(int state) { m_pic8259_master->ir7_w(state); } +void sis85c496_host_device::pc_irq8n_w(int state) { m_pic8259_slave->ir0_w(state); } +void sis85c496_host_device::pc_irq9_w(int state) { m_pic8259_slave->ir1_w(state); } +void sis85c496_host_device::pc_irq10_w(int state) { m_pic8259_slave->ir2_w(state); } +void sis85c496_host_device::pc_irq11_w(int state) { m_pic8259_slave->ir3_w(state); } +void sis85c496_host_device::pc_irq12m_w(int state) { m_pic8259_slave->ir4_w(state); } +void sis85c496_host_device::pc_irq14_w(int state) { m_pic8259_slave->ir6_w(state); } +void sis85c496_host_device::pc_irq15_w(int state) { m_pic8259_slave->ir7_w(state); } + +uint8_t sis85c496_host_device::pirqrc_r(offs_t offset) +{ + return m_pirqrc[offset]; +} + +void sis85c496_host_device::pirqrc_w(offs_t offset, uint8_t data) +{ + m_pirqrc[offset] = data; + logerror("pirqrc[%d] = %02x\n", offset, m_pirqrc[offset]); +} + +int sis85c496_host_device::pin_mapper(int pin) +{ + if(pin < 0 || pin >= 4 || (m_pirqrc[pin] & 0x80)) + return -1; + return m_pirqrc[pin]; +} -READ8_MEMBER( sis85c496_host_device::at_portb_r ) +void sis85c496_host_device::irq_handler(int line, int state) +{ + if(line < 0 || line >= 16) + return; + + logerror("irq_handler %d %d\n", line, state); + redirect_irq(line, state); +} + +void sis85c496_host_device::pc_pirqa_w(int state) +{ + int irq = m_pirqrc[0] & 15; + + if (!(BIT(m_pirqrc[0], 7))) + return; + redirect_irq(irq, state); +} + +void sis85c496_host_device::pc_pirqb_w(int state) +{ + int irq = m_pirqrc[1] & 15; + + if (!(BIT(m_pirqrc[1], 7))) + return; + redirect_irq(irq, state); +} + +void sis85c496_host_device::pc_pirqc_w(int state) +{ + int irq = m_pirqrc[2] & 15; + + if (!(BIT(m_pirqrc[2], 7))) + return; + redirect_irq(irq, state); +} + +void sis85c496_host_device::pc_pirqd_w(int state) +{ + int irq = m_pirqrc[3] & 15; + + if (!(BIT(m_pirqrc[3], 7))) + return; + redirect_irq(irq, state); +} + +void sis85c496_host_device::redirect_irq(int irq, int state) +{ + switch (irq) + { + case 0: + case 1: + case 2: + case 8: + case 13: + break; + case 3: + m_pic8259_master->ir3_w(state); + break; + case 4: + m_pic8259_master->ir4_w(state); + break; + case 5: + m_pic8259_master->ir5_w(state); + break; + case 6: + m_pic8259_master->ir6_w(state); + break; + case 7: + m_pic8259_master->ir7_w(state); + break; + case 9: + m_pic8259_slave->ir1_w(state); + break; + case 10: + m_pic8259_slave->ir2_w(state); + break; + case 11: + m_pic8259_slave->ir3_w(state); + break; + case 12: + m_pic8259_slave->ir4_w(state); + break; + case 14: + m_pic8259_slave->ir6_w(state); + break; + case 15: + m_pic8259_slave->ir7_w(state); + break; + } +} + +uint8_t sis85c496_host_device::at_portb_r() { uint8_t data = m_at_speaker; data &= ~0xd0; /* AT BIOS don't likes this being set */ @@ -533,69 +728,65 @@ READ8_MEMBER( sis85c496_host_device::at_portb_r ) return data; } -WRITE8_MEMBER( sis85c496_host_device::at_portb_w ) +void sis85c496_host_device::at_portb_w(uint8_t data) { m_at_speaker = data; m_pit8254->write_gate2(BIT(data, 0)); at_speaker_set_spkrdata( BIT(data, 1)); m_channel_check = BIT(data, 3); - //m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0)); + if (m_channel_check) + m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); +} + +void sis85c496_host_device::iochck_w(int state) +{ + if (!state && !m_channel_check && m_nmi_enabled) + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } -READ8_MEMBER( sis85c496_host_device::at_dma8237_2_r ) +uint8_t sis85c496_host_device::at_dma8237_2_r(offs_t offset) { - return m_dma8237_2->read( offset / 2); + return m_dma8237_2->read(offset / 2); } -WRITE8_MEMBER( sis85c496_host_device::at_dma8237_2_w ) +void sis85c496_host_device::at_dma8237_2_w(offs_t offset, uint8_t data) { - m_dma8237_2->write( offset / 2, data); + m_dma8237_2->write(offset / 2, data); } -READ8_MEMBER( sis85c496_host_device::at_keybc_r ) +uint8_t sis85c496_host_device::at_keybc_r(offs_t offset) { switch (offset) { case 0: return m_keybc->data_r(); - case 1: return at_portb_r(space, 0); + case 1: return at_portb_r(); } return 0xff; } -WRITE8_MEMBER( sis85c496_host_device::at_keybc_w ) +void sis85c496_host_device::at_keybc_w(offs_t offset, uint8_t data) { switch (offset) { case 0: m_keybc->data_w(data); break; - case 1: at_portb_w(space, 0, data); break; - } -} - - -WRITE8_MEMBER( sis85c496_host_device::write_rtc ) -{ - if (offset==0) { - m_nmi_enabled = BIT(data,7); - //m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0)); - m_ds12885->write(0,data); - } - else { - m_ds12885->write(offset,data); + case 1: at_portb_w(data); break; } } -WRITE_LINE_MEMBER(sis85c496_host_device::cpu_int_w) +void sis85c496_host_device::rtc_address_nmi_w(uint8_t data) { - m_maincpu->set_input_line(0, state); + m_nmi_enabled = BIT(data, 7); + //m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0)); + m_ds12885->address_w(data); } -WRITE_LINE_MEMBER(sis85c496_host_device::cpu_a20_w) +void sis85c496_host_device::cpu_a20_w(int state) { m_maincpu->set_input_line(INPUT_LINE_A20, state); } -WRITE_LINE_MEMBER(sis85c496_host_device::cpu_reset_w) +void sis85c496_host_device::cpu_reset_w(int state) { m_maincpu->set_input_line(INPUT_LINE_RESET, state); } |