/* Эта программа транслирует данные от ведущего процессора ADSP-2181 */
/* к ведомому процессору ADSP-2181 через IDMA порт */
/*********************************************************************/
.module/abs=0x0000 idma_transfer;
.include ; { Включить файл определений }
.const length=68; { Десятичное значение длины вектора }
.var/pm/ram x_input[length]; { Описание массива данных }
.init x_input: ; { Файл передаваемых данных }
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;
RTI; NOP; NOP; NOP;
/*** Начало программы ***/
start:
ax0=0x0000;
dm(System_Control_Reg)=ax0; { Такты ожидания PM отключить }
dm(PFTYPE)=ax0; { Все флаги PF назначить выходами }
dm(DM_Wait_Reg)=ax0; {Такты ожидания DM и портов ввода-вывода отключить}
l6=0; { Длина буфера данных }
i6=^x_input; { Адрес начала буфера транслируемых данных }
m6=1; { Приращение = 1 }
modify(i6,m6); { Модификация адреса }
/*** Защелкнуть адрес 0x0001 ***/
call check_ack; { Проверить готовность к приему }
ax0=0x0001; { Стартовый адрес для записи в ведомый процессор }
io(0x0001)=ах0; { Запись этого адреса с переключением линий -IS и IAL }
/*** Запись всех данных начиная с адреса 0x0001 ***/
cntr=length-1; { Установить счетчик транслируемых слов }
do loop1 until се; { Организовать цикл записи }
call check_ack; { Проверить готовность к приему }
call format; { Форматировать данные }
io(0x0100)=ay0; { -IWR и IS записывают старшие 16 бит IAD 0-15 }
call check_ack; { Проверить готовность к приему }
io(0x0100)=ay1; { -IWR и IS записывают младшие 8 бит IAD 0-15 }
loop1: nop;
/*** Защелкнуть адрес 0x0000 ***/
call check_ack; { Проверить готовность к приему }
ax0=0x0000; { Стартовый адрес для записи в ведомый процессор }
io(0x0001)=ax0; { Запись этого адреса с переключением линий -IS и IAL }
/*** Запись по адресу 0x0000 ***/
i6=^x_input; { Указатель на начало буфера данных }
call check_ack; { Проверить готовность к приему }
call format; { Форматировать данные }
io(0x0100)=ay0; { -IWR и IS записывают старшие 16 бит IAD 0-15 }
call check_ack; { Проверить готовность к приему }
io(0x0100)=ay1; { -IWR и IS записывают младшие 8 бит IAD 0-15 }
idle; { Режим ожидания }
/****************************************************************/
/* Подпрограмма переформатирования 24-бит слова памяти программ */
/****************************************************************/
format: ay0=pm(i6,m6); { 16 старших бит запомнить в регистре ay0 }
ay1=px; { 8 младших бит запомнить в регистре ay1 }
rts;
/***************************************************************************/
/* Подпрограмма ожидания перехода состояния линии -IACK в низкое состояние */
/***************************************************************************/
check_ack:
ax0=dm(0x3fе5); { Читать PF1, который подключен к -IACK }
ar=tstbit 1 of ax0; { Анализировать PF1 }
if ne jump check_ack; { Если процессор не готов вновь контролировать -IACK}
rts;
.endmod;
Многие директивы и команды данной программы уже знакомы читателям из описания предыдущей программы. Текст программы прокомментирован, что позволяет без труда понять алгоритм ее работы. Как видно из текста, в программе использован ряд подпрограмм, в которых сосредоточены часто используемые операции. Вызов данных подпрограмм осуществляется командой call, после которой записывается имя подпрограммы. Команда io(0x0001)=ax0 осуществляет запись содержимого регистра ax0 в порт ввода- вывода по адресу 0x0001. Команда ar=tstbit 1 of ax0 заносит в регистр arрезультат тестирования первого разряда регистра ax0. Следующая за этой, команда if ne jump check_ack проверяет состояние флагов ALU и осуществляет переход на метку check_ack, если результат проверки предыдущей операции был отрицательным. Подробнее со всеми командами сигнального процессора ADSP-2181 мы познакомимся позже.
При компиляции этой программы, все данные из файла idmaidma.dat будут автоматически помещены в файл загрузки idmaidma.lda. В качестве файла данных idmaidma.dat можно использовать загрузочный файл рассмотренной нами ранее программы mem_clr.lda, из которого предварительно следует удалить первые три и последние две служебные строки. Данную операцию можно выполнить с помощью любого текстового редактора. После чего файл необходимо переименовать, задав ему имя idmaidma.dat. Кроме того, можно изменить имя загружаемого файла в самой программе.
Читать дальше