[an error occurred while processing this directive]
Вопрос к знатокам программирования для ADSP-2191 на ассемблере(+)
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Wukrly 11 августа 2004 г. 16:50

/* ниже приведен пример накопления з2-разрядных произведений
для наглядности использована непосредственная загрузка входных чисел. В примере использованы максимальные числа */
dis m_mode; //формат умножения 1.15
ICNTL = 0x00; //обычное округление

mx0 = 0xffff; //первое умножение 1.0 * 1.0
mx1 = 0x7fff;
my0 = 0xffff;
my1 = 0x7fff;
mr = mx0*my0(UU);
mr0 = mr1;
mr1 = mr2;
mr = mr + mx1*my0(su);
mr = mr + mx0*my1(us);
mr0 = mr1;
mr1 = mr2;
mr = mr + mx1*my1(ss);
SAT mr;

ay0 = mr0; //сохранение результата
ay1 = mr1;
af = PASS mr2;

mx0 = 0x0001; //2-е умножение -1.0 * 1.0
mx1 = 0x8000;
my0 = 0xffff;
my1 = 0x7fff;
mr = mx0*my0(UU);
mr0 = mr1;
mr1 = mr2;
mr = mr + mx1*my0(su);
mr = mr + mx0*my1(us);
mr0 = mr1;
mr1 = mr2;
mr = mr + mx1*my1(ss);
SAT mr;

ar = mr0 + ay0; //накопление 1.0 - 1/0 = 0.0
ar = mr1 + ay1 + C, ay0 = ar;
af = mr2 + af + C, ay1 = ar;
/* признак AC в конце накопления показывает
что результат должен быть откорректирован
на +1, корректировка совмещена со
следующим накоплением*/
mx0 = 0x0001; //3-е умножение -1.0 * 1.0
mx1 = 0x8000;
my0 = 0xffff;
my1 = 0x7fff;
mr = mx0*my0(UU);
mr0 = mr1;
mr1 = mr2;
mr = mr + mx1*my0(su);
mr = mr + mx0*my1(us);
mr0 = mr1;
mr1 = mr2;
mr = mr + mx1*my1(ss);
SAT mr;
/*здесь прибавляется перенос от предыдущей
операции накопления, т.е. накопление
ведется в обратных кодах*/
ar = mr0 + ay0 + C; //накопление 1.0 - 1/0 = 0.0
ar = mr1 + ay1 + C, ay0 = ar;
af = mr2 + af + C, ay1 = ar;

mx0 = 0x0001; //4-е умножение -1.0 * -1.0
mx1 = 0x8000;
my0 = 0x0001;
my1 = 0x8000;
mr = mx0*my0(UU);
mr0 = mr1;
mr1 = mr2;
mr = mr + mx1*my0(su);
mr = mr + mx0*my1(us);
mr0 = mr1;
mr1 = mr2;
mr = mr + mx1*my1(ss);
SAT mr; /* эта операция очень полезна, когда используется
-1.0 в формате 0х8000 0х0000 */

ar = mr0 + ay0 + C; // очередной цикл накопления
ar = mr1 + ay1 + C, ay0 = ar;
af = mr2 + af + C, ay1 = ar;

mx0 = 0xffff; //5-е умножение 1.0 * -1.0
mx1 = 0x7fff;
my0 = 0x0001;
my1 = 0x8000;
mr = mx0*my0(UU);
mr0 = mr1;
mr1 = mr2;
mr = mr + mx1*my0(su);
mr = mr + mx0*my1(us);
mr0 = mr1;
mr1 = mr2;
mr = mr + mx1*my1(ss);
SAT mr;

ar = mr0 + ay0 + C; // очередной цикл накопления
ar = mr1 + ay1 + C, ay0 = ar;
af = mr2 + af + C, ay1 = ar;

mx0 = 0xffff; //6-е умножение 1.0 * -1.0
mx1 = 0x7fff;
my0 = 0x0001;
my1 = 0x8000;
mr = mx0*my0(UU);
mr0 = mr1;
mr1 = mr2;
mr = mr + mx1*my0(su);
mr = mr + mx0*my1(us);
mr0 = mr1;
mr1 = mr2;
mr = mr + mx1*my1(ss);
SAT mr;

ar = mr0 + ay0 + C; // последний цикл накопления
ar = mr1 + ay1 + C, ay0 = ar;
af = mr2 + af + C, ay1 = ar;
/* последняя коррекция не совмещается
с накоплением*/
ar = ay0 + C;
ay0 = ar;
ar = ay1 + C;
ay1 = ar;
ar = pass af;
af = ar + C;
/* накопитель af-ay1-ay0 переполнен
он нормализуется путем сдвига на -1*/
ar = pass af;
sr = ashift ar BY 15 (HI); /* сдвиг старшего слова */
sr = sr or ashift ay1 BY -1 (HI); /* сдвиг среднего слова */
sr = sr or ashift Ay0 BY -1 (LO); /* сдвиг младшего слова */

Вопрос Все ли здесь корректно и можно ли сделать лучше с точки зрения ускорения выполнения? Заранее благодарен за ответы

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru