Вход

Просмотр полной версии : Игра "Двигалка" на Апогей/РК



Kakos_nonos
27.12.2017, 19:28
Всем добрый день!
Написал игру для РК-совместимых компьютеров - Двигалка.
Написал её еще весной, но выложить сюда только сейчас руки дошли. В игре надо перемещая различные предметы сначала взять ключ (+), потом дойти до выхода (Яблочко).
Игра написана на PL/M, исходники вместе с компилятором находятся в архиве. Приятной игры!
Видео

https://www.youtube.com/watch?v=NV6zwZXSOCg
Скачать: http://events.retroscene.org/files/mf2017/wild/dvigalka.zip

svofski
27.12.2017, 19:47
Игра написана на PL/M
Зачет!

barsik
27.12.2017, 21:54
При запуске приведённого BAT-файла compile_it.bat в Win XP ничего не компилируется. Неверный BAT-файл. В итоге, чтобы откомпилировать мне пришлось переделать файл compile.bat в соответствие с требованиями к BAT-файлам. Вот такой текст сработал:

@echo PL/M-80 Super Compiler
.\compiler\lua52.exe .\compiler\plsc1.lua %1
@cd .\compiler\
lua52.exe plsc2.lua
@move /Y out.rka ..\..\emu\dvig.rka
@cd ..\..\emu
emu.exe

EMU не запускает файл по командной строке. Надо нажимать на сброс, затем вводить файл по I.

Очевидно, собственно компиляцию делают строки:

lua52.exe plsc1.lua prog.plm
lua52.exe plsc2.lua

Не могли бы Вы рассказать как пользоваться этим компилятором PL/M. Понятно, что lua52 это что-то вроде командного процессора ? Сам компилятор это plm81.exe и plm82.exe, они у всех есть, но никто не понял как ими пользоваться. А Вам удалось в этом разобраться. Не могли бы Вы на простейшем примере Hello World показать как компилировать программы? И рассказать про строчки в файлах plsc1.lua и plsc2.lua ?

Имеет ли отношение содержимое этих файлов к компиляции именно этой программы? Если я напишу свою программу MYPOG.PLM и заменю в файле compile_it.bat слово GAME.PLM на MYPROG.PLM, то не понадобится ли менять также содержимое plsc1.lua и plsc2.lua ?

Kakos_nonos
27.12.2017, 22:37
Нет, .lua файлы не надо менять. Это препроцессор, он обрабатывает наши плм сорцы так, чтоб они были понятны плм компилятору (он 1977 года, древний, там все по другому).
А именно: добавляет регистронезависимость (в оригинале надо писать КАПСОМ)
Добавляет систему модулей, чтоб программу можно было писать из нескольких файлов, а также правильно показывает ошибки (ошибка в файле N в строке K)
Добавляет возможность писать ассемблерные вставки.

Да, чтоб откомпилировать свою прогу нужно вписать compile_it hello.plm


EMU не запускает файл по командной строке. Надо нажимать на сброс, затем вводить файл по I.

У меня запускает, может не та версия

При запуске приведённого BAT-файла compile_it.bat в Win XP ничего не компилируется. Неверный BAT-файл.
Да, сорри за ошибку, неправильный символ переноса строки, на вин 7 все норм, поэтому не заметил.

Завтра опишу как написать хелло вролд

Kakos_nonos
29.12.2017, 20:49
Извиняюсь за задержку Helloworld пишется так:



use lib.plm
call putstr(.('hello world',0))
goto 0f875h



Сначала мы подключаем файлы с процедурами ввода-вывода (этот файл должен быть вместе с исходником), потом выводим строку, потом переходим обратно в монитор.

Строка выводится так: В PL/M нет строкового типа, поэтому используется точечная нотация, то есть, мы размещаем в памяти строку и возвращаем её адрес: .('hello world',0)

Можно и так написать


declare a address
a=.('hello world',0)
call putstr(a)
goto 0f875h

Правда, честно сказать, язык не очень понравился. Все очень раритетно, древне. Сейчас изучаю тему оберона, его тлже можно в i8080 транслировать, через си. Если будет получаться, напишу.

вот правильный батник compile_it.bat


@echo off
echo PL/M-80 Super Compiler 0.01 Use: compile.bat filename
%~d0%~p0\lua52.exe %~d0%~p0\plsc1.lua %1
cd "%~d0%~p0"
lua52.exe plsc2.lua
..\..\emu\emu out.rka

mvg
01.01.2018, 12:20
Прикольно. В духе старых рк игр!
А я своих марсиан никак не допишу... ЛЕНЬ ;(

barsik
01.01.2018, 14:08
А я своих марсиан никак не допишу...
А это как раз потому, что на ассемблере программировать сложнее. Я уже предлагал всем программистам для РК86 переходить с ассемблера на PL/M, который из всех ЯВУ даёт самый эффективный код.

Программа написанная на PL/M всего лишь в 1.2...1.5 раза тормознее и объёмнее, чем аналог написанный на ассемблере. А Гарри Килдэлл (https://www.osp.ru/cw/2001/33/43627/), автор PL/M (http://www.computerhistory.org/atchm/in-his-own-words-gary-kildall/), вообще утверждал, что большая программа написанная на PL/M эффективнее, чем программа на ассемблере. Теоретически такое невозможно, но в реальности программисты выдают на ассемблере менее эффективный код, в их коде встречаются дублирующиеся фрагменты, да и при разработке на ЯВУ структура и алгоритм программы получается более оптимальной.

А улучшенный PL/M, т.е PLMX с оптимизацией кода, ещё более эффективен. В отличие от PL/M из 1973 года от Гарри Килдэлла, PLMX устраняет мелкие неудобства PL/M (например, не зависит от регистра символов), допускает многомодульность, объединение с кусками написанными на других ЯВУ или ассемблере и имеет поддержку BDOS функций CP/M. Кроме того, он даёт на выходе сразу ассемблерный исходник, пригодный для трансляции и линковки, а не кучу каких-то левых файлов, не пойми для чего предназначенных, как делает оригинал PL/M из 1973 года.

Но самое главное в том, что PLMX работает в CP/M (хотя не работает под TSR эмуляторами CP/M для MSDOS, типа 22NICE, RUNCPM). Достаточно использовать любой эмулятор в котором есть CP/M c достаточным уровнем TPA. Можно также транслировать на реальном ОРИОНЕ с дисководом или винчестером (на РК86 и СПЕЦИАЛИСТЕ не получится, там TPA слишком маленький).

Но оригинальной версии компилятора PL/M для CP/M до сих пор нет. Много людей пытались найти такой компилятор (в т.числе и иностранцы). Фирма Intell не перетранслировала компилятор PL/M для CP/M, чтобы не поддерживать конкурентов. Но компилятор PL/M для CP/M всё же был создан другой сторонней фирмой и, естественно, это не был оригинал от Гарри Килдэлла. Упоминания об этом встречал на англоязычных сайтах и даже ссылки на скачку (но они протухли более 10 лет назад). Вроде бы это написала фирма Tarbell, ставшая известной своим Tarbell Basic для CP/M.

Недавно оригинальные исходники PL/M на Фортране-IV были опубликованы. Но остаётся проблемой странслировать эти имеющиеся исходники PL/M. Нужен компилятор фортрана, что даёт на выходе код КР580 или Z80 для CP/M. Пока безрезультатно опробовал 3 компилятора фортрана для CP/M. А интелловский компилятор PL/M для ISIS не работает в Windows, т.к эмулятор ISIS написан для MSDOS. Исходя из дат файлов, чтобы его использовать надо загрузиться в MSDOS 3.30 и компилировать на дискете или на партиции размером не более 32 мб.

Итак, уже имеются две возможности писать на PL/M - это PLMX от Эммануля Роше и MSDOS кросс компилятор PL/M с предпроцессором на LUA от Kakos nonos-а. Последний, к сожалению, пока непонятно как переделать, чтобы транслировал не в формат RKA, а в формат RKS (понятно, лишние байты я забил, но как поменять порядок байтов в начальном, конечном адресе и КС, - неизвестно).

Конечно удобно, что кусок на ассемблере встраивается прямо в PL/M код (это же делает и PLMX), но никакие имеющиеся исходники программ на PL/M не компилируются. Стандарт PL/M предусматривает наличие точки с запятой после оператора. Если это убрано (видимо подставляет препроцессор), то в одной строке д.быть всего один оператор.

Кроме того, неудобно использовать TASM вместо нормального макроассемблера от Microsoft. С TASM непонятно как вставлять ассемблерные куски написанные в понятных мнемониках Z80. M80 позволяет, используя ключ .Z80 или .6502, вставлять куски в мнемониках Z80 или 6502. Возможно и TASM позволяет оперативно менять мнемоники в самом исходнике, но это неизвестно.

Мне кажется, что компилятор PLMX из 1980 более выгоден, чем компилятор PL/M из 1973 года. Хорошо бы провести сравнение генерируемого кода двух компиляторов и решить, что лучше. Мне PLMX нравится больше, т.к без введения своих процедур сразу позволяет писать для CP/M, что удобнее. А главное, можно прилинковывать свои процедуры странслированные любым ассемблером, а не быть привязанным к убогому TASM, использующему моторолловские соглашения.

Кстати, так и не понял, когда программисты всего мира собираются начать сбор денег на строительство памятника Гарри Килдэллу.

Kakos_nonos
01.01.2018, 19:32
А улучшенный 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 предусматривает наличие точки с запятой после оператора. Если это убрано (видимо подставляет препроцессор), то в одной строке д.быть всего один оператор.
Да, препроцессор добавляет точку с запятой в конце.
Можно писать несколько команд в строчку, ставя точку с запятой между ними.

barsik
01.01.2018, 20:56
Да, я сейчас делаю транслятор Паскаля, это будет еще удобнее
Было бы здорово.

В 90-тые годы, когда использовал Паскаль в CP/M и MSDOS, он мне нравился больше, чем Си. Считаю себя пасквилянтом (плевать, что насильники обзывают пасквилянтов быдлокодерами), хотя с Си пришлось иметь дел намного больше. Кстати, все поделки на Паскале в CP/M без проблем (лишь переделкой Include-файлов в юниты) были конвертированы на TP для PC, а вот с Си так не вышло. Ещё позднее программки на TP без изменений были странслированы в Linux с помощью GPC (Gnu Pascal Compiler), который берёт исходники борландовского Паскаля (в действительности GPC не компилятор, а конвертор в Си).

В CP/M с Паскалем было хуже, чем с Си. Турбо-Паскаль - почти игрушка, не линкует куски на ассемблере. А Паскаль МТ+ генерит раза в два более тормозной и объёмный код, чем Си (Aztec, BDS и Small). Был ещё паскаль PS80, но без доков. Альтернативы Паскалю МТ+ не было, а он менее эффективен, чем Си. Потому в CP/M все программисты для ОРИОНА предпочли Си. Знаю по каталогам в западных журналах в начале 90-тых, что существовала куча компиляторов Паскаля для Z80. Куда они делись?

Если бы эффективный Паскаль был бы, я бы, естественно, предпочёл бы его, а не PL/M. Буду ждать Паскаля более эффективного или хотя бы с меньшей RUN-тайм библиотекой, чем Паскаль МТ+.

Error404
02.01.2018, 21:58
Музычка приятная. Это beeper или ВИ53?

Kakos_nonos
03.01.2018, 12:20
То просто музычка, для видео. В самой игре кроме пи-пи звука нет :-)

Ратмир
03.01.2018, 14:26
Игра есть с расширением .wav? Чтоб в реале поиграть.