Представляю вам первую версию ассемблера для процессора КР1801ВМ1. Этот процессор совместим с системой команд PDP11 и используется в компьютерах БК001x и ДВК. Отдаю скомпилированным под Windows, с исходниками и его можно скомпилировать под другие ОС. В комплекте игра. Лицензия GPL, но как это оформить, я пока не понял. Эмулятор-отладчик можно скачать тут.
Когда то давно я уже писал этот ассемблер. В LJ можно найти про это заметку. Но та версия была потеряна и я не мог опубликовать её исходники, так как несколько файлов были использованы из закрытого проекта. Несколько дней назад ко мне обратился Lasoft со словами: "Видел что ты написал компилятор для Windows, респект! Можешь как-то помочь, может исходники? я хочу попробовать его и если что доработать". И я решил переписать ассемблер заново, да так, что бы он был кросс-платформенным. Наверное не стоило работать бесплатно, ради одного человека, который и не обещал пользоваться и вообще просил исходники. Ну да ладно. Всего два вечера работы. И быть может эта программа пойдет в резюме.
Я знаю, что для PDP-11 стандартом является ассемблер MACRO11. Я его не видел и не трогал. И уверен, что мой ассемблер сильно не совместим с ним. Многое пока не реализовано. Из арифметики поддерживается только сложение и вычитание. Без скобок. Нет макросов, нет условной компиляции, нет include.
Ассемблер формирует BIN файл, который умеет запускать эмулятор B2M. Первые два слова - адрес загрузки, длина. Далее идет двоичный код. А так же формирует LST файл, который эмулятор B2M использует для отладки. В отладчике будут отображаться имена переменных и комментарии, что очень сильно облегчает работу. Но! Почему то LST файл используется только для самых первых строк программы, дальше эмулятор всё забывает. Надо разбираться.
Если кому то потребуются новые возможности, я безвозмездно доработаю ассемблер. А пока пусть будет так. Ну действительно, зачем дорабатывать то, что никому не будет нужно.
Ниже следует краткое описание всех команд ассемблера:
Команды программы
ORG N .LINK N | Устанавливает адрес, куда будет выводится код после этой команды. По умолчанию используется адрес 0. |
DB .BYTE | Записать байты. Через запятую можно указывать числа в формате: 10 - десятичный, 010 - восьмеричный, 0x10 - шестнадцатеричный, 10b - десятичный, '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 команды интерпретируются как числовые метки. |
32bit_me
2015-01-16 01:59 pm (UTC)
vinxru
2015-01-16 02:08 pm (UTC)
Вообще никак не оптимизирует. Это же ассемблер. Но ни к коем случае не должен ничего оптимизировать.
> Вообще-то есть опенсорсные компиляторы, GCC и LLVM, например.
GCC и LLVM - это совсем другие вещи. А такого компилятора ассемблера нет совсем. А если и есть, то пусть будет еще один.
> Зачем изобретать велосипед?
Между прочим новые модели велосипедом, из новых материалов, с новой конструкцией разрабатывают и появляются постоянно.
32bit_me
2015-01-16 02:10 pm (UTC)
Ассемблеры вообще-то, компиляторами не называют. Ну тогда ладно, вопросы снимаются.
ibnteo
2015-01-16 02:17 pm (UTC)
32bit_me
2015-01-16 02:25 pm (UTC)
Компиля́тор — программа, выполняющая компиляцию[1][2][3].
Компиляция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера)
Исходник должен быть на языке высокого уровня.
Edited at 2015-01-16 02:25 pm (UTC)
vinxru
2015-01-16 04:03 pm (UTC)
32bit_me
2015-01-16 04:50 pm (UTC)
archie_kot
2015-01-16 02:10 pm (UTC)
32bit_me
2015-01-16 02:15 pm (UTC)
j7k
2015-01-16 06:14 pm (UTC)
archie_kot
2015-01-16 02:07 pm (UTC)
congwangluobiji
2015-01-16 02:43 pm (UTC)
http://www.gnu.org/licenses/gpl-howto.h
Edited at 2015-01-16 02:44 pm (UTC)
vinxru
2015-01-16 06:12 pm (UTC)
j7k
2015-01-16 06:15 pm (UTC)
yellow_behemoth
2015-01-16 03:09 pm (UTC)
http://retrocmp.com/tools/macro-11-on-w
Ну и ссылка на известный форум:
http://zx-pk.ru/archive/index.php/t-206
vinxru
2015-01-16 10:10 pm (UTC)
nabbla1
2015-01-16 09:48 pm (UTC)
vinxru
2015-01-16 10:04 pm (UTC)
nabbla1
2015-01-16 10:06 pm (UTC)
ex0_planet
2015-01-16 10:56 pm (UTC)
неа, не соберется. там полно микрософтизмов, начиная от 'safe' string functions и заканчивая попыткой работать с iostreams с wchar_t параметрами.
vinxru
2015-01-16 11:24 pm (UTC)
По поводу safe я думал, это стандарт C++ новый такой.
ex0_planet
2015-01-16 11:29 pm (UTC)
микрософт, похоже, единственный кто реализовал tr24731, пушо стандарт достаточно бестолковый.
vinxru
2015-01-16 11:44 pm (UTC)
А стандарт мне понравился. Идея автоматически передавать размер буфера в функцию очень хороша. Как то так
template strcpy_s(char dest[destSize], char* src) { strcpy_s(dest, destSize, src); }
char buf[4];
strcpy_s(buf, "HELLO WORLD");
ex0_planet
2015-01-16 11:50 pm (UTC)
в реальности же приходится бороться с чем-то вида:
рецепт тут только один — явно отслеживать все размеры.
ex0_planet
2015-01-17 06:35 pm (UTC)
https://mega.co.nz/#!E8NSmSJR!loNb57hOn
это где я остановился. там почти все пофикшено кроме wide strings, с ними оченно много кода надо писать, либо переделывать всю концепцию нафиг.
vinxru
2015-01-17 10:53 pm (UTC)
Поставил Ubuntu 10. В комплекте нет C++, из инета автоматически не качается, так как "Больше не поддерживается". Скачал последнюю Ubuntu. Тормозит - ужас! Разрешение только 640x480. Хрен с ним, мне только проверить компиляцию. C++ в комплекте нет. Написал "sudo apt-get install g++" C++ не ставит, пишет миллион строк "Конфликтует...", "Зависит, но не будет установлен", "Рекомендуется, но не может быть установлен". А в конце требует переустановить Убунту. Начал качать Linux Mint 17, на последнем мегабайте упал FireFox. Сейчас качаю еще раз, но уже хромом.
Такие вот дела.
ex0_planet
2015-01-17 10:57 pm (UTC)
но вообще убунта она такая, бардачная немного, поэтому я дебиан предпочитаю.
vinxru
2015-01-17 11:37 pm (UTC)
ex0_planet
2015-01-17 11:49 pm (UTC)
дальше можно с веткой external/build/linux работать обычным образом.
kgbplus
2015-01-18 07:12 am (UTC)
vinxru
2015-01-18 09:20 am (UTC)