Bueno estoy haciendo un programa en el que me ocurria lo siguiente,tengo una tabla con 50 llamadas a subrrutinas:
TABLA_DELAY ; tabla donde se escoge el delay correspondiente para cada
addwf PCL,1 ; Dutty segun la frec, de 1Hz a 50Hz
nop
goto DELAY_1
goto DELAY_2
goto DELAY_3
goto DELAY_4
goto DELAY_5
goto DELAY_6
goto DELAY_7
goto DELAY_8
goto DELAY_9
goto DELAY_10
goto DELAY_11
goto DELAY_12
goto DELAY_13
goto DELAY_14
goto DELAY_15
goto DELAY_16
goto DELAY_17
goto DELAY_18
goto DELAY_19
goto DELAY_20
goto DELAY_21
goto DELAY_22
goto DELAY_23
goto DELAY_24
goto DELAY_25
goto DELAY_26
goto DELAY_27
goto DELAY_28
goto DELAY_29
goto DELAY_30
goto DELAY_31
goto DELAY_32
goto DELAY_33
goto DELAY_34
goto DELAY_35
goto DELAY_36
goto DELAY_37
goto DELAY_38
goto DELAY_39
goto DELAY_40
goto DELAY_41
goto DELAY_42
goto DELAY_43
goto DELAY_44
goto DELAY_45
goto DELAY_46
goto DELAY_47
goto DELAY_48
goto DELAY_49
goto DELAY_50
Asi la tenia en un principio, pero haciendo pruebas me di cuenta que funciona bien hasta goto DELAY_45, pero a partir de esa posicion ya no va bien porque esos 5 DELAYS estan en pag. 1 y por tanto hay que setear el PCLATH, entonces encontre unas instrucciones, mas bien directivas del MPLAB que hacen eso: lcall y lgoto, ellas setean el PCLATH para direccionar ese salto par lo que la tabla queda asi:
TABLA_DELAY ; tabla donde se escoge el delay correspondiente para cada
addwf PCL,1 ; Dutty segun la frec, de 1Hz a 50Hz
nop
goto DELAY_1
goto DELAY_2
goto DELAY_3
goto DELAY_4
goto DELAY_5
goto DELAY_6
goto DELAY_7
goto DELAY_8
goto DELAY_9
goto DELAY_10
goto DELAY_11
goto DELAY_12
goto DELAY_13
goto DELAY_14
goto DELAY_15
goto DELAY_16
goto DELAY_17
goto DELAY_18
goto DELAY_19
goto DELAY_20
goto DELAY_21
goto DELAY_22
goto DELAY_23
goto DELAY_24
goto DELAY_25
goto DELAY_26
goto DELAY_27
goto DELAY_28
goto DELAY_29
goto DELAY_30
goto DELAY_31
goto DELAY_32
goto DELAY_33
goto DELAY_34
goto DELAY_35
goto DELAY_36
goto DELAY_37
goto DELAY_38
goto DELAY_39
goto DELAY_40
goto DELAY_41
goto DELAY_42
goto DELAY_43
goto DELAY_44
lgoto DELAY_45
lgoto DELAY_46
lgoto DELAY_47
lgoto DELAY_48
lgoto DELAY_49
lgoto DELAY_50
Bueno ya estaba tan contento cuando al hacer pruebas veo que hasta lgoto DELAY_45 funciona perfecto pero a partir de ahi no, si la llamo con 50 en W me va al DELAY_25 creo recordar, como es la primera vez que uso el lgoto, digo joder que raro, entonces abro el dssasembly listing y me encuentro que traduce por esto.
0033 158A BSF 0xa, 0x3 156: lgoto DELAY_45
0034 120A BCF 0xa, 0x4
0035 2816 GOTO 0x16
Logicamente para cada lgoto usa tres instrucciones, le llegaria con dos ya que solo tiene que setear un bit pero como lo hace automaticamenete siempre igual pues lo hace asi. Bueno la solucion es sencilla, al llamar a la tabla hay que cargar en W estas desviaciones entonces me queda que para DELAY_45 queda como esta pero a partir de ahi va asi:
DELAY_46 cargar 48
DELAY_47 cargar 51
DELAY_48 cargar 54
DELAY_49 cargar 57
DELAY_50 cargar 60
Y ya funciona perfecto, al final de las rutinas de DELAY hay hacer un bcf PCLATH,3, porque retorna bien pero al hacer el siguiente call TABLA_DELAY va a una posicion erronea.
Bueno solo es por si le pasa a alguien que no se coma el coco como me lo comi yo.