Realmente para casos MUY inusuales o de curiosidad para ver si lo puedo sacar haria algo asi. Y me gusta el ASM, pero no le veo sentido romperse la cabeza.
Y tenes un error que contaste el CALL pero no el RETURN,
4 ciclos- CALL + RETURN
2 ciclos- Carga al contador
3(N-1) - 3 ciclos tarda la resta y el GOTO, y esto se produce (N-1) veces
2 - del salto del DECFSZ , para cuando llega a N
4 + 2 + 2 + 3(N-1)
8 + 3(N-1)
3N+5 (ciclos)
Si necesito 500us, serian 500us / Tcy = 500us / 1us = 500 ciclos
(500 - 5) / 3 = 165
En fin, como dije es solo por "curiosidad", o meramente aprendizaje, sino directamente uso algo como esto:
http://www.piclist.com/techref/piclist/codegen/delay.htm
Y te da:
; Delay = 1 seconds
; Clock frequency = 4 MHz
; Actual delay = 1 seconds = 1000000 cycles
; Error = 0 %
cblock
d1
d2
d3
endc
Delay
;999990 cycles
movlw 0x07
movwf d1
movlw 0x2F
movwf d2
movlw 0x03
movwf d3
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto Delay_0
;6 cycles
goto $+1
goto $+1
goto $+1
;4 cycles (including call)
return
Ya tenes tu rutina de delay 
Ok, entiendo y si tienes razon el de para que romperse la cabeza. Queria saber si mi procedimiento estaba correcto jejeje, y gracias por la observacion del RETURN.
Una pregunta con respecto al enlace del calculador que compartes: Veo que se puede calcular la rutina de retardo a partir de el número de ciclos o en segundos pero, si por ejemplo necesito que sea en milisegundos o microsegundos, ¿Como seria?.
Investigando un poco sobre las conversiones se que un milisegundo es 10
-3 o lo que es lo mismo 1/1000=0.001
para micro segundos creo que es 10
-6 o lo que es lo mismo 1/1000000=0.000001
entonces si por ejemplo deseo una rutina de retardo para eliminar rebote de un push button, por lo que se mas o menos con 20 milisegundos la puedo eliminar por lo tanto:
0.001/20=0.02 y colocando este valor en el calculador da por codigo lo siguiente:
; Delay = 0.02 seconds
; Clock frequency = 4 MHz
; Actual delay = 0.02 seconds = 20000 cycles
; Error = 0 %
cblock
d1
d2
endc
RETARDO
;19993 cycles
movlw 0x9E
movwf d1
movlw 0x10
movwf d2
RETARDO_0
decfsz d1, f
goto $+2
decfsz d2, f
goto RETARDO_0
;3 cycles
goto $+1
nop
;4 cycles (including call)
return
¿El proceso que estoy siguiendo para calcular esto es correcto?, asi que si si lo es, para calcular en microsegundos seria exactamente lo mismo.
Saludos KILLERJC
