Algunos lo usan directamente sin saberlo y otros ni lo usan... Pero al comienzo que suelen poner LIST=P...... Pueden poner tambien RADIX= DEC, HEX, etc...
Esto le dice al compilador que espera que todos los numeros sean decimales o hexadecimales. Por ejemplo
Usando RADIX = HEX (que es el que viene por default si no lo escribis) la instruccion MOVLW 10 pondria en W el numero 0x10 o 16 decimal.
Si usas RADIX = DEC la instruccion MOVLW 10 pondria el numero 0xA o 10 decimal en W.
Si necesitas usar otro sistema usas las denominaciones que ves ahi, si por ejemplo esta en RADIX HEX y queres escribir un decimal, lo podes hacer haciendo .10 o d'10'
¿El porque poner un numero negativo te preguntaras? Por que es mas comodo. Tiene mas sentido. Supongamos el ADDLW -1 el podrias pensar que le esta restando 1, o que le esta sumando 0xFF, como esta limitado a 8 bits, esto queda en el mismo resultado.
Ejemplo : 8d = 0000 1000
Si le sumo el -1, me quedaria:
0000 1000
1111 1111
------------
0000 0111 = 7d
Con respecto al resto, según tus indicaciones y en concreto con las lineas expuestas entiendo que si:
Tbase equ $ es la primera dirección de la tabla, en la siguiente instrucción Car0 equ$-Tbase seria la primera dirección de la tabla ya que si se realiza la resta entre la dirección de Car0 y Tbase, al estar contiguas pues el resultado seria 1. Luego para CarO seria la segunda posición de la tabla y así sucesivamente.
Es importante entender que es una etiqueta... el mejor ejemplo lo tenes aca:
La etiquetas no ocupan lugar en memoria, solo lo hace la instruccion ADDLW, ¿entonces que es la etiqueta? Es simplemente un numero, que es la dirección de memoria donde se encuentra la instruccion ADDLW por eso cuando haces:
Luego el compilador lo transforma en algo asi:
Entonces... una etiqueta es únicamente un numero.
Ahora vamos con un ejemplo:
ORG 0x1000
Table ADDWF PCL,F
Tbase equ $
Car0 equ $-Tbase
CarO equ $-Tbase
RETLW B'00001110' ; 1
RETLW B'00001110' ; 2
RETLW B'00001110' ; 3
RETLW B'00001110' ; 4
Por simplicidad agregue un ORG para que sea mas sencillo de entender.
Tbase es igual a $, es decir el primer RETLW, por lo que el $ vale 0x1001 = Tbase
Los EQU no son instrucciones por lo tanto no poseen memoria, y el $ no avanza, retiro lo que dije antes por que imagine otra cosa. Pero asi como esta el codigo parace que Car0 y CarO es 0. Me equivoque pensando que eran otras etiquetas, Es 0 porque el $ es 0x1001, y Tbase vale lo mismo, asi que la resta de ambos es 0.
A lo que me referia antes es que te permite hacer algo asi:
ORG 0x1000
Table ADDWF PCL,F
Tbase equ $
Car0 equ Tbas - $
CarO equ Tcas - $
RETLW B'00001110' ; 1
RETLW B'00001110' ; 2
RETLW B'00001110' ; 3
Tbas RETLW B'00001110' ; 4
RETLW B'00001110' ; 5
RETLW B'00001110' ; 6
Tcas RETLW B'00001110' ; 7
RETLW B'00001110' ; 8
Si el codigo es asi , esto te permite tener los siguientes valores:
Tbase = 0x1001
Car0 = 3 ( de 0x1004 - 0x1001)
CarO = 6 ( de 0x1007 - 0x1001)