История развития программного обеспечения

Язык программирования PL/M-80 и его потомки. Язык PL/M-86

1. Различия между PL/M-86 и PL/M-80

PL/M-86 отличается от PL/M-80 в следующем:

  • PL/M-86 поддерживает арифметику с плавающей запятой.
  • Поддерживает знаковую арифметику.
  • Новые типы данных REAL, INTEGER, POINTER и SELECTOR.
  • Дополнительный оператор для указателя @.
  • Поддержка вложенных структур.
  • Расширен набор встроенных процедур.
  • Кроме того, ключевое в PL/M-80слово ADDRESS в PL/M-86 заменено на ключевое слово WORD.

В PL/M-80 только два типа данных BYTE и ADDRESS, а в PL/M-86 поддерживаются следующие типы: BYTE, WORD, DWORD, INTEGER, REAL, POINTER и SELECTOR. Другие различия следуют из этого, например итеративный цикл DO работает разным образом, если его индекс имеет переменную типа INTEGER.

Замечания.

В руководстве [5] PL/M-86 позиционируется уже как язык прикладного программирования для микропроцессора Intel 8086.

В PL/M-86 в именах переменных стало возможным использование знака подчёркивания и он не игнорируется как знак доллара.

Так как в архитектуре 8086 для ввода-вывода доступно не 256 портов, а 65535, а в порт можно записывать полуслово, то встроенные функции INPUT и OUTPUT воспринимают теперь двухбайтовые номера портов. Кроме того, добавились функции INWORD и OUTWORD , с помощью которых можно читать из или записывать в порты двухбайтовые значения.

В языке появились структуры. Объявление структуры с двумя полями KEY и INFO выглядит так:

DECLARE RECORD STRUCTURE (KEY BYTE, INFO WORD);

Обращение к полю осуществляется как и в других языках через составное имя RECORD.KEY или RECORD.INFO, ну и через указатели, конечно.

Можно объявить массив с элементами типа структура:

DECLARE AIRPLANE (120) STRUCTURE (
MAX_SPEED REAL,
MAX _ALTITUDE REAL);

Обращение к 97-му элементу будет выглядеть так:
AIRPLANE(96). MAX _ALTITUDE =12000.0;

Разумеется, элементом структуры может быть массив и другая структура, она называется вложенной структурой.

Новые встроенные функции можно разбить на несколько больших классов.

1. Функции явного преобразования типов.

Новая функция SIZE (имя) Возвращает объём памяти, выделенный под массив или структуру. Возвращаемое значение имеет тип WORD.
Новая функция FLOAT (integer _ expr) Преобразуют целое число в число с плавающей запятой типа REAL.
Обратная ей функция FIX (real _ expr) Возвращает целое число типа INTEGER. При этом производится округление до ближайшего целого или до ближайшего чётного числа, если результат попадает ровно между двумя целыми числами.
Функция INT Преобразует значения типа BYTE и WORD в значение типа INTEGER .
Функция SIGNED (expr) Преобразует значения типа BYTE и WORD в значение типа INTEGER .
Обратная ей функция UNSIGN (int _ expr) Преобразует значение типа INTEGER в WORD .
Функции INPUT(expr) и INWORD(expr) Осуществляют ввод из порта соответственно байта или слова данных.

Встроенные переменные OUTPUT и OUTWORD рассматриваются как соответственно байтовый и словный массивы длинной 65536 элементов. Запись элемента с номером N соответствует выводу байта или слова через порт N процессора 8086.

2. Функции работы со строками.

Встроенная процедура MOVB (откуда, куда, счётчик) Побайтно по возрастанию адресов копирует строку из одного места памяти в другое. Параметры “откуда” и “куда” имеют тип POINTER , а “счётчик” – тип BYTE или WORD . Аналогичная её процедура MOVW копирует строки пословно (по два байта).
Забавнее варианты этих функций – MOVRB и MOVRW Тоже копируют строки, только копирование идёт в обратном порядке в сторону уменьшения адресов. Это полезно, когда строки перекрываются.
Две встроенные процедуры CMPB (source 1, source 2, counter) и CMPW Позволяют сравнивать строки между собой. Если значения совпали они возвращают 0FFFFh, иначе индекс (позицию в строке) первого не совпавшего элемента.

3. Различные переменные, процедуры и функции

Процедура TIME позволяет реализовать программную задержку, длительность которой зависит от значения аргумента типа WORD, умноженного на некоторую константу, определяемую тактовой частотой процессора. Для 8086 с тактовой частотой 5 МГц при отсутствии прерываний она равна 100 микросекунд. Следовательно, максимальная задержка равна 6,55 секунды и если требуется более длительная задержка, то придётся вызывать эту функцию нужно число раз.

Например, задержка на 2 секунды:

DO I=1 TO 80;
  CALL TIME (250);
END;

Переменные STACKPTR и STACKBASE имеют тип WORD и обеспечивают доступ соответственно к содержимому аппаратных регистров SP и SS, адресующих стек в памяти.

Функция ABS (выражение) возвращает абсолютное значение своего аргумента, имеющего тип REAL,
а IABS (выражение) – абсолютное значение от аргумента типа INTEGER.

Следующие имена флагов как и в PL/M-80:
CARRY, ZERO, SIGN, PARITY

Только теперь это названия встроенных процедур типа BYTE и обращение к ним вызывает проверку соответствующего флага состояния процессора 8086: CF, ZF, SF и PF. Если флаг установлен, возвращается 0FFH, если сброшен – 00h.

2. Трансляция программ на PL/M-80 компилятором PL/M-86

Программы на PL/M-80, корректно работающие на микропроцессоре 8080 могут быть перекомпилированы с помощью компилятора с языка PL/M-86, чтобы получить объектный код, который будет исполняться процессорами 8086, 8088 и старше. Придётся только изменить идентификаторы, если они совпадают с новыми ключевыми словами PL/M-86, при этом нет необходимости заменять ADDRESS на WORD, поскольку ADDRESS имеет тот же смысл, что и WORD .

Заметим, что там, где программы на PL/M-86 обычно используют указатели (переменные типа POINTER и ссылки на местоположение с помощью оператора @), программы на PL/M-80 используют переменные типа ADDRESS и ссылки на местоположение с помощью dot-оператора.

В целом компилятор PL/M-86 обеспечивает совместимость снизы вверх с PL/M-80, хотя некоторые ограничения возможны на тип выражения, если используется атрибут AT и инициализацию с помощью INITIAL и DATA, а также ссылки на местоположение.

Литература

  1. Р.Фаулджер. Программирование встроенных микропроцессоров. М .: Мир . 1985. –275 с .
  2. Intel Corporation 1976. PL/M-80 Programming Manual . Doc # 98-268B.
  3. PL/M 386 Programmer's Guide, RadiSys Corporation, 07-0710-01, December 1999. –422 pp.
  4. http://www.unix4fun.org/z80pack/doc_cpm_plm.html .
  5. PL/M-86 Programming Manual for 8080/85-Based Development Systems. Intel. 1980. Manual Order Number 4800466-03 Rev. C.

Следующая статья цикла

Статьи "Язык программирования PL/M-80 и его потомки"
Статья помещена в музей 07.06.2007 года.