From e1854e15895dbc7da4208c82a4638999671dc2f2 Mon Sep 17 00:00:00 2001 From: zilmar Date: Thu, 27 Jul 2023 13:23:53 +0930 Subject: [PATCH] RSP: Inline memory functions in to the opcodes --- Source/Project64-rsp/Interpreter CPU.cpp | 2 +- Source/Project64-rsp/Interpreter Ops.cpp | 392 +++++++++++++-- Source/Project64-rsp/RSP Command.cpp | 5 +- Source/Project64-rsp/Recompiler Analysis.cpp | 17 +- Source/Project64-rsp/Recompiler CPU.cpp | 6 +- Source/Project64-rsp/memory.cpp | 483 +------------------ Source/Project64-rsp/memory.h | 28 -- 7 files changed, 372 insertions(+), 561 deletions(-) diff --git a/Source/Project64-rsp/Interpreter CPU.cpp b/Source/Project64-rsp/Interpreter CPU.cpp index 2c151c9d4..0c4e06b3a 100644 --- a/Source/Project64-rsp/Interpreter CPU.cpp +++ b/Source/Project64-rsp/Interpreter CPU.cpp @@ -429,7 +429,7 @@ DWORD RunInterpreterCPU(DWORD Cycles) RDP_LogLoc(*PrgCount); - RSP_LW_IMEM(*PrgCount, &RSPOpC.Value); + RSPOpC.Value = *(uint32_t *)(RSPInfo.IMEM + (*PrgCount & 0xFFC)); RSP_Opcode[RSPOpC.op](); RSP_GPR[0].W = 0x00000000; // MIPS $zero hard-wired to 0 diff --git a/Source/Project64-rsp/Interpreter Ops.cpp b/Source/Project64-rsp/Interpreter Ops.cpp index 27f17c5ee..efc4aa396 100644 --- a/Source/Project64-rsp/Interpreter Ops.cpp +++ b/Source/Project64-rsp/Interpreter Ops.cpp @@ -138,59 +138,111 @@ void RSP_Opcode_COP2(void) void RSP_Opcode_LB(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (short)RSPOpC.offset) & 0xFFF; - RSP_LB_DMEM(Address, &RSP_GPR[RSPOpC.rt].UB[0]); - RSP_GPR[RSPOpC.rt].W = RSP_GPR[RSPOpC.rt].B[0]; + RSP_GPR[RSPOpC.rt].W = *(int8_t *)(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)); } void RSP_Opcode_LH(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (short)RSPOpC.offset) & 0xFFF; - RSP_LH_DMEM(Address, &RSP_GPR[RSPOpC.rt].UHW[0]); + if ((Address & 0x1) != 0) + { + RSP_GPR[RSPOpC.rt].UHW[0] = *(uint8_t *)(RSPInfo.DMEM + (((Address + 0) & 0xFFF) ^ 3)) << 8; + RSP_GPR[RSPOpC.rt].UHW[0] += *(uint8_t *)(RSPInfo.DMEM + (((Address + 1) & 0xFFF) ^ 3)) << 0; + } + else + { + RSP_GPR[RSPOpC.rt].UHW[0] = *(uint16_t *)(RSPInfo.DMEM + ((Address ^ 2) & 0xFFF)); + } RSP_GPR[RSPOpC.rt].W = RSP_GPR[RSPOpC.rt].HW[0]; } void RSP_Opcode_LW(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (short)RSPOpC.offset) & 0xFFF; - RSP_LW_DMEM(Address, &RSP_GPR[RSPOpC.rt].UW); + if ((Address & 0x3) != 0) + { + RSP_GPR[RSPOpC.rt].UW = *(uint8_t *)(RSPInfo.DMEM + (((Address + 0) & 0xFFF) ^ 3)) << 24; + RSP_GPR[RSPOpC.rt].UW += *(uint8_t *)(RSPInfo.DMEM + (((Address + 1) & 0xFFF) ^ 3)) << 16; + RSP_GPR[RSPOpC.rt].UW += *(uint8_t *)(RSPInfo.DMEM + (((Address + 2) & 0xFFF) ^ 3)) << 8; + RSP_GPR[RSPOpC.rt].UW += *(uint8_t *)(RSPInfo.DMEM + (((Address + 3) & 0xFFF) ^ 3)) << 0; + } + else + { + RSP_GPR[RSPOpC.rt].UW = *(uint32_t *)(RSPInfo.DMEM + (Address & 0xFFF)); + } } void RSP_Opcode_LBU(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (short)RSPOpC.offset) & 0xFFF; - RSP_LB_DMEM(Address, &RSP_GPR[RSPOpC.rt].UB[0]); - RSP_GPR[RSPOpC.rt].UW = RSP_GPR[RSPOpC.rt].UB[0]; + RSP_GPR[RSPOpC.rt].UW = *(uint8_t *)(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)); } void RSP_Opcode_LHU(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (short)RSPOpC.offset) & 0xFFF; - RSP_LH_DMEM(Address, &RSP_GPR[RSPOpC.rt].UHW[0]); + if ((Address & 0x1) != 0) + { + RSP_GPR[RSPOpC.rt].UHW[0] = *(uint8_t *)(RSPInfo.DMEM + (((Address + 0) & 0xFFF) ^ 3)) << 8; + RSP_GPR[RSPOpC.rt].UHW[0] += *(uint8_t *)(RSPInfo.DMEM + (((Address + 1) & 0xFFF) ^ 3)) << 0; + } + else + { + RSP_GPR[RSPOpC.rt].UHW[0] = *(uint16_t *)(RSPInfo.DMEM + ((Address ^ 2) & 0xFFF)); + } RSP_GPR[RSPOpC.rt].UW = RSP_GPR[RSPOpC.rt].UHW[0]; } void RSP_Opcode_LWU(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (short)RSPOpC.offset) & 0xFFF; - RSP_LW_DMEM(Address, &RSP_GPR[RSPOpC.rt].UW); + if ((Address & 0x3) != 0) + { + RSP_GPR[RSPOpC.rt].UW = *(uint8_t *)(RSPInfo.DMEM + (((Address + 0) & 0xFFF) ^ 3)) << 24; + RSP_GPR[RSPOpC.rt].UW += *(uint8_t *)(RSPInfo.DMEM + (((Address + 1) & 0xFFF) ^ 3)) << 16; + RSP_GPR[RSPOpC.rt].UW += *(uint8_t *)(RSPInfo.DMEM + (((Address + 2) & 0xFFF) ^ 3)) << 8; + RSP_GPR[RSPOpC.rt].UW += *(uint8_t *)(RSPInfo.DMEM + (((Address + 3) & 0xFFF) ^ 3)) << 0; + } + else + { + RSP_GPR[RSPOpC.rt].UW = *(uint32_t *)(RSPInfo.DMEM + (Address & 0xFFF)); + } } void RSP_Opcode_SB(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (short)RSPOpC.offset) & 0xFFF; - RSP_SB_DMEM(Address, RSP_GPR[RSPOpC.rt].UB[0]); + *(uint8_t *)(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = RSP_GPR[RSPOpC.rt].UB[0]; } void RSP_Opcode_SH(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (short)RSPOpC.offset) & 0xFFF; - RSP_SH_DMEM(Address, RSP_GPR[RSPOpC.rt].UHW[0]); + if ((Address & 0x1) != 0) + { + *(uint8_t *)(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = (RSP_GPR[RSPOpC.rt].UHW[0] >> 8); + *(uint8_t *)(RSPInfo.DMEM + (((Address + 1) ^ 3) & 0xFFF)) = (RSP_GPR[RSPOpC.rt].UHW[0] & 0xFF); + } + else + { + *(uint16_t *)(RSPInfo.DMEM + ((Address ^ 2) & 0xFFF)) = RSP_GPR[RSPOpC.rt].UHW[0]; + } } void RSP_Opcode_SW(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (short)RSPOpC.offset) & 0xFFF; - RSP_SW_DMEM(Address, RSP_GPR[RSPOpC.rt].UW); + if ((Address & 0x3) != 0) + { + *(uint8_t *)(RSPInfo.DMEM + (((Address + 0) ^ 3) & 0xFFF)) = (RSP_GPR[RSPOpC.rt].UW >> 24) & 0xFF; + *(uint8_t *)(RSPInfo.DMEM + (((Address + 1) ^ 3) & 0xFFF)) = (RSP_GPR[RSPOpC.rt].UW >> 16) & 0xFF; + *(uint8_t *)(RSPInfo.DMEM + (((Address + 2) ^ 3) & 0xFFF)) = (RSP_GPR[RSPOpC.rt].UW >> 8) & 0xFF; + *(uint8_t *)(RSPInfo.DMEM + (((Address + 3) ^ 3) & 0xFFF)) = (RSP_GPR[RSPOpC.rt].UW >> 0) & 0xFF; + } + else + { + *(uint32_t *)(RSPInfo.DMEM + (Address & 0xFFF)) = RSP_GPR[RSPOpC.rt].UW; + } } void RSP_Opcode_LC2(void) @@ -2080,61 +2132,145 @@ void RSP_Vector_VNOOP(void) void RSP_Opcode_LBV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 0)) & 0xFFF; - RSP_LBV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + RSP_Vect[RSPOpC.rt].s8((uint8_t)(15 - RSPOpC.del)) = *(RSPInfo.DMEM + (Address ^ 3)); } void RSP_Opcode_LSV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 1)) & 0xFFF; - RSP_LSV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + uint8_t length = 2; + if (length > 16 - RSPOpC.del) + { + length = (uint8_t)(16 - RSPOpC.del); + } + for (uint8_t i = RSPOpC.del, n = (uint8_t)(length + RSPOpC.del); i < n; i++) + { + RSP_Vect[RSPOpC.rt].s8(15 - i) = *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)); + Address += 1; + } } void RSP_Opcode_LLV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 2)) & 0xFFF; - RSP_LLV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + uint8_t length = 4; + if (length > 16 - RSPOpC.del) + { + length = (uint8_t)(16 - RSPOpC.del); + } + for (uint8_t i = RSPOpC.del, n = (uint8_t)(length + RSPOpC.del); i < n; i++) + { + RSP_Vect[RSPOpC.rt].s8(15 - i) = *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)); + Address += 1; + } } void RSP_Opcode_LDV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 3)) & 0xFFF; - RSP_LDV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + uint8_t length = 8; + if (length > 16 - RSPOpC.del) + { + length = (uint8_t)(16 - RSPOpC.del); + } + for (uint8_t i = RSPOpC.del, n = (uint8_t)(length + RSPOpC.del); i < n; i++) + { + RSP_Vect[RSPOpC.rt].s8(15 - i) = *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)); + Address += 1; + } } void RSP_Opcode_LQV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 4)) & 0xFFF; - RSP_LQV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + uint32_t length = ((Address + 0x10) & ~0xF) - Address; + if (length > 16 - RSPOpC.del) + { + length = 16 - RSPOpC.del; + } + for (uint8_t i = RSPOpC.del; i < (length + RSPOpC.del); i++) + { + RSP_Vect[RSPOpC.rt].s8(i) = *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)); + Address += 1; + } + } void RSP_Opcode_LRV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 4)) & 0xFFF; - RSP_LRV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + uint8_t offset = (Address & 0xF) - 1; + uint8_t length = (uint8_t)((Address & 0xF) - RSPOpC.del); + Address &= 0xFF0; + for (uint8_t i = RSPOpC.del; i < (length + RSPOpC.del); i++) + { + RSP_Vect[RSPOpC.rt].s8(offset - i) = *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)); + Address += 1; + } } void RSP_Opcode_LPV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 3)) & 0xFFF; - RSP_LPV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + RSP_Vect[RSPOpC.rt].s16(7) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del) & 0xF) ^ 3) & 0xFFF)) << 8; + RSP_Vect[RSPOpC.rt].s16(6) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 1) & 0xF) ^ 3) & 0xFFF)) << 8; + RSP_Vect[RSPOpC.rt].s16(5) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 2) & 0xF) ^ 3) & 0xFFF)) << 8; + RSP_Vect[RSPOpC.rt].s16(4) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 3) & 0xF) ^ 3) & 0xFFF)) << 8; + RSP_Vect[RSPOpC.rt].s16(3) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 4) & 0xF) ^ 3) & 0xFFF)) << 8; + RSP_Vect[RSPOpC.rt].s16(2) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 5) & 0xF) ^ 3) & 0xFFF)) << 8; + RSP_Vect[RSPOpC.rt].s16(1) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 6) & 0xF) ^ 3) & 0xFFF)) << 8; + RSP_Vect[RSPOpC.rt].s16(0) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 7) & 0xF) ^ 3) & 0xFFF)) << 8; } void RSP_Opcode_LUV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 3)) & 0xFFF; - RSP_LUV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + RSP_Vect[RSPOpC.rt].s16(7) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(6) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 1) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(5) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 2) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(4) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 3) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(3) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 4) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(2) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 5) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(1) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 6) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(0) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 7) & 0xF) ^ 3) & 0xFFF)) << 7; } void RSP_Opcode_LHV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 4)) & 0xFFF; - RSP_LHV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + RSP_Vect[RSPOpC.rt].s16(7) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(6) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 2) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(5) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 4) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(4) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 6) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(3) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 8) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(2) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 10) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(1) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 12) & 0xF) ^ 3) & 0xFFF)) << 7; + RSP_Vect[RSPOpC.rt].s16(0) = *(RSPInfo.DMEM + ((Address + ((0x10 - RSPOpC.del + 14) & 0xF) ^ 3) & 0xFFF)) << 7; } void RSP_Opcode_LFV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 4)) & 0xFFF; - RSP_LFV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + uint8_t length = 8; + if (length > 16 - RSPOpC.del) + { + length = (uint8_t)(16 - RSPOpC.del); + } + + RSPVector Temp; + Temp.s16(7) = *(RSPInfo.DMEM + (((Address + RSPOpC.del) ^ 3) & 0xFFF)) << 7; + Temp.s16(6) = *(RSPInfo.DMEM + (((Address + ((0x4 - RSPOpC.del) ^ 3) & 0xf)) & 0xFFF)) << 7; + Temp.s16(5) = *(RSPInfo.DMEM + (((Address + ((0x8 - RSPOpC.del) ^ 3) & 0xf)) & 0xFFF)) << 7; + Temp.s16(4) = *(RSPInfo.DMEM + (((Address + ((0xC - RSPOpC.del) ^ 3) & 0xf)) & 0xFFF)) << 7; + Temp.s16(3) = *(RSPInfo.DMEM + (((Address + ((0x8 - RSPOpC.del) ^ 3) & 0xf)) & 0xFFF)) << 7; + Temp.s16(2) = *(RSPInfo.DMEM + (((Address + ((0xC - RSPOpC.del) ^ 3) & 0xf)) & 0xFFF)) << 7; + Temp.s16(1) = *(RSPInfo.DMEM + (((Address + ((0x10 - RSPOpC.del) ^ 3) & 0xf)) & 0xFFF)) << 7; + Temp.s16(0) = *(RSPInfo.DMEM + (((Address + ((0x4 - RSPOpC.del) ^ 3) & 0xf)) & 0xFFF)) << 7; + + for (uint8_t i = RSPOpC.del, n = (uint8_t)(length + RSPOpC.del); i < n; i++) + { + RSP_Vect[RSPOpC.rt].s8(15 - i) = Temp.s8(15 - i); + } } void RSP_Opcode_LWV(void) @@ -2143,8 +2279,20 @@ void RSP_Opcode_LWV(void) void RSP_Opcode_LTV(void) { - uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 4)) & 0xFFF; - RSP_LTV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + uint32_t Address = ((((uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 4)) & 0xFFF) + 8) & 0xFF0) + (RSPOpC.del & 0x1); + uint8_t length = 8; + if (length > 32 - RSPOpC.rt) + { + length = (uint8_t)(32 - RSPOpC.rt); + } + + for (uint8_t i = 0; i < length; i++) + { + uint8_t del = ((8 - (RSPOpC.del >> 1) + i) << 1) & 0xF; + RSP_Vect[RSPOpC.rt + i].s8(15 - del) = *(RSPInfo.DMEM + (Address ^ 3)); + RSP_Vect[RSPOpC.rt + i].s8(14 - del) = *(RSPInfo.DMEM + ((Address + 1) ^ 3)); + Address += 2; + } } // SC2 functions @@ -2152,73 +2300,247 @@ void RSP_Opcode_LTV(void) void RSP_Opcode_SBV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 0)) & 0xFFF; - RSP_SBV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = RSP_Vect[RSPOpC.rt].s8((uint8_t)(15 - RSPOpC.del)); } void RSP_Opcode_SSV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 1)) & 0xFFF; - RSP_SSV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + for (uint8_t i = RSPOpC.del, n = (uint8_t)(2 + RSPOpC.del); i < n; i++) + { + *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = RSP_Vect[RSPOpC.rt].s8(15 - (i & 0xF)); + Address += 1; + } } void RSP_Opcode_SLV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 2)) & 0xFFF; - RSP_SLV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + for (uint8_t i = RSPOpC.del, n = (uint8_t)(4 + RSPOpC.del); i < n; i++) + { + *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = RSP_Vect[RSPOpC.rt].s8(15 - (i & 0xF)); + Address += 1; + } } void RSP_Opcode_SDV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 3)) & 0xFFF; - RSP_SDV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + for (uint8_t i = RSPOpC.del; i < (8 + RSPOpC.del); i++) + { + *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = RSP_Vect[RSPOpC.rt].s8(15 - (i & 0xF)); + Address += 1; + } } void RSP_Opcode_SQV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 4)) & 0xFFF; - RSP_SQV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + uint8_t Length = (uint8_t)(((Address + 0x10) & ~0xF) - Address); + for (uint8_t i = RSPOpC.del; i < (Length + RSPOpC.del); i++) + { + *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = RSP_Vect[RSPOpC.rt].s8(i & 0xF); + Address += 1; + } } void RSP_Opcode_SRV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 4)) & 0xFFF; - RSP_SRV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + uint8_t Length = (Address & 0xF); + uint8_t Offset = (0x10 - Length) & 0xF; + Address &= 0xFF0; + for (uint8_t i = RSPOpC.del, n = (uint8_t)(Length + RSPOpC.del); i < n; i++) + { + *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = RSP_Vect[RSPOpC.rt].s8(15 - ((i + Offset) & 0xF)); + Address += 1; + } } void RSP_Opcode_SPV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 3)) & 0xFFF; - RSP_SPV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + for (uint8_t i = RSPOpC.del, n = (uint8_t)(8 + RSPOpC.del); i < n; i++) + { + if (((i) & 0xF) < 8) + { + *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = RSP_Vect[RSPOpC.rt].u8(15 - ((i & 0xF) << 1)); + } + else + { + *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = (RSP_Vect[RSPOpC.rt].u8(15 - ((i & 0x7) << 1)) << 1) + (RSP_Vect[RSPOpC.rt].u8(14 - ((i & 0x7) << 1)) >> 7); + } + Address += 1; + } } void RSP_Opcode_SUV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 3)) & 0xFFF; - RSP_SUV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + for (uint8_t Count = RSPOpC.del; Count < (8 + RSPOpC.del); Count++) + { + if (((Count) & 0xF) < 8) + { + *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = ((RSP_Vect[RSPOpC.rt].u8(15 - ((Count & 0x7) << 1)) << 1) + (RSP_Vect[RSPOpC.rt].u8(14 - ((Count & 0x7) << 1)) >> 7)) & 0xFF; + } + else + { + *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = RSP_Vect[RSPOpC.rt].u8(15 - ((Count & 0x7) << 1)); + } + Address += 1; + } } void RSP_Opcode_SHV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 4)) & 0xFFF; - RSP_SHV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = (RSP_Vect[RSPOpC.rt].u8((15 - RSPOpC.del) & 0xF) << 1) + (RSP_Vect[RSPOpC.rt].u8((14 - RSPOpC.del) & 0xF) >> 7); + *(RSPInfo.DMEM + (((Address + 2) ^ 3) & 0xFFF)) = (RSP_Vect[RSPOpC.rt].u8((13 - RSPOpC.del) & 0xF) << 1) + (RSP_Vect[RSPOpC.rt].u8((12 - RSPOpC.del) & 0xF) >> 7); + *(RSPInfo.DMEM + (((Address + 4) ^ 3) & 0xFFF)) = (RSP_Vect[RSPOpC.rt].u8((11 - RSPOpC.del) & 0xF) << 1) + (RSP_Vect[RSPOpC.rt].u8((10 - RSPOpC.del) & 0xF) >> 7); + *(RSPInfo.DMEM + (((Address + 6) ^ 3) & 0xFFF)) = (RSP_Vect[RSPOpC.rt].u8((9 - RSPOpC.del) & 0xF) << 1) + (RSP_Vect[RSPOpC.rt].u8((8 - RSPOpC.del) & 0xF) >> 7); + *(RSPInfo.DMEM + (((Address + 8) ^ 3) & 0xFFF)) = (RSP_Vect[RSPOpC.rt].u8((7 - RSPOpC.del) & 0xF) << 1) + (RSP_Vect[RSPOpC.rt].u8((6 - RSPOpC.del) & 0xF) >> 7); + *(RSPInfo.DMEM + (((Address + 10) ^ 3) & 0xFFF)) = (RSP_Vect[RSPOpC.rt].u8((5 - RSPOpC.del) & 0xF) << 1) + (RSP_Vect[RSPOpC.rt].u8((4 - RSPOpC.del) & 0xF) >> 7); + *(RSPInfo.DMEM + (((Address + 12) ^ 3) & 0xFFF)) = (RSP_Vect[RSPOpC.rt].u8((3 - RSPOpC.del) & 0xF) << 1) + (RSP_Vect[RSPOpC.rt].u8((2 - RSPOpC.del) & 0xF) >> 7); + *(RSPInfo.DMEM + (((Address + 14) ^ 3) & 0xFFF)) = (RSP_Vect[RSPOpC.rt].u8((1 - RSPOpC.del) & 0xF) << 1) + (RSP_Vect[RSPOpC.rt].u8((0 - RSPOpC.del) & 0xF) >> 7); } void RSP_Opcode_SFV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 4)) & 0xFFF; - RSP_SFV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + + int offset = Address & 0xF; + Address &= 0xFF0; + + switch (RSPOpC.del) + { + case 0: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(7) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(6) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(5) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(4) >> 7) & 0xFF; + break; + case 1: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(1) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(0) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(3) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(2) >> 7) & 0xFF; + break; + case 2: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = 0; + break; + case 3: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF) ^ 3))) = 0; + break; + case 4: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(6) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(5) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(4) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(7) >> 7) & 0xFF; + break; + case 5: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(0) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(3) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(2) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(1) >> 7) & 0xFF; + break; + case 6: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = 0; + break; + case 7: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = 0; + break; + case 8: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(3) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(2) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(1) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(0) >> 7) & 0xFF; + break; + case 9: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = 0; + break; + case 10: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = 0; + break; + case 11: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(4) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(7) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(6) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(5) >> 7) & 0xFF; + break; + case 12: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(2) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(1) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(0) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(3) >> 7) & 0xFF; + break; + case 13: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = 0; + break; + case 14: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = 0; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = 0; + break; + case 15: + *(RSPInfo.DMEM + ((Address + offset) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(7) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(6) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(5) >> 7) & 0xFF; + *(RSPInfo.DMEM + ((Address + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[RSPOpC.rt].u16(4) >> 7) & 0xFF; + break; + } } void RSP_Opcode_STV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 4)) & 0xFFF; - RSP_STV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + uint8_t Length = 8; + if (Length > 32 - RSPOpC.rt) + { + Length = (uint8_t)(32 - RSPOpC.rt); + } + Length = Length << 1; + uint8_t Del = RSPOpC.del >> 1; + for (uint8_t i = 0; i < Length; i += 2) + { + *(RSPInfo.DMEM + ((Address ^ 3) & 0xFFF)) = RSP_Vect[RSPOpC.rt + Del].u8(15 - i); + *(RSPInfo.DMEM + (((Address + 1) ^ 3) & 0xFFF)) = RSP_Vect[RSPOpC.rt + Del].u8(14 - i); + Del = (Del + 1) & 7; + Address += 2; + } } void RSP_Opcode_SWV(void) { uint32_t Address = (uint32_t)(RSP_GPR[RSPOpC.base].W + (RSPOpC.voffset << 4)) & 0xFFF; - RSP_SWV_DMEM(Address, RSPOpC.rt, RSPOpC.del); + uint8_t Offset = Address & 0xF; + Address &= 0xFF0; + for (uint8_t i = RSPOpC.del, n = (16 + RSPOpC.del); i < n; i++) + { + *(RSPInfo.DMEM + ((Address + (Offset & 0xF)) ^ 3)) = RSP_Vect[RSPOpC.rt].s8(15 - (i & 0xF)); + Offset += 1; + } } // Other functions diff --git a/Source/Project64-rsp/RSP Command.cpp b/Source/Project64-rsp/RSP Command.cpp index 741fa008e..d678f68bc 100644 --- a/Source/Project64-rsp/RSP Command.cpp +++ b/Source/Project64-rsp/RSP Command.cpp @@ -221,7 +221,6 @@ void DumpRSPCode(void) void DumpRSPData(void) { char string[100], LogFileName[255], *p; - uint32_t value; DWORD location, dwWritten; HANDLE hLogFile = NULL; @@ -256,12 +255,12 @@ void DumpRSPData(void) unsigned int characters_to_write; int characters_converted; - RSP_LW_DMEM(location, &value); + uint32_t Value = *(uint32_t *)(RSPInfo.DMEM + location); characters_converted = sprintf( &string[0], " 0x%03X\t0x%08X\r\n", location, - value); + Value); if (characters_converted < 0) { diff --git a/Source/Project64-rsp/Recompiler Analysis.cpp b/Source/Project64-rsp/Recompiler Analysis.cpp index 65e5f43f6..dac8e3192 100644 --- a/Source/Project64-rsp/Recompiler Analysis.cpp +++ b/Source/Project64-rsp/Recompiler Analysis.cpp @@ -21,8 +21,7 @@ Input: PC bool IsOpcodeNop(DWORD PC) { RSPOpcode RspOp; - RSP_LW_IMEM(PC, &RspOp.Value); - + RspOp.Value = *(uint32_t *)(RSPInfo.IMEM + (PC & 0xFFC)); if (RspOp.op == RSP_SPECIAL && RspOp.funct == RSP_SPECIAL_SLL) { return (RspOp.rd == 0) ? true : false; @@ -46,7 +45,7 @@ bool IsNextInstructionMmx(DWORD PC) PC += 4; if (PC >= 0x1000) return false; - RSP_LW_IMEM(PC, &RspOp.Value); + RspOp.Value = *(uint32_t *)(RSPInfo.IMEM + (PC & 0xFFC)); if (RspOp.op != RSP_CP2) return false; @@ -146,7 +145,7 @@ DWORD WriteToAccum2(int Location, int PC, bool RecursiveCall) { return true; } - RSP_LW_IMEM(PC, &RspOp.Value); + RspOp.Value = *(uint32_t *)(RSPInfo.IMEM + (PC & 0xFFC)); switch (RspOp.op) { @@ -240,7 +239,8 @@ DWORD WriteToAccum2(int Location, int PC, bool RecursiveCall) } // If the opcode (which is 8 bytes before the destination and also a J backward) then ignore this BranchImmed = (PC + ((short)RspOp.offset << 2) + 4) & 0xFFC; - RSP_LW_IMEM(BranchImmed - 8, &NextOp.Value); + NextOp.Value = *(uint32_t *)(RSPInfo.IMEM + ((BranchImmed - 8) & 0xFFC)); + if (RspOp.op == RSP_J && (int)(RspOp.target << 2) < PC) { break; @@ -501,7 +501,7 @@ bool WriteToVectorDest2(DWORD DestReg, int PC, bool RecursiveCall) { return true; } - RSP_LW_IMEM(PC, &RspOp.Value); + RspOp.Value = *(uint32_t *)(RSPInfo.IMEM + (PC & 0xFFC)); switch (RspOp.op) { @@ -904,7 +904,7 @@ bool UseRspFlags(int PC) { return true; } - RSP_LW_IMEM(PC, &RspOp.Value); + RspOp.Value = *(uint32_t *)(RSPInfo.IMEM + (PC & 0xFFC)); switch (RspOp.op) { @@ -1137,8 +1137,7 @@ bool IsRegisterConstant(DWORD Reg, DWORD * Constant) while (PC < 0x1000) { - - RSP_LW_IMEM(PC, &RspOp.Value); + RspOp.Value = *(uint32_t *)(RSPInfo.IMEM + (PC & 0xFFC)); // Resample command in microcode likes S7 /* if (PC == 0xFBC) { diff --git a/Source/Project64-rsp/Recompiler CPU.cpp b/Source/Project64-rsp/Recompiler CPU.cpp index 9efb9146c..c77c2b186 100644 --- a/Source/Project64-rsp/Recompiler CPU.cpp +++ b/Source/Project64-rsp/Recompiler CPU.cpp @@ -417,7 +417,7 @@ void ReOrderInstructions(DWORD StartPC, DWORD EndPC) DWORD Count, ReorderedOps, CurrentPC; RSPOpcode PreviousOp, CurrentOp, RspOp; - PreviousOp.Value = *(DWORD *)(RSPInfo.IMEM + StartPC); + PreviousOp.Value = *(DWORD *)(RSPInfo.IMEM + (StartPC & 0xFFC)); if (IsOpcodeBranch(StartPC, PreviousOp)) { @@ -452,7 +452,7 @@ void ReOrderInstructions(DWORD StartPC, DWORD EndPC) for (Count = 0; Count < InstructionCount; Count += 4) { CurrentPC = StartPC; - PreviousOp.Value = *(DWORD *)(RSPInfo.IMEM + CurrentPC); + PreviousOp.Value = *(DWORD *)(RSPInfo.IMEM + (CurrentPC & 0xFFC)); ReorderedOps = 0; for (;;) @@ -476,7 +476,7 @@ void ReOrderInstructions(DWORD StartPC, DWORD EndPC) CPU_Message("Swapped %X and %X", CurrentPC - 4, CurrentPC); #endif } - PreviousOp.Value = *(DWORD *)(RSPInfo.IMEM + CurrentPC); + PreviousOp.Value = *(DWORD *)(RSPInfo.IMEM + (CurrentPC & 0xFFC)); if (IsOpcodeNop(CurrentPC) && IsOpcodeNop(CurrentPC + 4) && IsOpcodeNop(CurrentPC + 8)) { diff --git a/Source/Project64-rsp/memory.cpp b/Source/Project64-rsp/memory.cpp index aebd392f7..c47c8c784 100644 --- a/Source/Project64-rsp/memory.cpp +++ b/Source/Project64-rsp/memory.cpp @@ -110,196 +110,6 @@ void SetJumpTable(uint32_t End) NoOfMaps += 1; } -void RSP_LB_DMEM(uint32_t Addr, uint8_t * Value) -{ - *Value = *(uint8_t *)(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)); -} - -void RSP_LBV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - RSP_Vect[vect].s8(15 - element) = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)); -} - -void RSP_LDV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - uint8_t length, Count; - - length = 8; - if (length > 16 - element) - { - length = 16 - element; - } - for (Count = element; Count < (length + element); Count++) - { - RSP_Vect[vect].s8(15 - Count) = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)); - Addr += 1; - } -} - -void RSP_LFV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - uint8_t length, count; - RSPVector Temp; - - length = 8; - if (length > 16 - element) - { - length = 16 - element; - } - - Temp.s16(7) = *(RSPInfo.DMEM + (((Addr + element) ^ 3) & 0xFFF)) << 7; - Temp.s16(6) = *(RSPInfo.DMEM + (((Addr + ((0x4 - element) ^ 3) & 0xf)) & 0xFFF)) << 7; - Temp.s16(5) = *(RSPInfo.DMEM + (((Addr + ((0x8 - element) ^ 3) & 0xf)) & 0xFFF)) << 7; - Temp.s16(4) = *(RSPInfo.DMEM + (((Addr + ((0xC - element) ^ 3) & 0xf)) & 0xFFF)) << 7; - Temp.s16(3) = *(RSPInfo.DMEM + (((Addr + ((0x8 - element) ^ 3) & 0xf)) & 0xFFF)) << 7; - Temp.s16(2) = *(RSPInfo.DMEM + (((Addr + ((0xC - element) ^ 3) & 0xf)) & 0xFFF)) << 7; - Temp.s16(1) = *(RSPInfo.DMEM + (((Addr + ((0x10 - element) ^ 3) & 0xf)) & 0xFFF)) << 7; - Temp.s16(0) = *(RSPInfo.DMEM + (((Addr + ((0x4 - element) ^ 3) & 0xf)) & 0xFFF)) << 7; - - for (count = element; count < (length + element); count++) - { - RSP_Vect[vect].s8(15 - count) = Temp.s8(15 - count); - } -} - -void RSP_LH_DMEM(uint32_t Addr, uint16_t * Value) -{ - if ((Addr & 0x1) != 0) - { - *Value = *(uint8_t *)(RSPInfo.DMEM + (((Addr + 0) & 0xFFF) ^ 3)) << 8; - *Value += *(uint8_t *)(RSPInfo.DMEM + (((Addr + 1) & 0xFFF) ^ 3)) << 0; - return; - } - *Value = *(uint16_t *)(RSPInfo.DMEM + ((Addr ^ 2) & 0xFFF)); -} - -void RSP_LHV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - RSP_Vect[vect].s16(7) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(6) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 2) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(5) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 4) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(4) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 6) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(3) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 8) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(2) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 10) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(1) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 12) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(0) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 14) & 0xF) ^ 3) & 0xFFF)) << 7; -} - -void RSP_LLV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - uint8_t length, Count; - - length = 4; - if (length > 16 - element) - { - length = 16 - element; - } - for (Count = element; Count < (length + element); Count++) - { - RSP_Vect[vect].s8(15 - Count) = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)); - Addr += 1; - } -} - -void RSP_LPV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - RSP_Vect[vect].s16(7) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element) & 0xF) ^ 3) & 0xFFF)) << 8; - RSP_Vect[vect].s16(6) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 1) & 0xF) ^ 3) & 0xFFF)) << 8; - RSP_Vect[vect].s16(5) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 2) & 0xF) ^ 3) & 0xFFF)) << 8; - RSP_Vect[vect].s16(4) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 3) & 0xF) ^ 3) & 0xFFF)) << 8; - RSP_Vect[vect].s16(3) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 4) & 0xF) ^ 3) & 0xFFF)) << 8; - RSP_Vect[vect].s16(2) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 5) & 0xF) ^ 3) & 0xFFF)) << 8; - RSP_Vect[vect].s16(1) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 6) & 0xF) ^ 3) & 0xFFF)) << 8; - RSP_Vect[vect].s16(0) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 7) & 0xF) ^ 3) & 0xFFF)) << 8; -} - -void RSP_LRV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - uint8_t offset = (Addr & 0xF) - 1; - uint8_t length = (Addr & 0xF) - element; - Addr &= 0xFF0; - for (uint32_t i = element; i < (length + element); i++) - { - RSP_Vect[vect].s8(offset - i) = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)); - Addr += 1; - } -} - -void RSP_LQV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - uint32_t length = ((Addr + 0x10) & ~0xF) - Addr; - if (length > 16 - element) - { - length = 16 - element; - } - for (uint8_t i = element; i < (length + element); i++) - { - RSP_Vect[vect].s8(i) = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)); - Addr += 1; - } -} - -void RSP_LSV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - uint8_t length, Count; - - length = 2; - if (length > 16 - element) - { - length = 16 - element; - } - for (Count = element; Count < (length + element); Count++) - { - RSP_Vect[vect].s8(15 - Count) = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)); - Addr += 1; - } -} - -void RSP_LTV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - uint8_t del, count, length; - - length = 8; - if (length > 32 - vect) - { - length = 32 - vect; - } - - Addr = ((Addr + 8) & 0xFF0) + (element & 0x1); - for (count = 0; count < length; count++) - { - del = ((8 - (element >> 1) + count) << 1) & 0xF; - RSP_Vect[vect + count].s8(15 - del) = *(RSPInfo.DMEM + (Addr ^ 3)); - RSP_Vect[vect + count].s8(14 - del) = *(RSPInfo.DMEM + ((Addr + 1) ^ 3)); - Addr += 2; - } -} - -void RSP_LUV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - RSP_Vect[vect].s16(7) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(6) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 1) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(5) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 2) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(4) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 3) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(3) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 4) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(2) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 5) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(1) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 6) & 0xF) ^ 3) & 0xFFF)) << 7; - RSP_Vect[vect].s16(0) = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 7) & 0xF) ^ 3) & 0xFFF)) << 7; -} - -void RSP_LW_DMEM(uint32_t Addr, uint32_t * Value) -{ - if ((Addr & 0x3) != 0) - { - *Value = *(uint8_t *)(RSPInfo.DMEM + (((Addr + 0) & 0xFFF) ^ 3)) << 24; - *Value += *(uint8_t *)(RSPInfo.DMEM + (((Addr + 1) & 0xFFF) ^ 3)) << 16; - *Value += *(uint8_t *)(RSPInfo.DMEM + (((Addr + 2) & 0xFFF) ^ 3)) << 8; - *Value += *(uint8_t *)(RSPInfo.DMEM + (((Addr + 3) & 0xFFF) ^ 3)) << 0; - return; - } - *Value = *(uint32_t *)(RSPInfo.DMEM + (Addr & 0xFFF)); -} - void RSP_LW_IMEM(uint32_t Addr, uint32_t * Value) { if ((Addr & 0x3) != 0) @@ -307,295 +117,4 @@ void RSP_LW_IMEM(uint32_t Addr, uint32_t * Value) DisplayError("Unaligned RSP_LW_IMEM"); } *Value = *(uint32_t *)(RSPInfo.IMEM + (Addr & 0xFFF)); -} - -void RSP_SB_DMEM(uint32_t Addr, uint8_t Value) -{ - *(uint8_t *)(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = Value; -} - -void RSP_SBV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].s8(15 - element); -} - -void RSP_SDV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - int Count; - - for (Count = element; Count < (8 + element); Count++) - { - *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].s8(15 - (Count & 0xF)); - Addr += 1; - } -} - -void RSP_SFV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - int offset = Addr & 0xF; - Addr &= 0xFF0; - - switch (element) - { - case 0: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].u16(7) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(6) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(5) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(4) >> 7) & 0xFF; - break; - case 1: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].u16(1) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(0) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(3) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(2) >> 7) & 0xFF; - break; - case 2: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0; - break; - case 3: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF) ^ 3))) = 0; - break; - case 4: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].u16(6) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(5) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(4) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(7) >> 7) & 0xFF; - break; - case 5: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].u16(0) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(3) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(2) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(1) >> 7) & 0xFF; - break; - case 6: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0; - break; - case 7: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0; - break; - case 8: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].u16(3) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(2) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(1) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(0) >> 7) & 0xFF; - break; - case 9: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0; - break; - case 10: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0; - break; - case 11: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].u16(4) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(7) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(6) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(5) >> 7) & 0xFF; - break; - case 12: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].u16(2) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(1) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(0) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(3) >> 7) & 0xFF; - break; - case 13: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0; - break; - case 14: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0; - break; - case 15: - *(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].u16(7) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(6) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(5) >> 7) & 0xFF; - *(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].u16(4) >> 7) & 0xFF; - break; - } -} - -void RSP_SH_DMEM(uint32_t Addr, uint16_t Value) -{ - if ((Addr & 0x1) != 0) - { - *(uint8_t *)(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = (Value >> 8); - *(uint8_t *)(RSPInfo.DMEM + (((Addr + 1) ^ 3) & 0xFFF)) = (Value & 0xFF); - } - else - { - *(uint16_t *)(RSPInfo.DMEM + ((Addr ^ 2) & 0xFFF)) = Value; - } -} - -void RSP_SHV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = (RSP_Vect[vect].u8((15 - element) & 0xF) << 1) + - (RSP_Vect[vect].u8((14 - element) & 0xF) >> 7); - *(RSPInfo.DMEM + (((Addr + 2) ^ 3) & 0xFFF)) = (RSP_Vect[vect].u8((13 - element) & 0xF) << 1) + - (RSP_Vect[vect].u8((12 - element) & 0xF) >> 7); - *(RSPInfo.DMEM + (((Addr + 4) ^ 3) & 0xFFF)) = (RSP_Vect[vect].u8((11 - element) & 0xF) << 1) + - (RSP_Vect[vect].u8((10 - element) & 0xF) >> 7); - *(RSPInfo.DMEM + (((Addr + 6) ^ 3) & 0xFFF)) = (RSP_Vect[vect].u8((9 - element) & 0xF) << 1) + - (RSP_Vect[vect].u8((8 - element) & 0xF) >> 7); - *(RSPInfo.DMEM + (((Addr + 8) ^ 3) & 0xFFF)) = (RSP_Vect[vect].u8((7 - element) & 0xF) << 1) + - (RSP_Vect[vect].u8((6 - element) & 0xF) >> 7); - *(RSPInfo.DMEM + (((Addr + 10) ^ 3) & 0xFFF)) = (RSP_Vect[vect].u8((5 - element) & 0xF) << 1) + - (RSP_Vect[vect].u8((4 - element) & 0xF) >> 7); - *(RSPInfo.DMEM + (((Addr + 12) ^ 3) & 0xFFF)) = (RSP_Vect[vect].u8((3 - element) & 0xF) << 1) + - (RSP_Vect[vect].u8((2 - element) & 0xF) >> 7); - *(RSPInfo.DMEM + (((Addr + 14) ^ 3) & 0xFFF)) = (RSP_Vect[vect].u8((1 - element) & 0xF) << 1) + - (RSP_Vect[vect].u8((0 - element) & 0xF) >> 7); -} - -void RSP_SLV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - int Count; - - for (Count = element; Count < (4 + element); Count++) - { - *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].s8(15 - (Count & 0xF)); - Addr += 1; - } -} - -void RSP_SPV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - int Count; - - for (Count = element; Count < (8 + element); Count++) - { - if (((Count)&0xF) < 8) - { - *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].u8(15 - ((Count & 0xF) << 1)); - } - else - { - *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = (RSP_Vect[vect].u8(15 - ((Count & 0x7) << 1)) << 1) + - (RSP_Vect[vect].u8(14 - ((Count & 0x7) << 1)) >> 7); - } - Addr += 1; - } -} - -void RSP_SQV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - uint8_t length = ((Addr + 0x10) & ~0xF) - Addr; - for (uint8_t i = element; i < (length + element); i++) - { - *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].s8(i & 0xF); - Addr += 1; - } -} - -void RSP_SRV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - int length, Count, offset; - - length = (Addr & 0xF); - offset = (0x10 - length) & 0xF; - Addr &= 0xFF0; - for (Count = element; Count < (length + element); Count++) - { - *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].s8(15 - ((Count + offset) & 0xF)); - Addr += 1; - } -} - -void RSP_SSV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - int Count; - - for (Count = element; Count < (2 + element); Count++) - { - *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].s8(15 - (Count & 0xF)); - Addr += 1; - } -} - -void RSP_STV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - uint8_t del, count, length; - - length = 8; - if (length > 32 - vect) - { - length = 32 - vect; - } - length = length << 1; - del = element >> 1; - for (count = 0; count < length; count += 2) - { - *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect + del].u8(15 - count); - *(RSPInfo.DMEM + (((Addr + 1) ^ 3) & 0xFFF)) = RSP_Vect[vect + del].u8(14 - count); - del = (del + 1) & 7; - Addr += 2; - } -} - -void RSP_SUV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - for (uint8_t Count = element; Count < (8 + element); Count++) - { - if (((Count)&0xF) < 8) - { - *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = ((RSP_Vect[vect].u8(15 - ((Count & 0x7) << 1)) << 1) + - (RSP_Vect[vect].u8(14 - ((Count & 0x7) << 1)) >> 7)) & - 0xFF; - } - else - { - *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].u8(15 - ((Count & 0x7) << 1)); - } - Addr += 1; - } -} - -void RSP_SW_DMEM(uint32_t Addr, uint32_t Value) -{ - if ((Addr & 0x3) != 0) - { - *(uint8_t *)(RSPInfo.DMEM + (((Addr + 0) ^ 3) & 0xFFF)) = (Value >> 24) & 0xFF; - *(uint8_t *)(RSPInfo.DMEM + (((Addr + 1) ^ 3) & 0xFFF)) = (Value >> 16) & 0xFF; - *(uint8_t *)(RSPInfo.DMEM + (((Addr + 2) ^ 3) & 0xFFF)) = (Value >> 8) & 0xFF; - *(uint8_t *)(RSPInfo.DMEM + (((Addr + 3) ^ 3) & 0xFFF)) = (Value >> 0) & 0xFF; - } - else - { - *(uint32_t *)(RSPInfo.DMEM + (Addr & 0xFFF)) = Value; - } -} - -void RSP_SWV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element) -{ - int Count, offset; - - offset = Addr & 0xF; - Addr &= 0xFF0; - for (Count = element; Count < (16 + element); Count++) - { - *(RSPInfo.DMEM + ((Addr + (offset & 0xF)) ^ 3)) = RSP_Vect[vect].s8(15 - (Count & 0xF)); - offset += 1; - } -} +} \ No newline at end of file diff --git a/Source/Project64-rsp/memory.h b/Source/Project64-rsp/memory.h index c086aaf02..e9a3a64d2 100644 --- a/Source/Project64-rsp/memory.h +++ b/Source/Project64-rsp/memory.h @@ -8,33 +8,5 @@ extern uint8_t *RecompCode, *RecompCodeSecondary, *RecompPos; extern void ** JumpTable; extern uint32_t Table; -void RSP_LB_DMEM(uint32_t Addr, uint8_t * Value); -void RSP_LBV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_LDV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_LFV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_LH_DMEM(uint32_t Addr, uint16_t * Value); -void RSP_LHV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_LLV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_LPV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_LRV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_LQV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_LSV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_LTV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_LUV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_LW_DMEM(uint32_t Addr, uint32_t * Value); void RSP_LW_IMEM(uint32_t Addr, uint32_t * Value); -void RSP_SB_DMEM(uint32_t Addr, uint8_t Value); -void RSP_SBV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_SDV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_SFV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_SH_DMEM(uint32_t Addr, uint16_t Value); -void RSP_SHV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_SLV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_SPV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_SQV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_SRV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_SSV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_STV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_SUV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element); -void RSP_SW_DMEM(uint32_t Addr, uint32_t Value); void RSP_SWV_DMEM(uint32_t Addr, uint8_t vect, uint8_t element);