MR=MR+SR1*MY0(UU); // a(hi) * x(lo)*2 + a(lo) * x(hi)*2
SI=MR1;
MR1=MR0; // Сдвиг влево на 16 разрядов
MR2=SI;
MR0=0xFFFE; // c=32767, сдвинутое влево на 1 бит
MR=MR+SR0*MY0(UU); // (полученное выше) + a(lo) * x(lo)*2 + c*2
SR=ASHIFT MR2 BY 15 (HI);
SR=SR OR LSHIFT MR1 BY -1 (HI); // Сдвиг MR ещё на 15 разрядов влево
SR=SR OR LSHIFT MR0 BY -1 (LO);
RTS; // Возврат из подпрограммы
// Конец модуля random.asm
/* ADSP-2181 MAIN_RANDOM Program файл Main.asm
Программа устанавливает прерывания от таймера с частотой 12.5 кГц при тактовой частоте процессора 12.5 MГц и вызывает подпрограмму генератора случайных чисел c равномерным распределением urand.
Сохранение значения seed в ячейках памяти предполагает использование регистров сдвигателя и в иных целях.
Выход может отображаться на экране осциллографа через ЦАП DAC0.
Используется файл описания архитектуры ЦСП ADSP-2181.ldf.
*/
#define LOAD_DAC0 0x1000 // Порт ЦАП с адресом 0x1000
.section/data data1;
.VAR seed_msw, seed_lsw; // Значения частей начального числа seed
.EXTERN urand; // Внешний генератор случайных чисел
.section/pm interrupts; // --- Таблица векторов прерываний ---_reset: JUMP start; NOP; NOP; NOP; // Прерывание по сбросу процессора
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
JUMP rand; NOP; NOP; NOP; // Прерывание от таймера
RTI; NOP; NOP; NOP;
.section/pm program;
start: // --- Установка таймера на прерывания c частотой 12.5 кГц --AX0 = 0;
DM(0x3ffb) = AX0; // установка TSCALE = 0
AX0 = 999;
DM(0x3ffc) = AX0; // установка TPERIOD = 999
DM (0x3ffd) = AX0; // установка TCOUNT = 999
SI = 0x1234; // Инициализация начального числа
DM (seed_lsw) =SI;
DM (seed_msw) =SI;
IMASK=0x11; // Разрешение прерывания от таймера
ICNTL=0x07;
ENA TIMER;
wait: IDLE; // Ожидание прерывания
JUMP wait; // Переход к ожиданию
rand: // --- Подпрограмма обслуживания прерывания ---
SR1 = DM (seed_msw); // Ввод значения начального числа
SR0 = DM (seed_lsw);
CALL urand; // Вычисление случайного число
DM (LOAD_DAC0) =AR; // Вывод результата в ЦАП
DM (seed_msw) = SR1; // Cохранение нового начального числа
DM (seed_lsw) = SR0;
RTI; // Возврат из прерывания
// Конец модуля main.asm
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.