From 1565fb9ba6e2543558553131dc2e31dedfc41213 Mon Sep 17 00:00:00 2001 From: angelosa Date: Mon, 4 Mar 2024 02:35:14 +0100 Subject: machine/sis85c496: add int pin mapper --- src/devices/machine/sis85c496.cpp | 115 ++++++++++++++++++++++++++++++++++++++ src/devices/machine/sis85c496.h | 14 +++++ src/mame/pc/pcipc_sis.cpp | 4 ++ 3 files changed, 133 insertions(+) diff --git a/src/devices/machine/sis85c496.cpp b/src/devices/machine/sis85c496.cpp index 89cd9e2b9d2..bc2f52e547d 100644 --- a/src/devices/machine/sis85c496.cpp +++ b/src/devices/machine/sis85c496.cpp @@ -34,6 +34,7 @@ void sis85c496_host_device::config_map(address_map &map) ); 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)); @@ -194,6 +195,9 @@ void sis85c496_host_device::device_start() 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; memory_offset = 0; @@ -235,6 +239,8 @@ void sis85c496_host_device::device_reset() 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() @@ -596,6 +602,115 @@ void sis85c496_host_device::pc_irq12m_w(int state) { m_pic8259_slave->ir4_w(stat 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]; +} + +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; diff --git a/src/devices/machine/sis85c496.h b/src/devices/machine/sis85c496.h index f1ec6de304e..47cb0729655 100644 --- a/src/devices/machine/sis85c496.h +++ b/src/devices/machine/sis85c496.h @@ -46,6 +46,11 @@ public: void set_cpu_tag(const char *tag); void set_ram_size(int ram_size); + void pc_pirqa_w(int state); + void pc_pirqb_w(int state); + void pc_pirqc_w(int state); + void pc_pirqd_w(int state); + void pc_irq1_w(int state); void pc_irq3_w(int state); void pc_irq4_w(int state); @@ -104,6 +109,8 @@ private: uint8_t m_channel_check; uint8_t m_nmi_enabled; + uint8_t m_pirqrc[4]; + int ram_size; std::vector ram; uint32_t m_mailbox; @@ -175,6 +182,13 @@ private: void pc_dma_write_word(offs_t offset, uint8_t data); void cpu_a20_w(int state); void cpu_reset_w(int state); + + uint8_t pirqrc_r(offs_t offset); + void pirqrc_w(offs_t offset, uint8_t data); + void redirect_irq(int irq, int state); + + int pin_mapper(int pin); + void irq_handler(int line, int state); }; DECLARE_DEVICE_TYPE(SIS85C496_HOST, sis85c496_host_device) diff --git a/src/mame/pc/pcipc_sis.cpp b/src/mame/pc/pcipc_sis.cpp index 1d14b594ae1..9fa42529dd5 100644 --- a/src/mame/pc/pcipc_sis.cpp +++ b/src/mame/pc/pcipc_sis.cpp @@ -16,6 +16,7 @@ #include "emu.h" #include "bus/isa/isa_cards.h" +#include "bus/pci/pci_slot.h" #include "bus/rs232/hlemouse.h" #include "bus/rs232/null_modem.h" #include "bus/rs232/rs232.h" @@ -158,6 +159,9 @@ void sis496_voodoo1_state::sis496_voodoo1(machine_config &config) m_screen->set_size(640, 480); m_screen->set_visarea(0, 640 - 1, 0, 480 - 1); m_screen->set_screen_update(PCI_ID_VIDEO, FUNC(voodoo_1_pci_device::screen_update)); + + PCI_SLOT(config, "pci:1", pci_cards, 10, 0, 1, 2, 3, nullptr); + PCI_SLOT(config, "pci:2", pci_cards, 11, 1, 2, 3, 0, nullptr); } // generic placeholder for unknown BIOS types -- cgit v1.2.3