Someone helped me with this interrupt part of the code in assembly when I was creating a dimmer progam for my fan. Unfortunately I cannot get hold of that person & I don't have any knowledge of assembly, so if someone can help me correct the problem...

This is the only part of the code in assembly, rest is in PBP & I am comfortable dealing with it. Now, this following code controls the speed of a fan based on a variable DimmerVal which is a byte. In my code when I assign DimmerVal=0, fan stops & DimmerVal=255 takes it to full speed. The problem is that the fan speed sometimes variates & automatically goes back to the assigned speed after some moments, looks like some kind of synchronisation error with zero-detector input, but I am not sure because I can't understand this code. can someone help please....
Code:
ISR:
asm
        movwf   wsave           
        swapf   STATUS, W
        clrf    STATUS          
        movwf   ssave           
        movf    FSR,w
        movf    fsave           
        movf    PCLATH, W       
        movwf   psave


        ; get ready to jump within the ISR page
        movlw   ((INTHAND) >> 8) 
        movwf   PCLATH
        btfsc   INTCON, INTF
        goto    ZeroCrossingInt
        btfss   INTCON, T0IF    
        goto    EndInt
T0Overflow
        bcf     INTCON, T0IF
        bsf     _oDimmer        
        goto    EndInt

ZeroCrossingInt
        bcf     INTCON, INTF   
        movf    _DimmerVal,w
        movwf   TMR0           
        bcf     _oDimmer        

EndInt  ; restore the machine state and return from interrupts
        movf    fsave,w
        movwf   FSR             ; restore FSR
        movf    psave,w
        movwf   PCLATH          ; restore PCH
        swapf   ssave,w
        movwf   STATUS          ; restore Status
        swapf   wsave,f
        swapf   wsave,w         ; restore WREG
        retfie
endasm