Просмотр полной версии : Разработка для i8080 на языке PL/M
Oleg N. Cher
04.02.2017, 17:45
Для Шынни и всех почитателей ретро-платформ с процессором К580 (i8080):
http://zx.oberon2.ru/forum/viewtopic.php?f=88&t=305
Делитесь, пожалуйста, опытом разработки. Также интересуют любые исходники на языке PL/M. Ссылки тоже приветствуются. А может кому-то удастся собрать окружение для PL/M, с подсветкой синтаксиса, в котором компиляция будет происходить в один клик? Сделать набор библиотек для поддержки каждой из ретро-платформ? Язык выглядит намного более подходящим, чем Си или чистый асм, это как бы синтез.
Ещё интересует компилятор PL/M для Z80.
Какос Нонос поверхностно копнул, и я тоже.
Знакомство с CP/M80 (http://hype.retroscene.org/blog/585.html)
Знакомство с CP/M80: программирование (http://hype.retroscene.org/blog/587.html)
Если Вам не хочется читать, то во втором топике HYPE идет речь о pl/m, я уже упоминал о plmx. Из беглого взгляда получается исходник asm под 8080.
/*попиарился и спрятался в угол.
Oleg N. Cher
04.02.2017, 18:33
Верно ли я понимаю, что упомянутый plmx - это диалект или дальнейшее развитие pl/m?
s_kosorev
04.02.2017, 18:34
Я знал конечно о PL/M, но вот как то руки не доходили посмотреть на него. Спасибо за пост, посмотрел.
Вердикт, скорее всего плохо смотрел, но вот не понял в чем сейчас PL/M может выигрывать в рамках 8бит платформ у Си (под Си будем подразумевать SDCC).
Исходники те что увидел, спокойно перекладываются на Си.
Верно ли я понимаю, что упомянутый plmx - это диалект или дальнейшее развитие pl/m?
Из ссылки:
At the beginning of this year (february 2009) Emmanuel Roche has work to resurrect a "lost" PL/M compiler called PLMX. He do a great job collecting software and examples from Rlee Peter's archives, retyping in full the user's manual and also adding some smart guidelines for CP/M newbies.
Как следует из описания, pl/m был декомпилирован.
но вот не понял в чем сейчас PL/M может выигрывать в рамках 8бит платформ у Си (под Си будем подразумевать SDCC)
часть утилит и ядра cp/m вроде как написана на pl/m
Oleg N. Cher
04.02.2017, 18:45
Понятно, было бы интересно узнать больше об этом компиляторе. На чём написан, кем поддерживается, как юзать и т.п.
s_kosorev, PL/M может выигрывать в рамках 8бит платформ у Си, например, тем, что Си менее эффективен для платформ на базе 8080. Просто по качеству кода.
Понятно, было бы интересно узнать больше об этом компиляторе. На чём написан, кем поддерживается, как юзать и т.п.
читать лень?
Kakos_nonos
04.02.2017, 18:59
Пожалуй, приложу сюда статью из журнала Downgrade и сам компилятор, вот он: https://yadi.sk/d/uL3BhwpF3CqodA
Там в папке samples - небольшой пример, его можно откомпилировать и поиграться
Кросс-компиляторы для Intel 8080
Несколько лет назад меня заинтересовала тема программирования для компьютера Апогей БК-01ц и я стал стал искать средства кросс-компиляции. Кросс ассемблер нашелся достаточно быстро, однако с компиляторами высокоуровневых языков программирования были проблемы. В отличии от Z80, для которого есть масса средств, для I8080 не было ничего пригодного для полноценной работы. Я бросил поиски и стал писать на ассемблере. Однако, недавно я снова взялся за это дело. Дело в том, что я вспомнил про существование CP/M – операционной системы того времени для компьютеров на Intel 8080, и для нее было написано много хороших компиляторов. Надо было найти эмулятор этой системы и как-то организовать «переброс» информации, то есть, чтоб листинг программы из файлов ПК переносился в файлы эмулироемой CP/M, там производилась компиляция и потом, уже откомпилированный бинарник отправлялся в файлы ПК, где мы делали с ним нужные нам действия, например, запускали в эмуляторе. Я начал искать эмуляторы CP/M и обнаружил отличный эмулятор – 22nice, который работает очень необычным образом.
Большинство эмуляторов работают следующим образом – берется образ диска с нужными программами и передается эмулятору. Создается некая песочница – файлы ПК отдельно, а файлы эмулируемой машины отдельно, и из эмулируемой нами машины нет никакой возможности изменить файлы вне образа, и наоборот, у стандартных средств windows нет возможности посмотреть что находится внутри образа. Образно говоря, файловые системы хост- и эмулируемой машины сильно разделены, и обмен файлами затруднен. Однако, 22nice работает по другому. Он не берет образ с CP/M системой, он берет отдельные исполняемые файлы CP/M и генерирует для них исполняемые «оболочки», с которыми можно работать как с обычными MS-DOS приложениями, получаются, как бы, порты CP/M софта под MS-DOS. Например, у нас есть CP/M программа, do.com которая берет файл a.txt, что-то с ним делает и сохраняет как b.txt, и мы хотим запустить ее при помощи 22nice. Для этого, при помощи специальной утилиты генерируется фаил, который мы называем do.com, а оригинальный do.com переименовываем в do.cpm и кладем в эте же директорию. Также, сюда помещаем фаил эмулятора 22nice. Все, теперь можно работать с do.com так, как будто он был написан для дос. Как же это работает? А втот так – при запуске do.com ищется фаил do.cpm, он находится и передается эмулятору 22nice, который уже исполняет находящийся там код. И если в программе есть обращения к диску, то они превращаются в обращения к диску дос, и файлы читаются от туда. То есть, наша программа будет читать фаил a.txt из текущего каталога, а когда что-то с ним сделает, то сохранит b.txt также в текущем каталоге. Короче говоря, действия будут абсолютно аналогичны если б её запускали где-нибудь с 8-дюймовой дискете на Альтаир 8800
Такая система нам очень подходит, так как запустить компиляторы в i8080 не заставит труда, а для CP/M их было написано множеством для раных языков. Я остановился на следующих:
MICROSOFT FORTRAN-80.
Фортран – очень старый язык, имеющий свои особенности. У него непривычный современному программисту синтаксис, однако он является самым быстрым, если нужны программы для наукоёмких вычислений (Например, расчет ядерного реактора), то у фортрана до сих пор нет конкурентов. Однако, эта версия скоростью не блещет. Она показала средние результата, местами быстрее, а местами даже медленнее нижеописанных компиляторов. И вообще, скорости исполнения программ практически одинаковы для всего набора, так что я не буду далее заострять внимание.
Что еще меня расстроило, так это устройство компилятора – он компилирует программу в объектный код, а потом соединяет его с рантайм-библиотекой, размер которой – 6.4 кб! Да, сейчас это кажется немного, но если объем всей памяти – 60 кб, то это уже существенный размер. Даже если вы написали Hello World, размер программы будет также 6.4 кб. Вот пример программы для поиска простых чисел на этом фортране
INTEGER A,B,C,D
5 DO 20 A=2,2000
D=A
B=1
C=1
15 IF (C.EQ.0) GOTO 20
IF (D.LT.B) GOTO 19
B=B+1
D=A/B
C=A-(D*B)
GOTO 15
19 IF (C.NE.1) WRITE(1,100) A
20 CONTINUE
100 FORMAT(5I5)
END
Также, одной из негативных сторон данного компилятора был жесткий синтаксис. То есть, если сделать лишний пробел между командами, то будет ошибка. Сделать пустую строку – ошибка. Пробелы вместо табуляции – также ошибка. В общем – не пойдет.
PL/1-80
Данный язык печально известен своей громоздкостью. Он появился так – в 60-х годах было два основных языка –КОБОЛ, на котором писали финансовые программы и ФОРТРАН, на котором писали научные. Было решено сделать новый язык, который объединял бы возможности этих двух языков, в итоге получился монстровский язык, стандарт которого был очень длинный и запутанный, так что ни один компилятор не поддерживает все его возможности. А их у него много – поддержка рекурсии, структурного, модульного программирования, длинной арифметики, многозадачности, форматированного вывода.
Если говорить о компиляторе для CP/M, то он намного лучше фортрана – есть свободный синтаксис, больше возможностей, да и вообще, язык удобней. Размер рантайм-библиотеки практически такой же – 6.5 кб. Однако, что интересно, в комплекте с компилятором шло несколько примеров, среди них – шахматы - 900+ строк. После компиляции размер программы был (вместе с рантаймом) всего 12 кб, то есть, плотность кода высокая – компилятор хороший. Вот программа для поиска простых чисел.
dtest:
proc options(main);
dcl (a,b,c,d) int;
do a=2 to 2000;
d=a; b=1; c=1;
do while ((d>b)&(c~=0));
b=b+1;
d=a / b;
c=a-(d*b);
end;
if (c~=0) then put skip list(a);
end;
end;
end dtest;
Однако у языка есть и недостатки – во первых, как уже говорилось выше – перегруженность. В языке много средств, которые не понадобятся при программировании для intel 8080, однако они там есть и сидят в памяти. Во вторых, я не нашел в языке команд для низкоуровневой работы - прямой доступ к памяти, ассемблерные вставки. Это очень большой минус, так как мы много чего не сможем сделать, например, в случае с Апогеем БК-01 нарисовать что-нибудь на экране, воспроизвести звук, ничего кроме алфавитно-цифрового ввода/вывода. Печаль
PASCAL/MT
Паскаль, мой любимый язык, сколько строк кода я на нем написал и продалжаю писать. И для CP/M он тоже есть. Вообще, есть даже Turbo Pascal, но он требует процессора Z-80, а нам нужен i8080. Поэтому я выбрал PASCAL/MT. Он достаточно быстрый, имеет много функций — как и высокоуровневых, так и низкоуровневых. Все бы хорошо, кроме одного но — рантайм библиотека размером 16 кб. И это без плавающей арифметики, с ней — 25. Это очень много, практически половина оперативной памяти уходит разом и для самого кода и данных остается мало времени. Также, получаемый код очень трудно отлаживать, постоянные вызовы подпрограмм сильно сбивают с толку. Вот аналогичная программа:
program demo;
var a,b,c,d:integer;
begin
for a:=2 to 2000 do
begin
d:=a;
b:=1;
c:=1;
while (d>b)and(c<>0) do
begin
b:=b+1;
d:=a div b;
c:=a-(d*b);
end;
if c<>0 then writeln(a);
end;
end.
Все плохо?
Мы просмотрели все основные решения компиляторов и ничего не нашли, что действительно все так плохо? Почти. Я тоже сначала впал в уныние и разуверился в жизни, но потом прочитал что сама ос CP/M была написана не на ассемблере, а на языке PL/M. Хм, написано что язык был разработан специально для микрокомпьютеров, в отличии от других языков, которые разрабатывали для больших рабочих станций. Все силы были брошены на поиск его компилятора для i8080. Постепенно находилось о нем все больше и больше информации, и в итоге, на одном непримечательном сайте был найден исходник оригинального компилятора PL/M 1974 (!) года в виде исходника на фортране, который был сконвертирован в си и скомпилирован современным компилятором для windows. Эта была хорошая новость, но недолго. Компилятор был очень старым (1974 год же), стандарты и методы работы сильно отличались от современных, адаптироваться. Во первых, транслятор ничего не выводит на экран, весь обмен идет с файлами fort.1 … fort.12. Исходник читается из одного файла, байт-код переносится в другой фаил, логи — в третий, ошибки — в четвертый и т. д. Также, своеобразным был формат выходного hex-файла, пришлось написать свой hextobin. После всех мучений и изучения документации была написана знакомая на программа для поиска простых чисел, вот она:
DECLARE (A,B,C,D) ADDRESS;
DO A=2 TO 2000;
D=A; B=1; C=1;
DO WHILE ((D>B) AND (C<>0));
B=B+1;
D=A / B;
C=A-(D*B);
END;
IF (C<>0) THEN CALL PUTCH(51);
END;
GOTO 63605;
EOF
Если вы внимательно смотрели предыдущие исходники, то наверняка заметили что PL/M очень похож на PL/1, практически один язык. Да, синтаксисом они похоже, но только им. Внутри это абсолютно разные языки, с разной парадигмой и сферами использования. PL/1 – это мощный, всеобъемлющий язык. А — PL/M – маленький, компактный, быстрый, в нем всего два типа данных — BYTE и ADDRESS. Я откомпилировал эту программу, и, о чудо! Размер бинарника — 254 байта. А если посмотреть в hex-редакторе, то оказывается там внутри почти половина нулей, т. е. Компилятор подгоняет размер до 256 байт. Это лучшее значение из всех, было решено зять этот язык на вооружение и развивать его.
PL/M Super Compiler
Однако, в данном трансляторе было несколько недостатков -
- Программа должна быть написана большими буквами.
- Не было модульности — вся программа должна быть одним большим исходником.
- Отсутствовали ассемблерные вставки.
- Точка с запятой в конце каждой строки.
Немного подумав было решено сделать для компилятора обертку, которая будет лишена этих недостатков. В итоге должен получиться Super PL/M Compiler. :-)
В качестве скриптового языка я выбрал Lua. Этот язык очень маленький (интерпретатор весит 200 кб), простой, быстрый и имеет богатый функционал. Первый недостаток — обязательный капслок был решен просто - переводим все в верхний регистр и готово. Дальше — посложнее. Модульность можно сделать просто объединив несколько файлов в один, однако возникает загвоздка — в случае ошибки в коде компилятор выдаст номер строки, но это будет строка в объединенном файле, и в каком из исходных файлов эта ошибка была и где - не узнать. Проблема решилась так — когда файлы объединяются, создается таблица, где заданы соответствия: номер строки объединённого файла – наименование исходного файла и номер строки в нем. После этого, в случае ошибки мы можем узнать в каком из исходных файлов она произошла и где.
С ассемблерными вставками было достаточно много мороки. Ведь надо не просто чтоб модно было писать на ассемблере и на PL/M, надо и чтоб переменные, объявленные в одном языке виделись в другом. Как вообще работает добавление ассемблерных вставок? Вот так — есть специальные команды — asm и endasm, между которыми пишется ассемблерный код. Как их обрабатывает парсер: сначала создаются пустые файлы out.plm и out.asm. Сначала строки кода переносятся в out.plm, но если встречается команда asm, то вывод переключается на out.asm и так до тех пор, пока не встретится endasm. Потом все повторяется с начала. Итого, на выходе у нас 2 файла — в одном у нас ассемблерная часть исходника, в другом — PL/M код. Но эти два исходника изолированны — мы не можем сделать JMP из одного в другой и прочитать значение переменных из другого.
Для этого авторы компилятора нам помогли. Когда происходит сборка, то создается файлик, в котором описаны все переменные и процедуры и их адреса, вот так:
5 MEMORY 00100H
24 PUTCH 00006H
25 P 000F5H
27 UKR 000F6H
28 OUTS 000F8H
37 PRINTSTR 0001FH
38 A 000FEH
А когда происходит сборка ассемблерной части программы, то тоже генерируется файл, из которого можно узнать все метки, объявленные в нем. Что мы делаем дальше — мы приписываем к PL/M-части исходника заголовочную область, где описываем метки из асма с адресами, а к ассемблерной части — заголовочник, где описываем все PL/M переменные. Таким образом мы можем обращаться к пермеменным и процедурам, объявленным в другой среде.
После того, как листинги сформированы, они компилирутся каждый своим компилятором и объединяются в один файл, к которому мы приписываем заголовки, в зависимости от компьютера и запускаем.
Для примера, вот программа, где используются большинство функций данного компилятора.
putstr: procedure (uk)
declare uk address
goto printstra
end
asm
printstra:
mov h,b
mov l,c
jmp 0f818h
endasm
call putstr(.(‘HELLO WORLD’,0))
Здесь используются как средства самого PL/M, так и Super PL/M Compiler. Мы делаем ассемблерную вставку, где вызываем подпрограмму биоса компьютера Апогей-БК-01ц для печати строки. Конструкция .(‘HELLO WORLD’,0) означает разместить в памяти строку HELLO WORLD (с нулём в конце) и возвратить на неё адрес. Далее, этот адрес мы передаем в процедуру putstr, которая передает управление ассемблерной вставке. Далее, надо знать особенности компилятора. Если у процедуры один параметр типа address, то он помещается в регистровую пару bc, а подпрограмма биоса для вывода строки требует параметры в hl. Мы переносим параметры в нужные регистры, и передаем управление системной процедуре, которая уже печатает строку.
Что дальше?
Данная сборка имеет очень большой потенциал, с помощью её можно написать хорошие программы, игры и при том не сложно. Язык PL/M очень простой, в нем мало конструкций, но они очень ёмкие и позволяют делать интересные приёмы. А добавить к нему современные средства сборки, добавить ассемблера, то получится вообще супер!
На данный момент система еще находится в разработке, отлавливаются баги и пишется библиотека — пока для компьютера Апогей БК-01ц, а далее - и для других компьютеров.
Подсветка синтаксиса PL/M есть в vim/gvim в стандартной комплектации.
не понял в чем сейчас PL/M может выигрывать в рамках 8-бит платформ у Си
Языки FORTH, PL/M и PL/1 это единственные языки высокого уровня, которые имеют смысл для низкоскоростных 8-ми разрядок. FORTH отпадает, - его программа содержит ядро, отчего программа на ассемлере из нескольких байт на форте занимает 10 Кб. PL/M и PL/1 близки к машинному языку, оттого эффективны. Программы на них уступают в скорости и объёме кода ассемблерным всего в 1.5-2 раза. Объём кода на более современных ЯВУ получается в 4-8 раз больше и во столько же раз меньше скорость, что делает их использование для серъёзных программ бессмысленным. Для 8-ми разрядок не было написано ни одной серьёзной программы на СИ, ПАСКАЛЕ, ФОРТРАНЕ или АДЕ. Объём кода с ростом функциональности программы быстро достигает допустимого максимума. Даже переписывание СИ-процедур на ассемблер не спасает. Потому ЯВУ на 8-ми разрядке пригодны только для обучения и для разработки несложных инструменальных программмок, типа конверторов.
Потому поднятая тема очень актуальна. К сожалению для PL/M и PL/1 трудно найти учебную литературу. Можно найти лишь примеры исходников на иностранных сайтах о CP/M. Например, утилиты CP/M написанные на PL/M. Просьба ко всем выложить ссылки на учебники по PL/1 или PL/M.
Просьба ко всем выложить ссылки на учебники по PL/1 или PL/M
http://lmgtfy.com/?q=pl%2Fm80+manual
http://www.autometer.de/unix4fun/z80pack/doc_cpm_plm.html
http://www.computer-museum.ru/histsoft/plm.htm
Oleg N. Cher
04.02.2017, 22:44
Я не соглашусь с этими тезисами barsik'а. Но по порядку.
Ядро Forth-программы на 10 кб - это особенности конкретной реализации Форта. Мне попадались реализации, которые включали в целевой код только используемые слова (по-моему, Черезов писал специальный оптимизатор для Форта), и код был сотни байт. Разумеется, для 8-биток имеют смысл только реализации, основанные не на прямом или косвенном шитом коде, а на подпрограммном. Была такая одна реализация, с которой я работал на своём первом компе - HL ZX Forth. Так что всё дело в том, что нужно делать свою новую реализацию, благо, это сравнительно несложно. Но меня Форт-языки не очень интересуют. Там огромная разнопёстрость, а низкий уровень всё равно прёт из всех щелей, думать при написании кода приходится о вещах, не относящихся к предметной области и т.д.
О том, что PL/1 даёт более компактный и быстрый код, чем Паскаль или Си - это смешное утверждение. Опять же, говорим о конкретных реализациях. Ведь: чем принципиально PL/1'ное "a+b" отличается от такого же "a+b" на Си?
PL/M - да. Хотя написанная на нём программа лучше подлежит ручной оптимизации, чем на PL/1. Всё-таки PL/M более низкоуровнев. И более подходящ для 8-биток.
Я успешно использую Оберон для разработки под Z80, хорошо получается. Си тоже весьма хорош, хотя конечно он - не асм. PL/M видится где-то между. Т.е. было бы интересно покодить на PL/M для Z80, но только для чего-то небольшого. Для проектов побольше я всё равно взял бы Оберон + асм.
Black Cat / Era CG
04.02.2017, 23:21
Подсветку синтаксиса (если есть вся исчерпывающая по нему инфа не размазанная по сотням страниц) прикрутить к любому редактору (коих тма) несложно, заставить этот редактор вызывать по горячей клавише компилер (если он есть) тоже не проблема.
Oleg N. Cher
05.02.2017, 00:27
Язык ПЛ/М – это семейство машинно-ориентированных языков (ПЛ/М-80, ПЛ/М-86, ПЛ/М-286, ПЛ/М-386, ПЛ/М-51 и ПЛ/М-96) высокого уровня для программирования однокристальных ЭВМ, микропроцессорных контроллеров и систем. Цифры в названиях языков указывают на базовый тип поддерживаемого микропроцессора. Как правило, существует несколько реализаций каждого из перечисленных языков, включая кроссовый вариант. Языки семейства ПЛ/М имеют блочную структуру, строго типизированные данные и внешний набор библиотек ввода-вывода. При всеобщем увлечении языком Си следует отметить, что ПЛ/М проще, надежней, читабельней, лучше учитывает специфику программирования перечисленных выше систем и архитектурные особенности микропроцессоров, для которых он реализован.
Э. М. Пройдаков. Использование макроопределений в языке ПЛ/М (http://www.computer-museum.ru/histsoft/plmmacro.htm)
Про компилятор PLMX (http://z80cpu.eu/roche-pages/81-data-articles/roche/88-the-plmx-compiler), где его можно и скачать. Я скачал. Кто-нить ковырялся с с этим чудом?
сайтик таки рухнул похоже
файлы тут:
https://yadi.sk/d/mvUlKsHt3CupYG
docs.zip - описание использования Intel'овского компилятора.
простая программа:
MY:
DO;
DECLARE
ENDFILE LITERALLY '1AH', /* END OF FILE MARK */
JMP LITERALLY '0C3H', /* 8080 JUMP INSTRUCTION */
RET LITERALLY '0C9H'; /* 8080 RETURN */
MON1: PROCEDURE(F,A) EXTERNAL;
DECLARE F BYTE,
A ADDRESS;
END MON1;
PRINTCHAR: PROCEDURE(CHAR);
DECLARE CHAR BYTE;
CALL MON1(2,CHAR AND 7FH);
END PRINTCHAR;
CRLF: PROCEDURE;
CALL PRINTCHAR(13);
CALL PRINTCHAR(10);
END CRLF;
PRINT: PROCEDURE(A);
DECLARE A ADDRESS;
/* PRINT THE STRING STARTING AT ADDRESS A UNTIL THE
NEXT DOLLAR SIGN IS ENCOUNTERED */
CALL CRLF;
CALL MON1(9,A);
END PRINT;
CALL PRINT(.('HUllo$'));
END MY;
далее - runcpm plmx hullo.plm
Oleg N. Cher
05.02.2017, 16:57
А что за эмулятор runcpm? Тот, что использую я, называется cpm.exe (для Win32), есть ещё 22nice (для DOS).
А что за эмулятор runcpm? Тот, что использую я, называется cpm.exe (для Win32)
да, программа cpm.exe, проект тут:
https://sourceforge.net/projects/runcpm/
22nice не использовал, мне больше понравился z80emu (http://www.shaels.net/index.php/z80emu/z80emu-general/27-z80emu-overview). С дисками придется повозиться, но для экспериментов годно.
Oleg N. Cher
05.02.2017, 23:59
Посмотрел исходники компилятора PL/M на FORTRAN'е. Мда. Легче застрелиться, чем разобраться в них. Всё-таки Фортран смотрится очень архаично, даже компилятор на самом PL/M был бы намного понятнее. В PL/M есть архаичные моменты, но они не столь существенны. Оберон, тоже старый язык, вообще выглядит на их фоне свежо и бодро.
Шынни, у Вас есть мысль написать что-то определённое на PL/M или так просто ковыряете? На правах интереса к раритету.
Шынни, у Вас есть мысль написать что-то определённое на PL/M или так просто ковыряете
может быть. Сейчас есть другие задачи и проекты. Найдется время и появится желание - можно будет заняться.
Посмотрел исходники компилятора PL/M на FORTRAN'е
Эти (http://urls.net.ru/computer/programming/plm/) ?
Oleg N. Cher
06.02.2017, 15:43
Угу.
Я, конечно пессимист, стакан всего наполовину, но если был бы интерес, то попытался бы скомпилировать.
Oleg N. Cher
06.02.2017, 18:02
Kakos_Nonos'у это удалось - скомпилировал для Win32. Ещё в сети удалось найти бинарь этого же компилера, собранный для DOS.
[...]
Далее, надо знать особенности компилятора. Если у процедуры один параметр типа address, то он помещается в регистровую пару bc, а подпрограмма биоса для вывода строки требует параметры в hl. Мы переносим параметры в нужные регистры, и передаем управление системной процедуре, которая уже печатает строку.
А можно чуть подробнее про особенности?
Информацию о передаваемых параметрах вы нашли в литературе или через анализ кода?
Вот нашел у себя в закромах. Есть парсер и анализатор.
- - - Добавлено - - -
barsik, Basic-E на языке PLM, интересует?
Oleg N. Cher
23.03.2017, 20:34
Я не barsik, но интересует!
В общем за последние 20 лет никто так и не нашел,и не выложил в сеть исходников PL/M для z80. Вероятнее всего они были похерены окончательно где-то в ГДР в эру до интернет. Исходники на Фортране действительно жуть. Проще их сначала переписать или на Free Pascale или на Python, и только после этого из них что-то ваять. PL/M80 и PL/M51 у меня есть под ISIS-II, а он эмулируется под ДОС, но они тоже не исходники, и оптимизация еще та в них.
Smalovsky
26.06.2019, 16:15
Чтобы не делать лишнюю тему, пишу тут.
Я узнал что для z80 есть компилятор pl/i. Правда, компилятор cp\m. Однако, многие приспособили си кп\м для спектрума, так как компилирует в любойй адрес.
Может, такое прокатит с pl/i?
http://www.z80.eu/pli.html
Немного справочной информации.
pli был и есть одним из системных языков программирования. До сих пор он используется в ibm для z/os .
https://www.ibm.com/ru-ru/marketplace/ibm-pli-compiler-family
pli использовался в разработке ОС Multics.
Остался один последний беларуский партизан программирующий на pl/i.
http://www.pl-i.ru/
Smalovsky
03.07.2019, 19:42
Запустил PL/I для CP\M в CPMBox. Вызвал компилятор без файла для компиляции.
Может, посоветуете какие-нибудь другие эмуляторы CP/M? Есть ли какие утилиты для работы с образами дисков на писи?69437
Smalovsky, Я выкладывал эмулятор СРМ вот в этой ветке (https://zx-pk.ru/threads/30597-emulyator-cpm-text-only.html).
Работа показана во вложении.
Запустил PL/I для CP\M в CPMBox. Вызвал компилятор без файла для компиляции.
Почитай доки что ли. CP/M box позволяет использовать RAM-disk - получишь диск M:, нужно указать папку в настройках. Эмулятор убогий, так как не пишет на образы дисков, все попытки скатятся к нулю. Как вариант - возьми JoyCE (http://www.emutopia.com/index.php/emulators/item/312-amstrad-pcw/471-joyce). Разобраться сложно, но возможно.
С дисками работает z80emu (http://www.shaels.net/index.php/z80emu/z80emu-general/27-z80emu-overview)
c pl/i не знаком, я возился с pl/m (https://scepticalinq.blogspot.com/2016/12/cpm80.html)
Есть еще win32- эмулятор - cp/m player, но реализован через жопу, проще поиграть с другими.
Может, посоветуете какие-нибудь другие эмуляторы CP/M?
Попробовал свой консольный эмулятор 8080 emuc (http://bashkiria-2m.narod.ru/files/emuc.rar), вроде работает. Пришлось немного допилить, link не работал, т.к. перемещал открытый FCB в другое место.
Отличие моего эмулятора - не нужны образы дисков, файлы читаются/пишутся прямо из каталога. Можно каждую команду отдельно запускать, а можно запустить CCP и работать "как-будто" в CP/M.
По поводу языка PLI(PL1) вот статья (https://pl1.su/pochemu-chert-vozmi-pl-i-2/)о его создании для I8080 и его возможности .
Oleg N. Cher
01.10.2019, 01:47
И шоб сильно не заоблизываться на PL/1 для 8080, внесём ясность. Какос его запускал и утверждаает, что там нет беззнаковых типов, а ко всем программам пристёгивается большой рантайм. А так - почти тот же PL/M.
Но самый большой недостаток - нету исходников. Нельзя разрабатывать дальше. Тогда как для PL/M они есть. И PL/M 4 берёт из рантайма только то, что реально использует, т.е. можно сделать прогу размером в несколько байт.
Kakos_nonos
01.10.2019, 13:43
Да, вообще pl/m это версия pl/1 для микрокомпьютеров. Тот же синтаксис, но внутри все адаптировано для маленьких машин, в то время как pl/1 - для меинфреймов. Я его запускал и не видел больших преимуществ разработки на нем. Слишком высокоуровневый. Возможно, я работал с каким-то другим компилятором, был бы рад изучить более подробно.
С pl/m такие дела. Сделал систему библиотек, можно подключать дополнительные файлы и разные платформы. Например, вот есть код:
70159
Результат компиляции:
70161
А теперь, если поменять rk на zx
70160
Но работы еще много, надо все отладить, написать примеры, сделать библиотеки для популярных компьютеров и т д.
Да, вообще pl/m это версия pl/1 для микрокомпьютеров.
Это, по моему, не совсем так. В каком году появился PL/M? и в каком году появился PL/1?
Поэтому PL/M НЕ может быть версией PL/1. Да это язык более высокого уровня, чем PL/M
и он не предназначен для программирования железа, для этого есть ассемблер.
Он наиболее удобен для программирования баз данных, обработки строковых данных
и двоично-десятичной арифметики(бухгалтерия). Посмотрите примеры в его описании.
Это, по моему, не совсем так. В каком году появился PL/M? и в каком году появился PL/1?
Поэтому PL/M НЕ может быть версией PL/1. Да это язык более высокого уровня, чем PL/M
и он не предназначен для программирования железа, для этого есть ассемблер.
Он наиболее удобен для программирования баз данных, обработки строковых данных
и двоично-десятичной арифметики(бухгалтерия). Посмотрите примеры в его описании.
PL/M создан в основном для задач управления на основе микропроцессоров и микроконтроллеров. Но ничто не мешает подключить к нему необходимые библиотеки, написанные на чем угодно, хоть на Фортране 80. PL/I-80 судя по мануалу от Digital Research уже был в 1980 г. Он тоже был специально создан для микропроцессорных систем с ОС CP/M
Smalovsky
27.02.2020, 20:56
Узнал, что CPM стала штатной ОС для спектрумнекста.
https://idpixel.ru/news/1957-dolgozhdannyj-kompjuter-zx-spectrum-next-nakonecto-vyshel/
Что это значит? Это значит, что для некста можно использовать крутейшие компиляторы.
Пока я хочу посмотреть PL I. Ознакомиться с возможностями языка. Хочу узнать, млжно ли на PL I делать ассемблерные вставки,или там можно вызывать машкод.
Кто хотел исходники PL/M на PL/M-е? Вот здесь (https://github.com/assinie/PL65), правда PL/65. Про PLMX нашлось вот такое описание (https://www.retrotechnology.com/dri/infow_plmx.txt).
Oleg N. Cher
21.08.2024, 01:29
Только вот наверное это всё-таки не PL/M на PL/M'е, а PL/65 на PL/65. Хотя расширение исходников .plm, но внутри что-то странное, какая-то смесь с ассемблером.
PL/65 весьма отличается от PL/M. Его нельзя считать даже диалектом PL/M, это просто другой язык.
Поправьте, если я ошибаюсь.
Поправьте, если я ошибаюсь
Увы, не ошибаетесь. Я понадеялся, что кто-то переписал PL/M на PL/M с возможностью адаптации под любой 8-32 битный микропроцессор.
Oleg N. Cher
30.08.2024, 00:26
Ну... под любой - эк Вы, батенька, подзагнули. Прям LLVM или GCC хотите, во всяком случае по масштабу.
PL/M - не такой уж и интересный язык для написания кода. Гор готового кода, чтобы ратовать за совместимость, на нём нет. Писать тяжело, отдаёт архаикой. Тот же Context поприятнее, особенно если его грамотно доработать.
TinyContext почти для всех интересных процев есть, и всё осязается одним мозгом в разумное время.
PL/M также и не самый лучший язык, чтобы писать на нём компиляторы. Если нет специальной задачи, чтобы компиль работал прямо на ретро-железе, то лучше его писать на языке как можно более высокого уровня.
Единственное достоинство PL/M - наличие хорошего компилятора для 8080. И только для него. Для остальных процев PL/M нет, во всяком случае, в доступе.
Если кто-то собирается мне рассказать про PL/M-86, то я в курсе. Но для 6502 или PDP-11 нет. Даже для Z80 нет (может где-то и есть, но не у нас).
эк Вы, батенька, подзагнули
идея ведь не моя. Это единственный в мире язык уровня ЯВУ- или MASM+, активно использующий регистры конкретного MCU и оптимизацию. Арифметика и логика, не каждому новичку доступные на ассемблере и примитивная обработка строк, прямое обращение по адресам( где могут быть процедуры монитора и системные переменные), условная компиляция, определение собственных макро. Размещение по конкретным адресам фрагментов кода. Да в каких-то версиях компиляторов С, работающих со стеком это тоже доступно. Но в целом это альтернатива С. И не такая как FORTH. Работа с внешними модулями и с библиотеками, написанными на других языках. Хорошее отображение всех нюансов построения выходного кода после LINK и LOCATE, включение и отключение отладки даже на уровне исходного кода для компилятора. Да, для Z80 никто версии не видел. Да, если она и была, так ли хорошо она могла использовать все регистры и все недокументированные команды z80? Компилятор PL/M-86 хороший мостик в мир кросс-компиляторов PL/M, написанных на PL/M.
TinyContext конечно хорош, но где там кодогенерация для всех регистров z80 и использование недокументированных команд?
Oleg N. Cher
01.09.2024, 03:08
Ну упс, TinyContext это о простоте, а использовать все тонкости Z80 сложно...
Насчёт условной компиляции в PL/M не уверен. Вы знаете, как доступные компили PLM и PLMX компилят такое?
if 1 = 1
А вот примерно так:
MVI A, 1
CP 1
...
Условная компиляция конечно может быть как расширение компилятора, но в контексте PL/M о ней мало кто слышал ;)
- - - Добавлено - - -
Архаичность его убивает весь лично мой интерес. Писать на нём громоздко и сложно, поверьте. Наверное на асме в каком-то смысле проще, ибо более предсказуемо.
Архаичность его убивает весь лично мой интерес
Я был свидетелем того, как мои коллеги в начале 80-х в течение почти 10 лет разрабатывали на нем втроем проект САУ установкой для получения бесдислокационных монокристаллов кремния с использованием телевизионного датчика зоны расплава. У них было несколько версий и десятки модулей в отдельных исходных файлах. Рекомендацию использовать PL/M-80 они получили или в главке, или во ВНИИЭСО. Правда RMX-80 они почему-то не стали использовать, хотя и напрашивалось такое решение. Та аппаратура была громоздка. А вот если хотя бы та процессорная плата от МСУВТ В7, ПМВ01 была бы в чипе( 8080+8228(или 8238)+8224+8251+8253+8259+формировател ь шины с возможностью вешать внешнюю память и параллельно такие же чипы) и к ней среда разработки с PL/M-80 то и на практике имело бы смысл использовать. Все умощнение MCU для многих практических задач весьма избыточно. А в AVR и Microchip-ах на ранних стадиях даже C не всегда проходил. Использовать же распространенное процессорное ядро 8080 в контроллерах было коммерчески не обоснованно. Для разработчиков на традиционных микро-ЭВМ ( в режиме управляющих ЭВМ) было бы удобней использовать привычные программные средства. Когда была возможность использовать PL/M-80 и C в системах, где не было графического дисплея, то выбирали, как не странно, PL/M-80. Ведь если CPU был CISC, а не RISC - то странно было бы не использовать это( огромное количество регистров и богатую систему машинных команд). Ну а в C почти всё было заточено под использование стека. И брали в этом случае "переносимостью", хотя иногда все-равно приходилось "допиливать" исходники.
Архаичность мой интерес никогда не убивала. Если прошлое решение в чём-то было почти идеально, то не использовать его в будущем весьма странно. Гениально как водяная мельница. Никаких лишних промежуточных звеньев. На входе вода, на выходе мука. Никакого сперва с помощью генератора получаем электричество -затем с помощью мотора его расходуем, теряя по пути кучу энергии.
- - - Добавлено - - -
Условная компиляция конечно может быть как расширение компилятора, но в контексте PL/M о ней мало кто слышал
к сожалению документ от ВНИИЭМ переводной про условную компиляцию у меня не сохранился. А в инете сейчас ссылок нет на оригинал "PL/M-80 compiler operator's manual" Intel 1977 где это могло быть описано.
Остается довольствоваться этим. "PL/M-86 COMPILER OPERATING INSTRUCTIONS for 8O8O/8O85-Based Development Systems" в параграфе 3.10 Conditional Compilation Controls
$IF' DEBUG = 1
CALL PRINT$DIAGNOSTICS (TRUE, FALSE);
$ RESET (TRAP)
$ELSEIF' DEBUG = 2
CALL PRINT$DIAGNOSTICS (TRUE, TRUE);
$ RESET (TRAP)
$ELSEIF DEBUG = 3
CALL PRINT$DIAGNOSTICS (TRUE, TRUE);
$ SET (TRAP)
$ENIHF
и экспериментировать.
Увы, не ошибаетесь. Я понадеялся, что кто-то переписал PL/M на PL/M с возможностью адаптации под любой 8-32 битный микропроцессор.
а xpl0 не замена?
к сожалению документ от ВНИИЭМ переводной про условную компиляцию у меня не сохранился. А в инете сейчас ссылок нет на оригинал "PL/M-80 compiler operator's manual" Intel 1977 где это могло быть описано.
Доброго вечера!
Имеется в виду этот документ?
ISIS-II PL/M-80 Compiler Operator’s Manual 9800300C
https://mark-ogden.uk/files/intel/publications/9800300-03%20ISIS-II%20PLM-80%20Compiler%20Operators%20Manual-Apr81.pdf
PS: Посмотрел, это для ISIS-H Operating System https://www.retrotechnology.com/restore/isis.html
Вот ещё интересный сайтик https://bitsavers.org/
Исходники всякие, есть и под Z80 и по PL/M
https://bitsavers.org/bits/CPM_bitpile/hacker_stuff_box_2/
вот ещё в разделе http://bitsavers.org/pdf/intel/PLM/
http://bitsavers.org/pdf/intel/PLM/98-103A_PLM_CompilerOperationsMan_1975.pdf
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot