Программа оказалась (относительно) востребованной, уже год просят доработать, поэтому я возрождаю разработку.
https://github.com/alemorf/pdp11asmИзменения:5-01-2017 Добавил директиву include.
Последняя информация по кросс-ассемблеру:Команды программы
.INCLUDE "file"
Подключить файл
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 $", что идентично. Но не вместе же. Эту строку я поправил руками.