- if( (HW_GPU_STATUS & PSXGPU_ILACE_BITS) == PSXGPU_ILACE_BITS )
- HW_GPU_STATUS |= frame_counter << 31;
- GPU_vBlank( 0, HW_GPU_STATUS >> 31 );
+ status = SWAP32(HW_GPU_STATUS) | PSXGPU_FIELD;
+ if ((status & PSXGPU_ILACE_BITS) == PSXGPU_ILACE_BITS) {
+ field = frame_counter & 1;
+ status |= field << 31;
+ status ^= field << 13;
+ }
+ HW_GPU_STATUS = SWAP32(status);
+ GPU_vBlank(0, field);
+ if ((s32)(psxRegs.gpuIdleAfter - psxRegs.cycle) < 0)
+ psxRegs.gpuIdleAfter = psxRegs.cycle - 1; // prevent overflow
+
+ if ((rcnts[0].mode & 7) == (RcSyncModeEnable | Rc01UnblankReset) ||
+ (rcnts[0].mode & 7) == (RcSyncModeEnable | Rc01UnblankReset2))
+ {
+ rcnts[0].cycleStart = rcnts[3].cycleStart;
+ }
+
+ if ((rcnts[1].mode & 7) == (RcSyncModeEnable | Rc01UnblankReset) ||
+ (rcnts[1].mode & 7) == (RcSyncModeEnable | Rc01UnblankReset2))
+ {
+ rcnts[1].cycleStart = rcnts[3].cycleStart;
+ }
+ else if (rcnts[1].mode & Rc1HSyncClock)
+ {
+ // adjust to remove the rounding error
+ _psxRcntWcount(1, (psxRegs.cycle - rcnts[1].cycleStart) / rcnts[1].rate);
+ }