БЕЙСИК
РУКОВОДСТВО ПРОГРАММИСТА
1. НАЗНАЧЕНИЕ ПРОГРАММЫ
Интерпретатор БЕЙСИК предназначен для проверки, анализа и выполнения операторов языка БЕЙСИК.
Интерпретатор работает под управлением операционной системы ФОДОС-2; объём оперативной памяти, занимаемой интерпретатором, не более 14K слов.
2. ХАРАКТЕРИСТИКИ ПРОГРАММЫ
Функции интерпретатора БЕЙСИК можно сократить или расширить введением новых модулей при генерации системы.
Функции, реализуемые включаемыми модулями, являются необязательными для интерпретатора БЕЙСИК и отсутствуют в минимальной конфигурации.
Средства расширения функций интерпретатора:
- операторы: CALL, PRINT USING;
- команды: SUB, RESEQ;
- трансцендентные функции: SQR, SIN, COS, ATN, LOG, LOG10, ЕХР;
- функции интерпретатора: SYS, RCTRLO, ABORT, TTYSET, CTRLC, RCTRLC, TAB, RND, ABS, SGN, BIN, OCT, LEN, ASC, CHR¤, POS, SEG¤, VAL, TRM¤, STR¤, PI, INT, DAT¤, CLK¤;
- арифметика с двойной точностью;
- расширенные сообщения об ошибках;
- работа БЕЙСИК в оперативном и фоновом режимах;
- средства оверлейности.
Процедура включения всех перечисленных средств расширения, кроме функций интерпретатора, описана в главе "БЕЙСИК. ОПИСАНИЕ ЯЗЫКА".
Функции интерпретатора включаются пользователем при запуске БЕЙСИК. Отказ от использования средств расширения позволяет экономить объём памяти и ускорить выполнение программ.
ПРИМЕЧАНИЕ. В данном документе предполагается, что команды, сообщения, данные или любой текст, вводимый пользователем с терминала, заканчиваются нажатием клавиши <ВК>.
3. ОБРАЩЕНИЕ К ПРОГРАММЕ
Интерпретатор языка БЕЙСИК может работать под управлением однозадачного SJ-, фоново/оперативного FB-мониторов, монитора с управлением памятью - ХМ.
При использовании FB- или ХМ-мониторов БЕЙСИК запускается как оперативное или фоновое задание.
3.1. Фоновый режим
Запуск интерпретатора БЕЙСИК в фоновом режиме и под управлением SJ-монитора допускается производить двумя способами:
|
||
где |
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 перечислены имена устройств, используемых интерпретатором языка БЕЙСИК.
Наименование устройства |
Назначение |
---|---|
DX, DXN |
Гибкий диск с одинарной плотностью записи информации диаметром 207 мм |
MX, MXN |
Гибкий диск с одинарной плотностью записи информации диаметром 133 мм |
MY, MYN |
Гибкий диск с удвоенной плотностью записи информации диаметром 133 мм |
LP |
Устройство печати |
ТТ |
Системный терминал |
SY, SYN |
Логическое имя устройства, с которого загружена система |
DK, DKN |
Логическое имя устройства используется по умолчанию |
Если формат спецификации файла не указан полностью, БЕЙСИК определяет отсутствующие элементы по умолчанию, приведённые в табл. 2 и табл. 3.
Оператор или команда |
Имя файла по умолчанию |
---|---|
SAVE, REPLACE, COMPILE |
Имя текущей программы |
OLD, APPEND, CHAIN, OVERLAY |
NONAME |
UNSAVE, OPEN, KILL, NAME |
Система печатает сообщение об ошибке ?IFS |
Оператор или команда |
Тип файла по умолчанию |
|
---|---|---|
Одинарная точность |
Двойная точность |
|
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.
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 A¤ 40 IF A¤ = "Y" THEN 100 50 IF A¤<>"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. ВКЛЮЧЕНИЕ ПРОГРАММ НА ЯЗЫКЕ АССЕМБЛЕР
БЕЙСИК позволяет включать программы, написанные на языке Ассемблер (ПЯА), для расширения возможностей интерпретатора.
В настоящем разделе описаны:
- включение программ на языке Ассемблер в интерпретатор БЕЙСИК;
- пересылка аргументов с помощью оператора CALL;
- использование дополнительных программ интерпретатора в программах пользователя.
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, если ПЯА возвращает значение аргумента.
Биты |
Значение |
Тип аргумента |
---|---|---|
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
Пример.
Определение указателя обращения к строке на примере массивов A¤(5) и B¤(3,10). Указатели аргументов - A и B соответственно.
Элемент массива |
Формула вычисления |
Указатель обращения к строке |
A¤(0) |
2*0 + A |
A |
A¤(5) |
2*5 + A |
10 + A |
B¤(3,5) |
2* (3*11 + 5) + B |
76 + B |
B¤(0,1) |
2*(0*11 + 1) + B |
2 + B |
B¤(2,10) |
2*(2*11 + 10) + B |
64 + B |
6.2.2. Программы доступа к строковому аргументу.
В состав интерпретатора БЕЙСИК входят программы доступа к строкам, которые используются программами, написанными на языке Ассемблера:
- ¤FIND
- ¤ALC
- ¤STORE
- ¤DEALC
При написании ПЯА необходимо придерживаться определённой последовательности в использовании строковых аргументов:
- обращение к строке с помощью функции ¤FIND, которая определяет длину строки и указатель 1-го символа;
- создание временной строки в стеке функцией ¤ALC для записи промежуточных результатов работы;
- чтение символов строкового аргумента, обработка их и запись во временную строку;
- перезапись временной строки в исходный строковый аргумент функцией ¤STORE;
- удаление из стека временной строки функцией ¤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 приведены стандартные подпрограммы интерпретатора БЕЙСИК.
Операция, |
Оператор |
Обозначение |
Подпрограммы одинарной точности |
Подпрограммы двойной точности |
---|---|---|---|---|
Сложение |
+ |
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 - строка, включающая другие символы, кроме цифр. |