Вход

Просмотр полной версии : Простой кросс-ассемблер для PDP11 (Windows/Linux, opensource)



vinxru
08.05.2016, 15:50
https://github.com/vinxru/pdp11asm

Представляю простой кросс-ассемблер для PDP11. Боян, но всё же. Простой, потому что поддержку INCLUDE добавить так руки и не доходят. По просьбам трудящихся я пытался реализовать совместимость со многими трансляторами, поэтому получилось немного странно:

Команды программы

ORG N
.LINK N
Устанавливает адрес, куда будет выводится код после этой команды. По умолчанию используется адрес 0.

DB
.BYTE
Записать байты. Через запятую можно указывать числа, 'A' - код символа, "ABCD" - несколько кодов символов. Так же поддерживается конструкция N DUP(C) записывающая N раз байт C.

DW
.WORD
Записать слова.

.ASCII /text/
Записать текст.

.END
Игнорируется

.BLKB N
Вывести N байт 0.

.BLKW N
Вывести N слов 0.

name EQU value
name = value
Установить константу. Во всем файле name будет автоматически заменяться на value.

name:
Метка. Во всем файле name будет заменяться на адрес метки. Указывать : после метки не обязательно. Вместе с игнорированием пробелов и переносов строк, синтаксис ассемблера стал очень свободным. Хоть в одну строку пиши.

N:
Числовая метка. Область действия метки ограничивается символьными метками. Такая метка может быть использована только в командах условного перехода B? и SOB.

MAKE_BK0010_ROM "filename", start, end
Сформировать файл поддерживаемый эмулятором B2M. start, end - начальный и конечный адрес программы. Можно использовать метки.

MAKE_BINARY_FILE "filename", start, end
Выгрузить образ памяти в файл. start, end - начальный и конечный адрес. Можно использовать метки.

INSERT_FILE "filename", offset, size
Вставить двоичный файл. Можно вставить часть файла, задав размер и смещение в исходном файле.

ALIGN N
Выровнять адрес следующей команды на N-байт.

CONVERT1251TOKOI8R
Включить преобразование строк из кодировки 1251 в KOI8R.

CONVERT1251TOKOI8R OFF
Выключить преобразование строк из кодировки 1251 в KOI8R.

DECIMALNUMBERS
Далее все числа по умолчанию 10-ричные. В стандарте C.

DECIMALNUMBERS OFF
Далее все числа по умолчанию 8-ричные. В конце 10-чных чисел необходимо ставить точку.

INSERT_BITMAP1 "name", width, height
Вставить изображение преобразовав его в формат видеопамяти БК0010 2 цвета. Изображение должно быть в формате BMP 24 бита. width, height должны соответствовать размеру
изображения в файле.

INSERT_BITMAP2 "name", width, height
Вставить изображение преобразовав его в формат видеопамяти БК0010 4 цвета. Изображение должно быть в формате BMP 24 бита. width, height должны соответствовать размеру изображения в файле.

INSERT_BITMAP1T "name", width, height
Вставить изображение преобразовав его в NAND и OR маски 2 цвета. В качестве прозрачного цвета используется #FF00FF.

INSERT_BITMAP2T "name", width, height
Вставить изображение преобразовав его в NAND и OR маски 4 цвета. В качестве прозрачного цвета используется #FF00FF.

; text
// text
Комментарий

.
Адрес этой команды

Команды процессора без аргументов

HALT Останавливает ЦП
WAIT Останавливает ЦП до прерывания
BPT Вызов прерывания
IOT Вызов прерывания
EMT 0..255 Вызов прерывания
TRAP 0..255 Вызов прерывания
MARK 0..63 Вызов прерывания
RESET Перезагрузка процессора
RTI Выход из прерывания (Загружает PC, PS из стека)
RTT Выход из прерывания пошаговой отладки.
NOP Ничего не делает
CLC Сбрасывает флаг C
CLV Сбрасывает флаг V
CLZ Сбрасывает флаг Z
CLN Сбрасывает флаг N
СCC Сбрасывает все флаги
SEC Устанавливает флаг C
SEV Устанавливает флаг V
SEZ Устанавливает флаг Z
SEN Устанавливает флаг N
SCC Устанавливает все флаги
RET Синоним RTS PC

Команды процессора с одним аргументом

(B) описании значит, что существует две версии команды CLRB - обрабатывающей байты и CLR - обрабатывающей слова.

JMP r Переход по адресу
SWAB r Поменять старший и младший байты местами
CLR(B) r Записать 0
COM(B) r Инверсия (заменть все биты на противоположные)
INC(B) r Увеличить на единицу
DEC(B) r Уменьшить на единицу
NEG(B) r Изменить знак
ADC(B) r Увеличить на единицу, если C=1
SBC(B) r Уменьшить на единицу, если С=1
TST(B) r Сравнить с нулем
ROR(B) r Циклический сдвиг вправо через флаг C
ROL(B) r Циклический сдвиг влево через флаг C
ASR(B) r Cдвиг вправо, старший бит дублируется
ASL(B) r Cдвиг вправо, младший бит равен 0
SXT r Расширение знака. Если N=0 записывает 0, иначе -1
MTPS r Установка регистра флагов
MFPS r Чтение регистра флагов
CALL r Синоним JSR PC,

Аргументы команды

R0, R1, R2, R3, R4, R5, SP, PC Регистр. Все регистры 16 битные. 8 битные команды будут работать с младшими их половинами.
(REG) или @REG Значение по адресу
@(REG) Значение по адресу по адресу.
-(REG) Значение по адресу. Уменьшить регистр до выполнения команды на 1 для байта. И на 2 для слова.
@-(REG) Значение по адресу по адресу. Уменьшить регистр до выполнения команды.
(REG)+ Значение по адресу. Увеличить регистр после выполнения команды на 1 для байта. И на 2 для слова.
@(REG)+ Значение по адресу по адресу. Увеличить регистр после выполнения команды.
IMM(REG) Значение по адресу, который рассчитывается как сумма регистра и числа.
@IMM(REG) Значение по адресу по адресу, который рассчитывается как сумма регистра и числа.
#A Число или адрес переменной.
@#A Значение по адресу или переменная. Абсолютная адресация.
A Значение по адресу или переменная. Адрес относительно PC.
@A Значение по адресу по адресу. Первый адрес относительно PC.

Команды процессора с двумя аргументами

MOV(B) a, b Скопировать
CMP(B) a, b Сравнить A и B
BIS(B) a, b Логическое ИЛИ
BIС(B) a, b Логическое И-НЕ (B = B & ~A)
BIT(B) a, b Логическое И без сохранения результата
ADD a, b Сложение
SUB a, b Вычитание

Команды условного перехода

Могут переходить только в пределах -256..+254 байта, относительно адреса следующей команды. Числа указанные в аргументе команды интерпретируются как числовые метки.

BR imm Всегда
BNE imm Не равно (Z=0)
BEQ imm Равно (Z=1)
BGE imm Больше равно для знаковых типов (N^V=0)
BLT imm Меньше для знаковых типов (N^V=1)
BGT imm Больше для знаковых типов (Z|(N^V)=0)
BLE imm Меньше равно для знаковых типов (Z|(N^V)=1)
BPL imm Результат положительный (N=0)
BMI imm Результат отрицательный (N=1)
BHI imm Больше (C|Z=0)
BVC imm Нет знакового переполнения (V=0)
BVS imm Знаковое переполнение (V=1)
BHIS imm / BCC imm Больше или равно / нет переполнения (C=0)
BLO imm / BCS imm Меньше / переполнение (C=1)

Необычные команды процессора

JSR reg, a Вызвать подпрограмму (REG - только регистр, A - любой аргумент)
RTS reg Выход из подпрограммы (REG - только регистр)
XOR reg, a Исключающее ИЛИ (REG - только регистр, A - любой аргумент)
SOB reg, imm Цикл (REG - только регистр, IMM - адрес). Числа указанные в аргументе IMM команды интерпретируются как числовые метки.

Особенности

- Некоторая совместимость с транслятором MACRO11. Но макросов нет.

- Примитивная арифметика. Например текст 2+5-1 будет преобразован в число 6. Соответственно Label1 + 6 это адрес на 6 больше адреса метки Label1.

- Со скобками надо быть осторожнее, скобки вокруг аргумента так же обозначают режим адресации: (1+2) - это значение по адресу 3, (1+2)*1 - это значение 3.

- Числовые метки. Например "10:". Их область видимости ограничена символьными метками. И их можно использовать только с командами условного перехода: B? и SOB. Любое положительное число в аргументе этих команд интерпретируется как метка.

- При таком подходе любимая PDP-шниками команда "SOB R1, .-2" не работает, так как 2 интерпретируется как метка. Но благодаря исключению с отрицательными числами можно написать "SOB R1, .+-2". -2 в тут считается числом на уровне парсера. Похоже на костыль, но я не знаю как сделать красивее. (Знал, но проект давно остановлен и я опять забыл)

- По умолчанию числа 8-ричные. Что бы указать 10-чное число, необходимо в конец числа добавить точку. Например "16384.".

- C помощью команды DECIMALNUMBERS можно включить по умолчанию десятичные числа. Восьмиричные числа тогда начитаются с нуля, например 017666. Или можно добавить постфикс 17555o. Обратно включить по умолчанию 8-ричные числа можно командой DECIMALNUMBERS OFF.

- В одной строке может быть несколько команд. Перенос строки теперь не обязателен.

- Добавлены синонимы: RET = RTS PC, CALL = JSR PC.

- В примерах к компилятору игра Сапер.

- Команда .i8080 включает систему команд процессора Intel 8080 и можно писать программы для него. Это было сделано для написания прошивки для SMP компьютера на 8080 и ВМ1.

- Компилятор осилил исходники CP/M споткнувшись лишь на крайне странной строке "CCPSTACK:EQU $". Можно быть написать "CCPSTACK:" или "CCPSTACK EQU $", что идентично. Но не вместе же. Эту строку я поправил руками.

litwr
08.05.2016, 19:29
А чем не угодил кросс-макро11?

vinxru
09.05.2016, 01:16
уже не помню. Но когда я искал ассемблер и всех спрашивал, то ничего работоспособного под винду не нашел.

svofski
09.05.2016, 01:29
gnu binutils ;)
Правда, готовых под винду, конечно, нет. Но под mingw должно легко собраться.

Raydac
09.05.2016, 07:56
если нет include то можно просто в связке с JСP (https://github.com/raydac/java-comment-preprocessor) юзать который директивы в комментариях юзает

Terra
09.05.2016, 21:56
у меня в коде выдаёт синтаксическую ошибку на bvs, поборол так.

dec R1
beq loc_1160
.word 102404 ; bvs loc_1150 //выдаёт ошибку ***
ADD #167777, R1
mov R1, -(R4) ;44
br loc_1170 ;46

loc_1150: dec R0

loc_1152: movb (R0), -(R4)
movb -(R0), -(R4)
br loc_1120

loc_1160: movb -(R0), R2


INCLUDE тоже желательно, хотя при таком объёме текста и исполняемой программы, пока и не обязательно.

Ewgeny7
09.05.2016, 22:45
Я в этих делах полный дятел, но где находится pdp11asm.exe?
Пожелание "скомпилируй" примерно равно "пошел ты ...", ибо даже не знаю в чем это делается.
Крайне желательно, чтобы win7x64, а то мало ли...
Заранее спасибо :)

hobot
09.05.2016, 23:07
http://zx-pk.ru/threads/21599-krossassembler-i-obolochka-%28prislannye-materialy-dlya-arkhiva%29.html

vinxru
11.05.2016, 01:31
у меня в коде выдаёт синтаксическую ошибку на bvs, поборол так.

Хм. BVS я почему то не добавил. Теперь добавил.

Там еще один недочет со скобками был, поправил.

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


Я в этих делах полный дятел, но где находится pdp11asm.exe?
Пожелание "скомпилируй" примерно равно "пошел ты ...", ибо даже не знаю в чем это делается.
Крайне желательно, чтобы win7x64, а то мало ли...
Заранее спасибо

Скомпилил. В папке Release находится.

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

Да, кстати. Формат LST файла совместим с отладчиком эмулятора b2m.

b2m
11.05.2016, 09:46
Да, кстати. Формат LST файла совместим с отладчиком эмулятора b2m.
Просто замечательно! :)

DJs3000
11.05.2016, 10:36
А как можно собрать вот это?)

gid
11.05.2016, 16:54
А вот, кстати, у меня тоже вопрос возник. Если есть кросс-Макро11, то как им пользоваться? Он же obj файлы создаёт. Есть ли в природе кросс линковщик, который собирает из obj файлов исполняемый бинарник для РТ-11?
Или сложные проекты кросс средствами никто не собирает?
Про консольный эмулятор РТ11 для макро11 от Patrona мне известно, это единственное нативное средство собрать sav файл из исходников, но нужен именно кросс-Линк, для линковки.

hobot
11.05.2016, 21:56
это единственное
не единственное, можно ещё в эмуляторе ДВК Patrona в родной среде.



Про консольный эмулятор РТ11 для макро11 от Patrona мне известно
А что мешает использовать LINK он же с NTFS-папкой работает (так же как и эмулятор ДВК!), наберёте команду руками или бат файл нужный напишите и будет вам счастье )))

vinxru
12.05.2016, 12:06
А как можно собрать вот это?)

Можно доработать транслятор.

Я глянул файлы и заметил один конфликт с существующим компилятором. У меня любое некомпилируемое слово - это метка. Число - метка. Двоеточние необязательно и переводы строки игнорируются. Меня просили так сделать, потому что был какой то такой компилятор.

Вот например:


LABEL1 MOV R0, R1
MOV R2, R4 MOV R3, R6
2 MOV R4, R5
LABEL2 LABEL3 NOP NOP NOP LABEL 4 NOP NOP

А в файлах выше - любое число выводится как байт (аналог .BYTE или DB). Или слово.


TBIKLC: 0*2+TBPKL0,1*2+TBPKL0,2*2+TBPKL0,3*2+TBPKL0,4*2+TB PKL0
0*2+TBPKL1,1*2+TBPKL1,2*2+TBPKL1,3*2+TBPKL1,4*2+TB PKL1
0*2+TBPKL2,1*2+TBPKL2,2*2+TBPKL2,3*2+TBPKL2,4*2+TB PKL2
0*2+TBPKL3,1*2+TBPKL3,2*2+TBPKL3,3*2+TBPKL3,4*2+TB PKL3

Если совместить вольности всех ассемблеров, то получится какой то Форт. Что бы мы не написали - оно скомпилируется.

Еще и макросы прямо в код!

MOV #OV460,@#460
MOV #340,@#462
CALL PPSTAR
AR2TY #242
TY #60
TY #14
AR2TY #240
TY #66
AR2TY #241
TY #60
TY #35,#23.,#0,#2
RESTAR: MOV #50.,WERXOR
MOV #5,GORXOR

Это вообще что делает и как компилить?

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

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

Добавлю include. Перекинуть код из другого проекта - это не долго.

Добавлю режимы:
Включить/выключить перевод строки
Включить/выключить : в метках
Включить/выключить обязательное использование .DB

gid
12.05.2016, 14:51
наберёте команду руками или бат файл нужный напишите и будет вам счастье )))
Так и делаю. т.е. делал изредка, когда приперало. Просто при этом все мои исходники приходится приводить в строгое соответствие со стандартами макро11. А я не пользуюсь РТ11 и не пишу для неё, я на БКшке Андосом как самым простым средством пользуюсь. А кросс средства, если они идут в виде исходников, всегда под свои нужды допилить можно. И очень раздражает всего 6 символов в метке. Самоочевидные уникальные имена быстро заканчиваются.


Можно доработать транслятор.
До макро11 довольно много дорабатывать придётся, исходники выше - именно каноническое макро11.

У меня любое некомпилируемое слово - это метка. Число - метка.
Плохое решение, ставшее следствием необязательности двоеточия после метки.
И число не всегда должно быть меткой, в некоторых случаях оно должно быть числом - абсолютным адресом.
В зависимости от типа ассемблерной команды нужно по-разному парсить аргументы.
Например. В командах ветвления и SOB допускаются арифметические выражения с числами и глобальными метками или локальная метка.
В командах, где 6-битовые поля [адресация][регистр] типа TST, MOV и т.п. допускаются арифметические выражения с числами и глобальными метками, а локальная метка - ошибка компиляции. Если арифметическое выражение - просто одно число, - то это адрес, тип адресации 6 или 7 если есть '@'.
В командах типа EMT, MARK допускаются арифметические выражения с числами и глобальными метками (константными переменными), которые на данный момент уже определены, не определены - ошибка компиляции.
В арифметических выражениях не допускаются локальные метки, т.к. непонятно, как их от чисел отличать. Т.к. во многих ассемблерах локальной меткой считается любое слово, начинающееся с цифры и заканчивающееся двоеточием. И эта конструкция конфликтует с любым типом записи чисел, хоть префиксной, хоть постфиксной.

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


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

получится какой то Форт. Что бы мы не написали - оно скомпилируется.
И как правило, совсем не так, как ожидали. Так что лучше и не пытаться делать универсальный комбайн.


Число в аргументе команды это метка или смещение?
В командах ветвления - однозначно метка (в нормальных ассемблерах), иначе никак не отловить ошибку неверного перехода.

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


заменю локальные метки с чисел на числа с долларом
Лучше знак доллара внести в разрешённые символы для метки, считать его ещё одной буквой. Т.к. A$BLK1 - вполне себе легальное имя метки, как и 30$2$

litwr
13.05.2016, 18:06
А вот, кстати, у меня тоже вопрос возник. Если есть кросс-Макро11, то как им пользоваться? Он же obj файлы создаёт. Есть ли в природе кросс линковщик, который собирает из obj файлов исполняемый бинарник для РТ-11?
http://zx-pk.ru/threads/20626-kross-sredstva-dlya-programmirovaniya-pod-mp-1801-1806-588.html?p=803922&viewfull=1#post803922
Немного попилить и заработает с РТ, а для АнДОСа и большие проекты с ним собирал.

Terra
08.06.2016, 14:56
а как бы сделать так что-бы адреса в листинге были не шестнадцатиричные, а восьмиричные?

gid
17.01.2017, 11:57
Вот поправленный pdp11asm.
Исправлен опкод команды TRAP.
И адреса в листинге восьмеричные.
Для работы требуется VCRedist 2015
59444

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

Однако, пересмотрев разные кросс ассемблеры, я пришёл к выводу, что таки нужно писать свой кросс ассемблер, для себя.
В результате множества неудачных попыток сделать сделать нечто, я решил сделать хоть что-то. И похоже, что-то получилось BKTurbo8.rar (http://gid.pdp-11.ru/f/3.9.1703.5669/BKTurbo8.rar).
У меня были исходники ассемблера Turbo8, вот на их основе и сделан кросс ассемблер, со всеми ограниченными возможностями в виде отсутствия продвинутых арифметических выражений, и понимания только восьмеричных и десятичных чисел.
В архиве исходники и естественно, бинарники, очень краткая справка, как использовать и примеры использования.
Вот с примерами туго, первый пример - игра Miner из pdp11asm vinxru - это для сравнения, как оно делается там, и как тут. Ещё несколько игр: tetris (как же без него), xonix, race-play. И самое интересное, и ради чего были приложены усилия по созданию кросс ассемблера - дизассемблированные исходники музыкального редактора Rock Monitor 3.

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

DJs3000
18.01.2017, 04:27
Кто-нибудь может собрать исходники из 11 сообщения? Это исходники УКНЦ биоса, причем это более новая версия по сравнению с тем, что стоит во всех наших УКНЦ. Я уже давно прошу чтоб его собрали, но никто не может :)

gid
18.01.2017, 09:58
Кто-нибудь может собрать исходники из 11 сообщения?
Без инструкции по сборке этот набор разрозненных файлов может собрать только настоящий УКНЦшник, который знает, что из этого является отдельным sav файлом, а что надо слинковывать между собой, и как и в каком порядке слинковывать.
Эти файлы спокойно компилируются в obj в классическом макро11, только толку от этого ноль, когда не знаешь, что с ними дальше делать.

Alex_K
18.01.2017, 18:58
Никто и не соберет, т.к. комплект неполный. Есть исходники оригинального BIOS-а, даже с файлом линковки, но тоже не хватает некоторых файлов.

DJs3000
23.01.2017, 23:43
А если вот прям замарочиться и потугадумить над дизасмом текущей прошивки? Было бы очень круто иметь собирающийся биос из данных исходников. Это позволило бы добавлять новый функционал прям в биос или добавлять поддержку новых девайсов :)

litwr
11.02.2017, 23:36
Столкнулся информацией, которая возможно может быть полезна при разработке ассемблера. В ассемблере для РDР-11 для Юникс нет макросов и много чего полезного, но зато есть псевдокоманды jne, jlos, jeq, ..., которые раскрываются, если получится, в bne, blos, ..., а, если не получится, то в beq jmp, ... Этого не хватает в Макро-11.

Terra
15.02.2017, 20:55
в принципе если переход больше 400(8) байт асм должен выдавать ошибку, так что оптимизация в руках программиста :)

yevrowl
06.12.2025, 16:06
Новый адрес репозитория кода — https://github.com/purplesyringa/pdp11asm