3rdParty: update mupen64plus-core

This commit is contained in:
Rosalie Wanders
2026-06-13 18:53:48 +02:00
parent 4c50859481
commit 2da7750640
4 changed files with 68 additions and 49 deletions
+18 -18
View File
@@ -372,22 +372,22 @@ static const struct r4300_idec r4300_op_table[] = {
/* TLB opcodes table
* 176-239
*/
RESERVED, TLBR, TLBWI, RESERVED,
RESERVED, RESERVED, TLBWR, RESERVED,
TLBP, RESERVED, RESERVED, RESERVED,
RESERVED, RESERVED, RESERVED, RESERVED,
RESERVED, RESERVED, RESERVED, RESERVED,
RESERVED, RESERVED, RESERVED, RESERVED,
ERET, RESERVED, RESERVED, RESERVED,
RESERVED, RESERVED, RESERVED, RESERVED,
RESERVED, RESERVED, RESERVED, RESERVED,
RESERVED, RESERVED, RESERVED, RESERVED,
RESERVED, RESERVED, RESERVED, RESERVED,
RESERVED, RESERVED, RESERVED, RESERVED,
RESERVED, RESERVED, RESERVED, RESERVED,
RESERVED, RESERVED, RESERVED, RESERVED,
RESERVED, RESERVED, RESERVED, RESERVED,
RESERVED, RESERVED, RESERVED, RESERVED,
NOP, TLBR, TLBWI, NOP,
NOP, NOP, TLBWR, NOP,
TLBP, NOP, NOP, NOP,
NOP, NOP, NOP, NOP,
NOP, NOP, NOP, NOP,
NOP, NOP, NOP, NOP,
ERET, NOP, NOP, NOP,
NOP, NOP, NOP, NOP,
NOP, NOP, NOP, NOP,
NOP, NOP, NOP, NOP,
NOP, NOP, NOP, NOP,
NOP, NOP, NOP, NOP,
NOP, NOP, NOP, NOP,
NOP, NOP, NOP, NOP,
NOP, NOP, NOP, NOP,
NOP, NOP, NOP, NOP,
/* COP1 opcodes table
* 240-247
*/
@@ -430,7 +430,7 @@ static const struct r4300_idec r4300_op_table[] = {
/* Pseudo opcodes
* 336
*/
NOP
NOP
};
#define E_INV { 0, 0, 0x00 }
@@ -459,7 +459,7 @@ struct r4300_op_escape {
static const struct r4300_op_escape r4300_escapes_table[] = {
/* 000000 - special */
E_SPECIAL, E_SPECIAL, E_SPECIAL, E_SPECIAL,
E_SPECIAL, E_SPECIAL, E_SPECIAL, E_SPECIAL,
/* 000001 - regimm */
E_REGIMM, E_REGIMM, E_REGIMM, E_REGIMM,
@@ -1089,16 +1089,17 @@ DECLARE_INSTRUCTION(TLBR)
DECLARE_R4300
uint32_t* cp0_regs = r4300_cp0_regs(&r4300->cp0);
int index;
index = cp0_regs[CP0_INDEX_REG] & UINT32_C(0x1F);
cp0_regs[CP0_PAGEMASK_REG] = r4300->cp0.tlb.entries[index].mask << 13;
cp0_regs[CP0_ENTRYHI_REG] = ((r4300->cp0.tlb.entries[index].vpn2 << 13) | r4300->cp0.tlb.entries[index].asid);
cp0_regs[CP0_ENTRYLO0_REG] = (r4300->cp0.tlb.entries[index].pfn_even << 6) | (r4300->cp0.tlb.entries[index].c_even << 3)
| (r4300->cp0.tlb.entries[index].d_even << 2) | (r4300->cp0.tlb.entries[index].v_even << 1)
| r4300->cp0.tlb.entries[index].g;
cp0_regs[CP0_ENTRYLO1_REG] = (r4300->cp0.tlb.entries[index].pfn_odd << 6) | (r4300->cp0.tlb.entries[index].c_odd << 3)
| (r4300->cp0.tlb.entries[index].d_odd << 2) | (r4300->cp0.tlb.entries[index].v_odd << 1)
| r4300->cp0.tlb.entries[index].g;
int index = cp0_regs[CP0_INDEX_REG] & UINT32_C(0x3F);
if (index < CP0_REGS_COUNT) {
cp0_regs[CP0_PAGEMASK_REG] = r4300->cp0.tlb.entries[index].mask << 13;
cp0_regs[CP0_ENTRYHI_REG] = ((r4300->cp0.tlb.entries[index].vpn2 << 13) | r4300->cp0.tlb.entries[index].asid);
cp0_regs[CP0_ENTRYLO0_REG] = (r4300->cp0.tlb.entries[index].pfn_even << 6) | (r4300->cp0.tlb.entries[index].c_even << 3)
| (r4300->cp0.tlb.entries[index].d_even << 2) | (r4300->cp0.tlb.entries[index].v_even << 1)
| r4300->cp0.tlb.entries[index].g;
cp0_regs[CP0_ENTRYLO1_REG] = (r4300->cp0.tlb.entries[index].pfn_odd << 6) | (r4300->cp0.tlb.entries[index].c_odd << 3)
| (r4300->cp0.tlb.entries[index].d_odd << 2) | (r4300->cp0.tlb.entries[index].v_odd << 1)
| r4300->cp0.tlb.entries[index].g;
}
ADD_TO_PC(1);
}
@@ -1220,8 +1221,12 @@ DECLARE_INSTRUCTION(TLBWR)
DECLARE_R4300
uint32_t* cp0_regs = r4300_cp0_regs(&r4300->cp0);
cp0_update_count(r4300);
cp0_regs[CP0_RANDOM_REG] = (cp0_regs[CP0_COUNT_REG]/r4300->cp0.count_per_op % (32 - cp0_regs[CP0_WIRED_REG]))
if (cp0_regs[CP0_WIRED_REG] >= 32) {
cp0_regs[CP0_RANDOM_REG] = cp0_regs[CP0_COUNT_REG]/r4300->cp0.count_per_op % 64;
} else {
cp0_regs[CP0_RANDOM_REG] = (cp0_regs[CP0_COUNT_REG]/r4300->cp0.count_per_op % (32 - cp0_regs[CP0_WIRED_REG]))
+ cp0_regs[CP0_WIRED_REG];
}
TLBWrite(r4300, cp0_regs[CP0_RANDOM_REG]);
ADD_TO_PC(1);
}
@@ -1231,7 +1236,9 @@ DECLARE_INSTRUCTION(TLBWI)
DECLARE_R4300
uint32_t* cp0_regs = r4300_cp0_regs(&r4300->cp0);
TLBWrite(r4300, cp0_regs[CP0_INDEX_REG] & UINT32_C(0x3F));
int index = cp0_regs[CP0_INDEX_REG] & UINT32_C(0x3F);
if (index < CP0_REGS_COUNT)
TLBWrite(r4300, index);
ADD_TO_PC(1);
}
@@ -1247,8 +1254,12 @@ DECLARE_INSTRUCTION(MFC0)
{
case CP0_RANDOM_REG:
cp0_update_count(r4300);
cp0_regs[CP0_RANDOM_REG] = (cp0_regs[CP0_COUNT_REG]/r4300->cp0.count_per_op % (32 - cp0_regs[CP0_WIRED_REG]))
+ cp0_regs[CP0_WIRED_REG];
if (cp0_regs[CP0_WIRED_REG] >= 32) {
cp0_regs[CP0_RANDOM_REG] = cp0_regs[CP0_COUNT_REG]/r4300->cp0.count_per_op % 64;
} else {
cp0_regs[CP0_RANDOM_REG] = (cp0_regs[CP0_COUNT_REG]/r4300->cp0.count_per_op % (32 - cp0_regs[CP0_WIRED_REG]))
+ cp0_regs[CP0_WIRED_REG];
}
rrt = SE32(cp0_regs[rfs]);
break;
case CP0_COUNT_REG:
@@ -1282,8 +1293,12 @@ DECLARE_INSTRUCTION(DMFC0)
{
case CP0_RANDOM_REG:
cp0_update_count(r4300);
cp0_regs[CP0_RANDOM_REG] = (cp0_regs[CP0_COUNT_REG]/r4300->cp0.count_per_op % (32 - cp0_regs[CP0_WIRED_REG]))
+ cp0_regs[CP0_WIRED_REG];
if (cp0_regs[CP0_WIRED_REG] >= 32) {
cp0_regs[CP0_RANDOM_REG] = cp0_regs[CP0_COUNT_REG]/r4300->cp0.count_per_op % 64;
} else {
cp0_regs[CP0_RANDOM_REG] = (cp0_regs[CP0_COUNT_REG]/r4300->cp0.count_per_op % (32 - cp0_regs[CP0_WIRED_REG]))
+ cp0_regs[CP0_WIRED_REG];
}
rrt = cp0_regs[rfs];
break;
case CP0_COUNT_REG:
@@ -1323,11 +1338,6 @@ DECLARE_INSTRUCTION(MTC0)
{
case CP0_INDEX_REG:
cp0_regs[CP0_INDEX_REG] = rrt32 & UINT32_C(0x8000003F);
if ((cp0_regs[CP0_INDEX_REG] & UINT32_C(0x3F)) > UINT32_C(31))
{
DebugMessage(M64MSG_ERROR, "MTC0 instruction writing Index register with TLB index > 31");
*r4300_stop(r4300)=1;
}
break;
case CP0_RANDOM_REG:
break;
@@ -1399,7 +1409,7 @@ DECLARE_INSTRUCTION(MTC0)
case CP0_PREVID_REG:
break;
case CP0_CONFIG_REG:
cp0_regs[CP0_CONFIG_REG] = (rrt32 & UINT32_C(0x0000000F))
cp0_regs[CP0_CONFIG_REG] = (rrt32 & UINT32_C(0x0000000F))
| (cp0_regs[CP0_CONFIG_REG] & UINT32_C(0x00008000))
| (cp0_regs[CP0_CONFIG_REG] & UINT32_C(0x7FFFFFFF));
break;
@@ -446,23 +446,32 @@ void InterpretOpcode(struct r4300_core* r4300)
case 5: /* Coprocessor 0 opcode 5: DMTC0 */
MTC0(r4300, op);
break;
case 16: /* Coprocessor 0 opcode 16: TLB */
case 2:
case 3:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15: /* Coprocessor 0 opcodes 2..3, 6..15: Reserved Instructions */
RESERVED(r4300, op);
break;
default: /* Coprocessor 0 opcode 16..31: TLB */
switch (op & 0x3F) {
case 1: TLBR(r4300, op); break;
case 2: TLBWI(r4300, op); break;
case 6: TLBWR(r4300, op); break;
case 8: TLBP(r4300, op); break;
case 24: ERET(r4300, op); break;
default: /* TLB sub-opcodes 0, 3..5, 7, 9..23, 25..63:
Reserved Instructions */
RESERVED(r4300, op);
default: /* TLB sub-opcodes 0, 3..5, 7, 9..23, 25..63: undefined */
NOP(r4300, 0);
break;
} /* switch (op & 0x3F) for Coprocessor 0 TLB opcodes */
break;
default: /* Coprocessor 0 opcodes 2..3, 5..15, 17..31:
Reserved Instructions */
RESERVED(r4300, op);
break;
} /* switch ((op >> 21) & 0x1F) for the Coprocessor 0 prefix */
break;
case 17: /* Coprocessor 1 prefix */
@@ -110,7 +110,7 @@ static void dma_pi_write(struct pi_controller* pi)
if (length >= 0x7f && (length & 1))
length += 1;
if (length <= 0x80)
length -= dram_addr & 0x7;
length = length >= (dram_addr & 0x7) ? length - (dram_addr & 0x7) : 0;
unsigned int cycles = handler->dma_write(opaque, dram, dram_addr, cart_addr, length);
post_framebuffer_write(&pi->dp->fb, dram_addr, length);