Conversión de posición de bit a máscara de bits usando directivas MPASM

Estoy escribiendo firmware para un PIC16F877A en ensamblador, y quiero establecer algunas constantes en la parte superior de mi código fuente para indicar qué puerto se usa para qué, de modo que, si es necesario, pueda cambiar fácilmente todos los pines de E/S por cambiando los valores constantes y recompilando.

Como esto:

O_LEDS   EQU      PORTA
CONSTANT O_RED    = RA1
CONSTANT O_GREEN  = RA2
CONSTANT O_BLUE   = RA3

En mi código, necesito una máscara de bits para representar los puertos que estoy usando. Mi pregunta es, ¿cómo puedo escribir una expresión usando directivas de ensamblador para calcular la máscara de bits?

Usando mi ejemplo anterior:

O_RED = 1
O_GREEN = 2
O_BLUE = 3

y la máscara de bits que quiero es:

movlw b'00001110'

Si hubiera un poder de operador, podría hacer algo como esto:

movlw (2 ^ O_RED) | (2 ^ O_GREEN) | (2 ^ O_BLUE)

pero ^en MPASM es un OR exclusivo Bitwise, no a la potencia de .

¿Alguien puede pensar en otra forma de hacer esto?

Respuestas (1)

No he usado MPASM antes, pero ¿funciona esto?

movlw (1 << O_RED) | (1 << O_GREEN) | (1 << O_BLUE)

Desplazamiento a la izquierda duplica un número.

1 << x== 2x

¡¡¡Ah, sí!!! No puedo creer que no vi eso yo mismo. Gracias.