Цитата(arttab @ Aug 3 2006, 05:43)

спасибо! коечто поправлю, что то добавлю.
По поводу основного цикла: выглядит изящней, но после оптимизации выгрыша от применения указателя и декремента быть не должно.
Проверил. При оптимизации по размеру разница есть - 32/44 байта: вы твоем str+Buf_Adres вычисляется дважды внутри цикла, хотя +3 встроено в команду LDD: LDD Z+3. При оптимизации по скорости разница больше - 32 / 46 байт, хотя суммирование вынесено за цикл. И все равно остается сравнение с 64 в конце цикла. А если str передавать как параметр, да еще перед функцией __x поставить - мой вариант получается еще лучше - 26 байт, а твой так и остается в районе 40. (я делал только цикл).
Выигрыш получился имеено за счет указателя и того, что в результате вычисления Buf_Address-=2 сам собой получается флаг Z который тут же можно использовать для проверки окончания.
Цитата(arttab @ Aug 3 2006, 05:43)

Эксперементировал с кодом и оптимизацией и заметил такую вещь. Мой вариант легче читается для новичков. приведу 2 варианта.
Тогда для улучшения наглядности рекомендую такой вариант:
Код
str += 3;
do {
data = str[Buf_Adres+1];
data <<= 8;
data |= str[Buf_Adres];
или
str += 3;
do {
data = str[Buf_Adres++];
data |= (uint16_t)str[Buf_Adres++] << 8;
а еще лучше
str += 3;
do {
data = *str++;
data |= (uint16_t)*str++ << 8;
Новичков надо сразу приучать писать оптимально. Раз str больше не нужен, нет смысла его хранить неизменным. Пусть указывает на текущий байт. Тогда одной командой LD Rn, X+ сразу делаем и загрузку и передвигаем указатель. Кстати, в последнем варианте цикл получился 30 байт независимо от оптимизации.
Цитата(arttab @ Aug 3 2006, 05:43)

Кстати, unsigned int в разных компиляторах имеет разный размер, а unsigned short везде 2 байта.
На эту тему много копий поломали с dxp в личной переписке (каждый остался при своем). Я не нашел в имеюмщемся у меня стандарте (ISO/IEC 9899) описания размеров данных. На всех известных мне компиляторах unsigned short действительно 2 байта. Но мне больше нравится подход с использованием заголовочного файла stdint.h. Объявленые в нем типы uint8_t, uint16_t, int8_t и т.д. имеют один и тот же размер всегда и везде.
Цитата(arttab @ Aug 3 2006, 05:43)

Цитата
P.S. с pgmspace.h так и не разобрались?
Упустил из виду. Можете кратко сказать с чем его едят?
подкоректирую - будет скоро готов.
"Говорю одно, делаю третье, думаю второе". Имел в виду intrinsics.h. Можно указать, что функции работы с флешкой описаны в файле intrinsics.h, тогда код будет самодостаточен - не нужны левые flash.h. Пришли (в почту) файл flash.h, я посмотрю как его макросы заменить на функции из intrinsics.h.