Пришла тут одна мысль как двигать спрайт при помощи CRC, на словах это объяснить сложно, попробую на примере.
Если бы в байте было 4 бита, можно было бы использовать полином x^4+x+1, который выдаёт последовательность:
111100010011010(1111...)
в ней отсутствует комбинация 0000, поэтому воткнём еще один 0 там где их 3 и получим:
1111000010011010(1111...)
если взять по 4 битика, получится 16 уникальных комбинаций:
1111 1110 1100 1000 0000 0001 0010 0100 1001 0011 0110 1101 1010 0101 1011 0111
(выделено некоторое значение и где его биты оказываются при сдвиге)
если их засунуть в таблицу, а в спрайте вместо комбинации из 4 бит разместить индекс элемента из таблицы, то прибавив к нему n>0 можно получить индекс элемента сдвинутого влево(с мусором в младших разрядах), а вычитая n>0 сдвинутого вправо(с мусором в старших разрядах).
Вытащив элементы с индексами отличающимся на 4, и используя маску можно получить циклический сдвиг одного из элементов находящихся между ними. чтобы можно было сдвигать любой элемент на n<4 и не прочитать мусор, три элемента из хвоста таблицы нужно приписать до начала, а три элемента из начала после хвоста.
Если вернуться к 16 разрядным словам, то нужно будет сделать табличку в 256+14(+14 если будем двигать и в другую сторону) элементов полученных при помощи полинома восьмой степени. Значения генерируемые полиномом копируются в чётные биты, а нечётные остаются нулевыми. Слово спрайта разделяется на чётные и нечётные биты, и заменяется двумя байтовыми индексами, показывающими где такие значения можно найти в таблице. То есть для сдвига 8 точек спрайта потребуется:
Прочитать два индекса i1 и i2 из спрайта.
Вычислить слово сдвинутое влево: table[i1+shift] +table[i2+shift]*2
Вычислить слово сдвинутое вправо: table[i1+8-shift] +table[i2+8-shift]*2
Наложить маски и вывести на экран.
Если править код чтения из таблиц(его можно будет использовать и для следующей строки), то для вывода 8 точек вроде как требуется 16 команд, а прочитанных или записанных слов примерно раза в два больше(организация цикла сюда не входит).




Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 

