В. МОНАХОВ
Фокал БК-0010 и его расширения
В нашем журнале (Информатика и образование, 1987, №3, стр. 63) уже публиковались сведения о Фокале. К сожалению, описанная там версия отличается от Фокала БК-0010, интерпретатором которого оснащено подавляющее большинство выпущенных ПЭВМ «Электроника БК-0010», «Электроника БК-0010Ш» и «Электроника БК-0010.01» (далее - БК). В прилагаемой к БК документации также опущен ряд важных особенностей этого языка программирования. Поэтому возникла идея изложить современное состояние Фокала БК, включая все его известные расширения.
За последнее время Фокал БК (далее просто Фокал) не раз подвергался критике, а Минпрос СССР вообще отказался от использования его в школах, приняв за базовые языки Рапиру и Бейсик. Однако причиной критических выступлений зачастую была неосведомлённость их авторов, ругавших некий примитивный язык. Таков ли Фокал на самом деле? Что представляет он собой сегодня вместе с расширениями?
Начнём с того, что Фокал принадлежит к операторным языкам высокого уровня, но, в отличие от других языков этого класса (таких, как Фортран или Бейсик), имеет очень простой синтаксис, быстро и легко осваивается даже непрофессиональными пользователями, способен к неограниченному расширению.
Он включает все операторы, присущие языку программирования высокого уровня: присваивания, условного и безусловного перехода, повторения (цикла), обращения к подпрограмме, ввода информации с клавиатуры и с магнитной ленты, вывода информации на экран дисплея и на магнитную ленту, а также обычный набор встроенных арифметических функций, включая любые функции, программируемые пользователем.
Среди возможностей Фокала:
- функция прямого обращения к памяти ПЭВМ, выполняющая три операции (запись в память, чтение и конъюнкция содержимого памяти и маски);
- развитые графические функции, позволяющие создавать на экране изображения с высоким разрешением (графический экран БК имеет поле 512 x 256 точек);
- функции обработки символьной информации;
- функция, обеспечивающая работу с параллельным программируемым портом ввода-вывода, к которому можно подключать различные внешние приборы, управляемые ПЭВМ;
- развитые отладочные средства, включающие автоматическое обнаружение ошибки в программе и указание её местонахождения и характера, трассировку программы при исполнении, операторы распечатки на экране дисплея текста программы и текущих значений всех переменных, оператор редактирования текста программы, оператор стирания части или всего текста программы, а также значений переменных, оператор вычисления размера свободной памяти, отведённой пользователю, оператор, выдающий справочную информацию о языке.
Расширения Фокала позволяют:
- вводить с магнитной ленты или другого компьютера программы не только целиком, но и отдельными блоками, присоединяемыми к уже существующей в памяти программе;
- перенумеровывать строки программы;
- организовывать массивы плотно упакованных символьных переменных, целых и вещественных чисел и вводить функции для разнообразной обработки этих массивов;
- использовать в Фокале подпрограммы, написанные в машинных командах.
Возможность использования машинных подпрограмм поддерживается целой серией системных программ для БК; в их числе несколько отладчиков, ассемблеров и реассемблеров.
Таким образом, по своим возможностям БК с Фокалом практически не уступает БК с Бейсиком, не говоря уже о ПЭВМ с Рапирой. В то же время он выгодно отличается от них компактностью и простотой, а главное, предоставлением пользователю большей памяти для размещения программы и данных. Дело в том, что Бейсик БК очень нерационально расходует память. Для работы программы он создаёт в ОЗУ некое подобие объектного кода, которое занимает почти столько же места, сколько и исходный текст программы, который также хранится. Таким образом, Бейсик БК почти вдвое уменьшает реально доступную пользователю оперативную память. Фактически на нём можно писать программы, которые вместе с переменными занимают объём не более 7 К байтов в режиме полного экрана и 14К байтов - в режиме расширенной памяти. В БК с Фокалом даже при использовании самой крупной программы расширения (СФМ) в распоряжении пользователя остаётся соответственно 13 и 25К байтов. Если же учесть, что и сами программы на Фокале получаются почти в 1,5-2 раза короче, чем на Бейсике, то реальная экономия памяти окажется ещё более ощутимой.
Нельзя сбрасывать со счетов и то, что для БК с Фокалом уже разработано полтысячи программ, позволяющих решать многие практические задачи школьной информатики, и накоплен значительный опыт программирования, которым неразумно было бы пренебречь.
Объём статьи не позволяет рассмотреть в деталях весь Фокал. Остановимся лишь на некоторых его особенностях, которые повышают эффективность программ или не нашли достаточного освещения в руководстве пользователя, прилагаемом к компьютеру.
О номерах строк. В руководстве указано, что номера строк должны быть нецелыми числами, лежащими в интервале от 1.01 до 99.99 с интервалом 0.01 и от 100.1 до 127.9 - с интервалом 0.1. Это не совсем точно. Так выводятся номера строк оператором WRITE, но в БК-0010 они представлены иначе. Каждый номер представляет собой целое число, занимающее в памяти два соседних байта и лежащее в интервале от 257 до 32 767. При выводе на экран оно делится на 256 и округляется до 3 или 4 значащих цифр. Таким образом, в действительности номер строки может изменяться в пределах от 1.00391 до 127.996 с интервалом 1/256. Однако пользоваться дополнительными номерами строк не рекомендуется: ведь при выводе на экран номера, например, строк 1.004, 1.008 и 1.012 будут округлены одинаково до 1.01, а это может затруднить отладку программы.
Имена переменных. Имена переменных могут состоять не только из заглавных, но и из строчных латинских букв. Это расширяет возможности применения однобуквенных имён, сокращающих текст программ, и позволяет применять имена, начинающиеся с буквы f.
Переменные с индексами в Фокале легко перепутать. Чтобы этого не случалось, при использовании в одной программе переменных с одинаковыми именами, но разным числом индексов нужно помнить, что в Фокале фактически существует только один тип переменных, а именно переменные с двумя индексами. Так, имена А, А(0) и А (0,0) характеризуют одну и ту же переменную. Вот примеры других совпадений:
А(130) ≡ A(-126,0) В(256) ≡ В(0,+1) А(255) ≡ А(-1,0)
Это обусловлено тем, что в области памяти, отводимой Фокалом под переменную, индексы располагаются в двух соседних байтах. Для одноиндексной переменной под индекс используются оба байта, а для двухиндексных - младший байт под первый индекс, а старший - под второй. В связи с изложенным во избежание путаницы целесообразно для различных индексированных переменных использовать разные имена.
Арифметические выражения. Существенным отличием арифметики Фокала от обычных правил является то, что умножение здесь выполняется раньше, чем деление, т.е. в операторе SET A=B/C*D вначале будет вычислено C*D, а лишь затем В будет поделено на это число.
Знак ^ возводит число, стоящее перед ним, в целую положительную степень. Если число, стоящее за знаком ^, смешанное, то будет отброшена его дробная часть, а оставшаяся целая будет использована в качестве показателя степени, так что 2^2.99999=4.
Ситуация, показанная в этом примере, является типичной для Фокала и нередко приводит к ошибкам. Если показатель степени вычисляется в результате каких-либо арифметических действий, то во избежание получения ошибочного результата необходимо к вычисленному показателю степени прибавлять небольшое число, например 0.1.
В арифметических выражениях полезно чаще пользоваться скобками, чем это обычно принято в алгебре; как говорят бывалые программисты, скобки всегда обходятся дешевле ошибок!
Встроенные функции. Аргументы всех встроенных функций, кроме FX и FP, могут быть числами, переменными или любыми арифметическими выражениями. Обычная точность вычисления функций составляет 5-6 верных значащих цифр. Исключением являются тригонометрические функции с большими аргументами, которые вычисляются практически неверно. Если возникает потребность в таких вычислениях, следует разрабатывать специальные программы.
Функция FITP(X) только для положительных чисел действительно выделяет целую часть. Для отрицательных чисел она выделяет целую часть абсолютного значения аргумента и затем добавляет к ней знак «минус», например FITR(-4.82) = -4.
Функция FRAN() является генератором псевдослучайных чисел, лежащих в интервале от -1 до +1. Утверждение о равномерности распределения генерируемых чисел в этом интервале не соответствует действительности. Для улучшения этой функции можно воспользоваться советом, описанным в [1].
Функция FCHR(A) предназначена для обработки символьной информации и программного управления БК. Наиболее часто эта функция применяется в следующих случаях:
- вывод десятичных кодов символов на экран - для этого можно воспользоваться
простой программой
1.1 Т FCHR(FCHR(-1)),!; G
- приостановка выполнения программы - для этого в нужное место программы вставляется оператор X FCHR(-1) который остановит выполнение программы до тех пор, пока не будет нажата какая-либо клавиша;
- ввод кода символа с клавиатуры в память; здесь обычны две конструкции
- с выводом изображения символа на экран
S Z=FCHR(FCHR(-1))
и без вывода
S Z=FCHR(-1)
в обоих случаях переменной Z будет присвоен код введённого с клавиатуры символа;
- вывод символа из памяти на экран - для этой цели используется оператор
вида
X FCHR(N)
где N - десятичный код выводимого символа; в принципе N может быть, как сказано выше, любым арифметическим выражением. Перед исполнением дробная часть его отбрасывается, а целая - используется в качестве кода символа;
- выполнение управляющих команд - это обеспечивается оператором
X FCHR(N)
где N - код управляющей команды (см. табл. 1).
Деся-тичный код |
Клавиша |
Выполняемая команда |
---|---|---|
7 |
|
Подаётся короткий звуковой сигнал |
8 |
← |
Курсор перемещается на одну позицию влево |
12 |
СБР |
Очистка экрана |
13 |
ВВОД |
Ввод набранной на экране информации в БК |
19 |
ВС |
Перемещает текст ниже курсора на одну строку вверх |
20 |
ГТ |
Перемещает текст от строки курсора на одну строку вниз |
25 |
→ |
Курсор перемещается на одну позицию вправо |
26 |
↑ |
То же - вверх |
27 |
↓ |
То же - вниз |
140 |
HP РП |
Переводит БК в режим расширенной памяти |
145 |
|
Увеличивает яркость выводимых символов* |
146 |
|
Уменьшает яркость выводимых символов* |
148 |
|
Делает выводимые символы невидимыми, т.е. одинаковыми с фоном* |
149 |
ГРАФ |
Переводит БК в режим текстовой графики (или выводит из него) |
150 |
ЗАП |
Включает режим записи изображения |
151 |
СТИР |
Включает режим стирания изображения |
154 |
КУРСОР |
Гасит (или восстанавливает) курсор |
155 |
32/64 |
Переводит экран из режима «64 символа на строке» в режим «32 символа в строке» (или обратно) |
156 |
ИНВ. С |
Инверсия выводимых символов |
157 |
ИНВ. Э |
Инверсия экрана |
* Эти команды исполняются в режиме "32 символа в строке"; в таблице описано исполнение команд в черно-белом варианте БК. |
Функции FK, FT и FV могут нормально работать с любыми значениями аргументов. Смешанные значения координат перед использованием обрабатываются функцией FITR, а если их значения в функции FK выходят за пределы 63 и 23 соответственно, то они вычисляются по модулю 64 и 24 соответственно и используются в качестве аргументов. У функций FT и FV этого не происходит. Просто изображение получается видимым на экране только при абсциссе, лежащей от 0 до 511, и ординате - от 0 до 239. Если эти пределы будут нарушены, изображение или его часть выйдет за пределы экрана.
Ещё одна особенность: последние координаты X и Y, использованные функциями FT или FV, сохраняются в памяти и не могут быть стёрты оператором ERASE. Их можно стереть только перезапуском системы.
Функция FX позволяет обращаться к любой ячейке адресною пространства БК. Она имеет вид
FX (КОП, A, D) |
||
где |
КОП |
- код операции: -1 - происходит запись целого десятичного числа или значения переменной D непосредственно в память БК по адресу А; 0 - происходит логическое побитовое умножение (конъюнкция) содержимого ячейки с адресом А и целого числа D и присвоение функции FX результата этой операции; 1 - происходит чтение, т.е. присвоение функции FX значения содержимого ячейки с адресом А, |
А |
- адрес ячейки памяти БК, в качестве которого может быть либо восьмеричное число от 0 до 177776 либо десятичная переменная Фокала, принимающая значение от 0 до 65 534; адрес А не может быть арифметическим выражением; |
|
D |
- десятичное число, переменная или арифметическое выражение, принимающее целочисленное значение от -32 768 до +32 767. |
Функция FP предназначена для управления внешними устройствами, подключёнными к параллельному программируемому порту ввода-вывода. Такими устройствами могут быть электрифицированные учебно-наглядные пособия, лабораторные установки и т.п. Эта функция имеет вид
FP(КОП, М) |
||
где |
М |
- маска (восьмеричное число от 0 до 177 777 или переменная, принимающая целое десятичное значение в пределах от -32 768 до 32 767). |
КОП |
- код операции: 0 - происходит чтение по маске содержимого регистра порта ввода, т.е. логическое поразрядное умножение (конъюнкция) содержимого регистра и маски и присвоение функции FP результата этой операции; 1 - происходит присвоение нулей тем двоичным разрядам числа, записанного в порте вывода, которые соответствуют разрядам маски с двоичными единицами; 2 - происходит присвоение единиц тем двоичным разрядам числа, записанного в порте вывода, которые соответствуют одноименным разрядам маски с двоичными единицами; 3 - происходит чтение по маске содержимого регистра порта вывода. |
Операторы. Фокал имеет 19 операторов. Это ASK, COMMENT, DO, ERASE, FOR, GOTO, HELP, IF, KILL, LIBRARY, MODIFY, PASS, QUIT, RETURN, SET, TYPE, VACANT, WRITE, XECUTE. В отличие от других языков программирования в Фокале можно сокращать имя оператора до одной начальной буквы. Это делает программы более короткими и исполняемыми быстрее.
Имена операторов набирают только заглавными латинскими буквами и отделяют от номера строки и от последующих аргументов не менее чем одним пробелом.
В операторе ASK ввода информации с клавиатуры можно применять те же операнды, что и в операторе TYPE вывода информации на экран дисплея, включая символ перевода строки (!), указатель формата вывода чисел (%А.0В), символ вывода на экран текущих значений всех переменных ( ¤ ), символ трассировки (?). Все эти операнды выполняют те же функции, что и в операторе TYPE. Для экономии памяти запятую между открывающими или закрывающими кавычками и символом (!) или последующей переменной в обоих этих операторах можно опускать, т.е. писать
1.1 А !«длина»L,!«ширина»В;Т !«площадь» L*В
При исполнении оператора ASK, если пользователь не намерен изменять значение переменной, следует вместо повторного ввода того же значения нажать клавишу Для отмены ввода ошибочно набранной последней цифры во вводимом числе следует нажать клавишу \ (обратная косая черта), а для отмены всего набранного на экране числа - клавишу ЗБ -.
Оператор DO является одним из наиболее эффективных программных средств Фокала. С его помощью можно вызвать на исполнение любую строку программы (в форме D NN.nn), любую группу строк (в форме D N), смоделировать оператор выбора (в форме D В, где В - переменная, имеющая значение номера строки или группы строк) и даже организовать исполнение любого заданного числа строк (в одной или нескольких группах). В последнем случае оператор применяется в форме D NN.nn, а в каждой исполняемой по этому оператору строке, кроме последней, в конец необходимо поставить оператор GOTO для передачи управления следующей строке. Применение этого оператора в сочетании с многооператорными строками позволяет резко уменьшить размеры программы пользователя.
Оператор FOR является оператором цикла с постусловием, поэтому при любом сочетании аргументов он выполняется хотя бы один раз. Следует также учесть, что нормальная работа этого оператора происходит, если шаг приращения переменной цикла положителен, а начальное значение переменной цикла меньше её конечного значения, знаки этих величин значения не имеют. Тело цикла может отсутствовать. В форме F I=А,Е этот оператор может использоваться для программной организации паузы в программе. Для получения паузы на каждую секунду нужно предусмотреть около 400 пустых циклов.
Оператор IF условного перехода причиняет обычно наибольшие неприятности программистам. Он имеет следующий полный синтаксис:
I(Х) N, Z, Р
где X - арифметическое выражение, а N, Z, Р - номера строк (или переменные, имеющие смысл номеров строк), которым передаётся управление при отрицательном, нулевом и положительном значении X соответственно. Отметим, кстати, что все пробелы здесь могут быть опущены. Главные сложности возникают при попытках организовать правильную передачу при нуле, если X получается не целым. Особенности машинной арифметики здесь легко могут привести к ошибкам. Одним из возможных выходов из положения является замена точного значения X его приближенным значением с ограниченным числом значащих цифр. Рассмотрим пример реализации этого приёма:
2.2 Т !«символ элемента:»;S N = FCHR(FCHR(-1));S B = N/23 2.3 I(FITR((B-3.13043)*1000)) 2.4,3.1
В этом фрагменте при вводе с клавиатуры символа Н (код его равен 72) управление будет правильно передано строке 3.1. Если же записать строку 2.3 в виде
2.3 I(В-3.13043)2.4,3.1
то передачи управления на строку 3.1 выполнено не будет.
Если условия задачи позволяют, лучше избегать передачи управления оператором IF при Х = 0, а если это возможно, то стараться использовать для вычисления X целочисленную арифметику.
Оператор KILL применяется в программах редко, поэтому в руководстве пользователя он не описан. Он предназначен для сброса (блокировки прерываний) всех внешних устройств БК и идентичен по действию машинной команде RESET. Если вставить оператор KILL в программу, то после его выполнения будет запрещено прерывание программы от клавиатуры, поэтому ввести информацию по запросу оператора ASK или функции FCHR станет невозможно.
Операторы группы LIBRARY, предназначенные для записи программ и данных на магнитную ленту и чтения с ленты, описаны в руководстве пользователя подробно. Отметим только, что все переменные записываются на ленту оператором LIBRARY OUTPUT под своими именами. Запись производится отдельными блоками по 511 переменных в каждом блоке. Блоки нумеруются для служебных целей начиная с нулевого. Эта нумерация производится автоматически, причём номер блока выводится в 16-й позиции имени файла. При последующем вводе файла данных с магнитной ленты вводить эти номера при имени файла не нужно.
Отметим также, что при вводе файла данных с ленты по оператору LIBRARY INPUT стирания из памяти программы и введённых до этого переменных не происходит, но если на ленте окажутся переменные с теми же именами, что и хранящиеся в памяти, то последним будут присвоены новые значения.
Операторы группы PASS применяются для выхода из системы Фокала в мониторную систему диагностики (МСД). Поскольку работа в режимах МСД выходит за рамки Фокала и требует специального детального описания, мы этого вопроса касаться здесь не будем.
Несколько слов об операторе SET. С целью сокращения размера программ в этом операторе можно опускать число ноль, так что вместо S А=0 можно писать S А=. Вместо буквы S в этом операторе в некоторых программах встречается буква F, например: F В=FSIN(X). Читатель может возразить, что F используется для обозначения оператора FOR, а не SET. Да, это так. Но если в операторе FOR оставить только первый аргумент, опустив два остальных, то он превращается в обычный оператор присваивания, идентичный оператору SET. Такой приём, к сожалению, иногда используется, поэтому его следует знать - но не следует применять!
В операторе TYPE для сокращения размера программ можно употреблять символ перевода строки (!) вместо запятой, разделяющей текстовые сообщения, размещаемые на разных строках экрана, и опускать закрывающие кавычки, если они стоят в конце оператора, например:
Т!"Первая строка"!"Вторая строка
Оператор XECUTE (или сокращённо X) применяется тогда, когда требуется исполнить какую-либо функцию или вычислить выражение, но вычисленные значения не нужно выводить на экран дисплея. Чаще всего он используется для выполнения управляющих команд, вводимых функцией FCHR. Для пользователей, программирующих для БК-0010 в машинных командах, будет интересно узнать, что с помощью этого оператора можно также легко переводить вещественные числа в их внутреннее представление. Для этого набирают в диалоговом режиме оператор X N, где N - целое или вещественное число, и нажимают клавишу ВВОД. Затем переходят в режим ТС самодиагностики МСД и выводят на экран содержимое ячеек памяти 1710, 1712 и 1714 для просмотра. В младшем байте первой ячейки будет храниться порядок числа N, во второй ячейке - старшие разряды его мантиссы, а в старшем байте третьей ячейки - младшие разряды мантиссы. Указанные ячейки называются флаком. При хранении числа в других ячейках памяти происходит небольшая трансформация этого представления, обусловленная тем, что вне флака под вещественное число отводится только две ячейки памяти: в первой ячейке в старшем байте хранятся младшие разряды мантиссы, а в младшем - порядок числа, во второй ячейке - старшие разряды мантиссы и знак числа.
Логические операции. Фокал БК не имеет специальных логических переменных и средств их обработки, однако их нетрудно сгенерировать программно.
Если условиться, что логические переменные A и B могут принимать только два значения: +1, соответствующее логическому значению «истина», и -1, соответствующее логическому значению «ложь», то основные логические операции с этими переменными можно определить в соответствии с табл. 2.
Логическая операция |
Символьная запись |
Эквивалентная запись в Фокале |
---|---|---|
Отрицание |
|
FSGN(-А) |
Сложение |
А ∨ В |
FSGN(А+В+1) |
Умножение |
А ∧ В |
FSGN(A+B-1) |
Исключающее ИЛИ |
|
FSGN(-(А*В)) |
Эквивалентность |
А ≡ В |
FSGN(А*В) |
Импликация |
A ⊃ B |
FSGN((А+В)-2+В) |
Эти операции можно соединять в сложные логические выражения, последовательность выполнения операций в которых следует устанавливать при помощи скобок.
Экономия памяти. При работе с ПЭВМ у каждого программиста рано или поздно на экране появляются пренеприятные сообщения ПЕРЕПОЛНЕНИЕ ПАМЯТИ ТЕКСТОМ ПРОГРАММ или НЕТ МЕСТА ДЛЯ ПЕРЕМЕННЫХ, которые в самый неподходящий момент напоминают, что память ПЭВМ не бесконечна. Чтобы в этом случае не отказываться от программы, в которую вложен немалый труд, можно попытаться сократить её.
Разумеется, радикальным путём сокращения программы является использование более короткого алгоритма решения поставленной задачи, но это отдельный и далеко не простой вопрос. Рассмотрим те пути, которые не затрагивают существа алгоритма.
Наиболее мощным из них является использование подпрограмм, написанных в машинных командах. Для совмещения машинных подпрограмм с Фокалом можно использовать системные программы FOCOD, ИВФ, ИВФ МАССИВЫ и СФМ, описанные ниже.
Сокращайте имена операторов до одной буквы, а операторы набирайте без пробелов между операндами. Для обозначения переменных по возможности также используйте однобуквенные имена.
Практикуйте многооператорные строки максимальной длины (до 79 символов).
Повторяющиеся последовательности операторов оформляйте при первом употреблении в виде либо отдельной строки, либо последовательности строк, соединённых операторами GOTO, либо отдельной группы строк, которые впоследствии вызывайте на исполнение операторами DO.
Для служебных переменных (переменных цикла, индексов, переключателей составного оператора выбора и т.п.) используйте в разных местах программы одни и те же имена, например I, J, К, L.
Если конечный результат является значением некоторого арифметического выражения и нигде в программе больше не употребляется, то экономнее не вычислять его, как обычно, в операторе SET, а включать целиком арифметическое выражение в оператор вывода TYPE. Так, например, из двух строк
S А=(FCOS(X))^2;Т "А=",А Т "А=",(FCOS(X))^2
вторая экономнее первой на 14 байтов (6 за счёт сокращения текста и 8 за счёт отказа от ввода переменной А в память).
Сокращайте текст операторов ASK, TYPE и SET с помощью приёмов, которые были описаны выше.
Хотя каждый из описанных здесь приёмов в отдельности даёт небольшую экономию, но, когда они все применены в большой программе, эффект будет значителен, причём он состоит не только в экономии памяти, но и в увеличении скорости исполнения программы.
Фокал часто упрекают в медленности исполнения его программ. С этим нельзя согласиться. Проверка на одинаковых вычислительных алгоритмах показывает, что программы на Фокале исполняются значительно быстрее, чем на Бейсике, причём иногда в несколько раз. Конечно, Фокал с его интерпретатором нельзя сравнивать с языками программирования, снабжёнными компиляторами или их подобиями, каким, например, снабжён Бейсик БК. Но если сравнение вести с интерпретаторами Бейсика, то преимущество Фокала в скорости неоспоримо.
Перейдём теперь к описанию расширений Фокала.
Сборка фокальных программ. Системная программа СБОРКА (автор В.Т. Монахов) позволяет вводить с магнитной ленты программу на Фокале не целиком, как по оператору LIBRARY GET, а в виде отдельных блоков. Каждый такой блок кодируется и отлаживается самостоятельно; после окончания отладки и тестирования к нему добавляют пустую строку со старшим номером, т.е. набирают номер строки, превышающий все остальные номера строк в блоке, и нажимают ВВОД. После этого блок выводят на магнитную ленту обычным способом. При сборке фокальной программы из блоков вначале вводят в память программу СБОРКА, а затем с её помощью поочерёдно вводят, начиная с младших номеров строк, записанные на магнитной ленте блоки. СБОРКА автоматически подстыковывает каждый из них в конец формируемой в памяти программы и оформляет все необходимые связи. После ввода очередного блока можно вводить или редактировать любые строки программы с клавиатуры, только в конце этой работы нужно так же, как и при выводе блока на ленту, ввести в программу пустую строку со старшим номером. После этого можно продолжить ввод блоков с магнитофона. Завершив ввод блоков, программу СБОРКА можно исключить из собранной фокальной программы, если не хватает памяти, но можно и оставить в памяти, так как на работу программы она не влияет.
Возможность объединения фокальных блоков в единую программу позволяет резко расширить возможности БК и сократить время на разработку его прикладного программного обеспечения за счёт широкого использования тематических библиотек стандартных блоков, из которых, как из кубиков конструктора, можно собирать интересующие пользователя программы.
Перенумерация строк. Полезным дополнением к программе СБОРКА является подпрограмма перенумерования строк фокальных программ (автор - В.Т. Монахов). Такая операция может потребоваться, если два блока имеют совпадающие номера строк или если при отладке программы оказалось, что нужно включить дополнительную строку, а сделать это без раздвижки строк нельзя. Параметрами подпрограммы перенумерации являются номер строки, с которого начинается изменение номеров, новый номер, присваиваемый этой строке, и шаг нумерации. Эта подпрограмма может объединяться с программой СБОРКА или входить в состав других системных программ, описанных ниже.
Машинные подпрограммы в Фокале. Для машинных подпрограмм, исполнение которых протекает без обмена данными между фокальной частью и подпрограммой, очень удобным инструментом связи является программа FOCOD (автор - В.Н. Андреев). Сущность её состоит в том, что в Фокале вводится дополнительная функция FCHR(1), передающая управление из Фокала по абсолютному адресу 2100, начиная с которого пользователь получает возможность размещать любую подпрограмму в машинных командах. По завершении выполнения этой подпрограммы управление передаётся оператору фокальной программы, непосредственно следующему за оператором вызова FCHR (1). С Фокодом работают так. После ввода программы FOCOD программист переводит БК в режим директив отладки мониторной системы диагностики и далее с клавиатуры или с магнитной ленты вводит машинную подпрограмму с адреса 2100. Далее выполняются необходимые операции связи этой подпрограммы с Фокалом и командой 2000G БК переводится в режим Фокала. Теперь с клавиатуры можно вводить и редактировать текст фокальной части программы. По завершении отладки и тестирования объединённая машинно-фокальная программа может выводиться на магнитную ленту (и затем вводиться с неё) обычными средствами Фокала.
В принципе с помощью Фокода можно вводить не одну подпрограмму, а несколько, и не только без параметров, но и любым числом параметров. В этих случаях организацию переключения с одной подпрограммы на другую, а также передачу параметров из Фокала в подпрограмму и/или результатов из подпрограммы в Фокал приходится предусматривать программным путём, например с помощью функции FX.
Однако в таких случаях удобнее применять другую системную программу, например ИВФ (автор - А.П. Казанцев) или СФМ (автор - В.Т. Монахов). Программа ИВФ (интерфейс внешних функций) описана в [2].
Она позволяет включать в состав Фокала до 26 дополнительных функций произвольного назначения. ИВФ загружается в память ПЭВМ с магнитной ленты в режиме мониторной системы диагностики с адреса 20000. Далее в этом же режиме она дополняется необходимым числом подпрограмм вычислений дополнительных функций, под размещение которых отводится память с ячейки 20572. По окончании этой работы созданную машинную программу можно записать на магнитную ленту, если она потребуется в дальнейшем, а можно сразу перейти в режим Фокала, в котором с клавиатуры или магнитной ленты необходимо ввести фокальную часть программы. Под её размещение в ИВФ отводится 7 К байтов. Если необходимо создать отдельные массивы упакованных байтовых данных, а также целых и вещественных чисел, то можно воспользоваться реализацией программы ИВФ, названной ИВФ МАССИВЫ (автор П.В. Полянский). В ней система ИВФ дополнена функциями, позволяющими зарезервировать память под указанные массивы, а также вводить и выводить из них данные.
Наиболее универсальным расширением Фокала является программа СФМ (символьные функции и массивы). Она включает все перечисленные выше расширения Фокала и, кроме того, вводит в него символьные переменные.
Программа СФМ объёмом чуть более 2К написана в машинных командах и располагается в оперативной памяти БК между системной областью Фокала и текстом программы пользователя. Она скомпонована так, что составляет с программой пользователя единое целое и поэтому может выводиться на магнитную ленту и вводиться с ленты обычными операторами Фокала.
СФМ позволяет вводить символьные переменные и константы с клавиатуры и с магнитной ленты, сравнивать символьные величины между собой, вырезать из них фрагменты, модифицировать их с клавиатуры и программными средствами, определять их длину, вычислять числовое значение набора цифр и целых арифметических выражений, входящих в их состав, выводить символьные величины на экран, принтер или магнитную ленту, стирать их из памяти, производить поиск символьной величины в памяти по её начальному фрагменту произвольной длины.
Кроме того, программа СФМ имеет функции пересчёта десятичных чисел в восьмеричные и восьмеричных в десятичные с отображением результатов пересчёта на экране, а также набор функций, обеспечивающих работу с двумя массивами упакованных чисел - целых и вещественных. Эти два массива, как и массив символьных величин, расположены вне области ОЗУ, доступной Фокалу, поэтому они не стираются оператором ERASE, что создаёт дополнительные удобства для пользователя, позволяет легко организовать глобальные и локальные переменные в программе.
Удобным отличием массивов программы СФМ от массива обычных переменных Фокала является одновременный их вывод на магнитную ленту при записи программы на магнитофон, хотя допустим и раздельный вывод.
Кроме 17 дополнительных функций, выполняющих 23 различные операции, программа СФМ предоставляет пользователю возможность запрограммировать в машинных командах ещё 11 дополнительных функций любого назначения. После ввода программы в компьютер её можно дополнять любой фокальной частью. Эту часть можно вводить не только с клавиатуры, но и с магнитной ленты, причём не обязательно целиком, а в виде подсоединяемых фокальных блоков. Введённую фокальную программу и её отдельные группы строк можно перенумеровать, изменяя как номера строк, так и интервалы между строками.
Для программиста удобно и то, что в СФМ предусмотрена возможность свободного перехода из режима Фокала в режимы мониторной системы диагностики и обратно без стирания фокальной части программы.
Таким образом, Фокал, дополненный программой СФМ, по своим возможностям приближается к Бейсику БК, выгодно отличаясь от него компактностью и, главное, предоставлением пользователю большей памяти для размещения программы и данных.
Рассмотрим кратко дополнительные функции, вводимые программой СФМ. Все они имеют в названии две одинаковые первые буквы FF (от английского further function), а третья буква отражает специфику функции и в какой-то мере тоже мнемонична.
Дополнительные функции можно использовать как обычные встроенные функции Фокала и в диалоговом, и в программном режиме. Их можно вкладывать друг в друга и использовать рекурсивно, если требуется. Неправильный синтаксис или ошибочное использование функций фиксируется системой диагностики ошибок.
Функция FFA - от ASK - предназначена для ввода символьной величины с клавиатуры. Вводимые величины не требуют предварительного объявления и могут содержать от 1 до 127 любых символов БК. Результатом исполнения функции является размещение введённой величины в массиве символьных переменных и выдача порядкового номера, присвоенного компьютером этой переменной. Переменные в массиве размещаются вплотную друг к другу, разделителем служит внутренний код клавиши ВВОД. При необходимости зарезервировать место под последующее наращивание переменной при вводе её пользователь должен добавить в конце нужное число пробелов. Символьные переменные могут быть найдены в массиве по их порядковому номеру или по поисковому образу, представляющему начальный фрагмент достаточной для идентификации длины.
Функция FFB - от BROKEN - обеспечивает перенумерацию строк фокальной программы начиная с заданного старого номера строки путём присвоения ей нового заданного номера, а всем последующим строкам - больших номеров с заданным шагом нумерации.
Функция FFC - от COMPARE - предназначена для сравнения двух символьных переменных на равенство и неравенство с выдачей нуля при равенстве, +1, если больше, и -1, если меньше. Пробелы в конце переменной при сравнении не учитываются. Буквы русского алфавита для целей сравнения перекодируются в новый код, в котором значение кода буквы согласуется с её порядковым номером в русском алфавите и все коды русских букв меньше, чем коды латинских букв. Эта функция не различает заглавные и строчные буквы, а сравнивает только содержание слов.
Функции FFD и FFO - от DECIMAL и OCTAL - предназначены для пересчёта чисел, являющихся их аргументами, из восьмеричной системы счисления в десятичную и из десятичной в восьмеричную соответственно. Функция FFO одновременно выводит значение восьмеричного числа на экран.
Функция FFE(A) - от ERASE - в зависимости от знака аргумента А стирает либо массив символьных переменных, либо все массивы СФМ. Допустимо частичное стирание массива символьных переменных.
Функция FFF - от FIND - осуществляет поиск символьной переменной в массиве по её поисковому образу. Последний может как задаваться с клавиатуры, так и находиться в памяти. Длина поискового образа может быть от одного до 30 символов. Если данному поисковому образу в массиве соответствует несколько переменных, то они все поочерёдно будут идентифицированы. Повторный набор поискового образа при этом не требуется.
Функция FFI - от INTEGER - обеспечивает работу с массивом упакованных целых чисел, в котором каждое число занимает одно машинное слово и идентифицируется по номеру. С помощью функции FFI можно в любом порядке вводить числа в массив и выводить из него. Кроме того, она позволяет выделять целую часть смешанных чисел.
В отличие от стандартной функции Фокала FITR функция FFI действует не методом отбрасывания дробной части, а действительно выделяет целую часть, как это делает, например, функция INT Бейсика БК.
Функция FFL - от LENGTH - определяет длину символьной переменной, включая пробелы в её конце.
Функция FFM - от MODIFY - предназначена для модификации символьных переменных путём замены их целиком или частично другим набором символов. Модифицирующий текст является либо непосредственным аргументом функции, либо символьной переменной, уже имеющейся в массиве. В обоих случаях в память БК вводится только столько символом из этого текста, сколько позволяет длина модифицируемой переменной.
Функция FFN - от NUMBER - служит для вычисления числового значения непрерывной последовательности цифр, встретившейся первой в тексте заданной символьной переменной.
Функция FFR - от REAL - обеспечивает работу с массивом упакованных вещественных чисел, в котором каждое число занимает два машинных слова. Её возможности аналогичны возможностям функции FFI.
Функция FFS - от SEGMENT - выполняет вырезку из указанной символьной переменной заданною фрагмента и размещение его в виде новой символьной переменной в памяти БК.
Функция FFT - от TYPE - обеспечивает вывод на экран значений нескольких символьных переменных в порядке перечисления их имён в списке аргументов.
Функция FFV - от VACATE - резервирует память для размещения массива символьных переменных (необходимый объём памяти задаётся общей длиной массива) и двух массивов упакованных чисел (необходимый объём задаётся числом чисел в каждом из массивов). Эта функция не стирает уже введённых символьных величин и поэтому может применяться многократно, например, для увеличения размера символьного массива.
Функция FFX – от команды XECUTE - вычисляет значение арифметического выражения, входящего в состав символьной переменной. В составе этого выражения допускается использование переменных Фокала, встроенных и дополнительных функций, скобок.
Кроме того, в СФМ имеется подпрограмма сборки фокальной программы из отдельных присоединяемых блоков, записанных на магнитной ленте.
СФМ допускает работу в любом режиме экрана, в том числе в режиме расширенной памяти.
Из этого краткого обзора видно, что дополнительные функции СФМ серьёзно расширяют возможности не только самого Фокала, но вообще компьютеров БК. Дело в том, что отмеченные в начале статьи недостатки Фокала и Бейсика БК не позволяли создавать сколько-нибудь значительные по объёму учебные и информационно-справочные программы, например базы данных, словари и справочники, не прибегая к оверлейным структурам и хранению части данных на ленте. Это увеличивало время доступа к данным, сводя на нет преимущества вычислительной техники.
Применение СФМ позволяет резко сократить объём программ и тем самым высвободить память для размещения данных, организованных к тому же в предельно упакованном виде. Примером справедливости этих слов служит программа ARRAS (автор - В. Т. Монахов) англо-русского и русско-английского словаря, которая позволяет разместить в оперативной памяти БК одновременно два словаря, каждый из которых может состоять не менее чем из 1000 словарных статей. Вот полный текст программы (без словарного массива) этого словаря, который без лишних слов показывает достоинства разработки:
1.1 Т!"Введи поисковое слово: ";S A=;S В= 1.2 S C=FFF(A,B);S R=;I(-FX (0,4212,-256))1.3;S R=1 1.3 T!;X FFT(C);T " "; I(R)R,1.4;X FFT (C-1);G 1.5 1.4 X FFT(C+1) 1.5 I (FCHR(-1)-13)1.6,1.1 1.6 S A=1; S B=C+2;G 1.2 2.1 Т!"Введи новое слово"!"английское:"; T FFA( );Т!"русское:";Т FFA( );G2.1
Несмотря на неправдоподобную краткость, эта программа обеспечивает поиск словарной статьи и печать её на экране по поисковому слову любой длины, хоть из одной буквы, автоматическое переключение словаря с англо-русского на русско-английский или наоборот, в зависимости от того, какими буквами набрано поисковое слово. Простое нажатие пробела вызывает на экран вторую статью на тот же поисковый образ, и так может продолжаться до тех пор, пока не будут исчерпаны все словарные статьи, начинающиеся с заданного поискового образа. Нажатие клавиши ВВОД прекращает этот поиск и возвращает программу к строке запроса на ввод нового поискового образа с клавиатуры.
В программе имеется группа строк 2, которая может быть использована для ввода в словарь новых словарных статей, если ещё не исчерпан объём ОЗУ. Ввод новых статей закольцован, выход из него осуществляется клавишей ВВОД. Как видим, программа достаточно универсальна, хотя работа с ней предельно проста и доступна даже школьникам младших классов.
В заключение следует отметить, что выбор дополнительных функций программы СФМ был обусловлен намерением автора приспособить Фокал для эффективной работы с текстовой информацией и облегчить разработку фокальных программ. С таким же успехом СФМ может быть приспособлена для выполнения других задач, например для создания высокодинамичных игровых программ или решения задач автоматизации контроля и управления объектами.
Литература
- Зальцман Ю. Как засеять двухмерное поле // Наука и жизнь, 1987, №10
- Казанцев А.П. Интерфейс внешних функций интерпретатора Фокал БК-0010 // Микропроцессорные средства и системы. 1987. №4.
Нуждается в доработке
Первые владельцы «Электроники БК-0010», разговаривающей на диковинном Фокале, недоумевали: кому понадобилось снабжать первый наш бытовой компьютер столь экзотическим языком программирования вместо Бейсика, получившего распространение на большинстве зарубежных компьютеров, или Паскаля, который в последнее время пытается отобрать у Бейсика пальму первенства! Общее удивление не осталось без внимания, и вскоре заговорили о том, что вот-вот появится Бейсик с широкими возможностями, разработанный специально для БК. Прошло не так уж много времени, и разрекламированный труд системных программистов, разместившись в трёх микросхемах, занял законное место в корпусе БК-0010.01. Это была так называемая июньская 1986 г. версия Бейсика MSX, занимающая 24К, т.е. львиную долю памяти компьютера. Казалось бы, остаётся только радоваться, но дотошные пользователи вскоре установили, что это всего лишь усечённый вариант февральской версии того же года, которая, кстати, занимала в памяти те же 24 К. Кто и зачем произвёл хирургическую операцию - непонятно, но в результате в языке исчезли некоторые важные команды и функции. Нет, например, в новой версии команды MERGE, необходимой для объединения двух Бейсик-программ, отсутствует команда KEYLIST - просмотр текста ключей и SPC - печать пробелов. Пропала функция BF для закрашивания прямоугольника. Но, что самое удивительное, неэффективно составлен код компилятора, а значит, тот же Бейсик мог бы занимать в памяти меньше места и работать быстрее.
Об этих и других недостатках в редакцию написали москвичи Д. Баронов и И. Николаев, письма которых мы публикуем.
Можно спорить о достоинствах и недостатках языка, который хранит при исполнении исходный текст программы и представление её в машинных кодах. Существенно то, что максимальный объём программы, которую можно запустить, - всего 7К, причём без учёта данных. Может быть, для БК-0011 это и несущественно, но для БК-0010 такого остатка памяти явно недостаточно. По-моему, стоило бы присмотреться к версии Бейсик-87, которая загружается с магнитной ленты, занимает меньше памяти и почти не уступает «штатному» Бейсику в быстродействии. Дополнительные трудности с памятью сегодня связаны ещё и с тем, что в одной строке программы записывается лишь по одному оператору, а номер каждой строки также занимает память.
Как ни странно, чрезвычайно медленно работают символьные операторы и функции. Как вы думаете, сколько секунд может выполняться программа (рис. 1)? Секунду? Две?
5 CLEAR 5200 10 DIM Т$(255) 20 FOR I = 0 ТО 255 30 T$(I)=STRING$(20,32) 40 NEXT I 50 END
Почти пятьсот секунд!
Удивительным образом работает функция STR$. Вместо того чтобы превращать числа в строки символов, она к тому же добавляет слева и справа пробелы. Проверьте, чему будет равно LEN(X$) в программе (рис. 2).
10 Х%=5 20 X$=STR$(X%) 30 PRINT LEN(X$) 40 END
Единице? Нет, трём - вычисляет БК.
Что-то произошло с многомерными множествами. Если указывать переменную с тремя или более индексами, БК сочтёт их одним символом, эквивалентным их сумме. Не верите? Проверьте! (Рис. 3.)
DIM Р%(2,2,2) ОК LET Р%(1,1,1)+5 ОК PRINT Р%(0,2,1) 5 ОК PRINT Р%(2,0,1) 5 ОК
Если вы даже разберётесь с тем, как определить подпрограмму или функцию в кодах с помощью команды DEF USR, вы всё равно не сумеете записать эту подпрограмму на магнитофон или считать её с ленты.
Есть, наверное, и другие ошибки, до которых мне пока что не удалось докопаться. Впрочем, вывод можно сделать уже сейчас - версия Бейсика для БК нуждается в серьёзной доработке.
Д. БАРОНОВ, Москва
Хотя Бейсик вместе со своими недостатками, как говорится, зашит в ПЗУ, его можно усовершенствовать, точнее, приблизить к стандартной версии, исправив некоторые ошибки. Исчезнувшую было команду MERGE можно реализовать на основе «штатной» команды LOAD. Если выполнить эту команду тогда, когда в памяти БК уже имеется одна программа на Бейсике, машина тотчас же выдаст сообщение об ошибке 5. Это сработает команда TRAP 5, расположенная в ячейке 136114. Достаточно заблокировать эту ячейку, и LOAD превратится в MERGE, тогда новую программу можно будет объединять со старой. При этом важно запомнить, что из двух бейсичных строчек с одинаковыми номерами остаётся та, что принадлежит вновь считываемой программе. Текст программы, которая превращает LOAD в MERGE, - в табл. 1. Принцип её действия весьма прост. Каждое прерывание по команде TRAP передаётся на подпрограмму. Если адрес команды равен 136114, прерывание будет заблокировано, а управление вернётся к Бейсику.
Программу набирают в режиме отладки, но, если блока МСТД под рукой нет, её можно загрузить и из Бейсика (рис. 4). Чтобы не набирать её каждый раз с клавиатуры, запишите программу на магнитофон командой BSAVE «М», чтобы запускать её можно было командой BLOAD «М», R После того как программа загружена и запущена, разрешается выполнять любые команды Бейсика, даже NEW и CLEAR арг1, арг2. Единственное условие - значение второго аргумента CLEAR должно быть меньше адреса загрузки 37720 Программа теряет свои функции после нажатия клавиши СТОП или при выполнении команды MONIT. Чтобы вновь её запустить, достаточно одной команды Бейсика РОКЕ 28,арг, где арг - число, равное сумме числа 24 и адреса загрузки программы.
И. НИКОЛАЕВ, Москва
10700 |
10037 |
2030 |
162737 |
10 |
2030 |
62700 |
26 |
10037 |
34 |
137 |
134612 |
21627 |
136116 |
1402 |
137 |
146404 |
2 |
|
|
|
|
|
|
10 DATA 4544,4127,1048,-6689,8,1048,26048,22 20 DATA 4127,28,95,-18038,9111,-17330,770,95 30 DATA -13052,2 40 FOR AD=16336 TO 16370 STEP 2 50 READ X 60 POKE AD,X 70 NEXT BSAVE «М», 16336, 16372
Программная орбита
24. Рига-микро Система. (НИИ ФТТ ЛГУ им П. Стучки). Т-язык.
24.1. Системная дискета - базовая операционная система для ДВК-2М РАФОС и программа обслуживания сети «Рига».
24.2. Дискета обучения работе в ОС РАФОС - набор обучающих программ для приобретения учителем навыков работы с ДВК-2М
24.3. Дискета первого контакта - набор программ, формирующих начальные навыки работы с БК-0010.
24.4. Дискета обучения языку Бейсик - для полной или частичной автоматизации процесса обучения языку Бейсик.
24.5. Дискета изучения применения ЭВМ - для проведения занятий по использованию ЭВМ для подготовки текстов, табличных расчётов, ввода и поиска информации
24.6. Дискета демонстрации возможностей ЭВМ - набор программ, демонстрирующих возможности ЭВМ при обучении различным общеобразовательным дисциплинам (физике, биологии, химии и т.д.).
Более подробное описание системы см.: Информатика и образование, 1988, № 2, стр. 42.
25. КОФОК. Кодово-фокальная система (г. Москва) Система предназначена для создания и поддержки кодово-фокальных программ, её применение позволяет использовать практически всё программное обеспечение, заложенное в ПЗУ компьютера.
Осваиваем Бейсик
Эффективность программ на Бейсике может быть значительно большей, если использовать подпрограммы в машинных кодах. Освоить работу с ними не так уж трудно, два примера таких подпрограмм предлагают наши авторы из Ленинграда. Ну а тем, кто заинтересуется тонкостями, советуем прочитать статью москвича Д. Баронова «Включение подпрограмм в машинных кодах в программы на Бейсике для БК-0010-01» (Логическое программирование. М.: Знание, 1988. Новое в жизни, науке, технике. Сер. «Вычислительная техника и её применение»; № 9).
012701 |
042000 |
012702 |
100000 |
012703 |
000100 |
160302 |
010200 |
006203 |
011104 |
011021 |
010420 |
077304 |
020102 |
001365 |
000207 |
012503 |
006203 |
001417 |
011500 |
112002 |
162702 |
000060 |
010701 |
062701 |
000060 |
122110 |
001407 |
105721 |
001374 |
077210 |
122043 |
005703 |
001362 |
000207 |
005046 |
111116 |
012601 |
010104 |
012737 |
000100 |
177716 |
077401 |
010104 |
012737 |
000000 |
177716 |
077401 |
077213 |
000755 |
177506 |
170103 |
161531 |
153125 |
145127 |
137501 |
132105 |
125120 |
120116 |
113522 |
107507 |
103517 |
077514 |
074135 |
070504 |
065532 |
062526 |
057534 |
055072 |
052456 |
050010 |
045437 |
043422 |
041422 |
037436 |
000000 |
|
|
|
|
Первая подпрограмма, назовём её «перевёртыш», заставляет переворачиваться символы на экране БК, стоит обратиться к ней из Бейсика командой A=USR$(А) Рекомендуем её тем, кто составляет на Бейсике игровые программы. Вторая подпрограмма позволяет озвучить Бейсик. С её помощью в программы на Бейсике можно включать фрагменты мелодий и различные звуковые эффекты. Обращение к такой подпрограмме чуть посложнее. Прежде необходимо определить какую-нибудь символьную переменную, состоящую из заглавных букв латинского алфавита и знаков препинания. Символы, стоящие на нечётных позициях, будут определять длительность звукового сигнала, а те, что стоят на чётных позициях, - высоту звука. Звучат клавиши ФЫВАПРОЛДЖЭ. Определить символьную переменную можно по-разному, например оператором присваивания или оператором INPUT. Чтобы БК-0010.01 зазвучала, к подпрограмме обращаются командой A$=USR1(A$). Как объединить подпрограмму в машинных кодах с программой на Бейсике? Прежде всего её нужно объявить оператором DEF USR0=&O1000. Текст программы в кодах записывается в оператор DATA. Так как данными на этот раз являются восьмеричные числа, то перед каждым кодом ставьте &O. Перед запуском основной программы организуйте небольшой цикл FOR, который будет читать очередной код из оператора DATA и записывать его в память оператором РОКЕ, начиная с 1000-го адреса. Для «перевёртыша» все подготовительные действия уже закончены, для «музыки» необходимо определить символьную строку так, как это было рассказано раньше.
А. ПИЛИН, А. КАЗАН,
Ленинград
И снова о ключах
После публикации заметки В. Шеломанова «Ключ к Фокалу» в прошлом номере журнала редакция получила немало писем, авторы которых считают, что описание было слишком сжатым и к вопросу программирования ключей стоит вернуться. Как известно, ключ клавиатуры (или программируемые функциональные клавиши) - средство облегчить ввод информации в машину. Стоит нажать одну из цифровых клавиш и клавишу HP или АР2, и на экране появится строка заранее запрограммированных символов произвольной длины (но не более 255 символов). Это может быть командное слово, имя файла, одна или несколько строк программы и так далее. В Бейсике БК-0010.01 предусмотрена возможность запрограммировать 10 ключей, хотя максимальная длина каждого ключевого слова должна быть не более 16 символов. Однако ключи можно программировать и на БК-0010, причём непосредственно в машинных кодах.
Выполняя пожелания читателей, передаём слово Ю. Дворецкому из г. Северодвинска.
Прежде всего нужно выйти из Фокала в режим тестов, в ответ на + нажать клавиши РУС Т С. «Солнышко» на экране означает, что мы находимся в режиме отладки. Программу для ключей будем размещать с адреса 1000. Адрес выбран не случайно - дело в том, что первую тысячу ячеек занимает так называемый системный стек - область оперативной памяти, где размещаются необходимые для работы компьютера параметры и системные переменные. Если разместить программу в какой-либо другой области ОЗУ (за небольшим исключением), то при следующем переходе в Фокал память будет автоматически очищена, а программа утеряна. Неизменным остаётся содержимое только тех ячеек, что расположены по адресам от 1000 до 2000. Впрочем, при возвращении в Фокал из режима отладки половина области (с 1400 по 1776) используется пусковой программой, так что для ключей остаётся не так уж много места - ячейки с 1000 по 1376, т.е. всего 256 байт.
Поставщиками информации для арифметико-логического устройства микропроцессора служат его регистры - своеобразные почтовые ящики, откуда поступают команды, операнды и адреса. Для программирования ключей в нулевой регистр микропроцессора нужно поместить номер ключа (от 1 до 10), а в первый регистр - адрес ячейки, в которой находится первый байт текста ключа. Здесь не обойтись без команды «пересылка». Как ею пользоваться? Код 12700 означает, что мы хотим переслать в регистр 0 содержимое ячейки памяти, которая расположена следом за той, где записан код. Вот в этой ячейке и записывают номер ключа. Аналогично код 12701 перешлёт содержимое следующей ячейки (адрес ячейки, где начинается текст ключа) в регистр R1 микропроцессора. Замыкает цепочку команда 104012 - сигнал микропроцессору на программирование ключа. Эта последовательность команд повторяется столько раз, сколько ключей мы собираемся запрограммировать, но не больше 10. Затем по указанным в тексте объявлений ключа адресам размещают основные тексты ключей. В каждой ячейке, кроме первой, записывают по два символа из текста ключа: первый символ - в первом (младшем) байте, второй - во втором (старшем) байте. Первая ячейка содержит только один символ - первый символ текста ключа в старшем байте, а в младшем необходимо указать число символов текста, т.е. длину ключа.
Хотя никаких сложностей здесь нет, поясним сказанное примером: текст ключа - слова «процессор». В нём 9 букв, т.е. 11 символов в восьмеричной системе. Буква П - первый символ, его код 320, а значит, содержимое первой ячейки памяти 011320. Далее следуют буквы Р (код 322) и 0 (код 317), записанные как 322317, и т.д.
Для тех, кто ещё не освоил режим отладки, поясню, как вводить готовую программу. Наберите 1000 А - так вы установите текущий адрес 1000. Набирайте первую команду нашей программы - 12701 и нажимайте клавишу «,» - команда запишется по адресу 1000, текущий адрес станет равен 1002. (Кстати, такой способ записи принято называть автоинкрементным.) Вводим 1 - номер ключа и снова нажимаем клавишу «,». Затем 12701 и дважды нажимаем «,». Первое нажатие отправляет в память команду 12701, второе - даёт сигнал отладчику пропустить одну ячейку (мы ещё не знаем, где будут располагаться тексты ключей). Набираем команду 104012, затем «,» и так повторяем столько раз, сколько нужно ключей. Разумеется, каждый раз номер ключа должен быть другим. После ввода последней команды последнего ключа вводится ещё одна команда - 0 - команда на останов. Следующее действие - ввод текстов ключей. Прежде всего нажмите клавишу А - БК сообщит вам значение текущего адреса. Выпишите его на листок бумаги. Наберите число символов первого ключа и введите его в память командой «.».
Точка вместо запятой увеличивает адрес только на единицу, так мы сможем записывать текст ключа символ за символом, байт за байтом. Вводим код первого символа, «.», код второго и «.» и т.д. После того как в памяти оказался последний код символа первого ключа, запросите текущий адрес командой А. Запишите его на ту же бумажку и вводите текст второго ключа - последовательность действий остаётся прежней. Когда будут введены тексты всех ключей, останется лишь проставить записанные на бумажке адреса в ячейках после команд 12701. Программа готова. Установите адрес 1000 (команда 1000 А) и наберите 400Л. На экране распечатается ваша программа. Проверьте, всё ли правильно, и запишите её на магнитофон - командой М 3 (Адрес=1000, Длина-разность между 1000 и адресом последней ячейки программы, Имя - любое). Вот теперь программу можно запустить - 1000G. Если в ответ снова появилось «солнышко» - всё в порядке. В Фокал нужно выйти не по команде К, а с помощью команды 120000G (в монитор выходить нельзя).
Добавлю, что кроме букв и цифр текст ключа может содержать коды спецсимволов, знаков препинания, математических знаков, а также коды различных команд - очистки экрана, переключения цвета и других. Вот одна замеченная особенность - для исполнения команды «ввод» в тексте ключа используют код 15 вместо указанного в «Руководстве» кода 12. В заключение - пример программирования двух ключей. Попробуйте разобраться в нём без помощи БК.
12700 |
1 |
12701 |
1030 |
104012 |
12700 |
2 |
12701 |
1040 |
104012 |
0 |
|
5373 |
341373 |
353351 |
|
10342 |
351357 |
355341 |
363363 |
341000 |
|
|
|
Маленькие хитрости
Один из простейших способов защитить программу от нежелательного доступа - дать ей имя несколько необычным способом, например используя различные регистры. Если нажимать клавиши в такой последовательности «ЛАТ AL РУС O (5 раз) стрелка_влево стрелка_влево ЛАТ NI ВВОД», то на экране имя будет печататься как ALONI, однако, чтобы считать программу с ленты, к ней нужно обратиться именно так, как мы это делали при записи.
М. НУРМАГОМЕДОВ,
г. Махачкала
Неплохую заставку к своим программам на Фокале можно делать на основе фрагмента всего из четырёх коротких строк. БК, действуя по такой программе, будет периодически инвертировать картинку на экране, а также выдавать звуковой сигнал до тех пор, пока кто-нибудь не нажмёт любую клавишу. В этом случае управление будет передано на строку 1.30, где должна начинаться основная программа.
1.10 X FCHR(12,154) 1.15 S T=FX(1,177716) 1.20 I (T+32608)1.30, 1.30, 1.25 1.25 X FCHR(7,157,7); G 1.15 1.30 Q
M. БУРЛУЦКИЙ,
г. Междуреченск
Гармония чисел
Как-то вечером я развлекался вычислением коэффициентов ряда Фурье. Программа была почти готова, когда у меня появилась идея наглядно представить вычисленные компоненты ряда. Так возник первый цветок Фурье. Картинка мне понравилась, и я тут же переписал программу на Фокале специально для рисования цветка. Она получилась совсем простой, поэтому я предлагаю её без пояснений.
1.10 X FCHR (12) 1.20 С ПРИМЕР: N=5,A1=1,A3=0.25,A5=0.1,Х0=110,Y0=110,R0=100. 2.10 Т 'КООРДИНАТЫ ЦЕНТРА ЦВЕТКА',! 2.20 А 'Х0',Х0,'Y0',Y0,! 2.30 А 'СРЕДНИЙ РАДИУС ЦВЕТКА R0',R0,! 2.40 А 'КОЛИЧЕСТВО ЛЕПЕСТКОВ N',N 2.50 Т !,'ОТНОСИТЕЛЬНЫЕ АМПЛИТУДЫ1,3 И 5 ГАРМОНИК (0...1)',! 2.60 А 'A1',A1,'А3',А3,'A5',A5 2.70 X FCHR (12) 2.80 S Р=3.14159/180 3.10 S B1=R0*A1/(A1+А3+A5) 3.20 S B3=R0*A3/(A1+А3+A5) 3.30 S B5=R0*A5/(A1+A3+A5) 3.80 F K=0,0.5,359.5; D4 3.90 G 5.1 4.10 S R1=B1*FSIN(N*P*K/2) 4.20 S R3=B3*FSIN(3*N*P*K/2) 4.30 S R5=B5*FSIN(5*N*P*K/2) 4.40 S R=FABS(R1+R3+R5) 4.50 S X=X0+R*FCOS(P*K) 4.60 S Y=Y0+R*FSIN(P*K) 4.70 X FT(0,X0,Y0); X FV(1,X,Y) 4.80 S R=R+4; D4.5; D4.6 4.90 X FT(1,X,Y) 5.10 F K1=0,R0/50,R0/10; D5.3 5.20 Q 5.30 F K2=0,15,345; D6 6.1 X FT[0,X0+K1*FCOS(P*K2),Y0+K1*FSIN(P*K2)]
В. ВИНОГРАДОВ,
г. Клин