Правильно задать вопрос - пол проблемы решить !!! Чтобы не путать уважаемою аудиторию постараюсь яснее изложить мою проблему:
Есть два массива по 8 байт (а в реале размер кратен 8)
unsigned char Vbuf[8];
unsigned char Hbuf[8];
пусть Vbuf будет таким:
12345678 - 1-й байт
ABCDEFGH - 2-й байт
87654321 - 3-й байт
abcdefgh - 4-й байт
QWERTYUI - 5-й байт
qwertyui - 6-й байт
ASDFGHJK - 7-й байт
asdfghjk - 8-й байт
надо скопировать в Hbuf так чтобы в нем
1A8aQqAa - 1-й байт
2B7bWwSs - 2-й байт
3C6cEeDd - 3-й байт
4D5dRrFf - 4-й байт
5e4eTtGg - 5-й байт
6F3fYyHh - 6-й байт
7G2gUuJj - 7-й байт
8H1hIiKk - 8-й байт
решение задачи в лоб (побитовое копирование) выглядит так:
Код
#define _HEIGHT 16 // высота экрана в строках (битах)
#define _WIDTH 4 // ширина экрана кратная 1 байту
#define _H _HEIGHT/8
#define _W _WIDTH*8
unsigned char SCREEN2[_HEIGHT][_WIDTH]; // буфер видео-памяти (G-формат)
unsigned char BUFFER [_H][_W]; // рабочий буфер видео-памяти (V-формат)
unsigned char ws_i=0, wb_i=0, hsi_bit=0, hs_i=0, hs_byte=0;
// преобразование данных из вертикального формата
// в горизонталный
for(ws_i=0; ws_i<_WIDTH; ws_i++)
{
for(hs_i=0; hs_i<_HEIGHT; hs_i++)
{
if(hsi_bit > 7) {hsi_bit=0; hs_byte++;}
for(wb_i=0; wb_i<8; wb_i++)
SCREEN[hs_i][ws_i] |= (((unsigned char)BUFFER[hs_byte][(unsigned int)(wb_i+ 8*ws_i)]>>hsi_bit)<<7)>>wb_i; // собственно побитовое копирование !!!
hsi_bit++;
}
hs_byte=0;
hsi_bit=0;
}
эта штука работает, но долго !!!
Цитата
Простой вариант "в лоб".
Исходная помещается в r0-r7, результирующая получается в r8-r15:
movw r8,r0
mowv r10,r2
movw r12,r4
movw r14,r6
bst r0,1
bld r9,0 // из 01 перенесено в 10 другой матрицы
bst r1,0
bld r8,1 // из 10 перенесено в 01 другой матрицы
...
bst r6,7
bld r15,6 // из 67 перенесено в 76 другой матрицы
bst r7,6
bld r14,7 // из 76 перенесено в 67 другой матрицы
Всего необходимо 28 взаимных пересылок, что в результате занимает 28х4=112 тактов. Плюс 4 такта копирования регистровых пар, получается 116 тактов. Итого транспонирование матрицы битов занимает по времени 5,8 мкс. Для 80 матриц - 464 мкс, с накладыми расходами пусть будет ~0,5 мс, т.е. в 100 раз быстрее, чем у Вас получилось.
класс, но пишу на Си, регистры все заняты компилятором !!! можно конечно сохранять их значения а потом восстанавливать, но 16 регистров.... помоему не реально.