Использование ЯВУ для разработки программ для РК86

Перейти вниз

Использование ЯВУ для разработки программ для РК86

Сообщение  barsik в Чт Сен 07 2017, 15:07

Общеизвестно, что программирование на ассемблере очень неэффективно. В книге Эльфринга написано, что хороший программист в среднем за рабочий день создает всего 100 строк исходного текста (а программа объёмом в 14 кб имеет исходник в 7000 строк ассемблера). Понятно, что набрать в редакторе за один день можно и тысячи строк, только проблема в том, что это точно не будет работать.

Т.к программирование на ассемблере очень чревато ошибками, то требуется обязательно тестировать любую процедуру написанную на ассемблере. И в случае ошибки, приходится выяснять проблему путём долгой и кропотливой возни с отладчиком. Так что неэффективность ассемблера объясняется вовсе не сложностью хранить в голове конструкции, форматы данных, адреса и т.п (это-то как раз не проблема), а главным образом в том, что очень легко ошибиться, а найти потом эти ошибки сложно.

Поэтому и придумали языки высокого уровня (ЯВУ), т.к ЯВУ даже древний, намного более продуктивен, чем ассемблер. Впрочем, не надо обольщаться. Как написано в предисловии книги У.Морера, почти все коммерчески успешные программы для 8-ми разрядок были написаны именно на ассемблере, а на ЯВУ не было написано вообще ничего (кроме банковских программ на Коболе). Проблема в том, что 8-ми разрядки имеют мало памяти, а объём кода из под компилятора очень быстро нарастает с ростом сложности программы. Объём кода программы на ЯВУ в 4-8 раз больше, а скорость прогона во столько же ниже по сравнению с ассемблером.

Стоит заметить, что в литературе встречается утверждение, что есть один более эффективный, вероятно самый низкоуровневый ЯВУ - PL/M. Про который его автор Гарри Килэлл утверждал, что для больших программ он генерит более эффективный код, чем на ассемблере. Но для меня пока это остаётся непроверенным слухом и городской легендой, т.к CP/M-версии компилятора нет.

Но даже для критичных по скорости и объёму кода программ выход есть - это использование ЯВУ с заменой части процедур на ассемблер. Это удобно в BDS Си (не Aztec), а также в большинстве других ЯВУ (где используется линковка). Даже широко презираемый программистами бейсик имеет компиляторы с линковщиком, что позволяет встраивать в программу бейсика куски написанные на ассемблере без всяких ухищрений свойственных интерпретатору (за счёт загрузки кодов из операторов DATA).

Впрочем уверен, что для несложных по логике и графике программ, уровня XONIX, PACMAN даже возможностей голого ЯВУ без вкраплений ассемблера достаточно. Например, первый PACMAN для 8-ми разрядки вообще был написан на интерпретаторе бейсика, а это уж какая тормозятина.

Надеюсь, что вышенаписанного достаточно, чтобы показать, что использование ЯВУ при разработке ПО для РК86 имеет смысл. Но как это сделать, ведь компиляторы работают в CP/M и генерируют код рассчитанный для работы в CP/M? А нам требуется поиметь на выходе программу пригодную для запуска из среды монитора РК.

Из-за отсутствия в базовом РК86 входов BDOS и BIOS, в программе нельзя использовать стандартные функции ввода/вывода. Понятно, что программе рассчитанной для РК без CP/M не следует лезть к дискете. Но даже и без этого, т.к программы CP/M для ввода/вывода используют BDOS и BIOS, то странслированная традиционно программа всё-равно работать не будет.

Для решения проблемы есть куча вариантов. Во-первых, можно сделать эмуляцию CP/M, а именно пристроить к программе эмулятор BDOS/BIOS. Во-вторых, можно переписать в компиляторе некоторые процедуры низкого уровня в RUN-тайм библиотеке. Исходник RUN-тайм библитеки у Паскаля МТ+ и BDS Си включён в дистрибутив и изменить несложно (переадресовав вызовы BDOS на входы F812, F803 и F809).

В третьих, можно написать процедуры и функции на ассемблере делающие вызовы ПЗУ F800. Проще всего это делается в компиляторах, где есть оператор INLINE (или #ASM...#ENDASM). Компиляторы Паскаль МТ+ и AZTEC Си это свойство имеют. Тогда тратится всего 3 минуты, чтобы вставив маш.коды команды CALL на стандартные входы ПЗУ, получить процедуры и функции для вызова из Паскаля подпрограмм ПЗУ.

Т.е используя INLINE-ассемблер пишутся интерфейсные функции типа CONOUT, GETKEY, GOTOXY, MSSG, что и позволяет делать интерфейс с железом РК, не используя стандартные функции ЯВУ. Если же в ЯВУ нет встроенного ассемблера, можно это сделать внешними процедурами на ассемблере.

Эмулятор BDOS, BIOS это возможное решение для тех ЯВУ, в которых сложно что-то изменить. Программа транслируется для CP/M, используя стандартные процедуры. А затем к коду программы подключается блок эмулятора BDOS и BIOS, это всего 0.5 кб кода. Например, на Паскале МТ+ это сделать легко, т.к код странслированной программы в начале специально имеет 16 NOP-ов, куда пользователь может вставить свой код инициализации. Как выглядит эмулятор BDOS/BIOS можно посмотреть на программе DDT, что я адаптировал для РК86 от CP/M.

СИ даёт больше возможностей, генерит несколько более компактный и скоростной код, хотя Паскаль легче в освоении и симпатичен для тех, кто ранее имел дело с бейсиком. Тут для Z80 выбор есть, а вот для КР580 выбора практически нет. Есть всего три Паскаля выдающих код КР580, из них два - МТ+ и JRT хорошо документированы. МТ+ довольно эффективный, хотя слышал мнение, что он даёт код более объёмный, чем BDS Си. Зато Паскаль проще и его учат в школе и ВУЗ-е. В любом случае код от компилятора прогоняется на порядок быстрее, чем в бейсик интерпретаторе.

В 80-тые годы, в эпоху популярности РК, ЯВУ были недоступны, но меня удивляет почему сейчас, когда всё это доступно и есть живые любители РК86, никто не начал использовать ЯВУ. Смысл этого поста в том, чтобы убедить фанатов РК, что даже с небольшими трудозатратами можно писать игры. Т.к написание игр для РК на ассемблере более трудоёмко, то использование ЯВУ это выход. Можно писать новые игры. Но есть смысл даже в переписывании старых игр РК86, потому что теперь можно использовать цвет (оцветить старые игры) и путём использования специального фонта с фигурками, состоящими из тайлов (например в матрице 2*2 знакоместа), получить визуально на экране полноценную графику, причём не имея скоростных ограничений, как это на графических ЭВМ, которые тормозят.

Надеюсь, что через полгода мне и самому удастся продолжить эту тему и показать, как можно написать XONIX или PACMAN на ЯВУ. Мучает только проблема выбора - Си, Паскаль, бейсик-компилятор или PL/M. Каждый из них имеет свои преимущества.

И нужен компилятор с хорошей документацией. Пока нашёл документацию по бейсикам-компиляторам CBASIC и BASCOM, Паскалю МТ+ и BDS Си и, читая пытаюсь что-нибудь вспомнить, т.к уже ничего не помню и по уровню знаний равен полному чайнику в программировании на ЯВУ.

На первый взгляд кажется, что даже на бейсике компиляторе можно бы написать вполне приличное ПО для РК86, а скорость разработки будет даже выше. Но пока с бейсиком-компилятором некоторая неясность, - надо разобраться как делать ПО, работающее без ДОС, т.к обычно бейсики компиляторы генерируют не машинный, а промежуточный код и используют BRUN-модуль, из-за чего без ДОС работать вообще не могут, исходников RUN-тайм библиотеки нет и базовые процедуры не изменить. Кажется всё-же можно компоновать одномодульные CP/M-программы, и тогда за счёт вызова USR-подпрограмм можно выкрутиться, т.е делать программы на бейсике не использующие вызовов BDOS или BIOS CP/M.

Но вы не ждите когда я что-нибудь "рожу", вы можете легко сами сделать то же самое и начать делать игры для РК86 на каком нибудь ЯВУ. Для этого достаточно найти какую-нибудь среду, где работает любой из перечисленных выше компиляторов ЯВУ для CP/M. В простейшем случае - это эмулятор какого-нибудь компьютера, где есть CP/M и можно прогонять CP/M компиляторы. И проверять результирующий код для начала удобнее в эмуляторе РК86, т.к обычно очень хлопотно пересылать коды из IBM PC на реал.

Для использования корректных CP/M-программ, таких как компиляторы, удобнее всего пользоваться резидентными эмуляторами CP/M, типа 22NICE. Они позволяют запускать программы CP/M в MSDOS и Windows XP так, как будто это программы для IBM PC (в более новых Windows - нет, там нет поддержки MSDOS). Благодаря BAT-файлам получается очень удобно, хлоп по кнопке и всё транслируется и через секунду Вы уже в эмуляторе, проверяете результат. Такого удобства никогда не получить используя компиляцию на реальной ЭВМ (даже если бы в РК для этого хватало ОЗУ и скорости).

Кстати, собственно нехватка ОЗУ в РК уже не стоит остро, как это было в 80-тые, т.к даже для программы написанной на ЯВУ объёма 29 кб для загрузки кода и ещё 8 или 15 кб (в области 8400...BFFF) под буфер данных достаточно. Но, если сплошные 48К по принципу Микроши получить легко, то почему нет? Например, CP/M-Нортон написанный на BDS СИ занимает 32 кб. А игры написанные на ЯВУ и содержащие много лабиринтов уж точно превысят размер в 29 кб.

Интересно, что загрузка программ размера большего чем 29 кб с магнитофона в системе, где ОЗУ расширено в в окне A000...BFFF (тогда ОЗУ занимает два несмежные участка), должна происходить в три этапа. Для этого пишется стартёр, автоматически перехватывающий управление при загрузке по I, который и грузит два блока кодов в ОЗУ A000...BFFF и 0...7600. Стартёр перехватывает управление (за счёт загрузки кода в стек), выводит на 4 секунды мигающую надпись "Do not stop tape" и затем два блока считываются и стартуют. Естественно, если ОЗУ имеет сплошной блок ОЗУ, то загрузка программы размером более 29 кб и одним сплошным куском не проблема.

Однако для тех РК, где ОЗУ расширено до сплошных 48 кб, для загрузки больших программ удобнее использовать двухрежимный монитор, который работает в двух режимах на 32 кб и на 48 кб. Тогда в режиме 48 кб можно грузить большие программы под 45 кб одним блоком. Физически это достигается тем, что на РФ2 с ROM-BIOS напаивается второе ПЗУ РФ2. И, если в момент нажатия кнопки сброс удерживается клавиша <УС>, то стартует монитор на 48 кб. Это удобно, не требуется доп.управление и сохраняется совместимость. Два компьютера в одном флаконе.

Так как, в качестве языка программирования очень перспективен PL/M, прилагаю ссылку на подборку материалов по языку PL/M и по языку PL1 для программирования для КР580.

Для PL1 есть версия компилятора для CP/M. Хотя PL/M похож на PL1, про его эффективность ничего не известно. Точнее некоторые, начитавшись Википедии, PL1 ругают, но сомневаюсь, что для 8-ми разрядки стали бы писать неэффективнуй компилятор. Возможно он такой же тормозной как Си или Паскаль, но скорее всего, т.к основы языка те же, он также эффективен, как и PL/M. Но для начала освоения PL/M он тоже годится, т.к в нём можно использовать только те операторы, что есть и в PL/M.


Последний раз редактировалось: barsik (Пт Апр 27 2018, 15:12), всего редактировалось 1 раз(а)

_________________
***
avatar
barsik
новичёк

Сообщения : 87
Дата регистрации : 2016-11-10
Откуда : 600 км от Москвы

Посмотреть профиль

Вернуться к началу Перейти вниз

Паскаль для разработки программ РК86

Сообщение  barsik в Пт Апр 27 2018, 14:46

Дилемма Паскаль или Си отравила жизнь многим дилетантам в программировании. В 90-тые, пытаясь освоить программирование, я постоянно разрывался, занимался и тем и этим. В итоге метания между компилятором BASIC-а, Си и Паскалем сильно мне вредили. В итоге неэффективно потрачено время. Лучше не повторять этой ошибки и строго заниматься только СИ или только Паскалем.

После долгого обдумывания, для программирования для РК86 выбираю Паскаль. Хотя на Си я программировал больше, и Си считается лучшим. Пусть Си популярнее, а компиляторы Си для 8-ми разрядки эффективнее и возможности Си выше, но для меня бОльшее значение имеет приятность программирования, да и бОльшая лёгкость в освоении тоже важна, т.к я очень давно не программировал и из-за возраста "входное сопротивление" моего мозга резко повысилось. Мне важнее более приятный процесс, чем более качественный результат.

Далее необходимо сделать выбор компилятора. Для КР580 есть 4 альтернативы. Это три компилятора для CP/M и родной компилятор для РК86 (работающий без ДОС). Для начала, чтобы убедиться в их работоспособности попробовал написать Hello World на всех этих компиляторах. Эти компиляторы я сложил здесь. Если у Вас есть другой Паскаль, что компилирует в код для КР580, дайте знать. Вроде бы были популярны PascalP и USCD Pascal, оба использующие P-код, но пока их не нашёл.

Родной компилятор Паскаля для РК86 у меня есть, но сейчас он недоступен, т.к остался на архивных дискетах RK-DOS, которые не считать на PC. Это не важно, т.к этот компилятор сразу-же отпадает по следующим причинам.

Для РК86 есть Паскаль от Микроши (а также Best-Си и Фортран). Но этот Паскаль не полноценный компилятор, т.к вместо маленькой RUN-тайм библиотеки, использует в качестве неё сам компилятор, отчего объём странслированной программы увеличивается не на 1-2 кб библиотеки времени исполнения, а разбухает аж на целых 16 кб кода всего компилятора. Что делает этот Паскаль пригодным лишь для знакомства с Паскалем.

Трансляция происходит сначала в текст на ассемблере, который затем ассемблируется ассемблером МИКРОН. Это приводит к тому, что в ОЗУ РК должны одновременно умещаться: текстов редактор (2 кб), компилятор Паскаля, компилятор ассемблера (2 кб), исходный текст на Паскале, промежуточный текст на ассемблере и результирующий объектный код странслированной программы. С учётом мизерности размера ОЗУ в РК максимальный размер программы ограничен в 200 строк Паскаля. То же самое относится и РК-компилятору Best-Си, хотя на ОРИОНЕ на нём писали игры.

На других отечественных компьютерах с бОльшим ОЗУ (Партнёр и Вектор) с успехом использовался ЛС-паскаль, который использует P-код. Но увы, его версий для РК или ОРИОНА не встречал.

Один из трёх CP/M компиляторов Паскаля для КР580 также отпал, т.к мне не удалось странслировать на нём Hello World. Разобраться не смог, т.к к этому Паскалю нет никакой документации.

Из 4-х попробованных версий JRT-паскаля одна (3.0) оказалась дохлой. JRT-паскаль оказался очень эфективным по объёму кода (код Hello World всего 32 байта) и документация к нему хорошая. Но увы, этот компилятор транслирует не в COM-файл, а в INT-файл, для запуска которого используется программа EXEC.COM размером в 24 кб. Это не годится не только из-за огромного размера кода, а то, что без CP/M программа EXEC не может загрузить INT-файл и следовательно это не удастся использовать на РК86 без CP/M. Жалко, что JR-Паскаль не годится, т.к в нём есть многие вещи, что отсутствуют в МТ+.

В итоге, как ни крути, остался всего один компилятор Паскаля, который позволяет транслировать программы для РК86. Это Паскаль МТ+. Дополнительным плюсом МТ+ является наличие отладчика, возможность анализа ассемблерного кода полученного от каждого оператора Паскаля и возможность трансляции кода на любые адреса и для ПЗУ. Hello World транслируется в программу объёмом в 4 кб (использование ключа $K позволяет исключить ненужные стандартные операторы из кода, что сокращает объём, но пока в этом не разбирался).).

Есть 3 версии компилятора MT+. Есть версия 5.5 от фирмы MicroSystems и есть DR версия 5.5 от Digital Research (она отличается наличием SPP, пакета для оптимизации по скорости и анализатора) и есть DR версия 5.6. Компилятор МТ+ отлично документирован и экспертами признавался намного более мощным и профессиональным инструментом, чем борландовский ТP 3.0, хотя TP благодаря IDE и позволяет значительно ускорить разработку и отладку программ. Но увы, TP не генерит код для КР580, только для Z80. Пока для освоения Паскаля использую самую древнюю версию MT+ от СМ-1800, т.к она русифицирована, а ускоритель SPP пока не нужен.

Для получения кода пригодного для РК86, несложно переписать в RUN-тайм библиотеке процедуру @BDOS так, чтобы в соответствии с передаваемым номером функции происходил вызов ПЗУ F800 по адресу высчитанному по формуле (F800 + func*3). Но это мне пока не надо, т.к отлаживать удобнее на CP/M-машине (точнее в эмуляторе ОРИОНА с CP/M). Малый объём ОЗУ РК не проблема (пока сама странслированная программа умещается в ОЗУ), т.к ключ $Z позволяет задать RAMTOP. Ограничения Паскаля по скорости можно устранить вкраплениями ассемблера (это также немного сокращает объём кода).

Чтобы получить программу в кодах КР580 работающую на РК86 без наличия на ней CP/M, надо решить проблему ввода/вывод, т.к ввод/вывод самого компилятора рассчитан на CP/M, т.е наличие в ОЗУ входа в CP/M BDOS и входов в CP/M-BIOS. Проще всего встроить вызовы ПЗУ F800 в виде INLINE-процедур написанных на ассемблере. Встроенный в MT+ ассемблер позволяет прямо в Паскаль программу встраивать куски на ассемблере (и даже двумя способами - в виде HEX-дампов и в виде мнемоник ассемблера).

Нужные для программирования РК простейшие процедуры COUT, MSSG, GOTOXY, XF81B, CONIN, RD_SCR... я написал в INLINE ассемблере в мнемониках КР580 быстро. К сожалению, INLINE ассемблер использует маловразумительные мнемоники КР580, а не всем понятные мнемоники Z80. Потому большие вкрапления ассемблера удобнее делать в виде прилинковываемого внешнего ассемблерного модуля, который можно писать в мнемониках Z80 (естественно избегая команд, которых в КР580 нет).

Не освоив полностью сам Паскаль, нет смысла сразу начинать писать игру для РК86. Сначала разумнее пописать простенькие программки и полностью разобраться в работе всех операторов, стандартных процедур и функций. Затем надо разработать "движок", т.е набор подпрограмм позволяющий выводить движущиеся динамически меняющиеся спрайты (спрайты состоящие из тайлов-символов). Но предварительно надо написать редактор спрайтов, позволяющий нарисовать 8 фаз спрайта и посмотреть как они выводятся на экран в динамике.

Конечно редактор спрайтов удобнее сделать программой для PC, т.к сам РК86 не позволяет загружать тайлы спрайтов в фонт. Но я (для тренировки) собираюсь написать на Паскале редактор спрайтов именно для РК86 в графическом режиме 128*129 (который требует альтернативный фонт, который как раз есть у меня на реале и поддержан в моём эмуляторе РК86 на ОРИОНЕ).

Ближайшее время (несколько недель) для освоения Паскаля буду писать простенькие программки. Пока на второй день изучения странслировал несколько программок уровня Hello World (чтобы освоить интерефейс с подпрограммами ПЗУ РК) и начал писать нечто вроде монитора РК86 на Паскале (не трудно сделать и с записью на МГ). Пока написал просмотр дампа. Это пригодится для отладки Паскаль программ. Добавлю к этому еще мини дизассемблер, это позволит удобно отлаживать. Для начала хочу понять насколько быстро разбухает код Паскаля.

Затем собираюсь написать текстов редактор, а потом, возможно, и ассемблер в мнемониках Z80. Может быть ещё что-нибудь простенькое, типа микро-ОС для ROM-диска или прошивателя ПЗУ 573 РФ2 или 556 РТ4. И только затем, набравшись немного опыта в Паскале, возьмусь за разработку редактора спрайтов и графических процедур для их динамического вывода.

И только потом можно будет начать делать игры для РК86 с тайловой графикой. Надеюсь к тому времени появится эмулятор РК86 с коммутируемыми фонтами. Без коммутации фонтов, т.е без минимальной графики, вообще нет смысла писать игры для РК86, т.к игры с бегающими по экрану ASCII-символами это просто уродство, которого достаточно написано ещё в 80-тые.

_________________
***
avatar
barsik
новичёк

Сообщения : 87
Дата регистрации : 2016-11-10
Откуда : 600 км от Москвы

Посмотреть профиль

Вернуться к началу Перейти вниз

.

Сообщение  barsik в Ср Май 02 2018, 19:16

Прошедшие несколько дней разбирался с основами программирования на МТ-Паскале. Сам Паскаль работает великолепно, всё как в учебнике, да и находить и устранять ошибки удобно, диагностика достаточная. Но вот с ассемблером не всё оказалось так радужно, как казалось по документации.

С ассемблером при программировании для РК обязательно приходится разбираться, т.к все стандартные процедуры Паскаля для ввода/вывода недоступны (т.к они работают через CP/M, которая в ОЗУ РК отсутствует). Таким образом программа для РК86, написанная на Паскале, без вкраплений ассемблера вообще ничего не может.

Например, если хочется напечатать на экране значение переменной в десятичном виде, то облом. Без собственных процедур ввода/вывода это невозможно - попытка использовать процедуры WRITE или WRITELN приводит к кошмарному улету. Потому всё, что программа может делать, это то, что могут делать подпрограммы ПЗУ РК86, причём их ещё надо как-то вызвать из программы на Паскале.

Потому для начала, используя INLINE вставки на ассемблере написал несколько простейших процедур для интерфейса с подпрограммами ПЗУ РК86. Например, вот самые простейшие:

Код:

procedure cout(SYM: char);
begin
  INLINE( "LDA/SYM /
          "MOV C,A/
          "CALL/$F809 );
end;

function conin: char;
var RESULT:    integer;
begin
  INLINE( "CALL/$F803/
          "MOV L,A/
          "MVI H/0/
          "SHLD /RESULT );
  conin := chr(RESULT);
end;

procedure mssg(stradr: ukchar);
begin
  INLINE( "LHLD/STRADR/
          "CALL/$F818 );
end;

procedure hex(BYT: byte);
begin
  INLINE( "LDA/BYT /
          "CALL/$F815 );
end;

Уже эти простейшие процедуры позволяют тот же минимальный ввод/вывод, что есть в ПЗУ РК86. Например, можно выводить строки текста задав их такой же INLINE-вставкой с завершающим нулём. Вот программа Hello World для РК86.

Код:

prog HELLO;
type    ukchar = ^char;
var    ukch: ukchar;

procedure mssg(text: ukchar);
begin
  INLINE( "LHLD/text/
          "CALL/$F818 );
end;

procedure thello;
begin
  INLINE ( $1F/10/'Hello World !'/$0 );
end;

begin  (*  main  *)
        mssg(addr(thello));
  INLINE( "JMP/$F86C );
end.

А для вывода строк самого Паскаля процедура MSSG не годится, т.к в Паскале строки представлены иначе. Кстати, и вывести число в десятичном виде эти п/п-ммы всё-равно не позволяют (надо писать свою процедуру PR_DIG).

Как видите простейшие процедуры встроенный ассемблер позволяет написать. Но если попытаться написать чуть более сложную INLINE процедуру на ассемблере, то выясняется, что никак не задать адрес переходов.

В документации указано, что тогда можно использовать идентификатор звёздочка (*), что заменяет текущий адрес трансляции (аналог $ в обычном ассемблере). Т.е можно писать "JMP/*+25/. Но увы, компилятор не воспринимает звездочку, даёт на неё ошибку. А с префиксом $ (что вообще-то HEX-префикс), т.е JMP/$*+25 транслируется, но если посмотреть полученный код отладчиком, то адрес перехода подставляется неверный.

Таким образом, я остался практически без INLINE-ассемблера. Без переходов можно написать только простейшие линейные процедуры. Выходом остаётся вставлять в процедуру INLINE-вставку в кодах, предварительно странслировав её обычным ассемблером прямо на рабочий адрес. Адрес размещения процедуры можно узнать из PRN-файла (используя прилагаемый дизассемблер Паскаля) или проще контроллируя код отладчиком. При этом эта INLINE-процедура должна стоять в начале исходника, чтобы при дальнейшем написании программы адрес процедуры уже не сдвигался. Тогда с помощью INLINE вставляется готовый дамп странслированной программы.

Но т.к процедуру всё-равно надо транслировать обычным макроассемблером, то проще не вставлять её дампом (что вызывает необходимость контроллировать, чтобы адрес размещения совпал), а просто прилинковывать её при линковке, странслировав в виде внешнего модуля.

Да и вообще нашлось много нюансов, на которые пришлось потратить время. Например, надо писать не 'PUSH PSW', а 'PUSH P' , и не 'POP PSW', а 'POP PS', иначе возникает ошибка. Долго трахался с этим, а узнать это удалось только изучив дамп компилятора.

Но всё же надеюсь, что INLINE-ассемблер каким-то образом позволяет переходы. В документации на русском написано про звёздочку. Возможно переводная документация не соответствует, - от более раннней или более поздней версии. Видимо, надо читать читать документацию на английском, может быть там что-то найду.

_________________
***
avatar
barsik
новичёк

Сообщения : 87
Дата регистрации : 2016-11-10
Откуда : 600 км от Москвы

Посмотреть профиль

Вернуться к началу Перейти вниз

.

Сообщение  barsik в Сб Май 12 2018, 23:49

Нашёл ещё один пригодный для программирования для РК86 компилятор Паскаля. Скачать можно здесь. Пока только бегло пролистав документацию, выяснил что этот компилятор тоже пригоден для РК86, т.к даёт код КР580 и может выдавать COM-файл (а не INT запускаемый отдельным стартёром). На практике не проверял. Так как пока меня вполне устраивает Паскаль МТ+, хотя документация (видимо, от другой версии и) местами не совпадает. Чуть позднее, изучив документацию к этому Паскалю, попробую написать Hello World на этом Паскале.

Также недавно нашёл примеры программ на Паскале. Это в основном исходники инструментальных программ для разных Паскалей, но с ними пока не разбирался. Выяснилось, что для CP/M несколько десятков программ любителей из 80-тых было написано именно на Паскале. Таким образом в качестве примера для целей изучения имеется около сотни исходников Паскаль-программ (в основном это исходники для Турбо-Паскаля, но для целей изучения это не особо важно, тем более, что конверсия для другого Паскаля минимальна).

А если Вы предпочитаете программировать для РК86 на Си, Коболе, Комале или других, то нет проблем, скачивайте здесь и начинайте писать.
avatar
barsik
новичёк

Сообщения : 87
Дата регистрации : 2016-11-10
Откуда : 600 км от Москвы

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Использование ЯВУ для разработки программ для РК86

Сообщение  QUATTRO в Чт Июн 21 2018, 21:06

Перечитал все статьи, что есть в теме. Как обычно, Барсик написал очень интересно. Но остались вопросы: а как вообще писать программы на Паскале?
Я не спрашиваю, про то, как писать на самом языке Паскаль, а вопрос в том - какие действия нужно произвести, что бы получить готовый код для 86рк или готовые файлы GAM, RK ?
То есть, у меня есть некая папка, в которой имеется 22NICE.COM, что еще нужно положить в эту папку, что бы начать писать на МТ-Паскале?
Ну хорошо, саму программу Hello World (текст программы), я напишу в каком либо блокноте (даже если нужно в DOS-кодировке). Какие должны быть дальнейшие действия, что бы запустился компилятор Паскаля, в эмуляторе 22NICE?

В DOS, и его ТурбоПаскалем, где есть IDE - все ясно. Запустил Паскаль, в синем окне написал что нужно, и получил готовый EXE или COM файл. Но что делать тут - я вообще никакой информации не нашел.
Точнее нашел, как и что делать с Паскалем в ЧИСТОЙ СР/М, не в эмуляторе.

Я извиняюсь, что так криво все это описал, потому что я не знаю как по другому это все описать.
Если эта тема для "бородатых" программистов, и таким как я тут места нет, то извините, что влез в калашный ряд со свои свиным рылом Sad
avatar
QUATTRO
новичёк

Сообщения : 45
Дата регистрации : 2017-08-22
Возраст : 44
Откуда : Москва

Посмотреть профиль http://cnc-controller.ru/

Вернуться к началу Перейти вниз

Re: Использование ЯВУ для разработки программ для РК86

Сообщение  QUATTRO в Пт Июн 22 2018, 00:52

Viktor2312 пишет:
Извините, что я влез, на этом форуме, есть место всем, разногласия решаются просто, разные темы, одни не согласные идут в одну тему, другие в другую, и между собой не пересекаются....
Бородатыми - я назвал очень опытных программистов, кому вообще не интересно общаться с начинающими не их уровня (я как раз к таким отношусь, к начинающим не их уровня). Если я кого то обидел, то приношу свои извинения! Я не хотел ни какого скандала или ссоры. А спросил именно тут, потому что на ZX меня бы точно отшили с таким вопросом. Вот там как раз и сидят "Бородатые программисты".
Ну а то, что я назвал себя "свиньёй, которая влезла в калашный ряд" - так это я себя назвал. Тут уже самокритика  Very Happy
Так оно и есть: хочу разобраться в этом, в том же Паскале, но вот что то не получается... Наверное не туда лезу...
avatar
QUATTRO
новичёк

Сообщения : 45
Дата регистрации : 2017-08-22
Возраст : 44
Откуда : Москва

Посмотреть профиль http://cnc-controller.ru/

Вернуться к началу Перейти вниз

Re: Использование ЯВУ для разработки программ для РК86

Сообщение  Viktor2312 в Сб Июн 23 2018, 12:09

QUATTRO пишет:Если я кого то обидел, то приношу свои извинения! Я не хотел ни какого скандала или ссоры.

Не поняли вы о чём я, и никого вы не обидели и ссоры никакой нет, ну да ладно. По поводу ваших вопросов, это только наверно Барсик сможет, что-то дельное подсказать, ну или ещё кто-то заглянувший на огонёк.
avatar
Viktor2312
Гуру+

Сообщения : 10973
Дата регистрации : 2012-08-10
Возраст : 39
Откуда : Пятигорск

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Использование ЯВУ для разработки программ для РК86

Сообщение  barsik в Сб Июн 23 2018, 21:44

QUATTRO пишет:Если эта тема для "бородатых" программистов, и таким как я тут места нет, то извините
Нет тут бородатых программистов. Бородатые профессиональные программисты с окладом в $6000 в месяц сюда не ходят, у них на это нет времени (они и бородатые потому, что не хотят тратить время на бритьё).

А пишущие здесь все дилетанты или начинающие любители, а читают подобные форумы поначалу вообще полные чайники, с трудом вникающие в смысл обсуждаемого. У меня нет бороды, потому я лишь начинающий в программировании на ЯВУ. У меня не хватило ума и энергии для освоения программирования на современных ЯВУ, это не только очень сложно, но и глупо и неинтересно писать программы для среды, где и так всё есть, причём написано профессионалами. Программирование в стиле рэтро тем и выгодно, что на порядки проще в освоении и тут есть платформы не заваленные программами. Да и вообще тут не менее важен процесс, чем результат.

Компиляция рэтро компилятором делается точно по инструкции пользователя, но не прямо в среде Windows или MSDOS, нужна среда CP/M. Это можно делать в любом эмуляторе, где есть CP/M. Причём желательно таком, где проще переносить файлы из Windows в CP/M. А если компилятор корректный, то можно запускать соответствующий CP/M компилятор и линковщик прямо в MSDOS, для чего нужно конвертировать эти CP/M программы в формат запускаемый в MSDOS c помощью GENCOM пакета 22NICE или подобных. Не все CP/M-программы работают под TSR-эмулятором, но компиляторы обычно MSDOS-корректные и запускаются в MSDOS.

Но я, оттого, что мне так удобнее сразу тестировать скомпилированную программу, использую свой эмулятор ОРИОНА. Для разработки простых программ для РК86 годится любой эмулятор любой 8-ми разрядки у которой есть входы F800 (т.е эмулятор РК, ОРИОНА или Специалиста с доработкой 2-мя диодами, чтоб возникли входы F800). Нужно, чтобы в таком эмуляторе была CP/M с высоким TPA (не менее 48 кб), иначе CP/M компиляторы ЯВУ не работают. А этим двум требованиям, увы, отвечает только эмулятор ОРИОНА. Т.к из-за мизерности объёма ОЗУ, CP/M для РК и Специалиста имеют очень низкий TPA, отчего в них можно использовать только компилятор ассемблера, а компиляторы ЯВУ и вообще все фирменные CP/M пакеты не идут.

Отредактировав текст программы на Паскале, запускаю BAT-файл. Он копирует все файлы с текстом Паскаль программы в каталог FILES.CPM и стартует эмулятор ОРИОНА. В каталог FILES.CPM ещё раньше скопированы все файлы MT+ нужные для компиляции и отладки. При старте эмулятор вылетает в CCP ORDOS. Там в квазидиске B (загруженный из подкаталога ORDOS.B), есть файл с именем EXT$.

Этот файл EXT$ автостартует при входе в ORDOS, что в некотором роде заменяет AUTOEXEC. В файл EXT$ переименован код CP/M оформленный как запускаемый ORDOS-файл (у меня все версии DOS в виде ORDOS-файлов, т.к это на порядок удобнее, чем старт DOS с системных треков дискеты, т.к позволяет выбирать версию, а не иметь только одну и избавляет от подкачки). Можно и не использовать автостартовость ORDOS, а вручную вводить в CCP ORDOS командную строку с именем запускаемого файла DOS. Обычно это D1<ВК> (ORDOS файлы D0$ и D1$ это соответственно CP/M ОРИОНА для банок 0 и 1).

В моём эмуляторе после старта CP/M все файлы из подкаталога FILES.CPM перегружаются в эл.диск из ОЗУ ОРИОНА. Физически эл.диск это ОЗУ PC, потому размер эл.диска в моём эмуляторе невелик, ~280 кб (эмулятор использует только ~600 кб конвенционального ОЗУ MSDOS), но этого хватает (например, объём компилятора MT+ лишь ~150 кб). Т.е в папку FILES.CPM помещаю файл с именем AUTOEXEC.SUB следующего содержания.

Код:
D7
MTPLUS P $PAX
MTPLUS MOD1 $PAX

Первая строка это запуск консольного драйвера CP/M, т.к без него в CP/M ОРИОНА только КОИ-7, а все фирменные программы используют ASCII. Вторая строка компилирует основную программу с именем P.PAS (которуя пишу и отлаживаю в данный момент). А третья строка компилирует модуль связи MOD1.PAS тоже на Паскале, обеспечивающий интерфейс с подпрограммами ПЗУ РК86, который общий для всех программ, потому и вынесен в отдельный модуль.

Этот модуль связи написанный на Паскале может заменяться эквивалентным модулем написанным на ассемблере, который содержит процедуры для интерфейса между Паскалем и п/п-ми ПЗУ РК86, а также процедуры работающие прямо по железу РК, что Паскаль, естественно, не умеет. Это приходится применять для сложных процедур и функций. Этого можно было бы избежать, ограничившись INLINE ассемблерными вставками, если бы встроенный INLINE ассемблер позволял переходы. Но увы, несмотря на то, что в документации написано, что символ '*' адресует текущий адрес трансляции, это не работает. Без переходов оператор INLINE позволяет встроить в программу только линейный фрагмент на ассемблере. Для простого вызова п/п-мм ПЗУ этого достаточно. Хотя выгоднее написать на ассемблере и включить в программу свои аналоги п/п-мм ПЗУ, что сделает программу более мобильной. В случае внешнего модуля на ассемблере вместо 3-й строки ставится строка: M80 =MOD1.ASM, которая компилирует с ассемблера.

Обычно при трансляции возникает куча ошибок трансляции и приходится их исправлять. Тогда нажимаю F9 и вылетаю в монитор-отладчик эмулятора. Здесь набираю Q<Enter> и вываливаюсь из эмулятора назад в Windows. Где в окне редактора исправляю текст и повторяю компиляцию снова запустив эмулятор.

Если всё странслировалось без ошибок, то в ком.строке CP/M пишу S L<ВК>, отчего SUBMIT запускает пакетный SUB-файл L.SUB (SUB-файлы это CP/M аналоги BAT-файлов MSDOS). Это просто, чтобы меньше набирать текста. Можно просто ввести командную строку для запуска линковщика:

LINKMT P, MOD1, PASLIB /S

Иногда, например, чтобы получить и посмотреть ассемблерный текст в который компилируются операторы Паскаля или, чтобы подключить отладчик, добавляются другие ключи. При компоновке тоже постоянно возникают ошибки линковки, приходится их устранять и всё повторять. Когда программа наконец скомпилирована и слинкована, то на эл.диске возникает файл P.COM. Я загружаю его в ОЗУ на адрес 100 командой ZS3 P.COM<ВК> и делаю сброс ОРИОНА нажав на F8.

Снова оказываюсь в ORDOS. Только теперь автостарта EXT$ не происходит, т.к квазидиск B затёрт при старте CP/M в банке 1 (а сама копия CP/M для её рестарта сохраняется в банке 6 ORDOS файлом с именем CPM$). Теперь мне надо перенести мою программу, что осталась в банке 1 (где работает CP/M) в банку 0, где программе надо работать (т.к в банке 1 она работать не может потому что ПЗУ F800 можно вызывать только из банки 0, т.к экран в банке 0). Копировать из банки в банку на ОРИОНЕ умеет только монитор M3-EXT.

Для этого ввожу команду MON<ВК>, отчего из ROM-диска стартует M3-EXT. С его помощью командой P0,C3FF,1,0 копирую память банки 1 в банку 0. При этом и программа, что была загружена на B1:0100 отладчиком ZSID3, переносится в банку 0 на адрес 100. Остаётся для её запуска ввести команду G100<ВК> и можно смотреть как работает программа написанная на Паскале.

Так можно проверить на ОРИОНЕ только корректные программы РК86, что делают ввод/вывод только подпрограмами ПЗУ. Если же я делаю программу, что напрямую лезет в экранный буфер РК86, сама напрямую опрашивает матрицу клавиш или использует альтернативный фонт, то проверить такую программу на ОРИОНЕ нельзя.

Но по счастью у меня как раз есть эмулятор РК86 на ОРИОНЕ. Чтобы проверить такую программу, я записываю проверяемый файл в квазидиск ORDOS командой SP@,100,endaddr<ВК> и запускаю эмулятор РК на ОРИОНЕ командой EM<ВК>.

Быстрее будет компиляция файлами MSDOS прямо в Windows. Это точно будет быстрее, т.к при компиляции в эмуляторе ОРИОНА у меня каждый раз теряется куча времени на запуск самого эмулятора. И проверено, что под 22NICE все модули компилятора МТ+ работают.

Для этого с помощью GENCOM из пакета 22NICE делаем MSDOS стартовые файлы из файла компилятора и линковщика MTPLUS.COM и LINKMT.COM (для чего сначала переименовываем их в *.CPM и запуская GENCOM получаем их MSDOS стартёры). Что позволяет их стартовать BAT-файлом прямо в Windows. Но получив готовую скомпилированную программу, её придётся вручную сконвертировать в GAM или RKR файл и запустив какой-либо эмулятор РК86 считать в эмулятор этот Tape-файл. После чего для проверки можно программу запустить командой G100<ВК>.



_________________
***
avatar
barsik
новичёк

Сообщения : 87
Дата регистрации : 2016-11-10
Откуда : 600 км от Москвы

Посмотреть профиль

Вернуться к началу Перейти вниз

.

Сообщение  barsik в Пн Июл 09 2018, 14:17

Пока искал информацию про Паскаль МТ+ вот здесь мне попалась интересная статья kakos_nonos-а про компиляторы ЯВУ. Автор озадачился той же проблемой (поиском компиляторов для программирования РК86), хотя его выводы немного отличаются. Автор также пришёл к выводу, что наиболее победительный язык высокого уровня для программирования РК86 это PL/M (точнее не оригинал PL/M из 1973, а его более продвинутый вариант PLMX из 1979).

Однако выводы автора относительно неактуальности Паскаля МТ+ в корне ошибочны. Автор не разобрался в ключах трансляции и подключал ненужные в конкретной программе библиотеки (например, зачем подключать библиотеку с плавающей точкой, если все расчёты идут над целыми числами). Потому автор получал для простейшей программы объём кода в 26 кб из чего и сделал вывод о непригодности Паскаля МТ+. Я странслировал ту же программу и получил объём кода менее 4 кб (причем объём собственно программы едва 300 байтов, остальные 3.5 кб это RUN-тайм библиотека, которую при желании можно также сократить в объёме в разы).

Нашёл ещё один Паскаль, который похоже может быть использован для КР580. Это Hisoft Pascal80. Он нормально компилирует в CP/M ОРИОНА на Z80, но выходной код компилятора в моих пробных экспериментах работал и на КР580.

Этот Паскаль был написан для ZX-Spectrum в 1983. В 1984 вышла версия для Amstrad CPC и версии для CP/M 2.2 и 3.0 (версии для CPC поддерживают железо CPC, графику и т.п). В 1985 вышла версия для MSX, а позднее и для других машин с Z80. Интерес представляет версия для CP/M 2.2.

Читал, что по эффективности этот Паскаль считается более эффективным (код короче и быстрее), даже чем Турбо-Паскаль. Простые опытные программы, что я компилировал давали вполне компактный код (менее 4 кб). Удачно, что, т.к этот компилятор широко использовался, документации вполне хватает. Кстати, в именах в программах для HP80 не используйте символ "подчёркивание" (код $5F) и у меня почему-то транслировалось только, если все операторы были в верхнем регистре (возможно нужно задать какой-то упр.ключ).

Сам компилятор работает только на Z80 (в эмуляторе CPM80.EXE сообщение "недокументированная команда"). Пока не могу точно проверить работает ли весь генерируемый код в системе с КР580, т.к, хотя у меня есть эмулятор ОРИОНА на КР580, но нет CP/M для ОРИОНА, что работает на КР580. Это проверить можно в эмуляторе EMU от b2m, но там неудобно переносить файлы в образы диска, потому для прогона CP/M-программ я им не пользуюсь.

Потому тестирование кода из под компилятора проводил на IBM PC под MSDOS TSR-эмулятором 22NICE. Этот эмулятор автоматически переключается на Z80, если в программе встречается хоть одна команда Z80 (если же Z80-команд нет, то флаги ставятся точно, как у КР580). Если сгенерировать COM-файл с ключом "PROCESSOR=TEST", то выдаётся сообщение использовала программа команды Z80 или нет. Так вот, несколько простых Паскаль программ я странслировал с помощью компилятора HP80 и прогнав их под 22NICE, выяснил, что команд Z80 в их коде нет.

Естественно, по простейшим программам ещё нельзя судить. Нужно испытать на больших программах в которых задействованы все операторы этого Паскаля. К сожалению, это специфичный Паскаль (например, в нём нет оператора STRING) и проверить его на программах написанных для TP или MT+ не получается. Нужно изучать документацию, чтобы понять как писать программы для такого компилятора.

Hisoft Pascal80 можно скачать здесь. Сам компилятор (не дистрибутив, лишь сам компилятор), который я проверял - это файл HP80.COM в подкаталоге HP80. Полный дистрибутив в файлах образов дисков CPM Sam Coupe и DSK-образах для CPC (для считывания файлов из образов дискет CPC используйте там же приложенную утилиту чтения образов дискет CPC).

Наконец также удалось найти компиляторы ЯВУ для процессора 6800. Если для процессора 6502 можно скачать множество кросс-компиляторов ассеблера и ЯВУ (есть даже кросс-IDE), то для процессора 6800 с этим намного сложнее. Если кое-какие ассемблеры для 6800 имеются (есть даже кросс-ассемблер для CP/M, хотя и не макро), т.к ассемблер был необходим при разработке программ контроллеров на 68xx, то компиляторы ЯВУ (из-за того, что бытовых ЭВМ на 6800 практически не было), - распространены намного меньше.

Но всё-же и эта проблема в итоге решилась. В качестве компилятора Си нашёлся многоплатформенный кросс-компилятор Си от Hi-Tech. А в качестве компилятора Паскаля удалось найти компилятор Паскаля для болгарского компьютера "Пылдин-601". Есть версия Паскаля и для оригинальной DOS этой машины и, главное, есть кросс-компилятор для PC. Кстати и компилятор ассемблера для Пылдина, это, похоже, лучший компилятор ассемблера для 6800 (и он также есть в кросс-версии для PC).

_________________
***
avatar
barsik
новичёк

Сообщения : 87
Дата регистрации : 2016-11-10
Откуда : 600 км от Москвы

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Использование ЯВУ для разработки программ для РК86

Сообщение  QUATTRO в Вс Авг 26 2018, 17:37

barsik пишет:
Нет тут бородатых программистов. Бородатые профессиональные программисты с окладом в $6000 в месяц сюда не ходят...


К сожалению я не получил оповещения об ответе и сюда заглянул просто так, может кто напишет ответ на мой вопрос. Как я и ожидал, ответил только Барсик, за что ему ОГРОМНЕЙШЕЕ СПАСИБО!!! Как всегда развернутый ответ и приятно было почитать! Теперь надо пробовать по написанному Барсиком.
Но и все же, сколько я не пробовал написать что то простейшее на Паскале, вместе с 22NICE - у меня ничего не вышло. Я так и не понял как привязывать программу к стандартным подпрограммам 86рк. Ведь действительно, как barsik уже писал, ничего не получится без привязки к стандартным подпрограммам Монитора. А если писать заново свои подпрограммы, то получается масло-масляное, да и лишнюю память использовать.

Тут же не как в обычном MS-DOS - получили .COM файл и запустили его (это я про Радио-86рк).
Как я понимаю, в конечном итоге я должен получить какой то код по адресам, например 0000 - 00FF, потом это все как то перенести на тот же 86РК и уже по адресу G0000, запустить. В эмуляторе это все сделать проще (запустить), но и все же, надо сначала получить результат, тот же файл HEX-код или хотя бы файл с расширением GAM/RK и уже его запускать в эмуляторе.

*****
Извиняюсь за флуд, и сразу хочу сказать, что я никого не хочу обидеть, но для меня такие как barsik, Морозов (Vinxru), kakos_nonos и подобные - это те самые "бородатые" программисты, которые вот так вот возьмут и за вечер напишут какую нибудь программу, пусть даже маленькую (или большую), кто на Паскале, кто на Асм, кто на Си, не важно. Или посмотрев на код, сразу найдут ошибку и т.п.
Я когда то переписал вручную Монитор для Микролаб, в обычном блокноте, выставил его напоказ, перед этим несколько раз проверил, но мне нут же написали, что в коде есть ошибки Smile Вот это я понимаю люди разбираются!
Я бы был счастлив, если бы я был таким и меня считали и называли - бородатый программист Smile Хотя у меня и никогда не было и не предвидеться бороды Smile
Я до сих пор (иногда сажусь) и ищу ошибку в Микролаб и так ничего и не нашел, ни в схеме ни в Мониторе.
*****
Еще раз извиняюсь за флуд.
Кстати, оклады в 6000$ это скорее всего в Европе/Америке. В России таких окладов нет, даже у "бородатых" программистов. А если и есть, то это у единиц. Основная армия получает 30-150 тыс. Единичные доходят до 250-300 т., да и то это уже скорее начальники отделов, а не рядовые программисты.
А не заходят они сюда, потому что мало кто разбирается в тех же старых компьютерах и программировании их. Все больше на чем то современном пишут.
avatar
QUATTRO
новичёк

Сообщения : 45
Дата регистрации : 2017-08-22
Возраст : 44
Откуда : Москва

Посмотреть профиль http://cnc-controller.ru/

Вернуться к началу Перейти вниз

Re: Использование ЯВУ для разработки программ для РК86

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения