diff --git a/pcsx2/Counters.cpp b/pcsx2/Counters.cpp index 6645e2b7c2..f5e5be2633 100644 --- a/pcsx2/Counters.cpp +++ b/pcsx2/Counters.cpp @@ -699,7 +699,10 @@ __forceinline void rcntWmode(int index, u32 value) } else counters[index].sCycleT = cpuRegs.cycle; - counters[index].modeval &= ~(value & 0xc00); //Clear status flags, the ps2 only clears what is given in the value + // Clear OverflowReached and TargetReached flags (0xc00 mask), but *only* if they are set to 1 in the + // given value. (yes, the bits are cleared when written with '1's). + + counters[index].modeval &= ~(value & 0xc00); counters[index].modeval = (counters[index].modeval & 0xc00) | (value & 0x3ff); EECNT_LOG("EE Counter[%d] writeMode = %x passed value=%x", index, counters[index].modeval, value ); diff --git a/pcsx2/Hw.h b/pcsx2/Hw.h index 7fe7eba76d..6abb7fe164 100644 --- a/pcsx2/Hw.h +++ b/pcsx2/Hw.h @@ -564,6 +564,8 @@ extern void __fastcall hwWrite32_page_0E( u32 mem, mem32_t value ); extern void __fastcall hwWrite32_page_0F( u32 mem, mem32_t value ); extern void __fastcall hwWrite32_generic( u32 mem, mem32_t value ); +extern void __fastcall hwWrite64_page_00( u32 mem, const mem64_t* srcval ); +extern void __fastcall hwWrite64_page_01( u32 mem, const mem64_t* srcval ); extern void __fastcall hwWrite64_page_02( u32 mem, const mem64_t* srcval ); extern void __fastcall hwWrite64_page_03( u32 mem, const mem64_t* srcval ); extern void __fastcall hwWrite64_page_0E( u32 mem, const mem64_t* srcval ); diff --git a/pcsx2/HwWrite.cpp b/pcsx2/HwWrite.cpp index 4656747ba9..d5d076d394 100644 --- a/pcsx2/HwWrite.cpp +++ b/pcsx2/HwWrite.cpp @@ -1045,6 +1045,20 @@ void __fastcall hwWrite32_generic( u32 mem, u32 value ) ///////////////////////////////////////////////////////////////////////// // HW Write 64 bit +// Page 0 of HW memory houses registers for Counters 0 and 1 +void __fastcall hwWrite64_page_00( u32 mem, const mem64_t* srcval ) +{ + hwWrite32_page_00( mem, (u32)*srcval ); // just ignore upper 32 bits. + *((u64*)&PS2MEM_HW[mem]) = *srcval; +} + +// Page 1 of HW memory houses registers for Counters 2 and 3 +void __fastcall hwWrite64_page_01( u32 mem, const mem64_t* srcval ) +{ + hwWrite32_page_01( mem, (u32)*srcval ); // just ignore upper 32 bits. + *((u64*)&PS2MEM_HW[mem]) = *srcval; +} + void __fastcall hwWrite64_page_02( u32 mem, const mem64_t* srcval ) { //hwWrite64( mem, *srcval ); return; diff --git a/pcsx2/Memory.cpp b/pcsx2/Memory.cpp index aa15e4067a..807fa97648 100644 --- a/pcsx2/Memory.cpp +++ b/pcsx2/Memory.cpp @@ -676,12 +676,12 @@ void memReset() hw_by_page[0x0] = vtlb_RegisterHandler( _ext_memRead8<1>, _ext_memRead16<1>, hwRead32_page_00, hwRead64_page_00, hwRead128_page_00, - _ext_memWrite8<1>, _ext_memWrite16<1>, hwWrite32_page_00, hwWrite64_generic, hwWrite128_generic + _ext_memWrite8<1>, _ext_memWrite16<1>, hwWrite32_page_00, hwWrite64_page_00, hwWrite128_generic ); hw_by_page[0x1] = vtlb_RegisterHandler( _ext_memRead8<1>, _ext_memRead16<1>, hwRead32_page_01, hwRead64_page_01, hwRead128_page_01, - _ext_memWrite8<1>, _ext_memWrite16<1>, hwWrite32_page_01, hwWrite64_generic, hwWrite128_generic + _ext_memWrite8<1>, _ext_memWrite16<1>, hwWrite32_page_01, hwWrite64_page_01, hwWrite128_generic ); hw_by_page[0x2] = vtlb_RegisterHandler(