diff options
author | 2019-04-04 07:36:51 +0200 | |
---|---|---|
committer | 2019-04-05 00:00:58 +0200 | |
commit | e39802db90860d6628c35265f7c78ce3534f5a53 (patch) | |
tree | 796f3fb6524361b61bad36530f3c56e027db57b9 /src/devices/bus/vme | |
parent | b54a2a517cdd8d9b9ba0456c54c0cced7dd794fc (diff) |
68000: Rework interrupt handling [O. Galibert]
* Implement the cpu space as an address space
* Make all vectored interrupts use the cpu space
* Make it possible to direct the cpu space to another space, use it for amiga (which handles it as a normal AS_PROGRAM read)
* Make it possible to disable the priority muxer and get 3 lines instead, use it for cps2
Diffstat (limited to 'src/devices/bus/vme')
-rw-r--r-- | src/devices/bus/vme/vme_fccpu20.cpp | 7 | ||||
-rw-r--r-- | src/devices/bus/vme/vme_fccpu20.h | 1 | ||||
-rw-r--r-- | src/devices/bus/vme/vme_fcscsi.cpp | 112 | ||||
-rw-r--r-- | src/devices/bus/vme/vme_fcscsi.h | 3 |
4 files changed, 58 insertions, 65 deletions
diff --git a/src/devices/bus/vme/vme_fccpu20.cpp b/src/devices/bus/vme/vme_fccpu20.cpp index d6f5ab56d30..657cff917cf 100644 --- a/src/devices/bus/vme/vme_fccpu20.cpp +++ b/src/devices/bus/vme/vme_fccpu20.cpp @@ -252,12 +252,17 @@ static DEVICE_INPUT_DEFAULTS_START( terminal ) DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 ) DEVICE_INPUT_DEFAULTS_END +void vme_fccpu20_device::cpu_space_map(address_map &map) +{ + map(0xfffff2, 0xffffff).lr16("bim irq", [this](offs_t offset) -> u16 { return m_bim->iack(offset+1); }); +} + void vme_fccpu20_device::device_add_mconfig(machine_config &config) { /* basic machine hardware */ M68020(config, m_maincpu, CLOCK50 / 3); /* Crytstal verified from picture HCI */ m_maincpu->set_addrmap(AS_PROGRAM, &vme_fccpu20_device::cpu20_mem); - m_maincpu->set_irq_acknowledge_callback("bim", FUNC(bim68153_device::iack)); + m_maincpu->set_addrmap(m68000_base_device::AS_CPU_SPACE, &vme_fccpu20_device::cpu_space_map); /* PIT Parallel Interface and Timer device, assumed strapped for on board clock */ PIT68230(config, m_pit, CLOCK32 / 4); /* Crystal not verified */ diff --git a/src/devices/bus/vme/vme_fccpu20.h b/src/devices/bus/vme/vme_fccpu20.h index 4be52d07477..23ebf0338d6 100644 --- a/src/devices/bus/vme/vme_fccpu20.h +++ b/src/devices/bus/vme/vme_fccpu20.h @@ -69,6 +69,7 @@ private: DECLARE_WRITE32_MEMBER (bootvect_w); void cpu20_mem(address_map &map); + void cpu_space_map(address_map &map); required_device<pit68230_device> m_pit; required_device<bim68153_device> m_bim; diff --git a/src/devices/bus/vme/vme_fcscsi.cpp b/src/devices/bus/vme/vme_fcscsi.cpp index 262a7bcde14..e48f058d4db 100644 --- a/src/devices/bus/vme/vme_fcscsi.cpp +++ b/src/devices/bus/vme/vme_fcscsi.cpp @@ -200,6 +200,55 @@ void vme_fcscsi1_card_device::fcscsi1_mem(address_map &map) map(0xcc0009, 0xcc0009).rw(FUNC(vme_fcscsi1_card_device::tcr_r), FUNC(vme_fcscsi1_card_device::tcr_w)); /* The Control Register, SCSI ID and FD drive select bits */ } +/* +---------------------------------------------------- + IRQ IRQ +Level Source B4l inserted B4l removed (Def) +----------------------------------------------------- + 1 P3 Pin #13 AV1 Autovector AV1 Autovector + 2 DMAC DMAC AV2 Autovector + 3 SCSIBC AV3 Autovector AV3 Autovector + 4 FDC AV4 Autovector AV4 Autovector + 5 PI/T Timer PI/T Timer Vect PI/T Timer Vect + 6 -- -- -- + 7 PI/T Port PI/T Port Vect PI/T Port Vect +------------------------------------------------------ +Default configuration: B41 jumper removed + +The PI/T port interrupt can be used under software control to +cause non-maskable (Level 7) interrupts if the watchdog timer +elapses and/or if the VMEbus interrupt trigger call occurs. +*/ + +/* TODO: Add configurable B41 jumper */ +#define B41 0 + +void vme_fcscsi1_card_device::update_irq_to_maincpu() { + if (fdc_irq_state) { + m_maincpu->set_input_line(M68K_IRQ_3, ASSERT_LINE); + m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); + m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE); + } else if (dmac_irq_state) { + m_maincpu->set_input_line(M68K_IRQ_3, CLEAR_LINE); + m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE); + m_maincpu->set_input_line(M68K_IRQ_2, ASSERT_LINE); + } else { + m_maincpu->set_input_line(M68K_IRQ_3, CLEAR_LINE); + m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); + m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE); + } +} + +void vme_fcscsi1_card_device::cpu_space_map(address_map &map) +{ + map(0xfffff0, 0xffffff).m(m_maincpu, FUNC(m68000_base_device::autovectors_map)); + map(0xfffff4, 0xfffff5).lr16("dmac irq", [this]() -> u16 { + dmac_irq_state = 0; + u16 vector = B41 ? dmac_irq_vector : 0x18+2; + update_irq_to_maincpu(); + return vector; + }); +} FLOPPY_FORMATS_MEMBER( vme_fcscsi1_card_device::floppy_formats ) FLOPPY_PC_FORMAT @@ -233,7 +282,7 @@ void vme_fcscsi1_card_device::device_add_mconfig(machine_config &config) /* basic machine hardware */ M68010(config, m_maincpu, CPU_CRYSTAL / 2); /* 7474 based frequency divide by 2 */ m_maincpu->set_addrmap(AS_PROGRAM, &vme_fcscsi1_card_device::fcscsi1_mem); - m_maincpu->set_irq_acknowledge_callback(FUNC(vme_fcscsi1_card_device::maincpu_irq_acknowledge_callback)); + m_maincpu->set_addrmap(m68000_base_device::AS_CPU_SPACE, &vme_fcscsi1_card_device::cpu_space_map); /* FDC */ WD1772(config, m_fdc, PIT_CRYSTAL / 2); @@ -461,67 +510,6 @@ WRITE8_MEMBER (vme_fcscsi1_card_device::not_implemented_w){ return; } -/* ----------------------------------------------------- - IRQ IRQ -Level Source B4l inserted B4l removed (Def) ------------------------------------------------------ - 1 P3 Pin #13 AV1 Autovector AV1 Autovector - 2 DMAC DMAC AV2 Autovector - 3 SCSIBC AV3 Autovector AV3 Autovector - 4 FDC AV4 Autovector AV4 Autovector - 5 PI/T Timer PI/T Timer Vect PI/T Timer Vect - 6 -- -- -- - 7 PI/T Port PI/T Port Vect PI/T Port Vect ------------------------------------------------------- -Default configuration: B41 jumper removed - -The PI/T port interrupt can be used under software control to -cause non-maskable (Level 7) interrupts if the watchdog timer -elapses and/or if the VMEbus interrupt trigger call occurs. -*/ - -/* TODO: Add configurable B41 jumper */ -#define B41 0 - -void vme_fcscsi1_card_device::update_irq_to_maincpu() { - if (fdc_irq_state) { - m_maincpu->set_input_line(M68K_IRQ_3, ASSERT_LINE); - m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); - m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE); - } else if (dmac_irq_state) { - m_maincpu->set_input_line(M68K_IRQ_3, CLEAR_LINE); - m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE); -#if B41 == 1 - m_maincpu->set_input_line_and_vector(M68K_IRQ_2, ASSERT_LINE, dmac_irq_vector); -#else - m_maincpu->set_input_line(M68K_IRQ_2, ASSERT_LINE); -#endif - } else { - m_maincpu->set_input_line(M68K_IRQ_3, CLEAR_LINE); - m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); - m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE); - } -} - -IRQ_CALLBACK_MEMBER(vme_fcscsi1_card_device::maincpu_irq_acknowledge_callback) -{ - // We immediately update the interrupt presented to the CPU, so that it doesn't - // end up retrying the same interrupt over and over. We then return the appropriate vector. - int vector = 0; - switch(irqline) { - case 2: - dmac_irq_state = 0; - vector = dmac_irq_vector; - break; - default: - logerror("\nUnexpected IRQ ACK Callback: IRQ %d\n", irqline); - return 0; - } - update_irq_to_maincpu(); - return vector; -} - // This info isn't kept in a card driver atm so storing it as a comment for later use // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS //COMP( 1986, fcscsi1, 0, 0, fcscsi1, fcscsi1, driver_device, 0, "Force Computers Gmbh", "SYS68K/SCSI-1", MACHINE_IS_SKELETON ) diff --git a/src/devices/bus/vme/vme_fcscsi.h b/src/devices/bus/vme/vme_fcscsi.h index 35e95520585..02f22d1eaa1 100644 --- a/src/devices/bus/vme/vme_fcscsi.h +++ b/src/devices/bus/vme/vme_fcscsi.h @@ -35,8 +35,6 @@ protected: int dmac_irq_vector; private: - IRQ_CALLBACK_MEMBER(maincpu_irq_acknowledge_callback); - //dmac DECLARE_WRITE8_MEMBER(dma_end); DECLARE_WRITE8_MEMBER(dma_error); @@ -60,6 +58,7 @@ private: DECLARE_WRITE8_MEMBER(scsi_w); void fcscsi1_mem(address_map &map); + void cpu_space_map(address_map &map); required_device<cpu_device> m_maincpu; required_device<wd1772_device> m_fdc; |