Утилита besm6-objdump теперь умеет преобразовывать бинарный файл от линкера в формат МЭСМ-6 oct, для загрузки в симулятор RTL. К примеру, компилируем файл hello.pas:
Сам я ещё не пробовал его выполнять - чёрт знает, всякие баги могут быть.
$ besm6-pascompl hello.pas hello.obj $ besm6-ld -D1 hello.obj -lpas -o hello.out $ besm6-objdump -O hello.out > hello.octПолученный файл hello.oct можно посмотреть здесь: https://gist.github.com/sergev/94d630f6a12032209ca8e5cb5d72757b
Сам я ещё не пробовал его выполнять - чёрт знает, всякие баги могут быть.
no subject
Date: 2019-06-02 03:48 pm (UTC)program test(output); var src, dst:@integer; begin src := ptr(77755B); dst := ptr(77756B); repeat dst@ := src@ until false; end.Код на Паскале читает SW-итчи и пишет в LED'ы.
Машинный код циклится на симуляторе, при этом нет обращений к адресам 77755 и 77756.
no subject
Date: 2019-06-02 09:00 pm (UTC)no subject
Date: 2019-06-03 02:52 am (UTC)Основная проблема была в функции P/BX паскалевской библиотеки. Она брала начальное значение для регистра стека из ячейки памяти 17B, где его хранит мониторная система Дубна. Я переделал, чтобы использовался адрес символа /END: он автоматически создаётся линкером.
По пути обнаружил и поправил пару мелких багов в линкере и objdump.
Попробуй аналогичным образом выдавать на UART.
Код после компилятора получается довольно компактный. Может быть даже получится написать бутлоадер целиком на Паскале.
no subject
Date: 2019-06-03 02:41 pm (UTC)Но вот этот - нет:
program test(); var src, dst: @integer; u0ctrl, u0data: @integer; begin src := ptr(77755B); dst := ptr(77756B); u0ctrl := ptr(77747B); u0data := ptr(77740B); u0ctrl@ := 33B; repeat dst@ := src@ until false; end.Циклится. Так и не доходит до бесконечного цикла. Делает много записей в нулевую ячейку.
Компилятору не нравится символ подчеркивания.
Есть ли в нем поддержка побитового AND, OR и XOR? Использовать операторы & и and тоже не получилось
program test(); const U0CTRL = 77747B; U0DATA = 77740B; var src, dst, tmp: @integer; procedure inituart(baudrate: integer); var reg: @integer; tmp: integer; begin reg := ptr(U0CTRL); tmp := 50000000 div baudrate; (* tmp := tmp and 777B; doesn't work *) reg@ := tmp; end; begin src := ptr(77755B); dst := ptr(77756B); inituart(115200); repeat dst@ := src@ until false; end.Этот код делает записи в 30000-е ячейки. Циклится и так же до "полезного" цикла не доходит.
no subject
Date: 2019-06-03 08:23 pm (UTC)Пересобери и переустанови библиотеку libpas.a. Вероятно, у табя старая версия.
no subject
Date: 2019-06-04 02:25 am (UTC)Сегодня попробую еще раз.
no subject
Date: 2019-06-03 09:02 pm (UTC)https://gist.github.com/sergev/845781124ccd3d653b6c2be75bdde241
Подчёркивание в именах не работает, действительно: исторический анахронизм. Обсудили это с Лёней, решили исправить.
Побитовые операции AND, OR и XOR работают для множеств, как умножение, сложение и MOD.
no subject
Date: 2019-06-04 07:49 am (UTC)no subject
Date: 2019-06-04 08:12 am (UTC)no subject
Date: 2019-06-03 02:43 pm (UTC)Да компактный. Уверен, что обойдемся только Паскалем.
no subject
Date: 2019-06-03 02:48 pm (UTC)А сейчас уже можно как-то слинковать объектный файл на паскале с объектным файлом БЕМШа?
no subject
Date: 2019-06-03 07:51 pm (UTC)С Мадленом таких проблем нет. Вот работающий пример:
код на Паскале: peekpoke.pas
функция на Мадлене с одним параметром: peek.madlen
процедура на Мадлене с двумя параметрами: poke.madlen
Там же есть Makefile, который показывает, как компилить и линковать.
no subject
Date: 2019-06-04 11:03 am (UTC)