БАЗОВЫЕ ПРОГРАММНЫЕ СТРЕДСТВА ПК8020
ИНТЕРПРЕТАТОР ЯЗЫКА БЕЙСИК

Руководство пользователя
ПТ.00552-01 90 01

АННОТАЦИЯ

В настоящем документе приведено описание языка Бейсик комплекса вычислительного КОРВЕТ ПТ1.320.167.

Язык Бейсик предназначен для решения широкого круга задач, в том числе математических, инженерных, игровых и других, в режиме диалога человек-машина. Программы, написанные на языке Бейсик, могут сохраняться на накопителях на гибких магнитных дисках (НГМД) и на накопителе на кассетной магнитной ленте (НКМЛ).

Использование языка Бейсик дает возможность значительно сократить трудоемкость и сроки разработки программ на МикроЭВМ.

В настоящее время язык Бейсик является самым распространенным языком микроЭВМ.

СОДЕРЖАНИЕ

1. ОСНОВНЫЕ ДАННЫЕ ЯЗЫКА БЕЙСИК

1.1. Общие сведения

1.1.1. Бейсик – это язык программирования высокого уровня для микроЭВМ Язык Бейсик позволяет программировать большой круг задач, сочетая в себе простоту и легкость для изучения и программирования.

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

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

Основными достоинствами языка Бейсик является следующее:

  • простота изучения языка и отладки программ;
  • диалоговый характер Бейсик-системы, что позволяет проводить все операции по разработке, отладке и выполнению программы за клавиатурой дисплея;
  • легкость расширения языка для конкретных вычислительных машин и применений;
  • широта распространения языка Бейсик, что обеспечивает переносимость разработанных программ.

Применение языка Бейсик облегчает разработку программного обеспечения.

1.1.2. В тексте этого документа используются следующие обозначения при описании команд:

  • […] – указывает на необязательный параметр;
  • / – указывает на альтернативу;
  • <…> – указывает на используемые клавиши.
1.2. Элементы языка
1.2.1. Основные конструкции языка

Программа Бейсик записывается в виде последовательности программных строк, которые описывают алгоритм решения задачи.

Программные строки имеют следующий формат:

NNNNN оператор [: оператор…] <возврат каретки>

где

  • NNNNN – номер строки (от одной до пяти цифр) 0…65529;
  • оператор – исполнительный или неисполнительный оператор.

Таким образом строка начинается с номера, заканчивается возвратом каретки и может содержать один или несколько операторов.

Исполнительный оператор – инструкция программы, которая сообщает интерпретатору, что делать при выполнении программы (например, GOTO, PRINT).

Неисполнительный оператора – оператор, который не вызывает никаких программных действий (например, REM, DATA).

В одной строке может быть несколько операторов, они должны разделяться двоеточиями (:), и общее число символов в строке не должно превышать 255.

В командах LIST, AUTO, DELETE и EDIT может быть использована точка для обращения к текущей строке.

Программа на языке Бейсик записывается с использованием следующих символов:

  • прописные и строчные буквы латинского алфавита от A до Z и буквы русского алфавита от А до Я;
  • арабские цифры от 0 до 9;
  • специальные символы + - = * / ^ ( ) ! # % ¤ & . , ; : " & @ ? \ [ ] < >
  • символы пропусков: пробел, горизонтальная табуляция, возврат каретки, перевод строки.

Синтаксическими элементами программы являются:

  • имена переменных;
  • ключевые (резервированные) слова;
  • константы;
  • ограничители (простые и составные).

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

Например

    10 ABC = 1
    20 ABD = 2
    30 PRINT ABC; ABD
    RUN
    2
    Ok

Ключевое слово не может быть именем или часть. имени переменной. Имя переменной определяет тип переменной (строковая или числовая, определенной точности). Специальный символ, идентифицирующий тип переменной указан в табл. 1.

Таблица 1
Символ Тип переменной Пример
¤ Строковая N1¤ = "BASIC"
% Целочисленная N1% = 12
! Вещественная одинарной точности N1! = -1.84
# Вещественная двойной точности N1# = +2.23780523

Если имя переменной не содержит специального символа, то по умолчанию принимается числовая вещественная переменная одинарной точности. Имена переменных, различающиеся только специальным символом, соответствуют разным переменным, например: A¤, A%, A! (или A) и A# присваиваются различным переменным. Для определения типа переменной могут быть использованы операторы DEFINT, DEFSNG, DEFDBL и DEFSTR.

Ключевые слова идентифицируют сами операторы языка, например, OR, IF, DSVE, ABS и т.д.

Константы предназначены для записи величин, которые не изменяются во время выполнения программы.

Простые ограничители - это любые специальные символы, кроме знаков ¤ % ! и #.

Составные ограничители образуются соединением двух специальных символов, а именно: <> (не равно), <= (меньше или равно) >= (больше или равно).

Из имен переменных, констант и знаков операций образуются более сложные элементы языка - выражения, используемые для выполнения необходимых вычислений. Знаки операций обозначаются либо ограничителями, либо с помощью специальных ключевых слов, например AND, INT, MOD и т.д.

В текст программы могут включаться комментарии, которые предназначены для записи пояснений а алгоритму задачи. В языке Бейсик комментарий - это последовательность символов, следующая после оператора REM.

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

Например, в следующем примере

PRINT ABS(N! * N1 - KP) + 13, "СТРОКА"

PRINT и ABS являются ключевыми словами, N!, N1 и KP - именами переменных, 13 - целой численной константой, СТРОКА - строковой константой, остальные символы - простыми ограничителями. Если между двумя именами переменных, ключевыми словами и (или) константами не стоит ограничитель, то между ними необходимо расположить один или несколько пробелов, например:

IF A% AND B THEN END

Так как каждая строка начинается с номера строки (целочисленной метки), то все ссылки на строки программы в других операторах осуществляются только по номеру строки. Например:

100 IF A>0 THEN GOTO 150
1.2.2. Данные и их описание

С каждым видом данных связано понятие типа. Тип данного определяет его внутреннее представление в памяти. Типы данных с которыми оперирует Бейсик, представлен на рис.1 на примере констант языка.

Константы - действительные значения, не изменяемые во время выполнения программы. Существует два типа констант: числовые и строковые (символьные).

Строковые константы - последовательность до 255 символов, заключенная в кавычки. Например:

"STRING СТРОКА 1, 4.5 [¤AT]".

Числовые константы могут быть целыми и вещественными, т.е. иметь дробную часть.

Целое число должно быть в диапазоне от -32768 до 32767 включительно. Целая числовая константа может быть записана в десятичной, шестнадцатеричной, восьмеричной или двоичной формах представления.

Шестнадцатеричная числовая константа состоит не более чем из четырех шестнадцатеричных цифр (цифры от 0 до 9 и буквы от A до F включительно), которым предшествует префикс &H, например: &H9A.

Восьмеричная числовая константа состоит не более чем из шести восьмеричных цифр (цифры от 0 до 7 включительно(, которым предшествует префикс &O, например &O1235. Двоичная числовая константа состоит не более чем из шести двоичных цифр (цифры 0 или 1), которым предшествует префикс &B, например &B0110.

Вещественная константа в записи с фиксированной точкой имеет вид [целая часть].[дробная часть][!/#]. Например: .55,1234.56!

Константа будет представлена с одинарной точностью, если ее запись с фиксированной точкой содержит не более семи цифр или оканчивается специальным символом "!". Константа будет представлена с двойной точностью, если ее запись с фиксированной точкой содержит более семи цифр или оканчивается символом "#". Например: .312954385

Константа одинарной точности в записи с плавающей точкой имеет вид: [целая часть].[дробная часть]E[[+/-]порядок] Например: 3E+12, -34.56E-10

Константа двойной точности в записи с плавающей точкой имеет вид: [целая часть].[дробная часть]D[[+/-]порядок] Например: 3D+23, -34.56D-23

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

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

Индексированные числовые переменные состоят из одной буквы, за которой следуют арифметические выражения, заключенные в круглые скобки.

Строковая переменна идентифицируется именем, которое состоит из буквы, за которой может следовать буква или цифра. В конце имени строковой переменной обязательно должен находиться специальный символ "¤". Например:

  • A - просто числовая переменная
  • B(3) - индексированная переменная
  • S¤ - строковая переменная

Особенность. работы со строковыми переменными является то что размер строкового пространства при загрузке Бейсика по умолчанию определен в 100 байт. При работе с длинными строковыми переменными необходимо в начале программы выполнить команду CLEAR. Пример: CREAR 1000 (Размер строкового пространства установлен в 1000 байт).

1.2.3. Определение и преобразование типов данных

Тип констант и переменных указывается одним из двух способов

1 СПОСОБ: С помощью специального символа, который стоит после константы или последним в имени переменной, если это символ #, %, ! или ¤.

2 СПОСОБ: С помощью первого символа в имени переменной, определенной операторах DEFINT, DEFSNG, DEFDBL, DEFSTR.

Явное указание (с помощью специальных символов !, #, ¤, %) имеет больший приоритет, чем определение с помощью операторов DEFINT, DEFSNG, DEFDBL, DEFSTR.

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

Имеют место следующие правила преобразования типов:

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

Например:

    10 A = 2.04
    20 B# = A
    30 PRINT A; B#
    RUN
    2.04    2.039999961853027
    Ok

Переменная A - вещественная, одинарной точности

Переменная B - вещественная, двойной точности

Константы
Рисунок 1. Константы

1.2.4. Выражения, типы операций

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

В языке Бейсик используются следующие типы операций (приведены в порядке приоритета):

  • арифметические операции;
  • операции отношений;
  • логические операции;
  • строковые операции.

Ниже будут подробно рассмотрены все эти типы операций.

1.2.4.1. Арифметические операции
Таблица 2
Знак операции Операция Пример
^ Возведение в степень X^Y
- Минус -X
* Умножение X*Y
/ Деление с плавающей точкой X/Y
\ Целочисленное деление X\Y
MOD Арифметический модуль X MOD Y
+ Сложение X+Y
- Вычитание X-Y

Операции приведены в порядке убывания приоритета.

Операция целочисленного деления обозначается символом "\". Перед выполнением операции деления операнды округляются для целых чисел, которые должны лежать в диапазоне от -32768 до 32767. Частное от деления округляется до целого отбрасыванием дробной части. Если значение операнда лежит вне указанного диапазона, то выдается сообщение об ошибке. Например:

    10\4 = 2
    25.68\6.99 = 3

Операция арифметического модуля обозначается MOD. Она вычисляет целое значение, которое является остатком от целочисленного деления. Например:

    13.4 MOD 3.8 = 1, т.е. 13.4\4 = 3 с остатком 1
    25.68 MOD 6.99 = 5, т.е. 26\7 = 3 с остатком 5
1.2.4.2. Операции отношения

Операции отношения указаны в табл.3.

Таблица 3
Знак операции Операция Пример
= Равенство X=Y
<> Неравенство X<>Y
< Меньше X<Y
> Больше X>Y
<= Меньше или равно X<=Y
>= Больше или равно X>=Y

Операции отношения приведены в порядке приоритета.

Результат сравнения ИСТИНА (не ноль) или ЛОЖЬ (ноль).

1.2.4.3. Логические операции

Логические операции выполняются над числовыми переменными и константами. Различают следующие логические операции:

  • NOT - логическое отрицание;
  • AND - конъюнкция;
  • OR - дизъюнкция;
  • XOR - исключающее "или";
  • IMP - импликация;
  • EQU - эквивалентность.

Ниже приведены результаты выполнения операций к битовым значениям.

Таблица 3
 X   Y  X AND Y X OR Y X XOR Y X EQU Y X IMP Y X NOT Y
0 0 0 0 0 1 1 1
0 1 0 1 1 0 1 -
1 0 0 1 1 0 0 -
1 1 1 1 0 1 1 0

Перед выполнением логических операций интерпретатор Бейсик преобразует операнды в шестнадцатибитные, знаковые целые числа (в дополнительном коде) в диапазоне от -32768 до 32767. Если операнд не лежит в указанном диапазоне, то выдается сообщение об ошибке: ПЕРЕПОЛНЕНИЕ.

После преобразования каждый операнд рассматривается как строка из 16 бит.

Логическая операция выполняется над этими строками побитно.

Если после такой операции значение строки не равно нулю, то результат - "истина". В противном случае - результата "ложь". Например:

    10 IF (A = 1) OR (B = 5) THEN PRINT A, B
    20 IF A = (B OR C) THEN GOTO 800
    30 IF ERR = 13 AND ERL = 400 THEN END

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

Анализ результирующей строки битов после выполнения логической операции может производиться двумя способами:

  • анализ всей строки на значении ноль/не ноль ("истина"/"ложь");
  • побитовый анализ.

Первый способ был рассмотрен выше.

Второй способ применяется для проверки машинных слов, для выявления набора битов.

В отличии от первого способа "истиной" считается значение двоичного разряда, равное 1. Если значение соответствующего бита равно 0, то она считается "ложно".

Этот способ применяется для получения нужного состояния машинного слова. Например:

    PRINT 63 AND 16
    16
    Ok

Рассмотри порядок выполнения этой логической операции:

    00111111 - двоичное значение числа 63
AND 00010000 - двоичное значение числа 16
  = 00010000 - двоичное значение числа 16

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

1.2.4.4. Строковые операции

Строковые операции: конкатенация; сравнение; встроенные строковые функции.

Операция конкатенации (сцепления) обозначается символом "+". В результате операции конкатенации образуется строка, левая часть которой равна первому операнду, а вторая часть - второму. Например:

    10 CO¤="ПРИМЕР"
    20 TP¤ = "ЗАДАЧИ"
    30 PN¤ = TP¤ + "НА ЯЗЫКЕ БЕЙСИК"
    40 PRINT CO¤ + PN¤
    RUN
    ПРИМЕР ПРОГРАММЫ НА ЯЗЫКЕ БЕЙСИК
    Ok

Строки можно сравнивать, используя операции отношений также, ка с числами. Строковое сравнение выполняется путем посимвольного сравнения строк по кодам КОИ-8. Если все коды двух строк совпадают, то строки равны. Если коды различны, то строка с меньшим кодом меньше. Если во время сравнения конец одной строки встретился раньше, то это строка меньше. Например:

    "AA" < "AB"
    "FILENAME" = "FILENAME"
    "X&" > "X#"
    "S" > "C"
    B¤ < "9/10/85" где B¤ = "8/10/85"

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

1.3. Система команд

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

1.3.1. Команды

Команды выполняются сразу после введения. Большинство команд может быть использовано в программных строках.

1.3.1.1. Команды общего назначения

Команды общего назначения представлены в табл.4.

Таблица 4
Обозначение Выполняемое действие Наличие в РМУ
AUTO Автоматически генерирует номер строки Есть
CLEAR Очищает программные переменные и устанавливает размер строкового пространства Есть
COM Устанавливает признак заполнения почтового ящика Только РМУ
CONT Продолжает выполнение программы Есть
DELETE Стирает программные строки Есть
EDIT Выводит программные строки для редактирования Есть
LIST Выводит на экран дисплея строки загруженной в память программы Есть
LLIST Распечатывает на печатающем устройстве строки загруженной в память программы Нет
NEW Стирает из памяти текущую программу и очищает переменные Есть
RENUM Перенумеровывает строки программы в памяти Есть
RUN Выполняет программу Есть
TRON Включает трассировку Есть
TROFF Выключает трассировку Есть
1.3.1.2. Команды работы с НГМД

Команды работы с НГМД представлены в табл.5.

Таблица 5
Обозначение Выполняемое действие Наличие в РМУ
FILES Выводит директорию диска на экран Нет
KILL Стирает файл с дика Нет
LFILES Распечатывает директорию диска на печатающем устройстве Нет
LOAD "имя программы", параметры Загружает в память программный или текстовый, или двоичный файл с диска Нет
MERGE "имя программы" Объединяет программу в памяти с сохраненной на диске Нет
NAME Переименовывает файл, находящийся на диске Нет
SAVE "имя программы", параметры Нет
RUN "имя программы", параметры Загружает и выполняет программу с диска Нет
SYSTEM Возвращает управление в операционную систему Нет
1.3.1.3. Команды работы с НКМЛ

Команды работы с НКМЛ представлены в табл.6.

Таблица 6
Обозначение Выполняемое действие Наличие в РМУ
LOAD "CAS:имя программы", параметры Загружает в память программный, или текстовый, или двоичный файл с НКМЛ Есть
SPEED Устанавливает скорость записи Есть
SAVE "CAS:имя программы", параметры Сохраняет на НКМЛ программный или текстовый, или двоичный файл Есть
MOTOR ON/OFF Управляет включением магнитофона Есть
MERGE "CAS:имя программы" Объединяет программу в памяти с сохраненной на НКМЛ Есть
RUN "CAS:имя программы", параметр Загружает и выполняет программу с НКМЛ Есть
1.3.2. Операторы

Операторы выполняются в течение работы программы. Операторы могут быть исполнительными или не исполнительными. Большинство операторов можно использовать в прямом режиме.

1.3.2.1. Операторы общего назначения

Операторы общего назначения представлены в табл. 7.

Таблица 7
Обозначение Выполняемое действие Наличие в РМУ
CLS Очистка экрана от текстовых данных Есть
DATA Создает таблицу данных для использования оператором READ Есть
DEF FN Определяет числовую или строковую функцию, заданную пользователем Есть
DEFINT Определяет целочисленную переменную Есть
DEFSNG Определяет переменную одинарной точности Есть
DEFDBL Определяет переменную двойной точности Есть
DEFSTR Определяет строковую переменную Есть
DEFUSR Определяет начальный адрес программы на машинном коде Есть
DIM Резервирует память для массивов Есть
END Останавливает программу, закрывает все файлы, возвращает управление на уровень команд Есть
ERASE Исключает массивы из программы Есть
ERROR Моделирует ошибку Есть
FOR ... NEXT Повторяет выполнение программы Есть
GOSUB Определяет переход на первую строку подпрограммы Есть
GOTO Осуществляет переход на указанную строку программы Есть
IF ... THEN Принимает решение относительно условия Есть
LET Присваивает значение выражения переменной Есть
LOCATE Устанавливает позицию текстового курсора Есть
MID¤ Выделяет требуемую часть заданной строки Есть
ON ERROR Разблокирует программу ловушки ошибок и задает первую строку подпрограммы ошибок Есть
ON ... GOSUB Осуществляет переход к подпрограмме в зависимости от выражения Есть
ON ... GOTO Осуществляет переход к оператору в зависимости от выражения Есть
POKE Заносит байт в память по заданному адресу Есть
RANDOMIZE Запускает генератор случайных чисел Есть
READ Выбирает данные из таблицы, созданной оператором DATA Есть
REM Включает комментарии в программу Есть
RESTORE Устанавливает указатель на заданный оператор DATA Есть
RESUME Возвращает управление из подпрограммы ошибок Есть
RETURN Возвращает управление из подпрограммы Есть
STOP Останавливает выполнение программы и возвращает управление на уровень команд Есть
SWAP Обменивает значения двух переменных Есть
WIDTH Устанавливает ширину входной строки дисплея Есть
1.3.2.2. Операторы ввода (вывода) для файлов

Операторы ввода (вывода) для файлов для НГМД представлены в табл. 8.

Таблица 8
Обозначение Выполняемое действие Наличие в РМУ
CLOSE Закрывает файл Нет
INPUT# Считывает данные из файла Нет
LINE INPUT Считывает строку из файла Нет
OPEN Открывает файл Нет
PRINT# Записывает информацию в файл Нет
PRINT# USING Записывает информацию в файл в заданном формате Нет
1.3.2.3. Операторы ввода (вывода)

Операторы ввода (вывода) представлены в табл. 9.

Таблица 9
Обозначение Выполняемое действие Наличие в РМУ
INPUT Считывает данные с клавиатуры Есть
LINE INPUT Считывает строку с клавиатуры Есть
LPRINT Печатает значение выражения на печатающем устройстве (ПУ) Нет
LPRINT USING Печатает значение выражения на ПУ в заданном формате Нет
PRINT Выводит информацию на экран дисплея Есть
PRINT USING Выводит информацию на экран дисплея в заданном формате Есть
1.3.2.4. Графические операторы

Графические операторы представлены в табл.10.

Таблица 10
Обозначение Выполняемое действие Наличие в РМУ
CIRCLE Рисует эллипс, дугу или сектор на экране дисплея Есть
COLOR Определяет цвет заднего, переднего фона Есть
DRAW Рисует объект, определяемый строкой Нет
LINE Рисует на экране дисплея линию или прямоугольник Есть
LUT Устанавливает таблицу цветов Есть
PAINT Заполняет область экрана заданным цветом Есть
PCLS Очистка графического ЗУ Есть
PSET Рисует точку на экране дисплея Есть
PRESET Стирает точку на экране дисплея Есть
RELOC Устанавливает начала координат Есть
SCREEN* Задает рабочие графические страницы Есть
* - работает при наличии расширенного ОЗУ
1.3.2.5. Операторы звука

Операторы звука представлены в табл.11.

Таблица 11
Обозначение Выполняемое действие Наличие в РМУ
BEEP Воспроизводит короткий звуковой сигнал Есть
PLAY* Воспроизводит музыкальную фразу Нет
SOUND* Воспроизводит звук, шум Нет
* - Применяются при наличии синтезатора звука и расширенной версии интерпретатора языка Бейсик.
1.3.3. Функции

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

1.3.3.1. Математические функции

Математические функции представлены в табл.12.

Таблица 12
Обозначение Результат Наличие в РМУ
ABS Абсолютное значение числа Есть
ATN Арктангенс угла Есть
CDBL Перевод числа в двойную точность Есть
CINT Перевод числа в целое с округлением Есть
COS Косинус угла Есть
CSNG Перевод числа в одинарную точность Есть
EXP Экспонента числа Есть
FIX Усечение числа до целого Есть
INT Самое больше целое число, меньше или равное указанному Есть
LOG Натуральный логарифм числа Есть
RND Случайное число Есть
SGN Знак числа Есть
SIN Синус угла Есть
SQR Квадратный корень числа Есть
TAN Тангенс угла Есть
1.3.3.2. Строковые функции

Строковые функции представлены в табл.13.

Таблица 13
Обозначение Результат Наличие в РМУ
ASC Код КОИ-8 первого символа строки Есть
BIN¤ Строковое двоичное представление числа Есть
CHR¤ Символ с кодом КОИ-8 Есть
HEX¤ Строковое шестнадцатеричное представление числа Есть
INKEY¤ Символ, считанный с клавиатуры Есть
INSTR Позиция подстроки в строке, начиная с заданной позиции Есть
LEFT¤ Самые левые символы заданной строки Есть
LEN Длина заданной строки Есть
MID¤ Определенная часть заданной строки Есть
OCT¤ Строковое восьмеричное представление числа Есть
RIGHT¤ Самы правые символы заданной строки Есть
SPACE¤ Строка пробелов Есть
STR¤ Строковое представление числа Есть
STRING¤ Символ, повторенный определенное число раз Есть
VAL Числовое значение строки Есть
1.3.3.3. Функции общего назначения

Функции общего назначения представлены в табл.14.

Таблица 14
Обозначение Результат Наличие в РМУ
CSRLIN Вертикальная координата текстового курсора Есть
ERL Номер строки ошибки Есть
ERR Код ошибки Есть
FRE Количество байт свободного пространства памяти Есть
LPOS Позиция каретки печатающего устройства Нет
PEEK Содержимое байта памяти Есть
POS Горизонтальная позиция текстового курсора Есть
SPC Последовательность пробелов Есть
TAB Табуляция на заданную позицию Есть
1.3.3.4. Графические функции

Графические функции представлены в табл.15.

Таблица 15
Обозначение Результат Наличие в РМУ
POINT Цвет определенной точки на экране Есть
1.3.3.5. Специальные функции

Специальные функции представлены в табл.16.

Таблица 16
Обозначение Результат Наличие в РМУ
EOF Признак конца файла Нет
LOC Число записей, считанных или записанных в файл с последовательным доступом Нет
LOF Число записей в файле Нет
VARPTR Адрес блока управления в файле Нет
INPUT¤ Считываемые символы из файла или клавиатуры Нет
USR Вызов программы на машинном языке Есть
STICK* Числовое выражение от 1 до 8, указывающее направление движения джойстика Нет
STRIG* Признак нажатия кнопки на джойстике Нет
* - Применяются при наличии манипулятора типа ДЖОЙСТИК и расширенной версии интерпретатора языка Бейсик.
1.4. Описание инструкций языка Бейсик
1.4.1. Функция ABS
Y = ABS(X)

Возвращает абсолютное значение числа X. Абсолютное значение всегда положительно или равно нулю. Например:

    PRINT ABS(7 * (-5))
    35
    Ok
1.4.2. Функция ASC
Y = ASC(X¤)

Возвращает код КОИ-8 первого символа строки X¤. Результат функции - числовое значение. Если строка X¤ пустая, то выдается сообщение об ошибке НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    10 X¤ = "ТЕСТ"
    20 PRINT ASC(X¤)
    RUN
    84
    Ok
1.4.3. Функция ATN
Y = ATN(X)

Возвращает арктангенс значения X. Результат функции возвращается в радианах в диапазоне от -PI/2 до PI/2, где PI=3.141593. Выражение X может быть задано в любом числовом формате, но вычисления функции ATN всегда выполняются с одинарной точностью. Для перевода радиан в градусы результат вычисления умножается на 180/PI. Например:

    10 INPUT X
    20 PRINT ATN(x)
    RUN
    ?3
    1.24905
    Ok

    10 PI = 3.141593
    20 RAIDANS = ATN(1)
    30 DEGREES = RADIANS * 180 / PI
    40 PRINT RADIANS, DEGREES
    RUN
    .785398        45
    Ok
1.4.4. Команда AUTO
AUTO [номер][, шаг]
где:  номер - номер, который будет использоваться как начальный при нумерации строк;
  шаг - значение, которое будет прибавляться к каждому номеру строки для получения следующего номера строки.

Автоматически генерирует номер строки после каждого нажатия клавиши возврата каретки. Команда AUTO обычно используется при введении программ. Нумерация начинается с НОМЕРА, для получения следующего номера строки к предыдущему номеру будет добавляться шаг. Если оба номера опущены, то по умолчанию принимается AUTO 10, 10. Если за НОМЕРОВ следует запятая, а шаг не определен, то принимается шаг, определенный в предыдущей команде AUTO. Если НОМЕР опущен, а шаг определен, то нумерация начинается с 0. Точка "." может быть использована вместо НОМЕРА строки, чтобы указать текущую строку. Если AUTO генерирует номер строки, который уже существует в программе, то после сгенерированного номера появится "*", чтобы предупредить о том, что любая введенная строка будет замещать уже существующую строку. AUTO останавливается нажатием клавиши СТОП. Строка, в которой нажимается клавиша СТОП, не сохраняется. После нажатия клавиши СТОП интерпретатор возвращает управление на уровень команд. Например:

  • AUTO - генерирует номера строк: 10, 20, 30, 40, ...;
  • AUTO 100, 50 - генерирует номера строк: 100, 150, 200, 250, ...;
  • AUTO 500, 50 - генерирует номера строк: 500, 550, 600, 650, ...;
  • AUTO , 20 - генерирует номера строк: 0, 20, 40, 60, ...
1.4.5. Оператор BEEP
BEEP

Заставляет звучать динамик на частоте 800 Гц в течении 1/4 сек. Операторы BEEP и PRINT CHR¤(7) имеют одинаковый эффект. Например:

    10 REM если X вне диапазона
    20 IF X<20 THEN BEEP
1.4.6. Функция BIN¤
Y¤ = BIN¤(N)

Возвращает строку, которая представляет собой двоичное значение десятичного аргумента. Значение аргумента может изменяться от -32768 до 65535. Если N - отрицательное число, то справедливо равенство: BIN¤(-N) = BIN¤(65535 - N)

Аргумент N не должен быть строковым или вещественным числом, иначе будет выдаваться сообщение ОШИБОЧНЫЙ ТИП. Если значение аргумента лежит вне диапазона, то выдается сообщение об ошибке ПЕРЕПОЛНЕНИЕ. Например:

    10 PRINT BIN¤(-255)
    20 PRINT BIN¤(9999)
    RUN
    1111111100000001
    10011100001111
    Ok
1.4.7. Функция CDBL
Y=CDBL(X)

Переводит X в вещественное число двойной точности. Например:

    10 A = 454.67
    20 PRINT A, CDBL(A)
    RUN
    454.67        454.6700134277344
    Ok
1.4.8. Функция CHR¤
Y¤ = CHR¤(N)

где: N - числовое значение в диапазоне от 0 до 255.

Переводит код КОИ-8 в его символьный эквивалент. Функция CHR¤ возвращает строку из одного символа c кодом КОИ-8 для символа N. CHR¤ используется для получения специального символа на экране или на печатающем устройстве. Если N больше 255, то выдается сообщение НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    PRINT CHR¤(65); CHR¤(32); CHR¤(70)
    A F
    Ok
1.4.9. Функция CINT
Y = CINT(X)

Переводит выражение X в целое число округлением дробной части. Если X не лежит в диапазоне от -32768 до 32767, то появляется сообщение об ошибке ПЕРЕПОЛНЕНИЕ. Например:

    PRINT CINT(45.67)
    46
    Ok
    PRINT CINT(-2.89)
    -3
    Ok
1.4.10. Оператор CIRCLE
CIRCLE [STEP] (X,Y), радиус [, [цвет [, [начало], [конец [, аспект]]]]]
где:  X,Y - координаты центра эллипса;
  радиус - числовое выражение, определяющее радиус эллипса;
  цвет - значение цвета в диапазоне от 0 до 7;
  начало, конец - угловые параметры дуги, заданные в радианах;
  аспект - числовое выражение.

Рисует эллипс, дугу или сектор на экране дисплея с центром (X, Y) и заданным радиусом.

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

Если цвет отсутствует, то используется цвет переднего фона, заданный оператором COLOR. Аспект - это отношение длины отрезка, заданного на оси X в эллипсе, к длине отрезка, заданного на оси Y.

В растровом дисплее стандартное отношение горизонтальных и вертикальных точек равно 3/2, т.е. 3 горизонтальных точки равны 2 вертикальным. Поэтому для получения окружности необходимо задать аспект, равный 3/2. По умолчанию аспект равен 1. Если аспект меньше 1, то заданный радиус является Y-радиусом (эллипс, вытянутый по оси Y). Если аспект больше 1, то заданный радиус является X-радиусом эллипса (эллипс, вытянутый по оси X).

Начало и конец задаются в диапазоне от 0 до 2 * PI (PI = 3.141593). Они позволяют определить начало и конец дуги эллипса. Если перед началом или концом указан минус, то рисуется прямая, соединяющая центр с началом или концом дуги. По умолчанию начало равно 0 а конец - 2*PI. Например:

    5 PI = 3.141593
    10 CIRCLE(250, 100), 100, 3, -1.4 * PI, -1.6 * PI, 1.0
1.4.11. Команда CLEAR
CLEAR выражение
где:  выражение - счетчик байтов, который устанавливает размер строкового пространства.

Устанавливает все числовые переменные в ноль и очищает строковые переменные, устанавливает размер строкового пространства.

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

    CLEAR
    CLEAR 2000
1.4.12. Оператор CLOSE
CLOSE [номер файла[, номер файла] ...]
где:  номер файла - номер файла, используемый в операторе OPEN.

Завершает ввод-вывод в файл. Оператор CLOSE без операндов закрывает все файлы, открытые оператором OPEN. После выполнения оператора CLOSE аннулируется ассоциация между определенным файлом и его номером. Этот же файл может быть открыть опять с тем же или другим номером файла. Этот же номер может быть использован заново, чтобы открыть любое устройство или файл. Оператор END, команды NEY или SYSTEM автоматически закрывают все открытые файлы или устройства. Оператор STOP не закрывает файлы или устройства. Например:

    100 CLOSE 1, 2, 3 : REM закрывает файлы и устройства под номерами 1, 2, 3.
    200 CLOSE : REM закрывает все открытые файлы и устройства.
1.4.13. Оператор CLS
CLS

Очищает алфавитно-цифровое запоминающее устройство (АЦЗУ) в цвет заднего фона.

Стирает текстовую информацию. Оператор CLS возвращает текстовый курсор в верхнюю левую позицию (подраздел 1.1)

1.4.14. Оператор COLOR
COLOR [передний фон][, задний фон]
где:  передний фон - значение целочисленного выражения в диапазоне от 0 до 7;
  задний фон - значение целочисленного выражения в диапазоне от 0 до 7.

Устанавливает цвета, используемые в графических операторах. Передний фон - цвет, используемый операторами в качестве неявного параметра при выводе графических изображений на экран дисплея. Задний фон - цвет, используемый в качестве неявного параметра в операторах PCLS и PRESET для стирания изображения или точки с экрана дисплея.

Если значения параметров выходят за пределы определенных диапазонов, то печатается сообщение НЕВЕРЕН ВЫЗОВ ФУНКУИИ.

Задаваемые оператором COLOR цвета переднего и заднего фона с помощью таблицы LUT преобразуются в физические цвета. Например:

    10 COLOR 7, 0

При начальной инициализации устанавливаются следующие цвета:

  • 0 – черный;
  • 1 – синий;
  • 2 – зеленый;
  • 3 – голубой;
  • 4 – красный;
  • 5 – фиолетовый;
  • 6 – желтый;
  • 7 – белый.
1.4.15. Команда COM
COM "текст"

Устанавливает признак заполнения почтового ящика локальной сети и заносит содержимое, находящееся внутри кавычек, в почтовый ящик. Максимальное количество символов текста, заключенного в кавычках, равно 240. Если не задана какая-либо пара кавычек или превышено число символов текста, то выдается сообщение ОШИБКА СИНТАКСИСА. Команда COM используется только в РМУ. Например:

    COM "Иванов задание выполнил"
1.4.16. Команда CONT
CONT

Продолжает выполнение программы после прерывания (нажатие клавиш СТОП). Команда CONT может быть использована для возобновления выполнения программы после нажатия клавиши СТОП или после выполнения оператора STOP. Выполнение продолжается с той точки, где осуществилось прерывания. Если прерывание встречается после напоминания в операторе INPUT, то выполнение продолжается с перепечатки напоминания. Команда CONT обычно используется совместно с оператором STOP для устранения ошибок. Когда выполнение останавливается, можно проверить и изменить значения переменных, используя операторы в прямом режиме. Затем можно использовать CONT для продолжения выполнения или можно использовать прямой оператор GOTO, который восстанавливает выполнение с определенного номера строки. Если программа редактируется во время прерывания, то команда CONT не правомочна.

В следующем примере создается длинный цикл:

    10 FOR A = 1 TO 50
    20 PRINT A;
    30 NEXT A
    RUN
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <нажатие клавиши СТОП>
    СТОП В 20
    Ok
    CONT
    30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
    Ok
1.4.17. Функция COS
Y = COS(X)

Возвращает значение косинуса угла X.

X должен быть задан в радианах. Чтобы перевести градусы в радианы, результат вычисления надо умножить на PI/180, где PI=3.141593. Вычисление косинуса выполняется с одинарной точностью. Например:

    10 X = 20 * COS(.4)
    20 PRINT X
    30 NEXT A
    RUN
    1.84212
    Ok
    10 PI = 3.141593
    20 PRINT COS(PI)
    30 DEGREES = 180
    40 RADIANS = DEGREES * PI / 180
    50 PRINT COS(RADIANS)
1.4.18. Функция CSNG
Y = CSNG(X)

Переводит выражение X в вещественное число одинарной точности. Подобна функциям CINT и CDBL для перевода чисел в целое и двойной точности. Пример:

    10 A# = 975.34221222
    20 PRINT A#; CSNG(A#)
    RUN
    975.34221222     975.342
    Ok
1.4.19. Переменная CSRLIN
Y = CSRLIN

Возвращает значение текущей вертикальной координаты текстового курсора. Возвращаемое значение лежит в диапазоне от 1 до 16. Например:

    10 IF CSRLIN > 10 THEN GOTO 300
1.4.20. Оператор DATA
DATA список констант

Запоминает числовые и строковые константы, которые будут считаны оператором READ. Константы разделяются запятыми (,). Оператор DATA неисполняемый оператор и может быть расположен в любом месте программы. Оператор DATA может содержать столько констант, сколько их поместится на строке экрана дисплея. В программе может быть использовано любое количество операторов DATA. Данные, которые содержатся в операторах DATA, могут считываться как один продолжающийся список данных, невзирая на количество элементов в строке и на место, где расположены строки. Операторы READ имеют доступ к операторам DATA в порядке номеров строк. В списке констант оператора DATA не допускаются выражения. Числовые константы могут быть заданы в любой форме. Нет необходимости в операторе DATA заключать в кавычки строковые константы, если они не содержат запятых, двоеточий и пробелов. Тип переменной, заданной в операторе READ, должен соответствовать типу констант в операторе DATA, иначе появится сообщение об ошибке ОШИБКА СИНТАКСИСА. Для того, чтобы заново считать данные с начала списка операторов DATA, надо использовать оператор RESTORE.

1.4.21. Оператор DEF FN
DEF FN_имя (аргумент, аргумент, ...) = определение
где:  _имя - имя переменной. Это имя, которому предшествует FN (без пробела), становится именем функции;
  аргумент - имя переменной в описании функции, которое будет заменено значением при вызове функции;
  определение - выражение, выполняющее операцию функции. Определяет и именует функцию, которую записывает пользователь.

Определение функции ограничивается одной строкой. Им переменной, используемое в описании функций, не должно появляться в списке аргументов. Если это сделано, то подставляется значение аргумента при вызове функции. С другой стороны, используется текущее значение переменной. Аргументы в списке соответствуют один к одному значениям, которые передаются при вызове функции. Тип функции определяет: числовое или строковое значение возвращает функция. Если тип определения не соответствует типу функции, то появляется сообщение об ошибке ОШИБОЧНЫЙ ТИП. Если функция числовая, то значение выражения определения переводится в число с точностью, описанной именем, перед возвратом в вызывающий оператор. Оператор DEF FN должен быть выполнен для определения функции перед ее вызовом, иначе появится сообщение об ошибке НЕТ ОПРЕДЕЛИТЕЛЯ FN. Функция может быть определена более одного раза. Действительным является самое последнее определение. Можно иметь рекурсивные функции, т.е. функции, которые вызывают сами себя. Однако, если не обеспечивается способ остановки рекурсии, появляется сообщение НЕТ ПАМЯТИ. Нельзя использовать оператор DEF FN в прямом режиме. Например:

    10 PI = 3.141593
    20 DEF FNAREA(R) = PI * R^2
    30 INPUT "РАДИУС"; RADIUS
    40 PRINT "ПЛОЩАДЬ КРУГА"; FNAREA(RAIDUS)
    RUN
    РАДИУС? 2
    ПЛОЩАДЬ КРУГА 12.5664
    ОК

Строка 20 определяет функцию FA AREA, которая вычисляет площадь круга с радиусом R. Функция вызывается в строке 40.

Пример функции с двумя аргументами:

    10 DEF FNMVD(X, Y) = X - (INT(X / Y) * Y)
    20 A = FNMVD(7.4, 4)
    30 PRINT A
    RUN
    3.4
    ОК
1.4.22. Операторы DEFINT, DEFSNG, DEFDBL и DEFSTR
DEFтип буква[-буква][, буква][-буква]
где:  тип - одно из следующих значений: INT, SNG, DBL или STR.

Описывает типы переменных: целочисленная (INT), одинарной точности (SNG), двойной точности (DBL), строковая (STR) переменная. Оператор DEFтип определяет что переменные, имена которых начинаются с заданных букв, будут переменными этого типа. По умолчанию все переменные без символов описания типа являются переменными одинарной точности. Операторы описания типа, если они используются, должны быть заданы в начале программы перед использованием какой-либо переменной, описанной в операторе DEFтип. Например:

    30 DEFINT X, D-H: DEFDBL L-P: DEFSTR A: o = I# / 3
    40 PRINT O
    50 ANIMAL¤ = "CAT": PRINT ANIMAL¤: X = 10 / 3: PRINT X
    RUN
    0.3333333333333333
    CAT
    3
    ОК
1.4.23. Оператор DEF USR
DEFUSR [цифра] = адрес
где:  цифра - любая цифра в диапазоне от 0 до 9;
  адрес - целочисленное выражение в диапазоне от 0 до 65535.

Определяет начальный адрес программы на машинном языке, которая позднее вызывается функцией USR. Цифра соответствует номеру программы USR, чей адрес определяется. Если цифра опущена, по умолчанию принимается DEFUSR 0. Значение адреса может задаваться в десятичном или шестнадцатеричном формате и является действительным начальным адресом программы USR. Для переопределения начального адреса подпрограммы в программе может появляться любое количество операторов DEFUSR, так как разрешается доступ к программам столько раз, сколько необходимо. Например:

    100 DEFUSR0 = &H9000
    .
    .
    .

    500 X = USR0(X+2)
1.4.24. Команда DELETE
DELETE [номер строки][-номер строки]

Стирает программные сроки. Команда DELETE убирает определенную область строк из программы. После выполнения команды DELETE интерпретатор возвращается на уровень команд. Точка (.) может быть использована на месте номера строки для указания текущей строки. Если одна из двух строк в программе не существует, то появляется сообщение об ошибке НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    DELETE 40        стереть строку 40;
    DELETE 40-100    стереть все строки с 40 по 100 включительно;
    DELETE -40       стереть все строки с начала программы по 40 включительно.
1.4.25. Оператор DIM
DIM переменная(индексы)[, переменная(индексы)...]

Определяет максимальное значение для индексов переменных массива и соответственно резервирует память Оператор DIM устанавливает все элементы заданного числового массива в начальное значение, равное нулю, а все элементы заданного строчного массива становятся пустыми. Если имя переменной массива используется без предварительного описания оператором DIM, то максимальное значение ее индекса равно 10. Если используется индекс, который больше заданного максимума, то появляется сообщение об ошибке ИНДЕКС ВНЕ ДИАПАЗОНА. Минимальный индекс по умолчанию равен 0. Например:

    10 DIM A(5), B¤(5)
    20 FOR I = 1 TO 5: READ A(I), B¤(I): PRINT A(I); B¤(I)
    30 NEXT I
    50 DATA 14.7, AGE1, 6.9, AGE2, 8, MONTH, 29
    60 DATA DAY, 80, YEAR, 12.543, BIRTHDAY
1.4.26. Оператор DRAW
DRAW "строка"
где:  строка - команды графического макроязыка, описывающие изображение.

Оператор DRAW позволяет изображать сложные фигуры отрезками прямых линий. Каждая команда представлена одним символом. Команды в строке пишутся подряд, между собой ничем не разделяются. Команды для рисования отрезков прямых по вертикали и горизонтали:

  • Un - вверх;
  • Dn - вниз;
  • Rn - вправо;
  • Ln - влево.

Команды для рисования отрезков прямых по диагонали:

  • En - вверх и вправо;
  • Fn - вниз и вправо;
  • Gn - вниз и влево;
  • Hn - вверх и влево.

где: n - число точек экрана, которые необходимо нарисовать, чтобы получить отрезок нужной длины. В случае диагональных команд определяет число точек по X и Y координатами (n = nx = ny).

  • Mx,y - рисует линию от текущей точки до точки, определенной координатами X и Y..

Координаты X и Y могут быть абсолютными и относительными. Установка перед числовыми значениями X и Y знаков "+" или "-" означает, что заданы относительные координаты, и координаты последней точки рисуемой линии получаются суммированием координат текущей точки и значений относительных координат. Если перед координатами X и Y нет знаков "+" или "-", заданы абсолютные координаты, которые и являются координатами последней точки рисуемой линии.

Следующие команды могут предшествовать любой команде движения:

  • B - переслать, но не чертить все точки, а только последнюю точку;
    команда "BMx,y" может установить графический курсор в любую точку экрана, в зависимости от значений координат X и Y.
  • N - нарисовать линию и возвратиться в исходную точку;
  • А - команда вращения (может принимать значение 0, 1, 2, 3).

Команда вращает оси координат экрана дисплея против часовой стрелки на 90° (n = 1), 180° (n = 2), 270° (n = 4) и, соответственно, изменяет ориентацию движения команд U, D, L, R, E, F, G и H;

A0 - устанавливает оси координат в нормальное положение;

Sn - установить масштаб, где n = 0...255.

Фактически коэффициент масштабирования равен n/4. Для установки коэффициента, равного 1, необходимо установить n = 0, либо n = 4 (0 либо 4). Коэффициент масштабирования и угол поворота по умолчанию не устанавливаются, а берутся предыдущие значения, поэтому в начале программы желательно установить нужные A и Sn;

Cn - установить цвет изображаемо линии, где n - номер цвета;

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

Например:

    10 BA¤ = "U40R60D40L60"
    20 DRAW "BM100,100,S0XBA¤"
    30 DRAW "S1XBA¤"
    50 DRAW "S2XBA¤"

Программа рисует на экране 3 разных квадрата, т.к. аспект равен 3/2. Длина рисуемой линии в командах U, R, L, D, E, F, G, H, угол поворота (A), масштаб (S) могут быть заданы параметрически. Например:

    10 A = 80: K = 2
    20 DRAW "BM100,100,S=K;R=A;U=A;L=A;D=A"
1.4.27. Команда EDIT
EDIT номер строки
где:  номер строки - номер редактируемой строки.

Команда EDIT выводит на экран дисплея строку для редактирования. На экране распечатывается редактируемая строка, и курсор устанавливается в позицию первого символа после номера строки. Затем строка может редактироваться. Если такой строки в программе нет, на экране появится сообщение об ошибке НЕПРАВИЛЬНЫЙ НОМЕР СТРОКИ. Для редактирования только что введенной строки можно использовать точку (.). Подробное описание команд смотрите в подразделе 2.5. Например:

    EDIT 40
    EDIT .
1.4.28. Оператор END
END

Заканчивает выполнение программы, закрывает все файлы и возвращает управление на уровень команд.

Оператор END может находится в любом месте программы. Оператор END отличается от оператора STOP следующим:

  • END не вызывает сообщения СТОП;
  • END закрывает все файлы.

Например:

    IF P > 100 THN END ELSE GOTO 570
1.4.29. Функция EOF
Y = EOF(номер файла)
где:  номер файла - номер, определенный в операторе OPEN.

Проверяем условие конца файла. Функция EOF возвращает минут один (истина), если найден конец файла, и возвращает ноль (ложь), если конец файла не найден. Например:

    10 OPEN "I", #1, "DATA": C = 0
    30 IF EOF(1) THEN 100
    40 INPUT #1, M(C)
    50 C = C + 1: GOTO 30
    100 CLOSE 1
1.4.30. Оператор ERASE
ERASE имя массива [, имя массива]...

Исключает массивы из программы. Если во время выполнения программы оказывается мало памяти, можно использовать оператор ERASE. После того, как массивы удалены, пространство памяти, которое зарезервировано для массивов, может быть использовано для других целей. Оператор ERASE также может быть использован для того, чтобы заново определить размер массива, так как при попытке заново определить размер массива без предварительного выполнение оператора ERASE появляется сообщение об ошибке ПЕРЕОПРЕДЕЛЕНИЕ МАССИВА. Например:

    10 START = FRE(X)
    20 DIM BIG(100, 100)
    30 MIDLE = FRE(X)
    40 ERASE BIG
    50 DIM BIG(10, 10)
    60 FINAL = FRE(X)
    70 PRINT START, MIDDLE, FINAL
1.4.31. Переменные ERR и ERL
X = ERR
Y = ERL

Возвращают код ошибки и номер строки, где встретилась ошибка. Переменная ERR содержит код последней ошибки, а переменная ERL содержит номер строки, где ошибка обнаружилась. Переменные ERR и ERL обычно используются обычно в операторах IF ... THEN чтобы направить ветвь программы на подпрограмму, обрабатывающую ошибку. При использование ERL в операторе IF ... THEN надо убедиться, что номер строки находится справа от ERL, следующим образом:

IF ERL = номер_строки THEN ...

Номер строки должен находиться справа от ERL, чтобы быть переименованным командой RENUM. Если оператор, который вызывает программу, был оператором прямого режима, то ERL возвращает 65535. Так как нежелательно, чтобы номер этой строки изменился во время выполнения команды RENUM, то при проверке ошибки в прямом режиме следует использовать форму:

IF 65535 = ERL THEN ...

Переменные ERR и ERL могут быть заданы, используя оператор ERROR. Например:

    10 ON ERROR GOTO 80
    20 a = 3
    30 INPUT B
    40 C = A / B
    60 PRINT A, B, C
    70 GOTO 30
    80 IF (ERR = 1) AND (ERL = 40) THEN PRINT "ЗНАМЕНАТЕЛЬ РАВЕН НУЛЮ"
    90 RESUME 30
1.4.32. Оператор ERROR
ERROR n
где:  n - целочисленное выражение от 0 до 255.

Моделирует встречу ошибки оператором или распознает коды ошибок, которые определяет пользователь. Если n равно коду ошибки, оператор ERROR будет моделировать встречу этой ошибки. Если оператором ON ERROR определена подпрограмма обработки ошибки, то будет осуществляться переход на эту подпрограмму, в противном случае будет печататься сообщение об ошибке и выполнение программы будет остановлено. Для определения собственного кода ошибки используется значение, которое отличается от любого значения, используемого интерпретатором. Рекомендуется использовать значения больше 200. Если Ваша собственная ошибка определяется таким способом и она не обрабатывается в подпрограмме обработки ошибок, то будет печататься сообщение НЕОПРЕДЕЛЕННАЯ ОШИБКА, и выполнение программы будет остановлено. Если значение лежит вне указанного диапазона, то выдается сообщение об ошибке: НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    10 T = 15
    20 ERROR T
    RUN
    ДЛИННАЯ СТРОКА В 20
    Ok

<    110 ON ERROR GOTO 400
    120 INPUT "ЗАДАЙТЕ ЧИСЛО B", B
    130 IF B > 5000 THEN ERROR 210
    ...
    400 IF ERR = 210 THEN PRINT "ЧИСЛО БОЛЬШЕ, ЧЕМ 500"
    410 IF ERL = 130 THEN RESUME 120
1.4.33. Функция EXP
Y = EXP(X)

Вычисляет экспоненту. Возвращает значение числа e, возведенного в степень X. Аргумент X должен быть меньше или равен 87.3365, иначе возникнет переполнение. В этом случает на экран дисплея выводится сообщение об ошибке ПЕРЕПОЛНЕНИЕ, в результате появится положительная машинная бесконечность и выполнение приложения продолжится. Например:

    10 X = 2
    20 PRINT EXP(X - 1)
    RUN
    2.71828
    Ok
1.4.34. Команда FILES
FILES "имя файла"

Показывает имена файлов, расположенных на диске. Если имя файла опущено, то показываются все файлы на текущем выбранном устройстве. На экран дисплея выводятся все файлы, соответствующие указанному шаблону имени файла. Имя файла может содержать знак вопроса, который соответствует любому символу в имени файла или расширении. Знак * соответствует любому набору символов в имени или расширении. Если устройство определено как часть имени файла, то показываются файлы с заданным именем, находящимся на данном устройстве. По умолчанию используется текущее устройство. Например:

  • FILES - показывает все файлы на текущем устройстве;
  • FILES "*.BAS" - показывает все файлы с расширением .BAS на текущем устройстве;
  • FILES "B:*.*" - показывает все файлы на устройстве B:
1.4.35. Функция FIX
Y = FIX(X)

Преобразует значение выражения X в целое число путем отбрасывания дробной части. Например:

    PRINT FIX(58.75)
    58
    Ok
    PRINT FIX(-58.75)
    -58
    Ok
1.4.36. Операторы FOR ... NEXT
FOR переменная = выражение_1 TO выражение_2 [STEP выражение_3]
...
NEXT переменная [, переменная] ...
где:  переменная - целочисленная или одинарной точности переменная, которая будет использоваться для счетчика;
  выражение_1 - начальное значение счетчика;
  выражение_2 - конечное значение счетчика;
  выражение_3 - шаг цикла.

Программные строка, следующие за оператором FOR, выполняются до тех пор, пока не встретится NEXT. Затем счетчик увеличивается на число, определенное выражением_3 в STEP. Если шаг не задан, то шаг принимается равным единице. Затем выполняется проверка. Если значение счетчика не более конечного значения выражение_2, то опять начинают выполняться программные строки, следующие за оператором FOR, и процесс повторяется. А если значение счетчика больше конечного значения выражение_2, то начинают выполняться программные строки, следующие за оператором NEXT. Если выражение_3 - отрицательно, то каждый раз в цикле счетчик уменьшается, и цикл выполняется, пока счетчик больше конечного значения.

Циклы FOR ... NEXT могут быть вложены, т.е. один цикл FOR ... NEXT может находиться (выполняться) внутри другого FOR ... NEXT цикла. Каждый вложенный цикл должен иметь свои имена переменных в качестве счетчика. Оператор NEXT для внутреннего цикла должен выполняться ранее оператора NEXT для внешнего цикла.

Если вложенные циклы имеют одну точку конца, то может быть использован один оператор NEXT для обеих переменных. Вид оператора NEXT:

    NEXT переменная_1, переменная_2, переменная_3...

эквивалентен последовательности операторов:

    NEXT переменная_1
    NEXT переменная_2
    NEXT переменная_3
    ...

Переменная в операторе NEXT может быть опущена, в этом случае оператор NEXT будет заканчивать самый последний FOR ... NEXT цикл. Например:

    10 J = 10: K = 30
    20 FOR I = 1 TO J STEP 2
    30 PRINT I;: k = k + 10: PRINT K
    40 NEXT
    RUN
    1    40
    3    50
    5    60
    7    70
    9    80
    Ok
1.4.37. Функция FRE
Y = FREE(X)
Y = FREE(X¤)

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

1.4.38. Операторы GOSUB ... RETURN
GOSUB номер строки
...
RETURN
где:  номер строки - номер первой строки подпрограммы.

Осуществляет переход к подпрограмме и возврат из нее. В программе подпрограмма может вызываться любое число раз из самой программы или другой подпрограммы. Такие вложения подпрограммы ограничиваются только доступной памятью. Оператор RETURN возвращает управление обратно из подпрограммы к оператору, следующему за вызывавши эту программу оператором GOSUB. Подпрограмма может содержать больше одного оператора RETURN для возврата из различных точек подпрограммы. Подпрограммы могут размещаться в любом месте программы. Часто используемые подпрограммы следует размещать в начале программы, чтобы ускорить ее выполнение. Для перехода к различным подпрограммам в зависимости от значения выражения используется оператор ON ... GOSUB. Например:

    10 GOSUB 40
    20 PRINT "ВОЗВРАТ ИЗ ПОДПРОГРАММЫ": END
    40 PRINT "РАБОТАЕТ";
    50 PRINT "ПОДПРОГРАММА"
    60 RETURN
    RUN
    РАБОТАЕТ ПОДПРОГРАММА
    ВОЗВРАТ ИЗ ПОДПРОГРАММЫ
    Ok
1.4.39. Оператор GOTO
GOTO номер строки

Осуществляет безусловный переход на нормальной программной последовательности к определенному номеру строки. Если номер строки - номер исполнительного оператора, то выполняется этот оператор и следующий за ним, если это не исполнительный оператор (такой как REM или DATA), то выполнение продолжается с первого исполнительного оператора, встреченного после номера строки. Оператор GOTO может быть использован в прямом режиме, чтобы заново ввести программу с описываемой точки. Это может быть использовано при устранении ошибок. Для перехода к различным строкам в зависимости от значения выражения используется оператор ON ... GOTO. Например:

    5 DATA 5, 7, 12
    10 READ R
    20 PRINT "R="; R;
    30 A = 3.141 * R^2
    40 PRINT "AREA="; A
    50 GOTO 5
    RUN
    R=5    AREA=78.525
    R=7    AREA=153.909
    R=12   AREA=452.304
    ВНЕ DATA В 10
    Ok
1.4.40. Функция HEX¤
Y¤ = HEX¤(N)

Возвращает строку, которая представляет собой шестнадцатеричное значение десятичного аргумента. Значение округляется до целого числа перед выполнением функции HEX¤. Если N больше 65535, то выдается сообщение ПЕРЕПОЛНЕНИЕ. Например:

    10 INPUT X
    20 A¤ = HEX¤(X)
    30 PRINT X; "ДЕСЯТИЧНОЕ-"; A¤; "ШЕСТНАДЦАТИРИЧНОЕ"
    RUN
    ?32
    32 ДЕСЯТИЧНОЕ- 20 ШЕСТНАДЦАТИРИЧНОЕ
    Ok
    RUN
    ?15
    15 ДЕСЯТИЧНОЕ- F ШЕСТНАДЦАТИРИЧНОЕ
    Ok
1.4.41. Оператор IF
IF выражение THEN задание [ELSE задание]
IF выражение GOTO номер строки [ELSE задание]
где:  задание - оператор или последовательность операторов, или номер строки перехода.

Принимает решение относительно программного потока, основанного на значении выражения. Если выражение - ИСТИНА (не ноль), то выполняется часть THEN или часть GOTO. Если результат выражения - ЛОЖЬ (ноль), то части THEN и GOTO игнорируются, и выполняется часть ELSE, если она существует. Выполнение продолжается со следующего за оператором IF исполнительного оператора. Операторы IF ... THEN ... ELSE могут быть вложены. Например:

    IF X > Y THEN PRINT "X БОЛЬШЕ Y" ELSE IF Y > X THEN PRINT "X МЕНЬШЕ Y" ELSE PRINT "X РАВНО Y"

Если оператор не содержит одинаковое количество THEN и ELSE, то каждая часть ELSE соответствует части THEN, закрывая ближайший оператор IF. Например:

    IF A = B THEN IF B = C PRINT "A = C" ELSE PRINT "A <> C"

не будет печататься A <> C, когда A <> B.

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

1.4.42. Переменная INKEY¤
Y¤ = INKEY¤

Переменная INKEY¤ опрашивает клавиатуру на нажатие какой-либо клавиши и возвращает нажатый символ. Если ни одна клавиша не наживается, то возвращается пустая строка. Переменная INKEY¤ не ждет, когда будет нажиматься клавиша. Любая нажатая клавиша присваивается переменной INKEY¤, причем только один символ. Этот символ не высвечивается на экране дисплея. Например:

    10 PRINT "Нажмите любую клавишу для выхода из программы"
    20 A¤ = INKEY¤: IF A¤ = "" THEN 20 ELSE STOP
1.4.43. Оператор INPUT
INPUT ["напоминание";] список переменных

Осуществляет ввод с клавиатуры во время выполнения программы. Когда выполняется оператор INPYT, программа делает остановку, на экране появляется знак вопроса, указывающий, что программа ожидает данные. Если задана строка напоминания, то она высвечивается перед знаком вопроса (?). Затем требуемые данные вводятся с клавиатуры. Вводимые данные присваиваются переменным, заданным в списке. Количество элементов данных должно соответствовать количеству переменных в списке. Элементы данных отделяются запятыми. Переменные в списке могут быть числовыми и строковыми. Тип каждого вводимого элемента должен соответствовать типу, определенному именем переменной. Нет необходимости заключать в кавычки строковые данные. Если на запрос оператора INPUT вводятся данные с типом, не соответствующим типу переменной, то на экране дисплея появляется сообщение ?ПОВТОРИТЕ ВВОД. Присваивание введенных значений не выполняется до тех пор, пока не будет задан правильный ответ.

Если запрос оператора INPUT вводится больше элементов данных, то появляется сообщение ?ЛИШНИЕ ДАННЫЕ, лишние данные игнорируются и выполнение программы продолжается.

Если вводится меньше элементов данных, по появляется сообщение ?? до тех пор, пока не будет введено необходимое число данных. Если же вводится возврат каретки, то все оставшиеся переменные обнуляются. Например:

    10 INPUT X
    20 PRINT X; "В КВАДРАТЕ"; X^2 : END
    RUN
    ?6
    5 В КВАДРАТЕ 25
    Ok
1.4.44. Оператор INPUT#
INPUT# номер файла, список переменных
где:  номер файла - номер, с которым файл был открыт для ввода;
  переменная - имя переменной, которой будет присвоен элемент данных.

Считывает элементы данных из файла с последовательным доступом и присваивает их переменным программы. Тип данных в файле должен соответствовать типу, определенному именем переменной. В отличие от INPUT знак вопроса не печатается оператором INPUT#. Элементы данных появляются в файле сразу, как только они введутся. Числовые значения, начальные пробелы, возврат каретки, перевод строки игнорируются. Первый вычисленный символ, который не является пробелом, возвратом каретки или переводом строки, будет началом числа. Число ограничивается пробелом, возвратом каретки, переводом строи или запятой. Если данные разделяются на строковые элементы, то начальные пробелы, перевод строки, возврат каретки также игнорируются. Началом элемента строки является первый вычисленный символ. Если кавычки (") являются первым символом, то элемент строки будет состоять из всех символов, находящихся между первыми и вторыми кавычками. Строка, заключенная в кавычки, не может содержать кавычки как элемент строк. А если строка не заключена в кавычки, то она ограничивается запятой, возвратом каретки, переводом строки или длиной 255 символов. Если найден конец файла при вводе числового или строкового элемента, то этот элемент будет закончен.

1.4.45. Функция INPUT¤
Y¤ = INPUT¤(N[,[#]M])
где:  N - количество символов;
  M - номер файла, используемый оператором OPEN.

Возвращает строку символов, считанную с клавиатуры или из файла M. Если для ввода используется клавиатура, то символы на экране появляться не будут, а все символы управления передаются с помощью клавиши СТОП, которая используется для прерывания функции INPUT¤. При вводе с клавиатуры нет необходимости нажимать клавишу возврата каретки. Чтобы прочитать коды КОИ-8, которые задаются в программе, используют операторы INPUT¤ и INKEY¤ (но не INPUT и LINE INPUT). Например:

    10 OPEN "I", #1, "DATA"
    20 A¤ = INPUT¤(2, #1)
    30 PRINT A¤
    40 END
1.4.46. Функция INSTR
Z = INSTR([N], X¤, Y¤)
где:  N - числовое выражение а диапазоне от 1 до 255;
  X¤, Y¤ - строковые переменные, строковые выражения или строковые константы.

Возвращает позицию начало строки Y¤ в строке X¤. Необязательное смещение N устанавливает позицию для начала просмотра. Функция INSTR возвращает 0 в случаях:

  • N > LEN(X¤);
  • X¤ - пустая строка;
  • Y¤ - не может быть найдена.

Если Y¤ пустая строка, то INSTR возвращает N или 1. Если вне диапазона, то возвращается сообщение НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    10 A¤ = "ABCDEB"
    20 B¤ = "B"
    30 PRINT INSTR(A¤, B¤), INSTR(4, A¤, B¤)
    RUN
    2     6
    Ok
1.4.47. Функция INT
Y = INT(X)

Возвращает наибольшее целое число, которое меньше или равно значению выражения X. Например:

    PRINT INT(99.89)
    99
    Ok
    PRINT INT(-12.11)
    -13
    Ok
1.4.48. Команда KILL
KILL "имя файла"

Стирает файл с диска. Команда KILL может быть использована для всех типов файлов. Имя файла обязательно должно включать расширение. Например:

    200 KILL "A:DATA.DAT"
1.4.49. Функция LEFT¤
Y¤ = LEFT¤(X¤, N)

где: N - в диапазоне от 0 до 255.

Возвращает N - самых левых символов строки X¤. Если N > LEN(X¤), то возвращается строка X¤. Если N = 0, то возвращается пустая строка. Если N больше 255, то выдается сообщение об ошибке НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    10 A¤ = "БЕЙСИК-ПРОГРАММА"
    20 B¤ = LEFT¤(A¤, 6)
    30 PRINT B¤
    RUN
    БЕЙСИК
    Ok
1.4.50. Функция LEN
Y = LEN(X¤)

Возвращает количество символов строки X¤. Например:

    X¤ = "БЕЙСИК-ПРОГРАММА": PRINT LEN(X¤)
    16
    Ok
1.4.51. Оператор LET

Присваивает переменной значение выражения. Слово LET не обязательно. Если числовые значения присваиваются строковым переменным или строковые значения присваиваются числовым переменным, то появляется сообщение об ошибке ОШИБОЧНЫЙ ТИП. Например:

    10 LET D = 12
    20 LET E = 12^2
    30 LET F¤ = "СТРОКА"
    40 LET SUM = (D + E) / 5
или
    10 D = 12
    20 E 12^2
    30 F¤ "СТРОКА"
    40 SUM = (D + E) / 5
1.4.52. Команда LFILES
LFILES[ "имя файла"]

Распечатывает имена файлов, расположенных на диске, на печатающем устройстве. Если имя файла опущено, то распечатываются все файлы на печатающем устройстве. Имя файла может содержать знак вопроса ("?"), который соответствует любому символу в имени файла или расширении. Знак "*" соответствует любому имени или расширению. Если устройство определено как часть имени файла, то распечатываются файлы с заданным именем, находящиеся на том устройстве. По умолчанию используются текущее устройство. Например:

LFILES - распечатывает все файлы на текущем устройстве;
LFILES "B:*.*" - распечатывает все файлы на устройстве B:
1.4.53. Оператор LINE
LINE [[STEP](X0, Y0)-[STEP](X1, Y1)[, цвет], [, B[F]]
где:  STEP - позволяет указать координаты относительно последней отображаемой точки;
  X0, Y0 - координаты начальной точки;
  X1, Y1 - координаты конечной точки;
  цвет - цвет в диапазоне от 0 до 7.

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

Параметр B указывает, что рисуется прямоугольник с заданным цветом, а параметр F указывает на то, что прямоугольник заполняется этим цветом. При задании координат необходимо учитывать аспект, равный 3/2.

Использование параметра B, заменяет 4 оператора:

    10 LINE(X0, Y0)-(X1, Y0)
    20 LINE(X1, Y0)-(X1, Y1)
    30 LINE(X1, Y1)-(X0, Y1)
    40 LINE(X0, Y1)-(X0, Y0)

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

Оператор в формате LINE-(X1, Y1) рисует линию от последней отображаемой точки к точке (X1, Y1) цветом переднего фона. Например:

    10 LINE(0, 200)-(511, 100), 7, B
    20 LINE(0, 100)-(511, 200), 2
    30 LINE(511, 100)-(0, 200), 4
1.4.54. Оператор LINE INPUT
LINE INPUT ["напоминание";] строковая переменная
где:  напоминание - строковая константа, которая появляется на экране перед вводом данных.

Присваивает строку данных (длиной до 254 символов) строковой переменной без использования разграничителей. Знак вопроса ("?") не печатается, если он не является частью строки напоминания. Все введенные данные от конца напоминания до возврата каретки присваиваются строковой переменной. LINE INPUT можно остановить нажатием клавиши УПР+С. Интерпретатор возвращает управление на уровень команд, появляется подсказка ОК. Для возобновления, выполнения программы вводится команда CONT.

1.4.55. Оператор LINE INPUT#
LINE INPUT #номер_файла, строковая переменная
где:  номер файла - номер, с которым файл был открыт;
  строковая переменная - имя, строковой переменной, которой будет присвоена введенная строка.

Считывает введенную строку длинной (до 254 символов) без ограничителей из файла с последовательным доступом в строковую переменную. Оператор LINE INPUT# считывает из файла с последовательным доступом все символы до возврата каретки. Следующий оператор LINE INPUT# считывает следующие символы, до возврата каретки. Оператор LINE INPUT# особенно удобен, если каждая строка файла была разбита на поля, или если программа на языке Бейсик, сохраняемая в формате КОИ-8, считывается как данные другой программой. Например:

    10 OPEN "O", #1, "LIST"
    20 LINE INPUT "СТРОКА?"; C¤
    30 PRINT #1, C¤; CLOSE 1
    40 OPEN "I", #1, "LIST"
    50 LINE INPUT #1, C¤
    60 PRINT C¤: CLOSE 1
    RUN
    СТРОКА? МОСКВА, ЛЕНИСКИЙ ПРОСПЕКТ
    МОСКВА, ЛЕНИСКИЙ ПРОСПЕКТ
    Ok
1.4.56. Команда LIST
LIST [строка][-[строка]]
где:  строка - номер строки в диапазоне от 0 до 65529.

Распечатывает на экране дисплея программу, находящуюся в памяти. Вывод программы на экран может быть прерван нажатием клавиши СТОП. Если номера строк опущены, то распечатывается вся введенная программа. Если задан только первый номер строки, то распечатывается только строка с этим номером. Если заданы только первый номер строки и тире, то распечатываются программные строки, начиная с этого номера и до конца программы. Если заданы тире и второй номер строки, то распечатывается программа, начиная с начала и до заданного номера строки включительно. Если заданы оба номера строк, то распечатаются программные сроки в заданном диапазоне, включая строки с заданными номерами. Чтобы указать текущую строку, может быть использована точка ("."). Например:

LIST - распечатывает всю введенную программу;
LIST 35 - распечатывает строку с номером 35 на экране дисплея;
LIST 100-200 - распечатывает строки со 100 до 200 включительно;
LIST . - распечатывает текущую строку.

При выполнении команды LIST и EDIT числа, представленные в двоичном виде на экране дисплея, высвечиваются в восьмеричном виде (только в РМУ). Например:

    10 A = &B01110100: B = &O164
    20 PRINT A, B
    RUN
    116         116
    Ok
1.4.57. Команда LLIST
LLIST [строка][-[строка]]

На печатающем устройстве команда LLIST распечатывает всю или часть программы находящейся в текущем момент в памяти. Диапазон миров строк для команды LLIST такой же, как и для команды LIST. Команда LLIST не может быть остановлена нажатием клавиши СТОП. Если печатающее устройство не включено, то появляется сообщение ПУ НЕ ГОТОВО. ОТМЕНИТЬ (Y)?

Если нажата клавиша, то ввод на печать не производится и интерпретатор возвращает управление на уровень команд. Для вывода на печать необходимо включить печатающее устройство. Например:

LLIST - распечатывает на печатающем устройстве всю введенную программу;
LLIST 30-100 - распечатывает строки программы с 30 до 100 включительно.
1.4.58. Команда LOAD
1.4.58.1. Команда LOAD для НГМД
LOAD "имя файла"[, R]
LOAD "имя файла", B[, R][, смещение]
LOAD "имя файла", A[, R]

Загружает программу с определенного устройства в память. Первый формат оператора LOAD загружает программу на языке Бейсик, и если нужно, выполняет ее. Второй формат загружает двоичный файл в память, размещая его, если указано со смещением, а также выполняет, если нужно. Третий формат команды LOAD загружает файл, записанный в кодах КОИ-8, и если нужно, выполняет ее. Если в имени файла устройство опущено, то используется текущий дисковод. К имени файла прибавляется расширение .BAS, если имя файла состоит из восьми и меньше символов и расширения нет. Если имя файла определено не по правилам, то появляется сообщение об ошибке и загрузка не выполняется. Если параметр R опущен, то после загрузки программы интерпретатор возвращается на уровень команд. Команда LOAD с параметром R (во всех трех форматах) эквивалента команде RUN "имя файла"", заданный в соответствующей форме. Команда LOAD закрывает все открытые файлы и стирает все переменные и программные строки, находящиеся в текущий момент в памяти перед загрузкой программы, за исключением третьего формата. Однако, если параметр R используется командой LOAD, то все открытые файлы данных остаются открытыми. Например:

LOAD "INVENT.BAS" - загружает программу INVENT.BAS, но не выполняет ее;
LOAD "INVENT.COM", B, R - загружает двоичный файл INVENT.COM и передает ему управление без возвратов Бейсик.
1.4.58.2. Команда LOAD для НКМЛ
LOAD "CAS:[имя файла]"[, R]
LOAD "CAS:[имя файла]", B[, R][, смещение]
LOAD "CAS:[имя файла]", A[, R]

Загружает программу с НКМЛ в память. Имя самого файла должно содержать не больше 6 символов. Первый формат команды LOAD загружает НКМЛ Бейсик-программу и, если нужно, выполняет ее. Второй формат загружает двоичный файл в память с нужным смещением и, если задано, выполняет ее. Третий формат загружает некоторый файл, сохраненный на НКМЛ в кодах КОИ-8 и выполняет ее, если необходимо.

После загрузки файла выдается одно из двух типов сообщений:

ПРОПУЩЕН <имя файла> <признак>

или

НАЙДЕН <имя файла> <признак>

где признак может принимать следующие значения:

  • / - программа на Бейсике;
  • /A - текстовый файл;
  • /B - двоичный файл.

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

Второе сообщение указывает на то, что совпали имя файлы и тип файла.

Если и в трех форматах не указано имя файла, то с ленты будет загружаться первый встречный файл соответствующего типа. При физическом сбое ленты выдается сообщение ОШИБКА ЧТЕНИЯ. Например:

    LOAD "CAS:INVENT", A, R
    НАЙДЕН INVENT /A

Загружен текстовый файл INVENT и запущен на выполнение.

1.4.59. Функция LOC
Y = LOC(номер файла)

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

    200 IF LOC(1) > 50 THEN STOP
1.4.60. Оператор LOCATE
LOCATE [позиция][, строка][,[курсор]]]
где:  позиция - номер позиции в строке. Числовое выражение в диапазоне от 1 до 64;
  строка - номер строки экрана. Числовое выражение в диапазоне от 1 до 16;
  курсор - значение, определяющее, виден курсор или нет: 0- для выключенного и 1 - для включенного курсора.

Устанавливают текстовый курсор в заданную позицию, включает и выключает курсор. Операторы INPUT и PRINT на экране дисплея начинают размещать символы по определенным позициям.

Чтобы выключить курсор, нужно использовать LOCATE,,0.

Для включения курсора используется LOCATE,,1. Любые значения, заданные в неуказанного диапазона, в результате вызовут сообщение об ошибке НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    10 REM ПЕРЕСЛАТЬ КУРСОР В НАЧАЛЬНУЮ ПОЗХИЦИЮ В ВЕРХНИЙ ЛЕВЫЙ УГОЛ
    20 LOCATE 1,1
    30 REM СДЕЛАТЬ ТЕКСТОВЫЙ КУРСОР НЕВИДИМЫМ; ПОЗИЦИЯ ОСТАЕТСЯ НЕИЗМЕННОЙ
    40 LOCATE ,,0
1.4.61. Функция LOF
Y = LOF(номер файла)

Возвращает число записей, размещенных в файле (длина файла). Например:

    10 OPEN "O", #1, "BAS"
    20 PRINT #1, "12345"
    30 PRINT LOF(1): CLOSE 1
    40 OPEN "I", #1, "BAS"
    50 PRINT LOF(1): CLOSE 1
1.4.62. Функция LOG
Y = LOG(X)
где:  X - число в диапазоне от 1E-38 до 1.7E+38

Возвращает значение натурального логарифма числа X. Если X меньше или равен нулю, то выдаются сообщении об ошибке НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    PRINT LOG(45 / 7)
    1.86075
    Ok
1.4.63. Функция LPOS
Y = LPOS(N)

Возвращает текущую позицию головки печати в пределах буфера печати. N - фиктивный аргумент. Самая левая позиция - 1. Например:

    100 IF LPOS(X) > 60 THEN LPRINT CHR¤(13)
1.4.64. Операторы LPRINT и LPRINT USING
LPRINT [список выражений][;/,]
LPRINT USING X¤; список выражений [;/,]

Распечатывает данные на печатающем устройстве. Эти операторы функционируют подобно операторам PRINT и PRINT USING, за исключением того, что вывод идет на печатающее устройство. Оператор LPRINT допускает ширину печати до 128 символов. Печать свыше 128 символов происходит с переводом строки. Например:

    LPRINT "БЕЙСИК-ПРОГРАММА"
1.4.65. Оператор LUT
LUT X(I)
где:  X(I) - имя первого элемента целочисленного массива, содержащего элементы X(I), X(I + 1), ..., X(I + 15).

Программирует таблицу цветов. Элементы массива с индексами от I до I + 15 содержат номера физических цветов, а их порядковый номер соответствует логическим номерам цветов.

При начальной инициализации логические номера цветов в диапазоне от 0 до 7 соответствуют цветам графики (без алфавитно-цифровых символов), а в диапазоне от 8 до 15 - цветам графики с расположенным поверх графической информации о алфавитно-цифровой информацией.

Соответствие номеров физическим цветам при начальной инициализации предоставлена в операторе COLOR. Например:

    10 DIM X¤(15)
    20 FOR I = 0 TO 7
    30 LINE (100, 100)-(200, 200), 4, BF
    40 X¤(I) = I: NEXT
    50 FOR I = 8 TO 15
    60 X¤(I) = 15: NEXT
    70 LUT X¤(0)
1.4.66. Команда MERGE
MERGE "имя файла"

Присоединяет строки заданного файла сохраненного на диске или НКМЛ в кодах КОИ-8 к программе, находящиеся в памяти в текущий момент. Если какие-либо строки в присоединённом файле не имеют такие же номера, как и строки программы в памяти, то строки из файла будут замещать соответствующие строки в программе, находящиеся в памяти. После команды MERGE объединенная программа размещается в памяти и интерпретатор, возвращается на уровень команд. Если имя файла не определено по правилам, то выдается сообщение об ошибке, и команда не выполняется. Если присоединенная программа не была сохранена в формате КОИ-8, используя параметр A, в команде SAVE, то появится сообщение об ошибке НЕВЕРЕН РЕЖИМ ФАЙЛА. Программа в памяти остается неизменной. Если происходит загрузка файла с НКМЛ, то заданное имя не должно быть больше 6 символов. При загрузке выдается сообщение (подпункт 1.4.58.2). Например:

    MERGE "A:NUMBER.BAS"
    MERGE "CAS:PRIM"
1.4.67. Оператор и функция MID¤
Y¤ = MID¤(X¤, N[,M]): REM Как функция
MID¤(X¤, N[,M]) = Y¤: REM Как оператор
где:  N - целочисленное выражение от 0 до 255;
  M - целочисленное выражение от 0 до 255.

Возвращает требуемую часть заданной строки. Когда MID¤ используются как оператор, то замещается часть одной строки в другой. Функция возвращает строку длинной M символов и строки X¤, начиная с N-го символа. Если M опущено или в строке меньше M символов справа от N-го символа, то возвращается все самые правые символы, начиная с N-го. Если M = 0 или N > LEN(X¤), то MID¤ возвращает пустую строку. Символы в строке X¤, начиная с N-го, возвращаются символами строки Y¤, M - число символов строки X¤, которые будут размещены. Если M опущен, то используется вся строка Y¤. Длина строки X¤ не изменяется независимо от того, заданно число M или нет. Например, если X¤ длиной 4 символа, а Y¤ длиной 5 символов, то после замещения их будет содержать первые 4 символа строки Y¤. Если N и M вне диапазона, то появляется сообщение об ошибке НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    10 A¤ = "СЕЙЧАС"
    20 B¤ = "УТРО ВЕЧЕР ПОЛДЕНЬ"
    30 PRINT A¤, MID¤(B¤, 6, 5)
    RUN
    СЕЙЧАС ВЕЧЕР
    Ok
1.4.68. Оператор MOTOR
MOTOR [ON/OFF]
где:  ON - включение двигателя магнитофона;
  OFF - выключение двигателя магнитофона.

Включает или выключает двигатель НКМЛ. Если не указаны ON или OFF, то выключенный двигатель включается, а включенный выключается.

1.4.69. Команда NAME
NAME "имя файла 1" AS "имя файла 2"
где:  имя файла 1 - строковое выражение для обозначения старого имени файла;
  имя файла 2 - строковое выражение для обозначения нового имени файла.

Изменяет имя файла. Файл, определенный именем старым именем файла должен существовать на диске, а с новым именем файла не должен быть на диске, иначе появится сообщение об ошибке. Если устройство опущено, то принимается текущий дисковод. После команды NAME существует на том же диске в той же области дискового пространства с новым именем. Например:

1.4.70. Команда NEW
NEW

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

1.4.71. Функция OCT¤
Y¤ = OCT¤(N)

Возвращает строку, представляющую собой восьмеричное значение десятичного аргумента. N - округляется перед выполнением. Например:

    PRINT OCT¤(24)
    30
    Ok
1.4.72. Оператор ON ERROR
ON ERROR GOTO номер строки

Блокирует программу ловушки ошибок и задает первую строку подпрограммы ошибок. Если программа ловушки ошибок блокирует все обнаруженные ошибки, включая ошибки прямого доступа (т.е. синтаксические ошибки), то это будет вызывать переход на подпрограмму обработки определенной ошибки. Если ли номер строки, с заданный в операторе ON ERROR не существует программе, то появляется сообщение об ошибке НЕОПРЕДЕЛЕННЫЙ НОМЕР СТРОКИ. Чтобы заблокировать ловушку ошибок, выполните оператор ON ERROR GOTO 0. Последовательные ошибки будут выдавать сообщения об ошибках и останавливать выполнение программы. Оператор ON ERROR GOTO 0, который появляется в программе ловушки ошибки, останавливает выполнение программы и печатает сообщение для ошибок, которые вызывают программу ловушки. Есть ли ошибка встречается во время выполнения программы обработки ошибки, то выдаются сообщение об ошибке, и выполнении программы прекращается. В пределах подпрограммы обработки ошибок программа ловушки ошибок не встречается. Оператор RESUME используется для выхода из подпрограммы обработки ошибок. Например:

    10 ON ERROR GOTO 100
    20 LPRINT "ВЫВОД НА ПЕЧАТАЮЩЕЕ УСТРОЙСТВО"
    30 END
    100 IF ERR = 27 THEN PRINT "ВКЛЮЧИТЬ ПЕЧАТАЮЩЕЕ УСТРОЙСТВО"
    110 RESUME
1.4.73. Операторы ON ... GOSUB и ON ... GOTO
ON N GOSUB номер строки[, номер строки]...
ON N GOTO номер строки[, номер строки]...

Осуществляет переход на один из заданных номеров строк в зависимости от вычисленного выражения N. Значение N определяет, какой номер строки в списке будет использован для перехода. Если необходимо, N округляется до целого числа. В операторе ON ... GOSUB каждый номер строки в списке должен быть номером первой строки под программы, поэтому необходимо иметь в подпрограмме оператор RETURN, чтобы вернуться в строку, следующую за оператором ON ... GOSUB. Если значение N равно 0 или больше количества строк в строке (но меньше или равно 255), то продолжается выполнение программы со следующего исполнительного оператора. Если значение отрицательно или больше 255, то появляется сообщение об ошибке НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    100 ON L GOTO 150, 300, 450, 500
    110 ON A GOSUB 1300, 1400
    ...
    1300 REM НАЧАЛО ПОДПРОГРАММЫ : A = 1
    ...
    1390 RETURN
    ...
1.4.74. Оператор OPEN
OPEN "режим", [#]номер файла, "имя файла"
где:  режим - строковое выражение, первый символ которого:
  • O - последовательный вывод в файл;
  • I - последовательное чтение из файла;
  номер файла - целочисленное выражение, значение которого лежит в диапазоне от 1 до максимального числа файлов. По умолчанию максимально число файлов равно 3, но оно может быть изменено параметром /F: в команде BASIC. Номер файла ассоциируется с открывающимся файлом и используется другими операторами ввода-вывода для обращения к этому файлу или устройству.

Открывает буфер для ввода-вывода в файл и определяет режим доступа.

Любой файл может быть открыт с одним или более номерами файла. Это обеспечивает различные режимы файла для различных целей. Но уже открытый файл не может быть открыт еще раз для последовательного вывода (OUTPUT). Если файл, открытый для ввода не существует, то появляется ошейнике сообщение об ошибке ФАЙЛ НЕ НАЙДЕН. Если файл, который не существует, открывается для последовательного ввода, то он создается. Если сдается режим отличной от INPUT (I) или OUTPUT (O), то выдается сообщение об ошибке НЕВЕРЕН РЕЖИМ ФАЙЛА. Например:

    10 OPEN "O", #1, "DATA"

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

1.4.75. Оператор PAINT
PAINT [STEP](X, Y)[, цвет закраски [, цвет границы]]
где:  STEP - позволяет указать координаты относительно последней точки;
  X, Y - координаты точки в пределах области, которая будет заполняться. Координаты могут быть заданы в абсолютной или относительной форме. Эта точка будет использоваться как начальная;
  цвет закраски - цвет, которым будет закрашена область экрана, целое число в диапазоне от 0 до 7;
  цвет границы - цвет границы рисунка, подлежащего закраске, лежит в диапазоне от 0 до 7.

Оператор PAINT заполняет область экрана выбранным цветом. Координаты могут быть заданы в абсолютной и относительной форме.

По умолчанию цвет границы равен цвету закраски.

Начальная точка (X, Y) в операторе PAINT должна быть внутри рисунка, который закрашивается. Если заданная точка уже имеет цвет границы, то оператор PAINT не будет действовать. Если цвет за краски опущен, то используется цвет переднего фона, установленный оператором COLOR.

PAINT может окрашивать любой рисунок, но "зубчатые"" границы на рисунке будут увеличивать количество стекового пространства, требуемого оператором PAINT. Например:

    20 CIRCLE(250, 100), 100, 2,,, 0.5
    20 PAINT(250, 100), 1, 2
1.4.76. Оператор PCLS

Очищает графическое запоминающее устройство (ГЗУ) в цвет заднего фона. Стирает графическую информацию.

1.4.77. Функция PEEK
Y = PEEK(N)

где: N - целое число в диапазоне от 0 до 65535.

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

PEEK - дополнительная функция к оператору POKE. Если значение числа N вне указанного диапазона, то выдает сообщение об ошибке. Например:

    10 POKE 24535, 31
    20 Y = PEEK(24535)
    40 PRINT Y
    RUN
    31
    Ok
1.4.78. Оператор PLAY
PLAY "строковое выражение"

где: строковое выражение - любое разрешённое строковое выражение, содержащее программу на музыкальном макро языке. Может оформляться в кавычках или как строковая переменная. Например:

    10 A¤ = "C"
    20 PLAY A¤
или
    10 PLAY "C"

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

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

Таблица 17
Команда Значение Описание
Tn 32 ≤ n ≤ 255 Определяет скорость игры. Значение n это - количество четвертей в минуту. По умолчанию значение n = 120.
On 1 ≤ n ≤ 8 Определяет одну из октав. По умолчанию принимается первая октава (O4).
  • O1 - контроктава;
  • O2 - большая октава;
  • O3 - малая октава;
  • O4 - первая октава (по умолчанию);
  • O5 - вторая октава;
  • O6 - третья октава;
  • O7 - четвертая октава;
  • O8 - пятая октава.
Sn 0 ≤ n ≤ 15 Определяет форму огибающей для следующего набора:
  • S = 0, 1, 2, 3, 9
  • S = 4, 5, 6, 7, 15
  • S = 8
  • S = 10
  • S = 11
  • S = 12
  • S = 13
  • S = 14

По умолчанию форма огибающий, принимается равно и 1 (S1).

Генерирование различных звуковых эффектов - совместное использование S и M.

Mn 1 ≤ n ≤ 32767 Определяет период огибающей; возрастает при увеличении n; по умолчанию принимается равным в 255 (M255).
Ln 1 ≤ n ≤ 64 Определяет длительность ноты
L1 L2 L4 L8 L16 L32 L64

По умолчанию длительность принимается равной L4.

Nn 0 ≤ n ≤ 96 Определяет ноту. Самая низкая - N1, самая высокая - N96. По умолчанию принимается N34 (N34 = О4С). N0 - сброс. N1...N96 - хроматическая гамма.
Rn 1 ≤ n ≤ 64 Определяет паузу.
R1 R2 R4 R8 R16 R32 R64
По умолчанию длительность паузы равна четырем (R4)
C[n], D[n], E[n], F[n], G[n], A[n], B[n] 1 ≤ n ≤ 64 Определяет нотный лад (до, ре, ми, фа, соль, ля, си). За нотой может быть указана ее длительность. По умолчанию длительность равна четырем (C4). Также за нотой могут следовать специальные знаки (диез, бемоль, точка).
#, + Диез Определяется диез. Указывается после ноты (C#, D+).
- Бемоль Определяется бемоль. Указывается после ноты (C-).
. Точка Позволяет увеличивать длительность ноты наполовину. Указывается после ноты и длительности ноты (С. или C4.).
X   Позволяет включить в строку "подпрограмму" на ИМЯ (XA¤;)

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

команда = переменная;

Пример 1:

    10 A¤ = "V15 CDE"
    20 B¤ = "V15 FGA"
    30 C¤ = "V15 BCD"
    40 D¤ = "V15 EFG"
    50 PLAY A¤, B¤, C¤, D¤

Пример 2:

    10 PLAY "V15 CDE", "V15 FGA", "V15 BCD", "V15 EFG"

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

Если для одного из голосов строка не определяется, то голос остается молчащим.

Пример 3:

    10 PLAY "V15 O6 CDEG", "V15 O3 CDAB"

Голоса 3 и 4 будут молчать.

Пример 4:

    10 FOR I = 0 TO 15
    20 PLAY "S=I; M2000 CDEFGAB"
    30 NEXT I

Пример 5:

    10 FOR I = 0 TO 4
    20 READ N
    30 PLAY "S8M=I; M2000 CDEFGAB"
    40 NEXT I
    50 DATA 100, 1000, 5000, 10000

Пример 6:

    10 M¤ = "V15 O5 L1 CDEFGAB"
    20 PLAY M¤, "V15 O3 CDEFGABXM¤"
1.4.79. Функция POINT
Y = POINT(X, Y)

где: X, Y - координаты точки в абсолютной форме.

Функция POINT возвращает число от 0 до 7, определяющее цвет заданной точки на экране дисплея. Если точка задана вне диапазона экрана, то возвращается -1. Например:

    10 LINE(100, 100)-(200, 200), 4, BF
    20 I = 50
    30 REM ПОЛУЧИТЬ ТЕКУЩЕЕ СОСТОЯНИЕ ТОЧКИ
    40 IF POINT(I, I) <> 0 THEN PRESET(I, I) ELSE PSET(I, I)
    20 PLAY M¤, "V15 O3 CDEFGABXM¤"
1.4.80. Оператор POKE
POKE N, M
где:  N - число в диапазоне от 0 до 65535;
  M - число в диапазоне от 0 до 255.

Записывает байт данных M по адресу памяти N. Дополнительной функцией к оператору POKE является PEEK. PEEK и POKE полезны для эффективного хранения данных, загрузки подпрограмм на машинном языке, передачи аргументов и результатов в и из программ на машинном языке. Интерпретатор не делает никакой проверки адресов. Если значение N и M лежат вне указанных диапазонов, то выдается сообщение об ошибке. Например:

    10 POKE &HF701, 20
1.4.81. Функция POINT
Y = POS(N)

Возвращает текущую горизонтальную позицию курсора. Самая левая позиция - первая. N - фиктивный аргумент. Например:

    IF POS(C) > 60 THEN PRINT CHR¤(13)
1.4.82. Оператор PRINT
PRINT [список выражений][;|,]

Распечатывает данные на экране дисплея. Если список выражений опущен, то распечатывается строка пробелов. Выражение в списке могут быть числовыми и (или) строковыми. Строковые константы должны быть заключены в кавычки. Позиция каждого напечатанного элемента определяется знаками препинания, используемыми для определения элементов списка. Интерпретатор разделяет сроку на зоны печати по 14 символов каждая. Запятая в списке выражений заставляет печататься следующее значение с начала следующей зоны. Точка с запятой заставляет печататься следующее значение, со следующей позиции с учетом пробелов при печати числовых данных. Если запятая или точка с запятой заканчивают список выражений, то следующий оператор PRINT начнет печатать в той же строке через заданное число пробелов. Если длина печатаемой строки больше, чем определено оператором WIDTH, то печать продолжается на следующей физической строке. За печатаемыми числами всегда следует пробел: положительным числом предшествует пробел, а отрицательным - знак минус. Числа одинарной точности могут быть представлены шестью и менее цифрами в формате с фиксированной точкой, но с меньшей точностью, чем если бы они могли быть представлены в формате с плавающей точкой. Они выводятся, используя функционированию точку или целочисленный формат. Оператор LPRINT используется для печати и информации на печатающем устройстве. Например:

    10 INPUT X
    20 PRINT X; "В КВАДРАТЕ"; X^2; ", A ";
    30 PRINT X; "В КУБЕ"; X^3
    RUN
    ?9
    9 В КВАДРАТЕ 81, A 9 В КУБЕ 729
    Ok
    RUN
    ?21
    21 В КВАДРАТЕ 441, A 21 В КУБЕ 9261
    Ok
    10 FOR X = 1 TO 5
    20 J = J + 5
    30 K = K + 10
    40 PRINT J; K;
    50 NEXT X
    RUN
    5  10  10  20  15  30  20  40  25  50
    Ok
1.4.83. Оператор PRINT USING
PRINT USING X¤; список выражений [;|,]

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

Для печати строк применяются следующие символы формата:
! Первый символ в заданной строке должен быть напечатан.
\N пробелов\ 2 + N символов из строки должны быть напечатаны. Если символы (\\) не содержат пробелов, то будут напечатаны два символа, если содержат один пробел, то три символа и т.д. Если строка длиннее, чем поле, то лишние символы игнорируются. Если поле длиннее, то строка будет вводиться слева, а справа добавляться пробелами. Например:
    10 A¤ = "LOOK": B¤ = "OUT"
    30 PRINT USING "!"; A¤; B¤
    50 PRINT USING "\  \"; A¤; B¤
    70 PRINT USING "\   \"; A¤; B¤; "!!"
    RUN
    LO
    LOOKOUT
    LOOK OUT  !!
    Ok
Для печати чисел используются следующие символы формата:
# Используется для представления каждой числовой позиции. Числовые позиции всегда заполнены. Если число, которое будет печататься, содержит меньше цифр, чем определенных позиций, то число будет вводиться в поле вправо и ему будут предшествовать пробелы. Точка может быть введена в любую позицию поля. Если строка формата определяет, что цифры должны предшествовать точки, то перед точкой обязательно будут печататься цифры (если необходимо, будут печататься нули). При необходимости числа округляются. Например:
    PRINT USING "##.##"; .78
    0.78
        PRINT USING "##.##"; 987.654
    %987.65
        PRINT USING "##.##"; 10.2, 5.3, 66.789, .234
    10.20  5.30  66.79  0.23
+ Знак "+" в конце строки формата используется для печати знака числа ("+" или "-") перед или после числа. Например:
    PRINT USING "+##.##"; -68.95, 2.4, 55.6, -.9
    -68.95 +2.40 +55.60 -0.90
- Знак "-" в конце строки используется для печати отрицательного числа со знаком минус. Например:
    PRINT USING "##.##-"; 68.95, 22.449, -7.08
    68.95 22.45 7.08-
** Двойная звезда "**" в начале строки формата используется для заполнения звездочками передних пробелов в числовом поле и для определения позиций при использовании более 2 цифр. Например:
    PRINT USING "**##.#"; 12.39, -0.9, 765.1
    *12.4   *-0.9    *765.1
¤¤ Двойной знак "¤¤" для печати знака "¤" непосредственно слева от числа, "¤¤" определяют позиции более двух цифр, одна из которых "¤". Экспоненциальный формат не может быть использован со знаком "¤¤". Отрицательные числа не могут быть использованы, если знак "-" не указан справа. Например:
    PRINT USING "¤¤###.#"; 456.78
    ¤456.78
**¤ Этот знак в начале строки формата комбинирует действия вышеназванных двух символов формата. Передние пробелы будут заполняться звездочками, а знак "¤" будет печататься перед числом. Знак "**¤" определяет позиции более трех цифр, одна из которых "¤". Например:
    PRINT USING "**¤##.##"; 2.34
    ***¤2.34
, Запятая, которая находится слева от точки в строке формата, используется для печати запятой слева от каждой 3 цифры слева или справа от точки. При использовании экспоненциального формата не применяется. Например:
    PRINT USING "####,.##"; 1234.5
    1,234.50
        PRINT USING "####.##"; 1234.5
    1234.50
^^^^ Этот знак может быть размещен после символов цифровой позиции для определения экспоненциального формата. Это знак резервирует пространства для E+nn или D+nn, которые будут печататься. Значащие цифры вводятся слева. Если задан начальный или конечный знак "+" или "-", то одна цифровая позиция будет использована слева или справа от точки для печати пробела или знака "-". Например:
    PRINT USING "###.##^^^^"; 234.56
    2.35E+02
        PRINT USING ".###-"; -88888
    .889E+05-
        PRINT USING "+.##^^^^"; 123
    +.12E+03

Если число, которое должно печататься, больше определенного числового поля, то в начале числа печатается знак "%". Если при округлении число превышает поле, то знак "%" будет печататься в качестве округлённого числа. Например:

    PRINT USING "##.##"; 111.22
    %111.22
        PRINT USING ".##"; .999
    %1.00

Если число заданных цифр превышает 24, то появляется Сообщение об ошибке НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    PRINT USING "ЭТО ПРИМЕР ##"; 1
    ЭТО ПРИМЕР # 1
1.4.84. Операторы PRINT# и PRINT# USING
PRINT # номер файла [USING X¤;] список выражений
где:  номер файла - номер, используемый файлом для вывода при открытии файла;
  - строковое выражение, определяющее строку формата;
  список выражений - числовые или строковые выражения, которые были записаны в файл.

Записывает данные последовательно в файл. PRINT# не снимает данные в файле. Образ данных записывается в файл уже тогда, когда данные будут появляться на экране дисплея. По этой причине не надо позаботиться, чтобы они корректно вводились. В списке выражений числовые выражения следует разделять точками запятой. Если запятые используются для разделители, то лишние пробелы, которые вводятся между печатными полями, также будут записываться в файл. Строковые выражения в списке должны быть разделены точками запятой.

Например: пусть A¤ = "ДЕТАЛЬ" и B¤ = "87654-2", то оператор PRINT #1, A¤; B¤ будет записывать в файл ДЕТАЛЬ 87654-2. Так как нет разграничителей, то эти данные не будут могут быть введены как две отдельные строки. Чтобы установить проблему, надо развести явные разграничители в оператор PRINT# следующим образом: PRINT #1, A¤; ","; B¤ и в файл запишется строка ДЕТАЛЬ,87654-2, которая может считаться в две строки. Если сами строки содержат запятые и точки запятые и точки с запятыми, то их надо записать в файл, включая кавычки, используя CHR¤(34).

Например: пусть A¤ = "ДЕТАЛЬ,СТАЛЬНАЯ" и B¤ = "87654-2", то оператор PRINT #1, A¤; B¤ будет записывать в файл следующее: ДЕТАЛЬ,СТАЛЬНАЯ 87654-2 и оператор INPUT #1, A¤; B¤ будет вводить строку "ДЕТАЛЬ" в A¤, а СТАЛЬНАЯ 87654-2 в B¤. Поэтому эти строки надо разделить в файле: записать двойные кавычки в содержимое файлов следующим образом: PRINT #1, CHR¤(34); A¤; CHR¤(34); CHR¤(34); B¤; CHR¤(34) записывая в файл следующее: "ДЕТАЛЬ,СТАЛЬНАЯ" "87654-2", и оператор INPUT #1, A¤; B¤ будет вводить "ДЕТАЛЬ,СТАЛЬНАЯ" в A¤, а "87654-2" в B¤. Оператор PRINT# может быть использован с параметром USING для управления форматом файла. Например:

    PRINT #1, USING "¤¤###.##"; I; K; L
    PRINT #1, A; B; C; D; X; Y; Z
1.4.85. Оператор PSET
PSET [STEP](X, Y)[, цвет]
где:  STEP - позволяет указать координаты относительно последней точки;
  X, Y - координата точки;
  цвет - цвет, целое число в диапазоне от 0 до 7.

На экране дисплея рисует точку в определенной позиции, заданной координатами (X, Y). Координата точки может быть задана в абсолютной или относительной форме. Если в операторе PSET пропущен цвет, то используется цвет переднего фона, установленный оператором COLOR.

1.4.86. Оператор PRESET
PRESET [STEP](X, Y)[, цвет]
где:  STEP - позволяет указать координаты относительно последней точки;
  X, Y - координата точки;
  цвет - цвет, целое число в диапазоне от 0 до 7.

Оператор PRESET аналогичен оператору PSET с той разницей, что в качестве опущенного параметра цвета принимается цвет заднего фона.

Если значение цвета больше 7, появляются сообщения в ошибке НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Если в операторах PSET и PRESET координаты точек заданы вне области экрана дисплея, то не производится никакого действия не выводится сообщений об ошибках. Например:

    10 REM НАРИСОВАТЬ ДИАГОНАЛЬ
    20 FOR I = 0 TO 100
    30 PSET (I, I)
    40 NEXT
    50 REM СТЕРЕТЬ ЛИНИЮ, УСТАНОВИТЬ ЦВЕТ КАЖДОЙ ТОЧКИ В НОЛЬ
    60 FOR I = 100 TO 0 STEP -1
    70 PRESET (I, I)
    80 NEXT
1.4.87. Оператор RANDOMIZE
RANDOMIZE числовое значение

Задает генератор случайных чисел. Если выражение опущено, то выполнение программы приостанавливается и запрашивается значение. На экране дисплея, появляется сообщение ВВЕДИТЕ ЛЮБОЕ ЧИСЛО (-32768...+32767)? Функция RND возвращает одинаковую последовательность случайных чисел каждый раз, как программа выполняется, если генератор случайных чисел не запускается. Чтобы изменить последовательность случайных чисел при каждом выполнении программы, необходимо поместить оператор RANDOMIZE в начале программы каждый раз изменить случайное число. Например:

    10 RANDOMIZE
    20 FOR I = 1 TO 4
    30 IF RND(I) * 10 > 5 THEN PRINT RND(I)
    40 NEXT
1.4.88. Оператор READ
READ список переменных

Считывает значения из оператора DATA и присваивает их переменным.

Переменные в списке разделяются запятыми.

Оператор READ всегда должен быть использован в паре с оператором DATA. Оператор READ присваивает значение оператора DATA переменным оператора READ на основе один к одному. Переменные оператора READ могут быть числовыми и строковыми и должны соответствовать по типам переменным, считанным из оператора DATA. Если они не соответствуют, появляется сообщение об ошибке ОШИБКА СИНТАКСИСА. Один оператор READ может иметь доступ к одному и более операторам DATA или несколько операторов READ могут иметь доступ к одному оператору DATA. Если число переменных оператора READ превышает число элементов в операторе (операторах) DATA, то появляется сообщение об ошибке ВНЕ DATA. Если число переменных оператора READ меньше числа элементов оператора (операторов) DATA, то следующие READ будут начинать чтение данных с первого несчитанного оператора DATA. Если больше нет операторов READ, то лишние данные оператора DATA игнорируются. Чтобы заново прочитать операторы DATA с сначала, используются оператор RESTORE. Например:

    10 PRINT "СТРАНА", "ГОРОД", "ИНДЕКС"
    20 READ C¤, S¤, Z
    30 DATA СССР, МОСКВА, 115470
    40 PRINT C¤, S¤, Z
    RUN
    СТРАНА  ГОРОД   ИНДЕКС
    СССР    МОСКВА  115470
    Ok
1.4.89. Оператор RELOC
RELOC(X, Y)

где: X, Y - координаты начальной точки.

Устанавливает начало координат при работе с графическими операторами. Например:

    10 RELOC(100, 100)
    20 LINE(0, 0)-(200, 200), 4, BF
1.4.90. Оператор REM
REM комментарий

где: комментарий - любая последовательность символов.

Вводит в программу объяснительные комментарии. Оператор REM - неисполнительный оператор, но при распечатке программы выводится в том же виде, что и вводится. Однако он увеличивает время выполнения и занимает пространство в памяти. Операторами GOTO и GOSUB на операторы REM может быть осуществлен переход, и выполнение программы и будет продолжаться первого после REM исполнительного оператора. Например.

    120 REM ВЫЧИСЛЕНИЕ СКОРОСТИ
    130 FOR I = 1 TO 20
    140 SUM = SUM + V(I)
    150 NEXT I
    160 A = 0: REM ИНИЦИАЛИЗАЦИЯ A
    170 PRINT SUM
    180 REM ПРОГРАММА ВЫЧИСЛЕНИЯ СКОРОСТИ
1.4.91. Оператор RENUM
RENUM [новый номер][, [старый номер][, шаг]]
где:  новый номер - номер первой строки, которая будет использоваться в качестве новой последовательности номеров строк. По молчанию 10;
  старый номер - номер строки текущей программы, с которого начнется перенумерация. По умолчанию номер первой строки программы;
  шаг - шаг, используемый в новой последовательности. По умолчанию 10.

Переименовывает строки программы. RENUM также изменяет все номера строк в операторах GOTO, GOSUB, THEN ELSE, ON...GOTO, ON...GOSUB и ERL. Если после какого либо из этих операторов появится несуществующий в программе номер строки, то выдается сообщение об ошибке НЕОПРЕДЕЛЕННЫЙ НОМЕР СТРОКИ. Обращение к некорректному номеру строки не изменяется командой RENUM. Например:

    RENUM 300, , 50
1.4.92. Оператор RESTORE
RESTORE номер строки

Разрешает операторам DATA считывается заново с определенной строки. После того, как выполнится оператор RESTORE, следующий оператор READ имеет доступ к первому элементу первого оператора DATA программы. Если номер строки задан, то следующий оператор READ имеет доступ к первому элементу в заданном операторе DATA. Например:

    10 READ A, B, C
    20 RESTORE
    30 RED D, E, F
    40 DATA 57, 68, 49
    50 PRINT A, B, C, D, E, F
    RUN
    57    68    49    57    68    49
1.4.93. Оператор RESUME
RESUME O
RESUME NEXT
RESUME номер строки

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

RESUME [0] Выполнение восстанавливается с оператора, который вызвал ошибку.
RESUME NEXT Выполнение восстанавливается с оператора, расследующего непосредственно за оператором, который вызвал ошибку.
RESUME номер строки Выполнение восстанавливается с оператора заданным номером строки.

Оператор RESUME, для которого нет подпрограммы обработки ошибки, вызывает сообщение об ошибке RESUME БУЗ ОШИБКИ. Например:

    10 ON ERROR GOTO 900
    ...
    900 IF ERR = 230 AND ERL = 90 THEN PRINT "ПОПРОБУЙТЕ ЕЩЕ РАЗ": RESUME 80
1.4.94. Оператор RETURN
RETURN

Возвращает управление обратно в программу и из подпрограммы. Осуществляет возврат к оператору, следующему за тем, из которого проводилась обращение к подпрограмме. Например:

    50 GOSUB 400
    ...
    400 REM ПОДПРОГРАММА
    ...
    500 RETURN
1.4.95. Функция RIGHT¤
Y¤ = RIGHT¤(X¤, N)

Возвращает N самых правых символов строки X¤. Если N = LEN(X¤), то возвращается строка X¤. Если N = 0, то возвращается пустая строка. Например:

    10 A¤ = "АБВГДЕЖЗ ABCDEFG"
    20 PRINT RIGHT¤(A¤, 7)
    RUN
    ABCDEFG
    Ok
1.4.96. Функция RND
Y = RND(N)

Возвращает случайное число между 0 и 1. При выполнении программы каждый раз генерируется одинаковая последовательность случайных чисел, если не выбран генератор случайных чисел. Это можно сделать, используя оператора RANDOMIZE или в функции RND, задать аргумент N каждый раз с другим значением. RND(0) повторяет последние сгенерированное число. Например:

    10 FOR I = 1 TO 3
    20 PRINT RND(I);
    30 NEXT I
    RUN
    .6291626  .1948297  .6305799
    Ok
1.4.97. Команда RUN
RUN [номер строки]
RUN "имя файла"[, параметры]
RUN "CAS:имя файла"[, параметры]

Начинает выполнение программы. Первая форма команды начинает выполнение программы, находящейся в памяти в текущий момент. Если задан номер строки, то выполнение программы начинается с этой строки. А если номер строки не задан, то программа выполняет с первой строки программы.

Второй и третий формат команды RUN загружает программу с диска или КНМЛ в память и выполняет ее. Имя файла при загрузке с НКМЛ не должно быть больше 6 символов. Если программа загружается с диска, то имя программы имеет по умолчанию расширение BAS. Перед загрузкой команда RUN закрывает все открытые файлы и стирает текущее содержание памяти. Но если задан параметр R, то все открытые файлы данных остаются открытыми. Например:

    RUN
    RUN "PRIMER.BAS"
    RUN "CAS:PRIMER", B, R
1.4.98. Команда SAVE
1.4.98.1. Команда SAVE для НГМД
SAVE "имя файла"
SAVE "имя файла", A
SAVE "имя файла", B, <начальный адрес>, <конечный адрес>[, <стартовый адрес>]

Первый формат команды SAVE сохраняет программу на языке Бейсик, второй сохраняет программу на диске в кодах КОИ-8, третий сохраняет двоичный файл, лежащий в памяти, начиная с начального адреса по конечной адрес. При необходимости можно указать стартовый адрес. Если он не указан, записывается начальный адрес.

Программа записывается по умолчанию на текущей дисковод, или, если нужно, на указанный дисковод. Если имя файла меньше 8 символов и не имеет расширения, то к имени, будет добавляться расширение BAS. Если файл с таким именем существует на диске, то программа будет записываться вместо существующего файла. Например:

SAVE "PRIMER", A Файл PRIMER записывается на диск в кодах КОИ-8.
SAVE "PRIMER", B, &H9000, &H9FFF, &H9000 Двоичный файл, лежащий в памяти с адреса &H9000 по адрес &H9FFF записываются на диск с именем PRIMER.BAS.
1.4.98.2. Команда SAVE для НКМЛ
SAVE "CAS:имя файла"
SAVE "CAS:имя файла", A
SAVE "CAS:имя файла", B, <нач. адр.>, <кон. адр.>[, <старт. адр.gt;]

Первый команды SAVE сохраняет на ленте Бейсик-программу во внутреннем представлении, второй формат сохраняет Бейсик-программу в кодах КОИ-8 и третий формат сохраняет двоичный файл. В этом формате:

  • <нач. адр.> - начальный адрес программы;
  • <кон. адр.> - конечный адрес программы
  • <старт. адр.gt; - стартовый адрес программы.

Имя программы должно быть не больше 6 символов. Например:

SAVE "CAS:PROBA", A Запись Бейсик-программы в кодах КОИ-8.
SAVE "CAS:PROBA", B, &H9000, &H9FFF, &H9100 Двоичный файл, расположенный в памяти с адреса &H9000 по адрес &H9FFF записываются на НКМЛ, с указанием стартового адреса &H9100.
1.4.99. Оператор SCREEN
SCREEN [N][, M][, R]
где: N - номер графической страницы отображения. Целочисленное выражение от 0 до 3;
  M - номер графической страницы чтения (записи). Целочисленное выражение от 0 до 3;
  R - целочисленное значение, принимающее значение 0 или 1.

Переключает графические страницы памяти и устанавливает текстовый режим расширенных символов.

Если параметры N, M и R не заданы, то выдается сообщение об ошибке ОШИБКА СИНТАКСИСА. Если значение параметров выходят за границы, то выдается сообщение НЕВЕРЕН ВЫВОД ФУНКЦИИ.

Если параметр R равен 0, устанавливается нормальный режим символов, есть равен 1, то расширенный. Например:

    10 SCREEN 0, 0
    20 COLOR 4, 3
    30 LINE-(100, 200), 5: REM РИСУЕТ ЛИНИЮ НА НУЛЕВОЙ СТРАНИЦЕ
    40 SCREEN 0, 1
    50 CIRCLE(100, 200), 100: REM РИСУЕТ ОКРУЖНОСТЬ НА ПЕРВОЙ СТРАНИЦЕ
    60 SCREEN 1, 1: REM ОТОБРАЖАЕТСЯ ПЕРВАЯ СТРАНИЦА
    70 SCREEN ,,1: REM ЗАДАЕТСЯ РЕЖИМ РАСШИРЕННЫХ СИМВОЛОВ
1.4.100. Функция SGN
Y = SGN(N)

Возвращает значение математической функции знака. Если Х положительная, то SGN(X) возвращает 1. Если X равно нулю, то SGN(X) возвращает 0. Если X отрицательно, то SGN(X) возвращает минус 1. Например:

    10 ON SGN(X) + 2 GOTO 100, 200, 300
1.4.101. Функция SIN
Y = SIN(X)

Вычисляет тригонометрическую функцию синуса. В X - угол, заданный в радианах. Если надо перевести градусы в радианы, это результат выполнения умножается на PI / 180, где PI = 3.141593. Функция (X) вычисляется с одинарной точностью. Например:

    PRINT SIN(1.5)
    .997495
1.4.102. Оператор SOUND
SOUND регистр, значение
где: регистр - арифметическое выражение, определяющее номер регистра от 0 до 10;
  значение - арифметическое выражение, определяющее значение регистра.

Команда позволяет пользователю добиться различных звуковых эффектов путем управления, программируемым синтезатором звука СЗ9010. Управление осуществляется путем определения значений 11 регистров, пронумерованных от 0 до 10. Ниже приводится Таблица 18, в которой описывается значение имеющихся регистров.

Таблица 18
Номер
регистра
Назначение регистра Диапазон
значений
0 Задает значение коэффициента деления звука для первого голоса 0...32767
1 Задает значение коэффициента деления звука для второго голоса 0...32767
2 Задает значение коэффициента деления звука для третьего голоса 0...32767
3 Задает значение коэффициента деления звука для четвертого голоса 0...32767
4 Задает значение коэффициента деления шума 0...32767
5 Управляет (разрешает/запрещает) звуком или шумом по голосам 0...255
6 Задает для первого голоса: громкость и форму огибающей 0...15
16..31
7 Задает для второго голоса: громкость и форму огибающей 0...15
16..31
8 Задает для третьего голоса: громкость и форму огибающей 0...15
16..31
9 Задает для четвертого голоса: громкость и форму огибающей 0...15
16..31
10 Задает период огибающей 0...32767

Коэффициент деления звука (шума) определяется по следующей формуле:

Nзв = νвх / νзв
где: νвх - частота на входе; для синтезатора звука СЗ9010 равна 1 мГц;
  νзв - частота звука, которую необходимо получить на выходе синтезатора.

При задании огибающих формула приобретает вид:

Nог = νвх / (νогиб 255)

Форма пятого регистра имеет следующий вид:

Первые четыре бита управляют (разрешают/запрещают) звучанием голосов 1, 2, 3, 4; последние биты - шумом. Наличие единицы запрашивает звучание, наличие нуля - разрешает.

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

Таблица 19
Цифровое
значение
формы
огибающей
Форма огибающей
16
17
18
19
25
20
21
22
23
31
24
26
27
28
29
30

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

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

Определение регистров следует производить в следующие последовательности: 5, 10, 6 (7, 8, 9,), 0 (1, 2, 3).

1.4.103. Функция SPACE¤
Y¤ = SPACE¤(N)

где: N - число в диапазоне от 0 до 255.

Возвращает строку, состоящую из N пробелов. Например:

    10 FOR I = 1 TO 5
    20 X¤ = SPACE¤(I)
    30 PRINT X¤; I
    NEXT I
    RUN
     1
      2
       3
        4
         5
    Ok
1.4.104. Функция SPC
PRINT SPC(N)

где: N - число в диапазоне от 0 до 255.

Печатает N пробелов. Если N больше, чем заданная ширина устройства, то используется значение (N MOD ширина). Функция SPC может быть использована только с операторами PRINT, LPRINT и PRINT#. Например:

    PRINT "БОЛЬШЕ"; SPC(20); "ЧЕМ"
    БОЛЬШЕ                    ЧЕМ
    Ok
1.4.105. Команда SPEED
SPEED N

где: N - арифметическое выражение, принимающее значение 1 или 2.

Изменяет скорость записи на КНМЛ в бодах и имеет следующие варианты значений для N:

  • 1 - скорость 1200 бод (по умолчанию). Наиболее надежная скорость;
  • 2 - скорость 2400 бод.

При чтении программы с НКМЛ скорость определяется автоматически.

1.4.106. Функция SQR
Y = SQR(X)

где: X - число, которое должно быть больше или равно 0.

Возвращает квадратный корень числа X. Например:

    10 FOR X = 10 TO 25 STEP 5
    20 PRINT X, SQR(X)
    30 NEXT
    RUN
    10      3.16228
    15      3.87298
    20      4.47214
    25      5
    Ok
1.4.107. Функция STICK
X = STICK(N)

где: N - целочисленное выражение в диапазоне от 0 до 2.

Возвращает состояние джойстика.

Если N = 0, то в качестве джойстика используются управляющие клавиши клавиатуры, если N = 1? то считывается состояние джойстика, подключенного к первому разъему, если N = 2, то считывается состояние джойстика подключенному ко второму разъему.

Если значение находится вне допустимого диапазона, то выводится сообщение НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Функция возвращает число диапазоне от 0 до 8, отмечающее перемещение рукоятки джойстика. Цифры определяют 8 направлений, представленных на рисунке 2.

Направления джойстика
Рисунок 2. Направления джойстика

Для клавиатуры (STICK(0)), клавиши вверх, вниз, влево и вправо выдают, соответственно, значения 1, 3, 5 и 7. Нажатие одновременно двух соседних клавиш дает значение 2, 4, 6 и 8. Например:

    10 D = STICK(0)
    20 IF D = 0 THEN PRINT "НИЧЕГО НЕ НАЖАТО"
    30 IF D = 1 OR D = 8 OR D = 2 THEN Y = -1
    40 IF D = 4 OR D = 5 OR D = 6 THEN Y = 1
    50 IF D = 6 OR D = 7 OR D = 4 THEN X = -1
    60 IF D = 2 OR D = 3 OR D = 4 THEN X = 1
    70 PSET(X, Y), 7
1.4.108. Оператор STOP
STOP

Заканчивает выполнение программы и возвращает управление на уровень команд. Чтобы закончить выполнение, оператор STOP может быть использован в любом месте программы. Когда встречается оператор STOP, на экране появляется следующее сообщение:

СТОП В nnnnn

где: nnnnn - номер строки, на которой встретился оператор STOP.

В отличие от оператора END, оператор STOP не закрывает файлы. Выполнение программы восстанавливается командой CONT. Например:

    10 INPUT A, B, C
    20 K = A^2 * 5.3: L = B^3 / .26
    30 STOP
    40 M = C * K + 100: PRINT M
    RUN
    ?1,2,3
    СТОП В 30
    PRINT L
    30.7692
    Ok
    CONT
    115.9
    Ok
1.4.109. Функция STR¤
X¤ = STR¤(X)

Возвращает строковое значение представления X. Функция VAL является инверсией функции STR¤. Например:

    5 REM АРИФМЕТИКА
    10 INPUT "ВВЕДИТЕ ЧИСЛО", N
    20 REM ВЫБОР ЗАВИСИТ ОТ КОЛИЧЕСТВА ЦИФР
    30 ON LEN(STR¤(N)) GOSUB 60, 100, 200
1.4.110. Функция STRIG
X = STRIG(N)

где: N - арифметическое выражение в диапазоне от 0 до 4.

С помощью этой функции можно определить состояние пусковых кнопок джойстиков. Может быть считано в состоянии трех джойстиков: "встроенного", если эта клавиатура и двух дополнительных. Функция принимает значение 0, если кнопка не нажата минус 1, если нажата. N может принимать следующие значения:

  • N = 0 - клавиатура (клавиша пробел);
  • N = 1 - первый джойстик (1-я кнопка);
  • N = 2 - второй джойстик (1-я кнопка);
  • N = 3 - первый джойстик (2-я кнопка);
  • N = 4 - второй джойстик (2-я кнопка).

Любое другой значение N вызовет сообщение НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    5 IF STRIG(1) = -1 THEN PCLS: CLS
    20 IF STRIG(3) = -1 THEN PAINT(X, Y), 7
1.4.111. Функция STRING¤
Y¤ = STRING¤(N, M)
Y¤ = STRING¤(N, X¤)

где: N и M - числа в диапазоне от нуля до 255.

Возвращает в строку длиной N, все символы которой имеют заданный код КОИ-8 или являются первым символом строки X¤. При N = 0 возвращается пустая строка.

Если значение N и M лежат вне указанного диапазона, то вы выдается сообщение об ошибке НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    10 X¤ = STRING¤(10, 45)
    20 PRINT X¤; "ОТЧЕТ"; X¤
    RUN
    __________ОТЧЕТ__________
    Ok
    10 X¤ = "ABCD"
    20 Y¤ = STRING¤(10, X¤)
    30 PRINT Y¤

    RUN
    AAAAAAAAAA
    Ok
1.4.112. Оператор SWAP
SWAP переменная1, переменная2

Обменивает значение двух переменных. Могут быть обменены переменные любого типа, но обе переменные должны быть одного типа, иначе появляются сообщение об ошибке ОШИБОЧНЫЙ ТИП. Эти переменные могут быть элементами массива. Например:

    10 A¤ = "ONE": B¤ = "ALL": C¤ = "FOR": PRINT A¤; C¤; B¤
    20 SWAP A¤, B¤: PRINT A¤; C¤; B¤
    RUN
    ONE FOR ALL
    ALL FOR ONE
    Ok
1.4.113. Команда SYSTEM
SYSTEM

Возвращает управление в операционную систему. Закрывает все файлы перед возвратом в операционную систему.

1.4.114. Функция TAB
PRINT TAB(N)

где: N - число в диапазоне от 1 до 255.

Осуществляет табуляцию в N-ю позицию. Если и позиция текущей печати больше, то TAB перемещает курсор в позицию N на следующей строке. Позиция 1 - это самая левая позиция, заданная ширина - самая правая позиция. Функция TAB может использоваться только с операторами PRINT, LPRINT и PRINT#.

Если N - не нецелое число, то происходит округление до целого числа.

Если N лежит вне указанного диапазона, выдается сообщение об ошибке НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Например:

    10 PRINT "ИМЯ"; TAB(25); "КОЛИЧЕСТВО"
    20 READ A¤, B¤
    30 PRINT A¤; TAB(25); B¤
    40 DATA Л.М. ЯНШИН, 25.68
    RUN
    ИМЯ                     КОЛИЧЕСТВО
    Л.М. ЯНШИН              25.68
    Ok
1.4.115. Функция TAN
Y = TAN(X)

Вычисляет тригонометрическую функцию тангенса угла X. Угол X должен быть задан в радианах. Для перевода градусов в радианы X результат вычисления умножается на PI / 180, где PI = 3.141593. Функция TAN(X) вычисляется с одинаковой точностью. Например:

    10 Y = Q * TAN(X) / 2
1.4.116. Команды TRON и TROFF
TRON
TROFF

Разблокируют и блокирует трассировку программы. Команда TRON (может быть введена и в программном режиме) разблокирует флаг трассы. По команде TRON будет печататься каждый номер строки программы, заключенный в квадратные скобки. Флаг трассы блокируются командой TROFF (или командой NEW). Например:

    10 K = 10
    20 FOR J = 1 TO 2
    30 L = K + 10
    40 PRINT J; K; L
    50 K = K + 10
    60 NEXT
    70 END
    TRON
    Ok
    RUN
    [10][20][30][40] 1 10 20
    [50][60][30][40] 2 20 30
    [50][60][70]
    Ok
    TROFF
    Ok
1.4.117. Функция USR
Y = USR[цифра](X)

где: цифра - в диапазоне от 0 до 9. Соответствует цифре в операторе DEF USR для заданной подпрограммы.

Вызывает указанную подпрограмму на машинном языке с фиктивным номером X. Если цифра опущена, то принимается USR0. Например:

    50 C = USR(0)
1.4.118. Функция VAL
Y = VAL(X¤)

Возвращает числовое значение строки X¤. Функция убирает начальные пробелы, табуляцию и перевод строки из строки аргумента для того, чтобы вычислить результат. Например, VAL(" -3") возвращает минус 3. Есть X - не число, то возвращает 0.

1.4.119. Функция VARPTR
X = VARPTR(переменная)
X = VARPTR(#номер файла)

Возвращает адрес памяти переменной или блока управления файлом. В обеих форматах возвращаемые адреса будут целыми числами в диапазоне от 0 до 65535. Первый формат возвращает адрес первого байта данных идентифицированных с переменной. Значение должно быть присвоено переменной перед использованием функции VARPTR, иначе появится сообщение об ошибке НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Может быть использовано для переменой любого типа (число, строка, элемент массива). Все простые переменные должны быть присвоены перед вызовом VARPTR для массива, так как адреса массивов когда-нибудь изменятся и присвоится новая простая переменная. Функция VARPTR обычно используется для получения адреса переменной или массива так, чтобы он может быть передан в подпрограмму на машинном языке. Вызов функции формой VARPTR(A(0)) обычно задается при передаче массива так, что возвращается элемент массива самого младшего адреса. Второй формой возвращается начальный адрес блока управления файлом. Файл должен быть открыт перед вызовом в VARPTR. Например:

    10 OPEN "O", #1, "DATA.FIL"
    20 PRINT #1, "PRIMER"
    30 FC = VARPTR(#1)
    40 PRINT PEEK(FC), PEEK(FC + 1)
1.4.120. Оператор WIDTH
WIDTH размер

где: размер - числовое значение от 15 до 64.

Оператор WIDTH устанавливает ширину входной строки дисплея.

2. Работа с внешними устройствами

2.1. Выполнение программы
2.1.1. Вызов интерпретатора и возврат в операционную систему

Перед вызовом интерпретатора Бейсик необходимо вставить дискету ПТ3.060.162 в верхний дисковод (дисковод A:) и загрузить ОС согласно документу "БАЗОВЫЕ ПРОГРАММНЫЕ СРЕДСТВА ПК8020 Руководство пользователя" ПТ.00550-01 90 01. После появления сообщения о загрузке системы необходимо ввести команду BASIC.

Полный формат команды BASIC:

BASIC [имя файла][ /F:число файлов][ /M:размер]
где:  имя файла - имя файла программы, которая будет загружаться или выполняться Является строковой константой, не заключенной в кавычки;
  /F:число файлов - устанавливает максимальное число файлов, которые могут быть открыты в любое время в течение работы интерпретатора. Каждый блок файла требует 166 байт памяти. Если параметр /F: опущен, то по умолчанию число файлов равно 3. Максимальное значение параметра /F: - 15 файлов.
  /M:размер - устанавливает максимальный размер памяти, которая может быть использована как рабочее пространство интерпретатора. Если параметр /M: опущен, то используется доступная память до максимума 48 килобайт (память от 48 до 64 килобайт занимает МикроДОС).

Все числа в параметре /F: или /M: могут быть заданы в десятичном, восьмеричном (с префиксом &O), шестнадцатеричном (с префиксом &H) или двоичном (с префиксом &B) формате.

При работе на HVG интерпретатор предоставляет пользователю возможность работы с файлами на накопительные, на кассетные магнитной ленте или на диске. Имя файла на диске состоит из собственного имени файла (до 8 символов) и расширения (3 символа), разделенных символом ".". При просмотре директории диска разрешается использовать неявные имена. Неявное имя задается с помощью символов "?" или "*", где символ "?" задает собой любой символ в имени или расширения файла, а символ "*" заменяет собой все имя или расширение файла. Например: FILES "A:*.*"

В имени файла может указываться устройствo. Eсли указано устройство CAS:, то в качестве носителя информации будет использоваться НКМЛ. При этом имя файла не должно быть больше 6 символов.

В имени файла может указываться также дисковод A: или B:. Если дисковод в имени файла не определен, то по умолчанию выбирается текущий дисковод. При работе с дисками, если имя файла меньше 10 символов и не содержит точки, то по умолчанию, используя расширение .BAS. Например.

LOAD "CAS:PROG", R - загрузить с НКМЛ и выполнить программу;
LOAD "B:PROG" - загрузить с диска, расположенного на диске B: программу с именем PROG.BAS;
SAVE "FILE.ASC", A - сохранить программу с именем FILE.ASC на диске расположенном на текущем дисководе в кодах КОИ-8.

Когда интерпретатор языка Бейсик загружен, на экране ВКУ ВБ8071 ПТ2.043.040 появится сообщение:

    БЕЙСИК КОРВЕТ в.2.0.
    Москва
    МикроДОС 1986
    ОК

Параметры вызова интерпретатора:

BASIC ROLL.BAS - используют всю память и 3 файла загружает и выполняет программу ROLL.BAS;
BASIC INVENT /F:6 - использует всю память и 6 файлов, загружает, выполняет программу INVENT.BAS;
BASIC /F:10 /M:40000 - использует 40000 байт памяти и 10 файлов

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

Примечание: Если вы будете выводить текст на печатающее устройство, то до вывода интерпретатора нужно вызвать программу PRINTER для ПУ RAVI 8010 или программу RAVIM для ПУ RAVI 8010M.

Программы PRINTER и RAVIM входят в состав программного изделия "Базовые программные средства ПК8020. Системное программное обеспечение" ПТ3.060.163. Правила ее вызова приведены в документе "Базовые программные средства ПК8020. Руководство пользователя" ПТ.00550-01 90 01.

2.1.2. Режим работы

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

В программном режиме вводят и выполняют программы. Вводимая строка, которая является частью программы, должна начинаться с номера. Затем строка заполняется как часть программы в памяти. Программа может быть выполнена при введении команды RUN. Например:

    10 PRINT 20 + 5
    RUN
    25
    Ok

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

    PRINT 20 + 5
    25
    Ok

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

2.1.3. Символы управления

Интерпретатор языка Бейсик поддерживает следующие управляющие символы:

УПР+A - включает режим редактирования введенной строки;
УПР+C - прерывает выполнение программы и возвращает управление на уровень команд;
УПР+G - звонок;
УПР+H - возвращает курсор на одну позицию и стирает последний введенный символ;
УПР+I - табуляция через каждые восемь позиций;
УПР+O - прекращает вывод на экран до повторного нажатия УПР+O;
УПР+S - приостанавливает вывод на экран до нажатия любой клавиши;
УПР+U - стирает в памяти только что введенную строку.
2.2. Работа с программами, написанными на языке Бейсик
2.2.1. Ввод новой программы

При работе с интерпретатором языка Бейсик можно создавать новые программы, вводя программые строки, и вызывать уже созданные и записанные на НКМЛ или на диске программы.

После вызова интерпретора можно вводить команды или программные строки. Программная строка состоит из номера строки от 0 до 65529, за которым следуют элементы языка (операторы, константы, переменные, функции и т.д.). Программные строки могут вводиться в любом порядке, но выполнение будет осуществляться в порядке увеличения номеров строк, не считая безусловных переходов и вызовов подпрограмм. Для автоматической нумерации программных строк рекомендуется использовать команду AUTO, что поможет сократить время ввода программы.

Для добавления новой строки в программе надо ввести новый номер строки, за которым следует хотя бы один символ - не пробел, и нажать клавишу возврата каретки. Если строка с таким номером уже существует, то старая строка стирается и заменяется новой. Программные строки не проверяются на наличие синтаксических ошибок перед добавлением к программе. Они проверяются только при выполнении программы. Для того, чтобы легко можно было вставлять строки, рекомендуется нумеровать строки с шагом не равным 1, а, например, 10 или 100. Шаг может выбираться произвольно. Кроме того, шаг не обязательно должен быть постоянным по всей программе. Для перенумерации номеров строк, если уже невозможно вставить программную строку, или по каким-либо другим причинам используйте команду RENUM.

Если во время ввода строки сделана ошибка, то ее можно исправить до нажатия клавиши возврата каретки следующими способами:

  • стереть всю строку, нажав клавиши УПР+U;
  • стереть символ, нажав клавишу ⇐ (или УПР+H).

Чтобы стереть уже существующую программную строку, надо набрать номер стираемой строки, нажать клавишу возврата каретки или использовать команду DELETE.

Для редактирования уже существующей программной строки можно использовать команду EDIT или ввести строку заново под тем же номером.

Для вывода программных строк на экран терминала или на печатающее устройство используются команды LIST и LLIST.

При работе из РМП любую введенную или отредактированную программу можно сохранить на диске или НКМЛ командой SAVE.

Если программа или часть программы уже существует на диске, то командой LOAD ее можно загрузить с диска или НКМЛ в память. После этого можно продолжить вводить программу, добавлять, стирать или редактировать программные строки.

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

2.2.2. Загрузка программы с диска

Командой LOAD можно загружать программные файлы трех типов: Бейсик-программы во внутреннем представлении, Бейсик-программы в кода КОИ-8 и двоичные файлы. При работе команды LOAD первых двух типов всегда стирается содержимое памяти и закрываются все открытые файлы перед загрузкой. Прежде, чем начать работу с программой, записанной на диске, она должна быть загружена командой LOAD. Загрузка двоичного файла не вызывает чистки памяти и может использоваться в программных строках для подзагрузки программ машинного языка.

Команда MERGE загружает Бейсик-программу с диска в память, но не стирает содержимого памяти. Загружаемая программа должна быть сохранена в кодах КОИ-8. Программные строки, находящиеся на диске, соединяются с программой в памяти. Если две программные строки имеют один номер, то сохраняется только строка программы, загруженной с диска.

После загрузки программы интерпретатор возвращает управление на уровень команд. Например:

  • LOAD "FILE.BIN", B - двоичный файл FILE.BIN загружен в память;
  • LOAD "FILE.BAS" - программа FILE.BAS загружена в память;
  • MERGE "PROG.BAS" - программа PROG.BAS загружена и присоединена к программе, находящейся в памяти.
2.2.3. Сохранение программы на диске

Любая отредактированная или только что введенная программа может быть сохранена. Команда SAVE записывает на диск программу как последовательность символов КОИ-8 или в сжатом двоичном формате, или записывает на диск двоичный файл, лежащий в памяти с определенных адресов. Например:

  • SAVE "PROG.BAS", A - программа записывается на диск с именем PROG.BAS как последовательность символов КОИ-8;
  • SAVE "FILE.BIN", B, &H9000, &H9FFF, &H9000 - на диск записывается область памяти с адреса &H9000 по &H9FFF.
2.2.4. Выполнение программы, ее останов и продолжение выполнения

Команда RUN выполняет программу, находящуюся в текущий момент в памяти. Когда программа выполнена, интерпретатор возвращается на уровень команд. Команда LOAD с параметром R загружает программу с диска и сразу выполняет ее.

Например введена команда LOAD "PROG.BAS", R то программа с именем PROG.BAS будет загружена с диска и сразу выполнена.

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

    СТОП В nnnnn
    Ok
где:  номер файла - номер программной строки.

После останова интерпретатор находится на уровне команд. Выполнение программы может быть продолжено с помощью команды CONT.

2.2.5. Распечатка программы

Для вывода на экран программы, написанной на языке Бейсик, находящейся в текущий момент в памяти, используется команда LIST. С помощью команды LIST можно вывести всю программу, часть программы или одну конкретную строку. Чтоб приостановить вывод программы на экран, надо нажать клавишу УПР+S, а для продолжения вывода после приостановки надо нажать любую клавишу. Для того, чтобы прервать вывод программы на экран и возвратить управление на уровень команд, следует нажать клавишу СТОП. Для получения распечатки программы, т.е. для вывода программы на печать, используется команда LLIST, формат которой совпадает с форматом команды LIST. Если необходимо получить распечатку программы, не находящейся в текущий момент в памяти, то ее необходимо предварительно загрузить с диска в память.

2.2.6. Стирание программы

Команда KILL стирает файл с диска. Если программа стерта, то ее нельзя восстановить. Например:

KILL "FILE.BAS"

Программа FILE.BAS стерта с диска расположенного на текущем дисководе.

Для стирания отдельных программных срок, используется команда DELETE.

Для стирания программы в памяти используется команда NEW.

2.2.7. Переименование программы

Для переименования программы используется команда NAME.

Например, чтобы изменить имя программы PROG.BAS на FILE.BAS надо ввести команду:

NAME "PROG.BAS" AS "FILE.BAS"

при этом изменится только имя программы, но не сама программа.

2.2.8. Оглавление диска

Если необходимо посмотреть, какие программы есть на диске, то используются команда FILES. Эта команда позволяет узнать, какие программы записаны на диске, находящимся на текущем дисководе. Если в команде указывается название устройства, конкретное расширение или имя программы, то на экран выводится не все содержимое диска, а только конкретные программы, имена которых имеют заданные признаки. Например.

FILES B:*.BAS - на экран выводится имена программ на диске, имеющих расширение BAS;
FILES "B:*.*" - на экран выводится имена всех программ, находящихся на диске B:;
FILES "?ROG.BAS" - на экран выводится файлы с расширением, имена которых отличаются лишь по первому символу. Например
    PROG.BAS
    GROG.BAS
    UROG.BAS
2.3. Работа с кассетным магнитофоном

В процессе программирования пользователю предоставляется возможность сохранять, загружать, присоединять программные файлы различных типов на НКМЛ. Имеется возможность для запуска программ с НКМЛ. Допускается возможность загрузки на ПК8020 программ, сохраненных на других 8-разрядных микро-ЭВМ в кодах КОИ-8.

2.3.1. Загрузка программы

Команда LOAD с именем устройства CAS: загружает файлы трех типов. Бейсик-программа сжатом двоичном формате, Бейсик-программы, сохраненные в кодах КОИ-8, программы на машинном языке (двоичные файлы). Команда LOAD первых двух типов при своей работе стирает текущую программу в памяти.

При использовании команды LOAD можно указывать имя программы (не более шести символов) и тип программы. Если не указано имя программы и тип файла, то с НКМЛ будет считываться первая встретившаяся программа в сжатом двоичном формате.

Если заданное имя программы или тип программы не совпадают с записанным на ленте, то выдается сообщение:

ПРОПУЩЕН <имя файла> <признак>
где:  <имя файла> - имя файла, прочитанное на ленте;
  <признак> - одна из 3 комбинации символов:
  • пробел - прочитана Бейсик-программа в сжатым двоичном формате;
  • A - прочитана Бейсик-программа в кодах КОИ-8;
  • B - прочитана машинная программа.

Если заданные имя программы и тип совпал с записанным на ленте то выдается сообщение:

НАЙДЕН <имя файла> <признак>

Если загружаемая программа в кодах КОИ-8, то после загрузки каждого блока данных выдаются сообщение: "*".

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

ОШИБКА ЧТЕНИЯ

После этого двигатель автоматически выключается и загрузку необходимо повторить. Повторная загрузка производится путем перемотки ленты назад в начало программы, набрав команду MOTOR ON, которая включает двигатель магнитофона. После нахождения начала программы необходимо набрать команду MOTOR OFF (остановить двигатель) и снова набрать команду LOAD.

Команда MERGE с именем устройства CAS: работает аналогично команде LOAD, но не стирает программу, лежащую памяти. Программа, загружаемая с кассеты, соединяет с программой в памяти. Если две программные строки имеют один размер, то сохраняется строка, загруженная с КНМЛ. Команда MERGE загружает только программы, сохраненные в кодах КОИ-8. При попытке загрузки программы сохраненной не в кодах КОИ-8 выдается сообщение:

НЕВЕРЕН РЕЖИМ ФАЙЛА

В процессе загрузки выдается сообщение:

**...*

где "*" - корректно считанный блок данных с ленты.

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

LOAD "CAS:", A - с НКМЛ загружается текущая программа в кодах КОИ-8;
LOAD "CAS:PROGR", B, R - с НКМЛ загружается двоичная программа с именем PROGR и ей передается управление.
2.3.2. Сохранение программы

Запись программы одного из трех типов на НКМЛ осуществляется с помощью команды: SAVE "CAS:имя файла". Если имя файла не указано, то на ленту записывается имя, состоящее из 6 пробелов.

Имеется возможность сохранить на НКМЛ программные файлы в кодах КОИ-8. Для этого используется команда: SAVE "CAS:имя файла", A

Также можно сохранить машинный программы двоичные файлы с помощью команды:

SAVE "CAS:имя файла", B, нач.адр., кон.адр., старт.адр.
где:  нач.адр. - начальный адрес памяти, с которого располагается программа в машинном языке.;
  кон.адр. - конечный адрес;
  старт.адр. - стартовый адрес программы, т.е. адрес, на который нужно передать управление, чтобы начать выполнение программы.

Например:

SAVE "CAS:PRIMER", B, &H9000, &H9FFF, &H9000

Записать машинную программу с именем PRIMER с адреса &H9000 по адрес &H9FFFF с указанием стартового адреса &H9000.

SAVE "CAS:PROBA", A

Записать программу с именем PROBA в кодах КОИ-8.

2.3.3. Выполнение программы

Загрузка и выполнение программ, сохраненных на НКМЛ осуществляется с помощью команд RUN "CAS:имя файла" и LOAD "CAS:имя файла", R. Например:

RUN "CAS:" - загрузить и выполнить текущую программу.;
LOAD "CAS:PROBA", R - загрузить с НКМЛ и выполнить программу PROBA;
LOAD "CAS:PRIMER", B, R - загрузить в память машинную программу PRIMER и перейти на ее выполнение.
2.4. Отладка программы
2.4.1. Вывод сообщения об ошибках

При наличии ошибки в программе выполнения программы останавливается и на экране появляется сообщение об ошибке, указывается тип ошибки и номер строки, где эта ошибка обнаружилась. Например:

НЕОПРЕДЕЛЕННЫЙ НОМЕР СТРОКИ В 40

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

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

Ошибка ПЕРЕПОЛНЕНИЕ возникает, когда абсолютная величина числового значения одинарной точности и превышает 1.7E+38, а абсолютная величина числового значения двойной точности превышает 1.7E+38. После этого сообщения выполнение программы останавливается. Если сразу после ввода строки выдается ошибка ПЕРЕПОЛНЕНИЕ, то эти строки в программу не записываются. Например:

    10 A = 1E20 * 1E20
    20 D# = 1D200 * 1D200
    ПЕРЕПОЛНЕНИЕ
    Ok
    30 PRINT A, D#
    
    RUN
    ПЕРЕПОЛНЕНИЕ В 10
    Ok

Антипереполнение чисел с плавающей точкой возникает, когда абсолютная величина числового значения одинарной точности меньше 0.9-38, а двойной точности меньше 0.2-38. Когда переменной присваиваются константа, абсолютное значение которой меньше этой величины, то сообщение об ошибке не печатается, результат принимается нулевым и выполнение программы продолжается.

Деление на ноль обрабатывается идентично переполнению чисел с плавающей точкой. Когда делитель равен нулю печатается сообщение ДЕЛЕНИЕ НА 0.

2.4.2. Средства отладки программ

Обычно большинство программистов тратит около 40% своей работы на написание программы, а 60% своего времени обнаруживает, почему программа не работает, т.е. тратит время на отладку программы.

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

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

Важной сервисной функцией, обеспечивающей отладку программы, обладает команда TRON, включающая трассировку программы. С помощью трассировки выполнение программы может быть проверено строка за строкой, что позволяет определить точное местонахождение ошибки. Трассировка включается командой TRON и выключается командой TROFF. После команд TRON и RUN на экране терминала появляются номера строк каждого исполненного оператора и выводимые на экран значения переменных и констант.

Можно обнаружить ошибки с помощью моделирования ошибок и программ ловушки ошибки. Обычно ошибки останавливают выполнение программы, но если встречается смоделированная ошибка, то оператор ON ERROR GOTO передает выполнение программы по определенному номеру строки и запрещает вывод сообщения об ошибке, отличительного от заданного пользователем. Можно написать подпрограмму обрабатывающую заданную ошибку. Например:

    10 ON ERROR GOTO 100 : REM УХОД ПО ОШИБКЕ НА СТРОКУ 100
    20 INPUT X
    30 PRINT SQR(X)
    40 GOTO 20
    100 PRINT "АРГУМЕНТ НЕ МОЖЕТ БЫТЬ ОТРИЦАТЕЛЬНЫМ"
    110 PRINT "ВВЕДИТЕ НОВОЕ ЗНАЧЕНИЕ"
    120 RESUME NEXT
    RUN
    ? 3
    1.73205
    ?-3
    Ok
    АРГУМЕНТ НЕ МОЖЕТ БЫТЬ ОТРИЦАТЕЛЬНЫМ
    ВВЕДИТЕ НОВОЕ ЗНАЧЕНИЕ
    ?

Оператор RESUME обеспечивает повторное выполнение программ после обнаружения и обработки ошибки. Для подпрограммы ловушки ошибки можно использовать переменные ERR и ERL, которые возвращают код ошибки и номер строки, где встретилась ошибка.

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

Небольшие куски программы можно отладить в прямом режиме. Например:

    FOR I = 1 TO 100: PRINT I, EXP(I): NEXT

Для отладки одной из ветвей программы можно использовать команду RUN с указанием номера программной строки, с которой начать выполнение. Для этой же цели можно использовать оператор GOTO в прямом режиме, указывая номер программной строки, с какой начать выполнение. Например:

    10 PRINT 1, "СОЗДАТЬ ФАЙЛ"
    20 PRINT 2, "СТЕРЕТЬ ФАЙЛ"
    30 PRINT 3, "ПЕРЕИМЕНОВАТЬ ФАЙЛ"
    40 PRINT 4, "ОТРЕДАКТИРОВАТЬ ФАЙЛ"
    50 PRINT 5, "КОНЕЦ РАБОТЫ"
    60 PRINT
    70 INPUT "ВВЕДИТЕ НОМЕР ЗАДАНИЯ =", N
    80 ON N GOSUM 1000, 2000, 3000, 4000, 5000
    90 PRINT "НЕПРАВИЛЬНЫЙ НОМЕР ЗАДАНИЯ"
    100 PRINT "ВВЕДИТЕ ЕЩЕ РАЗ"
    110 GOTO 70
    1000 REM 1 - СОЗДАТЬ ФАЙЛ
    ...
    2000 REM 2 - СТЕРЕТЬ ФАЙЛ
    ...
    3000 REM 3 - ПЕРЕИМЕНОВАТЬ ФАЙЛ
    ...
    4000 REM 4 - ОТРЕДАКТИРОВАТЬ ФАЙЛ
    ...
    5000 REM 5 - КОНЕЦ РАБОТЫ
    ...

Для отладки каждой подпрограммы используем оператор GOTO или команду RUN. Например, чтобы отладить программу, выполняющую создание файла, начните с команды RUN 1000 или GOTO 1000. Чтобы отладить программу, выполняющую редактирование файла, начните с команды RUN 4000 или GOTO 4000 и т.д.

2.5. Встроенный редактор

Интерпретатор языка Бейсик имеет встроенный редактор, используемый для изменения отдельных символов или целых строк. Команды встроенного редакторы используются для пересылки курсора, ввода, стирания или нахождения текста в пределах редактируемой строки. Большинству команд редактора предшествует целое число, которое указывает, сколько раз должна выполняться данная команда. Когда число не указано, по умолчанию принимается равным 1.

  • пересылка курсора;
  • ввод текста;
  • стирание текста;
  • замена текста;
  • конец и возобновление режима редактирования.

Введем следующие обозначения:

<см> - произвольный символ;
<текст> - строка символов произвольной длины;
[n] - целое число, по умолчанию 1;
¤ - нажатие клавиши ПРФ (код 1BH).
2.5.1. Команды пересылки курсора
<пробел> - Нажатие клавиши <пробел> пересылает курсор вправо.
Нажатие клавиши <пробел>n раз пересылает курсор на n позиций вправо. После каждого нажатия клавиши <пробел> появляется следующий символ редактируемой строки.
<>, <> - Клавиши находятся в поле дополнительных клавиш. При нажатии одной из этих клавиш курсор перемещается на одну позицию влево. Нажатие клавиш n раз пересылает курсор на n позиций вправо. После каждого нажатия одной из данных клавиш стирается один символ строки.
2.5.2. Команды ввода текста
I<текст>¤ - Вводит текст с текущей позиции курсора. Вводимые символы печатаются в терминале. Чтобы закончить ввод, следует нажать кнопку ПРФ. Если во время команды ввода нажать клавишу возврата каретки, то прекращается ввод текста и редактирование строки. Если при вводе общая длина строки превышает 255 символов, символ не печатается.
X<текст>¤ - Вводит текст в конец редактируемой строки, пересылает курсор в конец строки и включает режим ввода. Нажатие клавиши ПРФ или возврата каретки заканчивает ввод.
2.5.3. Команды стирания текста
[n]D - Стирает символы справа от курсора. Стертые символы печатаются в обратных косых черточках, и курсор располагается справа от последнего стертого символа. Если справа от курсора меньше символов, то стирается вся оставшаяся строка.
H<текст>¤ - Стирает все символы справа от курсора, а затем автоматически включает режим ввода.
2.5.4. Команды нахождения текста
[n]S<см> - Находит позицию n-го нахождения символа и курсор становится перед ним. Символ в текущей позиции курсора не рассматривается. если <см> не найден, то курсор остановится в конце строки. Все символы, рассмотренные во время поиска печатаются.
[n]K<см> - Подобна команде S, за исключением того, что все рассмотренные во время поиска символы стираются. Курсор устанавливается перед <см>, все стертые символы печатаются в обратных косых черточках.
2.5.5. Команды замены текста
[n]CS<текст> - Изменяет следующие n символов на n символов текста. После того, как n-й символ напечатан, осуществляется возврат в режим редактирования
2.5.6. Команды конца и возобновления режима редактирования
<возврат каретки> - Печатает остаток строки, сохраняет сделанные изменения и возвращается на уровень команд.
E - Сохраняет сделанные изменения и возвращается в режим редактирования. Остаток строки не печатается.
Q - Возвращается на уровень команд без сохранения изменений, которые были сделаны во время редактирования.
L - Печатает остаток редактируемой строки, и устанавливает курсор в начало строки, оставаясь в режиме редактирования.
A - Позволяет начать редактирование с начала. Восстанавливает первоначальную строку и устанавливает курсор в начало строки.
2.5.7. Переход в режим редактирования

Для того, чтобы изменить неверную строку в программе, нужно набрать:

EDIT <номер>
где:  <номер> - номер изменяемой строки.

Интерпретатор перейдет в режим редактирования, на экране будет высвечен номер строки и можно будет использовать перечисленные выше команды редактора. Например:

    EDIT 200
    200

В случае, если при выполнении программы встретится синтаксическая ошибка, режим редактирования включается автоматически. Например:

    ОШИБКА СИНТАКСИСА В 30
    30

Иногда необходимо исправить ошибки в строке, вводимой с клавиатуры. Для этого нужно перейти в режим редактирования, нажав УПР-А. В результате такого нажатия на экране появится восклицательный знак и, используя команды редактора, можно исправить строку.

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

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

Расположение поля дополнительны клавиш показано а документе "Базовые программные средства ПК8020. Системное программное обеспечение. Руководство пользователя". ПТ.00550-01 90 01.

Соответствие клавиш основной клавиатуры дополнительным клавишам приведено в табл.20.

Таблица 20
Клавиши дополнительной клавиатуры Клавиши основной клавиатуры
Графическое обозначение Текстовое обозначение
"." L
0 A
1  (возврат на шаг)
2 K
3  (пробел)
4  (возврат на шаг)
МЕНЮ 5 C
6  (пробел)
7 Q
8 S
9 X
ИЗ DEL D
ВЗ INS I
СТРН CLS H
2.5.9. Методика переписи программ с КУВТ ЯМАХА на КУВТ КОРВЕТ
  1. Записать программу на КУВТ "Ямаха" в кодах КОИ-8 на магнитофонную ленту типа МК-60.
  2. Считать записанную программу с магнитофонной кассеты на ПК8020.
  3. Отредактировать считанную программу в памяти.
  4. Сохранить ее на диске или НКМЛ.

3. Основы программирования на языке Бейсик

3.1. Ввод данных в программу

Любая программа работает с переменными, значения которых должны задаваться в программе. В отличие от других языков программирования высокого уровня язык Бейсик описывает переменные и константы неявным образом. То есть в языке Бейсик нет таких операторов как DECLARE и т.п. Тип переменной указывается специальным символом в имени переменной. В начале программы с помощью операторов DEFINT, DEFSNG, DEFDBL и DEFSTR можно задать типы переменных, имена которых начинаются с заданных букв. По умолчанию все переменные ,в имени которых нет специального символа, являются числовыми переменными одинарной точности. Так, если в начале программы расположены следующие операторы:

    DEFINT A, F-K
    DEFSNG B, C, E
    DEFDBL L-N
    DEFSTR D, O-Z

то переменные, имена которых начинаются с букв A, F, G, H, I, J и K будут целочисленными переменными; переменные, имена которых начинаются с букв B, C и E, будут переменными одинарной точности; переменные, имена которых начинаются с букв L, M и N, будут переменными двойной точности; переменные, имена которых начинаются с букв D, O, P, Q, R, S, T, U, V, W, X, Y и Z, будут строковыми переменными. И дальше в программе нет необходимости в каждом имени переменной указывать специальный символ, определяющий тип переменной.

Для ввода данных в программу языка Бейсик существует несколько способов:

  • данные, используемые в программе, могут быть заданы в самой программе или вычисляться в ней с помощью оператора присваивания LET;
  • данные в программе могут быть считаны с помощью оператора READ из таблицы данных, созданной оператором DATA;
  • данные вводятся в программу пользователя с клавиатуры во время выполнения программы с помощью операторов INPUT и LINE INPUT;
  • символ вводится в программу пользователя с клавиатуры во время выполнения программы с помощью функции INKEY¤;
  • данные вводятся в программу из файла данных с помощью операторов INPUT# и LINE INPUT#.

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

Наиболее часто переменным задают значения с помощью оператора присваивания LET. Оператор LET присваивает переменной значение выражения, заданного в левой части. Так как слово LET не обязательно, то для простоты восприятия программы слово LET опускают. Если вы зададите LET X = 14 или X = 14, то значение переменной X будет равным 14. Переменные, заданные слева от знака равенства в операторе присваивания, могут принимать любое значение. Выражение, расположенное справа от знака равенства в операторе присваивания, может быть любым числом, любой переменной или формулой (выражением), состоящей из числа переменной и знаков операции.

Рассмотрим несколько примеров присваивания разных значений переменным.

    100 I% = 4
    110 I% = I% + 1
    120 D¤ = "СТРОКА"
    130 D¤ = D¤ + D¤
    140 X = 3
    150 Y = 5
    160 Z = (X + Y) * X + 2 * (Y - X)

В программной строке 100 число является значение переменной I%.

В программной строке 110 знак "+" является знаком операции сложение в обычном математическом понимании. В этом примере к значению I%, равному 4, прибавляется 1, и полученное значение, равное 5, присваивается переменной I%.

В программной строке 120 строка "СТРОКА" является значением строковой переменной D¤.

В программной строке 130 знак "+" является знаком операции конкатенации (сцепления) строк, которая создает строку, левая часть которой - первый операнд, а правая часть - второй операнд. Строка "СТРОКА" будет сцеплена со строкой "СТРОКА" и в результате получится новая строка "СТРОКАСТРОКА", таким образом после выполнения программной строки 130 новым значением строки D¤ будет строка "СТРОКАСТРОКА".

В программных строках 140 и 150 переменной X присваивается значение, равное 3, а переменной Y - значение, равное 5. В программной строке 160 справа от знака равенства стоит формула. Значения X = 3 и Y = 5 подставляются в эту формулу, производятся вычисления с учетом скобок и приоритета операций. Полученный результат, равный 28 записывается в переменной Z. Таким образом после вычисления программной строки 160 число 28 является значением переменной Z.

Вторым способом ввода данных в программу является использование операторов DATA и READ. Оператор DATA позволяет вводить таблицы данных в программу, доступ к которым осуществляет оператор READ.

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

    10 READ X
    20 PRINT X;
    30 GOTO 10
    40 DATA 1, 2, 3, 4
    RUN
    1 2 3 4 ВНЕ DATA В 10
    Ok

Рассмотрим, как происходит выполнение этой небольшой программы:

  • выполняется программная строка 10. Указатель оператора READ указывает на первый элемент таблицы данных. Из таблицы данных, созданной оператором DATA, считывается первый элемент, который присваивается переменной X. Указатель оператора READ пересылается на следующий (второй) элемент таблицы данных. Таким образом после выполнения программной строки 10 значение переменной X равно 1;
  • выполняется программная строка 20. Значение переменной X, равное 1, выводится на экран. Точка с запятой после X указывает на то, что следующий вывод на экран будет осуществляться в ту же строку в следующую позицию с учетом того, что перед и после числа выводится пробел;
  • выполняется программная строка 30. Осуществляется переход на программную строку 10;
  • выполняется программная строка 10. Из таблицы данных, считывается второй элемент, который присваивается переменной X. Указатель оператора READ пересылается на третий элемент таблицы. Таким образом после выполнения программной строки 10 значение переменной X равно 2;
  • выполняется программная строка 20. Значение переменной X, равное 2, выводится на экран;
  • выполняется программная строка 30. Осуществляется переходна программную строку 10;
  • выполняется программная строка 10. Из таблицы данных, считывается третий элемент, который присваивается переменной X. Указатель оператора READ пересылается на третий элемент таблицы. Таким образом после выполнения программной строки 10 значение переменной X равно 3;
  • выполняется программная строка 20. Значение переменной X, равное 3, выводится на экран;
  • выполняется программная строка 30. Осуществляется переход на программную строку 10;
  • выполняется программная строка 10. Из таблицы данных, считывается третий элемент, который присваивается переменной X. Из таблицы данных считались все элементы. Таким образом после выполнения программной строки 10 значение переменной X равно 4;
  • выполняется программная строка 20. Значение переменной X, равное 4, выводится на экран;
  • выполняется программная строка 30. Осуществляется переход на программную строку 10;
  • выполняется программная строка 10. Из таблицы данных были ранее считаны все элементы и так как указатель оператора READ не указывает ни на какой элемент таблицы данных, то выдается сообщение об ошибке ВНЕ DATA В 10.

Чтобы избежать этой ошибки, необходимо либо программно проследить за соответствием количества элементов READ, либо в программу вставить оператор REATORE, который пересылает указатель оператора READ на первый элемент таблицы данных, созданной операторами DATA. А если в операторе RESATORE указан номер строки, то пересылает указатель оператора READ на первый элемент оператора DATA, стоящего в этой программной строке.

Чтобы считать данные из таблицы элементов, созданной оператором DATA, необходимо сделать следующее дополнение к программе:

    25 IF X = 4 THEN RESTORE
    RUN
    1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 <СТОП>
    СТОП В 30
    Ok

Для остановки выполнения программы нажимается клавиша СТОП.

Если программу дополнить следующими программными строками:

    25 IF X = 8 THEN RESTORE 50
    50 DATA 5, 6, 7, 8

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

    1 2 3 4 5 6 7 8 5 6 7 8 5 6 7 8 5 6 <СТОП>

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

    10 DATA 8, 4, 5, 7, -3, -8, 4, 1000
    30 K = 0
    40 READ X
    50 IF X = 1000 THEN GOTO 90
    60 K = K + 1
    70 S = S + X
    80 GOTO 40
    90 PRINT S, S / K, K
    100 END

В этой программе необходимо найти сумму и среднее значение чисел +8, +4, +5, +7, -3, -8, +4. Число 1000 - фиктивное значение. Когда оно будет прочитано, программа напечатает значение S (сумма), S / K (среднее значение) и K (количество чисел). K считает числа, которые должны быть просуммированы. Счетчик меняется только после того, как будет определено, что прочитано не фиктивное значение, т.е. меньше 1000.

Фиктивное значение может быть расположено в отдельном операторе DATA, чтобы можно было изменить только обрабатываемое значение.

Оператор READ может одновременно читать несколько значений. Значения из оператора DATA читаются в том же порядке, в каком выполняются в программе операторы READ.

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

    10 DIM CHISLO(15), STROKA¤(3, 3)
    20 DATA 1, 2, 3, 4, 5, 6, 7, 8
    30 DATA 9, 10, 11, 12, 13, 14, 15, 16
    40 FOR I% = 0 TO 15
    50 READ CHISLO(I%)
    60 NEXT
    70 FOR I% = 0 TO 3
    80 FOR J% = 0 TO 3
    90 READ STROKA¤(I%, J%)
    100 PRINT STROKA¤(I%, J%),
    110 NEXT
    120 PRINT
    130 NEXT I%
    140 DATA МОСКВА, РИГА, ТАЛЛИН, ВИЛЬНЮС
    150 DATA КИШИНЕВ, МИНСК, КИЕВ, БАКУ
    160 DATA ТБИЛИСИ, ЕРЕВАН, ТАШКЕНТ, ФРУНЗЕ
    170 DATA АШХАБАД, АЛМА-АТА, ДУШАНБЕ, ЛЕНИНГРАД
    180 PRINT
    190 FOR J% = 0 TO 3
    200 FOR I% = 0 TO 3
    210 PRINT STROKA¤(I%, J%),
    220 NEXT i%
    230 PRINT
    240 NEXT
    250 PRINT
    260 FOR I% = 0 TO 3
    270 PRINT CHISLO(I%), STROKA¤(I%, J%)
    280 NEXT
    RUN
    МОСКВА     РИГА        ТАЛЛИН     ВИЛЬНЮС
    КИШИНЕВ    МИНСК       КИЕВ       БАКУ
    ТБИЛИСИ    ЕРЕВАН      ТАШКЕНТ    ФРУНЗЕ
    АШХАБАД    АЛМА-АТА    ДУШАНБЕ    ЛЕНИНГРАД

    МОСКВА     КИШИНЕВ     ТБИЛИСИ    АШХАБАД
    РИГА       МИНСК       ЕРЕВАН     АЛМА-АТА
    ТАЛЛИН     КИЕВ        ТАШКЕНТ    ДУШАНБЕ
    ВИЛЬНЮС    БАКУ        ФРУНЗЕ     ЛЕНИНГРАД

    1          МОСКВА
    2          МИНСК
    3          ТАШКЕНТ
    4          ЛЕНИНГРАД
    Ok

Оператор DATA можно располагать в любой части программы. Оператор DATA можно разделить на части. Рекомендуется не разбрасывать операторы DATA по программе. Лучше всего поместить их все вместе в начале или недалеко от конца программы, но до выполнения оператора END.

Часто бывает необходимо вводить данные с консоли в программу во время выполнения. Для этой цели используются операторы INPUT и LINE INPUT. Когда в программе встречается оператор INPUT или LINE INPUT, выполнение программы приостанавливается, на экране появляется знак вопроса, и программа ждет данных. Оператор INPUT позволяет выводить на экран подсказку для пользователя. Вводимые данные присваиваются переменным, заданным в операторе INPUT. Вводимые данные могут быть строковыми и числовыми. При несответствии типа вводимых данных и переменных в операторе INPUT на экран выводится сообщение ?ПОВТОРИТЕ ВВОД, и программа ждет ввод данных.

Может быть так, что какие-либо данные в программе будут меняться, например, изменяется размерность массива, начальное или конечное значение счетчика и т.п., в этих случаях удобно применять оператор INPUT.

Следующую программа иллюстрирует этот случай.

    10 INPUT "Размерность массива="; N
    20 DIM NAME¤(N), MAS(N)
    30 FOR I = 1 TO N
    40 PRINT I; 
    50 INPUT "Фамилия"; NAME¤(I)
    60 INPUT "Оклад"; MAS(I)
    70 NEXT
    80 PRINT
    90 FOR I = 1 TO N
    100 IF MAS(I) > 100 THEN PRINT I, NAME¤(I), MAS(I)
    110 NEXT
    RUN
    Размерность массива=5
    1 Фамилия ? Иванов
    Оклад ? 150
    2 Фамилия ? Петров
    Оклад ? 80
    3 Фамилия ? Антонов
    Оклад ? 175
    4 Фамилия ? Смирнов
    Оклад ? 105
    5 Фамилия ? Кузнецов
    Оклад ? 95

    1 Иванов  150
    3 Антонов 175
    4 Смирнов 105
    Ok

Если в программе необходимо вводить строки, то рекомендуется использовать оператор LINE INPUT. Этот оператор присваивает строковой переменной строку данных длиной до 254 символов. Все введенные данные до возврата каретки присваиваются строковой переменной. В отличие от INPUT оператор LINE INPUT не печатает знак вопроса, если он не является частью строки напоминания.

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

    ...
    100 PRINT "Нажмите клавишу <Возврат каретки>"
    110 A¤ = INKEY¤
    140 IF A¤ = CHR¤(&H0D) THEN GOTO 140
    130 GOTO 110
    ...

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

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

    ...
    100 PRINT 1; "СОЗДАТЬ ФАЙЛ"
    110 PRINT 2; "СТЕРЕТЬ ФАЙЛ"
    120 PRINT 3; "ПЕРЕИМЕНОВАТЬ ФАЙЛ"
    130 PRINT 4; "ОТРЕДАКТИРОВАТЬ ФАЙЛ"
    140 PRINT 5; "КОНЕЦ РАБОТЫ"
    150 SM¤ = INKEY¤
    160 IF SM¤ = "" THEN GOTO 150
    170 SM = VAL(SM¤)
    180 ON SM GOSUB 220, 300, 400, 500, 600
    190 PRINT "Вы ввели неправильный номер задания"
    200 PRINT "Попробуйте еще раз"
    210 GOTO 100
    220 REM 1 - Создать файл
    ...
    300 REM 2 - Стереть файл
    ...
    400 REM 3 - Переименовать файл
    ...
    500 REM 4 - Отредактировать файл
    ...
    600 REM 5 - Конец работы
    610 PRINT "КОНЕЦ РАБОТЫ"
    620 END

В программу данные могут вводиться и из файла данных, используя операторы INPUT# и LINE INPUT#. Предположим, что ранее был создан файл с последовательным доступом FILE.DAT. Следующая программа считывает данные из этого файла, присваивает переменной X и если считанное значение меньше нуля, то оно выводится на экран монитора.

    10 OPEN "I", #1, "FILE.DAT"
    20 IF EOF(1) THEN END
    30 INPUT #1, X
    40 IF X < 0 THEN PRINT X 
    50 GOTO 20

Если из файла данных требуется считывать длинные строковые значения, то рекомендуется использовать LINE INPUT#.

3.2. Встроенные функции
3.2.1. Математические функции

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

ABS - абсолютное значение числа;
ATN - арктангенс числа;
COS - косинус угла;
EXP - экспонента числа;
FIX - усечение дробного числа до целого;
INT - самое большое целое число меньше или равное аргументу;
LOG - натуральный логарифм числа;
RND - случайное число в диапазоне между 0 и 1;
SGN - знак числа;
SIN - синус угла;
SQR - квадратный корень числа;
TAN - тангенс угла.

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

    10 INPUT X
    20 PRINT X, SIN(X), COS(X), TAN(X), 1 / TAN(X)
    30 PRINT SIN(SQR(X) + 1)

Эта программа выводит на экран число, его синус, косинус, тангенс, котангенс, а также синус квадратного корня числа X плюс 1. Число X вводится с клавиатуры.

Следующая программа, использующая встроенные функции, находит числа I, J и K, для которых I * I + J * J = K * K.

    5 N = 100
    10 FOR I = 1 TO N - 1
    20 FOR J = I + 1 TO N
    30 K = SQR(I * I + J * J)
    40 IF K <> INT(K) THEN GOTO 60
    50 PRINT I, J, K
    60 NEXT J, I
    70 END

Аргументы в тригонометрических функциях задаются в радианах. Для перевода градусов в радианы результат умножается на PI/180. Важно отметить, что при переводе из радиан в градусы и обратно, чем точнее величина PI, тем точнее будет выполнено преобразование. Для справки, более точное число PI = 3.1415926558. В языке Бейсик нет встроенных функций секанса, косеканса, котангенса и т.д., но их можно вычислить, используя существующие в языке встроенные функции:

SEC(X) = 1 / COS(X) - секанс
CSC(X) = 1 / SIN(X) - косеканс
COT(X) = 1 / TAN(X) - котангенс
ARCSIN(X) = ATN(X / SQR(1 - X * X)) - арксинус
ARCCOS(X) = 1.570796 - ATN(X / SQR(1 - X * X)) - арккосинус
ARCSEC(X) = ATN(SQR(1 - X * X)) + (X < 0) * 3.141593 - арксеканс
ARCCSC(X) = ATN(1 / SQR(1 - X * X)) + (X < 0) * 3.141593 - арккосеканс
ARCCOT(X) = 1.57096 - ATN(X) - арккотангенс
SINH(X) = (EXP(X) - EXP(-X)) / 2 - гиперболический синус
COSH(X) = (EXP(X) + EXP(-X)) / 2 - гиперболический косинус
TANH(X) = (EXP(X) - EXP(-X)) / (EXP(X) + EXP(-X)) - гиперболический тангенс
SECH(X) = 2 / (EXP(X) + EXP(-X)) - гиперболический секанс
CSCH(X) = 2 / (EXP(X) - EXP(-X)) - гиперболический косеканс
COTH(X) = (EXP(X) + EXP(-X)) / (EXP(X) - EXP(-X)) - гиперболический котангенс
ARCSINH(X) = LOG(X + SQR(X * X + 1)) - арксинус гиперболический
ARCCOSH(X) = LOG(X + SQR(X * X - 1)) - арккосинус гиперболический
ARCTAN(X) = LOG((1 + X) / (1 - X)) / 2 - арктангенс гиперболический
ARCSECH(X) = LOG((1 + SQR(1 - X * X)) / X) - арксеканс гиперболический
ARCCSCH(X) = LOG((1 + SGN(X) * SQR(1 + X * X)) / X) - арккосеканс гиперболический
ARCCOTH(X) = LOG((X + 1) / (X - 1)) / 2 - арккотангенс гиперболический

Чтобы использовать эти функции, закодируйте их операторы DEF FN. Например: арксинус гиперболический DEF FNAS(x) = LOG(X + SQR(X * X + 1)), затем обратитесь с нему, когда необходимо Z = FNAS(Y).

Натуральные логарифмы используются во многих задачах, но иногда необходимо вычислить десятичный логарифм. Значение десятичного логарифма можно получить, умножив значение натурального логарифма на 0.43429448. Например:

    100 LN = LOG(X)
    110 LD = LN * 0.43429448

В этом примере LN - натуральный логарифм числа X, LD - десятичный логарифм числа X.

При решении некоторых задач, особенно статистических игровых и обучающих, может потребоваться, чтобы числа задавались случайным образом. Для получения случайных чисел используются функция RND, которая генерирует псевдослучайное число в диапазоне между 0 и 1.

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

3.2.2. Перевод переменных одного типа в другой

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

  • Функция VAL возвращает числовое значение строкового аргумента, если их символы строки цифры;
  • Функция STR¤ возвращает в строку десятичных цифр, заданных в качестве аргумента;
  • Функция HEX¤ возвращает в строку шестнадцатеричных цифр, десятичной эквивалент которых задан в качестве аргумента;
  • Функция OCT¤ возвращает в строку восьмеричных цифр, десятичный эквивалент в которых задан в качестве аргумента;
  • Функция BIN¤ возвращает строку двоичных цифр, десятичный эквивалент которых задан в качестве аргумента;
  • Функция CINT переводит числовой аргумент целое число округлением дробной части;
  • Функция CSNG переводит числовой аргумент в число одинарной точности;
  • Функция CDBL переводит числовой аргумент к числу двойной точности.
3.3. Операторы цикла

Походу выполнения программы иногда возникает необходимость выполнить группу операторов в несколько раз. Рассмотрим следующую задачу: необходимо создать таблицу из натуральных чисел от 1 до 100 квадратов, кубов и корней этих чисел. То есть надо вычислить эти значения и результаты вывести на печатающее устройство. Это можно запрограммировать несколькими способами.

Первый способ.

    1 LPRINT "ЧИСЛО"; TAB(10); "КОРЕНЬ"; TAB(20); "КВАДРАТ"; TAB(30); "КУБ"
    10 LPRINT 1; TAB(10); SQR(1); TAB(20); 1^2; TAB(30); 1^3
    20 LPRINT 2; TAB(10); SQR(2); TAB(20); 2^2; TAB(30); 2^3
    ...
    1000 LPRINT 100; TAB(10); SQR(100); TAB(20); 100^2; TAB(30); 100^3

Таким образом для программирования этого задания потребовалась 101 программная строка. Программная строка 1 печатает заголовок таблицы. Следующие 100 строк вычисляют и выводят на печатающее устройство само число его квадратный корень, квадрат и куб. Каждая программная строка обрабатывает конкретную константу от 1 до 100.

Второй способ.

При программировании первым способом каждое значение, которое надо вычислить и напечатать, задается в программной строке как константа. Зададим эти значения как переменные и будем присваивать этим переменам конкретные значения. Используя условный оператор IF, который проверяет заданное условие и оператор безусловного перехода GOTO создадим цикл.

    10 LPRINT "ЧИСЛО"; TAB(10); "КОРЕНЬ"; TAB(20); "КВАДРАТ"; TAB(30); "КУБ"
    20 X = 1
    30 LPRINT X; TAB(10); SQR(X); TAB(20); X^2; TAB(30); X^3
    40 X = X + 1
    40 IF X < 100 THEN GOTO 30

Таким образом для программирования этого же задания потребовалось пять программных строк. Программная строка 10 печатает заголовок таблицы. Программная строка 20 присваивает переменный X начальное значение, равное 1. Программная строка 30 вычисляет и выводит на печать число, его корень, квадрат и куб. Программная строка 40 увеличивает значение переменной на 1. В программной строке 50 проверяет значение переменной X и если оно меньше или равно 100, то осуществляется переход на программную строку 30, и переменная X с новым значением продолжает обрабатываться. А если значение переменной больше 100, то выполнение программы прекращается. Следующие два способа иллюстрируют автоматическую организацию цикла.

Третий способ.

Создадим автоматический цикл использования операторы FOR ... NEXT.

    10 LPRINT "ЧИСЛО"; TAB(10); "КОРЕНЬ"; TAB(20); "КВАДРАТ"; TAB(30); "КУБ"
    20 FOR X = 1 TO 100
    30 LPRINT X; TAB(10); SQR(X); TAB(20); X^2; TAB(30); X^3
    40 NEXT

Таким образом, для программирования этого задания потребовалось четыре программные сроки. Программная строка 10 печатает заголовок таблицы. Программная строка 20 является заголовком цикла, в котором указывается начальное, конечное значение счетчика цикла и шаг цикла. В этом примере шаг цикла, равный 1 задан по умолчанию. Шаг цикла - это число, которое прибавляется к значению счетчика. Программные сроки следующие, за оператором FOR, выполняются до тех пор, пока не встретится оператор NEXT. Зачем значению счетчика прибавляется значение шага. Выполняется проверка счетчика на конечное значение. И в зависимости от этого, цикл повторяется или заканчивается и выполняются операторы, следующие за оператором NEXT. Таким образом, программная строка 30, выполняющая вычисления квадрата, куба и корня и выводящая эти значения на печать, выполняется 100 раз. Переменная счетчика X увеличивается на 1 автоматически, и каждый раз программная строка 30 обрабатывает новое значение переменной X, которая используется в этой строке для вычисления корня, квадрата или куба. Использование переменной счетчика X программной строке 30 разрешено, так как в этой строке не изменяется само значение переменной X.

Использование циклов значительно экономит память. Циклы FOR ... NEXT могут быть вложены до любого уровня. Уровень вложения зависит от свободной памяти. Каждый вложенный оператор FOR должен иметь свои имена переменных в качестве счетчика. Оператор NEXT для внутреннего цикла должен выполняться раньше оператора NEXT для внешнего цикла.

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

При организации циклов с помощью операторов FOR ... NEXT могут встречаться следующие ошибки:

  • отсутствует оператор NEXT;
  • не указано ключевое слово FOR. Например:
        1020 I = 1 TO 35
  • случайно вложены циклы, имеющие одинаковую переменную в качестве счетчика цикла, например:
        100 FOR I = 1 TO 20
        110 FOR I = 19 TO 1 STEP - 2
        120 PRINT I
        130 NEXT i
        140 NEXT
  • внутри цикла присваивается переменная, имя которой такое же, что и счетчик цикла, например:
        10 A = 20
        20 FOR R = 1 TO 100 STEP 0.5
        30 R = 180
        40 Y = R / A
        50 PRINT Y
        60 NEXT R
  • циклы некорректно вложены один в другой, например:
        10 FOR X = 1 TO 6
        20 FOR Y = 1 TO 8
        30 A = MAS(X, Y)
        40 PRINT A
        50 NEXT X
        60 NEXT Y

Нельзя забывать, что цикл FOR I = 0 TO N будет выполняться N + 1 раз а не N.

3.4. Условный оператор и оператор безусловного перехода

Во многих случаях требуется, чтобы программа "принимала решения". Например, вы хотите проверить, какое-либо условие и в зависимости от этого выполнить те или иные операции. Оператор IF позволяет вам сделать это. Например:

    100 IF A <> 5 THEN GOTO 360 ELSE PRINT 5

Оператор IF имеет 3 части, часть IF (в примере IF A <> 5), часть THEN (в примере THEN GOTO 360) и часть ELSE (в примере ELSE PRINT 5). Часть IF в содержит логическую формулу А части THEN и ELSE - один или несколько операторов, разделенных двоеточием. Часть ELSE может быть совсем опущена. При выполнении оператора IF сначала вычисляется логическая формула. Если это значение истинно, то выполняется часть THEN, а если значение ложно, то часть ELSE, если она существует, или следующая программная строка. В данном примере будет осуществлен переход на программную сроку 360, если значение переменной A не равно 5. Если значение переменой А равно 5, то будет печататься 5 с выполняться следующая программная строка.

    10 INPUT "Введите число (0-19)"; N
    20 IF N < 5 THEN PRINT "Должно быть больше"
    30 IF N > 5 THEN PRINT "Должно быть меньше"
    40 IF N <> 5 THEN GOTO 10
    50 PRINT "Вы угадали число"
    RUN
    Введите число (0-19)? 7
    Должно быть меньше
    Введите число (0-19)? 4
    Должно быть больше
    Введите число (0-19)? 5
    Вы угадали число
    Ok

В программной строке 10 осуществляется в выход числа в программу. Программная строка 20 проверяет меньше ли пяти введенное число. Если число меньше, то печатается Сообщение "Должно быть больше". Подобным образом следующая строка проверяет больше ли пяти введенное число, и если больше, то печатается сообщение "Должно быть меньше". Программная строка 40 проверяет введенное число на неравенство пяти, то осуществляется переход на программную строку 10 и программа продолжает выполняться сначала. Если же введенное число равно пяти, то печатается сообщение "Вы угадали число" и выполнение программы заканчивается.

В логической части IF могут быть использованы операции отношения: равно, не равно, меньше, больше, меньше или равно, больше или равно, и логические операции: AND, OR, XOR, NOT, EQU и IMP. Переменные в логической формуле оператора IF могут быть как числовыми, так и строковыми. Большинство операторов программа выполняется последовательно, т.е. интерпретатор начиная с наименьшего номера программной строки, выполняет последовательно программные сроки в порядке увеличения их номеров. Но часто бывает необходимо прервать последовательное выполнение, например, создавая цикл, в программе выполняется определенное количества повторений выполнения некоторых программных срок. Оператору GOTO передает управление следующей программе строке, номер которой задается оператором GOTO. Например, если заданная GOTO 100, то следующий выполняться будет программная строка с номером 100.

Оператор ON ... GOTO позволяет использовать значение переменной или формулы для выбора значения из группы значений. Например, оператор ON VAR GOTO 100, 200, 300, 400 передает управление программой строке 200, если значение VAR равно 2 и т.д. То есть управление передается N-ой программной строке в заданном списке номеров программных срок. Если значение VAR - не целое число, то оно округляется. Если значение переменной равно нулю или больше количества номеров строк в списке, то будет выполняться следующая программная строка. Если значение переменной отрицательное или больше 255, то выдается сообщение НЕВЕРЕН ВЫЗОВ ФУНКЦИИ. Программная строка ON VAR GOTO 100, 200, 300, 400 эквивалентна следующим программным срокам:

    10 IF VAR = 1 THEN GOTO 100
    15 IF VAR = 2 THEN GOTO 200
    20 IF VAR = 3 THEN GOTO 300
    15 IF VAR = 4 THEN GOTO 400
3.5. Работа со строковыми данными

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

  • присвоить строковое значение строковой переменной;
  • создавать строковые формулы, которые создают новые строки.

Строковая константа - это группа символов, заключенная в кавычки (""). Кавычки не могут использоваться внутри строковой константы. В качестве строковых констант могут использоваться любые символы КОИ-8, имеющие графическое представление. В частности, можно использовать специальные символы (такие как +, =, ?, / и др.), цифры, прописные и строчные буквы русского и латинского алфавита:

    PRINT "ПРОГРАММА PROGRAM программа"

Чтобы включить строковые данные кавычки или символы, не имеющие графического представления, используйте функцию CHR¤.

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

Специальный символ "¤" описывает строковую переменную. Если строковый переменой не было присвоено значение, то эта строка пустая. Новое значение строкой переменой может быть присвоено оператором LET, например:

    10 LET A¤ = "STRING"
    20 PRINT A¤
    30 LET A¤ = "СТРОКА"
    40 PRINT A¤
    RUN
    STRING
    СТРОКА

В этом примере значения, присваиваемые переменной A¤ заключаются в кавычки. Если строковой переменной будет присвоено числовое значение или числовой строковое, то появится сообщение об ошибке.

Примеры строковых переменных:

    STROKA¤ = "Next line - Следующая строка"
    CHISLO¤ = "40 * 1.723E+5"
    NAME¤ = "Александр Сергеевич Пушкин"

Для присвоения новых значений строковым переменных можно использовать операторы READ, DATA и INPUT, а также как и для числовых значений.

Язык Бейсик позволяет использовать массивы строковых переменных таким же образом, как и массивы числовых переменных. Так, если вы пишете программу, которая обрабатывает, например, ведомости заработной платы, то необходимо вначале программы использовать оператор DIM NAME¤(50), который размещает 51 строковую переменную, которые названы NAME¤(0), NAME¤(1), ..., NAME¤(50). Эти переменные могут быть использованы в программе, подобно простым переменным.

Следующая программа получает имена с консоли, сортирует их по алфавиту, используя простую пузырьковую сортировку. Оператор DEFSTR S задает всем переменным имена которых начинаются на S строковый тип.

    10 DEFSTR S
    20 INPUT "Количество имен"; N
    30 DIM S(N)
    40 REM Ввод имен с консоли
    50 FOR I = 1 TO N
    55 PRINT I;
    60 INPUT "Имя"; S(I)
    70 NEXT
    80 REM Сортировка имен
    90 FOR I = 1 TO N - 1
    100 FOR J = I + 1 TO N
    110 IF S(I) > S(J) THEN SWAP S(I), S(J)
    120 NEXT J, I
    130 REM Вывод полученного списка
    135 PRINT
    140 PRINT "Отсортированный список имен"
    150 PRINT 
    160 FOR I = 1 TO N
    170 PRINT S(I)
    180 NEXT
    190 END
    RUN
    Количество имен? 6
    1 Имя ? Michael
    2 Имя ? William
    3 Имя ? Daniel
    4 Имя ? Richard
    5 Имя ? Philip
    6 Имя ? Stephen

    Отсортированный список имен

    Daniel
    Michael
    Philip
    Richard
    Stephen
    William
    Ok

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

В языке Бейсик существуют следующие строковые операции:

  • Конкатенация или сцепление строк;
  • операции сравнения строк;
  • встроенные функции.

Для работы со строковыми данными используются следующие встроенные функции:

  • функция ASC возвращает код КОИ-8 первого символа строковой переменной
        PRINT ASC("S"), ASC("Ф")
        83            230
  • функция CHR¤ возвращает символ в заданном кодом, КОИ-8
        CRLF¤ = CHR¤(13) + CHR¤(10)
        PRINT CHR¤(&H74) + CHR¤(234)
  • функция LEN возвращает длину строки, то есть число символов строковой переменной
        PRINT LEN("BASIC-программа")
        15
  • функция LEFT¤ возвращает самые левые символы строковой переменной
        PRINT LEFT¤("BASIC-программа", 5)
        BASIC
  • функция RIGHT¤ возвращает самые правые символы строковой переменной
        PRINT RIGHT¤("BASIC-программа", 9)
        программа
  • функция MID¤ возвращает часть строки в строке, начинается заданной позиции
        PRINT MID¤("ПРОГРАММА", 4, 5)
        программа
  • функция VAL возвращает числовое значение строковой переменной
        PRINT VAL("35") + VAL("15")
        50
  • функция STR¤ возвращает в строковые значение числовой переменной
        PRINT STR¤(35) + STR¤(15)
        3515
  • функция HEX¤ переводит число в шестнадцатеричную строку
        PRINT HEX¤(42)
        2A
  • функция OCT¤ переводит число восьмеричную строку
        PRINT OCT¤(48)
        60
  • функция SPACE¤, возвращает строку пробелов
        PRINT SPACE¤(5); "ПРОБЕЛ"; SPACE¤(5); "SPACE"
        ПРОБЕЛ     SPACE
  • функция STRING¤ возвращает повторенный заданное число раз символ строковой переменной
        PRINT STRING¤(5), 42; "BASIC"; STRING¤(5, 47)
        *****BASIC/////
  • функция INSTR возвращает позицию части строки в строке, начиная с заданной позиции
        PRINT INSTR("ПРОГРАММА", "М")
        7
  • переменная INKEY¤ возвращает символ в считанный с клавиатуры;
  • функция INPUT¤ возвращает в строку считанную из файла или с клавиатуры.

Перед использованием строковых данных для очистки строковых переменных и увеличения строкового пространства рекомендуется использовать оператора CLEAR в начале программы.

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

3.6. Вывод на экран и печатающее устройство

Язык Бейсик позволяет очень просто выводить на экран терминала или печатающее устройство, числовое или строковое значение. Для этого язык Бейсик предоставляет следующие возможности. Для вывода на экран используются оператор PRINT, а для вывода на печатающее устройство - оператор LPRINT. В дальнейшем будем рассматривать только оператора PRINT, так как оператор LPRINT обладает аналогичными возможностями. Оператор PRINT можно использовать для:

  • вывода текущего значения переменных и констант:
        PRINT X; Y; Z
        PRINT 1; -2, 3.6
        PRINT X, O, F¤
  • выполнения вычислений и вывода их результатов:
        PRINT I, EXP(I), SQR(I), I^2 + 1^4
        PRINT 1 / SIN(X + Y * Z)
  • вывода текстовых сообщений:
        PRINT "ПРОГРАММА РЕШЕНИЯ КВАДРАТНОГО УРАВНЕНИЯ"
        PRINT "КВАДРАТ ЧИСЛА"; Y; "РАВЕН"; Y * Y

Оператор PRINT без параметров вызывает печать пустой строки.

Оператор PRINT, обладая большой гибкостью, позволяет получить разные форматы вывода. Позиция каждого выводимого элемента определяется знаком препинания в списке выражения оператора PRINT. Выводимая строка делится на зоны вывода по 14 символов каждая. Управление использованием зон производится с помощью запятых в списке выражений. Запятая указывает о том, что последующее значение будет выводиться с начала следующей зоны. Если все зоны вывода уже заполнены, то сначала 1 зоны следующей строки. Точка с запятой в списке выражения указывает о том, что следующее значение будет выводиться со следующей позиции с учетом пробелов при выводе чисел. Так за числом всегда следует пробел. Положительному числу предшествует пробел, а отрицательному числу - знак минус. Строки, заключенные в кавычки выводятся без изменений. Поэтому следующие операторы дадут различные результаты. Например:

    10 PRINT 1; 2
    20 PRINT "1"; "2"
    30 PRINT 10, 20
    40 PRINT "10", "20"
    RUN 
     1  2
    12
     10           20
    10           20

Если запятая или точка с запятой заканчивают список выражений, то следующий оператор, PRINT (или INPUT) продолжит вывод в той же строке через соответствующее число пробелов, в противном случае вывод продолжается со следующей строки. Например:

    10 PRINT "A"
    20 GOTO 10
    RUN 
    A
    A
    A
    A
    A
    ...

Изменив программную строку 10 (добавим запятую в конец) получим результат

    10 PRINT "A",
    20 GOTO 10
    RUN 
    A             A             A             A             A             A
    A             A             A             A             A             A
    A             A             A             A             A             A
    ...

Если заменить в программной строке 10 знак "," на ";" получим результат

    10 PRINT "A";
    20 GOTO 10
    RUN 
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    ...

Оператор PRINT без параметров можно использовать для включения пустой строки, если необходимо разделить получение результаты, или для перехода на новую строку. Например:

    10 FOR I = 1 TO N
    20 FOR J = 1 TO N
    30 PRINT X(I, J)
    40 NEXT
    50 PRINT
    60 NEXT I

Программная строка 50 необходима для того, чтобы После вывода значения X(I, J) следующее значение начало выводиться в следующей строке и так далее.

Для формирования выходной строки в языке Бейсик существуют следующие средства:

  • функция TAB позволяет выводить заданные позиции строки терминала, требуемую информацию;
  • функция SPC целых выводит заданное число пробелов в строке;
  • функция SPACE возвращает в строку, состоящую из заданного числа пробелов;
  • оператор WIDTH устанавливает ширину строки терминалов, то есть задает правую границу экрана;
  • Оператор PRINT USING позволяет выводить в строковое и числовые данные, используя формат, заданный в операторе. Оператор PRINT USING определяет правовое выражение, выводит знак "+" или "-" в начале или в конце числа, выводит числа в экспоненциальном формате и т.п.

Иногда в программе может потребоваться очистить экран перед выводом определенной информации. Для этой цели используется оператор PRINT в следующим образом:

    PRINT CHR¤(12)

где 12 (или &H0C) - код очистки экрана

Для установки текстового курсора в требуемую позицию рекомендуется использовать оператор LOCATE.

3.7. Работа с подпрограммами, написанными на языке Бейсик

В языке Бейсик можно организовать подпрограмму так, что различные программные сегменты будут выступать в роли программ. Для обращения к таким подпрограммам используется оператор GOSUB. Оператор RETURN возвращает управление из подпрограммы обратно в вызывающую программу. Программа продолжает выполняться с оператора, следующего за оператором GOSUB. Подпрограмма может содержать несколько операторов RETURN для возврата из различных точек подпрограммы. В программе может быть любое количество подпрограмм. Подпрограмма может обратиться к другой подпрограмме. Подпрограмма всегда должна возвращать управление вызывающей программе. Разрешается любая глубина вызова подпрограмм, однако необходимо следить за тем, чтобы возврат из подпрограммы осуществлялся в той же последовательности, что и вызовы подпрограмм. Подпрограммы могут находиться в любом месте программы. Часто используемые подпрограммы рекомендуется размещать в начале программы. Рассмотрим пример использования оператора GOSUB на программе получения простых числе.

    10 REM Программа получения простых чисел
    20 INPUT "СКОЛЬКО ВЫ ХОТИТЕ ПОЛУЧИТЬ ПРОСТЫХ ЧИСЕЛ =="; N
    30 DIM X(N)
    40 X(1) = 1
    50 X(2) = 2
    60 X(3) = 3
    70 X(4) = 5
    80 Y = 5
    90 I = 3
    100 GOSUB 500
    110 Y = Y + 2
    120 GOSUB 500
    130 Y = Y + 4
    140 IF I < N THEN GOTO 100
    150 GOTO 600
    500 REM Подпрограмма
    510 FOR J = 4 TO 4
    520 Z = X(J)
    530 IF Z * Z > Y THEN GOTO 570
    540 P = Y - INT(Y / Z) * Z
    550 IF R = 0 THEN RETURN
    560 NEXT J
    570 I = I + 1
    580 X(I) = Y
    590 IF I < N THEN RETURN
    600 REM Вывод полученного массива простых числе на экран
    610 PRINT "Следующий список содержит "; N; ", простых чисел"
    620 PRINT
    630 K = 0
    640 FOR I = 1 TO N
    650 PRINT TAB(7 * K); X(I);
    660 K = K + 1
    670 IF K < 9 THEN GOTO 700
    680 K = 0
    690 PRINT
    700 NEXT I
    710 END

Если в программе к подпрограмме обращаются только один раз, то рекомендуется использовать не оператор GOSUB, а оператор GOTO.

С помощью оператора ON ... GOSUB можно обратиться к одной из нескольких заданных программ. Переход осуществляется в зависимости от значения, указанного после ключевого слова ON. В операторе после ключевого слова ON может использоваться переменная или выражение. В списке после ключевого слова GOSUB может быть любое количество номеров строк. Некоторые из них могут повторяться. Если значение переменной не является целым числом, то используется целая часть этого значения для определения, куда должно быть передано управление.

В языке Бейсик отдельные программы, сохраненные на диске, можно использовать как подпрограммы и вызывать из основной корневой программы. Для этой цели команды RUN, LOAD, MERGE и др. используются в программном режиме. Эти возможности очень удобны при создании программ меню. Например:

    90 PRINT "Вы можете вызвать любую игру, набрав соответствующий номер"
    95 PRINT
    100 PRINT "        ИГРЫ"
    105 PRINT
    110 PRINT " 1.  ОТЕЛЛО"
    120 PRINT " 2.  ОТЕЛЛО"
    130 PRINT " 3.  МОРСКОЙ БОЙ"
    140 PRINT " 4.  СКАЧКИ"
    150 PRINT " 5.  НАРДЫ"
    160 PRINT " 6.  ТРЕХМЕРНЫЕ КРЕСТИКИ-НОЛИКИ"
    170 PRINT " 7.  КРОСС"
    180 PRINT " 0.  КОНЕЦ ПРОГРАММЫ"
    190 KK¤ = INKEY¤: IF KK¤ = "" THEN 190
    200 IF KK¤ = " " THEN GOTO 190
    210 IF KK¤ = "0" THEN END
    220 IF KK¤ = "1" THEN NAME¤ = "OTHELLO.BAS": GOTO 310
    230 IF KK¤ = "2" THEN NAME¤ = "OTHELLO1.BAS": GOTO 310
    240 IF KK¤ = "3" THEN NAME¤ = "BOJ.BAS": GOTO 310
    250 IF KK¤ = "4" THEN NAME¤ = "HORSE.BAS": GOTO 310
    260 IF KK¤ = "5" THEN NAME¤ = "NARD.BAS": GOTO 310
    270 IF KK¤ = "6" THEN NAME¤ = "QUBIC.BAS": GOTO 310
    280 IF KK¤ = "7" THEN NAME¤ = "CROSS.BAS": GOTO 310
    300 PRINT Вы набрали неправильный номер задания"
    305 PRINT "Введите еще раз": GOTO 190
    310 RUN NAME¤: GOTO 90

Эта программа позволяет перейти к выполнению любой из перечисленных программ. При нажатии клавиши с соответствующим номером игры происходит загрузка и выполнение нужной программы с помощью команды RUN, заданной в программной строке 310. В вызываемых программах рекомендуется создавать возможность возврата в программу МЕНЮ. В следующем примере для присоединения к корневой программе отдельных подпрограмм используется команда MERGE также в программном режиме. Например:

    100 K¤ = INKEY¤: IF K¤ = "" THEN 100
    105 IF K¤ = " " THEN GOTO 100
    110 IF K¤ = "A" OR K¤ = "a" THEN MERGE "PROGA.A"
    120 IF K¤ = "B" OR K¤ = "b" THEN MERGE "PROGB.A"
    130 IF K¤ = "C" OR K¤ = "c" THEN MERGE "PROGC.A"
    140 IF K¤ = "D" OR K¤ = "d" THEN MERGE "PROGD.A"
    150 IF K¤ = "E" OR K¤ = "e" THEN MERGE "PROGE.A"
    160 END

Необходимо помнить, что программы PROGA.A, PROGB.A, PROGC.A, PROGD.A и PROGE.A должны были быть записаны в кодах КОИ-8, т.е. при записи этих программ на магнитный диск НКМЛ в команде SAVE надо было указать параметр A.

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

3.8. Файлы данных

В языке Бейсик существует возможность создавать и работать с файлами с последовательным доступом.

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

Для работы с файлами с последовательным доступом используются следующие инструкции: OPEN, CLOSE, PRINT#, PRINT #USING, INPUT#, LINE INPUT#, LOC, EOF, LOF.

Для файла с последовательным доступом и доступа к данным файла необходимо выполнить следующие операции:

  1. Открыть файл с именем DATA для режима "вывода" ("0")
    OPEN "0", #1, "DATA"
  2. Записать данные в файл, используя оператор PRINT#
    PRINT# 1, A¤; B¤; C¤
  3. Чтобы обеспечить доступ к данным файла, необходимо закрыть файл (CLOSE) и открыть заново для режима "ввода" ("1")
    CLOSE #1
    OPEN "1", #1, "DATA"
  4. Считать данные из файла с последовательным доступом в программу, использую оператор INPUT#
    INPUT# 1, X¤, Y¤, Z¤

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

    10 OPEN "0", #1, "DATA"
    20 INPUT "НОМЕР "; M¤
    30 IF M¤ = "0" THEN GOTO 110
    40 INPUT "ИМЯ "; N¤
    50 IF N¤ = " " THEN GOTO 110
    60 INPUT "ГОРОД "; C¤
    70 INPUT "DATA "; D¤
    80 PRINT #1, M¤; ", "; N¤; ", "; C¤; ", "; D¤
    90 PRINT
    100 GOTO 20
    110 CLOSE #1
    120 END
    RUN
    НОМЕР ?1
    ИМЯ ?ПЕТРОВ Г.М.
    ГОРОД ?ЛЕНИНГРАД
    DATA ?01.07.85
    НОМЕР ?2
    ИМЯ ?АЛЕКСАНДРОВ Б.В.
    ГОРОД ?МОСКВА
    DATA ?10.12.84
    НОМЕР ?0
    ОK

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

    10 OPEN "1", #1, "DATA"
    20 IF EOF(1) THEN END
    30 INPUT #1, M¤, N¤, C¤, D¤
    40 IF RIGHT¤(D¤, 2) = "85" THEN PTINY N¤, c¤
    50 GOTO 20

Эта программа последовательно считывает каждый элемент в файле. Для успешного окончания выполнения программы необходима строка 20, иначе после считывания последнего элемента в файле появится сообщение об ошибке ВВОД ПОСЛЕ КОНЦА ФАЙЛА.

Программа, которая создает файл с последовательным доступом, может записывать и форматировать данные на диск, используя оператор PRINT #USING. При использовании с файлами с последовательным доступом функция LOC возвращает число секторов (сектор – 128-байтный блок данных), записанных или считанных из файла с тех пор, как он был открыт (OPEN).

Если Вы хотите добавить данные в уже созданный файл, который находится на диске, нельзя просто открыть файл для режима "0" и начать записывать данные. Как только Вы откроете файл с последовательным доступом для режима "0", Вы уничтожите его текущее содержимое. Для добавления данных в уже существующий файл с именем DATA надо выполнить следующие операции:

  1. открыть файл с именем DATA для режима "1";
  2. открыть второй файл с именем COPY для режима "0";
  3. считать данные из файла DATA и записать в файл COPY;
  4. закрыть файл DATA и стереть его;
  5. записать новую информацию в файл COPY;
  6. переименовать файл COPY в файл DATA и закрыть его.

Теперь файл с именем DATA включает всю предыдущую информацию плюс новые добавленные данные.

Пример программы создания файла или добавления данных в файл с именем DATA. Эта программа также иллюстрирует использование оператора LINE INPUT# для считывания строк из дискового файла. Оператор LINE INPUT# считывает символы до встречи возврата каретки или до тех пор, пока не считает 255 символов.

    10 ON ERROR GOTO 2000
    20 OPEN "1", #1, "DATA"
    30 REM Если файл уже существует, записывайте в COPY
    40 OPEN "0", #2, "COPY"
    50 IF EOF(1) THEN GOTO 90
    60 LINE INPUT# 1, A
    70 PRINT #2, A
    80 GOTO 50
    90 CLOSE 1
    100 KILL "DATA"
    110 REM Добавьте новые данные в файл
    120 INPUT "ИМЯ "; N¤
    130 IF N¤ = CHR¤(12) THEN GOTO 180
    140 INPUT "АДРЕС ? "; A¤
    150 INPUT "ДАТА ? "; D¤
    160 PRINT #2, N¤ : PRINT #2, A¤ : PRINT #2, D¤
    170 PRINT : GOTO 120
    180 CLOSE
    190 REM Измените имя файла на имя DATA
    200 NAME "COPY" AS "DATA"
    2000 IF ERR=53 AND ERL=20 THEN OPEN "0", #2, "COPY" : RESUME 120
    2010 ON ERROR GOTO 0

Подпрограмма ловушки ошибки в строке 2000 ловит ошибку ФАЙЛ НЕ НАЙДЕН в 20 и открывает файл с именем COPY.

3.9. Работа с графическими операторами

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

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

В языке Бейсик для работы с графической информацией используются операторы COLOR, CIRCLE, DRAW, LUT, PAINT, PCLS, PSET, PRESET, RELOC, SCREEN и функция POINT.

Для вывода точки графический оператором необходимо определить ее местоположение на экране терминала Размер экрана – 512 горизонтальных точек и 256 вертикальных. Точки нумеруются, начиная сверху вниз и слева направо, т.е. верхняя левая точка экрана (0,0), а нижняя правая (511,255).

Обычно местоположение точки определяется, используя значения координат в форме (X,Y), где X указывает на горизонтальную позицию, а Y – на вертикальную. Эта форма называется абсолютной и указывает на действительные позиции точки на экране. Относительная форма указывает позицию точки относительно последней отображаемой точки и имеет формат: STEP (X - смещение, Y - смещение), где X – смещение указывает на позицию горизонтального, а Y – смещение – вертикального смещения точки.

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

    100 PSET (200, 100): REM Абсолютная форма
    110 PSET STEP (10, -20): REM Относительная форма

В этом примере на экране рисуются точки с координатами (200, 100) и (210, 80).

Координату точки также можно установить оператором RELOC.

Язык Бейсик предоставляет пользователю возможность менять цвета переднего и заднего фона оператором COLOR.

При загрузке интерпретатора языка Бейсик устанавливаются следующие цвета:

  • 0 – черный;
  • 1 – синий;
  • 2 – зеленый;
  • 3 – голубой;
  • 4 – красный;
  • 5 – фиолетовый;
  • 6 – желтый;
  • 7 – белый.

Причем цвет переднего фона – белый (7), а заднего фона – черный (0).

Для перепрограммирования таблицы цветов используется оператор LUT.

Для вывода графического изображения на экран терминала используются операторы:

  • PSET – нарисовать точку;
  • PRESET – стереть точку;
  • PAINT – закрасить цветом определенную область графического экрана;
  • LINE – нарисовать прямую или прямоугольник;
  • CIRCLE – нарисовать круг или эллипс;
  • DRAW – нарисовать сложный рисунок ломанными линиями.

Если в этих операторах не указан цвет, то изображение будет рисоваться цветом переднего фона, а в операторе PRERSET – цветом заднего фона.

Стереть графическое изображение с экрана терминала можно оператором PCLS.

3.10. Работа со звуковыми операторами

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

В языке Бейсик для работы со звуковой информацией используются операторы PLAY, SOUND и BEEP.

PLAY - позволяет запрограммировать практически любую мелодию на четыре голоса;
SOUND - позволяет достичь различных звуковых эффектов;
BEEP - выводит единичный звуковой сигнал.

Пример 1.Работа оператора PLAY:

    10 PRINT "Ария тореадора из оперы Бизе Кармен"
    25 A¤ = "O3F8R8C8R8 F8R8C8R8 F8R8C8R8 G8R8C8R8 F8R8C8R8 D8R8O2G8R8 O3C8R8O2C8R8"
    20 PLAY "V15 T120 O5 C4D8.C16 O4A4A4 A8.G16 A8.B-16 
       A4A8P8 B-4G.8 O5C16 O4A2 F4D8.G16 C4C8R8G2",
       "V15 T120 R2 R2 R2 04F4E8.R15 R2 C4 O3 B8.R16 R2 R2",
       "V15 A8R8A8R8 A8R8A8R8 A8R8A8R8 A8R8A8R8 O4D8R8O3 B-8 R8
       A8R8A8R8 A8R8A8R8 E8R8R4 O4D8R8D8R8", "V15 T120 XA¤;"

Пример 2.Работа оператора SOUND:

    10 PRINT "Программа воспроизводит шум морского прибоя"
    20 FOR I = 0 TO 10 : SOUND I, 0: NEXT I
    30 SOUND 4, 239
    40 SOUND 6, 30
    50 SOUND 10, 15000
    60 FOR I = 1 TO 250
    70 SOUND 4, 100
    80 NEXT I
    90 FOR I = 1 TO 20000: NEXT I
    100 SOUND 5, 255
3.11. Сообщения
Сообщение Код Описание
NEXT БЕЗ FOR 1 Переменная в операторе NEXT не соответствует переменной оператора FOR.
ОШИБКА СИНТАКСИСА 2 Встречается строка, которая содержит некоторую некорректную последовательность символов (несоответствие скобок, неправильная команда или оператор, некорректная пунктуация и т.д.).
RETURN БЕЗ GOSUB 3 Встречается оператор RETURN, для которого нет соответствующего предварительного оператора GOSUB.
ВНЕ DATA 4 Выполнение оператора READ, когда нет оператора DATA с несчитанными данными.
НЕВЕРЕН ВЫЗОВ ФУНКЦИИ 5 Параметр, который задан вне диапазона, передается в системную функцию. Ошибка может встретиться как результат следующего:
  • отрицательный или неприемлемо большой индекс;
  • отрицательная мантисса с нецелочисленной экспонентой;
  • ошибочный аргумент в функции или операторе.
ПЕРЕПОЛНЕНИЕ 6 Значение числа целиком велико для представления в числовом формате языка Бейсик. Целочисленное переполнение останавливает выполнение. Машинная бесконечность с соответствующим знаком получается как результат. Если число слишком мало для представления в числовом формате, то результат нулевой и выполнение продолжается без ошибки.
НЕТ ПАМЯТИ 7 Программа слишком велика, имеет очень много циклов FOR...NEXT или GOSUB...RETURN, очень много переменных, выражения слишком сложные.
НЕОПРЕДЕЛЕННЫЙ НОМЕР СТРОКИ 8 В операторе или команде не существует строки с таким номером.
ИНДЕКС ВНЕ ДИАПАЗОНА 9 Элемент массива, к которому обращаются или с индексом, заданным вне размерности массива, или с неправильным номером индекса. Индекс может быть занесен в переменную, которая не является массивом, или имеется некорректно закодированная встроенная функция.
ПЕРЕОПРЕДЕЛЕНИЕ МАССИВА 10 Попытка определить размер одного массива дважды. Это может быть в одном из следующих случаев:
  • для одного массива заданы два оператора DIM;
  • оператор DIM задан для массива после определения размерности равной 10 по умолчанию.
ДЕЛЕНИЕ НА 0 11 Попытка деления на ноль или возведения ноля в отрицательную степень. Как результат деления получится машинная бесконечность со знаком числителя или положительная машинная бесконечность как результат экспоненты.
НЕВЕРНАЯ ДИРЕКТИВА 12 Оператор, который не может быть задан в прямом режиме, вводится как команда.
НЕВЕРНЫЙ ТИП 13 Задается строковое значение там, где ожидалось числовое, или наоборот. Эта ошибка может быть вызвана попыткой обменять (SWAP) значения одинарной и двойной точности.
НЕТ ПАМЯТИ ДЛЯ СТРОК 14 Строковое пространство распределяется динамический до тех пор, пока имеется свободная память. Ошибка означает, что свободной памяти больше нет.
ДЛИННАЯ СТРОКА 15 Попытка создать строку длиной более 255 символов.
СЛОЖНАЯ СТРОКА 16 Строковое выражение слишком длинно или слишком сложно. Рекомендуется разбить выражение на части.
ОШИБКА CONT 17 Попытка использовать команду CONT, чтобы продолжить программу, которая:
  • остановка из-за ошибки;
  • модификация во время прерывания (нажатием кнопки СТОП);
  • не существует.
НЕТ ОПРЕДЕЛЕНИЯ FN 18 Вызов функции перед определением ее оператором DEF FN.
НЕТ RESUME 19 Программа передала управление в активную подпрограмму ловушки ошибок как результат условия ошибки или оператора ERROR. Подпрограмма не имеет оператора RESUME (END, STOP или RETURN были найдены перед оператором RESUME).
RESUME БЕЗ ERROR 20 Оператор RESUME встретился перед выполнение подпрограммы ловушки ошибок.
НЕОПРЕДЕЛЕННАЯ ОШИБКА 21 Сообщение об ошибке не определено для заданного условия ошибки. Это обычно вызывается оператором ERROR с неопределенным кодом ошибки.
НЕТ ОПЕРАНДА 22 Выражение содержит оператор такой, как * или OR без операнда, следующего за ним.
БУФЕР СТРОКИ ПОЛНЫЙ 23 Попытка ввести строку, в которой слишком много символов.
ОШИБКА ЧТЕНИЯ 24 Ошибка возникает при физической неисправности магнитной ленты или некачественной записи.
ВНУТРЕННЯЯ ОШИБКА 51 Внутренняя ошибка интерпретатора. Испорчен текст самого интерпретатора.
НЕВЕРЕН НОМЕР ФАЙЛА 52 Оператор или команда обращается к файлу с номером, который не открыт (по OPEN) или находится вне диапазона номеров файлов, определенных при инициализации.
ФАЙЛ НЕ НАЙДЕН 53 В операторе или команде идет обращение к файлу, которого нет на диске.
НЕВЕРЕН РЕЖИМ ФАЙЛА 54 Попытка соединить (MERGE) файл не в формате КОИ-8, или выполнить OPEN с файловым режимом, отличным от ввода-вывода.
ФАЙЛ УЖЕ ОТКРЫТ 55 Попытка открыть уже открытый файл для последовательного вывода или стереть (KILL) открытый файл.
ОШИБКА ВВОДА/ВЫВОДА ДИСКА 57 Ошибка в операции ввода-вывода. Операционная система не может восстановиться после ошибки, необходима перезагрузка операционной системы.
ФАЙЛ УЖЕ СУЩЕСТВУЕТ 58 Файл с таким именем уже существует на диске.
ДИСК ПОЛНЫЙ 61 Занято все пространство памяти диска. Если эта ошибка появится, все файлы закроются.
ВВОД ПОСЛЕ КОНЦА ФАЙЛА 62 Оператор ввода был выполнен для пустого файла, или после того, как все данные в файле с последовательным доступом были введены. Чтобы предотвратить эту ошибку, используйте функцию EOF для обнаружения конца файла. Эта ошибка встречается и при попытке прочитать из файла, который был открыт для вывода.
НЕВЕРНО ИМЯ ФАЙЛА 64 С командами LOAD, SAVE, KILL, OPEN, NAME, FILE или FILES используется неправильная форма, т.е. имя файла может, например, начинаться с точки.
ПРЯМОЙ ОПЕРАТОР В ФАЙЛЕ 66 Встречается прямой оператор при загрузке файла. Прямой оператор - это машинные команды не в формате интерпретатора Бейсик.
МНОГО ФАЙЛОВ 67 Попытка создать новый файл (SAVE или OPE), когда вся директория диска полная или неправильное имя файла.

Приложение 1. Коды КОИ-8

1.1. Коды управляющих символов
Десятичный
код
Шестнадцатеричный
код
Нажатие
клавиш
Обозначение
управляемого
символа
Десятичный
код
Шестнадцатеричный
код
Нажатие
клавиш
Обозначение
управляемого
символа
0 00 УПР-@ NULL 16 10 УПР-P DLE
1 01 УПР-B SCH 17 11 УПР-Q DC1
2 02 УПР-B STX 18 12 УПР-R DC2
3 03 СТОП ETX 19 13 УПР-S DC3
4 04 УПР-D EOT 20 14 УПР-T DC4
5 05 УПР-E ENQ 21 15 УПР-U NAK
6 06 УПР-F ACK 22 16 УПР-V SYM
7 07 УПР-G BEL 23 17 УПР-W ETB
8 08 УПР-H BS 24 18 УПР-X CAN
9 09 УПР-I HT 25 19 УПР-Y EM
10 0A УПР-J LF 26 1A УПР-Z SUB
11 0B УПР-K YT 27 1B УПР-[ ESC
12 0C УПР-L FF 28 1C УПР-\ FS
13 0D УПР-M CR 29 1D УПР-] GS
14 0E УПР-N SO 30 1E УПР-^ RS
15 0F УПР-O S1 31 1F УПР-DEL US
1.2. Коды символов, имеющих графическое представление

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

Приложение 2. ПРОГРАММА DEMON

1. Назначение и условия применения программы.

1.1. Программа DEMON презназначена для демонстрации возможностей операторов и функций языка Бейсик, описание которых представлено в документе "Базовые программные средства ПК8020. Интерпретатор языка Бейсик - Руководство пользователя" ПТ.00552-01 90 01.

1.2. Программа DEMON состоит из девяти подпрограмм. Объем каждой из подпрограмм не более 18 Кбайт, а общий объем - 92 Кбайт.

1.3. Программа DEMON выполняет следующие функции:

  1. выдачу пользователю списка операторов, предназначенных для демонстрации;
  2. выбор из представленного списка любого оператора для демонстрации;
  3. выдачу описания формата оператора, выбранного для демонстрации;
  4. выдачу примера правильной записи демонстрируемых операторов;
  5. выдачу примеров использования операторов (если это возможно);
  6. демонстрацию использования операторов непосредственным или косвенным путем (если это возможно);
  7. запрос и ввод данных с клавиатуры для демонстрации оператора в пределах заданных значений его параметров.

2. Характеристики программы.

2.1. Программа DEMON состоит из девяти подпрограмм. Объем подпрограмма следующий:

  • DEMON - 2 Кбайт;
  • LIST1 - 12 Кбайт;
  • LIST2 - 12 Кбайт;
  • LIST3 - 6 Кбайт;
  • LIST4 - 10 Кбайт;
  • LIST5 - 6 Кбайт;
  • LIST6 - 10 Кбайт;
  • LIST7 - 18 Кбайт;
  • LIST8 - 10 Кбайт;
  • LIST9 - 6 Кбайт;

Программа составлена на языке Бейсик.

2.2. Программа DEMON работает в диалоговом режиме. Запуск на исполнение каждой из подпрограмм LIST1...LIST9 осуществляется из подпрограммы DEMON в процессе диалога пользователя с ЭВМ в произвольном порядке. Подпрограммы LIST1...LIST9 по окончании выполнения загружают подпрограмму DEMON и передают ей управление.

Минимальное время выполнения подпрограмм LIST1...LIST9 приблизительно 10 мин (при времени ответа пользоватея на каждое сообщение из ЭВМ в 10 сек.).

3. Обращение к программе.

Перед обращением к программе в ОЗУ системного блока загружают операционную систему МикроДОС ПТ.00553-01. Для этого ГМД ПТ3.060.163 вставляют в дисковод А: вспомогательного устройства.

В результате на экране ПК8020 высветится сообщение:

    КОРВЕТ ПК8020
    НИИМСЕТМАШ 30.04.87
    48К МикроДОС вер. 2.6.
           1985

    А>

Затем ГМД ПТ3.060.163 вынимают и на его место вставляют ГМД ПТ3.060.162.

Далее загружают в ОЗУ интерпретатор BASIC:

    A>BASIC <ВК>

где <ВК> - возврат каретки.

Затем ГМД ПТ3.060.163 вынимают из дисковода А: и на его место вставляют ГМД ПТ3.060.169. После этого пользователь запускает на выполнение программу DEMON, набрав команду:

    RUN "DEMON"

4. Входные и выходные данные

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

Параметрические данные предназначены для проверки возможностей операторов и функций языка Бейсик.

Конкретные значения входных данных приведены в сообщениях, выданных программой.

Пользователю необходимо выбрать одно из альтернативных значений в ввести его.

Выходные данные представляют собой результаты выполнения программы, выводимые на экран ПК8020 в процессе демонстрации какого-либо оператора.

Формат и значения этих данных должны соответствовать формату и значениям, укащанным в описании операторов языка Бейсик.

5. Сообщения

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

Альтернативные варианты ответов на вопрос приводятся в каждом сообщении и выделяются с помощью круглых скобок. Оператору остается лишь выбрать нужный ответ и ввести его в ПК8020.

В начале выполнения программы DEMON на экран ПК8020 выводятся список подпрограмм LIST1...LIST9 и сообщение оператору, которые имеют вид:

   СОДЕРЖАНИЕ
    1. Подпрограмма LIST1
    2. Подпрограмма LIST2
    3. Подпрограмма LIST3
    4. Подпрограмма LIST4
    5. Подпрограмма LIST5
    6. Подпрограмма LIST6
    7. Подпрограмма LIST7
    8. Подпрограмма LIST8
    9. Подпрограмма LIST9
    Введите номер подпрограммы (1...9, конец - 10):?

Каждая их подпрограмм LIST1...LIST9 в начале выполнения выдает на экран ВКУ список пронумерованных операторов, предназначенных для демонстрации, и сообщение с требованием указания номера оператора, возможности которого должны быть продемонстрированы на экране ВКУ.

Например, список операторов и соответствующее сообщение, выдаваемое программой LIST1, имеет следующий вид:

    СОДЕРЖАНИЕ LIST1
    1. Константы
    2. Переменные
    3. Выражения
    4. Функция ABS(X)
    5. Функция ATN(X)
    6. Функция COS(X)
    7. Функция EXP(X)
    8. Функция INT(X)
    9. Функция LOG(X)
    10. Функция SGN(X)
    11. Функция SIN(X)
    12. Функция SQR(X)
    13. Функция RAN(X)
    Укажите номер пункта (1...13, конец - 14):?

Выбрав функцию, например, SQR, необходимо указать ее номер 12 в позиции строки, указанной курсором.

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

    Функция SQR(X) предназначени для вычисления квадратного корня из чтсла X.
    Пример записи функции: SQR(9).
    Демонстрация работы функции SQR.
    Задайте любое неотрицательное число (X=ВК=9):?

где X=9 при нажатии только одного ораза на клавишу ВК.

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

    SQR(9)=3
    Ввод повторить (1) или нет (ВК):?

Если пользователь хочет проверить работу функции SQR(X) для других чисел, то он должен ввести с клавиатуры число "1", и демонстрация продолжится с выдачей на экран названия функции. В противном случае он должен ввести с клавиатуры знак "ВК", демонстрация функции SQR(X) прекращается и на экран ПК8020 выдается содержание подпрограммы LIST1.

Если пользователь закончил просмотр возможностей функций подпрограммы LIST1, то он вводит число 14. Подпрограмма LIST1 по числу 12 заканчивает свою работу и выдает об этом на экран ПК8020 сообщение:

    КОНЕЦ LIST1

Далее подпрограмма LIST1 вызывает в ОЗУ подпрограмму DEMON и передает ей управление.

Приложение 3. ДЕМОНСТРАЦИОННАЯ ПРОГРАММА SONATA.BAS

ВНИМАНИЕ!!! Данная программа скорее всего будет частично исполняться в виду отсутствия операторов SOUND и PLAY, приведенных в распечатке. Ну и до кучи качество скана настолько плохо, что не все символы мелодий были мной распознаны правильно. Если есть желание - отладьте мелодии на КУВТ Yamaha YIS-503IIIR, где они нормально воспроизводятся (не полностью конечно, т.к. количество заявленных каналов на ЗС9010 целых 4).

    10 LOCATE ,,0
    20 CLS:PCLS
    30 COLOR 7,0-GOTO 90
    40 LINE(10,10)-(450,210),5,B
    50 LINE(11,11)-(449,209),5,B
    60 LINE(12,12)-(448,208),5,B
    70 LINE(13,13)-(447,207),5,B
    80 LINE(14,14)-(446,206),5,B
    81 RETURN
    90 GOSUB 40: LOCATE 15,4:PRINT"ДЕМОНСТРАЦИОННАЯ ПРОГРАММА""
    100 LOCATE 19,6:PRINT"PAБОТЫ ОПЕРАТОРОВ"
    110 LOCATE 20,8:PRINT"S О U N D"
    120 LOCATE 25,10:PRINT"И"
    130 LOCATE 29,12:PRINT"PLAY"
    135 LOCATE 20,15:PRINT"/ Нажмите клавишу ПРОБЕЛ /"
    140 A¤=INKEY¤:IF A¤="" THEN 150 ELSE 140
    150 CLS:PCLS:GOSUB 40
    180 LOCATE 15,5:PRINT"1. Работа оператора SOUND."
    170 LOCATE 15,7:PRINT"2. Работа оператора PLAY."
    175 LOCATE 15,9:PRINT"3. РОБОТ./ Для расширенного ГЗУ/"
    176 LOCATE 15,11:PRINT"4. Окончание работы"
    180 LOCATE 10,15:PRINT" Важмите номер нужного оператора /"
    190 A¤=INKEY¤:IF A¤<>"1" AND А¤<>"2" AND A¤<>"3" AND A¤<>"4" THEN 190
    200 IF A¤="1" THEN 220
    210 IF AS="2" THEN 310
    215 IF A¤="3" THEN 10000
    216 IF A¤="4" THEN 20000
    220 CLS:GOSUB 40:LOCATE 15,4:PRINT" Оператор SOUND."
    230 LOCATE 15,6:PRINT"1. Проверка параметров оператора."
    240 LOCATE 15,8:PRINT"2. Шум прибоя."
    250 LOCATE 15,10:PRINT"3. Взрыв бомбы."
    255 LOCATE 15,12:PRINT"4. Выход в общее меню."
    260 A¤=INKEY¤:IF A¤="" THEN 260
    270 А¤="1" THEN 1000
    280 А¤="2" THEN 600
    290 А¤="3" THEN 400
    295 А¤="4" THEN 150
    З00 GOTO 260
    310 CLS:GOSUB 40:LOCATE 15,4:PRIHT“Оператор PLAY."
    320 LOCATE 10,6:PRINT"1. Проверка команд оператора PLAY."
    330 LOCATE 10,8:PRINT"2. B.-A. Моцарт. Сената N 18."
    340 LOCATE 10,10:PRINT"3. П.И. Чайковский. Танец маленьких лебедей."
    345 LOCATE 10,12:PRINT"4. Выход в общее меню."
    350 A¤=INKEY¤:IF A¤="" THEN 350
    360 IF A¤="1" THEN 2345
    370 IF А¤="2" THEN 2150
    38G IF A¤="3" THEN 7000
    385 IF A¤="4" THEN 150
    390 GOTO 350
    400 CLS:PCLS:LOCATE 5,7: PRINT"    ПРОГРАММА ДЕМОНСТРАРУЕТ РАБОТУ ОПЕРАТОРА SOUND"
    410 LOCATE 5,9:PRINT"              ЭФФЕКТ ВЗРЫА БОМБЫ"
    420 FOR I=1 TO 10:SOUND I,0:NEXT
    430 N=1000
    440 SOUND 5,254
    450 SOUND 6,15
    460 FOR I=1 TO 250
    470 SOUND 0,N
    480 N=N+1
    490 NEXT I
    500 FOR I=0 TO 10:SOUND I,O:NEXT
    510 BOUND 5,239
    520 SOUND 6,15
    530 SOUND 4,55
    540 FOR I=1 ТО 500:NEXT
    550 SOUND 5,255:GOTO 220
    600 CLS:PCLS
    610 LOCATE 4,7,0
    620 PRINT"    ПРОГРАММА ДЕМОНСТРИРУЕТ РАБОТУ ОПЕРАТОРА SOUND."
    630 LOCATE 4,9,0
    640 PRINT"              ЭФФЕКТ МОРСКОГО ПРИБОЯ"
    650 FOR I=0 TO 10:SOUND I,0:NEXT
    660 SOUND 5,239
    670 SOUND 6,30
    680 SOUND 10,15000
    690 FOR I=1 TO 250
    700 SOUND 4,100
    710 NEXT I
    720 FOR I=1 TO 20000
    730 NEXT I
    740 SOUND 5,255:G0T0 220
    1000 CLS:PCLS
    1010 FOR I=0 TO 10:SOUND I,0:NEXT I
    1020 LOCATE 1,7,0
    1030 PRINT"    ДЕМОНСТРАЦИЯ ОГИБАЮЩИХ В ОПЕРАТОРЕ SOUND"
    1040 PRINT
    1050 SOUND 5,254
    1060 SOUND 10,300
    1070 L=1
    1080 FOR K=0 TO 15
    1090 READ J:LOCTE L,0,0:PRINT K:LOCATE L,11,0:PRINT J
    1100 L=L+4
    1110 SOUND 5,J
    1120 SOUND 0,3822:FOR I=1 TO 500:NEXT I
    1130 SOUND 0,3405:FOR I=1 TO 500:NEXT I
    1140 SOUND 0,3034:FOR I=1 TO 500:NEXT I
    1150 SOUND 0,2863:FOR I=1 TO 500:NEXT I
    1160 SOUND 0,2551:FOR I=1 TO 500:NEXT I
    1170 SOUND 0,2273:FOR I=1 TO 500:NEXT I
    1180 SOUND 0,2025:FOR I=1 TO 500:NEXT I
    1190 NEXT K
    1200 DATA 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
    1220 CLS
    1230 LOCATE 9,7,0
    1240 PRINT"    ДЕМОНСТРАЦИЯ ОГИБАЮЩИХ В ОПЕРАТОРЕ SOUND"
    1250 FOR I=0 TO 10:SOUND I,0:NEXT I
    1260 SOUND 5,240:SOUND 10,300
    1270 READ N
    1280 LOCATE 5,9,0
    1290 PRINT "ОГИБАЮЩАЯ N",N,"   -по голосу N1"
    1300 SOUND 6,N:SOUND 0,3822:FOR I=1 TO 1000:NEXT
    1310 REAND N
    1320 LOCATE 5,11,0
    1330 PRINT "ОГИБАЮЩАЯ N",N,"   -по голосу N2"
    1340 SOUND 7,N:SOUND 1,3405:FOR I=1 TO 2000:NEXT
    1350 REAND N
    1360 LOCATE 5,13,0
    1370 PRINT "ОГИБАЮЩАЯ N",N,"   -по голосу N3"
    1380 SOUND 8,N:SOUND 2,3034:FOR I=1 TO 3000:NEXT
    1390 REAND N
    1400 LOCATE 5,15,0
    1410 PRINT "ОГИБАЮЩАЯ N",N,"   -по голосу N5"
    1420 SOUND 9,N:SOUND 3,2551:FOR I=1 TO 4000:NEXT
    1430 SOUND 5,255
    1440 DATA 24,26,29,30
    1450 FOR I=1 TO 300:NEXT I
    1460 SOUND 5,255
    1480 CLS
    1490 LOCATE 1,7,0
    1500 PRINT "          ДЕМОНСТРАЦИЯ ПАРАМЕТР ГРОМКОСТИ ОПЕРАТОРА SOUND"
    1510 PRINT
    1520 FOR I=0 TO 10:SOUND I,0:NEXT I
    1530 SOUND 5,254
    1540 FOR I=15 TO 0 STEP -1
    1550 SOUND 6,I:PRINT I;:SOUND 0,5000
    1560 FOR J=1 TO 300:NEXT J
    1570 NEXT I
    1580 FOR I=0 TO 10:SOUND I,0:NEXT I
    1590 SOUND 5,254
    1600 PRINT
    1610 FOR I=0 TO 15:PRINT I;
    1620 SOUND 6,I:SOUND 0,5000
    1630 FOR J=1 TO 300:NEXT J
    1640 NEXT I
    1650 SOUNF 5,255
    1660 FOR I=1 TO 300
    1670 NEXT I
    1690 CLS
    1700 LOCATE 3,5,0
    1710 PRINT "     ДЕМОНСТРАЦИЯ СМЕШЕНИЯ ОБЫЧНОГО И ОГИБАЮЩЕГО ЗВУКА"
    1720 PRINT 
    1730 FOR I=0 TO 10:SOUND I,0:NEXT I
    1740 SOUND 5,240:SOUND 10,5000
    1750 PRINT "               ГОЛОС 1. ЧАСТОТА 2000. ГРОМКОСТЬ 15"
    1760 PRINT
    1770 SOUND 6,16:SOUND 0,2000:FOR I=1 TO 1000:NEXT I
    1780 PRINT "               ГОЛОС 2. ЧАСТОТА 5000. ГРОМКОСТЬ 15"
    1790 PRINT
    1800 SOUND 7,16:SOUND 1,5000:FOR I=1 TO 2000:NEXT I
    1810 PRINT "               ГОЛОС 3. ЧАСТОТА 3000. ОГИБАЮЩАЯ 24"
    1820 PRINT
    1830 SOUND 8,24:SOUND 2,3000:FOR I=1 TO 3000:NEXT I
    1840 PRINT "               ГОЛОС 4. ЧАСТОТА 3000. ОГИБАЮЩАЯ 30"
    1850 PRINT
    1860 SOUND 8,30:SOUND 3,3000:FOR I=1 TO 4000:NEXT I
    1870 FOR I=1 TO 500:NEXT I
    1880 SOUND 5,255
    1900 CLS
    1910 LOCATE 20,5
    1920 PRINT "ДЕМОНСТРАЦИЯ ШУМА ":PRINT
    1930 FOR I=0 TO 10:SOUND I,0:NEXT I
    1940 SOUND 5,0:SOUND 10,5000
    1950 LOCATE 12,7
    1980 PRINT "ГОЛОС 1-ШУМ. ЧАСТОТА 200. ОГИБАЮЩАЯ 24"
    1990 SOUND 6,24:SOUND 4,200:SOUND 0,5000:FOR I=1 TO 1000:NEXT I
    2000 LOCATE 12,9
    2010 PRINT "ГОЛОС 2-ШУМ. ЧАСТОТА 300. ОГИБАЮЩАЯ 26"
    2020 SOUND 7,26:SOUND 1,300:FOR I=1 TO 2000:NEXT I
    2040 LOCATE 12,11
    2050 PRINT "ГОЛОС 3-ШУМ. ЧАСТОТА 500. ОГИБАЮЩАЯ 28"
    2060 SOUND 8,28:SOUND 2,300:FOR I=1 TO 3000:NEXT I
    2070 LOCATE 12,13,0
    2080 PRINT "ГОЛОС 4-ШУМ. ЧАСТОТА 100. ОГИБАЮЩАЯ 30"
    2090 SOUND 9,30:SOUND 3,100:FOR I=1 TO 4000:NEXT I
    2100 SOUND 5,255:GOTO 220
    2150 CLS:PCLS:LOCATE 15,7,0:PRINT "ДЕМОНСТРАЦИЯ ОПЕРАТОРА PLAY"
    2200 A$="V15O5C2E4G4O4B4.O5C16D16C4R4A2G4O6C4O5G4F8E16F16E4
         R4O4A8B16O5C16D16E16F16F16A16G16F16E16D16C16O4B16A16R64
         G8A16B16O5C16D16E16F16G16F16E16D16C16O4B16AGR64F8G16A16
         B16O5C16D16E16F16E16D16C16O4B16A16G16F16E8F16G16A16B16
         O5C15D16E16D16C16O4B16A16G16F16E"
    2210 B$="V15O4D8E16F16G16A16B16O5C16D16O4A16B16O5C15D15E16
         F16G16A16B16O6C16O5B16A16G16F16E16F16G16A16G16F16E16D16
         C16O4B8O5G8E8C8D8G8E6C8D4G4O4G4R4R1O6D8O5B8G4.A16B16A8
         G8R64G8.F#16F#4R2"
    2220 C$="V15O4R1R1R1R1R1R1R64R1R1":H$="R1R1R1R4C4D4R2R1R1R64R1"
    2230 D$="V15O4R1R1R1R1R2R4O4C4R64C4R4R4C4R64C4R4R4O3B4O4C4R4
         R4O3E4":G$="O3A1R1R1R4O4B4R4R4R1R1R64E1"
    2240 E$="V15O4C8G8E8G8C8G8E8G8D8G8F8G8C8G8E8G8C8A8F8A8C8G8E8
         G8O3B8O4G8D8G8O4C8G8E8G8F4R4R4O3F4R64E4R4R4E4R64O3D4R4
         R4D4O3C4R4R4C4"
    2250 F$="F1O3F4.G8A4.F#8O2G16BO3DGO2GBO3DGO2GBO3DGO2GBO3DG02
         G4O3G4O2G4R4O4C#16DC#DC#DC#DC16DCD16CDC16D16O3G16O4D16
         O3G16O4D16O3G16O4D16O3G16O4D16O3G16O4D16O3G16O4D16P3G16
         O4D16O3G16O4D16CDO3BO4DO3AO4DBDO3CO4DBDCDO3O4D"
    2260 J$="R1R64R1R1R1R1R1":Z$="R1R1R1R1R2R4O5C4R2R4C4C4R4C5D4
         O4B4R4"
    2270 U$="R1R64R1R1R1R1R1":Y$="O4E8C8E8C8E8C8E8C8E8C8E8C8E8C8
         E8C8R1R1B4R2A4B4R2O3A4O3B4G4G4R4"
    2280 K$="O3B16O4DO3VBO4DO3B04D16O3BO4DO3BO4DO3BO4DO3BO4D16O3B
         O4DR64CDO3BO4DO3AO4DBDO3GO4DBDCDO3AO4D1GR1GO3B16O4D16G16
         B4R16C16E16G16O5C4R16O3A16O4C16F#A4R16O3B16O4DFB4R16O3
         G16BO4EG4R16O3A16O4CEA4R16O3F#16AO4DF#4R16O3G16BO4DG4"
    2290 N$="O4C8ECECECECECECECED16BGBDBGBDBGBDBGBDO5CO4F#O5CO4
         DO5CO4F#O5CO4DO5CO4F#O5CO4DO5CO4F#O5CG4R2DGR2O3DGO2GGR4"
    2300 W$="O6D8O5B8G4.A16B16A8G8R64G8.F#16F#4R2O6D4R16D16O5B3
         E4R16E16GEO6C4R16C16O5AF#C5D4R16D16FDC5B4R16B16GEC4R16
         C16ECA4R16A16F#CO4B4R16O5G16DO4B"
    2310 P$="A2O5C4EA4.B32AG#AO6C8O5AO6CO5ABGO6D2C16O5BAGA1G4C16
         DGBO6DO5BGBO6CO5AF#AG4O4G16DGB-O5DO4BGBO5CO4AF#AG4O5BGR4"
    2320 PLAY "XA$;XB$;XW$;XP$;","ZG$;XH$;XJ$;XZ$;", "XD$;XG$;XU$;XY$;", "XE$;XF$;XK$;XN$;"
    2330 GOTO 310
    2345 X$="CDEFGAB"
    2346 FOR I=0 TO 10:SOUND I,0:NEXT I
    2350 CLS:PCLS:LOCATE 11,5
    2360 PRINT "Демонстрация форм огибающих в операторе PLAY"
    2370 LOCATE 17,7
    2380 PRINT " Команда S (S0,...,S15)"
    2390 LOCATE 1,9:PRINT "S=";:PRINT 0;:PLAY "S0M255T120O4 L4 XX$;"
    2400 PRINT 1;: PLAY " S1 XX$;"
    2410 PRINT 2;: PLAY " S2 XX$;"
    2415 PRINT 3;: PLAY " S3 XX$;"
    2420 PRINT 4;: PLAY " S4 XX$;"
    2430 PRINT 5;: PLAY " S5 XX$;"
    2440 PRINT 6;: PLAY " S6 XX$;"
    2450 PRINT 7;: PLAY " S7 XX$;"
    2460 PRINT 8;: PLAY " S8 XX$;"
    2470 PRINT 9;: PLAY " S9 XX$;"
    2480 PRINT 10;: PLAY " S10 XX$;"
    2490 PRINT 11;: PLAY " S11 XX$;"
    2500 PRINT 12;: PLAY " S12 XX$;"
    2510 PRINT 13;: PLAY " S13 XX$;"
    2520 PRINT 14;: PLAY " S14 XX$;"
    2530 PRINT 15;: PLAY " S15 XX$;"
    2600 CLS:PCLS:LOCATE 11,5:PRINT "Демонстрация периода огибающей в операторе PLAY":LOCATE 15,7:PRINT "Команда M (M0,...,M32767)"
    2630 LOCATE 17,9
    2635 PRINT "M=";
    2640 PRINT 100;: PLAY "S8M100O4T120L1XX$;":PRINT 1000;:PLAY "S8M1000XX$"
    2645 PRINT 2000;:PLAY "S8M2000XX$"
    2650 PRINT 10000;:PLAY "S8M10000XX$"
    2740 CLS:PCLS:LOCATE 11,5:PRINT "Демонстрация громкости в операторе PLAY":LOCATE 17,7
    2770 PRINT "Команда V (V0,...,V15)"
    2780 LOCATE 1,9:PRINT "V=";0;:PLAY "V0O4T120L4XX$;"
    2790 PRINT 1;:PLAY "V1XX$;"
    2800 PRINT 2;:PLAY "V2XX$;"
    2810 PRINT 3;:PLAY "V3XX$;"
    2820 PRINT 4;:PLAY "V4XX$;"
    2830 PRINT 5;:PLAY "V5XX$;"
    2840 PRINT 6;:PLAY "V6XX$;"
    2850 PRINT 7;:PLAY "V7XX$;"
    2860 PRINT 8;:PLAY "V8XX$;"
    2870 PRINT 9;:PLAY "V9XX$;"
    2890 PRINT 10;:PLAY "V10XX$;":PRINT 11;:PLAY "V11XX$;"
    2900 PRINT 12;:PLAY "V12XX$;":PRINT 13;:PLAY "V13XX$;"
    2910 PRINT 14;:PLAY "V14XX$;":PRINT 15;:PLAY "V15XX$;"
    6005 CLS:PCLS
    6010 LOCATE 11,5:PRINT "Демонстрация октав в операторе PLAY":LOCATE 17,7:PRINT "Команда O (O1,...O8)":LOCATE 15,9
    6015 PRINT "O=";1;:PLAY "O1L2T120V15XX$;":PRINT 2;:PLAY "O2XX$;"
    6016 PRINT 3;:PLAY "O3XX$;":PRINT 4;:PLAY "O4XX$;"
    6017 PRINT 5;:PLAY "O5XX$;":PRINT 6;:PLAY "O6XX$;"
    6018 PRINT 7;:PLAY "O7XX$;":PRINT 8;:PLAY "O8XX$;"
    6060 CLS:PCLS
    6070 LOCATE 11,5:PRINT "Демонстрация длительности в операторе PLAY"

Внимание!!! Данная часть находится на оцифровке (плохо читаемый скан, который необходимо расшифровывать вручную)