Weird MFC_PUTR_CMD handling

This commit is contained in:
Nekotekina 2014-03-16 01:33:19 +04:00
parent c9a421f12f
commit 4aa6ddf3dd
2 changed files with 15 additions and 7 deletions

View file

@ -4,13 +4,16 @@
enum enum
{ {
MFC_PUT_CMD = 0x20, MFC_PUTB_CMD = 0x21, MFC_PUTF_CMD = 0x22, MFC_PUT_CMD = 0x20, MFC_PUTB_CMD = 0x21, MFC_PUTF_CMD = 0x22,
MFC_PUTR_CMD = 0x30, MFC_PUTRB_CMD = 0x31, MFC_PUTRF_CMD = 0x32,
MFC_GET_CMD = 0x40, MFC_GETB_CMD = 0x41, MFC_GETF_CMD = 0x42, MFC_GET_CMD = 0x40, MFC_GETB_CMD = 0x41, MFC_GETF_CMD = 0x42,
MFC_PUTL_CMD = 0x24, MFC_PUTLB_CMD = 0x25, MFC_PUTLF_CMD = 0x26, MFC_PUTL_CMD = 0x24, MFC_PUTLB_CMD = 0x25, MFC_PUTLF_CMD = 0x26,
MFC_PUTRL_CMD = 0x34, MFC_PUTRLB_CMD = 0x35, MFC_PUTRLF_CMD = 0x36,
MFC_GETL_CMD = 0x44, MFC_GETLB_CMD = 0x45, MFC_GETLF_CMD = 0x46, MFC_GETL_CMD = 0x44, MFC_GETLB_CMD = 0x45, MFC_GETLF_CMD = 0x46,
MFC_GETLLAR_CMD = 0xD0, MFC_GETLLAR_CMD = 0xD0,
MFC_PUTLLC_CMD = 0xB4, MFC_PUTLLC_CMD = 0xB4,
MFC_PUTLLUC_CMD = 0xB0, MFC_PUTLLUC_CMD = 0xB0,
MFC_PUTQLLUC_CMD = 0xB8, MFC_PUTQLLUC_CMD = 0xB8,
MFC_SNDSIG_CMD = 0xA0, MFC_SNDSIGB_CMD = 0xA1, MFC_SNDSIGF_CMD = 0xA2, MFC_SNDSIG_CMD = 0xA0, MFC_SNDSIGB_CMD = 0xA1, MFC_SNDSIGF_CMD = 0xA2,
MFC_BARRIER_CMD = 0xC0, MFC_BARRIER_CMD = 0xC0,
MFC_EIEIO_CMD = 0xC8, MFC_EIEIO_CMD = 0xC8,
@ -19,6 +22,8 @@ enum
MFC_BARRIER_MASK = 0x01, MFC_BARRIER_MASK = 0x01,
MFC_FENCE_MASK = 0x02, MFC_FENCE_MASK = 0x02,
MFC_LIST_MASK = 0x04, MFC_LIST_MASK = 0x04,
MFC_START_MASK = 0x08, // ???
MFC_RESULT_MASK = 0x10, // ???
MFC_MASK_CMD = 0xffff, MFC_MASK_CMD = 0xffff,
}; };

View file

@ -568,8 +568,7 @@ public:
// LS access // LS access
ea = spu->dmac.ls_offset + addr; ea = spu->dmac.ls_offset + addr;
} }
else if ((cmd & ~(MFC_BARRIER_MASK | MFC_FENCE_MASK | MFC_LIST_MASK)) == MFC_PUT_CMD && else if ((cmd & MFC_PUT_CMD) && size == 4 && (addr == SYS_SPU_THREAD_SNR1 || addr == SYS_SPU_THREAD_SNR2))
size == 4 && (addr == SYS_SPU_THREAD_SNR1 || addr == SYS_SPU_THREAD_SNR2))
{ {
spu->WriteSNR(SYS_SPU_THREAD_SNR2 == addr, Memory.Read32(dmac.ls_offset + lsa)); spu->WriteSNR(SYS_SPU_THREAD_SNR2 == addr, Memory.Read32(dmac.ls_offset + lsa));
return true; return true;
@ -587,7 +586,7 @@ public:
} }
} }
switch(cmd & ~(MFC_BARRIER_MASK | MFC_FENCE_MASK | MFC_LIST_MASK)) switch(cmd & ~(MFC_BARRIER_MASK | MFC_FENCE_MASK | MFC_LIST_MASK | MFC_RESULT_MASK))
{ {
case MFC_PUT_CMD: case MFC_PUT_CMD:
{ {
@ -694,10 +693,12 @@ public:
switch(op & ~(MFC_BARRIER_MASK | MFC_FENCE_MASK)) switch(op & ~(MFC_BARRIER_MASK | MFC_FENCE_MASK))
{ {
case MFC_PUT_CMD: case MFC_PUT_CMD:
case MFC_PUTR_CMD: // ???
case MFC_GET_CMD: case MFC_GET_CMD:
{ {
if (Ini.HLELogging.GetValue()) ConLog.Write("DMA %s%s%s: lsa = 0x%x, ea = 0x%llx, tag = 0x%x, size = 0x%x, cmd = 0x%x", if (Ini.HLELogging.GetValue()) ConLog.Write("DMA %s%s%s%s: lsa = 0x%x, ea = 0x%llx, tag = 0x%x, size = 0x%x, cmd = 0x%x",
wxString(op & MFC_PUT_CMD ? "PUT" : "GET").wx_str(), wxString(op & MFC_PUT_CMD ? "PUT" : "GET").wx_str(),
wxString(op & MFC_RESULT_MASK ? "R" : "").wx_str(),
wxString(op & MFC_BARRIER_MASK ? "B" : "").wx_str(), wxString(op & MFC_BARRIER_MASK ? "B" : "").wx_str(),
wxString(op & MFC_FENCE_MASK ? "F" : "").wx_str(), wxString(op & MFC_FENCE_MASK ? "F" : "").wx_str(),
lsa, ea, tag, size, cmd); lsa, ea, tag, size, cmd);
@ -719,10 +720,12 @@ public:
break; break;
case MFC_PUTL_CMD: case MFC_PUTL_CMD:
case MFC_PUTRL_CMD: // ???
case MFC_GETL_CMD: case MFC_GETL_CMD:
{ {
if (Ini.HLELogging.GetValue()) ConLog.Write("DMA %s%s%s: lsa = 0x%x, list = 0x%llx, tag = 0x%x, size = 0x%x, cmd = 0x%x", if (Ini.HLELogging.GetValue()) ConLog.Write("DMA %s%s%s%s: lsa = 0x%x, list = 0x%llx, tag = 0x%x, size = 0x%x, cmd = 0x%x",
wxString(op & MFC_PUT_CMD ? "PUTL" : "GETL").wx_str(), wxString(op & MFC_PUT_CMD ? "PUT" : "GET").wx_str(),
wxString(op & MFC_RESULT_MASK ? "RL" : "L").wx_str(),
wxString(op & MFC_BARRIER_MASK ? "B" : "").wx_str(), wxString(op & MFC_BARRIER_MASK ? "B" : "").wx_str(),
wxString(op & MFC_FENCE_MASK ? "F" : "").wx_str(), wxString(op & MFC_FENCE_MASK ? "F" : "").wx_str(),
lsa, ea, tag, size, cmd); lsa, ea, tag, size, cmd);