Сижу ковряю в IDA Pro hex под мегу- осталось пару функций осмыслить и писать свой вариант. Но вот беда- голова уже не варит и не могу врубиться зачем нужен следующий кусок кода и для чего его применили :
st -Y, r8
st -Y, r9
st -Y, r10
st -Y, r11
st -Y, r30
st -Y, r24
st -Y, r25
st -Y, r26
st -Y, r27 ; Сохранили регистры
ldd r24, Y+9 ; Из стека загружаем число 0x02
ldd r25, Y+0xA ; Из стека загружаем число 0x00
ldd r26, Y+0xB ; Из стека загружаем число 0x00
ldd r27, Y+0xC ; Из стека загружаем число 0x00
; Проверка на ноль
сlr r30 ; В R19:R16 находится 0x00000258
or r30, r16
or r30, r17
or r30, r18
or r30, r19
breq loc_DD9
clr r8 ; Обнуляем счетчик (???)
clr r9
clr r10
clr r11
; Проверка на ноль
сlr r30 ; В R27:R24 находится 0x00000002
or r30, r24
or r30, r25
or r30, r26
or r30, r27
breq loc_DD5
; Собственно с этого момента уже не понимаю что это делает
loc_DC6:
lsr r19
ror r18
ror r17
ror r16
brcc loc_DCF
add r8, r24
adc r9, r25
adc r10, r26
adc r11, r27
loc_DCF:
lsl r24
rol r25
rol r26
rol r27
; Проверка на ноль
сlr r30 ;
or r30, r16
or r30, r17
or r30, r18
or r30, r19
brne loc_DC6
loc_DD5:
mov r16, r8
mov r17, r9
mov r18, r10
mov r19, r11
loc_D98:
ld r27, Y+ ; Возвращаем на родину регистры
ld r26, Y+
ld r25, Y+
ld r24, Y+
ld r30, Y+
ld r11, Y+
ld r10, Y+
ld r9, Y+
ld r8, Y+
adiw YL, 4 ; Забиваем на то что передавали в стеке
ret
По программе могу сказать, что писали студенты, которые не очень понимают в программировании на непонятном компиляторе, предположительно CV. Интересно какой эквивалент кода сей непонятной мне конструкции на языке более высокого уровня.