summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author mooglyguy <ryan@mojang.com>2014-11-20 21:34:10 +0100
committer mooglyguy <ryan@mojang.com>2014-11-20 21:34:10 +0100
commitf1f6d4c91c5c1f5bea4da95a722b5b9d1fef3167 (patch)
tree7558eedaa0434e5146b4d2c354a59ad0d457e6b7
parent751c3891758f90fd94f584088d2a4d9fd6083905 (diff)
Fix RSP interpreter, nw
-rw-r--r--src/emu/cpu/rsp/rsp.c68
-rw-r--r--src/emu/cpu/rsp/rsp.h4
-rw-r--r--src/emu/cpu/rsp/rspcp2.c45
-rw-r--r--src/emu/cpu/rsp/rspdrc.c68
-rw-r--r--src/mame/machine/n64.c4
5 files changed, 74 insertions, 115 deletions
diff --git a/src/emu/cpu/rsp/rsp.c b/src/emu/cpu/rsp/rsp.c
index 0891f04a09f..4064956320c 100644
--- a/src/emu/cpu/rsp/rsp.c
+++ b/src/emu/cpu/rsp/rsp.c
@@ -146,6 +146,74 @@ offs_t rsp_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *opro
return CPU_DISASSEMBLE_NAME( rsp )(this, buffer, pc, oprom, opram, options);
}
+void rsp_device::rsp_add_imem(UINT32 *base)
+{
+ m_imem32 = base;
+ m_imem16 = (UINT16*)base;
+ m_imem8 = (UINT8*)base;
+}
+
+void rsp_device::rsp_add_dmem(UINT32 *base)
+{
+ m_dmem32 = base;
+ m_dmem16 = (UINT16*)base;
+ m_dmem8 = (UINT8*)base;
+}
+
+UINT8 rsp_device::DM_READ8(UINT32 address)
+{
+ UINT8 ret = m_dmem8[BYTE4_XOR_BE(address & 0xfff)];
+ //printf("R8:%08x=%02x\n", address, ret);
+ return ret;
+}
+
+UINT16 rsp_device::DM_READ16(UINT32 address)
+{
+ UINT16 ret;
+ address &= 0xfff;
+ ret = m_dmem8[BYTE4_XOR_BE(address)] << 8;
+ ret |= m_dmem8[BYTE4_XOR_BE(address + 1)];
+ //printf("R16:%08x=%04x\n", address, ret);
+ return ret;
+}
+
+UINT32 rsp_device::DM_READ32(UINT32 address)
+{
+ UINT32 ret;
+ address &= 0xfff;
+ ret = m_dmem8[BYTE4_XOR_BE(address)] << 24;
+ ret |= m_dmem8[BYTE4_XOR_BE(address + 1)] << 16;
+ ret |= m_dmem8[BYTE4_XOR_BE(address + 2)] << 8;
+ ret |= m_dmem8[BYTE4_XOR_BE(address + 3)];
+ //printf("R32:%08x=%08x\n", address, ret);
+ return ret;
+}
+
+void rsp_device::DM_WRITE8(UINT32 address, UINT8 data)
+{
+ address &= 0xfff;
+ m_dmem8[BYTE4_XOR_BE(address)] = data;
+ //printf("W8:%08x=%02x\n", address, data);
+}
+
+void rsp_device::DM_WRITE16(UINT32 address, UINT16 data)
+{
+ address &= 0xfff;
+ m_dmem8[BYTE4_XOR_BE(address)] = data >> 8;
+ m_dmem8[BYTE4_XOR_BE(address + 1)] = data & 0xff;
+ //printf("W16:%08x=%04x\n", address, data);
+}
+
+void rsp_device::DM_WRITE32(UINT32 address, UINT32 data)
+{
+ address &= 0xfff;
+ m_dmem8[BYTE4_XOR_BE(address)] = data >> 24;
+ m_dmem8[BYTE4_XOR_BE(address + 1)] = (data >> 16) & 0xff;
+ m_dmem8[BYTE4_XOR_BE(address + 2)] = (data >> 8) & 0xff;
+ m_dmem8[BYTE4_XOR_BE(address + 3)] = data & 0xff;
+ //printf("W32:%08x=%08x\n", address, data);
+}
+
UINT8 rsp_device::READ8(UINT32 address)
{
UINT8 ret;
diff --git a/src/emu/cpu/rsp/rsp.h b/src/emu/cpu/rsp/rsp.h
index b654c555b02..1e8380cc968 100644
--- a/src/emu/cpu/rsp/rsp.h
+++ b/src/emu/cpu/rsp/rsp.h
@@ -150,8 +150,8 @@ public:
void rspdrc_flush_drc_cache();
void rspdrc_set_options(UINT32 options);
- void rspdrc_add_dmem(UINT32 *base);
- void rspdrc_add_imem(UINT32 *base);
+ void rsp_add_dmem(UINT32 *base);
+ void rsp_add_imem(UINT32 *base);
void ccfunc_read8();
void ccfunc_read16();
diff --git a/src/emu/cpu/rsp/rspcp2.c b/src/emu/cpu/rsp/rspcp2.c
index d24a62f4379..7dca6014eb6 100644
--- a/src/emu/cpu/rsp/rspcp2.c
+++ b/src/emu/cpu/rsp/rspcp2.c
@@ -844,46 +844,6 @@ void rsp_cop2::handle_swc2(UINT32 op)
Vector Accumulator Helpers
***************************************************************************/
-inline UINT16 rsp_cop2::SATURATE_ACCUM1(int accum, UINT16 negative, UINT16 positive)
-{
-if ((INT16)ACCUM_H(accum) < 0)
-{
-if ((UINT16)(ACCUM_H(accum)) != 0xffff)
-{
-return negative;
-}
-else
-{
-if ((INT16)ACCUM_M(accum) >= 0)
-{
-return negative;
-}
-else
-{
-return ACCUM_M(accum);
-}
-}
-}
-else
-{
-if ((UINT16)(ACCUM_H(accum)) != 0)
-{
-return positive;
-}
-else
-{
-if ((INT16)ACCUM_M(accum) < 0)
-{
-return positive;
-}
-else
-{
-return ACCUM_M(accum);
-}
-}
-}
-}
-
UINT16 rsp_cop2::SATURATE_ACCUM(int accum, int slice, UINT16 negative, UINT16 positive)
{
if ((INT16)ACCUM_H(accum) < 0)
@@ -1174,7 +1134,6 @@ void rsp_cop2::handle_vector_ops(UINT32 op)
WRITEBACK_RESULT();
break;
}
-
case 0x09: /* VMACU */
{
// 31 25 24 20 15 10 5 0
@@ -1274,7 +1233,7 @@ void rsp_cop2::handle_vector_ops(UINT32 op)
SET_ACCUM_M((UINT16)(r3), i);
SET_ACCUM_H(ACCUM_H(i) + (UINT16)(r3 >> 16), i);
if ((INT32)(r1) < 0)
- SET_ACCUM_H(i, ACCUM_H(i) - 1);
+ SET_ACCUM_H(ACCUM_H(i) - 1, i);
m_vres[i] = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff);
}
@@ -1339,7 +1298,7 @@ void rsp_cop2::handle_vector_ops(UINT32 op)
SET_ACCUM_H((UINT16)(accum >> 16), i);
SET_ACCUM_M((UINT16)accum, i);
- m_vres[i] = SATURATE_ACCUM1(i, 0x8000, 0x7fff);
+ m_vres[i] = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff);
}
WRITEBACK_RESULT();
diff --git a/src/emu/cpu/rsp/rspdrc.c b/src/emu/cpu/rsp/rspdrc.c
index fb999a809a7..dbc81187796 100644
--- a/src/emu/cpu/rsp/rspdrc.c
+++ b/src/emu/cpu/rsp/rspdrc.c
@@ -118,27 +118,6 @@ inline void rsp_device::save_fast_iregs(drcuml_block *block)
CORE CALLBACKS
***************************************************************************/
-void rsp_device::rspdrc_add_imem(UINT32 *base)
-{
- m_imem32 = base;
- m_imem16 = (UINT16*)base;
- m_imem8 = (UINT8*)base;
-}
-
-void rsp_device::rspdrc_add_dmem(UINT32 *base)
-{
- m_dmem32 = base;
- m_dmem16 = (UINT16*)base;
- m_dmem8 = (UINT8*)base;
-}
-
-UINT8 rsp_device::DM_READ8(UINT32 address)
-{
- UINT8 ret = m_dmem8[BYTE4_XOR_BE(address & 0xfff)];
- //printf("R8:%08x=%02x\n", address, ret);
- return ret;
-}
-
inline void rsp_device::ccfunc_read8()
{
m_rsp_state->arg0 = DM_READ8(m_rsp_state->arg0);
@@ -149,16 +128,6 @@ static void cfunc_read8(void *param)
((rsp_device *)param)->ccfunc_read8();
}
-UINT16 rsp_device::DM_READ16(UINT32 address)
-{
- UINT16 ret;
- address &= 0xfff;
- ret = m_dmem8[BYTE4_XOR_BE(address)] << 8;
- ret |= m_dmem8[BYTE4_XOR_BE(address + 1)];
- //printf("R16:%08x=%04x\n", address, ret);
- return ret;
-}
-
inline void rsp_device::ccfunc_read16()
{
m_rsp_state->arg0 = DM_READ16(m_rsp_state->arg0);
@@ -169,18 +138,6 @@ static void cfunc_read16(void *param)
((rsp_device *)param)->ccfunc_read16();
}
-UINT32 rsp_device::DM_READ32(UINT32 address)
-{
- UINT32 ret;
- address &= 0xfff;
- ret = m_dmem8[BYTE4_XOR_BE(address)] << 24;
- ret |= m_dmem8[BYTE4_XOR_BE(address + 1)] << 16;
- ret |= m_dmem8[BYTE4_XOR_BE(address + 2)] << 8;
- ret |= m_dmem8[BYTE4_XOR_BE(address + 3)];
- //printf("R32:%08x=%08x\n", address, ret);
- return ret;
-}
-
inline void rsp_device::ccfunc_read32()
{
m_rsp_state->arg0 = DM_READ32(m_rsp_state->arg0);
@@ -191,13 +148,6 @@ static void cfunc_read32(void *param)
((rsp_device *)param)->ccfunc_read32();;
}
-void rsp_device::DM_WRITE8(UINT32 address, UINT8 data)
-{
- address &= 0xfff;
- m_dmem8[BYTE4_XOR_BE(address)] = data;
- //printf("W8:%08x=%02x\n", address, data);
-}
-
inline void rsp_device::ccfunc_write8()
{
DM_WRITE8(m_rsp_state->arg0, m_rsp_state->arg1);
@@ -208,14 +158,6 @@ static void cfunc_write8(void *param)
((rsp_device *)param)->ccfunc_write8();;
}
-void rsp_device::DM_WRITE16(UINT32 address, UINT16 data)
-{
- address &= 0xfff;
- m_dmem8[BYTE4_XOR_BE(address)] = data >> 8;
- m_dmem8[BYTE4_XOR_BE(address + 1)] = data & 0xff;
- //printf("W16:%08x=%04x\n", address, data);
-}
-
inline void rsp_device::ccfunc_write16()
{
DM_WRITE16(m_rsp_state->arg0, m_rsp_state->arg1);
@@ -226,16 +168,6 @@ static void cfunc_write16(void *param)
((rsp_device *)param)->ccfunc_write16();;
}
-void rsp_device::DM_WRITE32(UINT32 address, UINT32 data)
-{
- address &= 0xfff;
- m_dmem8[BYTE4_XOR_BE(address)] = data >> 24;
- m_dmem8[BYTE4_XOR_BE(address + 1)] = (data >> 16) & 0xff;
- m_dmem8[BYTE4_XOR_BE(address + 2)] = (data >> 8) & 0xff;
- m_dmem8[BYTE4_XOR_BE(address + 3)] = data & 0xff;
- //printf("W32:%08x=%08x\n", address, data);
-}
-
inline void rsp_device::ccfunc_write32()
{
DM_WRITE32(m_rsp_state->arg0, m_rsp_state->arg1);
diff --git a/src/mame/machine/n64.c b/src/mame/machine/n64.c
index 501d8d2cbe5..685374c130c 100644
--- a/src/mame/machine/n64.c
+++ b/src/mame/machine/n64.c
@@ -2323,8 +2323,8 @@ void n64_state::machine_start()
rsp_device *rsp = machine().device<rsp_device>("rsp");
rsp->rspdrc_set_options(RSPDRC_STRICT_VERIFY);
rsp->rspdrc_flush_drc_cache();
- rsp->rspdrc_add_dmem(rsp_dmem);
- rsp->rspdrc_add_imem(rsp_imem);
+ rsp->rsp_add_dmem(rsp_dmem);
+ rsp->rsp_add_imem(rsp_imem);
/* add a hook for battery save */
machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(n64_state::n64_machine_stop),this));