abuf[5] | XXXXXXXXX00101 | |
… | ||
bbuf | bbuf[0] | XXXXXXXXX01000 |
bbuf[1] | XXXXXXXXX01001 | |
bbuf[2] | XXXXXXXXX01010 | |
… | ||
cbuf | cbuf[0] | XXXXXXXXX10000 |
cbuf[1] | XXXXXXXXX10001 | |
cbuf[2] | XXXXXXXXX10010 | |
cbuf[3] | XXXXXXXXX10011 | |
… |
Чтобы получить доступ к буферу abuf из программы, необходимо инициализировать индексные регистры DAG и регистры длины буфера следующими инструкциями:
I0 = ^abuf; {Присвоить индексному регистру I0 базовый адрес буфера abuf}
L0 = %abuf; {Присвоить L0 длину буфера abuf}
M0 = 1; {Присвоить модификатору M0 значение наращивания
указателя адреса буфера abuf}
Далее в программе можно читать данные из буфера с помощью инструкции AR=DM(I0, L0) или записывать данные в буфер инструкцией DM(I0, L0)=AR. Естественно, вместо регистра AR могут применяться и некоторые другие регистры процессора. При размещении этих инструкций в цикле каждое обращение к буферу будет автоматически увеличивать индексный регистр адреса I0 на величину M0. При достижении регистром I0 величины, равной L0, индексный регистр I0 вновь загрузится базовым адресом буфера. Таким образом, обращения к буферу будут кольцевыми. Для линейных буферов регистр длины буфера должен быть установлен в ноль.
Данные директивы предназначены для размещения программ и данных в сегментах памяти. Директива PMSEG указывает редактору связей на необходимость разместить все программы и данные модуля в определенном сегменте памяти программ. Директива DMSEG указывает редактору связей на необходимость разместить все структуры данных модуля в определенном сегменте памяти данных. Сегменты должны быть предварительно определены в файле описания архитектуры системного конфигуратора. Директивы PMSEG и DMSEG подобно параметру SEG директив MODULE и VAR имеют следующий формат:
.PMSEG имя_сегмента_pm;
.DMSEG имя_сегмента_dm;
Обычно, чтобы расположить все программы и данные исходного модуля в определенном системным конфигуратором сегменте памяти, необходимо повторить параметр SEG в директиве MODULE и всех директивах VAR внутри модуля. Директивы PMSEG и DMSEG используются для исключения многократного повторения параметров SEG. Директивы PMSEG и DMSEG должны быть размещены в исходном файле программного модуля перед директивой MODULE. Ниже приводится пример, в котором модуль prog1, некоторые буферы и переменную var1 располагают в памяти данных в сегменте с именем seg1:
.DMSEG seg1;
.MODULE/RAM prog1;
.VAR/DM/RAМ/СIRС buf1[15];
.VAR/DM/RAM buf2[5];
.VAR/DM/RAM buf3[5];
.VAR/DM/RAM var1;
...
.ENDMOD;
Директива INIT используется для инициализации переменных и буферов в ПЗУ. Редактор связей помещает данные инициализации в файл образа памяти, который затем используется разделителем программ (splitter) при подготовке данных для записи в ПЗУ. Разделитель трансформирует части этого файла в формат, совместимый с промышленным стандартом программатора ПЗУ.
Инициализирующие значения могут быть перечислены в директиве или указаны во внешнем файле. Директива INIT может иметь одну из следующих форм:
.INIT имя_буфера: значение1, значение2,...;
.INIT имя_буфера: ^другой_буфер или %другой_буфер,...;
.INIT имя_буфера: <имя_файла>;
Операторы ^ и % используются для инициализации буфера или переменной базовым адресом, или длиной, или даже другими буферами. Любые комбинации констант, указателей адресов буфера и величин длины буфера могут быть заданы через запятую. Примеры:
.INIT x: 0x3FFF;
Данный пример инициализирует переменную x шестнадцатеричной константой 0x3FFF.
.INIT buf: 9,0,3,5,7;
Эта директива инициализирует буфер buf списком констант.