Это не то, нужен auto_jmp.inc, нарылся в сети файлик, предположительно
работающий с auto_jmp.inc
/*
* auto_jmp_tst.asm
*
* Поверхностные регрессионные тесты для auto_jmp.inc (auto_br, auto_brb, auto_jc
* и построенных на них #define'ов). Каждый блок проверяет, что выбор схемы
* перехода (короткий условный / rjmp+пропуск / jmp+пропуск, либо rjmp/jmp
* напрямую для auto_jc) переключается ровно на границе диапазона.
*
* Как проверять: собрать этот файл, открыть .lss/.map и убедиться, что
* реальные машинные слова соответствуют комментариям (или спросить
* Клода - он умеет разбирать сгенерированный .hex побайтово и проверять
* правильность цели перехода).
*/
.include "m2561def.inc"
.include "auto_jmp.inc"
.LISTMAC
.org 0x0000
RESET:
ldi r16, 0x01
tst r16
; ============================================================
; ЧАСТЬ 2. auto_brb / BRIE_,BRID_ - близко/далеко, чтобы убедиться, что
; генерализация на бит флага не сломала логику диапазонов.
; ============================================================
.set shift = 0x30
part3_back_close:
.org PC + shift
BRCS_(part3_back_close)
BRCS_(part3_fwd_close)
.org PC + shift
part3_fwd_close:
.set shift = 0x3000
part3_back_far:
.org PC + shift
BRCS_(part3_back_far)
BRCS_(part3_fwd_far)
.org PC + shift
part3_fwd_far:
; ============================================================
; ЧАСТЬ 3. auto_brb / BRBS_,BRBC_ (произвольный флаг через BRBS/BRBC
; с явным номером бита) - близко/далеко, чтобы убедиться, что
; генерализация на бит флага не сломала логику диапазонов.
; Бит 0 = флаг Carry (то же самое, что BRCS/BRCC, но через BRBS/BRBC).
; ============================================================
.set shift = 0x30
part3_back_close:
.org PC + shift
BRBS_(0, part3_back_close)
BRBS_(0, part3_fwd_close)
.org PC + shift
part3_fwd_close:
.set shift = 0x3000
part3_back_far:
.org PC + shift
BRBS_(0, part3_back_far)
BRBS_(0, part3_fwd_far)
.org PC + shift
part3_fwd_far:
; ============================================================
; ЧАСТЬ 4. auto_jc / JMP_,CALL_ - здесь была найдена и исправлена
; реальная ошибка (неверное смещение k2 вместо k1 - "лишний -1",
; т.к. rjmp/rcall тут САМИ стоят первым словом, без предшествующего
; пропуска). Границы: k(rjmp/rcall) valid: -2048..2047.
; ============================================================
; --- JMP_, вперёд ---
; k = 2047 (валидно) -> rjmp
JMP_(part4_fwd_e1_in)
.org PC + 2047
part4_fwd_e1_in:
; k = 2048 (не валидно) -> jmp
JMP_(part4_fwd_e1_out)
.org PC + 2048
part4_fwd_e1_out:
; --- JMP_, назад ---
part4_back_e1_in:
.org PC + 2047
; k = -2048 (валидно) -> rjmp
JMP_(part4_back_e1_in)
part4_back_e1_out:
.org PC + 2048
; k = -2049 (не валидно) -> jmp
JMP_(part4_back_e1_out)
; --- CALL_, беглая проверка (та же логика auto_jc, другая пара мнемоник) ---
part4_call_target:
.org PC + 100
CALL_(part4_call_target)
; ============================================================
; ДЕМОНСТРАЦИЯ dauto_jmp: метка "loop" объявлена ВНУТРИ макроса
; count_down_loop_demo, но переход через auto_jmp всё равно
; работает корректно при многократных вызовах подряд.
; ============================================================
.MACRO count_down_loop_demo
ldi r16, @0
loop:
dec r16
BRNE_(loop)
.ENDMACRO
count_down_loop_demo 5
count_down_loop_demo 10
count_down_loop_demo 20
nop
rjmp PC + 1
jmp RESET-
- Так, это - когда метка в том же файле. - Пaлыч(Сегодня, 17:16)