А улучшенный PL/M, т.е PLMX с оптимизацией кода, ещё более эффективен.
Не знал про PLMX, надо будет глянуть.
Но самое главное в том, что PLMX работает в CP/M
Сейчас уже, думаю не так важно, сейчас можно делвть кросс-компиляцию, писать в удобном редакторе и запускать эмуль хоть каждую секунду по F5.
Но оригинальной версии компилятора PL/M для CP/M до сих пор нет.
Тот, что я нашел, был странслирован с фортрана в си, а из него уже в екзешники. Можно поробовать эти си-файлы скомпилировать в си.
Последний, к сожалению, пока непонятно как переделать, чтобы транслировал не в формат RKA, а в формат RKS
Там во втором Lua-исходнике есть команда makerka. Она создает rka-начало и rka-конец. (golova.bin и hvost.bin) Потом эти части соединяются с бинарем программы (точнее двумя - один из оттранслированного пл/м, а другой - из ассемблерных вставок.)
Можно переписать для специалиста/ориона, надо только знать формат их файлов.
Кроме того, неудобно использовать TASM вместо нормального макроассемблера от Microsoft.
Можно заменить, там особо сложного нет, луа скрипты несложные, как бейсик или паскаль.
Возможно и TASM позволяет оперативно менять мнемоники в самом исходнике, но это неизвестно.
В тасм можно подключать TAB файлы, описывающие ассемблер, и так можно кодить под любой проц.
Мне кажется, что компилятор PLMX из 1980 более выгоден, чем компилятор PL/M из 1973 года.
Да, я сейчас делаю транслятор паскаля, это будет еще удобнее, так как порог вхождения будет минимальный (почти все с паскалем баловались), а качество кода - на уровне (будет использоваться трансляция в си, а потом в асм, си будет использоваться от винксру, а оно хороший код генерирует.)
А главное, можно прилинковывать свои процедуры странслированные любым ассемблером,
Тут тоже можно, оттранслировать любым асмом, и подключить бинарь к исходнику, правда, с адресами будет морока, но можно. Но, в принципе, особо нет проблемы подключить другой асм, просто везде заменить Тасм на что-то другое, параметры вызова поменять, и все.
Вот код компиляции
Код:
init()
os.execute('tasm -85 out1.asm >nul') транслируем асмовый код в бинарь, заодно в LST копируются адреса всех меток и переменных.
getlabels() Достаем метки из листинга
os.execute('copy /b head.plm + out1.plm fort.2 >nul') Помещаем плм-исходник (приведенный к нужному виду, с добавленными метками из асма) в фаил, который компилирует плм-компилятор
doplm() Компилируем плм
prsplm() Смотрим, были ли ошибки
ff=io.open('fort.17')
getvar() Достаем переменные, созданные плм-ом, чтоб вставить в асм исходник
os.execute('copy /b vars.asm + out1.asm out2.asm >nul') Помещаем эти переменные в асм-исходник
saveplm() Сохраняем откомпилированный плм-ом код в бинарь (он выдает хекс)
ff:close()
os.execute('tasm -b -85 out2.asm >nul') Компилируем асм (опять, теперь с подключенными переменными из плм-а)
prsasm() Смотрим, были ли ошибки
makerka() Делаем заголовок и конец рка-файла
os.execute('copy /b golova.bin + out2.obj + plm.obj + hvost.bin out.rka >nul') Соединяем все (начало рка, асм-часть, плм-часть, конец рка)
print('Done. '..counby..' bytes.')
os.execute('del *.lst *.obj fort.* *.asm *.plm *.bin')
Вот так. Благодоря этому можно писать на плм, на асме и переменные из асма доступны в плм и наоборот.
- - - Добавлено - - -
А это как раз потому, что на ассемблере программировать сложнее
Да, я тоже забросил один хороший проект, потому что не осилил тысячи асмовых строк.
Стандарт PL/M предусматривает наличие точки с запятой после оператора. Если это убрано (видимо подставляет препроцессор), то в одной строке д.быть всего один оператор.
Да, препроцессор добавляет точку с запятой в конце.
Можно писать несколько команд в строчку, ставя точку с запятой между ними.