Какой такой "код для вызова макроса" ??? Он уже давно написан и содержится в теле программы под названием "ассемблер", там же "вызывается" и там же и остаётся. Было либо 
   ; одна команда - одно слово, страшная куча тактов
   ; + куча слов на кучу отдельных подпрограмм на каждый бит
    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
И так далее, после чего булевы выражения пишутся цепочкой макрсоов, генерирующих вполне компактный и очень быстрый код.
Ну для реальных выраений ещё понадобятся временные переменные, так что надо допилить, сделать ещё работу с битами в регистре (регистрах) временных переменных, чтобы не размещать их в ОЗУ.