Цитата(ae_ @ Nov 8 2008, 13:43)

12 тактовКод
Reverse_1:; реверс бит в байте (R4 - вход/выход)
; обмен средних бит в тетрадах
mov R17,R4
andi R17,0b10011001
sub R4,R17
swap R4
or R4,R17
; выделение четных/нечетных бит
mov R17,R4
andi R17,0b10101010
sub R4,R17
; обмен четных/нечетных бит
out SREG,R4
ror R4
lsl R17
adc R4,R17
Порядок преобразования:
a b c d e f g h C
a f g d e b c h 0
a - g - e - c - 0
- f - d - b - h 0
h - f - d - b - -
- g - e - c - - a
h g f e d c b a 0
Единственный тонкий момент: обнуление I (запрет прерываний)
С разбегу обойти его мне не удалось без добавления 13-го такта.
Ну это не до конца честный вариант,
Код
out SREG,R4
ror R4
нужно менять на
Код
bst R4,0
lsr R4
bld R4,7
а это уже 13 тактов...
Кстати говоря, тк тема снова всплыла, есть небольшая модификация 13тактового алгоритма
которая позволяет отказаться от использования бита T в SREG:
Код
; 13 words / 13 cycles
; ;tmp= abcdefgh
mov tmp2, tmp ;tmp2= abcdefgh
asr tmp ;tmp= aabcdefg C=h
ror tmp2 ;tmp2= habcdefg C=h
rol tmp ;tmp= abcdefgh C=a
rol tmp ;tmp= bcdefgha
andi tmp2, 0b10101010 ;tmp2= h0b0d0f0
andi tmp, 0b01010101 ;tmp= 0c0e0g0a
add tmp, tmp2 ;tmp= hcbedgfa
mov tmp2, tmp ;tmp2= hcbedgfa
andi tmp2, 0b01100110 ;tmp2= 0cb00gf0
swap tmp2 ;tmp2= 0gf00cb0
andi tmp, 0b10011001 ;tmp= h00ed00a
add tmp, tmp2 ;tmp= hgfedcba
но увы все равно 13...

Цитата(Qwertty @ Nov 8 2008, 08:27)

Под "PIC" подразумевается 16-ая или 18-ая серии? Тогда интересно было бы взглянуть на реверс из трех инструкций...
Увы, для PIC сейчас найти не могу, а писать заново не буду, Пики я только "со словарем", потаму
как редко...
Насколько я помню, пойдет даже на 10/12 серии...,
экономия 1 такта там из-за аккамуляторной модели, типа можно сделать сдвиг и получить
в результате 2 числа одно сдвинутое а второе исходное... как то так...