Представляю вам первую версию ассемблера для процессора КР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 команды интерпретируются как числовые метки. | 
 Open ID
Open ID Google
Google Mail.ru
Mail.ru VKontakte
VKontakte




 
 
 
 
2015-01-16 01:59 pm (UTC)
2015-01-16 02:08 pm (UTC)
Вообще никак не оптимизирует. Это же ассемблер. Но ни к коем случае не должен ничего оптимизировать.
> Вообще-то есть опенсорсные компиляторы, GCC и LLVM, например.
GCC и LLVM - это совсем другие вещи. А такого компилятора ассемблера нет совсем. А если и есть, то пусть будет еще один.
> Зачем изобретать велосипед?
Между прочим новые модели велосипедом, из новых материалов, с новой конструкцией разрабатывают и появляются постоянно.
2015-01-16 02:10 pm (UTC)
Ассемблеры вообще-то, компиляторами не называют. Ну тогда ладно, вопросы снимаются.
2015-01-16 02:17 pm (UTC)
2015-01-16 02:25 pm (UTC)
Компиля́тор — программа, выполняющая компиляцию[1][2][3].
Компиляция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера)
Исходник должен быть на языке высокого уровня.
Edited at 2015-01-16 02:25 pm (UTC)
2015-01-16 04:03 pm (UTC)
2015-01-16 04:50 pm (UTC)
2015-01-16 02:10 pm (UTC)
2015-01-16 02:15 pm (UTC)
2015-01-16 06:14 pm (UTC)
2015-01-16 02:07 pm (UTC)
2015-01-16 02:43 pm (UTC)
http://www.gnu.org/licenses/gpl-howto.h
Edited at 2015-01-16 02:44 pm (UTC)
2015-01-16 06:12 pm (UTC)
2015-01-16 06:15 pm (UTC)
2015-01-16 03:09 pm (UTC)
http://retrocmp.com/tools/macro-11-on-w
Ну и ссылка на известный форум:
http://zx-pk.ru/archive/index.php/t-206
2015-01-16 10:10 pm (UTC)
2015-01-16 09:48 pm (UTC)
2015-01-16 10:04 pm (UTC)
2015-01-16 10:06 pm (UTC)
2015-01-16 10:56 pm (UTC)
неа, не соберется. там полно микрософтизмов, начиная от 'safe' string functions и заканчивая попыткой работать с iostreams с wchar_t параметрами.
2015-01-16 11:24 pm (UTC)
По поводу safe я думал, это стандарт C++ новый такой.
2015-01-16 11:29 pm (UTC)
микрософт, похоже, единственный кто реализовал tr24731, пушо стандарт достаточно бестолковый.
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");
2015-01-16 11:50 pm (UTC)
в реальности же приходится бороться с чем-то вида:
err_t expandstr(char *template, char **env, char **result /*out*/) { char *res = malloc(...); for(char *text = segment_first(template); text!=NULL; text = segment_next(template)) { strcat(res,....); } }рецепт тут только один — явно отслеживать все размеры.
2015-01-17 06:35 pm (UTC)
https://mega.co.nz/#!E8NSmSJR!loNb57hOn
это где я остановился. там почти все пофикшено кроме wide strings, с ними оченно много кода надо писать, либо переделывать всю концепцию нафиг.
2015-01-17 10:53 pm (UTC)
Поставил Ubuntu 10. В комплекте нет C++, из инета автоматически не качается, так как "Больше не поддерживается". Скачал последнюю Ubuntu. Тормозит - ужас! Разрешение только 640x480. Хрен с ним, мне только проверить компиляцию. C++ в комплекте нет. Написал "sudo apt-get install g++" C++ не ставит, пишет миллион строк "Конфликтует...", "Зависит, но не будет установлен", "Рекомендуется, но не может быть установлен". А в конце требует переустановить Убунту. Начал качать Linux Mint 17, на последнем мегабайте упал FireFox. Сейчас качаю еще раз, но уже хромом.
Такие вот дела.
2015-01-17 10:57 pm (UTC)
но вообще убунта она такая, бардачная немного, поэтому я дебиан предпочитаю.
2015-01-17 11:37 pm (UTC)
2015-01-17 11:49 pm (UTC)
дальше можно с веткой external/build/linux работать обычным образом.
2015-01-18 07:12 am (UTC)
2015-01-18 09:20 am (UTC)