This is the way I understand the PCLATH PCL mechanism. It's really just basic binary math. Example PC = 00000000 00000000 PCLATH = 00000000 PCL = 00000000 W = 00000000 0000 0782 addwf PCL,f The PC is automatically incremented by 1 BEFORE completing the 'addwf' instruction so that it can prefetch the next instruction PC = 00000000 00000001. PCL = 00000001. Note the PCL register mirrors the lower byte of the program counter. 00000001 PCL + 00000000 W ------------------------------------------- = 00000001 New PCL The PCLATH value is now placed into the Hi Byte of the Program Counter and also the PCL value is placed into the Lo Byte. PCLATH = 00000000 PCL = 00000001 PC = 00000000 00000001 This will be the next instruction executed. 0001 3400 retlw 00h The instruction that was being prefetched while the addwf instruction was being processed is discarded. That is why addwf PCL is a 2 cycle instruction. Now consider this... PC = 00000000 00000000 PCLATH = 00000000 PCL = 00000000 W = 11111111 0000 0782 addwf PCL,f The PC is automatically incremented by 1 BEFORE completing the 'addwf' instruction so that it can prefetch the next instruction PC = 00000000 00000001. PCL = 00000001. Note the PCL register mirrors the lower byte of the program counter. 00000001 PCL + 11111111 W ------------------------------------------- = 00000000 New PCL The PCLATH value is now placed into the Hi Byte of the Program Counter and also the PCL value is placed into the Lo Byte. PCLATH = 00000000 PCL = 00000000 PC = 00000000 00000000 Notice The PCL value rolled around to 0 because of the addition This will be the next instruction executed. 0000 0782 addwf PCL,f The SAME instruction will keep executing ad finitum... The instruction that was being prefetched while the addwf instruction was being processed is discarded. That is why addwf PCL is a 2 cycle instruction. Consider a different PCLATH value... PC = 00000000 00000000 PCLATH = 00000001 PCL = 00000000 W = 00000000 0000 0782 addwf PCL,f The PC is automatically incremented by 1 BEFORE completing the 'addwf' instruction so that it can prefetch the next instruction PC = 00000000 00000001. PCL = 00000001. Note the PCL register mirrors the lower byte of the program counter. 00000001 PCL + 00000000 W ------------------------------------------- = 00000001 New PCL The PCLATH value is now placed into the Hi Byte of the Program Counter and also the PCL value is placed into the Lo Byte. PCLATH = 00000001 PCL = 00000001 W = 00000000 PC = 00000001 00000001 Notice The Hi Byte of the PC changed because of the PCLATH value. This will be the next instruction executed. 0101 3400 retlw 00h Last example..... PC = 00000000 00000000 PCLATH = 00000001 PCL = 00000000 W = 11111111 0000 0782 addwf PCL,f The PC is automatically incremented by 1 BEFORE completing the 'addwf' instruction so that it can prefetch the next instruction PC = 00000000 00000001. PCL = 00000001. Note the PCL register mirrors the lower byte of the program counter. 00000001 PCL + 11111111 W ------------------------------------------- = 00000000 New PCL The PCLATH value is now placed into the Hi Byte of the Program Counter and also the PCL value is placed into the Lo Byte. PCLATH = 00000001 PCL = 00000000 PC = 00000001 00000000 Notice The PCL value rolled around to 0 because of the addition The Hi Byte of the PC changed because of the PCLATH value. This will be the next instruction executed. 0100 2055 call SomeCode The instruction that was being prefetched while the addwf instruction was being processed is discarded. That is why addwf PCL is a 2 cycle instruction. You can see that by changing the PC this way, you should stay within the confines of 256 byte boundaries or the PC will wrap around to the start of that boundary if the computed PCL value is greater than 255. Hope this helps. Tony PS If I'm wrong on this I'm sure other posts will follow. PPS (A plug here) Try PicNPoke for a visual demonstration of how the PCLATH and PCL affect the Program Counter. http://www.dontronics.com/picnpoke.html Just when I thought I knew it all, I learned that I didn't.