1 #include "../state.hpp"
2 
3 extern "C"
4 {
5 
RSP_CFC2(RSP::CPUState * rsp,unsigned rt,unsigned rd)6 	void RSP_CFC2(RSP::CPUState *rsp, unsigned rt, unsigned rd)
7 	{
8 		unsigned src = rd & 3;
9 		if (src == 3)
10 			src = 2;
11 
12 		int16_t res = rsp_get_flags(rsp->cp2.flags[src].e);
13 		if (rt)
14 			rsp->sr[rt] = res;
15 	}
16 
RSP_CTC2(RSP::CPUState * rsp,unsigned rt,unsigned rd)17 	void RSP_CTC2(RSP::CPUState *rsp, unsigned rt, unsigned rd)
18 	{
19 		rt = rsp->sr[rt] & 0xffff;
20 
21 		unsigned dst = rd & 3;
22 		if (dst >= 2)
23 		{
24 			rt &= 0xff;
25 			dst = 2;
26 		}
27 		rsp_set_flags(rsp->cp2.flags[dst].e, rt);
28 	}
29 
RSP_MTC2(RSP::CPUState * rsp,unsigned rt,unsigned rd,unsigned element)30 	void RSP_MTC2(RSP::CPUState *rsp, unsigned rt, unsigned rd, unsigned element)
31 	{
32 		uint16_t *e = rsp->cp2.regs[rd].e;
33 
34 #ifdef INTENSE_DEBUG
35 		fprintf(stderr, "MTC2, rt = %u, [rt] = 0x%x, rd = %u, e = %u\n", rt, rsp->sr[rt], rd, element);
36 #endif
37 
38 		unsigned lo = element >> 1;
39 		rt = rsp->sr[rt];
40 
41 		if (element & 1)
42 		{
43 			unsigned hi = (element + 1) >> 1;
44 			e[lo] = (e[lo] & 0xff00) | ((rt >> 8) & 0xff);
45 			e[hi] = (e[lo] & 0x00ff) | ((rt & 0xff) << 8);
46 		}
47 		else
48 			e[lo] = rt;
49 	}
50 
RSP_MFC2(RSP::CPUState * rsp,unsigned rt,unsigned rd,unsigned element)51 	void RSP_MFC2(RSP::CPUState *rsp, unsigned rt, unsigned rd, unsigned element)
52 	{
53 		if (rt == 0)
54 			return;
55 
56 		const uint16_t *e = rsp->cp2.regs[rd].e;
57 		unsigned lo = element >> 1;
58 
59 		if (element & 1)
60 		{
61 			unsigned hi = ((element + 1) >> 1) & 7;
62 			uint16_t high = e[lo] << 8;
63 			uint8_t low = e[hi] >> 8;
64 			rsp->sr[rt] = int16_t(high | low);
65 		}
66 		else
67 			rsp->sr[rt] = int16_t(e[lo]);
68 	}
69 }
70