void psxRcntInit() { s32 i; psxHsyncCalculate(); // rcnt 0. rcnts[0].rate = 1; rcnts[0].irq = 0x10; // rcnt 1. rcnts[1].rate = 1; rcnts[1].irq = 0x20; // rcnt 2. rcnts[2].rate = 1; rcnts[2].irq = 0x40; // rcnt base. rcnts[3].rate = 1; rcnts[3].mode = RcCountToTarget; rcnts[3].target = (PSXCLK / (FrameRate[Config.PsxType] * HSyncTotal[Config.PsxType])); for( i = 0; i < CounterQuantity; ++i ) { _psxRcntWcount( i, 0 ); } hSyncCount = 0; spuSyncCount = 0; psxRcntSet(); }
s32 psxRcntFreeze( gzFile f, s32 Mode ) { gzfreeze( &rcnts, sizeof(rcnts) ); gzfreeze( &hSyncCount, sizeof(hSyncCount) ); gzfreeze( &spuSyncCount, sizeof(spuSyncCount) ); gzfreeze( &psxNextCounter, sizeof(psxNextCounter) ); gzfreeze( &psxNextsCounter, sizeof(psxNextsCounter) ); if (Mode == 0) { psxHsyncCalculate(); } return 0; }
s32 psxRcntFreeze( gzFile f, s32 Mode ) { gzfreeze( &rcnts, sizeof(rcnts) ); gzfreeze( &hSyncCount, sizeof(hSyncCount) ); gzfreeze( &spuSyncCount, sizeof(spuSyncCount) ); gzfreeze( &psxNextCounter, sizeof(psxNextCounter) ); gzfreeze( &psxNextsCounter, sizeof(psxNextsCounter) ); if (Mode == 0) { psxHsyncCalculate(); // iCB: recalculate target count in case overclock is changed rcnts[3].target = (PSXCLK / (FrameRate[Config.PsxType] * HSyncTotal[Config.PsxType])); if(rcnts[1].rate != 1) rcnts[1].rate = (PSXCLK / (FrameRate[Config.PsxType] * HSyncTotal[Config.PsxType])); } return 0; }