PDA

Просмотр полной версии : Кросс-средства для программирования под МП 1801, 1806, 588



hdc
13.07.2009, 16:26
У кого-нибудь есть опыт использования кросс-ассемблера для этого процессора (или совместимого) под unix-подобной системой? Можете что-нибудь посоветовать?

AlecV
13.07.2009, 17:54
hdc, а в чем простите проблема ?

http://alec-v.livejournal.com/12981.html

НО!
а) Синтаксис там AT&T
б) binutils все показывает в HEX

Вывод: Лучше запускать родной MACRO-11 в эмуляторе (IMHO).

hdc
19.07.2009, 10:59
Вроде бы нашлось что надо:
http://www.dbit.com/pub/linux/macro11/

Я хочу к эмулятору БК прикрутить тоже самое, что уже почти
доделано для эмулятора Специалиста:

Редактируем исходник в любимом редакторе с подсветкой синтаксиса
и автоподстановками:
http://www.asvcorp.ru/darch/tools/emustudio/editor.png

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

Загружаем бинарник в эмулятор, включаем отладчик и смотрим
что к чему:
http://www.asvcorp.ru/darch/tools/emustudio/debugger.png

"И пусть спектрумисты завидуют!" :v2_wink2:

nzeemin
15.12.2009, 17:23
Расскажите в каком формате у вас отладочная информация, чем разбираете?

---------- Post added at 18:23 ---------- Previous post was at 18:19 ----------

Кстати, набрёл вот на это:
MACRO11 cross assembler for Win32
http://www.j-hoppe.de/PDP-11/MACRO11/macro11.html
Исходники присутствуют.

AlecV
16.12.2009, 00:43
Коллеги, IMHO самый лучший - это родной MACRO11 под RT-11 на эмуляторе (например SIMH).

perestoronin
11.01.2013, 12:19
Появилась необходимость в автономном тесте, зашиваемом в ПЗУ, который смог бы диагностировать БК-0011М без полностью исправного ОЗУ и без наличия клавиатуры. Для этого хотелось бы портировать тест от Океана-240 на БК.

Эмуляторов БК для отладки такого теста предостаточно. А вот кросс-ассемблеров и кросс-дизассемблеров, работающих на платформе x86, я не обнаружил.
Может я плохо искал? Ссылками на такие проекты не поделитесь?

Нашел вот этот проект http://www.retrocmp.com/tools/macro-11-on-windows по наводке из темы http://zx.pk.ru/showthread.php?t=10533

svofski
11.01.2013, 13:50
В проекте bkunix есть порт Portable C Compiler-а. Там же ассемблер:
http://sourceforge.net/projects/bkunix/files/bkunix/Release%200.1%20sources/

Я им пользовался в своей bk0010-fpga.
http://code.google.com/p/bk0010/
Си там слегка глючный, но не совсем бесполезный. Получилось перетащить в него Tiny FatFs и написать всю обвязку. Ассемблер валидный, хоть и синтаксис в нем не совсем традиционный. Эти тулы надо собирать под 32-битный таргет если хост 64-битный.

Кроме того, есть заточенный трудами felix-a порт gcc-aout для pdp11. Вот скрипт, который поможет его собрать с нуля:
http://code.google.com/p/svofski/source/browse/src/pdp11/gcc-build/pdp11-aout-gcc-build.sh?name=default
Компилировать что-то практическое я им пока не пробовал. Да и само оно может быть уже не соберется так просто без напильника, хороший повод провести эксперимент.

perestoronin
11.01.2013, 14:15
Тема по прежнему актуальна http://zx.pk.ru/showthread.php?t=20626

Patron
11.01.2013, 15:13
В качестве кросс-ассемблера 1801ВМ1 для Windows меня полностью устраивает "эмулятор ДВК" с родным компилятором DEC MACRO-11. Можно писать программы в блокноте Windows и тут же компилировать их в MACRO-11 в эмуляторе. Именно так я уже написал около сотни ассемблерных тестов различной аппаратуры на базе PDP-11.

perestoronin
11.01.2013, 15:27
В качестве кросс-ассемблера 1801ВМ1 для Windows меня полностью устраивает "эмулятор ДВК" с родным компилятором DEC MACRO-11. Можно писать программы в блокноте Windows и тут же компилировать их в MACRO-11 в эмуляторе. Именно так я уже написал около сотни ассемблерных тестов различной аппаратуры на базе PDP-11.

А исходники самого MACRO-11 имеются? Если да, приведите мне ссылку на их последнюю версию пожалуйста.

Какой дизассемблер порекомендуете?

Patron
11.01.2013, 15:37
К сожалению, исходники MACRO-11 до сих пор никем не выложены.

В качестве дизассемблера я использую IDA Pro 32 с модулем модели процессора собственной разработки ( подробнее здесь (http://zx.pk.ru/showthread.php?postid=367209) ).

Также я использую, встроенный в "Эмулятор ДВК" потоковый дизассемблер, показывающий ход выполнения программы, но к сожалению, для этого эмулятор приходится каждый раз перекомпилировать в зависимости от интересующей отладочной информации.

Patron
13.01.2013, 00:47
В модуле дизассемблера для IDA Pro 5.2 обнаружился баг с неправильным дизассемблированием команды XOR - исправленный вариант здесь: 1801VM1.w32.rar (http://zx.pk.ru/attachment.php?attachmentid=39302)

esl
13.01.2013, 02:07
В модуле дизассемблера для IDA Pro 5.2 обнаружился баг с неправильным дизассемблированием команды XOR - исправленный вариант здесь: 1801VM1.w32.rar (http://zx.pk.ru/attachment.php?attachmentid=39302)

ух ты, а там же есть DEC PDP-11 (с таргет MACRO-11), а что с ним не так ??

bigral
13.01.2013, 02:20
К сожалению, исходники MACRO-11 до сих пор никем не выложены.

в проекте pdp-2011 используется некий аналог, качаем отсюда http://pdp2011.sytse.net/wordpress/download/ там в исходниках проекта в каталоге /tools лежит рабочая версия под linux

Patron
13.01.2013, 11:18
там же есть DEC PDP-11 (с таргет MACRO-11), а что с ним не так ??Во всех модулях pdp11 для IDA (кроме выложенных мною вчера) жуткий баг с дизассемблированием команды XOR - операнды при дизассемблировании меняются местами.

perestoronin
13.01.2013, 11:44
Во всех модулях pdp11 для IDA (кроме выложенных мною вчера) жуткий баг с дизассемблированием команды XOR - операнды при дизассемблировании меняются местами.

От перестановки аргументов результат не изменится, а вот место размещения результата операции имеет значение.

MM
27.04.2013, 20:35
Был вроде как штатный дизассемблер в RT-11 - сам в конце 80-х им пользовался. Может называться "DES" - но за давностью лет точно не помню.
А так практически единственный вариант - это DESS.SAV . По команде "Т" он
пишет исходник на устройство ( по умолчанию - "LP:" - принтер ). Начать вывод
на устройство - команда "О" (?) - короче, OUT. Назначить дисковое устройство -
MOUNT LD0: 123456.DSK , затем ASS LD0: LP: - данные для принтера пойдут в файл
123456.DSK . Помнится, я этот DESS ковырял в 1991 г., что бы он сразу в файл
писал макроассемблер, но, видимо, потерял его . (Вообще, конечно, это весьма
кривой способ вывода текста, но зато радикально правильный. Файл "123456.DSK"
не забываем предварительно забить пробелами или 000000, а так же создать его,
емкостью от 9 блоков ).( Пишет по-блокам, от 512 байт текста макроассемблера)

shattered
28.04.2013, 15:18
В MESS тоже есть дизассемблер (прилагается к каждому эмулируемому процессору, кстати) -- unidasm.

Vslav
12.11.2014, 23:30
В качестве кросс-ассемблера 1801ВМ1 для Windows меня полностью устраивает "эмулятор ДВК" с родным компилятором DEC MACRO-11. Можно писать программы в блокноте Windows и тут же компилировать их в MACRO-11 в эмуляторе. Именно так я уже написал около сотни ассемблерных тестов различной аппаратуры на базе PDP-11.
Тема не утратила актуальности - очередному ностальгирующему нужно компилировать тесты для ПЗУ bare system :). Не расскажете подробнее как процесс компиляции в эмуляторе организовать? У меня задача классическая - есть исходники в каталоге под Windows, надо каким-то образом запускать процесс сборки из скрипта (предпочтительнее makefile) и на выходе в том же каталоге получать двоичный образ (далее оно идет в mif и в FPGA или в ремулятор).
Пока помучал упоминаемый MACRO-11 под Win32, но у него непонятный объектный формат, линкер пока не подобрал. Еще собрал GCC для PDP-11 под MinGW, вроде работает, но у него синтаксис не нативный.

MM
13.11.2014, 01:13
Если речь идет о программе ОС RT-11 MACRO.SAV , то к нему штатный линковщик - LINK.SAV . Скажу сразу - за несколько часов с интеллектом IQ=100 там делать нечего - надо въезжать неделями, что значит определенные знаки и команды и т.п. синтакис.
Написание софта на MACRO/LINK - лучше всего не вылазить за пределы RT-11, и использовать заглавные КОИ-7 . Текстовый редактор для этих целей - SCREEN.SAV,
на худой конец EDIK.SAV ( не путать с монстром от "Консула" - EDIT/K52 ).
Если не удается найти EDIK.SAV - можно использовать EDIKM.SAV от комплекта поставки БК11М - но надо переправить ключевую клавишу ( в DESS.SAV ) на какую-нибуть от ДВК ( в БК11М - вроде как "ШАГ" ).
Полное ТО на комплект среды разработки давалось с каждым ДВК3 и ДВК4 - но их блондины сразу ставили в сортир как главный папирус.

Vslav
13.11.2014, 13:19
Написал автору порта MACRO-11, посмотрим что расскажет как он линковал.
На самый крайний вариант напишу свой простенький конвертор выходного объектника MACRO-11 Win32, там формат вроде достаточно простой, но не хочется время тратить.

Patron
13.11.2014, 15:44
Тема не утратила актуальности - очередному ностальгирующему нужно компилировать тесты для ПЗУ bare system. Не расскажете подробнее как процесс компиляции в эмуляторе организовать?Довольно подробный ответ есть ЗДЕСЬ (http://zx-pk.ru/showthread.php?postid=724088) и ЗДЕСЬ (http://zx-pk.ru/showthread.php?postid=374417).

---------- Post added at 15:44 ---------- Previous post was at 15:40 ----------

Пример компиляции исходника ПЗУ - ЗДЕСЬ (http://zx-pk.ru/showthread.php?postid=556352).

Vslav
13.11.2014, 16:47
Это все понятно, но я хотел бы собирать весь проект целиком одним кликом из своей любимой IDE, а не что-то копировать ТС, потом еще что-то набирать в эмуляторе, потом копировать ТС обратно. Тут важна скорость и удобство, бывает до нескольких десятков пересборок в час, утомительно скакать по окнам и что-то вбивать. А так - одну кнюпочку нажал, по makefile пересобрался .mif, потом .sof, автоматом ушло в FPGA и само перезапустилось.

Вот, например, некоторые эмуляторы CP/M-80 позволяют запускать себя, потом указанное приложение с указанными параметрами (передается как командная строка приложения эмулятора) и все файловые операции транслируются автоматически в каталог DOS/Windows. Запускать там m80/l80 вполне прикольно и можно приспособить в свой общий makefile.

PS. Автор порта MACRO-11 Win32 ответил что формат выходного объектника там RT-11 (доку я нашел на него), но линкера под Win32 он не знает. Ну и ладно, своя сборка GCC устроит пока, тем более потом все равно С будет нужен.

Patron
13.11.2014, 17:05
некоторые эмуляторы CP/M-80 позволяют запускать себя, потом указанное приложение с указанными параметрами (передается как командная строка приложения эмулятора) и все файловые операции транслируются автоматически в каталог DOS/Windows.Добавление такой возможности в эмулятор RT-11 запланировано, но пока не реализовано.

Oleg N. Cher
20.11.2014, 00:46
Ну и ладно, своя сборка GCC устроит пока, тем более потом все равно С будет нужен.Я правильно понимаю?

Своя сборка GCC

Хост-платформа: Linux
Таргет: 1801 (совместим с системой команд PDP-11)
Язык: Си
Выходной формат? (.sav)?

Можно ли делать в Си-коде асмовые вставки?

Можно ли делать/использовать библиотеки стандартными утилитами GCC типа ar?

Есть ли возможность скачать и опробовать эту сборку для человека, который плоховато дружит с Linux?

Vslav
20.11.2014, 01:37
Хост-платформа: Linux

Нет, я под MinGW собрал для Win32



Таргет: 1801 (совместим с системой команд PDP-11)
Язык: Си

Да. Только там нет тагета именно 1801, придется что-то из дековских подбирать.



Выходной формат? (.sav)?

Формат объектнков a.out.
Насчет .sav не знаю, это проприетарный формат DEC RT-11. Я сейчас просмотрел - линкер ld формат .sav не поддерживает. Но если не злоупотреблять оверлеями то .sav примитивный, можно конвертор написать.



Можно ли делать в Си-коде асмовые вставки?

Собрано на базе GCC 4.6.2, полагаю что стандартный способ ассемблерных вставок для GCC должен работать.



Можно ли делать/использовать библиотеки стандартными утилитами GCC типа ar?

Да.



Есть ли возможность скачать и опробовать эту сборку для человека, который плоховато дружит с Linux?

Выложил архив 17МБ (http://sderni.ru/250631)
Только сам C/C++ я еще не пробовал. И там у меня пара ран-тайм библиотек со сбоем собралась, но с собственно сишными все ОК. Для программирования на С для bare-metall систем не собранные либы не нужны.

Oleg N. Cher
20.11.2014, 03:52
Vslav, спасибо за ответы и за сборку.

Собираюсь попробовать сделать подсистему Pdp11Dev (или как лучше назвать?) для разработки на паскалеподобном языке Оберон-2. Таргеты - БК-0010/0011(M), УКНЦ, возможно, ДВК. Интерес чисто теоретический. Формат .sav не самоцель, просто полезно было бы иметь - видел его поддержку в интерактивном дизассемблере IDA Pro, значит формат достаточно известный.

Сама подсистема устроена так: среда разработки транслирует своими средствами модуль на Обероне в его сишный эквивалент, потом запускает батник, в котором можно прописать всю логику работы по компиляции сишных файлов в бинари и конвертировании a.out в нужный выходной формат - образ кассеты, образ диска и т.п. Такой принцип обкатан на подсистемах ZXDev и MsxDev и хорошо работает. Почему именно Оберон, а не чистый Си - разговор отдельный и наверное не очень тематический.

За счёт единообразного по стилю набора библиотек для различных платформ возможна (со многими ограничениями конечно, но возможна) разработка, например, игры с одного исходника для нескольких целевых платформ, различных по архитектуре, вплоть до разрядности. Библиотеки конечно нужно писать с нуля, знания данного асма у меня вообще нет, так что, вероятно, придётся задавать много глупых вопросов по низкоуровневому кодингу. :)

Несколько подобных игр находятся у меня в разработке. Целевые платформы - ZX Spectrum, Windows (32/64 bit), Linux (SDL), MSX, Java micro edition, MS-DOS, возможно в скором будущем - Nintendo/NES (6502). Почему бы не прибавить к ним и БК/УК-НЦ. :)

---------- Post added at 02:52 ---------- Previous post was at 01:40 ----------

Цель разработки такой подсистемы - не только делать игру сразу для нескольких ретро-платформ. Мне всегда не хватало чего-то для быстрого старта. Ну вот, допустим, захотелось покодить для БК. Асма не знаю. Слова "MACRO 11" меня пугают. Зато когда-то работал на Fast/Pascal. Т.е. не хватает чего-то такого: скачал, набрал простенькую программку на пару строк и запустил одним нажатием кнопки, притом не внутри эмулятора. Вот что-то подобное и нужно разработать, чтобы начинающим, кто захочет попробовать кодить под ретро, не пришлось делать рутинную работу по написанию вывода буквочек в текстовую консоль на асме.

Опишу возникшие трудности со сборкой. Пробую собирать простейший исходник:


int main(int argc, char **argv)
{
return 0;
}
1. Затребовала ряд .dll:

libgcc_s_dw2-1.dll
libgmp-10.dll
libiconv-2.dll
libmpc-2.dll
libmpfr-1.dll

Взял их с MINGW и поместил в /bin. Пришлось прописать SET path=..\Bin\gcc\bin

2. Не увиделись файлы в путях для инклюдов. Вызываю так:

pdp11-aout-gcc.exe -I ../Lib/C -I ../Lib

Пока пришлось разместить все файлы в одной текущей папке.

3. Вроде собралось. Но выдало такое:

h:\Archive\Projects\XDev\Pdp11Dev\Obj>SET path=..\Bin\gcc\bin
h:\Archive\Projects\XDev\Pdp11Dev\Obj>SET gcc=..\Bin\gcc\bin\pdp11-aout-gcc.exe
-I ../Lib/C -I ../Lib
h:\Archive\Projects\XDev\Pdp11Dev\Obj>..\Bin\gcc\bin\pdp11-aout-gcc.exe -I ../Li
b/C -I ../Lib Empty.c
h:/archive/projects/xdev/pdp11dev/bin/gcc/bin/../lib/gcc/pdp11-aout/4.6.2/../../
../../pdp11-aout/bin/ld.exe: cannot find crt0.o: No such file or directory
h:/archive/projects/xdev/pdp11dev/bin/gcc/bin/../lib/gcc/pdp11-aout/4.6.2/../../
../../pdp11-aout/bin/ld.exe: cannot find -lc
collect2: ld returned 1 exit status

Файла crt0.o в архиве нет. Наверное нужно вызывать как-то не так, да?

Хотелось бы собрать хотя бы helloworld хотя бы для какой-то из платформ - БК, УК-НЦ или ДВК. Если есть идеи, благодарю за них заранее.

Vslav
20.11.2014, 11:27
Файла crt0.o в архиве нет. Наверное нужно вызывать как-то не так, да?

Увы, это то о чем я говорил - библиотека ран-тайм для C у меня не собралась. Дело в том, что у меня есть своя модульная система на основе RTOS TNKernel, и все самописное, включая нужные процедуры crt для разных платформ. Поэтому я не разбирался почему оно не собралось - мне эти библиотеки не нужны.
Варианты решения - или попробовать самому собрать эту библиотеку отдельно, или попробовать взять готовую из какой другой сборки. Или посмотреть какие модули оно хочет из этой библиотеки - если программа пустая то скорее всего стартовый модуль, написать его самому и библиотеку не пользовать.

Oleg N. Cher
20.11.2014, 12:05
Есть ли интерес к подобной подсистеме для разработки под БК и УК-НЦ? Потому что если нет, то, боюсь, на этом мои исследования и закончены. Не чувствую достаточной уверенности в деле написания собственного линкера или даже конвертера из бинарника в образы ленты/диска. Есть желающие помочь? Получим не только среду разработки на Обероне, но и можно будет скомпоновать свою среду для разработки на Си. Притом по кодогенерации она будет явно мощнее, чем нативные. А библиотеки можно подтянуть да хоть с Fast/Pascal.

Итак. Задача №1. Как-то получить на выходе бинарный файл, скомпилированный под нужный нам адрес.

Задача №2. Уже непосредственно конвертировать в образы. Начать можно не с .sav, а, например, с образа ленты БК. Посмотрел, в эмуляторе БК-0010.01 Андрея Грабовца для хранения игр используется непосредственно формат .bin. Он чем-то отличается от бинарника, который наверное способен выдать модифицированный GCC?

Vslav, я был бы рад примеру подобной библиотеки с процедурами crt и стартовым модулем, которую можно собрать данным GCC.

hobot
20.11.2014, 21:31
Таргеты - БК-0010/0010, УК-НЦ, возможно, ДВК.
Я бы немного поправил (хотя возможно зря я вообще встреваю, я ведь вовсе не программер), но тут надо ориентироваться на ОС RT-11 и её форматы и как самый честный по отношению к PDP-11 в плане железок - это ДВК конечно, но ДВК были(есть) на разных процессорах и на ВМ1 и на ВМ2 и на ВМ3 (???), то есть если собранный sav работает под RT-11 он будет(должен) работать везде и на УК-НЦ(ВМ2) и на БК11М(строго ВМ1) и на ДВК(ВМх). Как-то так.

Спецификой у этих родственных машинок является только графика !!!
Поэтому графику пока отложить в сторону (по мере изучения ОС и платформы нюансы с ней связанные станут понятнее - везде графика на уровне железа по разному сделана, такие дела. И если брать какой-то ориентир в плане графики - это наверное либо что то новое к ДВК прикручивать (желательно поддержку Glide - досовский или виндовый) или ориентироваться на КЦГД,
как самый продвинутый отечественный видео-адаптер, который, кстати говоря, на ВМ2)

MM
21.11.2014, 03:58
ИМХО - на БК10 УНИКС-системы и их варианты не жизнеспособны. Тоже и о "Си" можно сказать. Причина - мало ОЗУ. 15.5 кбайт при фактически враждебном ПЗУ - это все, что там имеется. Не стоит забывать и о быстродействии - 250 т. рег-рег в ДОЗУ, 400 т. в ПЗУ.
А вот на БК11/М есть шанс - там можно и скрытые библиотечки разместить в скрытых страницах ДОЗУ, и вообще организовать подкачку оверлеев с диска.
Главная проблема БК11/М - быстродействие. Оно примерно 300 т. рег-рег в ДОЗУ.
Не следует так же забывать, что для эффективного фукционирования компилированного кода ( с языка высокого уровня ) его надо днями-неделями править ручками, иначе - тороза 2-3 крат и раздутый код - на 20-200% по сравнению с предельно оптимизированным.
А вообще есть старая идея - прикрутить ДЕМОС ( следует читать "Уникс" ) к БК11М - да хотя бы с оверлеями на диске. Если там проблема в ДП - в так в варианте с блоком "ВМ3А" с 2-мя метрами - но скажу сразу, оплатить по ставкам кодера этот процесс в данный момент у меня нет возможности, даже частично ( бухло - не в счет... ).

hobot
21.11.2014, 08:44
и раздутый код
Вот тот же fast\pascal - код там может и не раздутый (не знаю), но вот SAV файлы еле еле в память влазят, по этой причине
эта среда разработки и не стала ничем более как ознакомительной для школьников\студентов, что бы подготовить их к
Борланд(Турбо) Паскалю под ДОС в ВУЗах. (это я про 90-е конечно пишу).

Есть надежда и на двух процессорность ВМ1 - двухпроцессорность может сделать "nextgen" ДВК\БК (УК-НЦ по любому в сторонке - как машинка принципиально апгрейду не подлежащая - по понятным причинам).

Oleg N. Cher
21.11.2014, 08:53
Я бы немного поправил (хотя возможно зря я вообще встреваю, я ведь вовсе не программер), но тут надо ориентироваться на ОС RT-11 и её форматыПринимается.

hobot, так я - ещё меньше программер, если брать PDP-11. :) Поэтому не справлюсь без помощи энтузиастов, даже непрограммеров. :)


то есть если собранный sav работает под RT-11 он будет(должен) работать везде и на УК-НЦ(ВМ2) и на БК11М(строго ВМ1) и на ДВК(ВМх). Как-то так.А ничего, что .sav - проприетарный и закрытый формат (http://zx-pk.ru/showpost.php?p=755083&postcount=26)? А то ведь, вероятно, придётся писать линкер в этот формат. Или, по крайней мере, конвертер bin2sav.


ИМХО - на БК10 УНИКС-системы и их варианты не жизнеспособны. Тоже и о "Си" можно сказать. Причина - мало ОЗУ.Принимается. Хотя я как-то краем уха слышал о компиляторе Паскаля именно на БК-0010 (не 0011).


Не следует так же забывать, что для эффективного фукционирования компилированного кода ( с языка высокого уровня ) его надо днями-неделями править ручками, иначе - тороза 2-3 крат и раздутый код - на 20-200% по сравнению с предельно оптимизированным.Эхехе. :) Но тоже принимается, куда ж деваться. :)

Может GCC, собранный Vslav'ом, даст лучшего качества код?

В принципе, Спектрум да и проц Z80 тоже не особо ахти какая подходящая вещь для разработки на ЯВУ, однако мы сейчас отбросим в сторону асмовский кодинг как идеальный способ разработки игр для ретро-платформ, потому что он медленно, но верно сходит на убыль, и сконцентрируемся на попытке получить хотя бы хелловород и хотя бы сверхбольшого размера, но рабочий и на GCC-PDP11 (со вставками асма). Это будет первый очень грамотный шаг в сторону от асма. Конечно при патронаже и прикрытии асма.

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

perestoronin
21.11.2014, 09:14
gcc не является грамотным шагом, но и делать еще один ужасм ни к чему. Выгоднеее детально разобрать референсный компилятор и/или довести до желаемого состояния кросс macro11, и лишь затем замахиваться на разбор рудиментов оставшихся в gcc под архитектуру pdp11.

hobot
21.11.2014, 10:39
А ничего, что .sav - протопиетарный и закрытый формат?
вот тут (http://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=7&cad=rja&uact=8&ved=0CE4QFjAG&url=http%3A%2F%2Fbitsavers.trailing-edge.com%2Fpdf%2Fdec%2Fpdp11%2Frt11%2Fv5.6_Aug91%2 FAA-PD6PA-TC_RT-11_Volume_and_File_Formats_Manual_Aug91.pdf&ei=7OVuVJ79OoT8ywPO-4KoBg&usg=AFQjCNH1pqcF3F4u-TmZF-aruycXdlb6zg&bvm=bv.80185997,d.bGQ) в родной документации что то сказано про формат SAV. В целом это скорее к проф.системщикам вопрос, дождёмся их комментария ? )

И (я сейчас поиск по форуму не гонял) формат SAV уже обсуждали ЕМНИП и даже не 1 раз возможно. Не такой он в RT-11 и сложный и не такой уж и закрытый. Подозреваю на NEXTGEN машинках наличие более продвинутых ОС чем RT-11 там и вовсе всё по другому, поэтому тут консультации опять же только с проф. системщиками будут нужны и не один раз возможно.
:wink:

Тут вот какая штука, есть естественная среда, большинство профи (и я их именно в этом поддерживаю на все 100) склонны отправлять людей писать и компилировать в ней, поскольку это 100% гарантия оптимально рабочей программы на выходе. И ничего не надо выдумывать, под любую ось (RT-11, RSX, TSX, ДЕМОС) уже есть компиляторы и линкер (в том числе и компилятор для Фортрана, Паскаля и Си, правда пока провисон "по прежнему" с Модулой2, но физически она есть, просто
её никто не использовал никогда, т.е. нет человека с практикой кто бы
сказал - вот так надо делать и книга4 ПО ДВК где описание модулы2
всё ещё разыскивается для возможности сделать скан!).

Однако в рамках Оберон-Технологий :wink: ничего удивительного если
что то действительно с нуля надо создавать. В своё время и БК и УК-НЦ и
ДВК пришли студентам и школьникам только с ОС и компиляторами, по
сути весь дополнительный софт писался пользователями по необходимости или личному желанию (обучающий, драйвера для доп.устройств и сети, игры). Конечно были профессиональные пакеты (это в частности софт для локальной сети. В общем чем и ценны (помимо ностальгии) все наработки на базе отечественных КУВТ - каждый мог и вносил свою лепту (если хотел\мог\желал) написанием своей версии программ форматирования или улучшенным драйверов печати для принтеров и т.д. и т.п. - ничего не напоминает? (я про ОС не виндовые :wink:).

MM
21.11.2014, 12:56
Формат .SAV в DEC - машинках - вообще-то базовый, и конкретно разжеван в комплектных доках по ДВК.
Если имеется необходимость быстрого переноса с ИБМ на БК11М программ на языках высокого уровня - лучше воспользоваться Паскаль-программами - написать 1 шт. строку кодов они умеют ( и килобайт 10 библиотек воткнуть в исполняемый файл .SAV ).
Насчет Си - вроде как был в составе последних ДВК4 такой компилятор - он же пойдет и на БК11М с RT-11.
*
Насчет скорости процесса создания софта на MACRO-11 для ДВК/БК - ничего лучше использования эмуля ДВК со штатными средствами RT-11 в принципе не может быть - т.к. все остальные среды - это всего лишь паразитные надстройки над этим процессом кодинга. А вот написание кода для не поддерживающих RT-11 машинок - это нетривиальная задача для MACRO-11, но вполне решаемая - ручками, под DESS.SAV ( править код , полученный из LINK.SAV )
*
И вопрос на засыпку - кто-нибуть знает ковырялку для W7 - по типу Винхекса, но с поддержкой восьмеричных чисел ?

hobot
21.11.2014, 15:33
Насчет Си - был и есть и шёл с машинками с самого начала в виде отдельного пакета с огромной толстой книгой. В архиве представлен в нескольких
вариантах.

Про родную среду полностью согласен, НО(!) народ боится и обижается когда отправляешь в RT-11 компилировать, говорит не хочу (почему не ведомо мне), хочу кнопку у себя в системе удобную, телепатов нет, какую кнопку? где?
Делайте сами - совет прозвучал - ещё больше обижаются )))

ИМХО: программирование под RT-11 = МАCRO-11 ))) Никуда не денешься ! )))
Поэтому максимум что тут можно пожелать - писать с нуля транслятор который на выходе будет давать оптимальнейший
код на макро-11, который затем легко будет штатными средствами довести до исполняемого файла типа SAV.


Литература
http://archive.pdp-11.org.ru/BIBLIOTEKA/dwkbooks/
http://archive.pdp-11.org.ru/BIBLIOTEKA/DVKTXT/RAFOS_II/

Oleg N. Cher
21.11.2014, 16:22
Си - был и есть и шёл с машинками с самого начала в виде отдельного пакета с огромной толстой книгой.Я не хочу пользоваться "родными" компиляторами и средами, которые работают под RT-11, по нескольким причинам.

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

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

3. Жирные рантаймы, которые обязательно пристегнёт наша любимая среда, которая умеет штатными средствами генерировать .sav.

Так что я настаиваю на gcc-pdp11. Вы версию посмотрите. Он должен такой код выдавать, что пальчики оближете. Игры для БК-10 можно будет писать. Несложные конечно, чудеса бывают, но редко. Но можно. И, наконец, я уверен что можно будет минимизировать размер рантаймов под самый минимум.

У меня просьба к специалистам. Соберите минимальный EMPTY.SAV, который будет запускаться под RT-11 и выходить в ОС. Всего лишь, ничего больше. В средствах не ограничиваю, на Fast/Pascal смог бы написать и сам, но Паскаль пристегнёт большой рантайм, и придётся разбираться чего там лишнего.

Вопрос. В RT-11 есть такое понятие как код возврата из ОС? Ну, тот самый, который main() { return EXIT_CODE; }

Если покажете код на MACRO-11, который будет всего лишь возвращаться в RT-11 (с нормальным кодом возврата), у нас уже будет от чего плясать. Потом мы зациклим программу и посмотрим как она завесит RT-11. Нет предела совершенству, для платформы Java micro edition я именно с этого и начинал. :) А теперь пишу для неё игру на Обероне, хотя до меня никто этого не делал.


Про родную среду полностью согласен, НО(!) народ боится и обижается когда отправляешь в RT-11 компилировать, говорит не хочу (почему не ведомо мне), хочу кнопку у себя в системе удобную, телепатов нет, какую кнопку? где?Конкретно в моём случае я объяснил почему чураюсь "нативных" средств разработки для ретро-платформ. Потому что это технологический тупик. А вовсе не потому что в эмуляторе кнопки непривычно нажимать, хотя и это тоже.

А вот кнопку какую я хочу. Да простую. Которая соберёт мой исходник для RT-11, запулит в образ диска и откроет в эмуляторе с автозапуском. Для разработки под Спектрум пользуюсь такой волшебной кнопкой, очень пользительно.


ИМХО: программирование под RT-11 = МАCRO-11 ))) Никуда не денешься ! )))
Поэтому максимум что тут можно пожелать - писать с нуля транслятор который на выходе будет давать оптимальнейший код на макро-11, который затем легко будет штатными средствами довести до исполняемого файла типа SAV.И писали они транслятор год, и писали два... ;)

Не, ну чо, нормальный вариант если кому-то хочется потратить на это лет пять. А чем это лучше ассемблера, встроенного в gcc-pdp11?

Vslav
21.11.2014, 16:33
И писали они транслятор год, и писали два... ;)
Не, ну чо, нормальный вариант если кому-то хочется потратить на это лет пять.

У меня есть одна идея, возможно уложиться в неделю. Сейчас на работе разгребусь, реализую эту интересную вещицу.

Проект empty.c соберу чуть позже, сейчас аврал у меня.

hobot
21.11.2014, 17:13
исходников нет
Да исходников Макро-11 вроде бы никто пока не опубликовал.


Если покажете код на MACRO-11, который будет всего лишь возвращаться в RT-11



.END


:redface:

Такая программы будет без ошибок собрана в родной среде и запускаться.
Займет 1 блок памяти на всех этапах ) Память в RT-11 в блоках (!).

Oleg N. Cher
21.11.2014, 18:30
hobot, это значит - такой вещи как "код возврата из программы" в RT-11 нет?

С ассемблера по сути не так уж трудно транслировать, там прямое соответствие. Это с Си нужно изголяться, чтобы оптимальный код получился. И "родные" компиляторы, работающие под RT-11, не дадут нормального качества кода, там генерация обычно построена на монолитном рантайме, который включается в каждую программу. А вот GCC с его механизмом библиотек способен динамически генерировать рантайм, включая только действительно необходимое. То есть потенциально мы можем получить на базе gcc-pdp11 самую идеальную в плане качества кода среду для кросс-разработки под PDP-11.

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

.END - это директива, за которой скрывается машинная команда (или команды). Я точно не знаю что там именно, надо дизассемблировать такой .sav, благо, это можно сделать с помощью IDA Pro. Попробую.

hobot
21.11.2014, 19:41
hobot, это значит
Олег, да не программер я ! Я не знаю что такое "код возврата". )
Вот ты бы почитал SYSMAC.HLP раз собрался что то ваять под RT-11 ведь
от штатных директив и запросов всё равно не денешься )))

Ты просил минимальную, на макро-11 и что бы просто выходила в систему, я ей в первой же строке написал "конец" без указания стартовой метки, не уверен что во всех вариантах монитора она заработает, может под каким нибудь вариантом трапниться, но под SJ работает так как я описал.

Выход в систему осуществляется грамотно наверное вот так:



5.3.12. .EXIT
ЗАПРОС .EXIT ВЫЗЫВАЕТ ОКОНЧАНИЕ ВЫПОЛНЕНИЯ ПРОГРАММЫ
ПОЛЬЗОВАТЕЛЯ И ПЕРЕДАЕТ УПРАВЛЕНИЕ KMON.
ПЕРЕД ВЫХОДОМ ИЗ ПРОГРАММЫ ВЫПОЛНЕНИЕ ВСЕХ ИНИЦИИРО-
ВАННЫХ ОПЕРАЦИЙ ВВОДА-ВЫВОДА И /ИЛИ ПОДПРОГРАММ ЗАВЕРШЕНИЯ
БУДЕТ ЗАКОНЧЕНО. ВСЕ НЕВЫПОЛНЕННЫЕ ЗАПРОСЫ .MRKT И .CMKT
БУДУТ АННУЛИРОВАНЫ.
ЕСЛИ ЧАСТЬ ФОНОВОЙ ПРОГРАММЫ ЗАНИМАЕТ ОБЛАСТЬ ПАМЯТИ
KMON И USR, ТО ОНА БУДЕТ ЗАПИСАНА В БЛОКИ ДЛЯ ВРЕМЕННОГО
ХРАНЕНИЯ ДАННЫХ НА СИСТЕМНОЕ УСТРОЙСТВО (ЕСЛИ РАНЕЕ БЫЛА
ВЫПОЛНЕНА КОМАНДА SET EXIT SWAP). ПОСЛЕ ЭТОГО KMON И USR
ЗАГРУЖАЮТСЯ В ПАМЯТЬ И УПРАВЛЕНИЕ ПЕРЕДАЕТСЯ КЛАВИАТУРНОМУ
МОНИТОРУ. ЕСЛИ БЫЛА ВЫПОЛНЕНА КОМАНДА SET EXIT NOSWAP, ТО
ПРОГРАММА ПОЛЬЗОВАТЕЛЯ ПРОСТО ПЕРЕЗАПИСЫВАЕТСЯ.
ЕСЛИ R0 = 0 ВО ВРЕМЯ ВЫПОЛНЕНИЯ .EXIT, ТО ВЫПОЛНЯЕТСЯ
ОПЕРАЦИЯ АНАЛОГИЧНАЯ .HRESET, ЗАПРЕЩАЮЩАЯ ПОСЛЕДУЮЩЕЕ
ВЫПОЛНЕНИЕ КОМАНД REENTER, START ИЛИ CLOSE.
ЗАПРОС .EXIT ПОЗВОЛЯЕТ ПРОГРАММЕ ПЕРЕДАТЬ КОМАНДЫ КЛА-
ВИАТУРНОМУ МОНИТОРУ, ИСПОЛЬЗУЯ ЯЧЕЙКИ 500-777, ДЛЯ ИХ ПОС-
ЛЕДУЮЩЕГО ВЫПОЛНЕНИЯ. ДЛЯ ЭТОГО НЕОБХОДИМО:
1) ЯЧЕЙКА 510 ДОЛЖНА СОДЕРЖАТЬ ОБЩЕЕ КОЛИЧЕСТВО БАЙТОВ
В КОМАНДЕ, КОТОРАЯ БУДЕТ ПЕРЕДАНА KMON;
2) КОМАНДЫ ЗАПИСЫВАЮТСЯ, НАЧИНАЯ С ЯЧЕЙКИ 512; СТРОКА
ДОЛЖНА БЫТЬ ЗАПИСАНА В СИМВОЛАХ КОИ-7 И НЕ ДОЛЖНА СОДЕРЖАТЬ
ВК ИЛИ ПС ; НАПРИМЕР:
.=510
.WORD B-A
A: .ASCIZ /COPY A.MAC W.MAC/
.ASCIZ /DELETE A.MAC/
B= .
3) ПРОГРАММА ПОЛЬЗОВАТЕЛЯ ДОЛЖНА УСТАНОВИТЬ 5 ИЛИ 11
РАЗРЯД В ССЗ ПЕРЕД ВЫПОЛНЕНИЕМ .EXIT; СОДЕРЖИМОЕ R0 ДОЛЖНО
БЫТЬ НУЛЕВЫМ.
КОГДА ЗАПРОС .EXIT ИСПОЛЬЗУЕТСЯ ДЛЯ ПЕРЕДАЧИ КОМАНД
НЕОБХОДИМО УЧИТЫВАТЬ СЛЕДУЮЩЕЕ:
1) ЕСЛИ ЭТО СВОЙСТВО ИСПОЛЬЗУЕТСЯ ПРОГРАММОЙ, КОТОРАЯ
ВЫЗЫВАЕТСЯ С ПОМОЩЬЮ КОСВЕННОГО ФАЙЛА, ТО ВСЕ КОМАНДЫ СЛЕ-
ДУЮЩИЕ В КОСВЕННОМ ФАЙЛЕ ЗА КОМАНДОЙ, ИНИЦИИРУЮЩЕЙ ПУСК
ЭТОЙ ПРОГРАММЫ, ВЫПОЛНЯТЬСЯ НЕ БУДУТ;
2) КОСВЕННЫЙ ФАЙЛ МОЖЕТ БЫТЬ ВЫЗВАН, ИСПОЛЬЗУЯ ЭТО
СВОЙСТВО, ТОЛЬКО В ТОМ СЛУЧАЕ ЕСЛИ ПЕРЕДАВАЕМАЯ KMON СТРОКА
СОДЕРЖИТ ЕДИНСТВЕННУЮ СПЕЦИФИКАЦИЮ ФАЙЛА; ПОПЫТКА ПЕРЕДАЧИ
НЕСКОЛЬКИХ КОСВЕННЫХ ФАЙЛОВ ИЛИ КОМБИНАЦИЙ КОСВЕННЫХ ФАЙЛОВ
С ДРУГИМИ КОМАНДАМИ KMON ПРИВОДИТ К НЕПРАВИЛЬНЫМ РЕЗУЛЬТА-
ТАМ;
3) .EXIT В ПОДПРОГРАММЕ ЗАВЕРШЕНИЯ НЕДОПУСТИМ. ЗАМЕ-
ТИМ, ЧТО ЗАПРОС .EXIT ИЗМЕНЯЕТ ТЕКУЩЕЕ ПОЛОЖЕНИЕ УКАЗАТЕЛЯ
СТЕКА.
ФОРМАТ МАКРОКОМАНДЫ: .EXIT
ПРИМЕР.
.TITLE EXIT.MAC
;В ЭТОМ ПРИМЕРЕ, ПОСЛЕ ЗАВЕРШЕНИЯ ПРОГРАММЫ,
;КЛАВИАТУРНОМУ МОНИТОРУ ПЕРЕДЕТСЯ КОМАНДНАЯ
;СТРОКА НА ПЕЧАТЬ СПРАВОЧНИКА УСТРОЙСТВА DK:
.MCALL .EXIT
CHNIF$ = 4000
JSW = 44

START: MOV #510,R0
MOV #CMDSTR,R1
MOV #START,SP

1$: MOVB (R1)+,(R0)+
CMP R1,#CMDEND
BLO 1$
BIS #CHNIF$,@#JSW ;УСТАНОВИТЬ 11-ЫЙ РАЗРЯД
;В JSW
CLR R0 ;В R0 ДОЛЖЕН БЫТЬ 0
.EXIT

CMDSTR: .WORD CMDEND-CMDSTR ;ДЛИНА КОМАНДНОЙ СТРОКИ
.ASCIZ "DIRECT/FULL *.MAC" ;КОМАНДНАЯ СТРОКА
CMDEND:
.EVEN
.END START

MM
21.11.2014, 19:45
А вот сейчас и напишем прогу "Окончание работы " :
В DESS.SAV разместить в адресе 000040 число 001000, а в адресе 001000 - число 104350 (8). Так же надо разместить в адресе 000360 число 000360 ( 8 ). Остальные ячейки заполнить "000000".
Файл создать командой .CR/ST:1234 X.SAV/ALL:2
Где - 1234 - восьмеричный блок диска RT-11, с которого начинается новый файл.
X.SAV - имя файла.
2 - размер файла в блоках.
*
Можно прогу ( в 001000 адресе ) подраздуть :
010700 062700 000010 104351 104350 062520 067156 071551

hobot
21.11.2014, 19:56
Видишь как всё шустро и оптимально!!! ) А ты говоришь, родная среда же! )


А вот сейчас и напишем прогу "Окончание работы "

1000 - это стартовый адрес и уже как-бы "второй блок", помниться как то минималку в 1 блок впихивали )

MM
21.11.2014, 20:31
В 1 блок - запросто. В RT-11 формате .SAV достаточно свободны адреса 000400...000770 ( 8 ).
Тогда патчим :
в адресе 000040 ставим 000400
И весь текст переписываем в адрес 000400 ( 8 ) .
Получится ограничится 1 шт. блоком.
*
В настоящий оригинальный DESS.SAV V5.00 встроен примитивный ассемблер - без всяких там макросов.

hobot
21.11.2014, 21:46
надо дизассемблировать такой .sav, благо, это можно сделать с помощью IDA Pro.
Олег - не надо там ничего нет внутри кроме макро-команды "конец" )))

Вот тебе пожалуйста SAV файл в честном DESS (!). (не ММ который набил, а который из одной команды .END "ради шутки", но по твоему
запросу согласись?)



первые пол блока

BLCK=000000/000000. ADDR=000000/000000 TYPE=WORDS DESS V05.00e
000/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
020/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
040/ 000001 001000 000000 000000 000776 000000 000000 000000 *........~.......*
060/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
100/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
120/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
140/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
160/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
200/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
220/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
240/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
260/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
300/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
320/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
340/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
360/ 000200 000000 000000 000000 000000 000000 000000 000000 *................*

STACK : 000000 000000 000000 000000 000000 000000 000000 000000 000000

MACRO-11: HALT

вторые пол блока

BLCK=000000/000000. ADDR=000760/000760 TYPE=WORDS DESS V05.00e
400/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
420/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
440/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
460/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
500/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
520/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
540/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
560/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
600/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
620/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
640/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
660/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
700/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
720/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
740/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
760/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*

STACK : 000000 000000 000000 000000 000000 000000 000000 000000 000000

MACRO-11: HALT

MM
21.11.2014, 22:41
Олег - не надо там ничего нет внутри кроме макро-команды "конец" )))

Вот тебе пожалуйста SAV файл в честном DESS (!). (не ММ который набил, а который из одной команды .END "ради шутки", но по твоему
запросу согласись?)



первые пол блока

BLCK=000000/000000. ADDR=000000/000000 TYPE=WORDS DESS V05.00e
000/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
020/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
040/ 000001 001000 000000 000000 000776 000000 000000 000000 *........~.......*
060/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
100/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
120/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
140/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
160/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
200/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
220/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
240/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
260/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
300/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
320/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
340/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
360/ 000200 000000 000000 000000 000000 000000 000000 000000 *................*

STACK : 000000 000000 000000 000000 000000 000000 000000 000000 000000

MACRO-11: HALT

вторые пол блока

BLCK=000000/000000. ADDR=000760/000760 TYPE=WORDS DESS V05.00e
400/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
420/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
440/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
460/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
500/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
520/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
540/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
560/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
600/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
620/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
640/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
660/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
700/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
720/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
740/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*
760/ 000000 000000 000000 000000 000000 000000 000000 000000 *................*

STACK : 000000 000000 000000 000000 000000 000000 000000 000000 000000

MACRO-11: HALT


Ну не знаю, либо DESS окончательно загнулся, либо текст программы - фейк.
И почему это в 000040 адресе содержится кол ? По моему, процессор пошлет в лес такой текст. :v2_dizzy_christmas:

hobot
21.11.2014, 22:58
либо текст программы - фейк.

как бы вот протокол того что открыто DESSом выше :



.DIR NOP
21-Nov-2014
NOP .MAC 1 21-Nov-2014 NOP .OBJ 1 21-Nov-2014
NOP .SAV 1 21-Nov-2014
3 Files, 3 Blocks
52865 Free blocks

.TY NOP.MAC
.END


.MAC NOP

.LIN/RU NOP

.


Как то так.

наверное Олега ещё больше запутали )))
Повторюсь, не под SJ возможно будет трапиться, а возможно нет ))) Я не знаю )))

Вариант более правильный, наверное как-то так:


.mac NOP

.LIN/RU NOP

.^С

.TY NOP.MAC
START: NOP
CLR R0
EMT 350
.END START

.


вот этот второй уже 2 блока SAV понятное дело будет весить )))

MM
21.11.2014, 23:33
Видимо, кол в 40 адресе означает неисполняемый программный модуль - по типу дровишек.
Сейчас плохо помню, но программу из одного ЕМТ350 сделать нельзя - надо хоть какой-нибуть кусочек "мяса" приделать - например, NOP. Тогда и автоматическая функция завершения сработает.
*
А никак нельзя назначить начальный адрес меньше 1000 ? Например 400 ?

hobot
22.11.2014, 00:12
но программу из одного ЕМТ350 сделать нельзя
под SJ всё можно, только MACRO.SAV ругнётся что нет .END )))

Мы тут такой офф-топ устроили жуткий, пора завязывать, а тему
"самая короткая программа" ради интереса можно тут продолжить обсуждать в любое время, в теме по MACRO-11 + PASCAL (http://zx-pk.ru/showthread.php?t=20444) например )))

---------- Post added 22.11.2014 at 00:12 ---------- Previous post was 21.11.2014 at 23:45 ----------

Вот поиском нашёл запрос про SAV файлы - и это вряд ли единственный )))
http://zx-pk.ru/showpost.php?p=584286&postcount=89

Oleg N. Cher
22.11.2014, 05:08
Олег, да не программер я ! Я не знаю что такое "код возврата". )Та ладно, а я не знаю что такое KMON. Я думал, нужно в RT-11 выходить. :) Ну, командные файлы в RT-11 есть? По типу батников. В винде, например, можно делать вот так:

gcc program.c
if errorlevel 1 echo есть ошибка!Здесь gcc возвращает системе какой-нить код возврата, свидетельствующий о том успешно ли отработала программа. Если да, то код обычно 0, а если нет, то другой. А ОС потом может проанализировать и, если нужно, отреагировать.

Ладно, я смотрю, для меня это всё слишком сложно. KMON, USR, невыполненные запросы, фоновые программы, .MRKT и .CMKT

Просто всю эту муть можно упрятать внутри реализации, а наружу выдвинуть что-то такое:


DEFINITION RT11;

PROCEDURE Exit (code: INTEGER);

END RT11.Но писать реализацию в контексте сказанного я бы уже поостерёгся. :) Мда, Спектрум сильно проще, оказывается.


Олег - не надо там ничего нет внутри кроме макро-команды "конец" )))А видишь ли, такая макро-команда превращается в реальные машинные команды, циферки, может даже не одну.

Ладно, посмотрим что Vslav наваяет, а то руки совсем опускаются. :(

Vslav
22.11.2014, 17:03
В-общем, собранный GCC работает. Проект-заготовку я собрал, но чтобы им пользоваться нормально надо написать стартовый модуль, в котором;
- инициализировать стек (стеки, если несколько для разных режимов)
- инициализировать область инициализированных данных - скопировать инициализаторы в область инициализированных переменных
- обнулить область неинициализированных данных (.bss)
- вызвать конструкторы глобальных статических объектов, если юзаем C++, или ничего не делать, если обычный Си.
- передать управление функции которая нравится (_main обычно) :)

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

Проект совсем черновик, перебрал за полчаса другой свой gcc-шный под Cortex который был, так что просьба ногами меня не пинать.

Update: флажок -fomit-frame-pointer прекращает игрища с R5 и получается вполне нормальный код, правда при это невозможна полноценная отладка с GDB

Vslav
22.11.2014, 19:17
Замечательно, инициализация конструкторов глобальных сделана в библиотечной функции __main(), которая автоматом вызывается в начале пользовательской main().
Нет main() - тогда нет и __main() и этих C++ паровозов.

Но библиотечная реализация memcpy(), например, расстроила:


00000000 <_memcpy>:
0: 1166 mov r5, -(sp)
2: 1185 mov sp, r5
4: 10a6 mov r2, -(sp)
6: 10e6 mov r3, -(sp)
8: 1166 mov r5, -(sp)
a: 1d40 0004 mov 4(r5), r0
e: 1d41 0008 mov 10(r5), r1
12: 0306 beq 20 <len:p17+0x18>
14: 1d43 0006 mov 6(r5), r3
18: 1002 mov r0, r2
1a: 94d2 movb (r3)+, (r2)+
1c: 0ac1 dec r1
1e: 02fd bne 1a <len:p17+0x12>
20: 1d45 fffa mov -6(r5), r5
24: 1d43 fffc mov -4(r5), r3
28: 1d42 fffe mov -2(r5), r2
2c: 1146 mov r5, sp
2e: 1585 mov (sp)+, r5
30: 0087 rts pc

Ни размера оптимального, ни скорости.

hobot
22.11.2014, 21:25
а я не знаю что такое KMON.
Это великое и правильно заявление!!! Честность это главное !!! )

Keyboard Monitor (KMON)

Мне сложно отвечать что-то поскольку я и к примеру вы с Vslav на одном
языке говорите, я же не программист, в родной среде пишу для души "хобби", систему знаю на уровне "пользователя" до сих пор не видел(или пропусти?) чёткого ТЗ что вы там хотите сделать.

По поводу транслятора\компилятора
напишите простым языком что вы пытаетесь сотворить
> формат входящего кода ( Си или всё таки Оберон-Паскаль?)
> после первого прохода "трансляции" на выходе что сразу бинарник SAV под RT-11? Или всё таки сначало преобразованный в ассемблер? А если ассемблер,
то какие проблемы далее макро и линк из родной среды использовать? Где есть
и библиотеки системные и всё уже есть.

Понимаю что скорее всего вопросы ламерские, но вот ещё один


Мда, Спектрум сильно проще, оказывается.
И это есть великое заявление!!! Тут нужно ещё один момент разъянить хотя бы
мне --- КАК ВЫ СОБИРАЕТЕСЬ РЕАЛИЗОВАТЬ АВТОЗАПУСК СВОЕГО КОДА В ЭМУЛЯТОРЕ , ЕСЛИ
для запуска BIN файла на Спектруме - его (в реале) без всяких ОС просто загружают в память с магнитофона и стартуют, то же "примерно" происходит и на
БК0010(01), но вот на старших системах КАК???? Ведь там ОС дисковая, и у всех
мониторов разные версии??? В общем я могу только ссылки на доки какие то дать и
надеяться, что спецы по операционным системам от DEC \ Mentec обратят внимание на тему и что нибудь подскажут вам.

Благо на этом форуме знающие люди ещё остались )))



А видишь ли, такая макро-команда превращается в реальные машинные команды,
Олег я не программер, но и не "блондинка" )))
Просто я честно не понимаю, почему что бы узнать замес бублика ты не в кастрюльку с тестом (родная среда!!! программа DESS 5.0 и есть другие дизасы), а сам бублик ковыряешь снаружи, чем то виндовым??? Вот это уже ИМХО: не логично никак, игнорировать изучение и возможность пощупать платформу\среду для или под которую ты что то собрался творить ???

MM
23.11.2014, 00:06
Почитал-почитал я тут хотелки - ИМХО, великие ленивцы собралися, желают как в сказке о корыте и ж. рыбке - да строго одной кнопкой.
И эмуль ДВК им уже в одно место уперся...
- Абсолютно неконструктивный подход, в обсчем...
*
В RT-11 есть типа командный файл и исполняющая его программа - процессор командного файла. Если совсем кратко - за месяц по 6 часов ежедневно может и осилят толстенные доки , а может и нет... И без проверки каждой команды на эмуле ДВК - тухлое дело .
*
Теоритически, можно, конечно, сделать более-менее корректный транслятор всяких там языков высокого уровня с ИБМ-ЭВМ, вот только месяцы труда по 12 часов ежедневно будут не самым эффективным приложением силы...
Можно поискать чего-нибуть полуготовое от ОС DEC - там были неплохие замашки, вплоть до примитивных браузеров ( начало 1990-х ).

hobot
23.11.2014, 00:22
ж. рыбке
Обожаю жареную (ж. - ?) рыбку !!!

Кстати говоря либо в этой либо в похожей теме я кросс среду для БК под окошки авторский вариант выкладывал уже разочек точно !!! То есть что то готовое или "полуготовое" уже есть ? (для БК ПКМ).

http://zx-pk.ru/showpost.php?p=616188&postcount=1

---------- Post added at 00:22 ---------- Previous post was at 00:15 ----------


КАК ВЫ СОБИРАЕТЕСЬ РЕАЛИЗОВАТЬ АВТОЗАПУСК СВОЕГО КОДА В ЭМУЛЯТОРЕ
Да! И в каком именно эмуляторе позвольте узнать?
Одних БК эмуляторов реальных 3 штуки под вин, а то и больше )
1 - эмулятор УК-НЦ + гибридный эмулятор от нашего доктора!
Эмулятор ДВК Patrona

Vslav
23.11.2014, 01:06
Попытался еще пособирать GCC под тагеты pdp11-elf и pdp11-dec, последний вроде генерирует объектники в формате DEC-а, и возможно .SAV. Но не получается под MinGW это сделать, все какие-то проблемы лезут.

А под aout вроде нормально все компилируется, переписал красиво memset/memcpy/инициализацию, будет время - запущу сишный тест на ремуляторе+живая БК-0010.

Пример простой (я позже на асме переписал, и лругой алгоритм) реализации memcpy():


void*
hal_memcpy(
void* d,
const void* s,
unsigned int n)
{
if (n)
{
unsigned char* src;
unsigned char* dst;

src = (unsigned char*) s;
dst = (unsigned char*) d;
do
{
*dst++ = *src++;
}
while(--n);
}
return d;
}


Превратилось:


1 .text
2
3 .even
4 .globl _hal_memcpy
5 _hal_memcpy:
6
7 ; /* function prologue hal_memcpy*/
8 0000 A610 mov r2, -(sp)
9 0002 E610 mov r3, -(sp)
10 ;/* end of prologue */
11
12 0004 801D0600 mov 06(sp), r0
13 0008 811D0A00 mov 012(sp), r1
14 000c 0603 beq L_2
15 000e 831D0800 mov 010(sp), r3
16 0012 0210 mov r0, r2
17 L_3:
18 0014 D294 movb (r3)+, (r2)+
19 0016 C10A dec r1
20 0018 FD02 bne L_3
21 L_2:
22
23 ; /*function epilogue */
24 001a 8315 mov (sp)+, r3
25 001c 8215 mov (sp)+, r2
26 001e 8700 rts pc
27 ;/* end of epilogue*/

Функция простая, проигрывает по размеру ручной ассемблерной реализации (по тому же алгоритму) одно слово из 16, то есть всего на 1/16 длинее.

Update: поддержка pdp-11 в GCC прекращена с версии 4.3.x, все что старше - собирается на свой страх и риск.
Интересно будет взглянуть на C компилятор под RT-11, вероятно это страх и ужас в стиле K&R, язык то с тех пор развился, меня и значительно более молодой GCC 3.х не всегда устраивает.

hobot
23.11.2014, 01:35
Интересно будет взглянуть на C компилятор под RT-11
Да сколько угодно )
http://www.ibiblio.org/pub/academic/computer-science/history/pdp-11/language/decus-C/
---
А вот такой к примеру шёл в бытовой поставке УК-НЦ от СЭМЗ



http://pic.pdp-11.ru/images/c5e57dcc0626.jpg



ДИСКЕТА № 5.
Система программирования "Си"
имя dsk-образа: SEMZ_c.dsk
(!)протокол ошибок (error2.gif)
(важные файлы не пострадали)
Image : SEMZ_c.dsk

Format : DSK
Size : 800 Kb

Volume ID: RT11A
Owner :

File Blocks Date Bytes
---------- ------ ----------- ----------
CCUNIX.DSK 800P 11-Apr-1991 409'600
CCDOC .DSK 500P 23-Feb-1989 256'000
LD .SYS 8 25-Dec-1991 4'096
SETBEG.SAV 2 28-Jan-1992 1'024
EDIKV2.SAV 22 28-Jan-1992 11'264
< UNUSED > 254 130'048
---------- ------ ----------- ----------
5 Files, 1332 Blocks
254 Free blocks


http://zx-pk.ru/showpost.php?p=425249&postcount=66 - архив с дискетами СЭМЗ.
http://zx-pk.ru/showpost.php?p=425457&postcount=71 - анализ ошибок чтения от Alex_K.

Vslav
23.11.2014, 01:50
А вот такой к примеру шёл в бытовой поставке УК-НЦ от СЭМЗ

Заодно там и исходники библиотек. memcpy() тогда не было, нашелся copy() :), нормальный, копирует с учетом выравнивания и макросом .sob (я напрочь про него забыл).

Oleg N. Cher
27.11.2014, 15:45
Уважаемый hobot!

На теоретическую часть ответил в теме Теоретическое обоснование подсистемы XDev/Pdp11Dev (http://zx.oberon2.ru/forum/viewtopic.php?f=51&t=220). Практические же вопросы я наоборот надеялся выяснить здесь, затем и пришёл к вам за ответами. :)


напишите простым языком что вы пытаетесь сотворитьЭто я пытаюсь. :) Vslav прекрасный системщик, с GCC на "ты". Я конечно тоже писал crt0 для SDCC, но там он совсем простенький, просто переход на главную функцию.

ТЗ у меня такое. Примеряюсь к возможности создать подсистему XDev для разработки под УК-НЦ и БК. В перспективе надеюсь собрать для УК-НЦ игру Dark Woods (http://zx.oberon2.ru/forum/viewtopic.php?f=5&p=1332#p1332). Позволим Vslav'у быть в стороне от этих планов Барбаросса. :) Поэтому и не будем говорить "вы хотите сделать", наоборот, пока только я хочу. Но без вашей помощи и интереса, боюсь, ничего у меня не выйдет. Vslav, у Вас имеется хотя бы минимальный интерес к данному направлению?


> формат входящего кода ( Си или всё таки Оберон-Паскаль?)Это не слишком принципиально, но в первую очередь конечно интересует возможность разрабатывать на Обероне. Через трансляцию в Си, разумеется. Поддержка C++ лично мне не нужна.


> после первого прохода "трансляции" на выходе что сразу бинарник SAV под RT-11?Вот это было бы идеально. Потом из батника утилиткой запихиваем .SAV в образ диска, и вуаля.


Или всё таки сначало преобразованный в ассемблер?Я не уверен, что GCC даст на выходе ассемблерный листинг. А даже если и да, то крайне сомнительно, что его удастся без модификации и бубна собрать с помощью MACRO-11.

На асме разрабатывать принципиально не хочу, это слишком сложно и неинтересно. Долю асмовой части кода попробуем уменьшить до минимума. Низкоуровневые процедуры поупрятываем в библиотеки. GCC же вместо УК-НЦ-шных средств разработки обещает более качественный, компактный и быстрый код, наиболее приближённый к закодированному вручную на асме. Хотя до этого конечно далеко, но надо же с чего-то начать. Ещё раз подчёркиваю, что "нативные" средства разработки - тупик как в плане увеличения качества машинного кода, так и в плане дальнейших доработок. Это путь, лишённый потенциала. А кросс-разработка - вполне нормальная практика. Вот представь, что у тебя микроконтроллер с памятью 4 кб, как ты туда Си впихнёшь?


КАК ВЫ СОБИРАЕТЕСЬ РЕАЛИЗОВАТЬ АВТОЗАПУСК СВОЕГО КОДА В ЭМУЛЯТОРЕ , ЕСЛИ для запуска BIN файла на Спектруме - его (в реале) без всяких ОС просто загружают в память с магнитофона и стартуют, то же "примерно" происходит и на
БК0010(01), но вот на старших системах КАК???? Ведь там ОС дисковая, и у всех мониторов разные версии??? В общем я могу только ссылки на доки какие то дать и надеяться, что спецы по операционным системам от DEC \ Mentec обратят внимание на тему и что нибудь подскажут вам.Спектрумный BIN нужно хотя бы в образ ленты сконвертировать (формат TAP или TZX). Или в образ диска (TRD или SCL). Я примерно так же представлял себе создание целевого файла и для RT-11, но вот эти все проблемы, о которых ты упомянул, меня конечно смущают.


не логично никак, игнорировать изучение и возможность пощупать платформу\среду для или под которую ты что то собрался творить ???Не спорю, нужно щупать. :)

Vslav, я скачал архив 011.rar, но не знаю что с ним делать. :v2_conf2: Нужны подробные инструкции как хотя бы бинарничек сделать. Кстати, ещё возникает опрос про стартовый адрес. С какого адреса должен быть собран исполняемый файл для RT11? Как вообще можно указать стартовый адрес для сборки целевого бинаря в GCC?


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


за месяц по 6 часов ежедневно может и осилят толстенные доки , а может и нет... И без проверки каждой команды на эмуле ДВК - тухлое дело.тогда конечно упс.


Да! И в каком именно эмуляторе позвольте узнать?
Одних БК эмуляторов реальных 3 штуки под вин, а то и больше )
1 - эмулятор УК-НЦ + гибридный эмулятор от нашего доктора!
Эмулятор ДВК PatronaВ идеале конечно хотелось бы в любом. Хотя для начала и UKNCBTL устроит.

Я предлагаю получить среду разработки для УК-НЦ/БК/ДВК на базе GCC. Это мне кажется самым лучшим что можно вообще придумать в плане затрат времени и сил умноженных на результат - качество кода. А вот, например, в теме LLVM компилятор для БК0011М/БК12 (http://zx-pk.ru/showpost.php?p=695999&postcount=1) предлагают то же самое на базе LLVM, но в варианте с GCC будет поменьше гимору, поверьте. По крайней мере придётся заниматься форматами и выковыриванием кусков кода из готовых библиотек. Всё это - гораздо проще, чем делать высокооптимальную генерацию машинного кода для LLVM, качественно отличающуюся от достижимой "нативными" средствами разработки для УК-НЦ, ДВК или БК.

Vslav
27.11.2014, 18:26
Но без вашей помощи и интереса, боюсь, ничего у меня не выйдет. Vslav, у Вас имеется хотя бы минимальный интерес к данному направлению?

Интерес, конечно есть, любой проект на PDP/БК приветствуется, тем более среда разработки. Но у меня сейчас свой интересный большой проект на PDP, поэтому в данное время реально поучаствовать смогу скромно. Доделаю crt0 и проверю его - хотя бы сеточку на экране живой БК нарисую.



Я не уверен, что GCC даст на выходе ассемблерный листинг. А даже если и да, то крайне сомнительно, что его удастся без модификации и бубна собрать с помощью MACRO-11.

Написать конвертор бинарного файла, полученного в GCC и построенного для базового адреса 1000(восьмеричное) достаточно просто.



Vslav, я скачал архив 011.rar, но не знаю что с ним делать. :v2_conf2: Нужны подробные инструкции как хотя бы бинарничек сделать.

Там обычный makefile, в начале там прописать пути к компилятору и проекту на Вашей машине и все - можно пускать make. Фильтр на Перле надо выкинуть - это транслятор сообщений об ошибках из формата GCC в Visual C - чтобы навигация по ошибкам работала. Или чуть еще подождите - проверю реальный проект и упрощу тогда makefile или просто .bat напишу.



Кстати, ещё возникает опрос про стартовый адрес. С какого адреса должен быть собран исполняемый файл для RT11?

В простом .SAV - размещение самого файла с 0, кода - с 1000 (заголовок SAV - 512 ,fqn), точка входа - может быть любая, задается в структуре заголовка.



Как вообще можно указать стартовый адрес для сборки целевого бинаря в GCC?

Там в моем makefile есть ключик для линкера - --entry=hal_entry, символ hal_entry будет точкой входа.

К сожалению, насколько я разобрался тагета pdp11-elf в GCC нет, поэтому приходится использовать pdp11-aout. Есть еще непонятные pdp11-bsd и pdp11-dec, но они у меня под MinGW не собираются нормально.

Oleg N. Cher
27.11.2014, 18:53
Интерес, конечно есть, любой проект на PDP/БК приветствуется, тем более среда разработки. Но у меня сейчас свой интересный большой проект на PDP, поэтому в данное время реально поучаствовать смогу скромно.Ваше участие было бы крайне ценно, потому что среда разработки - это такой проект, которому конца не видно (подсистема ZXDev делается уже больше 3-х лет, и конечно за этот срок очень серьёзно продвинулась). Но потрясающе интересный. :) А если кодовая база в виде набора различных низкоуровневых процедур достаточно большая (и собранная в одном месте, централизованная), то облегчается построение программ, даже отличающихся по назначению от собранных в базе процедур. И тестовые модули проще писать.

Или другими словами - как правильно заметил Patron (http://bk0010.org/forum/?id=7856):

Patron - 26.02.2012 19:17
Формализовать технические подробности в виде иерархии стандартизованных API - чертовски трудно. Но увлекательно :)

Остаётся много открытых вопросов по низкому уровню и архитектуре, но в принципе нам же спешить некуда, не так ли? :)


Доделаю crt0 и проверю его - хотя бы сеточку на экране живой БК нарисую.Вот это будет интересно!


Написать конвертор бинарного файла, полученного в GCC и построенного для базового адреса 1000(восьмеричное) достаточно просто.Осталось придумать как потом из него получить .SAV. Я гуглю готовые решения, но пока ничего не находится.

А вот описание формата .SAV (на всякий случай пусть будет ссылка):

http://www.pdp11.org.ru/files/docs/rt-11/r23240.txt

Вопрос к спецам, поскольку я принял посыл, что RT-11 подходит для всех трёх архитектур (УК-НЦ, БК, ДВК), и теперь на неё ориентируюсь. Нету ли возможности заюзать для формирования из объектников целевого файла родной линкер RT-11 link.sav? И насколько это целесообразно?

Посмотрел кросс-ассемблер (http://zx-pk.ru/showpost.php?p=616188&postcount=1), он вроде .sav не формирует.

Eltaron
27.11.2014, 20:37
Я не уверен, что GCC даст на выходе ассемблерный листинг.
gcc -S file.c

litwr
16.12.2014, 14:36
Кого-то интересует компоновщик из МАКРО11 в bin-формат? Сделал вчерновую, но работает, перемещаемый код пока не поддерживает - не использую такой принципиально.
Интересно, как получилось с оптимизацией на GCC? На x86 gcc -O5 даёт коды часто на 50% и более быстрее ассемблерных.

Titus
16.12.2014, 14:39
Интересно, как получилось с оптимизацией на GCC? На x86 gcc -O5 даёт коды часто на 50% и более быстрее ассемблерных.

Вот юмор)

Vslav
16.12.2014, 17:08
Кого-то интересует компоновщик из МАКРО11 в bin-формат? Сделал вчерновую, но работает, перемещаемый код пока не поддерживает - не использую такой принципиально.
Не помешает, мы тут, правда, уже насобачились натуральными MACRO/LINK в разных эмуляторах проекты собирать, с автоматическим забиранием исходников и выдаванием результатов в хост-систему, но тем не менее будет интересно.

litwr
16.12.2014, 22:58
будет интересно
Благодарю за стимул. Планирую подредактировать и на днях выложить. Для АНДОСа, МКДОСа и подобных получилось довольно полезно.

Вот юмор)
Не юмор - факты. Если до сих пор таких не видели, могу дать ссылку.

Titus
16.12.2014, 23:03
Не юмор - факты. Если до сих пор таких не видели, могу дать ссылку.

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

litwr
17.12.2014, 00:05
Если вы хотите мне дать ссылку на программистов, которые на ассемблере пишут хуже, чем компилирует компилятор, то это это злостные извращенцы-двоечники)
Ерунду какую-то говорите. Почему по вашему кодов на ассемблере почти не пишут?


/*RUN IT BY (GNU compiler)
gcc -O5 FN.c; time ./a.out
OR (it is without optimisation)
gcc FN.c; time ./a.out
OR (Intel compiler)
icc -fast FN.c; time ./a.out
OR (LLVM compiler)
clang -O3 FN.c; time ./a.out
OR (Amsterdam Compiler Kit)
ack -mlinux386 -O4 -o fib fib.c; time ./fib
*/
#include <stdio.h>
#define bestint long //64 bits
bestint fib (bestint n) {
return n < 3 ? 1 : fib(n - 1) + fib(n - 2);
}
main() {
int k = 41;
printf("%d %ld\n", k, fib(k));
}

Вот вам программка на си. Её ассемблерный аналог на 45% медленнее. Пробовал и с x86 и с x86-64, x86-64 процентов на 15 быстрее, но именно она и отстаёт почти на все 50 от си. Кстати, даже ява почти догоняет ассемблер, всего процентов на 30 медленнее. Аналогичная картинка и по функции Аккермана. Конечно, можно взять ассемблерный код, сгенерированный си-компилятором, но такое человек не напишет.

Titus
17.12.2014, 00:08
Ерунду какую-то говорите. Почему по вашему кодов на ассемблере почти не пишут?

Дорого, долго, и в большинстве случаев не оправдано, за исключением ситуаций, когда необходимо написать ОЧЕНЬ БЫСТРЫЙ фрагмент кода.

Patron
17.12.2014, 11:54
Если вы хотите мне дать ссылку на программистов, которые на ассемблере пишут хуже, чем компилирует компилятор, то это это злостные извращенцы-двоечникиДавно прошли времена, когда любой шахматист мог обыграть в шахматы компьютерную программу. Современные оптимизирующие компиляторы создают намного более эффективный ассемблерный код, чем программисты.

Titus
17.12.2014, 12:58
Давно прошли времена, когда любой шахматист мог обыграть в шахматы компьютерную программу. Современные оптимизирующие компиляторы создают намного более эффективный ассемблерный код, чем программисты.

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

Я говорю об оптимизации вычислительноемких участков программы, например, вычисление БПФ, свертка, фильтры и прочая ЦОС, и прочее, и прочее - тут при правильном подходе человеческая оптимизация алгоритма под ресурсы процессора даст всегда наилучший результат, с приростом быстродействия от 2 до более раз. Именно потому, что человек, видя возможности ресурсов процессора может крутить и вертеть этим алгоритмом и так и эдак, задействуя самое оптимальное, что может дать вычислитель данного процессора, тогда как компилятор может предложить лишь математическо-логическую оптимизацию и все. Говоря иными словами, человек подгоняет нюансы алгоритма под оптимальные стороны вычислителя, тогда как компилятор видоизменять алгоритм не может.

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

Кстати, где-то на форуме была именно эта тема 'си vs ассемблер', там все было многократно разжевано и оспорено)

Patron
17.12.2014, 16:57
человек подгоняет нюансы алгоритма под оптимальные стороны вычислителя, тогда как компилятор видоизменять алгоритм не можетИменно так. Если один и тот же алгоритм кодируют на ассемблер человек и компилятор - нормальный компилятор не может проиграть, но если некий алгоритм невозможно записать на компилируемом языке - компилятор бессилен.

litwr
17.12.2014, 20:31
Да, основная часть пишется на си, но критичные участки (если они есть) на асме.
Кстати, где-то на форуме была именно эта тема 'си vs ассемблер', там все было многократно разжевано и оспорено)
"Критические участки" выглядят в программах на си часто типа asm("LIDT [IDT]"); :-) C ассемблером как раз и работают гуру по оптимизации. Если писать просто одинаковые алгоритмы чистым кодом, то ассемблер его превратит в эквивалентный машинный код, а оптимизирующий компилятор превратит его в что-то неудобочитаемое, не похожее на оригинал, но очень быстрое.


fib: cmp rax,2 ;in: rax; out: rcx
ja .l1
mov rcx,1
ret

.l1: dec rax
push rax
call fib
pop rax
push rcx
dec rax
call fib
pop rax
add rcx,rax
ret

Вот, кстати, эквивалент кода на ассемблере для приведённой ранее функции Фибоначчи. Если вы так хорошо знаете ассемблер, то попробуйте написать быстрее, не изуродовав код и сознание пишущего его программиста.
И спорить тут не о чем: ЛЮБАЯ проблема кодируются хорошим оптимизирующим транслятором в более быстрый код. Если потратить на кодирование в разы больше времени и получить совершенно нечитаемый код, то можно чуть-чуть и обогнать транслятор, но ценой возможно подорванного здоровья. ;-)
Вот и спрашивал, как хороша оптимизация для бк-ного кода? Сам хотел gcc для этого настроить, но так и не получилось. :frown: Интересно, на системах, сравнимых с БК gcc используют? GCC вроде не поддерживает 6502 и z80, но поддерживает лучший 8-битник 6809 (использовался на Tandy TRS-80 Color, Dragon-32/64, ...).

litwr
18.12.2014, 23:16
http://litwr2.atspace.eu/bk11.html
Для моих нужд хватает, если кому нужно больше, то ничего не обещал.
Тут на форуме большой выбор смайликов и среди них даже лого известных ретрокомпьютеров (:speccy::Apple::Amstrad::MSX::Commodore::Atari: ...). А существует ли что-то похожее для БК? Обделили смайликом:smile:

Vslav
19.12.2014, 00:06
fib: cmp rax,2 ;in: rax; out: rcx
ja .l1
mov rcx,1
ret

.l1: dec rax
push rax
call fib
pop rax
push rcx
dec rax
call fib
pop rax
add rcx,rax
ret


Очень плохой пример. Я как раз посмотрел ассемблер, решил что надо оптимизировать обращения к памяти, а потом вообще пришел к выводу что алгоритм мусорный и пример "высосан из пальца". Для прикола я его на ARM-е запустил на 120МГц, оно тупо зависло, неудивительно - вызов функции осуществляется примерно 2^40 раз, жесть.

Вот на коленке за пару минут набросанная функция:


int fib (int n)
{
register int a, b, c;
if (n < 3) return 1;

a = b = 1;
n -= 2;
do
{
c = a + b;
a = b;
b = c;
}
while(--n);
return с;
}

Попробуйте что там компилятор нагенерит.

Update: я немного погорячился, там не 2^40 вызовов, но число вызовов представляет собой смещенный ряд Фиббоначи, и все равно значительное. Ваш пример у меня секунд 10 считал на довольно быстром i7.

litwr
19.12.2014, 10:44
Очень плохой пример.
Уважаемый, пожалуйста, не спешите так, не разобравшись. Тема была о быстродействии трансляторов, потому и была выбрана функция, которая считается медленно. Если вас интересует как побыстрее рассчитать число Фиббоначи, то есть ещё алгоритм Дейкстры, время счёта которого пропорционально корню из n, а есть ещё и прямая формула с корнями из 5...
Вопрос был как коды для PDP-11 сгенерируются GCC с оптимизацией именно для такой функции и, конечно, надо будет заменить аргумент на меньший, на 30, например.

Ваш пример у меня секунд 10 считал на довольно быстром i7.. Странно, все примеры подобраны так, чтобы считались не более нескольких секунд на посредственном AMD 3.2 ГГц - конкретно си и ассемблер примерно за 1 сек

Vslav
19.12.2014, 11:40
Уважаемый, пожалуйста, не спешите так, не разобравшись. Тема была о быстродействии трансляторов
Я ведь про компилятор ничего не сказал? :) Основная идея моего поста была, что компилятор компилятором, но про алгоритм не следует забывать.
Часто грамотным алгоритмом можно выиграть порядки по скорости, никакая оптимизация не сравнится. Холивар по компилятору начинать не хочу, на основной работе уже наелся досыта, поэтому помалкиваю.



Вопрос был как коды для PDP-11 сгенерируются GCC с оптимизацией именно для такой функции

Так попробуйте, ссылка на собранный GCC/PDP-11 тут в теме есть. Хочу только отметить, что x86 вылизывают и маркетируют - отсюда все эти разговоры про "чудо" оптимизацию, а ветку GCC для PDP уже с начала 2000-х не поддерживают официально.



Странно, все примеры подобраны так, чтобы считались не более нескольких секунд на посредственном AMD 3.2 ГГц - конкретно си и ассемблер примерно за 1 сек

В моей программке не одно число Фибоначчи выводилось, а все от 1 до 41, да отладка была не отключена. У меня просто мелькнула мысль что рекурсия хоть и неглубокая, но вызовов будет много и алгоритм медленный получается. Вот и попробовал на той плате ARM что у меня сейчас в работе на столе. Сначало оно тупо умерло по watchdog - решил эту проблему, потом увидел что все равно долго, уже под Win запустил пример и тоже насладился быстродействием алгоритма, потом уже вставил 5 копеек на форуме :).

litwr
19.12.2014, 20:40
про алгоритм не следует забывать
Кто же об этом спорит? Но были незаслужено сказаны нехорошие слова. Привел две программы, реализующие ОДИНАКОВЫЙ алгоритм на си и ассемблере. Для проверки эффекта оптимизации си-компилятором... Кстати, алгоритм совершенно естественный, в точности согласно математическому определению.


"чудо" оптимизацию
Можете как-то фактами подтвердить свой сарказм? Кстати, перенос gcc под БК считаю крупнейшим достижением в мире БК (а может и PDP-11) за последние 15 или может более лет. К сожалению, нет возможности сейчас заняться пуско-наладкой gcc. Поэтому и спросил, может проводили такие эксперименты. А если тема вам неинтересна, то вопрос был не вам. ;-)


насладился быстродействием
Могу вас понять, но с нехорошими словами можно было не спешить.

Ал-р
19.12.2014, 23:21
Кто же об этом спорит? Но были незаслужено сказаны нехорошие слова. Привел две программы, реализующие ОДИНАКОВЫЙ алгоритм на си и ассемблере. Для проверки эффекта оптимизации си-компилятором... Кстати, алгоритм совершенно естественный, в точности согласно математическому определению.
...

:):):)
Да хоть на Фортране алгоритм из нескольких строчек (согласно ОПТИМАЛЬНОМУ математическому определению) будет таким же бистрим как на супер СИ-Си-си ...
(Ваш прогрэм на Си переводится в Ассемблер Микро11 без всяких "оптимизирующих" компиляторов - есть оператор цикла SOB ... - и пошла Ваша С-оптимизация в ж...)

litwr
21.12.2014, 22:48
Чистый код типа


mov #1000,r0
l:add r1,(r3)+
adc r2
sob r0,l

оптимизатором легко разгоняется процентов на 30, ценой 3-4 кратного разбухания и общей некрасивости. :tongue: И холивар это про веру...

Ал-р
23.12.2014, 01:00
Чистый код типа


mov #1000,r0
l:add r1,(r3)+
adc r2
sob r0,l

оптимизатором легко разгоняется процентов на 30, ценой 3-4 кратного разбухания и общей некрасивости. :tongue: И холивар это про веру...
... ну-ну, после 3-4кратного возбухания покажите более быстрый вариант ... (и только не забывайте, что перед выполнением каждую лишнию команду нужно сначала прочитать)

litwr
24.12.2014, 16:38
Санта подарки разносит. :v2_dizzy_christmas2


mov #250,r0
l:add r1,(r3)+
adc r2
add r1,(r3)+
adc r2
add r1,(r3)+
adc r2
add r1,(r3)+
adc r2
sob r0,l

Процентов на 25 побыстрее дожно быть

litwr
04.05.2015, 12:12
http://litwr2.atspace.eu/bk11.html

Поддерживаются (некоторые слова из бейсика БК0011):
^ \ * + - ( ) = < > <= >= =< => <> ><
? ABS AND ASC AT BIN$ BLOAD BSAVE CHR$ CLEAR CLS CSRLIN DATA DEC DEF DIM ELSE END EOF EQV FILES FIND FN FOR GET# GOSUB GOTO HEX$ IF IMP INKEY$ INP INPUT INSTR LEN LET LOCATE MID$ MOD MONIT NEXT NOT ON OR OUT PEEK POKE POS PRINT READ REM RESTORE RETURN SGN SPC STEP STR$ STRING$ SYSTEM TAB THEN TO UINT$ UPPER$ USR VAL VARPTR XOR


Не поддерживаются:
BEEP CINT COLOR KEY OCT$
CIRCLE DRAW PAINT POINT PRESET PSET
/ ATN CDBL COS EXP INT FIX LOG PI RND SIN SQR TAN CSNG
. AUTO CALL CLOAD CONT CSAVE DELETE LIST LLIST LOAD LPOS MERGE NEW RENUM RUN SAVE STOP TROFF TRON
SCREEN


Новые возможности:

+ Имена переменных могут быть любой длины.

+ Можно использовать ':' для разделения операторов. Длина строки не ограничена.

+ Новый оператор GET# позволяет получать данные из файла символ за символом, т.е. GET#a$ вводит один знак или пусто в a$ из открытого для чтения файла. Это файловый эквивалент INKEY$.

+ Новая функция DEC переводит 16-ю строку в целое, т.e., dec("a0A")=2570.

+ INSTR можно использовать с двумя аргументами, т.е., instr("abcdef", "cd") = instr(1, "abcdef", "cd").

+ Новая функция UPPER$ переводит маленькую латинскую букву в большую.

+ Новая функция UINT$ перевоит в беззнаковое целое в виде строки, т.е. UINT$(-1) gives "65535".


Неподдерживаемые или поддерживаемые ограничено возможности бейсика БК:

- Поддерживаются только целые (в диапазоне -32768..32767) и строковые (длиной до 255 знаков) типы.

- DIM нужно использовать с любым массивом (даже меньшим 10) и его числовой аргумент должен быть целой константой. Поддерживаются только массивы с одной размерностью. После DIM можно описывать только одну переменную-массив. Виртуальные массивы не поддерживаются (это верно и для VARPTR).

- Только некоторые ошибки синтаксиса обнаруживаются.


Особые замечания:

* Размер генерируемых исполнимых файлов до 32256 байт. 16384 дополнительных байт используются для строк и машинного кода. Программа стартует с адреса 512. Код использует вызовы АнДОС, которые эмулируют ПЗУ БК0010. Код не использует вызовы ПЗУ БК0011.

* Память по адресам 532-565 свободна для любого использования. Память выше адреса 16384 может переключаться, поэтому она имеет ограничения для прямого использования для машинных кодов и данных.

* Прерывания клавиатуры используются для автоповтора нажатия клавиши. Это меняет стандартную схему работы с кириллицей -- используйте AP2.

* Необходимо ставить пробелы между склеивающимися лексемами, например, 'if a<3 goto 10' требует пробелов между 'if' и 'a', а также между 'goto' и '10'.

* Страницы памяти 2, 3 и 6 используются для программ и данных. Страница 0 -- это буфер ввода-вывода. Страница 4 содержит AnDOS. Другие страницы свободны для любого использования.

* CLEAR требует в точности двух аргументов, но 1-й игнорируется, т.к. вся свободная память используется для строк. CLEAR вызывает сначала уборщик мусора. Второй аргумент устанавливает верхнюю границу памяти для бейсика. Начальное значение этой границы -- 49152.

* INPUT работает нестандартно, если использует несколько переменных для ввода. Например, 'INPUT A,B' требует ввести значения для А и затем нажатия клавиши Ввод, затем ввeсти значения для B и нажатия на Ввод.

* CSRLIN и POS игнорируют аргументы.

* FRE показывает размер всей свободной памяти. Уборщик мусора вызывается только если у аргумента строковый тип. Поэтому в случае целого или отсутствующего аргумента показанный результат может быть меньше действительного.

* FIND должен использовать какой-нибудь файловый шаблон MS-DOS. Так FIND "*.TXT" покажет все файлы с расширением TXT, а FIND "?." покажет файлы с именами, состоящими из одного знака и без расширения. Шаблоны чувствительны к регистру знаков.

* BLOAD всегдa требует 3-х аргументов, например, BLOAD "MC",,32768 или BLOAD "MC.BIN",R,47*1024.

* BLOAD и BSAVE не работают с файлом более 16 KБ.

* USRn(X) вызов кладет X в R5 и затем использует CALL. Поэтому вернуться из такой ассемблерной функции можно по инструкции RETURN. Результат следует помещать в R5.

* SYSTEM и MONIT работают как END.

* FILES идентична FIND.

* \-операция может правильно делить -32768, но игнорирует деление на 0 и переполнение.

* %-суффикс для целых переменных необязателен.

* Служебные слова нужно писать полностью, без сокращений.


Общая информация:

@ Используйте PEEK(208) and -256 для проверки состояния файла после попытки открытия. Значение должно быть 0, если операция прошла успешно.

@ Будьте осторожны с PEEK и POKE -- они игнорируют младший (четность) бит.

@ Компилятор распространяется по лицензии GNU General Public License, версии 2 или, по вашему усмотрению, более поздней версии. Эта лицензия доступна через сеть по адресу <http://www.gnu.org/copyleft/gpl.html>. GPL устроена так, что позволяет вам менять содержимое пакета и распространять его по другой схеме до тех пор, пока вы не лишаете такой свободы других.

@ Это свободный, быстрый и сделанный как попало компилятор, созданный преимущественно для компиляции программы Notepad-BK. Это не Visual Studio...

nzeemin
08.05.2015, 01:22
Наверное в эту тему.

За пару часов наваял пакет для редактора Atom -- простейшую подсветку синтаксиса для языка MACRO-11. Не то чтобы сильно нужно было, просто интересно было пройти этот квест -- с нуля до публикации пакета.

https://atom.io/packages/language-macro11

Реализация там собственно -- одна регулярка. Но вдруг кому пригодится.

Ynicky
14.05.2015, 21:09
Изучаю кросс-ассемблер Macro-11 для Windows.
Не могу разобраться с командой "JMP 200".
В описании на процессор ВМ3 написано следующее:

000167 JMP 200 R7 001024 +4 + R7 000200
177150

ПАМЯТЬ ПАМЯТЬ
0! ! 0! !
! ! ! !
000200! ХХХХХХ ! 000200! ХХХХХХ !
! ! ! !
001024! 000167 ! 001024! 000167 !
001026! 177150 ! 001024! 177150 !
001030! ХХХХХХ ! 001030! ХХХХХХ !
! ! ! !
177776! ! 177776! !

При ассемблировании в Macro-11 получаю следующее:

1 .TITLE test_jmp
2 .ASECT
3 001024 .=001024
4 001024 000167 000200' JMP 200;
4

Почему при относительном способе адресации Macro-11 во второе
слово команды подставляет 000200' со штрихом?
По описанию на ВМ3 сложение адреса 001030 (следующего за командой
JMP) со вторым словом 177150 дает 200, что на мой взгляд правильно.
Может штрих что-то означает? Тогда что?

Николай.

litwr
14.05.2015, 22:50
Именно 200 и означает. Штрих указывает, что величину надо расчитать при компoновке. Например, если jmp 200 при загрузке окажется на адресе 400, то операнд у jmp будет один, а если на адресе 500, то на другой, с разницей в 100.

Ynicky
15.05.2015, 18:11
Спасибо, понял.
К Macro-11 прилагается dumpobj, который выдает .bin файл.
Но в .bin файле тоже не пересчитывается адрес.
Получается, что без компоновщика нельзя писать программы с
относительной адресацией?
А для Windows есть кросс-компоновщик?

Николай.

litwr
15.05.2015, 19:15
bin после dumpobj - это неисполнимый файл, даже если не использовать относительной адресации. Это файл для дальнейшей компoновки. Выше в теме есть ссылка на кросс-компоновщик, который делает исполнимые файлы. Сам не использую относительную адресацию, а сделать её поддержку как и перемещаемость с нечетными адресами несложно. Утилитка маленькая, если кому надо, то дело сделается - небольшое.

Ynicky
15.05.2015, 21:09
Скомпилировал obj2bin в Visual Studio 2015.
Пока не понял как работает.
Подставляю .obj файл - пишет стандартную фразу:
"Run this program without arguments, e.g., obj2bin <IN >OUT\n".
Запускаю отдельно - могу писать текст, но и только.
С исходником тоже не могу разобраться (по образованию не программист).

Николай.

litwr
15.05.2015, 21:24
Вы примерчик - текстовый файл bkcompile.sh посмотрите. Там все операции: 1) macro11; 2) dumpobj; 3) bkobj2bin.

Ynicky
15.05.2015, 21:42
Написал по аналогии .bat файл:
только сразу подставляю .obj файл.

rem bkcompile FILENAME.asm
rem F=${1%%asm}
rem macro11 -yus -ysl 16 -o $a.obj -l $a.lst $1
dumpobj a.obj a.dump
bkobj2bin <a.dump >a.bin
pause

При запуске висит. После принудительного закрытия a.bin нулевой.

Николай.

P.S.
А вот исходный файл:

.TITLE testpdp11
.ASECT
.=0000
MOV #111111, R1;x9249
MOVB #222, R2;x92
MOV #133333, R3;
MOV #144444, R4;
BR 000102;
halt;
.=0102
BR 000000;
MOV #111111, R1;
MOV #122222, R2;
MOV #133333, R3;
MOV #144444, R4;
NOP;
halt;

litwr
15.05.2015, 22:19
Перед a.dump поставьте знак "больше". И попробуйте запускать команды по одной, сценарий - когда всё заработает. У меня ваш примерчик успешно собрался, но загружать в эмулятор его не стал. :wink:

Ynicky
15.05.2015, 22:36
Оставил одну строчку, убрал pause.
Тоже самое.
При bkobj2bin <a.dump >a.bin пишет:

bkobj2bin 0<a.dump 1>a.bin

При bkobj2bin >a.dump >a.bin пишет:

bkobj2bin 1>a.bin

В обоих случаях висит.
Файл a.dump нормальный.

---------- Post added at 22:36 ---------- Previous post was at 22:28 ----------

У меня Windows8.1 64р.

Visual Studio пишет следующее при компиляции:

All packages are already installed and there is nothing to restore.
NuGet package restore finished.
1>------ Rebuild All started: Project: bkobj2bin, Configuration: Debug Win32 ------
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.Cp pBuild.targets(392,5): warning MSB8028: The intermediate directory (Debug\) contains files shared from another project (bklinker.vcxproj). This can lead to incorrect clean and rebuild behavior.
1> bkobj2bin.c
1>c:\vc6prj\bklinker\bkobj2bin.c(18): warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\windows kits\10\include\10.0.10056.0\ucrt\stdio.h(2254): note: see declaration of 'sscanf'
1>c:\vc6prj\bklinker\bkobj2bin.c(31): warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\windows kits\10\include\10.0.10056.0\ucrt\stdio.h(2254): note: see declaration of 'sscanf'
1>c:\vc6prj\bklinker\bkobj2bin.c(33): warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\windows kits\10\include\10.0.10056.0\ucrt\stdio.h(2254): note: see declaration of 'sscanf'
1>c:\vc6prj\bklinker\bkobj2bin.c(41): warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\windows kits\10\include\10.0.10056.0\ucrt\stdio.h(2254): note: see declaration of 'sscanf'
1> bklinker.vcxproj -> C:\VC6prj\bklinker\Debug\bkobj2bin.exe
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

litwr
16.05.2015, 07:18
Cкорее всего у вас компоновщик неправильно собирается. Под Виндуз вроде бы надо указывать где-то, что программа компилируется для консольного режима. Выложил exe - попробуйте. Команда bkobj2bin <a.dump >a.bin должна сделать дело, если a.dump правильный. И, конечно, лучше запускайте с консоли.

MM
16.05.2015, 18:07
1. MACRO.SAV не предоставляет никакой автоматизации кода - т.е. надо предполагать, что набор идет непосредственно в машкоде - т.е. восьмеричными циферками - тогда всё будет абсолютно понятно.
2. Для случая с ДП 1801ВМ3 кодер MACRO.SAV должен сам рассчитывать все режимы - см. п.1.
3. Настоятельно рекомендуется кодить в эмуле ДВК на родных средствах разработки - тогда изрядная часть вопросов отпадет. Родными для ассемблера ДВК считаются :
3.1. Экранный текстовый редактор. ( EDIK.SAV )
3.2. Компиллятор ассемблера MACRO.SAV
3.3. Линковщик LINK.SAV
3.4. Средство коррекции файлов DESS.SAV
3.5. ( Отладочные файлы пользователя - для серьезных проектов )
*
Изучать ЭВМ по эмуляторам - не очень верное решение.
Если есть СЕРЬЕЗНАЯ необходимось в изучении - добудте рабочую ДВК/БК11М - при работе с натуральным железом возникнет сильно меньше вопросов.
*
Рекомендую перед работой со средствами RT-11 изучить документацию на :
1. Процессор М-ЭВМ
2. ТО на М-ЭВМ
3. Описание работы в среде RT-11, в т.ч. языка MACRO.
Это, кстати, вовсе не тоненькие брошурки...

Ynicky
16.05.2015, 19:17
To MM:
А можно использовать эмулятор БК001Х с теми же средствами разработки?

To litwr:
bkobj2bin делаю для консоли.
Понял где зависает, на for(;;).
Подставляю "for (int i=0;i<1000;i++)", пишет:

@cccccccc fffff060>=0 lines=2000
Possible wrong relocation!

Для чего мне это все нужно.
Хочу на FPGA сделать БК0010. Ресурсов платы хватит только на него.
Для моделирования нужен файл с программой. Можно текстовый или двоичный.

litwr
16.05.2015, 21:50
Цикл тут не причем. Данные у вас не читаются входные. Попробуйте запустить программку

/* prog.c */
#include<stdio.h>
main() {
char s[100];
while (!feof(stdin)) {
gets(s);
printf("%s\n", s);
}
}
Получится после компиляции, например, prog.exe, запускаем
prog <prog.c
это должно распечатать текст программки - если это заработает, то должен почти наверняка заработать и компоновщик. Тестировал с древним ХР Виндуз - там всё работает, до нового раньше пн не доберусь.

Ynicky
16.05.2015, 22:49
Работает. Вот что пишет в консоли:

C:\VC6prj\prog>prog 0<prog.c
/* prog.c */
#include<stdio.h>
main() {
char s[100];
while (!feof(stdin)) {
gets(s);
printf("%s\n", s);
}
}
}

C:\VC6prj\prog>pause
Для продолжения нажмите любую клавишу . . .

Ynicky
17.05.2015, 10:06
To litwr:
Может выложите свой .dump файл, я до понедельника попробую с ним.

Николай.

litwr
18.05.2015, 19:09
Похоже у нас ситуация непонимания. Какой это мой dump-файл? Кстати, протестировал компоновщик под Виндуз 8.1 - отлично работает. Вы использовали готовый EXE, выложенный на сайте? Должен работать, если у вас именно Виндуз. Скачайте, распакуйте, запускайте... Если опять не пойдет, то публикуйте снимки экрана, по которым можно будет понять, что вы не так делаете.
Вы в примере писали prog 0<prog.c - обычно 0 не пишут, это идёт по умолчанию, но может ваши очень особенные настройки этого требуют, пишите этот 0 и при запуске компоновщика. Такой 0 обычно только в Униксах использует, под старыми виндами так было нельзя писать совсем.

Ynicky
18.05.2015, 19:32
Использую Ваш bk-obj2bin.exe.
Сделал bat файл следующего содержания:

rem bkcompile FILENAME.asm
rem F=${1%%asm}
rem macro11 -yus -ysl 16 -o $a.obj -l $a.lst $1
macro11.exe -yus -ysl 16 hello.asm -o a.obj -l a.lst
dumpobj a.obj a.dump
bk-obj2bin <a.dump >a.bin
pause

При запуске пишет следующее:

D:\DOWNLOAD\CPU\pdp-11\Litwr\bklinker>rem bkcompile FILENAME.asm

D:\DOWNLOAD\CPU\pdp-11\Litwr\bklinker>rem F=${1%asm}

D:\DOWNLOAD\CPU\pdp-11\Litwr\bklinker>rem macro11 -yus -ysl 16 -o $a.obj -l $a.l
st $1

D:\DOWNLOAD\CPU\pdp-11\Litwr\bklinker>macro11.exe -yus -ysl 16 hello.asm -o a.obj -l a.lst

D:\DOWNLOAD\CPU\pdp-11\Litwr\bklinker>dumpobj a.obj a.dump
GSD:
MODNAME =0 flags=0
PSECT =0 flags=40
PSECT . ABS.=1057 flags=104
XFER . ABS.=1 flags=10
ENDGSD
RLD
Location counter definition . ABS.+1000
TEXT ADDR=1000 LEN=57
001000: 012701 000012 012702 000020 ........
001010: 104024 012701 001030 012702 ........
001020: 000036 104020 104006 000000 ........
001030: 111233 042510 046114 020117 ..HELLO
001040: 042120 026520 030461 053440 PDP-11 W
001050: 051117 042114 005041 000 ORLD!..
ENDMOD

D:\DOWNLOAD\CPU\pdp-11\Litwr\bklinker>bk-obj2bin 0<a.dump 1>a.bin


И висит.
0 и 1 не пишу, хотя в консоли они есть.


http://img.radiokot.ru/files/102181/nkzjchoxe.jpg

litwr
18.05.2015, 21:30
Теперь понятно. Вы бы посмотрели на файл a.dump - он же нетекстовый. Нужно
dumpobj a.obj >a.dump
Hy и морокa из-за одного значка.

Ynicky
18.05.2015, 21:58
Ура, заработало!
Спасибо за терпение.

Николай.

Ynicky
20.05.2015, 20:19
To litwr:
Извините за назойливость, а не могли бы Вы сделать утилитку
для формирования .rom файлов (типа bkobj2rom) без первых 4 байтов в .bin? И выложить на своем сайте. Может кому-нибудь тоже пригодится?

Николай.

litwr
21.05.2015, 20:03
Это будет тогда неведомо какой формат, вместо стандартного BIN, который можно сразу грузить в любой эмулятор. Давайте лучше напишем утилитку BIN2HEX. Например так


#include<stdio.h>
main() {
getchar();
getchar();
getchar();
getchar();
for(;;){
int c = getchar();
if (c == EOF) break;
putchar(c);
}
}

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

Ynicky
21.05.2015, 21:03
Я так понял эта утилита убирает 4 байта из bin файла?
Я пишу тесты для модели процессора ВМ1 и эти байты мне мешают.
Попробую сделать.
Спасибо.

---------- Post added at 20:59 ---------- Previous post was at 20:31 ----------

Сделал так, работает.

#include<stdio.h>

int main(int argc, char *argv[]) {

FILE *binfile;
FILE *romfile;
char c;

if (argv[1])
{
binfile = fopen(argv[1], "rb");
if (binfile == NULL) return 1;
}
if (argv[2])
{
romfile = fopen(argv[2], "wb");
if (romfile == NULL) return 1;
}

c = fgetc(binfile);
c = fgetc(binfile);
c = fgetc(binfile);
c = fgetc(binfile);

for(;;){
c = fgetc(binfile);
if (c == EOF) break;
fputc(c,romfile);
}

fclose(binfile);
fclose(romfile);
return 0;
}

---------- Post added at 21:03 ---------- Previous post was at 20:59 ----------

Еще один вопрос.
А те .rom файлы, которые есть к некоторым эмуляторам с содержимым ПЗУ
разве имеют другой формат?

litwr
21.05.2015, 22:13
Не любите знаков < и >? Ту программку, что приведена надо запускать


bin2hex <binfile >hexfile

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


dd if=binfile of=hexfile bs=1 skip=4

Ynicky
28.05.2015, 12:54
To litwr:
Написал простенький тест для моделирования ВМ1.

.TITLE testpdp11
.ASECT
.=0000
;;;;;;;;;;;;;;;;;;;;;;;;; tst_bcc.asm
BR 000022;
L1: MOV #1, R1;
MOV #2, R2;
BR L2;
HALT;

.=0022
BR L1;
L2: MOV R1, R3;
ADD R2, R3;
CMP #3, R3;
BEQ L3;
HALT;

.=0040
L3: CLR R3;
CMP #0, R3;
BEQ L4;
HALT;
L4: MOV #1, R3;
CMP #0, R3;
BNE LJ1;
HALT;
LJ1:
CMP #0, R3;
BEQ L5;
BLT L5+2;
L5:
HALT;
CMP #0, R3;
BLE LJ2;
HALT;
LJ2:
CMP R3, #0;
BGT LJ3;
HALT;
LJ3:


;;;;;;;;;;;;;;;;;;;;;;;;; tst_alu.asm
MOV #0177400, R4;
MOV #0007007, R5;
BIS R4, R5 ; OR
CMP #0177407, R5;
BEQ LA1;
HALT;
LA1:
MOV #0000370, R4;
; MOV #0177407, R5;
BIT R4, R5 ; AND
BEQ LA2;
HALT;
LA2:
MOV #0177407, R4;
; MOV #0177407, R5;
BIC R4, R5 ; RD AND not RS
CMP #0, R5;
BEQ LA3;
HALT;
LA3:
MOV #0000777, R4;
MOV #0177000, R5;
ADD R4, R5 ; ADD
CMP #0177777, R5;
BEQ LA4;
HALT;
LA4:
MOV #0000377, R4;
MOV #0177400, R5;
ADD R4, R5 ; ADD
CMP R5, #0177777;
BEQ LA5;
HALT;
LA5:



MOV R3, @#1000;
MOV R1, @#2000;
MOV #100, @#4000;
MOV #2, R2;
MOV #200, @#10000;
NOP;

WAIT;

.END



Использовал Ваш компоновщик.
Долго не мог понять, почему не работает.
Оказывается, .bin файл не соответствует файлу .dump.
В инструкцию вклинивается символ 0xD и все сдвигается на 1 байт.
Скрин прилагаю.

Николай.

http://img.radiokot.ru/files/102181/nup6eefno.jpg

nzeemin
28.05.2015, 13:30
Извините что вмешиваюсь.
И для компиляции и для линковки можно использовать "RT-11 в командной строке" от Patron: http://zx-pk.ru/showthread.php?t=24755

Собственно я его успешно использовал, написал батник для компиляции:


C:\bin\rt11\rt11.exe MACRO LEVELS.MAC
C:\bin\rt11\rt11.exe MACRO/LIST:DK: MAIN.MAC+SYSMAC.SML/LIBRARY

И для компоновки:


C:\bin\rt11\rt11.exe LINK MAIN,LEVELS /MAP:OUTPUT.MAP

И главное это родные MACRO и LINK, проверенные десятилетиями.

litwr
28.05.2015, 20:17
Проблемка в Виндуз. Она очень простая: fwrite в текстовый файл Виндуз автоматически добавляет код 0d перед каждым кодом 0a. Получается, что из Виндуз bk-obj2bin использовать нельзя. Собираюсь обновить сайт и убрать оттуда сборку для Виндуз. Решить проблемку не сложно - надо лишь не использовать стандартные потоки, а открывать файлы в бинарном режиме и не использовать перенаправлений при вызове. Это то, что вы сделали для удаления 4-х байт, добавив argv, fopen, fclose, ... Сам под Виндуз почти ничего не запускаю и могу только удивляться как далекие от офисного планктона могут.
Учитывая, что решение предложено, ничего по изменению кода делать не буду. Код под GNU - каждый может взять и подправить.
Жаль, что эмулятор консоли RT-11 без исходников.

Ynicky
28.05.2015, 20:32
Спасибо, пока получается с RT-11.
Проверяю дальше.

Николай.

nzeemin
28.05.2015, 22:26
Проблемка в Виндуз. Она очень простая: fwrite в текстовый файл Виндуз автоматически добавляет код 0d перед каждым кодом 0a. Получается, что из Виндуз bk-obj2bin использовать нельзя. Собираюсь обновить сайт и убрать оттуда сборку для Виндуз. Решить проблемку не сложно - надо лишь не использовать стандартные потоки, а открывать файлы в бинарном режиме и не использовать перенаправлений при вызове. Это то, что вы сделали для удаления 4-х байт, добавив argv, fopen, fclose, ... Сам под Виндуз почти ничего не запускаю и могу только удивляться как далекие от офисного планктона могут.

Ну офигеть проблемка, и пачка холивара в придачу.
Вот тут http://stackoverflow.com/questions/23107609/is-there-way-to-set-stdout-to-binary-mode
советуют так:


#ifdef _WIN32
#include <io.h>
#include <fcntl.h>
#endif
...
#ifdef _WIN32
setmode(fileno(stdout),O_BINARY);
setmode(fileno(stdin),O_BINARY);
#endif

nzeemin
23.09.2015, 01:28
Вот ещё один toolchain для компиляции PDP-11 программ на PC, от Сергея Вакуленко:
https://github.com/sergev/bk0012/tree/master/toolchain
(мопед не мой, ездить пока не пробовал)

vwarlock
15.03.2017, 14:35
Наверное в эту тему.

За пару часов наваял пакет для редактора Atom -- простейшую подсветку синтаксиса для языка MACRO-11. Не то чтобы сильно нужно было, просто интересно было пройти этот квест -- с нуля до публикации пакета.
https://atom.io/packages/language-macro11
Реализация там собственно -- одна регулярка. Но вдруг кому пригодится.

Я сейчас занят созданием среды для кросс разработки на Macro-11 в Sublime-Text.
Хотел "подсмотреть", но там, увы, уже ничего нет :(

Поэтому у меня вопрос: не сохранились ли регексы от этого проекта, не хочется изобретать велосипед, если nzeemin не против, конечно, что я их буду использовать в своем проекте.
Процентов 60 подсветки у меня уже работает, но написание регексов мне дается с трудом.

nzeemin
15.03.2017, 14:46
Я сейчас занят созданием среды для кросс разработки на Macro-11 в Sublime-Text.
Хотел "подсмотреть", но там, увы, уже ничего нет :(

Поэтому у меня вопрос: не сохранились ли регексы от этого проекта, не хочется изобретать велосипед, если nzeemin не против, конечно, что я их буду использовать в своем проекте.
Процентов 60 подсветки у меня уже работает, но написание регексов мне дается с трудом.

Проект в аттаче.
Никаких ограничений на использование я не накладываю.

Вот ещё один похожий проект: https://github.com/guywald1/pdp11-grammar

vwarlock
16.03.2017, 18:50
Я сейчас занят созданием среды для кросс разработки на Macro-11 в Sublime-Text.
Проект дошел до стадии, когда его уже можно показывать :)
Собственно вот (https://github.com/VWarlock/sublime-text-pdp11asm)

Критика и пожелания приветствуются.

svofski
03.07.2018, 12:38
Прошу прощения, если я что-то пропустил. Если ли какие-то новости и истории успеха в использовании pdp11-aout-gcc для вм1? Я собрал его с newlib-ом на макосе. Все собирается, тестовый "хелло вролд" линкуется в a.out размером 2кб. Как и у всех до этого, у меня проблема с тем, что gcc генерирует инструкции EIS: ashc/mul/div. Знаю про драйвер EM.SYS для RT-11, но у меня голый металл и для него мне придется делать адское варево из потрохов этого драйвера, кастомного линкер скрипта, ну и еще мало ли чего.

Может быть кто-то уже решил этот вопрос более серьезно и хочет поделиться своими реализациями интринсиков без EIS, pdp11.md может быть?

MM
03.07.2018, 14:18
Может быть кто-то уже решил этот вопрос более серьезно
Правильное и четкое решение вопроса - использование Оригинальных ( правильных, из комплекта поставки ДВК ) программных средств RT-11, например
в эмуляторе ДВК господина Патрона.
Это Вам любой военпред подтвердит - "к/с софта совпадают" ----> "решение правильное". А тип используемого процессора ( i3, например, вместо 1801ВМх ) - дело глубоко вторичное, не всем это будет вообще понятно :v2_dizzy_army:

svofski
03.07.2018, 14:32
MM, спасибо, про средства RT-11 я в курсе. Но я ищу вменяемый компилятор Си.

MM
03.07.2018, 14:48
компилятор Си.
Для ДВК RT-11 ?
Поспрашивайте в разделе ДВК - вроде у кого-то был...

Если найденный продукт ( Си RT-11 ) середины 1980-х не подойдет - целесообразно переписать задание на Паскале - он точно есть.
Если полученный текст предполагается муровать в ПЗУ - целесообразно использовать только ассемблер, т.к. языки высокого уровня пристегнут свои
массивные библиотеки, и не факт, что они предназначены для работы в ПЗУ.
Некотрый эмуль арифметики для 1801ВМ1А содержится в 326 ПЗУ БК11М ( КНГМД ), точка входа ( 10-й вектор ) - где-то по середке ПЗУ ( в районе 2 Кбайт из общего размера ПЗУ 4 Кбайт )

svofski
03.07.2018, 15:44
MM, у меня свой проект в FPGA, где вм1 просто вспомогательный процессор на побегушках. Файл с SD-карты прочитать, меню может быть показать, запрос послать туда-сюда, что-то такое. В прошлом я для таких же целей пользовался pcc из bkunix, у меня даже TinyFatFS получилось под него перенести. Но он древний, кривоватый и приходится все время заглядывать в листинг и думать, как переписать сорец так, чтобы он смог его скомпилировать правильно. Поэтому я решил поинтересоваться, что бывает еще. Про pdp11-aout-gcc разговоры все время идут, но как-то никто не хвастается тем, что получилось им собрать что-то практически полезное.

Массивные библиотеки не страшны. Это небольшой набор примитивов для реализации сложных операций типа деления, сдвигов на несколько разрядов итд.

Си в RT-11 это наверное DECUS C. Современник pcc, так что вряд ли принципиально лучше. Я что-то такое гонял в simh из любопытства, но не-не. RT-11 для Си слишком дикая среда, или Си для RT-11 слишком дикий, зависит от точки зрения.

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

MM
03.07.2018, 16:11
сложных операций типа деления, сдвигов на несколько разрядов итд
Если камень 1801ВМ1 отдельный железный - целесообразно рассмотреть вопрос о его замене на Н1806ВМ2.
Преимущества 1806ВМ2 :
1. Адекватная МПИ.
2. Высокое быстродействие.
3. Разгоняемость.
4. Расширенная аппаратная арифметика, в т.ч. MUL and DIV.
5. Готовые ПЗУ МС1201.02 1801РЕ2-055, позволяющие из Г. и палок сделать "конфетку". Кстати, они содержат программный расширитель арифметики...

svofski
03.07.2018, 16:18
MM, нет, это мое софтовое ядро из bk0010. И в принципе я мог бы засунуть в него EIS. Но мне не хочется отвлекаться на совершенно посторонние вещи, которые обходятся программно.

Manwe
15.09.2018, 08:47
Может кому понадобится: Ivanq написал хороший компилятор ассемблера на Python: https://github.com/imachug/PDPy11

S_V_B
15.09.2018, 11:15
MACRO-11 для Windows:
http://retrocmp.com/tools/macro-11-on-windows

Кстати у кого-нибудь есть допиленный "Sublime Text" с прикрученным транслятором? (файлы настроек).

Manwe
15.09.2018, 15:46
Кстати у кого-нибудь есть допиленный "Sublime Text" с прикрученным транслятором? (файлы настроек).Есть: https://gist.github.com/imachug/3ab11df5e91c8d815a8c63a76bb08b14

S_V_B
15.09.2018, 17:58
Раскраску я уже сделал, я имел в виду Tools->Build System, Build With.. я так понимаю туда можно транслятор прицепить?

Manwe
15.09.2018, 22:14
Раскраску я уже сделал, я имел в виду Tools->Build System, Build With.. я так понимаю туда можно транслятор прицепить?Например вот здесь описано (по-русски): https://github.com/imachug/pdp11asm

S_V_B
16.09.2018, 13:13
А под windows не настраивали?
Вроде все просто но не хочет.
BK0010.sublime-build:
{
"shell_cmd": "C:\_BK_DEV\Compiler_Sublime\compiler.exe" " ${file_path}\${file_base_name}""

}

compiler.exe - рабочий, уже и по два слэша ставил.. Ctrl+Shifn+B --> No Build Sistem... хотя выбрана БК0010

Manwe
17.09.2018, 08:02
Вроде все просто но не хочет.Попробуй всё же PDPy11 (https://github.com/imachug/pdpy11), у меня сейчас он подключен.
Надо скачать (кнопка Clone or download), распаковать, убрать "-master" из имени папки.
Внутри этой папки создать файл subl.sh следующего содержания:

#!/usr/bin/env bash
cd "ТвойПуть"
python -m PDPy11 "$1" | sed -E '$!N;s@(.*)\n at file (.*) \(line ([0-9]+), column ([0-9]+)\)@\2:::\3:::\4:::\1@g;P;D'
Здесь "ТвойПуть" - это полный путь до папки PDPy11 (а не внутрь неё). Например, C:\Work\BK0011\
Если вдруг в системе не установлен Python, скачать можно на официальном сайте (https://www.python.org/downloads/). В установщике отметь галоску Add Python to PATH.

А в папке Sublime Text 3 нужно создать файл /Packages/User/PDPy11.sublime-build
В этом файле должен быть такой текст:

{
"shell_cmd": "ТвойПуть/PDPy11/subl.sh "$file_path/$file_name"",
"file_regex": "(.*?):::(.*?):::(.*?):::(.*)"
}

S_V_B
17.09.2018, 08:29
subl.sh - это же скрипт linux, и его нет в архиве :(
Что там прописано, чтобы заменить на bat?

Manwe
17.09.2018, 08:47
subl.sh - это же скрипт linux, и его нет в архиве :(
Что там прописано, чтобы заменить на bat?На Windows 10 у меня прямо так и прописано в BK0010.sublime-build:

{
"shell_cmd": ""C:\\Users\\Manwe\\Documents\\BK0010-Compiler\\compile.sh" "$file_path/$file_name""
}
Ах, вот в чём дело! Форум побил символы. Вот на скриншоте показано как надо:
66280

А для PDPy11 в папке с компилятором compile.sh:

#!/usr/bin/env bash

cd "$(dirname "$0")"

echo Compiling $1

./compiler "$1" >_log
if [ $? -ne 0 ]; then
cat _log | python -c "import sys; print sys.stdin.read().decode('utf-8', 'ignore').encode('utf-8')" | tail -2 | head -1
exit
fi

echo Saved!

S_V_B
17.09.2018, 08:56
все понял.. нужно еще наверное поставить Cygwin.
На виндовс 10 не знаю может и так работает, вечером дома попробую т.к сейчас на 8ке

Manwe
17.09.2018, 09:13
Я ещё картинку залил с правильным кодом и добавил к прошлому сообщению, иначе форум проглатывал символы.

S_V_B
17.09.2018, 09:17
Спасибо огромное. Буду пробовать.
Еще вопрос: Эмулятор который на питоне, он бинарники сразу запускает? Чтобы для полного счастья сделать опцию "Build+Run"...
Эмулирует только БК-0010 или 11 тоже?

Manwe
17.09.2018, 15:58
Спасибо огромное. Буду пробовать.
Еще вопрос: Эмулятор который на питоне, он бинарники сразу запускает? Чтобы для полного счастья сделать опцию "Build+Run"... Эмулирует только БК-0010 или 11 тоже?Это всё же компилятор, а не эмулятор :) Он просто сохраняет файл в формате .bin
Чтобы запустить, надо руками закинуть файл в какой-нибудь эмулятор. Хотя, конечно, у нас есть заготовки для автоматического создания диска в формате MKDOS, можно прикрутить к компилятору – это облегчит запуск через сторонний эмулятор. С другой стороны, эмулятор всё равно не даст компилятору обновить образ диска, который он сейчас использует.

S_V_B
17.09.2018, 17:20
/*Это всё же компилятор, а не эмулятор */
Пардон, я имел в виду ява-эмулятор, который вы советовали..
..
Кстати настроить нормально bash-sh в 8ке так и не получилось.
Я решил сделать все по честному и достал с антресоли Orange PI plus, закатал на нее Ubuntu-Mate, сейчас буду настраивать..

Manwe
17.09.2018, 18:02
Пардон, я имел в виду ява-эмулятор, который вы советовали..Простые вещи можно делать так: хранить исходный ассемблерный текст в папке files эмулятора. Компилироваться он будет в эту же папку. Тогда при запущенном эмуляторе в любой момент можно загрузить этот файл "с магнитофона" (через монитор БК0010 или БК0011, у них разные команды для загрузки - M и L соответственно). Я так и делаю на Mac OS X. Запускаю эмулятор bk2010-0.5-release.jar в режиме БК-0010, набираю "MO" для входа в монитор, дальше "M" (магнитофон) и имя файла (без .bin). Потом "S" для запуска. Исправляю и компилирую код, после чего могу снова грузить тот же файл в эмулятор без перезапуска.


Кстати настроить нормально bash-sh в 8ке так и не получилось.
Я решил сделать все по честному и достал с антресоли Orange PI plus, закатал на нее Ubuntu-Mate, сейчас буду настраивать..Я попросил Ivanq допилить компилятор. Теперь работает компиляция из Sublime Text в Windows. Только что проверил на Windows 8.
Нужно скачать обновлённый компилятор с https://github.com/imachug/pdpy11
В архиве будет папка sublime. В ней файл PDPy11.sublime-build - в файле нужно прописать путь к компилятору ("working_dir": "<path_to_pdpy11>" используя двойные слэши в пути) и положить файл в папку Sublime Text 3/Packages/Users. Да, один стрёмный момент - папку компилятора надо обязательно переименовать в "pdpy11" маленькими буквами. Потом пофиксим на произвольное название.

S_V_B
17.09.2018, 18:05
Спасибо! (Linux версию все равно доделаю-что бы было)

S_V_B
18.09.2018, 09:11
пишет: No module named ppdpy11..

такого и вправду нет.. раньше же вроде в командной строке compiller фигурировал, а теперь :
@cd .. python -m pdpy11 --sublime "%~1"

Manwe
18.09.2018, 13:52
пишет: No module named ppdpy11..
такого и вправду нет.. раньше же вроде в командной строке compiller фигурировал, а теперь :
@cd .. python -m pdpy11 --sublime "%~1"А можешь процитировать файл PDPy11.sublime-build (лучше скриншот)?

S_V_B
18.09.2018, 14:11
все доперло.. папка должна быть "pdpy11" строчными, а не абы как. У нас как всегда.. два дня не получается начинаем читать книжки... в ридми все написано.

Manwe
18.09.2018, 17:38
все доперло.. папка должна быть "pdpy11" строчными, а не абы как. У нас как всегда.. два дня не получается начинаем читать книжки... в ридми все написано.:)
В отличии от компилятора Алексая Морозова, наш PDPy11 подсвечивает ошибки прямо в Sublime Text. Не все пока что, но Ivanq над этим работает.
Ещё есть идея ввести команды PUSH N и POP N, а то жутко надоедает писать MOV N,-(SP) и MOV (SP)+,N и на читаемости кода такие MOVы плохо сказываются.

S_V_B
18.09.2018, 18:25
/* наш PDPy11 подсвечивает ошибки прямо в Sublime Text */
Да уже заметил, круто.
Кстати можно не только PUSH&POP.. , а чтобы свои макросы можно было добавлять... типа файлик macros.def
Циклический сдвиг, развернутый цикл (типа movsw) mov (Rx)+,(Ry)+,n итд

Manwe
18.09.2018, 18:50
Есть макрос Repeat, в документации описан. Им решается большая часть задач. Repeat можно делать вложенный. Ну а более навороченный (с итератором) будет перебором, мне кажется. Это уже какой-то язык высокого уровня получится.

nzeemin
25.09.2018, 23:11
Написал Sav2BkBin, пока реализация топорная и довольно дебильная, но хоть как-то но работает, а дальше можно напильником доработать, как обычно.
То есть, смысл в том что компилируем программу под БК обычными средствами RT-11 -- MACRO и LINK, а затем запускаем эту утилитку для получения .BIN-файла.
Дальше, для запуска MACRO и LINK под виндой давно уже есть консольная RT-11 от Patron.

https://github.com/nzeemin/ukncbtl-utils/blob/master/Sav2BkBin/sav2bkbin.cpp

Пример использования:
https://github.com/nzeemin/bk0010-stopexpress/blob/master/!compilelink.bat

Manwe
30.09.2018, 12:32
Обновили компилятор, поправили баг с переполнением стека рекурсии:
https://github.com/imachug/PDPy11

В плагин подсветки синтаксиса добавили макрокоманды:
https://gist.github.com/imachug/3ab11df5e91c8d815a8c63a76bb08b14

S_V_B
02.10.2018, 18:23
Было бы здорово если бы PDPy11 мог кроме таргетов BIN и RAW еще SAV делать, что бы в RT-11 запускать.
В простейшем случае к RAW добавить 0й блок в котором четыре цифры проставить.

описание формата SAV:
66445

gid
03.10.2018, 09:16
еще SAV делать
Ага, а ещё чтобы мог полностью совместимые с RT-11 SAV делать, оверлеи там всякие, защиты и т.п., т.е. чтобы мог полностью заменить MACRO11 + LINK, чтобы был совместим на уровне OBJ модулей, только чтобы метки длинные понимал (полноценно, а не только первые 6 символов из метки), мне только этого в MACRO11 не хватает.

S_V_B
03.10.2018, 10:59
/* оверлеи там всякие, защиты и т.п. */
Я же попросил в простейшем случае.. адрес, длинна, адр. запуска... для изучения УКНЦ мне вполне хватит.. (мне очень понравилась связка SublimeText и PDPy11, а танцы с бубнами Эмулятор+Macro11+Link НЕТ) И чтобы проверить две строчки кода достаточно будет того что я попросил.
Если вы пишете оверлей, драйверы и пр.. никто вам не запрещает пользоваться великолепным MACRO-11..

Manwe
03.10.2018, 11:27
только чтобы метки длинные понимал (полноценно, а не только первые 6 символов из метки), мне только этого в MACRO11 не хватает.PDPy11 понимает длинные метки. И сложную арифметику с метками типа MOV #(MET1*3+MET2)-MET3/2,R0


Я же попросил в простейшем случае.. адрес, длинна, адр. запуска...Беглый просмотр формата SAV навёл меня на мысль, что тремя word'ами там не обойтись. Ещё кучу всего придётся заполнять. Непонятно как и чем.

S_V_B
03.10.2018, 12:18
Вроде там хитрые поля заполняются если указаны опции в линковщике.. если нет то игнор

Единственное это:
44 - СЛОВО СОСТОЯНИЯ ПРОГРАММЫ (JSW);
Точнее Job Status Word (JSW)
Описано здесь:
http://bitsavers.trailing-edge.com/pdf/dec/pdp11/rt11/v5.6_Aug91/AA-PD6NA-TC_RT-11_System_Internals_Manual_Aug91.pdf

Описывает взаимодействие с терминалом, выход, реакцию на Ctrl/C..CHAIN$

хотя в нашем случае лучше опытным путем:
Взять 0й блок от программы HelloWorld и менять адрес, длину и запуск.
посмотреть область 500-776
и в коде посмотреть как организованы простейшие макросы типа .EXIT

если я правильно понял то 0й блок описывает ОЗУ с 0 по 1000...
и задача максимум это загрузить кусок кода по определенному адресу и выполнить, а дальше зависит от того что ты там написал..
для простых вещей я думаю вполне пойдет, речь не идет о взаимодействии с ОС и прочими наворотами.. для этих целей есть MACRO-11 и LINK

Кстати я хотел прикрутить MACRO11 for windows к Sublime Text.. но почему-то (сама по себе она запускается) когда начинает что-то компилять вылетает с ошибкой win о недопустимой операции

Manwe
03.10.2018, 15:08
Взять 0й блок от программы HelloWorld и менять адрес, длину и запуск.Можно попробовать. Пришли, пожалуйста, простейшую программу в формате sav.

S_V_B
03.10.2018, 18:10
Hello world
https://yadi.sk/d/sfWULPIAzOKeyg

в 0м блоке- адрес, адрес запуска и длина.. все остальное по нулям кроме ячейки 360..

360 - 377 - КАРТА ЗАГРУЗКИ ПРОГРАММЫ В ПАМЯТЬ.
ЯЧЕЙКИ 360 - 377 В НУЛЕВОМ БЛОКЕ ФАЙЛА ИСПОЛЬЗУЮТСЯ
КОМПОНОВЩИКОМ ДЛЯ ПЕРЕДАЧИ ИНФОРМАЦИИ О РАСПРЕДЕЛЕНИИ ПАМЯ-
ТИ KMON. КАЖДЫЙ БИТ ЯЧЕЕК СООТВЕТСТВУЕТ ОПРЕДЕЛЕННОМУ БЛОКУ
ПАМЯТИ ИЗ 256 СЛОВ И УСТАНАВЛИВАЕТСЯ В ТОМ СЛУЧАЕ, ЕСЛИ
ПРОГРАММА ЗАНИМАЕТ ХОТЯ БЫ ОДНО СЛОВО В ДАННОМ БЛОКЕ ПАМЯ-
ТИ. ЭТА ИНФОРМАЦИЯ ИСПОЛЬЗУЕТСЯ KMON ДЛЯ ОПРЕДЕЛЕНИЯ, БУДЕТ
ЛИ ПОЛЬЗОВАТЕЛЬСКАЯ ПРОГРАММА ПЕРЕКРЫВАТЬ KMON И USR.

сейчас там записано 300 или 11000000b что соответствует 2м первым блокам памяти..
если будем грузить не с 1000го то нужно будет вычислить ячейку карты: 360+2*(адр.загр/(1000*20) (oct)
и битовую маску внутри блока: устанавливать 15 бит сдвигая вправо на кол-во блоков (Длина/1000)
на вскидку так, если не напутал.. скорее всего об этом где-то написано нужно поискать

gid
04.10.2018, 09:37
PDPy11 понимает длинные метки. И сложную арифметику
А объектные модули и их линковку делать умеет?
А оверлейные исполняемые файлы, рассчитанные под страничную БКшную архитектуру, делать может? Это когда файл состоит из блоков, которые грузятся каждый в свою страницу и потом оттуда вызываются п/п с нулевой страницы, и наоборот, из нулевой - п/п из подключаемых страниц. Собирается такой файл обычно с некоторым шаманством и ручной работой, что довольно хлопотно.
Мне как раз этого в БКшных ассемблерах не хватает (не считая длинных меток), поэтому я в своём кросстурбо8 приделал эту возможность методом костыляния.

Manwe
04.10.2018, 15:20
А объектные модули и их линковку делать умеет?Не умеет. Предполагается, что вместо .obj всё нужное есть в исходниках и они подключаются командой .INCLUDE



А оверлейные исполняемые файлы, рассчитанные под страничную БКшную архитектуру, делать может? Это когда файл состоит из блоков, которые грузятся каждый в свою страницу и потом оттуда вызываются п/п с нулевой страницыЭто довольно странная затея для БК, особенно в 2018-ом году. Даже в 90-ые никто, по-моему, не пользовался командой EMT 36 из монитора БК-0011, хотя она позволяла грузить файл сразу в нужную страницу. Если MKDOS и AnDOS не поддерживают многостраничные программы, то может быть это никому не нужно? На первый взгляд кажется, что виртуальная адресация и дальние переходы - это удобно, но как на практике её использовать, как указывать 24-битные адреса? Процессор же ограничен 16-ю битами.



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



Мне как раз этого в БКшных ассемблерах не хватает (не считая длинных меток), поэтому я в своём кросстурбо8 приделал эту возможность методом костыляния.Если в CrossTurbo8 такое есть, то это прекрасно. Я просто думаю, что эта возможность нужна нечасто.

gid
05.10.2018, 09:47
Это довольно странная затея
Ненене, речь совсем не про это. Никакой виртуальной адресации. Классический пример, который сразу приходит в голову - программа "Рок Монитор". Весь код не влазит в стр.0, и продолжение находится в стр.1, которая подключается по мере надобности, и оттуда вызываются нужные п/п.

не гигантский исполняемый файл, а в основном данные?
В том то и дело, что исполняемый код. У меня в году в 1997 всё время получалось, так что весь код не полезал в постоянно доступную память, приходилось извращаться со страницами. Потом, из-за неправильного менеджмента, получалось так, что страниц ещё 3 штуки свободных оставалось, а подключить их никак, окна уже заняты оверлейной страницей и экраном или буферной страницей, а нулевая - всё. Все нужные подпрограммы её уже забили, памяти не хватает и дальше писать прогу бессмысленно. Поэтому я БКшку подзабросил на дальнюю полку, и начал осваивать PC.
А писал я для себя графическую оболочку, типа виндовс 3.1, контроллера смк у меня не было. И так и не дописал, потому что понял, что если она займёт всю доступную память, и прикладным программам ничего не останется, то на не нужна.

Manwe
05.10.2018, 10:11
Весь код не влазит в стр.0, и продолжение находится в стр.1, которая подключается по мере надобности, и оттуда вызываются нужные п/п.Надо подумать, что можно с этим сделать. На первый взгляд кажется, что проблема не решается средствами компилятора. А решается она архитектурой приложения. Как вариант, можно в начале каждой страницы хранить одинаковый код этакого обработчика запросов и карту подпрограмм, а после него в каждой странице уже свои процедуры. Поскольку обработчик един для всех страниц, он выносится в отдельный исходник и подключается к исходнику каждой страницы командой include. Каждая страница со своим набором подпрограмм компилируется отдельно с адреса 100000. Линковать эти страницы с основной программой не нужно, лучше при запуске просто подгрузить их с диска.

Manwe
05.10.2018, 12:30
описание формата SAV: 66445
Hello world https://yadi.sk/d/sfWULPIAzOKeygНе понял про карту загрузки памяти 360-377.
Для примера "HELLO WORLD" в байте 360 установлены два старших бита. Почему отсчёт ведётся не с младших битов, а со старших? Означает ли это, что программа занимает первый и второй блоки памяти? То есть нулевой блок тоже считается частью программы и поэтому старший бит 360-го байта всегда установлен в единицу?

S_V_B
05.10.2018, 12:45
/* Означает ли это, что программа занимает первый и второй блоки памяти? */
Вроде так, нужно попробовать скомпилировать что-нибудь например с 40000, тогда видно будет. (либо 0й блок всегда указывается)

/* Почему отсчёт ведётся не с младших битов, а со старших? */
Скорее всего для наглядности. Битовая карта же, а ты на нее сверху смотришь:)

Manwe
06.10.2018, 13:45
нужно попробовать скомпилировать что-нибудь например с 40000, тогда видно будет. (либо 0й блок всегда указывается)Попробуй, пожалуйста. И чтобы размер файла был больше одного блока.

S_V_B
06.10.2018, 14:28
Запускается с 10000, размер больше 2х блоков
https://yadi.sk/d/AaWKMAEpZ7rf-Q

нулевой блок всегда есть
забавно что в SAV файл записывается все с 0 по 10000..

или я неправильно что-то сделал?

в исходнике я указал:

.ASECT
.=010000

соответственно код оттранслировался на 10000, но зачем было писать в файл кусок с 0я по 10000?
Что то тут не так, ведь раньше каждый байт экономили.. а тут 6 килобайт на Hello world :(

Manwe
06.10.2018, 16:01
но зачем было писать в файл кусок с 0я по 10000?Зато в карте памяти по адресам 360-377 почти одни нули. Что логично.
Нулевому блоку соответствует установленный бит. Блоку с адреса 10000 тоже соответствует установленный бит. И блоку через один от него (туда указывает стек, адрес 12034) соответствует установленный бит. Остальное - нули.
Единственное, что я не понял: верхний адрес программы указан 12032 (то есть впритык к стеку, что странно - стек может перетереть конец программы). Но главное - в карте памяти есть пустой блок между началом программой и стеком. Как же тогда программа будет использовать соответствующее адресное пространство?
То есть карта памяти здесь такая: заняты области
00000-01000 нулевой блок
10000-11000 программа
12000-13000 стек
Как видно, область 11000-12000 не занята программой. Так с чего бы тогда конечный адрес программы указан 12032? Ошибка компилятора?

В общем, мы добавили возможность компиляции в sav - проверь (https://github.com/imachug/PDPy11).
python -m pdpy11 path-to/test.mac --sav
или в текст программы добавить make_sav

P.S.
ещё можно писать PUSH R1 вместо MOV R1,-(SP) и аналогично POP R1

S_V_B
06.10.2018, 17:28
ок, попробую..
Просто странно, на эту программу ушел бы километр перфоленты.. :)
Хотя наверное раньше таким варварством не занимались, программу писали последовательно с начала, а для оверлеев была своя секция памяти.

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

При трансляции с опцией make_sav, ошибка вылетает:
66480

https://yadi.sk/i/73TaOufEJRlWeQ

Hunta
06.10.2018, 17:41
но зачем было писать в файл кусок с 0я по 10000?
Потому что файл в формате SAV (save) - это образа памяти. С адреса 0 и до максимально занятого. Служебная инфа - в блоке 0 (и то не во всём), остальное - данные, программа и незанятые области. Использовали секцию .ASECT - код и данные легли в указанные области (в битовой карте - единицы), остальное - незанятые области (в битовой карте - нули). Использовали бы секции .CSECT или .PSECT - линкер поместил бы их друг за дружкой начиная с адреса 1000. Стек и правильность работы с ним - забота программиста (MACRO-11, по умолчанию - с адреса 1000 и вниз) или компиляторы (ЯВУ).

S_V_B
06.10.2018, 17:44
А как же экономия перфоленты :)

Hunta
06.10.2018, 17:47
Просто странно, на эту программу ушел бы километр перфоленты
На PDP-11 (и клонах) загрузчик с перфоленты использовал формат .LDA (не помню, как расшифровывалось), там принцип - длина куска, адрес загрузки куска, сам кусок - и такие секции повторяются для всех кусков с данными или кодом. Ещё как то указывался стартовый адрес - надо смотреть описание.

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


А как же экономия перфоленты :)

Ответил. Но если выводить .SAV на перфоленту - экономии не будет и придётся писать свой загрузчик :)

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

Кстати, у RSX формат .TSK слегка напоминает .SAV.
А ещё есть .SAV и .TSK с оверлеями ;)

Manwe
06.10.2018, 18:20
При трансляции с опцией make_sav, ошибка вылетаетА если без make_sav? В командной строке указать компилятору —sav

S_V_B
06.10.2018, 18:29
python.exe : No module named pdpy11

Manwe
06.10.2018, 18:36
puthon.exe : No module named pdpy11надо предварительно перейти в директорию где лежит директория pdpy11

S_V_B
06.10.2018, 18:39
стоп..стоп... откомпилировалась

забыл убрать make_sav из исходника

Проверил в эмуляторе УКНЦ, ВСЕ РАБОТАЕТ!!!!!!!!!!

...
я так понимаю, писать в любом случае нужно с 1000, пустое место никто же генерить не будет.. :)
теперь понятно как BIN в SAV переделать. (с раздуванием его если он не с 1000)

Hunta
06.10.2018, 19:13
я так понимаю, писать в любом случае нужно с 1000
По правильному, использовать .PSECT (неименованные или именованные), линкер сам всё сделает, но это если родные MACRO-11 и LINK-11...

S_V_B
06.10.2018, 19:15
/* линкер сам всё сделает, */
Я говорил про PDPy11....

....

еще бы что-то вроде #difine сделать, и зафигачить типа rt_11.inc

#define .EXIT EMT 350
#define .TTYOUT EMT 341
...

хотя для некоторых ЕМТов вроде блоки параметров нужны..

Hunta
06.10.2018, 20:02
Я говорил про PDPy11....
В том то и проблема. Программирование под RT-11 (как и любую другую операционку PDP-11) - это определённые правила, принципы и подходы. Родной софт об этом знает. А вот кросс-средства... Так что есть риск (хоть и не обязательно), что будете разгребать проблемы кросс средств.
Кстати, вопрос - а эти кросс средства макросы поддерживают?

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


хотя для некоторых ЕМТов вроде блоки параметров нужны
Я бы сказал, что не для некоторых, а для подавляющего большинства. И проще было бы взять (если есть поддержка макросов) готовый вариант из SYSMAC.SML

Manwe
06.10.2018, 20:48
#define .EXIT EMT 350
#define .TTYOUT EMT 341Такого не сделано, на БК оно вряд ли кому нужно - все пишут "EMT 36", "EMT 16" и не парятся с переопределениями. Я обычно в комментариях пишу что делает EMT, но по-моему все и так помнят.

S_V_B
07.10.2018, 06:10
/* все пишут "EMT 36", "EMT 16" */
В RT-11 ЕМТов на порядок больше чем на БК, но это мелочи, вы главное под Sublime компиляцию сделайте и будет мне счастье :)

Manwe
07.10.2018, 10:37
вы главное под Sublime компиляцию сделайте и будет мне счастье :)уже сделали, можно качать. Почитай там ещё в документации про project mode - может быть пригодится.

S_V_B
07.10.2018, 12:45
Файл SAV создается но вываливаетс сообщение:
https://yadi.sk/i/dotZJVM8ZqGZ0Q
что бы это значило?

Hunta
07.10.2018, 14:41
что бы это значило?
Может, не none, а какой-нибудь null? :)

Manwe
08.10.2018, 16:13
Может, не none, а какой-нибудь null? :)почти :) Не "none", а "None". Качайте заново :)

S_V_B
08.10.2018, 16:36
спс.

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

Everything works great! :)

S_V_B
09.10.2018, 17:16
В PDPy11 можно писать двоичные числа?
А еще бы DIV и MUL ;)

Hunta
09.10.2018, 18:40
^B0101010110101010
И DIV и MUL (в принципе - зависит от проца) есть. А ещё FADD, FSUB, FDIV, FMUL ;)

Но это опять же - если родной MACRO-11.
В котором можно (при некотором шаманстве ;) ) так (приведённый пример под RSX, но аналогично можно и под RT):



; 00021
.INCLUDE "LB:[MACROS]MACROS.MAC"

MODULE CommonUCS, MNAME=CUCS, VER=03, LIBR=YES, COMM=<Common User Code Set>

.REM %
------------------------------------------------------------
| Copyrigth (c) 1994 by WAS, Saratov, Russia. |
| All rights reserved. |
------------------------------------------------------------

Автор: Хунта, г. Саратов, 9 января 1994 г.

Функция: перекодировка ASCII в другие кодировки
в текстовых файлах.

Замечание: в случае ошибок в операциях OPEN, GET, PUT
или CLOSE для вывода сообщений об ошибках
используется программа "МО".
Сама программа, а также ее исходный текст
могут быть получены у автора (г. Саратов).

Изменения: 6 мая 1988 г. - исходная версия V01.01
28 июня 1988 г. - добавлен код для V01.02
multi-buffering FCS-11
20 декабря 1988 г. - добавлено использование VX0103
big-buffering FCS-11
9 января 1994 г. - common версия: WAS.02
15 января 1994 г. - добавлена возможность WAS.03
коммандной строки в виде
file1=file2
%

; Variants

;
; MBF = 1 - один буфер для файла
; MBF >= 2 - n буферов для файла
; (только для FCS-11 с поддержкой multi-buffering)
;
MBF=2.

;
; OBS = 1 - 512.-ти байтный буфер
; OBS >= 2 - n*512.-ти байтный буфер
; (только для FCS-11 с поддержкой big-buffering)
;
OBS=20.

;
; E$GCML = 0 - использовать стандартный GCML
; E$GCML = 1 - использовать расширенный GCML
;
E$GCML=0

;;;;

.IIF NDF MBF MBF=1
.IIF LE MBF-1 MBF=1
.IIF NDF OBS OBS=1
.IIF LE OBS-1 OBS=1
.IIF NDF E$GCML E$GCML=0

;;;;

FROM SYSMAC IMPORT DIR$, ALUN$, QIOW$
FROM SYSMAC IMPORT GREG$S, EXTK$S, SDRC$S, STSE$S, WSIG$S
FROM SYSMAC IMPORT FCSMC$, FCSBT$, FDOF$L, FSROF$
.IIF EQ E$GCML FROM SYSMAC IMPORT GCMLD$, GCMLB$, GCML$
.IIF NE E$GCML FROM SYSMAC IMPORT EGCMI$
FROM SYSMAC IMPORT CSI$, CSI$1, CSI$2

FROM SYSLIB.QIOSYM IMPORT IE.UPN, IE.EOF, TF.CCO
FROM SYSLIB.VCTDF IMPORT $DSW, .FSRPT

FROM SYSLIB.FCSTYP IMPORT .FCTYP
FROM SYSLIB.RQLCB IMPORT $RLCB

FROM MAIN IMPORT $CTAB

;;;;

EXPORT QUALIFIED CUCS

;;;;

MAXD = 1 ; макс. вложенность ККФ
CLUN = 1 ; lun ввода комманд
ILUN = 2 ; lun входного файла
OLUN = 3 ; lun выходного файла
MXRLEN = 256. ; макс. длина строки в файле

FCSMC$
FCSBT$
FDOF$L
FSROF$ DEF$L

.IIF NE E$GCML EGCMI$
GCMLD$

CSI$

;
; Constants
;
NBF1=3 ; simple version
NBF2=<OBS>*2+1 ; big only
NBF3=<MBF>*2+1 ; multi only
NBF4=<MBF*OBS>*2+1 ; big & multi-buffering FCS-11
SPSZ1=NBF1*<512.+S.BFHD>
SPSZ2=NBF2*<512.+S.BFHD>
SPSZ3=NBF3*<512.+S.BFHD>
SPSZ4=NBF4*<512.+S.BFHD>

FSRSZ$ 0

$PRINT

$IDATA
GREG:
INP:
BUF: .LIMIT
.=INP
.BLKB MXRLEN
.EVEN

PROCEDURE INIT
$PDATA
CALUN: ALUN$ CLUN, TI, 0
IALUN: ALUN$ ILUN, SY, 0
OALUN: ALUN$ OLUN, SY, 0

.IIF NE FT.BBF-2 .ERROR
.IIF NE FT.MBF-4 .ERROR

FCSTYP: .WORD SPSZ1 ; simple
.WORD SPSZ2 ; FT.BBF
.WORD SPSZ3 ; FT.MBF
.WORD SPSZ4 ; FT.BBF & FT.MBF
$IDATA
QINIT: .WORD 0
BEGIN
IF QINIT EQ #0 THEN
DIR$ #CALUN
DIR$ #IALUN
DIR$ #OALUN
MOV @#.FSRPT, R1
IF RESULT IS EQ THEN
BPT
END
IF A.DFUI(R1) EQ #0 THEN
FINIT$ ; инициализация FCS-11
END
CALL .FCTYP ; получить тип FCS-11
BIC #^C<FT.BBF!FT.MBF>, R1
.IIF NE FT.BBF-2 .ERROR
.IIF NE FT.MBF-4 .ERROR
MOV FCSTYP(R1), R1 ; сколько надо памяти
MOV INP+2, R2 ; конец задачи по построению
MOV #GREG, R3 ; получить размер задачи в памяти
GREG$S , R3 ; от Executive'а
MOV G.RGRS(R3), R3
ASH #6, R3 ; в байты
SUB R2, R3 ; сейчас свободно
SUB R3, R1 ; требуемое-имеемое
ADD #77, R1 ; выравнивание
ASH #-6, R1 ; в кол-во 100(8) байтных блоков
EXTK$S R1 ; расширить
MOV #GREG, R1 ; получить новый размер задачи
GREG$S , R1 ; от Executive'а
MOV G.RGRS(R1), R1 ; в R1
ASH #6, R1 ; в байты
SUB R2, R1 ; размер свободной памяти
MOV @#.FSRPT, R0 ; free memory listhead
CALL $RLCB ; отдать
INC QINIT ; инициализация проведена
END
RETURN
END INIT

PROCEDURE CALLMO
$PDATA
MO: .RAD50 /MO..../
BEGIN
SUB #11.*2, SP ; 11 пустых слов
MOV #3*400+1, R1 ; 3 - серьезность ошибки, 1 - ошибка директивы
IF R0 PL #0 THEN ; если R0 положительно, то
NEGB R0 ; сделать положительным байт
INC R1 ; а ошибка - ошибка в/в
ELSE ; иначе
NEG R0 ; сделать положительным слово
END ; все
PUSH R0 ; второе слово - код ошибки
PUSH R1 ; первое слово - тип ошибки
MOV SP, R1 ; указатель на буфер посылки
LOOP ; цикл
SDRC$S #MO, R1, #1 ; послать сообщение MO....
IF RESULT IS CC LEAVE LOOP ; если все в порядке - покинуть цикл
MOV @#$DSW, R0 ; код ошибки - в R0
IF R0 NE #IE.UPN THEN ; если код не "нехватка динамической памяти", то
BPT ; запрос отладчика (или завершить задачу)
END ; все
WSIG$S ; подождать важное событие
END ; и повторить
STSE$S #1 ; ждем вывода сообщения
ADD #13.*2, SP ; очистить стек
SEC ; была ошибка и вызов CALLMO
RETURN ; возврат
END CALLMO

PROCEDURE FIERR
BEGIN
MOV IFDB+F.ERR, R0
BR CALLMO
END FIERR

PROCEDURE OIERR
BEGIN
PRINT <CommonUCS -- Открытие входного файла:>
BR FIERR
END OIERR

PROCEDURE GIERR
BEGIN
PRINT <CommonUCS -- Прочитать из входного файла:>
BR FIERR
END GIERR

PROCEDURE FOERR
BEGIN
MOV OFDB+F.ERR, R0
BR CALLMO
END FOERR

PROCEDURE OOERR
BEGIN
PRINT <CommonUCS -- Открытие выходного файла:>
BR FOERR
END OOERR

PROCEDURE POERR
BEGIN
PRINT <CommonUCS -- Записать в выходной файл:>
BR FOERR
END POERR

$IDATA
CSIBLK: .BLKB C.SIZE
.EVEN

IFDB: FDBDF$
FDRC$A FD.PLC!FD.INS, BUF, MXRLEN
FDOP$A ILUN, CSIBLK+C.DSDS, DFNB
FDBF$A , OBS*512., MBF
DFNB: NMBLK$ TXT, TXT, 0, SY, 0

OFDB: FDBDF$
FDRC$A FD.INS
FDOP$A OLUN, CSIBLK+C.DSDS, DFNB
FDBF$A , OBS*512., MBF

PROCEDURE CSI1
BEGIN
CSI$2 #CSIBLK, OUTPUT ; взять выходной
IF RESULT IS CC THEN
FDBF$R #IFDB, , , ,#FD.RAH ; Multi-buffering для чтения
OPNS$R ; открыть входноя файл
IF RESULT IS CC THEN ; если все ок, то
MOV #IFDB+F.FNB, R0 ; скопировать FDB FNB входного файла
MOV #OFDB+F.FNB, R1 ; в FDB FNB выходного файла
THRU R2 := #S.FNBW ; длина FNB в словах
MOV (R0)+, (R1)+ ; пересылка
END
FDBF$R #OFDB, , , ,#FD.WBH ; Multi-buffering для записи
OPNS$M ; открытие по FID'у
IF RESULT IS CS THEN ; если есть ошибка, то
CLOSE$ #IFDB ; закрыть входной FDB
CALLR OOERR ; вызвать MO....
END ; с ошибкой открытия выходного файла
ELSE
CALLR OIERR ; вызвать MO....
END ; с ошибкой открытия входного файла
ELSE
PRINT <CommonUCS -- Ошибка CSI-2 на выходном файле>
SEC
END
RETURN
END CSI1

PROCEDURE CSI2
BEGIN
CSI$2 #CSIBLK, INPUT ; взять входной
IF RESULT IS CC THEN
FDBF$R #IFDB, , , ,#FD.RAH ; Multi-buffering для чтения
OPNS$R ; открыть входноя файл
IF RESULT IS CC THEN ; если все ок, то
CSI$2 #CSIBLK, OUTPUT ; взять выходной
IF RESULT IS CC THEN
FDBF$R #OFDB, , , ,#FD.WBH ; Multi-buffering для записи
FDAT$R , IFDB+F.RTYP, IFDB+F.RATT, IFDB+F.RSIZ
OPNS$W ; открыть выходноя файл
IF RESULT IS CS THEN ; если есть ошибка, то
CLOSE$ #IFDB ; закрыть входной FDB
CALLR OOERR ; вызвать MO....
END ; с ошибкой открытия выходного файла
ELSE
PRINT <CommonUCS -- Ошибка CSI-2 на выходном файле>
SEC
END
ELSE
CALLR OIERR ; вызвать MO....
END ; с ошибкой открытия входного файла
ELSE
PRINT <CommonUCS -- Ошибка CSI-2 на входном файле>
SEC
END
RETURN
END CSI2

PROCEDURE CSI
$ASCII
PRMPT: .ASCII <15><12>/CommonUCS>/
PRMP.L=.-PRMPT
$IDATA
GCML:
.IIF EQ E$GCML GCMLB$ MAXD, UCS, INP, CLUN, , MXRLEN
.IIF NE E$GCML GCML: ECMLB$ , CLUN, MAXD, UCS, INP, MXRLEN
BEGIN
CSI$1 #CSIBLK, GCML+G.CMLD+2, GCML+G.CMLD ; проверить синтаксис
IF RESULT IS CC THEN
IFB #CS.EQU OFF.IN CSIBLK+C.STAT THEN
CALL CSI1
ELSE
CALL CSI2
END
ELSE
PRINT <CommonUCS -- Ошибка синтаксиса коммандной строки>
SEC
END
RETURN
END CSI

PROCEDURE CUCS
BEGIN
CALL INIT

; MOVB #GE.COM!GE.IND!GE.SIZ, GCML+G.MODE ; умолчание

LOOP
GCML$ #GCML, #PRMPT, #PRMP.L ; получить коммандную строку
IF RESULT IS CS THEN ; если ошибка
IFB GCML+G.ERR NE #IE.EOF THEN ; и ошибка - не ^Z
PRINT <CommonUCS -- Ошибка получения коммандной строки>
END
RETURN
END

IF GCML+G.CMLD NE #0 THEN ; не пустая строка
CALL CSI
IF RESULT IS CC THEN
REPEAT
GET$ #IFDB ; очередная запись
IF RESULT IS CS THEN ; если ошибка
IFB IFDB+F.ERR NE #IE.EOF THEN ; и не eof
CALL GIERR ; вызвать MO....
END
SEC
ELSE
MOV IFDB+F.NRBD+2, R0 ; адрес записи
MOV IFDB+F.NRBD, R1 ; ее длина
MOV R0, R2 ; сохранить
MOV R1, R3 ; в R2 и R3
IF RESULT IS NE THEN ; пустая строка - ничего не делать
THRU R1 ; конвертирование
CLR R5
BISB (R0), R5
MOVB $CTAB(R5), (R0)+
END
END
PUT$ #OFDB, R2, R3 ; вывести в файл
IF RESULT IS CS THEN ; если ошибка
CALL POERR
END
END
UNTIL RESULT IS CS
CLOSE$ #IFDB
CLOSE$ #OFDB
END
END
END
END CUCS

END CommonUCS

.END

S_V_B
09.10.2018, 18:43
Да я все по PDPy11...

Hunta
09.10.2018, 18:46
Да я все по PDPy11
Да я понимаю :) Просто, насколько я понимаю, в нём не всё реализовано и самое главное, похоже нет поддержки макросов. А это как раз самое полезное и ценное :)
У DEC, кстати, был вариант ассемблера без поддержки макросов - назывался PAL-11.

Manwe
09.10.2018, 20:39
Просто, насколько я понимаю, в нём не всё реализованоДля БК-0010/11 - всё. Даже больше. Есть команды STEP и START.


и самое главное, похоже нет поддержки макросов. А это как раз самое полезное и ценное :)Есть макрос .REPEAT - самый полезный. А какие ещё считаются полезными?

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


В PDPy11 можно писать двоичные числа? А еще бы DIV и MUL ;)Пока нет.

Hunta
09.10.2018, 23:03
А какие ещё считаются полезными?
Зависит от программиста. Чего в принципе можно достичь - показал пример кода.
И ещё. Ценность представляют не сами макросы (зашитые в ассемблер), а то, что их можно писать самому.

Manwe
09.10.2018, 23:41
Чего в принципе можно достичь - показал пример кода.это уже на каком-то другом языке пример кода :)

Hunta
10.10.2018, 06:26
это уже на каком-то другом языке пример кода
Это пример того, чего можно достичь средствами, стандартными для MACRO-11 :) В исходном варианте макросов (от DEC) были структурные операторы (типа IF THEN, WHILE, LOOP и т.п.), я (в тот период увлекался MODULA-2) добавил общее оформление в стиле MODULA-2 - MODULE, FROM ... IMPORT, PROCEDURE, ну и у меня ещё были макросы кросс-трансляции (что бы работало и в RT и в RSX) - типа PRINT. Кроме того (в этом примере нет) были ещё макросы для выделения места под рабочие переменные (которые не инициализировались - то есть использовались операторы типа .BLKW, а не что то типа .WORD 123456) без выделения места в выходном файле (SAV или TSK), а с использованием динамической памяти. В общем (в первую очередь за счёт того, что стали не нужными локальные метки типа 123$ и код стал более наглядным) скорость написания кода возросла у меня тогда на порядок :)

Manwe
10.10.2018, 10:09
скорость написания кода возросла у меня тогда на порядок :)Да, это хорошо. Только скорость чтения получившегося кода сторонним программистом упала :) Я вот с ходу не въехал. А обычные БК-шные исходники из Turbo8 без проблем читаю.

Hunta
10.10.2018, 10:39
Только скорость чтения получившегося кода сторонним программистом упала
Ну это примерно как с новым (хотя тут и не совсем новый) языком программирования. Даже мне пришлось вспоминать - как писать - по прошествии лет так двадцати. Хотя в плане читабельности и понимабельности - никаких проблем - структурные операторы и уменьшение количества меток-операторов перехода - делают своё дело :)

И код, который опять периодически пописываю под УК-НЦ - КВАНТ (а скоро и под БК-0011М) - использует эти макросы - не так уж много времени на хобби, а тут реальное ускорение :)

konst_st
12.10.2018, 15:14
Я давно (еще во времена работы с 51-м микроконтроллером) написал простенький препроцессор ассемблерных файлов, в котором решил проблему со структурностью и локальными метками ассемблера. В последствии оказалось что этот препроцессор подошел ко всем архитектурам (ассемблерам) с которыми мне приходилось и приходится работать с минимальными модификациями (а чаще вообще без модификаций).
Суть в том, что в место меток я использую конструкции вида:


-----------------------------------------------
{
br !o1 ; Выйти на один уровень вверх
}
; т.е. сюда
-----------------------------------------------
; т.е. сюда
{
br !o1p1 ; Выйти на один уровень вверх и на один шаг назад
}
-----------------------------------------------
{
br !o1n1 ; Выйти на один уровень вверх и на один шаг вперед
}
{
; Тут может быть любой код
}
; т.е. сюда
-----------------------------------------------
br !n1 ; На один шаг вперед
{
; Тут может быть любой код
}
; т.е. сюда
-----------------------------------------------
; т.е. сюда
{
; Тут может быть любой код
}
br !p1 ; На один шаг назад
-----------------------------------------------

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

Препроцессор сам расставляет локальные метки, комментирует фигурные скобки и заменяет конструкции типа !o1, !p1, !n1, !o1p1, !o1n1 на локальные метки, которые он расставил.
Я, если пишу на асме, то только с этим препроцессором. Код и пишется и читается на много легче.

Пример кода:


FEvent_Wait_For_Proc:
{
cmp #16,Y0
bhs !n1
{
move #$8000,Y1
lsrr Y1,Y0,Y1
push_first Y1
lea (R2+2)
push_last R2
{
dis_int
move X:(R2),Y0
and Y1,Y0
bne !n1
{
jsr FDeActivate_Cur_Proc
ena_int
jsr FSwitch_From_Cur_Proc_L_H
move X:(SP-1),Y1
move X:(SP),R2
jmp !o2p1
}
}
pop R2
pop Y1
rti
}
{
cmp #32,Y0
IF DEBUG
blo !n1
{
dis_int
{
debug
bra !o1p1
}
}
ELSE
bhs !o1
ENDIF
sub #16,Y0
move #$8000,Y1
lsrr Y1,Y0,Y1
push_first Y1
lea (R2+3)
push_last R2
{
dis_int
move X:(R2),Y0
and Y1,Y0
bne !n1
{
jsr DeActivate_Cur_Proc
ena_int
jsr Switch_From_Cur_Proc_L_H
move X:(SP-1),Y1
move X:(SP),R2
jmp !o2p1
}
}
pop R2
pop Y1
}
rti
}

Если интересно, могу кинуть исходники препроцессора.

Hunta
12.10.2018, 19:00
Пример кода:
Обратите внимание, что в моём примере вообще нет операторов перехода (и следовательно - меток)


в котором решил проблему со структурностью
Я бы так не сказал

konst_st
12.10.2018, 20:01
Обратите внимание, что в моём примере вообще нет операторов перехода (и следовательно - меток)
В том то и суть, что в моем примере - это все тот же ассемблер со всеми его инструкциями перехода, но все же появляется некоторая структурность кода и не нужно проставлять метки и придумывать им имена. Так же за счет структурности (в том числе и визуальной) намного проще найти куда указывает переход, чем искать в коде метку с нужным названием.
Так же плюсом того что нет привязки к конкретным инструкциям (мнемонике) является то, что этот препроцессор можно с легкостью использовать для разных архитектур.
В общем я никому ничего не навязываю, просто делюсь собственным опытом :)

Hunta
12.10.2018, 20:11
намного проще найти куда указывает переход
Через некоторое время использования - возможно, мне с ходу было неочевидно, а уж вариант br !o3n5 и необходимость считать....
Сравните с моим вариантом и действительно визуальной очевидностью - что и куда пойдёт - вообще без команд перехода

konst_st
12.10.2018, 20:28
а уж вариант br !o3n5 и необходимость считать....
Что касается !o3 то найти не проблема если каждый уровень вложенности сдвигать на определенное число пробелов.
Что касается !n5 и !p5 то на практике такие конструкции вряд ли будут использоваться. В основном !n1 !p1, реже !n2 !p2, ну и совсем редко !n3 !p3.
Если нужно перепрыгнуть (обойти) несколько (скажем 5) инструкций, то эти 5 инструкций выделяются фигурными скобками в отдельный блок, который уже будет обходится как !n1
Пример конструкции if () {} else {}:


tst R0
bne !n1 ; if (R0 == 0)
{
mov R1,(R4)+
mov R2,(R4)+
mov R3,(R4)+
br !o1n1
} ; else
{
mov R1,(R0)+
mov R2,(R0)+
mov R3,(R0)+
}


Пример циклов:


mov R0,#40000
clr R1
mov R2,#20000
{ ; do
mov R1,(R0)+
sob R2,!o1p1
} ; while (R2)


Извиняюсь если с мнемоникой чего напутал, давно под DEC ничего не писал.

Hunta
12.10.2018, 20:36
И сравните с


if R0 eq #0 then ; будет TST, а не CMP
mov R1,(R0)+
mov R2,(R0)+
mov R3,(R0)+
else
mov R1,(R4)+
mov R2,(R4)+
mov R3,(R4)+
end


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

И да, безусловно, привычные вещи - привычней :)

Manwe
20.10.2018, 15:07
Добавили в компилятор PDPy11 (https://github.com/imachug/PDPy11) команды MUL, DIV, ASH, ASHC. Плагин подсветки синтаксиса (https://gist.github.com/imachug/3ab11df5e91c8d815a8c63a76bb08b14) в Sublime Text обновили соответственно.
Двоичные числа теперь можно записывать в виде #B1101001101111010.
Также напомню, что для удобства введены команды PUSH и POP (заменяют MOV что-нибудь,-(SP) и MOV (SP)+,куда-нибудь).

gid
20.10.2018, 19:20
Двоичные числа теперь можно записывать в виде #B1101001101111010.
А как вы отличаете метку B1101 от двоичного числа 1101 ? По количеству нулей и единиц, идущих за префиксом B ? Или теперь просто запрещено делать метки, начинающиеся с буквы B и содержащие только цифры 0 и 1 ? Или адресация #МЕТКА просто не используется в ассемблере ?
Использовали бы синтаксис префиксов, принятый в MACRO-11:
^B - префикс двоичного числа
^C - префикс инвертирования выражения, следующего за префиксом
^D - префикс десятичного числа (почти не используется, т.к. используется суффиксная запись с точкой на конце числа)
^F - префикс плавающего числа
^O - префикс восьмеричного числа (тривиальный вариант, нужен на тот случай, когда директивами задана принудительная интерпретация по умолчанию чисел в десятичной системе)
Ну и можно расширить:
^H или ^X - префикс 16ричного числа

Manwe
20.10.2018, 21:43
Использовали бы синтаксис префиксов, принятый в MACRO-11Тогда лучше так (https://github.com/imachug/PDPy11/blob/master/docs.md). Это более современно, как в JavaScript, Pynton и C (http://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html).

Manwe
17.11.2018, 23:29
В компиляторе PDPy11 (https://github.com/imachug/PDPy11) появилась поддержка 32-разрядных чисел. Очень удобно!
Зачем это может понадобиться - читайте здесь (https://zx-pk.ru/threads/29759-extended-instructions-set-(eis)-mul-div-ash-ashc.html)

66948

Manwe
05.05.2019, 22:28
PDPy11 научился выдавать WAV. Теперь загрузка на реальную БК производится нажатием одной кнопки. Демонстрационное видео: https://t.me/bk0010_11m/4528

svinka
05.05.2019, 23:01
современный macro11 для linux-unix живет тут https://github.com/simh/simtools в подкаталоге /crossassemblers/macro11

gid
06.05.2019, 10:30
Кросс версия macro11 много где лежит, кроме этой я ещё пару форков на гитхабе видел. А вот кросс линкера нету. Как люди объектники после кросс macro11 в исполняемые sav превращают? Вручную относительные смещения вычисляют и подставляют в нужных местах чтоль? Или пишут только крайне примитивные программы, которым даже линковка не нужна?

svinka
06.05.2019, 11:07
А вот кросс линкера нету Может GNU линкером ld из состава binutils?
Сам не разбирался. Попал на первую страницу темы и ответил про то что есть форк под крылом simh

Manwe
02.06.2019, 03:16
PDPy11 (https://github.com/imachug/PDPy11) обзавёлся опцией make_wav, теперь на выходе компилятора можно получить wav-файл для загрузки через магнитофонный вход обычной командой Монитора БК («M» для БК-0010, «L» для БК-0011).

nzeemin
11.06.2019, 20:18
Может GNU линкером ld из состава binutils?
Насколько я понимаю, такой линкер работает только с результатом полученным от GNU-компилятора для pdp11, поскольку формат объектного модуля совсем другой.

Я очень неспешно (из-за нехватки времени и иногда желания) перевожу линковщик LINK на C/C++, вот этот проект -- https://github.com/nzeemin/pclink11
См. тему https://zx-pk.ru/threads/30666-pclink11-kross-linkovshchik.html

- - - Updated - - -

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

Hunta
11.06.2019, 21:29
В линковке с библиотеками есть одна интересная особенность
ЕМНИП, кто то из стандартных линковщиков от DEС делал только один проход. Как бэ не из RT. Опять же, как мне подсказывает память, поэтому порядок модулей в системной библиотеке был достаточно строго определённым. И с учётом того, как устроена библиотека объектных модулей в RT - её шансы повышаются

perestoronin
12.06.2019, 03:35
современный macro11 для linux-unix живет тут https://github.com/simh/simtools в подкаталоге /crossassemblers/macro11
Благодарю!

#macro11 -v
macro11 - portable MACRO11 assembler for DEC PDP-11
Version 0.4 (21 June 2015)
Copyright 2001 Richard Krehbiel,
modified 2009 by Joerg Hoppe,
modified 2015 by Olaf 'Rhialto' Seibert.
# uname -a
Linux 5.1.9-gentoo

svinka
26.07.2019, 11:45
полный набор утилит simtools (включая macro-11) для Debian/Ubuntu https://packages.debian.org/experimental/simtools

У меня установился на Lubuntu 18.04