PASM - Ассемблер для процессора Microdata 821/1600 (aka Multi-4 / Multi-20). Запуск: Pasm.exe File или Pasm_cb.exe File где File - название предварительно созданного файла на ассемблере. PASM всегда сначала пробыует открыть файл с исправленными ошибками, File.err Если не получается - открывает file.psm Если опять не получается - закрывается с ошибкой. После запуска создаётся файл File.pex - в случае удачной компиляции; исполняемый файл. File.err - в случае неудачной компиляции. В файле, в строках, начинающихся с символа "^" содержатся указания на ошибки. После исправления ошибок файл может быть вновь откомпилирован - переименовывать его или удалять сообщения об ошибках не требуется. File.pln - файл со списком значений меток Дополнительные файлы: boot_fast.exe генерирует файл для bootstrap loader телетайпа или быстрого считывателя запуск: boot_fast.exe File где File - исполняемый файл длинной длиной до 253 байт В случае удачи создаёт файл File.pbf, образ загрузочной ленты для перфосчитывателя ltape.exe генерирует [самозагружающуюся] (со встроенным абсолютным загрузчиком) ленту из исполняемого файла произвольного размера запуск: ltape.exe File [options=5B] где File - исполняемый файл произвольной длины Число в опциях - длинна пустой ленты между блоками Буква B в опциях означает, что лента делается самозагружающейся, со встроенным абсолютным загрузчиком. Для работы требуется также файл File.pln с таблицей меток (генерируется Pasm-ом) и образ абсолютного загрузчика loader.pbf для самозагружающихся лент. facit4070vc.exe распечатывает файл на подключённом перфораторе Facit 4070; Win/GUI ---------------------------------------------------------------------------------------- Описание ассемблера: Текст программы записывается в строках до 256 символов длинной. Количество блоков (обрабатываемых комманд) на одной строке не ограничено, но лучше всё же придерживаться разумных значений. 1). начало и конец блоков. ' - комментарий. строка, находящаяся справа от этого символа, игнорируется. Пример: ' Этот текст игнорируется ^ - ошибка. Строка, начинающаяся с этого символа, игнорируется и удаляется при компиляции. Пример: ^ Этот текст игнорируется и удаляется при компилляции '"' - начало строки символов ASCII. Блок, содержащийся между двумя символами '"' вставляется в программу как последовательность соответствующих ASCII символов. Многострочные строки не поддерживаются. Пример: "Начало строки @!%#! ' '' конец строки " ' ' и ',' - разделители. Могут находится между блоками в любом количестве, всегда игнорируются, разделяют стандартные блоки. Пример: Block1 , Block2 ,,, Block3 любой другой символ рассматривается как начало стандартного блока. Окончанием стандартного блока могут служить символы ' ', ',', '"' и конец строки. Стандартный блок может представлять собой комманду процессора, аргумент комманды, константу или метку. Планируется также реализовать блок подключаемого модуля, начинающийся с символа #. Подключаемый модуль формируется по тем же правилам, что и основной файл. Код подключаемого модуля встраивается в код программы в той точке, в которой находится соответствующий блок; указатели при этом настраиваются автоматически. Теретически, возможность реализована, но не отлажена. 2). Стандартные блоки. Стандартные блоки содержат метки, комманды процессора, комманды компилятора, константы и ссылки на метки. Стандартные блоки не чувствительны к регистру. Метки - блоки, заканчивающиеся на символ ':'. Определяют положение точек, на которые ссылаются комманды программы. Третьим с конца символом метки не может быть '_'. Метка не может быть трёхзначным блоком, совпадающим с мнемоникой процессора и четырёхзначным блоком, первые три знака которого совпадают с мнемоникой, требующей определения типа адресациии (коммандой работы с памятью). Также символ ":" может быть предпоследним в метке - в таком случае последним символом должна быть буква b, d или h определяющая формат записи метки в .pln файл Метка также может быть записана в форме "name:number_t2", где number_t2 - число в стандартной форме, которому будет приравнена метка name. Примеры: mark1: mark2:h mark3:300_h2 Мнемоники команд процессора - определены в описании процессора. К названию комманд, работающих с памятью, обязательно дописывается четвёртый символ - цифра, обозначающая тип адресации. При непосредственной адресации (m==7) комманд, требующих в качестве операнда слово, ассемблер всегда (вне зависимости от значения w) ожидает двухбайтный операнд; за совпадением длинны слова пользователь должен следить самостоятельно. Пример: INX, LDA7 1234_H2 Комманды компилятора управляют процессом компиляции. К ним относятся: #BEGIN=hex_h2#, где hex - шестнадцатиричный адрес - комманда, указывающая адрес в оперативной памяти, с которого загружается программа. START: - метка указывает на первый исполняемый байт. По умолчанию start=begin, программа запускается с первого байта. ? end - комманда окончания перфоленты (посмотрим, надо ли добавлять?) Константы могут быть записаны в следующих форматах: - двоичном (10110010_b1). знак '-' не поддерживается. - BCD (-119_сd) формате - число от 1 до 16 знаков '0' - '9', отрицательное число начинается знаком '-'. - десятичном (119_d2), отрицательное число начинается знаком '-' - шестнадцатиричном (D3_h3), знак '-' в начале числа обозначает единицу в старшем разряде. - Резерв памяти (123_r2). Знак '-' не поддерживается. В левой части записано количество слов (в десятичной системе), в правой - длинна одного слова. Соответствующая область заполняется нулями. - последняя цифра - длинна константы в байтах (1, 2, 3 или 4 для всех, кроме BCD, и любое число - для BCD). - Положительное число рассматривается как беззнаковое, при заполнении старшего бита ошибка не подаётся. Любой блок, не соответствующий ни одному из вышеперечисленных типов, рассматривается как ссылка на метку. На место ссылки на метку подставляется метка - в формате, предполагаемом предыдущей коммандой (в частности, при адресации относительно текущей точки берётся автоматически вычисляется смещение). Если формат неоднозначен, метка подставляется в непосредственном виде, в шестнадцатибитной форме. Метка может быть использована в формате "+number_t2$name" или "-number_t2$name" - при этом число, соответственно, прибавляется к метке или вычитается из неё (число может быть любого поддерживаемого типа). Пример: LD7A MARK1 -11001_B1$L1 ETHER: JMP1 ETHER ' В данном случае автоматически вместо значения ETHER будет подставлено смещение относительно THIS - то есть FE_H1