Вход

Просмотр полной версии : Игра "Зона" на ДВК



Страницы : [1] 2

PATHNK
16.07.2018, 09:34
Играл в девяностых на ДВК в игру "Зона" (ничего общего с криминалом).
Этажи/локации изображены в виде текста, сам герой в виде какого-то символа (@).
Вопрос, эта игра известная или была написана нашими студентами?
Сам очень далек от ДВК.
Помню активно игрались в "Кот рыболов", "Клад", "Диггер" и еще какая-то игра с главным героем в шляпе.
Было интересно :) .
Спасибо за внимание.

svofski
16.07.2018, 11:43
Игра скорее всего называлась Сталкер (STALK.SAV) и это был отечественный Rogue по мотивам "Пикника на обочине": http://pdp-11.org.ru/~form/rtgames/

PATHNK
16.07.2018, 18:34
[/url]
Похожа. А есть там объект "Бродячий торговый автомат"?
У нас называлась "ЗОНА" 100% помню.

svofski
16.07.2018, 20:29
Не проверял именно эту, но в той, что я играл в детстве, был. Подавал только по пятницам.

PATHNK
17.07.2018, 14:03
+
А какой там язык программирования? Реально перенести на Спектрум?

Hunta
17.07.2018, 14:23
MACRO-11 поди. Если, конечно, исходник остался. Иначе - команды PDP-11 :)

MacBuster
17.07.2018, 21:51
Иначе - команды PDP-11
Никиту Зимина это не испугало, успешно перенес на УКНЦ несколько игр.

hobot
17.07.2018, 22:32
Не проверял именно эту, но в той, что я играл в детстве, был. Подавал только по пятницам. если в банке 0 или минус, иначе можно было купить еды (как минимум).
Тут с названиями картина такая, классический "Сталкер" сам файл назывался STALK.SAV, PIKNIK.SAV, а вот вариант игры с названием ZONA - отличался от оригинала отсутствием доп.уровней, там было только восемь этажей (0..7) и всё. Если честно я бы предложил всю эту тему в тему Обсуждаем игры перенести (если автор темы не против), совсем не понял, зачем потребовалось отдельную тему создавать. Кстати говоря все эти вопросы уже задавались и обсуждались в выше указанной теме и в теме поиска файлов. В пору модераторам "замечание" сделать топикстартеру (как минимум за лень и не желание читать раздел форума)

Hunta
17.07.2018, 22:50
Никиту Зимина это не испугало, успешно перенес на УКНЦ несколько игр.
А разве я сказал, что это должно пугать?
Но есть один нюанс. Я правильно помню, что Спектрум восьмибитный? Думаю, это, как минимум, затруднит перенос. Но поскольку с PDP на 580-ый или Z80 ничего не переносил (хотя пару программ написал - типа по мотивам - на Микрошу) - это только мысли вслух.

MacBuster
17.07.2018, 23:07
Заглянул внутрь, торговый автомат есть.

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


Я правильно помню, что Спектрум восьмибитный?
Правильно.


Думаю, это, как минимум, затруднит перенос.
Пока не вижу оснований так думать. Скорее ВТ-52 может затруднить.

Hunta
17.07.2018, 23:49
Пока не вижу оснований так думать
Из 8 в 16 или из 16 в 8 - разница, я думаю, есть - как только начнёшь играться с 16-битными данными.
Как раз с VT-52 особых проблем не должно быть - не зря же их и на 8-ми битках клепали

nzeemin
18.07.2018, 00:36
STALK.SAV 47 блоков... это 23 КБ примерно. Многовато для текстовой игрушки.
Я как-то пробовал ковырять "Королевство Эйфория", там внутри мешанина, потому что делалось как раз НЕ на Макро-11, а на чём-то вроде Forth или Паскаль.
Думаю что тут такая же картина.

Hunta
18.07.2018, 08:27
а на чём-то вроде Forth или Паскаль.
Вполне могло быть написано на ФОРТРАН-е или компилируемом Бейсике. В принципе, Фортран или Oregon Паскаль достаточно легко распознаются по начальному куску кода.
Насчёт Forth-а не скажу - во времена плотной работы на PDP-подобном попалась только одна какая то одна прога на Forth-е. Помню только, что я из неё выковырял сам интерпретатор Forth-а

hobot
18.07.2018, 08:31
делалось как раз НЕ на Макро-11
скорее всего Паскаль - он там в конце лепит кучу текста сообщений по стандартным ошибкам

это 23 КБ примерно
ещё в игре очень много текста - по моему текст как раз и весит больше всего
был бы исходник можно было бы на другом Паскале перетранслировать в макро, но экономия была бы
меньше 10 блоков. честно, не представляю как такой рогалик на голом макро-11 писать = это мука +

47блоков - вообще то их там несколько вариантов разного размера
одноэтажный весил меньше всех = это и был zona.sav

текст в игре дессом каждый правил как хотел, сейчас первоисточник даже
в исполняемом файле надо специально искать )

лично для меня эта игра = первый длительный контакт с ДВК и Фрязинским
дисплеем. Романтика в общем.

http://zx-pk.ru/threads/3546-igry-na-uknts.html?p=527941&viewfull=1#post527941 - отсюда и дальше по тексту в обе стороны

MacBuster
18.07.2018, 09:54
Из 8 в 16 или из 16 в 8 - разница, я думаю, есть - как только начнёшь играться с 16-битными данными.
У i8080 и Z80 пары регистров 16-разрядные, так что разницы нет. И я думал что там 16 разрядов только для указателей на строки используются.

Текста там примерно 4КБ от всего объема и ещё какой-то небольшой набор системных диагностических сообщений.

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

На разных дисках разные версии лежат. Одна показывает строку «(C) Ульяновск УЛПИ ***Голография***» и подсказку про кнопку «H», а вторая вместо этого пишет "если хочешь быть здоров..."

PATHNK
18.07.2018, 15:55
Если честно я бы предложил всю эту тему в тему Обсуждаем игры перенести (если автор темы не против)
Не против.


В пору модераторам "замечание" сделать топикстартеру (как минимум за лень и не желание читать раздел форума)
Тему создавал с целью найти людей которые перенесут за вознаграждение (!) игру на Спектрум.
Но не уверен еще, что это кому-то надо.

hobot
18.07.2018, 20:05
Но не уверен еще, что это кому-то надо.
1 в 1 переносить ? а у спектрума хватит текстового экрана интересно по ширине - просто я не в курсе.
На спектруме такой продвинутый бейсик, ИМХО: лучше бы кто то из спектрумистов фанатов рогаликов с нуля свежий рогалик на "злобу дня" для спека сочинил. Был бы свой оригинальный Сталкероподобный текстовый(символьный)РПГ-Action = сюжетов море, надо просто садиться и писать-создавать геймплей.

Главное, что бы тот кто пишет не считал, что время даром тратит, ведь потом довольно забавно наблюдать
как созданный тобой крохотный мирок живёт своей жизнью.



«(C) Ульяновск УЛПИ ***Голография***»
на самом деле вариантов больше чем два - но вот этот один из самых похожих на первоисточник.
Есть ещё подписанный olegH там так-же "левого текста" я не заметил (могу ошибаться). Просто юмор
в этой игре не вполне понятен современникам. Кто вспомнит откуда фраза "Влип очкарик" ? И конечно
несмотря на всю романтику игровой процесс Сталкера далёк от идеала - но на момент актуальности игры
это было и самоиронично и диалог с игроком и просто вдохновляло к хорошей литературе и программированию.


за вознаграждение
тем более (!) лучше предложить написать красивый символьный или даже графический рогалик по духу и атмосферности схожий. Вселенную (игровой мир) накидайте сценарий и пишите на бейсике - спектрум может. )

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

и раз уж тема о рогаликах = Страна Монстров Зеленоградская всё ещё не найдена,
огромная просьба счастливых обладателей копии игры, любой информацией или
авторов из Инициативной группы "MAPLE" (на момент создания) откликнуться и
поделиться этим знанием со мной или выйти на связь.

По "Стране Монстров" буду рад любому ответу. )

PATHNK
18.07.2018, 21:35
1 в 1 переносить ? а у спектрума хватит текстового экрана интересно по ширине - просто я не в курсе.
24*32
Можно заменить символы на графику, сделать перевод на английский, заставку и музыку.
Если бы были исходники на Паскале точно бы вдохновился на финансирование.
Свое что-то городить не хочу.
Бейсик не нужен.

MacBuster
18.07.2018, 21:37
24*32
Что мешает использовать 51x24 или 64x24?


Можно заменить символы на графику, сделать перевод на английский, заставку и музыку.
Вы определитесь для начала что хотите и на что готовы, потом уже предлагайте портировать.

Переносить в таком виде, как игра есть на ДВК, особого смысла не имеет.

PATHNK
18.07.2018, 22:08
Что мешает использовать 51x24 или 64x24?
Таких режимов нет. Есть 256*192 пикселей.


Вы определитесь для начала что хотите и на что готовы
Так определился же.



Переносить в таком виде, как игра есть на ДВК, особого смысла не имеет.
А что имеет по вашему мнению?

hobot
18.07.2018, 22:33
Таких режимов нет.
80Х24 символа это рабочий экран вт-52 , если не ошибаюсь,
под такой экран написана оригинальная игра.

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


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

сюжет лабиринт в заброшенных штольнях, хоррор, зомби, чёрные монахи, крысы, вампиры, сокровища
вот вам и оригинальный рогалик для спека.

MacBuster
18.07.2018, 22:38
Таких режимов нет. Есть 256*192 пикселей.
О каких режимах речь? Вы в самом деле ни разу не видели на спектруме программ, которые выводят текст куда плотнее чем 32 на 24?

Представьте что буквы на экране шириной не 8, а 6 пикселей. Сколько получится букв в строке? Правильно, 42. А если сделать ширину всего 4 пикселя? Уже 64. С высотой тот же фокус.


А что имеет по вашему мнению?
Использовать буквы для представления предметов на машине, где нет текстового режима это дикость.

PATHNK
18.07.2018, 22:45
Представьте что буквы на экране шириной не 8, а 6 пикселей.
Вы просто предложили 64, а 4 точки на символ мало.


Использовать буквы для представления предметов на машине, где нет текстового режима это дикость.
Не согласен, это же ретро :). Вот пример (https://store.steampowered.com/app/603390/Stone_Story_RPG/).
Да я и предлагал графику использовать.

hobot
18.07.2018, 22:49
это дикость.
в то время как на терминалах pdp совсем другая философия (технология) в основе.

MacBuster
19.07.2018, 00:42
STALK.SAV 47 блоков... это 23 КБ примерно. Многовато для текстовой игрушки.
Она после запуска ещё и «распаковывается» и раскидывается по оперативной памяти ЦП.
Правда смысла в этом почти нет, принимая во внимание почти полное отсутствие эффекта от сжатия. т.к. распаковывается в 24Кб.

PATHNK
19.07.2018, 08:44
в то время как на терминалах pdp совсем другая философия (технология) в основе.

СТАЛКЕР поинтереснее будет?



Она после запуска ещё и «распаковывается» и раскидывается по оперативной памяти ЦП.
А можно это перевести в какой-то язык высокого уровня, чтобы потом закодировать на Ассемблере? Или удобнее сразу "в лоб" на Спектрум кодировать?
Просто если будет текст на Паскале, то портировать сможет практически любой спектрумист кодер.
И по трудозатратам дизассамблирование с ДВК сколько времени может занять ~?

MacBuster
19.07.2018, 08:57
А можно это перевести в какой-то язык высокого уровня, чтобы потом закодировать на Ассемблере?
Не знаю. Но это похоже на попытку перевести с русского на японский, потому что нужен перевод на португальский.

Hunta
19.07.2018, 09:07
Просто если будет текст на Паскале
Что бы получить текст на Паскале, нужно будет сначала получить текст на Macro-11, который потом перевести на Паскаль, стараясь при этом не попасть под очарование Macro-11 и PDP-11

shattered
19.07.2018, 21:31
просто напишите эмулятор pdp11 для zx :)

MacBuster
19.07.2018, 21:54
просто напишите эмулятор pdp11 для zx
Собственно, если просто процессор эмулировать, с минимумом команд (которые используются в игре) - это почти не вопрос, код будет работать и выполняться в 5-7 раз медленнее чем аналогичный код для Z80. В данном случае на это нам наплевать.
Но, т.к. там почти наверняка нет самомодифицируемого кода, достаточно будет один раз произвести рекомпиляцию программы, сразу перегнать код PDP11 в код Z80. Для этого надо предварительно отделить код от данных. Ну и сделать замену обращений к функциям из ПЗУ и ОС. Без RT11 игра не работает, я проверил.

PATHNK
19.07.2018, 22:28
+
Я бегло посмотрел, правда не все, и сразу понял, что нужно многое переделывать, например, такое управление на Спектруме не принято. В итоге скорее всего получится игра "по мотивам" и будет перекликаться с этой (http://www.worldofspectrum.org/infoseek.cgi?regexp=^Stalker$&pub=^X-Project+Association$&loadpics=1).

MacBuster
19.07.2018, 22:34
В итоге скорее всего получится игра "по мотивам"
Это не плохо.


и будет перекликаться с этой.
Так это же Laser Squad.

PATHNK
19.07.2018, 23:10
Так это же Laser Squad.
Это не он, от него только спрайты.

Titus
20.07.2018, 02:26
Собственно, если просто процессор эмулировать, с минимумом команд (которые используются в игре) - это почти не вопрос, код будет работать и выполняться в 5-7 раз медленнее чем аналогичный код для Z80. В данном случае на это нам наплевать.
Мне кажется, что ты слишком оптимистично смотришь) При эмуляции - в 20-30 раз минимум, я думаю)
Кроме того, нет минимума команд. Даже если в игре используется 50% команд процессора, и 50% методов адресации - это все равно будет по сложности, как 90% эмуляции всего PDP-11, я думаю.

MacBuster
20.07.2018, 08:16
Мне кажется, что ты слишком оптимистично смотришь)
Я исхожу из своего опыта реализации эмулятора ARMv11 и M68k для спектрума.


При эмуляции - в 20-30 раз минимум, я думаю)
Это только если явно оставить себе такую цель, сделать самый тормозной эмулятор процессора.

Titus
20.07.2018, 08:27
Это только если явно оставить себе такую цель, сделать самый тормозной эмулятор процессора.
Не тормозной, а точный. Флаги и все такое прочее.

Hunta
20.07.2018, 08:39
просто напишите эмулятор pdp11 для zx
Уже даже интересно, с какой скоростью он будет тормозить ;)

CodeMaster
20.07.2018, 10:00
Представьте что буквы на экране шириной не 8, а 6 пикселей. Сколько получится букв в строке? Правильно, 42. А если сделать ширину всего 4 пикселя? Уже 64. С высотой тот же фокус.

И линзу с водой как в КВН, что бы юзабильно было.

MacBuster
21.07.2018, 14:44
И линзу с водой как в КВН, что бы юзабильно было.
Линза никак не поможет сделать буквы более читаемыми, просто станет ещё страшнее. Ну и к юзабельности это никакого отношения не имеет.

nzeemin
22.07.2018, 16:17
И по трудозатратам дизассамблирование с ДВК сколько времени может занять ~?

Думаю, порядка 3-6 недель по вечерам и выходным. Это при условии знания ассемблера PDP-11, иначе ещё плюс неделя-две.

Начать нужно с того что получить дамп памяти сразу после распаковки. Плюс нужно знать точку запуска в этом дампе.
Следующее, что я обычно делаю -- запускаю в эмуляторе со сбором трассы -- т.е. дизасм каждой команды идёт в лог. Полученный лог делаем sort & uniq, получая отсортированный по адресу листинг только того что выполнялось. В последствии повторяем этот процесс для интересующей нас логики либо вручную дизасмим кусочки с заданного адреса, дополняя полученный листинг.
Дальше ещё выполняем ручной анализ, выявляем где какие переменные, где игровое поле, где работа с экраном, со звуком, где получение команд и их интерпретация итд. Так постепенно будет восстановлена логика.

Тут бы ещё очень помог умный дизасмер. Это когда ты даёшь ему дамп и точку старта, а он от точки старта дизасмит команды одну за другой, и все ветвления запоминает для последующего анализа по обоим направлениям -- так получится бОльшая часть листинга почти сразу, кроме тяжёлых случаях типа переходов по таблице.
Я уже думал о том чтобы сделать такой дизасм, но как-то всё было не до того.

PATHNK
23.07.2018, 14:41
Думаю, порядка 3-6 недель по вечерам и выходным. Это при условии знания ассемблера PDP-11, иначе ещё плюс неделя-две.
Уже отказался делать точную копию.
Если будет вдохновение сделаю "бродилку" пошаговую как в оригинале с поиском золота/пищи/воды, а также монстрами по принципу сказки: чем дальше тем страшнее.

hobot
24.07.2018, 23:12
Уже отказался делать точную копию.
в эмуляторе всегда можно понастольгировать-погонять

randomizer
27.07.2018, 04:08
Тут бы ещё очень помог умный дизасмер. Это когда ты даёшь ему дамп и точку старта, а он от точки старта дизасмит команды одну за другой, и все ветвления запоминает для последующего анализа по обоим направлениям -- так получится бОльшая часть листинга почти сразу, кроме тяжёлых случаях типа переходов по таблице.
Я уже думал о том чтобы сделать такой дизасм, но как-то всё было не до того.

Так есть же Hex-Rays IDA (https://www.hex-rays.com/) :-)
https://thumb.ibb.co/jERUb8/2018_07_27_1.png (https://ibb.co/jERUb8)

MacBuster
28.07.2018, 21:52
Тут бы ещё очень помог умный дизасмер
Мне почему-то кажется, что Никита имел ввиду человека, а не программу ;)

PATHNK
18.08.2018, 22:21
Вот (https://www.youtube.com/watch?v=jsaO3fA6aeo) кстати по game play'ю похожа на Зону: ход игрока на клетку и ход врагов.

MacBuster
12.10.2018, 09:33
Что мешает сделать игровое поле скроллируемым и добавить кнопку уменьшения масштаба, чтобы осмотреться?

И давно уже пора кому-нибудь в ReDASM (https://github.com/REDasmOrg) добавить PDP-11 с RT-11 .SAV :P

ram_scan
12.10.2018, 16:57
Так есть же Hex-Rays IDA (https://www.hex-rays.com/) :-)


Рентген там работает только для x86 и, возможно сейчас уже и для x86-64 (давно не игрался) и только для компиляторов нюансы кодогенерации которых он знает в лицо. По состоянию на сегодня это MSVC и усе.

shattered
12.05.2019, 11:46
добавить кнопку уменьшения масштаба, чтобы осмотреться?

и телепорт к золотому шару сразу :)

игра тем и хороша, что недружелюбна к сталкеру.

https://i.imgur.com/ElC7p1t.png

(зашел в ведьмин студень - помер)

hobot
13.05.2019, 03:09
(зашел в ведьмин студень - помер)
вызывай джина - только в рюкзаке хотя бы 1 предмет надо иметь - джин вытащит )

МакБастер в своём стиле - бредит конкретно )))

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


и телепорт к золотому шару сразу
символ кирки и шара одинаковый ) Капишь?

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

И если уж писать "новый вариант" Зоны - надо :
вводить городские локации - бар Боржчь, Интситут
добавить возможность сбывать хабар, выполнять заказы,
иметь плоскую скроллированную карту игрового мира - достаточно большую что бы интересно было сыграть 1 раз.
В классическом варианте - это идеальная игра для "сыграем ещё разок!"
Кстати говоря вариант игры "ЗОНА" я так и не нащупал ни на одной дискете - различия я не однократно описывал уже )

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


и телепорт к золотому шару сразу
ищи и читай папирусы - там координаты полезных предметов иногда пишут )))

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


Вот (https://www.youtube.com/watch?v=jsaO3fA6aeo) кстати по game play'ю похожа на Зону: ход игрока на клетку и ход врагов. так это ж Рогу ) А Рогу Лайк тут (Рогалик) https://zx-pk.ru/threads/25890-povelitel-oriona-master-of-orion-i-drugie-igry-dlya-dos-i-windows-raznykh-let.html?p=949085&viewfull=1#post949085

shattered
13.05.2019, 21:58
И если уж писать "новый вариант" Зоны - надо :
вводить городские локации - бар Боржчь, Интситут
добавить возможность сбывать хабар, выполнять заказы,

и грабить караваны, ага. быстрее будет дождаться Сталкера 2 :)

Hunta
13.05.2019, 22:26
"Можно грабить корованы"
Классиков надо цитировать дословно ;)

hobot
14.05.2019, 05:53
Сталкера-2 дождаться? не знаю о чём вы, я подразумевал делать максимально к тексту повести и сюжету рогалик.
"Зел.Гост.-2" под MS-DOS тут, если кому любопытно > https://www.old-games.ru/forum/threads/zelenogradskaja-gostinica-2.45234/

Hunta
14.05.2019, 09:49
делать максимально к тексту повести и сюжету рогалик
"Я джва года хочу такую игру."

shattered
14.05.2019, 09:51
Сталкера-2 дождаться? не знаю о чём вы

объявили, что к 2021 году таки выпустят продолжение s.t.a.l.k.er.

hobot
25.05.2019, 08:36
скрин говорящий


PУC
TALKER БК-0011M VERSION
ЗАГАДАЙTE ЧИCЛO.MOЖET БЫTЬ, OHO BАM ПPИГOДИTCЯ... TАM...

hobot
18.08.2019, 15:56
Очень красивая версия игры под MS DOS \ Win,
проверенный рабочий архив
http://rilarhiv.ru/roguelike/stalk.rar
Ресурс интересен тем кому интересен (из серии |> игры для админов (http://rilarhiv.ru/roguelike.htm) <)

hobot
19.08.2019, 05:25
shattered, дос версия хорошая вышла спору нет.

SuperMax
19.08.2019, 05:52
Очень красивая версия игры под MS DOS \ Win,
проверенный рабочий архив
http://rilarhiv.ru/roguelike/stalk.rar
Ресурс интересен тем кому интересен (из серии |> игры для админов (http://rilarhiv.ru/roguelike.htm) <)

хороший ресурс - откину в зеркало http://mirrors.pdp-11.ru/_x86_/rilarhiv.ru/

shattered
19.08.2019, 15:25
shattered, дос версия хорошая вышла спору нет. А вот "Страна Монстров" под РТ-шку от Зеленоградцев так и не всплыла до сих пор,

Кстати, вариант для Корвета тоже интересно найти.

hobot
19.08.2019, 17:58
Кстати, вариант для Корвета
а то что символьная тут была-проплывала разве не она?

https://pic.maxiol.com/thumbs/1566226683.787615417.sm1.png (https://pic.maxiol.com/?v=1566226683.787615417.sm1.png)

shattered
02.11.2019, 17:30
Примерно сотая попытка пройти Зону:


https://www.youtube.com/watch?v=0y7RggMs_Ro

hobot
02.11.2019, 18:36
shattered, зверь, который не нападает может быть превращён в еду, а может просто быть стоячим,
его надо проверять на "убегаемость"...

с отрицательным или 0-вым счётом в банке тебя в следующее подземелье не пустят

если рюкзак забит призраками - джин тебе в помощь!

nzeemin
17.03.2021, 14:47
Что имею сказать...
По всей видимости, первоначально игра была написана на Паскале ДВК - судя по совпадающему блоку сообщений из PASDWK.OBJ.
Причём написана была под кодировку КОИ7.
Со временем видимо "хакеры" приспособили её под КОИ8.


**************** Hacked by O l e g H. 25. 10. 91. ****************
Corrected by LDN August 1993
Внимание !!! Программа выводит текстовые сообщения в коде КОИ-8, поэтому вы должны иметь драйвер, обслуживающий терминал в КОИ-8. (например, мой TS.SYS для УКНЦ).
Олег Ховайко, (UB5AJV).

nzeemin
03.04.2021, 13:54
Для желающий поиграть в STALK без всякой настройки - выложил образ для онлайн-эмулятора:
https://nzeemin.github.io/ukncbtl-wasm/index.html?state=https://nzeemin.github.io/ukncbtl/stalk.uknc&run=1

Ребят, подскажите ещё, не могу найти тему - Alex_K говорил про какой-то конвертер для .OBJ-файлов, позволяющий получить что-то вроде исходников - помнится, какую-то графическую библиотеку он этим развернул. hobot может ты помнишь?

Hunta
03.04.2021, 15:21
Под RSX - DOB.

Под RT его вариант тоже вроде был - надо искать по лентам DECUS.

И что то похожее было под RT.

Но учитывая то, что формат общий и всегда можно было obj перегнать в RSX - RT-шными вариантами я никогда особо не интересовался.

hobot
03.04.2021, 18:46
Для желающий поиграть в STALK без всякой настройки - выложил образ для онлайн-эмулятора:
https://nzeemin.github.io/ukncbtl-wa...alk.uknc&run=1

в шапке ссылка "символьные игры" https://zx-pk.ru/threads/32383-ukncbtl-wasm-uk-nts-on-line.html



nzeemin, https://zx-pk.ru/threads/31445-rekonstruktsiya-cglib-dlya-ispolzovaniya-iz-omsi-pascal.html?p=1049443&viewfull=1#post1049443 нашёл упоминание - особо не вникал в ту тему...

nzeemin
04.04.2021, 13:52
Да, спасибо. Но DECOBJ на этом PASDWK.OBJ что-то сразу умер.
Ну да ладно, этот Паскаль в MAC-файлы генерирует вывод, разберусь как-нибудь.

nzeemin
04.04.2021, 19:05
Задача "получить хоть какой-то дизасм" можно считать выполненной.
Сделал .MAC-файл, который компилируется в 1:1 тот же .SAV файл - здесь в аттаче.
Строки разобраны, но ссылки почти не проставлены.
Но зато очертания в целом уже видны.
Дальше видимо буду причёсывать и комментировать.

Alex_K
04.04.2021, 23:11
Дальше видимо буду причёсывать и комментировать.
Мощно!!! Но разбираться в Паскале будет не очень приятно. Всё таки язык высокого уровня и особой оптимизации нет. Ещё не дизассемблированы команды FIS, есть там парочка. Соответственно присутствует и эмулятор FIS.
Желаю творческих успехов!!!

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


Но DECOBJ на этом PASDWK.OBJ что-то сразу умер.
PASDWK.OBJ является библиотекой. Её сначала надо с помощью LIBR разбить на отдельные объектные файлы, а потом на каждый файл натравливать DECOBJ. DECOBJ требует много памяти, всё лишнее надо выгрузить, в том числе и SL.

Hunta
05.04.2021, 00:03
http://www.kpxx.ru/Soft/Utils/Stalk

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

Какое то время назад (до DisAsm-11) начал дизассемблировать Digger, который тоже на Паскале написан. Очень помогает результат трансляции стандартных операторов Паскаля (FOR, CASE), а так же некоторые служебные действия (типа проверки выхода индекса за пределы массива) убирать в макросы. Сильно сокращается текст и улучшается понимание логики. Но вот что делать с переменными на стеке - пока особых мыслей нет. Пример кода:



PROCEDURE M2070
BEGIN
CALL M72264 ; 002070 004767 070170

P.FOR IDXVAR R5 AT #3654 FROM #1 TO #17 BEGIN

LET R0 := 32(SP) + 3654(R5) - #1 ; 002134 016600 000032
PUSH R0 ; 002146 010046
PUSH 32(SP) ; 002150 016646 000032
LET R0 := 3654(R5) ; 002154 016500 003654
CHKARR INDEX R0 AT RANGE LOW #1 HIGH #17

LET R0 := R0 + SP ; 002200 060600
PUSH #0 ; 002202 005046
LET TOP :B= 13(R0) ; 002204 116016 000013
CALL M1352 ; 002210 004767 177136

P.END

LET 24(SP) := TOP ; 002230 011666 000024
LET SP := SP + #24 ; 002234 062706 000024
RETURN ; 002240 000207
END M2070

nzeemin
05.04.2021, 00:18
Макросы-шмакросы - это всё конечно хорошо, если оставлять результат там же в MACRO-11 - например, для дальнейших улучшений.
Сначала конечно мне хотелось бы подробнее разобраться в устройстве игры - понятно что это куча if / case но всё же.
Затем надо думать про портирование, это уже обсуждалось тут на первых страницах темы.
И тут уже вопрос - куда, точнее, на каком языке.
Как вариант - вероятно, можно (хоть и довольно трудоёмко), восстановить исходник на том же самом Паскале ДВК.
Либо уже сразу переводить на благородный Си.

Hunta
05.04.2021, 00:25
Макросы-шмакросы - это всё конечно хорошо, если оставлять результат там же в MACRO-11 - например, для дальнейших улучшений.
Нет. Именно для понимания логики. И имеем вместо



MOV 26(SP), R0

SWAB R0
BIC #377, R0

ASL R0
ADD R5, R0
MOV 22(R5), R1

ASL R1
ASL R1
ASL R1
ASL R1
ASL R1
ADD R0, R1
ADD 24(R5), R1

CMPB 27(R1), #136


а дальше опять



MOV 26(SP), R1

SWAB R1
BIC #377, R1

ASL R1
ASL R1
ADD R5, R1
MOV 22(R5), R2

ASL R2
ASL R2
ASL R2
ASL R2
ASL R2
ASL R2
ADD R1, R2
MOV 24(R5), R1


- по одной строке.

Ну, это не я сталкера восстанавливаю, так что в принципе - не мои заботы.

zebest
05.04.2021, 10:34
Какое то время назад (до DisAsm-11) начал дизассемблировать Digger, который тоже на Паскале написан.
И как успехи?? Фарш получилось "прокрутить назад" ? Обратно собирается из асм-а? Можно добавить свои уровни к уже существующим или новую логику??

Hunta
05.04.2021, 11:27
И как успехи?? Фарш получилось "прокрутить назад" ? Обратно собирается из асм-а?
Собирался из восстанавливаемого исходника он с самого начала работы над ним.

Но до конца дизасм не доведён - основная цель была - не восстановление текста - это было ещё не осознанное обдумывание, как выяснилось, DisAsm-11

Может быть, со временем доведу до логического конца, но уже отрабатывая функционал DisAsm-11.

nzeemin
05.04.2021, 22:56
Вопрос к специалистам по Паскалю ДВК (он же OMSI Pascal):
Как сделать печать строки черз WRITE, но чтобы в строке были спецсимволы, например, табуляция, переносы строк, ESC-последовательности?
Я вижу по коду что это было сделано, то есть это можно сделать, но не понимаю как в синтаксисе Паскаля это записать.


WRITE('Строка',CHR(13))
- такой код даст не то что нужно, это будет два вызова - один WRITE для строки и один печать символа.

hobot
05.04.2021, 23:10
может поправить в быстро-помощи STALK: "Т - Взять предмет на кОтором стоишь"


т - BЗЯТЬ ПPEДMEТ, НA КOТOPOM CТOИШЬ

не совсем понял, что и где ты предлагаешь поправлять? эта строка из ХЭЛПА игры, если что, он в во всех версиях одинаков вроде бы???



DECOBJ
я вот только не уловил - где вы берёте эту программулину?


Ого, да неужто вы СТАЛКЕРА куда-то портировать собрались?
Если кто помнит, то версия для MS DOS (http://rilarhiv.ru/roguelike/stalk.rar) есть и очень красивая ...

Hunta
05.04.2021, 23:19
не совсем понял, что и где ты предлагаешь поправлять? эта строка из ХЭЛПА игры, если что, он в во всех версиях одинаков вроде бы???
Вот это


.ASCII |T - Взять предмет, на клтором стоишь|<CR>

hobot
05.04.2021, 23:22
Я вижу по коду что это было сделано, то есть это можно сделать, но не понимаю как в синтаксисе Паскаля это записать.

а что тебя смущает - честно не понял?
у табуляции "номер символа" 9., соотв. WRITE(CHR(9)); ПРЕНОС СТРОКИ В КОНЦЕ СТРОКИ (АВТОМАТОМ) = WRITELN('///');

ESC - ПОСЛЕДОВАТЕЛЬНОСТИ
можно реализовать так как в процедуре позиционирования курсора, а можно сделать отдельную процедуру
для вывода каждого символа отдельно, ПАСКАЛЬ, наверное лучше в теме ПАСКАЛЯ обсуждать? Там же куча шпаргалок
уже и искать \ читать в одной теме удобнее, я продолжу ответ там...

hobot
05.04.2021, 23:25
Вот это
у меня что то не видать такой опечатки в готовых играх, вы специально такую версию взялись мучить?

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


это внутренний Н игры по онлайн ссылочке такое показывает:
почему у меня игры с нормальной строкой без опечаток? вы специально такой Сталк подыскали что ли ?
DESSом залезьте перед дезасмом и правьте что хотите там...

Hunta
05.04.2021, 23:27
DESSом залезьте перед дезасмом и правьте что хотите там...
Нахрена. Я и в исходнике могу теперь поправить.

nzeemin
05.04.2021, 23:41
а что тебя смущает - честно не понял?


PROGRAM HELLO;

BEGIN
WRITELN('pRIVET MIR',CHR(15));
END.

rt11 RU PASDWK.SAV HELLO,HELLO=HELLO.PAS

.GLOBL $RESR6,$RESR5,$KORE,$SAV10,$VER
.GLOBL $BEGIN,FILE,$TTY,$END
.RADIX 10
$VER=59.
$BEGIN:
JSR %7,$B127
.GLOBL $B127
MOV #L0,-(6)
MOV #10,-(6)
CLR -(6)
JSR %7,$B32
.GLOBL $B32 <-- это WRITE('pRIVET MIR')
MOV #15,-(6)
CLR -(6)
JSR %7,$B20 <-- это WRITE(CHR(15)) -- лишний вызов
.GLOBL $B20
JSR %7,$B36 <-- это WRITELN
.GLOBL $B36
JMP $END
L0: .WORD 21104
.WORD 22089
.WORD 21573
.WORD 19744
.WORD 21065
.WORD 0
.END

В коде Сталкера есть строки, которые содержат спецсимволы ПРЯМО В СТРОКЕ, без лишних вызовов печати для них.

L40450: .ASCIZ <011><011>/Темный коридор ... /<000>
Я хочу понять как внедрить спецсимволы в строку, какой синтаксис использовать.

Hunta
05.04.2021, 23:51
Write('#11#11Темный коридор ... ') ?

hobot
05.04.2021, 23:54
Я хочу понять как внедрить спецсимволы в строку, какой синтаксис использовать.
я всё равно не понимаю, что ты "спец-символами" называешь??? посмотри мой ответ в теме Паскаля и прибавь к нему
возможность такую WRITELN('Привет мир!',' ':10);
или WRITE(CHR(9),' - это табуляция','':10,' - а это просто ничего ;^)');

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


Write('#11#11Темный коридор ... ') ?
что за бред? откуда вы это всё тащите???

nzeemin
06.04.2021, 00:06
Write('#11#11Темный коридор ... ') ?

Нет, не угадал.
Это работает во FreePascal, но вне кавычек конечно: Write(#9#9'Темный коридор ... ')

Hunta
06.04.2021, 00:07
что за бред? откуда вы это всё тащите???
Отвали


nzeemin, Write(CHR(9)+CHR(9)+'Темный коридор ... ')? (у меня нет под рукой компилятора)

Oleg N. Cher
06.04.2021, 00:07
Хобот, тут Никита о том, что Паскаль в случае Write('abc', CHR(15), ...) не сливает спецсимволы в одну строку, чтобы вывести её разом, но вместо этого генерит несколько вызовов.

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

Кстати, Хобот, тут как раз тебе карты в руки, ты ведь много на этих Паскалях кодил, видел исходники. Как записать внедрение кодов в строку? На "большом" Паскале мы делаем это так: Write('abc'+#15)

Hunta
06.04.2021, 00:08
я всё равно не понимаю
вот и не лезь

Oleg N. Cher
06.04.2021, 00:12
nzeemin, может оказаться, что на PASDWK эта проблема решения не имеет, а Zona делалась на другом Паскале.

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


Write(CHR(9)+CHR(9)+'Темный коридор ... ')? (у меня нет под рукой компилятора)У меня есть под рукой компилятор. Так не работает.

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

Write(#9#9'Темный коридор ... ') - так тоже не работает.

hobot
06.04.2021, 00:19
Нет, не угадал.
в текстовом редакторе Nys - табуляцию можно вставлять прямо между ' ' нажатием табуляции ;-)
вот такой код как пример


PROGRAM TROSTROKI;
BEGIN

WRITELN('СТРОКА 1 :');
WRITELN('СТРОКА 2',':':14);
WRITELN('':20,'ПРИВЕТ!!!');
END.

HD7>PASDWK TRISTR=TRISTR

ERRORS DETECTED: 0
FREE MEMORY: 10276 WORDS


HD7>MAC TRISTR

HD7>LIN TRISTR,PASDWK

HD7>RU TRISTR
СТРОКА 1 :
СТРОКА 2 :
ПРИВЕТ!!!

HD7>


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


Кстати, Хобот, тут как раз тебе карты в руки
не надо мне никаких карт, дайте ссылку на DECOBJ и я про эту тему забуду как про кошмар,
что там в .MAC - файле твориться мне всегда было по барабану, хоть на каждую букву по отдельно вызову - мне то что?

И конечно я привел пример выделения количества символов под "переменную" в конце строки и тут в мой ответ в теме по Паскалю...

Hunta
06.04.2021, 00:21
табуляцию можно вставлять прямо между ' ' нажатием табуляции ;-)
Аха, повтори вот это одной строкой



A45016:
.ASCII |J|<CR><LF>|Ладно, я кое-что подскажу. Итак: здесь творится черт знает что,|<CR><LF>|но на восьмом уровне |
.ASCII |лежит золотой шар. Только достав его, Вы|<CR><LF>|сможете выйти из подземелья,придя на то же место, откуда вы |
.ASCII |вышли|<CR><LF>|вначале. Своим глазам не всегда стоит доверять!|<CR><LF>| Вы можете использовать команды:|<CR><LF>
.ASCII |A - Купить (на золото)|<CR><LF>|B - Заменить батареи|<CR><LF>|D - Выбросить предмет|<CR><LF>|E - Поесть|<CR><LF>
.ASCII |F - Приготовиться к сражению|<CR><LF>|H - HELP (этот текст)|<CR><LF>|I - Надеть кольцо|<CR><LF>|J - Обновить |
.ASCII |экран|<CR><LF>|K - Сломать стенку (киркой)|<CR><LF>|L - Включить фонарь|<CR><LF>|M - Приготовить оружие|<CR><LF>
.ASCII |N - Клавиша "Идет начальник" (отбой тревоги - "P")|<CR><LF>|O - Выключить фонарь|<CR><LF>|P - Надеть доспехи|<CR>
.ASCII <LF>|Q - Пить|<CR><LF>|R - Читать папирус|<CR><LF>|S - Свистнуть|<CR><LF>|T - Взять предмет, на клтором стоишь|<CR>
.ASCIZ <LF>|U - Вызвать джинна (только в безнадежном случае!)...|<HT>|Дальше? |

hobot
06.04.2021, 00:26
Аха, повтори вот это одной строкой
зачем? каждая команда отдельной строкой выводиться, а если "любой ценой ради адаптации макро для какого-то немыслимого портирования" - ты хочешь это сделать моей проблемой? вряд ли - ведь программисты тут вы ребята, а я Хобот (просто Хобот, паскалю и операторствую в своё удовольствие, благородные С мыс не изучали, мы простые ребята).

nzeemin
06.04.2021, 00:27
в текстовом редакторе Nys - табуляцию можно вставлять прямо между ' ' нажатием табуляции ;-)
Ну кстати, для табуляции и переносов строк это работает. Остаётся проблема со строками где есть ESC-символы.

Hunta
06.04.2021, 00:28
зачем?
Вот и не лезь тогда. Раз не понял вопроса.

hobot
06.04.2021, 00:34
Остаётся проблема со строками где есть ESC-символы.
какие? почему бы их сразу в регистр терминала не слать без всяких WRITE'ов ???

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

https://zx-pk.ru/threads/20444-pascal-macro11-(uknts-dvk).html?p=1111893&viewfull=1#post1111893

Hunta
06.04.2021, 00:38
почему бы их сразу в регистр терминала не слать без всяких WRITE'ов
Потому что идёт восстановление исходника. Ещё не допёрло?

nzeemin
06.04.2021, 00:44
Ребят, расслабьтесь. Вставка табов/переносов строк на 99% решают проблему. Оставшиеся спецсимволы это вероятно результат более позднего "хацкерства".

Oleg N. Cher
06.04.2021, 01:39
Нашёл вот такую интересную ссылку:

http://www.ibiblio.org/pub/academic/computer-science/history/pdp-11/rsx/decus/rsx82b/351130/readme.1st

OMSI compiled and improved and MAC assembled version of all the
game modules. The OMSI Improver was used to condense the code, some
modules are reduced in size by as much as 12% from the compiler output.
Compiler used was the EIS/FIS V1.2 but no floating math is used.
Что позволяет предположить, что есть утилита OMSI Improver, которая умеет оптимизировать выхлоп после OMSI Pascal, да ещё и весьма неслабо. Это что-то вроде peephole-оптимизатора, заменяющего по встроенному набору правил последовательности асм-инструкций на такие же по функциональности, но более компактные. Мне конечно интересно было бы увидеть эту утилиту, если она найдётся.

Пока я только предположу, что она умеет оптимизировать несколько вызовов Write в один.

hobot
06.04.2021, 02:12
Что позволяет предположить, что есть утилита OMSI Improver
в стандартную поставку ПАСКАЛЯ для СМ-4 и ДВК входит PASIMP.SAV

Oleg N. Cher
06.04.2021, 02:16
Хобот, это оно! Однако пойдёт ли под RT-11 (под эмулятором Патрона)? Если нет, под чем ещё её можно запустить в наших реалиях?

hobot
06.04.2021, 02:28
Что позволяет предположить, что есть утилита OMSI Improver
или просто IMP.SAV

Oleg N. Cher
06.04.2021, 02:29
Ага, или так) Пробуй её натравить на послепаскальный .mac-файл, если конечно получится запустить.

hobot
06.04.2021, 02:40
Хобот, это оно! Однако пойдёт ли под RT-11 (под эмулятором Патрона)? Если нет, под чем ещё её можно запустить в наших реалиях?
не издевайся над здравым смыслом пожалуйста ;-)
под чем ему ещё идти, если он в комплект поставки входит??? ты переутомился, Олег, или перевозбудился )))

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



IMP .SAV 28 03-Nov-2018
PASIMP.SAV 39 03-Nov-2018

HD7>IMP
INPUT FILE? TRISTR.MAC
OUTPUT FILE? TRIST1.MAC
IMPROVEMENT 0 WORDS 0.0%

HD7>IMP
INPUT FILE? TRISTR.PAS
OUTPUT FILE? TRIST1.PAS
IMPROVEMENT 0 WORDS 0.0%

HD7>PASIMP
*TRIST1=TRISTR
IMPROVEMENT 0 WORDS 0.0%

HD7>PASIMP
*TRIST1.MAC=TRISTR.MAC
IMPROVEMENT 0 WORDS 0.0%

HD7>DIR .(PAS,MAC)
TRISTR.PAS 1 06-Apr-2021
TRISTR.MAC 2 06-Apr-2021
TRIST1.PAS 1 06-Apr-2021
TRIST1.MAC 2 06-Apr-2021

HD7>TY TRISTR.MAC
.GLOBL $RESR6,$RESR5,$KORE,$SAV10,$VER
.GLOBL $BEGIN,FILE,$TTY,$END
.RADIX 10
$VER=59.
$BEGIN:
JSR %7,$B127
.GLOBL $B127
MOV #L0,-(6)
MOV #13,-(6)
CLR -(6)
JSR %7,$B32
.GLOBL $B32
JSR %7,$B36
.GLOBL $B36
MOV #L1,-(6)
MOV #10,-(6)
CLR -(6)
JSR %7,$B32
MOV #58,-(6)
MOV #14,-(6)
JSR %7,$B20
.GLOBL $B20
JSR %7,$B36
CLR -(6)
MOV #20,-(6)
JSR %7,$B20
MOV #L2,-(6)
MOV #11,-(6)
CLR -(6)
JSR %7,$B32
JSR %7,$B36
JMP $END
L0: .WORD 29454
.WORD 29300
.WORD 27503
.WORD 8289
.WORD 12559
.WORD 2313
.WORD 58
L1: .WORD 29454
.WORD 29300
.WORD 27503
.WORD 8289
.WORD 12815
.WORD 0
L2: .WORD 28686
.WORD 26994
.WORD 25975
.WORD 3956
.WORD 8481
.WORD 33
.END


HD7>TY TRIST1.MAC
.GLOBL $RESR6,$RESR5,$KORE,$SAV10,$VER
.GLOBL $BEGIN,FILE,$TTY,$END
.RADIX 10
$VER=59.
$BEGIN:
JSR %7,$B127
.GLOBL $B127
MOV #L0,-(6)
MOV #13,-(6)
CLR -(6)
JSR %7,$B32
.GLOBL $B32
JSR %7,$B36
.GLOBL $B36
MOV #L1,-(6)
MOV #10,-(6)
CLR -(6)
JSR %7,$B32
MOV #58,-(6)
MOV #14,-(6)
JSR %7,$B20
.GLOBL $B20
JSR %7,$B36
CLR -(6)
MOV #20,-(6)
JSR %7,$B20
MOV #L2,-(6)
MOV #11,-(6)
CLR -(6)
JSR %7,$B32
JSR %7,$B36
JMP $END
L0: .WORD 29454
.WORD 29300
.WORD 27503
.WORD 8289
.WORD 12559
.WORD 2313
.WORD 58
L1: .WORD 29454
.WORD 29300
.WORD 27503
.WORD 8289
.WORD 12815
.WORD 0
L2: .WORD 28686
.WORD 26994
.WORD 25975
.WORD 3956
.WORD 8481
.WORD 33
.END


HD7>TY TRIST1.PAS
PROGRAM TROSTROKI;
BEGIN
WRITELN('СТРОКА 1 :');
WRITELN('СТРОКА 2',':':14);
WRITELN('':20,'ПРИВЕТ!!!');
END.


HD7>TY TRISTR.PAS
PROGRAM TROSTROKI;
BEGIN

WRITELN('СТРОКА 1 :');
WRITELN('СТРОКА 2',':':14);
WRITELN('':20,'ПРИВЕТ!!!');
END.


HD7>

Oleg N. Cher
06.04.2021, 03:03
Так. Ты ему какой-то слишком простой .mac суёшь. Не оптимизит. Выйгрышь 0%.

Учитывай, что не всяк чел является маньяком систем на PDP-11, так что мне простительно =] Сколько там всяких ваших разных RSX и проч.

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

Чем отличаются IMP от PASIMP? На первый взгляд, IMP для оптимизации ассемблерных прог, а PASIMP для паскальных.

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

nzeemin, апостроф тоже можно юзать, простым удвоением внутри строки.

http://i.piccy_.info/i9/dfc4633a63634db7be66b78dd7b33d56/1617666785/88641/1320134/1497OMSIPAS.png

hobot
06.04.2021, 03:41
Чем отличаются IMP от PASIMP? На первый взгляд, IMP для оптимизации ассемблерных прог, а PASIMP для паскальных.
это в тему Паскаля, я про эти программы узнал, только когда архивом начал заниматься, мне как-то всегда хватало транслятора и библиотеки к нему.

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


IMP для оптимизации ассемблерных прог
так и есть, смотри КНИГУ 3 ПО ДВК

svofski
06.04.2021, 12:08
Вставка табов/переносов строк на 99% решают проблему. Оставшиеся спецсимволы это вероятно результат более позднего "хацкерства".
У этого паскаля Write/WriteLn поддерживает много параметров? Самый простой вариант, не требующих ничего экзотического: Write('abc',chr(9), 'def');

Hunta
06.04.2021, 12:17
Самый простой вариант, не требующих ничего экзотического: Write('abc',chr(9), 'def');

Этот вариант приведён с самого начала, он генерирует другой код, нежели в .SAV файле

nzeemin
06.04.2021, 18:47
Ещё вопрос по Паскалю, извиняюсь заранее.
Почему не работает такой код, как сделать чтобы собиралось?
Идея в чём - передать адрес переменной в виде параметра.
Как решить другой спецификацией READCHAR я знаю прекрасно - можно возвращаемым значением отдать. Но по-другому мне не нужно, нужно именно так.


PROGRAM HELLO;
VAR C:CHAR;

PROCEDURE READCHAR(ADDR:^CHAR);
BEGIN
{тут будет ассемблерный код}
END;

BEGIN
READCHAR(@C);
END.

Сообщение об ошибке:


4 PROCEDURE READCHAR(ADDR:^CHAR);
^ ^
****** BAD TYPE SPECIFICATION

Hunta
06.04.2021, 19:00
type charptr = ^char
....
procedure readchar(addr: charptr)

?

nzeemin
06.04.2021, 19:11
type charptr = ^char
....
procedure readchar(addr: charptr)

?

да, так собралось. спасибо!

Hunta
06.04.2021, 19:27
Не уверен только насчёт этого

READCHAR(@C);

Добрался по компилятора OMSI Паскаля, но есть заковыка - это компилятор второй версии и для RSX :) И судя по тому, что увидел в своих исходниках - похоже, во второй версии они слегка прошлись по синтаксису. Скажем, в модуля под первую версию используют ^, а во второй, в похожих местах - уже @

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

Но это пока мысли вслух. Смотрю.

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

О, нашёл в доке
type = identifier | enumerated_type | .... | ("^" | "@" identifier )
Получается, во второй версии взаимозаменяемы

Alex_K
06.04.2021, 19:54
Ещё вопрос по Паскалю, извиняюсь заранее.
Почему не работает такой код, как сделать чтобы собиралось?
Идея в чём - передать адрес переменной в виде параметра.
Как решить другой спецификацией READCHAR я знаю прекрасно - можно возвращаемым значением отдать. Но по-другому мне не нужно, нужно именно так.
Вроде в стандартном Паскале передача по ссылке идёт со словом VAR:

PROGRAM HELLO;
VAR C:CHAR;

PROCEDURE READCHAR(VAR ADDR:CHAR);
BEGIN
{тут будет ассемблерный код}
END;

BEGIN
READCHAR(C);
END.

Hunta
06.04.2021, 20:10
Вроде в стандартном Паскале передача по ссылке идёт со словом VAR:

Ну, судя по фразе из доков



"NonPascal" Directive___________ _________

The directive "NonPascal" may be used instead of "external" if the
external procedure is written in a language other than Pascal.
"NonPascal" generates the Digital standard calling sequence used
by FORTRAN and most MACRO routines. This calling sequence passes
all parameters by reference, so only "var" parameters may be used.


таки да

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

Вдогонку - дока от второй версии, так что в первой надо проверить

Oleg N. Cher
06.04.2021, 22:30
О, нашёл в доке
Hunta, а можно эту доку от OMSI Pascal 2 глянуть? Спасибо заранее.

Я нашёл книжку по разным особенностям Паскалей тех времён. OMSI там тоже есть. Можно использовать как справочник.

https://ua1lib.org/book/774861/859924?id=774861&secret=859924

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

Кстати, в этом же справочнике я пытался найти как впихнуть в строку символы с произвольным кодом. В OMSI это сделать нельзя.

Hunta
06.04.2021, 23:19
Hunta, а можно эту доку от OMSI Pascal 2 глянуть?
Постараюсь завтра выложить

nzeemin
07.04.2021, 23:43
Восстановил около 350 строк исходника на Паскале.
Всего в ассемблере около 7000 строк кода - я думаю это даст 1000-1200 паскалевских строк.

Alex_K
07.04.2021, 23:58
Восстановил около 350 строк исходника на Паскале.
Всего в ассемблере около 7000 строк кода - я думаю это даст 1000-1200 паскалевских строк.
Есть в этой игре большой плюс - используется только целочисленная арифметика, никакой плавающей запятой.

hobot
08.04.2021, 01:03
Hunta, кстати говоря, form вроде пробовал запускать, но я не помню получилось или нет - работает ли Сталкер под RTEM?

Hunta
08.04.2021, 02:04
Понятия не имею. Но почему бы и нет

Hunta
09.04.2021, 00:06
Наткнулся на такое интересное место...


M12254:
TSTB #1

BNE M12266
JMP M40120

M12266:
MOV 4(R5), R0

nzeemin
09.04.2021, 00:56
Ну так это while true просто.

Там меня другое удивляет - в этом коде есть неструктурный переход - сброс стека и JMP - я вот думаю это ассемблерная вставка или язык как-то позволяет так сделать.


L40036: INC (R5) ; следующее подземелье
L40040: ADD #000062, 000056(R5)
L40046: MOV 050406, SP ; Возвращаем SP к исходному значению
L40052: JMP L06650 ; рестарт игры
; ответили НЕТ на "А дальше пойдете?"
L40056: MOV 050406, SP ; Возвращаем SP к исходному значению
L40062: JMP L40120 ; завершаем игровой цикл

hobot
09.04.2021, 03:15
по теме игры, а не работ по исходнику...
этот символ навсегда стал именоваться как
¬ - студень

¤ - (это не из Сталкера - называли "солнышко")

===============================

Несколько раз были брожения от самых слабых (только БЕЙСИК),
до могучих (напишу что угодно) программистов сделать Сталкер
действительно мощный, по книге, с миссиями, возможностью сбыть
хабар, со статистикой и внятным сюжетом, повесть все взялись читать \ пречитывать
(ради побольше оригинальных названий для предметов и описания к ним надёргать),
но как то всё угомонилось...экзамены у всех и прочее всякое, заглохло, а позже и
тусовка потихоньку растаяла...

И по прежнему вариант игры который имел только одно подземелье и 8 комнат (и всё!!!)
не найден (как и "Страна Монстров" - увы и ах)

Hunta
09.04.2021, 07:44
Ну так это while true просто.
Да, эт я чё то протупил :) Собственно, с дизасмом возился - голова другим занята была :)

nzeemin
09.04.2021, 11:16
по теме игры, а не работ по исходнику...

По теме игры -
- Какое значение имеет кольцо? зачем его надевать/снимать?
- S - свистнуть - зачем?
- Что такое "ВП"?
- Как "проверить зверя на убегаемость"?

Sandro
09.04.2021, 12:48
по теме игры, а не работ по исходнику...
Несколько раз были брожения от самых слабых (только БЕЙСИК),
до могучих (напишу что угодно) программистов сделать Сталкер
действительно мощный, по книге, с миссиями, возможностью сбыть
хабар, со статистикой и внятным сюжетом, повесть все взялись читать \ пречитывать
(ради побольше оригинальных названий для предметов и описания к ним надёргать),
но как то всё угомонилось...экзамены у всех и прочее всякое, заглохло, а позже и
тусовка потихоньку растаяла...

Причина тут очевидная и типичная. Движок программист написать может, не так уж это и сложно. А вот сюжет и тем более наполнение деталями -- это совсем другой труд. Собственно, именно поэтому очень многие игры для отечественных машин по сути представляют собой голый движок с кое-как нарисованными уровнями. Сделать действительно объёмную и интересную игру -- сложно. Тут надо и много воображения, и много труда. Да и просто опыта в разработке таких вещей.

А что книжка не помогла -- понятно. Она же вообще не про Зону и артефакты, там она описана очень мельком, отдельными эпизодами. И артефактов разъяснено штук пять и примерно столько же упомянуто. И всё.

Авторам игры S.T.A.L.K.E.R. пришлось всё придумывать с нуля. Практически всё.

hobot
09.04.2021, 13:37
По теме игры -
- Какое значение имеет кольцо? зачем его надевать/снимать?
- S - свистнуть - зачем?
- Что такое "ВП"?
- Как "проверить зверя на убегаемость"?

1. если кольцо правильное (без заклятия) то надев его ты получаешь (силовое поле)
защиту от всех "не убегающих" зверей, они будут за тобой гоняться, но покусать уже не будут )))

2. свисток найди \ возьми узнаешь ;-) у свистков разные функции, как и у бутылочек )

3. "ВП" - Волшебная Палочка же, (см. к\ф "Чародеи")

4. Если ты на него встал, а надписей типа "ну сейчас он вам покажет!" внизу нет - такого надо жарить [Y],
он в еду превратиться, без еды запаса - не обойтись, следи за вредностью и экономь батареи...
ОТДОХНУТЬ-БЫ - надо обязательно отдыхать иначе кранты - "0".

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

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

Oleg N. Cher
09.04.2021, 19:04
Там меня другое удивляет - в этом коде есть неструктурный переход - сброс стека и JMP - я вот думаю это ассемблерная вставка или язык как-то позволяет так сделать.Там в книге по Паскалю я встречал, что некоторые Паскали поддерживают Break (выход из цикла), Exit (из цикла или из процедуры), ну и, само собой, Goto.

nzeemin
10.04.2021, 19:02
Продолжаю раскопки.
Убедился что версии библиотеки Паскаля у меня и у автора игры - разные. Его версия сконфигурирована так что не использует EIS - вместо DIV стоит цикл.

Нашёл вот этот Паскаль без EIS в библиотеке:
http://archive.pdp-11.org.ru/ukdwk_archive/ukncbtlwebcomplekt\rt11a_wd\rt11a_wd.dsk


HELLO P A S C A L 10- -89 PAGE 1
ДВК "ЭЛЕКТРОНИКА НЦ 8020/2,3,4"

Alex_K
10.04.2021, 19:14
Нашёл вот этот Паскаль без EIS в библиотеке:
А это в каком модуле?

nzeemin
10.04.2021, 19:21
А это в каком модуле?

Это в процедуре $B26:


L52462: CLR R0
L52464: INC R0 ; реализация DIV (R4)+, R0
SUB (R4), R1 ;
BPL L52464 ;
ADD (R4)+, R1 ;
DEC R0 ;
L52476: BNE L52516

Alex_K
10.04.2021, 19:28
Это в процедуре $B26:
У меня такая же библиотека без EIS, всё совпало.

Hunta
10.04.2021, 20:23
Его версия сконфигурирована так что не использует EIS - вместо DIV стоит цикл.
Не скажу наверняка за OMSI Pascal первых версий - игрался больше со второй, но - в поставке было несколько вариантов библиотек (без EIS и плавучки, с EIS без плавучки, с EIS и FIS, с EIS и FPP), а у компилятора был ключ - какой код генерироваться (вот тут с написанием ключей могу ошибаться и они - под RSX, в RT однобуквенные ключи, но если такое же было и в первых версиях, тот смысл будет тот же самый) - типа /EIS /FIS /FPP

nzeemin
11.04.2021, 01:08
Не скажу наверняка за OMSI Pascal первых версий - игрался больше со второй, но - в поставке было несколько вариантов библиотек (без EIS и плавучки, с EIS без плавучки, с EIS и FIS, с EIS и FPP), а у компилятора был ключ - какой код генерироваться (вот тут с написанием ключей могу ошибаться и они - под RSX, в RT однобуквенные ключи, но если такое же было и в первых версиях, тот смысл будет тот же самый) - типа /EIS /FIS /FPP

Здесь это не ключ компиляции, а ответы на вопросы при установке Паскаля из исходного пакета; библиотека выбирается из восьми вариантов.
https://ia800500.us.archive.org/4/items/omsi_pascal-1_ver_1.2_rt-11/OMSI_Pascal-1_Ver_1.2_RT-11.pdf - Page 98

- - - Updated - - -

Думаю, я добрался примерно до половины.
Свой прогресс выкладываю тут:
https://github.com/nzeemin/uknc-various/blob/master/STALK/STALK.MAC
https://github.com/nzeemin/uknc-various/blob/master/STALK-PASCAL/STALK1.PAS

Alex_K
11.04.2021, 14:28
Думаю, я добрался примерно до половины.
ГРОМАДНОЕ СПАСИБО!!! Действительно огромный труд.
Я тоже решил посмотреть библиотеку Паскаля. У меня она без EIS и с поддержкой FIS, также как и в игре.
По поводу использования Паскаля на УКНЦ с его процессором 1801ВМ2 - в модуле SUPRNM есть довольно опасные команды:

L52106: MOV (PC), R3
L52110: ADD R0, R1
L52112: CALL 057212
Результаты могут быть непредсказуемыми.

nzeemin
11.04.2021, 15:04
ГРОМАДНОЕ СПАСИБО!!! Действительно огромный труд.
Это вам спасибо, Алексей! без вас бы я никуда не доехал.


Результаты могут быть непредсказуемыми.
Из-за конвейера предвыборки операций?

Alex_K
11.04.2021, 15:11
Это вам спасибо, Алексей! без вас бы я никуда не доехал.
Мне спасибо не надо, в разборе игры СТАЛКЕР я не участвую. Но эту игру очень люблю, частенько играю в неё. Есть конечно для PC, но это не оригинал, чувствуется.

Из-за конвейера предвыборки операций?
Да из-за неё. Весьма большая вероятность, что команда ADD R0,R1 выполнится два раза, но проверять надо на реальной УКНЦ.

nzeemin
11.04.2021, 15:41
Пока не смог идентифицировать что за процедура L50232.
Судя по месту размещения - после завершения основной части программы, до паскалевских модулей - скорее всего это отдельный объектный модуль, включаемый при линковке.
А судя по использованию - это что-то для рандома.

Alex_K
11.04.2021, 15:58
Пока не смог идентифицировать что за процедура L50232.
Судя по месту размещения - после завершения основной части программы, до паскалевских модулей - скорее всего это отдельный объектный модуль, включаемый при линковке.
А судя по использованию - это что-то для рандома.
Да, довольно интересная процедурка. При определённых условиях идёт вызов TRAP 220. А в исходниках прямой настройки вектора 034 я не нашёл.

nzeemin
11.04.2021, 17:58
И я её нашёл 8-)
Это процедура RANDU из FORLIB.OBJ, т.е. из фортрановской библиотеки.
Отличается только параметром #3 в первой строчке - может это не та версия Фортрана.


.ENABL LC
.NLIST BEX

.TITLE $RANDU
.IDENT /F40002/

.ASECT

.CSECT
..:

.PSECT OTS$I
B.: .BLKB 132

. = B.

RANDU:: ;
CMPB @R5, #3
BNE B.126
TST (R5)+
MOV (R5)+, R2
MOV (R5)+, R3
MOV @R2, R0
MOV @R3, R1
BEQ B.116
ASL R1
ROL R0
ADD @R2, R0
ADD @R3, R1
ADC R0
ADD @R3, R0
BPL B.44
ADD #100000, R0
B.44: ; B
MOV R0, @R2
MOV R1, @R3
MOV #201, R2
B.54: ; B
ASL R1
ROL R0
BCS B.66
DEC R2
BR B.54
B.66: ; B
CLRB R1
BISB R0, R1
SWAB R1
CLRB R0
BISB R2, R0
SWAB R0
ROR R0
ROR R1
MOV (R5)+, R3
MOV R0, (R3)+
MOV R1, @R3
BR B.130
B.116: ; B
MOV #3, R1
INC R0
BR B.44
B.126: ; B
TRAP 220
B.130: ; B
RETURN

.END

Alex_K
11.04.2021, 18:35
Это процедура RANDU из FORLIB.OBJ, т.е. из фортрановской библиотеки.
У hobot-а в хламничке аж 13 вариантов, почти все разные.

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

И с адреса 1000 по всей видимости объявление внешней процедуры или функции в вызовом типа FORTRAN.

Hunta
11.04.2021, 18:36
Это процедура RANDU из FORLIB.OBJ
Блин, надо было мне сообразить :) Фортрановская OTS использует TRAP для сигнализации об ошибках :)


может это не та версия Фортрана
Технически, FORLIB и транслятор Фортрана идут как бы вместе, но практически можно попробовать (и есть вероятность, что прокатит) FORLIB от неродной версии компилятора. Кроме того, DEC выпускала патчи как для компилятора, так и для FORLIB и они могли идти не вместе. Так что правильней будет сказать - не та версия библиотеки OTS Фортрана :)

Alex_K
11.04.2021, 18:47
И с адреса 1000 по всей видимости объявление внешней процедуры или функции в вызовом типа FORTRAN.
Действительно. В качестве примера:

PROGRAM A;
FUNCTION SUMM(VAR A,B:REAL):REAL; FORTRAN;
VAR A,B,C:REAL;
BEGIN
A:=1; B:=2; C:=SUMM(A,B)
END.

.GLOBL $RESR6,$RESR5,$KORE,$SAV10,$VER
.GLOBL $BEGIN,FILE,$TTY,$END
.RADIX 10
.GLOBL SUMM
L0: JSR %0,$B74
.GLOBL $B74
JSR %7,$B126
.GLOBL $B126
JSR %7,SUMM
MOV %1,20(6)
MOV %0,18(6)
MOV $RESR5,%5
JSR %0,$B76
.GLOBL $B76
MOV (6),6(6)
ADD #6,%6
RTS %7
$VER=59.
$BEGIN:
ADD #12,$KORE
JSR %7,$B127
.GLOBL $B127
MOV #1,-(6)
JSR %7,$B88
.GLOBL $B88
MOV (6)+,@%5
MOV (6)+,2(5)
MOV #2,-(6)
JSR %7,$B88
MOV (6)+,4(5)
MOV (6)+,6(5)
CMP -(6),-(6)
MOV %5,-(6)
MOV %5,%0
ADD #4,%0
MOV %0,-(6)
MOV #2,-(6)
MOV %6,%4
JSR %7,L0


MOV (6)+,8(5)
MOV (6)+,10(5)
JMP $END
.END

nzeemin
11.04.2021, 19:21
Действительно. В качестве примера:

Да, уже разобрался с этим.
Там вот что было:


function RANDU(var A,B:integer):real; fortran;

function L01046(A,B:integer):integer;
begin
L01046:=ROUND(A+(B-A)*RANDU(VAR42,VAR44));
end;

RANDU принимает по ссылке два целых числа - текущие данные; возвращает очередное псевдослучайное число в диапазоне от 0 до 1.

Alex_K
11.04.2021, 19:49
Отличается только параметром #3 в первой строчке - может это не та версия Фортрана.
В данном случае 3 - это количество параметров. Отличаются чуть-чуть RANDU. В приведенной вами функции есть передача результата по адресу третьего параметра:


MOV (R5)+, R3
MOV R0, (R3)+
MOV R1, @R3

nzeemin
14.04.2021, 11:56
Продолжаю копать.
Нужно ещё 8 блоков, ~2300 слов заполнить осмысленным кодом на Паскале.
Добился возможности проверять код побайтово, за исключением строк.

PATHNK
14.04.2021, 12:27
Продолжаю копать.
А что потом если не секрет?

hobot
14.04.2021, 12:41
Продолжаю копать.

Никита, возможно тебе пригодится для ускорения / упрощения *пусть и не большого
при работе с одной и той же версией Паскаля и без необходимости использования системной библиотеки Фортрана,
ты можешь переименовать .OBJ который всегда нужен в SYSLIB.OBJ - и тогда при линковке его явно указывать не надо.

Radon17
14.04.2021, 12:43
Можно будет потом портировать куда угодно, в т.ч. и на современные версии windows. ;)
Думаю, паскалевский исходник будет не слишком сложно адаптировать для сборки современными компиляторами.

nzeemin
15.04.2021, 19:25
Первый проход закончил - по объёму код уже весь - ~1230 строк, примерно как и ожидал.
Но осталась куча мелких ошибок. Прохожу по второму разу, исправляю эти мелочи.

nzeemin
15.04.2021, 22:06
Вот интересное место:


L36040: CMP 000032(R5), #000012 ; < 10. ?
L36046: BLT L36054
L36050: CLR R0
L36052: BR L36060
L36054: MOV #000001, R0
L36060: COMB R0
L36062: MOVB 000047(R5), R1 ; Фонарь горит?
L36066: BICB R0, R1
L36070: CMP 000032(R5), #000001
L36076: BGT L36104
L36100: CLR R0
L36102: BR L36110
L36104: MOV #000001, R0
L36110: COMB R0
L36112: BICB R0, R1
L36114: BNE L36122
L36116: JMP L36144

Текущий перевод в Паскаль:


if (VAR32 < 10) and VAR47 and (VAR32 > 1) then

Проблема в том чтобы сгенерировать точно такой же код, как в оригинале, но Паскаль даёт несколько другой код:


; if (VAR32 < 10) and VAR47 and (VAR32 > 1) then
CMP 26(5),#10
BLT L792
CLR %0
BR L793
L792: MOV #1,%0
L793:
MOVB 39(5),%1
COM %1
BICB %1,%0
CMP 26(5),#1
BGT L794
CLR %1
BR L795
L794: MOV #1,%1
L795:
COMB %1
BICB %1,%0
BNE L796
JMP L797
L796:

Пробовал разные комбинации, пока не нашёл.

Alex_K
15.04.2021, 23:45
Пробовал разные комбинации, пока не нашёл.
if (VAR47 and (VAR32 < 10)) and (VAR32 > 1) then

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

Вроде работает и так:
if VAR47 and (VAR32 < 10) and (VAR32 > 1) then

nzeemin
16.04.2021, 17:58
За вчера-сегодня исправил несколько ошибок.
Написал программу для патчинга строк (на C#) - по сути та работа что была проделана Oleg H. над бинарным файлом, но я её делаю над ассемблерным текстом.
Вообще конечно я себе сильно поднасрал тем что стал разбирать уже патченый файл игры, но что уж теперь сделаешь.

На данный момент между .SAV-файлом, полученным из Паскаля + патчинг строк и файлом STALK.GME - 48 различающихся байт.
В основном это инстркции NOP вставленные там где я не понял почему так.

Верхняя граница памяти программы отличается на 2 байта - пока не понял почему.

В процедуре L03362 (переход на этах вверх/вниз и отрисовк игрового поля) - идут странные манипуляции с регистром R4, как будто в нём запоминают на сколько нужно подобрать стек в L04170, но в R4 всегда ноль. Я пока не понял что вызывает такую обработку.

Перед выходом (exit) из игрового цикла всегда делается сброс стека через MOV 050406, SP - ошчушчение что это генерирует компилятор (но не тот что есть у меня), хотя может это и ассемблерные вставки.

Кое-где есть недостижимый код - как пример, L31036, L31134, L31416 - всё это также около команды exit. Возможно, ошибка в компиляторе, тот что есть у меня такого не делает.

В общем, текущий вариант это "почти готово", но я пока не пробовал его запускать и проверять в деле.
Собираюсь ещё раз пройтись по всем местам отличий - то есть сделать третий проход.

Напомню, паскалевский текст здесь - https://github.com/nzeemin/uknc-various/blob/master/STALK-PASCAL/STALK1.PAS

Hunta
16.04.2021, 19:02
Титанический труд :) Я похожим образом начинал восстанавливать исходники не то третьей, не то четвёртой версии Oracle, только там был C :)

Oleg N. Cher
16.04.2021, 19:08
А я так восстанавливал Dark Woods (https://jocke.phatcode.net/darkwoods.shtml) на QuickBasic. Но не добился полной идентичности, иногда просто непонятно что в исходнике было. И ещё было сильное желание восстановить King (https://www.old-games.ru/game/4516.html) Башурова (он на Turbo Pascal), тоже приступил, но запал быстро угас. Я ещё и декомпиляторы искал для DOS x86 16bit. Но все, что находил, или не работает вообще, или работает отвратительно.

Sandro
16.04.2021, 19:40
За вчера-сегодня исправил несколько ошибок.

В общем, текущий вариант это "почти готово", но я пока не пробовал его запускать и проверять в деле.
Собираюсь ещё раз пройтись по всем местам отличий - то есть сделать третий проход.

Напомню, паскалевский текст здесь - https://github.com/nzeemin/uknc-various/blob/master/STALK-PASCAL/STALK1.PAS

Спасибо! Ждём результата третьего прохода. Хотя, в принципе и этот вариант должен работать, почему нет? Я просмотрел паскалевский исходник, никакого криминала не вижу.

Нда, но компилятор ужасен однако. Никаких представлений об оптимизации вообще. Если переписать на ассемблер руками, то результат должен нормально влезть в БК-0010, к примеру. Кода всего ничего в общем-то. Я думал, что в игре функционала больше, просто его найти надо.

Генератор подземелий забавен. Никаких проверок на проходимость уровня. То есть, без кирки может случиться беспощадный затык.

То ли жди, то ли сейчас начинай переписывать ... Всё же на БК подобной игрушки как-то не хватало.

hobot
16.04.2021, 20:35
Всё же на БК подобной игрушки как-то не хватало.
есть для старших БКашек под ОС БК работает



Время Дата
17:05:50 16-Апр-2021, Пятница

.RU STALKB

STALKER БК-0011М VERSION
ЗАГАДАЙТЕ ЧИСЛО.МОЖЕТ БЫТЬ, ОНО ВАМ ПРИГОДИТСЯ... ТАМ...




Подземелье 1
1 - - - - - - - - - - - - - - - Рейтинг 0
! Энергия 22
! !Оружие 15
!Защита 11
В банке 0
!
! !Вредность 9
!
Рюкзак:
! - - - . . < . . .
! . . . !
. . . !

!
! !
- - - - - - - - - - - - - - - -
БА-А-А-А-Х !!! ...

nzeemin
16.04.2021, 22:04
Как говорится, следите за руками, показываю один раз:


label 1;
BEGIN {MAIN}
...
1:
...
goto 1;
...



6770 ; goto 1;
6771 037052 016706 000000G MOV $RESR6,%6
6772 037056 000167 146566 JMP L98

Alex_K
16.04.2021, 22:42
goto 1;
Ну вот! И вся структурность потерялась ...

Hunta
16.04.2021, 23:05
Как говорится, следите за руками, показываю один раз:
Нда... когда это видишь - понимаешь всю очевидность. А догадаться по первости - фиг получится. Внутри это "блока" может быть сколько угодно добавления "локальных" переменных, а надо привести указатель стека в правильное состояние :)

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


вся структурность потерялась
Спасибо goto и метках. Хотя, как сказал мой первый сенсей по программированию - программа на Паскале с goto - плохая программа :)

nzeemin
17.04.2021, 02:35
Разбираюсь с L03362 - там тоже что-то наверчено на goto и возможно циклах с exit.
Смысл в том, что процедура проверяет - если мы идём вверх/вниз и стоим НЕ на лестнице - то это исключение, и рисовать игровой экран уже не нужно, выходим на конец процедуры.
Но оператора return у нас нет, поэтому здесь возникает какая-то мешанина.

- - - Updated - - -

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


procedure L03362(A:char);
begin
...
{$C JMP L05114 } { Выход из процедуры }
...
{$C
L05114: } {метка для выхода из процедуры}
end;


Осталось 16 несовпадающих байт.

- - - Updated - - -

Нашёл все различия кроме одного байта в заголовочном блоке:
Comparing files STALKP.SAV and ..\STALK\STALK.GME
00000028: 0C 0E
Я не особо понимаю почему эта разница на два байта - 0x600E в оригинале и 0x600C у меня, подозреваю что как-то связано с глобальными переменными.

- - - Updated - - -

Переименовал:
L02332 -> RUKSEEK
L02574 -> ZVERX

- - - Updated - - -

В общем, этот этап работы - восстановление исходника игры на Паскале для дальнейшего портирования - можно считать практически завершённым.
Спасибо вам всем огромное за помощь и поддержку!

Sandro
17.04.2021, 10:19
Всё-таки не удержался и прошелся по уже имеющемуся исходнику с расстановкой осмысленных имён переменных и кое-где -- комментариев.

В принципе, всю внутреннюю логику я понял. Её не так уж и много. Есть странности и недоделки, в количестве. Но всё это можно повыкидывать/заоптимизировать.

Правда, когда возьмусь -- не знаю.

http://sandro.pdp-11.ru/misc/stalker/stalk_literate.pas

Radon17
17.04.2021, 16:31
А собрать это каким-нибудь паскалевским компилятором получится? Или не выйдет из-за "hacked by..." и КОИ-8?

nzeemin
17.04.2021, 16:38
А собрать это каким-нибудь паскалевским компилятором получится? Или не выйдет из-за "hacked by..." и КОИ-8?

Это и собирается паскалевским компилятором - но он срезает верхний бит у символов в строках.
После компилятора я применяю патчинг на полученном .MAC-файле, восстанавливая строки и добавляя в них спецсимволы - то что было сделано руками на бинарнике.
То что можно было сделать средствами Паскаля, я сделал.

Alex
19.04.2021, 09:44
Интересно, а 8-битный паскаль был?
Ведь терминалы DEC 8-бит поддерживали.
Да и возможно для АДОС что-то было...

Hunta
19.04.2021, 09:52
Ведь терминалы DEC 8-бит поддерживали.
Не все.


Интересно, а 8-битный паскаль был?
Что то мне подсказывает, что нетронутый OMSI Pascal - нет. Тот же MACRO-11 без допиливания не поддерживает, хотя DEC достаточно давно добавила поддержку национальных алфавитов в терминалы за счёт восьмого бита.

Да и идея использовать 8-ой бит для национальных алфавитов - она тоже достаточно поздняя.

Мысль вслух. Сильно подозреваю, что компилятор OMSI Pascal сам написан на Паскале :) Так что можно попробовать восстановить исходники :)

nzeemin
20.04.2021, 18:24
С фейсбука:

Serge Vakulenko
Совершенно очаровательная игрушка! Я слегка попинал исходники, чтобы под Линуксом собирались.
https://github.com/sergev/vak-opensource/blob/master/languages/pascal/game-stalker/stalk1.pas

То есть это под Free Pascal Compiler.

- - - Updated - - -


Мысль вслух. Сильно подозреваю, что компилятор OMSI Pascal сам написан на Паскале :) Так что можно попробовать восстановить исходники :)

Опять же трудозатраты порядка 4-6 недель.

Radon17
20.04.2021, 20:49
https://github.com/.../lan.../pascal/game-stalker/stalk1.pas
not found по ссылке

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

Скорее всего при копировании ссылка "слепилась" и в пост попали только её куски

Alex_K
20.04.2021, 20:57
Мысль вслух. Сильно подозреваю, что компилятор OMSI Pascal сам написан на Паскале Так что можно попробовать восстановить исходники
Увы, ничего с библиотеки Паскаля в самом Паскале нет, так что на Макро-11. А вот DECUS C вроде бы был написан на самом Си.

nzeemin
20.04.2021, 21:03
not found по ссылке

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

Скорее всего при копировании ссылка "слепилась" и в пост попали только её куски

https://github.com/sergev/vak-opensource/blob/master/languages/pascal/game-stalker/stalk1.pas

Oleg N. Cher
20.04.2021, 21:42
Увы, ничего с библиотеки Паскаля в самом Паскале нет, так что на Макро-11.OMSI Pascal-2 вроде бы на Паскале писан. А OMSI Pascal-1 нет.

Hunta
20.04.2021, 22:07
Компилятор Pascal OMSI 2 для RSX



Dump of VF1:[4,54]PASCAL.TSK;1 - File ID 43,1,0
Virtual block 0,000004 - Size 512. bytes


000000 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
000020 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
000040 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
000060 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
000100 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
000120 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ h I ^B ^@ ^@ ^@ ^@ ^@
000140 w ^I p R f ^U J J ^H f ^U & J ^H
000160 W - R H ^E ^@ ^F ^B w ^K ^^ Y ^C ^C w e
000200 ^D ^@ ^V Y f ^U X J ^H w ^U Z K
000220 7 ^J X K 7 ^J V K 7 ^J T K @ ^U ^@ ^@
000240 ^M ^C A ^U 0 N w ^P @ K ! ^@ ^@ ^L B ^U
000260 ^Q ^P ^B ~ F ^U 0 N ^J ^A A ^U ^@ ^P
000300 f ^P w ^I T ^A 7 ^U K F ^] ^\ K F `
000320 7 ^Q ^^ K B ^] v J & ^P N ^L w ^I : ^A
000340 ^A ^U @ ^P w ^P l J ^Q ^J ^B ~ w ^P f J
000360 p ^U 0 K ^J ^@ p ^U " K ^H ^@ w ^U " K
000400 P J f ^U P J ^H ^@ ^C ^A f ^U ` J
000420 ^H f ^U ^P K ^H @ ^] ^D H ^W ^D ^@
000440 ^H ^F 7 ^P ^D H 7 ^P ^N H @ e H K 7 ^P
000460 ^J H f ^U " K f ^U 0 K ^A ^A ^O ^A f ^U
000500 B K ^H ^K ^G @ ^W & ^@ ^H ^G 7 ` ^ G
000520 w E ^@ ^D N G w ^U D K F G W % ^L ^@
000540 ^L ^@ ^[ ^C 7 ^H r ^N ^@ ^_ - ^@ C o m p
000560 i l e r / L i b r a r y m i s
000600 m a t c h - - P l e a s e
000620 r e c o m p i l e ^@ w ^@ 6 ^H ^G ^@
000640 f ^U x J ^H ^G ^@ 7 ^] ^B ^@ 6 J @ ^W
000660 . ^@ ^@ ^^ 4 ^@ ^A ^C h ^H & ^J & ^P @ ^]
000700 l | 8 ^^ ^D ^@ ^@ ^@ ^@ ^U w ^I b ^C ^D ^@
000720 @ ^] ^B ^@ x ^I ^D ^@ A ^] x I @ ^R ^H ^C
000740 ^N ^P 7 ^Q l I ^@ ^\ ^D ^@ ^B ^C x ^I ^J ^@
000760 Q ^K w ` I r ^G w ^I $ f ^] d I


Компилятор Pascal OMSI 2 для RT


Dump of DU1:[PASRT]PASCAL.SAV;1 - File ID 5141,1,0
Virtual block 0,000007 - Size 512. bytes


000000 % ^J u % ^X ^@ ^B ^G w ^I H ^@ M ^K ^S ^A
000020 @ ^_ ~ @ E ^@ s ^C @ % ^M ^@ p ^C
000040 @ % ^J ^@ ^H ^C @ % ^[ ^@ ^E ^C @ % ^Z ^@
000060 f ^B M U ^@ ^@ @ ^U ^@ = ^P ~ M U
000100 ^@ @ ^G ^@ w ^I $ ^D ^@ M 5 ^T ^@ ^L ^B
000120 7 ^H > } ^A ^@ ^O ^@ P U T N O T
000140 A L L O W E D ^@ w ^I 6 ^@ M U ^A ^@
000160 u - ^X ^@ ~ ^E ^B u ^] ~ ^X ^@ M U
000200 ^@ ^@ u % ^@ ^L ^@ ^C ^B w ^I 4 ^A ^G ^@
000220 @ m ^P ^@ ^C ^G @ - ^R ^@ ^B ^F w ^I 4 ^@
000240 ^G ^@ e m ^V ^@ @ ^U M 5 ^B ^@ ^P ^B @ m
000260 ^P ^@ @ E ^@ ~ ^I ^C @ m ^V ^@ @ e ^@ ^B
000300 ^D ^C @ m ^V ^@ 5 ` ~ @ ^] ~ @ m
000320 ^V ^@ ^G ^@ f ^P & ^P f ^P M 5 ^B ^@ ? ^C
000340 @ ^] ~ @ m ^P ^@ @ E ^A ^A ^P @ m
000360 ^P ^@ @ m ^X ^@ 3 ^F ^@ ^K M 5 ^A ^@ ^B ^C
000400 w ^I ^N ^C u ` ~ u ` ^X ^@ B ^P B ^@
000420 ^B ^L 5 ` ^N ^@ ^K ^F 7 ^H v | ^A ^@ ^M ^@
000440 F I L E O V E R F L O W ^@ B ^]
000460 ^P ^@ ^A ` ^C ^P ^C ^L R ^T B ~ M 5 ^L ^@
000500 ^M ^C 7 ^P 0 3 7 ^P . 3 7 ^K * 3 ^@ ^J
000520 @ ^@ ^@ ^L 7 ^P ^\ 3 w ^I ^V ^A ^\ ^A M 5
000540 ^A ^@ ^D ^C w ^I " ^B M E ^A @ ^] ^X ^@
000560 @ m ^P ^@ @ e ^A ^@ ^J @ ^@ ^@ ^L 5 `
000600 ^N ^@ J ^G e ^] ^P ^@ u ^U ^X ^@ M 5 ^L ^@
000620 ^B ^C w ^I > ^A ^C ^U ^B ^U ^A ^U M E ^@ @
000640 @ ^] ~ @ m ^V ^@ @ - ^X ^@ ^B ^F M U
000660 ^@ @ ^G ^@ 7 ^S ^J 3 & ^P f ^P f ^Q E ^_
000700 ^D 3 w ^I Z } ^B ^G w ^I ^H ^@ ^E ^U ^A ^U
000720 ^@ ^U ^G ^@ f ^] n 2 w ^_ j 2 h 2 w ^I
000740 ` ^@ 7 ^U ` 2 e ^K E - . 2 & ^C E -
000760 , 2 # ^C U ^K @ ^] ^R ^@ ^D ^C f ^] ^P ^@





Dump of DU1:[PASRT]PASCAL.SAV;1 - File ID 5141,1,0
Virtual block 0,000010 - Size 512. bytes


000000 w ^I z z ^@ ^J @ ] ^L ^@ ^W ^@ ^S ^C
000020 @ ^@ @ U ^C ^@ u 5 @ ^@ ^@ ^@ ^A ^B @ ^L
000040 @ ^@ ^A ^P @ E ^@ | ^H w ^I 4 ^@ @ ^P
000060 | ^H w ^I @ ^@ w ^I R ^@ ^G ^@ w ^I , }
000100 ^D ^@ M 5 ^A ^@ ^L ^C w ^I > ^A M E ^A
000120 u 5 ^@ ^@ ^U ^@ ^D ^B e ^] ^P ^@ u ^U ^X ^@
000140 ^G ^@ ^W ! ^^ B ^F ^C 7 ^U 0 3 7 ^Q . 3
000160 F ^U ^\ B ^G ^@ & ^L ^W ! ^^ B ^B ^C V ^L
000200 ^G ^@ V ^L F ^] ^V 3 G ^] ^P 3 e ^K ^@ ^J
000220 @ ] ^N ^@ ^W ^@ ^C ^C @ ^L 0 ^J " @
000240 ? ^J " 2 E - t 1 ^F ^B w ^] l 1 l 1
000260 ^] f 1 ^P 2 E - f 1 ^F ^B w ^] ^ 1
000300 ^ 1 ^] X 1 ~ 1 @ ^U ^^ ^@ f ^Q w ^I
000320 , z ^G ^@ w ^I ^F | @ ^] ^@ ^@ @ E o
000340 u % ^@ ^L ^@ ^E ^B w E ^@ ^P 6 q 7 P
000360 2 q M 5 ^@ ^A ^C ^G ^@ @ ^U r @ & ^P
000400 f ^P & ^P P ^] ^L ^@ P ^U ^H ^@ P m ^N ^@
000420 H m ^P ^@ 5 ^T ^X ^@ H m ^R ^@ ^H ^J ^P ^L
000440 ^P ^J u % ^@ ^L ^@ ( ^B A ^S A E o
000460 _ E ^@ ^P $ ^@ _ P $ ^@ ^@ ^J A ^] 6 1
000500 B ^] 4 1 B ^L ^N ^C ` ^H ~ ^G ^W ^Z ^@
000520 ^I ^C ^Q ^P B ^J ^F ^C ^W ^J ^@ ^C ^C M 5
000540 ^@ ^P r ^C ^A ^P @ ^] ^N 1 @ ^L ^@ ` W
000560 ^Z ^@ E ^B 7 ^J 2 p ^I ^A ^@ ^J @ ] ^L ^@
000600 | ^H @ ^U r @ } ^H 9 ^F @ ^L 5 ` ^X ^@
000620 w ^K ^V p ^C ^B M U ^@ 3 ^A w ^U * ^@
000640 " 1 w U ^D ^@ ^C p M 5 ^@ ^B * ^B W -
000660 x p ^A ^@ ^L ^F ^W ^E 7 ^H V z ^A ^@ ^N ^@
000700 T R A N S F E R E R R O R 7 ^H
000720 @ z ^A ^@ ^P ^@ C H A N N E L N O
000740 T O P E N 7 ^H ( z ^A ^@ ^N ^@ W R
000760 I T E P A S T E O F @ ^L 5 `





Dump of DU1:[PASRT]PASCAL.SAV;1 - File ID 5141,1,0
Virtual block 0,000011 - Size 512. bytes


000000 ^X ^@ ^B ^U ^A ^U ^@ ^U ^G ^@ A ^] ^X ^@ A m
000020 ^P ^@ & ^P f ^P & ^P u 5 ^@ ^@ ^U ^@ ^M ^C
000040 @ ^P @ E ^@ ~ ^I ^C ^@ ^K @ e ^@ ^B A m
000060 ^P ^@ ^Q ^J ^B ~ A m ^P ^@ A ^K b ^C W -
000100 ^L ^@ ^@ ^V ^C ^A ^J ^A ^L ^B ^G = ^J ^X ^@
000120 B ^U r @ R ^] ^L ^@ R ^U ^I ^@ R ^] ^N ^@
000140 R ^] ^P ^@ R ^P ^R ^J @ ^U r @ } ^H ^V ^G
000160 H ^A B ^] ^P ^@ ^@ ^T a ^H ~ ^G D ~ A ^A
000200 w ^] ^X 0 @ 0 & ^S w ^I ` z ^D ^@ M 5
000220 ^@ ^X ^O ^B v ^_ ~ ^L ^@ u % ^@ ^L ^@
000240 ^P ^B M 5 ^@ @ ^M ^C M U ^@ ^H M E ^@ @
000260 ^G ^@ w ^I ^@ { v ^_ ~ ^L ^@ M 5 ^@ P
000300 ^B ^B w ^I p z ^G ^@ w ^] P / x / w ^I
000320 ^Z z ^D ^@ M 5 ^@ @ ` ^B w ^I X z z ^A
000340 w ^I ^H z ^H ^@ & ^P f ^P & ^Q ^@ ^] ^R ^@
000360 ^A ^] ^T ^@ A e ^A ^@ ^@ ^K ^M ^@ 7 ^H ^R y
000400 ^A ^@ ^Q ^@ S E E K O U T O F
000420 R A N G E ^@ M 5 ^D ^@ ^D ^C u 5 ^@ ^@
000440 ^U ^@ ^P ^B 7 ^H j x ^A ^@ ^W ^@ S E E K
000460 O N S E Q U E N T I A L F
000500 I L E ^@ M E ^@ M 5 ^B ^@ ^E ^C B ^]
000520 ^V ^@ w ^I ^Z ^@ ^U ^A B ^] ^Z ^@ ^E ^C w ^I
000540 z ^@ u p ^V ^@ ^I ^A B ^] ^V ^@ B e ^A
000560 ^W t w w ^I x ^@ ^C ^J ^W v ^I ^@ A `
000600 @ ^K ^B ^J C ^] ^N ^@ ^W v ^I ^@ A ` ^@ ^K
000620 ^@ ` ^N ^B D ^] ^X ^@ D m ^P ^@ D m ^V ^@
000640 ^G ^G D ^E ^B A m ^P ^@ u ^P ~ ^R ^A
000660 C ` B ^K ^B ` w ^I ^H | e ^P M E ^@ ~
000700 U m ^R ^@ ^W v w u ^P ^N ^@ w ^I ^D }
000720 w ^I H { ^D ^U ^C ^U ^B ^U ^G ^@ ^D ^P ^C ^P
000740 B ^M ^D r ^@ ^P B ^P C ^P ^D r ^A ^P ^G ^@
000760 C ^P ^B p @ ^P ^A ^D ^A ` C ^P B ^K ^A ^D





Dump of DU1:[PASRT]PASCAL.SAV;1 - File ID 5141,1,0
Virtual block 0,000012 - Size 512. bytes


000000 ^C ` ^B p @ ` ^G ^@ w ^] ^T . 8 . w ^I
000020 Z y ^H ^@ & ^P f ^P & ^Q & ^J C ^U ^F ^@
000040 ^A ^] ^V ^@ ^A ^B ^C ^J ^B ^] ^T ^@ ^J ^@ D ^U
000060 ^H ^R ^B ^K A ^K ^M ^@ N ^U 1 ^@ A E ^@ ^@
000100 ^M ^A D ^U ^T ^R A ^K ^D ^@ N ^U - ^@ ^A ^K
000120 ^C ^J C ^J ^A % } ^B d ^K ~ ^C B ` ^E ^G
000140 @ ^U ^@ w ^I 8 ^@ ^E ~ ^@ ^U ^D ^B ^@ ^J
000160 ^T r @ e 0 ^@ w ^I & ^@ G ~ w ^I n ^@
000200 ^D ^U ^C ^U ^B ^U ^G ^@ ^@ ^P ^@ ^B @ ^@ ^H ^@
000220 ^A ^@ ^@ ^@ ^P ' h ^C d ^@ ^J ^@ ^A ^@ ^@ ^@
000240 = ^P ~ M U ^A ^@ % ^J u % ^X ^@ ^C ^C
000260 u ^] ~ ^X ^@ @ ^] ^P ^@ @ m ^R ^@ @ -
000300 ~ ^B ^G w ^I ^L z ^G ^@ w ^] R - v -
000320 w ^I ^X x ^H ^@ ^D ^A @ ^U ^@ w ^I @
000340 v ^J ^L ^@ y ^F ^@ ^] ^N ^@ w ^I 2 u %
000360 ^@ ^L ^@ ^B ^B w ^I H { ^G ^@ w ^] -
000400 D - w ^I f x ^D ^@ @ ^U ^M ^@ w ^I ^P
000420 @ ^U ^J ^@ w ^I ^H j ^A w ^] ^B - & -
000440 w ^I H x ^J ^@ ^A ^] ^L ^@ ^A m ^N ^@ ^E ^G
000460 @ ^U ^@ w ^I h E ~ v ` ^N ^@ ^H ^G
000500 ^A ^] ^P ^@ @ ^T w ^I V v ^J ^N ^@ z ^F
000520 N ^A w ^] J - n - & ^S 6 ^] ^D ^@ ^B ^@
000540 w ^I ^H x ^J ^@ 6 ^L ^P ^@ @ ^U ^D ^@ v ^U
000560 ^N ^S ^P ^@ ^D ^G v ^U ^R ^S ^P ^@ ^@ ^J ^@ -
000600 ^L ^@ ^B ^F 6 ^P ^L ^@ 6 ^P ^N ^@ L ^A T R
000620 U E F A L S E ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
000640 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
000660 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
000700 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
000720 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
000740 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
000760 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@



Думаю, и там и там компилятор написан на Паскале

Alex_K
20.04.2021, 22:11
Думаю, и там и там компилятор написан на Паскале
Pascal-2 написан на Pascal-1?

nzeemin
20.04.2021, 22:21
Ребят, напомню, эта тема про игру, не про Паскаль.
Вот актуальный вопрос -

А что потом если не секрет?

Hunta
20.04.2021, 22:30
Последний оффтоп

Pascal-2 написан на Pascal-1?
Самый первый вариант - вполне возможно. А потом он мог писаться уже на Pascal 1.1, 1.2, ..., 2.0 :)

Alex_K
20.04.2021, 23:10
Вот актуальный вопрос -

А что потом если не секрет?
Наверное и ответ.

Я как-то пробовал ковырять "Королевство Эйфория", там внутри мешанина, потому что делалось как раз НЕ на Макро-11, а на чём-то вроде Forth или Паскаль.
"Королевство Эйфория" также написана на Паскале. Правда там скорее всего используется вещественная арифметика. Да и работа с файлами есть - таблица рекордов сохраняется на диске.

hobot
21.04.2021, 11:17
"Королевство Эйфория" также написана на Паскале.
есть вариант для БК0010 на Фокале, игрался в него, пока КУВТ-86 не вывезли.
Легко распознаётся стандартным символом запроса для языка Фокал ' : '
отсюда и далее > https://zx-pk.ru/threads/13979-zhurnal-downgrade.html?p=1087745&viewfull=1#post1087745

svofski
21.04.2021, 12:50
С фейсбука:
То есть это под Free Pascal Compiler.

Я попробовал собрать ACK-овским Паскалем в надежде на конверсию для 8080. Но столкнулся с тем, что ACK-овский Паскаль крайне академичен. Например, в нем нет битовых операций, процедур Exit и Break, наверное чего-то еще. Битовые операции решаются множествами, Exit и Break можно заменить goto или переписать логические блоки, но этот вариант я пока отложил.

Другой способ добиться портабельности -- прогнать через транслятор p2c. Это получилось почти сразу и результат даже запускается под Линуксом. Но надо прикрутить небуферизованный консольный ввод, чтобы работало нормально и можно было бы проверить результат трансляции по-настоящему.

hobot
21.04.2021, 14:24
nzeemin, а что такое frandu ?
У меня на stalk1.pas под RT-11 картина такая :



HD7>PASCAL STALK1=STALK1

ERRORS DETECTED: 0
FREE MEMORY: 6254 WORDS

ERRORS DETECTED: 0
FREE MEMORY: 6254 WORDS

HD7>DIR STALK1
21-Apr-2021
STALK1.PAS 70 21-Apr-2021 STALK1.MAC 269 21-Apr-2021


HD7>mac STALK1

HD7>LIN STALK1,SY:PASCAL

HD7>RU STALK1
*** (H) Hacked by Oleg H. ***
^_^_^_^ __ С Т А Л К Е Р __
загадайте число. может быть, оно вам пригодится... там...

А ВОТ ДО УРОВНЯ НЕ ДОТЯНУЛ, ВЫЛЕТЕЛ,
НО ТОЛЬКО ПОСЛЕ НАЖАТИЯ "H" - ДО НАЖАТИЯ
ПРОСТО ВИСЕЛ НА НАДПИСИ











Для подсказки нажимайте "H"
TRAP TO 4 - FROM PC 155340

HD7>

HD7>H


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


ПРОСТО ВИСЕЛ НА НАДПИСИ
ага, то есть вот эти самые спец символы что ли для сообщений мелькающих в начале?
и ошибка с ними связана?

nzeemin
21.04.2021, 15:22
nzeemin, а что такое frandu ?

FRANDU это модуль RANDU вытащенный из библиотеки Фортрана - вытащен для того, чтобы не искать нужную версию FORLIB.OBJ в которой точно всё такое же до байта.
https://github.com/nzeemin/uknc-various/tree/master/STALK-PASCAL - тут лежит FRANDU.MAC, там же батник !compilelink.bat, который описывает мой процесс сборки, под Windows 10.
Как оно работает без патчинга и работает ли вообще - я не проверял, цель же была не в этом. Цель была - восстановить достоверный исходник путём побайтовой проверки - она достигнута.

hobot
21.04.2021, 16:11
FRANDU это модуль RANDU вытащенный из библиотеки Фортрана - вытащен для того, чтобы не искать нужную версию FORLIB.OBJ в которой точно всё такое же до байта.
https://github.com/nzeemin/uknc-vari...r/STALK-PASCAL - тут лежит FRANDU.MAC

с FRANDU.OBJ всё замечательно вроде бы ;-)



Подземелье 1
1 Рейтинг 3
Энергия 20
!Оружие 15
Защита 11
! . . В банке 0
! . . .
# - . - - . Вредность 2
! . . . . . .
# - - # - . ! - - Рюкзак:
- - ! y . - \ . < . . .
. ! . . .
. . - - -
. . . . .
. . . . .
- - @ .
- - - -
Превращение догоняющего зверя


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

кстати говоря - размер исполняемого файла после трансляции и линковки PASCAL = 49 блоков,
а OMSI (PASDWK - который в архиве обозван) - исполняемый играбельный файл 47 блоков )))

Но это так... просто ради эксперимента собрал и тем и другим...
Влияет конечно библиотека PASCAL.OBJ - и кол-во всяких там "сообщений" которые она лепит + что то ещё наверное...

svofski
22.04.2021, 01:26
Собралось ACK-ом через промежуточный C, работает на Векторе с BoldBIOS 56К. Жирновато выходит, требует больше памяти, чем большинство МикроДОС-ов позволяют. Пока не очень играбельно — чересчур медленно заполняются уровни в начале и стрелочки для ходьбы прикрутить не получается. Но вообще это бешено круто! nzeemin, ты — монстр уровня 700 :D

Sandro
22.04.2021, 07:18
Пока не очень играбельно — чересчур медленно заполняются уровни в начале

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


и стрелочки для ходьбы прикрутить не получается.

Там в оргинале же циферки с допклавиатуры. Неужели не выходит добавить коды символов от стрелочек? Кстати, по-хорошему, там нужны диагонали. В исходной игре они есть и некоторый толк от них -- тоже.


Но вообще это бешено круто! nzeemin, ты — монстр уровня 700 :D

Да, терпению Никиты можно позавидовать ;)
Сам занимался реверсом, и могу сказать, что это реально очень объёмная и зачастую сложная работа.

hobot
22.04.2021, 10:32
Да, терпению Никиты можно позавидовать


Но вообще это бешено круто! nzeemin, ты — монстр уровня 700

есть предложение поддержать Никиту калориями и скинуться ему на торт ;-)
Или может что то более полезное - литр мёда (https://bigpaseka.ru/product/8), сухофрукты и грецкие орехи (https://www.abri-kos.ru/store/orehi-i-suhofrukti/suhofrukti/) )

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

svofski
22.04.2021, 11:16
Причина -- использование плавучки в генераторе псевдослучайных чисел. Надо заменить на что-то быстрое целочисленное, тогда проблема должна уйти. Сам алгоритм заполнения весьма примитивный и ест немного. На любой нормальной машине должен заполнять все 8 поздемных уровней меньше, чем за секунду при правильной реализации.
Функция бросания кубика вычисляется как RANDOM := A + (_randint() mod (B - A + 1)); _randint() у меня превращается в стдлибный rand(). Проблема тут для 8080 в делении прежде всего.


Там в оргинале же циферки с допклавиатуры. Неужели не выходит добавить коды символов от стрелочек? Кстати, по-хорошему, там нужны диагонали. В исходной игре они есть и некоторый толк от них -- тоже.
Дело в МикроДОСе, вернее в его эмуляции терминала. Где-то там кто-то решил, что стрелочки не нужны и все они превращаются в нули. Кроме стрелочки влево, которая превращается в ^H. И, как совершенно верно было замечено hobot-om, диагональные стрелочки необходимы. Таких стрелочек по сути на Векторе все равно нет. Сейчас ходить можно цифирками, как в оригинале. Потом можно будет попробовать сделать пропатченный микродос хоть с поддержкой джойстика =)

hobot
22.04.2021, 13:55
в МикроДОСе

на Векторе

Плодись STALK.SAV и размножайся ;-)
По возможности, дабы показать ( и Никите в том числе!) плоды трудов праведных - если где то порт \ адаптация запустилась, работает - делайте скриншоты прямо сюда! Интересно же...

svofski
22.04.2021, 15:48
Плодись STALK.SAV и размножайся ;-)
Благодаря стараниям Никиты, STALK.SAV теперь доступен на двух самых популярных операционных системах: Линуксе и МикроДОСе :D

Radon17
22.04.2021, 18:40
А для виндовой командной строки будет?

nzeemin
22.04.2021, 20:45
А для виндовой командной строки будет?

Теоретически, он уже есть - взять вариант от Вакуленко, взять Free Pascal Compiler под винду и скомпилить.

hobot
23.04.2021, 10:46
взять вариант от Вакуленко
а можно подробней?
что то я пропустил видимо...знаю только версию для MS DOS / Win9x, но там исходника вроде бы нет...

svofski
23.04.2021, 12:53
Пару страниц назад была ссылка. Там не все так просто, Юникод, русские буквы в консоли, у меня с полпинка не завелось.

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

С целого пинка все-таки получилось http://sensi.org/~svo/b/stalk1-win32.zip

Radon17
23.04.2021, 13:52
С целого пинка все-таки получилось http://sensi.org/~svo/b/stalk1-win32.zip
win7 x64 sp1 - кодировка не та.

https://cdn.discordapp.com/attachments/660577089119846411/835105822811619358/unknown.png

svofski
23.04.2021, 14:17
Да, я уже слышал вести с полей о том, что фигня какая-то. У меня на десятке все работает красиво. Может быть потом попробую найти что еще может быть не так.

zebest
23.04.2021, 14:23
"Гранаты не той системы.." (с)
https://s.micp.ru/dWvNv.png
7-64, если что.
недавно консольное приложение в стУдии компилил, намучался с кирилицей :)

svofski
23.04.2021, 14:29
Вот в чем тайна? Я не знаю на самом деле.

hobot
23.04.2021, 14:37
Может быть потом попробую найти что еще может быть не так.
а если тупо исходник в нужной кодировке сохранить?

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


7-64, если что.
недавно консольное приложение в стУдии компилил, намучался с кирилицей
подробнее пожалуйста :-) опыт и знание в массы )

zebest
23.04.2021, 14:39
Ну как тайна. я компилил Си-шное приложение, мне его тоже видимо с десятки дали, компилил для ХР32, с кирилицей был ужос. Пришлось перепробывать все рекомЕНдации из интернету. Какая-то помогла. Ну это при компиляции. А сейчас я сделал проще. у меня всегда запущено кмд-окно с прошивальщиком. в нем в настройках поменял шрифт с консольного на Люсиду, и запустил Сталкер-а. Viola!
https://s.micp.ru/RFBko.png
Но луЧЧи конечно перекомпилировать "правильно".

hobot
23.04.2021, 14:52
Но луЧЧи конечно перекомпилировать "правильно".
метод с переключением шрифта работает, но не полностью - вводимые с клавиатуры символы всё равно не корректно отображаются (число в начале), но конкретно для этой игры - сие не имеет роли и не играет важности ;-)


https://i.ibb.co/vDW2pRK/w764stalk.png

Radon17
23.04.2021, 14:55
И я не понимаю, это всё-таки DOSовская версия, не RTшная? Тут фонарик получается не нужен, или как? :v2_conf2:
Лучше конечно RTшную портировать, она же оригинальная...

hobot
23.04.2021, 15:10
Тут фонарик получается не нужен, или как?
здрасьте приехали...


Лучше конечно RTшную портировать
так это оно и есть )

svofski
23.04.2021, 15:17
Не все шрифты имеют нужные страницы. Факт, что шрифт должен быть юникодный.

Фонарик нужен в любом случае. В некоторых случаях уровень сразу оказывается освещен, это определяется в начале при генерации и зависит от введенного числа, как и все остальное.

Это RT-шная версия. Все изменения в коде связаны только с управлением экраном и генератором псевдослучайных чисел.

hobot
23.04.2021, 15:47
а вот это уже изврат, причём конкретный ИМХО.

https://i.ibb.co/Lrd339J/w764stalk.png

что то "не здоровое" - Похоже кто то не с той "фантазией" рукоблудил в игре...
в оригинале - приведённых ниже сообщений не было - кто то правил,
(!)Никита всё же не ту версию выбрал,
но можно аккуратно подредактировать уже PAS файл? Или DESSом исполняемый...



'l': WRITELN('Раздолбанный компьютер ZX SPECTRUM - 128. ');
'r': WRITELN('Разложившийся труп девушки. '); {Пробелы компенсируют нули после строки}
's': WRITELN('Надпись: "Мы до тебя еще доберемся!!! " '); {Пробелы компенсируют нули после строки}
't': WRITELN('Отрезанная голова предыдущего Сталкера. '); {Пробелы компенсируют нули после строки}
'u': WRITELN('Зачитанный журнал "АКУШЕРСТВО И ГИНЕКОЛОГИЯ" ');
'q': WRITELN('Кладбище снусмумриков. ');
'x': WRITELN('Окровавленная бензопила');


Для вновь прибывших конечно всё это по барабану...
И фонарь наверное действительно не очень то и нужен
:frown:

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


И я не понимаю, это всё-таки DOSовская версия
https://zx-pk.ru/threads/29331-igra-quot-zona-quot-na-dvk.html?p=1024150&viewfull=1#post1024150

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

размеры исполняемого файла из восстановленного Никитой исходника в зависимости от версии транслятора ПАСКАЛЬ



PASDWK.SAV = 47 блоков
PASCAL.SAV = 49 блоков

и наш чемпион
PASY2K.SAV

HD7>DIR STALK1
23-Apr-2021
STALK1.PAS 70 21-Apr-2021 STALK1.SAV 55 23-Apr-2021
STALK1.LST 140 23-Apr-2021 STALK1.MAC 271 23-Apr-2021
STALK1.OBJ 53 23-Apr-2021
5 Files, 589 Blocks

svofski
23.04.2021, 15:51
Там же написано, (х) ХАКЕД БЫ оЛЕГ Х, увы. Но навряд ли великая хака Олега зашла дальше замены текста в бинарнике, так что, найдись неиспорченная версия, не составит труда восстановить сообщения.

Radon17
23.04.2021, 16:11
о, а с "моим" шрифтом нормально работает
https://cdn.discordapp.com/attachments/660577089119846411/835139763572047892/unknown.png
это я как-то пытался сделать шрифт 15ИЭ-00-013 по оригинальному дампу. В текстовых процессорах с ним проблем нет, а консоли нужен моноширинный... пробовал его через питоновский скрипт с гитхаба прогнать, он только флаг моноширинности поставил, но не сделал его по-настоящему моноширинным. Из-за этого в играх вроде сталкера глюки. По-обычному в консоли работать вроде можно. Кому интересно - могу дать .ttf

hobot
23.04.2021, 16:56
***

http://images.vfl.ru/ii/1619185522/0dda2cd6/34195981_m.png

http://images.vfl.ru/ii/1619185521/328e0bb0/34195979_m.png

***


Это кратко ) На самом деле приключений была масса!!!
Надо помнить ещё - на ход по лестнице вверх расход ЭНЕРГИИ = -2
Предметы с заклятием в новом подземелье "очищаются", но могут изменить функционал
(такие как "ВП" или "Свисток").
Если в банке на счету 0 - никто вас не выпустит !!!

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

да и на вопрос "А дальше пойдёте?" ЕМНИП надо Y жать, а не D )))

svofski
23.04.2021, 17:29
А как выбрасывать барахло из рюкзака?

hobot
23.04.2021, 18:07
А как выбрасывать барахло из рюкзака?
для подсказки жмите ХЭ ;-)
Я проверил в консольной версии всё выкидывается корректно, как и в оригинале (странно если бы было не так, правда?)

НЕ получиться выкинуть:
предметы с заклятьем, ПРИЗРАКА (он будет размножаться каждый раз если к нему приближаться или стоять рядом будет
копировать себя на свободное место в рюкзаке пока оно там есть - очистить только вызвав джина можно, джин за услуги забирает всё из рюкзака, перед вызовом всё съедаем, батареи заменяем, ну в общем понятно с этим...)

Есть момент "читерства" - но сильно влияет на вредность, а соотв. потребность в отдыхе будет расти !!! Когда встаёшь на # она потом превращается в стену ! или -, её не сходя с места можно взять, это можно использовать, когда есть риск быть замурованным ... потом эту стену просто выкидываешь и все дела...

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


А как выбрасывать барахло из рюкзака?
перемещение вещей в рюкзаке требуется для использования одинаковых предметов,
допустим у тебя 2 доспеха, один с заклятьем, второй нет. Функция "Одеть доспехи" (или как оно там), работает на крайний предмет слево (начало массива рюкзака), то есть перемещая предметы ты можешь выбрать какие из двух доспех использовать...

svofski
23.04.2021, 18:16
Странное дело! Я был уверен, что у меня это не работает. А сейчас проверил заново и все оказывается в порядке. D + символ, обозначающий предмет и все ок. Видимо заездил себе голову, портируя.

hobot
23.04.2021, 18:41
Странное дело!
в последний раз о грустном в такой прекрасной теме
--- плохо что расползается версия с опечаткой в хэлпе и "извращением" в описании к мусору в комнатах
в остальном - это подвиг Никиты и мы теперь иметь исходник Сталкера!!!

svofski
23.04.2021, 19:12
плохо что расползается версия с опечаткой в хэлпе и "извращением" в описании к мусору в комнатах
Целевая аудитория, если интегрировать ближайшее десятилетие, человек 15. Ничего страшного. Но неужели нигде не сохранилась неиспорченная версия?

Alex_K
23.04.2021, 19:26
Там же написано, (х) ХАКЕД БЫ оЛЕГ Х, увы. Но навряд ли великая хака Олега зашла дальше замены текста в бинарнике, так что, найдись неиспорченная версия, не составит труда восстановить сообщения.

Но неужели нигде не сохранилась неиспорченная версия?
Конечно же сохранилась. В хламничке у hobot-а диск dwkGAMES01.dsk (http://archive.pdp-11.org.ru/ukdwk_archive/dwkwebcomplekt/dwkGAMES01.dsk).

nzeemin
23.04.2021, 20:00
это я как-то пытался сделать шрифт 15ИЭ-00-013 по оригинальному дампу.

Могу предложить подходящий случаю шрифт - https://github.com/nzeemin/robotron-dotmatrix-font
Но там нет виндовых шрифтов, только вебовские.

hobot
23.04.2021, 23:56
Но неужели нигде не сохранилась неиспорченная версия?
их вообще куча ;-) STALK.SAV, PIKNIK.GME, - и по размеру, и по текстовым сообщениям могут различаться +
версия для БК11М... есть исходник - в нём все текста можно поправить и пересобрать игру (это под другие платформы \ ОС), а уж в RT-11 можно исполняемый файл как хочешь мучить с помощью DESS



STALK .SAV 49P 13-Dec-1991
PIKNIK.SAV 50P 07-Mar-1989



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

едой запасся, побегу дальше ;-)



ПОДЗЕМЕЛЬЕ 1
3 - - - - - - - - - - - - - - - РЕЙТИНГ 41
! ЭНЕРГИЯ 24
! !ОРУЖИЕ 0
!ЗАЩИТА 5
В БАНКЕ 120
!
! # - - - - ! !ВРЕДНОСТЬ 4
. . . . . . . ! !
. . . . . . . . . ! РЮКЗАК:
! ! . . ! . . ! . . . 5 < : ; : . .
! . . . . . . . ! . . ! . . . !
. ю . - - - . . - - - . . . !
. . . . . . . . . . .
! . . . . . . .
! . . М . . !
- - - - - - - - - - - - - - - - - -
БЕРЕМ

Hunta
24.04.2021, 12:12
Мне кажется, ошибка в комментарии:


VAR6: integer; { новый X игрока }
VAR10: integer; { новый Y игрока }
VAR12: integer; { Позиция Y игрока (строка) }
VAR14: integer; { Позиция X игрока (столбец) }

Но судя по использованию


V11070:=@F[VAR4,VAR12,VAR14]; {L03644}
V33074:=@F2[VAR4,VAR12,VAR14]; {L03716}
V11072:=@F[VAR4,VAR6,VAR10]; {L04000}
V33076:=@F2[VAR4,VAR6,VAR10]; {L04052}

а так же


VAR6:=VAR12+VAR16; { новый Y }
VAR10:=VAR14+VAR20; { новый X }
V11072:=@F[VAR4,VAR6,VAR10]; {L12552}
V33076:=@F2[VAR4,VAR6,VAR10]; {L12624}

ну и по порядку перечисления, VAR6 - это новый Y, а VAR10 - новый X игрока

hobot
24.04.2021, 12:15
ну и по порядку перечисления, VAR6 - это новый Y, а VAR10 - новый X игрока
это логично - потому как строка идёт первой в позиционировании, а столбец вторым - на самом деле.

Sandro
24.04.2021, 15:41
Мне кажется, ошибка в комментарии:
ну и по порядку перечисления, VAR6 - это новый Y, а VAR10 - новый X игрока

ЧИТАЙТЕ ИСХОДНИК С МОИМИ КОММЕНТАРИЯМИ.
Я разобрал весь движок.

svofski
24.04.2021, 21:12
Все-таки p2c это не то. Я набрался мужества и спортировал на труъ MT-Pascal для CP/M. Пришлось перепахать очень много, потому что у этого компилятора строгач с максимально допустимым размером процедуры (вот бы во всех компиляторах так было!) и еще кое чем.

Много менял, наверняка чего-то сломал. Текущий сорец в гисте (https://gist.github.com/svofski/c2aae20e1180aec73e0201ffa347e3cf).
Игра для Вектора-06ц (хотя наверное для любого CP/M + vt52 в принципе) тут (http://sensi.org/~svo/b/stalk1.com).

Поиграл сам, конечно, но терпения зайти слишком далеко пока не набралось:
https://i.imgur.com/CZVjvHe.png

nzeemin
24.04.2021, 21:17
С целого пинка все-таки получилось http://sensi.org/~svo/b/stalk1-win32.zip

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

Hunta
24.04.2021, 21:23
Внимательно следим за руками (или я чего то не понимаю?)
Это строки примерно с 419 по 423


while true do begin {L12254}
{ Начало игрового цикла }
V11070:=@F[VAR4,VAR12,VAR14]; {L12266}
V33074:=@F2[VAR4,VAR12,VAR14]; {L12340}
for VAR16:=-1 to 1 do begin {L12422}
for VAR20:=-1 to 1 do begin {L12462}
VAR6:=VAR12+VAR16; { новый Y }
VAR10:=VAR14+VAR20; { новый X }

Эти два цикла заканчиваются вот здесь (599-600):


end; { for VAR20 }
end; { for VAR16 }

А теперь смотрим внутрь (528-531):


VAR16:=1;
while (V33122[VAR16] <> V11070^) and (VAR16 < 4) do
VAR16:=VAR16+1;
V33122[VAR16]:=' ';

Как минимум VAR16 мы похерили...

Или я что то не помню про Паскаль?

nzeemin
24.04.2021, 22:03
Как минимум VAR16 мы похерили...

Как бы да, походу бага.
Могу ещё про одно место сказать, которое всё время мне кажется подозрительным - в procedure L03362 странные условия по поводу текущего этажа и движения вверх/вниз - я думаю там тоже не всё хорошо.
Но тут уже - мы воссоздали как есть, "художник (автор) так видит". 8-)

- - - Updated - - -

А тем временем, я ещё начал делать JS-версию Сталкера.

https://pic.maxiol.com/thumbs2/1619290784.1845257498.stalkjspreview.png (https://pic.maxiol.com/?v=1619290784.1845257498.stalkjspreview.png&dp=2)

По поводу кнопок внизу - идея в том чтобы показывать набор команд, который доступен именно в данный момент. Но с сохранением управления с клавиатуры.
Для этой версии приходится разбивать логику на функции, внутри которых нет ожиданий по времени или ожидания ввода от пользователя.

Alex_K
24.04.2021, 22:10
Как минимум VAR16 мы похерили...

Или я что то не помню про Паскаль?
В этом месте обрабатывается встреча со зверем. Звери бывают разные. Есть такие которые начинают к вам бежать из другого места, которое далеко от вас. Возможно что-то здесь и обрабатывается.

Hunta
24.04.2021, 22:28
Возможно что-то здесь и обрабатывается
Вот только у меня программа вылетела, когда зверь был достаточно близко к границе - на строке 15. VAR16 после встречи со зверем стал 4 и дальше (во внутреннем цикле) - вылет при попытке обработать строку с номером 19

Alex_K
24.04.2021, 22:37
Вот только у меня программа вылетела, когда зверь был достаточно близко к границе - на строке 15. VAR16 после встречи со зверем стал 4 и дальше (во внутреннем цикле) - вылет при попытке обработать строку с номером 19
Эта переменная портится также при вызове процедуры ZVERX. А тот код выше обрабатывает встречу со зверем на своей клетке, когды вы убиваете его, просто на него встав. Соответственно символ зверя стирается из массива разбуженных зверей.

svofski
24.04.2021, 22:44
Хотелось бы поюзать результат p2c конвертации (исходник на Си), можно как есть сырой - мне бы пригодилось тут в одном месте.
Вот, какой есть https://pastebin.com/LuDivLth

Radon17
24.04.2021, 23:04
По поводу кнопок внизу - идея в том чтобы показывать набор команд, который доступен именно в данный момент. Но с сохранением управления с клавиатуры.
А нажатие кнопки будет показываться? Инверсией например.

Hunta
24.04.2021, 23:37
'@': begin {L17200}
WRITE('Призрак.');
VAR22:=RUKSEEK('.','.');
if VAR22 < 7 then
VAR30:=VAR30+1;
RUKSAK[VAR22]:='@';
end;

Предположим, рюкзак полон и тут мы встречаем призрака... Пипец рюкзаку...

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


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

nzeemin
24.04.2021, 23:46
А нажатие кнопки будет показываться? Инверсией например.

Не знаю пока что будет. Сначала надо чтобы заработало, потом уже свистелки и перделки.

svofski
25.04.2021, 00:34
А как в Паскале оригинала работает процедура EXIT? Потому что во всех, что мне до сих пор попадались, EXIT выходит из процедуры, или завершает программу, если это main(). Смущает наличие EXIT, выполняющей по смыслу BREAK в районе поиска лестницы (https://github.com/nzeemin/uknc-various/blob/542857dd59ba58106b57cf338e3ae297600cebcb/STALK-PASCAL/STALK1.PAS#L931)

Hunta
25.04.2021, 00:46
Выход из объемлющего цикла.

nzeemin
25.04.2021, 00:50
А как в Паскале оригинала работает процедура EXIT? Потому что во всех, что мне до сих пор попадались, EXIT выходит из процедуры, или завершает программу, если это main(). Смущает наличие EXIT, выполняющей по смыслу BREAK в районе поиска лестницы (https://github.com/nzeemin/uknc-various/blob/542857dd59ba58106b57cf338e3ae297600cebcb/STALK-PASCAL/STALK1.PAS#L931)

Ну да, Exit в этом Паскале работает как Break для циклов. Break() же здесь это процедура, которая по смыслу работает как Flush, скидывает несохранённый буфер в файл.
Есть ли нормальный Exit/Return - не знаю, я не нашёл, поэтому сделал ассемблерной вставкой.
Не исключаю что Return всё-таки есть и просто мы не знаем его синтаксис.

https://ia800500.us.archive.org/4/items/omsi_pascal-1_ver_1.2_rt-11/OMSI_Pascal-1_Ver_1.2_RT-11.pdf - я тут смотрю описание на этот Паскаль.
Есть ещё книга от ДВК, но это просто перевод.
В документации не описаны labels и Goto, но на них удалось подобрать работающий синтаксис.

svofski
25.04.2021, 00:54
Еще у меня сложилось впечатление, что во всем огромном массиве флагов, который так щедро зарезервирован 16-битными целыми, используются только биты 0,1,2,6,10 (три младших бита для особенностей предметов, 0100 флаг увиденного и 02000 для заклятья). Есть какие-то догадки о том, чем объясняется такая расточительность?

nzeemin
25.04.2021, 01:11
Еще у меня сложилось впечатление, что во всем огромном массиве флагов, который так щедро зарезервирован 16-битными целыми, используются только биты 0,1,2,6,10 (три младших бита для особенностей предметов, 0100 флаг увиденного и 02000 для заклятья). Есть какие-то догадки о том, чем объясняется такая расточительность?

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

А, ещё такой момент мог повлиять, что этот Паскаль не имеет втроенного типа под байт.

Alex_K
25.04.2021, 01:22
Предположим, рюкзак полон и тут мы встречаем призрака... Пипец рюкзаку...
Попробовал на старой STALK.SAV, походил около призрака, он заполнил свободные места рюкзака. Никакого вылета не было.

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

А так по тексту на Макро-11 выход за границу массива не проверяется, потому будет запорчена следующая переменная.

Hunta
25.04.2021, 01:31
А так по тексту на Макро-11 выход за границу массива не проверяется
Зато на Шарпе отлично проверяется :D

Sandro
25.04.2021, 08:47
А, ещё такой момент мог повлиять, что этот Паскаль не имеет втроенного типа под байт.

Символьный тип же есть. И да, код очень неэффективен и вызывает сильно желание переписать по-нормальному :(

svofski
25.04.2021, 10:25
Символьный тип же есть. И да, код очень неэффективен и вызывает сильно желание переписать по-нормальному :(

Ну да, и основной массив символьный, так что автор про него знал. Но если символьный требует написания все время CHR() и ORD() для битовых операций, например, то понятно почему могло захотеться просто махнуть рукой и взять 16-битный целый. Тем более, что влезло.

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

Кольцо безусловно становится проклятым после снятия. Наверное и так нет смысла его снимать, но странно.

Hunta
25.04.2021, 11:51
'U': begin { вызвать джинна }
if (not VAR46) <> false then begin
WRITE('Что, влип? ладно, попробую тебя перенести отсюда. только дороговато это встанет... Ты готов? ');
READCHAR(VAR53);
if VAR53 <> 'N' then begin
for VAR16:=1 to 5 do begin
IND[VAR16]:=IND[VAR16]-RANDOM(0,15);
end;
for VAR16:=1 to 6 do begin {L34504}
RUKSAK[VAR16]:='.';
end;
VAR12:=RANDOM(2,15);
VAR14:=RANDOM(2,31);

VAR22 - типа новый этаж


VAR22:=RANDOM(0,8);

Но указатели ставим по старому (VAR4) этажу


V11070:=@F[VAR4,VAR12,VAR14];
V33074:=@F2[VAR4,VAR12,VAR14];

И только сейчас начинаем разбираться с новым?? Если что, то L03362 выставляет указатели только при перемещении между этажами
И кстати, наверное можно было сделать и так - VAR22:=RANDOM(0,VAR4);


if VAR22 > VAR4 then
VAR22:=VAR4;
VAR4:=VAR22;
L03362('J'); { Обновить экран }
end;
end else
WRITELN('Джинн в отгуле');
end;

Sandro
25.04.2021, 12:31
Но указатели ставим по старому (VAR4) этажу
И только сейчас начинаем разбираться с новым??


Да, это очевидная ошибка. Но она ни на что не влияет -- новые указатели никак не используются и будут прописаны правильными значениями в начале следующей итерации игрового цикла.


[code]
И кстати, наверное можно было сделать и так - VAR22:=RANDOM(0,VAR4);


Можно. И это лучше соответствует идее. Но оригиналный код будет чаще телепортировать на текущий уровень подземелья, т.е. это изменяет игровую механику.

Hunta
25.04.2021, 14:47
Но оригиналный код будет чаще телепортировать на текущий уровень подземелья
Всё зависит от RANDOM

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



for VAR16:=1 to 4 do begin {L36262}
if V33122[VAR16] <> ' ' then begin {L36322}
if (V33136[VAR16] <> VAR12) or (V33146[VAR16] <> VAR14) then begin {L36344}

VAR22 у нас не меняет только ленивый и в момент разборки с перемещающимся зверем оно вполне может быть 0 или 1. Как и VAR24. Так же вполне может оказаться, что Y или X координаты зверя совпадают с Y или X координатой игрока. И тогда в VAR22 или в VAR24 останутся старые 0 или 1.


if VAR12 > V33136[VAR16] then {L36434}
VAR22:=V33136[VAR16]+1 {L36460}
else if VAR12 < V33136[VAR16] then {L36506}
VAR22:=V33136[VAR16]-1; {L36532}
if VAR14 > V33146[VAR16] then {L36554}
VAR24:=V33146[VAR16]+1 {L36600}
else if VAR14 < V33146[VAR16] then {L36626}
VAR24:=V33146[VAR16]-1; {L36652}
if (F[VAR4,VAR22,VAR24] in ['!','-']) and ((V33126[VAR16] and 6) = 4) then {L36674}
V33122[VAR16]:=' '
else begin
F[VAR4,V33136[VAR16],V33146[VAR16]]:='.';
CURSORTO(V33136[VAR16],V33146[VAR16]);
WRITE('.');
F[VAR4,VAR22,VAR24]:=V33122[VAR16];
CURSORTO(VAr22,VAR24);
WRITE(V33122[VAR16]);
F2[VAR4,VAR22,VAR24]:=V33126[VAR16];

И вот тут мы сажаем зверя по возможной координате с 0 или 1 - если сильно повезёт.


V33136[VAR16]:=VAR22;
V33146[VAR16]:=VAR24;
CURSORTO(18,0);
WRITE(CHR(33B),CHR(113B))
end;
end;
end;
end;

После чего на следующем цикле перемещения он вполне может снести нам краевое ограждение. И у нас образуется дырка в стене за пределы игрового мира. Хороших блужданий в реальном мире :)

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



end else if (PROBE_FLAG_PTR^ and 6) = 2 then begin
{ Недостижимый код, см. выше }
{ Попытка переставить игрока на случайную соседнюю ячейку ??? }
TMP_Y:=RANDOM(1,3)-2+MAP_Y;
TMP_X:=RANDOM(1,3)-2+MAP_X;

Вполне себе достижимый. И переставить не игрока, а убегающего зверя.

А теперь вопрос знатокам - убегающий зверь виден на карте? После того как он сбежал из точки, куда встал игрок? Перерисовки зверя на новом положении я не вижу, но если сделать общую перерисовку, то он появляется...

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

В общем, от значительной части глобальных переменных избавился и основные косяки вроде вычистил


Подземелье 1
0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Рейтинг 0
! @ . . . . . . . . . . . . . . . . . . . . . . . . . . . !Энергия 25
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !Оружие 0
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !Защита 0
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . !В банке 0
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !Вредность 1
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . ! Рюкзак:
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ! ] ( < . . .
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Прогнивший пол провалился...З в е р ь !

http://www.KpXX.Ru/Soft/Games/Stalker

hobot
25.04.2021, 15:42
А теперь вопрос знатокам - убегающий зверь виден на карте?
да, иначе как его догонять? но - он замирает однажды и / или его надо подловить на диагоналях...

а если ты на него встал как он может быть виден? его жарить надо тогды "Ы"

то что зверь стены крушит - это не баг, а ФИЧА )))

Глобальные переменные зло!!! )))

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


В общем, от значительной части глобальных переменных избавился и основные косяки вроде вычистил будет Сталкер под RSX ? Надо бы тогда там правильные надписи вернуть - убрать трупы девушек и снусмумриков со спектрумами и в хэлпе опечатку поправить !!!

Hunta
25.04.2021, 15:42
да, иначе как его догонять?
Посмотрю ещё раз по исходнику на Паскале


то что зверь стены крушит - это не баг, а ФИЧА )))
Я про внешние, а не про внутренние

hobot
25.04.2021, 15:51
Я про внешние,
насколько я помню зверь ломает всё, но при попытке выйти туда игроком там будет стена всё равно,
выглядело вроде бы так (кирку / золотой шар не найдёшь, не проверишь)
-----
----ю---

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


Я про внешние, а не про внутренние
бегающий зверь вообще всё ЕМНИП стирает - любые предметы под собой!!!

Hunta
25.04.2021, 16:00
вообще всё ЕМНИП стирает
Я про это что то спрашивал?

hobot
25.04.2021, 16:06
Поиграл сам а какой у Вектора шрифт на самом деле, как на скрине или иной?

Alex_K
25.04.2021, 16:46
После чего на следующем цикле перемещения он вполне может снести нам краевое ограждение. И у нас образуется дырка в стене за пределы игрового мира. Хороших блужданий в реальном мире
Хорошая мысль. Надо посмотреть, а киркой снести можно?

А теперь вопрос знатокам - убегающий зверь виден на карте? После того как он сбежал из точки, куда встал игрок? Перерисовки зверя на новом положении я не вижу, но если сделать общую перерисовку, то он появляется...
Виден, если включен фонарь. Без фонаря он действительно исчезает из виду.

Hunta
25.04.2021, 16:49
Надо посмотреть, а киркой снести можно?
Не пробовал :D Я в основном ошибки искал :)


Виден, если включен фонарь. Без фонаря он действительно исчезает из виду.
Но при этом если перерисовать карту (э... у меня были все точки как бы исследованы, так что именно такой сценарий имелся ввиду) - он будет показан. Что меня и смутило. Если бы не был виден и после перерисовки или виден всегда, то как бы логично, а вот в варианте, который выдала программа...

Alex_K
25.04.2021, 16:54
Но при этом если перерисовать карту (э... у меня были все точки как бы исследованы, так что именно такой сценарий имелся ввиду) - он будет показан. Что меня и смутило. Если бы не был виден и после перерисовки или виден всегда, то как бы логично, а вот в варианте, который выдала программа...
При перерисовке должны высвечиваться ячейки, где уже прошёл игрок, или они были до этого освещены фонарём. Надо посмотреть.

Hunta
25.04.2021, 17:09
При перерисовке должны высвечиваться ячейки, где уже прошёл игрок, или они были до этого освещены фонарём.
Да, с этим всё нормально. Поскольку прошёлся по всем ячейкам - всё норм отрисовывается. Вопрос только в убегающем звере. То есть я вошёл в ячейку с ним, он типа оттуда сбежал, но не отрисовался на карте - хотя по логике - вроде как должен - я же все ячейки прошерстил. Но даю команду - перерисовать карту - и он показывается.

Alex_K
25.04.2021, 17:15
То есть я вошёл в ячейку с ним, он типа оттуда сбежал, но не отрисовался на карте - хотя по логике - вроде как должен - я же все ячейки прошерстил. Но даю команду - перерисовать карту - и он показывается.
А куда зверь сбежал, вы уже в этой ячейке побывали? Ну или она была освещена фонарём? Фонарь в это время, как я понимаю, выключен.

Hunta
25.04.2021, 17:28
А куда зверь сбежал, вы уже в этой ячейке побывали?
Третий раз пишу - прошёл ВСЮ карту уровня :)

Alex_K
25.04.2021, 17:30
Третий раз пишу - прошёл ВСЮ карту уровня
Ну тогда глюк при перерисовке. По идее должны высвечиваться статические объекты, а зверь всё-таки бегает и без фонаря не должен быть виден.

Hunta
25.04.2021, 17:35
Нуу.. Тот, который преследующий зверь - отлично рисуется (опять же - по крайне мере на ячейках, которые посетил) и без перерисовки.
Из за глобальных переменных, которые используются где только не попадя - тяжело отследить логику, возможно, при их зачистке где то не доглядел, но вот по текущему коду получается так. Надо будет попробовать под RT погонять, но там много не поэкспериментируешь - жисть заканчивается :)