Генератор случайных чисел. Ознакомление с одним из приложений процессоров цифровой обработки сигналов, страница 3

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