[an error occurred while processing this directive]
.сс
.шп6
33 Прочие функции и средства
.шп14
33.1 Стандартные математические функции
.шп0
Комал обеспечивает следующие стандартные математические функции:
ACS (число) возвращает арк(инверсный)-косинус в радиантах.
ASN (число) возвращает арк(инверсный)-синус в радиантах.
ANT (число) возвращает арк(инверсный)-тангенс в радиантах.
COS (угол) возвращает косинус угла, доанного в радиантах
DEG (радиант) возвращает градусный эквивалент.
EXP (число) возврашает показатель степени.
LN (положительное число) возвращает натуральный логарифм
LOG (положительное число) возвращает 10-чный логарифм.
RAD (градус) возвращает эквивалент радианта.
SIN (угол) возвращает синус угла, данного в радиантах.
SQR (положительное число) возвращает квадратный корень.
TAN (угол) возвращает тангенс угла, данного в радиантах.
.шп14
33.2 Звук
.шп0
Из-за аппаратных ограничений, на стандартной конфигурации Агата не возможно получить качественный звук, поэтому его пользователям можно пропустить этот радел.
Музыкальный синтезатор имеет широкие возможности генерировать звуки с помощью ключевых слов SOUND и ENVELOPE. Для простых эффектов можно использовать только оператор SOUND, оператор ENVELOPE обеспечивает контроль более широкого диапазона. При простейшем использовании за SOUND следуют четыре аргумента, например:
SOUND c,a,p,d c - это номер канала от 0 до 3 а - это амплитуда или громкость от 0 до -15 р - это высота от 0 до 255 d - это продолжительность от 0 до 255
Номер канала определяет, который из четырех голосов будет использован: Канал 0 производит только шум, тогда как каналы 1, 2 и 3 производят чистые ноты.
Амплитуда может изменяться от 0 (отключена)) до -15 (громко).
Высота выбирает ноты в интервалах четверти полутона. Когда высота установлена на 53, производится среднее си, другие ноты покрывают пять октав и генерируются с помощью величин, приведенных ниже. Те, кто может читать ноты, увидят, что Moderato = 10 будет самым приемлимым для следующих установок продолжительности.
╠┓ | | || | | || | | ┏═╣┗ ┏═╣ ┏═╣ ┏═┓ || || | | | | ┗═┛ 5 ┗═┛ 10 ┗═┛ 20 ┗═┛ 40 ╔════╦═══════════════════════════╗ | | Номер октавы | ╠════╬═══╦═══╦═══╦═══╦═══╦═══╦═══╣ |Нота| 1| 2| 3| 4| 5| 6| 7| ╠════╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣ |До | 1| 49| 97|145|193|241| | |Ре# | 0| 45| 93|141|189|237| | |Ре | | 41| 89|137|185|233| | |Ми# | | 37| 85|133|181|229| | |Ми | | 33| 81|129|177|225| | |Фа# | | 29| 77|125|173|221| | |Фа | | 25| 73|121|169|217| | |Соль| | 21| 69|117|165|213| | |Ля# | | 17| 65|113|161|209| | |Ля | | 13| 61|109|157|205|253| |Си# | | 9| 57|105|153|201|249| |Си | | 5| 53|101|149|197|245| ╚════╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝
В качестве простого примера введите следующую программу, котораяпроиграет хорошо известную тему из кинофильма:
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 можно расширить в двух основных областях. Во первых, можно выбрать огибающую, которая изменит амплитуду и высоту звука во время проигрывания;
во вторых, можно синхронизировать ноты в аккорд.
Эти методы управления звуком весьма сильные, но несколько сложные. Детальное описание приведено в Части III в главе SOUND и ENVELOPE.
Вот пример более сложного звука, получаемого с помощью оператора ENVELOPE
ENVELOPE 1,1,-26,-36,-45,255,255,255,127,0,0,-127,126,0
SOUND 1,1,255,255
.шп14
33.3 Аналоговый вход
.шп0
ПЭВМ АГАТ имеет аналоговый вход для подключения пультов или джойстика.
В Модели 9 ПЭВМ АГАТ имеется два аналоговых входа. Каждый аналогвый преобразователь принимает аналоговое входное сопротивление и подает на выход цифровое выражение этого сопротивления. Аналоговое сопротивление может контролироваться, например, положением манипулятора, или оно может быть выходом с какого-нибудь датчика , используемого математическим обеспечением.
Приемлемое входное сопротивление нажодится в пределах от 0 до 100 кОм. Сответствующий диапазон цифрового выхода - от 0 до 65520, т.е. 16-ти битное двоичное число. В настоящее время материальная часть компьютеров может вернуть величину только с точностью до 8 бит, но есть возможности увеличить ее до 16 бит, если есть необходимые устройства.
Числа, возвращаемые аналоговым преобразователем, таким образом, увеличиваются с шагом 256 в пределах от 0 до 65520, но если угодно, то простое деление на 256 даст нам числа в пределах от 0 до 256.
Точный метод управления аналоговыми входными каналами описан в Части III, в главе ADVAL.
.сс
.шп6
4 Аспекты низкого уровня Комала
.шп0
В этой секции обсуждаются различные аспекты программирования низкого уровня в среде Комала.
.шп14
34.1 Системные функции и переменные
.шп0
Комал использует следующие ключевые слова для обеспечения пользователя информацией о памяти, используемой языком: 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.
.шп14
34.2 Использование машинного кода из Комала
.шп0
Пользователь может вызвать подпрограммы машинного кода из Комала с помощью функции 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
.шп14
34.3 Организация памяти и карта
.шп0
Ниже приведена полная карта памяти для Комала.
Местоположения Содержание --------------------------------------------------------- &0000 до &0084 Нулевая страница использования Комала &0085 &008F Свободная &0090 &00FF Использование оперативной системы --------------------------------------------------------- &0400 &046B ZONE и а#-z# &046C &047F Рабочее пространство для операций с плавающей точкой &0480 &04B5 Каталог переменных &04B6 &04E9 Таблица характеристик файлов &04EA &04EB Указатель на первую PROC или FUNC &04EC &04FF Свободно &0500 &05FF Стек циклов &0600 &06FF Аккумулятор строк (&680-&69F используются как блок контроля файла, &6A0-6AF как блок OSWORD) &0700 &077F Линейный буфер командного режима &0780 &07FF Свободно --------------------------------------------------------- PAGE Начало программы на Комале PRGTOP Конец программы на Комале LOMEM Смотрите Начало блока глобальных переменных VARTOP конкретные Конец блока глобальных переменных адреса (Свободная память) AESTKP ниже Низ программного стека LOCALL Низ блока локальных переменных LOCALH Верх блока локальных переменных HIMEM-1 Верх програамного стека Верх рабочей памяти пользователя --------------------------------------------------------- HIMEM до &7FFF Видео память (если не во Втором процессоре) --------------------------------------------------------- &8000 &BFFF Интерпретатор Комала --------------------------------------------------------- &D000 &FFFF Операционная система (&F800-&FFFF во Втором процессоре --------------------------------------------------------- Полезные адреса нулевой страницы: &00,01 HIMEM ┓ &02,03 LOMEM | &04,05 AESTKP | &06,07 PAGE ┗ Смотрите объяснения &08,09 VARTOP | в карте памяти &0C,0D PRGTOP | &0E,0F LOCALL | &10,11 LOCALH ┛ &12 CLOSED Флаг-&FF, если внутри CLOSED PROC или FUNC &13,14 TXTPTR двухбайтный указатель текущего текста &15 TXTOFF Однобайтный указатель для TXTPTR &3F ERFLAG Номер последней ошибки (хотя меняется очень часто) &68 PDBUGD Не нулевая => структура программы правильная. &6F LSTKP Указатель стека циклов
.шп14
34.4 Структура программы
.шп0
Каждая строка программы хранится в памяти в форме обозначений (смотрите перечень обозначений в секции 40.4). Формат строки, хотя и похож, но не совместим с Бейсиком ВВС.Вот он:
╔════╦═══╦═══╦═══╦═══╦═════════════╦══════════════════════╗ |&0D |HI |LO |LL |IN |Текст строки |&0D (следующая строка)| ╚════╩═══╩═══╩═══╩═══╩═════════════╩══════════════════════╝
HI и LO - это верхний и нижний байты номера строки.
LL - это длина строки (включая заголовок).
IN - выделение строки в структурах (2 пробела на структуру).
Конец программы обозначается HI := &FF. обозначения для ключевых слов представлены байтами в прелелах от &80 до &FD. Определители строк предшествуются байтом 01. Любой, кто пишет для языка "toolkit" (набор инструментов) или похожие средства, должен помнить, что т.к. синтаксис проверяется при вводе строки, интерпретатор написан, исходя из допущения, что синтаксис правильный. Во время прогона ошибка обнаружена не будет, и поэтому любая ошибка в тексте программы скорее всего приведет к непоправимому разрушению. Любые модификации текста программы должны также изменять PDBUGD (смотрите карту памяти), чтобы указать интерпритатору, что структуру перед прогоном или просмотром необходимо еще раз проверить.
Программисты, вводящие различные средства, должны помнить, что подпрограммы существуют внутри интерпретатора и выполняют следующие функции.
- Выводят для просмотра отдельную строку программы.
- Распаковывают одиночный байт.
- Пересоединяют программу и соответственно изменяют указатели.
- Производят поиск данного символа в программе.
- Упаковывают одиночную строку текста программы.
- Проверяют синтаксис упакованной строки программы.
.шп14
34.5 Несколько простых примеров
.шп0
Пользователю могут потребоваться два приспособления - поместить байт в файл и взять байт из файла. Ими можно воспользоваться для открытых файлов с помощью оператора Комала 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.
.сс
.шп6
35 Слияние программ на Комале
.шп0
Существует два метода соединения слияния на Комале.
Если вы считаете, что полное сообщение об ошибках помогает, то следует использовать первый метод. По своему действию он такой же, как и подпрограмма в Бейсике ВВС, данная в пособии "Программирование на Бейсике в среде ОС ОНИКС".
Второй метод намного проще и, в основном, используют его. Он работает в Комале, потому что символ "~" обеспечивает строчную величину, которую можно объединить с командой загрузки и затем передать OSCLI, т.е. интерпретатору командной строки операционной системы. Представленная команда будет интерпретирована этой строчной величиной.
Метод 1
Шаг Команда 1 load part2 2 renumber 20000,1 3 *spool temp 4 list 5 *spool 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 и кавычкой.
.сс
.шп6
36 Перевод программ на Комал
.шп0
Хотя Бейсик ВВС кажется похожим на Комал, мало что можно сделать просто вводом слегка модифицированных кодов Бейсика. Однако, возвращение к исходному алгоритму для программы и затем перекодировка в Комал с полным использованием широкого диапазона структур, даст нам программу, которую проще читать и сохранять.
Программы, написанные на Паскале, поддаются переводу на Комал легче, так как структурная природа двух языков имеет много общего.Однако, хотя требуемая для программы структура будет очень похожей, сам код будет несколько отличаться. В этом случае будет достаточно вернуться к структурной диаграмме (или блок- схеме), а не к исходному алгоритму.
Можно, используя текстовый редактор VIEW, переводить программы из одного языкового формата в другой с помощью команд операционной системы *SPOOL и *EXEC. Это позволяет хранить листинг программы на одном языке как последовательность кодов ASCII, а не в обычной форме обозначений, а затем презагрузить в другом языке, как если бы это был ввод с клавиатуры.
Общий план метода описан ниже, а детальное описание команд *SPOOL и *EXEC можно найти в пособиях "Программирование на Бейсике в среде ОС ОНИКС" или "ОС ОНИКС (Руководство пользователя)", а также в руководствах по VIEW.
Пример: чтобы составить на Комале программу comtest, соответствующую программе на Бейсике bastest, необходимо проделать следующее:
*BASIC LOAD "bastest" *SPOOL TEMP LIST *SPOOL Введите *WORD для перехода на VIEW и READ temp для загрузки файла.
В этом месте, чтобы разбить многооператорные строки и составить необходимые структуры Комала, можно отредактировать temp, поставив, например, ELSE на отдельную строку и закончив структуры IF оператором END IF. Чтобы произвести замены с помощью клавиш Y или N, можно использовать мощное средство REPLACE.
Пример:
REPLACE = := для присваивания, но не для условия REPLACE % # для целых переменных REPLACE :REM // для комментариев
Затем
SAVE temp для сохранения файла VIEW *COMAL для замены языка *EXEC temp для загрузки файла в память, как программы
Если программа идет на Комале удовлетворительно, ее можно сохранить вводом
SAVE comtest
.сс
.шп6
37 Сообщения об ошибках
.шп0
В этой секции все сообщения об ошибках, производимые Комалом приведены в алфавитном порядке вместе с их номерами (которые могут быть полезны программистам низкого уровня) и указаниями на вызывающие их причины.
За всеми сообщениями об ошибках, производимыми во время прогона или отладки программы, следует листинг строки, на которой была найдена ошибка.
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 в других случаях даст нам эту ошибку.
EOD 33
Эта ошибка генерируется при попытке считывать READ с операторов DATA, если в программе данных больше нет.
EOF 41
Эта ошибка производится при попытке READ или INPUT из файла после того, как был достигнут конец файла.
Escape 17
Это указывает, что была нажата клавиша РЕД.
File open 38
Эта ошибка генерируется при попытке открыть файл, который уже открыт.
Name mismatch 25
Эта ошибка производится при предпрогонной проверке, если название или переменная в конце структуры не согласовывается с теми же в начале. Например, если название, следующее за оператором PROC не то же самое, что стоит после соответсвующего END PROC.
No (ключевое слово) 28
Эта ошибка генерируется при предпрогонной проверке, если оператор конца структуры не имеет соответствующего начала структуры.
No RETURN 39
Ошибка генерируется, если при выполнении, END FUNC достигается прежде, чем встречается RETURN.
No room 20
Это сообщение указывает на то, что для предпринимаемой операции нет достаточного объема памяти.
Not allowed 26
Эта ошибка производится, когда интерпретатор встречает указание, которое, хотя и синтаксически правильное, в этом месте не разрешено.
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 27
Эта ошибка производится, если уровень вложенности структур слишком большой для возможностей интерпретатора.
Unclosed at 24
Эта ошибка производится предпрогонной проверкой, если в требуемом месте нет оператора конца структуры. За сообщением следует или сама строка, или END, указыая где произошел пропуск.
Vapiable exists 37
Эта ошибка производится при попытке изменить размеры массива или строки.
.сс
.цв
.шп6
Часть III - справочная секция
.ов
38 Руководство по справочной секции
.шп0
Эта справочная секция предназначена для любого, кому необходимо проверить детали использования некоторых ключевых слов и операторов.
.шп14
38.1 Формат краткого описания
.шп0
Краткое описание ключевых слов и операторов содержит описание всех операторов, используемых в языке, за которым седует описание всех слов Комала в алфавитном порядке.
Каждое ключевое слово описано под следующими заголовками:
.шп2
КЛЮЧЕВОЕ СЛОВО Минимальная форма
.шп0
Приводится ключевое слово и, в некоторых случаях, за ним следует несколько слов, которые объясняют происхождение данного слова. В правой части страницы находится краткая форма ключевого слова, которая воспринимается компьютером.
.шп2
Описание
.шп0
Назначение и метод использования ключевого слова описаны обычной компьютерной терминологией. Для определенных математических функций это описание не будет иметь значения, если пользователь не знаком с привлеченными концепциями.
.шп2
Ссылка
.шп0
В данной секции имеются ссылки к предыдущим частям пособия, в которых ключевые слова предъявляются впервые, иногда это ссылки к другим ключевым словам или главам.
.шп2
Синтаксис
.шп0
Приводится схема синтаксиса. Это самый наглядный способ продемонстрировать альтернативные и синтаксически правильные конструкции.
Схему нужно читать слева направо, начиная с ключевого слова или строки с левой стороны (указывающих, что какой-то другой элемент должен предшествовать этой конструкции). Конец обычно обозначен или концом строки (eol), возвратом каретки (cr), или линиией вправо, указывающей, что требуется дальнейшая работа.
Любой путь, который доводит вас до конца схемы, представляет дозволенный синтаксис.
Пути, обозначенные стрелками,показывают, где могут быть альтернативные пути или повторы.
Путь со звездочкой, обозначенный срелками, показывает, что если остающийся в стороне элемент опускается, он будет автоматически вставлен.
Синтаксическая схема для выражений, элементов, перечней, постоянных, переменных и других терминов, используемых в индивидуальных схемах, приведены в начале краткого изложения ключевых слов и операторов.
.шп2
Примеры
.шп0
Для иллюстрации использования ключевого слова даются примеры. Где можно, даются примеры прямого режима и строк программы, иногда делаются ссылки на другие ключевые слова, которые тоже иллюсрируются примерами. Обратите внимание, что в примерах с номероми операторов используются скобки, хотя они и не требуются синтаксисом, но могут способствовать пониманию.
.шп2
Ассоциируемые ключевые слова
.шп0
Приводится список других ключевых слов, используемых в тех же структурах или с близким эффектом.Операторы
Операторы описываются так же, как и ключевые слова, но иногда группируются под одним заголовком. Смотрите певую страницу главы 39, где приведены порядок операторов и их разбивка по группам.
Обратите внимание, что при описании многих операторов используется термин "двоичный оператор". Это термин, используемый для описания оператора, которвй принимает два аргумента, один перед собой, а другой - после (напр. 1 + 2, или a AND b).
Предшествование, с которым действуют операторы, дано в секции 40.
.шп14
38.2 Справочные таблицы
.шп0
Справочные таблицы в главе 40 суммируют информацию, которая может быть необходима пользователю для некоторых операций. Вот перечень этих таблиц:
1. Коды ASCII, дающая коды для всех имеющихся символов и операций.
2. Коды VDU, дающая краткое изложение всех имеющихся кодов VDU и аргументов, которые они требуют.
3. Вызовы *FX/OSBYTE, краткое описание некоторых наиболее полезных вызовов операционной системы, имеющихся с *FX или OSBYTE.
4. Список всех ключевых слов и операторов с их краткими формами и символами.
5. Список возможных сообщений об ошибках и номеров ошибок.
6. Список предшествования, показывающий порядок действия операторов при отсутствии скобок, а также действующие пределы операций и их точность.
.ст комал15а
[an error occurred while processing this directive]