[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]