summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/sound
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2013-01-22 05:19:57 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2013-01-22 05:19:57 +0000
commit60be7f289e8d669df00576429ae197b7be6f12e5 (patch)
tree1bf2c78a9e52aacaaabbcfc3872a7c70e6da4a33 /src/emu/sound
parent98965800530d8154390790cf665f9dd1e04725d4 (diff)
SCSP: Made a more sane Sound->Main IRQ behaviour
Diffstat (limited to 'src/emu/sound')
-rw-r--r--src/emu/sound/scsp.c55
1 files changed, 48 insertions, 7 deletions
diff --git a/src/emu/sound/scsp.c b/src/emu/sound/scsp.c
index 0f803484c75..ff583851218 100644
--- a/src/emu/sound/scsp.c
+++ b/src/emu/sound/scsp.c
@@ -222,6 +222,9 @@ struct scsp_state
UINT16 dma_regs[3];
+ UINT16 mcieb;
+ UINT16 mcipd;
+
int ARTABLE[64], DRTABLE[64];
SCSPDSP DSP;
@@ -309,6 +312,14 @@ static void CheckPendingIRQ(scsp_state *scsp)
scsp->Int68kCB(scsp->device, 0);
}
+static void MainCheckPendingIRQ(scsp_state *scsp, UINT16 irq_type)
+{
+ scsp->mcipd |= irq_type;
+
+ if(scsp->mcipd & scsp->mcieb)
+ scsp->main_irq(1);
+}
+
static void ResetInterrupts(scsp_state *scsp)
{
UINT32 reset = scsp->udata.data[0x22/2];
@@ -789,6 +800,14 @@ static void SCSP_UpdateReg(scsp_state *scsp, address_space &space, int reg)
}
}
break;
+ case 0x1e:
+ case 0x1f:
+ if(scsp->Master)
+ {
+ if(scsp->udata.data[0x1e/2] & 0x630)
+ popmessage("SCSP SCIEB enabled %04x, contact MAMEdev",scsp->udata.data[0x1e/2]);
+ }
+ break;
case 0x22: //SCIRE
case 0x23:
@@ -826,6 +845,25 @@ static void SCSP_UpdateReg(scsp_state *scsp, address_space &space, int reg)
scsp->IrqMidi=DecodeSCI(scsp,SCIMID);
}
break;
+ case 0x2a:
+ case 0x2b:
+ scsp->mcieb = scsp->udata.data[0x2a/2];
+
+ MainCheckPendingIRQ(scsp, 0);
+ if(scsp->mcieb & ~0x20)
+ popmessage("SCSP MCIEB enabled %04x, contact MAMEdev",scsp->mcieb);
+ break;
+ case 0x2c:
+ case 0x2d:
+ if(scsp->udata.data[0x2c/2] & 0x20)
+ MainCheckPendingIRQ(scsp, 0x20);
+ break;
+ case 0x2e:
+ case 0x2f:
+ scsp->mcipd &= ~scsp->udata.data[0x2e/2];
+ MainCheckPendingIRQ(scsp, 0);
+ break;
+
}
}
@@ -878,6 +916,16 @@ static void SCSP_UpdateRegR(scsp_state *scsp, address_space &space, int reg)
case 0x1c:
case 0x1d:
break;
+
+ case 0x2a:
+ case 0x2b:
+ scsp->udata.data[0x2a/2] = scsp->mcieb;
+ break;
+
+ case 0x2c:
+ case 0x2d:
+ scsp->udata.data[0x2c/2] = scsp->mcipd;
+ break;
}
}
@@ -1322,13 +1370,6 @@ WRITE16_DEVICE_HANDLER( scsp_w )
if(ACCESSING_BITS_8_15 && offset*2 == 0x416)
dma_scsp(space, scsp);
break;
- case 0x42a: //check main cpu IRQ
- scsp->main_irq(1);
- break;
- case 0x42c:
- break;
- case 0x42e:
- break;
}
}