Справочный листок

Система программирования FOCAL (FOrmula CALculation) была разработана фирмой DEC в середине 60-х гг. и поставлялась с ЭВМ PDP-8. Впоследствии Фокал поставлялся в ОС RT-11 до четвёртой версии включительно. Основное назначение Фокала - облегчение программирования внешних устройств в системах управления экспериментами, сбора и обработки данных. По сравнению с Бейсиком в Фокале более краткая запись команд. Их число существенно меньше, кроме того, имеются функции обращения непосредственно к адресам системной магистрали, что и позволяет управлять любыми внешними устройствами, к ней подключёнными.

Фокал используется в БК-0010 из-за своей простоты, что особенно важно для микро-ЭВМ с малым объёмом памяти. Мы называем Фокал системой программирования, потому что в ней для создания, отладки и выполнения программы пользователя применяются одни и те же средства.

Общая форма программы. Система программирования Фокал является интерпретирующей, т.е. все команды хранятся в памяти в виде текстовых строк. Система читает строки по порядку номеров и выполняет содержащиеся в них команды. Если мы вводим строку без номера, то система начинает выполнять её сразу после нажатия клавиши ввод, в противном случае запоминает её.

Интерпретирующей системе безразлично, в каком порядке введены строки. Это справедливо как для Бейсика, так и для Фокала.

Любая строка в программе должна иметь вид

НГ.НС <пробел> <имя оператора> <пробел> [<аргумент>, <аргумент>...]

где

НГ

- номер группы строк, который может меняться от 1 до 99,

 

НС

- номер строки в группе, который может меняться от 01 до 99.

Как уже было сказано, если номера группы и строки пропущены, то строка выполняется немедленно. Если пропущен только номер строки, то он считается равным 01.

Напишем простенькую программу, которая поможет нам понять основные принципы Фокала.

Пусть нам необходимо продемонстрировать выполнение пяти арифметических операций, доступных нам в Фокале, в порядке повышения их приоритета в арифметическом выражении. Для этого необходимо:

Программа выглядит следующим образом.

1.01 X FCHR (12); С ОЧИСТКА ЭКРАНА
1.05 Т !,"ПРИМЕР ВЫПОЛНЕНИЯ ДОПУСТИМЫХ ОПЕРАЦИЙ"
1.10 А "ВВЕДИТЕ ЧИСЛО А",А
1.11 А "ВВЕДИТЕ ЧИСЛО В",В
2.01 С ВЫЧИСЛЕНИЕ РЕЗУЛЬТАТОВ ОПЕРАЦИЙ
2.10 S С=А-В
2.11 Т !,"А-В=",А,"-",В,"=",С
2.20 S С=А+В
2.21 Т !,"А+В=",А,"+",В,"=",С
2.30 S С=А*В
2.31 Т !,"А*В=",А,"*",В,"=",С
2.40 S С=А/В
2.41 Т !,"А/В=",А,"/",В,"=",С
2.50 S С=А^B
2.51 Т !,"А^B=",A,"^",В,"=",С

Так как все действия выполняются интерпретатором Фокала, то для запуска программы необходимо указать, на какой номер строки передать управление. Это делается командой G (от GOTO).

G 1.01 ввод

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

После нажатия клавиши ввод экран очистился и на нём появились приглашения, в ответ на которые мы введём числа, например 3 и 2:

ВВЕДИТЕ ЧИСЛО А:3 ввод
ВВЕДИТЕ ЧИСЛО В:2 ввод

После этого на экране появилась таблица:

А-B=3.0000-2.0000=1.0000
А+В=3.0000+2.0000=5.0000
А*В=3.0000*2.0000=6.0000
А/В=3.0000/2.0000=1.5000
А^В=3.0000^2.0000=9.0000

Разберём входящие в эту программу операторы.

Оператор X (выполнить) вызывает выполнение встроенной функции, которых в Фокале 21, из них 8 допускают выполнение без присваивания значений какой-либо переменной. Опишем их.

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

FCHR(X1,X2,...,XN) - вывод символьной информации. Позволяет выводить на экран символы Х1,Х2,..., заданные десятичным кодом, в том числе и управляющие. В нашем случае код 12 соответствует клавише СБР, очищающей экран.

FX(1,АДРЕС,ДАННЫЕ) - позволяет записывать данные по указанному адресу системной магистрали.

FSBR(НГ.НС,АРГУМЕНТ) - выполнение подпрограммы пользователя. Значение аргумента присваивается специальной переменной, &, после чего управление передаётся на указанный номер группы и строки НГ.НС. Для возврата в основную программу в подпрограмме должен стоять оператор R (RETURN - возврат). При возврате значение переменной & сохраняется и может быть использовано в основной программе.

FK(ПОЗИЦИЯ,СТРОКА) - установка курсора на экране в текстовом режиме на указанную строку и позицию в строке. Выполнение данной функции не изменяет координаты точки в графическом режиме.

FT(КОП,X,Y) - управление точкой с координатами X и Y на экране в графическом режиме. При КОП=1 точка зажигается, при КОП=0 - гаснет. Координаты точки запоминаются как текущие.

FV(КОП,XX,YY) - рисование/гашение отрезка, начинающегося от текущих координат точки и кончающегося указанными в качестве аргументов. Новые координаты становятся текущими. Смысл КОП тот же, что и в операторе FT(КОП,X,Y).

FP(КОП,МАСКА) - работа с портом ввода/вывода, который позволяет управлять устройствами пользователя. Для их подключения используют контакты на правом разъёме, напряжение на которых +0,5 В, если в соответствующем бите порта записан 0, и +2,4 В, если записана 1. КОП может принимать значения 1 или 2. В качестве маски может использоваться восьмеричное число от 0 до 177777 или переменная с десятичным значением от -32768 до +32767.

В первой строке нашей программы после точки с запятой стоит ещё один оператор С (COMMENT - комментарий). Всё, что следует за ним, воспринимается Фокалом как комментарий и при выполнении игнорируется. Текст комментария хранится в памяти, поэтому при всей желательности комментировать программу применять этот оператор следует экономно.

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

Текстовая строка, заключённая в кавычки, без изменений (и без кавычек) выводится на экран, а символ ¤ выводит на экран значения всех переменных программы.

Оператор А в строках 1.10 и 1.11 (от ASK - спрашивать) позволяет принять (ввести с клавиатуры) значения для списка переменных, указанных в качестве аргументов. Если в списке задана текстовая строка, заключённая в кавычки, то она выводится на экран. Имена переменных (в нашем случае А и В) могут быть любой длины и состоять из латинских букв и цифр, но различаются Фокалом только по первым двум символам. Имя переменной не должно начинаться с буквы F или с цифры.

Операторы в строках 2.10, 2.20, 2,30, 2.40, 2.50 занимаются только вычислениями. S (от SET - установить) устанавливает значение переменной С равным некоторому выражению.

В нашем случае программа закончилась только потому, что был исчерпан список строк. Однако иногда необходимо прекратить работу не в последней строке, а в середине текста программы. Для этого используется оператор Q (QUIT - оставлять, покидать).

Оператор повторения Фокала F (FOR - для)

10.01 F N=K0,M,K1; <операторы для выполнения>

по-русски можно описать так: для переменной N, значения которой изменяются от К0 с шагом М до К1, выполнить операторы в данной строке. В качестве К0, К1 и М может использоваться любое арифметическое выражение. Фокал прекратит выполнение группы операторов при N>K1; если шаг приращения М пропущен, то считается, что М=1.

Иногда в строке не хватает места для операторов, которые необходимо выполнить. В таких случаях применяется оператор D перехода к выполнению группы строк (DO - делать), в качестве аргумента которого используется номер группы строк, подлежащих выполнению. Выполнение группы операторов заканчивается либо по исчерпанию строк в группе, либо по оператору R(возврат).

Оператор условного перехода I

1.10 I(выражение) А,В,С 

передаёт управление в зависимости от значения выражения; если оно меньше нуля, управление передаётся на строку с номером А, равно нулю - с номером В, больше нуля - с номером С.

Фрагмент программы с условным переходом может выглядеть так:

1.01 А "ВВЕДИТЕ ЗНАЧЕНИЕ А",А
1.02 А "ВВЕДИТЕ ЗНАЧЕНИЕ В",В
1.10 I (А-В) 1.20, 1.30, 1.40
1.20 Т !,"А=",А,"В=",В,"А МЕНЬШЕ В"
1.21 G 1.01
1.30 Т !,"А=В=",А,"А РАВНО В"
1.31 G 1.01
1.40 Т !,"А=",А,"В=",В,"А БОЛЬШЕ В"
1.41 G 1.01

Фокал позволяет непосредственно обрабатывать только числовую информацию, поэтому в нём нет средств описания типов данных. В Фокале могут быть использованы любые числа в диапазоне от 10-38 до 1038 со знаком + или -, записанные в виде десятичных дробей или в экспоненциальном формате. Все они округляются до шести значащих цифр.

Фокал позволяет использовать одно- и двухмерные массивы. Индекс массива может быть числом, переменной или арифметическим выражением. Пределы изменения индекса:

Индексы заключаются в круглые скобки, а в случае двухмерного массива разделяются запятой. Реальный размер массива ограничен объёмом оперативной памяти и существенно меньше теоретически возможного.

Для просмотра текста программы служит команда W (от WRITE - писать)

W НГ.НС

Если НС не указан, то выводится указанная группа строк, если нет ни НС, ни НГ, то выводится весь текст программ.

Для изменения отдельной, уже введённой строки применяется команда М (MODIFY - модифицировать), в качестве аргумента которой указываются НГ и НС. После ввода этой команды на экран будет выведена указанная строка, которую можно редактировать с помощью клавиш:

→ - сдвиг курсора вправо;

← - сдвиг курсора влево;

|--> - размыкание текста строки;

<--| - смыкание текста строки;

<--|- - удаление символа перед курсором.

В разомкнутое место строки можно вставлять символы обычным образом. После окончания редактирования нужно нажать клавишу ввод.

С помощью команды Е (ERASE - удалить) можно удалить переменные программы. Если в качестве аргумента использовать символ Т, то будет удалён текст программы. Для удаления и текста программы, и переменных используется аргумент A (ALL – всё). Если в качестве аргумента будут указаны НГ и НС, то будет удалена только эта строка.

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

10.20 S AW=FSIN(3.14159/4)

Аргумент функции - выражение, стоящее в скобках справа от имени функции. Сами функции также могут входить в состав арифметических выражений. Оператор Т заменяет присвоение значения функции переменной выводом этого значения на экран, например:

*Т FCOS(0.5000)
0.8776

Всё это относится к следующим функциям:

FSIN(X) - синус (аргумент в радианах);

FCOS(X) - косинус (аргумент в радианах);

FTAN(X) - тангенс (аргумент в радианах);

FASIN(X) - арксинус (|Х|≤1);

FACOS(X) - арккосинус (|X|≤1);

FATAN(X) - арктангенс;

FLOG(X) - натуральный логарифм (Х>0);

FEXP(X) - показательная функция;

FSGN(X) - знак числа (1, если Х>0, 0, если Х≤0);

FITR(X) - целая часть числа;

FABS(H) - абсолютная величина числа;

FRAN( ) - случайное число;

FSQT(X) - корень квадратный из числа.

О функции FCHR(-1) следует сказать особо. Она возвращает десятичное значение кода символа нажатой клавиши. С помощью следующей короткой программы можно выводить на экран коды клавиш:

1.1 Т FCHR(-1); G 1.1

Для чтения содержимого памяти по непосредственно указанному адресу системной магистрали используется функция FX(КОП, АДРЕС, МАСКА). Если КОП=+1, то функция считывает содержимое указанного адреса без изменения, если КОП=0, то из ячейки памяти будут прочитаны только те разряды, одноименные биты которых в маске равны единице.

Таким же образом осуществляется работа с портом ввода/вывода при помощи функции FP(КОП,МАСКА). Если КОП=0, то функция возвращает значение регистра ввода в соответствии с указанной маской. Если КОП=3, то таким же образом читается регистр вывода.

Функция FSBR(НГ.НС,X) возвращает значение специальной переменной &, которое вычисляется в подпрограмме пользователя.

 

Performed by © gid, 2012-2022.