HarryStar писал(а):что-то сомневаюсь, что условие и ветвление быстрее, чем присваивание
У вас там не присваивание, а маска и сдвиг.
А условие и ветвление возможно будут такими (от оптимизатора зависит)
- Код: Выделить всё • Развернуть
- lds  in, (in_array+2) - один раз для каждого входного байта
 ldi  out,0x00
 sbrs in,5
 ldi  out,0x80
 sts  (out_array+18), out
 
 
HarryStar писал(а):Вывод видео специфическая задача. Во время прохода строки времени очень мало
Далаадна... С вашими-то разрешениями да современными процами  
 
 Flexz писал(а):У вас же SPI по сути, почему его не использовать?
+1. Если между знакоместами допустимы промежутки, то удобно использовать SPI
У вас какой процессор и кварц?
Добавлено спустя 1 час 7 минут 49 секунд:Сейчас попробовал написать. (Вслепую. Не отлаживал и не собираюсь 

)
Использует знакогенератор символов из флэш. Частота вывода пикселей - 5Мгц (при кварце 20). 32 символа в строке (256 пикселей). Это примерно 51 с чем-то микросекунды. В начале строки выводится один лишний пиксель (черный).
Недостаток - занимает весь порт, но использует только младшую ногу порта (так проще).
- Код: Выделить всё • Развернуть
- init:   
 ; Тут сохраняем регистры, если надо, выравниваем времена и т.п.
 ; в ZH кладем адрес нужной строки знакогенератора
 ; в Y кладем адрес экранного буфера
 
 ldi   cnt,32   ; в cnt кладем число символов в строке
 ldi   sh1,0   ; в sh1 кладем нолик, это "лишний" бит - он будет черный.
 rjmp   entry   ; Поехали
 
 loop:   out   sh1   ;1===   Седьмой
 lsr   sh1   ;1
 entry:   ld   ZL,Y+   ;2   Берем код символа из экранного буфера
 out   sh1   ;1===   Выводим последний бит (сразу после входа - черный)
 lpm   tmp,Z   ;3   Берем нужный байт из знакогенератора
 out   tmp   ;1===   Сразу выводим первый бит
 mov   sh1,tmp   ;1   Перекидываем в "сдвиговый регистр"...
 lsr   sh1   ;1   ...и сдвигаем
 nop      ;1
 out   sh1   ;1===   Выводим второй бит
 lsr   sh1   ;1   ...и сдвигаем
 nop      ;1
 nop      ;1
 out   sh1   ;1===   Третий
 lsr   sh1   ;1
 nop      ;1
 nop      ;1
 out   sh1   ;1===   Четвертый
 lsr   sh1   ;1
 nop      ;1
 nop      ;1
 out   sh1   ;1===   Пятый бит
 lsr   sh1   ;1   сдвигаем
 mov   tmp,sh1   ;1   запоминаем результат  в tmp
 lsr   sh1   ;1   и сразу сдвигаем еще раз, чтобы потом быстро вывести
 out   tmp   ;1===   Шестой бит из tmp
 dec   cnt   ;1   Есть еще байты?
 brne   loop   ;2   Если да, зацикливаемся
 
 nop      ;1
 out   sh1   ;1===   Седьмой бит последнего символа в строке
 lsr   sh1   ;1
 nop      ;1
 nop      ;1
 out   sh1   ;1===   Последний бит последнего символа в строке
 
 ; Можно добавить инкремент строки знакогенератора, экранного буфера, подсчет строк, времени и т.п.
 ; Тут восстанавливаем регистры, если надо
 
 
Кучу нопов... можно занять чем-нибудь "полезным" 
