1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-25 12:12:50 +01:00

- Fixed PPU G_3f_0 Decoder.

This commit is contained in:
DH 2013-07-11 17:28:10 +03:00
parent fb57bb9c4e
commit 027a31bd84
2 changed files with 33 additions and 29 deletions

View File

@ -70,18 +70,6 @@ namespace PPU_instr
//This field is used to specify a bit in the CR, or in the FPSCR, as the destination of the result of an instruction //This field is used to specify a bit in the CR, or in the FPSCR, as the destination of the result of an instruction
static CodeField<6, 10> CRBD(FIELD_R_CR); static CodeField<6, 10> CRBD(FIELD_R_CR);
//
static CodeField<6, 10> BT;
//
static CodeField<11, 15> BA;
//
static CodeField<16, 20> BB;
//
static CodeField<6, 10> BF;
//This field is used to specify options for the branch conditional instructions //This field is used to specify options for the branch conditional instructions
static CodeField<6, 10> BO; static CodeField<6, 10> BO;
@ -158,7 +146,7 @@ namespace PPU_instr
static CodeField<6, 10> FRS; static CodeField<6, 10> FRS;
// //
static CodeField<7, 14> FLM; static CodeField<7, 14> FM;
//This field is used to specify an FPR as a source //This field is used to specify an FPR as a source
static CodeField<11, 15> FRA(FIELD_R_FPR); static CodeField<11, 15> FRA(FIELD_R_FPR);
@ -602,12 +590,12 @@ namespace PPU_instr
bind_instr(g3f_0_list, FCTID, FRD, FRB, RC); bind_instr(g3f_0_list, FCTID, FRD, FRB, RC);
bind_instr(g3f_0_list, FCTIDZ, FRD, FRB, RC); bind_instr(g3f_0_list, FCTIDZ, FRD, FRB, RC);
bind_instr(g3f_0_list, MTFSB1, BT, RC); bind_instr(g3f_0_list, MTFSB1, CRBD, RC);
bind_instr(g3f_0_list, MCRFS, BF, BFA); bind_instr(g3f_0_list, MCRFS, CRFD, CRFS);
bind_instr(g3f_0_list, MTFSB0, BT, RC); bind_instr(g3f_0_list, MTFSB0, CRBD, RC);
bind_instr(g3f_0_list, MTFSFI, CRFD, I, RC); bind_instr(g3f_0_list, MTFSFI, CRBD, I, RC);
bind_instr(g3f_0_list, MFFS, FRD, RC); bind_instr(g3f_0_list, MFFS, FRD, RC);
bind_instr(g3f_0_list, MTFSF, FLM, FRB, RC); bind_instr(g3f_0_list, MTFSF, FM, FRB, RC);
#undef bind_instr #undef bind_instr
}; };

View File

@ -3286,26 +3286,42 @@ private:
Memory.Write64(addr, CPU.GPR[rs]); Memory.Write64(addr, CPU.GPR[rs]);
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void MTFSB1(u32 bt, bool rc) void MTFSB1(u32 crbd, bool rc)
{ {
UNIMPLEMENTED(); u64 mask = (1ULL << crbd);
CPU.FPSCR.FPSCR |= mask;
if(rc) UNIMPLEMENTED();
} }
void MCRFS(u32 bf, u32 bfa) void MCRFS(u32 crbd, u32 crbs)
{ {
UNIMPLEMENTED(); u64 mask = (1ULL << crbd);
CPU.CR.CR &= ~mask;
CPU.CR.CR |= CPU.FPSCR.FPSCR & mask;
} }
void MTFSB0(u32 bt, bool rc) void MTFSB0(u32 crbd, bool rc)
{ {
UNIMPLEMENTED(); u64 mask = (1ULL << crbd);
CPU.FPSCR.FPSCR &= ~mask;
if(rc) UNIMPLEMENTED();
} }
void MTFSFI(u32 crfd, u32 i, bool rc) void MTFSFI(u32 crfd, u32 i, bool rc)
{ {
UNIMPLEMENTED(); u64 mask = (1ULL << crfd);
if(i)
{
CPU.FPSCR.FPSCR |= mask;
}
else
{
CPU.FPSCR.FPSCR &= ~mask;
}
if(rc) UNIMPLEMENTED();
} }
void MFFS(u32 frd, bool rc) void MFFS(u32 frd, bool rc)
{ {
(u64&)CPU.FPR[frd] = CPU.FPSCR.FPSCR; (u64&)CPU.FPR[frd] = CPU.FPSCR.FPSCR;
if(rc) UNK("mffs."); if(rc) UNIMPLEMENTED();
} }
void MTFSF(u32 flm, u32 frb, bool rc) void MTFSF(u32 flm, u32 frb, bool rc)
{ {
@ -3493,17 +3509,17 @@ private:
CPU.FPR[frd] = CPU.FPR[fra] * CPU.FPR[frc]; CPU.FPR[frd] = CPU.FPR[fra] * CPU.FPR[frc];
CPU.FPSCR.FI = 0; CPU.FPSCR.FI = 0;
CPU.FPSCR.FR = 0; CPU.FPSCR.FR = 0;
CPU.FPSCR.FPRF = PPCdouble(CPU.FPR[frd]).GetType(); CPU.FPSCR.FPRF = CPU.FPR[frd].GetType();
if(rc) UNK("fmul.");//CPU.UpdateCR1(CPU.FPR[frd]); if(rc) UNK("fmul.");//CPU.UpdateCR1(CPU.FPR[frd]);
} }
void FRSQRTE(u32 frd, u32 frb, bool rc) void FRSQRTE(u32 frd, u32 frb, bool rc)
{ {
UNIMPLEMENTED(); //if(CPU.FPR[frb].
} }
void FMSUB(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) void FMSUB(u32 frd, u32 fra, u32 frc, u32 frb, bool rc)
{ {
CPU.FPR[frd] = CPU.FPR[fra] * CPU.FPR[frc] - CPU.FPR[frb]; CPU.FPR[frd] = CPU.FPR[fra] * CPU.FPR[frc] - CPU.FPR[frb];
CPU.FPSCR.FPRF = PPCdouble(CPU.FPR[frd]).GetType(); CPU.FPSCR.FPRF = CPU.FPR[frd].GetType();
if(rc) UNK("fmsub.");//CPU.UpdateCR1(CPU.FPR[frd]); if(rc) UNK("fmsub.");//CPU.UpdateCR1(CPU.FPR[frd]);
} }
void FMADD(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) void FMADD(u32 frd, u32 fra, u32 frc, u32 frb, bool rc)