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