Оператор RANDOMIZE
----------------------------------------------------------------
Назначение   RANDOMIZE устанавливает начальное число в генера-
             торе псевдослучайных чисел

Синтаксис    RANDOMIZE [числовое выражение]

Замечания    Если   числовое   выражение   опущено,   выполнение
             программы останавливается на операторе RANDOMIZE  и
             пользователь  получает  запрос  на  ввод начального
             числа:

             RANDOM NUMBER SEED?
             (начальное число генератора псевдослучайных чисел ?)

             О случайных числах

                  Без задания всякий раз нового  начального числа
             значения функции RND  вовсе не являются  случайными;
             для данного начального числа RND всегда дает одну  и
             ту  же  последовательность  значений.  Без изменения
             начального  числа  имитация  бросания  костей  будет
             приводить к одному и тому же результату всякий  раз,
             когда   запускается  программа.   Удобным   способом
             обеспечить   уникальность   каждого   прогона   (при
             условии, что  программа не  запускается каждый  день
             точно  в  одно  и  то  же  время)  является  задание
             начального числа с помощью функции TIMER:

             RANDOMIZE TIMER

                  Другой способ состоит в использовании оператора
             высокого разрешения  MTIMER (микросчетчик  времени),
             которым замеряется время, истекшее с момента нажатия
             некоторой  клавиши  в  начале  программы.  Это время
             используется  для  задания  начального числа датчика
             случайных чисел:

             MTIMER
             PRINT "Нажмите любую клавишу, чтобы начать..."
             WHILE NOT INSTAT : WEND
             RANDOMIZE MTIMER

См.также     RND

Пример       ' инициализация микротаймера
             MTIMER
             PRINT "Нажать любую клавишу, чтобы начать..."
             WHILE NOT INSTAT
             WEND
             Dummy$ = INKEY$
             ' установить начальное значение
             ' датчика случайных чисел
             RANDOMIZE MTIMER
             FOR I% = 1 TO 5 STEP RND(1.5)
               PRINT I%
               IF INSTAT THEN STOP
             NEXT I%
             END     'конец программы

Оператор READ
----------------------------------------------------------------
Назначение    Оператор READ загружает переменные значениями
              констант из списка оператора DATA

Синтаксис     READ переменная [, переменная] ...

Замечания     переменная может быть числовой или символьной

                 READ  загружает  заданные  переменные значениями
              констант, следующих за  служебным словом DATA.   Во
              время выполнения программы оператор READ  считывает
              константы  из  оператора  DATA  в  том  порядке,  в
              котором они  появляются. Наиболее  распространенной
              ошибкой, связанной с использованием операторов DATA
              и READ, является  несовпадение  типов  константы  и
              соответствующей   переменной;   например,   попытка
              загрузить значение символьной константы в  числовую
              переменную. В этом случае появляется синтаксическая
              ошибка (ошибка выполнения).  Сообщение об ошибке не
              появляется, если, наоборот, вы пытаетесь  загрузить
              числовую константу в  символьную переменную.   Если
              вы  пытаетесь   считать  оператором   READ   больше
              констант,   чем   объявлено   в   вашей   программе
              операторами DATA, ТУРБО БЕЙСИК регистрирует  ошибку
              выполнения  4,  Out  of  Data  (не хватает данных).
              Оператор   RESTORE    позволяет   заново    считать
              константы,  заданные  первым  или  каким-то  другим
              оператором DATA.

См.также      RESTORE

Пример        см. DATA

Функция и оператор REG
----------------------------------------------------------------
Назначение    REG  возвращает или задает заданное значение в ре-
              гистровом буфере

Синтаксис     Функция:

              y = REG (номер-регистра)

              Оператор:

              REG номер-регистра, значение

Замечания     Номер-регистра задает процессорный регистр согласно
              следующей таблице
              ----------------------------
               номер регистра    регистр
              ----------------------------
                     0           флаги
                     1           AX
                     2           BX
                     3           CX
                     4           DX
                     5           SI
                     6           DI
                     7           BP
                     8           DS
                     9           ES
              ----------------------------
                   Если номер регистра меньше 0 или больше 9,  то
              возникает ошибка выполнения 5 Illegal Function Call
              (неверный вызов функции).  Значение - это  числовая
              переменная или выражение в диапазоне от 0 до 65536.
              Функция REG возвращает значение выбранного элемента
              в регистровом буфере.  Оператор REG, наоборот,  за-
              гружает выбранный элемент в регистровом буфере зна-
              чением заданной целой переменной. Оператор и  функ-
              ция  REG  используются  для  передачи информации от
              одной программы, написанной на ассемблере к другой.
              Содержимое регистрового  буфера загружается  в про-
              цессорные регистры  непосредственно перед  вызовами
              ABSOLUTE или INTERRUPT. Обратная загрузка  осущест-
              вляется  непосредственно  после  возврата. В каждый
              данный момент времени содержимое регистрового буфе-
              ра соответствует  процессорным регистрам  на момент
              выхода из последней внутренней программы.

 Пример       DEFINT a-z
              DIM a(100)
              DIM fillRoutine(10)

              FillRoutine (0) = &HF2FC
              FillRoutine (1) = &HCBAA

              REG 1,-1
              REG 3, 101 -2
              REG 9, VARSEG(a(0))
              REG 6, VARPTR(a(0))

              DEF SEG = VARSEG(FillRoutine(0))
              PRINT a(I)
              WHILE NOT INSTAT:WEND
              FillAdr = VARPIR(FillRoutine(0))
              CALL ABSOLUTE FillAdr            '(REG)

              PRINT a(I)
              END

Оператор REM
-----------------------------------------------------------------
Назначение    REM отделяет комментарии в программе

Синтаксис     REM комментарий

Замечания     Комментарий  -  это любая последовательность симво-
              лов.  В отличие  от  комментариев в  интерпретаторе
              БЕЙСИКА, комментарии ТУРБО БЕЙСИКА появляются толь-
              ко в  исходной версии программы и,  соответственно,
              никоим образом не влияют на ее выполнение.
                  Внимание! комментарии могут появляться в  одной
              строке с другими оператороми, но комментарий непрe-
              менно  должен  быть  последним оператором в строке.
              Так, например, следующая  последовательность опера-
              торов не будет выполняться:

              REM теперь сложим числа : a = b+c,

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

              Правильным вариантом записи такой последовательности
              операторов будет:

              a = b+c : REM теперь складываем числа...

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

Пример        REM эта программа демонстрирует оператор REM
              PRINT "эта программа демонстрирует оператор REM"
              REM "END"
              END
              DATA 1, 2, 3,  I'm return : REM комментарий
              'заметьте, что одиночный апостроф в данном случае
              'не считается разделителем комментария

Оператор RESET
-----------------------------------------------------------------
Назначение    RESET закрывает и делает скрытыми для программы все
              дисковые файлы

Синтаксис     RESET

Замечания     RESET эквивалентен оператору CLOSE без аргументов

Оператор RESTORE
-----------------------------------------------------------------
Назначение    RESTORE позволяет повторно читать константы, задан-
              ные в операторе DATA.

Синтаксис     RESTORE [метка]

Замечания     Наличие   метки   необязательно.   Метка  указывает
              оператор   DATA,   который   будет   использоваться
              следующим  оператором   READ.    Оператор   RESTORE
              вынуждает ТУРБО БЕЙСИК заново устанавливать счетчик
              операторов DATA,  так что  следующий оператор  READ
              будет  повторно  использовать  данные  первого (или
              заданного меткой) оператора DATA.

См.также      READ

Пример        READ A$, B$        ' чтение данных
              RESTORE            ' восстановление указателя
              READ C$, D$        ' чтение еще некоторых данных
              PRINT A$, B$, C$, D$    ' вывод данных

              RESTORE MoreData   ' установка указателя на первый
                                 ' оператор DATA после метки
              READ A$, B$        ' чтение и вывод данных
              PRINT A$, B$

              END                'конец программы

              ' определение данных
              DATA CAT, DOG
              MoreData:
                DATA MONKEY, GNU

Оператор RESUME
-----------------------------------------------------------------

Назначение    RESUME перезапускает выполнение после обработки
              ошибки

Синтаксис     RESUME [{0 | NEXT | метка}]

Замечания     RESUME или RESUME 0 возобновляют выполнение с
              оператора, вызвавшего ошибку.
              RESUME метка возобновляет выполнение с помеченого
              оператора.
                   Если оператор RESUME выполняется не в
              подпрограмме, обрабатывающей ошибку, возникает
              ошибка выполнения 20: RESUME WITHOUT ERROR.

                   Внимание! При наличии операторов ERL, RESUME и
              RESUME  NEXT,   компилятор  генерирует   4-байтовый
              указатель для каждого оператора программы. То есть,
              программисты, для которых важен размер программного
              кода,  генерируемого  компилятором,  должны принять
              это  к  сведению.  Использование  RESUME [строка #]
              генерирует простую инструкцию перехода.  ERL обычно
              используется  в   целях  отладки   так,  что    это
              обстоятельство не слишком важно.

Пример        ' установить обработку ошибок
              ON ERROR GOTO ErrorHandler

              ' этот оператор вызывает ошибку выполнения
              I# = LOG(-1)

              PRINT "произошло прерывание по ошибке"...
              END

              ErrorHandler:
                PRINT "ошибка" ERR "в операторе"  ERL
                RESUME NEXT

Оператор RETURN
-----------------------------------------------------------------
Назначение    RETURN возвращает управление из подпрограммы в
              вызвавшую ее программу

Синтаксис     RETURN [метка]

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

                   RETURN  прерывает  выполнение  подпрограммы  и
              передает  управление   оператору,   непосредственно
              следующему за вызовом подпрограммы (GOSUB).
                   Необязательная   метка    предназначена    для
              облегчения  возвращения  из  подпрограмм  обработки
              прерываний и ошибок.  RETURN метка очищает адрес на
              вершине стека и выполняет оператор перехода  (GOTO)
              на оператор,  идентифицируемый меткой.  В некоторых
              версиях   БЕЙСИКА   эта   операция  выполняется   с
              помощью оператора POP и GOTO.
                   Выполнение   RETURN    без    предварительного
              обращения  GOSUB  вызовет   неожиданные  и   трудно
              обнаруживаемые ошибки.   Мы советуем включить  тест
              стека (Stacktest)  в спускающемся  меню "вариантов"
              для обнаружения подобных ошибок.

См.также      GOSUB , GOTO

Пример        См. пример к оператору GOSUB

Функция  RIGHT$
------------------------------------------------------------------
Назначение    Функция RIGHT$ возвращает n правых символов
              заданной строки

Синтаксис     s$ = RIGHT$ (символьное выражение, n)

Замечания     n  -  целое выражение, задающее  число возвращаемых
              знаков  символьного  выражения;  n  должно  быть  в
              диапазоне  от   0  до   32767.  RIGHT$   возвращает
              указанное   число    знаков   своего    символьного
              аргумента, начиная с самого правого символа.   Если
              n  больше  длины   строки  символьного   выражения,
              возвращается все символьное выражение целиком. Если
              n=0, RIGHT$ возвращает пустую строку.

См.также      LEFT$ , MID$

Пример        RIGHT$ ("JOHN JONES",5)

Оператор RMDIR
-----------------------------------------------------------------
Назначение    RMDIR удаляет каталог (аналогично команде RMDIR DOS)

Синтаксис     RMDIR маршрут

Замечания     маршрут  -  стандартная  строка  описания маршрута.
              RMDIR  удаляет  каталог,  соответствующий маршруту.
              Этот оператор  эквивалентен команде  RMDIR DOS  (за
              исключением того, что служебное слово оператора  не
              может быть сокращено). На оператор распространяются
              те  же  ограничения,  а  именно, что маршрут задает
              существующий,  пустой  каталог.  Если  каталог   не
              является  пустым,  возникает  ошибка  выполнения 75
              Path/File   Access   Error   (ошибка   доступа    к
              маршруту/файлу).

Пример        ' установить обработку ошибок
              ON ERROR GOTO ErrorHandler

              INPUT "Введите имя удаляемого каталога : ",D$
              RMDIR D$    'удаление каталога
              END         'конец программы

              ErrorHandler:
                PRINT "Ошибка " ERR " в операторе " ERADR
                RESUME NEXT

Функция  RND
-----------------------------------------------------------------
Назначение    RND возвращает псевдослучайное число

Синтаксис     y = RND [(числовое выражение)]

Замечания     RND возвращает псевдослучайное число от 0 до 1
              с двойной точностью.
                   Числа, генерируемые  с помощью  RND, на  самом
              деле,  вовсе  не  являются  случайными,  а являются
              результатом  применения  алгоритма псевдослучайного
              преобразования  к  начальному  значению (к значению
              "посева").  Если  даны  одни  и  те  же   начальные
              значения,  алгоритм  RND  ТУРБО  БЕЙСИКА производит
              одинаковые цепочки "случайных" чисел.
                  Действие функции RND зависит от необязательного
              числового значения, заданного в качестве аргумента.
              Если  аргумент  не   задан  или  положителен,   RND
              генерирует  следующее  число  в  последовательности
              случайных чисел, зависящей от начальной  установки.
                   Если аргумент  равен 0,  RND повторяет  число,
              сгенерированное функцией последним.   Отрицательный
              аргумент задает  новую начальную  установку датчика
              случайных чисел так,что последующие вызовы  функции
              RND без аргумента  или с положительным   аргументом
              будут возвращать новую последовательность значений.
              В общем, используйте RANDOMIZE TIMER один раз в на-
              чале программы для того, чтобы оператор RND выдавал
              новую последовательность значений. Не следует   ис-
              пользовать нулевое или отрицательное значения аргу-
              мента  за  исключением  тех  случаев,  когда вам не
              нужны вызываемые или особые последствия.  Для того,
              чтобы получить случайное целое  от 1 до n   включи-
              тельно, можно использовать следующий способ:

              randomNo% = INT(RND * n) + 1

                   Еще лучше создать функцию:
              DEF FNRndInt% (x%) = INT (RND * x%) + 1

См.также      RANDOMIZE

Пример        FOR I = 1 TO 10 STEP 1.34
                PRINT USING "###.##^^^^"; RND(I)
              NEXT I
              END

Оператор RSET
-----------------------------------------------------------------
Назначение    RSET перемещает символьные данные в буфер файла с
              произвольным доступом

Синтаксис     RSET переменная-поле = символьное-выражение

Замечания    Операторы RSET и LSET пересылают символьные данные в
             переменную-поле,  которая  определена  в   предшест-
             вующем операторе FIELD и принадлежит буферу файла  с
             произвольным доступом.   Если длина символьного  вы-
             ражения меньше, чем длина переменной-поле,  оператор
             RSET выполняет  выравнивание по  правому знаку,  до-
             полняя  поле  пробелами.  Это  означает, что пробелы
             добавляются   перед   первым   знаком    символьного
             выражения с тем, чтобы функция LEN (переменная-поле)
             возвращала то же  значение, которое указано  в соот-
             ветствующем операторе FIELD.  LSET выполняет  вырав-
             нивание  по  левому  знаку,  дополняя поле пробелами
             (пробелы добавляются после последнего знака символь-
             ного выражения).   RSET может  также  использоваться
             для форматирования выводимых на экран или на принтер
             данных:

              a$ = space$(20)
              RSET a$ = "Right-just"
              PRINT a$

См.также      LSET

Пример        OPEN "RSET.DTA" AS #1 LEN=18

              ' определение имен и размеров полей
              FIELD 1, 2 AS FileInt$,  4 AS FileLong$,_
                       4 AS FileSngl$, 8 AS FileDbl$

              ' присвоение некоторых значений полям и
              ' занесение записи в файл с произвольным доступом
              FOR Count% = 1 TO 5
                RSET FileInt$ = MKI$(Count%)
                RSET FileLong$ = MKL$(Count%^2)
                RSET FileSngl$ = MKS$(Count%^2.1)
                RSET FileDbl$ = MKD$(Count%^4.4)
                PUT 1, Count%
              NEXT Count%

              CLOSE 1    'закрытие файла

              END        'конец программы

Оператор RUN
------------------------------------------------------------------
Назначение    RUN перезапускает программу

Синтаксис     RUN [имя-файла]

Замечания     Оператор  RUN без аргумента перезапускает  с начала
              программу на ТУРБО БЕЙСИКЕ. Все числовые переменные
              (включая элементы массива)  устанавливаются в 0,  а
              всем  символьным  переменным  присваивается  пустая
              строка.
                 Имя  файла,  если  оно  задано, - это символьное
              выражение, представляющее файл типа .TBC  или .EXE,
              (которые являются результатом команды Chain или EXE
              из меню  "варианты", устанавливающей  режимы работы
              компилятора).   Если  в  имени  файла  не   указано
              расширение,  то  по  умолчанию предполагается .TBC;
              если расширение  указано, оно  и используется.  При
              запуске или связывании в .EXE файл следует в  явном
              виде присоединить .EXE к имени файла.

Пример        ' компиляция этой программы в файл, названный
              ' MASTER.EXE
              ' ввод имени SLAVE в ответ на подсказку
              INPUT "Введите имя запускаемой программы:", N$
              RUN N$      'прогон заданной программы
              END         'конец программы

              ' компиляция этой программы в SLAVE.TBC
              ' по команде "компиляция в цепной файл"
              ' в меню "Варианты"
              PRINT "Теперь мы в программе SLAVE"
              END         'конец программы

Функция SCREEN
-----------------------------------------------------------------
Назначение    SCREEN возвращает ASCII-код символа, находящегося
              в указанной строке и позиции

Синтаксис     y = SCREEN (строка, позиция [, вариант])

Замечания     строка и позиция - целые выражения в диапазоне от 1
              до 25 и от 1 до 80, соответственно.
                   Функция SCREEN  в текстовом  режиме -  двойник
              функции   POINT   в   графическом   режиме.  SCREEN
              возвращает информацию о символе в заданной  позиции
              указанной строки;  например, SCREEN  1,1 возвращает
              ASCII-код символа в  первой позиции первой  строки.
                   Если необязательный  параметр "вариант"  равен
              1, SCREEN возвращает  атрибут, хранимый в  заданной
              позиции (строка, колонка), а не код символа.

Пример        LOCATE 10,10
              PRINT "ASCII"
              ' ASCII-код для A - 65,
              ' по умолчанию атрибут экрана (белый на черном)
              ' равен 7
              PRINT SCREEN (10,10), SCREEN (10,10,1)
              END         'конец программы

Оператор SCREEN
-----------------------------------------------------------------
Назначение: SCREEN устанавливает режим изображения на экране.

Синтаксис:  SCREEN [режим] [, [флажок-цвета]] _
               [, [активная-страница]] [, [видимая-страница]]

Замечания:  Режим - целочисленное выражение в диапазоне  от  0 до
        12.  Характеристики  экрана после его установки определя-
        ются следующей таблицей.
  ---------------------------------------------------------------
  Режим       Действие
  ---------------------------------------------------------------
   0    Текстовый режим без изменения числа  знаков в строке
   1    Графический режим со средним разрешением (320х200
           пикселов), число знаков в строке равно 40
   2    Графический режим с высоким разрешением (640х200
           пикселов), число знаков в строке равно 80
   7    Для адаптера EGA режим со средним разрешением, допускает
           16 цветов, число пикселов на экране - 320х200
   8    Для адаптера EGA режим с высоким разрешением, допускает
           16 цветов, число пикселов на экране - 640х200
   9    Усиленный режим с высоким разрешением для адаптера EGA с
           усиленным дисплеем; допускает от 4 до 16 цветов
           (в зависимости от памяти на EGA) из палитры, состоящей
           из 64 цветов, число пикселов на экране - 640х350
  10    Режим с высоким разрешением для адаптера EGA с монохром-
           ным монитором, допускает 4 атрибута и 640х350 пикселов
  11    Черно-белый режим с наивысшим разрешением для адаптеров
           VGA или MCGA, число пикселов - 640х480
  12    Режим с наивысшим разрешением для VGA, допускает 16 цве-
           тов из палитры с 64 цветами, число пикселов - 640х480
  ---------------------------------------------------------------

            Флажок цвета - управляет тем, будет ли информация
        о цвете передана монитором с совмещенным  управлением
        цветовыми лучами, которые присоединены к  композитным
        видео-портаm цветных графических адаптеров. В тексто-
        вом режиме значение FALSE (0) отменяет  использование
        цвета. В графическом режиме  со средним  разрешением,
        значение FALSE включает цвет.
            Активная страница - целое выражениев диапазоне от
        0  до  7,  которое  управляет  тем, куда записывается
        текст, формируется оператором PRINT  или  другими ко-
        мандами записи на экран. Этот аргумент допустим толь-
        ко для CGA и для EGA при установке режима 0, 7,  8, 9
        и 10. (См. в главе 4 раздел о графике).
            Видимая   страница   -   определяет   какая    из
        виртуальных страниц (от 0 до 7) выводится на экран  в
        данный  момент.  Этот  аргумент  допустим  только для
        CGA и для EGA при установке режима 0, 7, 8, 9 и 10.
            Выполнение оператора SCREEN запускает новый режим
        и  стирает  экран.  Наивысший приоритет присваевается
        белому цвету, а фону и границе - черный цвет.
            Если в операторе SCREEN устанавливается такой  же
        режим, как и текущий, ничего не происходит.
            Если  текущий  режим  -  текстовый  и в операторе
        SCREEN   указаны   только   аргументы   активной    и
        виртуальной страниц, то корректируются в соответствии
        с запросом только дисплейные "страницы".

Пример.
        'переключение в графический режим среднего разрешения
        'с отменой цвета
        SCREEN 1,0
        CIRCLE (160,100),50,2
        WHILE NOT INSTAT:WEND
        A$=INKEY$
        'переключение в текстовый режим с отменой цвета,
        'назначение активной и видимой страницам страницы с
        'номером 0
        SCREEN 0,0,0,0
        PRINT "Активная страница - 0"
        WHILE NOT INSTAT:WEND
        A$=INKEY$
        'сделать активной страницу 2
        SCREEN ,,2
        PRINT "Активная страница - 2"
        WHILE NOT INSTAT:WEND
        A$=INKEY$
        'переключение в другой графический режим
        SCREEN 2
        CIRCLE (320,100),100,1
        END

Оператор SEEK
-------------------------------------------------------------
Назначение: SEEK устанавливает позицию в двоичном файле для
            функций GET$ и PUT$.

Синтаксис:  SEEK [#] номер-файла, позиция

Замечания:  SEEK объявляет, что  следующий GET$ или  PUT$ над
        файлом  с  заданным  номером  начнут  свои действия с
        байта, номер которого указан в аргументе "позиция".
            Для  определения  текущей  позиции, установленной
        для   двоичного   файла   оператором   SEEK,  следует
        использовать функцию LOC.

Пример
        SUB CreateFile
           'открытие файла и запись в него 256 символов
           LOCAL I%
           'открытие файла типа BINARY для ввода/вывода
           OPEN "SEEK.DTA" FOR BINARY AS #1
           'запись данных в файл
           FOR I%=1 TO 256
              PUT$ 1,CHR$(I%-1)
           NEXT I%
        END SUB         'конец подпрограммы CreateFile

        DEF FNReadIt$(START%,SIZE%)
           'функция читает указанные данные из файла
           LOCAL TEMPSTR$,CHAR$,I%
           'установка заданной позиции в файле
           SEEK 1,START%
           I%=1
           TEMPSTR$=""
           'считывание указанных данных - не более, чем до конца
           'файла
           WHILE (NOT EOF(1)) AND (I%<=SIZE%)
              GET 1,I%,CHAR$
              TEMPSTR$=TEMPSTR$+CHAR$
              INCR I%
           WEND
           'присвоение функции результата
           FNReadIt$=TEMPSTR$
        END DEF          'конец функции ReadIt

        ' создание файла данных
        CALL CreateFile
        'запрос пользователю на ввод
        PRINT "Введите начало [1..256] и число байтов данных"
        PRINT "(не более, чем 256-начало), которые"
        INPUT "Вы хотите прочитать из файла:",ST%,SZ%
        PRINT FNReadIt$(ST%,SZ%)  'чтение данных
        END                       'конец программы

Оператор SELECT
-------------------------------------------------------------
Назначение: Оператор  SELECT  (вместе   с  оператором   CASE)
        формирует операторы проверки общего назначения.

Синтаксис:
        SELECT CASE выражение
        CASE список-тестов
          .
          . операторы
          .
        [CASE список-тестов
          .
          . операторы
          .          ]
        [СASE ELSE
          .
          . операторы
          .          ]
        END SELECT

Замечания:  Список тестов  - это  один или  несколько тестов,
        разделенных   запятыми,   которые   выполняются   над
        выражением.  Выражение  может  быть  символьным   или
        числовым, однако,  все тесты  в списке  из отдельного
        блока оператора SELECT должны  быть одного и того  же
        типа.
            Тесты,  которые  могут  выполняться в предложении
        CASE,  включают  проверки на равенство,  неравенство,
        больше, меньше, диапазон (от-до).
            Примеры включения тестов в предложение CASE:

            CASE <b             'отношение
            CASE 14             'равенство (предполагается =)
            CASE b TO 90        'диапазон
            CASE b,14           'два теста проверки равенства
            CASE b TO 90,14     'комбинация (неявное ИЛИ)

            В предложении  CASE с  несколькими тестами  между
        ними  выполняется  неявная  логическая  операция ИЛИ.
        Если  один   или  несколько   тестов  в   предложении
        удовлетворяются  (TRUE),  выполняются  все  операторы
        вплоть   до   следующего   предложения   CASE.  После
        выполнения    последнего    оператора,     управление
        передается оператору, следующему за END SELECT.
            Оператор   SELECT   является   мощным   средством
        сравнения переменной с некоторым числом её  возможных
        значений    и    соответствующей    обработки.    Его
        использование  может  иногда  помочь  построить более
        ясную исходную программу,  чем могло бы  получиться с
        использованием многократных операторов IF.


См. также END SELECT , EXIT , CASE

Пример.
            INPUT "Введите число",X
            SELECT CASE X
            CASE <10
               PRINT "Маленькое число"
            CASE <1000
               PRINT "Среднее число"
            CASE 1111,2222,3333,4444
               PRINT "Скучное число"
            CASE ELSE
            PRINT "Просто какое-то большое число"
            END SELECT

Функция SGN
-------------------------------------------------------------
Назначение: SGN определяет знак числового выражения

Синтаксис:  Y=SGN(числовое-выражение)

Замечания:  Если   числовое   выражение   положительно,   SGN
        возвращает +1. Если  числовое выражение равно  0, SGN
        возвращает 0.  Если числовое  выражение отрицательно,
        SGN возвращает -1.
            При сочетании функции  SGN с операторами  ON/GOTO
        или  ON/GOSUB  можно  получить  разветвление  с тремя
        выходами  (подобное  аналогичному  разветвлению языка
        FORTRAN):

            ON SGN(BALANCE)+2 GOTO
                    INTHERED,BREAKINGEVEN,INTHEMONEY

См. также:  ON/GOSUB , ON/GOTO

Пример.
        'установить X и Y в 0
        X=0:Y=0
        'определение пользователем значений X и Y
        INPUT "Введите пожалуйста значение для X";X
        INPUT "Введите пожалуйста значение для Y";Y
        'оператор ON по SGN значения X*Y
        'GOSUB  на соответствующую подпрограмму
        ON SGN(X*Y)+2 GOSUB MINUS,ZERO,PLUS
        END 'конец программы

        MINUS:
          PRINT "Вход для отрицательного значения":RETURN
        ZERO:
          PRINT "Вход для нулевого значения":RETURN
        PLUS:
          PRINT "Вход для положительного значения":RETURN

Оператор SHARED
-------------------------------------------------------------
Назначение: SHARED  объявляет  в   процедурах  или   функциях
            разделяемые (глобальные) переменные.

Синтаксис:  SHARED список-переменных

Замечания:  SHARED объявляет, что переменные, указанные через
        запятую в списке переменных, являются глобальными для
        всей  программы,  а  не  локальными  по  отношению  к
        включающей их процедуре или поределению функции.  Это
        дает возможность  процедуре или  функции организовать
        доступ  к  переменным  без  передачи  их  в  качестве
        параметров. Оператор SHARED может появляться только в
        определениях  функций  или  процедур  и  должен  быть
        указан    до    первого    выполняемого     оператора
        соответствующего определния.
            Для того, чтобы  объявить массив  как  переменную
        SHARED,   принадлежащую   процедуре    или   функции,
        нужно включить его идентификатор с пустыми скобками в
        cписок переменных  - нет  необходимости и  не следует
        заново определять размерность массива.
            Необъявленные переменные  в определениях  функций
        по  умолчанию  считаются  SHAREВ,   но   не   следует
        полагаться на  неизменность этого  в будущих  версиях
        компилятора.   Желательно   точно   объявлять   класс
        переменных,  появляющихся  в  функциях или процедурах
        (LOCAL, STATIC, SHARED).

См. также:  LOCAL , STATIC

    Пример.
        DIM ARRAY$(5)
        DEF FNDUMMY$
         SHARED ARRAY$()
         FNDUMMY$=ARRAY$(0)
        END DEF      'конец функции FNDUMMY

        ARRAY$(0)="Это работает на меня"
        PRINT FNDUMMY$
        END          'конец программы

Оператор SHELL
-------------------------------------------------------------
Назначение: SHELL загружает и выполняет подчиненный процесс.

Синтаксис:  SHELL [строка-параметр]

Замечания:  Строка-параметр - это символьное  выражение,  со-
        держащее резидентную команду DOS или имя  выполняемой
        .COM, .EXE или .BAT программы  ("подчиненного процес-
        са"). Может содержать или не содержать параметры, ко-
        торые Вы можете передать подчиненному процессу.
            Если строка-параметр  опущена, никакая  программа
        не  загружается.  Вместо  этого  появляется подсказка
        DOS,  в  ответ  на  которую  можно ввести стандартную
        команду  DOS,  например,   команды  DIR,  COPY.   Для
        возврата  в   программу  следует   набрать  EXIT   на
        подсказку DOS.
            Если  строка-параметр  указана,  то   выполняется
        заданная программа.  После её  завершения, выполнение
        Вашей программы продолжается со следующего оператора.

См. также:  ENVIRON , ENVIRON$ , SHELL в руководстве по DOS

Пример.
        PRINT "Теперь Вы будете использовать оператор SHELL"
        PRINT "ТУРБО БЕЙСИКА для выполнения команды"
        PRINT "DIR/W DOS для просмотра файлов"
        PRINT "на Вашем диске"
        DELAY 3               'ждать 3 секунды
        'использование SHELL для временного выхода из ТУРБО
        'БЕЙСИКА и выполнение команды DIR с параметром /W
        SHELL "DIR /W"
        'вывод в нижней строке экрана
        LOCATE 21,1
        PRINT "Теперь возвращаемся в ТУРБО БЕЙСИК"
        END                   'конец программы

Функция SIN
-------------------------------------------------------------
Назначение: SIN возвращает значение тригонометрического синуса.

Синтаксис:  y=SIN(числовое-выражение)

Замечания:  Числовое выражение представляет угол, заданный  в
        радианах. (О радианах см. в описании функции ATN).
            SIN возвращает результат с двойной точностью.

См. также:  ATN

Пример.
        B$="Borland's TURBO BASIC"
        CENTER=(79-LEN(B$))/2
        'SIN(THETA) возвращает периодическую
        'последовательность значений, изменяющуюся
        'в диапазоне от -1 до 1 так, что TABVALUE всегда
        'находится между -CENTER и CENTER
        THETA=0.
        WHILE THETA < 100
           TABVALUE=CENTER*SIN(THETA)
           PRINT TAB(CENTER+TABVALUE+1); B$
           THETA=THETA+.1
        WEND
        END          'конец программы

Оператор SOUND
-------------------------------------------------------------
Назначение: SOUND генерирует тон заданной частоты и длитель-
            ности

Синтаксис:  SOUND частота, длительность

Замечания:  Частота  -  это  целое  выражение, представляющее
        желаемый уровень в диапазоне от 37 до 32767 герц.
            Длительность - это выражение с плавающей  точкой,
        которое управляет длиной тона, измеряемой 18.2 раз  в
        секунду.  Соответственно,  значение  длительности  36
        соответствует примерно 2 секундам. Длительность может
        изменяться в диапазоне 0.0015 до 65535 (один час).
            Оператор   SOUND   не   останавливает  выполнения
        программы.   Если  SOUND  встречается  в   программе,
        начинается исполнение  требуемого тона,  а выполнение
        программы  продолжается.   Если  встречен   следующий
        оператор SOUND и  его параметр длительности  равен 0,
        то предыдущий SOUND выключается. В противном  случае,
        когда поарметр длительности не равен 0, ТУРБО  БЕЙСИК
        ждет  пока  не  завершится  предыдущий звук для того,
        чтобы начать следующий.
            Оператор  SOUND  лучше  использовать для создания
        специальных  эффектов  (например,  сирен,  щелкания и
        свиста), а не для музыки.

Ограничения: Обратите внимание,  что  оператор  SOUND  заново
        инициализирует микротаймер MTIMER.

См. также:   PLAY

Пример.
        'установить длину музыкального буфера равной 800 байт
        $SOUND 100
        '8 байт на 1 ноту
        'использование SOUND для создания звуковых эффектов
        'имитация переключения скоростей
        'первая скорость
        FOR I=150 TO 175
           SOUND I,2
        NEXT I
        'вторая скорость
        FOR J=125 TO 152
           SOUND J,1.5
        NEXT J
        'третья скорость
        FOR K=100 TO 127
           SOUND K,1.25
        NEXT K

Функция SPACE
-------------------------------------------------------------
Назначение: SPACE$ возвращает строку, состоящую из пробелов

Синтаксис:  s$=SPACE$(счетчик)

Замечания:  Счетчик  -  это  положительное  целое выражение в
        диапазоне  от  0  до  32767,  которое  задает   число
        пробелов, возвращаемых функцией.
            SPACE$ -  одно из  мощных средств  форматирования
        текстов, имеющихся в ТУРБО БЕЙСИКЕ.

См. также:  LSET , PRINT USING , RSET , SPC , STRING$ , TAB

Пример.
        'резервирование пробелов для A$
        A$=SPACE$(42)
        'запись строки из 42 символов
        B$="ЭТА СТРОКА СОСТОИТ ИЗ СОРОКА ДВУХ СИМВОЛОВ"
        'то же самое с помощью клавиши "ПРОБЕЛ"
        C$="                                          "
        'печать длины A$, B$ и C$
        PRINT LEN(A$),LEN(B$),LEN(C$)
        PRINT
        PRINT "Как Вы можете видеть, используя SPACE$"
        PRINT "A$ может быть дано то же значение, что и C$"
        END

Функция SPC
-------------------------------------------------------------
Назначение: SPC  пропускает   N  пробелов   (используется   в
            операторе PRINT).

Синтаксис:  PRINT SPC(N)

Замечания:  N - целое выражение в диапазоне от 0 до 255.
            Как  и  родственная  функция  TAB, SPC может быть
        использована  только  в  списке  выражений операторов
        PRINT, INPUT и PRINT#. SPC(n) выводит n пробелов.  Не
        следует путать функции SPC и SPACE$.
            Если  N   больше  ширины   строки,   определенной
        оператором  WIDTH,   функция   SPC   выводит    число
        пробелов равное (N mod ширина).
            Если SPC  появляется в  конце списка  выражений с
        точкой  с  запятой  или  без  неё, возврат каретки не
        выполняется.

См. также:  TAB , WIDTH

Пример.
        'с использованием SPC вывод слов "BOYS" и "GIRLS"
        'с промежутком 40 пробелов и подчеркивание
        'с помощью функции STRING$
        PRINT SPC(5) "BOYS" SPC(40) "GIRLS"
        PRINT SPC(5) STRING$(4,61) SPC(40) STRING$(5,61)
        FOR I=1 TO 5
           READ BOY$
           READ GIRL$
           'вывод имен мальчиков и девочек в соответствующих
           'колонках
           PRINT SPC(5) BOY$ SPC(40) GIRL$
        NEXT I
        END                    'конец программы

        DATA "John","Ann"
        DATA "Mark","Eve"
        DATA "Paul","Elizabeth"
        DATA "Tony","Sue"

Функция SQR
-------------------------------------------------------------
Назначение: SQR возвращает значение квадратного корня.

Синтаксис:  Y=SQR(числовое-выражение)

Замечания:  Числовое выражение больше или равно нулю.
            SQR вычисляет квадратный корень с  использованием
        алгоритма, который  работает быстрее,  чем вычисление
        корня возведением в  степень 0.5 (то  есть вычисление
        Y=SQR(X) занимает меньше времении, чем Y=X^0.5 .
            При  попытке  извлечения  квадратного  корня   из
        отрицательного  числа  возникает  ошибка выполнения 5
        Illgal function call (неверный вызов функции).
            SQR возвращает значение с двойной точностью.

Пример.
        'ТАБЛИЦА КВАДРАТНЫХ КОРНЕЙ
        'разметка двух колонок
        PRINT "NUMBER" TAB(10) "SQUARE ROOT VALUE"
        PRINT
        FOR N=1 TO 10
           'использование функции TAB для вывода значения
           'корня в нужной колонке, вычисление квадратного
           'корня с помощью функции SQR
           PRINT N; TAB(15) SQR(N)
        NEXT N
        END

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

Синтаксис:  STATIC  список-переменных

Замечания:  Оператор STATIC, использование которого допустимо
        только в определениях процедур или функций, объявляет
        что  переменные   (разделенные  запятыми   в   списке
        переменных) имеют в памяти фиксированные адреса, а не
        базируются  в  стеке.  Идентификатор,  связанный   со
        статичной переменной,  известен только  в заключающей
        его  процедуре  или  функции,  то  есть  переменные в
        других  частях   программы  и   остальные   локальные
        переменные могут иметь те же имена.
            Оператор STATIC должен быть указан в определениях
        функций   или   процедур   до   любого   выполняемого
        оператора.  Для  того,  чтобы  объявить  массив   как
        статическую  переменную  в  процедуре  или   функции,
        следует включить его идентификатор с пустыми скобками
        в список переменных,  а затем установить  размерность
        массива в следующем операторе.
            В  отличие  от  локальных переменных, статические
        переменные не меняют  своего значения между  вызовами
        процедур   или    функций.    Они    инициализируются
        единственный раз при запуске программы.

См. также:  LOCAL , SHARED

Пример.
        'объявление STATIC-процедуры со статическими
        'локальными переменными
        SUB DUMMY STATIC
           'переменная
           STATIC I%
           INCR I%
           PRINT I%
        END SUB         'конец процедуры DUMMY

        I=16
        'два вызова процедуры
        CALL DUMMY
        CALL DUMMY
        PRINT I
        END             'конец программы

Функция STICK
-------------------------------------------------------------
Назначение: STICK возвращает информацию о позиции джойстика.

Синтаксис:  Y=STICK(вариант)

Замечания:  Вариант - это целое выражение в диапазоне от 0 до
        3, действие которого  определяется в соответствии  со
        следующей таблицей:

        -----------------------------------------------------
            Вариант         Действие
        -----------------------------------------------------
               0        Возвращает Х-координату джойстика А
               1        Возвращает Y-координату джойстика A
               2        Возвращает Х-координату джойстика B
               3        Возвращает Y-координату джойстика B
        -----------------------------------------------------
            Обратите   внимание,   что   интерфейс  джойстика
        требует, чтобы до  чтения координат любого  джойстика
        процесс чтения был запущщен оператором STICK(0).

См. также:  STRIG

Пример.
        'опрос джойстиков для определения их
        'текущей позиции
        WHILE NOT INSTAT
           LOCATE 15,15
           PRINT STICK(0),STICK(1),STICK(2),STICK(3);
        WEND
        END            'конец программы

Оператор STOP
-------------------------------------------------------------
Назначение: STOP останавливает программу.

Синтаксис:  STOP

Замечания:  STOP прекращает выполнение программы и возвращает
        управление операционной системе (или ТУРБО БЕЙСИКУ, в
        зависимости  от  того,  откуда  она  была  запущена).
        Оператор  END  выполняет  ту  же функцию, но является
        более предпочтительным.

Отличия:   В отличие от программ на интерпретируемом БЕЙСИКЕ,
        если программа в ТУРБО БЕЙСИКЕ остановлена оператором
        STOP, её выполнение не может быть продолжено
        оператором CONTINUE.

См. также:  END

Пример.

        DO                    'запуск бесконечного цикла
          IF INSTAT THEN STOP 'завершение при нажатии клавиши
        LOOP
        END                   'конец программы

Функция STR$
-------------------------------------------------------------
Назначение: STR$ возвращает символьный эквивалент числа.

Синтаксис:  S$=STR$(числовое выражение)

Замечания:  STR$   преобразует   числовую   переменную    или
        выражение в строку,  то есть функция  STR$ возвращает
        то, что Вы  увидели бы на  экране, если бы  выполнили
        оператор  "PRINT  числовое  выражение". Если числовое
        выражение  больше  0,  STR$  дополняет его лидирующим
        пробелом; например STR$(14) возвращает строку из трех
        символов, первый из которых - пробел.
            Обратной  к  функции  STR$  является функция VAL,
        преобразующая символьную строку в числовое значение.

См. также:  VAL

Пример.
        'присвоим A% числовое значение
        A%=6789
        'используем STR$ для преобразования числа
        A$=STR$(A%)
        PRINT A%,A$
        'проверим, имеет ли A% то же значение, что и A$
        IF A%=VAL(A$) THEN
           PRINT "STR$ и VAL исправно работают"
        END IF
        END

Функция STRIG
-------------------------------------------------------------
Назначение: STRIG возвращает состояния клавиш джойстика.

Синтаксис:  Y=STRIG(вариант)

Замечания:  Функция  STRIG  возвращает  информацию о триггере
        джойстика  в  соответствии  со  значением   варианта.
        Вариант - это  целое числовое выражение,  управляющее
        действием функции STRIG  в соответствии со  следующей
        таблицей:
    ---------------------------------------------------------
        Вариант    Действие
    ---------------------------------------------------------
        0          Если после последнего вызова STRIG(1)
                   была нажата клавиша 1 джойстика А, STRIG
                   возвращает -1, в противном случае - 0.
        1          STRIG возвращает -1, если клавиша джойс-
                   тика А нажата в данный момент, иначе - 0.
        2          Если после последнего вызова STRIG(3)
                   была нажата клавиша 1 джойстика В, STRIG
                   возвращает -1, иначе - 0.
        3          STRIG возвращает -1, если клавиша 1 джойс-
                   тика В нажата в данный момент, иначе - 0.
        4          Если после последнего вызова STRIG(5)
                   была нажата клавиша 2 джойстика А, STRIG
                   возвращает -1, иначе - 0.
        5          STRIG возвращает -1, если клавиша 2 джойс-
                   тика А нажата в данный момент, иначе - 0.
        6          Если после последнего вызова STRIG(7)
                   была нажата клавиша 2 джойстика В, STRIG
                   возвращает -1, иначе - 0.
        7          STRIG возвращает -1, если клавиша 2 джойс-
                   тика В нажата в данный момент, иначе - 0.
    ---------------------------------------------------------
            До выполнения вызовов функции STRIG следует  раз-
        решить проверку клавиши джойстика с помощью оператора
        STRIG ON.
            Для чтения позиции джойстика используйте  функцию
        STICK.

См. также:  STICK

Пример.
        См. пример к оператору STRIG.

Оператор STRIG.
-------------------------------------------------------------
Назначение: STRIG  управляет  проверкой  событий, связанных с
            клавишами джойстика.

Синтаксис:  STRIG (ON | OFF | STOP)

Замечания:  Оператор  STRIG  ON  включает  проверку  событий,
        связанных  с  триггером,  так,  что могут выполняться
        запросы   функций   STRIG   и   обработка  прерываний
        подпрограммой, заданной оператором ON STRIG.
            STRIG  OFF  отключает  проверку   соответствующих
        событий.
            STRIG   STOP   отключает   реакцию   на  события,
        связанные с триггером, но сохраняет их в памяти  так,
        что при  последующем ваполнении  STRIG ON  немедленно
        возникает прерывание.

См. также:    ON STRIG

Пример.
        'включает проверку события
        STRIG(0) ON
        STRIG(1) ON
        STRIG(4) ON
        STRIG(6) ON
        'опрашивает состояние события для проверки
        'была ли нажата клавиша
        WHILE NOT INSTAT
            LOCATE 1,1
            PRINT STRIG(0),STRIG(1),STRIG(2),STRIG(3)
            PRINT STRIG(4),STRIG(5),STRIG(6),STRIG(7)
        WEND
        END

Функция STRING$
-------------------------------------------------------------
Назначение: STRING$ возвращает строку, состоящую из заданного
            числа повторений указанного символа.

Синтаксис:
        S$=STRING$(счетчик,{значение | символьное выражение})

Замечания:  Счетчик  и  значение  -  целые выражения, счетчик
        может меняться в диапазоне от 1 до 32767, значение  -
        от 0 до 255.
            STRING$   с   числовым   аргументом    вызвращает
        символьную   строку,   составленную   из   одинаковых
        символов,  ASCII-код  которых  равен  значению,  а их
        число равно счетчику. STRING$ с символьным аргументом
        возвращает  строку,  состоящую  из  первых   символов
        символьного выражения, число которых равно счетчику.
            STRING$(n,32),   STRING$(n," ")    и    SPACE$(n)
        приводят к одному и  тому же результату -  возвращают
        строку из n пробелов.

Пример.
        'STRING$ и TAB строят прямоугольник
        'использование 40 знаков равенства (=) для
        'построения верхней грани прямоугольника, затем
        'печать
        CLS
        TOP$=STRING$(40,61)
        PRINT TOP$
        'использование 1-секундной задержки для того,
        'чтобы можно было увидеть, как строится прямоугольник
        DELAY 1
        'стороны строятся с помощью цикла
        FOR I=1 TO 5
            PRINT TAB(1) "=" TAB(40) "="
            DELAY 1
        NEXT I
        DELAY 1
        'нижняя грань строится также как и верхняя
        PRINT TOP$
        LOCATE 4,16
        PRINT "середина"
        DELAY 1
        'курсор перемещается за пределы прямоугольника
        LOCATE 20,1
        END           'конец программы


Операторы SUB/END SUB, SUB INLINE
-------------------------------------------------------------
Назначение: Операторы  SUB/END  SUB  и  SUB INLINE определяют
            процедуру (подпрограмму).

Синтаксис:
            SUB идентификатор [(список-параметров)]
               [ LOCAL   список-переменных ]
               [ STATIC  список-переменных ]
               [ SHARED  список-переменных ]
               .
               .    операторы
               .
               [ EXIT SUB ]
            END SUB

            Для SUB INLINE:
            SUB имя-процедуры INLINE

Замечания:  Идентификатор - это  уникальное имя, связанное  с
        процедурой, которое должно соответствовать соглашени-
        ям об именах меток и переменных.
            Список параметров - это необязательная последова-
        тельность формальных параметров, разделяемых  запяты-
        ми. Параметры, используемые в списке аргументов, слу-
        жат только для определения процедуры,  они  не  имеют
        никакого отношения к другим переменным с теми же име-
        нами в программе.
            SUB и END SUB отделяют и дают имя группе операто-
        ров, называемых процедурой (или подпрограммой). Вызов
        процедуры  для выполнения  осуществляется  оператором
        CALL. Процедуре  можно,  при  необходимости, передать
        параметры по значению и по имени (по ссылке).
           Встроенные  (INLINE) подпрограммы на языке ассемб-
        лера используют ту же вызывающую  последовательность,
        что и обычные процедуры. Например:

            CALL имя-процедуры [(список-параметров)]

            SUB имя-процедуры INLINE
                $INLINE список-байтов
                $INLINE "имя-СОМ-файла"
            END SUB

            Произвольное количество операторов $INLINE  может
        быть задано в любом порядке. Единсвенное  ограничение
        - использование в одной процедуре не более 16  файлов
        СОМ.
            Обратите  внимание,  что  список  параметров   не
        задается в операторе SUB.
            Список байтов  состоит из  констант и  выражений,
        равных целому  в диапазоне  от 0  до 255, разделенных
        запятыми (обычно, для байтовых значений  используется
        шестнадцатеричные коды).
            Возвраты  из   процедур  (RETURN)   не   являются
        необходимыми как в коде на ассемблере, так и в  конце
        процедур SUB. За  этим следит компилятор.  (Для более
        детальной информации  см. приложение  С "Интерфейс  с
        языком ассемблера".)

            Определения процедур и ход выполнения программы
            -----------------------------------------------
            Место определения процедур  в программе не  имеет
        значения. Независимо от того, где будет  использована
        процедура,  она  может  быть  определена  в  1-ой или
        1000-й строке программы. Вам нет нужды направлять ход
        программы через  процедуру на  этапе инициализации  -
        компилятор  найдет  Ваше  определение,  где бы оно ни
        находилось.
            Кроме  того,   выполнение  программы   не   может
        случайно  "попасть"   в  процедуру,   в  отличие   от
        подпрограммы.   Что   касается   выполняемой    ветви
        программы,  определения  функций  и процедур являются
        невидимыми. Например:

            CALL PRINTSTUFF
            SUB PRINTSTUFF
                PRINT "Напечатано из PRINTSTUFF"
            END SUB

            При  выполнении  этой,  состоящей  из  4   строк,
        программы сообщение появится только один раз, так как
        PRINTSTUFF вызывается один раз в первой строке.
            К определению процедур  следует относиться как  к
        изолированным  островкам  программного  кода,  нельзя
        входить или выходить из них операторами GOTO,  GOSUB,
        или RETURN. Внутри определений, однако, эти операторы
        допустимы.
            Обратите  внимание,  что  определения  функций  и
        процедур не должны  быть вложенными, то  есть, нельзя
        определить  процедуру  или   функцию  внутри   другой
        процедуры или функции (хотя определение процедуры или
        функции может  содержать вызовы  других процедур  или
        функций).

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

            SUB CALCARRAY(A(2),SIZDIM1,SIZDIM2)

        объявляет, что CALCARRAY предполагает три  аргумента:
        двумерный  массив   с  одинарной   точностью  и   две
        скалярные  переменные  с  одинарной точностью. Обычно
        эти  скалярные  переменные  используются для передачи
        размеров массива по двум его измерениям.

            Объявление локальных переменных.
            --------------------------------
            Для того,  чтобы объявить  в процедуре  локальные
        переменные, следует до любого  выполняемого оператора
        в определении использовать оператор  LOCAL. Например,
        оператор

            LOCAL A%,B#,BIGARRAY%()

        создает три локальные переменные,  скалярные перемен-
        ные A% и B# (целую  и  с двойной точностью,  соответ-
        ственно) и целочисленный массив BIGARRAY%.
            Затем, должна быть установлена нужная размерность
        массива:

            DIM DYNAMIC BIGARRAY%(1000)

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

            Статические и разделяемые переменные.
            -------------------------------------
            По  умолчанию,  переменные,  появляющиеся  внутри
        описаний  процедур,  являются  локальными.  Однако, в
        связи  с  тем,  что  это соглашение может измениться,
        следует затратить усилия на явное определение  каждой
        переменной, используемой в процедуре.
            Для описания  переменных, являющихся  глобальными
        по отношению к основной части программы, используется
        оператор SHARED.
            В  случаях,  когда  важно,  чтобы  переменные  не
        теряли своего значения  при каждом вызове  процедуры,
        используйте для их объявления оператор STATIC.
            Описание процедуры должно заканчиваться  операто-
        ром END SUB, который логически возвращает  управление
        на оператор, непосредственно следующий  за оператором
        вызова CALL. Чтобы выйти из процедуры не из её конца,
        а из какого-либо другого места, используется оператор
        EXIT SUB.

См. также:  $INLINE , CALL , EXIT SUB , LOCAL , SHARED , STATIC

Пример.
        'объявление массива чисел
        DIM ARRAY(1)
        SUB TESTPROCEDURE (I%,L&,S!,D#,E,A(1))
            'выводятся значения каждого
            'параметра, переданного процедуре
            PRINT I%;L&;S!;D#;E;A(0)
        END SUB

        INTEGER%=1
        LONGINT&=2
        SINGLEPRE!=3
        DOUBLEPRE#=4
        ARRAY(0)=5

        CALL TESTPROCEDURE(INTEGER%,LONGINT&,SINGLEPRE!, _
                           DOUBLEPRE#,INTEGER%^2,ARRAY())
        END          'конец программы

Оператор SWAP
-------------------------------------------------------------
Назначение: SWAP обменивает значения двух переменных.

Синтаксис:  SWAP перем1, перем2

Замечания:  Перем1 и перем2 - две переменные одного типа. При
        попытке  обмена  значений  переменных  разных   типов
        (например,  символьной  и  целой  или  с  одинарной и
        двойной точностьтю)  возникает ошибка  компиляции 475
        Type Mismatch (несоответствие типов).
            SWAP  удобен,  так  как  простой обмен значений в
        двух  последовательных  операторах  присваивания   не
        решает задачи:

            А=В: В=А

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

            TEMP=A: A=B: B=TEMP

Пример.
        'задание значений A% и B%
        A%=15:  B%=17
        'печать значений каждой переменной в одной строке
        PRINT TAB(8) "значение 'A%' равно:"A%_
              TAB(42)"значение 'B%' равно:"B%
        PRINT
        'обмен значений переменных с помощью SWAP
        SWAP A%,B%
        'печать новых значений под старыми
        PRINT        "значение 'A%' теперь равно:";A%_
              TAB(34)"значение 'B%' теперь равно:";B%
        END

Оператор SYSTEM
-------------------------------------------------------------
Назначение: SYSTEM завершает программу.

Синтаксис:  SYSTEM

Замечания:  SYSTEM   завершает    программу   и    возвращает
        управление операционной системе (или ТУРБО БЕЙСИКУ  в
        зависимость от того,  откуда она запущена).  Оператор
        END,  выполняющий  ту  же  функцию,  является   более
        предпочтительным.

См. также:  END , STOP

Пример.
        'ANSWER равен 5
        ANS%=5
        FOR I=1 TO 10
            INPUT "Введите, пожалуйста, число от 1 до 10";X%
            'если пользователь угадал ответ, выйти из цикла и
            'похвалить
            IF X%=ANS% THEN GOTO REWARD
            'спросить у пользователя, хочет ли он сделать ещё
            'одну попытку
            INPUT "Хотите ли Вы попробовать ещё раз (Y/N)":X$
            'если пользователь не захочет пробовать ещё раз,
            'выйти из программы
            IF UСASE(X$)<>CHR(89) THEN SYSTEM
        NEXT I
        REWARD:
            PRINT
            PRINT "Вы угадали!"
        END

Функция TAB
-------------------------------------------------------------
Назначение: TAB  устанавливает  метку  табуляции  на заданную
        позицию  выводимой  строки  (используется  только   в
        операторах PRINT).

Синтаксис:  PRINT TAB(n)

Замечания:  n - целочисленное выражение  в диапазоне от 1  до
        255.
            Также,   как   и    функция   SPC,   TAB    может
        использоваться только  в списке  выражений операторов
        PRINT,  LPRINT   и  PRINT#.   Используйте  TAB    для
        выравнивания граф с  данными. Функцис ТАВ  заставляет
        процедуры печати ТУРБО  БЕЙСИКа осуществлять вывод  с
        n-ой  позиции  текущей  строки.  Если текущая позиция
        курсора  больше  n  (например,  PRINT  TAB(20), когда
        курсор  находится  в  30-й  колонке), то ТУРБО БЕЙСИК
        пропускает строку и  перемещает курсор в  n-ю позицию
        следующей сторки.
            Если  ТАВ  появляется  в  конце  списка выражений
        оператора PRINT  с последующей  точкой с  запятой или
        без неё, ТУРБО БЕЙСИК не выводит возврат каретки;  то
        есть после ТАВ подразумевается точка с запятой.

См. также:  LPRINT , PRINT , PRINT# , SPC

Пример.
        'эта программа читает список друзей и
        'номеров телефонов, а затем выводит их на
        'экран с помощью PRINT и TAB
        PRINT
        PRINT TAB(5) "ИМЯ" TAB(40) "ТЕЛЕФОН"
        PRINT
        FOR I=1 TO 5
            READ FRIEND$
            READ PHONE$
            'вывод данных в тех же позициях, что и заголовка
            PRINT TAB(5) FRIEND$ TAB(40) PHONE$
        NEXT I
        END

        DATA "John Blaze","423-4598"
        DATA "Ann Span",  "335-2343"
        DATA "Bill Write","668-9834"
        DATA "Mark Jones","425-5593"
        DATA "Dan Moore", "438-4593"


Функция TAN
-------------------------------------------------------------
Назначение: TAN возвращает значение тригонометрического тангенса.

Синтаксис:  Y=TAN(числовое-выражение)

Замечания:  Числовое  выражение  -   это  угол,  заданный   в
        радианах.  О радианах см. описание оператора ATN.
            TAN возвращает результат с двойной точностью.

См. также:  ATN , COS , SIN
Пример.
        DEFDBL A-Z
        'установка значения PI# с помощью функции
        'арктангенса ATN
        PI=ATN(1)*4
        'вывод значения PI#
        PRINT PI
        'PI, деленное на 4 радиана, равно 45 градусам
        'использование тригонометрической функции тангенса
        PRINT TAN(PI/4)
        END

Системная переменная TIME$
-------------------------------------------------------------
Назначение: TIME$ читает или устанавливает системное время.

Синтаксис:  Считывание времени:
               S$=TIME$

            Установка времени:
               TIME$=символьное-выражение

Замечания:  Системная переменная TIME$ содержит  8-символьную
        строку,  представляющую  время  на  системных часах в
        формате hh:mm:ss, где hh  - часы (в военном  формате,
        от 0  до 23),  mm -  минуты, ss  - секунды.  TIME$ не
        будет хранить  точное  время,  если   при   последней
        загрузке  системы  DOS  на  компьютере  часы  не были
        правильно установлены.
            Присвоение значения переменной TIME$ устанавлива-
        ет системные часы.  Для  этого  необходимо  построить
        символьное выражение,  содержащее текущее время в во-
        енном формате (24 часа), и затем присвоить его  пере-
        менной TIME$. Минуты и секунды можно опустить. Напри-
        мер:

            TIME$="12"    'устанавливает часы на 12 часов дня
            TIME$="13:01" 'устанавливает часы на час и минуту
            TIME$="13:01:30" 'устанавливает часы ещё на 30
                             'секунд
            TIME$="0:01"  'устанавливает часы на минуту
                          'после полуночи

            Если значения часов, минут или секунд выходят  за
        пределы допустимых диапазонов (например, число  минут
        равно  61),  возникает  ошибка  выполнения  5 Illegal
        Function Call (неверный вызов функции).
            С помощью  функции TIMER  можно определить  число
        секунд, прошедших с момента загрузки системы.

Пример.
        'включение проверки времени
        TIMER ON
        'вывод текущего времени по системным часам
        PRINT "текущее время";TIME$
        'новая установка времени
        INPUT "Введите новое время (0-23)";ANS$
        'установка нового значения
        TIME$=ANS$
        'вывод нового значения
        PRINT "новое время равно ";TIME$
        END

Функция TIMER
-------------------------------------------------------------
Назначение: TIMER  возвращает  время  в  секундах,  прошедшее
            после полуночи.

Синтаксис:  Y=TIMER

Замечания:  Функция TIMER  не имеет  аргументов и  возвращает
        число  секунд,  прошедших   после  полуночи  в   виде
        значения  одинарной  точности  с  плавающей запятой с
        разрешением  около   одной  десятой   секунды.   Если
        системное   время   не   переустанавливалось    после
        последней загрузки (либо с помощью команды DOS  TIME,
        либо через иситемную переменную TIME$ ТУРБО БЕЙСИКа),
        функция TIMER  возвращает число  секунд, прошедших  с
        момента последней загрузки системы.

См. также:  MTIMER

Пример.
        TIME$="12"
        PRINT USING"после полуночи прошло ##### секунд";TIMER
        END

Оператор TIMER
-------------------------------------------------------------
Назначение: TIMER  управляет  проверкой  событий, связанных с
            таймером.

Синтаксис:  TIMER {ON | OFF | STOP }

Замечания:  TIMER  управляет  проверкой  событий, связанных с
        таймером,  то   есть  TIMER   определяет,  нужно   ли
        передавать   управление   подпрограмме,   заданной  в
        операторе   ON   TIMER   по   прошествии   указанного
        количества секунд.
            TIMER ON  включает проверку  событий по  таймеру.
        TIMER  OFF   выключает  их.   TIMER  STOP   отключает
        прерывания  по  событиям,  связанным  с  таймером, но
        запоминает  их  так,  что  при последующем выполнении
        оператора TIMER ON, немедленно возникает прерывание.

См. также:  ON TIMER

Пример.
        'установка обработки события
        ON TIMER(1) GOSUB UpdateClock
        'включение проверки событий
        TIMER ON
        WHILE NOT INSTAT: WEND
        END
        'конец программы
        UpdateClock:
            SaveX%=CSRLIN   'сохранение позиции курсора
            SaveY%=POS(0)
            LOCATE 24,36
            PRINT TIME$;
            LOCATE SaveX%,SaveY%
            'восстановление позиции курсора
            RETURN

Команды TRON и TROFF
-------------------------------------------------------------
Назначение: TRON  и  TROFF  включают  и выключают трассировку
            выполняемой программы.

Синтаксис:  Включить трассировку:
               TRON
            Выключить трассировку:
               TROFF

Замечания:  TRON  переводит  программу  в  режим отладки, при
        котором   номера   строк   исходного   текста,  метки
        операторов,  имена   процедур  и   функций  по   мере
        выполнения  очередного  оператора  выводятся  в  окне
        трассировки. TROFF выключает режим отладки.
            При выполнении программы в текстовом режиме ТУРБО
        БЕЙСИКа  трассировка   номеров  срок,   меток,   имен
        процедур   и   функций    воспроизводится   в    окне
        трассировки.
            Находясь в режиме трассировки, используйте Alt-F9
        для   переключения   трассировки   и   выполнения,  и
        наоборот. Для выполнения отдельного шага на следующую
        строку,  метку,  имя  процедуры  или  функции нажмите
        Alt-F10.

Отличия:    В  отличие  от  Интерпретатора  БЕЙСИКа,  в ТУРБО
        БЕЙСИКе  работой  команд  TRON  и  TROFF управляет их
        физическое   местоположение    в   исходном    тексте
        программы,  а  не   положение  в  выполняемой   ветви
        программы. Рассмотрим, например, следующую программу:

            10  GOTO 30
            20  TRON
            30  X=Y+2
            40  TROFF
            50  END

        При выполнении  этой программы  Интерпретатор БЕЙСИКа
        никогда не включит трассировку, что касается  команды
        TRON  в  строке  20,  то  она просто не существует. С
        другой  стороны,  ТУРБО  БЕЙСИК  принимает  решение о
        включении/выключении трассировки во время  компиляции
        и  считает,   что  трассировка   включена  для   всех
        операторов,  стоящих   после  команды   TRON.   Таким
        образом, при запуске программы в ТУРБО БЕЙСИКе в окне
        трассировки появится:

            [30][40]

Пример.
        'присвоение значений X, Y, Z
        10  X=0: Y=1: Z=2
        20  GOTO 40
        30  TRON
        'при выполнении программы выводятся номера
        'строк 20, 30 и 40, а не их содержимое
        40  X=Y+Z
        'после выключения трассировки выводится значение Х
        50  TROFF
        60  PRINT X
        70  END

Функция UBOUND
-------------------------------------------------------------
Назначение: UBOUND возвращает наибольшее допустимое  значение
        границы (наибольший индекс) для заданной  размерности
        массива.

Синтаксис:  N=UBOUND(массив(размерность))

Замечания:  Размерность  -  это  целое  число  от  1 до числа
        измерений  массива,  для  которого  ищется наибольший
        индекс.
            Для нахождения  наименьшего индекса  используется
        функция LBOUND.

См. также:   LBOUND , OPTION BASE

Пример.
        'задание нижней и верхней границ массива
        DIM ARRAY%(1900:2000)
        'вывод значений массива
        FOR INDEX%=LBOUND(ARRAY%(1)) TO UBOUND(ARRAY%(1))
            PRINT "элемент массива (";INDEX%;") равен";_
                    ARRAY%(INDEX%)
        NEXT INDEX%
        END

Функция UCASE$
-------------------------------------------------------------
Назначение: UCASE$  возвращает  строку,  состоящую  только из
            прописных букв.


Синтаксис:  S$=UCASE$(символьное-выражение)

Замечания:  UCASE$    возвращает    строку,     эквивалентную
        символьному выражению, за  исключением того, что  все
        строчные  алфавитные  символы  в символьном выражении
        заменяются на прописные.

См. также:  LCASE$

Пример.
        PRINT UCASE$("TB or not TB...");

Функция VAL
-------------------------------------------------------------
Назначение: VAL возвращает числовой эквивалент строки.

Синтаксис:  Y=VAL()

Замечания:  Функция  VAL  преобразует  символьный  аргумент в
        числовое   значение.   Если   символьное    выражение
        начинается с числовых знаков (0 - 9, +, -,..., Е, D),
        но содержит и  нечисловые, то функция  VAL возвращает
        числовое значение  подстроки, предшествующей  первому
        нечисловому   символу.   Если   символьное  выражение
        начинается с нечислового  символа, VAL возвращает  0.
        Лидирующие  пробелы  или  другие  неотображаемые   на
        экране знаки (например, табуляция) игнорируются.
            Функция  VAL  часто  используется в подпрограммах
        ввода,   выдающих   запрос   пользователю   на   ввод
        символьных  данных.  Функция   VAL  преобразует   при
        необходимости   данные   в   числовые   значения  без
        опасения,  что  числовым  переменным  будут присвоены
        нечисловые значения  и появится  сообщение об  ошибке
        ?Redo From Start (повторите сначала).

См. также:  STR$

Пример.
        'строка типа адреса
        A$="34 N.Main St."
        'строка без цифр
        B$="Правильно, тридцать четыре"
        'цифры и символы
        C$="+3.4eb"
        'цифры с лидирующим пробелом
        D$=" 123 go"
        'вывод получаемых с помощью VAL значений
        PRINT VAL(A$),VAL(B$),VAL(C$),VAL(D$)
        END

Функция VARPTR
-------------------------------------------------------------
Назначение: VARPTR возвращает адрес переменной.

Синтаксис:  Y=VARPTR(переменная)

Замечания:  Переменная   может   быть   любой   числовой  или
        символьной переменной, или элементом массива.
            VARPTR возвращает смещение  адреса в памяти,  где
        хранится переменная. Такая адресная информация иногда
        называется   указателем   (pointer);   например,    о
        выражении  VARPTR(X)  говорится,  что  оно возвращает
        значение "указателя на Х".
            В связи с тем, что в программах на ТУРБО  БЕЙСИКе
        используется расширенная  модель памяти,  для полного
        определения адреса переменной требуется ещё и функция
        VARSEG. (VARSEG возвращает сегментную часть адреса.)
            VARPTR  наиболее  часто  используется  для  того,
        чтобы  обеспечить  подпрограмме  на  языке ассемблера
        доступ к ячейке памяти.
            При использовании  VARPTR для  получения смещения
        строки или  массива помните,  что функция  возвращает
        смещение дескриптора строки или массива, а не данных.
        См. в  приложении С  "Интерфейс с  языком ассемблера"
        описание  форматов  дескрипторов  строк  и массивов и
        карту распределенияпамяти в момент выполнения.

См. также:  VARSEG

Пример.
        B%=55
        DEF SEG=VARSEG(B%)
        ADDRESS%=VARPTR(B%)
        PRINT PEEK(ADDRESS%)
        END

Функция VARPTR$
-------------------------------------------------------------
Назначение: VARPTR$   возвращает   указатель   переменной   в
            символьном формате.

Синтаксис:  S$=VARPTR$(переменная)

Замечания:  Переменная   может   быть   любой   числовой  или
        символьной переменной, или элементом массива.
            VARPTR$   возвращает   указатель   переменной   в
        символьном формате  и используется,  в основном,  для
        включения   имен   переменных   в   командную  строку
        операторов PLAY и DRAW.

См. также:  DRAW , PLAY , VARSEG

Пример.
        SCREEN 1
        HOUSE$="G20 G5 E20 F20 H5 D20 L30"
        DRAW HOUSE$
        DRAW "BE3"
        DRAW "P1.3"
        FOR I%=1 TO 280 STEP 40
           DRAW "M="+VARPTR$(I%)+",40"
           DRAW HOUSE$
        NEXT I%
        END

Функция VARSEG
-------------------------------------------------------------
Назначение: VARSEG возвращает адрес сегмента переменной.

Синтаксис:  y=VARSEG(переменная)

Замечания:  Переменная   может   быть   любой   числовой  или
        символьной переменной, или элементом массива.
            В связи с тем, что в программах на ТУРБО  БЕЙСИКе
        используется расширенная  модель памяти,  для полного
        определения адреса переменной требуется ещё и функция
        VARPTR.
            VARSEG  возвращает числовое значение в  диапазоне
        от  0  до  65535.  Для  получения  адреса  переменной
        следует  использовать  VARSEG  совместно  с  VARPTR c
        тем, чтобы  оператор CALL  мог сообщить  подпрограмме
        на языке ассемблер, где в памяти находится  аргумент,
        который она должна обрабатывать.
           Программы на ТУРБО БЕЙСИКЕ размещают все одиночные
        (не  являющиеся  массивами)  переменные  в  отдельном
        сегменте,  длина  которого  может  быть в пределах до
        64К.  Таким  образом,   VARSEG  для  всех   одиночных
        переменных заданной программы всегда будет возвращать
        одно  и  то  же  значение.  В  действительности,  это
        значение адреса сегмента устанавливается по умолчанию
        для операторов,  управляемых DEF  SEG (как  например,
        PEEK и POKE). При использовании VARSEG для  получения
        смещения   строки   или    массива,   помните,    что
        возврвщаемое  значение  -  это  сегмент   дескриптора
        строки или массива, а  не данные строки или  массива.
        См. в приложении С   "Интерфейс с языком  ассемблера"
        описание  форматов   дескрипторов строк и массивов  и
        карту распределенияпамяти в момент выполнения.

См. также:  VARPTR

Пример      См. VARPTR

Оператор VIEW
-------------------------------------------------------------
Назначение: VIEW   определяет    активную    область    (поле
        изображения) графического экрана.

Синтаксис:
        VIEW [[SCREEN][(X1,Y1)-(X2,Y2) [,[цвет],[граница]]]]

Замечания:  (Х1,Y1) и (X2,Y2) - верхний левый и нижний правый
        углы, соответственно, выделяемого поля изображения.
            Цвет - это необязательный числовой аргумент; если
        он  указан,  новое  поле  изображения  окрашивается в
        заданный цвет.
            Граница -  это необязательный  числовой аргумент;
        если он указан,  ТУРБО БЕЙСИК обводит  границу нового
        поля изображения заданным цветом. Если он не  указан,
        граница не изображается.
            VIEW определяет область на графическом экране, на
        которую  может  производиться  запись  или, наоборот,
        область, на которую  запись не производится.  Попытки
        изобразить пикселы вне поля изображения не приводят к
        результату, это называется отсечением изображения.

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

            VIEW (100,50)-(300,180)

        команда

            PSET(0,0)

        изображает точку с координатами (100,50).
            Если SCREEN указан, координаты точек определяются
        обычным путем, то  есть относительно левого  верхнего
        угла экрана. Так, например,

            PSET(0,0)

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

См. также:  CLS , SCREEN , WINDOW

Пример.     SCREEN 1
            FOR I=0 TO 6
                'задание поля изображения
                VIEW ( 10*(I+1), 10*(I+1) )- _
                     ( 25*(I+1), 25*(I+1) ),I,3-I
                'вывод круга в поле изображения
                CIRCLE(10,10),I+1,3-I
            NEXT I
            END

Оператор WAIT
-------------------------------------------------------------
Назначение: WAIT ждет заданных условий состояния аппаратуры.

Синтаксис:  WAIT порт, N [,M]

Замечания:  Порт - целочисленное выражение (в диапазоне от  0
        до 65535), задающее  аппаратный порт ввода.  N и M  -
        целые выражения в диапазоне от 0 до 255.
            WAIT  останавливает  выполнение  программы до тех
        пор,  пока  указанным  портом  не  будет представлено
        значение, соответствующее заданному битовому шаблону.
        Над  значением,   считанным  из   порта   выполняется
        операция логического "И" с числом M, и -  логического
        "ИЛИ" с  числом N.  Если результат  равен 0,  процесс
        повторяется. Если не равен 0, ТУРБО БЕЙСИК  выполняет
        следующий оператор. Если M опущено, вместо него  WAIT
        тспользует 0.

Пример.
        WAIT &H60,1
        PRINT "hi"
        END

Оператор WHILE/WEND
-------------------------------------------------------------
Назначение: WHILE/WEND   строят  цикл,  в  котором   проверка
            выполняется на входе.

Синтаксис:  WHILE целое-выражение
               .
               . [операторы]
               .
            WEND

Замечания:  Если целое выражение истинно, то есть TRUE (равно
        ненулевому значению), выполняются все операторы между
        WHILE и завершающим цикл оператором WEND; затем ТУРБО
        БЕЙСИК  возвращается  на  оператор  WHILE и повторяет
        проверку,  если   целое  выражение   опять   истинно,
        выполняются  все  внутренние  операторы  и т. д. Этот
        процесс  повторяется  до  тех  пор,  пока проверяемое
        выоажение  не   будет  равно   0,  тогда   управление
        передается на оператор, следующий за оператором WEND.
            Если целое выражение оценивается как ложное, т.е.
        FALSE (ложь), при первом проходе цикла, не выполняет-
        ся ни один оператор цикла.
            Циклы, построенные  операторами WHILE/WEND  могут
        быть вложенными (заключенными внутри другого  цикла).
        Каждый   WEND   соответствует   ближайшему   к   нему
        незакрытому  оператору  WHILE.   Если  ТУРБО   БЕЙСИК
        встречает  оператор  WEND  без  соответствующего  ему
        оператора WHILE, возникает ошибка выполнения 30  WEND
        Without WHILE (WEND без соответствующего WHILE). Если
        оператору  WHILE  не  соответствует  оператор   WEND,
        возникает  ошибка  выполнения  29  WHILE Without WEND
        (WHILE без соответствующего WEND).
            Хотя  компилятору  это  совершенно   безразлично,
        структурируйте расположение операторов между WHILE  и
        WEND с помощью пары пробелов для того, чтобы  сделать
        более   ясной   структуру   созданного   Вами  цикла.
        Внимание:

            WHILE -1 : ... : WEND

        создает бесконечный цикл.
            Для   выхода   из   цикла   WHILE/WEND    следует
        использовать оператор EXIT WHILE.

См. также:  DO/LOOP , EXIT

Пример.
        'положить I равным 0
        'положить X равным 10
        I=0
        X=10
        'выполнять цикл до тех пор, пока I не будет равно 10
        WHILE I<X
            'прибавить 1 к значению I
            I=I+1
            'вывести значение I
            PRINT "I=";I
            'ждать 1 секунду
            DELAY 1
            'завершить цикл, когда выполнится условие
        WEND
        PRINT
        PRINT "Оба значения: и I и X равны 10"
        PRINT I
        PRINT X
        END

Оператор WIDTH
-------------------------------------------------------------
Назначение: WIDTH устанавливает логическую длину строки.

Синтаксис:  WIDTH [{ имя-устройства | #номер-файла },] длина

Замечания:
            Длина - целое выражение в диапазоне от 0 до  255,
        которое задает новую логическую длину строки.
            Имя устройства - необязательное  символьное выра-
        жение, указывающее устройство,  длина строки которого
        устанавливается. Могут указываться устройства  SCRN:,
        LPT1:, LPT2:, LPT3:, COM1: или COM2:. Если устройство
        не указано, по умолчанию устанавливается длина строки
        экрана (SCRN:).
            Номер  файла  -  целое  выражение, которое задает
        файл, открытый для вывода.
            В целом, WIDTH определяет число символов, которое
        может быть  выведено на  заданное устройство  прежде,
        чем будет выполнен возврат каретки. Конкретные детали
        работы  оператора   WIDTH  зависят   от   конкретного
        устройства.

            WIDTH <длина> или WIDTH "SCRN:",<длина>
        устанавливают  ширину  экрана.  Допустимы  только два
        значения длины: 40 и 80,; но для монохромного  экрана
        40 тоже не допустимо.
            Если  экран  находится   в  графическом   режиме,
        изменение ширины  экрана имеет  тот же  эффект, что и
        смена  графического  режима.  Например,  если текущим
        является  режим  с  высоким  разрешением,  WIDTH   40
        переключает   в   графический   режим   со    средним
        разрешением.

            WIDTH <устройство>,  <длина> -  определяет строки
        указанного устройства  при последующем  его открытии.
        Если  устройство   уже  открыто,   длина  строки   не
        изменяется.
            Внимание:   оператор    LPRINT    непосредственно
        открывает принтер, то есть действие оператора

            WIDTH "LPT1:",длина

        проявляется немедленно.

            WIDTH #<номер-файла>,<длина>  также меняет  длину
        устройсва,  представленного  номером  файла  в момент
        выполнения команды.
            Устройства, для  которых оператор  WIDTH что-либо
        означает, это LPT1:, LPT2:, LPT3:, COM1: и COM2:.
            Ширина строки каждого принтера по умолчанию - 80.
        Если ширина  строки устанавливается  равной 255,  это
        означает, что логической длины строки практически  не
        существует, и возврат каретки никогда не вставляется.

Пример.
        'установить графический режим со средним разрешением
        SCREEN 1,0
        PRINT "Это пример работы в режиме"
        PRINT "  со средним разрешением"
        DELAY 3     'ждать 3 секунды
        'установка с помощью WIDTH графического режима
        'с высоким разрешением
        WIDTH 80
        PRINT "Это образец графического режима"
        PRINT "     с высоким разрешением"
        DELAY 3
        'переключение в режим со средним разрешением
        WIDTH 40
        PRINT "Заметьте, что в режиме"
        PRINT "со средним разрешением"
        PRINT "буквы большего размера"
        DELAY 3
        SCREEN 0,1  'текстовый режим
        WIDTH 80
        PRINT "Это 80-символьный текстовый режим"
        DELAY 3
        WIDTH 40      '40-символьный режим
        PRINT "Это 40-символьный текстовый режим"
        '80-символьный текстовый режим
        WIDTH 80
        'вопрос пользователю, можно ли продолжить пример на
        'принтере?
        INPUT "Поддерживаются ли EPSON-коды принтера (Y/N)";_
                ANS$
        'завершение программы, если EPSON-коды не
        'поддерживаются
        IF UCASE$(ANS$)<>CHR$(89) THEN END
        'установить сжатый режим печати
        LPRINT CHR$(15)
        'установить логическую длину сроки
        WIDTH "LPT1:",130
        LPRINT "Тестирование в сжатом режиме установлено ";
        LPRINT "на 130 колонок, та же строка печатается ";
        LPRINT "до конца страницы."
        LPRINT CHR$(18)     'восстановление
        WIDTH "LPT1:",80
        END                 'конец программы

Оператор WINDOW
-------------------------------------------------------------
Назначение: WINDOW определяет систему координат графики.

Синтаксис:  WINDOW [[SCREEN](X1,Y1)-(X2,Y2)]

Замечания:  (X1,Y1)  и  (X2,Y2)  -  это  две пары координат с
        одинарной  точностью.  (Х1,Y1)  представляют   нижнюю
        левую часть экрана, а (X2,Y2) - верхнюю правую.
            Если Вам не нравится стандартный способ адресации
        графического  экрана,  принятый  в  ТУРБО  БЕЙСИКе  с
        началом координат в  левом верхнем углу  от 0 до  319
        (от 0 до  639), от 0  до 199, Вы  можете задатьего по
        собственному усмотрению с помощью оператора WINDOW.
            Оператор WINDOW преобразует произвольно выбранные
        "пользовательские"  координаты  (которые  могут  быть
        более  естественным  для  Вашей  программы   способом
        определения   позиций)   в   "физические"  координаты
        (адреса пикселов на экране).
            Одно  из  применений  оператора  WINDOW состоит в
        том, чтобы перемасштабировать дисплей в  соответствии
        с   координатами   экрана,   принятыми   в  различных
        компьютерных  системах.  Так,  например,  графический
        экран  Apple II состоит  из 280  горизонтальных и 192
        вертикальных рядов пикселов. Оператор

            WINDOW SCREEN (0,0)-(279,191)

        определяет для экрана PC ту же адресную схему.  После
        выполнения  этого  оператора  с  компьютера  Aplle II
        переносится  программа,  пытающаяся  засветить  самый
        нижний правый пиксел на экране Apple II, для которого
        она была написана. Например, PSET(279,191) изображает
        пиксел с физическим адресом 319,199 (в  нижнем правом
        углу экрана PC).
            В качестве  другого примера  предполпжим, что  Вы
        работаете в  прикладной области,  где было  бы удобно
        описывать линии и другие объекты в  терминах  коорди-
        нат, много больших чем 0-199 и 0-639, допустимых  при
        стандартной адресации экрана.  Предположим также, что
        было бы полезно иметь начало координат в центре экра-
        на, так, чтобы значение Y возрастало вверх,  как  это
        принято в аналитической геометрии.
            Оператор WINDOW позволяет работать с  графическим
        экраном с высоким  или средним разрешением,  как если
        бы  он  был  именно  таким  образом  устроен.  WINDOW
        позволяет разместить на экране весь диапазон чисел  с
        одинарной точностью, например, оператор

            WINDOW (-1E6,1E6)-(1E6,-1E6)

        создает  систему  координат  на  4  триллиона   точек
        (2 миллиона на  2 миллиона). Верхнему  левому пикселу
        соответствует   (-1000000,1000000);    точка    (0,0)
        расположена  в   центре  экрана;   (1000000,-1000000)
        соответствует   нижнему    правому    пикселу.    Это
        аппроксимация  стандартной  координатной  плоскости в
        декартовой  геометрии:  начало  координат  в  центре,
        положительные значения X  находятся справа от  начала
        координат,  положительные  значения  Y  - выше начала
        координат.
            Псле  выполнения  этого  оператора любая операция
        записи  на   экран  (CIRCLE,   LINE  и   др.)   будут
        использовать новую систему координат.

            PSET(0,0)

        выделяет пиксел в центре экрана;

            PSET(250000,250000)

        выделяет  пиксел  немного   выше  и  правее   центра.
        Аргументы  оператора WINDOW  -  это числа с плавающей
        точкой одинарной точности, которые позволяют задавать
        на  экране  и  огромные  области (миллионы пикселов в
        обоих направлениях), и области с дробными  значениями
        координат - от 0 до 1.
            Если   задано   необязательное   служебное  слово
        SCREEN,  то  сохраняется  установленное  по умолчанию
        свойство координаты Y расти по направлению вниз. Так,
        например

            WINDOW SCREEN (-1,1)-(-1,1)

        создает  систему  координат,  в  которой верхний край
        экрана имеет координату Y равную -1, а нижний край  -
        координату Y равную 1.
            Любое распределение  экрана, заданное  оператором
        WINDOW,  отменяется  при  выполнении  операторов RUN,
        SCREEN  или  WINDOW  без  параметров.  Функция   PMAP
        выполняет  масштабирование  в  соответствии с текущей
        установкой   оператора    WINDOW   без    какого-либо
        отображения на экране.

См. также:  CLS , PMAP

Пример.
        'установка графического режима со средним разрешением
        SCREEN 1
        PI=ATN(1)*4                    'определение константы
        VAL1=5 : VAL2=6 : STEPS=400    'выбор значений
        WINDOW (-1,1)-(1,-1)       'начало координат в центре
        'однократный обход круга
        FOR THETA=0 TO 2*PI STEP 2*PI/STEPS
            'круг единичного радиуса
            RADIUS=COS(2*THETA)
            'перевод в декартовы координаты
            X=RADIUS*COS(VAL1*THETA)
            'с искривлением
            Y=RADIUS*SIN(VAL2*THETA)
            PSET(X,Y)   'изобразить точку
        NEXT THETA      'повторить
        'нажать любую клавишу для возврата в редактор
        WHILE NOT INSTAT: WEND
        END     'конец программы

Оператор WRITE
-------------------------------------------------------------
Назначение: WRITE посылает  данные, разделенные  запятыми, на экран.

Синтаксис:  WRITE [список-выражений]

Замечания:  Список   выражений   -   это   последовательность
        числовых  и/или  символьных  выражений,   разделенных
        запятыми и точками с запятой. Если  список  выражений
        опущен, выводится пустая строка.
            Действие  оператора  WRITE  аналогично   действию
        оператора  PRINT  за  исключением  того,  что   WRITE
        выводит запятые  между данными  из списка  выражений,
        заключает символьные  данные в  кавычки и  записывает
        положительные числа без предшествующих пробелов.

См. также:  PRINT

Пример.
        'В этом цикле считываются данные
        'и печатаются сначала с помощью PRINT,
        'затем с помощью WRITE
        FOR I=1 TO 3
            READ WORDS$,NUMBER%
            PRINT WORDS$
            PRINT NUMBER%
            WRITE WORDS$,NUMBER%
        NEXT I
        DATA "Hello",10,"How are",20,"you",30
        END           'конец программы

Оператор WRITE#
-------------------------------------------------------------
Назначение: WRITE# выводит данные в последовательный файл.

Синтаксис:  WRITE# номер-файла, список-выражений

Замечания:  Номер  файла  -   номер,  который   присваивается
        устройству или файлу при открытии (OPEN).
            Список   выражений   -   это   последовательность
        числовых  и/или  символьных  выражений,   разделенных
        запятыми или точками с запятой.
            Действие  оператора  WRITE#  аналогично  действию
        оператора  PRINT#  за  исключением  того,  что WRITE#
        выводит запятые  между данными  из списка  выражений,
        заключает символьные  данные в  кавычки и  записывает
        положительные числа без предшествующих пробелов.
            Использование  оператора  WRITE#  является  более
        предпочтительным  методом  записи   полей  данных   в
        последовательный  файл,  так  как  выводимые значения
        автоматически  отделяются   запятыми,  а   символьные
        строки  помещаются  в  кавычки.  Это облегчает ввод с
        помощью  оператора   INPUT#  данных,   записанных   в
        последовательный файл.

См. также:
        PRINT#

Пример.
        'открыть последовательный файл для вывода
        OPEN "FILE.PRN" FOR OUTPUT AS #1
        'чтение информации из операторов DATA и
        'вывод в файл
        FOR I=1 TO 6
            READ INFO$
            WRITE #1,INFO$
        NEXT I
        CLOSE 1     'закрытие файла
        END         'конец программы
        'определение данных
        DATA "Mike","Smith","12 Main St.",_
             "Paris","Ca","95066"