БЕЙСИК
РУКОВОДСТВО ПРОГРАММИСТА

1. НАЗНАЧЕНИЕ ПРОГРАММЫ

Интерпретатор БЕЙСИК предназначен для проверки, анализа и выполнения операторов языка БЕЙСИК.

Интерпретатор работает под управлением операционной системы ФОДОС-2; объём оперативной памяти, занимаемой интерпретатором, не более 14K слов.

2. ХАРАКТЕРИСТИКИ ПРОГРАММЫ

Функции интерпретатора БЕЙСИК можно сократить или расширить введением новых модулей при генерации системы.

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

Средства расширения функций интерпретатора:

Процедура включения всех перечисленных средств расширения, кроме функций интерпретатора, описана в главе "БЕЙСИК. ОПИСАНИЕ ЯЗЫКА".

Функции интерпретатора включаются пользователем при запуске БЕЙСИК. Отказ от использования средств расширения позволяет экономить объём памяти и ускорить выполнение программ.

ПРИМЕЧАНИЕ. В данном документе предполагается, что команды, сообщения, данные или любой текст, вводимый пользователем с терминала, заканчиваются нажатием клавиши <ВК>.

3. ОБРАЩЕНИЕ К ПРОГРАММЕ

Интерпретатор языка БЕЙСИК может работать под управлением однозадачного SJ-, фоново/оперативного FB-мониторов, монитора с управлением памятью - ХМ.

При использовании FB- или ХМ-мониторов БЕЙСИК запускается как оперативное или фоновое задание.

3.1. Фоновый режим

Запуск интерпретатора БЕЙСИК в фоновом режиме и под управлением SJ-монитора допускается производить двумя способами:

  1. набрать команду .BASIC;
  2. набрать команду .R [DEV:] BASIC;

где

DEV

-  имя устройства содержащего файл интерпретатора BASIC.

Пример:

.RUN MY1:BASIC

с устройства MY1: запускается версия BASIC.SAV.

При запуске БЕЙСИК могут возникнуть следующие ошибки:

?KMON-F-FILE NOT FOUND
?KMON-F-NOT ENOUGH MEMORY

или

?NOT ENOUGH MEMORY FOR BASIC

Пример:

Запуск интерпретатора БЕЙСИК в фоновом режиме.

.BASIC
BASIC / 00 V.02
OPTIONAL FUNCTIONS (ALL, NONE, OR INDIVIDUAL)?

Ответ "A" включает все средства расширения функций интерпретатора. Ответ "N" не включает средства расширения. Ответ "I" включает отдельные средства расширения.

Пример.

OPTIONAL FUNCTIONS (ALL, NONE, OR INDIVIDUAL)? I
SYS? N
RCTRLO? N
ABORT? N
TTYSET? N
CTRLC & RCTRLC? N
TAB? Y
RND? Y
ABS? Y
SGN? Y
BIN? Y
OCT? Y
LEN? Y
ASC? Y
CHR¤? N
POS? N
SEG¤? N
VAL? N
TRM¤? Y
STR¤? Y
PI? Y
INT? Y
DAT¤? N
CLK¤? N
READY

при ответе "Y" данная функция включается в интерпретатор БЕЙСИК, при ответе "N" - данная функция не включается в интерпретатор.

3.2. Оперативный режим

Запуск интерпретатора БЕЙСИК в оперативном режиме выполняется командой:

.FRUN [DEV:]N:M

где

DEV

- имя рабочей версии интерпретатора;

 

M

- размер памяти для пользователя, не менее 1000 слов;

 

N

- ключевое слово.

Пример:

Запуск интерпретатора БЕЙСИК в оперативном режиме.

.FRUN BASIC/N:3000
Е>
BASIC / FODOS V.02
OPTIONAL FUNCTIONS (ALL, NONE, OR INDIVIDUAL)?

ФОДОС-2 печатает "." и "F>". Это указывает на то, что следующее за "." и "F>" сообщение печатается оперативным заданием. На вопрос

OPTIONAL FUNCTIONS (ALL, NONE, OR INDIVIDUAL)?

Набрать <СУ/F> и один из вариантов ответа (A, N или I).

3.3. Запуск интерпретатора БЕЙСИК командным файлом

Запуск интерпретатора БЕЙСИК командным файлом выполняется командой:

.@FILE

где

FILE

-  спецификация командного файла.

Командный файл может быть создан любым редактором текста или с помощью команды монитора COPY.

Пример создания командного файла MINRUN.COM:

.COPY TT: MY1: MINRUN.COM
.R BASIC
.I

далее в каждой строке этого файла указываются ответы, согласно приведённого примера: Y,Y,N,Y,N,N,N,Y,Y,Y,N,N,N,N,N,Y,N,N,Y,Y,Y,N,Y.

Создание файла завершается управляющим кодом СУ/Z. Пример:

Запуск интерпретатора БЕЙСИК командным файлом MINRUN.

.@MINRUN .R BASIC
BASIC / FODOS V.02
OPTIONAL FUNCTIONS (ALL, NONE, OR INDIVIDUAL)? I
SYS? Y
RCTRLO? Y
ABORT? N
TTYSET? Y
CTRLC & RCTRLC? N
TAB? N
RND? N
ABS? Y
SGN? Y
BIN? Y
OCT? N
LEN? N
ASC? N
CHR¤? N
POS? N
SEG¤? Y
VAL? N
TRM¤? N
STR¤? Y
PI? Y
INT? Y
DAT¤? N
CLK¤? Y
READY

3.4. Останов программ БЕЙСИК

Команда <СУ/C>, набранная дважды, останавливает выполнение программы немедленно. Интерпретатор печатает сообщение:

STOP AT LINE ХХХХХ

где

ХХХХХ

-  номер строки программы, на которой произошло прерывание.

Команда <СУ/C>, набранная один раз, продолжает выполнение программы до тех пор, пока БЕЙСИК не встретит оператор ввода данных. Выполнение программы прерывается и интерпретатор печатает сообщение: STOP AT LINE ХХХХХ. Команда <СУ/C> не возвращает управление монитору. Возврат управления монитору выполняется командой BYE.

При работе БЕЙСИК в оперативном режиме набрать команду:

UNLOAD FG

в ответ на сообщение "B>".

Пример:

BYE
B>
UNLOAD FG

4. ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ

Формат спецификации файлов интерпретатора языка БЕЙСИК:

[DEVICE:][FILE][.TYPE]

где

DEVICE

- имя устройства, на котором находится файл;

 

FILE

- имя файла (от одного до шести символов);

 

TYPE

- тип файла.

В табл. 1 перечислены имена устройств, используемых интерпретатором языка БЕЙСИК.

Таблица 1

Наименование устройства

Назначение

DX, DXN

Гибкий диск с одинарной плотностью записи информации диаметром 207 мм

MX, MXN

Гибкий диск с одинарной плотностью записи информации диаметром 133 мм

MY, MYN

Гибкий диск с удвоенной плотностью записи информации диаметром 133 мм

LP

Устройство печати

ТТ

Системный терминал

SY, SYN

Логическое имя устройства, с которого загружена система

DK, DKN

Логическое имя устройства используется по умолчанию

Если формат спецификации файла не указан полностью, БЕЙСИК определяет отсутствующие элементы по умолчанию, приведённые в табл. 2 и табл. 3.

Таблица 2

Оператор или команда

Имя файла по умолчанию

SAVE, REPLACE, COMPILE

Имя текущей программы

OLD, APPEND, CHAIN, OVERLAY

NONAME

UNSAVE, OPEN, KILL, NAME

Система печатает сообщение об ошибке ?IFS

 

Таблица 3

Оператор или команда

Тип файла по умолчанию

Одинарная точность

Двойная точность

OPEN, KILL, NAME

SAVE, UNSAVE

.DAT

.DAT

REPLACE, APPEND

.BAS

.BAS

COMPILE

.BAC

.BAX

RUN, OLD

.BAC

(.BAS, если не найден файл с типом .BAC)

.BAX

(.BAS, если не найден файл с типом .BAX)

 

5. ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ ИНТЕРПРЕТАТОРА БЕЙСИК

5.1. Функция TTYSET.

Функция TTYSET устанавливает характеристики для терминала пользователя.

Формат функции:

[LET] VAR=TTYSET(255%,ЕХР)

где

VAR

- переменная;

 

ЕХР

- выражение, устанавливающее длину вводимой строки для данного терминала на значение ЕХР минус единица.

В результате интерпретатор автоматически выводит последовательность "ВК" и "ПС", если ЕХР-1 символов были напечатаны, и следующий символ печатается на другой строке. Пример:

A=TTYSET(255%,81%)

Если первый аргумент отличен от 255%, или значение ЕХР равно 1 или больше 255%, интерпретатор печатает сообщение об ошибке:

?ARGUMENT ERROR (?ARG)

5.2. Функция RCTRLO.

Команда <СУ/O> прекращает вывод данных на терминал до тех пор, пока не будет набрана повторно.

Функция RCTRLO подавляет действие команды <СУ/O>. Формат функции:

[LET] VAR=RCTRLO

где

VAR

- переменная. Содержит неопределённое значение после выполнения оператора.

Пример:

10 OPEN "DATA" FOR OUTPUT AS FILE #1
20 FOR I=1 TO 100 \ PRINT #1,I \ NEXT I
30 CLOSE #1
40 OPEN "DATA" FOR INPUT AS FILE #3
50 PRINT "Данные в файле:"
60 IF END #3 THEN 110
70 INPUT #3,D
80 PRINT D
90 T=T+D
100 GOTO 60
110 A = RCTRLO
120 PRINT "Сумма = ";T
READY
RUNNH

Данные в файле:

1
2
3
4
<СУ/O>         - вывод данных прекращается.
Сумма = 5050   - вывод данных возобновляется после выполнения строки 110.
READY

5.3. Функции CTRLC & RCTRLC

Функция RCTRLC блокирует действие команды <СУ/C>. Формат функции:

[LET] VAR=RCTRLC

где

VAR

- переменная. Содержит неопределённое значение после выполнения оператора.

Функция CTRLC разрешает действие команды <СУ/C>. Формат функции:

[LET] VAR=CTRLC

где

VAR

- переменная. Содержит неопределённое значение после выполнения оператора.

Пример:

1000 REM прерывание запрещено
1010 A=RCTRLC
1015 FOR I=1 TO 1000 \ S = S + I \ NEXT I
1020 PRINT "Нет прерывания"
1100 REM прерывание разрешено
1110 A=CTRLC
1120 PRINT "Есть прерывание"
1130 FOR I = 1 TO 1000 \ S = S + I \ NEXT I
32767 END
READY
RUNNH
<СУ/C><СУ/C>
Нет прерывания Есть прерывание <СУ/C><СУ/C>
STOP AT LINE 1130 READY

5.4. Функция ABORT.

Функция ABORT завершает выполнение программ и, в зависимости от значения аргумента, удаляет или оставляет программу в памяти.

Формат функции:

[LET] VAR = ABORT(ЕХР)

где

VAR

- переменная. Содержит неопределённое значение после выполнения оператора;

 

ЕХР

- выражение. Принимает значение 0 или 1.

0 - программа, после завершения, остаётся в памяти.

1 - программа, после завершения, стирается из памяти, оставляя заголовок NONAME.

Пример:

10 PRINT "123"
20 A=ABORT(1)
30 PRINT "456"
RUNNH
123
READY
LIST
NONAME 21-JUL-87 14:53:30
READY

5.5. Функция SYS

Формат функции:

[LET] VAR=SYS(EXP1,EXP2)

где

VAR

- переменная;

 

EXP1

- определяет выполняемую функцию;

 

EXP2

- произвольный аргумент.

В табл. 4 перечислены допустимые значения EXP1.

Таблица 4

EXP1

Назначение

1

Обрабатывается вводимый с терминала символ и возвращается его семибитное значение в коде КОИ-7 переменной VAR.

4

Возвращается управление монитору.

6

При блокировании действия <СУ/C> функцией RCTRLC интерпретатор анализирует, была ли набрана комбинация <СУ/C> во время выполнения программы. Переменной VAR возвращается значение ноль, если комбинация <СУ/C> не набрана, и 1, если комбинация <СУ/C> набрана.

7

Действие функции SYS(7) зависит от значения произвольного аргумента EXP2. Символы передаются на терминал без изменения, если EXP2 равно 0. Символы нижнего регистра преобразуются на эквивалентные символы верхнего регистра, если EXP2=1.

5.6. Примеры использования функции SYS

Пример 1.

Функция SYS(1).

20 PRINT "Напечатайте cимвoл:";SMR(A)
10 A=SYS(1)
40 PRINT "Значение ";CHR¤(A);"В коде КОИ-7 равно ";
60 PRINT A
RUNNH
Напечатайте символ: Z
Значение Z в коде КОИ-7 равно 90
READY

Пример 2.

Функция SYS(4).

10 PRINT "До свидания"
20 A=SYS(4)
RUNNH
До свидания

Пример 3.

Функция SYS(6)

10 A=RCTRLC \ REM запрещение СУ/C
30 B=SYS(6) \ REM проверка запрещения СУ/C
40 IF B=1 THEN 100
50 PRINT "Программа выполняется"
60 GOTO 30
100 PRINT "Программа завершена"
110 A=CTRLC \ REM разрешение СУ/C
120 A=ABORT(1)
RUNNH
Программа выполняется
Программа выполняется <СУ/C><СУ/C>
Программа завершена
READY
STOP
READY

Пример 4.

Функция SYS(7,EXP2).

10 REM проверка функции SYS(7,EXP2)
20 PRINT "Y,N "; \ REM разрешить нижний регистр
30 INPUT 
40 IF  = "Y" THEN 100
50 IF <>"N" THEN 20
60 A=SYS(7,1) \ REM нижний регистр запрещен
70 GOTO 32767
100 A=SYS(7,0) \ REM нижний регистр разрешен
32767 END
RUNNH
Y,N ? Y
READY
Нижний регистр разрешен

6. ВКЛЮЧЕНИЕ ПРОГРАММ НА ЯЗЫКЕ АССЕМБЛЕР

БЕЙСИК позволяет включать программы, написанные на языке Ассемблер (ПЯА), для расширения возможностей интерпретатора.

В настоящем разделе описаны:

6.1. Включение программ пользователя в интерпретатор БЕЙСИК

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

ADR1

--->---

C1

N

ADR2

 

C2

C3

ADR3

 

.
.
.

.
.
.

 

 

PAR

CN

ADRN

 

START

0

 

 

 

Рис.1

C1

- первый символ имени программы.

CN

- N-ый символ имени программы.

N

- число символов в имени программы.

PAR

- контрольный байт.

START

- стартовый адрес программы.

ADR1

- точка входа 1-ой программы.

ADRN

- точка входа N-ой программы.

Есть два варианта включения ПЯА в интерпретатор БЕЙСИК.

Вариант 1.

Имя программы пользователя определяется в самой программе. В этом случае таблица указателей файла BSCLI.MAC выглядит следующим образом:

                .
                .
                .
        .GLOBL INITNM, ADDNM, ROUTNM
FTABI:  .WORD FTBL
FTBL:   .WORD INITNM ;программа пользователя
        .WORD ADDNM
        .WORD ROUTNM
        .WORD 0
                .
                .
                .
        .END

где INITNM, ADDNM, ROUTNM - точки входа программ пользователя INITIT, ADDER, ROUTUS.

Пример.

Программа ADDER.

        ; Программа ADDER
        .GLOBL ADDNM
ADDNM:  .BYTE 5        ; число символов в имени
                       ; программы
        .ASCII "ADDER"
        .EVEN
        .WORD ADDST
ADDST:          .      ;начало программы
                .
                .

Вариант 2.

Имя и адрес запуска программ пользователя определяется в конце таблицы указателей файла BSCLI.MAC.

                .
                .
        .GLOBL INITST, ADDST, ROUTST
FTABI:  .WORD FTBL
FTBL:   .WORD INITNM
        .WORD ADDNM
        .WORD ROUTNM
        .WORD 0
INITNM: .BYTE 6         ; количество символов
        .ASCII "INITIT" ; в имени программы
        .EVEN
        .WORD INITST
ADDNM:  .BYTE 5
        .ASCII "ADDER"
        .EVEN
        .WORD ADDST
ROUTNM: .BYTE 6
        .ASCII "ROUTUS"
        .EVEN
        .WORD ROUTST
                .
                .
                .
        .END

Пример:

Программа ADDER.

        ; Программа ADDER
        .GLOBL ADDST
ADDST:          .       ;начало программы
                .
                .
 

Таблица указателей файла BSCLI.MAC корректируется текстовым редактором. Таблица начинается меткой FTBL и оканчивается директивой ".WORD 0".

При написании программы ПЯА необходимо придерживаться требований, предъявляемых к составлению программ на языке Ассемблер.

6.2. Пересылка аргументов оператором CALL

Оператор CALL вызывает программы пользователя, включенные в интерпретатор БЕЙСИК. При выполнении оператора CALL интерпретатор передаёт ПЯА значения аргументов и описание их типов, как показано на рис 2.

 

 

POINTER

--->---

D1

R5

--->--

COD

N

 

D2

 

 

POINT.ARG1

 

.
.
.

 

 

POINT.ARG2

 

 

 

.
.
.

 

DN

 

 

 

 

 

 

POINT.ARGN

 

 

Рис.2

D1

- дескриптор 1-го аргумента.

DN

- дескриптор N-го аргумента.

POINTER

- указатель списка дескрипторов.

COD

- код 202.

N

- количество аргументов.

POINT.ARG1

- указатель 1-го аргумента.

POINT.ARGN

- указатель N-го аргумента.

R5

- регистр R5.

Регистр R5 содержит адрес слова, младший байт которого определяет количество аргументов в операторе CALL, старший байт - код 202.

В табл. 5 показаны значения битов слова дескриптора аргумента. Если младший бит слова дескриптора равен 0, то слово дескриптора является указателем дескриптора массива или строки. Бит 7-ой устанавливается в 1, если ПЯА не возвращает значение аргумента через оператор CALL. Бит 7-ой устанавливается в 0, если ПЯА возвращает значение аргумента.

Таблица 5

Биты

Значение

Тип аргумента

0

1

Числовая константа

1

Ноль - аргумент

0

Числовой массив

0

Строковая константа

0

Строковый массив

1-6 (тип данных)

11

Целое число

20

Число с пл. запятой одинарной точности

21

Число с пл. запятой двойной точности

40

Строка

77

Ноль - аргумент

7

0

Переменная

1

Выражение

1

Ноль - аргумент

8-12 (формат данных)

9

Целое число

2

Строка

4

Число с пл. запятой одинарной точности

10

Число с пл. запятой двойной точности

0

Ноль - аргумент

13-15

0

Элемент массива

0

Ноль - аргумент

1

Массив

6.2.1. Строки и строковые массивы

На рис 3 приведён формат дескрипторов массивов и строковых аргументов.

 

Список дескрипторов
аргументов

 

 

 

DSRP.ARG.CONST.

 

 

 

DSRP.ARG.CONST.

 

 

 

POINT.DSRP.ARRAY

--- > ---

DSRP.ARRAY

DSRP.ARG.CONST.

 

0

.

 

SIZE

.

 

0

N

.

 

0

.

 

HIGH LIMIT SUBSCR.1

.

 

0

.

 

HIGH LIMIT SUBSCR.2

DSRP.ARG.CONST.

 

 

 

POINT.DSRP.STR

--- > ---

DSRP.ARG.STR

DSRP.ARG.CONST.

 

POINT.STR

Рис.3

DSRP.ARRAY

- дескриптор массива.

SIZE

- размер массива (в байтах).

N

- количество индексов массива.

HIGH LIMIT SUBSCR.1

- верхняя граница 1-го индекса.

HIGH LIMIT SUBSCR.2

- верхняя граница 2-го индекса.

DSRP.ARG.STR

- дескриптор строкового аргумента.

POINT.STR

- указатель обращения к строке.

POINT.DSRP.ARRAY

- указатель дескриптора массива.

POINT.DSRP.STR

- указатель дескриптора строкового скаляра.

DSRP.ARG.CONST.

- дескриптор аргумента (числовая константа).

Указатель обращения к строке строкового массива (POINT.STR) вычисляется по формуле:

POINT.STR = 2*OFFSET + POINT.ARG

где OFFSET - смещение (позиция элемента относительно начала массива).

Указатель аргумента (POINT.ARG) для строкового массива указывает начало массива. Смещение элемента одномерного массива равно значению его индекса. Смещение элемента двумерного массива определяется по формуле: OFFSET=SUBSCR.1 * (MAX SUBSCR.2 + 1)+ SUBSCR.2

Пример.

Определение указателя обращения к строке на примере массивов (5) и (3,10). Указатели аргументов - A и B соответственно.

Элемент массива

Формула вычисления

Указатель обращения к строке

(0)

2*0 + A

A

(5)

2*5 + A

10 + A

(3,5)

2* (3*11 + 5) + B

76 + B

(0,1)

2*(0*11 + 1) + B

2 + B

(2,10)

2*(2*11 + 10) + B

64 + B

6.2.2. Программы доступа к строковому аргументу.

В состав интерпретатора БЕЙСИК входят программы доступа к строкам, которые используются программами, написанными на языке Ассемблера:

  1. ¤FIND
  2. ¤ALC
  3. ¤STORE
  4. ¤DEALC

При написании ПЯА необходимо придерживаться определённой последовательности в использовании строковых аргументов:

  1. обращение к строке с помощью функции ¤FIND, которая определяет длину строки и указатель 1-го символа;
  2. создание временной строки в стеке функцией ¤ALC для записи промежуточных результатов работы;
  3. чтение символов строкового аргумента, обработка их и запись во временную строку;
  4. перезапись временной строки в исходный строковый аргумент функцией ¤STORE;
  5. удаление из стека временной строки функцией ¤DEALC. Регистр R5, перед выполнением перечисленных функций, должен содержать адрес слова, младший байт которого определяет число аргументов в операторе CALL, старший байткод 202.

Программы доступа к строкам вызываются инструкцией: JSR PC, имя программы

6.3. Использование внутренних программ интерпретатора БЕЙСИК

6.3.1. Программа обработки ошибок ¤ARGER

Программа печатает сообщение интерпретатора при возникновении неустранимой ошибки:

?ARGUMENT ERROR AT LINE ХХХХХ или
?ARG AT LINE ХХХХХ

где ХХХХХ - номер строки с оператором CALL.

Обращение к программе:

JMP ¤ARGER

При использовании оператора CALL в непосредственном режиме сообщение не выдаётся. Интерпретатор печатает READY.

6.3.2. Программа ¤ВОМВ

Программа печатает сообщение пользователя при возникновении неустранимой ошибки:

?Сообщение об ошибке AT LINE ХХХХХ

где ХХХХХ - номер строки с оператором CALL.

Обращение к программе:

JSR R1, ¤ВОМВ
.ASCII "Сообщение"
.EVEN

При использовании оператора CALL в непосредственном режиме сообщение не выдаётся. Интерпретатор печатает READY.

6.3.3. Программа ¤MSG

Программа печатает сообщение пользователя и передаёт управление инструкции, следующей за директивой .EVEN, Обращение к программе:

JSR R1, ¤MSG
.ASCII "Сообщение"
.BYTE 15,12,0
.EVEN

6.3.4. Программа ¤CHROT

Программа ¤CHROT печатает на терминале символ, засылаемый пользователем в младший байт регистра R0. Обращение к программе:

JSR PC,¤CHROT

6.3.5. Стандартные подпрограммы

В табл. 6 приведены стандартные подпрограммы интерпретатора БЕЙСИК.

Таблица 6

Операция,
функция

Оператор

Обозначение

Подпрограммы одинарной точности

Подпрограммы двойной точности

Сложение

+

C = A + B

¤ADR

¤ADD

Вычитание

-

C = A - B

¤SBR

¤SBD

Умножение

*

C = A * B

¤MLR

¤MLD

C% = A% * B%

¤ML

¤MLI

Деление

/

C = A / B

¤DVR

¤DVD

C% = A% / B%

¤DV

¤DVI

Возведение в степень

^

C = A ^ B

XFF¤

XDD¤

C = A ^ B%

XFI¤

XDI¤

C% = A% ^ B%

XII¤

XII¤

Преобразование типа данных

 

B% = A

¤RI

¤DI

B = A%

¤IR

¤ID

Функция усечения

 

B = SGN(A) * INT(ABS(A))

¤INTR

¤DINT

Синус

 

B = SIN(A)

SIN

DSIN

Косинус

 

B = COS(A)

COS

DCOS

Арктангенс

 

B = ATN(A)

ATAN

DATAN

Логарифм

 

B = LOG(A)

ALOG

DLOG

B = LOG10(A)

ALOG10

DLOG10

Квадратный корень

 

B = SQR(A)

SQRT

DSQRT

Экспоненциальная функция

 

B = ЕХР(A)

ЕХР

DEXP

Стандартные подпрограммы со знаком денежной единицы "¤" вызываются программой ¤POLSH. Обращение к программе ¤POLSH выполняется инструкцией:

JSR R4,¤POLSH ,

за которой следует список вызываемых подпрограмм. Программа ¤UNPOL завершает список.

Пользователь определяет имена программ ¤POLSH, ¤UNPOL и программ списка как глобальные в ПЯА.

Аргументы между программой пользователя (ПЯА) и стандартными подпрограммами передаются через стек. При занесении аргументов в стек чисел с плавающей запятой двойной и одинарной точности первой заносится младшая часть числа (одно или два слова), затем старшая часть числа (одно или два слова). Аргументы заносятся в той же последовательности, в какой они приведены в обозначении подпрограмм (см. табл. 5).

После выполнения операций результат заносится на место аргумента A. После выполнения операций подпрограммами ¤RI, ¤DI результат заносится на место младшей части аргумента A.

Программа ПЯА создаёт список аргументов перед обращением к подпрограммам SIN, COS, ATAN, ALOG, ALOG10, SQRT, ЕХР (рис. 4 и рис. 5). Результат вычислений записывается в регистры R0 и R1 (одинарная точность) и R0, R1, R2, R3 (двойная точность).

Список аргументов для стандартных подпрограмм одинарной точности

POINTER LIST

--- > ---

0

1

 

 

 

 

POINTER ARG.

--- > ---

HIGH WORD

 

 

 

 

 

LOW WORD

Рис.4

Список аргументов для стандартных подпрограмм двойной точности

POINTER LIST

--- > ---

0

1

 

 

 

 

POINTER ARG.

--- > ---

HIGH WORD

 

 

 

 

LOW WORD

 

 

 

 

LOW WORD

 

 

 

 

LOW WORD

Рис.5

 

POINTER LIST

- указатель списка (регистр R5).

POINTER ARG.

- указатель аргумента.

HIGH WORD

- старшее слово аргумента.

LOW WORD

- младшее слово аргумента.

Пример.

Составление программы на языке Ассемблер. Обращение к программе:

CALL HYPOT(A,B,C,C%)

Текст программы:

        .TITLE  HYPOT
        .PSECT  SUBRS,RO,I
        .GLOBL  HYPTAB
HYPTAB: .BYTE   5                     ; определяется имя
        .ASCII  'HYPOT'               ; программы
        .EVEN
        .WORD   HYPOT
        .GLOBL  ¤MLR, XFI¤, ¤ADR, SQRT, ¤RI
HYPOT:   CMP    (R5)+,#4
         BEQ    20¤
10¤:     JMP    ¤ARGER
20¤:     CMPB   (R5)+,#202
         BNE    60¤
         MOV    SP,R3
         SUB    #30.,R3
         CMP    R3,R4
         BHIS   30¤
         JSR    R1,¤BOMB
         .ASCIZ 'переполнение стека'
         .EVEN
30¤:     MOV    -4(R5),R4           ; проверка соот-
         JSR    PC,GETDSC           ; ветствия пересы-
         BIC    #160201,R3          ; лаемых аргумен-
         CMP    #2040,R3            ; тов
         BNE    10¤
         JSR    PC,GETDSC
         BIC    #160201,R3
         CMP    #2040,R3
         BNE    10¤
         JSR    PC,GETDSC
         BIC    #160001,R3
         CMP    #2040,R3
         BNE    10¤
         JSR    PC,GETDSC
         BIC    #160001,R3
         CMP    #1022,R3
         BNE    10¤
60¤:     MOV    (R5)+,R3             ;засылка аргумен-
         MOV    2(R3), -(SP)         ;тов для работы
         MOV    (R3), (SP)           ;программы
         MOV    2(R3), -(SP)         ;¤MLR
         MOV    (R3),-(SP)
         JSR    R4,¤POLSH
         ¤MLR
         ¤UNPOL
         MOV    (R5)+,R3             ;засылка аргу-
         MOV    2(R3), -(SP)         ;ментов для pa-
                                     ; боты программ
         MOV    (R3), -(SP)          ;XFI¤,¤ADR
         MOV    #2,-(SP)
         JSR    R4,¤POLSH
         XFI¤
         ¤ADR
         ¤UNPOL
         MOV    R5,-(SP)
         MOV    SP,R5
         TST    (R5)+
         MOV    R5,-(SP)
         MOV    #1,-(SP)
         MOV    SP,R5
         JSR    PC,SQRT
         CMP    (SP)+,(SP)+
         MOV    (SP)+,R5             ; засылка резуль-
         MOV    (R5)+,R3             ;тата
         MOV    R0, (R3)+            ; вычислений в
         MOV    R1,2(SP)             ;C,C%
         MOV    R0,(SP)
         JSR    R4,¤POLSH
         ¤RI
         ¤UNPOL
         MOV    (SP)+,@(R5)+
         RTS    PC
GETDSC:  MOV    (R4)+,R3
         BIT    #1,R3
         BNE    10¤
         MOV    (R3),R3
10¤:     RTS    PC
         .END

7. СООБЩЕНИЯ

Интерпретатор языка БЕЙСИК в процессе работы осуществляет синтаксическую проверку введённых операторов и команд, и в случае обнаружения ошибок выводит сообщения о них (приложения 1, 2).

ПРИЛОЖЕНИЕ 1
Сообщения об ошибках БЕЙСИК

?ARGUMENT ERROR (?ARG)

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

?ARRAYS TOO LARGE (?ATL)

мал объём памяти для массива, указанного в операторе DIM.

?BAD DATA READ (?BDR)

элементы данных, вводимых оператором DATA, не соответствуют типу данных в операторе READ.

?BAD DATA - RETYPE FROM ERROR (?BRT)

данные, вводимые оператором INPUT, не соответствуют типу данных, указанных в этом операторе.

?BAD LOG (?BLG)

аргумент функции LOG или LOG10 равен нулю или отрицательному значению.

?BUFFER STORAGE OVERFLOW (?BSO)

превышен объём программы пользователя.

?CANNOT DELETE FILE (?CDF)

в командах UNSAVE и KILL указан несуществующий файл.

?CHANNEL ALREADY OPEN (?CAO)

оператор OPEN открывает один из двенадцати каналов ввода-вывода, который был уже открыт.

?CHANNEL I/O ERROR (?CIE)

произошла ошибка ввода-вывода

?CHANNEL NOT OPEN (?CNO)

программа выполняет операцию ввода-вывода на одном из двенадцати каналов, который предварительно не был открыт.

?CHECKSUM ERROR IN - COMPILED PROGRAM (?CCP)

ошибка, возникшая при работе оператора COMPILE.

?COMMON OUT OF ORDER (?COO)

нарушена последовательность аргументов в операторе COMMON.

?CONTROL VARIABLE OUT OF RANGE (?CVO)

неверно указан номер строки в операторах управления программой.

?DIVISION BY ZERO (?DVO)

деление на ноль.

?END NOT LAST (?ENL)

оператор END не последний в программе.

?ERROR CLOSING CHANNEL (?ECC)

ошибка, возникшая при pa- боте операторе CLOSE.

?EXCESS INPUT IGNORED (?EII)

при работе оператора INPUT вводится больше данных, чем требуется.

?EXPONENTIATION ERROR (?ERR)

неверные аргументы для функции ЕХР.

?EXPRESSION TOO COMPLEX (?ETC)

вычисляемое выражение переполняет стек.

?FILE ALREADY EXISTS (?FAE)

оператор OPEN FOR INPUT открывает открытый файл.

?FILE NOT FOUND (?FNF)

требуемый файл не находится на определённом устройстве.

?FILE PRIVILEGE VIOLATION (?FPV)

попытка нарушить защиту файла.

?FLOATING OVERFLOW (?FOV)

переполнение в результате вычислений с плавающей запятой. БЕЙСИК присваивает значение 0 и продолжает выполнение.

?FLOATING UNDERFLOW (?FUN)

значение результата вычислений меньше, чем 10^-38. БЕЙСИК присваивает значение 0 и продолжает выполнение.

?FOR WITHOUT NEXT (?FWN)

программа содержит оператор FOR без соответствующего оператора NEXT.

?FUNCTION ALREADY DEFINED (?FAD)

функция пользователя FN определена повторно.

?ILLEGAL CHANNEL NUMBER (?ICN)

указанный номер канала не входит в диапазон 1-12.

?ILLEGAL DEF (?IDF)

недопустимый формат оператора DEF.

?ILLEGAL DIM (?IDM)

синтаксическая ошибка в операторах DIM или COMMON.

?ILLEGAL END OF FILE INCOMPILED PROGRAM (?IEF)

недопустимый конец файла скомпилированной программы. Ошибка, возникшая при работе оператора COMPILE.

?ILLEGAL FILE LENGTH (?IFL)

размер файла в операторе OPEN превосходит максимально возможную длину.

?ILLEGAL FILE SPECIFICATION (?IFS)

недопустимая спецификация файла.

?ILLEGAL IN IMMEDIATE MODE (?IIM)

обращение к операторам INPUT и INPUT# в непосредственном режиме.

?ILLEGAL I/O DIRECTION (?IID)

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

?INCONSISTENT NUMBER OF SUBSCRIPTS (?INS)

обращение к двухмерному массиву как к одномерному, и наоборот.

?INPUT STRING ERROR (?ISE)

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

?INTEGER OVERFLOW (?IOV)

переполнение в результате вычислений целых чисел.

?LINE TOO LONG (?LTL)

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

?LINE TOO LONG TO TRANSLATE (?TLT)

символьная строка больше объёма памяти, отведённой для трансляции.

?MISSING SUBPROGRAM (?MSP)

в операторе CALL указывается имя несуществующей программы.

?NEGATIVE SQUARE ROOT (?NGS)

попытка извлечь квадратный корень из отрицательного числа. БЕЙСИК присваивает значение 0 и продолжает выполнение.

?NESTED FOR STATEMENTS WITH SAME CONTROL VARIABLE (?FSV)

имеется два или больше вложенных операторов FOR с одной и той же переменной цикла.

?NEXT WITHOUT FOR (?NWF)

программа содержит оператор NEXT без соответствующего оператора FOR.

?NOT A VALID DEVICE (?NVD)

неверное имя устройства в спецификации файла.

?NOT ENOUGH ROOM (?NER)

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

?NUMBERS AND STRINGS (?NSM)

попытка выполнить действия  с числовыми и строковыми выражениями совместно.

?OUT OF DATA (?OOD)

недостаточно данных в операторе DATA для оператора READ.

?PRINT USING ERROR (?PRU)

неверный формат оператора PRINT USING.

?PROGRAM TOO BIG (?РТВ)

введённая программа больше объёма памяти пользователя.

?RESEQUENCE ERROR (?RES)

ошибка, возникшая при выполнении оператора RESEQ.

?RETURN WITHOUT GOSUB (?RWG)

попытка выполнить оператор RETURN до выполнения GOSUB.

?STRING STORAGE OVERFLOW (?SSO)

недостаточно памяти для хранения программы.

?STRING TOO LONG (?STL)

символьная строка превышает 255 символов.

?SUBSCRIPT OUT OF BOUNDS (?SOB)

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

?SUBSTITUTE ERROR (?SUB)

неверный формат оператора SUB.

?SYNTAX ERROR (?SYN)

интерпретатор БЕЙСИК встретил нераспознаваемую команду или оператор.

?TO MANY GOSUBS (?TMG)

число вложенных GOSUB превысило 20.

?TO MANY ITEMS IN COMMON (?TIC)

число аргументов оператора COMM0N превышает 255.

?UNDEFINED FUNCTIONS (?UFN)

не определена функция пользователя FN.

?UNDEFINED LINE NUMBER (?ULN)

неопределённый номер строки.

?UNDIMENSIONED ARRAY IN CALL (?UAC) 

массив, указанный в операторе CALL, не определён в операторе DIM.

?USE REPLACE (?RPL)

попытка сохранить файл, уже имеющийся на устройстве файловой структуры, командой SAVE.

?VIRTUAL ARRAY CHANNEL ALREADY IN USE (?VSU)

один и тот же номер канала используется в двух или более операторах DIM.

 

 

ПРИЛОЖЕНИЕ 2
УСЛОВИЯ ВОЗНИКНОВЕНИЯ ОШИБОК

При использовании функций в программах, написанных на языке БЕЙСИК, могут возникнуть ошибки, описанные в таблице.

Таблица

Функция

Сообщение об ошибках

Условия возникновения ошибки

Все

?ARGUMENT ERROR

Аргументы в вызове функции не соответствуют типу аргументов, определённых для данной функции.

Все

?SYNTAX ERROR

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

ASC(STR)

?ARGUMENT ERROR

STR - не односимвольная строка.

BIN(STR)

?ARGUMENT ERROR

STR - строка, содержащая символы, отличные от пробела, 0 или 1, или значение STR больше 2^16.

CHR¤(ЕХР)

?ARGUMENT ERROR

Значение ЕХР вне допустимого диапазона (0-32767).

ЕХР(ЕХР)

?EXPONENTIATION ERROR

Значение ЕХР больше 87.

FNL

?UNDEFINED FUNCTION

Функция FNL не определена оператором DEF.

LOG(ЕХР)

?BAD LOG

Значение ЕХР равно нулю или отрицательному значению. БЕЙСИК присваивает значение 0 и продолжает выполнение.

LOG10(ЕХР)

?BAD LOG

Значение ЕХР равно нулю или отрицательному значению. БЕЙСИК присваивает значение 0 и продолжает выполнение.

OCT(STR)

?ARGUMENT ERROR

STR - строка, содержащая символы, отличные от пробела, 0-7, или значение STR больше 2^16.

PI

?SYNTAX ERROR

Неверный формат функции.

SQR(ЕХР)

?NEGATIVE SQUARE ROOT

Значение ЕХР отрицательное. БЕЙСИК присваивает значение 0 и продолжает выполнение.

TAB(ЕХР)

?ARGUMENT ERROR

Значение ЕХР вне допустимого диапазона (0-32767).

VAL(STR)

?ARGUMENT ERROR

STR - строка, включающая другие символы, кроме цифр.

 

 

Performed by © gid, 2012-2024.