Борюсь пока.
Последовательность действительно неправильна, двухстрочный код не влияет.
Влияет сложная формула, от нее компилятор клинит - так что ищу путь попроще, разбивая формулу на части (помогая компилятору в стиле Князева).
Обычно я стараюсь реже смотреть ассемблерный код, но вот это удивило:
Код
76 found_events |= kUpDn; // set new bit
\ 000000E0 .... LDI R30, LOW(found_events)
\ 000000E2 .... LDI R31, (found_events) >> 8
\ 000000E4 8100 LD R16, Z
\ 000000E6 6100 ORI R16, 0x10
\ 000000E8 8300 ST Z, R16
77 found_events &= ~(kUp | kDn); //reset usual bits
\ 000000EA .... LDI R30, LOW(found_events) !!!!!!!!!!!!!!!!!!!!!!!!!
\ 000000EC .... LDI R31, (found_events) >> 8 !!!!!!!!!!!!!!!!!!!!!!!!
\ 000000EE 8100 LD R16, Z !!!!!!!!!!!!!!!!!!!!!!!
\ 000000F0 7F09 ANDI R16, 0xF9
\ 000000F2 8300 ST Z, R16
\ 000000F4 9508 RET
Из шести команд три тупо дублируются. Оптимизация включена LOW. Хороший маркетинговый ход - эти уровни оптимизации.
Уходя, оставьте свет...