Вход

Просмотр полной версии : Кросскомпилятор PL/M-80



DemonId7
22.12.2022, 19:38
Всем привет.

Оригинал от Марка можно найти здесь: https://github.com/ogdenpm/c-ports

Мой пакет PL/M-80, каким его вижу я. В пакет входят все необходимые утилиты:
https://github.com/MrDemonid/PL-M-80-Tools

Итак, изменения, по сравнению с базовой версией от Марка, а точнее от Intel:
ASM80:
- имена файлов расширены с 6 до 8 символов + расширение.
- длина имён идентификаторов расширена до 18 символов.
- в именах теперь допускается символ '_'.
- в директивах DB и DW теперь можно размещать до 16 значений в строке, против 8 в оригинале (кому мало - черкните, сделаю больше).
- пути к файлам и утилитам задаются как в оригинале на ISIS-II, то есть в виде :F0: - :F9:.
- корректная работа с русскими символами в комментариях (в оригинале они портились)
- результат компиляции сохраняется в ERRORLEVEL.
- имя компилируемого исходника теперь выводится на экран.
- добавлена поддержка исходников в unix-формате (т.е. конец строки одним символом 0x0A).
- добавил вывод справки по параметрам компилятора.

LINK:
- параметры теперь можно передавать в файле, как в более современных компиляторах, например: link @:f1:fileparams.txt

OBJCPM:
- поддерживает задание путей к файлам в формате ISIS-II, то есть через :F0:-:F9:.

PLM80:
- добавлены два оператора: BREAK и CONTINUE, для циклов.
- в именах теперь допускается символ '_'.
- в листинге размер страницы можно задать до 65535 строк, для более удобного просмотра.
- корректная работа с русскими символами в комментариях.
- пути к файлам и утилитам задаются как в оригинале на ISIS-II, то есть в виде :F0: - :F9:.
- результат компиляции сохраняется в ERRORLEVEL.
- имя компилируемого исходника теперь выводится на экран.
- добавил цикл DO...UNTIL, аналогичный паскалевскому.
- увеличена рабочая память компилятора, для сборки больших исходников.
- увеличена максимальная длина строки, определяемой через LITERALLY, с 256 до 4096 символов;
- максимальное количество элементов структур увеличено с 32 до 256.
- добавлена справка по параметрам компилятора, выводится при запуске без параметров.


Параметры компиляторов PLM80 и ASM80 можно передавать как в командной строке, так и непосредственно в файлах исходников. В последнем случае строка с параметрами должна начинаться с символа '$'. Например:
$code
$macrofile debug xref
Сами параметры делятся на две группы: primary и global. Первые задаются только один раз, до начала компиляции. Второй тип можно использовать много раз, в любом месте исходника.


Чтобы не было путаницы, я изменил номера версий PL/M-90, ASM-80 и LINK.
Для удобства к пакет входит файл SETENV.BAT, задающий переменную окружения %PLM80%, чтобы не выставлять вручную пути до компилятора.


Мои проекты на PL/M:
---------------------------
Плеер музыки формата STC:
https://github.com/MrDemonid/AY-Player/releases

Просмотровщик картинок:
https://github.com/MrDemonid/Image-Viewer-for-PK8000/releases
Поддерживает форматы:
- standart ZX (SCR)
- timex (SCR)
- multicolor (MLT, MC, IFL)
- MSX (SC2)
- ПК8000 (VM2)

Порт игра "Двигалка":
https://github.com/MrDemonid/Dvigalka-PK8000/releases

Порт игры "Bolder Dash":
https://github.com/MrDemonid/Bolder-Dash-PK8000/releases
Собрать можно только новыми компилятором и линковщиком, поскольку в коде присутствуют команды BREAK, а длина строки передаваемых в LINK параметров превышает 128 символов.

andrews
22.12.2022, 20:19
Интерес представляет прежде всего для тех, кому захочется адаптировать PL/M под Z80
о, это отдельная песня! PL/M регистровый и достаточно низкоуровневый язык. А уж его оптимизаторы.
Вот сюда бы для PL/M-80 библиотеку с пзпт добавить. Пока в этом перечне нет FORTRAN-80 тем более интересно.
Можно выдрать ее из исходников BASIC-80.

DemonId7
23.12.2022, 01:52
библиотеку с пзптИзвиняюсь, а о чем речь? Знаю такой термин из электроники, но вряд ли Вы это имели в виду :)

andrews
23.12.2022, 11:12
Извиняюсь, а о чем речь?
поддержка арифметики с плавающей запятой. Сам PL/M их не поддерживает( тип переменных real и арифметические операции с ними), но ничто не мешает прикрутить к нему библиотеку с их поддержкой. Ведь представление этих чисел всего лишь последовательность байт с определенным назначением. Исходники Basic80 на ассемблере доступны в сети. Правда тип лицензии не припомню. Но если использовать в библиотеке, то будет все-равно не так явно, только ее не нужно распространять исходник. Есть конечно еще FPAL.LIB в ISIS, но ее придется дизассемблировать для 8080, а затем уже прикручивать. Можно добавить операции с 24 и 32 битными целыми числами. На реальном железе это будет долго работать, а на 8Мгц fpga 8080 и эмуляторах приемлемо.

DemonId7
23.12.2022, 12:09
Мне казалось, что в первую очередь нужна 32-х битная арифметика. Только я еще не настолько вникал в исходники, чтобы начать такую серьезную переделку. Что касается вещественной арифметики, то есть исходники Basic-E, на PL/M, где эта арифметика вынесена в отдельные ассемблерные модули. Но там хотя бы из комментариев понятно что к чему.
Только в данный момент я готовлю к публикации игрушку на PL/M, плюс следом хочу реверсировать OBJCPM, чтобы полностью избавиться от эмуляторов в пакете. Затем можно и улучшениями заняться. Ну или кто-нибудь желающий может заняться улучшениями, пока я занят другим. Было бы вообще здорово.

andrews
23.12.2022, 12:26
Аппроксимация иррациональных чисел целыми конечно известный прием, особенно если это ускоряет алгоритмы.Но не знаю всех и всегда ли это устраивает?

Я за Basic-E не возьмусь. Уже с Basic-80 ковыряюсь потихонечку. К тому же у меня цель msuvt v7 под эмулятор b2m (https://zx-pk.ru/threads/34668-nasovetujte-prodvinutyj-dizasm8080-s-emulyatorom.html). Это двухконсольная машинка на 8080 без графики. CP/M там нет, поскольку у прототипа не было контроллера дисков.

Образ магнитной ленты есть. Ну и может быть многозадачная примитивная система будет, если Бог даст мне время на это.

Oleg N. Cher
23.12.2022, 19:02
PL/M регистровый и достаточно низкоуровневый язык.Ну может и не столь регистровый, но стек юзает уж точно по минимуму. Им удалось сделать хороший компилятор! И не в последнюю очередь благодаря свойствам языка.

- - - Добавлено - - -

DemonId7, отдельное спасибо за Вашу активность) Здорово, что этим кто-то занялся.

- - - Добавлено - - -

Watcom C странный выбор. Современные GCC и Clang ничем не хуже вроде как? Или то старая любовь? ;)

AlexG
23.12.2022, 19:18
OpenWatcom компактней, работает везде, БЫСТРЫЙ. минимум причуд с оптимизацией кода. Но в нём "не хватает LINT'а"

andrews
23.12.2022, 19:25
Watcom C странный выбор
Зато возможно сей софт откомпилится на моем любимом Digital Mars C/C++ Compiler-е. Сразу скажу я его не выбирал среди других компиляторов. Просто в Мультиком СПб к нему пристрастился. Хотя в других конторах приходилось порой на Borland пересаживаться. У эмбеддеров в Питере в начале 2000-х эти компиляторы были популярны. А станции ЦАТС работали на 186EX и 386EX без дисковых накопителей.
Linux директора на рабочие компы там не ставили.

DemonId7
23.12.2022, 22:38
Watcom C странный выбор
Ничего странного. Он работает везде и без инсталляции. Разархивировал куда-нибудь на диск, подправил в батнике пути и всё. Давно с собой на флешке имею "походный" набор, мало ли где и за чей комп придется приземлиться. А так и чужие компы не засоряю и разворачивается быстро.


Зато возможно сей софт откомпилится на моем любимом Digital Mars C/C++ Compiler-еТут по минимуму нестандартных фичек. В основном ищите по #pragma, которые используются для отмены выравнивания в структурах и для того, чтобы компилятор не ругался на неиспользуемые данные (а таких данных оказалось немало, но оставил ради идентичности). В остальном это стандартный Си и должен подойти к любому компилятору.

Oleg N. Cher
24.12.2022, 05:31
Друзья, приглашаю желающих пообщаться на темы PL/M в группу t.me/plm8080 (https://t.me/plm8080). Особенно конечно интересно пообщаться с практиками, кто пишет на PL/M.


Ничего странного. Он работает везде и без инсталляции.MinGW тоже работает везде и без инсталляции. Можно проинсталлить, можно вызывать так. Можно даже не прописывать в PATH пути к его bin, а указывать полный путь при вызове .exe, так тоже работает.


В основном ищите по #pragma, которые используются для отмены выравнивания в структурах#pragma pack поддерживается, как минимум, в Clang и GCC. Может ещё и в VC, но не уверен.

DemonId7
24.12.2022, 13:44
Выложил в заголовок ссылки еще на два своих проекта на PL/M.



MinGW тоже работает вездеМожет тогда попробуете сделать батники для компиляции MinGW? А я их в начало выложу. Сами исходники вряд ли придется переделывать, они на стандартном Си.

AlexG
24.12.2022, 14:10
#pragma pack есть в watcome, а в gcc его нет.....
там другие "команды" - attrib в место pragm.

Oleg N. Cher
24.12.2022, 23:52
Ну как это нет? Компилится. Работает. Вы наобум говорите или проверяли?

- - - Добавлено - - -

Я проверял. Вот такое компилится в MinGW v8.1.0:


#pragma pack(push, 2)
typedef
struct TestAlign_Rec {
CHAR c;
LONGINT i;
} TestAlign_Rec;
#pragma pack(pop)

AlexG
24.12.2022, 23:58
я про gcc vs watcom

Oleg N. Cher
25.12.2022, 00:32
Вы написали дезинформацию. Как обычно куча мифов в айти. Пишу не то, что есть, а то что мне кажется.

#pragma pack есть в watcome, а в gcc его нет.....А я Вам пишу, что #pragma pack в GCC есть. Проверено. Работает.


там другие "команды" - attrib в место pragm.Угу. __attribute__ там тоже есть. Но и #pragma есть.

Ладно, ушли от топика. Но что-то мне подсказывает, что сильно много обсуждений именно по PL/M не будет :(

- - - Добавлено - - -

P.S. Разрушим мифы! Да, GCC это действительно хороший компилятор! :)

AlexG
25.12.2022, 02:46
нцать лет назад мне нужно было компилить "один исходник" как watcomC так и под GCC. В то время исходник СИ для watcomC не компилился под GCC как раз из-за наличия #pragma pack . Пришлось заменять его на __attribute__. Возможно в GCC и есть прагмы , но только не для "упаковки структур".
ПС: не создавайте "кумиров". И не ляля про мифы.
пспс: скажем так - я может малость путаюсь в показаниях, но на тот момент я не смог написать исходник так чтоб он мог компилиться без изменений под этими двумя компиляторами.

Barmaley_m
25.12.2022, 15:24
нцать лет назад... не компилился под GCC как раз из-за наличия #pragma pack . Пришлось заменять его на __attribute__. Возможно в GCC и есть прагмы , но только не для "упаковки структур".
Так то было давно. Сейчас в GCC есть pragma pack. Постоянно пользуюсь. Уже несколько лет как.

Oleg N. Cher
26.12.2022, 09:02
ПС: не создавайте "кумиров".Ну при чём тут кумиры. Просто надо, чтобы правильная информация распространялась. А то кто-то начитается дезы и поверит, а сам проверять не будет. А про компилеры полно мифов, вспомните срачики какой компиль для Z80 самый лучший.

- - - Добавлено - - -

GCC включали, например, в среду разработки Monkey-X, ибо Monkey-X это транслятор с языка на языки, а не компиль. Так что без инсталляции точно работает. Ну и я проверял. В каком-то смысле не так удобно, как с засовыванием пути к bin в PATH, но зато можно иметь несколько версий и юзать нужную.

DemonId7
28.12.2022, 14:51
Реверсировал OBJCPM. Результат добавил в первый пост. Вроде работает. Плюс добавил новую версию игрушки "Двигалка" - для pfuheprb c магнитофона и компиляции сразу в формат CAS. PL/M действительно хорош для микрокомпов.

mastermind
30.12.2022, 02:22
#pragma pack вообще корнями уходит в MSVC, а не Watcom. В gcc давным давно добавлено для совместимости: https://gcc.gnu.org/onlinedocs/gcc/Structure-Layout-Pragmas.html

DemonId7
07.05.2023, 19:38
Обновил шапку и выложил новую игрушку на PL/M.
К слову, в ходе написания игрушки выяснился любопытный факт: генерируемый компилятором PL/M код примерно в полтора раза короче и, соответственно, быстрее, чем аналогичный код, полученный с помощью z88dk (zcc.exe). Связано с тем, что PL/M не расширяет операции до 16 бит без крайней необходимости, оставляя заботу о переполнении результата на совесть программиста. С одной стороны конечно неудобно и иногда не безопасно, но с другой стороны - результат просто превосходный. Тут главное - навык, а то можно такого понагородить....

Kakos_nonos
07.05.2023, 19:57
Да, компилятор прекрасный!

DemonId7
22.07.2023, 13:44
Обновился компилятор PL/M-80. Подробности в первом посте.
Исправил пару ошибок в компиляторе ASM80 и добавил поддержку unix-формата исходников. Добавил вывод справки по параметрам компилятора.
Подробнее о параметрах в первом посте.