From: http://www.myke.com/basic.htm
Here is a good, generic Delay Macro that does not change "w" or the STATUS Flag. Note that it assumes that the "DlayCount" variable is equal to zero upon code entry.DlayMacro Macro Cycles ; Delay Macro for Edges variable i, TCycles, Value, TFlag TCycles = Cycles Value = 1 << 7 i = 7 TFlag = 0 if (TCycles > 5) while (i >= 0) if ((TFlag == 0) && ((Value * 3) <= TCycles)) bsf DlayCount, i TFlag = 1 TCycles = TCycles - (Value * 3) else if ((TFlag != 0) && (((Value * 3) + 1) <= TCycles)) bsf DlayCount, i TCycles = TCycles - ((Value * 3) + 1) endif endif Value = Value >> 1 i = i - 1 endw if (TCycles > 3) Error "Delay Cycles too Large for Macro" endif decfsz DlayCount, f goto $ - 1 endif while (TCycles > 1) goto $ + 1 TCycles = TCycles - 2 endw if (TCycles == 1) nop ; Delay the Last Cycle endif endm