From f1f6d4c91c5c1f5bea4da95a722b5b9d1fef3167 Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Thu, 20 Nov 2014 21:34:10 +0100 Subject: Fix RSP interpreter, nw --- src/emu/cpu/rsp/rsp.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ src/emu/cpu/rsp/rsp.h | 4 +-- src/emu/cpu/rsp/rspcp2.c | 45 ++------------------------------ src/emu/cpu/rsp/rspdrc.c | 68 ------------------------------------------------ src/mame/machine/n64.c | 4 +-- 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"); 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)); -- cgit v1.2.3