[an error occurred while processing this directive]
.ов
.сс
2.3.3. Для описания массивов и работы со строковыми переменными или константами предназначены следующие команды:
DIM A(X,Y,Z)   - описание массива (описан трехмерный массив А с диапазоном индексов 0-X, 0-Y, 0-Z, занята память под (X+1)*(Y+1)*(Z+1) вещественных элементов). Количество размерностей ограничивается только общим объемом памяти;
LEN?(A¤)       - значение, число символов в строке-аргументе;
STR¤(X)       - значение, строка, содержащая текстовое представление целого или вещественного аргумента;
VAL (A¤)       - значение, вещественное, текстовое представление которого расположено в начале аргумента (до первого не числового символа);
CHR¤(X)        - значение, символ, код которого равен Х;
ASC (A¤)       - код первого символа строки-аргумента;
.сс

В версии "Бейсик-Агат" содержимым строчной переменной могут быть как русские (большие и малые) так и латинские (большие и малые) буквы. Коды букв приведены в Таблице 3.
В версии APPLESOFT содержимым строчной переменной могут быть только малые латинские буквы.
                                         Таблица 3.
.ми0
.ао0

 ------------------------------------------------------
 !лат.! код! лат.! код !рус.! код ! рус.! код !Зна-! код !
 !мал.!    ! бол.!     !мал.!     ! бол.!     !ки  !     !
 !-------------------------------------------------------
 !    !    !     !     !  ю !  96 !  Ю  ! 224 !    ! 160 !
 ! a  ! 65 !  A  ! 193 !  а !  97 !  А  ! 225 !  ! ! 161 !
 ! b  ! 66 !  B  ! 194 !  б !  98 !  Б  ! 226 !  " ! 162 !
 ! c  ! 67 !  C  ! 195 !  ц !  99 !  Ц  ! 227 !  # ! 163 !
 ! d  ! 68 !  D  ! 196 !  д ! 100 !  Д  ! 228 !  ¤ ! 164 !
 ! e  ! 69 !  E  ! 197 !  е ! 101 !  Е  ! 229 !  % ! 165 !
 ! f  ! 70 !  F  ! 198 !  ф ! 102 !  Ф  ! 230 !  & ! 166 !
 ! g  ! 71 !  G  ! 199 !  г ! 103 !  Г  ! 231 !  ' ! 167 !
 ! h  ! 72 !  H  ! 200 !  х ! 104 !  Х  ! 232 !  ( ! 168 !
 ! i  ! 73 !  I  ! 201 !  и ! 105 !  И  ! 233 !  ) ! 169 !
 ! j  ! 74 !  J  ! 202 !  й ! 106 !  Й  ! 234 !  * ! 170 !
 ! k  ! 75 !  K  ! 203 !  к ! 107 !  К  ! 235 !  + ! 171 !
 ! l  ! 76 !  L  ! 204 !  л ! 108 !  Л  ! 236 !  , ! 172 !
 ! m  ! 77 !  M  ! 205 !  м ! 109 !  М  ! 237 !  - ! 173 !
 ! n  ! 78 !  N  ! 206 !  н ! 110 !  Н  ! 238 !  . ! 174 !
 ! o  ! 79 !  O  ! 207 !  о ! 111 !  О  ! 239 !  / ! 175 !
 ! p  ! 80 !  P  ! 208 !  п ! 112 !  П  ! 240 ! 0  ! 176 !
 ! q  ! 81 !  Q  ! 209 !  я ! 113 !  Я  ! 241 ! 1  ! 177 !
 ! r  ! 82 !  R  ! 210 !  р ! 114 !  Р  ! 242 ! 2  ! 178 !
 ! s  ! 83 !  S  ! 211 !  с ! 115 !  С  ! 243 ! 3  ! 179 !
 ! t  ! 84 !  T  ! 212 !  т ! 116 !  Т  ! 244 ! 4  ! 180 !
 ! u  ! 85 !  U  ! 213 !  у ! 117 !  У  ! 245 ! 5  ! 181 !
 ! v  ! 86 !  V  ! 214 !  ж ! 118 !  Ж  ! 246 ! 6  ! 182 !
 ! w  ! 87 !  W  ! 215 !  в ! 119 !  В  ! 247 ! 7  ! 183 !
 ! x  ! 88 !  X  ! 216 !  ь ! 120 !  Ь  ! 248 ! 8  ! 184 !
 ! y  ! 89 !  Y  ! 217 !  ы ! 121 !  Ы  ! 249 ! 9  ! 185 !
 ! z  ! 90 !  Z  ! 218 !  з ! 122 !  З  ! 250 ! :  ! 186 !
 !    !    !     !     !  ш ! 123 !  Ш  ! 251 ! ;  ! 187 !
 !    !    !     !     !  э ! 124 !  Э  ! 252 ! <  ! 188 !
 !    !    !     !     !  щ ! 125 !  Щ  ! 253 ! =  ! 189 !
 !    !    !     !     !  ч ! 126 !  Ч  ! 254 ! >  ! 190 !
 !    !    !     !     !  ъ ! 127 !  Ъ  ! 255 ! ?  ! 191 !
 ---------------------------------------------------------
.нф

LEFT¤(A¤,X)     - строка из первых Х символов аргумента;
RIGHT¤(A¤,X)   - строка из последних Х  символов аргумента;
MID¤(A¤,X,Y)   - строка из Y символов А¤, начиная с Х-го.
В качестве примера приведена небольшая программа, с помощью которой можно сортировать массив слов по первому символу латинского алфавита:
100 FOR I=2 TO N
150 FOR J=I-1 TO 1 STEP -1
180 IF ASC (LEFT¤(M¤(I),1))<ASC (LEFT¤(M¤(J),1))
    THEN A¤=M¤(I): M¤(I)=M¤(J): M¤(J)=A¤
300 NEXT
330 NEXT
Здесь М¤   - имя сортируемого массива.
Далее приводятся примеры работы со строками.
В¤ = "АГАТ" : А¤ = "БЕЙСИК" : А¤ = А¤+"-"+В¤
После выполнения этих действий строковой переменной А¤ принадлежит строка "БЕЙСИК-АГАТ". Если набрать директиву
 PRINT RIGHT¤(A¤,4)
то на экране ВКУ будет напечатано: АГАТ.
Директива
PRINT MID¤(A¤,6,3)
приведет к тому, что на экране ВКУ будет напечатано: К-А.
Директива
А=LEN(A¤)
вызовет присвоение переменной А значения 11.
Следующая программа напечатает на экране ВКУ латинский алфавит:
10 FOR I=1 TO 26
20 PRINT I;".";CHR¤(I+¤40)
30 NEXT
При работе с массивами необходимо помнить о том, что не объявленные в операторе DIM массивы автоматически получают размерность всех индексов от 0 до 10. Объявление в операторе DIM массива должно предшествовать его использованию в программе.
Идентификация идентификаторов осуществляется так, что переменные А, А%, А¤, А%(I), А¤(J) являются различными, а появление в одной программе массивов А(1,2) и А(3,4,5) ведет к ошибке и останову интерпретации.
2.3.4. Ввод/вывод данных осуществляется с помощью следующих команд:
INPUT I%,X,A¤   - ввод целого, вещественного и строкового значений с клавиатуры или заменяющего ее устройства. Перед вводом каждого элемента выдается "?" (перед каждым вторым, третьим и т.д. - "??"). Вводимое значение отображается на экране, действуют стандартные средства редакции в строке. Данные на вводе записываются по правилам для констант, строки можно вводить без кавычек, но тогда они не должны содержать запятых, которые используются в качестве разделителей единиц данных на вводе;
INPUT "НАЧИНАЙТЕ ВВОД";А  - строковая константа заменяет первый "?" при вводе;
GET A¤    - ввод одного символа с клавиатуры. Все символы равноправны. На экране введенный символ не отображается;
READ X   - присваивает Х значение очередного элемента списка данных, определенного оператором DATA;
DATA 1,¤FF69,РАЗНЫЕ,ЗНАЧЕНИЯ,"ОДНО,ЗНАЧЕНИЕ"    - список данных для операторов READ. В примере записано два целых и три строковых значения - правила употребления запятых в строках такие же, как на вводе;
RESTORE  - устанавливает в начальное положение указатель списка данных. Следующим READ будет прочитан первый элемент первого по тексту программы (но не по порядку исполнения операторов DATA) списка;
PRINT A¤;I%;X  - вывод на экран или заменяющее его устройство значений элементов списка. Разделитель ";" задает печать вплотную за предыдущим элементом. Разделитель "," - в очередную треть экрана. Наличие ";" в конце списка PRINT задает для следующего PRINT печать в ту же строку, иначе каждый следующий оператор осуществляет вывод с новой строки. При наборе программы "?" тождественен слову PRINT.
2.3.5. Ниже приведены команды передачи управления:
GOTO 360  - переход на строку 360;
GOSUB 1100  - переход на строку 1100 с запоминанием адреса возврата;
RETURN   - возврат к оператору, следующему за последним по выполнению GOSUB;
POP      - удаление последнего адреса возврата из списка;
ON X GOTO 100,200,300,400  - переключатель-переход на строку с Х-м номером из списка;
ON X GOSUB ...  - переключатель-вызов, вызывает Х-ю из перечисленных подпрограмм;
DEF FN SEC(X)=1/SIN(X)   - определяет функцию SEC, теперь можно пользоваться Y=1-FNSEC(.1*A)  . Количество аргументов при описании функций не более 1;
IF X=1 THEN PRINT Y    - последовательность операторов после THEN и до конца строки выполняется только при истинности логического выражения IF , иначе выполнение продолжается со следующей строки;
FOR I=1 TO 15 STEP 4: NEXT    - цикл, выполняет операторы между оператором FOR и соответствующим ему NEXT с I=1, затем с I=5, I=9 и т.д., пока не будет I>15 , тогда выполняются операторы, следующие за NEXT. Если STEP опустить, будет использован шаг 1; хотя бы одно выполнение операторов цикла происходит всегда;
NEXT   - конец цикла, после выхода из цикла его переменная получает первое из значений, не удовлетворяющее условию;
ONERR GOTO 1500    - подключение программы обработки ошибок, диагностируемых интерпретатором и ДОС. Начальный номер строки обработчика 1500. На экран диагностика не выдается;
RESUME   - используется в программе обработки ошибок. Выполняет возврат на оператор, при выполнении которого обнаружена ошибка. Если никаких мер не принято, ошибка повторится. Перед выполнением 'RESUME' следует устранить причину ошибки, например взять с обатным знаком операнд квадратного корня, устранить ошибочное обращение к диску заменой CHR¤(4) (признака обращения к DOS) на некоторый нейтральный код.
2.3.6. Следующие команды предназначены для работы в графических режимах  и ввода данных от игровых пультов:
MGR=N    - включение графики среднего разрешения.
N  - номер страницы размером 8К байт, при этом 1<=N<=3;
HGR=N    - включение графики высокого разрешения. Параметры такие же, как у оператора MGR.
Команды включения графических режимов очищают включенную экранную страницу памяти;
COLOR=X    - устанавливает цвет для последующих графических операторов (0<=X<=7).
Кодировка цветов в зависимости от значения Х приведена ниже:
1 - красный; 2 - салатовый; 3 - желтый;
4 - синий; 5 - сиреневый; 6 - голубой ;
7 - белый.
PLOT X,Y   - помещает точку текущего цвета в Х-ю позицию Y-й строки экрана;
PLOT X0,Y0 TO X1,Y1   - рисует прямую линию текущего цвета из точки X0,Y0 в точку X1,Y1. Если координаты начальной точки не указаны, используется конечная точка последнего по выполнению оператора PLOT;
SCRN (X,Y)  - значение, номер цвета точки X,Y;
DRAW I AT X,Y  - воспроизводит I-й образ (кодировка образов описана в документе Фг.00012-02 33 01) в точке X,Y текущим цветом;
XDRAW I AT X,Y  - воспроизводит I-й образ, но цветом, дополнительным к цвету экрана;
SCALE=X   - устанавливает масштаб воспроизведения образов (1-255);
ROT=X     - устанавливает угол поворота образов по часовой стрелке.
Для SCALE=1 дискрет 90 градусов или 16 единиц ROT , для SCALE=2 - 45 или 8 единиц ROT и т.д.
Диапазоны допустимых значений координат для MGR от 0 до 127, для HGR от 0 до 255;
TEXT=N   - устанавливает текстовый режим, N - номер страницы 2<=N<=63, страницы от 2 до 31 - цветные 32х32 символа, от 32 до 63 - черно-белые 32х64 символа;
RIBBON=X - устанавливает цвет символов в текстовом режиме (0<=Х<=7);
в версии ARRLESOFT директива HGR2 устанавливает графический режим с разрешением 280*192 точки, а директива HGR- смешанный текст-графический режим.
В этой версии существуют директивA HPLOT X,Y, рисующая точку заданного цвета в позиции с координатами X и Y и директова HPLOT X,Y TO X1,Y1, соединяющая две точки экрана. Существует так же директива HCOLOR= I (1<=I<=6), устанавливающая цвет для последующих графических операторов.
PDL(X)   - значение, установленное ручкой Х-го игрового датчика (X = 0 или 1).
2.3.7. В языке "Бейсик" ПЭВМ "АГАТ" исполнения 9 и языке "APPLESOFT" реализованы следующие элементарные математические функции:
SIN(X)   - значение синуса (X рад);
COS(X)   - значение косинуса (X рад);
TAN(X)   - значение тангенса (X рад);
ATN(X)   - значение арктангенса  Х;
INT(X)   - значение целой части  Х;
RND(X)   - псевдослучайное значение в интервале 0,1. При X>0 элемент случайной последовательности. При X<0 запуск псевдослучайной последовательности (своей для каждого X). При Х=0 - повторение последнего результата;
SGN(X)   - 1 при Х>0, 0 при Х=0, минус 1 при Х<0;
ABS(X)   - модуль Х;
SQR(X)   - положительный квадратный корень X;
EXP(X)   - экспонента X;
LOG(X)   - натуральный логарифм Х.

2.4. Средства программирования на языке ассемблера
В яэыке "APPLESOFT" средства программирования на языке ассемблера не предусмотрены.
2.4.1. Для управления ассемблированием в языке "Бейсик" для ПЭВМ "Агат" исполнения 9 используются следующие команды:
*{СМЕЩЕНИЕ,} АДРЕС:   - используется для входа в режим ассемблирования. Задает адреса формируемого объектного кода при ассемблировании и исполнении (если предполагается исполнять программу не на тех адресах, на которые она записывается при ассемблировании). В случае совпадения адреса и смещения смещение указывать не обязательно.
АДРЕС      - выражение, задающее начальный адрес записи формируемого кода при ассемблировании.
СМЕЩЕНИЕ   - выражение, задающее начальное значение адреса, используемого для ссылок на формируемый код (адрес программы при исполнении).
Например, в результате выполнения
     *¤1234,¤3100:!МЕТКА:=МЕТКА!:
по адресу  ¤3100  будет записано слово ¤3412. Указание адреса должно обязательно предшествовать исполнению первой команды ассемблирования. Указание адреса между командами ассемблирования изменяет параметры последующей загрузки кода, сохраняя возможность перекрестных ссылок по меткам;
!   - сигнал входа в ассемблер и разделитель команд ассемблирования внутри строки; должен предшествовать каждой команде ассемблера;
!:  - пустая команда ассемблера, служит сигналом перехода на второй проход или конца ассемблирования.
Ассемблирование проводится в два прохода. На первом проходе определяются форматы операндов и значения меток, форматы команд записываются на место объектного кода. Просмотр текста происходит в порядке исполнения строк программы на языке "Бейсик", содержащих команды ассемблера. При исполнении на первом проходе оператора "!:", который служит сигналом на второй проход, управление передается на первый встреченный, после входа в режим ассемблирования, оператор "!". Программа должна обеспечивать второе исполнение операторов ассемблирования в том же порядке, что и на первом проходе (при этом все операторы "Бейсика" во время второго прохода выполняются еще раз). На втором проходе формируется объектный код, значения меток сохраняются и могут быть в дальнейшем использованы в качестве операндов CALL, &, USR, а также отладочными директивами (см. далее). При исполнении "!:" на втором проходе ассемблирование завершается. Для следующего входа в ассемблер снова требуется указать адреса формируемого кода.
Команды ассемблера могут быть помечены. Метками служат целые и вещественные переменные языка "Бейсик", например:
  5 КОН = ¤FDDF:*¤6000:
 10 ! MI:!M2%:LDA ¤AA55!STA ¤666
 20 !JSR КОН!RTS
 30 !:
Команды ассемблера подразделяются на программные команды и константы.
2.4.2. Ниже перечислены команды ассемблера, предназначенные для формирования констант:
1) ! <выражение> - загружает 5 байт вещественным значением выражения, вычисленным на втором проходе, в представлении интерпретатора;
2) < <выражение> - загружается старший байт целого значения, определяемого выражением;
3) > <выражение> - загружается младший байт значения;
4) = <выражение> - загружается 2 байта целого значения выражения в порядке "младший,старший", то есть в формате адреса;
5)   <выражение> - то же, что и = , но в порядке "старший,младший", то есть в формате целого значения интерпретатора;
6) ¤{XX}  - ( четное число шестнадцатеричных цифр ) шестнадцатеричная загрузка зоны;
7) "строка длиной N" - загружает N байт кодами КОИ-7 символов строки ( при этом старший разряд "0" );
8) # <выражение> - увеличивает значение счетчиков адреса и смещения на значение выражения (генерация свободной зоны).
Пример использования констант в языке ассемблера:
 5   M1=¤100:LNGHT=15: M2%=M1-LNGHT:X=1.57
 10  *¤3000:!SIN(X)+COS(X)!=M1*12
 20  !>M1+16*LNGHT+M2%+100
 30  !¤AAB6F7FD0001
 40  ! M1+256+80
 50  !=¤FDF4 !¤B1
 60  !"ТАБЛИЦА"!К::
После RUN сформируется код
 3000 - 81 00 1A 15 68 00 0C 45
 3008 - AA B6 F7 FD 00 01 02 50
 3010 - F4 FD B1 74 61 62 6C 69
 3018 - 63 61
где 
    3000-3004 - представление вещественного 1.00079601
    3005-3006  - адрес ¤C00 (12*256)
    3007   - младший байт значения  ¤100+¤F0+¤64+¤F1
    3008-300D - последовательность байт
    300E-300F  - целое представление ¤250
    3010-3011  - адрес ¤FDF4
    3012       - байт ¤B1
    3012-3019  - текст "ТАБЛИЦА"
Переменная К получит значение ¤301A.
2.4.3. В данном пункте изложены правила написания и использования программных команд ассемблера.
Первое поле программной команды - мнемокод операции, затем может следовать операнд.
В качестве содержимого операнда могут использоваться  константы типа 2), 3), 4), а в непосредственных операндах и типа 7) длиной в 1 символ.
При использовании в качестве операндов констант типа 2), 3) - формат адресации однобайтный; типа 4) - двубайтный.
В случае отсутствия перед операндом знаков  "<", ">", "=" формат адресации определяется следующим образом.
Если в выражении имеется идентификатор, значение которого не определено на первом проходе к данному моменту, то формат адресации двухбайтный, в противном случае он определяется значением выражения. Если значение выражения меньше 256, то формат адресации однобайтный. Если значение выражения больше 256, то формат адресации двухбайтный.
Предусмотрены дополнительные возможности введения комментариев в любой команде от символа ";" до конца команды ("!" или конец строки). Пример использования программных команд:

    5 GOTO 65
   10 REM МАКРООПРЕДЕЛЕНИЕ
   20 !PLA!STA¤0!PLA!STA¤1
   30 RETURN
   40 REM МАКРООПРЕДЕЛЕНИЕ ДЛЯ ВОЗВРАТА
   50 !LDA¤1!PHA!LDA¤0!PHA!RTS
   60 RETURN
   65   *4096  : ! BEGIN: NOP ; ТРЕБУЕТСЯ ДЛЯ ПРАВИЛЬНОГО НАЧАЛА ВТОРОГО ПРОХОДА
   70 REM ПОДПРОГРАММА ПЕЧАТИ И ВЫБРАСЫВАНИЯ 3 БАЙТ ИЗ СТЕКА
   80 GOSUB 10
   90 FOR I=1 TO 3
  100 !PLA!JSR¤FDE1; ПОДПРОГРАММА COUT СИСТЕМНОГО МОНИТОРА
  110 NEXT
  120 GOSUB 40
  130 MJ=0:REM ИСПОЛЬЗОВАНИЕ МАКРОСА С МЕТКАМИ
  140  SR=5000:  DS=8000:  LN=33:REM  ИСТОЧНИК,ПОЛУЧАТЕЛЬ ДЛИНЫ ПЕРЕПИСИ
  150 GOSUB 1000
  160 SR=5100: DS=7000: LN=99: GOSUB 1000
  170 !:END
 1000 MJ=MJ+1:REM НАЧАЛО МАКРООПРЕДЕЛЕНИЯ ПЕРЕПИСИ
 1010 !LDX#   ¤0! L(MJ):LDA=SR.X; ПРИ КАЖДОМ НОВОМ МАКРОВЫЗОВЕ МЕТКОЙ БУДЕТ ОЧЕРЕДНОЙ ЭЛЕМЕНТ МАССИВА
 1020 !STA DS,X!INX!CPX # LN
 1030 !BNE L(MJ) ; ПЕРЕХОД ВНУТРИ МАКРООПРЕДЕЛЕНИЯ
 1040 RETURN
2.4.4. Интерпретатор языка "Бейсик" предоставляет пользователю следующие средства отладки:
* <выражение> - осмотр содержимого ячейки памяти по заданному адресу;
 Например, 
          *¤3000
           3000 - 4В
*<выражение 1> . <выражение 2> - осмотр интервала памяти по заданнным начальному и конечному адресам;
 Например, после директивы *¤B1.¤C8 на экране появится следующая информация:
00B1- E6 B8 D0 02 E6 B9 AD 
00B8- 05 02 C9 3A B0 0A C9 20
00C0- F0 EF 38 E9 30 38 E9 D0
00C8- 60
*<выражение 1>#<выражение 2> . <выражение 3> М - передвижение интервала памяти;
*<выражение 1>#<выражение 2>.<выражение 3>V - сравнение двух интервалов памяти;
* [<выражение>]  L - вывод текста программы в мнемокоде системы команд, с заданного адреса или, если адрес не указан, продолжение листинга.
Выводится 28 строк текста программы;
*<выражение 1>.<выражение 2>Т - вывод текста в кодировке КОИ-7 в заданном интервале;
*<выражение>G - выполнение программы в кодах системы команд с заданного адреса;
*<выражение 1>.<выражение 2>S - выполнение программы в кодах системы команд с адреса, определяемого выражением 1, до прерывания, осуществляемого по адресу, определяемому выражением 2.
Если выражение 1 отсутствует, то начальным адресом считается адрес последнего прерывания.
При пользовании директивой S следует учитывать:
1) исходное включение памяти для отлаживаемой программы отличается от используемого интерпретатором.
Состояние эмулятора ПЗУ на момент запуска/останова отлаживаемой программы хранится в ячейке ¤е9, состояние дополнительного ОЗУ - в ячейке ¤Е8: иногда необходимо задать их перед запуском программы.
Переключения банков памяти, выполняемые отлаживаемой программой, запоминаются (содержимые РСС в ячейках  ¤Е8-Е9 интерпретатора) и повторяются при последующих исполнениях "S";
2) содержимое ячеек ¤0 - ¤FFF отлаживаемой программы хранится в адресах ¤8000-8FFF банка 9 и не портится при работе интерпретатора;
3) содержимое регистров отлаживаемой программы запоминается в ячейках ¤45-¤49 интерпретатора, адрес точки останова - в 0-1. Осмотр и изменение регистров следует проводить директивой УПР-Е системного монитора;
4) содержимое текстового экрана отлаживаемой программы хранится в ячейках ¤9000-¤97FF банка С и не показано на экране в диалоге интерпретатора. Для его просмотра рекомендуется переписать эту зону в текущий экран.
Предусмотрено использование "S" для отладки программ, размещаемых на адресах ПЗУ, следует только следить за сохранностью интерпретатора, размещенного в массиве 0 модуля-эмулятора ПЗУ.
Команды осмотра содержимого памяти отладчика и команды загрузки в память системного монитора работают с учетом содержимого ячеек ¤E8 и ¤E9. Ассемблерные команды и директивы ДОС загружают код независимо от содержимого этих ячеек.
*<выражение 1>.<выражение 2>W - запись интервала памяти на магнитную ленту (МЛ);
*<выражение 1>.<выражение 2>R - считывание интервала памяти с МЛ.-7 в заданном интервале;
*<выражение>G - выполнение программы в кодах системы команд с заданного адреса;
*<выражение 1>.<выражение 2>S - выполнение программы в кодах системы команд с адреса, определяемого выражением 1, до 
[an error occurred while processing this directive]