Выбрать главу

.var/pm/ram x_input[length];   { Описание массива данных           }

.init x_input: <idmaidma.dat>; { Файл передаваемых данных          }

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. Кроме того, можно изменить имя загружаемого файла в самой программе.

Глава 11. Директивы ассемблера

В этой главе говорится о директивах, которые используются для управления процессом ассемблирования программ.