Tenes razon maunix.
Pero...¿no se graban instrucciones ADDLW 0xFF(opcode: 0x3FF) en todas las posiciones restantes que no se utilizan?
Saludos.
Si, en realidad el pic como cualquier memoria se 'inicializa' con todos unos. '1'. Al ser de 14 bits el pic16, queda como xx111111 11111111 = 0x3FFF
Ahora bien, imaginemos que puede pasar en 2 casos:
1er Caso: El pic queda grabado ordenadamente (toda sus primeras datos con el software y luego todas 3FFF)
Ahora bien, si ponemos un END al final del código en el mejor de los casos el pic seguirá ejecutando instrucciones hasta el final donde el Program Counter rebase y se haga 0, lo que hará un efecto 'similar' a resetear el PIC. Lo cual no es lo que se pretende, en este caso.
Es por eso que lo mejor es siempre un loop infinito, tal cual como en C es obligación hacer un while(1) {} , bueno en ensamblador se hace un loop en algún lado para que el control del Program Counter no quede al azar.
2do Caso: El código no está hecho en orden, lo cual es perfectamente normal y técnicamente correcto.
org 0x0000
_BOOT:
goto _INICIO
org 0x0040
_INICIO:
nop
nop
nop
movlw 0x04
call _NADA
call _NADA
call _NADA
call _NADA
goto _CONTINUA
ORG 0x0090
_NADA:
movlw 0x05
return
ORG 0x0066
_CONTINUA:
movlw 0x05
El ejemplo es bastante grosero por cierto pero es solo a los fines de ejemplificar y explicar mi punto. De todas formas, es común que cuando alguien incluye código con "include" pueda darse este y otros casos.
El código ensamblador quedará asi:
_BOOT ( en 0x0000)
_INICIO ( en 0x0040)
...
código
...
0x3FFF
0x3FFF
0x3FFF
0x3FFF
...
_CONTINUA (en 0x0066)
...
código
...
0x3FFF
0x3FFF
0x3FFF
0x3FFF
...
_NADA (en 0x0090)
movlw 0x05
returnEl programa no terminará en _CONTINUA sino que irá ejecutando los sucesivos 0x3FFF hasta que llegue a _NADA y ejecutará el return, y como no hay nada en el stack el pic cargará el PC con 0x0000 nuevamente haciendo el efecto de reset.
Y esto en el mejor de los casos!! Puede hasta ser peligroso para el hardware si el pic comienza a ejecutar por ejemplo una rutina de inicialización de una eeprom externa! borrando la misma. También pudiera caer en alguna parte donde encenderemos un motor que no debiamos encender! dañando cosas muy costosas.
Y como eso, todo lo que la imaginación pueda darnos.
Como vemos, el dejar sin control a un firmware puede llegar a producir cosas nefastas realmente.
Saludos