Hi Henrik, thanks for helping. I have changed to the code to do as you said: goto's instead of gosub's & made the ISR set flag only (i think).

It all seems to work better now, however I still have a problem with the debounce as I think it is actually 'the problem' now instead of actually making the code work as you stated. The isr sees the release of the button as an interrupt & sets a flag again which skips modes. So how do I go about adding the debounce without slowing things down?

Isnt there a way to only interrupt or tell the ISR to flag only if the button is depressed & not when released? Here is the updated code -

Code:
'PIC 12F683

#CONFIG 
   __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF
#ENDCONFIG

'DEFINE OCS 4 '4mhz ocsillator
DEFINE OSC 4 '4mhz ocsillator
ANSEL = 0 'all I/O digital
CMCON0 = 7 'comparator off
LED VAR GPIO.0 'LED pin 7

loop1 var word  ' Loop 1 Counter (word for 0 to 65535 increments)
ModeFlag var bit   ' Bit to determine what state of IOC.3 is

'*****Initlaze Vars*****
   loop1 = 0
ModeFlag = 0
'***********************

ON INTERRUPT GOTO modeselect 'interrupt handler is modeselect
INTCON = %10001000 'enable GIE and GPIE; clear GPIF
IOC = %00001000 ' enable IOC3 (GPIO3 Interrupt on change)

ENABLE 
mode1:
do
    for loop1 = 1 to 1000
        HIGH LED 'led on
        'PAUSE 1000 'delay 1 second
        pause 1    '1 ms
        if ModeFlag = 1 then
        ModeFlag = 0
        goTO mode2
    ENDIF
    
    next loop1
    
    for loop1 = 1 to 1000
        LOW LED 'led off
        'PAUSE 1000 'delay 1 second
        pause 1    '1 ms
        if ModeFlag = 1 then
        Modeflag = 0
        goTO mode2
    endif
    
    next loop1

'GOTO mode1 'repeat
loop

ENABLE 
mode2:
do
    for loop1 = 1 to 500
        HIGH LED 'led on
        'PAUSE 500 'delay 0.5 second
        pause 1    '1 ms
        if ModeFlag = 1 then
        modeflag = 0
        goTO mode3
    endif
    
    next loop1
    
    for loop1 = 1 to 500
        LOW LED 'led off
        'PAUSE 500 'delay 0.5 second
        pause 1    '1 ms
        if ModeFlag = 1 then
        modeflag = 0
        goTO mode3
    endif
    
    next loop1

'GOTO mode2 'repeat
loop

ENABLE
mode3:
DO
    for loop1 = 1 to 50
        HIGH LED 'led on
        'PAUSE 50 'delay 0.05 second
        pause 1    '1 ms
        if ModeFlag = 1 then
        modeflag = 0
        goTO mode1
    endif
    
    next loop1
    
    for loop1 = 1 to 50
        LOW LED 'led off
        'PAUSE 50 'delay 0.05 second
        pause 1    '1 ms
        if ModeFlag = 1 then
        modeflag = 0
        goTO mode1
    endif
    
    next loop1

'GOTO mode3 'repeat
loop
    
DISABLE 'disable interrupts in handler
modeselect:
if INTCON.0 = 1 then    'one of the GPIO<5:0> pins changed state (must be cleared in software)    
    'next mode

    'Set the ModeFlag
    ModeFlag = 1
    ENDIF
    
INTCON = %10001000  'enable GIE and GPIE; clear GPIF
RESUME 'return to where left off
ENABLE 'enable interrupts

end 'got here by mistake