[an error occurred while processing this directive]

212

33 Другие функции и средства

--------------------------------------------------

33.1 Стандартные математические функции

Комал обеспечивает следующие стандартные математические функции:

ACS (число) возвращает арк(инверсный)-косинус в радиантах.

ASN (число) возвращает арк(инверсный)-синус в радиантах.

ANT (число) возвращает арк(инверсный)-тангенс в радиантах.

COS (угол) возвращает косинус угла, доанного в радиантах

DEG (радиант) возвращает градусный эквивалент.

EXP (число) возврашает показатель степени.

LN (положительное число) возвращает лагорифм базы е.

LOG (положительное число) возвращает логарифм базы 10.

RAD (градус) возвращает эквивалент радианта.

SIN (угол) возвращает синус угла, данного в радиантах.

SQR (положительное число) возвращает квадратный корень.

TAN (угол) возвращает тангенс угла, данного в радиантах.

33.2 Звук

Из-за аппаратных ограничений, на стандартной конфигурации Агата не вохможно получить качественный звук, поэтому его пользователям можно пропустить этот радел.

Синтезатор модуля СПРУТ имеет широкие возможности генерировать звуки с помощью ключевых слов SOUND и ENVELOPE. Для простых эффектов можно использовать только оператор SOUND, оператор ENVELOPE обеспечивает контроль более широкого диапазона. При простейшем использовании за SOUND седуют четыре аргумента, например:

SOUND c,a,p,d

c - это номер канала            
от 0 до 3
а - это амплитуда или громкость от 0 до -15
р - это высота                  от 0 до 255
d - это продолжительность       от 0 до 255

****************************************************************

213

Номер канала определяет, который из четырех голосов будет использован: Канал 0 производит только шум, тогда как каналы 1, 2 и 3 производят чистые ноты.

Амплитуда может изменяться от 0 (отключена)) до -15 (громко).

Высота выбирает ноты в интервалах четверти полутона. Когда высота установлена на 53, производится среднее си, другие ноты покрывают пять октав и генерируются с помощью величин, приведенных ниже. Те, кто может читать ноты, увидят, что Moderato = 60 будет самым приемлимым для следующих установок продолжительности.

        Таблица
                Номер октавы
Нота
До
Ре#
Ре
Ми#
МИ
Фа#
Фа
Соль
Ля#
ЛЯ
Си#
Си

В качестве простого примера введите следующую программу, котораяпроиграет хорошо известную тему из кинофильма:

   100 SOUND 1,-15,97,10
   110 SOUND 1,-15,105,10
   120 SOUND 1,-15,89,10
   130 SOUND 1,-15,41,10
   140 SOUND 1,-15,69,20

Возможности SOUND можно расширить в двух основных областях. Во первых, можно выбрать огибающую, которая изменит амплитуду и высоту звука во время проигрывания;

****************************************************************

214

во вторых, можно синхронизировать ноты в аккорд.

Эти методы управления звуком весьма сильные, но несколько сложные. Детальное описание приведено в Части III в главе SOUND и ENVELOPE.

Вот пример более сложного звука, получаемого с помощью оператора ENVELOPE

ENVELOPE 1,1,-26,-36,-45,255,255,255,127,0,0,-127,126,0

SOUND 1,1,255,255

33.3 Аналоговый вход

ПЭВМ АГАТ имеет аналоговый вход для подключения пультов или джойстика.

В Модели 7 ПЭВМ АГАТ имеется два аналоговых входа. Каждый аналогвый преобразователь принимает аналоговое входное сопротивление и подает на выход цифровое выражение этого сопротивления. Аналоговое сопротивление может контролироваться, например, положением манипулятора, или оно может быть выходом с какого-нибудь датчика , используемого математическим обеспечением.

Приемлемое входное сопротивление нажодится в пределах от 0 до 100 кОм. Сответствующий диапазон цифрового выхода - от 0 до 65520, т.е. 16-ти битное двоичное число. В настоящее время материальная часть компьютеров может вернуть величину только с точностью до 8 бит, но есть возможности увеличить ее до 16 бит, если есть необходимые устройства.

Числа, возвращаемые аналогвым преобразователем, таким образом, увеличиваются с шагом 256 в пределах от 0 до 65520, но если угодно, то простое деление на 256 даст нам числа в пределах от 0 до 256.

Точный метод управления аналоговыми входными каналами описан в Части III, в главе ADVAL.

****************************************************************

4 Аспекты низкого уровня Комала

---------------------------------------------

В этой секции обсуждаются различные аспекты программирования низкого уровня в среде Комала.

34.1 Системные функции и переменные

Комал ииспользует следующие ключевые слова для обеспечения пользователя информацией о памяти, используемой языком: PAGE, SIZE и FREE (страница, размер, свободно).

PAGE определяет первое местоположение, которое использует Комал для хранения текста программы. Как предлогает название, оно должно быть установлено на начале страници памяти машины (т.е. оно должно быть точным кратным 256,&хх00). Его умалчиваемая величина зависит от точной конфигурации Агата, но вот некоторые образцы величин:

Система формирования файлов на дискетте  &F00
Дискетта и сеть                          &1100
6502 Второй процессор                    &800

PAGE -это системная переменная и ее можно считывать и присваивать. Ее основная функция - защищать машинный код, как описано ниже в секции по использованию машинного кода.

SIZE - это только считываемая функция, которая возвращает размер программы, находящейся в данный момент в памяти. Программа фактически занимает местоположения от PAGE до PAGE + SIZE - 1 включительно, что составляет полное число байт SIZE. Заметьте, что байты начала - конца программы всегда присутствуют в памяти и поэтому после вода NEW, SIZE всегда равен 2.

FREE - это системная переменная, которая возвращает количество байтов свободной памяти, имеющейся в момент интерпретаци ключевого слова. Заметьте, что свободная память определяется как память между верхней частью пространства глобальных переменных и нижней частью стопе математического обеспечения (смотрите карту памяти ниже) и поэтому оно изменяется по ходу вычислений, т.к. в этой стопе хранятся промежуточные результаты. Это означает, что PRINT FREE + SIZE даст нам ответ, отличающийся от ответа PRINT SIZE + FREE.

****************************************************************

216

34.2 Использование машинного кода из Комала

Пользователь может вызвать подпрограммы машинного кода из Комала с помощью функции USR. Для этого необходимо вызвать один аргумент, адрес машинного кода и возвратить величину, взятую из Аккумулятора 6502, регистра Х, регистра Y и регистра статуса процессора в порядке AXYP от низких байтов до высоких байтов. При входе на машинный код, аккумулятор, регисры Х и Y устанавливаются на байты LSB, принадлежащие a#,x# и y#, а флаг устанавливается на LSB байт с#. Комал не включает в себя никакого ассемблера, но из него можно вызвать машинный объектный код. Код можно поместить или в резидентный модуль, или в одном из неиспользуемых буферов OS (напр. буфер RS232 на дисковой системе), или он может быть помещен в память пользователя и защищен. В последнем слуыае его необходимо загрузить в нижнюю часть памяти, а PAGE установить над последним требуемым местоположением. Например, если требуется 4К машинного кода в машине дискового базирования, которая имеет исходную установку PAGE на &F00, то можно запустить программу из двух частей:

   10 // Part One
   20 //
   30 page :+ 4096
   40 run "PART2"

   10 // Part Two
   20 //
   30 *LOAD CODE F00
   40
   50 REST OF PROGRAM
   ..
  130 a:=USR &F00

****************************************************************

217

34.3 Организация памяти и карта

Ниже приведена полная карта памяти для Комала.

МЕстоположения            Содержание
---------------------------------------------------------
&0000    до   &0084   Нулевая страница использования 
                      Комала
&0085         &008F   Свбодная
                      Использование оперативной системы
--------------------------------------------------------
                      Ззона и а#-z#
                      Рабочее пространство временной 
                      плавающей точки
                      Каталог переменных
                      Таблица характеристик файлов
                      Указатель на первую PROC или FUNC
                      Свободно
                      Стопа циклов
                      Аккумулятор строк (&680-&69F 
                      удваиваются как блок контроля 
                      файла, &6A0-6AF как блок OSWORD)
                      Линейный буффер прямого режима
                      Свободно
-------------------------------------------------------
PAGE                  Начало программы на Комале
PRGTOP                Конец программы на Комале
LOMEM    Смотрите     Начало блока глобальных переменных
VARTOP   детали       Конец блока глобальных переменных
       местоположений (Свободная память)
AESTKP   ниже         Низ стопы матобеспечения
LOCALL                Низ блока местных переменных
LOCALH                Верх блока местных переменных
HIMEM-1               Верх стопы матобеспечения
                      Верх языка пользователя RAM
-----------------------------------------------------
HIMEM     до          Видио память (если не во Втором
                      процессоре)
-----------------------------------------------------
                      Переводчик Комала
-----------------------------------------------------
                      Операционная система (&F800-&FFFF
                      во Втором процессоре
-----------------------------------------------------

****************************************************************

218

Полезные местоположения на нулевой странице:

             HIGMEM
             LOMEM
             AESTKP
             PAGE    Смотрите объяснения
             VARTOP    в карте
             PRGTOP
             LOCALL
             LOCALH
             CLOSED  Флаг-&FF, если внутри CLOSED PROC
                     или FUNC
             TXTPTR  двухбайтный указатель текущего
                     текста
             TXTOFF  Однобайтный обвод для TXTPTR
             ERFLAG  Номер наиболее недавней ошибки
                     (хотя меняется очень часто)
             PDBUGD  Не нулевая => структура программы
                     правильная. 
             LSTKP   Указатель стопы циклов

34.4 Структура программы

Каждая строка программы хранится в памяти в форме обозначений (смотрите перечень обозначений в секции 40.4). Формат строки, хотя и похож, но не совместим с Бейсиком ВВС.Вот он:

---------------------------------------------------

&0D !HI !LO !LL !IN !Текс строки !&0D (следующая строка)

------------------------------------------------------

HI и LO - это верхний и нижний байты номера строки.

LL - это длина строки (включая заголовок).

IN - идентация строки в структурах (2 пробела на структуру).

Конец программы обозначается HI,устанавливаемой на &FF. обозначения для ключевых слов представлены байтами в прелелах от &80 до &FD. Определители строк предшествуются битом 01. Любой, кто пишет для языка "toolkit" (набор инструментов) или похожие средства, должен помнить, что т.к. синтаксис проверяется при вводе строки, интерпритатор написан, исходя из допущения, что синтаксис правильный. Во время прогона ошибка обнаружена не будет, и поэтому любая ошибка в тексте программы скорее всего приведет к непоправимому разрушению. Любые модификации текста программы должны также изменять PDBUGD (смотрите карту памяти), чтобы указать интерпритатору, что структуру перед прогоном или просмотром необходимо еще раз проверить.

****************************************************************

219

Программисты, вводящие различные седства, должны помнить, что подпрограммы существуют внутри интерпритатора и выполняют следующие функции.

- Выводят для просмотра отдельную строку программы.

- Распрессовывают одиночный байт.

- Пересоединяют программу и соответсвенно изменяют указатели.

- Производят поиск данного символа в программе.

- Спрессовывают одиночную строку текста программы.

- Проверяют синтаксис спрессованной строки программы.

34.5 Несколко простых примеров

Пользователю могут потребоваться два писпособления - поместить байт в файл и взять байт из программы. Ими можно воспользоваться на открытых файлах с помощью оператора Комала OPEN слеующим образом:

 1000 FUNC file_get(fnumber)
 1010   y#:=&04B6?(8*fnumber)
 1020   a#:=USR &FFD7
 1030   IF a# AND &1000000 THEN
 1040     PRINT "EOT"
 1050     STOP
 1060   END IF
 1070   RETURN 255 AND a#
 1080 END FUNC file_get

 2000 PROC file_put(fnumber,byte)
 2010   y#:=&04B6?(8*fnumber)
 2020   a#:=byte
 2030   byte:=USR &FFD4
 2040 END PROC file_put

Любые другие функции, которые пользователь выполняет в машинном коде, должны быть выполнены такиим же способом, т.е. если они используются более одного раза, то пользователь должен вызвать процедуру или функцию, устанавливающую и выполняющую вызов USR.

****************************************************************

20

35 Соединение программ на Комале

--------------------------------------------------

Существует два метода соединения программ на Комале.

Если вы считаете, что полное сообщение об ошибках помогает, то следует использовать первый метод. По своему действию он такой же, как и подпрограмма в Бейсике ВВЦ, данная в пособии "Программирование на Бейсике в среде ОС ОНИКС".

Второй метод намного проще и, в основном, используют его. Он работает в Комале, потому что символ "~" обеспечивает строчную величину, которую можно лбъединить с командой загрузки и затем передать OSCLI, т.е. интерпретатору командной строки операционной системы. Представленная команда будет интерпретирована этой строчной величиной.

Метод 1
Шаг     Команда
1       load par
2       renumber 20000,1
3       *spool temp
4       list
5       *smpool
6       load part1
7       renumber
8       *exec temp
9       renumber

Метод 2
Шаг     Команда
1       load part1
2       oscli("LOAD part2 "+ -(PAGE+SIZE-2))
3       old
4       renumber
Обратите внимание на пробел между part2 и кавычкой.

****************************************************************

21

36 Перевод программ на Комал

-------------------------------------------------

Хотя Бейсик ВВС кажется похожим на Комал, мало что можно сделать просто вводом слегка модифицированных кодов Бейсика. Однако, возвращение к исходному алгоритму для программы и затем перекодировка в Комал с полным использованием широкого диапазона структур, даст нам программу, которую проще читать и сохранять.

Программы, написанные на Паскале, поддаются переводу на Комал легче, так как структурная природа двух языков имеет много общего.Однако, хотя требуемая для программы структура будет очень похожей, сам код будет несколько отличаться. В этом случае будет достаточно вернуться к структурной диаграмме (или блок- схеме), а не к исходному алгоритму.

Можно, используя текстовый редактор VIEW, переводить программы из одного языкового формата в другой с помощью команд операционной системы *SPOOL и *EXEC. Это позволяет хранить листинг программы на одном языке как последовательность кодов ASCII, а не в обычной форме обозначений, а затем презагрузить в другом языке, как если бы это был ввод с клавиатуры.

Общий план метода описан ниже, а детальное описание команд *SPOOL и *EXEC можно найти в пособиях "Программирование на Бейсике в среде ОС ОНИКС" или "Дисковая файловая система", а также в руководствах по VIEW.

Пример: чтобы составить на Комале программу comtest, соответствующую программе на Бейсике bastest, необходимо проделать следующее:

*BASIC

LOAD "bastest"

*SPOOL TEMP

LIST

*SPOOL

Введите

*WORD для перехода на VIEW

и

READ temp для загрузки файла.

****************************************************************

222

В этом месте, чтобы разбить многооператорные строки и составить необходимые структуры Комала, можно отредактировать ТЕМР, поставивив, например, ELSE на отдельную строку и закончив структуры IF оператором END IF. Чтобы произвести замены с помощью клавиш Y или N, можно использовать мощное средство REPLACE.

Пример:

REPLACE = :=     для присваивания, но не для условия
REPLACE % #      для целых переменных
REPLACE :REM //  для комментариев

Затем

SAVE temp   для сохранения файла VIEW
*COMAL      для замены языка
*EXEC temp  для загрузки файла в память, как программы

Если программа идет на Комале удовлетворительно, ее можно сохранить вводом

SAVE comtest

****************************************************************

23

37 Сообщения об ошибках

------------------------------------------------

В этой секции все сообщения об ошибках, производимые Комалом приведены в алфавитном порядке вместе с их номерами (которые могут быть полезны программистам низкого уровня) и указаниями на вызывающие их причины.

За всеми сообщениями об ошибках, производимыми во время прогона или отладки программы, следует листинг строки, на которой была найдена ошибка.

Bad DIM 36

Это сообщение указывает на то, что была предпринята попытка задать размеры массива или строки в пределах неразрешенных границ.

Bad GOTO 29

Сообщение производится, если была сделана попытка выйти из структуры или войти в нее в неразрешенном месте.

Bad program 21

Если секция памяти, содержащая программу, была испорчена и делается попытка выполнить какую-либо операцию на этой программе (напр. OLD, RUN, SAVE и т.д.), то производится сообщение об ошибке.

Bad type 23

Эта ошибка производится, если была сделана попытка выполнить операцию, которая требует переменную одного типа с другим (в структурах CASE, при считывании данных из файла или с RETURN).

Bad value 32

Это сообщение указывает, что была попытка произвести операцию, для которой данный цифровой аргумент не был в допусимых пределах (напр. SQR(-1)).

Can't CONT 18

CONT работает только, если выполнение программы было остановлено командой STOP или клавишей РЕД и, если с того момента программа не была испорчена. Попытка произвести CONT в других случаях даст нам эту ошибку.

****************************************************************

224

EOD 33

Эта ошибка генерируется при попытке считывать READ с операторов DATA, если в программе данных больше нет.

EOF 41

Эта ошибка производится при попытке READ или IMPUT из файла после того, как был достигнут конец файла.

Escape 17

Это указывает, что была нажата клавиша РЕД.

File open 38

Эта ошибка генерируется при попытке открыть файл, который уже открыт.

Name mismatch 25

Эта ошибка производится при предпрогонной проверке, если название или переменная в конце структуры не согласовывается с теми же в начале. Например, если название, следующее за оператором PROC не то же самое, что стоит после соответсвующего END PROC.

No (ключевое слово) 28

Эта ошибка генерируется при предпрогонной проверке, если оператор конца структуры не имеет соответствующего начала структуры.

No RETURNE 39

Ошибка генерируется, если при выполнении, END FUNC достигается прежде, чем встречается RETURN.

No room 20

Это сообщение указывает на то, что для предпринимаемой операции нет достаточного объема памяти.

Not allowed 26

Эта ошибка производится, когда интерпретатор встречает указание, которое, хотя и синтаксически правильное, в этом месте не разрешено.

****************************************************************

225

Not found 31

Эта ошибка генерируется или при попытке обращения к файлу, которого нет в данной системе файлов, или если предпринимается операция над переменной, которая не была заранее присвоена или над переменной или функцией, которая не была определена.

Not open 35

Если сделана попытка обратиться к закрытому файлу, производится эта ошибка.

Parm block error 40

Это сообщение указывает, что в параметрах, используемых для вызова процедуры или функцию, имеется ошибка.

Record overflow 34

Эта ошибка генерируется, если делается попытка WRITE или PRINT в файл произвольной выборки больше информации, чем может поместиться в заданной длине записи.

STOP 19

Если программный интерпретатор встречает команду STOP, то производится это сообщение, выполнение останавливается и печатается номер строки.

String too long 30

Эта ошибка происходит при попытке присвоить строку переменной, которая длиннее, чем заданная для строки максимальная длина (40 символов). Если размеры строки предворительно заданы не были, то принимается размер 40 и строке присваивается нулевая строка. Последующий оператор установки размера вызовет ошибку Variable exists.

Syntax error 22

Это сообщение генерируется, если при проверке строк во время ввода в синтаксисе строки обнаруживается ошибка. Таким же образом сообщается об ошибке несовпадения типов.

Too complex

Эта ошибка производится, если уровень "гнездования" сруктур слишком большой для возможностей интерпритатора.

****************************************************************

226

Unclosed at 24

Эта ошибка производится пред прогонной проверкой, если в требуемом месте нет оператора конца структуры. За сообщением седует или сама строка, или END, указыая где произошел пропуск.

Vapiable exists 37

Эта ошибка производится при попытке изменить размеры массива или строки.

****************************************************************

асть III - справочная секция

****************************************************************

229

38 Руководство по справочной секции

------------------------------------------------

Эта справочная секция предназначена для любого, кому необходимо проверить детали использования некоторых ключевых слов и операторов.

38.1 Формат краткого описания

Краткое описание ключевых слов и операторов содержит описание всех операторов, используемых в языке, за которым седует описание всех слов Комала в алфавитном порядке.

Каждое ключевое слово описано под следующими заголовками:

Ключевое слово      Минимальная
                    форма

Приводится ключевое слово и, в некоторых случаях, за ним следует несколько слов, которые объясняют происхождение данного слова. В правой части страницы находится краткая форма ключевого слова, которая воспринимается компьютером.

Опимание

Назначение и метод использования ключевого слова описаны обычной компьютерной терминологией. Для определенных математических функций это описание не будет иметь значения, если пользователь не знаком с привлеченными концепциями.

Ссылка

В данной секции имеются ссылки кпредыдущим частям пособия, в которых ключевые слова предъявляются впервые, иногда это ссылки к другим ключевым словам или главам.

Синтаксис

Приводится схема синтаксиса. Это самый наглядный способ продемонстрировать альтернативные и синтаксически правильные конструкции.

Схему нужно читать слева направо, начиная с ключевого слова или строки с левой стороны (указывающих, что какой-то другой элемент должен предшествовать этой конструкции). Конец обычно обозначен или концом строки (eol), возвратом каретки (cr), или линиией вправо, указывающей, что требуется дальнейшая работа.

****************************************************************

230

Любой путь, который доводит вас до конца схемы, представляет дозволенный синтаксис.

Пути, обозначенные стрелками,показывают, где могут быть альтернативные пути или повторы.

Путь со звездочкой, обозначенный срелками, показывает, что если остающийся в стороне элемент опускается, он будет автоматически вставлен.

Синтаксическая схема для выражений, элементов, перечней, постоянных, переменных и других терминов, используемых в индивидуальных схемах, приведены в начале краткого изложения ключевых слов и операторов.

Примеры

Для иллюстрации использования ключевого слова даются примеры. Где можно, даются примеры прямого режима и строк программы, иногда делаются ссылки на другие ключевые слова, которые тоже иллюсрируются примерами. Обратите внимание, что в примерах с номероми операторов используются скобки, хотя они и не требуются синтаксисом, но могут способствовать пониманию.

Ассоциируемые ключевые слова

Приводится список других ключевых слов, используемых в тех же структурах или с близким эффектом.Операторы

Операторы описываются так же, как и ключевые слова, но иногда группируются под одним заголовком. Смотрите певую страницу главы 39, где приведены порядок операторов и их разбивка по группам.

Обратите внимание, что при описании многих операторов используется термин "двоичный оператор". Это термин, используемый для описания оператора, которвй принимает два аргумента, один перед собой, а другой - после (напр. 1 + 2, или a AND b).

Предшествование, с которым действуют операторы, дано в секции 40.

38.2 Справочные таблицы

Справочные таблицы в главе 40 суммируют информацию, которая может быть необходима пользователю для некоторых операций. Вот перечень этих таблиц:

1. Коды ASCII, дающая коды для всех имеющихся символов и операций.

2. Коды VDU, дающая краткое изложение всех имеющихся кодов VDU и аргументов, которые они требуют.

****************************************************************

231

3. Вызовы *FX/OSBYTE, краткое описание некоторых наиболее полезных вызовов операционной системы, имеющихся с *FX или OSBYTE.

4. Список всех ключевых слов и операторов с их краткими формами и символами.

5. Список возможных сообщений об ошибках и номеров ошибок.

6. Список предшествования, показывающий порядок действия операторов при отсутствии скобок, а также действующие пределы операций и их точность.

.сс

[an error occurred while processing this directive]