Лицов Е.А. BLITS SoftWare Inc. Бутырский Д.В. (c) Copyright 1992,93 Єµµµµµµµµµµµµµё ·Е.А.Лицов · ·Д.В.Бутырский· Єµµµµµµµµµµµµµµµµё ·(c) 1993 · · ОПИСАНИЕ ЯЗЫКА Ґё ¦µµµµµµµµµµµµµ№ · ·· · ALMIC v5.2 ·· ¦«µµµµµµµµµµµµµµµ№· ¦µµµµµµµµµµµµµµµµ№ Данный документ представляет собой руководство по языку программирования ALMIC ( версия 5.2 ) и предназначен для поль- зователей БК-0010(-01). Язык ALMIC создан для решения математических и инженерных задач в диалоговом режиме. В настоящем руководстве приведены сведения о синтаксисе операторов и функций языка. 1. ОБЩИЕ СВЕДЕНИЯ Текст исходной программы состоит из последовательности строк. Каждая строка представляет собой один оператор. Опера- торы языка ALMIC обычно строятся из определенных ключевых слов, которые используются совместно с основными элементами языка: константами, переменными и выражениями. 2. АЛФАВИТ ЯЗЫКА Основными символами языка ALMIC, образующими его алфавит являются: - арабские цифры - буквы латинского алфавита - символы: .$,@! - ограничители: +-*\/:,[]=()^ - коды пробела (1,...,10,11,40) - перевод строки (код 12) - зарезервированые слова: все наименования функций , а также - операторы: INItial,INTeger,FLOat, LABel,GET,TYPe,TESt,COMp,FOR,CONtinue, POSition, LOCate, IF,GOTo,CALl,WAIt,DATa Переменные могут иметь имена, совпадающие с именами опе- раторов. К преречню зарезервированных слов ALMICа следует добовить ассемблерные наименования регистров общего назначения: R0..R5,PC, SP. При использовании переменных с такими названи- ями вероятна неправильная интерпритация ассемблером текста программы. Допускается записывать текст программы как заглавными, так и строчными символами. Вставки на ассемблере должны быть написаны только заглавными символами (это требование обяза- тельно только для операндов ассемблерных команд). Операторы определяются только по первым трем символам имени. При наличии вставок на языке Ассемблера, некоторые ассем- блерные команды (WAIT,CALL,COM с аргументом, содержащим скоб- ки, а также директивы задания параметров: МЕТКА=АДРЕС) будут интерпритироваться транслятором как операторы языка ALMIC. Для того, чтобы сообщить транслятору о том, что данный оператор не надо транслировать, поставьте символ подчеркивания перед ним, например: _wait,_HIM=10000,_COM R5. Транслятор, естественно, этот символ при обработке текста уберет, а ПЕРВОЕ слово написанное строчными буквами перепишет заглавными. 3. ИДЕНТИФИКАТОРЫ Идентификатор ALMICа - это последовательность букв, цифр и символов ".","$", начинающаяся с буквы или цифры. Идентификаторы служат для отождествления объектов прог- раммы: меток, подпрограмм и переменных. Каждый идентификатор может описывать лишь один объект программы. Имена переменных и подпрограмм должны начинаться с буквы, имена меток могут начи- наться как с буквы, так и с цифры. Максимальная длина иденти- фикатора - 3 символа (т.к. работа в паре с МИКРО.10К). Индентификатор не должен совпадать с зарезервированными словами системы. 4. ОСНОВНЫЕ ЭЛЕМЕНТЫ Основными элементами в ALMICе являются константы, пере- менные и выражения. 4.1 КОНСТАНТЫ Константа - это неизменяемая при выполнении данной прог- раммы величина с фиксированным значением. Константы могут быть трех типов:целые, плавающие и сим- вольные. 4.1.1 КОНСТАНТЫ ЦЕЛОГО ТИПА Целая десятичная константа представляет собой последова- тельность десятичных цифр, которой может предшествовать знак "-". Диапазон значений: -32768..32767. ПРИМЕР:-1982,11,1209,0 4.1.2 КОНСТАНТЫ ПЛАВАЮЩЕГО ТИПА Имеют две формы записи: с фиксированной запятой и с пока- зателем. Диапазон значений: +-(.1E-9830..1E9830). Плавающие числа в ALMICе имеют 10 значащих разрядов. Точ- ность плавающей арифметики 4.6566129E-10 ПРИМЕР: 12000 -12000. -12Е3 -1.2Е-3 -.5 4.1.3 КОНСТАНТЫ СИМВОЛЬНОГО ТИПА Последовательность символов ASCII, завершающаяся байтом 0. Задаются командами ассемблера. ПРИМЕР: .b:14,12,.A:HELLO! .e 5. ПЕРЕМЕННЫЕ В языке ALMIC имеется следующий набор переменных: целые, плавающие и символьные. 5.1 ПЕРЕМЕННЫЕ ЦЕЛОГО ТИПА Должны быть определены оператором INTEGER в начале прог- раммы. Последний символ имени переменной целого типа должен отличаться от символа "$". Константы и переменные целого типа занимают в памяти 2 байта. ПРИМЕР: I,II,J12,JCU Переменные целого типа могут быть простыми и индексными. В качестве индекса может использоваться указатель, простые пе- ременные целого типа или константы целого типа без знака. Записи i(0) и i указывают на одну и ту же переменную. ПРИМЕР: i(1),i(n),c2(@i),@b(3),@d(@i). Массивы целых чисел тоже определяются оператором INTEGER. Индексные переменные целого типа могут использоваться только в арифметических выражениях и операторе присваивания! Они не могут быть аргументами функций и операндами других опе- раторов! Так, например, для вывода значения индексной переменной требуется сначала присвоить ее значение простой переменной и распечатать значение простой переменной. Значение индекса хранится в R3 и сохраняется до объявле- ния следующего индекса. Все стандартные функции ALMICа (все функции, вызываемые с помощью TRAP-диспетчера, а также функции MUL, DIV, MOD, вызы- ваемые непосредственно, не изменяют значения этого регистра). Если значение индекса не изменяется, то допускается краткая форма записи, например: полная форма: краткая форма: n(j)=10-g(j)*3+h(j) n(j)=10-g(.)*3+h(.) a=n(j) a=n(.) 5.2 ПЕРЕМЕННЫЕ ПЛАВАЮЩЕГО ТИПА На имя переменной этого типа накладываются ограничения: первые два символа не должны совпадать с первъми двумя симво- лами любой переменной целого типа, последний символ должен от- личаться от символа "$". Значение переменной занимает в памят 6 байтов и храниться в ячейках, выделенных ей оператором FLOAT, или по адресу метки с именем этой переменной. Плавающие переменные бывают двух типов: простые и индек- сные. Индексные переменные используются для идентификации эле- ментов упорядоченных списков данных - массивов. Каждый элемент массива определяется именем переменной и индексом, взятым в круглые скобки. ЗнаЧение индекса определяет порядковый номер элемента массива. Индексом может быть константа или пфременноя целого типа без знака.В ALMICе допускаются только одномерные массивы данных плавающего типа. Многомерные массивы должны ре- ализовываться программными средцтвами. Не допускается наличи пробела между индексом и закрывающей скобкой. ПРИМЕР: X1S,Y,Z00,X(0),Y(Y),Z(Y),@Y(I),@R(@P). 5.3 ПЕРЕМЕННЫЕ СИМВОЛЬНОГО ТИПА Должны быть определены (зарезервирована память) средства- ми ассемблера (см. символьные константы). Последним символом имени должен быть символ "$", первые два символа не должны совпадать с первыми двумя символами любой переменной целого типа. Могут простыми, так и индексными. Применяются в операто- рах присваивания, в качестве аргументов функций преобразова- ния, в операторах ввода/вывода; могут передаваться при вызове процедур. ПРИМЕР: t$(i)=w$(1)+@w$(@j) i(2)=-val(t$(i))+10 get t$(i) type i,t$(i) call sub(i,x,w$(j)) 6. ВЫРАЖЕНИЯ Значением арифметического выражения является число соот- ветствующего типа. Простейшее выражение состоит из константы или переменной со знаком и без знака. Более сложные выражения содержат две или более констант и/или переменные и формируются с использованием арифметических операций и обращений к функци- ям. Все входящие в одно выражение переменные должны быть одно- го типа,за исключением аргументов функций INT и FLT и индек- сов. 6.1 ПРАВИЛА СОСТАВЛЕНИЯ АРИФМЕТИЧЕСКИХ ВЫРАЖЕНИЙ Обращение к функциям может быть только первой операцией выражения. Перед первым термом выражения может стоять знак "-". Все арифметические операции имеют одинаковый приоритет! Аргументами функций INT и FLT должны быть переменные, со- ответственно, плавающего и целого типа. Аргументами других функций могут быть арифметические выражения, в которых отсут- ствуют обращения к функциям. Все отличающиеся от знаков ариф- метических операций ограничители игнорируются. Из записанных подряд (по ошибке) знаков операций воспри- нимается только первый, остальные - игнорируются. Скобки, кро- ме скобок функций и индексных переменных, игнорируются. 6.2 АРИФМЕТИЧЕСКИЕ ВЫРАЖЕНИЯ ЦЕЛОГО ТИПА Допускается использование констант и переменных (без ин- дексов) целого типа. Переменные плавающего типа могут исполь- зоваться как аргумент функции INT. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ ЦЕЛОГО ТИПА: + - сложение - - вычитание * - умножение / - деление \ - деление по модулю (остаток) ФУНКЦИИ ЦЕЛОГО ТИПА: INT() - преобразование в целый тип значения плавающей переменной. VAL() - преобразование символьной переменной в целый тип. ПРИМЕР: i(j)=-val(t$(k))*10+1 6.3 АРИФМЕТИЧЕСКИЕ ВЫРАЖЕНИЯ ПЛАВАЮЩЕГО ТИПА: Разрешено использование констант и переменных плавающего типа. Переменные целого типа могут применяться только в качес- тве аргументов функции FLT, индексов или показателей степени. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ ПЛАВАЮЩЕГО ТИПА: + - сложение - - вычитание * - умножение / - деление ^ - возведение в степень Показателями степени могут быть целые константы со знаком или без него, а также - переменные целого типа без знака. ФУНКЦИИ ПЛАВАЮЩЕГО ТИПА: FLT() - преобразование в плавающий тип значения целой переменной FIX() - выделение целой части числа NEG() - изменение знака ABS() - определение абсолютного значения SIN() - синус, аргумент - в радианах COS() - косинус ATN() - арктангенс, результат - в радианах EXP() - экспонента LOG() - натуральный логарифм SQR() - корень квадратный SGN() - знак выражения VAL() - преобразование в плавающий тип символьной переменной ПРИМЕР: x(i)=-val(t$)*5+z(i) Более подробные сведения о функциях приведены в документе "БИБЛИОТЕКА СТАНДАРТНЫХ ПОДПРОГРАММ". ПРИМЕРЫ: запись в ALMICе: традиционная запись: -1+X^2/Y-1+A ((-1+X)^2/Y)^-1+A X(0)+K*Y(J) (X(0)+K)*Y(J) µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ 6.4 ВЫРАЖЕНИЯ СИМВОЛЬНОГО ТИПА Разрешено использование переменных символьного типа, пе- ременные других типов могут применяться только как аргументы функции STR. ОПЕРАЦИИ СИМВОЛЬНОГО ТИПА + - операция конкатенации ПРИМЕР: T$(I)=T$+W$(I) 6.5 ФУНКЦИИ В ВЫРАЖЕНИЯХ Стандартное обращение к функциям в ALMICе подразумевает следующую последовательность операций: - функции преобразования типов - val(),int(),flt(),str(): аргументом функции может быть только переменная,а не выражение, источник и приемник имеют разные адреса, аргумент перед вычислением функции не пересылается по адресу приемника; ПРИМЕР: y=-flt(i)+1 ; i=int(x(j))+10/n - функции не связанные с преобразованием типов: аргументом функции могут быть выражения, аргумент пересылается по адресу приемника и функция вычисля- ется от аргумента по адресу приемника. ПРИМЕР: y=-sin(x(i)*j/pi) - x(i) пересылается в Y, Y умножается на J и делится на PI, затем вычисляется Y=SIN(Y), затем Y=-Y. Для лучшей диагностики ошибок в ALMIC предусмотрено сооб- щение: ОШИБКА 13 - в том случае, если под знаком функции пре- образования типов находится выражение, а не переменная. Пытливому читателю из приведенных выше описаний становит- ся очевидно, что операторы типа Y=SIN(X) ALMICом транслируются довольно неэффективно: слишком много пересылок данных. Поэтому в ALMIC4 предусмотрен компактный вариант записи функций: если последним символом имени функции является символ подчеркива- ния, то любая функция обрабатывается так же, как функция пре- образования типов, т.е. без пересылки аргумента по адресу при- емника. ПРИМЕР: y=sin_(x(i)) ; z(i)=-sqr_(x)*10-v(j) 6.6 ФУНКЦИИ ПОЛЬЗОВАТЕЛЯ Функции определенные пользователем, используются в выра- жениях аналогично стандартным функциям. Формат: [знак +-]NAME_(P), где NAME - имя функции, P - аргумент. При трансляции перед вызовом подпрограммы NAME адрес аргумента помещается в регистр R1. Применяется для вызова библиотечных функций, не имеющих стандартного вызова с помощью TRAP-диспетчера (см. описание библиотеки), а также - простых пользовательских функций. ПРИМЕРЫ: y=-fun_(x(i))*10+k(i) ; печать адресов элементов массива x(i): 1s: get x(i) p=ptr_(x(i)) t$=@ito_(p)+cr$ type i,t$ i=.+1 goto 1s ito: .@lib+1062 адрес библиотечной ф-ции ITO ptr: procedure MOV R1,@R0 return 7. ОПЕРАТОРЫ Алгоритмический язык ALMIC относится к числу операторных языков. Основными структурными элементами этого языка являются операторы. В ALMICе различают два типа операторов: выполняемые и невыполняемые. Невыполняемые операторы дают указания тран- слятору о резервировании памяти для переменных, присвоения им начальных значений и т.п. Программа должна быть составлена таким образом, чтобы не- выполняемым операторам управление не передавалось. Любой оператор может быть помечен меткой. 7.1 МЕТКИ Чтобы выделить какую-либо строку в программе, можно ис- пользовать скмвольные имена - метки. Метка (или несколько меток) ставится в начале строки, сразу после имени метки должен стоять символ ":". Если имя метки начинается с буквы, то метка называется глобальной, и обращение к ней возможно из любой точки программы, а также из внешних программ. Локальные метки, имена которых начинаются с цифры, допускают обращение только с помощью операторов перехо- да. Локальные метки действительны только до ближайшей гло- бальной метки при переходе назад, по направлению к началу программы. Расстояние, на которое может быть сделан переход к локаль-ной метке, ограничено. 7.2 ОПЕРАТОРЫ АРИФМЕТИЧЕСКОГО ПРИСВАИВАНИЯ Основаная форма оператора: A=B, где А - переменная целого или плавающего типа, а В - выражение. Переменная А должна иметь тот же тип, что и выражение. Не допускается наличие пробела слева от символа "=". При выполнении всех арифметических операций выражения В переменная А служит приемником результатов этих операций. Поэтому использовать переменную А в качестве операнда вы- ражения В следует с большой осторожностью ! ПРИМЕРЫ: запись в ALMICe: интерпретация: X=X*.5 X=X*.5 X=.5*X X=.5*.5=.25 !!! X=Z+Y/X X=(Z+Y)/(Z+Y)=1 !!! Для выражения плавающего типа допускается следующий спо- соб продолжения строки, обеспечивающий получение более компак- тного кода: полная запись краткая запись x(i)=-sqr(x(i)+1)+1 x(i)=-sqr(.+1)+1 x(i)=log(x(i)) .=log(.) Для выражения целого типа: i=i+1 i=.+1 i=i*j+n %=.*j+n i=i*i %=.*i Для символьных выражений: t$=t$+w$(i) t$=.+w$(i) t$=t$+s$(j) $=.+s$(j) Эти формы записи применяются, когда не надо переопреде- лять адрес приемника, а лишь необходимо сообщить транслятору тип выражения. 7.3 ОРГАНИЗАЦИЯ БЕЗУСЛОВНЫХ ПЕРЕХОДОВ Безусловная передача управления производится с помощью операторов GOTO с прямой и косвенной адресацией. Оператор GOTO с прямой адресацией имеет формат GOTO MET и предназначен для передачи управления оператору с глобальной меткой MET. Опрератор GOTO с косвенной адресацией имеет формат GOTO @SWT и используется для перехода к оператору с меткой, адрес которой присвоен переключателю SWT. Переключателем может быть простая переменная любого типа. 7.4 ОРГАНИЗАЦИЯ УСЛОВНЫХ ПЕРЕХОДОВ Условные переходы овуществляются по признакам отношения ( ><= и их комбинаций ) и признаку ошибки. Эти признаки автома- тически устанавливаются после выполнения любых арифметических операций, в том числе операций присваивания и вычисления фун- кций. Признак ошибки устанавливается при переполнении разряд- ной сетки числа или возникновении некорректной ситуации при вычислении функции. Результат каждой операции автоматически сравнивается с нулем, и для него устанавливаются признаки от- ношения. После выполнения оператора арифметического присваива- ния будут установлены признаки результата последней операции выражения. Признаки отношения для любой переменной могут быть уста- новлены с помощью операторов сравнения TEST и COMPARE. Опера- тор TEST предназначен для сравнения любой переменной с нулем и имеет формат: TEST VAR, где VAR - любая переменная. Оператор COMPARE сравнивает между собой переменные любого типа и кон- станты плавающего и целого типов. Формат оператора: COMPARE A,B. Операнды А и В могут быть переменными без знака (простыми и индексными) или численными константами любого, но обязатель- но одного типа. Если первым операндом является целая константа плавающего типа без пооазателя, то ее последним символом должна быть ".". Оператор TEST VAR равносилен оператору COMPARE VAR,0. В том случае, когда необходимо сравнить результат операции ариф- метического присваивания с какой-либо константой или перемен- ной, можно использовать сокращенную форму записи оператора COMPARE, например: ERR=ABS+X-X1) COMPARE .,1E-6 Эта запись равносильна записи COMPARE ERR,1E-6, но обес- печивает более высокое быстрогействие и экономию памяти. Оператор условного перехода имеет формат IF R MET, где МЕТ - глобальная или локальная метка, на которую передается управление, а R - условие перехода: GT - если больше GE - если больше или равно LE - если меньше или равно LT - если меньше EQ - если равно NE - если не равно ERR - если ошибка NER - если нет ошибки При записи оператора IF условие перехода может быть выде- лено (для наглядности) любыми символами ограничителями: IF(GT) 1S IF :GT: ME1 IF [GT] R2 7.5 ОРГАНИЗАЦИЯ ЦИКЛОВ Циклы организуются с помощью операторов заголовка циклов FOR и продолжения цикла CONTINUE. Оператор заголовка цикла имеет формат: M1: FOR I=J1,J2,J3 :M1 где I - параметр цикла - простая переменная целого типа; J1 - начальное значение параметра цикла; J2 - приращение параметра (неотрицательное!); J3 - конечное значение параметра; J1,J2,J3 - константы целого типа со знаком или без него, или простые переменные целого типа без знака. M1,M2 - глобальные метки операторов заголовка и продолжения. (перед меткой М2 должен стоять любой разделитель). Если J1>J2, то цикл не выполняется ни разу, управление сразу передается строке, следующей за оператором продолжения цикла. Допускаются сложные циклы и досрочный выход из цикла. Не рекомендуется внутри цикла изменять значения I,J1,J2,J3. Оператор продолжения цикла имеет формат: M2: CONTINUE M1 где М1 - метка оператора заголовка цикла, М2 - глобальная метка. ПРИМЕР: ; вычисление суммы ряда: SUM=0 C1: FOR I=1,1,N :C1E SUM=.+X(I) C1E: CONT C µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ 7.6 ОПЕРАТОРЫ ВВОДА/ВЫВОДА Эти операторы предназначены для реализации диалогового режима. Оператор ввода данных с клавиатуры имеет формат: GET A1,A2,..,AN ,где Аi - переменная любого типа. Ввод данных производится по приглашению ":" и заканчивается нажати- ем <ВВОД> или автоматически, если количество введенных симво- лов превысило 32 (дес.). При нажатии <ВВОД> курсор переходит на следующую строку. При ошибке ввода (использовании непра- вильного формата или значения числа) признак ошибки не уста- навливается, а соответствующей переменной присваивается нуле- вое значение. Оператор вывода данных на экран имеет вид: TYPE(!) A1,A2,...,AN,где Ai - переменная любого типа. При выполнении оператора происходит вывод символьных представлений чисел и значений символьных переменных. При выводе очередного значения перевода строки не происходит. Если после имени опе- ратора стоит символ "!", то плавающие числа выводятся в форма- те без показателя. Стандарт символьного представления чисел: первый знак пробел или "-", последний символ - пробел; длина представления целого числа 7 байтов, плавающего числа с показателем - 15 (дес.) байтов, плавающего числа без показателя - 11 (дес.) байтов. Оператор определения положения курсора имеет формат: POS I,J ,где I,J - переменныедцелого типа. При выполнении оператора переменной I присваивается номер позиции в строке, а переменной J - номер строки. Допускается сокращенная форма за- писи (когда требуется определить лишь номер строки): POS .,J Оператор установки курсора имеет вид: LOC I,J Устанавливает курсор на I-ю позицию строки с но- мером J и имеет следующие формы записи: LOC I,. - курсор устанавливается на I-ю позицию текущей строки LOC I,! - курсор устанавливается на I-ю позицию предшевствующей строки. ПРИМЕР: ; ввод чисел и вывод их квадратов CR$=[12] 1S: GET X LOC 20,! Y=X*X TYPE Y,CR$ GOTO 1S 7.7 НЕВЫПОЛНЯЕМЫЕ ОПЕРАТОРЫ Операторы этой группы предназначены для резервирования памяти, описания типов переменных и задания начальных значе- ний. Формат операторов: OPERATOR A1(N1),A2(N2),...,Ak(Nk),B1,B2,..,Bl где Ai - имя массива Ni - количество элементов в массиве Bi - имя переменной Имена переменных и массивов в списке операндов могут че- редоваться произвольным образом. Записи вида OPERATOR A(1) и OPERATOR A эквивалентны. Массивы явным образом не задаются, под них лишь резервируется место в памяти. Так при записи вида OPERATOR X,Y,Z(5),T возможны следующие способы обращения к пе- ременной T: X(7),Y(6),Z(5). Если у какой-либо переменной списка указано нулевое коли- чество элементов массива, то имя этой переменной можно исполь- зовать только для обращения к следующей по списку переменной. Оператор INEGER объявляет целый тип переменных по первым двум символам имени и резервирует память. Каждой переменной отво- дится два байта. Оператор FLOAT только резервирует память для переменных и массивов, выделяя каждому элементу 6 байтов памяти. Оператор LABEL резервирует память для переключателей. Ре- зервирование памяти и задание начальных значений СИМВОЛЬНЫХ переменных осуществляется командами ассемблера: t$: .+1000 w$: .a:Hello !\ .e Оператор задания начальных значений констант и переменных: DATA <список констант> Константы могут быть целого и символьного типа, в конце целых констант плавающего типа должна стоять точка. ПРИМЕР: data 1.1E-5,1.,-10,0.,1.234 ПРИМЕРЫ: INTEGER I,I1(2),J,K,N ER$=[12]ERROR ![12,12] MET: FLOAT T(0),X,Y(10),Z(10),WX В последнем примере переменная Х допускает обращение: МЕТ и Т. 7.8 ОПЕРАТОРЫ УПРАВЛЕНИЯ Оператор инициализации INITIAL обеспечивает связь выпол- няемого модуля с системной библиотекой стандартных подпрог- рамм, должен быть первым выполняемым оператором основной прог- раммы. Оператор INITIAL [MET] - можно указать (необязательно) метку перехода на первый исполняемый оператор программы. ПРИ- МЕРЫ: init ,ini 1$,initial sta Оператор временного останова WAIT приостанавливает выпол- нение программы до нажатия любой клавиши. Оператор останова HALT прекращает выполнение программы. Оператор END дает команду ассемблеру прекратить трансля- цию программы в машинные коды. 7.9 ОРГАНИЗАЦИЯ ПОДПРОГРАММ Обмен данных между вызывающей программой и подпрограммой может быть организован двумя способами: - с помощью общих переменных, которые доступны для опера- торов как основной программы, так и подпрограммы; - с помощью механизма передачи фактических параметров формальным аргументам программы. Первый, применяется в ФОКАЛЕ и БЕЙСИКЕ, и не нуждается в особых комментариях. Остановимся по-подробнее на втором способе. Формальные аргументы являются фиктивными переменными, которые при вызове подпрограммы заменяются фактическими параметрами - числовыми константами со знаком и без знака, переменными любого типа без знака, именами подпрограмм и глобальных меток. В качестве фор- мальных аргументов могут применяться переменные любого типа, индексы, имена подпрограмм, меток, а также - аргументы любых операторов языка. =============================================================== В остальных операторах подпрограммы перед именем формаль- ного аргумента должен стоять символ "@" !!! =============================================================== Формальные аргументы должны быть описаны операторами INTEGER, FLOAT, LABEL. ПРИМЕР: INTEGER P,J,@N,K,@KL - N,KL - формальные парамет- ры FLOAT Z(10),@Z2,@W - W,Z2 - ----- "" --- "" ---- LABEL @ME1,@ME - ME1,ME ---- "" --- "" ----- Типы соответствующих параметров и аргументов должны сов- падать. При передаче в качестве фактического параметра целой константы плавающего типа в формате без показателя последним символом этой константы должна быть точка. ПРИМЕР: CALL SUB(-1.,1.,10,X(5),MET,TX$) Запрещается непосредственная передача формальных аргумен- тов одной подпрограмме в качестве фактических параметров дру- гой подпрограмме, т.е. вместо CALL SUB(@Z) следует писать: Z1=@Z, CALL SUB(Z1). Именем подпрограммы является имя глобольной метки первого выполняемого оператора подпрограммы. В конце подпрограммы дол- жен стоять оператор возврата RETURN. Вызов подпрограммы производится оператором CALL: CALL [@]NAM[ (список параметров) ] Порядок следования параметров - обратный порядку соответ- ствующего списка фиктивных параметров оператора PROCEDURE. Оператор заголовка процедуры: NAM: PROCEDURE [ (список параметров) ] ПРИМЕРЫ: sub: proc float @v,@x x=sin(t/pi)+1 sub: procedure(x,v,l) return @v=-exp(-@x/l) return 9. ОСОБЕННОСТИ ТРАНСЛЯТОРА. СООБЩЕНИЯ ОБ ОШИБКАХ Транслятор с языка ALMIC устроен таким образом, что мно- гие ошибки им не распознаются. Некоторые из этих ошибок будут выявлены при трансляции с языка ассемблера в машинные коды, а определенная часть ошибок проявится только при выполнении программы. Транслятор проверяет каждую строку исходной программы на принадлежность к языку ALMIC. В том случае, если первый после метки терм строки не совпадает ни с одним из ключевых слов ALMICа, транслятор переносит всю строку в выводной ассемблер- ный текст без сообщения об ошибке. Благодаря этому, в исходный текст программы можно вклю- чать без предварительного уведомления отдельные строки и фраг- менты на языке Ассемблера. Если установлена принадлежность строки к языку ALMIC, транслятор производит диагностику синтаксических ошибок, при обнаружении ошибки на экран выводится (не всегда) ошибочный терм и сообшение о номере ошибки. Если ответить "Y" на запрос "Editor(y/n)?", то загрузится и запустится редактор, причем курсор установится на ошибочную строку. ПЕРЕЧЕНЬ СООБЩЕНИЙ ОБ ОШИБКАХ: 1 - синтаксическая ошибка 2 - недопустимый тип переменной 3 - недопустимый индекс 4 - неправильный формат функции 5 - недопустимая функция 6 - лишняя закрывающая скобка 7 - неправельный формат индексной переменной или функции FLT, пробел перед закрывающей скобкой, 10 - неправильный формат числа 11 - отсутствует закрывающая скобка 12 - неправильная запись признака условного перехода 13 - под знаком ф-ции находится выражение, а не переменная µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ приложение к описaнию языка ПРИМЕРЫ ПРОГРАММ НА ЯЗЫКЕ ALMIC. (1993) Все примеры написаны только для иллюстрации особенностей языка, поэтому и поставленные в них задачи решаются не самым лучшим образом. Каждый пример должен транслироваться отдельно. ; пример эмуляции операторов DATA - READ ---------------- ini sta int i,j,n(6) flo x(6) cr$: .b:12,0 ts$: .b:14.A:Эмуляция DATA-READ:^^^\ .e t$: .a:\1.11E1\-2.22E1\3.33E1\44.4\-55.5\ .a:1\-2\3\-4\5\ sta: nop type ts$ c: for i=1,1,10 [ce] comare i,5 if(GT) 1s x(i)=val(t$(i)) type i,t$(i) locate 20,. type x(i),cr$ goto ce 1s: j=i-5 n(j)=val(t$(i)) n=n(j) type i,t$(i) locate 20,. type n,cr$ ce: continue [c] wait goto sta end ; 2-й пример эмуляции операторов DATA-READ-------------- ini sta int i,j cr$: .b:12,0 ts$: .b:14.A:Пример использования оператора DATA:^^\ .e X: data 0.,1.11E1,-2.22E1,3.33E1,44.4,-55.5 int n(0) npt: data 0,1,-2,3,-4,5 sta: nop type ts$ c: for i=1,1,10 [ce] compare i,5 if(GT) 1s type i,x(i),cr$ goto ce 1s: j=i-5 n=n(j) type i,n,cr$ ce: continue [c] wait goto sta end ; Восьмеричный дамп кода прграммы ----------------------- initial sta ito: .#lib+1062 sa: integer i,pos,pt pt0: .#sa pt1: .#fa cr$: .b:12,0 hd$: .a:^Восьмеричный дамп кода программы:^ .e t$: .+12 sta: type hd$ c: for i=pt0,2,pt1 [ce] t$= @ITO_(@I) type t$ posit pos,. compare pos,56 if(LT) 0m type cr$ ce:0m: continue [c] wait goto sta fa: nop end ;пример использования символьных переменных ------------ ini sta hd$: .a:^Использование символьных переменныи:^\ .a: - append -^ .e w$: .+40 t$: .+1000 sta: type hd$,hd$(1) 0s: get w$ t$=.+w$ type t$ goto 0s end ; Умножение матриц ---------------------------------------- ini sta integer i,j,m,n,l,ia,ib,ic,k integer pos,lin float a(100),b(100),c(100),s,s0 cr$: .b:12,0 w$: .a:^Задайте размерности матриц:^\ .a:m= \n= \l= \ .e t$: .a:^Введите матрицу \ .a:A(m,n) :^\W(n,l) :^\ .e t1$: .a:^Результат умножения C(m,l) :^\ .e sta: nop type w$ type w$(1) get m loc 10,! type w$(2) get n loc 20,! type w$(3) get l type t$,t$(1) inm_(a,m,n) type cr$,t$,t$(2) inm_(b,n,l) call mlm type t1$ oum_(c,m,l) wait goto sta ; проц.умножения integer @lm,nl,n mlm: procedure z0: for k=1,1,m [z0e] z1: for j=1,1,l [z1e] s=0 z2: for i=1,1,n [z2e] ;S=S+A(k,i)*B(i,j): ia=(k-1)*n+i ib=(i-1)*l+j s0=a(ia)*b(ib) s=.+s0 z2e: continue [z2] ;C(i,k)=S: ic=(k-1)*l+j c(ic)=s z1e: continue [z1] z0e: continue [z0] return ;проц.ввода матрицы integer @nma,@mma,zma,im,jm float @mat inm: procedure(nma,mma,mat) c1: for im=1,1,@mma [c1e] c1: for jm=1,1,@nma [c2e] zma=(im-1)*@nma+jm posit pos,. get @mat(zma) pos=.+7 locate pos,! c2e: continue [c1] return ;процедура вывода матрицы oum: procedure(nma,mma,mat) c2: for im=1,1,@mma [c3e] c4: for jm=1,1,@nma [c4e] zma=(im-1)*@nma+jm type! @mat(zma) c4e: continue [c3] return end Как видно из этих примеров, наибольшее неудобство в рабо- те с ALIMCом - колоссальные ограничения на синтакскс арифмети- ческих операций. Это плата за получение относительно оптималь- ного кода. Вполне возможно, что в следующих версиях языка, расчитанных на применение доп. ОЗУ и дисковода, эти ограниче- ния будут частично сняты. Пока же остается утешаться тем фак- том, что при вычислении полиномов по схеме Горнера эти ограни- чения превращаются в достоинства: вот так,например,считается полином: P=A(0)+A(1)*X+A(2)^2*X+...+A(n)*X^n p=a(n) c0: for i=1,1,n [c0e] k=n-1 p=p*x+a(k) c0e: continue [c0] Уважаемые пользователи ! Авторы просят прощения за орфог- рафические ошибки, которыми кишит данное руководство ( всякие там: "интерпрИтация", запятые и т.д. И просят, если Вы ( не дай Бог!) найдете неточности в руководстве или ошибки в тран- сляторе, написать об этом по адресу: 111538, Москва, ул. Ко- синская, д.18, кор.2, кв.13, Бутырскому Дмитрию Владимировичу. Большой вклад в "ловлю блох" ALMICа внес Ю.А. Зальцман, за что ему и бо-ольшая благодарность. Будем рады и просто прочитать Ваши отзывы и предложения. И последнее. При обмене текстами программ на ALMICe пред- лагаем давать их именам стандартное расширение ".ALM". Предла- гаем также создать банк программ на ALMICе, в общем - пишите. Успехов в бизнесе ! 23.01.93 г. µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ Лицов Е.А. BLITS SoftWare Inc. Бутырский Д.В. Copyright 1993 AlMic system v5.2 upgrade 2 Комплект поставки: UPGRADE2.DOC - эта документация START11M.COM - модуль для запуска AlMic на БК11(м) ALMIC52.COM - командный модуль ALMED52.SYS - редактор ALMTR52.SYS - транслятор ALMAS52.SYS - ассемблер ALMLN52.SYS - линкер GRAPH.ALM - исходник библиотечки граф. процедур GRAPH.OBJ - объектный модуль GRAPH.DOC - документация к библиотечке GRAPHDEMO.EXE - демонстрационная программа GRAPHDEMO.ALM - исходник дем. программы 1. Изменения В UPGRADE 2 исправлены многие ошибки, связанные с"привяз- кой" системы к одному дисководу. Кроме того, есть возможность сохранить при выходе из системы модуль ALMIC52.COM, чтобы при повторном запуске не надо было заново указывать рабочий привод и имя программы. Модуль START11M предназначен для установки системы на электронный диск Е:, что заметно сокращает количество обраще- ний к дисководу на БК11(м). Если у Вас БК10, то запускать сис- тему следует как и раньше - с модуля ALMIC52.COM. 2. Получение UPGRADE 2 Для получения UPGRADE 2 зарегистрированным пользователям версии 5.2 необходимо обратиться в фирму ALTEC (м."Баррикад- ная", ул. Садово-Кудринская 24, понедельник, среда, четверг с 16-00 до 19-00), где на Вашу дискету с ALMIC-системой его пе- репишут бесплатно (имеются в виду те, кто преобрел систему до 10.11.93 г., после этой даты все проданные дискеты содержат UPGRADE 2). Кроме того, сообщаем, что зарегистрированные пользователи версии 5.1 могут обменять свою дискету с версией 5.1 на диске- ту с версией 5.2 за 35% стоимости (600 руб.) Если Вы до сих пор работаете с MK-DOS v1.10 или ниже, то рекомендуем Вам обратиться в ALTEC для обмена на версию 1.20. Лицов Е.А. BLITS SoftWare Inc. Бутыский Д.В. (c) Copyright 1992,93 AlMic Editor (редактор AlMic-системы) При написании редактора авторы учитывали особенности, ко- торые должны облегчать написание программ на языке ALMIC, и, естественно, надежность и простоту. Загрузка и запуск редактора осуществляютя из меню коман- дного модуля системы или из транслятора при возникновении ошибки, причем во втором случае курсор устанавливается на строку содержащую ошибку. Управляющие клавиши: СТРЕЛКИ - перемещение курсора ВВОД - переход на новую строку с раздвижкой строк ВС - переход на новую строку без раздвижки СДВИЖКА,РАЗДВИЖКА,ЗАБОЙ - редактирование СУ/B - забрать строку в буфер строки СУ/G - поиск по заранее введенной модели СБР - поставить метку (только в начале строки!) ТАБ - табуляция ШАГ - вкл/выкл режима SHIFT. В этом режиме при нажатии на буквенные клавиши появляются только строчные символы. Чтобы ввести заглавную букву, надо одновременно нажать клавишу АР2 (как на пишущей машинке). Многие клавиши имеют альтернативные функции. Для этого надо предварительно нажать клавишу КТ, при этом в служебной строке появляется индикатор ALT. (ВЛЕВО) - в начало строки (ВПРАВО) - в конец строки (ВНИЗ) - на 20 строк вниз (ВВЕРХ) - на 20 строк вниз (СДВИЖКА) - поместить в буфер строки часть от курсора до конца (РАЗДВИЖКА) - выдать строку из буфера строки ([) - в начало текста (]) - в конец текста (C)lear - удалить текст от метки до курсора (B)uffer - текст от метки до курсора - в буфер текста (О)ut - выдать текст из буфера (Т)о mark - уйти к метке (S)earch - задание модели поиска (М)acro - задать МАКРО (E)nd - окончить МАКРО (D)o - исполнить МАКРО (R)epeat - повтор исполнения МАКРО N раз. Вводимое число - десятичное. Можно пользоваться кл. ЗАБОЙ. (P)rint - печать участка текста от метки до курсора на принтере (интерфейс ИРПР. Схема подключения МС-6313 есть в файле OS-93.DOC). Есть возможность включать в текст управляющие коды для принтера. Для этого надо написать ВОСЬМЕРИЧНЫЙ КОД и выделить его символами "ёH". Например: ДЕМОНСТРАЦИОННАЯ ёH12ёH ПРОГРАММА Для выхода из редактора надо нажать кл. СТОП и "Y" на запрос "Exit(y/n)?", при этом предоставляется возможность за- писать текст. СТОП'ом можно пользоваться и для прерывания пе- чати или режима (R)epeat. Имя выходного текстового файла - <имя тек.программы>.ALM. µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ Лицов Е.А. BLITS So&tWare Inc. Бутырский Д.В. (c) Copyright 1992,93 AlMic Assembler (ассемблер AlMic-системы) Ассемблер представляет собой переделанную под нужды сис- темы версию МИКРО10. Кто программирует на языке Ассемблера на- верняка с ней знакомы, а кто не знаком - лучше этого и не де- лать. Заострим внимание лишь на сообщениях об ошибках, псевдо- командах (это нужно при программировании на ALMIC'е) и практи- ческой работе. Метки - не более 3-х символов. Арифметики над метками - нет. Псевдо-команды: .А: (строка символов) - формирование строки символов .B:(байт),(байт),.... - включение байтов .#(слово),(слово),... - включение машинных слов .E - приведение к четному адресу .R: (строка символов) - упаковка в RADIX-50 В псевдо-команде .A: символ "^" (степень) заменяется на код 12 (перевод строки), а "\" на нулевой байт. Ставить в одной строке после .A: другие псевдо-команды нельзя! Т.е.: .B:14.A:^ABCDEF\ - можно .А:ABCDEF.B:12 - неверно ! Ошибки: 1 - недопустимый символ в строке 2 - неверный оператор 3 - ошибка длины перехода 4 - недопустимое имя метки 5 - недопустимый символ в поле операнда 6 - неверное число операндов 7 - нестандартное имя, там, где это необходимо 10- неопределенное имя метки в операторе "SOB Rn,MET" 11- неверный оператор Ассемблер последовательно загружает, транслирует и запи- сывает .OBJ файлы выделенных текстовых .ASM файлов. При воз- никновении ошибки выдается запрос "Е,С?" (т.е. ESCAPE, CHANEL ? - прекратить/продолжить трансляцию ?). При ответе "С" ошибка игнорируется, иначе - компилируется следующий модуль (если есть). При остановке выдачи таблицы меток - жмите на любую клавишу. P.S. ДЛЯ ФАНАТОВ TURBO5(M). Действительно, МИКРО.10, на первый взгляд, кажется убо- гим, но не забывайте, что он используется всего лишь в качес- тве финишного транслятора. Кроме этого, ALMIC различает пере- менные (читай - метки) по первым двум символам. Увеличение длины метки привело бы к громоздкой таблице меток и еще боль- шим ограничениям на вставки на ассемблере. В скором времени будет готов конвертер .ASM файлов в фор- мат MICROn.WS (TURBOn) и, естественно, БСП в том же формате. Звоните. µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ Лицов Е.А. BLITS SoftWare Inc. Бутырский Д.В. (c) Copyright 1992,93 Linker (Компановщик ALMIC-системы) Компановщик предназначен для компановки объектных модулей Вашей программы с библиотекой стандартных подпрограмм (объек- тный модуль LIB52.OBJ должен быть на системном диске). Действия выполняемые компановщиком: 1. Компановка первого выделенного файла (с 1000 адреса). Єµµѕ 2. Компановка со следующим файлом (если есть). ё ¦µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ№ 3. Компановка с БСП (LIB52.OBJ) 4. Запись файла <имя тек.программы>.EXE. При остановке выдачи таблици меток жмите любую клавишу. Если после компановки с БСП остались метки выделенные ин- версией - дело плохо, входите в редактор и разбирайтесь с ис- ходником (скорее всего Вы забыли проставить метки, т.к. если не определены переменные ошибка обнаружится еще при трансля- ции). µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ Єµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµё · A L M I C Ґё · ·· · ВЕРСИЯ 5.2 ·· · ·· · БИБЛИОТЕКА СТАНДАРТНЫХ ·· · ПОДПРОГРАММ. ·· · РУКОВОДСТВО ПО ПРОГРАММИРОВАНИЮ ·· ¦µ«µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ№· ¦µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ№ Пакет LIB предназначен для реализации на ПЭВМ БК0010(-01) функциональных преобразований, целочисленной и плавающей ариф- метики, операций с символьными строками. 1. ФОРМАТЫ ПРЕДСТАВЛЕНИЯ ДАННЫХ ОСЦ (I) - однословное целое ДСЦ (J) - двухсловное целое ПЗН (F) - с плавающей запятой, нормализованное ОСЦ: +-............. n ДСЦ: ............... n младшая часть +-............. n+2 старшая часть ПЗН: ............... n младшая часть мантиссы +-............. n+2 старшая часть мантиссы ............... n+4 порядок Отрицательные ОСЦ представляются в виде дополнения до 2^16, ДСЦ - до 2^32; отрицательная мантисса ПЗН - до 2^32. Действительное значение порядка - с дополнением 2^15, т.е.: (действительный порядок) + 100000 = (избыточный порядок), нап- ример, порядок (-3) представляется в виде (077775). Число с плавающей запятой называется нормализованным, ес- ли рядом со знаковым разрядом мантиссы находится ее старший разряд (для отрицательной мантиссы - 0). Исключения: число 0 и отрицательные числа, являющиеся степенями двойки. Нуль: 0 во всех трех словах. Отрицательные степени двой- ки: знаковый разряд 1, старший разряд 1,0,0,.. . ПРИМЕР: число порядок ст.слово мантиссы -8 100004 110000 -1 100001 110000 -1/2 100000 110000 -1/16 077775 110000 Для большинства ПЗН мантисса имеет вид: положительное число 0 1 . . . . . . . . . . отрицательное число 1 0 . . . . . . . . . . 2. ПРЕОБРАЗОВАНИЕ СИМВОЛЬНЫХ ПОСЛЕДОВАТНЛЬНОСТЕЙ Строка символов обязательно должна завершаться нулевым байтом. Программы прямого преобразования переводят последова- тельность символов внутреннего кода ASCII в числа форматов ОСЦ, ДСЦ, ПЗН. Программы обратного преобразования переводят числа в сим- вольную последовательность. В пакете используются следующие форматы представления чисел в ASCII: O - 8-число целое D - 10-число целое E - 10-число с показателем R - 10-число без показателя Допускаются пробелы до и после числа, а также перед сим- волом показателя (Е). Ограничителем служит код <0>. Перед вызовом п/п адрес источника помещается в R1, а ад- рес приемника - в R0. Следует помнить, что источник не может одновременно слу- жить и приемником. При использовании недопустимых символов или значений чисел устанавливается признак ошибки V=1. 3. П/П ПРЕОБРАЗОВАНИЯ К ним относятся ITO, DTI, DTJ, ITD, JTD, ATF, FTE, FTR. 3.1 ОБРАБОТКА СИМВОЛЬНЫХ ПОСЛЕДОВАТЕЛЬНОСТЕЙ SMV - пересылка последовательностей символов с адреса R1 по адресу R0. SAP - конкатенация (аппенд) символьных последо- вательностей. @R0=@R0&@R1 4. П/П ВВОДА/ВЫВОДА Введенная с клавиатуры информация заносится в память с адреса @R0. При ошибках ввода чисел признак ошибки не устанав- ливается, соответствующему числу присваивается нулевое значе- ние. GEA - ввод символьной последовательности GEI - ввод целого числа ОСЦ GEF - ввод плавающего числа ПЗН. П/п вывода обеспечивают символьных последовательностей, ОСЦ, ПЗН расположеных в памяти по адресу @R0. TYA - вывод символьной последовательности TYI - вывод ОСЦ TYF - вывод ПЗН в формате Е TYR - вывод ПЗН в формате R 5. ЦЕЛОЧИСЛЕННАЯ АРИФМЕТИКА MUL - ВХОД: R1=ОСЦ,@R0=ОСЦ ВЫХОД: ОСЦ=@R0*R1,размещается в (R0) DIV - ВХОД: R1=ОСЦ,@R0=ОСЦ ВЫХОД: ОСЦ=@R0/R1, размещается в (R0) УМНОЖЕНИЕ И ДЕЛЕНИЕ ДСЦ DPM - ВХОД: множитель в R2,R3 множимое в R4,R5 ВЫХОД: произведение в R0,R1,R2,R3 (4 слова) DPD - ВХОД: делимое в R0,R1,R2,R3 делитель в R4,R5 ВЫХОД: частное в R2,R3 остаток в R0,R1 6. ПЛАВАЮЩАЯ АРИФМЕТИКА Операнды - только ПЗН, адрес источника - в R1, приемника - в R0. Источник может быть приемником. ADF - сложение SBF - вычитание MLF - умножение DVF - деление NGF - @R0=-@R0 MVF - пересылка @R0=@R1 CMF - сравнение Z N сравнение: обработка: 1 0 @R0=@R1 BEQ 0 0 @R0>@R1 BGT 0 1 @R0<@R1 BLT ABS - @R0=ABS(@R1) FIX - @R0=FIX(@R1) PWF - R2=ОСЦ,@R0=@R1^R2 SGN - @R0=SIGN(@R1) 8. ФУНКЦИИ SIN - @R0=SIN(@R1) COS - @R0=COS(@R1) ATN - @R0=ARCTAN(@R1) LOG - @R0=Ln(@R1) SQR - @R0=SQRT(@R1) EXP - @R0=EXP(@R1) 9. ТОЧНОСТЬ ПЛАВАЮЩЕЙ АРИФМЕТИКИ Точность плавающей арифметики определяется так называемым машинным эпсилоном EPS, который может быть найден по следующе- му алгоритму: EPS=1 M: EPS=EPS*0.5 EPT=EPS+1 IF EPT>1 GOTO M В пакете LIB величина EPS равна .46566129 E-9. Точность вычисления функций имеет примерно такойже порядок. По своей точности плавающая арифметика LIB занимает промежуточное зна- чение между плавающей арифметикой ординарной и двойной точнос- ти BASICа-MSX. 10. ВЫЗОВ ПОДПРОГРАММ ПАКЕТА Пакет LIB предоставляет пользователю два способа обраще- ния к подпрограммам: непосредственный JSR PC,SUB или CALL SUB и специальный, с помощью TRAP-диспетчера. Исходные данные при обращении к п/п: адрес источника - R1, адрес приемника - R0. Вызов п/п пакета непосседственным способом производится командой CALL LIB+, где LIB - адрес загрузки пакета, а ADR - относительный адрес точки входа в п/п. 11. РАБОТА С TRAP-ДИСПЕТЧЕРОМ Для инициализации TRAP-диспетчера необходимо занести в ячейку @#34 загрузочный адрес пакета LIB ( MOV #LIB,@#34 ). Вызов п/п пакета производится инструкцией TRAP NN, где NN за- дается так: NN=REG+COD, где REG - код режима, COD - код под- программы пакета. TRAP-инструкция с кодом COD=0 помещает в R0 абсолютный адрес переменной, заданный операндом этой инструк- ции. Инструкция с кодом COD=1 заносит в R1 абсолютный адрес переменной, заданный операндом этой инструкции. Инструкция с кодом COD>0 заносит в R1 абсолютный адрес переменной (заданный операндом) и выполняет соответствующую п/п. В режиме REG=300 диспетчер перед вызовом п/п установлива- ет адрес источника R1, равный адресу приемника R0. Режимы REG=140 и REG=240 предназначены только для работы с индексными символьными переменными. Режим REG=40 предназначен для работы с константами ПЗН (непосредственная адресация). При косвенной адресации операндами являются увеличенные на единицу адреса ячеек памяти , в которых записаны адреса пе- ременных и индексов. ФОРМАТЫ TRAP-ИНСТРУКЦИЙ REG ИНСТРУКЦИЯ REG ИНСТРУКЦИЯ 0 TRAP NN 200 TRAP NN .#X[+1] .#X[+1] .#000001 40 TRAP NN .#000000 .#000000 .#000000 300 TRAP NN 100 TRAP NN .#X[+1] .#I[+1] 140 TRAP NN 240 TRAP NN .#T$[+1] .#T$[+1] .#I [+1] .#1 Выражения в квадратных скобках соответствуют косвенной адресации. КОДЫ П/П ПАКЕТА COD П/П COD П/П 0 адр dd 20 LOG 1 адр ss 21 SQR 2 CMF 22 FIX 3 MLF 23 SGN 4 ADF 24 ATF 5 SBF 25 DTI 6 MLF 26 SMV 7 DVF 27 PWF 10 FTI 30 GEA 11 ITF 31 GEI 12 NGF 32 GEF 13 ABS 33 SAP 14 SIN 34 TYA 15 COS 35 TYI 16 ATN 36 TYF 17 EXP 37 TYR ПРИМЕР: Z(I)=-SQR(K*X(I)+Y(I))+V TRAP 100 определение приемника .#Z .#I TRAP 3 переслать K в приемник .#К TRAP 106 умножить приемник на X(I) .#X .#I TRAP 104 прибавить к приемнику Y(I) .#Y .#I TRAP 315 извлечь корень из приемника TRAP 312 изменить знак TRAP 4 прибавить V .#V FreeWare Бутырский Д.В. Copyright 1993 Библиотечка графических процедур к AlMic v5.2 В связи с возрошим интересом к ALMIC'у, очень часто зада- ются вопросы типа: "как рисовать в ALMIC'е ?", "где графика и музыка ?" и т.п. Как правило их задают те, кто не прочитал внимательно описание языка, а именно пункт "ОРГАНИЗАЦИЯ ПОД- ПРОГРАММ". Там ясно сказано как писать свои процедуры. Другая причина - отсутствие опыта. Вашему вниманию предлагается готовая библиотечка проце- дур, используя которые можно без проблем рисовать точки, линии и прямоугольники. Комплект поставки: GRAPH.DOC - эта документация GRAPH.ALM - исходник библиотечки на ALMIC'е GRAPH.OBJ - объектный модуль библиотечки GRAPHDEMO.EXE - демонстрационная программа GRAPHDEMO.ALM - исходник демонстрационной программы Обращение к процедурам. 1. Процедура рисования точки: set_(x,y,c) где x - координата по оси Х y - координата по оси Y c - режим: 1-рисование, 0-стирание 2. Процедура рисования линии: lin_(x,y,c) где x - координата X конца отрезка y - координата Y конца отрезка c - режим: 1-рисование, 0-стирание Координатами начала отрезка считаются координаты последней выведенной точки. 3. Процедура рисования прямоугольника: box_(x1,y1,x2,y2,c) где x1 - координата по Х левого верхнего угла y1 - координата по Y левого верхнего угла x2 - координата по Х правого нижнего угла y2 - координата по Y правого нижнего угла c - режим: 1-рисование, 0-стирание Кроме чисел в качестве параметров можно указывать цело- численные переменные (смотри исходник GRAPHDEMO). Способы использования. AlMic-система позволяет использовать библиотеки процедур двуми способами: 1. Компановкой программы с объектным модулем библиотеки. Для этого необходимо при компановке после объектного мо- дуля Вашей программы выделить объектный модуль библиотеки, ко- торый должен быть на рабочем диске. 2. Включением в текст программы исходного текста библи- отеки. Этот способ годится для небольших библиотек процедур (GRAPH, например). Для этого надо при входе в редактор выде- лить кроме текста Вашей программы еще и исходный текст библи- отеки. VIC corp. 13.12.93 Кривяков Виталий Викторович 450-58-92 ПРЕДСТАВЛЯЕТ ПАКЕТ ГРАФИЧЕСКОЙ БИБЛИОТЕКИ for ALMIC 1. Возможности любого языка определяются не только воз- можностями вычислительных средств, встроиных функций, но и его графическими способностями, которых у ALMICа явно не наблюда- лось. Исправить это положение было необходимо, и вот появилась графическая библиотека, которая позволила просто вызывая фун- кции строить точки, линии, окружности, эллипсы, закрашивать ограниченные области экрана и даже обрабатывать графические строки оператором DRAW. Комплект поставки: GRAPHLIB.OBJ -собственно библиотека GRAPHLIB.ALM -ее исходник GRAPHLIB.DOC -это описание DEMO.EXE -демонстрационная программа DEMO.ALM -ее исходник 2. Синтаксис операторов: Все переменные за исключением FF целого типа. C -цвет. PST_(X,Y,C) - поставить точку с коорд. X,Y и цветом C. Все переменные целые. LIN_(XN,YN,XK,YK,C) -провести вектор из XN,YN в XK,YK цветом C. DPL_(X,Y,C) -вектор из текущей точки в X,Y цветом С. DRL_(X,Y,C) -то же что и DPL, только X и Y воспринимають- ся как смещения. BOX_(X1,Y1,X2,Y2,C) -построение прямоугольника: Єµµµµµµµµµµµµµµµµµµµµµµµµ® X2,Y2 · · · · · · · · · · ®µµµµµµµµµµµµµµµµµµµµµµµµ№ X1,Y1 DRW_(X$) -графическая обработка строки символов. X$ дол- жна нести адрес начала строки символов. Строка включает в себя команды черчения: H,U,E,L,R,G,D,F ;команды управления B,N,M,C. Направления черчения Ё H іЁ H U E E ѕЁ іL Rѕ G і­ G D F F ѕ­ ­ B -точку передвигать, но не чертить N -передвигать с черчением C -изменить цвет M -перейти к координатам X,Y без черчения. Между X и Y должен стоять любой не числовой символ. Пример: X$: .A:NC1M100,100C2NU10L10E250ND30ND110 .E В конце строки должен стоять 0. X$ -переменная символьного типа Далее, все описанные функции при своей работе требуют линковки со стандартной библиотекой LIB52.OBJ, так как они ис- пользуют арифметические функции. PNT_(X,Y,C) -закраска ограниченного участка экрана. Точка X,Y -координата начала закраски. Достоинством этой функции следует считать то, что пользователь сам может определить мас- ку цвета закраски экрана. Если С={0,1,2,3,4} то закраска про- исходит стандартным цветом, если С больше &О1000 то С воспри- немается как адрес 8 слов в памяти. При закраске эта маска вы- водится на экран. Формат: С: .А:#С,. . . . . . . . . . . . . . 8 слов маски ­ начало слова 1 -----1111111111111111------------- 2 -----1111111111111111------------- 3 -----1111111111111111------------- Строки экрана 4 -----1111111111111111------------- 5 -----1111111111111111------------- 6 -----1111111111111111------------- 7 -----1111111111111111------------- 8 -----1111111111111111------------- ¦µµµµµµµµµµµµµµ№ маска из 8 слов (8) 177777 !В Н И М А Н И Е при своей работе функция использует бу- фер перед экраном, его размер зависит от сложности фигуры. CRL_(X,Y,R,FF,C) -построение окружностей, эллипсов. X,Y -центр окружности, R -ее радиус, FF -квадрат отнаше- ния полуосей эллипса. CR1_(X,Y,RX,RY,C) -тоже что и CRL, только полуоси зада- ються в явном виде RX,RY. µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµVIC corp.