Какой такой "код для вызова макроса" ??? Он уже давно написан и содержится в теле программы под названием "ассемблер", там же "вызывается" и там же и остаётся. Было либо
; одна команда - одно слово, страшная куча тактов
; + куча слов на кучу отдельных подпрограмм на каждый бит
rcall get_bit_number_N
; две команды - два слова, страшная куча тактов
; + куча слов на подпрограмму, но это делится на все вызовы
ldi r16, bit_number
rcall get_bit_by_number ; зона хранения битов фиксирована и задана неявно
стало
; две команды - три слова, три такта
btest bit_number ; если зона хранения битов фиксирована и задана неявно, то и макос берёт один аргумент
Если предстоит в куске кода работать с битами интеснсивно, то делается btest
y, работающий по смещению к Y, который загружается адресом битовой зоны перед этим куском. Тогда и макрос даёт два слова.
Но дальше всё равно с битом ещё что-то надо делать.
Для логических операций типа "булевский процессор" просто дописываются макросы, навскидку где-то так
; instrumental macro
.macro bget_byte ; bit_number, bit_zone_address
lds r16,@1+@0/8 ; Read an (N/8)th byte of a bit array depending on bit #
.endm
.macro bput_byte ; bit_number, bit_zone_address
sts r16,@1+@0/8
.endm
.macro bput_byte_y ; bit_number
std r16,Y+@0/8
.endm
.macro band_r16 ; T &= bit
sbrs r16,@0%8 ; Clear T if bit is 0
clt
.endm
.macro band_not_r16 ; T &= ~bit
sbrc r16,@0%8 ; Clear T if bit is 1
clt
.endm
.macro bor_r16 ; T |= bit
sbrc r16,@0%8 ; Set T if bit is 1
set
.endm
.macro bor_not_r16 ; T |= ~bit
sbrs r16,@0%8 ; Set T if bit is 0
set
.endm
; macro for boolean processing
.macro bit_load
bget_byte @0, @1
bst r16, @0
.endm
.macro bit_load_y
bget_byte_y @0
bst r16, @0
.endm
.macro bit_store
bget_byte @0, @1
bld r16, @0
bput_byte @0, @1
.endm
.macro bit_store_y
bget_byte_y @0
bld r16, @0
bput_byte_y @0
.endm
.macro band
bget_byte @0, @1
band_r16 @0
.endm
.macro band_y
bget_byte_y @0
band_r16 @0
.endm
.macro band_not
bget_byte @0, @1
band_not_r16 @0
.endm
.macro band_not_y
bget_byte_y @0
band_not_r16 @0
.endm
И так далее, после чего булевы выражения пишутся цепочкой макрсоов, генерирующих вполне компактный и очень быстрый код.
Ну для реальных выраений ещё понадобятся временные переменные, так что надо допилить, сделать ещё работу с битами в регистре (регистрах) временных переменных, чтобы не размещать их в ОЗУ.