Язык программирования 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, а также ссылки на местоположение.
Литература
- Р.Фаулджер. Программирование встроенных микропроцессоров. М .: Мир . 1985. –275 с .
- Intel Corporation 1976. PL/M-80 Programming Manual . Doc # 98-268B.
- PL/M 386 Programmer's Guide, RadiSys Corporation, 07-0710-01, December 1999. –422 pp.
- http://www.unix4fun.org/z80pack/doc_cpm_plm.html .
- 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 года.