summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author MooglyGuy <therealmogminer@gmail.com>2019-02-20 23:23:35 +0100
committer MooglyGuy <therealmogminer@gmail.com>2019-02-20 23:23:46 +0100
commit61a76b45bd942bae84cbe27fe8843679ca71b6bc (patch)
tree94858514acf6ad41f89809327d35fed483fa12c8
parentdc7fdc367c7960204aded1f815278b630cdb9f68 (diff)
hpc3: Trigger audio DMA on channels 0-3. Fixes hang when starting apps in IRIX. [Ryan Holtz]
-rw-r--r--src/mame/machine/hpc3.cpp35
-rw-r--r--src/mame/machine/hpc3.h2
2 files changed, 20 insertions, 17 deletions
diff --git a/src/mame/machine/hpc3.cpp b/src/mame/machine/hpc3.cpp
index 3a6cf729aa3..715fda748c9 100644
--- a/src/mame/machine/hpc3.cpp
+++ b/src/mame/machine/hpc3.cpp
@@ -13,10 +13,11 @@
#define LOG_PBUS_DMA (1 << 1)
#define LOG_SCSI (1 << 2)
#define LOG_SCSI_DMA (1 << 3)
-#define LOG_ETHERNET (1 << 4)
-#define LOG_PBUS4 (1 << 5)
-#define LOG_CHAIN (1 << 6)
-#define LOG_ALL (LOG_UNKNOWN | LOG_PBUS_DMA | LOG_SCSI | LOG_SCSI_DMA | LOG_ETHERNET | LOG_PBUS4 | LOG_CHAIN)
+#define LOG_SCSI_IRQ (1 << 4)
+#define LOG_ETHERNET (1 << 5)
+#define LOG_PBUS4 (1 << 6)
+#define LOG_CHAIN (1 << 7)
+#define LOG_ALL (LOG_UNKNOWN | LOG_PBUS_DMA | LOG_SCSI | LOG_SCSI_DMA | LOG_SCSI_IRQ | LOG_ETHERNET | LOG_PBUS4 | LOG_CHAIN)
#define VERBOSE (0)
#include "logmacro.h"
@@ -61,13 +62,13 @@ void hpc3_device::device_start()
for (uint32_t i = 0; i < 8; i++)
{
save_item(NAME(m_pbus_dma[i].m_active), i);
- save_item(NAME(m_pbus_dma[i].m_buf_ptr), i);
save_item(NAME(m_pbus_dma[i].m_cur_ptr), i);
save_item(NAME(m_pbus_dma[i].m_desc_ptr), i);
save_item(NAME(m_pbus_dma[i].m_desc_flags), i);
save_item(NAME(m_pbus_dma[i].m_next_ptr), i);
save_item(NAME(m_pbus_dma[i].m_bytes_left), i);
save_item(NAME(m_pbus_dma[i].m_config), i);
+ save_item(NAME(m_pbus_dma[i].m_control), i);
m_pbus_dma[i].m_timer = timer_alloc(TIMER_PBUS_DMA + i);
m_pbus_dma[i].m_timer->adjust(attotime::never);
@@ -86,12 +87,12 @@ void hpc3_device::device_reset()
{
m_pbus_dma[i].m_active = 0;
m_pbus_dma[i].m_cur_ptr = 0;
- m_pbus_dma[i].m_buf_ptr = 0;
m_pbus_dma[i].m_desc_ptr = 0;
m_pbus_dma[i].m_desc_flags = 0;
m_pbus_dma[i].m_next_ptr = 0;
m_pbus_dma[i].m_bytes_left = 0;
m_pbus_dma[i].m_config = 0;
+ m_pbus_dma[i].m_control = 0;
m_pbus_dma[i].m_active = false;
m_pbus_dma[i].m_timer->adjust(attotime::never);
@@ -470,7 +471,7 @@ READ32_MEMBER(hpc3_device::pbusdma_r)
switch (offset & 0x07ff)
{
case 0x0000/4:
- ret = dma.m_buf_ptr;
+ ret = dma.m_cur_ptr;
LOGMASKED(LOG_PBUS_DMA, "%s: PBUS DMA Channel %d Buffer Pointer Read: %08x & %08x\n", machine().describe_context(), channel, ret, mem_mask);
break;
case 0x0004/4:
@@ -495,21 +496,17 @@ WRITE32_MEMBER(hpc3_device::pbusdma_w)
switch (offset & 0x07ff)
{
- case 0x0000/4:
- LOGMASKED(LOG_PBUS_DMA, "%s: PBUS DMA Channel %d Buffer Pointer Write: %08x\n", machine().describe_context(), channel, data);
- dma.m_buf_ptr = data;
- break;
case 0x0004/4:
LOGMASKED(LOG_PBUS_DMA, "%s: PBUS DMA Channel %d Descriptor Pointer Write: %08x\n", machine().describe_context(), channel, data);
dma.m_desc_ptr = data;
- LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_DescPtr = %08x\n", machine().describe_context(), dma.m_desc_ptr); fflush(stdout);
+ LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_DescPtr = %08x\n", machine().describe_context(), dma.m_desc_ptr);
dma.m_cur_ptr = space.read_dword(dma.m_desc_ptr);
dma.m_desc_flags = space.read_dword(dma.m_desc_ptr + 4);
dma.m_next_ptr = space.read_dword(dma.m_desc_ptr + 8);
dma.m_bytes_left = dma.m_desc_flags & 0x7fffffff;
- LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_CurPtr = %08x\n", machine().describe_context(), dma.m_cur_ptr); fflush(stdout);
- LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_BytesLeft = %08x\n", machine().describe_context(), dma.m_bytes_left); fflush(stdout);
- LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_NextPtr = %08x\n", machine().describe_context(), dma.m_next_ptr); fflush(stdout);
+ LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_CurPtr = %08x\n", machine().describe_context(), dma.m_cur_ptr);
+ LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_BytesLeft = %08x\n", machine().describe_context(), dma.m_bytes_left);
+ LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_NextPtr = %08x\n", machine().describe_context(), dma.m_next_ptr);
break;
case 0x1000/4:
LOGMASKED(LOG_PBUS_DMA, "%s: PBUS DMA Channel %d Control Register Write: %08x\n", machine().describe_context(), channel, data);
@@ -535,7 +532,7 @@ WRITE32_MEMBER(hpc3_device::pbusdma_w)
LOGMASKED(LOG_PBUS_DMA, " FIFO Begin: Row %04x\n", (data & PBUS_CTRL_FIFO_BEG) >> 16);
LOGMASKED(LOG_PBUS_DMA, " FIFO End: Row %04x\n", (data & PBUS_CTRL_FIFO_END) >> 24);
- if (((data & PBUS_CTRL_DMASTART) && (data & PBUS_CTRL_LOAD_EN)) && (channel == 1 || channel == 2))
+ if (((data & PBUS_CTRL_DMASTART) && (data & PBUS_CTRL_LOAD_EN)) && channel < 4)
{
LOGMASKED(LOG_PBUS_DMA, " Starting DMA\n");
dma.m_timer->adjust(attotime::from_hz(44100));
@@ -827,6 +824,7 @@ WRITE_LINE_MEMBER(hpc3_device::scsi0_irq)
{
if (state)
{
+ LOGMASKED(LOG_SCSI_IRQ, "Raising SCSI 0 IRQ\n");
//if (m_wd33c93->get_dma_count() && m_scsi_dma[0].m_active)
// scsi_dma(0);
@@ -834,6 +832,7 @@ WRITE_LINE_MEMBER(hpc3_device::scsi0_irq)
}
else
{
+ LOGMASKED(LOG_SCSI_IRQ, "Lowering SCSI 0 IRQ\n");
m_ioc2->lower_local_irq(0, ioc2_device::INT3_LOCAL0_SCSI0);
}
}
@@ -842,6 +841,8 @@ WRITE_LINE_MEMBER(hpc3_device::scsi1_irq)
{
if (state)
{
+ LOGMASKED(LOG_SCSI_IRQ, "Raising SCSI 1 IRQ\n");
+
//if (m_wd33c93_2->get_dma_count() && m_scsi_dma[1].m_active)
// scsi_dma(1);
@@ -849,6 +850,8 @@ WRITE_LINE_MEMBER(hpc3_device::scsi1_irq)
}
else
{
+ LOGMASKED(LOG_SCSI_IRQ, "Lowering SCSI 0 IRQ\n");
+
m_ioc2->lower_local_irq(0, ioc2_device::INT3_LOCAL0_SCSI1);
}
}
diff --git a/src/mame/machine/hpc3.h b/src/mame/machine/hpc3.h
index 12cdb9f05b0..10c658bd362 100644
--- a/src/mame/machine/hpc3.h
+++ b/src/mame/machine/hpc3.h
@@ -90,13 +90,13 @@ protected:
struct pbus_dma_t
{
bool m_active;
- uint32_t m_buf_ptr;
uint32_t m_cur_ptr;
uint32_t m_desc_ptr;
uint32_t m_desc_flags;
uint32_t m_next_ptr;
uint32_t m_bytes_left;
uint32_t m_config;
+ uint32_t m_control;
emu_timer *m_timer;
};