МК90 - пишем программы на Си

Создано 8.06.2021 15:44, автор DiEitch

Многие коллекционеры и у нас, и за рубежом отлично знают: что такое МК90. Этот микрокомпьютер родом из Беларуси знают далеко за пределами нашей страны. И недаром - он является заветным лотом в коллекции из-за своей сравнительной редкости:

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

Справедливости ради надо отметить, что компьютер успел поработать на благо процветающей республики в виде электрокардиографа, измерителя радиоактивности и в других проектах, несмотря на свою космическую стоимость (вот только интересно: как же это он в космос не полетел? Космонавты были бы наверняка не против, учитывая его возможности в сравнении с МК52).

Сегодня мы напишем и запустим свою первую программу на Си для МК90. "Шта?! Может, на Бейсике?" - спросит внимательный читатель. Нет, именно на Си! И ничего удивительного, ведь Си - "родной" язык для PDP, а значит, и для этого микрокомпьютера.

Что же потребуется, чтобы написать и запустить нашу программу? Я не претендую на оригинальность, произвести кросскомпиляцию кода Си в ассемблер МК90 можно разными способами (в итоге, это именно кросскомпиляция, ибо код на платформе х86-64 мы преобразуем в код на платформе DEC PDP-11), я просто опишу здесь один из рабочих вариантов с хорошим результатом:

  • редактор текстовых файлов (а лучше programmers notepad);
  • эмулятор PDP-11 (эмулятор ДВК);
  • эмулятор RT11 (RT-11 Emulator);
  • образ диска RAFOS_С с компилятором Си;
  • плагин для TotalCmd или Far для работы с дисками RT-11;
  • эмулятор МК90;
  • библиотека для МК90 моего написания LIB90.MAC (в файле LIB90.OBJ);
  • файл старта start.mac (в файле START.OBJ);
  • некоторые функции и коды из DECUS C (обёртки функций REG.OBJ, преобразователи типов и др.);
  • моя утилита для копирования готовой программы на СМП по нужному адресу;
  • заготовка smp0.bin (отличается от стандартной модифицированным загрузчиком и защищённой от стирания зоной на СМП);
  • ещё может иногда понадобиться hex editor или подобный редактор в шестнадцатиричных кодах.

Итак, первым делом ставим редактор кода (у меня - programmers notepad).

Рисунок выше показывает, почему мой выбор пал на этот редактор: подсветка синтаксиса, поиск, нумерация строк по желанию и другие "примочки", характерные для IDE.

Следующим пунктом для доступа к диску RAFOS_С из TotalCmd или Far потребуется установить плагин. Для этого просто зайдите в архив (должен быть установлен архиватор) и Total Commander сам подхватит и установит:

Теперь можно получить доступ к диску RAFOS_С.

Плагин работает с диском как с обычной папкой: можно копировать, редактировать, удалять. При двойном нажатии (или нажатии Enter) на файле Си (если предварительно установить и настроить programmers notepad) он откроется для редактирования, как показано чуть выше.

Быстро набираем код (изучить возможности компилятора можно в файле CC.TXT) или открываем пример, в качестве которого можно взять файл RTC.C (тот, что я ниписал для проверки RTC в МК90). Сохраняем. Закрываем.

Обязательно дождитесь подтверждения от плагина по записи диска, иначе изменённые данные не сохранятся!

Далее надо запустить компилятор. Для этого запускаем файл pdp11.exe в папке эмулятора ДВК. Эмулятор при первом запуске потребуется настроить:

  • выбрать нужный режим default.cfg;
  • подключить диск с компилятором (как HD2).

Теперь присоединяем нужные диски и запускаем компилятор:

где, AS = Assign, HD2 = наш образ диска, DK = текущий диск, RU = Run, RTC = наш исходник на Си, -L = ключ подробного вывода при компиляции, подробности можно найти в файле compile.txt

После удачной компиляции (и оптимизации) обязательно закрываем эмулятор и находим на нашем диске файл XX.OBJ, где XX - имя нашего исходника на Си. Далее реализуем вторую фазу - линковка (компоновка) исполняемого кода.

Файл *.OBJ копируем в папку эмулятора RT-11 Emulator так как: 

Там же должны находиться и все другие необходимые файлы *.OBJ для компоновщика: START.OBJ, LIB90.OBJ, REG.OBJ. Эти файлы предварительно получаются в том же эмуляторе командой mac (macroassembler MACRO-11) из исходников на ассемблере *.MAC.

Примечание: команды в эмуляторе лучше запускать два раза (иногда команда не выполняется).

Теперь запускаем компоновщик и ловим ошибки (если они есть). Указываем параметры стека и все необходимые файлы библиотек.

В результате в папке эмулятора появится исполняемый файл *.SAV (описание формата в файле SAV_FORMAT.txt): START.SAV. Его каким-то образом нужно скопировать в образ модуля СПМ по определённому адресу. Для этого я написал утилиту, которая поддерживает 2 режима (короткий до 1.5кБ и длинный до 8кБ).

Для работы сразу надо выбрать режим, а потом задать приёмник (*.SAV) и получатель (smp0.BIN).

   

После чего надо очистить smp0.bin (CLEAR) от предыдущего исполняемого кода и записать в него новый START.SAV (COPY).

Примечание: утилита не меняет данных в области загрузчика, поэтому для использования нужно взять заготовку smp0.bin доработанную мной для размера кода с 1.5кБ до 8кБ или образ smp0.bin от Piotr Piatek из игры game of life для размера кода меньше 1.5кБ.

Для проверки программы можно воспользоваться эмулятором МК90.

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

PS: огромное спасибо всем авторам, чьи программы, исходные тексты и просто информация применялись при реализации данной задачи.

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

UPD.

Некоторые читатели написали мне в письмах, что я совершил упущение и не использовал линковщик из пакета эмулятор PDP-11 (эмулятор ДВК). Отвечаю им, что это не так, я несколько раз проверял этот линковщик и выяснил, что он работает с ошибкой. Собранный код в принципе работает, но не полностью. Как только я выясню, в чём дело, дам знать. А пока рекомендую использовать компоновщик link в RT-11 Emulator - он работает на 100% правильно.

Для тех, кто захочет найти ошибку самостоятельно, прилагаю готовую строку для компоновки RTC:

Хорошего дня.