Usando un registro de bandera de 8 bits, el objetivo es generar una máscara de 16 bits para manipular un registro de configuración de 2 bytes donde pares de bits adyacentes controlan un canal, por ejemplo. escribir 0x2 (0b10)
para el canal 2 sería tomar 0x04 (0b00000100)
del registro de marca y generar 0x0030 (0b0000000000110000)
para ser ANDed con una máscara de configuración constante 0xAAAA (0b1010101010101010)
, lo que da como resultado 0x0020 (0b0000000000100000)
.
El "circuito" de lógica digital equivalente para generar la máscara se vería así:
Una forma aparentemente sencilla de implementar esto en el software es cambiar un bit por cada dos en (es decir, enfoque en serie), prestando atención a la endianidad. En el ensamblaje de la CPU12 (big endian):
LDX #2 ;counter: 2 bytes
L1 LDY #4 ;counter: 4 bits
LDAA flag ;get flag register
L2 LSRA ;shift lsb into carry
PSHC ;copy carry (ccr)
LSRB ;shift carry into msb
PULC ;paste carry
LSRB ;shift carry again
DBNE Y,L2 ;loops 4 times
PSHB ;store half-result (1 byte)
DBNE X,L1 ;loops 2 times
PULD ;retrieve resulting mask (2 bytes)
(1) ¿Existe un algoritmo más rápido para este procedimiento sin recurrir al cableado de 24 pines MCU como se ilustra, o una tabla de consulta; p.ej. ¿Uno que sea capaz de procesar múltiples bits a la vez? (2) ¿Hay un nombre para este procedimiento?