Rather than 'complain' at #pcsx2dev, just going to blab here.
1) CDVD reading bug?
(already mentioned at IRC; just making a hard log here for others to read)
cdvdReadSector
Code:
if (bcr < cdvd.BlockSize) {
..
..
}
if( (HW_DMA3_CHCR & 0x01000000) == 0 ) {
//MessageBox( 0,L"DMA3 TRANSFER OFF!!!", L"CDROM", 0);
CDVD_LOG( "CDVD READ - DMA3 transfer off (try again)" );
return -1;
}
There's a -small- chance that a game (like TotA) hits a dma3 drain. Resets the bcr first. And a read IRQ triggers right after that. (before the new madr + chcr is set).
Meaning dma3 is off but code allows a read transfer occurs. This can break something. Potentially in theory.
Felt like harping about this again anyway.
2) IPU bug?
http://forums.pcsx2.net/Thread-Chatter
(Smackdown - Shut Your Mouth PAL - main menu movies)
Symptom:
Press START at title screen. Loading screen occurs with WWE logo. Movie begins playing and dies. Logs say:
'ipu0interrupt'
'ipu0interrupt'
..
..
'ipu0interrupt'
'ipu0interrupt'
'ipu0interrupt'
Code:
; death loop - check BUSY
eDis(0010b888 ca7c1f83): nop
eDis(0010b88c ca7c1f83): nop
eDis(0010b890 ca7c1f83): nop
eDis(0010b894 ca7c1f83): bltz v0, 0xFFFFFFEC
eDis(0010b898 ca7c1f83): nop
v1 = 10002010 --> IPU $10 (IPU_CTRL)
v0 --> 81003f00
eDis(0010b880 ca7c1f8c): lw v0, 0x0000(v1)
eDis(0010b884 ca7c1f8c): nop
So presumably when the IPU1 or IPU0 is off, BUSY goes down. Otherwise we hits this stupid loop and game locks up.
So a temp hack (too tired to care about a real fix right now)
Code:
ipucase(IPU_CTRL): // IPU_CTRL
{
ipuRegs.ctrl.IFC = g_BP.IFC;
ipuRegs.ctrl.CBP = coded_block_pattern;
if (!ipuRegs.ctrl.BUSY)
IPU_LOG("read32: IPU_CTRL=0x%08X", ipuRegs.ctrl._u32);
// Smackdown - Shut Your Mouth PAL movies
// - TEST HACK: IPU1 done ==> BUSY off (otherwise hang)
if( ipu1dma.qwc == 0 ) ipuRegs.ctrl.BUSY = 0;
if( ipu0dma.qwc == 0 ) ipuRegs.ctrl.BUSY = 0;
return ipuRegs.ctrl._u32;
}
Makes it all the way in-game to actual match.