Я вроде решил эту проблему с переменными MPLAB, вот пример для проверки равенства между регистром и литералом:
_f_equal_literal macro register,literal,name
movlw literal
subwf register,0
btfss STATUS,2 ;bit indicating result is zero
goto _false#v(name)
endm
_lse macro name
goto _next#v(name)
_false#v(name):
endm
_ndif macro name
_next#v(name):
endm
Обратите внимание, что я не использовал метки goto _true#v(name)
и _true#v(name):
, вам нужно будет просто определить, нужны ли вам btfss
или btfsc
.
Вы можете иметь один макрос _lse
и _ndif
и иметь несколько макросов для операторов _f
.
Решение GJ не имеет метки next
, поэтому истинная ветвь будет выполнять ложную ветвь.
Вам необходимо определить переменную для каждой конструкции if-else-endif.
Это может быть даже полезно, если имя переменной описывает, для чего используется if-else-endif.
Пример: * * один тысяча двадцать-одна
переменная testing_something = 123
_f_equal_literal some_register,some_value,testing_something
...
_lse testing_something
...
_ndif testing_something