diff options
author | yz70s <yz70s@users.noreply.github.com> | 2018-08-20 21:56:10 +0200 |
---|---|---|
committer | yz70s <yz70s@users.noreply.github.com> | 2018-08-21 09:21:12 +0200 |
commit | f10af0683b603cb0e2414a82102b65cec75d9c52 (patch) | |
tree | 165ccfc28e846017d14eb1533c256422e97d174b /src/devices | |
parent | 970c812877ecf39a885c9161fe0d133a8258a429 (diff) |
i82371sb.cpp: add interrupt input lines (nw)
Also added eisa interrupt registers
pcipc.cpp is updated accordingly
Diffstat (limited to 'src/devices')
-rw-r--r-- | src/devices/bus/lpci/southbridge.cpp | 8 | ||||
-rw-r--r-- | src/devices/machine/i82371sb.cpp | 186 | ||||
-rw-r--r-- | src/devices/machine/i82371sb.h | 32 |
3 files changed, 201 insertions, 25 deletions
diff --git a/src/devices/bus/lpci/southbridge.cpp b/src/devices/bus/lpci/southbridge.cpp index e1d64cb4966..d566cc22515 100644 --- a/src/devices/bus/lpci/southbridge.cpp +++ b/src/devices/bus/lpci/southbridge.cpp @@ -90,15 +90,15 @@ MACHINE_CONFIG_START(southbridge_device::device_add_mconfig) MCFG_DEVICE_ADD("isabus", ISA16, 0) MCFG_ISA16_CPU(":maincpu") - MCFG_ISA_OUT_IRQ2_CB(WRITELINE("pic8259_slave", pic8259_device, ir2_w)) // in place of irq 2 on at irq 9 is used MCFG_ISA_OUT_IRQ3_CB(WRITELINE("pic8259_master", pic8259_device, ir3_w)) MCFG_ISA_OUT_IRQ4_CB(WRITELINE("pic8259_master", pic8259_device, ir4_w)) MCFG_ISA_OUT_IRQ5_CB(WRITELINE("pic8259_master", pic8259_device, ir5_w)) MCFG_ISA_OUT_IRQ6_CB(WRITELINE("pic8259_master", pic8259_device, ir6_w)) MCFG_ISA_OUT_IRQ7_CB(WRITELINE("pic8259_master", pic8259_device, ir7_w)) - MCFG_ISA_OUT_IRQ10_CB(WRITELINE("pic8259_slave", pic8259_device, ir3_w)) - MCFG_ISA_OUT_IRQ11_CB(WRITELINE("pic8259_slave", pic8259_device, ir4_w)) - MCFG_ISA_OUT_IRQ12_CB(WRITELINE("pic8259_slave", pic8259_device, ir5_w)) + MCFG_ISA_OUT_IRQ2_CB(WRITELINE("pic8259_slave", pic8259_device, ir1_w)) // in place of irq 2 on at irq 9 is used + MCFG_ISA_OUT_IRQ10_CB(WRITELINE("pic8259_slave", pic8259_device, ir2_w)) + MCFG_ISA_OUT_IRQ11_CB(WRITELINE("pic8259_slave", pic8259_device, ir3_w)) + MCFG_ISA_OUT_IRQ12_CB(WRITELINE("pic8259_slave", pic8259_device, ir4_w)) MCFG_ISA_OUT_IRQ14_CB(WRITELINE("pic8259_slave", pic8259_device, ir6_w)) MCFG_ISA_OUT_IRQ15_CB(WRITELINE("pic8259_slave", pic8259_device, ir7_w)) MCFG_ISA_OUT_DRQ0_CB(WRITELINE("dma8237_1", am9517a_device, dreq0_w)) diff --git a/src/devices/machine/i82371sb.cpp b/src/devices/machine/i82371sb.cpp index aa75113c634..4daaba31fba 100644 --- a/src/devices/machine/i82371sb.cpp +++ b/src/devices/machine/i82371sb.cpp @@ -17,7 +17,7 @@ void i82371sb_isa_device::config_map(address_map &map) map(0x60, 0x63).rw(FUNC(i82371sb_isa_device::pirqrc_r), FUNC(i82371sb_isa_device::pirqrc_w)); map(0x68, 0x68).rw(FUNC(i82371sb_isa_device::tom_r), FUNC(i82371sb_isa_device::tom_w)); map(0x6a, 0x6b).rw(FUNC(i82371sb_isa_device::mstat_r), FUNC(i82371sb_isa_device::mstat_w)); - map(0x70, 0x70).rw(FUNC(i82371sb_isa_device::mbirq0_r), FUNC(i82371sb_isa_device::mbirq0_w)); + map(0x70, 0x71).rw(FUNC(i82371sb_isa_device::mbirq01_r), FUNC(i82371sb_isa_device::mbirq01_w)); map(0x76, 0x77).rw(FUNC(i82371sb_isa_device::mbdma_r), FUNC(i82371sb_isa_device::mbdma_w)); map(0x82, 0x82).rw(FUNC(i82371sb_isa_device::dlc_r), FUNC(i82371sb_isa_device::dlc_w)); map(0xa0, 0xa0).rw(FUNC(i82371sb_isa_device::smicntl_r), FUNC(i82371sb_isa_device::smicntl_w)); @@ -39,6 +39,7 @@ void i82371sb_isa_device::internal_io_map(address_map &map) map(0x00a0, 0x00bf).rw("pic8259_slave", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0x00b2, 0x00b3).rw(FUNC(i82371sb_isa_device::read_apmcapms), FUNC(i82371sb_isa_device::write_apmcapms)); map(0x00c0, 0x00df).rw(FUNC(i82371sb_isa_device::at_dma8237_2_r), FUNC(i82371sb_isa_device::at_dma8237_2_w)); + map(0x04d0, 0x04d1).rw(FUNC(i82371sb_isa_device::eisa_irq_read), FUNC(i82371sb_isa_device::eisa_irq_write)); map(0x00e0, 0x00ef).noprw(); } @@ -103,17 +104,17 @@ MACHINE_CONFIG_START(i82371sb_isa_device::device_add_mconfig) MCFG_DEVICE_ADD("isabus", ISA16, 0) MCFG_ISA16_CPU(":maincpu") - MCFG_ISA_OUT_IRQ3_CB(WRITELINE("pic8259_master", pic8259_device, ir3_w)) - MCFG_ISA_OUT_IRQ4_CB(WRITELINE("pic8259_master", pic8259_device, ir4_w)) - MCFG_ISA_OUT_IRQ5_CB(WRITELINE("pic8259_master", pic8259_device, ir5_w)) - MCFG_ISA_OUT_IRQ6_CB(WRITELINE("pic8259_master", pic8259_device, ir6_w)) - MCFG_ISA_OUT_IRQ7_CB(WRITELINE("pic8259_master", pic8259_device, ir7_w)) - MCFG_ISA_OUT_IRQ2_CB(WRITELINE("pic8259_slave", pic8259_device, ir1_w)) // in place of irq 2 on at irq 9 is used - MCFG_ISA_OUT_IRQ10_CB(WRITELINE("pic8259_slave", pic8259_device, ir2_w)) - MCFG_ISA_OUT_IRQ11_CB(WRITELINE("pic8259_slave", pic8259_device, ir3_w)) - MCFG_ISA_OUT_IRQ12_CB(WRITELINE("pic8259_slave", pic8259_device, ir4_w)) - MCFG_ISA_OUT_IRQ14_CB(WRITELINE("pic8259_slave", pic8259_device, ir6_w)) - MCFG_ISA_OUT_IRQ15_CB(WRITELINE("pic8259_slave", pic8259_device, ir7_w)) + MCFG_ISA_OUT_IRQ3_CB(WRITELINE(*this, i82371sb_isa_device, pc_irq3_w)) + MCFG_ISA_OUT_IRQ4_CB(WRITELINE(*this, i82371sb_isa_device, pc_irq4_w)) + MCFG_ISA_OUT_IRQ5_CB(WRITELINE(*this, i82371sb_isa_device, pc_irq5_w)) + MCFG_ISA_OUT_IRQ6_CB(WRITELINE(*this, i82371sb_isa_device, pc_irq6_w)) + MCFG_ISA_OUT_IRQ7_CB(WRITELINE(*this, i82371sb_isa_device, pc_irq7_w)) + MCFG_ISA_OUT_IRQ2_CB(WRITELINE(*this, i82371sb_isa_device, pc_irq9_w)) + MCFG_ISA_OUT_IRQ10_CB(WRITELINE(*this, i82371sb_isa_device, pc_irq10_w)) + MCFG_ISA_OUT_IRQ11_CB(WRITELINE(*this, i82371sb_isa_device, pc_irq11_w)) + MCFG_ISA_OUT_IRQ12_CB(WRITELINE(*this, i82371sb_isa_device, pc_irq12m_w)) + MCFG_ISA_OUT_IRQ14_CB(WRITELINE(*this, i82371sb_isa_device, pc_irq14_w)) + MCFG_ISA_OUT_IRQ15_CB(WRITELINE(*this, i82371sb_isa_device, pc_irq15_w)) MCFG_ISA_OUT_DRQ0_CB(WRITELINE("dma8237_1", am9517a_device, dreq0_w)) MCFG_ISA_OUT_DRQ1_CB(WRITELINE("dma8237_1", am9517a_device, dreq1_w)) MCFG_ISA_OUT_DRQ2_CB(WRITELINE("dma8237_1", am9517a_device, dreq2_w)) @@ -135,7 +136,7 @@ i82371sb_isa_device::i82371sb_isa_device(const machine_config &mconfig, const ch m_pit8254(*this, "pit8254"), m_isabus(*this, "isabus"), m_speaker(*this, "speaker"), - 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) + m_at_spkrdata(0), m_pit_out2(0), m_dma_channel(0), m_cur_eop(false), m_dma_high_byte(0), m_eisa_irq_mode(0), m_at_speaker(0), m_refresh(false), m_channel_check(0), m_nmi_enabled(0) { set_ids(0x80867000, 0x03, 0x060100, 0x00000000); } @@ -157,6 +158,7 @@ void i82371sb_isa_device::device_reset() tom = 0x02; mstat = 0x0000; mbirq0 = 0x80; + mbirq1 = 0x80; memset(mbdma, 0x0c, sizeof(mbdma)); pcsc = 0x0002; apicbase = 0x00; @@ -248,15 +250,26 @@ WRITE16_MEMBER(i82371sb_isa_device::mstat_w) logerror("mstat = %04x\n", mstat); } -READ8_MEMBER (i82371sb_isa_device::mbirq0_r) +READ8_MEMBER (i82371sb_isa_device::mbirq01_r) { - return mbirq0; + if (offset == 0) + return mbirq0; + else + return mbirq1; } -WRITE8_MEMBER(i82371sb_isa_device::mbirq0_w) +WRITE8_MEMBER(i82371sb_isa_device::mbirq01_w) { - mbirq0 = data; - logerror("mbirq0 = %02x\n", mbirq0); + if (offset == 0) + { + mbirq0 = data; + logerror("mbirq0 = %02x\n", mbirq0); + } + else if (offset == 1) + { + mbirq1 = data; + logerror("mbirq1 = %02x\n", mbirq1); + } } READ8_MEMBER (i82371sb_isa_device::mbdma_r) @@ -663,6 +676,126 @@ WRITE_LINE_MEMBER( i82371sb_isa_device::pc_dack5_w ) { pc_select_dma_channel(5, WRITE_LINE_MEMBER( i82371sb_isa_device::pc_dack6_w ) { pc_select_dma_channel(6, state); } WRITE_LINE_MEMBER( i82371sb_isa_device::pc_dack7_w ) { pc_select_dma_channel(7, state); } +void i82371sb_isa_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; + } +} + +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_pirqa_w) +{ + int irq = pirqrc[0] & 15; + + if (pirqrc[0] & 128) + return; + redirect_irq(irq, state); +} + +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_pirqb_w ) +{ + int irq = pirqrc[1] & 15; + + if (pirqrc[1] & 128) + return; + redirect_irq(irq, state); +} + +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_pirqc_w ) +{ + int irq = pirqrc[2] & 15; + + if (pirqrc[2] & 128) + return; + redirect_irq(irq, state); +} + +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_pirqd_w ) +{ + int irq = pirqrc[3] & 15; + + if (pirqrc[3] & 128) + return; + redirect_irq(irq, state); +} + +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_mirq0_w ) +{ + int irq = mbirq0 & 15; + + if (mbirq0 & (128 | 32)) + return; + redirect_irq(irq, state); +} + +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_mirq1_w ) +{ + int irq = mbirq1 & 15; + + if (mbirq1 & 128) + return; + redirect_irq(irq, state); +} + +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_ferr_w ) +{ + m_pic8259_slave->ir5_w(state); +} + +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq1_w ) { m_pic8259_master->ir1_w(state); } +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq3_w ) { m_pic8259_master->ir3_w(state); } +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq4_w ) { m_pic8259_master->ir4_w(state); } +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq5_w ) { m_pic8259_master->ir5_w(state); } +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq6_w ) { m_pic8259_master->ir6_w(state); } +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq7_w ) { m_pic8259_master->ir7_w(state); } +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq8n_w ) { m_pic8259_slave->ir0_w(state); } +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq9_w ) { m_pic8259_slave->ir1_w(state); } +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq10_w ) { m_pic8259_slave->ir2_w(state); } +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq11_w ) { m_pic8259_slave->ir3_w(state); } +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq12m_w ) { m_pic8259_slave->ir4_w(state); } +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq14_w ) { m_pic8259_slave->ir6_w(state); } +WRITE_LINE_MEMBER( i82371sb_isa_device::pc_irq15_w ) { m_pic8259_slave->ir7_w(state); } + + READ8_MEMBER( i82371sb_isa_device::at_portb_r ) { uint8_t data = m_at_speaker; @@ -697,6 +830,23 @@ WRITE8_MEMBER( i82371sb_isa_device::at_dma8237_2_w ) m_dma8237_2->write( space, offset / 2, data); } +READ8_MEMBER(i82371sb_isa_device::eisa_irq_read) +{ + if (offset == 0) + return m_eisa_irq_mode & 0xff; + else + return m_eisa_irq_mode >> 8; +} + +WRITE8_MEMBER(i82371sb_isa_device::eisa_irq_write) +{ + if (offset == 0) + m_eisa_irq_mode = (m_eisa_irq_mode & 0xff00) | data; + else + m_eisa_irq_mode = (m_eisa_irq_mode & 0x00ff) | (data << 8); + // TODO: update m_pic8259_master and m_pic8259_slave with the new configuration +} + READ8_MEMBER( i82371sb_isa_device::read_apmcapms ) { if (offset == 0) diff --git a/src/devices/machine/i82371sb.h b/src/devices/machine/i82371sb.h index 6118ff61b6a..5f39b9ed07f 100644 --- a/src/devices/machine/i82371sb.h +++ b/src/devices/machine/i82371sb.h @@ -37,6 +37,28 @@ public: template <class Object> devcb_base &set_smi_callback(Object &&cb) { return m_smi_callback.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_boot_state_hook(Object &&cb) { return m_boot_state_hook.set_callback(std::forward<Object>(cb)); } + DECLARE_WRITE_LINE_MEMBER(pc_pirqa_w); + DECLARE_WRITE_LINE_MEMBER(pc_pirqb_w); + DECLARE_WRITE_LINE_MEMBER(pc_pirqc_w); + DECLARE_WRITE_LINE_MEMBER(pc_pirqd_w); + DECLARE_WRITE_LINE_MEMBER(pc_mirq0_w); + DECLARE_WRITE_LINE_MEMBER(pc_mirq1_w); + DECLARE_WRITE_LINE_MEMBER(pc_ferr_w); + + DECLARE_WRITE_LINE_MEMBER(pc_irq1_w); + DECLARE_WRITE_LINE_MEMBER(pc_irq3_w); + DECLARE_WRITE_LINE_MEMBER(pc_irq4_w); + DECLARE_WRITE_LINE_MEMBER(pc_irq5_w); + DECLARE_WRITE_LINE_MEMBER(pc_irq6_w); + DECLARE_WRITE_LINE_MEMBER(pc_irq7_w); + DECLARE_WRITE_LINE_MEMBER(pc_irq8n_w); + DECLARE_WRITE_LINE_MEMBER(pc_irq9_w); + DECLARE_WRITE_LINE_MEMBER(pc_irq10_w); + DECLARE_WRITE_LINE_MEMBER(pc_irq11_w); + DECLARE_WRITE_LINE_MEMBER(pc_irq12m_w); + DECLARE_WRITE_LINE_MEMBER(pc_irq14_w); + DECLARE_WRITE_LINE_MEMBER(pc_irq15_w); + protected: virtual void device_start() override; virtual void device_reset() override; @@ -100,8 +122,8 @@ private: DECLARE_WRITE8_MEMBER (tom_w); DECLARE_READ16_MEMBER (mstat_r); DECLARE_WRITE16_MEMBER(mstat_w); - DECLARE_READ8_MEMBER (mbirq0_r); - DECLARE_WRITE8_MEMBER (mbirq0_w); + DECLARE_READ8_MEMBER (mbirq01_r); + DECLARE_WRITE8_MEMBER (mbirq01_w); DECLARE_READ8_MEMBER (mbdma_r); DECLARE_WRITE8_MEMBER (mbdma_w); DECLARE_READ16_MEMBER (pcsc_r); @@ -136,6 +158,8 @@ private: DECLARE_WRITE8_MEMBER(ide2_write_cs1_w); DECLARE_READ8_MEMBER(at_dma8237_2_r); DECLARE_WRITE8_MEMBER(at_dma8237_2_w); + DECLARE_READ8_MEMBER(eisa_irq_read); + DECLARE_WRITE8_MEMBER(eisa_irq_write); DECLARE_READ8_MEMBER(read_apmcapms); DECLARE_WRITE8_MEMBER(write_apmcapms); @@ -147,7 +171,7 @@ private: uint32_t see; uint16_t xbcs, mstat, pcsc, smien, smireq; uint8_t apmc, apms; - uint8_t iort, pirqrc[4], tom, mbirq0, mbdma[2], apicbase; + uint8_t iort, pirqrc[4], tom, mbirq0, mbirq1, mbdma[2], apicbase; uint8_t dlc, smicntl, ftmr, ctlmtr, cthmtr; void map_bios(address_space *memory_space, uint32_t start, uint32_t end); @@ -169,6 +193,7 @@ private: uint8_t m_dma_offset[2][4]; uint8_t m_at_pages[0x10]; uint16_t m_dma_high_byte; + uint16_t m_eisa_irq_mode; uint8_t m_at_speaker; bool m_refresh; void at_speaker_set_spkrdata(uint8_t data); @@ -177,6 +202,7 @@ private: uint8_t m_nmi_enabled; void pc_select_dma_channel(int channel, bool state); + void redirect_irq(int irq, int state); }; DECLARE_DEVICE_TYPE(I82371SB_ISA, i82371sb_isa_device) |