summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/vme
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2019-04-04 07:36:51 +0200
committer Olivier Galibert <galibert@pobox.com>2019-04-05 00:00:58 +0200
commite39802db90860d6628c35265f7c78ce3534f5a53 (patch)
tree796f3fb6524361b61bad36530f3c56e027db57b9 /src/devices/bus/vme
parentb54a2a517cdd8d9b9ba0456c54c0cced7dd794fc (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.cpp7
-rw-r--r--src/devices/bus/vme/vme_fccpu20.h1
-rw-r--r--src/devices/bus/vme/vme_fcscsi.cpp112
-rw-r--r--src/devices/bus/vme/vme_fcscsi.h3
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;