Turbo Basic 1.1. Руководство пользователя

Turbo Basic 1.1. Руководство пользователя


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


  -новые операторы блочно-структурного программирования
  -полная поддержка EGA.
 Будучи  языком  как  начинающего ,так и для опытного  программиста,
 интегрированная  конструкция   Турбо-Бейсика   дает   возможность  быстрого
 программного   оборота  без  принесения  в  жертву   мощных    возможностей
 профессионального   программирования.   Он   совместим   с   версией   3.00
 Интепретатора передового БЕЙСИКА системы IBM (обычно именуемого BASKA)  или
 GWBASIC  микропрограммного  обеспечения (с незначительными исключениями), а
 также имеется много  расширений. (Далее  мы  будем ссылаться  на  передовой
 Бейсик или GWBASIC ,называя их  вместе "Интерпретаторный Бейсик").
 Программы, создаваемые  с  помощью  Турбо-Бейсика, имеют  доступ ко
 всей памяти, которой располагает целевая  машина-64К для скаларов, 64К  для
 строк, имеющаяся  в  распоряжении память для массивов и более 64К для прог-
 рамм.  Компилятор генерирует истинные .EXE -файлы, которые работают в 4-100
 раз  быстрее их интерпретаторных двойников, а в сочетании с поддержкой 8087
 способствует охвату областей применения с интенсивной  числовой  обработкой
 данных.  Турбо-Бейсик  поддерживает  также  все  графические  возможности и

 расширения усиленного графического адаптера(EGA).
                                                                          
         
                                     -  9 -
          
          
 Благодаря  его  передовым  конструкциям  управления  потоком команд
 (блоки  IF/THEN/ELSEIF/ENDIF, DO/LOOP,  CASE/SELECT,  CALL/SUB),  программы
 Турбо-Бейсика  более   просты   в   написании, отладке  и  поддержании, чем
 программы  Интерпретаторного Бейсика.  Номера  строк  могут  использоваться
 опционально;  в  качестве  цели  операторов  GOTO  и  GOSUB  могут  служить
 алфавитно-числовые   метки.   Определяемые    пользователем    функции    и
 процедуры   дают   возможность   заявления    локальных,   статических    и
 разделяемых   переменных,  а  также  допускают  рекурсивность.
 Турбо- Бейсик поддерживает значительно расширенный строчный диапазон
 ( до 32 767 литер на строку ) и обеспечивает  уничтожение  данных  задержек
 периодических строчных  промежитков  "подчистка". Имеется BINARY (двоичный)
 файловый режим  для  обработки фаилов низкого уровня и режим с числами типа
 данных  целых  для  быстрой  и  гибкой   числовой   обработки.  Операторами
 CALL и REG  предоставляется возможность прямой связи с языком ассемблера, а
 также  имеется  множество  компиляторных директив для условной  компиляции,
 отслеживания  ошибок, буферного управления и т.д.
 Турбо-Бейсик   является   мощным   совместимым  с  интерпретаторным
 Бейсиком,  языком, с  помощью  которого быстро получается быстродействующие
 программы.
         
                  Об этом руководстве
         
 Прежде всего о том, чем  данное  руководство не является.  Оно   не
 является  исчерпывающим введением  в  Бейсик-программирование. По последним
 подсчетам  существует  более 15000 книг,  посвященных  этому  предмету,  и,
 в частности, более  1000 относится к Интерпретаторному Бейсику (который , в
 сущности, имеет тот же  синтаксис,  что и Турбо-Бейсик). Данное руководство


 не  подменяет  также   источники  информации,  как  руководство  по  DOS  и
 технического  руководства  для  вашей машины.
 Вместо  всего  этого,  настоящее   руководство  представляет  собой
 своего  рода  справочник  по  системе  разработки  программ, известной  как
 Турбо-Бейсик.  Мы   начинаем   с   краткой    консультации   по   установке
  в систему  рабочего  гибкого  или  жесткого  диска,  а  затем  переходим  к
 обсуждению  того  как  использовать  Турбо-Бейсик  для  простой   программы
 редактирования   и   компиляции.  Дальнейшая   консультация   относится   к
 основополагающим   материалам,  распределенным  по  главе 3  "Турбо-Бейсик:
 Программа" и главе 4  "Турбо-Бейсик:язык".  Глава  5  "Словарь  -справочник
 по Турбо-Бейсику"  представляет  собой  алфавитно  упорядоченный   обзорный
 раздел   по   командам,  системным переменным,   функциям,   операторам   и
 использованиям Т.Б.(Турбо-Бейсика).
 Приложения  содержат  таблицу ASCII и клавиатурные  коды,  а  также
 дополнительную  информацию относительно числовых соображений,  отслеживания
 событий  интерфейса   с   подпрограммами   на   языке   ассемблера,  ошибок
 периода  компиляции  и  прогона,  различий  между  Т.Б. и  Интерпретаторным
 Бейсиком
          
                        Типографские особенности
         
 Основная часть данного руководства напечатана обычным шрифтом; дру-
 гие типы шрифта имеют специальное смысловое значение.
 Печать  в разрядку используется для представления программ примеров
 и вывода на экран; например:
          DIR MASK:
 курсивом выделяются важные понятия и слова. В частности курсив при-
 меняется в синтаксических описаниях для указания  зон  в  пределах  команд,
 подлежащих заполнению специальной информацией области применения; например:
          REG REGISTE,VALUE
 Текст  в  буквах  верхнего  регистра обозначает часть Бейсик-коман-
 ды,которая должна быть обеспечена дословно; например:
                                     - 10 -


          
          
          RESUME NEXT
  Определенные литеры имеют специальное смысловое значение, когда они
 появляются в синтаксических описаниях.
 Прямоугольные   скобки  ([])  означают,  что  заключенная   в   них
 информация  является  описательной.
          Например:
          OPEN FILESPAC AS [#] FILENUM
 означает  ,что  вы  можете  указывать знак номера (#) перед номером
 файла  или  опускать  его  по  вашему  выбору. Поэтому законны обе следущие
 строки:
          OPEN "CUST.DTA" AS 1
          OPEN "CUST.DTA" AS #1
 фигурные скобки () указывают  выбор  одной  или  более  опций, одна
 из   которых   должна   использоваться    обязательно.  Опции   разделяются
 вертикальной  чертой (!)
          например:
          KEY ON!OFF
 означает, что законныим являются оба оператора KEY ON и KEY  OFF  и
  просто KEY невозможно.
         Многоточия  (...)  указывают,  что  часть команды может повторяться
 столько  раз,  сколько необходимо.
          READ VARIABLE [,VARIABLE]...
 означает, что одним оператором READ может обрабатываться  множество
  переменных,разделяемых запятыми:
          READ AS
          READ AS BS,A,B,C
 три  разнесенные  по вертикали точки указывают на пропуск одной или
 более строк программного текста; например
          FOR N=1 TO 10
          .
          .
          .
          NEXT N
          
                           Системные требования
         
 Собственно  для  Т.Б. требуются  MS-DOS  или PC-DOS 2.0, либо выше,
 кроме  того  для  исполнения  любой  создаваемой  вами  программы требуется
 DOS  2.0  или выше.
 Т.Б.  и  программы,  которые  вы  создаете  с  его  использованием,
 конструируются   для   работы  на  моделях IBM PC, XT или АТ, либо какой-то
 полностью совместимой  с  ними машине.  Графические возможности аппаратного
 обеспечения, такого как цветной/графический адаптер,  усиленный графический
 адаптер, либо эквивалентного им, а также соответствующего дисплея.


                           Выражение благодарности
         
  Вданном руководстве мы ссылаемся на несколько различных видов  про-
 дукций; также перечислен каждый из них и соответствующая компания:
 Турбо-Паскаль   и   САЙДКИК   есть   зарегистрированные    торговые
 марки а
 Турбо-Бейсик есть новая торговая марка Borland INTERNATIONAL, INC.
  GWBACIC,MS-DOS есть зарегистрированные  торговые  марки   Mikrosoft
  Corporation
  WORDSTAR    есть   зарегистрированная   торговая   марка   MikroPRO
  INTERNATIONAL, INC
  IBM-XT  и  AT  есть   зарегистрированные   торговые   марки   Intel
  Corporation
  MultiMate есть торговая  марка  MultiMate INTERNATIONAL Corporation
                                     - 11 -
          
          
  DBASE  eсть  зарегистрированная  торговая  марка ASTON-TALE
  LOTUS 1-2-3   есть   зарегистрированная   торговая   марка    LOTUS
  DIWELOPMENT Korporation
         
                       ГЛАВА 1
         
                      О Бейсике
         
 Подобно  омару  штата мэн, кремовому  сиропу  и  баскетболу, Бейсик
 является  продуктом  новой  Англии.  Созданный  в  1964г.  в   Дортсмутском
 колледже   в   Гановере, Нью  Хемишир,  как   язык  для  обучения  програм-
 мированию,   Бейсик   обычно    ассоциируется   как   акроним    "BEGINNERS
 ALL-PURPOSE  SYMBOLIC  INSTRUCTION  CODE"    (Общецелевой  код   символьных
 инструкций для начинающих). Однако  циники  считают, что  изобретатели Джон
 Кемени  и  Томас  Куртц  сперва  придумали   заковыристое  имя  для  своего
 нового,  простого  в  использовании языка, и  только  по  том  подвели  под
 него базу, состряпав что-то такое, на чем это имя могло бы  утвердится.
 Вскоре и студенты, и программисты  обнаружили, что с использованием
 Бейсика  можно делать практически все то же самое, что возможно с помощью с
 помощью  скучного  и  трудно  преодолимого  фортрана. А  поскольку   Бейсик
 оказался  прост как в изучении, так и в работе, программы на нем писались в


 течении  более  короткого времени, чем  их  фортранные эквиваленты.  Бейсик
 оказался  также  приемлемым  для  большинства   персональных   компьютеров.
 Это открыло Бейсику широкую дорогу.
 Примечательно,  что   при   наличии  множества  общецелевых  языков
 программирования,  доступных  программирующим  фанатикам,  Бейсик  остается
 простейшим  для изучения и по истечении 20 лет после его введения.  Но  еще
 лучше оказывается выполненная на Бейсике работа. Вопреки притязаниям снобов
 Си  и  Паскаля, Бейсик  является  вовсе  не  пустяковым  языком, наделенным
 мощными инструментами пригодными  для  того, чтобы браться за специфическое
 дело,  которое  люди  в  большинстве   случаев   делают  с  помощью   малых
 компьютеров, а именно, за работу  с  файлами  и  вывод текстов и графики на
 дисплей.
 Хотя их язык имеет своих клеветников, ни один из них не может отри-
 цать,  что  Кемени  и  Куртц достигли цели своего Бейсика: сделать програм-
 мирование  более  доступным  для  болшего   числа  людей. Это  привело  нас
 к Турбо-Бейсику.
 Турбо-Бейсик является  компиляторным  Бейсиком. Возможно вы знакомы
 с передовым Бейсиком IBM (называемым GWBASIC на многих совместимых машинах,
 но   который   мы   назваем   теперь  "Интерпретаторный Бейсик").  Одной из
 популярных  Интерпретирующих версий компании MikroSoft. Интерпретирование и
 компилирование  это  два базисных метода реализации языков высокого уровня.
 Для   понимания   важных   различий   между   этими   двумя   подходами,  а
 следовательно   между   Турбо-Бейсиком  и  Интерпретаторным  Бейсиком,  нам
                                     - 12 -
          
          
 необходимо  кратко  остановиться  на  основах  программирования.
         
         
                      Бейсики и машинный язык
         
         
 Как  это  ни  удивительно, но  любой   данный   компьютер  способен
 исполнять  программы, написанные  только  на  его  родном  машинном  языке.
 Существует   почти   столько  же  машинных   языков, сколько   есть   типов


 компьютеров, но  все  они  представляют  собой  некоторые  вариации на одну
 и  ту  же  тему-простые  операции, выполняемые   молниеностно   быстро  над
  двоичными числами. На персональных компьютерах  IBM  используется семейство
 машинного языка 8086, поскольку  их  аппа ратная  конструкция базируется на
 этом конкретном семействе микропроцессоров.
 Возможно, хотя  и  трудно, писать   программы  непосредственно   на
 машинном  языке. В  ранние  годы  компьютеризации (на  заре  1950-х  годов)
 машинный  язык  был  тем  единственным,  что  сделали  люди, чтобы   спасти
 программистов от  цепенящего  озноба программирования в машинных кодах, как
 некий  мост  между  человеческими  существами  и  миром   машинных   языков
 компьютеров, были созданы  высокоуровневые (т.е. не машинные) языки.
 Высокоуровневые  языки  работают  через  трансляторные   программы,
 которые   переводят  "исходный код" (машинно-читабельный гибрид английского
 языка  и  математических выражений)  и  в  конце концов вынуждают компьютер
 исполнять  подходящие   инструкции   на   машинном   языке  для  выполнения
 заданной   работы.  Двумя   базисными    типами    трансляторов    являются
 интерпретаторы,  которые  сканируют  и  исполняют  исходный  код  в  режиме
 единичного   шага,  и   компиляторы,  которые   сканируют   исходный   код,
 переводя  его на машинный язык, а результат этого сканирования используется
 затем отдельно.
                            Интерпретаторы
         
 Исторически Бейсик обычно реализовался как интерпретатор  (знакомым
 изомером является сам интерпретаторный  Бейсик).  Одно,  часто  упоминаемое
 преимущество  интерпретаторной  реализации состоит в том, что она допускает
 "непосредственный режим". Непосредственный  режим  позволяет  вам  задавать
 компьютеру  задачу  вроде PRINT 3.14159*3/2.1 и возвращает  вам  ответ, как
 тольковы  нажмете  клавишу  ENTER  (это  позволяет  использовать  компьютер
 стоимостью  3000  долларов в качестве калькулятора стоимотью 10 долларов).


 Кроме   того, интерпретаторы  имеют  специальные  атрибуты, которые
 упрощают   отладку. Можно, например, прервать   обработку  интерпретаторной
 программы, отобразить содержимое определенных переменных, бегло просмотреть
 программу,  а  затем  продолжить  исполнение.
 Болше  всего  программистам  нравится в интерпретаторах возможность
 получения быстрого  ответа. Здесь нет необходимости  в  компилировании, так
 как  интерпретатор всегда готов для вмешательства в вашу программу. Введите
 RUN и результат вашего самого последнего изменения оказывается на экране.
 Однако интерпретаторные языки   не   без   недостатков.  Необходимо
 например  иметь  копию интерпретатора в памяти все  время, тогда как многие
 возможности интерпретатора а следовательно и его возможности  могут не быть
 необ  ходимыми для исполнения конкретной программы.
 Слабо  различимым  недостатком интерпретаторов является то, что они
 имеют тенденцию отбивать охоту к хорошему стилю программирования. Поскольку
 комментарии и другие формализуемые детали занимают значительное место прог-
 раммной памяти, люди  стремяться ими не пользоваться. Дьявол менее яростен,
 чем   программист ,работающий   на   интерпретаторном   Бейсике, пытающийся
 получить  программу  в  120К  в  памяти емкостью 60К. Но хуже всего то, что
 интерпретаторы  тихоходны.  Ими  затрачивается  слишком  много  времени  на
 разгодывание  того, что делать, вместо того чтобы заниматься  действительно
 делом.
 При исполнении программных операторов, интерпретатор должен сначала
 сканировать каждый оператор с целью прочтения его содержимого (что этот че-
                                     - 13 -
          
          
 ловек  просит  меня  сделать?), а  затем  выполнить  запрошенную  операцию.
 Операторы в циклах сканируются излишне много.
          Рассмотрим программу:
          10 FOR N=1 TO 1000
          20 PRINT N,SQR(N)
          30 NEXT N
 При первом переходе по этой программе  Бейсик-Интерпретатор  должен


 разгадать что означает строка 20:
 1.преобразовать числовую переменную N в строку
 2.послать строку на экран
 3.переместить в следущую зону печпти
 4.вычислить квадратный корень из N
 5.преобразовать результат в строку
 6.послать строку на экран
  При втором проходе  цикла все это разгадывание  повторяется  снова,
 так  как  абсолютно  забыты  все  результаты изучения  этой строки какую-то
 милисекунду тому назад. И так во всех следущих 998 проходах.
 Совершенно   очевидно,  что  если  вам  удалось  каким-то   образом
 отделить  фазу  сканирования/понимания  от  фазы  исполнения  вы  имели  бы
 более  быструю  программу. И это как раз то,для чего существуют компиляторы.
 
        
                            Компиляторы
         
         
 Компилятор - это  транслятор   текста  на  машинный  язык,  который
 считывает  исходный  текст,  оценивает  его в соответствии с синтаксической
 конструкцией  языка  и переводит на машинный язык. Затем  вывод на машинной
 языке (машинный  код), прогоняется  как  независимый шаг трансляции.Другими
 словами, компилятор  не  исполняет  программы, он их  строит.Интерпретаторы
 невозможно отделить  от  программ,  которые  ими  прогоняются,  компиляторы
 делают свое дело и уходят  со  сцены.
 При работе  с  компилирующим  языком,  таким  как  Турбо-Бейсик, вы
 придете  к  необходимости  мыслить  о  ваших  программах  в  признаках двух
 главных фаз их  жизни: периода компилирования и периода прогона.
  Улучшение  показателей  быстродействия, которое   вы  заметите  при
 использовании  Т.Б.,  зависит  от  программы.  Большинство  программ  будут
 прогоняться  в  четыре-десять раз быстрее их интерпретаторных эквивалентов.
 Если  вы  поработаете  над  улучшением  то  сможете   достичь  100-кратного
 повышения  быстродействия. Оборотная  сторона  монеты  состоит  в  том, что
 программы, расходующие большую  часть  времени на возню с файлами на дисках
 или ожидание  ввода, не  смогут  продемонстрировать  какое-то  впечатляющее


 увеличение скорости.
                     Номера строк и Турбо-Бейсик
 Интерпретаторный Бейсик нуждается в такой нумерации строк,с помощью
  которой он мог бы находить свой путь при исполнении  посылок GOTO, GOSUB  в
 программной   последовательности.  Кроме   того   номера   строк   являются
 сердцевиной  его  редактирования.
 Допуская  их,  Т.Б. не нуждается в номерах строк. Вместо GOTO 5000,
 в Т.Б. вы можете  сказать что-то  типа GOTO ERROR EXIT, где выход по ошибке
 есть "метка" в начале подпрограммы выхода по ошибке.
 Т.Б. с  самого  начала  конструировался  так, чтобы  быть  быстрым.
 Эта  цель  была  достигнута благодаря интегрированной  конструкции, которая
 одновременно   удерживает   в   памяти  компилятор, редактор  и  программу,
 исключая бесконечные экскурсы к дисковводам, которые приводят  к  тому, что
 обычные  компиляторы  осуществляют  текстовую  трансляцию  в  10 или 20 раз
 медленнее.
 Выходящая  за  нормальные представления скорость компиляции Бейсика
                                     - 14 -
          
          
 такова (тысячи строк в минуту), что  сохраняется  интерактивность, присущая
 Интерпретаторному  Бейсику. Просто  нажимантся R-клавиша  и  осуществляется
 прогон программы Т.Б.
 Примечание: Если  для  вас  БЕЙСИК внове, продолжайте  чтение и/или
 практическое   применение   данного   руководства. Однако  бывалым  Бейсик-
 программистам,   которые     имеют    намерение      преобразовывать    код
 Интерпретаторного  Б.  в   Т.Б.,  целесообразно  заглянуть  в  Приложение D
 "Сравнение Т.Б. с Интерпретаторным Б."
                                ГЛАВА 2
         
                       Турне по Турбо-Бейсику
         
         
 В этой главе вы познакомитесь с азами использования Т.Б.  Мы начнем
 с   некоторых   базисных   операций   в   Т.Б.,  включая   установку  Т.Б.,
 использования  системы  меню, а  также  создание, прогон  и  редактирование
 программы.  Однако   прежде   чем   вы   начнете,  необходимо   внимательно


 ознакомится  с  лицензионным  соглашением, приведенным на передней странице
 данного  руководства.  Это соглашение  позволяет  вам  делать столько копий
 программного  диска,  сколько  вам  необходимо  только  для  вашего личного
 пользования и целей резервирования.
         
                      Резервирование ваших дисков
         
 Для того,чтобы обеспечить собственную безопасность,сделайте резерв-
 ную  копию диска распределения с помощью вашей программы копирования файлов
 или дисков перед началом использования Т.Б.  Обеспечив  уверенность  в  том
 ,что все файлы переданы успешно,и после этого отправте оригинальный диск на
 хранение в безопасное место.
                     Файлы на диске распределения
         
  Ниже  описываются файлы, которые вы только что скопировали с вашего
  диска распределения.
 TB.EXE полностью единая библиотека операционной среды /редактирова-
  ния/ периода прогона Т.Б. настраивается и прогоняется, когда  вы  набираете
                                     - 15 -
          
          
  на  клавиатуре TB и нажимаете ENTER. *.BAS образцовые прграммы Т.Б.
  TBHELP.TBH содержит экраны помощи для использования Т.Б.
  README.COM эту программу используют для чтения файла README.
  README этот текстовый файл может  быть  просмотрен, если  он  есть,
  на  нем  содержится современная информация,  чем  представленная  в  данном
  руководстве. Используйте  для  набора или копирования  текста на печатающем
  устройстве  README.COM
         
                                    
                              Установка
         
          
  В системах с гибкими  дисками  копируйте TB.EXE на  диск  первичной
  загрузки   вместе   с   множеством   утилитных   программ   DOS   (например
  CHRDSK, FORMAT), которые вы считаете необходимыми. Для хранения исходных  и
  исполнительных программ, которые вы будете создавать, используйте дисковвод
  "В".
  В системах  с  жесткими  дисками  создавайте  новый  справочник вне


  корневой  системы, назаваемый "TB", или что-то подходящее. Копируйте  в  ТВ
  все файлы диска распределения. Если вы скупитесь на дисковое  пространство,
  копируйте   только  TB.EXE.  Регистрируйте  этот  справочник, и  вы  готовы
  приступить к работе, стандартная  конфигурация с жестким  диском адресуется
  как  дисковвод  "С", а  первый гибкий диск - как "A"; требуется команда
          C>MD TB
          C>COPY A:"*".TB
          C>CD TB
          C>TB
         
  Чтобы  пользоваться  Т.Б.  из  других  мест  вашего жесткого диска,
  настраивайте  оператор  прохода или копируйте  файл TB.EXE  в справочник, в
  котором  вы  содержите  системные   программы, такие  как  CHDSK, FORMAT  и
  передовой Бейсик.  Этот  справочник  часто называется BIN(более подрабно  о
  настройке    проходов    см. приложение  1    "Приспособление  Т.Б.").   За
  детальной информацией  по  поводу  создания  и  управления субсправочниками
  обращайтесь к вашему  руководству  по  DOS.
                      Настройка операционной среды
         
  Если вам необходима какая-то специальная аппаратура, либо вы являе-
  тесь разработчиком  в  деле обеспечения  потребностей в динамической среде,
  возможность  устанавливать переменные среды  предоставит  вам  определенный
  выбор. Переменные среды фактически перекрывают компилятор и/или программные
  опции и определяются использованием команды SET в DOS.
  Переменные среды оказывают  воздействие на среду в целом, в которой
  исполняется какая-то программа. Следовательно  после  установки  переменной
  она  остается  действующей  до  тех  пор, пока вы вновь не установите ее на
  другое  значение или не включите вашу машину. Если  вы  сочтете необходимым
  устанавливать   эти   значения   постоянно  одинаковым  образом, то  можете
  пожелать  вводить  команду  SET  в  какой-то   пакетный   файл  или  в  ваш
  AUTOEXEC.BAT -файл (См. Приложение G "Основы DOS").


  Переменные  среды Т.Б. позволяют  перекрывать  вам  опции  периодов
  компиляции  и  прогона  для  содержания 8087 и проверки  "Показа"  цветного
  графического  адаптера (CGA). Так в следущем примере вы устанавливаете вашу
  среду для  использования  8087,  набирая  в  DOS-подсказке SET 87=YES (да),
  где YES означает,  что у вас  есть 8087,что эта аппаратура не используется.
  По  умолчанию устанавливается YES.
  В случае проверки показа CGA,вы должны набрать:
 
         SET CGANOWCHK=NO
                                     - 16 -
          
          
  где  NO  приводит  к  отсутствию  показа - проверки,  а  YES - к ее
  выполнению. По умолчанию устанавливается YES.
  Кoгда   ваш   компилятор    начинает   исполнение,   осуществляется
  фактический  поиск  по  пространству  переменных  сред  с  целью  получения
  значения этих переменных.
  Хотя  в  установке этих переменных нет необходимости, они доступны,
  если  у  вас  в  них  есть  нужда. Если  вы  предпочитаете не выбирать  их,
  просматриваются  файлы текущего справочника и создаются временные файлы для
  хранения значений  переменных по умолчанию.
                Запуск Турбо-Бейсика
  Когда  у  вас есть копия системы  на  вашем  рабочем  диске,  а  вы
  находитесь   в   подходящем  справочнике  (или  диске,  если  ваша  система
  базируется  на  гибких дисках),  вводите  TB  при DOS-подсказке и нажимайте
  Enter:
          c>TB
          и появляется первый экран Т.Б.:
          рисунок 2-1. Главный экран Т.Б.
  на  полоске в верхней части экрана главного меню отображаются опции
  ваших  команд  и  четыре  окна, редактирования, сообщение,  отслеживание  и
  прогон. Вы  можете  выбирать  любую статью из меню, нажимая соответствующую
  заглавную букву (например, Е для редактирования), либо перемещая светящуюся
  полоску с помощью клавиш стрелка вправо стрелка влево до  желаемой опции, а
  на экране выделяются в тексте жирным шрифтом.
  Минутный  эксперимент.


Выберите   команду  файла. Вытягивается  ряд
  опций, относящихся  к  файлам. Чтобы  выбрать  одну  из  этих  опций  снова
  нажимайте  первую  букву  опции или используйте  стрелками вверх и вниз для
  установки светящейся полоски и нажимайте Enter. Чтобы возвратиться к опциям
  доступным  из  главного  меню,  нажимайте  ESCAPE,  в  результате  чего  вы
  вернетесь  в  главное  меню  независимо  от   того   где  вы  находились  в
  Турбо-Бейсике  нажатие  несколько  раз  ESCAPE  позволит  вам  вернуться  в
  главное  меню (более  детальную  информацию  смотрите  в  разделе  ГЛАВЫ 3,
  озаглавленой "Главное меню").
  Следует  заметить,  что  строка  помощи   в   нижней  части  экрана
  изменяется  соответственно  вашему  нахождению  в  системе  меню;  если  вы
  чем-то  озадачены  прежде  всего  взгляните  ее-там  может  быть та помощь,
  в  которой  вы  нуждаетесь.  Если  вам  необходима  дополнительная  помощь,
  нажимайте F1.
  Некоторые статьи главного меню не имеют опций, кроме  отображаемой.
  Например, COMPILE(компилировать) просто обеспечивает  компилирование вашего
  загруженного файла; у этой  статьи  нет  ни  вытягиваемого  меню, ни  меню,
  развертываемого вверх. Сдругой  стороны статья FILE имеет вытягиваемое вниз
  меню с несколькими опциями.
  Практически, большую часть времени вы будете заниматься  выбором из
  трех одних и тех же меню:
   .EDIT (редактирование) для создания и изменения исходных программ
   .COMPILE (компилирование) для компилирования  исходных  программ  в
    исполнительную форму
   .RUN  (прогон)  для  исполнения  программ  или  их  компилирования,
   если в этом есть необходимость
  Более исчерпывающие пояснения  системы меню и ее вытягиваемых  меню
  содержится в разделе "Главное меню" ГЛАВЫ 3 .
                 Естественный набор редактора
  Прежде чем  вы  преступите  к  написанию  программ, вы  предпочтете
  узнать  кое-что о редакторе, которам вам предстоит пользоваться. Если вы не


  знакомы ни  с  редактором Турбо-Паскаля  ни  с  WORDSTAR или MultiMate, вам
  достаточно прочесть этот раздел. Если  вы  уже знакомы  с  редактором этого
                                     - 17 -
          
          
 типа,  переходите  к  разделу,  озаглавленного  "Первая  программа"   (если
 захотите получить более  подробные сведения, обращайтесь к разделу  "Турбо-
 редактор" ГЛАВЫ  3. Для  тех  из  вас, кому  необходимо  изучить  редактор,
 целесообразно  потратить время и немного  попрактиковаться с его  базисными
  возможностями.  (В  таблице  2-1  просуммированы  базисные команды).  После
  этого вы будете в состоянии сконцентрировать  свое  внимание  на  написании
  программы в Т.Б., а не тратить  свое  время  на  изучение редактора. Имейте
  ввиду, что помощь получиться  в  результате  единственного удара по клавише
  F1, будет выдавать вам контексно необходимую помощь, где бы  в  Т.Б. вы  ни
  находились.
         
 
        
                        Базисные операции
         
         
  Выбирайте EDIT  из  главного меню,нажимая Е из любого места полоски
  главного  меню,  либо  нажимайте  Enter  при  позиционировании  на  команде
  редактирования.  Прежде  всего  взгляните  на  состояние   строки  с  целью
  определить    нахо    дитесь    вы    в    режиме  INSERT  (вставка)    или
  OVERWRITE  (переписывание).   Режим   означает,  что    все    вводимые   с
  клавиатуры литеры  вставляются  на  курсорной  позиции; существующий  текст
  перемещается  вправо   от   курсора  помере  вашего  набора   литер.  Когда
  используется  режим  переписывания,  каждая  набираемая литера замещает ту,
  которая в этот момент находится под курсором. Вы  можете тумблерно включать
  и  выключать  эти  режимы с помощью клавиши INS (вставка) или клавиш Ctrl-V
  (управление  -V).  Выбирайте такой режим  который вы находите самым удобным
  для пользования.
  Теперь набирайте ваше имя  и  адрес, как вы делали это на конверте;


  например
          SAN SPADE
          1264 CLINTON ST.
          NEW YORK NY 12345
  и нажимайте ESCAPE для завершения  редактирования.  Затем  отправте
  содержимое  рабочего  файла  на  хранение,  выбирая  FILE  (нажимайте F при
  каком   угодно   позиционировании   в   главном   меню   или   Enter  когда
  позиционировано  на  FILE), а затем SAVE (хранение).  Поскольку вы файл  не
  именовали,  файлу   по   умолчанию    будет   присвоено   имя   NONAME.BAS.
  Теперь   вы   можете перенаименовать файл,  сохраняя  то  что  находится  в
  редакторе  под  именем  ADDRESA  (если   вы   не  специфицируете   какое-то
  удлинение, Т.Б. будет давать вашему файлу удлинение BAS).
  Теперь  используйте опцию NEW для стирания того, что  вы  набрали в
  редакторе. Сперва нажмите F для вызова файла, а затем N для  вызова  новой.
  Далее набирайте  список из 5 ваших любимых блюд, каждое блюдо  в  отдельной
  строке.
          CHICKEN CURRY
          SUSHI
          BLECKENED SISH
          CHIMICHANDAS
          LUMPIA
  Вновь  заканчивайте сеанс редактирования  (нажмите ESC)  и выберите
  FILE  из  главного меню, а затем  LOAD (загрузка). При запросе  имени файла
  набирайте  ADDRESS  и  вслед  за  этим Enter. Система запросит не хотите ли
  вы сохранить  текст в текущем  рабочем файле. Вы не хотите, поэтому нажмите
  No и заметьте, что происходит в окне  редактора - предпочитаемые вами блюда
  заменятся файлом ADDRESS.
                             Блоковые операции
                                     - 18 -
          
          
  Находясь  в  окне  редактора, вы также можете пометить блок текста,
  подлежащего стиранию, перемещению или копированию. Однажды  помеченный блок
  вы  можете копировать  в  другое  место  текста, стирать  его  из  текущего
  местоположения или перемещать в другое место текста.
  Пометка   блока   осуществляется   просто,   попытайтесь  выполнить
  пометку, сначала вновь выбрав команду редактирования. При нахождении в окне


  редактора  вашего имени или адреса, воспользуйтесь  клавишами стрелками для
  позиционировании  курсора  в  верхнем верхнем углу. Пометьте  начало  блока
  нажатием  Ctrl-КВ (управление КВ). Теперь  переместите  курсор на последнюю
  литеру  последней  строки  вашего  адреса  и  пометьте конец блока, нажимая
  Ctrl-KK (управление КК).
  Далее сделайте несколько  копий  данного  блока  так, чтобы  у  вас
  получилось   больше  текста  для  манипулирования. Чтобы  это  осуществить,
  переместите  курсор  в  конец  вашего  адреса  и  копируйте  блок,  нажимая
  Ctrl-КС (управление КС).
  Перемещая курсор в конец вновь создаваемого текста, делайте  другую
  копию блока. Повторяйте этот процесс, пока  не  будете  иметь целых  десять
  копий  вашего  адреса в окне  редактора. Для перемещения  по  тексту внутри
  окна  редактора   ползуйтесь  клавишами  стрелками  PgUp (страница вверх) и
  PgDn  (страница  вниз).
  Теперь  отметим  новый  блок. Воспользуйтесь  строкой  состояния  в
  верхней  части  окна   редактирования   для   определения   номера   строки
  на  которой  вы  находитесь, вставте  в  файл  новую  строку  4,  состоящую
  из 20 литер Х. Далее сделайте строку 11 из 20 литер У.
  Ваш новый блок будет занимать строки с 5 по  10. Отметьте  его, как
  и ранее, с помощью  Ctrl-KW и Ctrl-KK. Чтобы создать блок,нажимайте Ctrl-KY
  (управление  KY), и  вы теперь получите строку  из  X, за  которой  следует
  строка из литер Y. Далее пометьте новый блок, который состоит из этих  двух
  рядов  X,Y. Переместите  курсор  в  конец  текста, затем  переместите  сюда
  новый  блок, нажимая  Ctrl-KV (проверяйте  чтобы   он   перемещался,  а  не
  копировался, используя PgUp и PgDn).
  Блоковае операции можно выполнать с помощью нажатия меньшего  числа
  клавиш,  пользуясь   клавишей   функций.   Клавиши   и   их   использование
  отображаются  в  нижней  части  экрана. Заметьте,  что  клавишами F7  и  F8
  помечаются   начало  и  конец  блока, соответственно, чтобы  пометить  блок


  переместите  курсор  в  начало   блока  и  нажмите F7.  Затем   переместите
  курсор в конец блока и нажмите  F8  для  пометки  конца блока.
                              Поиск и замена
  Команда  поиска  и  замены  становится  удобной,  если  вы  решаете
  изменить  чего  в  вашей  программе,  после  того как  вы  ее уже написали.
  Например, чтобы показать вам как использовать эту команду, сотрем  все, что
  в данный мемент имеется  в  редакторе  используя  DEL  (стереть), опцию NEW
  (новый) или помечая блок), и наберем эту хорошо известную фразу:
          TO BE OR NOT TO BE
          THAT IS QUESTION
  Теперь заменим каждые TO BE на TB. Сначала нажмите Ctrl-Q, a, затем
  набирайте  TO BE, когда вам подсказывается  строка поиска. Нажмите Enter, а
  затем, когда  появится  подсказка  строки  замены, набирайте TB.  Далее  вы
  можете  набирать  определенные  опции,  подлежащие  вашему  выполнению   во
  время поиска. Для  гловального поиска выбирайте G, выбирая N, тогда  строка
  замещается  всюду  без  обращения  к  вам  с  вопросом о подтверждении  при
  каждой  встрече  с  искомым, выбирая U  для  игнорирования  различия  между
  верхним  и  нижним  регистрами. После того как вы выберете все ваши  опции,
  нажимайте  Enter. Выполняется  поиск  и  замена  и  текст  преобразуется  в
  следующий:
          TB OR NOT TB
                                     - 19 -
          
          
          THAT IS QUESTION
  Если  просто  желает е строку  в  тексте, вы можете воспользоваться
  командой поиска (в противоположность поиску-QF) и вы получите  подсказку на
  строку  поиска. Воспользуйтесь  функцией  поиска  для  нахождения   первого
  появления  TB   в   предыдущем   тексте. Затем   воспользуйтесь  Ctrl-L для
  нахождения последующих по  явлений.
          Таблица 2-1 СВОДКА КЛАВИШНЫХ НАБОРОВ РЕДАКТОРА
          ----------------------------------------------
          клавиши                      функции
          ----------------------------------------------


          ESC                     выход из редактора
          ----------------------------------------------
          клавиши-стрелки
                                  - 30 -
          PgUp
          PgDn                    перемещение курсора
          HOME,END
          -----------------------------------------------
          DEL                стирание литеры под курсором
          -----------------------------------------------
          INS,Ctrl-V         вкл./выкл. режима
                             вставка/переписывание
          -----------------------------------------------
          Ctrl-KB            пометка начала блока
          -----------------------------------------------
          Ctrl-KK            пометка конца блока
          -----------------------------------------------
          Ctrl-KH            непомеченный блок
          -----------------------------------------------
          Ctrl-KC        копирывание намеченного блока в
                             позицию намеченную курсором
          -----------------------------------------------
          Ctrl-KY        стирание намеченного блока
          -----------------------------------------------
          Ctrl-KV        перемещение намеченного блока
                    позицию ,указываемую текущим курсором
          -----------------------------------------------
          F1                 помощь-информация
          -----------------------------------------------
          F2                 хранить файл
          -----------------------------------------------
          F3                 новый файл
          -----------------------------------------------
          F5                 фокусировка
          -----------------------------------------------
          F6                 переключать окна
          -----------------------------------------------
          F7                 качать блок
          -----------------------------------------------


          F8                 закончить блок
          -----------------------------------------------
         
                                        
                        Первая программа
         
         
  Теперь  создадим  с  помощью  редактора короткую программу. Выйдите
  в главное меню и выберете файл, затем загрузите. При подсказке  имени файла
  введите  MYFIRST и нажмите Enter. Далее для ввода  редактора наберите Е. Вы
  будете  знать,  что  окно  редактора  задействовалось, поскольку  его  окно
                                     - 20 -
          
          
  получило двойную  ограничительную рамку.
  Для  тех  из  вас кто имеет опыт  работы  с  WORDSTAR или какими-то
  другими    программами,   в   которой    используется    эта    управляющая
  последовательность,  такими  как  SAYDKIK KUTPAD,   редактирование  в  Т.Б.
  покажется приятным и легким.
  Теперь  набирайте  в  программу  MYFERST  то, что  приводится  ниже
  в  этом  параграфе. Набирайте  как  можно точнее, поскольку  Т.Б.  не может
  делать ничего  другого кроме того, что  вы  ему сообщаете. Некоторые из вас
  могут  заметить  изьян  в  этой  программе-оставте  это; позднее мы поясним
  почему.
          WHILE -1
          FOR N=1 TO 8
          READ AS
          PRINT AS " ";
          NEXT N
          PRINT
          RESTORE
          WEND
          DATA PRESENTING,TURWE BASIC--,THE,FASTEST,BASIC,ON,EARTH
  То что делает эту  программу  выглядящей  иначе, чем  программа  на
  бейсике, которые вы видели ранее, есть отутствие номеров строк.
  Номера   строк - это   интегральная   часть   и   редактирующих   и
  исполнительных  программ Интерпретаторного Бейсика. Однако, поскольку  Т.Б.
  имеет  встроенный  экранный редактор, и поскольку он является компилятором,
  номера строк являются  слишком  громоздким багажом, Т.Б. в некотором смысле
  откровеннен по отношению к субьекту. Если вам нравится вы можете нумеровать
  каждую строку или каждую третью строку, в прямом или обратном порядке, либо


  вы  можете  выбрать  для  нумерации  только  те  строки,  которые  являются
  целевыми  для GOTO или GOSUB, еще  лучше, если  вы  можете  воспользоваться
  именуемыми метками.
  На  первых  порах  работа   без   номеров  строк  может  показаться
  странной, но  по  прошествии  нескольких  дней вы будете удивляться как это
  вы так  долго не могли без них обходиться.
  Когда у вас уже будет введена MYFERST, откинтесь  на  спину стула и
  на  минутку полюбуйтесь на нее.
  Вы  только  что  создали   исходную   программу - на Т.Б. В  памяти
  вашего  компьютера  в  этот  момент  находится  сотня  ASCII-кодов, которые
  образуют  MYFERST.BAS. Далее с этим текстом работает только редактор.
  Однако  эта  программа  есть только  средство  достижения  конеуной
  цели. Прежде   чем   ваш   микропроцессорный   чип  семейства  8086  сможет
  исполнить  MYFERST,  исходный  текст   должен   быть   оттранслирован   или
  компилирован в понятную для него форму; а именно, на машинный язык 8086.
  Редакторская  часть  работы  теперь  заканчивается ,поэтому нажмите
  ESC,  чтобы  покинуть  редактор,и  возвращайтесь в главное меню.  В главном
  меню  становится видимой полоска выбора,  указувающая, что  вы  уже  можете
  выбирать  другую опцию.
  В то время, как редактор временно находится вне выбора,  работать с
  ним  вы  не можете; однако текст вашей программы  уже  в  памяти, готов для
  добавления  или изменения  в  любой  момент. (Это  демонстрируется  быстрым
  нажатием Е; нажатие ESC возвращает нас в главное меню).
                                  Опции
         
         
   Вы  приблизились  к  тому,  чтобы  сделать  второй  большой  шаг  в
  процессе  создания  программы: к компилированию вашей  исходной программы в
  исполнительную  форму. Но  прежде  чем  вы  сделаете, необходимо установить
  опцию  компилятора. Для выбора меню опций нажмите О.
  Соответственно  смыслу  их  имен, различные  варианты  выбора  меню
  опций обеспечивает управление  определенными аспектами доведения компиляции


  до  за  вершения. С этой  точки зрения, особенно  если Т.Б. является  вашей
                                     - 21 -
          
          
  первой   встречей   с   кмпилирующим  языком,  некоторые  из  этих  выборов
  могут   показаться  чем-то   фантастическим (Опции   компилятора   подробно
  обсуждаются  в  ГЛАВЕ  3, в  разделе, озаглавленном "Команда опций").
  По правде  говоря, сейчас  ваш  интерес ограничивается тоько опцией
  разрыва  клавиатуры,  которая  в  данный  момент  выключена. При включенном
  состоянии    этой   опции,   однако,   вы   можете   прервать   большинство
  программ   (остановить    ввод/вывод),   генерируемых    компилятором.  При
  отключенном  состоянии  этой  опции, вы  будете  не  в  состоянии  прервать
  (через Ctrl-Break ) какую-то ни было из генерируемых компилятором программ.
  Таким образом,чтобы предотвратить  прогон  MYFERST, нажимайте К (тумблерный
  переключатель) для включения  опции  разрыва клавиатуры,  а  затем  ESC для
  возврата в главное меню.
                            Компилирование
   Для  завершения  MYFERST  нажмите С ( подобно редактору, компилятор
  обрабатывает текущий рабочий файл).  Компилятор   быстро  проверяет  литеры
  вашей  программы и строит ее эквивалент на машинном  языке. Эта  фаза, даже
  для простой  программы  вроде  MYFERST,  может  занимать некоторыми Бейсик-
  компиляторами  время близкое к минуте.
  Если в вашей исходной программе компилятором  обнаруживается что-то
  такое, что  неприемлемо  для  программы для Т.Б. ,это  найдет  отражение  в
  строке  состояния редактора, а вы автоматически будете введены  в  редактор
  в  точке  ошибки. Если  это  с вами произойдет,  нажимайте ESC редактируйте
  вашу  программу. Затем  выходите  из  редактора  и  компилируйте  повторно:
  нажмите ESC затем С.
                            После компилирования
  После  успешного  компилирования  в  памяти  имеется   две   версии
  MYFERST: (1)-исходная  программа, которую  вы  создали  с  помощью редакто-


  ра, (2)-результирующая, исполнительная  программа на машинном  языке  8086,
  созданная  компилятором. В окне сообщений Т.Б. дает некоторую статистику по
  компилированию.
  Статистика  указывает в 16- ричных байтах размер  сегмента  в  кодах
  компилированной  программы, размер  стека  и размер зоны данных. Отмечаются
  также  число заявлений  и  компилированных  строк  плюс величина свободного
  пространства, оставшегося  в  памяти  для  компилирования. (Будьте уверены,
  вам  нет  необходимости  знать о 16-ричной  системе, стеках  и  буферах для
  написания  программ  на  Т.Б.  больше,  чем необходимо знать об этих вещах,
  работая с Интерпретаторным  Бейсиком. Здесь есть необходимая информация, но
  обычно вы в ней не нуждаетесь).
                               Прогон программы
         
         
  Теперь, поскольку вы уже оттрансировали вашу исходную программу  на
  машинный  язык, вы  можете  прогнать ее, нажимая R проверяйте  вывод  вашей
  программы в окне прогона.
  MYFERST прогоняется долю секунды, а затем все прекращается.
  Это  происходит по той причине, что мы умышненно включили в MYFERST
  ошибку,  чтобы  сделать  остановку: анализ,  выполненный  компилятором,  не
  обнаружил ничего, что могло  бы  привести к  чему-то  плохому  при  прогоне
  программе. Компилятором  главным образом проверяются синтаксические ошибки,
  такие как  неправильное написание команд,  ненужные или пропущенные запятые
  и несоответствующие друг другу скобки. Имеется целый класс  ошибок, которые
  могут   случитться   во   время  прогона   от   сбоя  диска, математические
                                     - 22 -
          
          
  неточности, такие как квадратный корень из отрицательного числа.
  Имейте ввиду, что  некоторые  ваши  ошибки  будут  отлавливаться во
  время  компилирования, а  другие  не  всплывут  на  поверхность  до периода
  прогона  программ.
         
                                 Об ошибке
         
         


  В дополнение к сообщению о возникновении  ошибки  вне  данных, Т.Б.
  так- же  показывает, где именно это случилось, помещая  вас в точку  ошибки
  в редакторе. Поскольку MYFERST.BAS еще находится  в  памяти, это происходит
  быстро.
  Компилятор  автоматически  сооющает где произошла ошыбка в соответ-
  ствующем месте исходного файла.
  То  плохое, что  есть  в  этой  строке,  состоит  в  том   что   вы
  считывали  только  семь констант, а не восемь. Измените  цикл  FOR /NEXT на
  останов на 7, и  будете иметь рабочую программу.
  Нажмите  ESC  затем  R  сначала  для  компилирования,  а  затем для
  прогона  исправленной  версии. Т.Б. распознает, что  вы  изменили  исходную
  программу после  последней   компиляции  и  автоматически   перекомпилирует
  MYFERST перед ее прогоном. Когда  вы  свыкнитесь с клавишныим  наборами, то
  найдете, что  для  перехода  от  редактирования  к  исполнению  и  наоборот
  достаточно каких-то секунд.
  Теперь MYFERST проходит во всей ее красе. Вновь  проверьте  вывод в
  ок   не   прогона   и   нажмите  ALT-F5 (изменить F5) для  фокусировки окна
  в перемежающихся режимах.
  Когда  вы  получите удовлетворение от своей программы, прервите  ее
  нажатием Ctrl-Break, затем ESC для возврата в главное меню.
                         Хранение на диске
  Итак все что  вы  сделали находится только в памяти, если  бы  имел
  место  сбой питания, или ваша программа зависла, потерялись бы и исходная и
  исполнительная  программы  MYFERST. Поэтому  программисты  отправляют  свои
  исходные  программы для хранения на диске, используя  команду  SAVE.  Также
  поступите   и   вы.  Можно  заметить   взрыв  активности   на   дисковводе,
  используемому по умолчанию  в процессе  перезаписи  MYFERST.BAS (вы  можете
  также воспользоваться опцией  автоматического  хранения, доступной  в  меню
  настройки,для автоматического хранения  вашего  файла,  реализуемого  перед
  прогоном программы).
  Для  проверки  того, что файл MYFERST.BAS,существует теперь в вашей


  файловой   системе,  используйте опцию DIRECTIRY(справочник)  из  файлового
  меню. Нажатие D вызывает ответ:
          Enter mask (введите маску)
  Т.Б. требует определенного  сорта  файловый дескриптор, который  вы
  должны   включить   в  DOS-команду  DIR; например  *.BAS  или  MYFERST.BAS.
  Нажатие  Enter  вызывает появление  каждого файла, как будто вы уже набрали
  *.*.
 
                      Хранение исполнительной программы
  Хранение исполнительной (на машинном языке) формы  MYFERST на диске
  представляет собой совершенно  иной предмет. Действительно, вы  не  увидите
  ничего ни в одном меню, касающееся хранения исполнительной программы.  Если
  вы создаете программу для собственного  пользования, то у вас может не быть
  необходимости хранить ее вообще. К чему хлопоты, если  ее  можно  создавать
  заново   каждый  раз?  Однако  придет  время,  когда  вам  захочется  иметь
  какую-то постоянную  форму компилированной программы.
  Т.Б. дает вам возможность  генерировать  самостоятельную  программу
                                     - 23 -
          
          
  (файл  с удлинением  .EXE), которую  можно  исполнять  непосредственно  при
  DOS-подсказке. Так   вы   можете   поступить   и   с   MYFERST,   установив
  компилирование  включения в меню опций. Прежде всего, для получения входа в
  меню опций нажмите  О, а  затем С для компилирования.  Выбирайте  установку
  исполнительного  файла,  нажатием Е.  При  этом  на  диске  еще  ничего  не
  изменяется - выполненное  вами  изменение  состоит  в  том,  что компилятор
  будет делать следующиц раз при вовлечении  его  в  работу. Режим умолчания,
  который вы используете далее, состоит в компилировании в память.
  Для выхода из меню опций нажмите ESC затем С для  перекомпилирования
  MYFERST. В это время компилирование идет  медленее, поскольку Т.Б. физически
  осуществляет запись на дисковводе. Чтобы посмотреть результирующий файл, уй-
  дите вовсе из Т.Б., сначала перейдя к файловому меню, а затем нажав Q.


Сразу
  же  возвращайтесь на DOS-уровень,ввода С>DIR MYFERST
  Вы увидите обе формы вашей программы, исходную и исполнительную.
                     Исполнение MYFERST из DOS
  Вероятно вы уже знаете, что файлы  с  удлинением .EXE  используются
  операционной системой непосредственно. Если  при  DOS-подсказке  вы вводите
  имя файла
          C>MYFERST
  Это приводит к прогону MYFERST с выдачей той же программы,  которую
  вы видели  раньше. Если  в  это  время  вы  прервали  программу  с  помощью
  Ctrl-Break, то возвратитесь в DOS.
                    Трассировка вашей программы
   Вернемся теперь  в  среду Т.Б.  и  вашего файла MYFERST, набирая  в
  подстроке  DOS  строку  TB MYFERST.  Чтобы  попробовать  все,  что  есть  в
  главном  меню, попытаемся трассировать вашу программу.
  В  окне  TRASE (трассировка)   будут   перечисляться  любые  номера
  строк, либо имена процедур или функций, имеющихся в вашей прорамме, поэтому
  добавляйте к MYFERST номера строк, чтобы  иметь  возможность осуществить ее
  трассировку.
  Чтобы  трассировать  или проследить  в  шаге вашу программу по мере
  ее прогона, нажмите D для перехода  в  меню  DEBUG(отладка). Для  получения
  опции  TRACE (трассировка)  используйте  клавиши-стрелки  или  нажмите I, а
  затем  тумблерно  включите ЕЕ, нажав  Enter  для  выхода  из  меню  отладки
  нажимайте ESC, а  затем  R  для  прогона. Поскольку  вы  перемодифицировали
  вашу программу, перед прогоном она будет автоматически перекомпилироваться.
  Для контроля следите за окном трассировки.
  Заметьте, что вы также можете трассировать  вашу  программу помещая
  в нее, при ее написании, компилярную директиву TRASE.
  Для среды программирования Т.Б. обеспечивает четыре окна:
  .окно  редактирования позволяет  создавать/редактировать любые ваши
  программы.
  .окно трассировки (когда оно тумблерно включается) обеспечивает пе-
  речисление каждого номера программной строки, метки  и  имени  процедуры  и
  функции по мере прогона вашей программы.


  .в  окне сообщений  отображаются статистики компилирования и другие
  сообщения.
  .в окне прогона отображается вывод вашей программы.
  Эти   окна   можно   использовать    в    любой   конфигурации,  но
  фокусироваться (один  из  способов состоит в нажатии FS)  могут только окна
  редактирования и  прогона.
  В любое время нахождения в системе меню вы можете переключать  вашу
  точку обзора и реконфигурировать размер и положение окон.
  Вы  также можете непреравно изменять окно  таким  образом, что  при
  каждом начальном возбуждении  системы  будет использоваться  предпочитаемая
                                     - 24 -
          
          
  вами  планировка окна. (Обращайтесь к процедуре SAVE OPTIONS/WINDOW/SETUP в
  разделе "Настройка меню"ГЛАВЫ 3) .
  Чтобы  открыть   окно   выбирайте   из   меню   WINDOW OPEN,  затем
  осуществляйте  выбор  того  окна, которое  вы  предпочитаете задействовать.
  Нажимая STROLL  LOCK вместе с Shift и клавишами стрелками.
  Вы можете перемещать выбранное вами окно в любое положение на экра-
  не. Опция  TILE (израсцы)  автоматически  делает все открытые окна видимыми
  в одинаковом  размере (другими словами они занимают равные  части  экрана).
  Опция STACK позволяет  располагать  все открытые окна столбиком, или  слоем
  при   максимально  возможном  размере. Задействованное  окно  находится  на
  верху; видима только часть других открытых окон.  Опция  ZOOM (фокусировка)
  дает  возможность вам фокусировать окна редактирования  и  прогона  на весь
  экран. С помощью опции CLOSE, выбранное  окно делается  невидимым. За более
  детальной информацией об изменении размеров "перемещениях" окон обращайтесь
  к  разделу  "Команды окон" ГЛАВЫ 3".
                             Конец турне
 Это  и  все   ваше   вводное  турне  по Т.Б. Кратко  напомним  шаги
  предпринимаемые при создании и тестировании программ:
  -вызывается TB.EXE и специфицируется исходная программа,  с которой


  вы  будете работать.  Если необходимо устанавливаются любые требуемые опции
  компилятора.  Затем  редактируется   рабочий  файл.  После   подготовки   к
  тестированию   с   целью  компилирования  программы  нажимаются R и C. Если
  компилятор обнаруживает  какие-то  синтаксические  ошибки, вы  выпадаете  в
  редактор в точке возникновения  ошибки.
  -если  исходный  файл  свободен  от  синтаксических ошибок (т.е. он
  прокомпилирован   успешно),  осуществляется   прогон.  Если   вы   ожидаете
  результат, сохраните исходную  программу и повторяйте весь  цикл. Вы  также
  можете  выбрать  компилирование рабочей программы в форму .EXE - файла.
  На диске  распределения  вы  найдете  несколько  простых  программ.
  Возможно  вы  найдете   целесообразным   изучить   эти  программы, т.к. они
  отображают  несколько  демонстрационных   аспектов Т.Б.,  отличающихся   от
  присущих  интерпретаторному Бейсику либо в нем не представляемых.

                                                                           
                        Функция STICK
                        --------------
          
  функция STICK возвращает информацию о положении ручек управления
           -------
          
           синтаксис y=STICK(опция)
           ---------
          
  замечание  Опция-это целое выражение в диапазоне от 0 до 3,которое
  ---------  оказывает следущее действие:
          
  ----------------------------------------------------------------
     Опция                           Действие
  ----------------------------------------------------------------
      0         возврашается X-координата для ручки управления А
      1         возвращается Y-координата для ручки управления А
      2         возвращается X-координата для ручки управления В
      3         возвращается Y-координата для ручки управления В
  -----------------------------------------------------------------
  Примечание:исходя из особенностей конструкции интерфейса ручек  уп-


  равления,вы  должны вначале исполнить 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 и оно пред-
  почтительнее.
          
  различия В отличие от И.Б. ,однажды  остановленные  программы  Т.Б.
           -------- продолжены быть не могут
          
           См. также END
          
           Пример :
  'настроить бесконечный цикл
           DO
            'ОСТАНОВИТЬ если нажимается клавиша
            IF INSTAT THEN STOP
           LOOP
           END
          
                           Функция STR$
                           -------------
          
    функция   STR$ возвращает строчный эквивалент числа.
           -------
    синтаксис s$=STR$(числовое выражение)
                                     -186 -
          
          
           ----------
  замечания  STR$  возвращает  строчную форму числовой переменной или
  выражения;т.е.,возвращает тот,что вы могли бы видеть на экране  при  обра-
  ботке оператором PRINT.Если числовое выражение больше нуля ,STR$ добавляет
  передний  пробел ;например STR$(14) возвращает трехмерную строку,в которой
  первая литера есть  пробел.Дополнительной  функцией  является  VAL,которая
  принимает строчный аргумент и возвращает число.
   
    См.также VAL
           Пример :'установить а% для числа


           a%=56.789
  ' использовать STR$ для возврата числового значения a$
           a$=str$(a%)
           print a%,a$
  'тестировать,с целью увидеть ,что а% имеет то же значение,что и а$
           if a%=val(a$) then
            print "str$ и val работают"
           end if
           end
          
                             Функция STRIG
                            ----------------
          
  функция   STRIG возвращает состояние кнопок ручек управления.
           -------
          
           синтаксис  y=STRIG(опция)
           ---------
          
  замечания Функция STRIG возвращает информацию триггера ручек управ-
  --------- ления  в соответствии со значением опции.Опция-это целое
  выражение,которое управляет действием,выполняемым функцией STRIG  согласно
  следущей таблице:
  ------------------------------------------------------------------
  Опция                                Действие
  ------------------------------------------------------------------
  0 если кнопка 1 ручки управления А была нажата с момента пос
   ледного вызова STRIG(1),то STRIG возвращает -1;иначе возвращается 0.
  1  STRIG возвращает -1 ,еслив данный момент кнопка 1 ручки управле-
   ния А находиться в нижнем положении;если нет,возвращается 0.
  2  Если кнопка 1 ручки управления В нажималась с момента последнего
   вызова STRIG(2) ,STRIG возвращает -1;иначе 0.
  3 STRIG возвр.-1,если кнопка 1 ручки управления В находиться в ниж-
   нем положении ;иначе возвращается 0.
  4 Если кнопка 2 ручки упр.А нажималась с момента последнего  вызова
   STRIG(4),STRIG возвращает -1;иначе 0.
  5  STRIG возвращает -1,если в данный момент кнопка 2 ручки управл.А
   находиться в нижнем положении;иначе возвращается 0.
  6 Если кнопка 2 руч.упр. В нажималась с момента  последнего  вызова
   STRIG(6),то STRIG возвращает -1,иначе 0.
  7  STRIG  возвращает  -1,если в данный момент нажата кнопка 2 ручки
  управления В;иначе возвращается 0
  -------------------------------------------------------------------


  Перед осуществлением любого вызова функции STRIG ,вы должны обеспечить
  доступ для проверки ручек управления с помощью оператора STRIG ON.
  Для считывания положения самой ручки управления используйте функцию
  STICK.
           См.также STICK
          
          
                                Оператор STRIG
                               ----------------
          
  функция STRIG управляет проверкой событий на кнопка ручек управления.
           -------
                                     -187 -
          
          
           синтаксис
STRIG {ON!OF!STOP}
           ----------
  замечания STRIG включает проверку событий на триггере  таким  обра-
  ----------- зом,что могут осуществляться запросы по функцииSTRIG и
  отслеживание  ,выполняемое подпрограммой,которая специфицируется в опе-
  раторе ON STRING.
  STRIG OFF выключает проверку событий на триггере.STRIG STOP удержи-
  вает программу от ответов на событие на триггере,но обеспечивает  сохране-
  ние  памяти  о  таком  событии,так  что если позднее используется STRIG ON
  ,захват этого события осуществляется немедленно.
          
           См.также ON STRIG
          
           Пример:
           'включить проверку событий
           STRIG (0) ON
           STRIG (2) 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$(n,32),STRING$(n," ")  и  SPACE$(n)  делают  одну  и  ту  же
  вещь-выдают строку,состоящую из n пробелов.
    Пример 'рамка строится с помощью STRING$ и TAB
           верх$=string$(40,61)
           print верх$
           delay 1
           for i=1 to 5
           print tab(1) "=" tab(40) "="
           delay 1
           next i
           delay 1
           print верх $
           delay 1
           locate 4,15
           print "середина"
           delay 1
           locate 20,1
           end
          
                           Операторы SUB/END SUB,SUB INLINE
                          ----------------------------------
           
  функция    SUB/END SUB и SUB LINE определяют процедуру
           --------
  синтаксис  SUB идентификатор [(список параметров)]
           ---------       [locate список переменных]
                           [static список переменных]
                                     -188 -
          
          
                           [shared список переменных]
                           .
                           . операторы
                           .
                           [exit sub]
                           end sub
                                     
  Для оператора SUB INLINE:
          SUB процимя INLINE
  замечания Идентификатор -это уникальное имя,подлежащее ассоциирован
  --------- ию с процедурой,которое должно соответствовать соглашени-
  ям  об  именовании  меток  и  переменных.Список  параметров-это опциональ-
  ная,разделяемая запятыми последовательность формальных параметров.Парамет-
  ры,используемые в списке аргументов,служат только для опоеделения процеду-
  ры; они не имеют никакой взаимосвязи с другими переменными  программы,имею-
  щими то же имя.
  SUB и END SUB ограничивают и именуют похожую на подпрограмму группу
  операторов,называемую  процедурой (или подпрограммой),которая возбуждается


  оператором CALL и опционально обеспечивается подачей в нее  параметров  по
  значению или посредством ссылки.
  При  внутристрочном программировании с использованием языка ассемб-
  лера применяется та же последовательность  вызова,что  и  применяемая  для
  обычных процедур.Например:
           CALL процимя [(список параметров)]
           SUB процимя INLINE
           $INLINE список_байтов
           $INLINE "ком-файла_имя"
           END SUB
  Можно специфицировать любое число операторов $INLINE в любом поряд-
  ке.Единственным ограничением является максимум в 16 Ком-файлов в любой од-
  ной процедуре.
  Заметьте  6что вы не специфицируете список параметров в SUB-опреде-
  лении.
  Список байтов образуется из констант и  выражений,равных  целому  в
  диапазоне  от  0 до 255,которые разделяются запятыми.(Обычно для байтов вы
  будете пользоваться шестнадцатиричными константами).
  Нет необходимости в возврате ни в ваш код на языке ассемблера,ни  в
  конец  SUB.За этим следит компилятор.(За более подробной информацией обра-
  щайтесь к приложению С "Интерфейс языка ассемблера".
       Определения процедур и программный поток
       ----------------------------------------
  Местоположение определения процедур  несущественно.Процедура  может
  определяться  в  строке 1 или строке 1000 программы вне зависимости от то-
  го,где она используется.И вам нет необходимости направлять программный по-
  ток через процедуру в качестве какого-то шага возбуждения-компилятор разг-
  лядит ваши определения,где бы они ни были.
  Также ,в отличие от подпрограмм,исполнение не  может  случайно  по-
  пасть  в процедуру.Для всего,что касается исполнительного прохода програм-
  мы,определения функций и процедур являются невидимыми.Например:
           CALL вывод материалов
           SUB вывод материалов
            PRINT "выведено"
           END SUB
  Когда исполниться эта программа 6сообщение появляется только однаж-


  ды,поскольку Вывод_материала вызывается в первой строке.
  Определения процедур должны трактоваться как изолированные островки
  кода в которые не осуществляется переход и из которых нет  перехода,реали-
  зуемого с помощью операторов GOTO,GOSUB или RETURN.Однако внутри определе-
  ний  такие  операторы  законны.Следует отметить ,Что определения функций и
  процедур нельзя гнездовать;т.е. вы не можете определить процедуру или фун-
  кцию внутри другой процедуры или функции  (хотя  определение  процедуры  и
  функции может содержать вызовы других процедур и функций).
           Параметры массивов
           ------------------
  Параметры массивов заявляются заключением в скобки числа размернос-
                                     -189 -
          
          
  ти параметра массива.Например,SUB расчмассив (а(2),размер1,размер2)- заяв-
  ляет ,что расчмассив ожидает три аргумента:двумерный массив единичной точ-
  ности  и  две скалярные переменные единичной точности.Обычно эти скалярные
  аргументы используются для подачи размера по двум измерениям массива а.
           Заявление локальных переменных
           ------------------------------
  Чтобы заявить локальные переменные в пределах процедуры,использует-
  ся оператор LOCAL ,который должен находиться впереди исполнительных  заяв-
  лений определения.Например:
        LOCAL a%,b#,БОЛЬШОЙМАССИВ%()
  создает  три  локальные  переменные:скалярные  переменные a% и a#,а
  также целый массив большоймассив%.Далее массив должен быть надлежащим  об-
  разом образмерен:
      DIM DYNAMIC большоймассив% (1000)
  Локальные  массивные переменные должны быть динамическими.Они авто-
  матически снимаются с размещения когда процедура завершается.
         Статические и разделяемые переменные
         ------------------------------------
  По умолчанию,переменные ,которые появляются в  определениях  проце-
  дур,имеют атрибут локальности.Однако ,поскольку это умолчание является из-
  меняемым  обьектом,вы должны предпринимать усилия для заявления каждой пе-


  ременной,используемой в процедуре.
  Для заявления переменных ,которые являются глобальными для  осталь-
  ной программы,используется оператор SHARED.
  Если  важно,чтобы  переменная  не теряла своего значения при каждом
  возбуждении ,она заявляется с использованием оператора STATIC.
  Лпределение процедуры должно завершаться END SUB,которое возвращает
  управление оператору ,стоящему после возбуждающего оператора CALL.Для воз-
  врата из определения процедуры в каком-либо ином  месте,чем  ее  конец,ис-
  пользуется оператор EXIT SUB.
           см.также $INLINE
           CALL
           EXIT SUB
           LOCAL
           SHARED
           STATIC
          
      Пример
           DIM массив(1)
           SUB тестпроцедура(I%,L&,S!,D#,E,A(1))
            PRINT I%,L&,S!,D#,E,A(0)
           END SUB
           целое%=1
           длинноецелое&=2
           единичнойточности!=3
           двойнойточности #=4
           массив(0)=5
  CALL  тестпроцедура  (целое%,длинноецелое&,единичнойточности!,двой-
  нойточности#,целое%,массив())
           END
          
           Оператор SWAP
           -------------
          
  функция  SWAP обменивает значения двух переменных
   -------
          
  синтаксис  SWAP пер1,пер2
  -----------
           
  замечания пер1 и пер2 -это две переменные одного и того же типа.Если вы по-
  пытаетесь  обменять  переменные разных типов(например,строчную и целую или
  единичной точности и двойной точности),то возникает ошибка  475,"Несовпаде-
  ние типов".
  SWAP  удобно  роскольку  простой обмен переменных в двух последова-
                                     -190 -
          
          
  тельных операторах назначения не обеспечивает выполнения этой работы:
           а=в:в=а
  В то время,когда вы делаете второй оператор,переменная а не  содер-
  жит  значения,для которого она используется.Чтобы выполнить эту работу без
  SWAP,требуется временная переменная и третий оператор:


           врем=а:а=в:в=врем
           Пример:
           а%=15:b%=17
           print tab(6) "значение 'а%' есть :";a%_
                  tab(42) "значение 'b%' есть :"b%
           print
           swap a%,b%
           print "значение а% теперь :";a%_
                  tab(38) "значение b% теперь:";b%
           end
          
           Оператор SYSTEM
           ---------------
          
           функция SYSTEN завершает работу программы
           -------
           синтаксис SYSTEM
           ---------
  замечания SYSTEM прекращает работу программы и возвращает  управле-
  ние операционной системе(или Т.Б.,в зависимости от того,откуда она возвра-
  щается).Оператором END достигается то же самое и оно предпочтительнее.
           См.также END
                    STOP
           Пример
           FOR I=1 TO 10
   INPUT "Пожалуйста введите число между 1-10";X%
           IF X%=отв% THEN GOTO награда
  INPUT "Не желаете ли попробовать другое число Д/Н)";X$
           IF UCASE$(X$)<>CHR$(89) THEN SYSTEM
           NEXT I
           награда:
           PRINT
           PRINT "Вы добились этого !"
           END
          
           Функция  TAB
           ------------
          
  функция TAB табулирует до специфицированной позиции вывода n (ТОЛЬ-
           ------- КО В ОПЕРАТОРЕ print).
          
           синтаксис PRINT TAB(n)
           ---------
          
  замечания n-это целое выражение в диапазоне от 1 до 80.
  Подобно  SPC,функция TAB может использоваться только в списке выра-
  жений операторов PRINT,LPRINT или PRINT#.Используйте TAB для  выстраивания
  в  линию колонок информации.TAB вызывает подпрограммы выдачи на экран Т.Б.
  с целью вывода n-ой позиции текущей строки.Если  текущая  позиция  курсора
  уже находиться за n-ой колонкой(например,PRINT TAB(20)при курсоре в колон-
  ке 30),то Т.Б. обеспечивает переход вниз  к n-й позиции следующей строки.


  Если TAB паявляется в конце списка выражений оператора PRINT с пос-
  ледующей точкой с запятой или без нее,Т.Б. не выводит возврат каретки;т.е.
  после TAB подразумевается точка с запятой.
           См.также LPRINT
           PRINT
           PRINT#
           SPC
           пример:
           -------
                                     -191 -
          
          
           DIM друг$(1),телефон$(1)
           PRINT
           PRINT TAB(5) "имя" TAB(40) "телефон"
           PRINT
           FOR I=1 TO 5
             READ друг$
             READ телефон$
           PRINT TAB(5) друг$ TAB(40) телефон$
           NEXT I
           END
           DATA "Джон","423-45698"
           DATA "Энн","333-55566"
           DATA "Марк","222-33355"
           DATA "Ник","111-57575"
           DATA "дфк","555-77777"
          
          
           Функция TAN
           -----------
          
  функция  TAN возвращает тригонометрический тангенс
           --------
          
  синтаксис Y=TAN(числовое выражение)
           ---------
          
  замечания  Числовое  выражение  -это угол ,специфицируемый в радиа-
  --------- нах.TAN возвращает значение двойной точности .
           См.также ATN
                    COS
                    SIN
           пример
           ------
           DEFDBL а-z
           nи=atn(1)*4
           PRINT nи
           PRINT TAN(nи/4)
           END
          
          
           Cистемная переменная TIME$
           --------------------------
          
  функция  TIME$ считывает и устанавливает системное время
           --------
          
  синтаксис Для считывания времени:
           --------- S$=TIME$
           для установки времени :
           TIME$=строчное выражение
  замечания Системная переменная TIME$ содержит восьмилитерную строку
  ,которая представляет время по системным часам в форме ЧЧММСС,где ЧЧ-часы


  ММ-минуты и СС-секунды.TIME$ не может быть точным,если во время последнего
  первичного возбуждения компьютера не были правильно установлены DOS-часы.
  Системные часы устанавливаются назначением TIME$.Вводится  строчное
  выражение содержащее информацию о времени в военном формате (24 часа) ,ко-
  торое затем назначается в TIME$.Информацию о минутах может опускаться.Нап-
  ример:
     TIME$="12" 'установка часов на 12 дня"
     TIME$="13:01" 'устан-ка часов на 1:01 пополудни"
     TIME$="13:01:30" 'установка часов на 30 сек позднее 1:01
     TIME$="0:01 'установка часов на одну минуту после полуночи
  Если  размер часа 6минут или секунд находиться вне диапазона(напри-
  мер,значение минут равно 61),возникает ошибка периода прогона,Вызов  неза-
  конной функции.
                                     -192 -
          
          
  Используйте  функцию 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 управляет проверкой таймерных событий;т.е.  обеспе-
  чивает принятие решений о том,будет ли передаваться управление подпрограм-
  ме,определенной  в операторе ON TIMER ,по истечении назначенного числа се-
  кунд.
  TIMER ON включает проверку таймерных событий,но обеспечевает  запо-
  минание  событий  на таймере таким образом,что если позднее выдается TIMER
  ON ,захват в ловушку происходит немедленно .
           См.также ON TIMER
           Пример
           -------
           ON TIMER (2) GOSUB обновитьчасы
           TIMER ON
           WHILE NOT INSTAT:WEND
           END
           обновитьчасы:
           хранитьХ%=CSRLIN 'хранить положение курсора
           хранитьY%=POS(0)
           LOCATE 24,36
           PRINT TIME$
           LOCATE хранитьХ%,хранитьY% 'восстановить курсор
           RETURN
          
           Команды TRON и TROFF
                                     -193 -
          
          
           --------------------
          
  функция TRON и TROFF включают и  выключают  трассировку  исполнения
  ------- программы .
          
   синтаксис TRON (трассировку включить)
   --------- TROFF (трассировку выключить)
          
  замечания  TRON  помещает  вашу программу в режим отладки,в котором
  номера строк,метки операторов,имена процедур и функций в исходной програм-
  ме посылаются в окно  трассировки  по  мере  исполнения  каждого  операто-
  ра;TROFF выключает отладочный режим.
  При  прогоне  в  Т.Б.  в текстовом режиме трассируемые номера строк
  ,метки имена процедур ит.д.


посылаются в окно трассировки.
  Для изменения между трассированием и исполнением во  время  трасси-
  ровки нажимайте ALT-F10.
  Различия  В  отличии  от  И.Б.  ,в Т.Б. физическое положение TRON и
  TROFF в вашей исходной программе управляет их действием,а не их положением
  в исполнительном проходе периода прогона.Рассмотрим,например,эту программу:
           10 GOTO 30
           20 TRON
           30 X=Y+X
           40 TROFF
           50 END
  При исполнении этой программы И.Б. никогда не  включает  трассиров-
  ку,поскольку  для  него все,что касается оператора TRONв строке 20 6не су-
  ществует.С другой стороны,Т.Б. принимает решения  о  включении/невключении
  трассировки  во  время компилирования и рассматривает все операторы,идущие
  после подавления  TRON,как  подлежащие  включению  на  трассировку.Поэтому
  программа,созданная на Т.Б.,будет выводить:
           [30] [40]
  при прогоне представленной выше программы.
           Пример
           ------
           10 X=0:Y=1:Z=2
           20 GOTO 40
           30 TRON
           40 X=Y+Z
           50 PRINT
           60 TROFF
           70 END
          
           
           Функция UBOUND
           --------------
          
  функция UBOUND возвращает наивысшую границу ,возможную для специфи-
  ------- цированного размера массива(наибольший подстрочный индекс)
          
           синтаксис  UBOUND(массив[,размер])
           ----------
          
  замечания  массив-это  массив,который образмеривается;размер-это
  --------- целое от 1 до числа размерностей в массиве.
  Чтобы найти нижнюю границу массива,используйте функцию LBOUND.
  См.также LBOUND
     OPTION BASE
          пример
          ------
         DIM массив%(1900:2000)
         FOR индекс%=LBOUND(массив%) TO
               UBOUND(массив%)
        PRINT "массива элемент (":индекс%;")есть";
                  массив%(индекс%)
        NEXT индекс%
                                     -194 -


          
          
           END
          
          
           Функция UCASE$
           --------------
          
  функция UCASE$ возвращает всю строку в верхнем регистре.
           --------
          
  синтаксис S$=UCASE$(строчное выражение)
  ---------
         
  замечания UCASE$ возвращает строку равную  строчному  выражению  за
  исключением  того,что все алфавитные литеры нижнего регистра строчного вы-
  ражения преобразуются в верхний регистр.
           См.также LCASE$
  Пример PRINT UCASE$ ("Быть или не быть...")
          
           Функция VAL
           -----------
          
  функция VAL возвращает числовой эквивалент строки.
           -------
          
  синтаксис Y=VAL(строчное выражение)
           ----------
          
  замечания Функция VAL обращает ее строчный  аргумент  в  число.Если
  строчное выражение начинается с числовых литер (0-9,+,-,.,E,D)6но содержит
  также  нечисловые  литеры,VAL  возвращает число вплодь до нечисловой лите-
  ры.Если строчное выражение не начинается с числовой литеры,VAL  возвращает
  0.(Пробел и табуляция игнорируются).
  VAL часто является частью подпрограмм ввода,поскольку она позволяет
  программе осуществлять подсказку пользователю на строчные данные.Затем она
  обращает данные в числовую информацию по мере необходимости без риска вво-
  да  вами нечисловых данных в числовые переменные и появления беспорядочных
  ошибок ?REDO FROM START(переделать с начала)
           См.также STR$
           пример
           ------
           A$="34 N главная улица"
           B$="правильно,тридцать четыре"
           C$="+3.4e1
           D$=" 123 до"
           PRINT VAL(A$),VAL(B$),VAL(C$),VAL(D$)
           END
          
           Функция VARPRT
           --------------
          
           функция VARPRT возврашает адрес переменной.
           -------
          
           синтаксис Y=VARPRT(переменная)
           ---------


          
  замечания Переменная- это любая числовая или строчная переменная,ли-
  --------- бо элемент массива.
  Такая  адресная  информация  иногда  называется "указателем";напри-
  мер,VARPRT(X) означает,что требуется возвратить "указатель x".
  Поскольку программами Т.Б. используется  модель  расширенной  памя-
  ти,для   полного   определения   адреса   переменной   требуется   еще   и
  VARSEG.(VARSEG возвращает сегментную часть адреса).
  VARPRT большей частью используется для обеспечения подпрограммы  на
  языке ассемблера информацией о положении переменной в памяти.
                                     -195 -
          
          
           См.также VARSEG
           Пример
           B%=55
           DEF SEG =VARSEG(B%)
           адрес%=VARPRT(B%)
           PRINT PEEK(адрес%)
           END
          
           Функция VARPRT$
           ---------------
          
  функция VARPRT$ возвращает указатель переменной в строчной форме.
           ---------
          
  синтаксис s$=VARPRT$(переменная)
           ---------
          
  замечания Переменная-это любая числовая или строчная переменная,ли-
  --------- бо элемент массива.VARPRT$ возвращает указатель
  переменной в строчной форме  и используется в операторах PLAY и DRAW для
  указания имен переменных в командных строках.
           См.также DRAW
                    PLAY
                    VARSEG
           Пример
 'включить графический режим средней разрешающей способности
           SCREEN 1
           домик$="U20 G5 E20 F20 H5 D20 L30"
           DRAW домик$
           DRAW "BE3"
           DRAW P1,3"
           FOR I%=1 TO 280 STEP 40
             DRAW "M="+VARPRT$(I%)+".40"
             DRAW домик$
           NEXT I%
           END
          
           Функция
VARSEG
           --------------
          
  функция VARSEG DJPDHFOFTN CTUVTYNYSQ FLHTC GTHTVTYYJQ
           --------


          
           синтаксис
Y=VARSEG(переменная)
           ---------
           
  замечания Переменная- это любая числовая или строчная переменная,ли-
  бо элемент массива.В силу расширенной модели памяти Т.Б.,для полного опре-
  деления адреса переменной VARSEG требуется вместе с VARPRT.
  VARSEG возвращает числовое значение в диапазоне от 0  до  65535.Для
  получения адреса переменной таким образом,чтобы с помощью CALL подпрограм-
  ме  на  языке  ассемблера можно было сообщить где подлежащий его обработке
  аргумент располагается в памяти,используйте VARSEG в сочетании с VARPRT.
  Программы Т.Б. помещают все немассивные переменные  в  единственный
  сегмент,который может иметь длинну до 64К.Следовательно,посредством приме-
  нения VARSEG на всех немассивных переменных данной программы всегда дает в
  ответ  одно  и  то же значение.Фактически это сегментное значение является
  умолчанием для операторов,которые доверены DEF SEG (например, PEEK,POKE).
           См.также  VARPRT
           Пример
           B%=55
           DEF SEG=VARSEG(B%)
           адрес%=VARPRT(B%)
           PRINT PEEK(адрес%)
           END
                                     -196 -
          
          
          
           Оператор VIEW
           -------------
          
  функция VIEW определяет активную зону(обзорные границы) графическо-
           ------- го экрана.
  синтаксис VIEW [[SCREEN][(X1,Y1)-(X2-Y2)[,[цвет[граница]]]]]
           ---------
  замечания (X1,Y1)и (X2,Y2) -это верхний левый и нижний  правый  уг-
  лы,соответственно,определяемого  обзорного выхода.Цвет-опциональный число-
  вой аргумент;если он включается,новый обзорный  выход  заполняется  данным
  цветом.Граница-опциональный числовой аргумент ,который ,когда он включает-
  ся,вызывает вычерчивание Т.Б. бордюра вокруг нового обзорного входа в спе-
  цифицируемом цвете.Если опускается,бордюр не вычерчивается.
  VIEW определяет зону графического экрана, в которую можно осуществ-


  лять запись,либо наоборот,зону в которую записывать нельзя.Попытки устано-
  вить  пикселы  вне  обзорного выхода заканчиваются неудачей;это называется
  отсечением.
           Опция SCREEN
           ------------
  Если ключевое слово SCREEN опускается,дальнейшие  ссылки  на  точки
  беруться относительно верхнего левого угла обзорного выхода,а не от левого
  угла экрана.Например,после
           VIEW (100,50)-(300,180)
           и затем PSET (0,0)
  включается пиксел с координатами (100,50).
  Если  SCREEN  включается  ,то  точки  специфицируются обычным обра-
  зом;т.е. относительно верхнего левого угла дисплея.Например,PSET (0,0) от-
  носиться к пикселу в крайнем левом углу дисплея.Однако  видимыми  являются
  только  точки,попадающие  в специфицированный обзорный выход(вне обзорного
  выхода точки отскаются).
  VIEW без аргументов определяет весь  экран,как  обзорный  выход.При
  использовании  оператора  SCREEN  для  изменения  экранного режима (напри-
  мер,чтобы перейти от средней к высокой разрешающей способности) ликвидиру-
  ется любая установка,которая могла до этого момента существовать.
  Когда обзорный выход уже определен,CLS очищает только обзорный выход.
      пример
      -------
           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.Если результирующее значение есть
  ноль,обработка повторяется.Если не ноль,Т.Б. продолжает  исполнение  прог-
  раммы со следущего оператора.
  Если m опускается , в операторе WAIT вместо него используется 0.
           Пример
                                     -197 -
          
          
           -------
           WAIT &H60,1
           PRINT "BBB"
           END
          
           Операторы WHILE/WEND
           --------------------
          
  функция  WHILE  и WEND выстраивают цикл с тестированием его верхней
           -------  части .
  синтаксис WHILE целое выражение
           --------- .
                     .   операторы
                     .
                     WEND
  замечания Если целое выражение истинно (оценивается  как  ненулевое
  --------- значение) ,все операторы между WHILE о WEND исполняются
  Затем  Т.Б.  осуществляет  переход  к  оператору  WHILE и повторяет
  текст,причем если все еще не ноль,заключенные в цикле операторы исполняют-
  ся вновь.Этот процесс повторяется до тех пор пока,наконец,тестовое выраже-
  ние не оценивается как нулевое,при котором исполнение переходит к операто-
  ру6следующему после WEND.
  Если целое выражение оценивается как ЛОЖНОЕ  (нулевое)  при  первом
  проходе,то не исполняется ни один оператор цикла.
  Циклы,выстраиваемые  с помощью WHILE /WEND могут гнездоваться .Каж-
  дому WEND соответствует ближайшее WHILE .Если Т.Б.  обнаруживает  оператор
  WEND  без  решения  WHILE  ,возникает  ошибка  30 периода прогона,WEND без
  WHILE.При наличии WHILE без соответствующего ему WEND генерируется  ошибка
  29 периода прогона,WHILE без WEND.
  Хотя  компилятор это мало заботит,для достижения четкости конструи-
  руемого вами цикла делайте отступ операторов,располагаемых между  WHILE  и
  WEND,с помощью пары пробелов.
  Примечание:WHILE -1_WEND обеспечивает создание бесконечного цикла.


  Чтобы преждевременно выйти из цикла WHILE/WEND,используйте оператор
  EXIT WHILE.
           См.также
           DO/LOOP
           EXIT
           пример
           -------
           I=0
           X=10
           WHILE I<X
           I=I+1
           PRINT "I=";I
           DELAY 1
           WEND
           PRINT
           PRINT "оба значения I и X равны 10"
           PRINT I
           PRINT X
           END
          
           Оператор WIDTH
           --------------
          
  функция WIDTH устанавливает логический размер строки
           -------
  синтаксис WIDTH [{имя устройства!файлнам},]размер
           ---------
  замечания размер-это целое выражение от 0 до 255,которым специфици-
  --------- руется новый логический размер строки.
  Имя  устройства-это строчное выражение,опционально описывающее уст-
  ройство,ШИРИНА которого  подлежит  установке.Опциями  устройства  являются
  SCRN:(экран),LPT1:(устройство строчной печати 1),LPT2:(устройство строчной
                                     -198 -
          
          
  печати  2),LPT3:(устройство строчной печати 3),COM1:(коммуникационное уст-
  ройство 1) и COM2:(коммуникационное устройство 2).Если этот аргумент опус-
  кается,WIDTH  относиться  к  дисплею  (SCRN:).Файлнам-это  целое   выраже-
  ние,представляющее файл,открытый для вывода.В общем случае WIDTH определя-
  ет сколько литер может "выдаваться на печать" на данное устройство до того
  ,как  выводиться  возврат  каретки,хотя  точное определение действия зтого
  оператора изменяется соответственно тому устройству,к которому применяется.
  В случае WIDTH размер или WIDTH "SCRN:",размер устанавливается  ши-
  рина  экрана.Законными значениями размера являются 40 и 80,причем 40 неза-
  конно для монохромного дисплея.
  Если экран находиться в графическом режиме,изменение ширины воздей-
  ствует на изменение режима графики.Например,если текущим режимом  является


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


          
  функция WINDOW определяет систему графических координат.
           -------
  синтаксис WINDOW [[SCREEN](X1,Y1)-(X2,Y2)]
           ----------
  замечания (X1,Y1) и (X2,Y2)-это  две  координатные  пары  единичной
                                     -199 -
          
          
  --------- точности.(X1,Y1) представляет нижнюю левую часть зкрана,а
  (X2,Y2)-верхнюю правую.
  Если  вам  не  нравиться  стандарт  Т.Б.  от  0 до 319 (или от 0 до
  639),от 0 до 199 с начала координат в верхнем левом  углу,оператор  WINDOW
  позволяет осуществлять адресацию вашим методом.Оператор WINDOW транслирует
  произвольные  "мировые" координаты в "физические" координаты (адреса дисп-
  лейных пиксел).
  Одной из областей применения  WINDOW  является  перестроение  карты
  отображения  в  соответствии с экранными координатами,используемыми другой
  компьютерной системой.Например,графическое отображение APPLE II состоит из
  280 пиксел по горизонтали и 192 по вертикали.Этот оператор WINDOW вызывает
  использование РС-дисплеем той же адресной схемы:
         WINDOW SCREEN (0,0)-(279,191)
  После использования этого оператора программа,переносимая с  экрана
  APPLE  II,осуществляет  попытку  графически изобразить нижний самый правый
  пиксел на экране APPLE II,для  которого  она  была  написана.Например,PSET
  (279,191) превращается в физический пиксел 319,199 (нижний правый угол РС).
  В качестве другого примера,предположите,что,вы работаете с областью
  применения ,в которой принято описывать линии и другие обьекты в координа-
  тах много более крупных,чем от 0 до 199 и от 0 до 639,разрешаемых стандар-
  тной экранной адресацией.В такой области применения возможно также полезно
  иметь  начало координат в центре дисплея,а увеличение положительных значе-
  ний Y вверх от начала координат ,как это делается в аналитической геометрии.
  Оператор WINDOW позволяет вам трактовать графический экран  средней
  или высокой разрешающей способности как если бы он действительно был орга-


  низован  именно  таким образом. WINDOW дает вам возможность маппировать вам
  на дисплее полный диапазон чисел единичной точности;например:
         WINDOW (-1E6,1E6)-(1E6,-1E6)
  создает координатную систему с  4  трилионами  точек  (2х2  миллио-
  на).(-10000000,1000000)маппируется на верхнем левом пикселе,(0,0)- в цент-
  ре экрана и (1000000,-1000000)- на нижнем правом пикселе.в результате апп-
  роксимируется  стандартная декартова плоскость эвклидовой геометрии.Начало
  координат находиться в середине,положительные значения X-вправо  от  нача-
  ла,положительные значения Y-вверх от начала.
  После  испольнения этого оператора в любой операции записи на экран
  (CIRCLE,LINE ...)будет использоваться эта новая координатная система.
           PSET (0,0)
  включает пиксел в центре экрана.
           PSET (2500,2500)
  вкл. пиксел ,находящийся немного выше и правее центра  экрана.Аргу-
  менты  оператора WINDOW являются числами с плавающей точкой единичной точ-
  ности,позволяющими на экранной карте создавать  огромную  площадь(миллионы
  пиксел  в обоих размерах),либо крошечную площадь дробных чисел с координа-
  тами между 0 и 1.
  Если включается опциональное ключевое слово SCREEN,это будет приво-
  дить к тому,что новая координатная система остается качественной на уровне
  умолчания,т.е. координаты Y увеличиваются по мере движения вниз.Например:
          WINDOW SCREEN (1,-1)-(-1,1)
  создает координатную систему ,в которой верх экрана  представляется
  координатой Y=-1,а низ экрана -координатой y=1.
  Любое  задействованное  маппирование WINDOW выключается исполнением
  RUN,SCREEN или WINDOW без аргументов.Функция PMAP выполняет  масштабирова-
  ние в соответствии с текущей установкой WINDOW,но без выдачи чего бы то ни
  было на экран.
           См.также COS
                    PMAP
           Пример
           ------
           SCREEN 1
           nи=ATN(1)*4
           знач1=5:знач2=6:шаг=400
           WINDOW (-1,1)-(1,-1)


           FOR T=0 TO 2*nи STEP 2*nи/шаг
             радиус=COS(2*T)
           X=радиус*SIN(знач1*T)
                                     -200 -
          
          
           Y=радиус*SIN(знач2*T)
           PSET (X,Y)
           NEXT T
           WHILE NOT INSTAT:WEND
           END
          
           Оператор WRITE
           --------------
          
  функция WRITE посылает на экран разделяемые запятыми данные.
           -------
  синтаксис WRITE [список выражений]
           ---------
  замечания  список  выражений -это последовательность числовых и/или
  --------- строчных выражений , разделяемых запятыми  или  точкой  с
  запятой.Если  список  выражений  опускается,выводиться пустая строка.WRITE
  подобно PRINT,за исключением того,что  WRITE  вставляет  между  элементами
  списка  выражений запятые,заключает строчные данные в двойные кавычки и не
  выводит пробел перед положительными числами.
           См.также   PRINT
           Пример FOR I=1 TO 3
             READ слова$,число%
             PRINT слова$
             PRINT число%
             WRITE слова$,число%
           NEXT I
           DATA "алло ",10,"как",20,"вы",30
           END
          
           Оператор WRITE#
           ---------------
          
  функция  WRITE# выводит данные в последовательный файл.
           -------
  синтаксис WRITE#файлнам,список выражений
           ---------
  замечания Файлнам-это число,ассоциируемое с устройством или  файлом
  --------- в момент открывания файла.
  Список выражений-это последовательность числовых и/или строчных вы-
  ражений  6разделяемых запятыми или точками с запятой.WRITE# подобно PRINT#
  ,за исключением того ,что WRITE# вставляет запятые между элементами списка
  выражений,выдает строчные данные внутри двойных кавычек и не выводит  про-
  бел перед положительным числом.
  WRITE#  является  предпочтительным  способом  записи полей данных в
  последовательный файл,поскольку этот оператор обеспечивает  автоматическое


  разделение  переменных  запятыми  и  простановкой  кавычек с обеих стлорон
  строк. Это упрощает использование оператора INPUT# ,когда вы  осуществляете
  выписки из файла.
           См.также PRINT#
           Пример
           ------
           OPEN "FILE.PRN" FOR OUTPUT AS #1
           FOR I=1 TO 6
            READ INF$
            WRITE#1,INF$
           NEXT I
           CLOSE 1
           END
           DATA "майк","Смит","12 главная ул.","Париж","п/о","95066"
          
          

                                                                            
        
         ГЛАВА 3.           Турбо-Бейсик : программа
              Турбо-Редактор
  Встроенный  редактор  Т.Б. специально сконструирован для создания ис-
  ходного текста программы.
  Когда  вы  выбираете EDIT (редактировать)  из  главного  меню Т.Б., в
  верхнюю часть экрана выносится и высвечивается  окно  редактирования,  а вы
  оказыветесь  в  редакторе.  Чтобы   оставить   редактор  и  возвратиться  в
  главное меню, нажимаете ESC (данные  в  окне  редактирования  остаются   на
  экране).
  Вы можете вводить текст столь же изящно,  как если бы вы пользовались
  пишущей машинкой. Для завершения  строки  нажимайте клавишу Enter. Когда вы
  введете достаточно строк для заполнения экрана, верхняя строка скручивается
  с экрана. Не огорчайтесь, она не теряется  и  вы можете перемещаться туда и
  обратно по вашему тексту  с  помощью  команд  скрутки, которые  описываются
  ниже. Редактор  Т.Б. обладает возможностью "уничтожать сделанное",  которая
  позволяет  вам как бы брать  обратно  изменения, если вы  еще  не  оставили
  строку. Это  команда  Ctrl-Ql  описывается   в   разделе  "Разные   команды
  редактирования".
  Теперь бросим взгляд на состояние окна редактора,которая показывает :
 
  X:FILENAME.TYP LINE COL INSERT INDENT TAB
  (имя файла,тип) (строка) (колонка) (вставка) (отступ) (табулятор)


        
    X:Имя файла.тип
    ---------------
  указывает  дисковвод, имя и расширение файла, подлежащего  редактированию.
  Если имя файла и расширение  есть: NONAME.BAS - это  имя  файла  в Т.Б.  по
  умолчанию.
  
   Строка
   ------
  Указывает  номер строки в которой находится курсор (по отношению верха фай-
   ла, а не экрана).
        
   Колонка
   -------
   Показывает номер колонки содержащей курсор.
        
   Вставка
   -------
  Указывает, что в данный момент вы находитесь в "режиме  вставки". В  режиме
  вставки  литеры  вводятся  с  клавиатуры  и  вставляются на курсорной пози-
  ции.  Текст  перед  курсором перемещается  вправо по мере ввода вами  новых
  литер.  Для  тумблерного  переключения  редактор между  режимами вставки  и
  переписывания  используется  клавиша INS или Ctrl-V; в режиме переписывания
  текст  вводимый с клавиатуры  записывается  поверх  литер, находящихся  под
  курсором.  Примечание:Когда  вы  находитесь  в  режиме переписывания, новые
                                     - 26 -
          
           
   строки  текста  вводится  не  могут.
        
   Отступ
   ------
  Отступ   указывает  на  то,  что  включена  возможность  авто-отступа.  Она
  включается  с  помощью команды включения/выключения авто-отступа, Ctrl-OI.
        
   Табулятор
   ---------
  Указывает на то,  можете  ли  вы  вставлять  или  нет ярлыки  табуляции.Для
  тумблерного включения/выключения используется Ctrl-OI
        
        
                          Работа редактора
        
        
  Наиболее важным  при изучении редактора является то, как перемещается
  курсор. Его  вы  можете перемещать  по  экрану используя группу управляющих
  литер:  нажав Ctrl и одновременно любую из клавиш:  A,S,D,F,E,R,X,C,W,Z.
  Эти  литеры  располагаются  на клавиатуре таким образом, что логичеки
  указывается их использование. Например:  E
                                           S D
                                            X


  нажатие  на  Ctrl-E  перемещает  курсор  вверх, Ctrl-X вниз,  Ctrl-S влево,
  Ctrl-D вправо.
  редактором  используется  примерно  50  команд для перемещения курсо-
  ра, страницы по тексту, нахождения  и  замены  строк   и т.д.  эти  команды
  можно  сгруппировать в четыре главные категории:
        -команды перемещения курсора
        -команды вставки
        -блоковые команды
        -разные команды
        Каждая  группа  содержит  логически   родственные   команды,  которые
 описываются  в  следущих  ниже разделах ( сводка  команд  представляется  в
 таблице 3-1).  Каждый  ввод  состоит  из  определенной  команды, за которым
 следуют  клавишные  наборы  по  умолчанию,  используемые для задействования
  команды.
         Таблица 3-1 .Сводка команд редактора.
         ----------------------------------------------------------------
         Команды перемещения курсора
         ----------------------------
         литера влево                      Ctrl-S или стрелка влево
         литера вправо                     Ctrl-D или стрелка вправо
         слово влево                       Ctrl-A
         слово вправо                      Ctrl-F
         строка вверх                      Ctrl-E или стрелка вверх
         строка вниз                       Ctrl-X или стрелка вниз
         скрутка вверх                     Ctrl-W
         скрутка вниз                      Ctrl-Z
         страница вверх                    Ctrl-R или PgUp(страница вверх)
         страница вниз                     Ctrl-С или PgDn(страница вниз)
         -----------------------------------------------------------------
         Расширение команд перемещения
         -----------------------------
         Начало строки
         конец строки                      Ctrl-QS или HOME(исходное)
         верх окна                         Ctrl-Qd или END(конец)
         низ окна                          Ctrl-QE
         верх файла                        Ctrl-QX
         конец файла                       Ctrl-QR


         начало блока                      Ctrl-QC
         конец блока                       Ctrl-QB
         последняя курсорная               Ctrl-QK
                                    - 27 -
          
          
         позиция                           Ctrl-QP
                                                                 
         -----------------------------------------------------------------
         Команды вставки и стирания
         --------------------------
         Включено/выключено                Ctrl-V или INS(вставка)
         режим вставки
         Вставка строки                    Ctrl-N
         Стирание строки                   Ctrl-Y
         Стирание до конца строки          Ctrl-QV
         Стирание литеры
         Влево от курсора                  Ctrl-H(или возврат на пробел)
         Cтирание литеры под курсором      Ctrl-G(или DEL стирание)
         Стирание слова вправо             Ctrl-T
                                                                  
         -----------------------------------------------------------------
         Блоковые команды
         ----------------
         Пометка начала блока              Ctrl-KB или F7
         Пометка конца блока               Ctrl-KK или F8
         Пометка одного слова              Ctrl-KT
         Кодирование блока                 Ctrl-KC
         Перемещение блока                 Ctrl-KV
         Стирание блока                    Ctrl-KY
         Считывание блока с диска          Ctrl-KR
         Запись блока на диск              Ctrl-KW
         Спрятать/отобразить блок          Ctrl-KH
         Печать блока                      Ctrl-KP
         -----------------------------------------------------------------
         Разные команды
         --------------
         Прекратить редактирование
         Не хранить                        Ctrl-KD,Ctrl-KQ или ESC
         Хранить и редактировать           Ctrl-KS или F2
         Новый файл                        F3


         Табуляция                         Ctrl-I или ТАВ(табуляция)
         Режим табуляции                   Ctrl-OT
         Включить /выключить авто-отступ   Ctrl-OI
         Восстановить строку               Ctrl-QL
         Установить маркер места           Ctrl-KN
         Найти маркер места                Ctrl-QN
         Найти                             Ctrl-QF
         Найти и заменить                  Ctrl-QA
         Повторить найденное
         последним                         Ctrl-L
         Префикс литеры управления         Ctrl-P
         Отбросить операцию                Ctrl-U
         Восстановить сообщение
         об ошибке                         Ctrl-QW
                                                 
         ------------------------------------------------------------------
        
                       Базисные команды перемещения
        
        
  Для начала правильного редактирования вашего  файла  существует  нес-
  колько базисных команд.
         Литера влево   Ctrl-S или стрелка влево
         ------------
         курсор перемещается на одну литеру влево
         Литера вправо  Ctrl-D или стрелка вправо
         -------------
         курсор перемещается на одну литеру вправо
         Слово влево    Ctrl-A
         -----------
                                     - 28 -
           
          
  курсор   перемещается  в  начало   слова, находящегося
  слева. Слово определяется как последовательность литер, отделяемая одним из
  следующих символов:
         пробел<>,():.[]"*_/$
         эта команда работает по разбивкам строки
         Слово вправо  Ctrl-F
         ------------
  курсор перемещается в начало слова находящегося справа
  Строка вверх  Ctrl-E или стрелка вверх
         -------------
  курсор перемещается на одну строку вверх
         Строка вниз   Ctrl-X или стрелка вниз
         --------------
  курсор перемещается на одну строку вниз
         Скрутка вверх Ctrl-W


         -------------
  обеспечивается скручивание по одной строке в  направле-
  нии начала файла (экран в целом скручивается вниз).
         Скрутка вниз  Ctrl-Z
         -------------
  обеспечивается  скручивание по одной строке в направле-
  нии конца файла (Экран в целом скручивается вверх).
         Страница вверх Ctrl-R или PgUp
         --------------
  курсор перемещается на одну страницу  вверх, без  одной
                       строки
         Страница вниз Ctrl-C или PgDn
         ----------------
  курсор  перемещается  на  одну страницу вниз, без одной
                       строки.
        
        
                  Расширение команды перемещения
           
        
  Иногда вы можете пожелать быстрее  перемещаться  в  ваших документах,
  чем позволяют  базисные  команды перемещения. Редактор  обеспечивает  шесть
  команд для мгновенного перемещения к крайним концам строк, в начало и конец
  файла, а также к последней курсорной позиции.
         Начало строки  Ctrl-QS или HOME
         ---------------
  курсор  перемещается  в  начало текущей строки(колонку
                        номер один)
         Конец строки   Ctrl-QD или END
         -----------------
  курсор перемещается в конец текущей строки
         Верх экрана    Ctrl-QE
         ------------------------
  курсор перемещается в верхнюю часть экрана
         Низ экрана     Ctrl-QX
         ----------------------
  курсор перемещается в нижнюю часть экрана
         Верх файла     Ctrl-QR
         ----------------------
  курсор перемещается на первую литеру в файле
         Конец файла    Ctrl-QC
         -----------------------
  курсор перемещается на последнюю литеру в файле.
         Конец          Ctrl-Q
         ----------------------
  позволяет осуществить переход к особым точкам в  доку-
                        менте .
         Начало блока   Ctrl-QB
         ----------------------
  курсор  перемещается к маркеру начала блока устанавли-


                                     - 29 -
          
          
  ваемому с помощью Ctrl-KB. Команда работает, даже если блок не отображается
  (СМ."скрыть/отобразить  блок"  в разделе "Блоковые операции") или  если  не
  установлен маркер конца блока.
         Конец блока    Ctrl-QK
         -------------
   курсор перемещается к маркеру конца блока, устанавливаемому с помощью
   Ctrl-KK. Команда  работает, даже если блок  не  отображается, или  если  не
   установлен маркер начала блока
        Последняя курсорная позиция  Ctrl-QP
         -----------------------------------
  происходит  перемещение  к  последней  позиции  курсора
  перед   последней   командой. Эта   команда   полезна,  в  частности, после
  исполнения   операции   найти/заменить,  когда   вы   желаете  вернуться  к
   последней позиции, имевшей место до ее исполнения.
        
                      Команды вставки и стирания
         
        
   Вы  не  можете  написать  программу  толькоперемещая курсор один раз.
   Вы должны быть в состоянии вставлять и стирать текст.  С помощью  следующих
   команд выполняется вставка и стирание литер, слов и строк.
        
         Включение/выключение режима вставки         Ctrl-V или INS
         ----------------------------------------
         При   вводе   текста   вы   можете   выбирать  между  двумя базисными
   режимами: вставкой  и  переписыванием. Переключаться  между  этими режимами
   вы  можете тумблерно переключая режим вставки. Текущий режим отображается в
   верхней части экрана.
   Режим   вставки  есть  режим   редактора  по  умолчанию,  позволяющий
   вам вставлять  новые  литеры в старый текст. Текст справа от курсора просто
   перемещается вправо по мере ввода нового текста. Для замены старого  текста
   новым  используется  режим  переписывагия; любая  вводимая  литера заменяет
   находящуюся  под  курсором.  В  режиме переписывания вы не вставите в текст
   новые  строки.
        


    Стирание литеры справа от курсора   Ctrl-H или возврат на пробел
         ------------------------------------
   осуществляется перемещение на одну  литеру влево  и  стирается  находящяяся
   там   литера.   Любые   литеры   справаот  курсора   перемещаются  на  одну
   позицию  влево.  Эту  команду  можно  также  использовать  для  перемещения
   строчных разрывов.
        
         Стирание литеры под курсором         Ctrl-G или DEL
         -------------------------------
   стирается  литера,  находящаяся  под  курсором  и  перемещаются влево любые
   литеры  находящиеся справа от курсора. Эта команда не работает по  строчным
   разрывам.
        
         Стирание слова справа от курсора      Ctrl-E
         ---------------------------------
   стирается  слово  находящееся  справа  от  курсора. Эта команда работает по
   строчным разрывам и может использоваться для их перемещения.
                                                                             
         Вставка строки              Ctrl-N
         ------------------
   на курсорной позиции вставляется разрыв строки
        
         Стирание строки              Ctrl-Y
         ------------------
   стирается  строка,  содержащая курсор,  а все строки,  лежащие  ниже ее пе-
   ремещаются  на  одну  строку  вверх.  Нет возможности  восстановить стертую
   строку,  поэтому пользуйтесь данной командой с осторожностью.
         Стирание до конца строки      Ctrl-QY
         ------------------------
                                     - 30 -
          
          
   стирается весь текст откурсорной позиции до конца строки.
        
                       Блоковые команды
        
  Для  блоковых команд также требуются командные последовательности уп-
  равляющих  литер. Если  вы  чувствуете,  что  пресытились,  возвратитесь  к
  этому  разделу,  когда  ощутите   необходимость   перемещать,  стирать  или
  копировать целые  пласты  текста.  В  одно  и то же время в документе может


  быть  один  блок.  Блок маркируется посредством  размещения маркера  начала
  блока перед первой  литерой  и  маркера  конца блока после последней литеры
  желаемой   части  текста. Однажды  маркированный  блок  может копироваться,
  перемещаться,  стираться или записываться в файл.
         Пометка начала блока            Ctrl-KB или F7
         ---------------------
  маркируется  начало  блока.  Сам маркер невидим, а  блок становиться  види-
  мым, только  когда  устанавливается   маркер  конца   блока.  Маркированный
  текст (блок) изображается в другой интенсивности цвета.
         Пометка конца блока              Ctrl-KK или F8
         ----------------------
  маркируется   конец  блока.  Сам маркер невидим,  а блок становиться видим,
  только когда устанавливается маркер начала блока.
         Пометка одного слова             Ctrl-KT
         --------------------
   одно  слово  маркируется   как   блок,  для   которого  последовательность
   начала/конца блока несколько грубовата и поэтому замещается одной командой.
   Если  курсор  помещается в пределах слова,  то будет маркировано именно это
   слово.  Если он за пределами этого слова,  то  будет  маркироваться  слово,
   находящееся  слева от курсора.
         Скрывание/отображение блока       Ctrl-KH
         ---------------------------
   вызывает  видимое  маркирование  блока, подлежащего  переменному  выключе-
   нию и вкючению. Команды маниауляции над  блоком (копирование, перемещение,
   стирание и  запись  в  файл)  работают  только  когда  блок  отображается.
   Относящиеся  к  блоку  перемещения курсора (переход в начала/конец блока )
   работают независимо от того скрыт блок или нет.
         Копирование блока                  Ctrl-KC
         ------------------
   ранее  маркированный  блок  копируется  в  текущую маркерную  позицию. Пер-
   воначальный блок не изменяется, а  маркеры  помещаются  вокруг  новой копии
   блока.  Если  ни  один  блок  не маркирован или курсор находится в пределах


   маркированного блока, ничего не происходит.
         Перемещение блока                  Ctrl-KV
         -----------------
   ранее  маркированный  блок  перемещается  из  его  первоначального  положе-
   ния в курсорную позицию. Блок исчезает из своего первоначального положения,
   а маркеры остаются вокруг блока в его новом положении. Если ни один блок не
   маркирован, ничего не происходит.
 
         Стирание блока                     Ctrl-KY
         --------------
   Стирается  ранее  маркированный  блок. Ничего  не  предусмотрено  для
   восстановления старого блока, поэтому будьте с этой командой осторожны.
         Запись блока на диск               Ctrl-KW
         --------------------
   ранее  маркированный  блок  записывается  в  файл. Блок  остается  неизмен-
   ным, маркеры  тоже  остаются  на  месте. Когда  выдается  эта  команда,  вы
   получаете  подсказку для установления имени файла, в который пойдет запись.
   Файл  может  быть  задан  любым  законным  именем. (Удлинение  по умолчанию
                                     - 31 -
          
          
   есть  .BAS).
   Чтобы выбрать файл для перезаписи, вы  можете  использовать  свободно
   определяемые литеры; справочник отображается. Если  специфицированный  файл
   уже  существует, перед записью в существующий файл  дается предостережение.
   Если  нет маркированного блока, ничего не происходит.
         Считывание блока с диска          Ctrl-KR
         ------------------------
   в  текущий  текст  на  курсорной позиции  считывается файл точно так,  если
   бы это был блок. Затем считанный текст маркируется как блок. Когда выдается
   эта  команда, вы  получаете подсказку  для задания имени файла, подлежащего
   считыванию. Специфицированный файл имеет любое законное имя файла.
         Печать блока                      Ctrl-KP
         --------------
   маркированный  блок  посылается  на  распечатку.  Если блок не маркировался
   или маркированный блок скрыт,  распечатывается весь файл.


                       Разные команды редактирования
  В этом разделе описываются команды,  которые не попадают ни  под одну
   из  ранее упомянутых категорий.
     Прекратить редактирование,  не хранить  Ctrl-KD, Ctrl-KQ или ESC
         -------------------------
   отменяется редактор  и  вы  возвращаетесь  в  главное меню. Хранение  отре-
   дактированного  файла  на  диске  осуществляется  явно с помощью опции SAVE
   главного меню под управлением команды FILES, автоматически через опцию AUTO
   SAVE в разном меню настройки или пока не отменен редактор.
         Хранить и редактировать          Ctrl-K9 или F2
         -----------------------
         Файл сохраняется и остается в редакторе.
         Новый файл              F3
         ----------
   Позволяет стирать текст из текущего файла  редактирования и создавать
   новый файл; иниче просто создается новый файл. Когда  вы  нажимаете F3, вам
   задается вопрос "Желаете ли вы сохранить текущий текстовый файл?".
         Табулятор               Ctrl-I или Тав.
         ------------
   Ярлыки табуляции в редакторе Т.Б фиксируются через 8 колонок  друг от
   друга.
         Режим табуляции         Ctrl-OT
         ---------------
  тумблерно   подключается   опция   табуляции.  Когда   на   экране    видим
  "Тав.", можете вставлять ярлыки табуляции;  когда включено, ярлык табуляции
  автоматически  устанавливается  в  начале  первого  слова  предыдущей стро-
  ки. (Когда режим табудяции включен, не доступен режим Авто-отступ).
         Включить /выключить авто-отступ   Ctrl-OI
         -------------------------------
  обеспечивается   автоматический   отступ  для  следующих  друг  за   другом
  строк. Когда включен, отступ текущей строки  повторяется для каждой следую-
  щей; т.е. когда вы нажимаете Enter,  курсор возвращается не в колонку номер
  1, а в начальную колонку только  что  завершенной  выми  строки.  Когда  вы
  желаете изменить отступ, пользуйтесь  пробелом и клавишей стрелка влево для


  выбора  новой  колонки.  Когда  авто-отступ  включен,  в  строке  состояния
  отображается  сообщение  INDENT (отступ);  когда  выключен,  это  сообщение
  снимается. Авто-отступ  по  умолчанию включен.  (Когда  включена табуляция,
  авто-отступ не возможен).
         Восстановить строку           Ctrl-QL
                                     - 32 -
          
          
         -------------------
   позволяет  уничтожить  сделанные  изменения  в  строке до тех пор,  пока вы
   эту  строку  не  покидаете. Строка  восстанавливается  в  ее первоначальном
   состоянии, независимо от выполненых вами изменений.
         Установить маркер места       Ctrl-KN
         -----------------------
   Маркируется до четырех мест в тексте,посредством нажатия Ctrl-К с пос-
   ледующим добавлением одной цифры (0-3).После маркирования вашего  местополо-
   жения  вы  можете  работать  где угодно в файле,а затем легко возвращаться к
   маркированному месту,используя команду  Ctrl-QN(Необходима  уверенность  ис-
   пользования одного и того же номера маркера).
         Найти маркер места             Ctrl-Qn
         ------------------
   Отыскивается до четырех маркеров места(0-3).Обеспечивается перемещение
   курсора к любому ранее установленному маркеру посредством нажатия  Ctrl-Q  и
   номера маркера.
         Найти                          Ctrl-QF
         ------
   Позволяет  вам  осуществить  поиск  строк длинной до 30 литер,когда вы
   введете эту команду,строка состояния очищается и вы получаете  подсказку  на
   задание  искомой строки.Вводя строку вы следите за ее правильностью ,а затем
   нажимаете Enter.
   Искомая строка может содержать любые  литеры,включая  литеры  управле-
   ния.Например  ,вводите Т,удерживая клавишу Ctrl при нажатии Р,а затем вы мо-
   жете включать в поисковую строку строчный разрыв,специфицируя МJ(возврат ка-
   ретки.Поисковые строки можно редактировать с помощью команд литера влево,ли-
   тера вправо,слово влево и слово вправо.Командой слово вправо повторно  вызы-


   вается  предыдущая поисковая строка,которая может затем редактироваться.Опе-
   рация поиска может быть отброшена с помощью команды ABORT(Ctrl-U).
   Когда специфицируется поисковая строка вы получаете вопрос  об  опциях
   поиска.Имеются следущие опции:
   B-поиск в обратном направлении от курсорной позиции к началу текста
   G-глобальный поиск по всему тексту относительно положения курсора.
   N-где N есть число.Находится N-ый случай при начале отсчета от
   текущей курсорной позиции
   U-игнорирование различий между верхним и нижним регистрами.
   W-поиск  только целого слова не замечая совпадающих образцов заключен-
          ных в других словах
         Пример:
   W-поиск только целого слова.Поисковая строка "TERM" будет совпадать со
   словом "TERM",но не со словом "TERMINAL"
   U поиск в обратном направлении и игнорируются различия  между  верхним
   и нижним регистрами."BLOCK" совпадает с "BLOCKHEAD" и с "BLOCKADE",и т.д.
   125 нахождение 125-го случая поисковой строки.Вы можете оканчивать пе-
   речень опций поиска(если они есть) нажатием Enter,после чего начинается  по-
   иск.Если текст содержит какую-то цель совпадающую с поисковой строкой,курсор
   позиционируется в конце ее строки или в начале ,если имел место обратный по-
   иск.Операцию поиска можно повторить с помощью команды ПОВТОРИТЬ НАЙДЕННОЕ ко
   мандой Ctrl-L.
         Найти и заменить                Ctrl-QA
         -----------------
   Эта позиция работает идентично команде НАЙТИ за  исключением  того,что
   вы  можете  заменять"найденную  строку" любой другой длинной до 30 литер.Ваш
   выбор опций тот же ,что и в команде НАЙТИ с добавлением следущего:
   N заменять без вопросов:не запрашивается подтверждение при каждой вст-
   рече поисковой строки.
         Примеры:
   N10 найти следущие десять случаев поисковой строки и заменить без воп-
   росов.
   GW найти и заменить целые слова во всем тексте,игнорируя различия вер-


   хнего и нижнего регистров.Идет подсказка на замену строки.
   GNU искать всюду по файлу не обращая внимания на регистр,заменять  без
   вопроса
   Когда  находится  элемент курсор позиционируется в конце элемента,а вы
                                     - 33 -
          
          
   получаете вопрос ЗАМЕНИТЬ?(Y/N) в строке подсказок в верхней части экрана.Вы
   можете отбрасывать операцию НАЙТИ И ЗАМЕНИТЬ с помощью команды  ABORT.Опера-
   цию  НАЙТИ И ПОВТОРИТЬ можно повторить с помощью команды повторить найденное
   последним (Ctrl-L)
         Повторить найденное последним      Ctrl-L
         ------------------------------
   повторяется самая последняя операция НАЙТИ или НАЙТИ И  ЗАМЕНИТЬ  ,как
   если бы вся информация была введена вновь.
         Префикс литеры управления          Ctrl-P
         -------------------------
   Дает возможность вводить литеры управления в файл посредством установ-
   ления  префикса  перед желаемой литерой управления с помощью Ctrl-P.(Сначала
   нажимается Ctrl-P потом желаемая литера управления.Литеры  управления  будут
   появляться  на  экране  в виде заглавных букв слабой интенсивности света(или
   наоборот ,в зависимости от настройки экрана).
         Отбросить операцию                 Ctrl-U
         -------------------
   Позволяет отбросить любую команду независимо ,имеет в ней место  пауза
   для ввода ,такая как вопрос "Заменить (Y/N)?" в команде НАЙТИ И ЗАМЕНИТЬ,или
   осуществляется  ввод  поисковой строки либо имени файла (считывание и запись
   блока).
         Восстановить сообщение об ошибке  Ctrl-QW
         --------------------------------
   Нажимайте эти клавиши для восстановления сообщения об  ошибке,уже  од-
   нажды появившегося в строке состояния окна редактора.
        
                       Редактор против ВОРДСТАР
        
   Несколько  команд  редактора  Т.Б. немного отличаются от аналогичных в
   ВОРДСТАР.Следует также отметить ,что хотя редактор содержит только некоторый


   субнабор команд ВОРДСТАР, рядом его особенностей ВОРДСТАР  не  обладает.  Эти
   особенности  были  добавлены для повышения качества редактирования.Здесь об-
   суждаются имеющиеся различия.
   Элементы управления Турбо-курсором,Ctrl-S,Ctrl-D,Ctrl-E,Ctrl-X,обеспе-
   чивают свободное перемещение по экрану без перескока в  колонку  номер  один
   пустых  строк.Это  не  значит  ,что экран заполняется пустотами наоборот,все
   концевые пустоты автоматически перемещаются.Такой способ перемещения курсора
   особенно полезен при редактировании программ;например ,когда  обеспечивается
   согласование отступов для FOR/NEXT.
   Команды Ctrl-S и Ctrl-D не работают по строчным разрывам.Для перемеще-
   ния  с одной строки на другую вы можете использовать Ctrl-E,Ctrl-X,Ctrl-A, и
   Ctrl-F.В Т.Б. невозможно вводить возврат каретки в конце файла в режиме  пе-
   реписывания;т.е.,если  режим вставки выключен,нажатие Enter в конце файла не
   будет обеспечивать вставку литеры .Однако вы можете либо переключиться в ре-
   жим вставки либо использовать Ctrl-N в режиме переписывания для ввода  возв-
   рата каретки.
   Последовательность  ВОРДСТАР Ctrl-Q DEL ,обеспечивает стирание от кур-
   сорной позиции до начала строки,в редакторе не поддеоживается.Т.Б. позволяет
   маркировать вам как одно слово так и блок с использованием Ctrl-KT.Это более
   удобно чем двухшаговый процесс ВОРДСТАР маркирования начала  и  конца  слова
   отдельно.
   Поскольку редактирование в Т.Б. целиком осуществляется в памяти,коман-
   дой  Ctrl-KD  не  вызываются  изменения файла на диске,как это имеет место в
   ВОРДСТАР.Обновление дискового файла должно выполняться явно с использованием
   опции хранения в файловом меню,либо автоматически через опцию  авто-хранения
   редактирования  в  разделе  разное меню настройки.Вы можете также воспользо-
   ваться F2 или Ctrl-KG.
   Турбо-команда Ctrl-KQ не похожа на команду Ctrl-KQ (отказ от  редакти-
   рования )ВОРДСТАР.Измененый текст не бросается -он остается в памяти и готов


   для компилирования и хранения.
   Турбо-командой  Ctrl- QL строка восстанавливается до ее содержимого пе-
   ред редактированием в течении всего времени нахождения курсора этой на строке.
   Команда Ctrl-QI обеспечивает тумблерное включение и выключение возмож-
   ности авто-отступа.
   И последнее,хотя и неменее важное,клавиша пробела назад в Т.Б. работа-
                                     - 34 -
          
          
   ет подобно клавише DEL в ВОРДСТАР.Она обеспечивает стирание литера слева  от
   курсора.Клавишей DEL в Т.Б. обеспечивается стирание литеры под курсором.
         
                        
                                 Компилятор
        
        
   Компилятор  Т.Б. является полностью ассемблерным языком,представляющим
   собой высокопроизводительный компилятор.Чтобы вызвать компилятор  ,нажимайте
   С(компилирование) в главном меню.Если гланый файл уже установлен,то, при не-
   обходимости,вы получеете подсказку о вашем желании сохранить текущий рабочий
   файл.Если  это так ,текущий файл сохраняется.Вводится главный файл и начина-
   ется компилирование.
   Компилятор записывает компилирующую программу либо в память(по умолча-
   нию),либо на диск,в зависимости от установки текущей  позиции  комптляции  в
   меню опций компилятора.В процессе этой работы компилятор отличает с прираще-
   нием 20 число строк и операторов,обработанных к этому моменту.Состояние ком-
   пилятора  отображается в окне сообщений.Если обнаруживается ошибка автомати-
   чески вызывается редактор,а курсор позиционируется в ошибочном операторе.Со-
   общение об ошибке отображается в верхней строке редактора.Когда вы перемеща-
   етесь с ошибки ,строка состояния исчезает.Чтобы  восстановить  сообщение  об
   ошибке,нажимайте Ctrl-QW.
   После  успешного  компилирования  в  окне сообщений отображается общее
   число строк и операторов программы ,плюс величина оставшегося в памяти  сво-
   бодного пространства для компилирования.Следует заметить,что величина остав-


   шегося  пространства  будет  больше,когда  вы  компилируете  в файл .EXE или
   .TBC,чем при компилировании в память.
   В трехстрочном обзоре обьектных кодов в шестнадцатиричной системе  пе-
   речисляются  размер кодовых сегментов,стека и зоны данных генерируемой прог-
   раммы.
   Т.Б. работает с привлечением серий команд,вытягиваемых  вверх  и  вниз
   меню,а  также предоставляет четыре окна в среде программирования.В этом раз-
   деле описывается функция каждой команды главного меню и соответствующие опции.
   Чтобы осуществить выбор и вызвать какую-то функцию в главном меню,наж-
   мите клавишу,соответствующей высвечиваемой букве верхнего регистра желаемой
   опции,а затем нажмите Enter.Чтобы выйти из любого меню нажимайте ESC.
   Если вы находитесь в окне редактирования,либо в любом из  меню,нажатие
   ALT  и  первой  буквы  статьи меню будут давать вам доступ к этой статье ме-
   ню.Установка цветов,справочников и других возможностей может выполняться че-
   рез вытягивание вниз меню настройки.Любые сделанные изменения можно  хранить
   в  ТВ-файле  или  непосредственно  в файле TB.EXE в том же справочнике,что и
   система Т.Б..По умолчанию TB-файл есть TBCONFIG.TB,но  через  команду  SETUP
   можно поддерживать несколько  TB-файлов.
   Чтобы изменить размер и/или переместить задействованное окно (отмечен-
   ное  по контуру двойными полосками),нажимайте STROLL LOCK .Затем,удерживая в
   нажатом состоянии клавишу SHIFT и пользуйтесь любой из клавиш -стрелок,пере-
   мещайте и/или образмеривайте окно вправо,влево,вверх вниз и т.д.
   Чувствительная к контексту помощь Т.Б. обеспечивает информацию,имеющую
   отношение к вашему конкретному экрану,независимо от того где вы находитесь в
   системе меню.чтобы получить помощь при любом  уровне  ,нажимайте  F1;нажатие
   ALT-F1 дает вам предыдущий экран помощи.
   Т.Б.  имеет  ряд  клавиш ("горячих клавиш"),которыми вы можете пользо-
   ваться,где бы вы не находились в главном меню.Например ,чтобы  вывести  Т.Б.


   из любого места в системе меню,вы можете нажать ALT-X.Для удобства все горя-
   чие клавиши перечислены в таблице
   -------------------------------------------------------------------
          клавиши                                      функции
   --------------------------------------------------------------------
        F1        обеспечивает чувствительность к контексту помощь
        F2        обеспечивает сохранение вашего файла
        F3        обеспечивает создание нового файла
        F5        фокусируются экраны прогона или редактирования
        F6        переключается задействованное окно
        F7        переход к задействованному окну из системы меню
        SCROLL LOCK образмеривание и перемещение задействованного окна
                                     - 35 -
          
          
   ESC       ваш возврат к главному меню
   ALT-C     компилируется загруженная в данный момент программа
   ALT-E     редактируется загруженная в данный момент программа
   ALT-R     прогоняется загруженная в данный момент программа
   ALT-N     выход из системы Т.Б.
   ALT-F     ваш возврат в файловое меню
   ALT-O     ваш возврат в меню опций
   ALT-D     ваш возврат в меню отладки
   ALT-W     ваш возврат в меню окон
  --------------------------------------------------------------------
        
         Файловая команда
         -----------------
  Команда FILE обеспечивает меню с несколькими опциями
        
         LOAD
         ----
  загрузка позволяетвам выбирать рабочий файл,который можно затем редак-
  тировать,компилировать ,исполнять или хранить.
  После  нажатия L вы получаете подсказку на задание имени файла.Ввод вы
  можете осуществлять одним из следующих способов:
  1.Любое законное имя файла.Если точка и тип файла опускаются,автомати-
  чески добавляется удлинение .BAS Чтобы специфицировать имя файла без удлине-
  ния,вводите его со следущей после имени точкой .
  2.Имя файла из справочника.Если вы останавливаете выбор на поддержании


  своих собственных удлинений,избегайте тех,которые имеют специальное  смысло-
  вое значение в DOS ,таких как .EXE,.COM,.BAT,.BAK.
  Добивайтесь  определенности в выборе уникальных имен файлов,независимо
  от того,используете вы удлинение или нет.Рассмотрим например файлы MYPROG.V1
  и MYPROG.V2 после редактирования и обеспечения  хранения  MYPROG.V1  а  Т.Б.
  производится  переименование первоначальной формы программы в MYPROG.BAKЕсли
  вы будете редактировать затем MYPROG.V2, ее исходная форма тоже будет названа
  MYPROG.BAK,и очевидно сотрется резерв первого файла.
  Когда вы нажимаете клавишу Enter после ввода имени рабочего файла,Т.Б.
  осуществляет поиск файла в справочнике на регистрирующем диске.Если он  не
  найден,создается новый файл.
         NEW
         -------
  Эта  опция обеспечивает стирание имеющегося в настоящее время в редак-
  торе текста и дает файлу имя по умолчанию NONAME.BAS
         SAVE
         ----
  Обеспечивает хранение текущего рабочего файла на диске  старой  версии
  именованного  файла,если  таковая  существует,дается  удлинение BAK.Если ваш
  файл именуется NONAME.BAS и вы пытаетесь сохранить ваш файл ,вы задаете  из-
  менение  на его переименование перед исполнением операции сохранения.Если вы
  просто нажимаете Enter,сохраняется файл,именуемый NONAME.BAS.
         WRITE TO
         --------
  После редактирования для записи текущего редакторского файла  на  диск
  под  новым  именем используется опция записи W.Вам предоставляется подсказка
  для выбора нового имени .
         MAIN FILE
         ----------
  При работе с большими программами вы можете разбить исходную программу
  на управляющие секции.Если вы превышаете литерные  возможности  редактора,вы
  просто  не будете иметь другого выбора.Отдельные части программы храняться и
  редактируются как независимо "включаемые  файлы",но  когда  наступает  время
  компилирования,они собираются в единый блок.
  В  тандеме  с  метаоператорами $INCLUDE(включить) выбор главного файла


  позволяет вам компилировать программы с множеством исходных файлов.
  Исходный  модуль  вы  определяемые  как  главный  файл  с   директива-
  ми$INCLUDEКак  всегда, чтобы редактировать любой модуль программы (даже глав-
  ный модуль),делайте его загруженным в данный момент файлом.
  По получении команды компилирования,Т.Б. осуществляет проверку с целью
                                     - 36 -
          
          
  обнаружить ,не отличается рабочий файл от главного файла.Если он не  отлича-
  ется компилируется рабочий файл.Если он отличается,вы получаете подсказку на
  сохранение  рабочего  файла(если он уже изменен,а затем в память загружается
  главный файл.Если во время компилирования обнаруживается ошибка,файл ,содер-
  жащий ее,загружается таким образом,чтобы его можно было отредактировать.Ког-
  да ошибка уже исправлена и вновь начато компилирование,вы получаете подсказ-
  ку на сохранение отредактированного рабочего файла.Затем повторно загружает-
  ся главный файл.
         DIRECTORY
         ----------
  Для получения перечня справочников,поиск субсправочников  и  изменения
  на лету маски нажимайте D.
         CHANGE DIR(смена справочника)
         -----------------------------
  Команда для смены справочника используется для выбора другого справоч-
  ника.После  нажатия  С вы получите подсказку на задание прохода к справочни-
  кам.Можно задавать любое законное имя  прхода.Описание  других  используемых
  системой справочников см.в разделе "Команды настройки".
         OS SHELL(OS-каркас)
         -------------------
  нажатием О вызывается DOS операционная система;Т.Б. резидентно остает-
  ся в памяти.Управление возвращается в резидентную систему Т.Б. с помощью ко-
  манды EXIT(выход).
         QUIT(уход)
         ----------
  Команда обеспечивает ваш уход из программы Т.Б. в DOS.Если ваш текущий
  файлредактирования был модифицирован,но ен отправлен на хранение,вы получае-
  те соответствущую подсказку .


        
                          Команда редактирования
        
  Команда EDIT (редактирование) обеспечивает вызов встроенного экранного
  редактора с подачей ему для редактирования рабочего файла.(Вы именуете рабо-
  чий  файл  через  команду загрузки в меню файловой команды)Если имя рабочего
  файла не специфицировалось,редактируется NONAME.BAS.
  Чтобы  покинуть  редактор  и  возвратиться  в  главное  менб,нажимайте
  ESC.Ваш исходный текст продолжает отображаться на экране для возврата к нему
  вам достаточно нажать Е.
        
                          Команда прогона
        
  Команда  RUN(прогон)  обеспечивает  исполнение программы,находящейся в
  памяти.Если компилированная программа уже располагается в памяти,а ее источ-
  ник не модифицировался в редакторе с момента последней компиляции или прого-
  на,и никакие опции не применялись,исполнение осуществляется  немедленно.Если
  компилированной  программы  памяти  нет,сначала компилируется результирующая
  программа.Нажатие  Ctrl-Break во время исполнения программы прерывает испол-
  нение если опция KEYBOARD BREAK установлена,а прогоняющая программа осущест-
  вляет ввод/вывод .Если обнаруживается ошибка вы оказываетесь в  редакторе  в
  той точке,где возникла ошибка.В строке состояния редактора появляеися описа-
  ние ошибки.Далее исправляйте вашу ошибку и возвращайтесь  в  вашу  программу
  (перекомпилирование  будет  происходить автоматически).В окне сообщений Т.Б.
  отображает с приращением 20 число обработанных  строк  и  операторов.В  окне
  прогона  отображается  вывод программы.Для фокусировки окна прогона во время
  прогона программы нажимайте ALT-FS.
       
                        Команда компилирования
        
  Команда Compile(компилирование) осуществляет надящейся в данный момент
  в редакторе программы.В результате получается  располагаемая  в  памяти  (по
  умолчанию)  программа  в  .EXE-файле или .TBC-файле(цепочке,в зависимости от
  текущей установки опций в меню команды компилирования.


  Для начала компилирования нажимайте С (или Enter при  позиционировании
  курсора  на  этой опции). Если не специфицируется главный файл ,компилируется
  загружаемый файл.
                                     - 37 -
          
          
  Если выбрано главное меню вы получаете подсказку относительно вашего желания
  хранить текущий рабочий файл(если  файл  в  редакторе  модифицирован)  затем
  главный файл загружается и компилируется.
  По мере компилирования Т.Б. отображает в окне сообщений т число строк и опе-
  раторов,которые уже отработаны.
  Отказ  от  компилирования  осуществляется с помощью команды Ctrl-Break
  .Если обнаруживается ошибка ,вы помещаетесь в редактор в точке возникновения
  ошибки в программе.Описание ошибке появляется в строке состояния редактора .
        
                               Команда опций
        
  Команда Options (опций ) обеспечивает просмотр меню  опций  компилято-
  ра.Эти опции глобальны и обеспечивают управление компилированием в целом,ес-
  ли не преодолеваются внутренними метаоператорами исходной программы.
        
                           
                              COMPILE TO (компилировать в )
        
  Эта   установка  позволяет  компилировать  ваши  программы  в  память,
  .EXE-файл,.TBC-файл .Для просмотра 6разворачиваемого вверх меню,нажимайте  С
  и клавишу ввода и затем пользуйтесь клавишами стрелками или нажимайте клави-
  шу которая соответствует высвечиваемой букве верхнего регистра ,для осущест-
  вления вашего выбора.
  По  умолчанию ,компилирование в память,дает лучшие условия для отладки
  и тектирования программ,так оно дает самый быстрый результат.
  Установка .EXE-файла вызывает создание  компилятором  программ,которые
  могут   прогоняться   из   операционной   системы(программа   с  расширением
  .EXE).Обычно этот режим выбирается после того,как программа уже отлажена,хо-
  тя из DOS могут быть тестированы  только  определенные  возможности  (напри-
  мер,создание цепочки).


  Установка файла цепочки дает файлы (с расширением .TBC) подходящие для
  CHAINING  (образование  цепочки) или RUNNING (прогона ) из создаваемого Т.Б.
  .EXE файла.Эти файлы не включают в  себя  библиотечные  подпрограммы,поэтому
  они не могут прогоняться независимо.
  Т.Б.  имеет несколько переключателей генерирования кодов,доступных че-
  рез меню опций.По умолчанию каждый переключатель выключен идает  поумолчанию
  самые быстрые и самые маленькие программы из числа возможных.Вы можете выби-
  рать  для  включения  во время разработкиваших программ или в стадии отладки
  некоторые или все эти переключатели.Чтобы выбрать любую из опций,используйте
  клавиши стрелки или нажимайте букву верхнего регистра меню.Эти  опции  могут
  быть сохранены для файла конфигурации через меню настройки.
  Вы можете тумблерно включать и выключать следущие опции,
   нажимая клавишу ввода при позиционированном на желаемой строке курсора:
         .требуется 8087
         .разрыв клавиатуры
         .границы
         .переполнение
         .тестирование стека
        
      8087 REGUIRED(требуется 8087)
      -----------------------------
  Включайте  эту  опцию,когда  используете чип 8087.С помощью этой опции
  Т.Б. генерирует лучший из возможных кодов для операций с плавающей точкой, и
  быстрый и компактный ,с использованием внутристрочных операторов 8087.Недос-
  таток состоит в том ,что генерированная с применением этой  опции  программа
  не сможет прогоняться на машине без чипа 8087.
  При выключенной опции 8087 (режим умолчания) программы могут проходить
  обоими  путями:т.е.,если  имеется 8087,программа будет его использовать,если
  нет,программой будет использоваться для выполнения того же  самого  (хотя  и
  медленнее) стандартное программное обеспечение.
        
      KEYBOARD BREAK (прерывание с клавиатуры)
      ----------------------------------------
  Включайте  эту опцию ,если вы желаете прервать программу с помощью ко-
  манды Ctrl-Break.Следует заметить,что это применимо только к Ctrl-Break,а не


                                     - 38 -
          
          
  к  Ctrl-C.Имейте  ввиду   ,что   прерывание   программы   с   использованием
  Ctrl-Break является окончательным-нет никакого способа продолжить исполнение
  позднее.
  Важно  также заметить,Ctrl-Break оказывает воздействие,когда программа
  осуществляет вывод текста( не графики) на экран или печатающее устройство,ли-
  бо когда выполняется клавиатурный ввод.Это означает,что вы не можете  преры-
  вать последовательности,не являющиеся вводом/выводом;например:
        TIGHTLOOP:GOTO TIGHLOOP (связанный цикл)
  прогоняется  до  тех пор,пока вы не осуществите повторную перезагрузку
  системы.(Однако ,чтобы обезопасить вас от таких проблем связанного  цикла,мы
  оборудовали  Т.Б. опцией авто-хранения при редактировании.Другими словами,вы
  можете устанавливать эту опцию на включение таким образом,что если требуется
  выйти из программы посредством повторного запуска ,вы еще  сможете  распоря-
  диться сохранить вашу программу.Обращайтесь к "меню настройки") .
  Вы  можете  использовать  следущие опции для отслеживания определенных
  типов ошибок периода прогона.Обычно,когда программа находится в стадии  раз-
  работки,вы  желали бы иметь включенными эти опции,чтобы избавится от некото-
  рых затруднений.когда ваша программа отлажена ,выключайте эти опции для  ге-
  нерирования  окончательной  версии,т.к.  она  становиться  быстрее и требует
  меньше памяти.
        
         BOUNDS (границы)
         ---------------
  Во включенном состоянии эта опция вызывает генерирование  компилятором
  проверки границ индексации массивов.Код проверки построчной индексации обес-
  печивает уверенность в том,что какой-то индекс попадает под заданный размер
  массива,в котором должен использоваться еще до считывания или записи указан-
  ного элемента .При включении проверки границ,проходит сообщение об ошибке по
  диапазону  индексов(ошибка  9),когда  ваша программа пыталась исползовать


  слишком большой или слишком маленький для данного  массива  подстрочный  ин-
  декс.Рассмотрим ,например ,эту программу:
         dim myarray(100)
         x=114
         y:=myarray(x)
  В  массиве нет 114-го элемента,хотя это грубая ошибка не отлавливается
  компилятором.Однако,если программа компилируется с включенным  тестированием
  границ,во время исполнения третьей строки появляется ошибка диапазона подст-
  рочных индексов.
  Если  вы прогоняете програму при выключенной проверке границ,сообщения
  об ошибке нет,и значение загружается в y,несмотря на то ,что оно попадает  в
  память   на  несколько  байтов  за  пределами  последнего  элемента  массива
  myarray.При записи в несуществующий элемент массива ситуация  еще  хуже,пос-
  кольку  память ,используемая для хранения бог знает чего,безмолвно перезапи-
  сывается.
  Следует отметить ,что компилятор всегда сообщает  подстрочные  индексы
  констант  вне  диапазона.Следущая программа будет не компилироваться независимо
  от установки переключателя проверки границ:
         DIM MYARRAY(100)
         Y=MYARRAY(114)
                                                       
         OVERFLOW(переполнение)
         ----------------------
  Переполнение возникает,когда  какая-то  арифметическая  операция  дает
  значение   вне   пределов  возможностей  хранения  целых  чисел  (-32768  до
  32767).Например,кодовый фрагмент
         X%=22555
         X%=X%+19000
  переполняет ограничение +32767 для целых переменных.Если вы компилиру-
  ете эту программу с включенной  проверкой  переполнения,генерируется  ошибка
  переполнения  периода прогона.Однако при выключенной проверке X% назначается
  ненормальное значение и исполнение продолжается,как будто ничего  не  случи-
  лось(что оставляет вашу программу непригодной).
    Остерегайтесь промежуточных переполнений:
         Y%=200000;X%=Y%
         Z=(Y%+X%)*2.1
                                     - 39 -
          
          
  Хотя  окончательный результат выражения (X%+Y%)*2.1 легко укладывается


  в формат с плавающей точкой единичной точности,переполнение  происходит  при
  сложении  X%  и Y% стандартными программами отработки целых чисел еще до то-
  го,как результат сложения преобразуется к единичной точности и умножается на
  2.1.Чтобы вынудить выполнение операций над целыми в форме с плавающей  запя-
  той,исползуйте  функции CSNC и CDBL.Следует заметить,что проверка переполне-
  ния осуществляется для целых, целых и любого из двух типов чисел с плаваю
  щей точкой;однако для целых имеются некоторые исключения(например,расчеты ре-
   гистров).
        
         STACK TEST (тестирование стека)
         -------------------------------
  Включение этого переключателя вызывает генерирование Т.Б. кода  ,кото-
  рый  обеспечивает  проверку стековых противоречий по входу в каждую подпрог-
  рамму,функцию или процедуру.Если вы ожидаете,что ваши программы выбегают  за
  строковое  пространство,осуществляйте  компилирование с включением этого пе-
  реключателя.Для размещения большого стекового пространства используйте мета-
  оператор $STACK.
  Последними двумя входами в меню опций являются строка параметров с ма-
  таоператорами.
        
         PARAMETER LINE (строка параметров)
         ----------------------------------
  Выбор  Р вызывает выдачу Т.Б. подсказки на задание строки,которыю бу-
  дет возвращать,когда программа прогоняется в  следующий  раз.Это  позволяет
  вам моделировать информацию командной строки в помощь при отладке из любого
  места  Т.Б..Нажатие  Enter  после ввода вашей строки,и затем ESC возвращает
  вас в главное меню.
        
         METASTATEMENT (метаопределения)
         -------------------------------
  Последняя опция из опций имеет собственное  меню.Вы  можете  выбирать
  любую  опцию,нажимая  S(стек),М(музыка)  или  С(коммуникации);или вы можете
  воспользоваться клавишами-стрелками и нажимать Enter ,когда курсор позицио-
  нируется на желаемой опции,отметим,что ваша исходная программа может  прео-


  долеть эти установки.
 .Размер  стека  используется  для  переопределения  размера стека.По
  умолчанию он состовляет 1024 десятичных или 400  шестнадцатиричных  байтов
  (1  параграф  есть 16 байтов).Когда вы нажимаете S,появляется подсказка на
  задание нового размера стека в интервале от 400 до 7EFE  шестнадцатиричных
  байтов.(см.метаоператор $STACK в главе 5 "Словарь-вправочник Т.Б.").
 .Буфер  музыки есть размер основного музыкального буфера .Если вы не
  пользуетесь SOUND или PLAY,то ваш результирующий код будет меньше когда вы
  установите этот буфер в ноль.Минимум есть ноль;максимум-4096 байтов.Следу-
  ет заметить,что 8 нот равны 1 байту;по умолчанию 32 ноты - 256 байтов.
 .Коммуникации относяться к буферу-приемнику для каждого коммуникаци-
  онного входа (в некоторых программах вы можете  использовать  метаоператор
  $COMN  для  изменения  размещения  любого  буфера) минимум есть 0;максимум
  -32767;по умолчанию 256 байтов.
        
        
                             Команда настройки
        
  Выбирайте SETUP(настройку),когда вы желаете инспектировать любые па-
  раметры настройки,их изменять или постоянно регистрировать текущую  конфи-
  гурацию в ТВ-файле.Меню настройки показано на рис 3-6.
         COLORS(цвета)
         -------------
  Используйте этот вход для определения цветов одной или более сис-
  темных рамок,меню или окон.Нажимайте С или Enter для ввода меню и выби-
  райте WINDOWS(окна),MENUS(меню) или SYSTEM BOXES ситемные рамки).В помощь
  вам для определения изменений выбранного окна ,меню или рамки имеется три
  дополнительных разворачивающихся вверх меню.
  Как ,например,если вы выбираете меню из первого разворачиваемого
  вверх меню,то можете сделать выбор определить главное -вытягиваемое вниз
                                     - 40 -
          
          
  меню,первое,второе или третье разворачиваемое вверх.Если вы выбираете
  главное,появляются другие разворачиваемые вверх,чтобы вы могли определить


  как изменить ваш выбор.Вашими опциями являются TITLE(назва-
  ние),BORDER(бордюр),NORMAL TEXT(нормальный текст),FIRST LETTER (первая
  буква),SELECTION BAR(полоска выбора) и RESTORE DEFANLTS (восстановление
  по умолчанию).
  Если вы уже приняли решение отом,в каком аспекте изменить меню,ска-
  жем,например,вы выбрали полоску выбора ;на вашем экране появляется рамка
  для выбора палитры.Для выбора желаемого цвета из цветовой гаммы пользуй-
  тесь клавишами-стрелками.Для осуществления вашего выбора нажимайте
  Enter,а затем ESC .Выбранное вами меню окно отражает текущее цветовое
  значение.
         DIRECTORIES(справочники)
         ------------------------
  Входами INCLUDE(включаемый),EXECNTABLE(исполнительный) и TURBO
  (турбо) определяются дисковвод и проход для каждого из трех справочни-
  ков,используемых системой.справочник умолчаний имеется всюду,где бы вы ни
  были в момент запуска вами Т.Б..
  Когда выбирается какой-либо справочник ,вы получаете подсказку на
  задание дисковвода и прохода.Вводите с клавиатуры дисковвод и/или про-
  ход,нажимайте Enter и Т.Б. примет вашу спецификацию.Если вы изменяете
  ваши соображения относительно того,какой справочник выбрать и желаете
  повторить выбор,перед тем как покинуть системную рамку и до нажатия кла-
  виши ввода можно нажать ESC и вы возвращаетесь к выбору варианта справоч-
  ника.
  Включаемые справочники используются для файлов ,которые содержат
  директиву компилятора включить.Вы можете специфицировать множество спра-
  вочников,отделяя их друг от друга двоеточиями.
  Исполнительный справочник используется для файлов .EXE и .TBC,гене-
  рируемых системой Т.Б.,а также для файлов ,создаваемых компилятором вре-
  менно.Можно каждый раз выбирать только один такой справочник.
  Турбо-справочник используется самой системой Т.Б.;т.е. для систем-
  ного файла TB.EXE,файлов конфигураций и файлов помощи(TBHELP.TBH). И этот
  справочник каждый раз можно выбирать только один.
         MISCELLANEONS(разное)


         ---------------------
  Нажатием М вводимое разворачиваемое вверх меню с двумя специальными
  параметрами:
 .AUTO SAVE EDIT(редактирование с авто-хранением)Тумблерно включайте
  эту опцию,когда желаете автоматически отправлять на хранение ваш текущий
  рабочий файл перед прогоном программы.
         .BACKUP SOURSE FILES(резервирование исходных файлов)
         ----------------------------------------------------
  При включении этой опции ваши файлы будут автоматически резервиро-
  ваться .Выключайте,если не желаете создавать резервный файл каждый
  раз,когда реализуете хранение.
  Все компиляторные опции и установочные значения загружаются и храняться в
  файле конфигурации(если не специфицируете TB.EXE).Это полезно для инвели-
  ровки среды разработки программ различными способами.Например,при отладке
  программ вы можете пожелать включить все компиляторные опции,а также рас-
  ширить окно отслеживания и включить флаг глобального слежения.Другой об-
  разчик конфигурации может потребоваться при компилировании конечной про-
  дукции без видимых окон отслеживания или прогона и при всех выключенных
  опциях.
  Следущие опции дают вам возможность загружать и хранить ,соответст-
  венно новую настройку конфигурации.
    LOAD OPTIONS/WINDOW/SETUP(загрузить опции/окно/настройку)
   ---------------------------------------------------------
  Нажимайте L для загрузки TB-файла справочника и повторно устанавли-
  вайте систему в соответствии с содержащимися в нем параметрами.
    SAVE OPTIONS/WINDOW/SETUP(хранить опции/окно/настройку)
   -------------------------------------------------------
  Нажатие S обеспечивает сохранение текущей настройки в TB-файле тур-
  бо-справочника.Кофигурации может быть дано любое имя,но имя по умолча-
  нию(TBCONFIG.TB)используется автоматически,когда Т.Б. запускается впер-
                                     - 41 -
          
          
  вые.Вы также можете хранить справочник конфигураций в файле TB.EXE.Однако


  ,если вы это делаете , вам выдается подсказка относительно того не хотите
  ли вы изменить оригинальный файл TB.EXE.
        
                               
                               Команда окон
        
  Как говорилось в разделе о главном меню,вы можете изменять размер
  любого задействованного окна и перемещать его ,нажимая STROLL LOCK,а за-
  тем удерживать клавишу SHIFT в нажатом состоянии и использовать любую из
  клавиш-стрелок для перемещения окна в желаемом направлении.По умолчанию
  все окна задействованы,пока вы не выбираете их закрытие.
  Теперь нажмите W для ввода в действие вытягиваемого вниз меню ко-
  манд окон.
         OPEN(открыть)
         -------------
  Нажимайте О и выбирайте из разворачиваемого вверх меню
  EDIT,RUN(прогон),MESSAGE(сообщение) или TRACE (отслеживание).Команда отк-
  рыть делает выбранное окно "задействованным".Это означает,что если окно
  ранее было закрыто,то оно создается, и во всех случаях"открытое" окно бу-
  дет выводиться в верхнюю часть экрана.Теперь все другие команды окон воз-
  действуют на задействованное окно.
         
         CLOSE(закрыть)
         -------------
  командой закрыть выбранное в данный момент окно скрывается,хотя в
  него еще может продолжаться запись.
         NEXT(следущее)
         -------------
  опция следующего позволяет вам выбирать другое окно как задейство-
  ванное без необходимости возврата к опции открыть для выбора нового окна.
  Повторяя нажатие NEXT,можно реализовать циклический проход по окнам.При
  нахождении в окне или главном меню так же как опция следующее работает
  клавиша F6.
         GOTO(идти к)
         -------------
 После открывания окна используйте команду идти к для ввода этого
 окна без необходимости возврата в главное меню.
         STACK(стек)
         ------------
  Используйте опцию стек для расположения всех открытых окон слоями
  максимально возожного размера.Нажатием F6 последний экран в стеке выво-


  диться в верхнюю часть экрана.
         TILE(черепица)
         -------------
  Нажимайте I, чтобы добиться занятия всеми задействованными окнами
 равных долей экрана.Задействованное окно включается клавишей F6.
        ZOOM(фокусировать)
         -----------------
 Выбором опции фокусирования (или F5)осуществляется расширение выб-
 ранного окна на полный экран;однако эта опция работает только с окнами
 прогона и редактирования.Чтобы снова получить вашу первоначальную наст-
 ройку экрана,вновь включайте фокусировку,работающую как тумблер.
        
        
                         Команды откладки
        
 Возможности откладки предоставляются в виде двух цепных опций из их
 вытягиваемого вниз меню:TRAGE(отслеживание) и RUN - TIME ERROR(ошибка пе-
 риода прогона).
         TRACE(отслеживание)
         -------------------
  отслеживание позволяет глобально устанавливать отслеживание прог-
  рам.Этот переключатель может преодолевать вставляемыми заявлениями TRON и
  TROFF.В этом окне отображаются метки заявлений,номера строк,имена продце-
                                     - 42 -
          
          
  дур и функций.
  При прогоне в режиме отслеживания пользуйтесь командой ALT - F9.На-
  жатие ALT-F10дает пошаговый переход к следующему номеру строки,метке и тд.
         RUM-TIME ERROR(ошибка периода прогона)
  -------------------------------------
 эта опция используется,главным образом,для нахождения ошибок,кото-
 рые возникают в файлах,ехе или твс(отдельные программы);в этих случаях не
 дается ни каких сообщений.Если вы прогоняете программу под управлением
 системы турбо-бейсика,все описание ниже дается автомвтически.
         Эта функция возбуждается нахождением R или клавиши ввода
                                                                          
         TRACE(отслеживание)
         -------------------
  Отслеживание  позволяет  глобально устанавливать отслеживание прог-
  рамм.Этот переключатель  может  преодолеваться  вставляемыми  операторами


  TRON и TROFF. В этом окне отображаются метки операторов,номера строк и имена
  процедур и функций.
  При  прогоне в режиме отслеживания для переключения вашей программы
  между отслеживанием и  исполнением  пользуйтесь  командой  Alt-F9.Нажатие
  Alt-F10 дает пошаговый переход к следушему номеру строки,метке и т.д.
        
        RUN-TIME ERROR (ошибка периода прогона)
         ---------------------------------------
  Эта  опция используется главным образом для нахождения ошибок,кото-
  рые возникают в файлах .EXE или .TBC;в этих случаях не дается никаких со-
  общений.Если вы прогоняете программу под  управлением  Т.Б.,все  описания
  ниже даются автоматически.
  Эта  функция возбуждается нажатием R и клавиши ввода.Затем вы полу-
  чаете запрос на обеспечение значения прграммного счетчика.Далее Т.Б.  оп-
  ределяет  соответствующую точку в исходном коде и устанавливает курсор на
  оператор с погрешностью.
  Когда происходит ошибка периода прогона,Т.Б. сообщает вам тип ошиб-
  ки (всегда в  числовой  форме  и  словами,если  запуск  осуществлялся  из
  Т.Б.),а также значения из программного счетчика процессора в момент ошибки.
  После  компилирования  Т.Б.  в состоянии вычислить точку в исходной
  программе,соответствующую адресу периода прогона в обектной программе,со-
  ответствующую  адресу  периода  прогона  в  обьектной  программе.Рассмот-
  рим,например,программу в TEST.BAS:
         X=256
         PRINT SHRS(X)
  Хотя эта программа синтаксически правильна и поэтому будет компили-
  роваться  успешно,когда система попытается напечатать литеру со значением
  256 кода ASCII,будет генерироваться ошибка периода прогона:
  ERROR S ILLEGAL FUNCTION CALL OT PGM-OTR:29(незаконный вызов  функ-
  ции при значении 29 программного счетчика)
  Опцией  ошибка  периода  прогона это значение программного счетчика
  используется для нахождения оператора ,которое вызвало ошибку.
         

                                                                           


                           ГЛАВА 4
        
                      ТУРБО-БЕЙСИК ЯЗЫК
        
                      Структура программы
     
 Программы  на  Т.Б.  состоят  из  одной или более строк исходного текс-
 та,каждая из которых имеет следующий формат:
      [номер строки]оператор[:оператор]...['коментарий]
      или,
      метка:
      или,
      метаоператор
 Номер строки есть целое в диапазоне от 0 до  65535,которое  опционально
 может идентифицировать строки программы.Т.Б. относится не строго к установке
 номеров  строк.Они свободно могут перемешиваться с метками,использоваться в
 одних частях программы и не использоваться в других.По существу,им нет  не-
 обходимости  быть в числовой последовательноси,хотя ни одна строка не может
 иметь и метку и номер.По сути номера строк являются метками.
 Операторы -строительные блоки,образующие программы.В Т.Б. имеется приб-
 лизительно 100 типов операторов.Строка может не  содержать  вовсе,содержать
 одно или несколько операторов,разделяемых двоеточием.
 Все представленное ниже есть законные строки Т.Б.:
      START:                                       'только метка
      10                                           'только номер строки
      $INCLUDE "CONST.TBS"                         'метазаявление
      20 A=A+1                                     'номер строки плюс оператор
      A=A+1:B=B+1                                  'два оператора
      30 A=A+1:B=B+;:C=A+B 'номер строки и три оператора
 Ширина  в  249 колонок Т.Б. есть единственное ограничение,накладываемое
 на число операторов,которые могут появляться в  одной  строке.Следует,одна-
  ко,знать,что  некоторые  школы  программирования придерживаются правила,что
  устанавливать более одного оператора в строке,если это не требуется особен-
  ностями синтаксической конструкции(например,IF/THEN/ELSE),плохая практика.В
  отличии от интерпретаторного Бейсика,Т.Б. не накладывает ограничений перио-
  да прогона за щедро расставленные в ваших программах  пробелы  и  коммента-


  рии,они просто игнорируются компилятором.
  Все  школы придерживаются мнения, что плохая форма для записи строк,если
  ее ширина больше 80-колонной ширины окна редактора (несмотря на возможности
  горизонтальной скрутки).Перейдете за 80 колонок и вы ничего уже не  сможете
  увидеть одновременно.Получить аккуратную распечатку тоже не удается.
  В  ситуациях,где синтаксические требования вынуждают вас строить строку
  длинее 80 литер,ставьте литеру подчеркивания (_) в конце строки.
  Это приведет к рассмотрению т.Б. следующей строки как продолжение  пер-
  вой.Эта строка также может продолжаться .Например:
   FIELD  $1,AS  ADDRESS 1$,30 AS ADDRESS 2$,-15 AS CITY$,2 AS STATE$,5 AS_
   2IP$,-30 AS COMMENTS$
  Как только к этому приступит компилятор,весь текст окажется одной боль-
  шой строкой начинающейся с FIELD и оканчивающийся COMMENTS$без  литер  под-
  черкивания.
  Комментарием  может быть любой текст,добавляемый в конце строки и отде-
  ляемый от самой программы единичной кавыукой ('). Единичная  кавычка  может
  использоваться  вместо  REM для отделения коментариев от операторов в такой
  строке,если она не находится в конце оператора DATA(который  может  принять
  комментарий  за  часть строки).В отличии от REM ,нет необходимости отделять
  отмеченные одной ковычкой комментарий от соответствующих операторов  с  по-
  мощью двоеточия.Например,следущие строки для компилятора равнозначны:
      AREA=RADINS 2*3.14159 'вычислить площадь
      AREA=RADINS 2*3.14159 :REMвычислить площадь
  Метка  должна появляться в строке сама по себе(хотя за ней может следо-
  вать комментарий) и служить для идентификации оператора,следущего непосред-
  ственно за ней.Метки должны начинаться с буквы и могут содержать любое чис-
  ло букв и цифр.Регистр не имеет значения:THISLABEL и THISLABEL  эквивалент-
  ны.За  меткой должно следовать двоеточие,однако операторы,в которых имеется
                                     - 44 -
          
          
  ссылка на метку (например,GOSUB),не должны включать двоеточие.


      Примеры:
  SORTSUBROUTINE:
  EXITPOINT: A=A+1          'незаконно ,метка должна быть в строке одна
  SORTINVOICES:
  GOSUB SORTINVOICES        'ссылочная метка
  $метаоператоры-это  операторы,которые  работают  на  другом  уровне,чем
  стандартные  операторы.Они независимые директивы компилятора  и начинаются со
  знака доллара ($) . Стандартные операторы управляют  компилятором  в  период
  прогона;метаоператоры,подобно выбору в меню опций ,управляют компилятором в
  период прогона компилирования.
  Примером  метаоператора  является  $INCLUDE,которое  вызывает включение
  компилятором содержимого другого файла в  точке,указанной  в  текущем  фай-
  ле.Следует заметить,что метаоператоры Т.Б. не появляются в REMARKS(комента-
  риях  )подобно  тому,как  это характерно некоторым другим бейсик-компилято-
  рам.В одной строке может быть один метаоператор.
     
     
         Литерный набор Турбо-Бейсика
     
     
  Т.Б. в чем-то схож со строительным набором для составления  программ.Он
  обеспечивает  вас набором документальных элементов языка(резервными словами
  и символами),которые можно соединять  вместе  бесчисленными  способами  для
  создания любого мыслимого программного обеспечения машины.
  Буквы  от  А  до  Z  и цифры от 0 до 9 можно использовать в формирующих
  идентификаторах(именах меток,переменных,процедур и функций).
  Числа от 0 до 9;символы .,+ и =; а также буквы Е,D  можно  использовать
  при формировании числовых констант.
  Следущие символы в Т.Б. имеют специальное смысловое значение:
  -----------------------------------------------------------------------
   символы                           описание/функция
  -----------------------------------------------------------------------
      =                знак равенства(оператор назначения,оператор отношения)
      +                знак плюс(оператор сложения и сцепления строк)
      -                знак минус (оператор вычитания и отрицания)
      *                звездочка (оператор умножения)


      /                косая черта(оператор деления)
      \                обратная косая черта (оператор деления нацело)
      ^                знак вставки(оператор возведения в степень)
      %                знак процента(литера оператора целого типа)
      &                амперсанд ( литера оператора типа длинного целого и
                       дескриптор недесятичной базы)
      !                восклицательный знак (литера оператора типа
                       единичной точности
      #                знак номера(литера оператора типа двойной точности)
      $                знак доллара(литера оператора строчного
                       типа,префикс метаоператора)
      ()               круглые скобки(аргументы функций/процедур,
                       массивы,приоритетность в выражениях)
      []               квадратные скобки(законны только для массивов)
                       пробел(разделитель)
      ,                запятая(общецелевой разделитель)
      .                точка(десятичная точка,разделитель в удлинении имени
                       файла
      '                единичная ковычка(ограничитель примечаний)
      ;                точка с запятой(общецелевой разграничитель)
      :                двоеточие(разграничитель операторов)
      ?                знак вопроса (замена PRINT (печать))
      >                меньше чем(оператор отношения)
      <                больше чем(оператор отношения)
      "                двойная кавычка(строчный разграничитель)
      _                знак подчеркивания(литера продолжения строки)
 ----------------------------------------------------------------------
 В  Т.Б. резервируется использование определенных слов для заранее опре-
                                     - 45 -
          
          
  деленных синтаксических целей.Эти резервированные слова не могут применять-
  ся в качестве меток,переменных,именованных констант или  процедур  и  функ-
  ций,хотя ваши идентификаторы могут содержать их.


  Например,ENDявляется  незаконным именем переменной,поскольку оно всту-
  пает в противоречие с синтаксисом функций,определяемых пользователем.
  попытки использовать резервированное слово  в  качестве  тдентификатора
  дают синтаксическую ошибку периода прогона компилирования.
    таблица 4-1.Резервированные слова Турбо-Бейсика
  ---------------------------------------------------------------------
       слово                        описание
  ---------------------------------------------------------------------
      $COM                      коммуникация 1(метаоператор)
      $COM2                     коммуникация 2(метаоператор)
      $DEBUG                    отладка(метаоператор)
      $DYNAMIC                  динамический(метаоператор)
      $ELSE                     иначе(метаоператор)
      $ENDIF                    конец если(метаоператор)
      $EVENT                    событие(метаоператор)
      $IF                       если (метаоператор)
      $INCLUDE                  включать(метаоператор)
      $INLINE                   в строке(метаоператор)
      $LIST                     перечень(метаоператор0
      $OPTIONS                  опция(метаоператор)
      $SEGMENT                  сегмент(метаоператор)
      $SOUND                    звук(метаоператор)
      $STACK                    стек(метаоператор)
      $STATIC                   статический(метаоператор)
      ABC                       авсолютное значение(функция)
      ABSOLUTE                  абсолютный (ключевое слово)
      AND                       и(логическое отношение)
      APPEND                    прибавить
      AS                        переменная файла
      ASC                       код ASCII(функция)
      AT
      ATN                       арктангенс(функция)
      BASE                      база(атрибут)
      BEEP                      звуковой сигнал(оператор)
      BIN$                      двоичный эквивалент числа(функция)
      BINARY                    двоичный (ключевое слово)


      BLOAD                     загрузка в сохраняемую память(оператор)
      BSAVE                     диапазон памяти на диске(оператор)
      CALL                      вызов(оператор)
      CASE                      регистр(ключевое слово)
      CDBL                      преобразование в двоичную точность
      CEIL                      наименьшее целое(функция)
      CHAIN                     цепочка(оператор)
      CHDIR                     смена справочника(оператор)
      CHR$                      символ на экран
      CINT
      CIRCLE                    окружность(оператор)
      CLEAR                     очистить(оператор)
      CLNG                      преобразовать в длинное целое(функция)
      CLOSE                     закрыть(оператор)
      CLS                       очистить(оператор)
      COLOR                     цвет(оператор)
      COM                       отслеживание коммуникации(оператор)
      COMMAND$                  командная строка(функция)
      COMMON                    общие переменные(оператор)
      COS                       косинус(оператор)
      CSNS                      преобразование в единичную точность(функция)
      CSRLIN                    позиция курсора по вертикали(функция)
      CVD                       !
      SVI                       !преобразование строчных произвольного
                                !файла в числовую форму (функция)
      CVL                       !
                                     - 46 -
          
          
      CVMD                        !преобр.строчных МИКРОСОФТв числовую форму
      CVMS                        !(функция)
      DATA                      данные(оператор)
      DATE$                     дата (системная переменная)
      DECR                      сбрасывание(оператор)
      DEF                       определение(оператор)
      DEFDBL                    !
      DEFINT                    !оператор типа идентификатора переменной
      DEFLNG                    ! по умолчанию(двойная точность,целое,


      DEFSNG                    !длинное целое,единичная точность,строка,
      DEFSTR                    !соответственно)
      DELAY                     задержка(оператор)
      DIM                       образмерить массив(оператор)
      DO                        исполнять цикл(оператор)
      DRAW                      чертить(оператор)
      DYNAMIC                   динамический(атрибут)
      ELSE                      иначе(ключевое слово)
      ELSEIF                    иначе если(ключевое слово)
      END                       конец(оепратор0
      ENDNEM                    адрес конца адреса
      ENVIRON                   модифицировать информацию в таблице
                     среды(оператор)
      ENVIRON$                  восстановление нормативов таблицы среды(функция)
      EOF                       конец файла (функция)
      EQV                       равно(отношение)
      ERADR                     адрес последней ошибки(функция)
      ERASE                     стереть динам. массив(оператор)
      ERDEV                     !информация драйвера устройства(функция)
      ERDEV$                    !
      ERL                         !строка и код последней ошибки(функция)
      ERR                         !
      ERROR                     ошибка(оператор)
      EXIT                      выход(оператор)
      EXP10                     !
      EXP2                      !експонента (Е,2,10)(функция)
      FIELD                     !
      FILES                     переменная поля (оператор0
      FIX                       усечение до целого(функция)
      FN                        функция (ключевое поле)
      FOR                       для(оператор цикла)
      FRE                       свободная память (функция)
      GET                       считать запись из произвольного файла(оператор)
      GET$                      считать графику с экрана(оператор),строку
                     из двоичного массива(функция)
      GOSUB                     идти к подпрограмме(оператор)


      GOTO                      идти к(оператор)
      HEX$                      преобразовать в шестнадцатиричный(функция)
      IF                        если (оператор)
      IMP
      INCR                      приращение(оператор)
      INKEY$                    считать клавиатуру(функция)
      INLINE                    в строке(ключевое слово)
      INP                       считать с входного устройства(функция)
      INPUT                     ввести(оператор)
      INPUT#                    загрузить из последовательного файла(оператор)
      INPUT$                    считать определенное число литер(функция)
      INSTAT                    состояние клавиатуры(функция)
      INSTR                     поиск по строке(функция)
      INT                       преобразование к целому(функция)
      INTERRUPT                 прерывание(ключевое слово)
      IOCTL                     !коммуникация с драйвером устройства
      IOCTL$                    !
      KEY                       клавиша(оператор)
      KILL                      стереть файл(оператор)
      LBOUND                    нижняя граница(функция)
                                     - 47 -
          
          
      LCASE$                    только нижний регистр(функция)
      LEFT$                     левые литеры(функция)
      LEN                       длина строки(функция)
      LET                       присвоить значение(оператор)
      LINE                      линия/строка
      LIST                      список (ключевое слово)
      LOC                       позиция в файле(функция)
      LOCAL                     локальная переменная(оператор)
      LOF                       длина файла(функция)
      LOG                       !логарифм(Е,10,2)(функция)
      LOG10                     !
      LOG2                      !
      LOOP                      конец цикла(оператор)
      LPOS                      позиция буфера принтера(фукция)
      LPRINT                    строчная печать(оператор0


      LPRINT#
      LSET                      данные в буфер произвольного файла(оператор)
      LOCATE                    позиционировать курсор(оператор)
      MEMSET                    верхний предел памяти(оператор)
      MID$                      литерная строка(функция),замена
                 строки(оператор)
      MKDIR                     субсправочник(оператор)
      MKD$                      !
      MKI$                      !преобразование чисел в строки (функция)
      MKL$                      !
      MKMD$                     !
      MKMS$                     !
      MKS$                     преобразование единичной точности в строку(функ.)
      MOD
      MTIMER                    микротаймер(функция и оператор)
      NAME                      имя файла(оепратор)
      NEXT                      следующий(оператор цикла)
      NOT                       не (логическое отношение)
      OCT$                      восьмеричное представление(функция)
      OFF                       выключить (ключевое слово)
      ON                        включить(ключевое слово)
      OPEN                      открыть(оператор0
      OPTION                    опция
      OR                        или (логическое отношение)
      OUT                       запись на выходное устройство(оператор0
      OUTPUT                    вывод
      PAINT                     окрасить(оператор)
      PALETTE                   !цветовая палитра(оператор0
      PALETTE USING             !
      PEEK                      байт из ячейки памяти(функция)
      PEN                       световое перо(функция/оператор)
      PLAY                      игра(функция/оператор0
      PMAP                      преобразование координат(функция)
      POINT                     точка(функция)
      POXE                      запись байта(оператор)
      POS                       позиция курсора(функция)
      PRESET                    установка точки(оператор)
      PRINT                     данные на экран(оператор)


      PRINT#                    запись в файл(оепратор)
      PSET                      точка на экран(оператор)
      PUT                       запись в произвольный файл(оператор0
      PUT$                      запись в двоичный файл(функция0
      RANDOM                    произвольный(ключевое слово)
      RANDOMIZE                 случайные числа(оператор)
      READ                      загрузка переменных(оператор0
      REG                       регистры(функция и оператор)
      REM                       примечания(оператор)
      RESET                     повторная установка(оператор)
      RESTORE                   восстановление(оператор)
      RESUME                    возобновление(оператор0
                                     - 48 -
          
          
      RETURN                    возврат(оператор)
      RIGHT$                    правые символы(функция)
      RMDIR                     удаление справочника(оператор9
      RND                       случайное число(функция)
      RSET                      помещение строки в буфер(оператор0
      RUN                       прогон(оператор)
      SAVE                      хранить(ключевое слово)
      SCREEN                    экран(функ./оператор)
      SEEK                      позиция в двоичном файле(оператор)
      SEG                       сегмент(кл.слово)
      SELECT                    выбор (оператор)
      SERVISE                   сервисная(кл.слово)
      SGN                       знак(функция)
      SHARED                    разделение переменных(оператор)
      SHELL                     "детский процесс"
      SIN                       синус(функция)
      SOUND                     звук(оператор0
      SPACE$                    все пробелы(функция0
      SPC                       пропукс пробелами(функция)
      SQR                       квадратный корень(функция)
      STATIC                    статические переменные(оператор)
      STEP                      шаг (кл.слово)


      STICK                     положение ручки управления(функция)
      STOP                      останов программы(оператор)
      STR$                      строчный эквивалент числа(функция)
      STRIG                     кнопки управления(функ./оператор0
      SUB                       подпрограмма(оператор)
      SWAP                      обмен значений(оператор)
      SYSTEM                    системное управление(оператор)
      TAB                       табуляция(функция)
      TAN                       тангенс(функция)
      THEN                      то (кл.слово)
      TIME$                     время(системная переменная)
      TIMER                     таймер(функция/оператор)
      TO                        к (ключевое слово)
      TROFF                    !вкл/ выкл слежения за исполнением
      TRON                     !
      UBOUND                   верхняя граница(функ.)
      UCASE$                   нижняя граница(функ.)
      UTIL                     пока(кл.слово)
      USING                    используя(кл.слово)
      USR                      !
      USR0                     !
      USR1                     !
      USR2                     !
      USR3                     ! регистры
      USR4                     !
      USR5                     !
      USR6                     !
      USR7                     !
      USR8                     !
      USR9                     !
      VAL                      числовой эквивалент строки(функ.)
      VARPRT                   адрес переменной(функ.)
      VARPRT$                  указатель переменной в строке(функ.)
      VARSEG$                  сегментный адрес переменной(функ.)
      VIEW                     активная зона экрана(оператор)
      WAIT                     ожидать(оператор)
      WEND                     !операторы цикла с параметром
      WHILE                    !
      WIDTH                    логический линейный размер(оператор)
      WINDOW                   графическая координатная система(оператор)


      WRITE                    запись данных на экран(оператор)
      WRITE#                   вывод в последовательный файл(оператор)
      XOR                      исключающее или(логическое отношение)
                             - 49 -
          
          
  -----------------------------------------------------------------------
 
                 Числа в Турбо-Бейсике
                          
          
  Забота о числах состовляет важную часть любой системы программиро-
  вания.Т.Б.,как  принято в традиции Бейсика,структурирован так,чтобы позво-
  лить вам в значительной степени  игнорировать  технические  соображения  о
  внутренней  обработке  чисел.Если  вы  никогда не задумывались о таких ве-
  щах,как скорость вычислений,точность и требования к памяти,ваши  программы
  все  равно будут работать так как вероятнее всего вы ожидаете.Однако пони-
  мание того,что лежит в основе получаемых результатов  поможет  вам  писать
  программы,которые быстрее,точнее т требуют меньше памяти.
  В целях повышения эффективности Т.Б. обеспечивает хранение и обра-
  ботку чисел в четырех разных форматах;т.е. он обеспечивает четыре уникаль-
  ных  "типа" чисел:целые,длинные целые,плавающую точку единичной точности и
  плавающую точку двойной точности.
        
                  Целые
          
  Простейшими и самыми быстрыми числами,циркулирующими в  программах
  на Т.Б.,являются целые.Для Т.Б. целое есть число без десятичной точки(т.е.
  то,что  математики  называют  целыми  числами)  в  диапазоне  от -32768 до
  32767.Эти значения проистекают из основополагающего 16 битового  представ-
  ления целых;32768 есть  15 .
                  2
 Хотя  этот  диапазон  ограничивает использование целых чисел,почти
  наверняка в любой программе,которую вы  будете  писать,найдется  несколько
  переменных (таких как счетчики в циклах FOR/NEXT),которые могут функциони-
  ровать в указанных пределах.Если это так,использование целых дает исключи-


  тельно быстрый и компактный код. Ваш компьютер необычайно удобен для выпол-
  нения арифметических операций над целыми(например,он удобен для выполнения
  арифметических  операций над целыми,а для каждого числа требуется только 2
   К памяти.
  Переключатель отладки переполнения в меню опций позволяет вам соз-
  давать программы,которые автоматически проверяют случаи переполнения целых
  переменных и сообщают о них.
           
           Длинные целые
          
  Значительным расширением интерпретаторного бейсика является то,что
  Т.Б. поддерживает тип чисел,известных  как  длинные  целые.Чтобы  избегать
  ошибок округления в финансовых операциях,длинные целые пр5едставляют собой
  идеальный тип данных.Подобно обычным целым,данные не могут содержать деся-
  тичные  точки.Однако в отличии от обычных целых они имеют громадный диапа-
  зон,от -2147483648 до +21474883647 (от   31     31 )
                   (    -2 до 2    )Для длинных целых
  требуется 4 байта памяти,а расчеты с ними занимают больше времени чем с
  целыми.
  Длинные целые относительно эффективны ,а при приближенном рассмот-
  рении определенно ценны,особенно на машинах,которые не имеют 8087.В  зави-
  симости от вашей области применения,десятичные точки могут оказаться менее
  важными  ,чем  вы  думаете.Например,вы  можете определять денежные суммы в
  пенсах и делить их на 100 для отображения в долларах.Таким  образом  можно
  выражать значения до 20 миллионов долларов.
          
      Плавающая точка единичной точности
          
  Плавающая точка единичной точности (или просто единичная точность)
  возможно  наиболее гибкий тип чисел в Т.Б..Значения единичной точности мо-
  гут содержать десятичные точки и иметь диапазон :        -38       38
                                 от 10 до 10 .Вам при
  дется усердно поработать ,прежде чем откопать число которое не уложиться  в
  число  единичной  точности.Скорость  вычислений не так уж мала,для каждого
  числс требуется 4 байта.


                                     - 50 -
          
          
  Оборотной стороной единичной точности является то,что хотя и  воз-
  можно  представление  как  ненормально  больших,так и микроскопических чи-
  сел,их невозможно обрабатывать с точностью более шести значащих  цифр.Еди-
  ничная  точность  хорошо работает с числами вроде 451.21 доллара и 6411.92
  доллара.Но 671421.22 доллара невозможно  представить  точно,поскольку  это
  число   содержит   слишком   много   цифр.Ни  число  234.56789  ,ни  число
  0.00123456789 в представлении единичной точности не  будут  представляться
  столь  же  точно,как  в  случае  шести цифр:671421 доллара или 234.567,или
  0.00123457.В зависимости от вашей области применения,это округление  может
  быть тривиальным или приносящим вред недостатком.
          
              Плавающая точка двойной точности
          
  Двойная точность также соотносится с единичной,как длинные целые с
  целыми.Числа занимают в памяти вдвое больше места (8 байт ),а следователь-
  но  и дольше вычисляются, и имеют больший диапазон (10) и большую точность
  (16 цифр против 6 для единичной точности).
  Требования по хранению чисел двойной точности становятся  особенно
  заметны,когда  приходится  иметь дело с массивами.При двойной точности для
  массива с 5000 элементов требуется 40000 байтов.Массив целых  при  том  же
  числе элементов занимает только 10000 байтов.Примечание:в Т.Б. для арифме-
  тики с плавающей точкой используется стандарт 1ЕЕЕ,а не собственный формат
  МИКРОСОФТ,используемый  Интерпретаторным Бейсиком.Поэтому вы должны приме-
  нять      специальные      функции       для       трансляции       МИКРО-
  СОФТ/1ЕЕЕ(CVMS,CVMD,MKMS$,MKMD$)  для  чтения  и записи данных с плавающей
  точкой,содержащихся  в  массивах,созданных  И.Б.(Интерпретаторным   Бейси-
  ком)(Дополнитнльную информацию смотри в разделе "Произвольные файлы" далее
  в этой главе).
  Если вы не уверены какой тип плавающей точки использовать,мы реко-


  мендуем  двойную точность.Т.Б. наиболее эфективно работает на двойной точ-
  ности.Его трансцедентные функции,такие как SRS или LOG ,возвращают  значе-
  ния  двойной  точности.Единичная  точность  может  оказаться не лучшей для
  больших массивов,однако именно в них ее размерные преимущества становяться
  наиболее очевидными.
          
          
                      Вычисления и 8087
          
  Сопроцессор 8087 (80287 на  машинах  АТ-типа)  впечатляюще  сужает
  различие  в скорости вычислений для предложенных типов чисел.Поскольку все
  вычисления 8087 делает с двойной точночтью,независимо  от  типа,он  делает
  двойную точность даже более привлекательной.
  В  отличии от И.Б. ,Т.Б. не всегда округляет дробную часть числа в
  большую сторону.Т.Б. особым образом анализирует любое число,содержащее 5 в
  его дробной части.Число округляется в направлении ближайшего четного  чис-
  ла.Например,число  0.5  будет округляться до 0,как ближайшего четного чис-
  ла.Поскольку в большинстве методов округления числа всегда  округляются  в
  большую  сторону,метод Т.Б. действительно дает более равномерное распреде-
  ление.
          
                      Константы
          
  Програмами Т.Б. оьраьатывается два разных класса  данных:константы
  и  переменные.Переменные  допускают  изменение их значения по мере прогона
  программы.Значение константы фиксировано во время компилирования и не  мо-
  жет быть изменено во время исполнения программы.Т.Б. поддерживает три типа
  констант:строчные  константы,числовые  константы  и,в  порядке  расширения
  И.Б.,специальную форму целой константы,именованные константы.
          
                Строчные константы
          
  Строчные константы-это просто группы литер,окруженные двойными ка-
  вычками;например
           "THIS IS STRING"(это строка)
           "3.14159"
                    - 51 -
          
          
           "TIM TONES,ATTORNEY OF LAW" (ТИМ ДЖОНС,юрист)


  Если строка оканчивается строчной  константой,закрывающие  кавычки
  можно опустить:
   PRINT " THIS IS LOPPY BUT LEGAL (Это небрежность,но она законна)
          
             Числовые константы
          
  Числовые константы представляются числовыми значениями,поэтому они
  состоят  прежде всего из цифр от 0 до 9 и десятичной точки.Для отрицатель-
  ных констант проставляемый перед ними знак минус(-) ;знак (+) для  положи-
  тельных  констант  можно ставить и не ставить.Величина точности,которую вы
  предусматриваете,определяется внутренним представлением(целое,длинное  це-
  лое,единчная  или двойная точность),которое Т.Б. будет исползовать при об-
  работке этой константы.
  Если значения не содержат десятичную точку и лежит в диапазоне  от
  - 31  31-1
  2 до 2 ,что превышает диапазон,Т.Б. использует свой тип длинного цело
 го.(Примечание:тип длинного целого невозможен в И.Б.)
  Если значение содержит десятичную точку и имеет до шести цифр,Т.Б.
  использует свой тип плавающей точки единичной точности.
  Числовая  константа с десятичной точкой и более чем шесть цифр или
  целое число,являющееся слишком большим,чтобы быть длинным  целым,храниться
  в формате плавающей точки двойной точности.Например:
   345.1 единичная точность
   1.103221 единичная точность
   1.1032137 двойная точность
   3456783.1234 двойная точность
        
  
        Идентификация целых констант в других основаниях
         
  Иногда удобновыражать целые в основаниях,иных чем десятичное.Это в
  частности  верно,когда выражается информация,являющаяся двоичной по своему
  характеру;например,машинные адреса.Т.Б. позволяет вам специфицировать  це-
  лые  данные в шестнадцатиричном ,восьмеричном и двоичном основании.Следует
  заметить,что длинные целые нельзя представлять с изменением нотации.
  Шестнадцатиричная константа содержит до четырех литер ,где  каждая
  литера имеет установки от 0 до 9 и от А до F,и должны предшествоваться &H.
  Восьмеричные  константы  состоят  только  из литер от 0 до 7,могут


  иметь до 6 цифр и должны предшествовать &О (либо просто &).
  Двоичные константы содержат только 0 и 1.Могут быть длинной до  16
  цифр и должны предшествовать &B.
  Каждая следущая константа представляет одно и то же целое,десятичное
  число 256:
           &h100
           &O400
           &400
           &b100000000
          
          Именованние константы
          
  Т.Б. позволяет ссылаться вам на целые константы по имени.Это пред-
  ставляет собой некоторое усиление И.Б.,чем то похожее на возможность CONST
  в Паскале.Таким образом можно именовать только целые.
  Чтобы  именовать  целую  константу предпошлите ей идентификатор со
  снаком процента(%) и назначте ему целую константу.В  отличии  от  перемен-
  ной,вы  можете  использовать именованную константу в левой части оператора
  назначения точно однако и ей может назначаться только постоянное значение(
  не переменная или выражение).Например:%DEBUG=-1    'именованная константа
                  DEBAG%=1234 'целая переменная
  Используйте именованные константы для флагов  условных  вычислений
  для  повышения  читабельности ваших программ.(Вы также можете использовать
  именованние константы для уменьшения случаев "магических  чисел"  в  ваших
  программах."Магическими числами" являются фантастические значения ,которые
  что-то значат для вас,когда вы впервые пишете программу,но не шестью меся-
                       - 52 -
          
          
  цами позже,когда вы к ней возвращаетесь).
          
                      Переменные
          
  Переменная представляет собоц идентификатор,которым представляются
  числовые  и  строчные  значения.В отличии от константы,значение переменной
  может меняться в процессе исполнения программы.Подобно меткам имена  пере-
  менных  должны  начинаться  с  буквы  и могут содержать любое число букв и
  цифр.Не скупитесь в назначении имен важных переменных.В отличии от  И.Б.,в
  Т.Б.  длинные имена переменных не крадут память в период прогона.Для пере-


  менных ENDOFMONTHTOTALZ (итоги на конец года) и EMT(акроним того же имени)
  одинаково требуется ровно 4 байта для хранения в период прогона.
  Т.Б. педдерживает пять типов  переменных:строка,целое,длинное  це-
  лое,единичная точность.Имя переменной определяет ее тип.Обычно набор пере-
  менной сопровождается добавлением литеры оператора типа к имени переменной.
  Строчные переменные заканчиваются знаком доллара ($):
       a$="turbo basic"
  в целых переменных используют знак процента (%):
       a%=100
  в качестве идентификатора длинных целых используют амперсанд(&):
       a&=7000
  переменные  с  плавающей  точкой единичной точности сопровождаются
  восклицательным знаком:
       a!=1.1
  переменные с плавающей точкой двойной точности оканчиваются знаком
  номера(#):
       а#=1.031
  Если вы не вкючаете в имя переменной  литеру  оператора  типа,Т.Б.
  будет  использовать тип по умолчанию-единичная точность.Чтобы тип по умол-
  чанию изменить на другой,используется оператор DEFTYPE:
          например,
    A#=1.031  'А# есть переменная двойной точности
    B=16.5    'B имеет единичную точность
    A%=3      'A% есть целая переменная;A#-это отдельная переменная
    DEFINTM   'тип по умолчанию для переменных ,начиная с М,теперь целый
    M=16      'М есть целое
  Следует отметить,что А%,A#,A&,A$ и A!-это пять отдельных переменных.
          
                    Массивы
          
  Массив-это группа строчных или числовыхданных  ,разделяющих  между
  собой  одно  и  то  же имя переменной.Отдельные значения ,которые образуют
  массив,называются элементом.Элемент массива может использоваться в  опера-
  торе  или  выражении всюду,где вы использовали строчную или числовую пере-
  менную.Другими словами,каждый элемент массива сам по себе  является  пере-
  менной.
  Во время запуска программы каждый элемент числового массива устан-
  вливается в нуль.Строчные массивы устанавливаются в нуль-строку("").Образ-


  меривание динамического массива также очищает кажый элемент.Если программа
  позднее  повторно запускается с помощью оператора RUN,это возбуждение пов-
  торяется.
  Заявление имени и типа массива,так же как определение числа и  ор-
  ганизации его элементов,выполняется посредством оператора:
          DIMENSION
          DIM PAYTENTS(55)
  создает  массив  переменных PAYMENTS(выплаты),состоящий из 56 эле-
  ментов единичной точности,нумеруемых от нуля до 55.Массив PAYMENTS и какая
  либо переменная единичной точности,именованная также  являются  отдельными
  переменными.
          
              Построчные индексы
          
  Отдельные элементы массива выбираются с помощью подстрочных индек-
  сов,целых  выражений  в круглых скобках справа от имени массивной перемен-
  ной,например,PAYMENTS(1) и PAYMENTS(22) -это два из 56  элементов  массива
                        - 53 -
          
          
  PAYMENTS.Обычно первый элемент массива выбирается со значением подстросно-
  го индекса ноль,хотя это можно изменить с помощью оператора DIM или OPTION
  BASE:например
  'заявляется массив из 56-ти  элементов
  'с границами подстрочных индексов от 0 до 55
           dim payments(55)
           - - - - - - - - -
           option base 1
  'этим оператором dim заявляется  55-ти злементный массив
  'c границами от 1 до 55 ,т.к. имеет место оператор option base
           dim payments(55)
          
                                                                           
  Если  вы используете какой-то массивв программе без его образмери-
  вания,Т.Б. продолжает работу,как если бы вы заявили одиннадцати-элементный
  массив(значения подстрочного индекса от 0 до 10).Однако мы рекомендуем вам
  потратить время на явное образмеривание каждого массива,используемого  ва-
  шей программой.
  Как  усиление  методологии  обраьотки  массивов в интерпретаторном
  бейсике,Т.Б. дает вам возможность определять диапазон значений подстрочных
  индексов6а не только верхнее ограничение.Например,оператором DIM


           DIM B(50:60)
  создается массив В,состоящий из  одиннадцати  элементов  единичной
  точности,нумеруемых от 50 до 60.
           Оператором
           DIM C(50:60,25:45)
  создается двумерный массив С,содержащий 231(11*21) элемент.
  Способности Т.Б. определять диапазон подстрочных индексов дает вам
  возможность  моделировать структуры программных данных наиболее близко со-
  ответствующие решаемой задаче.
  Рассмотрим ,например,программу отслеживаущую статистику рождаемос-
  ти в 19 веке.Центральной структурой данных этой программы является  массив
  единичной  точности  из 100 элементов ,которые содержат число детей,родив-
  шихся в каждом году прошлого столетии  .
  Идеально,если бы вы создавали массив,в котором используются значе-
  ния подстрочных индексов равные году,в котором имели место рождения(напри-
  мер,BIRTHS(1851) представляет сколько много детей вошло в мир в 1851 г.:
          DIM BIRTHS(1899)
           .
           .
           .
           FOR N=1800 TO 1899
           PRINT "THERE WERE "BIRTHS(N)"BIRTHS IN "N
           NEXT N
  К сожаленью DIM BIRTHS(1899)создает 1900-элементный массив,из  ко-
  торого  первое  1800  идут  в отход.Традиционно программисты,работающие на
  Бейсике ,решают эту задачу,заявляя массив как
           dim births(99)
           и далее
           for n=1800 to 1899
           print "there were"births(n-1800)"births in "n
           next n
  В то время как подобные вещи усложняют дело и замедляют  программу
  на эту сотню неожиданных вычитаний,которых прежде не было.
  Для определения наименьшего элемента в массиве можно также исполь-
  зовать связанный оператор option base,хотя механизм диапазона средство бо-
  лее мощное и предпочтительное.
          
                          Строчные массивы
          
  Элементы  строчных  массивов  содержат  строки  ,а не числа.Каждая
  строка может быть разной длины от 0 до 32767 литер.Общее  строчное  прост-


  ранство для строчных массивов состовляет 64К.Например:
           dim a$(50)
  создает последовательность из 51 независимых строчных переменных:
                    - 54 -
          
          
           a$(0)="a medium lendth" 'строка из 22 литер
           a$(1)=" " 'нуль-строка
           a$(2)=space$(20000) 'строка из 20000 литер
           .
           .
           .
           а$(50)="the last one" 'последняя строка
          
                         Многомерные массивы
          
  Массивы  могут иметь одно или более измерений,вплоть до максималь-
  ных 8.Одномерный массив представляет собой просто  список  переменных.Дву-
  мерный  массив  представляет  таблицу  чисел с рядами и колонками информа-
  ции.Равно возможны и многомерные массивы,не имеющие готового аналога в ре-
  альном мире:
           DIM A(15)
           DIM B(15,20)
           DIM C(5,5,10,20,2)
  Максимальное число элементов на один размер равно 32768.
          
            Тестирование границ массивов
          
  Т.Б. старательно удерживает вас от попадания в затруднительное по-
  ложение  с плохоми подстрочными индексами(т.е. такими ,которые слишком ве-
  лики,или слишком малы для данного массива).И  компилятор  сообщает  вам  о
  плохих постоянных подстрочных индексах:
          DIM A(50)
           A(51)=33
           Эта  программа  не будет компилироваться,поскольку Т.Б. неизвестно
   как генерировать код для доступа к 52-му  элементу  51-элементного  масси-
   ва.Однако  ,если  вы используете в качестве подстрочника индексов перемен-
   ные,компилятор ошибку не обнаружит:
           DIM A(50)
           N=51
           A(N)=99
  Доже этот код компилируется без ошибки ,вы еще не можете  уследить
  ссылку на диапазон в строке 3 во время прогона,компилируя с включенным пе-
  реключателем отладки границ(СМ.раздел "Команда опций" в главе 3,где дается
  более подробная информация о проверке подстрочных индексов).


          
            Требования  к хранению массивов
          
  По  техническим причинам,относящимся к скорости исполнения и эфек-
  тивности размера кода,Т.Б. ограничивает размер отдельных  массивов  до  64
  К.,хотя  программа  может иметь столько 64Л-массивов,сколько позволяет па-
  мять.Максимальное число элементов,которое может содержать массив,есть фун-
  кция его типа,как показано ниже:
  ---------------------------------------------------------------
            тип                       требования к хранению
  ---------------------------------------------------------------
       целый                 2 байта на элемент (32768 на 64 К)
       длинный целый         4 байта на элемент (16384 на 64 К)
       единичной точности    -------------""------------
       двойной точности      8 байтов на элемент (8192 на 64 К)
       строчный              4 байта на элемент (16384 на 64 К)
  ---------------------------------------------------------------
  Примечание:В элементе строчного массива содержится  только  указа-
  тель и информация о длине.Сами строчные данные храняться в строчном прост-
  ранстве  и  занимают  столько  байтов,сколько  литер имеет строка.Строчное
  пространство максимально может содержать 64 К литер.
          
      Динамическое разделение ресурсов
          
  Т.Б. поддерживает динамическое распределение  ресурсов  памяти.Это
  означает  создание  массивов переменного размера(или статических) во время
                       - 55 -
          
          
   компилирования.
  Это дает вам  возможность  конструировать  массивы,которые  велики
  точно настолько,сколько необходимо для обработки данных программой во вре-
  мя прогона.
  Чтобы  создать динамический массив ,в операторе DIM просто исполь-
  зуются переменные аргументы;если память  имеется  в  наличии,массив  будет
  создаваться.Когда  ваша  программа  заканчивает использование этого масси-
  ва,применяйте оператор ERASE для освобождения от него и память  можно  ис-


  пользовать для других целей.
           Например:
           'разберитесь сколько записей есть в файле
           'образмерьте динамические массивы и зпгрузите их
           OPEN "PARTS.DTA" AS #1 LEN=56
           COUNT=LOF(1)/56
           DIM PARTS(COUNT),DESC$(COUNT),GUAN(COUNT),COST(COUNT)
           GOSUB LOADARRAYS
           GOSUB USEARRAYS
           ERASE PARTS,DESC$,GUAN,GOST
  Чтобы воспользоваться преимуществом динамических массивов Т.Б.,вам
  необходимо только принять решение о вызове каждого массива в программе:как
  статического  или как динамического.Является его размер постоянным в соот-
  ветствии с конструкцией программы ,или он зависит  от  какого-то  парамет-
  ра,который  неизвестен до периода прогона?Например,массив BIRTHS из приво-
  дившегося ранее примера лучше создавать как статическую структуру-он всег-
  да длжен быть длинной 100 элементов.
  Ловушка динамических массивов состоит в том,что  вы  можете  попы-
  таться  образмертвать  большой массив и потерпеть неудачу из-за недостатка
  свободной памяти в период прогона  для  выполнения  ваших  требований.Если
  программа  содержит  только  статические массивы и уже заявлено достаточно
  памяти для начала работы,прекращение прогона  быть  не  может;эти  массивы
  создаются еще до начала прогона программы.
  Программа  ,использующая  динамические массивы,должна быть поэтому
  как-то осведомлена о том,что в период прогона может оказаться недостаточно
  памяти для заявления желаемых массивов.Перед попыткой образмерить  динами-
  ческий  массив  используйте функцию FRE(-1),чтобы посмоьреть достаточно ли
  места для него .
          
        Заявление статических и динамических массивов
         
  Типом массивов по умолчанию,содержащихся  в  программе,  управляют
  метаоператоры $DYNAMIC и $STATIC.Обычно программа содержить только  один
  из этих операторов.По умолчанию компилятор полагает атрибут $STSTIC.
  Класс хранения массива также может быть установлен с использовани-


  ем  аттрибутов  STATIC  и DYNAMIC в DIM-операторе.Кроме того,массив всегда
  динамический,если в сочетании с DIM-оператором используется какое-то выра-
  жение.
  Например: $STATIC ' с этого момента все предполагаемые массивы  явля-
           'ются статическими
   DIM A(40),B(20,20)
   DIM  DYNAMIC  C(20) 'атрибут DYNAMIC преодолевает STATIC ,установ-
   ленный по умолчанию
   DIM D(N) 'использование переменной в DIM также вынуждает к  дейст-
         'вию атрибут DYNAMIC
   $DYNAMIC  'с этого момента компилятор предполагает все массивы ди-
        'намическими
   DIM E(50) 'массив у динамический
  Динамические массивы устраняются с помощью оператора  ERASE.Стира-
  ние  динамического  массива не высвобождает память,но приводит к установке
  его элементов в ноль(для строчных массивов в ноль-строку).
          
               Выражения
          
  Выражение состоит из операторов и операндов ,которые  обеспечивают
  выполнение  определенных  операций при вычислении выражения.В Т.Б. имеется
  два фундаментальных типа выражения:Строчные и числовые.
                      - 56 -
          
          
  Строчное выражение состоит из строчных констант,строчных  перемен-
  ных  и  строчных  функций  (из  тех,которые  оканчиваются  знаком  доллара
  "$"),опционально комбинированных со сменяющим  их  оператором,знаком  плюс
  "+".Строчные  выражения редуцируются до строки;т.е. ,до последовательности
  литер кода ASCIIизвестной длинны.Примерами строчных выражений являются :
           "Cats and dogs"
           a$
           a$+z$
           left$(a$+z$)
           a$+mid$("cots and digs",5,3)
           right$(mid$(a$+z$,1,6),3)
  Числовые выражения состоят из числовых констант,переменных и функ-
  ций,опционально разделяемых числовыми операторами.Числовые выражения всег-
  да редуцируются к значениюодного из четырех числовых типов(целому,длинному
  целому,единичной точности,двойной точности).
  Примерами числовых выражений являются:


           37
           37/15
           a
           37/ф
           sqr(37/a)
           sqr(s+d)/a)*sin(37/a)
  При формировании числовых выражений вы должны знать,что определен-
  ные операции будут выполняться первыми.Ниже дан список  порядка  вычилений
  выражения.Возведение  в  степень имеет наивысший приоритет;импликация-наи-
  меньший.
       .возведение в степень
       .отрицание
       .умножение,деление с плавающей точкой(*,/)
       .деление нацело()
       .модуль (mod)
       .сложение,вычитание(-+)
       .операторы отношения (<,<=,=>,>,<>)
       .not (не)
       .and (и)
       .or (или)
       .xor (исключающее или)
       .eqv (эквивалентность)
       .imp (импликация)
  Например выражение 3+6/3 дает при вычислении 5 ,а не 3.
  Поскольку деление имеет более высокий приоритет,чем  сложение,опе-
  рация деления выполняется первой.
  При обработке операций с одинаковым приоритетом Т.Б. следует слева
  направо.Например, в выражении 4-3+6 вычитание выполняется раньше сложения.
  Операции внутри скобок имеют наивысший приоритет и всегда выполня-
  ются первыми;внутри скобок выполняется стандартный порядок предпочтения.
          
               Операторы
          
  Числовые операторы классифицируются по трем главным группам:
  арифметические,отношения,логические.
          
             Арифметические операторы
          
  Они обеспечивают выполнение обычных математических операций.Арифме-
  тические операторы Т.Б. перечислены в порядке их предпочтения в таблице:
  ---------------------------------------------------------------
         оператор             действие               пример
  ---------------------------------------------------------------
         ^                   возведение в степень   10^3
  ---------------------------------------------------------------
         -                   отрицание               -16
  ---------------------------------------------------------------


        *,/                 умножение ,деление      45*19,45/19
                    с плавающей точкой
                                     - 57 -
          
          
  ---------------------------------------------------------------
      mod                модуль                   45mod19
  ---------------------------------------------------------------
      \                  деление нацело            45\19
  ---------------------------------------------------------------
     +,-                 сложение ,вычитание       45+19,46-23
  ---------------------------------------------------------------
  Пара  этих операторов требует небольшого обьяснения.Обратной косой
  чертой (\)представляется деление нацело.При делении нацело операнды округля-
  ются до целых и получается усеченное частное от деления без остатка;напри-
  мер ,5\2 равно 2,а 9\10 равно нулю.
  Остаток от деления нацело можно определить с помощью оператора mod
  .(Следует заметить ,что оператор mod имеет законное  действие  только  для
  коротких  целых).Действие оператора mod подобно делению нацело,за исключе-
  нием того,что выдается остаток от деления нацело,а не частное;например , 5
  mod равно 1.
          
          Операторы отношения
          
  Операторы отношения дают вам возможность сравнивать значения  двух
  строк  или  чисел (но не значения каждого) для получения булева результата
  TRUE (истинно) или FALSE (ложно) .Результат сравнения назначается как  це-
  лое значение -1,если отношение истинно и 0 если отношение ложно.Например,
           PRINT 5>6,5<6,(5<6)*15
  дает  распечатку  0,-1,-15.Хотя  они  могут  использоватьсяв любом
  арифметическом выражении (например a-(b>c)/13,числовые результаты выдавае-
  мые операторами отношения,главным образом6используются в операторе IF  или
  другом  операторе,обеспечивающем  принятие  решения  для  обработки сужде-
  ния,касающегося программной последовательности действий.Операторы  отноше-
  ния перечислены в таблице:


  ---------------------------------------------------------------
     оператор               отношение               пример
  ---------------------------------------------------------------
        =                равенство                         X=Y
       <>               несходство                        X<>Y
       <                меньше чем                        X<Y
       >                больше чем                        X>Y
       <=               меньше чем или равно              X<=Y
       >=               больше чем или равно              X>=Y
  ----------------------------------------------------------------
  Когда в каком -то выражении комбинируются арифметические операторы
  и  операторы  отношения,арифметические  операции всегда выполняются первы-
  ми.Например,4=5<4*3 вычисляется как -1(истинно),потому что  арифм.операции
  выполняются  до операции отношения,которая в конце концов тестирует истин-
  ность утверждения 9<12.
          
                Логические операторы
          
  Логическими операторами выполняются логические  (булевы)  операции
  над целыми.При использованиие с операторами отношения они дают вам возмож-
  ность настраивать сложные тесты ,подобные:
           IF DAY>29 END MONTH=2 THEN "ERROR IN DATE"
  Этот оператор обеспечивает выполнение логического И над целыми ре-
  зультатами,выдаваемыми  двумя  операторами  отношения.(Оператор  AND имеет
  меньший приоритет ,чем операторы отношения. "<"и"=",поэтому в скобках  не-
  обходимости  нет).Например,если  DAY=30,а  MONTH=2,оба оператора отношения
  дают TRUE(-1).Принципы представления двоичных целых  таковы,что  -1  имеет
  значение  &HFFFF  (все  биты установлены);представление 0 есть &H0000,т.е.
  все биты обнулены.Далее оператор AND выполняет операцию логического И  над
  этими двумя TRUE результатами:
           1111 1111 1111 1111
        and
           1111 1111 1111 1111


           -------------------
           1111 1111 1111 1111  давая результат TRUE (ненулевой)
                                     - 58 -
          
          
  Операция  OR  (логическое ИЛИ) выдает TRUE ,если один или более ее
  аргументов истинны,а результат FALSE(ложно) -если оба аргумента ложны.
  Операция XOR(исключающее ИЛИ) выдает истинно,если значения различ-
  ны и ложно ,если значения одинаковы.
           -1 xor -1 есть false
           5>6 xor 5<7 есть true
  Функция EQV(эквивалентность) противоположна xor.Она выдает  истин-
  но,если  два  логических  значения одинаковы при тестировании и возвращает
  ложно ,если это не так:
           -1 eqv 0 есть false
           -1 eqv -1 есть true
  Оператор IMP(импликации) выдает ложно ,только если первый  операнд
  истинно,а второй ложно:
           -1 IMP -1 есть true
           0 imp -1 есть true
  Следует заметить ,что логические операторы работают с целыми,но не
  с длинными целыми или значениями с плавающей точкой.Если операнды логичес-
  кого выражения не могут быть преобразованы в целые,возникает переполнение:
           X=500000
           IF X OR Y THEN GO EXIT
  Этот оператор IF дает ошибку переполнения если X не может быть ус-
  пешно преобразовано в целое.
          
              Битовые манипуляции
          
  В длополнение к созданию сложных тестов,логические операторы  поз-
  воляют  управлять основными битовыми образчиками их целых операндов.Наибо-
  лее общими операциями являются AND,OR,XOR-маскирование.
  AND-маски используются для очистки выбранных битов целых количеств
  без воздействия на другие биты.Например,чтобы очистить 2  бита  наибольшей
  значности  в целом значении &H3FFF ;т.е. маска содержит все единицы ,кроме
  тех битовых позиций,которые вы желаете сделать нулевыми:
           1001 0111 0000 0000 &H9700
      and
           0011 1111 1111 1111 &H3FFF (маска)
           --------------------
           0001 0111 0000 0000 &H1700 (результат)


  OR- маской устанавливаются выбранные биты целого без воздействия на
  другие биты,чтобы установить два бита наибольшей значности в &H9700,
  используется OR-маска &HC000;т.е. маска  содержит  все  нули,кроме
  битовых позиций,которые вы желаете сделать единичными:
           1001 0111 0000 0000 &H9700
        or
           1100 0000 0000 0000 &HC000
           --------------------------
           1101 0111 0000 0000 &HD700
  XOR-маской дополняются (реверсируются) выбранные биты целого коли-
  чества без воздействия на его другие биты.Например,чтобы получить дополне-
  ние  2  битов  наибольшей  значности  в  &h9700,используется  XOR с маской
  &HC000;т.е. со всеми нулями ,кроме позиций,подлежащих дополнению:
           1001 0111 0000 0000 &H9700
        xor
           1100 0000 0000 0000 &HC00
           -------------------------
           0101 0111 0000 0000 &H5700
  Операции XOR обычны для графики,поскольку они позволяют обьету пе-
  ремещаться ,не нарушаясь по сложному фону.Проделайте одно XOR-маскирование
  того же обьекта на том же месте для его стирания,восстановливая его фон  в
  его первоначпльне состоянии .
          
           Строки и операторы отношения
          
  Т.Б.  дает вам возможность сравнивать строчные данные.Строчные вы-
  ражения можно тестировать на равенство,а также на "больше чем"  и  "меньше
  чем" при алфавитном упорядочении.
                       - 59 -
          
          
  Два  строчных выражения равны,если они содержат точно одни и те же
  литеры точно в одном  и том же порядке.Например:
           a%="cat"
           print a$=cat",a$="cets",a$="cat"
  Строчное упорядочение базируется на двух критериях,причем в следу-
  ющем порядке:
   (1) основных значениях в коде ASCII содержащихся в них литер и
   (2) длине.Например,А меньше  В,поскольку  код  ASCII  для  А  есть
  65,что  меньше кода В ,равного 66.Заметим,однако,что в меньше А ,поскольку


  код ASCII для каждой буквы нижного регистра больше  соответствующей  буквы
  верхнего регистра.При сортировке смешанной информации верхнего и нижнего
  регистра  вы  можете  выбирать использование функций UCASE$ или LCASE$ для
  удержания регистровых различий от влияния на сортировку.
  Длина вовлекается в рассотрение только если обе  строки  идентичны
  до  длинны  более  короткой  из  них,причем более короткая оценивается как
  меньшая,а длинная как большая;например,"cat"меньше ,чем "cats".
          
                                                                           
   Подпрограммы,функции и процедуры
          
  Структура  программы  на  Т.Б. может быть упрощена посредством ис-
  пользования подпрограмм,процедур и  функций.Подпрограмма  -это  снабженный
  меткой набор инструкций,подлежащих исполнению,(ссылка на которую осуществ-
  ляется  так  же,как  подрограмму),которая  выполняет какую-то существенную
  важную часть вашей главной программы.Функция-это набор  стандартных  прог-
  рамм,которые выдают строчный или числовой результат,обычно имеющий отноше-
  ние  к параметрам,подаваемых в функцию.Помещая сложный и/или часто исполь-
  зуемый код в вашу программу.
  Процедуры Т.Б. и определяемые  пользователем  функции  превосходят
  проедлагаемые подпрограммами упрощения структур.Хотя миллионы Бейсик-прог-
  рамм  написаны с использованием GOSUB/RETURN,как их главного организацион-
  ного устройства,мы постоянно рекомендуем вам принять эти  более  передовые
  структуры.
  Процедуры  и  функции  в Т.Б. дают истинную реккурсивность,подавая
  параметры и обеспечивая доступ к локальным,статистическим и глобальным пе-
  ременным.Если вы никогда не имели опыта в получении выгод от передачи  па-
  раметров,использования  нескольких переменных и реккурсивности,вы приобри-
  тете его,попытавись сами задавать все это.
  Процедуры и функции скорее похожи друг на друга ,чем различны.Наи-
  более очевидное различие между ними состоит в том,что  функции  возвращают


  значение и поэтому возбуждаются не явно ,появляясь в выражениях с "FN",до-
  бавляемым перед ними.Процедуры не возвращают значение и должны возбуждать-
  ся явно с помощью оператора CALL.
  Например:
           A=W+FNCUBERROOT(C) 'вызов функции
           CFKK ONTCHAR(A) 'вызов подпрограммы
          
                            Подпрограмма
          
  Подпрограммами,состоящими  из  снабженных  метками  групп операто-
  ров,которые оканчиваются оператором RETURN,реализуется традиционный  метод
  подразделения Бейсик- программ.
  Чтобы  исполнить подпрограмму вы можете воспользоваться оператором
  GOSUB(идти к подпрограмме) для указания метки,ассоциируемой с первым  опе-
  ратором подпрограммы.Когда встречаются операторы RETURN,управление возвра-
  щается  к  оператору следующему непосредственно после вызывающего подпрог-
  рамму GOSUB.Например:
           GOSUB ADDMONTHS(сложение по месяцам)
           PRINT TOTAL (печатать итог)
           ADDMONTHS:
           FOR I=1 TO 12
           TOTAL=TOTAL+MONTH(1)
           NEXT I
           RETURN
          
                                     - 60 -
          
          
                 Функции
  Имеется два типа функций:заранее  определенные  функции(такие  как
  COS,SIN,LEFT$),которые определяются языком,и функции, определяемые пользо-
  вателем,которые могут быть одно или многострочными.(Более детально о зара-
  нее  определенных функциях см.специальные рубрики в главе 5 "Словарь-спра-
  вочник Т.Б.").
  Синтаксис определения однострочной функции имеет следующий вид:
  DEF FN идентификатор [список параметров]=выражение,где идентифика-
  тор есть определяемое пользователем имя специального выражения.
  Список параметров-это опциональная ,разделяемая  запятыми,последо-
  вательность  из  одного  или более идентификаторов,которыми представляются
  обекты данных,подлежащие отправке в функцию,когда она вызывается во  время
  прогона.(Для  любой  функции  вы ограничиваетесь 16 параметрами).Выражение


  определяет обработку,необходимую для получения значения,возвращаемого фун-
  кцией.Рассмотрим,например,метеорологическую программу,в которой  постоянно
  должно  осуществляться  преобразование  между  градусами  цельсия (которые
  обычно используются внутри самой программы) и градусами форенгейта(которые
  отображаются на экране  и  принимаются  с  клавиатуры).Однострочные  функ-
  ции-просто благо для программ такого типа:
           DEF FNCTOF(градусы С)=1.8*градусы С)+32
           DEF FNTOC(градусы F)=(градусы F-32)*.555555
  Чтобы  отобразить  переменную,которая  посредством  преобразования
  всегда удерживает значения в градусах цельсия,используется  FNTOF(читается
  как функция С от F) в любом операторе,которое может принимать числовое вы-
  ражение;например,PRINT :
           TEMP=100
           PRINT FNCTOF(TEMP)
  Чтобы преобразовать ваши значения из градусов фаренгейта в градусы
  цельсия ,используется FNFTOC:
      INPUT "ENTER TIDAY'S HIGH",TH (ввод "ввести сегодняшний максиму:"TH)
      TEMP=FNFTOC(TH)
  Многострочные функции Т.Б. играют более значительную роль 6чем до-
  пускается простыми однострочными функциями И.Б..Т.Б. допускает распределе-
  ние  функций  по многим программным строкам и ее эффективное использование
  подобно программе,которой тоже  случается  возвращать  значения.Формальный
  синтаксис для многострочной функции выглядит следующим образом:
           DEF FN идентификатор [список переменных]
           [заявление переменных]
           .
           .
           .
           [EXIT DEF]
           [FN имя функции=выражение]
           END DEF
                                                                            
  где  идентификатором  заявляется имя функции.Список параметров-это
  опциональный,разделяемый запятыми,перечень формальных  параметров,которыми
  представляются переменные,подлежащие подаче в функцию,когда она вызывается.
  В    порядке    иллюстрации,рассмотрим    многострочную    функцию


       FACTORAIAL(факториал).(6!=1*2*3*4*5*6=720)
  Факториал не входит в набор встроенных матоператоров Т.Б. ,но мно-
  гострочные функции покрывают этот пробел:
           100 DEF FNFACTORIAL(X%)
           110 LOCAL I%,TOTAL#
           120 IF X%<0 OR X%>170 THEN FNFACTORIAL#=-1:EXIT DEF
           130 TOTAL#=1
           140 FORI%=X% TO 2 STEP -1
           150 TOTAL#=TOTAL#*I%
           160 NEXT I%
           170 FNFACTORIAL#=TOTAL#
           180 END DEF
           FNFACTORIAL демонстрирует структуру многострочной  функции(нумера-
  ция  строк включена, чтобы мы могли ссылаться на различные строки по их но-
  мерам в процессе обсуждения-они ,конечно,опциональны).
                                     - 61 -
          
          
  Определения функции заключены в скобки,образуемые операторами  DEF
  FN и END DEF.
  В строке 180 функции дается ее имя и следовательно тип(# -означает
  двойную  точность).FNFACTORIAL имеет формальный параметр как единичное це-
  лое,X%.
  В строке  110  заявляется  пара  "локальных  "  переменных  ,I%  и
  TOTAL#.Локальные  переменные это временные структуры,существующие и выдан-
  ные только в пределах определений функций и процедур.(подробно они  обсуж-
  даются позднее в разделе,озаглавленном "локальные переменные").
  В  строке 120 выполняется проверка ошибки в аргументе,подаваемом в
  FNFACTORIAL.Нет места попыткам вычислять  факториал  отрицательного  числа
  или  факториал  такого значения аргумента,при котором результат получается
  вне значения двойной точности,в этих случаях вы  определяете  возвращаемое
  значение  функции  как  -1 и выход из определения.Программа ,в которой ис-
  пользуется FNFACTORIAL должна уметь распознать,что  возвращаемое  значение
  -1  представляет  условие  ошибки,и  соответственно себя вести.(Между про-
  чим,0! определяется равным 1).
  EXIT DEF предназначен для функции ,что и RETURN для подпрограммы:с
  его помощью управление возвращается к оператору ,которым функция ранее вы-


  зывалясь.Следует заметить ,что EXIT DEF необязателен,если у вас не возник-
  нет необходимости в возврате до момента достижения конца функции.
  Строками с 130 по 160 определяется алгоритм вычисления факториалов
  эта часть многострочной функции можетбыть сколь угодно длинной  или  сколь
  угодно короткой,в зависимости от необходимости.
  В  строке  170 определяется возвращаемое факториалом значение пос-
  редством назначения имени.Как ни удивительно,назначение не  является  син-
  таксическим требованием для определения функции.Если вы не выполняете наз-
  начения имени функции,то возвращаемое значение будет неопределенно.
  Определение  FNFACTORIAL  завершается  оператором  ENDDEF в строке
   180.
  Интересно ,сколько перестановок возможно с игральными картами:
          PRINT FNFACTORIAL# (52)
         дает результат 8.065817094388Е069
  Поскольку FNFACTORIAL определяется как  имеющий  формальный  пара-
  метр,аргументы с плавающей точкой перед их передачей в функцию округляются
  до    целых;например    FNFACTORIAL(2.7)    есть   то   же   самое,что   и
  FNFACTORIAL(3).Если вы вызываете FNFACTORIAL с  числом  большим,чем  может
  обработать  стандартная программа Т.Б.,обеспечивающая преобразование к це-
  лым(более 32767 или менее -32768),то во время прогона вы получите  сообще-
  ние об ошибке 6,переполнение.
  Тот  же  процесс реализуется применительно к аргументам встроенных
  функций Т.Б.,которые ожидают подачи целых аргументов;например:
        LOCATE 2.7,1 обеспечит установку курсора на строке 3.
          
         Сравнение формальных и актуальных параметров
                                                                           
  Переменные,которые появляются в списке параметров определения фун-
  кции,называются  формальными параметрами.Они служат только для определения
  функции и полностью отделены от других переменных в программе  с  теми  же
  именами.В целях иллюстрации рассмотрим эту программу:
           100 DEF FNAREA(X,Y)=X*Y


           110 X=56
           120 PRINT X,FNAREA(2,3),X
  Переменная  X в строке 110 и 120 этой программы не имеет отношения
  к формальному параметру X ,который определяется в функции площадь в первой
  строке.Когда прогоняется эта программа,X сохраняет свое  значение  по  обе
  стороны результата обращения к FNплощадь:оба раза распечатывается 56.
  Значения,которыми  функция  обеспечивается в период прогона,иногда
  называется актуальными параметрами.В последнем примере  актуальными  пара-
  метрами,называемыми  в  FNплощадь были константы 2 и 3.Так же просто акту-
  альными параметрами могут быть переменные:
           A=2:B=3
           PRINT FNAREA(A,B)
          
                              Файлы
                                     - 62 -
          
          
          
  Как только вы создали программу или накопили данные,к которым  вам
  вновь  потребуется  доступ,следующий  шаг  состоит  в  том,чтобы сохранить
  их.При хранении ваших данных вы создаете файл,который может использоваться
  для ввода и вывода.Существуют  три  типа  файлов,которые  вы  можете  соз-
  дать:последовательные,произвольного доступа и двоичные.Здесь мы рассмотрим
  каждый из этих типов ,но прежде обратим внимание на то,как именовать файлы
  и/или справочники (которые содержат несколько файлов или субсправочников).
  Как  граждане  мира  MS-DOS,файлы ,которые вы создаете и к которым
  реализуете доступ с использованием Т.Б.,должны подчиняться DOS-соглашениям
  об имяобразовании.Имена файлов состоят из двух частей ,отделяемых точкой:
           ИМЯ ФАЙЛА.УДЛ
  где имя файла может быть от одной до восьми литер,а  УДЛ-удлинение
  опционального  типа,включающее  в себя до трех литер.Если имя файла длинее
  восьми литер,Т.Б. автоматически его замечает и добавляет в конце точку.Ес-
  ли,например,вы вводите
           TESTINGDATA (тестирование данных)
           Это превращается в
           TESTINGD (тестирование Д.)
  Если строка имеет точку,которая отделяет имя файла от его  удлине-


  ния, но само имя длинее восьми литер,Т.Б. добавляет удлинение:
           VERYLONGFILENAME.TBS
           превращается в
           VARYLONG.TBS
  Если  вы  используете  удлинение с более чем тремя литерами,лишние
  литеры замечаются:
           TESTING'.DATA
           становиться
           TESTING'.DAT
  Имена файлов могут состоять из следующих литер:
           А-Z 0-9 ()[]@#^%&_/'-
  Следует заметить ,что литера  пробела  использоваться  не  может,а
  буквы нижнего регистра автоматически преобразуются в буквы верхнего регис-
  тра.Ниже дпны примеры законных имен файлов:
           MYFIRST.TBS
           MYIST.TBS
           MY_ABC.(1)
           10-25-51.XX&
  В  дополнение к операторам создания,чтения,записи файлов,Т.Б. рас-
  полагает средствами выполнения из программы функций утилит,подобный утили-
  там DOS.Оператором NAME осуществляется перенаименование  файлов.Оператором
  KILL-стирание  файлов.Оператором  MKDIR создаются справочники.CHDIR меняет
  задействованный справочник.RMDIR стирает справочник.Не существует  команды
  COPY  ,вместо ее используйте приемы двоичного файла (или SHELL для возбуж-
  дения  COMMAND.COM).
  Имена   файлов   ,используемые   в   операторе   Т.Б.    (например
   ,KILL,OPEN),должны быть в строчной форме;например:
           KILL "MYFILE.BAK"
           A$="MYFILE.BAK":KILL A$
           но не
           KILL MYFILE.BAK
          
          
         Справочники и имена проходов
          
  В MS-DOS 2.0 и выше (Т.Б. и создаваемые с его помощью программы не
  могут прогоняться на более ранних версиях) форматообразованием гибкого или
  жесткого  диска  создается справочник фиксированного размера,известный как
  корневой.Входы в корневой справочник могут представлять собой  и  файлы  и
  дополнительные справочники (называемые субсправочниками).
  Подобно обычным файлам,субсправочники имеют свои собственные стан-
  дартные  файловые  имена  и удлинения,в результате чего получается система


  файлов и справочников, представляющее собой повернутое вершиной вниз дерево.
  В верхней части системного дерева  находится  корневой  справочник
  имя которого заранее определяется как одна обратная косая черта ([).
                                     - 63 -
          
          
  Файлы  в дереве специфицируются посредством указания цепочки спра-
  вочников,или имени прохода который к ним ведет.
  Имена проходов образуются посредством перечисления субсправочников,ведущих
  к файлу,отделяемых друг от друга обратной косой чертой .Например,
           C:\TURBO\BASIC\GAMES\CHESS.BAS
  Ведущая обратная косая черта  указывает,что  проход  начинается  у
  корневого справочника,в противоположность текущему справочнику.DOS удержи-
  вает  след  текущего справочника (известного как задействованный или спра-
  вочник по умолчанию),по которому пойдет поиск файлов,когда вы не  специфи-
  цируете  проход.Если имя прохода не начинается с обратной косой четрты ,то
  им описывается проход относительно текущего справочника,если текущим явля-
  ется \TURBO\BASIC  ,оба  следущие  описания  точно  определяют  местоположение
   CHESS.BAS
           GAMES CHESS.BAS
           или \TURBO\BASIC\GAMES\CHESS.BAS
  В  каждом  субсправочнике,при перечислении из DOS ,указываются два
  специальных файла :"." и ".." имя файла с одной точкой указывает  справоч-
  ник,подлежащий  включению  в  перечень как субсправочник.Имя файла с двумя
  точками обеспечивает ссылку на родительский файл этого справочника.
          
                            Приемы хранения файлов
          
  Т.Б. представляется три различных способа хранения  информации  на
  диске  и  нахождения ее на нем:ввод /вывод последовательных,произвольных и
  двоичных файлов .У каждого из ниж есть преимущества  и  недостатки,поэтому
  какой  из  них  окажется  лучшим,для вас в работе зависит от вашей области
  применения.
          
        Краткий экскурс в управление базами данных


          
  Традиционная номенклатура программирования подразделяет файлы дан-
  ных на отдельные записи,каждая из которых состоит из одного или более  по-
  лей.Например,в  программе  перечня почтовой рассылки каждая запись в файле
  данных представляет лицо.В каждой записи  имеются  поля,содержащие  особые
  сведения  об этом лице.Например,штат и ZIP-код(код по программе зонального
  усовершенствования почтовой системы США)-этг два  поля,которые  вы  можете
  найти  в файле перечня почтовой рассылки.При бумажном представлении строки
  соответствуют записям,колонки-полям:
  -----------------------------------------------------------------
     имя       адрес         город     штат        ZIP класс оклад
  -----------------------------------------------------------------
    KATI GARVEY 1010э.редвурд сиу-сити айвова       51103 73   0.00
   ЭНДРУ РИЧ  37АНДЕРСОН-РОУ хЬюСТОН  ТЕхАС       77018  58  500.00
  -----------------------------------------------------------------
  Этот файл почтовых отправлений бывших школьников имеет  три  запи-
  си,по семь полей в каждой.
  По  причинам,которые  мы  кратко  поясним,обычно делается различие
  между числовыми и строчными полями,в этом номере последние три поля  явля-
  ются числовыми ,остальные строчными.
  
  
                           Последовательные файлы
          
  Командами  последовательных  файлов  Т.Б. создаются текстовые фай-
  лы:файл литер кода ASCII с парами возврат каретки/подача  строки,разделяю-
  щими записи.
  Вполне  вероятно,что  наилучшим  поводом для применения последова-
  тельных файлов является степень их портативности для других  программ,язы-
  ков  программирования и компьютеров.По этой причине вы часто можете видеть
  в последовательных файлах некий общий знаменатель обработки данных:они мо-
  гут считываться программами для пословной обработки и редактирования,и по-
  сылаться через серийные устройства коммутации к чужим компьютерам.
  Идея,на которой базируется  последовательные  файлы,сама  по  себе


  проста:записать  в  них , как если бы они представляли собой экран,и считы-
  вать из них,как если бы они являлись клавиатурой.
                                     - 64 -
          
          
  Создавайте последовательный файл, применяя следущие шаги:
  1.OPEN  (открыть)файл  в  режиме  последовательного   OUTPUT(выво-
  да).
  Последовательные  файлы имеют две опции для подготовки файла к вы-
  воду:
  OUTPUT:если файл не существует,создается новый файл.Если файл  уже
  существует,его содержимое стирается,а затем он трактуется как новый файл.
  2.Вывести  данные в файл.Для записи данных в последовательный файл
  используют WRITE# (записать),PRINT# (напечатать) или PRINT USING# (напеча-
  тать,используя).
  3.CLOSE (закрыть) файл.Оператором CLOSE закрывается некоторая  пе-
  ременная файла после завершения программой всех операций ввода/вывода.
        Чтобы считать последовательный файл:
  1.OPEN файл в режиме последовательного INPUT (вывода).
  2.считывать данные из файла,используя операторы Т.Б. INPUT ,INPUT$
  ,LINE INPUT#.
  3&CLOSE файл.Оператором CLOSE закрывается некоторая файловая пере-
  менная после завершения программой всех операций ввода/вывода.
  Отрицательной стороной последовательных файлов явл. то ,что вы об-
  ладаете  только  последовательным  доступом к вашим данным.Вы получаете за
  один раз доступ к одной записи,начиная с первой.Это означает,что вы желае-
  те получить последнюю запись из  последовательного  файла  с  23000  запи-
  сей,вам приднтся пройти через первые 22999 записей.
  Пoэтому  последовательные файлы лучше всего подходят к таким облас-
  тям применения,в которых осуществляется последовательная  обработка(напри-
  мер  подсчет слов,проверка орфографии,печать почтовых меток в файловом по-
  рядке) или в которых все данные можно держать  в  памяти  одновременно.Это
  дает вам возможность считывать файл за один проход при запуске программы и
  записывать  его  весь в конце.В промежитке между началом и концом доступ к


  информации может осуществляться через временные произвольного доступа  ис-
  ходные условия,реализуемые в виде числовых и строчных массивов.
  Последовательные  файлы  органически подходят для таких ситуаций в
  базе данных,когда длина индивидуальной записи переменна.Например,предполо-
  жим,что список питомцев имеет поле коментариев.Некоторые люди могут  иметь
  коментариев на 100 байтов и более;другие ,возможно большинство не имеют их
  вовсе.Последовательными файлами эта проблема решается без пустых трат дис-
  кового пространства.
  С  использованием  Т.Б.  можно создавать два типа последовательных
  файлов :(1) последовательные файлы с разделителями полей,где каждое поле в
  каждой строке файла отдкляется спецлитерами ,и (2) безразделительные  пос-
  ледовательные  файлы,где  каждое поле выглядит совершенно так же ,как если
  бы его данные отображались на экране или расчитывались на печатающем
  устройстве.Эти два типа файлов создаются с  помощью  операторов  WRITE#  и
  PRINT#,соответственно.(Используйте  INPUT#,INPUT$ или LINE INPUT# для счи-
  тывания информации из одного из типов последовательного файла).
             
   Последовательные файлы с разделителями полей
          
  Взглянув на последовательный файл ,созданный Т.Б.,вы можете  заме-
  тить,что  данные  в нем разделяются запятыми,а любая строчка заключается в
  двойные кавычки-точно в той форме,в которой осуществляется поиск данных  с
  использованием оператора INPUT#.(Двойные кавычки,окружающие строки,удержи-
  вает  вас  от попадания в затруднительное положение в связи с запятыми,со-
  держащимися в строках.Числа не нуждаются в кавычках,поскольку они  записы-
  ваются без запятых).
     Рассмотрим следущую программу и исполним ее:
    'зтой программой открывается последовательный файл
   'для вывода ею записывается пара строк различных
   'типов данных в файл с использованием оператора
           ' write#
           OPEN "SEQUENTI.BAS" FOR OUTPUT AS #1


           STRINGVARIABLE$="THIS IS STRING OF TEXT"
           INTEGER%=1000
           FLOATINGPOINT!=30000.1234
  когда файл создается для считывания с помощью оператора INPUT#,ис-
                    - 65 -
          
          
 пользуется оператор WRITE# ,а не PRINT#&
        
          Безразделительные последовательные файлы
          
  В  безраздилительном последовательном файле данные выглядят в точ-
  ности так,как если бы они отображались на экране  с  использованием  PRINT
  или  распечатывались  на  печатающем  устройствес использованием оператора
  LPRINT.Рассмотрим и исполним следущую программу:
  'эта программа открывает посл.файл для вывода
  'она записывает пару строк различных типов данных в файл  ,исполь-
           'зую оператор PRINT# и PRINT#USING.
           OPEN "SEQUENTI.BAS" FOR OUTPUT AS #1
           STRINGVARIABLE$="Это строка текста"
           INTEGER%=1000
           FLOATINGPOINT!=30000.1234
           PRINT# 1,STRINGVARITABLE$,INTEGER%,FLOATINGPOINT!
           STRINGVARITABLE$="Это другая строка"
           INTEGER%=-32767
           FLOATINGPOINT!=123454321
           PRINT#1,USING "#####&##.##^^^^";INTEGER%_
           STRINGVARIABLE$,FLOATINGPOINT!
           CLOSE #1
           END
  Содержимое файла SEQUENTI.BAS выглядит следущим образом:
          это строка текста 1000    30000ю12306875
           -32767другая строка 12.35E+03
  Важно обратить внимание на то ,что в данном случае существует фор-
  мат  данных,и на то как происходит считывание .Если вы попытаетесь исполь-
  зовать тот же оператор INPUT#,что и во втором примере программы,Т.Б. выда-
  ет ошибку периода прогона.Т.Б. будет считывать слово "Это"  первой  строки
  как  строчную  переменную  и попытается считать следущие два слова как две
  числовые переменные.Вместо этого вы  должны  использовать  INPUT$  илиLINE
   INPUT#.
  Следущая  программа  считывает  последовательный файл ,который был


  создан программой из последнего примера:
  ' эта программа открывает последовательный файл для ввода
  'она считывапет пару строк различных типов данных из файла  с  ис-
  'пользованием операторов LINE INPUT# и INPUT$
          OPEN "SEQUENTI.BAS" FOR INPUT AS #1
           STRINGVARIABLE$=" "
           STRINGVARIABLE$=INPUT$(80,1)
           PRINT STRING VARIABLE$
           LINE INPUT #1,STRINGVARIABLE$
           PRINT STGINGVARIABLE$
           CLOSE #1
           END
  Ниже представлены операторы и функции Т.Б. ,которые управляют вво-
  дом/выводом последовательных файлов:
 -------------------------------------------------------------
       оператор /функция                     операция
 -------------------------------------------------------------
      CLOSE                прекращаются операции над файлом(ах)
      EOF              возврат сигнала о достижении конца файла
      INPUT#    читывание записи(строки текста)в указанную пере
                менную
      INPUT$    считывание N литер в строчную переменную
      LINE INPUT#   считывание целой строки в строчную переменную
      OPEN      открывается файл для ввода/вывода
      PRINT# осуществляется печать в файл как если бы это было печат
      PRINT#USING ающее устройство или экран
      WRITE   в файл записываются данные ,разделяемые запятыми
 --------------------------------------------------------------
          
               Произвольные файлы
          
                                     - 66 -
          
          
  Файлы  произвольного  доступа  состоят из записей,доступ к которым
  возможен в любой последовательности.Это означает,что данные храняться точ-
  но так ,как они появляются в памяти,в результате чего достигается экономия
  времени при обраьотке хранения  (по  причине  отсутствия  необходимости  в
  трансляции),как призаписи файла,так и при его считывании.
  Вообще  говоря,произвольные файлы являются лучшим решением проблем


  организации баз данных,чем последовательные файлы,хотя и они не без недос-
  татков.Один из них -произвольные файлы не слишком  транспортабельны.Вы  не
  можете  заглянуть в них с помощью редактора или набрать их каким-то осмыс-
  ленным образом на экране.Фактически,для  перемещения  произвольного  файла
  Т.Б.  к другому компьютеру или для другого языка вам ,вероятно,потребуется
  написать какую-то трансляционную программу считывания произвольного  файла
  и  вывода текстового(последовательного ) файла.Поскольку в И.Б. для значе-
  ний с плавающей запятой используется нестандартный формат МИКРОСОФТ, а в
  Т.Б.  стандартные соглашения IEEP для плавающей точки.Вы не сможете считы-
  вать поля с плавающей точкой из произвольных файлов,созданных в И.Б.,с
  помощью программы на Т.Б., и наоборот без какой-то дополнительной работы.
  Нами предусмотрено четыре специальные функции для выхода из  этого
  затруднения:CUMS  и  CVMD для переключения числовых полей в формате МИКРО-
  СОФТ в переменные единичной и двойной точности  в  строки  формата  МИКРО-
  СОФТ,которые можнозатем записывать в файл.
  Главное преимущество произвольных файлов выражено в их имени:в лю-
  бое  время  доступна  каждая  запись файла.Например,в базе данных из 23000
  бывших питомцев программа может идти прямо к записи 22709  или  11663  без
  считывания  всех других.Эта возможность делает их единственным выбором для
  организации больших файлов,а вероятно и лучшим выбором для  маленьких,осо-
  бенно тех,которые имеют относительно постоянные длины записей.
  Произвольные  файлы  могут быть причиной бесполезного расходования
  дискового пространства,посколько оно распределяется с ориентацией на  наи-
  большее возможное в каждой записи поле.Например,включение поля комментари-
  ев  в  110 байтов приводит к занятию каждой записью дискового пространства
  110 байтов,даже если его использует только одна из тысячи записей.
  Другая крайность состоит в том,что если имеют постояную длину,осо-


  бенно если они содержат в большинстве своем числа,на  произвольных  файлах
 может  экономить пространство в обьеме ,большем того,который дает последо-
  вательная  форма. В эквивалентном файле кажый элемент одного и того же типа
  (целое,длинное целое и т.д.)занимает одно и  то  же  количество  дискового
  пространства.Например,для каждого из следущих значений требуется 4 байта:
           0
           1.660965Е-27
           15000.1
           641
           623000000
  В  отличие от этого,в последовательном файле для чисел потребуется
  столько байтов,сколько они занимают при распечатке  в  литерах  ASCII,плюс
  один байт для разделительной запятой.Например,
           WRITE# 1,0:0 занимает 3 байта
           PRINT# 1,0:0 занимает 6 байтов
           PRINT# 1.66.56E-27 занимает 13байтов
  Умеренной  ценой  ,которую  вы платите за выигрыш от использования
  произвольных файлов,является некоторая дополнительная  обработка,необходи-
  мая  для  получения  строк и чисел при выводе,а такие при вводе в той фор-
  ме,которая может обрабатываться стандартными программами средствами произ-
  вольных файлов.
  Вы можете создавать  ,записывать  и  считывать  произвольные  фай-
  лы,прибегая к следующим шагам:
  -открыть и специфицировать длину каждой записи
           OPEN FILESPEC AS [#] имя файла LEN=записи.размер
  Параметром LEN Т.Б. указывается ,что это файл произвольного досту-
  па.В отличии от последовательного файла,вы не заявляете о его открытии для
  ввода  или вывода,поскольку произвольный файл можно одновременно считывать
  и записывать.
  -исполнить оператор FIELD для определения маппирования  последова-
  тельностью  строчных переменных (после ее обработки они становяться "пере-
  менными поля")
                                     - 67 -
          
           
  FIELD имя файла,ширина AS-строчной переменной[ширина  AS  строчной
  пер.]...
  данный  буфер представляет собой загрузочный склад данных,подлежа-
  щих записи в этот конкретный файл или считывания из него.Для данного  про-


  извольного  файла оператор FIELD долежо исполняться 6по крайней мере ,один
  раз.
  -Чтобы записать в файл ,используйте LSET и RSET для загрузки долж-
  ны быть преобразованы в строчную форму с  помощью  подходящей  после  чего
  можно использовать LSET или RSET.Наконкц для записи в файл на специфициро-
  ванной вами позиции используется PUT.
  -Чтобы  считать  запись из файла ,используется GET ,числовые пере-
  менные вашей программы загружаются из подходящих переменных  буфера.Прежде
  чем  вы сможете что-то с этим сделать,числовые данные должны быть преобра-
  зованы из строчной формы с помощью одной из функций  преобразования(напри-
  мер CVS для единичной точности).
  -По окончании CLOSE (закрыть) файл.
  Ниже  перечислены операторы и функции Т.Б.,используемые для управ-
  ления считыванием и записью произвольных файлов:
  ----------------------------------------------------------------
                      оператор/функция             операция
  ----------------------------------------------------------------
     CLOSE                           закрыть файл
     CVI,CVL,CVS,CVD            преобраз.переменную поля в соответств
                        ующий тип
     FIELD                      определить переменную поля
     GET                        считать запись
     LOC                    определить номер записи,считываемой послед
                        ней
    LSET,RSET              назначить переменную поля
    MKI$,MKL$,MKS$,MKD$ преобразовать спец. числовые типы в форму,кото
                       рая может быть назначена переменной поля
   MKMS$,MKMD$,CVMS,CVMD спец. функции для трансляции формата МИКРОСОФТ
     OPEN                  открыть файл,как произвольный
     PUT                   записать запись
  ----------------------------------------------------------------
           пример:
  'программа считывания из базы данных перечня почтовых отправлений
  'пользователь вводит номер записи;программа отражает все поля


  'для этой записи
  ' этой программой не могут считываться последовательные файлы
  OPEN "ADDRESS.DTA " AS #1 LEN=81
  FIELD  #1  25  AS  ИМЯ$,25 AS АДРЕС$,18 AS ГОРОД$,2 AS КЛАСС$,4 AS_
  ВКЛАД$
  INPUT "какую запись вы желаете видеть",номер_записи
  GET #1,номер_записи
  PRINT "данные для записи"номер_записи
  PRINT "имя: "имя$
  print "адрес :"адрес$
  PRINT "город/штат/zip"город$,штат$,cvl(zip$)
  PRINT "класс :"cvi(класс$)
  PRINT "самый последний вклад:"cvl(вклад$)
  предостережение :НЕ используйте переменную поля  с  левой  стороны
  оператора назначения.Назначением переменной поля осуществляется разьедине-
  ние переменной с назначенным ей буфером.Например:
           после ZIP$=AS
  переменная  поля  ZIP$ более не относиться к буферу,который был ей
  назначен в операторе FIELD.Следовательно операторами LSET и RSET она обр
  атно выдаваться не будет.
          
                  Двоичные файлы
          
  Прием  обработки двоичных файлов в Т.Б. есть расширение И.Б.,кото-
  рое дает вам возможность открывать любой файл как числовую  последователь-
  ность байтов вне зависимости от литер ASCII,соображении о различии строк и
  чисел,длины записи,возвратов каретки или чего-либо еще.
                                     - 68 -
        
          
  При  двоичном подходе к проблеме файла,вы его считываете и записы-
  ваете,специфицируя какие байты записать и куда в  файле  они  должны  пой-
  ти.Это похоже на услуги,обеспечиваемые вызовами DOS-системы для считывания
  и записи файлов.
  За  гибкость всегда приходится платить.Файлы двоичного режима тре-
  буют ,чтобы вами была  проделана  вся  работа  по  решению  того,что  куда
  идет.Двоичный режим может быть наилучшей опцией при работе с выравниными
  файлами,которые  не  привязаны  к  формату  ASCII;например,файлы DBASE или
  LOTUS 1-2-3.
  Конечно вы должны знать точную структуру файла,еще  до  того  ,как


  попытаетесь разбить его на числа и строки,согласуемые с Т.Б..
  Каждый  файл,открываемый в двоичном режиме,имеет назначенный пози-
  ционный индикатор,который указывает место в файле6которое будет считывать-
  ся или записываться следующим.Для установки  позиционного  индикатора  ис-
  пользуется оператор SEEK,а для считывания-функция LOC.
  Двоичные файлы доступны следующим образом:
  1.OPEN  файл в BINARY режиме.Вам нет необходимости специфицировать
  будете заниматься считыванием или записью-вы можете не делать ни того  ,ни
  другого.
  2.Чтобы считать файл,используется SEEK для позиционирования файло-
  вого  указателя на байте,который вы желаете считывать.Затем,для считывания
  специфицированного числа литер (от 1 до 32767) в  строчной  переменной,ис-
  пользуется оператор GET$.
  3.Чтобы записать файл,загружается строчная переменная с подлежащей
  записи  информацией.Затем,для  спецификации строчных данных и точки в фай-
  ле,с которой она должна записываться,используется оператор PUT$.
  4.По окончании,CLOSE (закрыть файл).
  Ниже перечислены операторы и функции Т.Б. для управления чтением и
  записью двоичных файлов.
 ---------------------------------------------------------------
     оператор/функция                  операция
 ---------------------------------------------------------------
     CLOSE                       закрыть файл
     GET$                  считывается специфицируемое число начиная
                    с поисковой позиции
     LOC                   определяется поисковая позиция в файле
     LOF                   возвращается длина файла
     OPEN               открывается файл и заявляется,что он двоичный
     PUT$           записывается специфицируемое число байтов,начиная
                с поисковой позиции
   SEEK           перемещается поисковый идентификатор
 ---------------------------------------------------------------
          
             Устройство ввода/вывода
          
  Т.Б. поддерживает так называемые файлы  устройств,т.е.  аппаратные


  устройства,такие  как клавиатура,экран и печатающее устройство,как если бы
  они были последовательными файлами.Каждое поддерживаемое устройство  имеет
  зарезервированное файловое имя,которое оканчивается двоеточием:
  ---------------------------------------------------------------
            имя                                     функция
  ---------------------------------------------------------------
   KYBR:(клавиатура) клавиатура может открываться для ввода.считыв
      ание из файла устройства KYBR: подобно использованию INKEY$
   SCRN:(экран)экран  может открываться для вывода записи в SCRN: по-
               добно PRINTING(распечатке)
   LPT1-3:    устройства строчной печати 1-3
   COM1-2:    коммуникационные устройства 1 и 2
  ---------------------------------------------------------------
   Например:
   OPEN "SCRN:"FOR OUTPUT AS $ 1:PRINT #1,"HELLO"(открыть "экран:"для
   вывода AS #1 ,"алло")
   имеет тот же эффект ,что и PRINT "HELLO"
           а
   OPEN "KYBRD:FOR INPUT AS #1:INPUT #1,AS#1:INPUT #1,A$,B$
                                     - 69 -
          
          
           (открыть "клавиатура " для ввода AS #1:ввод#1,a$,b$
           есть то же самое,что и
           INPUT A$,B$
          
                                  Графика
          
  Когда она подходит к отражаемой на экране информации,программа,ге-
  нерированная Т.Б.,должна работать в рамках ограничений,дозволенных ей  ап-
  паратным дисплейным оборудованием.Т.Б. поддерживает три главных класса ви-
  део-интерфейсов на РС и совместимых с ними:
  монохромный  дисплейный адаптер,который годиться только для монох-
  ромного текста,а также цветной /графичкский адаптер(CGA) и улучшенный гра-
  фический адаптер (EGA),каждый из которых может давать графику  в  цвете  и
  черно-белую
 -----------------------------------------------------------------
  адаптер  режим экрана формат текста          примечания


 -----------------------------------------------------------------
  монохром      0        80 колонок       80х25 литер с 4 атрибутами
                                 (нормальный,яркий,мерцающий
                                 с подчеркиванием)
 -----------------------------------------------------------------
     CGA      0,1,2      40/80 колонок до 16 цветов(только в тексто-
                                  вом  режиме);до  4  цветов  в
                                  графическом режиме.Разрешающая
                                  способность экрана 64х200
                                  пиксел
 ------------------------------------------------------------------
     EGA  0,1,2,7,8,9,10 40/80колонок   разрешающая способность экрана
                                        до 640х350 пиксел.До 16  цве-
                                        тов из 64-цветной палитры в за-
                                        висимости от памяти EGA)
 -------------------------------------------------------------------
 В  соответствии  с  художественными талантами этих видео-плат,Т.Б.
  может выбирать любой режим с помощью оператора SCREEN или WIDTH.
          
                                  Текстовые режимы
          
  В 80 -колонном текстовом режиме экран состоит из 25  строк  по  80
  литерных позиций в каждой,нумеруемых от 1 до 25(сверху вниз)и от 1 до 80
  (слева  направо).В  режиме  40-колонного  текста(именующемся  на адаптерах
  CGA/EGA)экран состоит из 25 строк по 40 литер.Каждая позиция каждой строки
  может содержать в таблице литерного набора приложения F.
     !\                                                           !
     !  \                                                         !
     !    строки (1-25)                               строка 25   !
     !   /                                           колонка 80   !
     ! /                                                       \  !
     !-----------------------------------------------------------#!25


                                                                       
  Строка 25 зарезервирована для отображения программных клавиш.
          
  Вообще говоря,вы помещаете литеры на экран ,перемещая курсор в же-
  лаемое положение с помощью оператора LOCATE,а затем используйте PRINT .Эк-
  зотические литеры которые трудно генерировать на клавиатуре  ,можно  полу-
  чать с помощью функции CHR$.
  25-я  строка экрана заслуживает специального рассмотрения:операто-
  ром KEY она загружается описаниями  функциональных  клавиш.Чтобы  защитить
  эти  описания  клавиш вы не выключаете отображение функциональных клавиш с
  помощью KEY OFF.
  Для монохромных адаптеров  оператор  COLOR  можно  использовать  с
  целью  создания  специальных  эффектов,таких как инверсия и уменьшение ви-
  део-интенсивности,а также подчеркивание  и/или  мерцание  текста.В  случае
  адаптера  CGA/EGA ,оператор COLOR используется для выбора того цвета,кото-
  рый будет отображаться при выводе посредством оператора PRINT.
  В текстовом режиме адаптеры CGA/EGA поддерживают до восьми страниц
                    - 70 -
          
          
  отображения;отображаемая  страница  устанавливается  с  помощью  оператора
  SCREEN.
          
                Графические режимы
          
  Т.Б.  имеет полный комплект программ для графического вычерчивания
  точек,линий и фигур на экране в различном цвете.Если увас нет  подходящего
  аппратного видео-оборудования,такого как CGA/EGA ,эти команды не будут ра-
  ботать  так  ,как  здесь  описано.(это приводит к ошибке вызова незаконной
  функции).
  В графическом режиме экран трактуется как  сетка  малых  точек,или
  пиксел,любая  из  которых может включаться (как белая или какого-то цвета)
  или выключаться (в цвете фона,обычно черном).Пикселы  идентифицируются  их
  положением  на (X,Y) сетке,началом координат которой по умолчанию является
  верхний левый угол экрана.Значение Х представляет собой расстояние по  го-
  ризонтали  от левой кромки экрана,а значение Y -расстояние по вертикали от


  верхней кромки экрана.Следует заметить,что это представление для Y являет-
  ся обратным по отношению к обычной декартовской геометрии,в которой  мень-
  шие значения Y получаются по мере перемещения сверху вниз.
  В  зависимости  от  выбранного режима (а возможно и от размера ви-
  део-памяти вашей установки)горизонтальная  разрешающая  способность  может
  быть 320 или 640 пиксел,тогда как по вертикали эти величины состовляют 200
  или  350 .Эта комбинация определяет также число возможных цветов(2/*/16) и
  максим. количество видео-страниц(1/2/4/8).Нумерация  пиксел  индексируется
  от нуля,что отличается от нумерации рядов и колонок текста,которая начина-
  ется с единицы.
          
   (0,0)!                                                     !(319,0)
        !         <-------320 пиксел по горизонтали----->     !
        !                                                     !
        !                                                     !
        !   200 пиксел по горизонтали                         !
        !                                                     !
        !(0,199)----------------------------------------------(319,199)
          
                                       
  Каждый  пиксел  имеет  ассоциированное с ним цветовое значение(или
  атрибут) в диапазоне от 0 до макс. в  конкретном  режиме.Цвет,получающийся
  по каждому значению,находится под управлением операторов COLOR и PALETTE.
          
               Точка последней ссылки
          
  После большинства графических операций некий кончик паза отображения
  "парит " над какой -то X,Y-координатой экрана.Положение этого паза называ-
  ется  точкой  последней ссылки или LPR.Когда вы впервые возбуждаете графи-
  ческий режим с помощью оператора SCREEN,LPR устанавливается в центре экрана.
  Определенные чертежные команды способны принимать LPR как  коорди-
  натный  аргумент.Например,Если оператором LINE задается только точка расс-
  тояния,линия вычерчивается между LPR и специфицированной  точкой  расстоя-


  ния.Далее эта точка становиться LPR.
          
      Абсолютные и относительные координаты
          
  Большинством  графических  операторов Т.Б. могут специфицироваться
  координаты как в относительной,так и в абсолютной форме.
  В абсолютной форме координатной парой (X,Y) точно описывается ,где
  должна произойти операция,например,PSET(50,75) обеспечивает включение пик-
  села,находящегося на расстоянии 50 пиксел от левой и на 75 пиксел от верх-
  ней кромок экрана.
  В относительной форме координата специфицируется относительно  LPR
  и представляет собой приращение от LPR по горизонтали и вертикали.Для раз-
  личия  этой  формы  и  стандартных абсолютных координат в ней используется
  ключевое слово STEP.например,если LPR есть (60,75):
    PSET(10,20) специфицирует точку (10,20)
    PSET STEP (10,20) специфицирует точку  (70,95),находящуюся  на  10
                         - 71 -
          
          
  дальше  и  20  ниже  LPR.Отрицательные относительные координатные значения
  специфицируют точку выше и левее LPR.
          
          Переопределение экранных координат
          
  Если вам неудобна эта адресная система,для изменения  маппирования
  пары(X,Y)  ,задаваемой в операторах графики и вычерчиваемой на экране пик-
  селами,используйте оператор WINDOW(окно).
           Например:
           WINDOW (-1,1)-(1,-1)
  переопределяет  экранные координаты к наиболее подходящей декарто-
  вой плоскости аналитической геометрии,с началом координат в средней  части
  и значениями Y ,возрастающими при перемещении вверх.После этого
  оператора  WINDOW  оператор  PSET(0,0) включает физический пиксел (100,16)
  PSET (-1,-1) дает самый нижний и самый левый пиксел  экрана,а  PSET  (5,5)
  включает  физический  пиксел  (220,50) в середине верхнего правого квадра-
  та.применяя окно можно значительно упрастить генерирование  математических
  диаграмм и графиков.
  Оператор  VIEW  дает вам возможность создавать активный регион или


  "окно" на экране графики и оптимально специфицировать  координаты  относи-
  тельно верхнего угла окна. Вне окна вы не можете манипулировать пикселами.
         В число графических команд входят следущие:
   -------------------------------------------------------------
    команда                                 функция
   -------------------------------------------------------------
     CIRCLE           вычертить всю или часть окружности
     COLOR            выбрать цветовую палитру или цвет фона
     DRAW             мини-чертежный язык
     GET      загрузить числовой массив с пиксел-информацией с экр
           ана
     LINE     вычертить линию или рамку ,заданную двумя точками
     PAINT заполнить замкнутую зону сплошным цветом или образчиком цвет
          овой гаммы
     PALETTE выбор одного или более цветов палитры
     PALETTE USING  изменить все коды палитры одним оператором
     PMAP       выполнить маппирование
     POINT      возвратить информацию о точке или точке последней ссылки
     PRESET     установить точку графика
     PUT        копировать содержимое числового массива на экран
     SCREEN     выбор графического режима
     VIEW       заявить активную зону для графических операций
     WINDOW     определить координаты окна
   ---------------------------------------------------------------
                                                                           
          

       Глава 5
       Словарь-справочник ТУРБО-БЕЙСИКА
       200  с  лишним команд ТУРБО-БЕЙСИКА можно сгруппировать соответственно
  их синтаксическому классу в функции,операторы,системные переменные и метао-
  ператоры.
       Функции (заранее определенные в отличие от определяемых пользователем)
  возвращают значение и потому  должны  использоваться  внутри  выражений.Для
  большинства из них требуются один или более аргументов;например:
       t=cos(3.1) -числовая функция с 1 числовым аргументом
       t$=left$("cat",2)  -строчная функция с 1 строчным и одним числовым ар-


  гументами
       Операторы-это неделимые строительные блоки,образующие программы.Опера-
  торы должны появлятся в строке,занимая ее целиком,или с разделяющими  смеж-
  ные операторы двоеточиями,например:
       CIRCLE (160,100),50 -чертить окружность
       CALL Mysub(x,y,z) -вызвать процедуру
       a=a+1 -присвоение (см. оператор LET)
       Системные  переменные  являются заранее определенными идентификаторами
  для доступа и управления определенной системой информации,например:
       a$=DATE$ -считать системную дату
       TIME$="00:00" -установить системное время
       Метаоператоры представляют собой директивы компилятору.Если быть  точ-
  ными,они  не являются частью языка, но вместо этого работают на другом уров-
  не,управляя поведением компилятора,например:
       $INCLUDE "module1.tbs" -загрузка и обработка включаемого файла
       $STACK &H1000 -см.размер стека
       Метаоператоры,подобно субменю опций компилятора,управляют компилятором
  во время компиляции,а не компьютером во время прогона.Метаоператорам  пред-
  шествует знак доллара ($) для отличия их от обычных операторов.В строке мо-
  жет  быть только один метаоператор и,в отличии от некоторых других компили-
  рованных Бейсиков,они не помещаются внутрь REMARKS(замечаний).
       Формат справочника
       -------------------
       Каждый вход справочника содержит описание,синтаксис,общие замечания  и
  пример использования оператора,функции или процедуры.Где это приемлемо,свя-
  занные  входы  снабжены  перекресными  ссылками,оговорены любые ограничения
  применения,а также отмечены любые различия в использовании их в  Турбо-Бей-
  сике и интерпретаторе Бейсика.
       Ниже  приведены соглашения,касающиеся синтаксического описания,исполь-
  зуемого в алфавитном порядке команд.
       Числовое выражения
       -------------------
       Числовая константа,числовая функция или  числовая  переменная,либо  их
  комбинация,в  которой  используются  арифметические,логические  операторы и


  операторы отношения.Иногда специфицируется тип числового выражения,например
  целое выражение:
  ---------------
       16
       X
       16^X
       SIN(3.14159)
       SIN(X/(16*X))
       Строковое выражение
       --------------------
       Строковая константа,строковая переменная или строковая функция,либо их
  комбинация  ,опционально  включающая   в   себя   оператор   сцепления,знак
  плюс(+).Например:
       "CAT"
       a$+"CAT"
       LEFT$(a$+"CAT$",4)

                                     - 73 -
       Спецификация файла
       -------------------
       Строчное выражение описывающее имя файла MS-DOS (восемь литер с опцио-
  нальным  трехлитерным  расширением,которому предшествует точка,регистр без-
  различен),возможно включающее в себя спецификацию привода и/или  прохода.За
  исключением  случаев  снабженных замечаниями,имена файлов должны выражаться
  как строчные переменные,либо заключаться в двойные кавычки,например:
       "MAYFIRST.BAS"
       "turbobas\myfirst.bas"
       "a:\turbobas\myfirst.bas"
       Проход
       -------
       Строчное выражение,описывающее законный субсправочник на зарегистриро-
  ванном приводе.Например:
       "\TURBOBAS"
       "GAMES"
       LPR
       ----
       "Точка последней ссылки"(LPR) используется  как  неявное  координатное
  значение  в  некоторых графических операциях и устанавливается большинством
  операторов графики .
       Метка
       ------
       Метка представляет  собой  либо  алфавитно-цифровую  метку,либо  номер
  строки,идентифицирующие  программную  строку.Номера строк и метки более или
  менее взаимозаменяемы в синтаксисе  Турбо-Бейсика,за  исключением  того,что
  метки должны появляться в строке сами по себе,как таковые.
       Типографические особенности
       ----------------------------
       Курсивом  указывают  зоны команд,подлежащие заполнению специальной ин-


  формацией области применения,например:
       REG register,value
       Текстом в литерах верхнего регистра обозначается часть команды,которая
  должна присутствовать дословно,например:
       RESUME NEXT
       Квадратные скобки ([]) обозначают ,что заключенная  в  них  информация
  является опциональной,например:
       OPEN filispec as [#]filenum
       означает,что  вы можете включать знак номера (#) перед номером файла в
  операторе OPEN (открыть),либо отказаться от него по  вашему  выбору.Поэтому
  законны обе следущие команды:
       OPEN "cust.dta" AS 1
       OPEN "cust.dta" AS #1
       Фигурными скобками ({}) указывается выбор двух или более опций,одна из
  которых  должна  использоваться  обязательно.Опции разделяются вертикальной
  чертой.Например:
       KEY {on!off}
       означает,что законны оба заявления KEY ON и KEY OFF,а само по себе KEY
  незаконно.
       Многоточием (...)отмечается,что часть команды может повторится столько
  раз,сколько необходимо.Например:
       READ variable[,variable]...
       означает,что одним оператором READ может отрабатываться множество  пе-
  ременных,разделяемых запятыми:
       READ a$
       READ a$,b$,a,b,c
       Три вертикально расположенные точки указывают на пропуск одной или бо-
  лее строк программного текста:
       FOR n=1 to 10
          .

                                     - 74 -
          .
          .
       NEXT n
       Метаоператор $COM
       ------------------
  Функция       $COM распределяет пространство для приемного буфера последова-
  -------       тельного входного устройства.
  Синтаксис     $COM n size
  ---------
  Замечания     n указывает коммуникационный адаптер (1 или 2),а size (размер)
  ---------     есть  целая  константа,определяющая  емкость буфера для этого
  адаптера (от 0 до 32767).По умолчанию-256.Значение по умолчанию может уста-
  навливаться и храниться в меню опций.Значения по умолчанию могут изменяться


  метаоператорами в программе.
  Ограничения    Размер буфера специфицируемый в операторе $COM,должен
  -----------    находиться  в диапазоне от 0 до 32767.Интерпретаторный
  Бейсик будет располагать буфер одного и того же размера для  обоих
  коммуникационных  входных  устройств,если  они существуют.В Турбо-Бейсике
  размеры этих двух буферов устанавливаются независимо.
  Различия       При возбуждении в интерпретаторном Бейсике эта функциональность
  ---------      доступна только через параметры камандной строки.
  Пример         'оператор $COM используется для изменения пространства по
                 'умолчанию,распределяемого для буферов последовательных
                 'входных устройств.Настроить подпрограмму для обработки
                 'COM- ввода
       $COM 1 1024 'настраивается буфер ввода 1 К
       ON COM(1) GOSUB получить комввод
       COM(1) ON 'включить обработку  COM ввода
       OPEN "COM1" AS #1 'oткрыть переменную файла как COM1
       PRINT "Нажмите любую клавищу для завершения программы"
       'пока клавиша еще не нажата
       WHILE NOT INSTAT
         LOCATE 2.1
         PRINT TIME$ 'отобразить время
       WEND
  Пример         'оператор $COM используется для изменения пространства по
                 'умолчанию,распределяемого для буферов последовательных
                 'входных устройств.Настроить подпрограмму для обработки
                 'COM- ввода
       $COM 1 1024 'настраивается буфер ввода 1 К
       ON COM(1) GOSUB получить комввод
       COM(1) ON 'включить обработку  COM ввода
       OPEN "COM1" AS #1 'oткрыть переменную файла как COM1
       PRINT "Нажмите любую клавищу для завершения программы"
       'пока клавиша еще не нажата
       WHILE NOT INSTAT
         LOCATE 2.1
         PRINT TIME$ 'отобразить время
       WEND
       END 'конец программы
       ПолучитьКомввод : 'обработать COM-порт прерывание
       'считать ввод из буфера COM-порта


       INPUT #1,КомПортВвод (заголовок %)
       RETURN
       КонецВвода: 'конец COM-порт ввода
       PRINT "Достигнут конец ввода"
       END 'конец программы
       Метаоператор $DYNAMIC
       ----------------------
  Функция        $DYNAMIC заявляет ,что размещение массива по умолчанию
  --------       должно быть динамическим.
  Синтаксис      $DYNAMIC
  ----------
  Замечания      Метаоператор $DYNAMIC не имеет аргументов и
  ----------     заявляет, что тип размещения массивов по умолчанию должен быть
  динамическим.Пространство для динамических массивов распределяется во время
  прогона.Для ликвидации массива используйте оператор ERASE.Динамические мас-
  сивы дают более эфективное использование памяти.
  Массивы можно заявлять как динамические с помощью ключевого  слова  DYNAMIC

                                     - 75 -
  или  аргументов  выражениа  в  операторе DIM.Массивы с переменными размера-
  ми,которые заявдяются  как  общие  или  локальные  в  процедуре,либо  функ-
  ции,всегда динамические.
  СМ.также  DIM
  --------  ERASE
            FRE
            $STATIC
  Пример    'настроить обработчик ошибок
  -------   ON ERROR GOTO ОшибокОбработчик
            'отобразить память,имеющуюся в массивном пространстве
            PRINT FRE(-1)
            DIM БольшойМассив(10000) 'заявить дин.массив
            БолшойМассив(6666)=66
            PRINT FRE(-1)
            PRINT БольшойМассив(6666)
            END 'конец прогона
            Ошибокобработчик:
            PRINT "ошибка типа " ERR;
            PRINT "произошла по адресу" ERADR
            END
            Метаоператор $EVENT
            --------------------
  Функция   $EVEN управляет генерированием кода отслеживания событий.
  --------
  Синтаксис $EVEN {ON!OFF}
  ---------
  Замечания Если ваша программа содержит какое-либо средство захвата событий
  --------- определенного сорта (например,ON KEY,ON COM),то $EVENT по умолча-


  нию ON (вкл.),что приводит к генерированию компилятором кода проверки события
  между  всеми  операторами  вашей прграммы.Если в программе не предусмотрено
  отслеживание,то $EVENT находится в состоянии OFF (выкл.) и код  события  не
  генерируется.
            $EVENT  дает  вам возможность управлять тем,какие части программы
  будут проходить без проверки событий.Если существует какая-то зона,где мак-
  симальная скорость важнее ответа на  случайное  событие,то  заключайте  эту
  часть  программного  кода  в скобки,образуемые метаоператорами $EVENT OFF и
  $EVENT ON.
  Пример:   'пример события
            ON TIMER(1) gosub ПотеряВремени
            timer on
            print "Медленный цикл"
            x=таймер
            for i=1 to 10000
            timer on
            print "Медленный цикл"
            x=таймер
            for i=1 to 10000
             i=i+i-i
            next i
            y=таймер
            print "Время цикла есть" y-x
            $event off
            print "быстрый цикл"
            x=таймер
            for i=1 to 10000
             i=i+i-i
            next i
            y=таймер
            print "время цикла естьЭ" y-x
            end
            ПотеряВремени:

                                     - 76 -
            for j=1 to 1000:j=j+j-j:next j:print
            return
            Метаоператоры $IF/$ELSE/$ENDIF
            ------------------------------
  Функция   $IF,$ELSE и $ENDIF определяют частм программы,подлежащие компилиро-
  --------  ванию или от него уклоняющиеся (часто этот способ называют условным
  компилированием).
  Синтаксис $IF константа
  --------- .
            .операторы
            .
            [$else
            .
            .операторы]
            .
            $ENDIF
  Замечания  Константа-это именованная константа или постоянное значение.Если
  ---------  константа не нулевая (TRUE),то операторы между $IF и $ELSE


  компилируются,а операторы  между  $ELSE  и  $ENDIF  не компилируются.
  Если Константа нулевая (FALSE),то операторы между $IF и  $ELSE
  игнорируются,а находящиеся между $ELSE и $ENDIF компилируюся.$ELSE устанав-
  ливается опционально,но $ENDIF требуется всегда.Операторы условной компиля-
  ции могут вкладываться до уровня глубиной 256.
  Пример    %ЦветнойЭкран=1 'установка именованной константы на ненулевое
                            'значение указывает работу на цветном экране
            'установка нулевого значения указывает работу в монохромной системе
            $if %ЦветнойЭкран
             def seg=&HB800 'адрес памяти графического экрана
            $else
             def seg=&HB000 'адрес памяти монохромного экрана
            for i%=0 to 4000 step 2
             poke i%,asc("A") 'заполнить экран буквами "A"
            next i%
            'хранить все 4000 байтов видео-прогона
            bsave "$if.dta",0,4000
            end
            Метаоператор $INCLUDE
            ---------------------
  Функция   $INCLUDE включает текстовый файл
  --------
  Синтаксис $INCLUDE файласпец.литерал
  ---------
  Замечания  Используйте  $INCLUDE  для  компилирования  текста другого файла
  --------- вместе с текущим файлом.ФайлаСпец.литерал это  строчная  констан-
  та,а представляемый его файл должен следовать соглашениям DOS об имени фай-
  ла  и в то же время представлять собой исходный файл Турбо Бейсика.Если для
  включенного файла не специфицируется его имя,предполагается расширение .BAS.
    Механизм $INCLUDE вызывает трактовку компилятором включаемого файла таким
  опбразом,как если бы он физически существовал  в  первоначальном  тексте  в
  данной точке.Это дает вам возможность разрывать вашу программу на управляе-
  мые  куски.Принцип  рабочий  файл/главный  файл  Турбо  Бейсика относится к
  $INCLUDE.В иллюстративных целях рассмотрим файлы CALCAREA.BAS и CONST.BAS:
            Файл CALCAREA.BAS


            print "программа вычисления площади круга"

                                     - 77 -
            print " если вы находите эту программу полезной"
            print "пожалуйста вышлите 3500 долларов"
            print
            print "Франк Борланд"
            print "Скатте Валлей,СА95066"
            print "-------------------------------------------------"
            $include "CONST.BAS"
            input "ввести радиус",r
            print "площадь ="pi*r*r
            Файл CONST.BAS
            'общецелевые константы
            pi=ANT(1)*4
            %истинно=-1
            %ложно=0
            %максX=319
            %максY=199
   Чтобы компилировать эту программу CALCAREA  должен  быть  сделан  "главным
  файлом",посколько  это  файл  с оператором $INCLUDE .Рабочий файл двигается
  туда и обратно по отношению к любому другому,в зависимости от нужд  редакти-
  рования  (т.е  если имеет ошибки).Вне зависимости от текущего рабочего фай-
  ла,компилирование всегда начинается с CALCAREA (главного файла).(Более  де-
  тально см.в разделе "Главное меню" гл.3)
   Когда  компилятор Турбо Бейсика встречает метаоператор $INCLUDE в строке 7
  файла CALCAREA ,он загружает и начинает считывать из CONST.BAS .Когда  этот
  код  исчерпывается,компилятор  захватывает  оставленное им место в первона-
  чальной программе.
   $INCLUDE может вкладываться на глубину 5;т.е включаемый файл  может  иметь
  свои $INCLUDE.
  Пример   'хранить следущее в файле "example.inc"
  -------- sub СкажиАлло 'процедура вывод
              print "Алло"
            end sub
            'далее следунт главная программа
            $include "example.inc" 'включить исходный файл
            call СкажиАлло
            end
            Метаоператор $INLINE
            ---------------------
  Функция   $INLINE заявляет внутристрочный машинный код во внутристрочной суб-


  -------   процедуре.
  Синтаксис $INLINE [Список байтов][файлспец.литерал]
  ---------
  Замечания  $INLINE может быть только в пределах тела внутристрочной субпро-
  ---------  цедуры.
            Список байтов - это последовательность целых значений в  диапазоне
  от  0 до 255,подлежащих кодированию непосредственно в обьектном коде в дан-
  ной точке.
            ФайлСпец.литерал-это имя  файла,который  содержит  код,в  который
  вставляется внутристрочная.Этот код должен быть переопределяем,а также дол-
  жен защищать и восстанавливать следующие регистры:стековый сегмент(SS),сте-
  ковый  указатель  (SP),базовый указатель (BP),сегмент данных (DS).Внутрист-
  рочный код может иметь ссылку на пораметры с  использованием  относительной
  адресации BP.Более подробная информация содержится в приложении А "Числовые
  соображения" и приложении С "Интерфейс языка ассемблера".
  Ппример   sub визг inline
            '$inline вызывает выдачу визга звуковым излучателем

                                     - 78 -
            $inline &HBA,&H00,&H07,&HE4,&H61,&H24,
            $inline &HFC,&H34,&H02,&HE6,&H61,&HB9,
            $inline &H40,&H01,&HE@,&HFE,&H4A,&H74
            $inline &H02,&HF2
            end sub
            call визг
            end
            Метаоператор $SEGMENT
            ---------------------
  Функция   $SEGMENT заявляет новый кодовый сегмент.
  --------
  Синтаксис $SEGMENT
  ---------
  Замечания  Используйте  "безаргументные" метаоператоры $SEGMENT для разрыва
  вашей исходной программы,когда компилятор сообщает,что превышено  ограниче-
  ние 64К для кодового сегмента:ERROR 409 segment overflow press<ESC> (ошибка
  409 переполнение сегмента нажмите <ESC>)
    Все,что находится после метаоператора $SEGMENT,будет помещено в новый ко-
  довый   сегмент.В   результате   любой   оператор   управления   программой


  (GOSUB,GOTO),передающее управление черезэту границу,будет реализовать  меж-
  сегментное  перемещение,вызов  или переход,для которого требуется несколько
  больше времени  и  стекового  пространства.Этот  эффект  можно  минимизиро-
  вать,размещая  операторы $SEGMENT там,где в программе проходят естественные
  линии деления ее на части; например между главными подпрограммами или  глав-
  ной программой и кодом возбуждения или завершения.
   В  программе  на  Турбо  Бейсике может быть до 16 кодовых сегментов.Данные
  состояниа компилирования ,распечатываемые после его завершения,будут  пока-
  зывать размер каждого сегмента,отделяемого косой чертой(/).
   Примечание  :Вы не можете использовать оператор $SEGMENT в структурирован-
  ном блоке: for/next,do/loop,while/wend,if block.
  Пример    sub Процедура1
             print "это пустая процедура"
            end sub
            $segment 'определить второй сегмент
            sub Процедура2
             print "это другая пустая процедура"
            end sub
            $segment 'определить третий сегмент
            sub Процедура3
             print "Это другая пустая процедура"
            end sub
            call Процедура1
            call Процедура2
            call Процедура3
            end
            Метаоператор $SOUND
            -------------------
  Функция   $SOUND заявляет емкость фонового музукального буфера
  --------
  Синтаксис $SOUND размер буфера
  ---------
  Замечания Размер буфера-это числовая константа,которая указывает нотную ем-
  --------- кость фонового буфера оператора PLAY от 1 до 4096.Увеличение  ем-
  кости буфера до максимального числа нот,которые вы намерены играть в данной
  программе,исключает необходимость отслеживания счетчика нот (и соответству-
  ющнго ухудшения качества исполнения).

                                     - 79 -
   Для  каждой  ноты  требуется 8 байтов памяти;по умолчанию емкость равна 32
  нотам или 256 байтам.Значение по умолчанию можно менять и хранить,пользуясь


  входом музыкального буфера меню опций.Значения по умолчанию  преодолеваются
  включенными в код метаоператорами.
            Метаоператор $STACK
            --------------------
  Функция   $ STACK заявляет размер стека периода прогона.
  --------
  Синтаксис $STACK отсчет
  ---------
  Замечания  Отсчет  -числовая  константа  от  1024 до 32 К.$STACK определяет
  --------- сколько памяти в период прогона будет выделено  на  стек.Стек
  используется для  адресов  возврата во времени вызовов подпрограмм и в
  структурированных операторах,а также для локальных переменнных многострочных
  функций.По умолчанию (минимальный) размер состовляет 1024 (400Н) байтов.
   Вы можете пожелать размещить больше стекового пространства,если ваша прог-
  рамма ненормально структурированта,в ней используются большие локальные пе-
  ременные или выполняется реккурсивность.Если вы подозреваете что  программа
  выбегает за стековое пространство,перекомпилируйте ее с опцией тестирования
  стека  из меню опций.Программа ,генерированная с этим отладочным переключа-
  телем во включенном состоянии,перед входом в подпрограммы,процедуры и функ-
  ции всегда проверяет наличное стековое пространство.Значения  по  умолчанию
  продлеваются включенными в код метаоператорами.
            Вы  можете  проверять  для себя величину стекового пространства с
  помощью функции FRE(-2).
            СМ. также FRE
  Пример    'дается стек 4096 байтов
            $stack &H1000
            print fre(-2) 'отображается величина наличного  стекового  прост-
            'ранства
           Метаоператор $STATIC
           ---------------------
  Функция  $STATIC заявляет ,что размещаемый по умолчанию массив должен быть
  -------- статическим.
  Синтаксис  Метаоператор  $STATIC  не имеет аргументов и заявляет ,что массив
  ---------  будет статического типа
           Пространство для статических массивов распределяется во время  ком-
  пилирования.Массивы постоянных размеров являются статическими всегда,за иск-


  лючением  случаев заявления массива как локального для процедуры или функции
  ,либо если один и тот же массив имеет более одного размера.
   Статические массивы невозможно стирать  .Оператором  ERASE  каждый  элемент
  массива только возбуждается в ноль или ноль-строку.
   Следует  заметить,что метаоператор $STATIC ,несмотря на косметическое подо-
  бие,не имеет ничего общего с оператором STATIC,которое определяет  специаль-
  ный тип локальной переменной в процедурах и функциях.В режиме умолчания ком-
  пилятора-$STATIC.
    CМ. также
           DIM
           $DYNAMIC
          /Ш           print "быстрый цикл"
            x=таймер
            for i=1 to 10000
             i=i+i-i
            next i
            y=таймер
            print "время цикла естьЭ" y-x
            end
            ПотеряВремени:

                                     - 76 -
            for j=1 to 1000:j=j+j-j:next j:print
            return
            Метаоператоры $IF/$ELSE/$ENDIF
            ------------------------------
 чная память ",fre(-1)
           'теперь ее меньше
           erase a
           print "Наличная память",fre(-1)
           'никакого  отличия  нет,поскольку  А не перераспределяется,а только
           'обнуляется
           erase b
           print "наличная память ",fre(-1)
           'больше памяти,поскольку динамические массивы перераспределяются
           end
           Функция ABS
           -----------
  Функция  ABS возвращает абсолютное значение
  -------
  Синтаксис Y=ABS(числовое выражение)
  ---------
  Замечания ABS возвращает абсолютное значение числового  выражения.Абсолютное
  ---------  значение X указывает его величину вне зависимости от знака.Напри-
  мер,абсолютное значение -3 равно 3;абсолютное значение +3 есть 3 .
  Пример    'ABS возвпащает текущее расстояние от исходной точки,беря  абсол.
 -------    'значение расстояния
            'назначить местоположение


            Местоположение=-6.5
            'отобразить текущее местоположение
            print "текущее местоположение ",Местоположение#
            'отобразить тек.расстояние от исходной точки
            print "расстояние от исх.точки ",abs(Расстояние#)(Местоположение#)
            Функция ASC
            -----------
  Функция  ASC возвращает код ASCII первой литеры строки.
  -------
  Синтаксис Y=ASC(строчное выражение)
  ---------
  Замечания ASC возвращает код ASCII (от 0 до 255) первой литеры строчного вы-
  ---------  ражения.Чтобы  преобразовать  целое в литерную строку,используйте
  функцию  CHR$,которая при подаче ASCII-значения дает одно-литерную строку.
  Ограничения Строчное выражение ,подаваемое в ASC не может быть  нулевой(пус-
  ----------- той) строкой,иначе генерируется ошибка 5 (вызов незаконной функ-
  ции).
       см. также CHR$
  Пример   print "ASCII- значение А есть",asc("А")
            Функция ATN
            -----------
  Функция   ATN определяет тригонометрический арктангенс.
  -------

                                     - 81 -
  Синтаксис Y=ATN(числовое выражение0
  ---------
  Замечания  ATN  определяет  арктангенс (инверсию тангенса) числового выраже-
  ---------  ния.ATN выдает результат двойной точности.
            Результат,как и во всех операциях с углами в Турбо  Бейсике,предс-
  тавляется в радианах,а не в градусах.Радианы -это единици угловых измерений
  т.е математически более удобна,чем градусы.Когда углы специфицируются в гра-
  дусах  в диапазоне от 0 до 360 ,их спецификация в радианах лежит в диапазоне
  от 0 до 2п ,при 0 рад7 на полож. оси X и возрастанием против часовой  стрел-
  ки.Это  дает  положительную  ось Y (90градусов) при п/2 радиан,отрицательную
  ось X (180 градусов) при п радиан и отрицательную ось  Y  (270  градусов)  при
  3п/2 радиан.                  90=п/2рад.
                               ^
                               !


                               !
                   180=п рад   !
                   ------------!----------->0=0рад.
                               !
                               !
                               !
                               !
                               270=3п/2 рад.
   Если  вы  более  тяготеете к градусам,радианы можно преобразовать в градусы
  посредством умножения значения в радианах  на  57.2958.Например  ,арктангенс
  0.23456 есть
            ATN (.23456) радианы
            =0.230395 радианы
            =(0.230395*57.2958)градусы
            =12.2градусы
   Преобразовывайте  градусы в радианы посредством умножения на 0.0174533.Нап-
  ример,
            14 градусы
            =(0.0174533*14) радианы
            =0.24435 радианы
   Вместо того,чтобы  запоминать  коэффициенты  преобразования  радианы/граду-
  сы,вычисляйте их для себя запомнив их взаимосвязь:2п радиан равны полной ок-
  ружности,т.е 360 градусам,так что 1 радиан есть 180/п градусов,и наоборот ,1
  градус равен п/180 радиан.
   Вам в качестве справки :п с 16-тизначной точностью есть 3.141592633589793
   Это значение можно вычислить из выражения
            pi#=4*atn(1)
   Градус-радианные  и радиан-градусные преобразования являются хорошим прило-
  жением для однострочных функций.
     см. также COS
               SIN
               TAN
   Пример   'вычислить значение pi,используя  atn
            pi#=4*atn(10
            print pi#
            Оператор BEEP
            -------------
   Функция  BEEP обеспечивает звучание излучателя звука.
   --------
   Синтаксис BEEP играет тон 800 гц через динамик в  течении  0.25  сек.Опцио-
   --------- нальый числовой аргумент вызывает отсчет BEEP-сигналов.BEEP имеет
  то же действие,что  и  литера колокольчика ASCII (код7) при выводе на экран;
  например,print CHR$(7).Более мелодичные тоны можно создавать с помощью  опе-
  раторов SOUND и PLAY.

                                     - 82 -


  см. также PLAY
            SOUND
  Пример    BEEP 2 'привлеч внимание пользователя
            Функция BIN$
            ------------
  Функция   BIN$ двоичнную строку как эквивалент числа
  -------
  Синтаксис s$=bin$(числовое выражение)
  ---------
  Замечание Числовое выражение лежит в диапазоне от -32768 до 65535.Перед соз-
  --------- данием  строки любая дробная часть округляется.Если числовое
  выражение отрицательно,число возвращается в форме двоичного дополнения.
  см также  HEX$
            OCT$
  Пример ' в этом примере отображаются десятичное и двоичное значение для чисел
         'от -5 до 5
         print using "двоичный эквивалент -##=&";i%,bin$(i%)
         next i%
         end
            Оператор BLOAD
  Функция  BLOAD загружает в память файл создаваемый с помощью оператора BSAVE.
  -------
  Синтаксис BLOAD файласпец.[,адрес]
  ---------
  Замечания Файласпец-это строчное выражение,специфицирующее файл для  загруз-
  --------- ки,которое должно удовлетворять стандартным соглашениям DOS об на-
  именовании файлов.Адрес -опциональное числовое выражение от 0 до 65535,кото-
  рое указывает в какое место текушего сегмента должен быть загружен файл.Если
  адрес опускается ,BLOAD помещает файл по адресу из которого он был изначаль-
  но взят на хранение с помощью оператора BSAVE.
   Если  адрес  задается,он  преодолевает хранимую с файлом адресную ,информа-
  цию,генерированную оператором BSAVE.Поскольку не делается  никакой  проверки
  адреса  в BLOAD,вполне возможна небрежная загрузка файла в верхнюю часть DOS
  и /или в вашу программу и разрушение системы.
  Ограничения BLOAD не будет  осуществлять  непосредственную  загрузку  памяти
  ----------- EGA(улучшенного графического адаптера).
  см также    BSAVE
              DEF SEG
  Пример     rem загрузить графический экран
             def seg &HB800
             bload "картинка",0
            Оператор BSAVE
            --------------


  Функция   BSAVE сохраняет некоторый диапазон данных на диске
  --------

                                     - 83 -
          
          
  Синтаксис BSAVE файласпец,адрес,длина
  ---------
           
  Замечания Файласпец-строчное выражение6специфицирующее файл,в который подле-
  --------- жат  записи данные.Файласпец должно следовать стандартным
  соглашениям DOS об именовании файлов.Адрес-это числовое выражение в диапазо-
  не от 0 до 65535,указывающее смещаемую часть адреса,с которого файласпец бу-
  дет сохраняться (см оператор def seg).Длина есть число байтов  для  хранения
  ,от  0  до  65535.BSAVE обеспечивает хранение некоторого диапазона памяти на
  диске (эффективно храниться цифровая выборка указанного диапазона  во  время
  BSAVE).Файлы,создаваемые  с  помощью BSAVE,можно потом перегружать с помощью
  команды BLOAD ;опционально файлы можно перегружать по другому адрксу,чем за-
  нятый при BSAVE.BSAVE и BLOAD часто используются для хранения и загрузки эк-
  ранных образов посредством непосредственного считывания и записи памяти дис-
  плея.Дисплейный буфер Монохромного Дисплейного Адаптераимеет длину 4000 бай-
  тов и начинается на смещении 0 сегмента &HB000.Дисплейный буфер для Цветного
  Графического Адаптера состовляет 4000 байтов в текстовом режиме (SCREEN 0) и
  16384 байта как в режимах графики средней и высокой  разрешающей  способнос-
  ти;оба начинаются на смещение 0 в сегменте &HB500.
  
  Ограничения  Перед исполнением оператора BSAVE программист должен явно уста-
  ----------- новить сегмент,который должен будет храниться  на  диске,
  используя  оператор DEF SEG.
           
  см также BLOAD
           DEF SEG
           
  Пример   'BSAVE заполняет экран буквами А и обеспечивает хранение на диске
           for i%=1 to 2000
            print "A"
            next i%
            'определить экран для BSAVE
            def seg=&HB000
            'хранить монохромный видео-экран
            bsave "text.pic",0,4000


            ' удвоенное число литер поскольку имеются атрибуты
            end
           
           
            Оператор CALL
            -------------
           
  Функция   CALL вызывает процедуру (подпрограмму0
  -------
            
  Синтаксис CALL процимя[(список параметров)]
  ---------
           
  Замечания Процимя-это имя процедуры6определяемое где-то в прогрмме с помощью
  --------- оператора SUB .Список параметров есть опциональный список разделя-
  емых  запятыми  переменных,выражений  и  /или констант,передаваемых в Проци-
  мя.Существует   три   типа   SUB-процедур:STATIC,стандартные   процедуры   и
  INLINE.Предыдущее  обсуждение  применимо ко всем типам;однако способ,которым
  компилятор обрабатывает списки параметров ,зависит от типа SUB-процедуры.Ко-
  личество и тип аргументов,подаваемых в процедурутребует  согласованности  со
  списком параметров в определении Процимя;иначе возникаетошибка несогласован-
  ности  параметрав  периода компиляции.Если SUB-процедура является процедурой
  INLINE,числоаргументов переменно и никакая проверка набора параметров не вы-
  полняется.Сама процедура SUB INLINE ответственна за то как узнать или  опре-
  делить  количество и тип параметров в нее неподаваемых.(Более подробно о SUB
  INLINE см в приложении С "Интерфейс языка ассемблера").Когда процедурные ар-
  гументы подаются посредством ссылки (т.е являются переменными),они  доступны
  изменению вызвынной процедурой.Когда переменная заключена в скобки,она пода-
  ется  значением  и  исходное  значение  изменено быть не может.Следует заме-
  тить,что выражения и константы всегда подаются значением.Аргументы  массивов

                                     - 84 -
          
          
  специфицируются с использованием пустого набора скобок посде имени массива .
   Целые массивы всегда подаются посредством ссылки.Например:
            CALL СуммаМассив (а()) 'подать массив а в СуммаМассив
            CALL СуммаМассив (а(3)) 'подать элемент 3 массива а в СуммаМассив


           
     см также $INLINE
              SUB
  Пример    DIM Массив (1) 'заявить массив из 2 элементов
            SUB ТестПроцедура (i%,l&,s!,d#,e,a(1))
            'эта  процедура  просто выводит значения каждого подаваемого в нее
            ' параметра
             print i%;l&;s!;d#;e;a(0)
            end sub
            Целое%=1
            ДлинноеЦелое&=2
            ЕдиничнаяТочность!=4
            Массив(0)=5
            call ТестПроцедура  (Целое%,ДлинноеЦелое&,ЕдиничнаяТочность!,Двой-
              наяТочность#,целое%^2,Массив())
            end
           
           
            Оператор CALL ABSOLUTE
            ----------------------
  Функция   CALL ABSULUTE возбуждает подпрограмму языка ассемблера.
  -------
           
  Синтаксис CALL ABSOLUTE адрес(список параметров)
  ---------
           
  Замечания  Адрес-это числовой скаляр,содержащий смещение внешней подпрограм-
  --------- мы,подлежащей возбуждению .Сегмент  определяется  самым  последним
  заявлением  DEF  SEG  .Адрес  должен  находится  в  диапазоне  от  -32768 до
  65535.Отрицательные значения будут преобразовываться компилятором в  положи-
  тельные. Формой списка параметров поддерживается совместимость с интерпрета-
  тором  Бейсика  посредством  подачи на стек коротких целых параметров.Только
  эта форма допускает подачу целых.(См.приложение С "Интерфейс языка ассембле-
  ра".Буфер регистров загружается на поцессорные регистры как раз  перед  CALL
  ABSOLUTE  или CALL INTRRUPT и отпрвляются обратно на хранение сразу же после
  прогона.В любое данное время буфер содержит состояние  процессора,в  котором
  он находился при компилировании самой последней внешней процедуры  .
   Буфер  регистров  доступен  с помощью оператора и функции REG,в которых ис-
  пользуется числовой аргумент для ссылки на соответствующий регистр,как пока-
  зано ниже:
  ----------------------------------------------------------------------------


               Аргумент регистра                Регистр
  ----------------------------------------------------------------------------
            0                                Флаги
            1                                АХ
            2                                ВХ
            3                                СХ
            4                                DX
            5                                SI
            6                                DI
            7                                BP
            8                                DS
            9                                ES
  ----------------------------------------------------------------------------
            REG,как оператор, загружает выбранный элемент буфера регистров ука-
  занным целым значением:
            REG 2,&H1000 'загрузить 1000H на ВХ буфера регистров
            REG ,как функция,возвращает значение  выбранного  элемента  буфера
  регистров:
            PRINT REG (2) 'вывести значения из ВХ буфера регистров
            Программист  ответственнен  за  защиту  регистров  сегмента данных

                                     - 85 -
          
          
  (DS),сегмента стека (SS),указателя базы (BP),указателя стека (SP)
     см также CALL INTERRUPT
              DEF SEG
              REG
  Пример    defint a-z
            dim a(100)
            dim ЗаполненияПодпрограмма (10)
            ЗаполненияПодпрограмма (0)=&HF2FC
            ЗаполненияПодпрограмма (1)=&HCBAA
            reg 1,-1
            reg 3,101*2
            reg 9,varseg(a(0))
            reg 6,varptr(a(0))
            def seg=varseg(ЗаполненияПодпрограмма (0))
            print a(1)
            while not instat:wend
            ЗаполнитьАдрес=varptr(ЗаполненияПодпрограмма(0))
            call absolute ЗаполнитьАдрес '(reg)
            print a(1)
            end
           
           
            Оператор CALL INTERRUPT
            -----------------------


           
  Функция   CALL INTERRUPT вызывает системное прерывание
  --------
           
  Синтаксис CALL INTERRUPT n
  ---------
           
  Замечания Целым выражением n представляется прерывание для вызова в диапазо-
  --------- не от 0 до 255.Как раз перед  получением  управления  обработчиком
  прерываний регистры процессора загружаются значениями из буфера машинных ре-
  гистров.При возврате ,осуществляемом обработчиком прерываний,буфер принимант
  значения  из процессорных регистров.В любое данное время буфер содержит сос-
  тояние регистров процессора в том виде,в котором находились эти регистры при
  компилировании самого последнего внешнего вызова или оператора REG.
    В справочном руководстве по технике DOS  содержится  полная  информация  о
  многих функциях,доступных через механизм CALL INTERRUPT.Программист ответст-
  веннен за защиту регистров стекового сегмента (SS) и стекового указателя (SP).
  Ограничения  Перед  исполнением оператора CALL INTERRUPT подходящие регистры
  центрального процессора должны быть возбуждены через оператор REG.После  ис-
  полнения  оператора CALL INTERRUPT к значениям процессорных регистров должен
  быть обеспечен доступ через функцию REG.
     см также CALL ABSOLUTE
              REG
  Пример    'call interrupt исполняет обслуживание DOS прерываний
            $include "regnames.inc"
            reg %ax &H0200
            'ah=02 шестнадцатиричная функция станд. DOS-вывода литерала
            reg %ox,reg(%ox)and&HFF02
            'DL=02 шестнадцатиричное DH остается тем же
            'DL:=литера для вывода
            call interrupt &H21 'вызов прерывания 21
           
           
            Функция CDBL
            ------------
           
  Функция   CDBL преобразует число в формат двойной точности
  -------
           
  Синтаксис y=CDBL(числовое выражение)
  ---------

                                     - 86 -
          
          
           


  Замечания CDBL преобразует числовыю переменную или числовое выражение в фор-
  мат двойной точности.Используйте CDBL для  исключения  случаев  переполнения
  целых  в  выражениях,где комбинируются целые операнды и операнды с плавающей
  точкой,например:y#=(z%+x%)/a#
    Это  выражение  будет  приводить  к  переполнению  ,если  (z%+x%)   больше
  32767.Чтобы избежать этого,используйте CDBL для принудительного преобразова-
  ния  одной  из  целых переменных в форму двойной точности.Это вызовет оценку
  всего выражения в двойной точности.
            y=(CDBL(z%)+X%)/a#
           
  Ограничения Диапазон выражения,подаваемого в CDBL должен находится в  преде-
  ----------- лах законного диапазона для числа двойной точности.
           
       см также CINT
                CLNG
                CSNG
  Пример    'CDBL полезен для предотвращения ошибок периодо прогона
            x%=2000
            y%=2000
            z#=cdbl(x%)*y%
            print x%,y%,z#
            end
           
            Функция CEIL
            ------------
           
  Функция   CEIL возвращает наименьшее целое,которое больше или равно аргументу
  --------
           
  Синтаксис y=CEIL(числовое выражение)
  ---------
           
  Замечания  Функция  CEIL преобразует числовыю переменную или выражение в це-
  --------- лое,возвращия наименьшее целое,которое больше или равно аргументу .
            
  Различия   Этой функции в Интерпретаторном Бейсике нет.
  ---------
           
   см также  CINT
             FIX
             INT
           
  Пример    for i!=-2.5 to 2.5 step 0.5
            print using "CEIL-значение ### есть ###":i!,ceil(i!)
            next i!
            end
           
           
            Оператор CHAIN
            --------------
           
  Функция CHAIN возбуждает модуль цепочек Турбо Бейсика (создаваемой как  .TBC
  ------- или .EXE-файл)
                       
  Синтаксис CHAIN файласпец
  ---------


           
  Замечания  Файласпец-это  строчное  выражение  ,которое  следует стандартным
  --------- DOS-соглашениям об наименовании файлов,и представляет модуль цепо-
  чек Турбо Бейсика (расширение .TBC).Если расширение опускается,предполагается
  .TBC.Поэтому ,если вы хотите специфицировать .EXE-файл,к имени файла необхо-
  димо добавить .EXE.Переменные перечисляемые как  COMMON  (общие),подаются  и
  текущей программой,и программой назначения в программу назначения.
   В  фазе  тестирования  вызывающая  программа  должна комполороваться в .EXE

                                     - 87 -
          
          
  -файл, так как вы не можете реализовать цепочку из самого Турбо Бейсика.Вызы-
  ваемая программа должна компилироваться на диск как модуль цепочек (.EXE или
  .TBC-файл) .Если аргументы в операторе  COMMON  в  вызывающей  и  вызываемой
  программах не совподают (например,переменные с плавающей точкой в одном мес-
  те  и  челые в другом),возникает ошибка периода прогона.Турбо-Бейсик не под-
  держивает опции CHAIN Интерпретаторного Бейсика,ориентированные на нумерацию
  строк,включая DELETE (стереть),MERGE (соединить) и CHAIN (цепочка)номерстроки.
  Поскольку  вы не можете специфицировать номер строки в модуле цепочек назна-
  чения,исполнение начинаеися всегда  от  начала.При  трансляции  обработанной
  CHAIN  системы  программ Интерпретаторного Бейсика на Турбо-Бейсик,вы можете
  обнаружить ,что расширенное использование  памяти  Турбо-Бейсиком  позволяет
  консолидировать  отдельные  модули в единую программу,исключая необходимость
  реализации цепочек.
      
  Ограничения Образование цепочек возможно ,только когда программа использует-
  ---------- ся из DOS;т.е. из .EXE-файла.MERGE,DELETE,ALL и CHAIN  по  номеру
  строки не поддерживаются.
           
  Различия В Турбо-Бейсике образование цепочек делается из одной компилирующей
  -------- программы в другую,которая уже компилирована в .TBC или .EXE-файл.
           


     см также COMMON
           
  Пример    'рассмотрим PROG1 ,которая образует цепочку к PROG2:
            prog1.bas
            'заявить  переменные  ,подлежащие  подаче  в организуемую цепочкой
            'программу:скалярные переменные единичной точности a и b  и  целый
            'массив с%
            dim c%(3000)
            a=65:b=13:c%(2000)=12
            common a,b,c%(1)
            'специфицировать #размеров в массиве
            chain "prog2"
            'заявить переменные ,подлежащие приему из возбуждающей программы
            'они  должны  быть  в том же порядке, иметь тот же тип6но не обяза-
            'тельно то же имя
            common x,y,z%(2000)
            когда prog1.exe возбуждается из DOS,она будет  автоматически  вво-
            дить модуль prog2.tbc и исполнять его,распечатывая значения,назна-
            ченные  в  prog1.Когда prog2 окончивается6возврат осуществляется в
            DOS ,а не в prog1.
           
            
            Оператор CHDIR
            --------------
           
  Функция   CHDIR изменяет текущий справочник (DOS-команда CHDIR или CD)
  --------
           
  Синтаксис CHDIR проход
  ---------
           
  Замечания Проход-это строчное выражение,соответствующее DOS  -соглашениям  о
  --------- проходах (описанных в разделе "Файлы" глава 4)
            Если  проход  не  указывает какой-то законный справочник,возникает
  ошибка 76 периода прогона,"Проход не найден".Оператор CHDIR изменяет текущий
  (задействованный по умолчанию справочник).Это  аналогично  действию  команды
  CHDIR   из  DOS,за  исключением  того,что  невозможна  аббревиатура,подобная
  CD.Прогоном программы ,которая меняет справочник,из Турбо-Бейсика также  ме-
  няет задействованный справочник Турбо-Бейсика.
           
  Пример   INPUT "Новый справочник :",Проход$
            CHDIR Проход$
           end
           

                                     - 88 -


          
          
            Функция CHR$
            ------------
           
  Функция   CHR$ преобразует ASCII-код в однолитерную строку
  -------
           
  Синтаксис s$=CHR$(целое выражение)
  ---------
           
  Замечания  CHR$  возвращает  однолитерную строку,единственная литера которой
  ---------  имеет целое выражение в ASCII-коде со значением от 0 до  255.CHR$
  дополняет функцию  ASC,которая  возвращает ASCII -код первой литеры строки.
  CHR$ удобна для создания литер,которые трудно ввести с клавиатуры,таких как
  графические литеры экранного вывода и упрвляющие последовательности для
  вывода на печать.Значение целого выражения ,подаваемое в CHR$ ,должно лежать
  в диапазоне от 0 до 255. Использование аргумента вне этого диапазона вызывает
  ошибку 5 периода прогона,вызов незаконной функции.
           
   см также  ASC
           
  Пример    'CHR$ отображает на экране литерный набор ASCII
            for i%=0 to 255
             print using "i":chr$(i%):
            'отобразить ascii литеру ,представляемую i%
            next i%
            end
           
           
            Функция CINT
            ------------
           
  Функция   CINT преобразует свой аргумент в целое
  -------
           
  Синтаксис y=cint(числовое выражение)
  ---------
           
  Замечания Функция CINT преобразует числовую переменную или выражение в целое
  --------- округляя дробную часть числового выражения.Если числовое выражение
  находится вне диапазона от -32768 до 32767 ,то возникает ошибка переполнения
  (ошибка  6  периода  прогона).Это  преобразование  выполняется косвенным пу-
  тем,посредством назначения целой переменной или вызовом процедуры 6либо фун-
  кции,которая принимает целый аргумент.
           
  Различия В отличии от Интерпретаторного Бейсика,Турбо-Буйсик не всегда окру-
  -------- еляет дробную часть числа в сторону увеличения.Если  дробная  часть
  числа равна 0.5 округление осуществляется в сторону четного числа.


           
    см также CDBL
             CEIL
             CLNG
             CSNG
         
  Пример    for i!=0.0 to 5.0 step 0.2
            print using "cint числа #.#=#":i!,cint(i!)
            next i!
            end
           
           
            Оператор CIRCLE
            ---------------
           
  Функция   CIRCLE обеспечивает вычерчивание окружности или части окружности.
  --------
           

                                     - 89 -
          
          
  Синтаксис CIRCLE (x,y),радиус[,цвет[,начало,конец[,вид]]]
  ---------
           
  Замечания (x,y)-координаты центра окружности,которые могут специфицироваться
  ---------  в абсолютной или относительной форме(с использованием STEP.)
            (Более  детальную информацию об абсолбтных и относителбных коорди-
  натах см в разделе о графике Главы 3 ).
            Радиус -это числовое выражение ,задающий размер окружности.
            Цвет  -целое  выражение,определяющее  цвет  окружности.Приемлемыми
  значениями являются 0-3 в графике средней разрешающей способности(по умолча-
  нию  -3)  и  0-1  в графике с высокой разрешающей способностью (по умолчанию
  -1).Цветом по умолчанию является наивысший возможный цвет того режима,в  ко-
  тором  вы  находитесь.Использование  цветового аргумента вне этих диапазонов
  дает ошибку 5 периода прогона,вызов незаконной функции.(Более подробную  ин-
  формацию о выборе цветов см в описании оператора COLOR).
            Начало  и конкц являются опциональными числовыми параметрами,опре-
  деляющими начальную и концевую точки  подлежащей  вычерчиванию  дуги6которые
  специфицируются  в  радианах  (см  описание  радианов  в  описании оператора
  ATN).Используйте их,когда желаете вычертить только часть окружности.Если на-
  чало и конец опускаются ,вычерчивается целая окружность .Например:
            SCREEN 1:pi=4*atn(1)
            CIRCLE (160,100),50,3,0,pi
            обеспечивает вычерчивание белого полукруга от 0 радиан до п радиан.


            Отрицательные значения начало и конец вызывают  вычерчивание  тор-
  то-образных  ;т.е.  кромки дуги автоматически соединяются с центральной точ-
  кой.Например :
            SCREEN 1:pi=4*atn(1)
            CIRCLE (160,100)50,,-pi/4,-pi/2
            обеспечивает вычерчивание 45-градусного куска торта от п/4  радиан
  до  п/2 рад., который показан на рис. ниже7Чтобы начать клин на положительной
  X-оси,используется отрицательное число,несколько меньше нуля6а не просто  -0
  (например ..0001) .
           
           
           
            
           
           
           
           
           
            Вид  -это числовое выражение,управляюшее тем,насколько круглой или
  овальной будет окружность.По умолчанию в средней разрешающей способности его
  значение равно 5/6 (0.833333),а в зависимости от вышей конкретной комбинации
  дисплецной платы/видео-монитора,вам может потребоваться повозиться  с  этими
  значениями (либо отрегулировать ваш монитор) для получения круглых окружнос-
  тей.LPR после вычерчмвания окружности находится в ее центре.
         
  Пример    'Эта программа демонстрирует возможности CIRCLE
            'изменение  местоположения  радиуса,цвета,видового отношения.С по-
            'мощью CIRCLE можно также вычерчивать дуги и  клинья,полезные  для
            'игр  "пак-ман"
            pi#=4*atn(1)
            screen 1
            for радиус%=1 to 20 'увеличивать размер окружности
            колер%=радиус%mod4 'рассчитать цвет изображения
            circle (250,150),радиус%,колер% 'центр в 250,150
            next радиус%
            circle (220,60),50,1,-(pi#*5/4),-pi#*3/4) 'тело пак-ман и глаз
            circle step (-5,-25),5,1
            радиус%=50
            'эллипс может давать иллюзию сферы ...
            for вид=0 to 2.0 step 0.09
             circle (90,100),радиус%,,,,вид
            next вид

                                     - 90 -
          
          


            end
           
           
            Оператор CLEAR
            --------------
           
           
  Функция   CLEAR очищает переменную память
  -------
           
  Синтаксис CLEAR
  ---------
           
  Замечания  CLEAR  -это команда без параметров,которая устанавливает числовые
  ---------  переменные в ноль,а строчные переменные в нуль-строку.CLEAR
  выключает  любое отслеживание  событий  ,которое  находтся во включенном
  состоянии (такие как музыка, которая может быть задействована оператором PLAY)
  и повторно  возбуждает массивную и строчную память.
            Примечание:  Оператор CLEAR внутри цикла будет очищать счетчикбвы-
  зывая бесконечный цикл.
    Для выборочного освобождения массивов в памяти пользуйтесь оператором ERASE.
 
  Ограничения Турбо-Юейсик не поддерживает динамическую установку стека и сег-
  ----------- ментов данных;в этом операторе нет поэтому соответствующих
  параметров.
           
  Различия Различия между операторами CLEAR Интерпретаторного Бейсика  и  Тур-
  -------- бо-Бейсика происходит,главным образом ,из различий между компилято-
  рами и интерпретаторами.Интерпретаторный Бейсик дает вам возможность динами-
  чески  устанавливать пространство стека и данных там ,где пространство стека
  и данных Турбо-Бейсика фиксируется во время компилирования.
            
      см также ERASE
               $STACK
           
  Пример     'эта программа демонстрирует что может делать CLEAR
            dim массив$(1) 'заявить массив строк
            play "mb l1 efgabcdef" 'играть музыку в фоне
            on pen gosub ПераДержатель 'настроить отслеживание светового пера
            on  strig(0) gosub КнопкиОдержатель 'настроить отслеживатель ручки
            ' управления
            'возбудить строчные данные
            Массив$(0)="это строка в Массиве$(0)"
            Массив$(1)="это строка в Массиве$(1)"
            'отобразить строчные данные


            print using "Массивный элемент 1:&":Mассив;(0)
            print using "Массивный элемент 2&":Массив$(1)
            print
            input "нажмите <enter>(ввод)для исполнения оператора CLEAR":Пусто$
            clear 'делается очистка
            print
            ' существующие строчные данные более не отображаются
            print using "Массивный элемент 1:&":Массив$(0)
            print using "Массивный элемент 2:&":Массив$(1)
            print
            print "строчные переменные теперь пусты"
            end
            ПераДержатель:'определить пустую метку для ловушки светового пера
            return
            КнопкиЩдержатель :'определить пустую метку для ручки управления
            return
           
           
            Функция CLNG
            ------------

                                     - 91 -
          
          
           
           
 Функция   CLNG обеспечивает преобразование в длинное целое
 --------
           
 Синтаксис y=CLNG(числовое выражение)
 ---------
           
 Замечания CLNG преобразует числовую переменную или выражение в длинное  целое
 --------- посредством округления дробной части ее аргумента.Если числовое вы-
  ражение  находится вне диапазона от -2в степени31 до (2в степени31)-1 (приб-
  лизительно от -2 до 2 боллионов),возникает ошибка 6 периода прогона,Перепол-
  нение.
           
 Ограничения Числовое выражение ,подаваемое в фуекцию CLNG должно находится  в
 ----------- законном диапазоне длинных целых.
           
 Различия Этой функции нет в больщинстве Интерпретаторных Бейсиков,поскольку о
 -------- ни не поддерживают длинные целые.
            
   см также CDBL
            CINT
            CSNG
            FIX
            INT
           
 Пример     print clng(2.0E9),clng(33.4),clng(-121.9),clng(100251.6)
 ------     end
           
           
            Функция CLOSE


            -------------
           
 Функция    CLOSE закрывает файл или устройство
 --------
           
 Синтаксис  CLOSE[[#]файлнам[,[#]файлнам]...]
 ---------
           
 Замечания  CLOSE оканчивает взаимосвязь номера файла и файла,установленного в
  -------- операторе OPEN (открыть),и закнчивает ввод/вывод в этот  файл.Буфер
  файла наполняется и ,если файлнам представляет файл (а не устройство),коман-
  дой  DOS CLOSE выполняется на нем для обновления справочника.Хороша привычка
  периодически закрывать файлы ,которыя записываются программой.Это дает  уве-
  ренность  в  том ,что записывается вся информация,а вход этого файла в спра-
  вочнике операционной системы правильно  обновляется  в  случае  последующего
  сбоя питания или какого-то другого затруднения.CLOSE без спецификации номера
  файла  закрывает  все  открытые  устройства  и  файлы  (то  же  самое делают
  RESET,END,STOP и RUN).
           
   см также END
            OPEN
            STOP
           
  Пример    'открыть файл назначенный печатающему устройству
            open "lpt1:" as#1
            print#1,"это тест"
            close#1
            open "закрыть Ф.ОДН" as#1
            open "закрыть Ф.ДВА" as#2
            print#1 "это тест"
            print#2 "это тест"
            close
            end
           

                                     - 92 -
          
          
           
            Оператор CLS
            ------------
           
  Функция   CLS очищает экран
  --------
           
  Синтаксис В текстовом режиме CLS очишает экран до цвета фона и  обеспечивает
  --------- позиционирование курсора в исходном положении в левом верхнем углу
  (ряд  1,колонка  1).CLS  в графическом режиме очищает экран до фонового цве-
  та.LPR оказывается в центре экрана,либо (160,100),либо  (320,100),в  зависи-
  мости  от  того ,является текущий режим средней или высокой разрешающей спо-


  собности,соответственно.
   Если уже был исполнен оператор VIEW ,CLS очищает только  обзорно  -приемное
  окно.Чтобы стереть весь экран,сначала воспользуйтесь VIEW без аргументов для
  выключения обзорного окна,а затем CLS-для очистки экрана.
           
  см также  COLOR
            SCREEN
            VIEW
           
  Пример    'cls очищает экран до фонового цвета
            print "Это тест оператора CLS"
            input "Нажать <enter> для очистки экрана...",Пусто$
            color 10,1
            cls
            end
           
           
            Оператор COLOR (графический режим)
            ----------------------------------
           
  Функция   COLOR устанавливает цвета для графических операций
  --------
           
  Синтаксис Для SCREEN 1:COLOR[задний фон][,(палитра)]
  --------- Для SCREEN 7,8,9,10:COLOR[передний фон][,[задний фон]]
           
  Замечания  Задний  фон  -это целое выражение от 0 до 63,специфицирующее цвет
  --------- фона. Палитра-это целое выражение от 0 до  1,обеспечивающее  выбор
  двухцветной  палитры.Передний  фон целое выражение от 1 до 15.Аргументы этой
  команды определяют фоновый цвет экрана и палитру из четырех цветов  ,которые
  будут  использоваться  в последующих чертежных операторах.После того ,как вы
  уже определили палитру и цвет фона с помощью оператора COLOR,цвет  отдельных
  обьектов попадает под управление различных команд графики (CIRCLE,LINE и т.д.)
    В  режиме  высокой разрешающей способности на Цветном Графическом Адаптере
  единственными возможными цветами являются черный и белый.Следовательно  опе-
  ратор COLOR не имеет значения в этом режиме и попытка его использования при-
  водит к ошибке 5 периода прогона ,Вызов незаконной функции.
            SCREEN 1
   Фон  0-255:фактически  используемый  цвет фона есть фон MOD16.Следовательно
  фон 1 и 16 дают один и тот же результат.
   Палитра 0-255:выбирается заранее определенная палитра ,как показано на ниже


            -----------------------------------------------
               цвет      палитра  0      палитра  1
            -----------------------------------------------
                1        зеленый         цинковый
                2        красный         анилиновый
                3        коричневый      белый
            -----------------------------------------------
   Четными числами обеспечивается выбор палитры 0,а нечетными  -палитры  1  по
  умолчанию.Палитра 0 дает вышей программе возможность создавать обьекты в зе-
  леном ,красном6коричневом цветах.Палитроц 2 предлагаются цвета цинковый,ани-
  линовый и белый.
            SCREEN 7 и 8

                                     - 93 -
          
          
   Только  EGA(усовершенствованный графический адаптер):цвета зависят от теку-
  щей палитры.Передний фон 1-15:выбираемый цвет используется  как  для  записи
  литер ,так и для чертежной графики.Задний фон 0-15:выбирает цвет фона.
            SCREEN 9
   Передний  фон  1-15:выбранный цвет используется для записи литер и для чер-
  тежной графики.Если ваш EGA имеет память 64К,можно использовать тоько значе-
  ния из диапазона 103.Задний фон 0-63:выбирается фоновый цвет.
            SCREEN 10
   Передний фон 1-3:выбранный цвет используется и для записи литер и для  чер-
  тежной  графика;1=черный,2=мерцание,3=высокая  интенсивность.Цвет  переднего
  фона 0 приводит к ошибке Вызов назаконной функции.
   Для изменения атрибутов умолчания используйте оператор PALETTE:
   Задний фон 0-8:выбранный цвет используется в качестве фона.
   Примечание: Значение цвета 0 для любой палитры есть цвет фона,специфицируе-
  мого в этом операторе,а цвет переднего фона по умолчанию определяется макси-
  мальным атрибутом.
           
  Ограничения В экране режима 2 оператор COLOR  вызвращает  ошибку  5  периода
  ----------- прогона,Вызов незаконной функции.
           
  Пример    'эта программа демонстрирует оператор COLOR в графическом режиме


            'переключить на граф.режим средней разрешающей способности
            'установить палитру 0
            screen 1
            color .0
            for радиус%=1 to 20 'увеличить размер окружности
            колер%=радиус%MOD4 'расчет цвета изображения
            circle (160,100),радиус%,колер% 'отобразить окружность
            next радиус%
            delay 2
            color .1 'изменить палитру
            delay 2
            'установить палитру и цвет фона и очистить экран
            color 6,0:cls
            'вычертить красную окружность в серкдине экрана
            circle (160,100),50,2
            delay 2
            end
            
           
            Оператор COLOR (текстовый режим)
            --------------------------------
           
  Функция   COLOR устанавливает цвет текста
  -------
           
  Синтаксис COLOR[передний фон][,[задний фон][,бордюр]]
  ---------
           
  Замечания  передний фон -это целое выражение от 0 до 31,специфицирующее цвет
  --------- литер.Задний фон - это целое выражение от  0  до  7,специфицирующее
  цвет фона.Бордюр-это целое выражение от 0 до 15,которое определяет цвет бор-
  дюра.Если какой-то из этих параметров находится вне указанного диапазона ,то
  возникает  ошибка 5 периода прогона,вызов незаконной функции,Для стандартных
  видео-плат Цвета/Графики в список выбора вашего фона входят
            0 черный             8  серый
            1 голубой            9  светло-голубой
            2 зеленый            10 светло-зеленый
            3 цинковый           11 светло-цинковый
            4 красный            12 светло-красный
            5 анилиновый         13 светло-анилиновый
            6 коричневый         14 желтый
            7 белый              15 белый высокой интенсивности
            Литеры могут делаться мерцающими посредством  установки  переднего
  фона  в  желаемый  цвет плюс 16.Например ,установка переднего фона 22 (6+16)

                                     - 94 -


          
          
  дает мерцающие коричневые литеры.
   Адаптеры монохромного изображения не могут отображать цвет,поэтому значения
  переднего фона интерпретируются следующим образом:
            0  черный
            1  подчеркивание
            2-7 белый
            8  черный
            9 подчеркивание высокой интенсивности
            10-15 высокая интенсивность
            16 черный
            17 подчеркивание черным
            18-23 мерцание
            24 черный
            25 высокая интенсивность,подчеркивание,мерцание
            26-31 высокая интенсивность,мерцание
   Значения заданного фона от 0 до 6 дают черный фон.Значения 7  соответствует
  белому фону.
   Примечание:На  любом  Адаптере  литеры становятся невидимыми,когда передний
  фон равен заднему фону.
   Улучшенный графический Адаптер может отображать 16 цветов из  палитры,вклю-
  чающей в себя 64 цвета.
   
   Ограничения параметр бордюра не оказывает влияния на EGA с улучшенным мони-
  ------------ тором.
           
   Пример   'Эта программа демонстрирует оператор COLOR
            'в текстовом и графическом режимах
            'отобразить таблицу атрибутов
            for задний%=0 to 7
             for передний%=0 to 15
              color передний%,задний%
              print using "###":задний%*16+передний%
             next передний%
             print
            next задний%
            print
            for задний%=0 to 7 'отобразить таблицу всех атрибутов
             for передний%=16 to 31 'с мерцанием
             color передний%,задний%
            print using "###":задний%*16+передний%-16
            next передний%
            print
            next задний%
            end
           
           
            Оператор COM(n)
            ---------------
           
  Функция  COM(n)  управляет отслеживанием событий на последовательных входных
  -------  устройствах .
            
  Синтаксис COM(n){on!off!stop}


  ---------
           
  Замечания n-число коммуникационных адаптеров,подлежащих отслеживанию (1 или 2)
  --------- Оператор  COM(n)  ON  дает  возможность  отслеживания  подпрограм-
  мой,специфицированной в предыдущем операторе ON COM(n).
    После  COM(n) ON Турбо- Бейсик осуществляет проверку между исполнением каж-
  дого оператора с целью просмотра поступления каких-либо литер на  специфици-
  риванное  входное устройство.Если обнаруживается,что такое событие уже прои-
  зошло,вызывается подпрограмма специфицированная в операторе ON COM(n).
    Если COM(n) в режиме OFF,активность на последовательном адаптере n игнори-
  руется.Отслеживание  коммуникаций  прекращается   после   оператора   COM(n)
  STOP;однако любая активность запоминается,так что когда исполняется оператор

                                     - 95 -
          
          
  COM(n)  ON  ,происходит  немедленный  захват поступившего.Для увеличения или
  уменьшения размера COM буфера используйте метаоператор $COM.
     см также ON COM(n)
           
  Пример 'Демонстрируется оператор COM(n).Эта программа не будет ничего отобра
         'жать ,если ваш адаптер COM1 не получает ввода
         'Настроить подпрограмму для обработки COM-ввода
            on com(1) gosub ПолучитьКомВвод
            'разместить массив 5К для хранения ввода
            dim КомПортВвод (5*1024)
            'разместить указатель на следующем имеющемся буферном пространстве
            ЗаголовокПрт%=0
            'и следующий для печати
            КонецПрт%=0
            'включить обработку COM-ввода
            com(1) on
            'настроить буфер ввода 1К
            $com1 1024
            'открыть файловую переменную,как com1
            open
            open "com1" as#1
            print 'нажать любую клавишу для прекращения программы"
            'пока клавиша не нажата
            while not instat
            'если буфер не пуст
            if КонецПрт%<>ЗаголовокПрт% then


            'отобразить ввод
            print "Ком-порт ввод:";КомПортВвод(КонецПрт%)
            'шаг к следущему месту в буфере
            КонецПрт%=КонецПрт%+1
            end if
            locate 2.1
            print time$
            wend
            end
            'обработать  ком-порт прерывание
            ПолучитьКомВвод:
            'читать ввод из Ком-Порт буфера
            input#1.КомПортВвод(ЗаголовокПрт%)
            'указать следущее буферное пространство
            ЗаголовокПрт%=ЗаголовокПрт%+1
            return
            КонецВвода:'окончить ком-порт ввод
            print "Достигнут конец ввода ..."
            end
           
           
            Функция COMMAND$
            ----------------
           
  Функция COMMAND$ возвращает командную строку ,используемую для запуска програ
 ------- ммы из DOS
           
 Синтаксис s$=COMMAND$
 ---------
           
 Замечания COMMAND$ возвращает все,что было набрано в DOS-подсказке,в  прцессе
  --------  возбуждения программы ,за исключением имени самой программы (неко-
  торые руководства ссылаются на этот текст,называя  его  "трейледом").Исполь-
  зуйте  COMMAND$  для  накопления  аргументов периода прогона,таких как имена
  файлов и опции программы.Рассмотрим ,например,DOS-команду:
            FASTSORT cust.dta cust.new
   где FASTSORT (быстрая сортировка)есть созданная Турбо-Бейсиком  .EXE  прог-
  рамма.Когда  FASTSORT  получает управление,COMMAND$ будет удерживать все,что
  было набрано в DOS подсказке после имени самой программы,т.е. в данном  слу-

                                     - 96 -
          
          
  чае  строку "cust.dta cust.new".Что делать с этой строкой (возможна разбивка
  COMMAND$ на файлаимя1 и файлаимя2 и сортировка содержимого файлаимя1 в новый
  файл файлаимя2) остается для решения в соответствии с определением FASTSORT.
    Для тестирования программы ,в которой используется  COMMAND$  ,в  пределах


  Турбо-Бейсика, применяется опция строки параметров из меню опций для установ-
  ки возвращаемой COMMAND$ строки.
           
 Ограничения Максимальная длина DOS-командной строки- 127 литер
 -----------
           
 Пример      'Эта программа демонстрирует функцию COMMAND$
            print "Параметром командной строки ,подаваемой в эту программу яв-
            'ляются
            print command$
            Компилируйте эту программу в память и прогоняйте дважды,каждый раз
  меняя ввод параметров в меню опций.
           
           
            Оператор COMMON
            ---------------
           
 Функция COMMON заявляет одну или более переменных,подлежащих подаче в соедине
 -------  ную цепочкой программу.
           
 Синтаксис COMMON переменная[,переменная]...
 ---------
            
 Замечания  Переменная-это  массивная  или скалярная переменная,которая должна
 --------- быть сделана доступной следующей соединяемой цепочкой программе.
  Массивы специфицируйте посредством включения числа размеров в скобках  после
  имени переменной.Операторы COMMON могут подаваться в любом месте программы и
  их может быть более одного но данная переменная может появляться только один
  раз.Совпадающие  операторы  COMMON  должны появляться в программе ,к которой
  привязывается цепочка.Имена переменных ,используемых в операторе  COMMON  не
  имеют  значения ,но их количество и тип важны.Если переменные,заявленные как
  общие в возбуждающей программе не совпадают по типу и количеству с  перемен-
  ными,заявленными  как  общие в принимающей программе ,то генерируется ошибка
  рериода прогона.
           
 Различия Турбо-Бейсик не поддерживает параметр CHAIN ALL ,обеспечиваемый  Ин-
 -------- терпретаторным  Бейсиком.Каждую  переменную  ,общий  доступ к которой
  должны иметь связываемые в цепочку программы,вы должны заявлять
  непосредственно.При специфицировании в Турбо-Бейсике в качестве общей  пере-
  менной  массива  ,необходимо специфицировать число измерений этого массива.В


  Интерпретаторном Бейсике совпадающие COMMON не требуется,поскольку COMMON  в
  нем необходимы только из CHAIN ,а внутрь CHAIN в них нет необходимости.Сдру-
  гой стороны Турбо-Бейсик требует ,чтобы переменные в каждом операторе COMMON
  были  правильно упорядочены.Другими словами,имена переменных в главной прог-
  рамме и программе-цепочкемогут отличаться ,но типы переменных должны  совпа-
  дать.Правильным является следущее  употребление COMMON :
            'Главная программа
            COMMON i%,Массив(1),j#
            'Цепная программа
            COMMON Цел%,ДействМасс(11),Двтчн#
     
 Ограничения  Турбо-Бейсик не поддерживает преодолеваемое CHAIN ALL COMMON Ин-
 ----------- терпретаторного Бейсика.
           
 Пример     'Эта программа демонстрирует оператор COMMON
 ------     'Чтобы исполнить эти программы выполняйте следущее
            '(1) компилировать первую программу в .EXE-файл
            '(2)компилировать вторую программу в .TBC-файл
            '(3) при DOS подсказке исполнить первую программу
            'Программа хозяин.Компилировать эту программу в .EXE-файл
            dim СтарыйМассив$(1) 'заявить двустрочный массив

                                     - 97 -
          
          
            СтарыйМассив$(0)="Это первая строка массива"
            СтарыйМассив$(1)="Это вторая строка массива"
            СтароеЦелое%=12345
            СтароеДлинноеЦелое&=123450000
            СароеЕдиничнойТочности!=12345.12345
            СтароеДвойнойТочности#=1.0E+300
            'специфицировать переменные ,которые являются общими для  программ
            'хозяин и слуга
            common СтарыйМассив(),СтароеЦелое%,СтароеДлинноеЦелое&,СтароеДвой-
            нойТочности#
            chain "Слуга.TBC" 'цепочка для программы слуга
            end
            'Программа Слуга.Компилировать эту цепочку в .TBC-файл
            common НовыйМассив(),НовоеЦелое%,НовоеДлинноеЦелое&,НовоеЕдинич-


             нойТочности!,НовоеДвойнойТочности#
            print НовыйМассив(0)
            print НовыйМассив(1)
            print НовоеЦелое%,НовоеДлинноеЦелое&,НовоеЕдиничнойТочности!,Ново-
             еДвойнойТочности#
           
           
           
            Функция COS
            -----------
           
 Функция    COS возвращает тригонометрический косинус
 -------
           
 Синтаксис  y=COS(числовое выражение)
 ---------
           
 Замечание Числовое выражение-это угол,специфицируемый в радианах.Чтобы преоб-
 --------- разовать радианы в градусы ,умножайте на 180/n.Для преобразования
  градусов в радианы   умножайте  на  n/180(См.обсуждение  радианов  в
  описании  функции ATN).COS возврвщает значение двойной точности.
           
 См.также   ATN
            SIN
            TAN
           
 Пример   pi=atn(1)*4
            for i%=0 to 360 step 45
            print using "Косинус ### градусов=##.##":i%,cos(pi#/180*i%)
          next i%
          end
           
           
            Функция CSNG
            ------------
           
  Функция CSNG преобразует числовое выражение в его эквивалент  единичной  точ-
 ------- ности .
           
 Синтаксис y=CSNG(числовое выражение)
 ---------
           
 Замечания CSNG преобразует числовое выражение или переменную в форму с плава-
 --------- ющей точкой единичной точности.CSNG обычно используется для предот-
  вращения промежуточного переполнения при обработке целых операндов.
           
 См.также   CDBL
            CINT
            CLNG
           
 Пример    print csng (&HFFF),csng(12345.1234),csng(&HF000)

                                     - 98 -
          
          
           
           
           
            Функция CSRLIN
            --------------
           
 Функция CSRLIN возвращает текущее положение курсора по вертикали (номер ряда)
 -------
           
 Синтаксис y=csrlin
 ---------
           


  Замечания CSRLIN возвращает целое от 1 до 25,представляющее текущее положение
 --------- по вертикали (номер ряда) курсора.Для считывания курсорного положе-
  ния по горизонтали (номер колонки) используйте функцию POS.
  Оператором LOCATE курсор перемещается в специфицируемые строку и колонку
           
  См.также  LOCATE
            POS
           
  Пример   Кол=pos 'сохранить ряд курсора
            Ряд=csrlin 'сохранить колонку курсора
            cls
            locate Ряд,Кол 'восстанавливается курсорная позиция
            end
           
           
           
            Функции CVI,CVL,CVS,CVD
            -----------------------
           
 Функции CVI,CVL,CVS,CVD преобразуют строчные данные,считываемые из произволь-
 ------- ных файлов,в числовую форму.
           
 Синтаксис y%=cvi(2байтовая строка)
 --------- y&=cvl(4 байтовая строка)
           y!=cvs(4 байтовая строка)
           y#=cvd(8 байтовая строка)
           
 Замечания  CVI преобразует 2-байтовую строку в целое.CVL преобразует 4-байто-
 --------- вую строку в длинное целое.CVS преобразует 4-байтовую строку в зна-
           чение единичной точности.CVD преобразует 8-байтовую строку в  значе-
 ние  двойной  точности.Применительно к способу обработки Турбо-Бейсиком произ-
 вольных файлов,числовые значения должны перед их записью  на  диск  транслиро-
 ваться  в строку,а при считывании файла-обратно в числа.Не путайте эти функции
 (предназначенные только для обработки произвольных файлов )с функцией VAL ,ко-
 торая принимает строку вроде "3.7"и превращает ее в число.
          
 См.также  MKD$
           MKI$
           MKL$
           MKS$
           
 Пример    'Эта программа создает файл данных произвольного доступа и записывает
           'в него некоторые данные.Затем эти данные считываются обратно
           'с преобразованием в приемлемую форму с использованием описанных вы-
           'ше функций
           'открыть файл произвольного доступа


           open "r",#1,"cvsld.dta",18
           field #1,2 as Целое$,4 as ДлинноеЦелое$,4 as ЕдиничнаяТочность$,8 as
           ДвойнаяТочность$
           МаксЦелое%=32767
           'записать данные в файл,преобразовать их и назначить в  буфер  перед
           'записью в файл данных
           for i%=1 to 5

                                     - 99 -
          
          
            lset Целое$=mki$(i%)
            lset ДлинноеЦелое$=mkl$(i%+clng(МаксЦелое%))
            lset ЕдиничнаяТочность$=mks$(csng(i%*csng(МаксЦелое%)))
            lset ДвойнаяТочность$=mkd$(МаксЦелое%^i%)
            put #1,i%
           next i%
           for i%=1 to 5 'считать данные из файла
            get #1,i% 'отобразить их на экране
            print cvi(Целое$),cvl(ДлинноеЦелое$),cvs(ЕдиничнаяТоч-
             ность$),cvd(ДвойнаяТочность$)
           next i%
           clise#1
           end
          
                                                                            
            
             Функции CVMD,CVMS
             -----------------
            
            
 Функция CVMD и CVMS преобразует строчные переменные,считываемые из произвол
 ------- ьных файлов в формате Микрософт,в числовую форму.
            
 Синтаксис  y!=CVMS(4-байтовая строка)
 ---------  y#=CVMD(8-байтовая строка)
            
 Замечания CVMS (Convert Microsoft Singl-precision string) преобразует 4-бай-
 ---------  товую строку,представляющую значение единичной точности в формате
 Микрософт,в  значение  единичной  точности  в  формате   IEEE   Турбо-Бейси-
 ка.CVMD(Convert  Microsoft  Double -precision string) преобразует 4-байтовую
 строку,представляющую значение двойной точности в формате  IEE  Турбо-Бейси-
 ка. Эти функции предусмотрены исклбчительно для совместимости с существующими
 файлами Интерпретаторного Бейсика.
            
 Пример      'открыть файл произвольного доступа
             open "cvmd.dta" as#1 len=12


             field#1,4 as Единичная$,as Двойная$
             for i=1 to 5 'записать некоторые данные в файл
             'преобразовать данные и назначить файл данных
             lset Единичная$=mkms$(i)
             lset Двойная$=mkmd$(i^i)
             put #1.1
             next i
             for i=1 to 5
             get #1,1
             print cvms(Единичная$),cvmd(Двойная$)
             next i%
             print cvs(x$),cvms(x$)
             close #1
             end
            
             
             Оператор DATA
             -------------
            
 Функция    DATA заявляет константы для операторов READ.
 -------
            
 Синтаксис  DATA константа[,константа]...
 ---------
            
 Замечания  Константа-это  числовая или строчная константа.Числовые константы
 --------- могут быть с плавающей точкой или целые и опционально могут  выра-
 жаться  как  шестнадцатиричные или восьмеричные.Строчные константы не должны
 заключаться в кавычки,если они не содержат разделители(запятые либо  двоето-

                                     -100 -
          
          
 чия) или значащие передние либо концевые пустоты,и могут свободно размещать-
 ся вперемежку с числовыми константами.Например:
             DATA Тако,.79,куриный предел,2.29,.29
   Программа может содержать много операторов DATA и они не обязательно долж-
 ны  быть  следующими  друг за другом строками.Каждое может содержать столько
 констант,сколько умещается в строке
             Во время прогона операторы READ  получают  доступ  к  константам
 DATA слева направо и сверху вниз в том порядке ,в каком они появляются в ис-
 ходной программе.Большинство общих ошибок ,ассоциируемых с оператором DATA и
 READ  получается  из-за несинхронности и попыток загрузить строчныю данные в
 числовую переменную;в результате генерируется ошибка 2 (синтаксическая ошиб-
 ка). К сожалению вы не получаете информацию об ошибке при загрузке  числовой
 константы  в  строчную  переменную,даже  если это не то ,что вы намеревались


 сделать.
   команда RESTORE позволяет вам повторно считывать константы из первого опе-
 ратора или любого специфицированного оператора DATA.Если вы пытаетесь реали-
 зовать READ большое число раз,чем имеет констант ваша программа,это приводит
 к ошибке 4 (вне данных).
            
 Ограничения Вы не можете использовать в операторах DATA литеры с непрерывным
 ----------- подчеркиванием .Не пользуйтесь единичной кавычкой (') для комен-
 тирования оператора DATA,поскольку Турбо-Бейсик может принять ее за  послед-
 ний  вход ,а ваш комментарий за часть данной одной длинной строчной констан-
 ты.Например:
             "Кнопки","собаки" и "свиньи'список животных."
             Вы можете ,однако ,безопасно использовать для этой цели :REM:
            
  См.также   READ
             RESTORE
            
 Пример      'Эта программа демонстрирует использование оператора DATA
             sub ОбработкаРезультатов(СтудентаИмя$,СтудентаСредний%)
             local Всего%,Бал%,i%
                Всего%=0
                read СтудентаИмя$
                for i%=1 to 10
                 read Бал%
                 Всеге%=Всего%+Бал%
                next i%
                СтудентаСредний%=Всего%\10
             end sub
             for Студент%=1 to 3
               call ОбработкаРезультатов(Симя$,Средний%)
               print using "&'s средний равен ###";симя$,средний%
             next Студент%
             end
              Ваши результаты:
             DATA В.Перри,78,65,35,79,86,93,79,85,99,96
             DATA П.Ватсон ,98,94,70,88,99,100,75,96,100,95
             DATA М.Чикконе,65,59,75,82,56,79,82,76,69,89
            
            
             Системная переменная DATE$
             --------------------------
            
  Функция    DATE$ устанавливает и устанавливает системмную дату.
  -------
            
  Синтаксис  DATE$=s$ (установить дату в соответствии с информацией в s$)


  ---------  s$=DATE$ (s$ содержит теперь информацию о дате)
             
  Замечания Системная дата устанавливается назначением правильно сформирован-
  --------- ного строчного значения в DATE$.Назначение DATE$  строчной  пере-
 менной делает системную дату доступной для обработки.DATE$ возвращает 10-ли-
 терную строку в форме мм-дд-гггг,где мм-месяц,дд-день,гггг-год.

                                     -101 -
          
          
             Чтобы изменить дату ,ваша строка должно иметь формат даты одного
 из следующих видов:
             мм-дд-гггг
             мм/дд/гг
             мм-дд-гггг
             мм/дд/гггг
    Например :"10-25-86" устанавливает системную дату на 25 октября 1986 года.
            
 Ограничения  Год  ,назначенный  в системной переменной DATE$ должен лежать в
 -----------  диапазоне 1980-2099 .
            
     См.также TIME$
            
 Пример      'отобразить текущую системную дату
             print "текущая системная дата";DATE$
             input "пожалуйста ,введите новую дату в форме мм-дд-гг";НоваяДата$
             DATE$=НоваяДата$
             print "Текущая системная дата установлена на ",DATE$
             end
            
            
             Оператор DECR
             -------------
            
 Функция     DECR сбрасывает переменную.
 -------
            
 Синтаксис  DECR переменная[,размер]
 ---------
            
 Замечания Переменная-это численная переменная ,а размер-опциональное  число-
 --------- вое  выражение,которое указывает значение,которое должно вычитаться
 из переменной.Если размер опускается,используется 1.
             DECR-лучший способ сбрасывания переменной .Для приращения  пере-
 менной используйте оператор INCR.
            
   См.также INCR
            
 Пример      i%=15
             j%=500
             while i%>0
             print i%,j%
             decr i%
             decr j%,5 'сбросить значение на 5


             wend
             end
            
            
             Оператор DEF FN/END DEF
             -----------------------
            
 Функция     DEF FN/END DEF определяет функцию.
 -------
            
 Синтаксис   Единичная строка:
 ---------   DEF FN идентификатор[(список аргументов)]=выражение
             Многострочная:
             DEF FN идентификатор[(список аргументов)]
             [LOCAL список переменных]
             [STATIC список переменных]
             [SHARED список переменных]
             .
             .
             .
             [EXIT DEF]

                                     -102 -
          
          
             [FN идентификатор=выражение]
             END DEF
            
 Замечания  Идентификатор- этоуникальное имя,которое должно ассоциироваться с
 --------- функцией и следовать соглашению об наименовании меток и переменных
 (т.е. представлять собой букву ,за которой следует любое  число  букв  и/или
 цифр).Список  аргументов  -это  опциональная,разделяемая занятыми последова-
 тельность формальныхпараметров.Параметры  ,используемые  в  списке  аргумен-
 тов,служат только для определения функции:они не имеют взаимосвязи с другими
 переменными программы,имеющими те же имена.скобки DEF FN и END DEF и имя по-
 добной  субпрограмме группы операторов называется функцией.Функции может оп-
 ционально подаваться один или более аргументов по назначению.Функции возвра-
 щают значение(тип которого управляется соответсвенно имени функции,как  если
 бы  это была переменная ) и поэтому могут вызываться из любого оператора,ко-
 торое способно принимать значение подходящего типа.
        Оперделение функций и программный поток
        ---------------------------------------
   Положение определений функций не имеет значения.Функция может быть опреде-
 лена в строке1 или строке 1000 программы,вне зависимости от того,где она ис-
 пользуется и вам нет необходимости пропускать программный поток  непосредст-


 венно через функцию в качестве шага возбуждения (что вы обязаны делать с од-
 нострочными функциями в Интерпрет.Бейсике).Компилятор просматривает ваши оп-
 ределения,где бы они ни были.
   Также,в  отличии от подпрограмм,исполнение не может неожиданно "приняться"
 за функцию.Для всего,что касается исполнительного прохода  программы,опреде-
 ления функций и процедур невидимы.Например:
             t=fnВыдатьШтат
             def fnВыдатьШтат
             print "Выдаю из fnВыдатьШтат"
             end def
   Когда  исполняется  эта  четырех  строчная  программа,сообщение появляется
 только один раз,посколтку ВыдатьШтаты вызывается только в первой  строке.
   Определения  функций должны трактоваться как изолированные острова кода;ни
 переходов в них,ни переходов из  них  с  помощью  оператора  GOTO,GOSUB  или
 RETURN не существует.Однако в пределах самих определений такие операторы су-
 ществуют .
   Следует  заметить  ,что  определения  функций  и  процедур  нельзя гнездо-
 вать,т.е. незаконно определять процедуру или функцию  внутри  процедуры  или
 функции(кажд-е определение процедуры или функции может содержать вызовы дру-
 гих процедур).
             Заявления локальных переменных(только многострочные функции)
             ------------------------------------------------------------
   Чтобы заявить локольные переменные в пределах функции,перед любыми исполь-
 зуемыми операторами в определении используйте оператор LOCAL.Например
             LOCAL a%,b#,БольшойМассив%()
   создает три локальных переменных:a%,b#,(целое и двойной точности соответс-
 твенно)  и массив БольшойМассив%.Затем массив должен быть надлежащим образом
 образмерен:
             DIM DYNAMIC БольшойМассив%(1000)
            
             Синтаксические и разделяемые переменные
             ---------------------------------------
   По умолчанию,переменные которые используются в  определении  функций,имеют
 атрибут  SHARED(разделяемые);т.е.  они  являются  глобольными  для остальной


 программы. Поскольку это умолчание может измениться ,вы обязаны  затрачивать-
 усилия на заявление каждой используемой в функции переменной.
   Заявляйте  переменные  с  атрибутом STATIC ,если важно чтобы переменная не
 теряла своего значения прикаждом возбуждении ,но  еще  могла  быть  изменена
 только внутри функции.
   Определение  многострочной функции обычно включает в себя назначение иден-
 тификатору функции и должно завершатся END  DEF.Если  вы  делаете  выбор  не
 включать назначение идентификатору функции ,то значение возвращаемое из фун-
 кции неопределенно.
   Используйте  для  возвращения  из  функции где-то в ином месте,чем в конце
 ее,оператор EXIT DEF.

                                     -103 -
          
          
   См.также  LOCAL
             SHARED
             STATIC
            
 Пример      $STACK &H&FFF
             Всего=1
             def fn факториал%(i%)
             'Эта функция вычисляет факториал параметра i%
             Всего=Всего*i%
             if i%>1 then
               Саб%=fnфакториал%(i%)
             endif
             fnфакториал%=Всего
             end def 'конец функции fnфакториал
             print "Ввести число,которое вы желаете обсчитать"
             input "факториал:",j%
             print fnфакториал%(j%)
             end
            
            
             Операторы DEFINT,DEFLNG,DEFSNG,DEFDBL,DEFSTR
             --------------------------------------------
            
 Функция     Заявляют тип идентификаторов переменных по умолчанию.
 --------
            
 Синтаксис   DEFтип буквенный диапазон[,буквенный диапазон]...
 ---------
            
 Замечания Тип  представляет  один  из  пяти  типов  переменных  Турбо-Бейси-
 --------- ка:INT(целое),LNG(длинная целая),SNG(единичной точности),DBL
 (двойной точности) и STR(строчная).Буквенный диапазон-это либо одна алфавитная
 литера (от а до z,регистр безразличен),либо диапазон букв(две буквы,


 разделенные тире;например ,А-М).
  Оператор DEFтип сообщает компилятору ,что переменные и определяемые пользо-
 вателем  функции  ,начинающиеся  со  специфицированных  букв  или  диапазона
 букв,будут определенного типа. Это дает вам возможность использовать перемен-
 ные,иные ,чем с плавающей точкой единичной точности,в  вашей  программе  без
 включения идентификаторов типа (например, %,#)
  По умолчанию,когда компилятором обнаруживается имя переменной без идентифи-
 катора  типа,оно предполагается переменной с плавающей точкой единичной точ-
 ности.Например,в приведенном ниже операторе и n и m полагаются имеющими еди-
 ничную точность:
             n=m+16
  Если ,однако,Этому оператору предшествовало DEFINT n,m ,то n,m должны  быть
 целыми,как и любая другая переменная 6имя которой начинается с n или m верх-
 него или нижнего регистра.
  Исполнение DEFтип в Турбо-Бейсике отдичается от исполнения в Интерпрет.Бей-
 сике.Интерпретатор  судит  о  типе соответственно тому,где появился оператор
 DEFтип в порядке исполнения программы.Турбо-Бейсик,как компилятор,рассматри-
 вает положение DEFтип в исходном файле.Например,при исполнении этой программы:
             10 goto 30
             20 defint a-m
             30 j=45.3:print j
   интерпрет.Бейсик никогда не заметит заявление типа в  строке  20.Когда  он
 добирается до j в строке 30 это j становится переменной единичной точности и
 не  читается  как 45.3.Турбо-Бейсик ,наоборот,принимает решение о типе пере-
 менной во время компиляции вне зависимости от исполнительного прохода(о  ко-
 тором  во  время  компилировании  ничего не известно).Необходимо позаботится
 только отом ,чтобы оператор DEFINT физически появился до появления j впервые
 ,в результате чего jоказывается целой переменной и распечатывается 45.
            
 Ограничения Оператором DEFтип будет переопределяться тип любых соответствую-
 ----------- щих переменных ,которые уже используются  в  программе.Программа
 следующего примера демонстрирует этот крайне важный момент.



                                     -104 -
          
          
            
 Пример      i=39567.999
             print "число ед.точности",i
             defsng i
             print "целое число",i
             defdbl a-c
             deflng j-z
             a=32767.1
             z=-1
             i=&H8FFF
             print "три разных типа",f,z,i
             end
            
            
             Оператор DEF SEG
             ----------------
             
  Функция DEF SEG определяет сегмент данных,подлежащих использованию оператор
 ------- ами BLOAD,BSAVE,CALL,ABSOLUTE,PEEK и POKE.
            
 Синтаксис  DEF SEG [=числовое выражение]
 ---------
            
 Замечания  Числовое выражение может находится в диапазоне от 0 до 65535.
 --------- DEF SEG определяет сегмент памяти в котором будут специфицировать-
 ся              ответвления              последущими             операторами
 BLOAD,BSAVE,CALL,ABSOLUTE,PEEK,POKE.Сегмент -это адресующая  конструкция,ис-
 пользуемая  процессорами  семейства Интел 86.Адреса должны специфицироваться
 двумя целыми,сегмент и ответвление в сегмент.
  DEF SEG без аргумента возвращает значение сегмента к его значению по умоча-
 нию на момент запуска.первые 256 байтов сегмента по умолчанию  содержат  ин-
 формацию  ,используемую системой поддержки времени прогона вашей программы.В
 этом сегменте есть один  интересный  адрес  при  ответвлении  &HF4E.Значения
 вставленные командой POKE по этому адресу изменяют текст записанный на экра-
 не  в любом графическом режиме.Цвет зависит от того ,в каком режиме вы нахо-
 дились.Другой полезный адрес в сегменте  данных  по  умолчанию  находится  в
 ячейке 0 и 1.Это слово содержит сегмент строк Турбо-Бейсика.
   См.также  COLOR
            
 Пример 'Эта программа заполняет экран буквами А ,вставленными непосредстве
        '  нно в видео-память.определить функцию ,которая устанавливает адрес
        'видео-памяти .Получить тип видео платы от пользователя


             def fn ВидеоЭкран%
               local ЭкранаТип%
               print "тип экрана ?"
               input "[1 для моно,2 для цветного]",ЭкранаТип%
               select case ЭкранаТип%
                case 1
                  fn ВидеоЭкран%=&HB000
                case 2
                  fn ВидеоЭкран%=&HB800
                end select
              end def
             def seg=fnВидеоЭкран%
             for i%=0 to 4000 step 2
             poke i%,asc("A")
             next i%
             end
            
            
             Оператор DELAY
             --------------
            
 Функция    DELAY вставляет паузу
 -------

                                     -105 -
          
          
            
 Синтаксис  DELAY секунды
 ---------
            
 Замечания секунда-это числовое выражение,определяющее число секунд паузы,вы-
 --------- полняемой Турбо-Бейсиком перед использованием  следущего  операто-
 ра.Примечание:DELAY принимает аргументы с плавающей точкой,а дробные задерж-
 ки можно специфицировать с разрешением примерно 0.054.
  Использование DELAY ,а не программного цикла ничегонеделания,сказывается на
 программах,которые  прогоняются на машинах с разной скоростью обработки(т.е.
  базирующихся на 8088 по сравнению с базирующимися на 80286,или 6Мгц по срав-
 нению с 8Мгц).
            
 Пример print "Нажмите любую кнопку для завершения программы"
             while not instat
             locate 10,30
             print time$
             delay 5
             wend
             end
            
 
             Оператор DIM
             ------------
            
 Функция     DIM заявляет массив
 -------
            
 Синтаксис   DIM{static!dynamic}переменная(подстрочный    индекс)[,перемен-
 ---------   ная(подстрочный индекс )]...
             DIM {static!dynamic}переменная(мин:макс)[,мин:макс]...)[,пере-
 менная(мин:макс)[,мин:макс]...)]...


            
 Замечание Переменная -это идентификатор,используемый для массива.Подстрочный
 --------- индекс- это разделяемый запятыми список одного или более целых  вы-
 ражений,определяющий размеры массива.DIM заявляет массивные переменные и оп-
 ределяет  их размер и число измерений.В порядке улучшения синтаксиса интерп-
 ретаторного Бейсика,Турбо-Бейсик дает вам  возможность  определять  диапазон
 значений подстпрочных индексов(мин:макс),а не только верхний предел,например:
             DIM B(50:60)
  создает  массив  из  11  элементов  единичной  точности,нумеруемых от 50 до
 60.Оператором
             DIM C(50:60,25:45)
    создается двумерный массив с общим числом элементов 11*21.
    Синтаксис диапазона можно расширять на многомерные массивы:
             DIM рождения(1800:1899,1:12)
    Для определения наименьшего элемента в массиве можно  также  использовать
 связанные  операторы  OPTION  BASE,хотя  диапазонный механизм более мощное и
 предпочтительное средство.
    Когда программа используется  впервые,Турбо-Бейсик  устанавливает  каждый
 элемент числового массива в 0,а строчные массивы-в нуль-строку(длина=0).Если
 программа запускается вновь с помощью оператора RUN,числовые массивы повтор-
 но устанавливаются в ноль ,а строчные массивы в ноль-строку.
    Если  массивная  переменная  используется  без  предшествующего оператора
 DIM,максимальным подстрочным индексом является значение 10 по  умолчанию,как
 если бы включили (10) в ваш оператор DIM.Однако предпочтительно в практичес-
 кой работе заявлять каждый массив явно.
    Минимальное  значение ,которое можно использовать в качестве подстрочного
 индекса в амссивах,есть 0,если не специфицируется  иное  с  помощью  команды
 OPTION BASE.
    Опциональные  аргументы  STATIC  и  DYNAMIC управляют ,соответственно,тем
 ,будет ли пространство для массива заранее  распределяться  компилятором,или
 подлежит распределению динамически.Если этот аргумент опускается ,массивы по
 умолчанию   размещаются  как  статические,если  уже  не  задан  метаоператор


 $DYNAMIC,если в заявлении DIM не используется какое-либо выражение,если  имя

                                     -106 -
          
          
 массива  не  появляется в двух операторах DIM или если массив не заявлен ло-
 кальным в процедуре либо функции.
    Переключатель проверки границ ,доступный через меню опций,вызывает созда-
 ние компилятором кода,которым проверяется приемлемость подстрочных  индексов
 при всякой ссылке на массив.
            
 Различия Турбо-Бейсик_ дает возможность программисту специфицировать началь-
 ный и конечный индексы массива.Интерпретаторный Бейсик размещает все массивы
 динамически,но Турбо-Бейсик будет пытаться разместить их статически(во время
 компилирования),что  делает их более быстродоступными.Вы можете явно преодо-
 левать тип используемого размещения.
            
 См.также  $DYNAMIC
           FRE
           $STATIC
            
 Пример      %МаксРазм=20
             %МинРазм=1
             dim Массив%(%МинРазм:%МаксРазм)
             for счетчикi%=%МинРазм TO %МаксРазм
              Массив%(счетчикi%=%Минразм to %МаксРазм
              Массив%(счетчикi%)=int(rnd*10)
             next счетчикi%
             end
            
            
             Оператор DO/LOOP
             ----------------
            
 Функция DO/LOOP -это цикл с текстом TRUE (истинно) или FALSE (ложно) в верх
 ------- ней и/или нижней части цикла.
            
 Синтаксис   DO[{WHILE!UNTIL}выражение]
 ---------   .
             . операторы [EXIT LOOP]
             .
             [LOOP!WEND][{WHILE!UNTIL}выражение]
            
 Замечания Выражение-это числовое выражение  ,в  котором  ненулевые  значения
 --------- представляют  TRUE,а нулевые-FALSE.
  DO  и  LOOP представляют собой строительные элементы циклов для всех случа-
 ев.Они позволяют вам создавать циклы с тестированием  условия  завершения  в
 верхней  части цикла ,в нижней его части и в обоих местах.Оператор DO всегда
 должен быть в паре с оператором LOOP в нижней части цикла.Несоврадение DO  и


 LOOP приводит к ошибкам периода компилирования.
  Используйте WHILE и UNTIL для добавления какого-то теста к DO/LOOP .Исполь-
 зование  резервированного  слова  WHILE  удобно при необходимости повторения
 цикла ,если выражение ИСТИННО и его прекращении ,если выражение  ЛОЖНО.UNTIL
 вызывает  противоположный  эффект,т.е. цикл будет прекращаться ,если условие
 ИСТИННО,и будет повторятся ,если оно ЛОЖНО.
            
 Например:   DO WHILE a=13
             .
             .ОПЕРАТОРЫ
             .
             LOOP
             исполняет операторы между DO и LOOP,пока а равно 13.
             DO UNTIL a=13                            -
             .
             .ОПЕРАТОРЫ
             .
              LOOP
             исполняет операторы между DO и LOOP ,пока а не равно 13.
  В любой точке DO/ LOOP вы можете включать оператор EXIT/LOOP.Это эквивалент-
 но GOTO к оператору ,которое выполняется после завершения  LOOP.(Более  под-

                                     -107 -
          
          
 робно см.в описании оператора EXIT).
  Обратите внимание на то ,что это DO/LOOP:
             DO WHILE A<B
             .
             .
             .
             LOOP
             имеет тот же эффект ,что и цикл WHILE/WEND:
             WHILE A<B
             .
             .
             .
             WEND
  Хотя компилятором не реализуется забота о подобных вещах,делайте отступ для
 операторов  между  DO и LOOP на пару пробелов.Это помогает яснее представить
 структуру цикла.
            
 Пример      DO 'Эта программа ждет нажатия клавиши
             LOOP UNTIL INSTAT
             END
            
            
             Оператор DRAW
             -------------
            
 Функция     DRAW обеспечивает вычерчивание контуров на графическом экране.
 -------
            
 Синтаксис   DRAW строчное выражение
 ---------
            
 Замечания DRAW дает графику обьектов на графическом экране в соответствии  с
 --------- командами,заключенными в строчный аргумент ,который в него подается.


 В действительности " строчное выражение" есть программа для интерпретаторного
 "языка" DRAW.Оператор DRAW обеспечивает исполнение командных строк для полу-
 чения  изображений  на экране во многом также как и PLAY исполняет командные
 строки для создания музыки.
 
        -----------------------------------------------
             Перемещение             Команды
        -----------------------------------------------
             Un                 Переместить вверх
             Dn                 Переместить вниз
             Ln                 Переместить влево
             Rn                 переместить вправо
             En                 Переместить вверх и вправо
             Fn                 Переместить вниз и вправо
             Cn                 Переместить вниз и влево
             Hn                 Переместить вверх и влево
         -----------------------------------------------
             n -расстояние перемещения(см.Sn,масштабный коэффициент,обсуждае-
 мый ниже).
 Перемещение всегда начинается в LRP и соответственно регулирует LRP(LRP  оз-
 начает  "точка  последней  посылки") и определяе последнюю точку ,на которую
 ссылались определенные чертежные операторы.Более детальную информацию см.  в
 разделе графики ГЛАВЫ 4).
             Например:
             DRAW "D10R5"
             обеспечивает   вычерчивание  L-образной  формы  (вниз  10,вправо
 5),начиная с LPR.При этом LPR устанавливается  в  последнем  задействованном
 пикселе.
    Мx,y  обеспечивает перемещение в координату x,y.Если перед x стоит знак
 плюс или минус ,перемещение относительное,иначе оно абсолютное,например:
             DRAW "D10R5 M30,50"
             обеспечивает вычерчивание L-формы ,а затем доводит ее линией  до

                                     -108 -
          
          
 пиксела(30,50).
   Любой команде перемещения могут предшествовать следующие префиксы:
             В -обеспечивает перемещение без графического изображения


             N -обеспечивает перемещение ,но также возврат в исходное положе-
 ние по окончании.
    Например:
             DRAW "BM180,20NU10ND101L10NR10"
             обеспечивает  перемещение  без  вычерчивания в пиксел (180,20),а
 затем вычерчивание знака плюс
             Другие команды
             --------------
   An- обеспечивает установку угла n.Значение n может лежать в диапазоне от  0
      до  3,где  0  соответствует  0  градусов,1-90 градусам,2-180 градусам и
 3-270 градусам.
   TAn-обеспечивает поворот на n градусов.Значение n может находится в диапа-
 зоне от -360 до +360 градусов.Если n  положительно  ,поворот  осуществляется
 против часовой стрелки,а если n-отрицательно ,то по часовой стрелке.Значения
  вне законного диапазона вызывают ошибку 5 периода прогона.
   Cn-обеспечивает  вычерчивание  в цвете n.Относительно диапазона n 6сверяй-
 тесь с оператором PALETTE в каждом режиме  отображения.Цветом  по  умолчанию
 является наивысший законный атрибут.
   Sn-обеспечивает установку масштабного коэффициента как n/4,где n может ле-
 жать  в диапазоне от 0 дл 255.Например,если n=8,масштабный коэффициент равен
 2.В операторе DRAW осуществляется умножение масштабного коэффициента на  ар-
 гументы  при  U,D,L,R,E,F,G,H и относящихся к ним командам М для определения
 крайнего размера обьектов.По умолчанию n равно 4,что дает масштабный коэффи-
 циент равный 1(т.е. без мастабирования).Видовое отношение дисплея которым вы
 пользуетесь определяется взаимосвязью X  и  Y.На  идеальном  ,несуществующим
 дисплее  с  видовым  отношением 1/1 точка в направлении X имеет ту же длинну
 ,что и в направлении Y.Однако дисплеи для IBM-компьютеров имеют следущие ви-
 довые отношения:
      ----------------------------------------------------------------
       Монитор-адаптер  Экран 1  Экран 2  Экран 7/8/9   Экран 10
      ----------------------------------------------------------------
          Цветной       5/6        5/12       нет          нет


          Улучшенный    5/6        5/12       8.76/12      нет
        Улучшенный моно нет        нет        нет        9.57/12
      ----------------------------------------------------------------
             X VARPRT$(переменная) обеспечивает исполнение  субстроки,т.е.ис-
 полняет  вторую командную строку из первичной DRAW строки.X-команда в чем-то
 подобна GOSUB;например:
             DRAW "X"+VARPRT$(x$)
     P цвет ,граница стартует на текущей (x,y) координате и обеспечивает  за-
 полнение цветом ЦВЕТ,останавливаясь на зонах цвета ГРАНИЦА.
     В каждом случае аргумент n,x или y может быть либо константой либо пере-
 менной в форме
             =VARPRT$(переменная);
             Например:
             DRAW "e15"
             то же ,что и
             а=15
             DRAW "e="+VARPRT$(a)
     DRAW  игнорирует пробелы в своей командной строке-вы можете пожелать ис-
 пользовать их ,чтобы сделать вашу DRAW-программу более читабельной.
            
 Ограничения Турбо-Бейсик не распознает имена переменных в DRAW  строках.Поэ-
 тому  вы  должны для доступа к содержимому переменных в пределах DRAW-строки
 во время прогона пользоваться VARPRT$(n).Вместо DRAW "U=I%"
             используйте DRAW "U="+VARPRT$(I%)
         
 Пример     screen 1
             домик$="u20 c5 e20 h5 d20 l30
             draw домик$
             draw "be3"
             draw "p1,3"

                                     -109 -
          
          
             for i%=1 to 280 step 40
               draw "m="+varprt$(i%)+",40"
               draw домик$
             next i%
             end
            
             Оператор END
             ------------
            
 Функция END завершает исполнение программы или определяет конкц структурного
 ------- блока.
            
 Синтаксис END[{DEF!IF!SELECT!SUB}]
 ---------
            
 Замечания END без аргументов  завершает  исполнение  программы.Оператор  END


 --------- можно размещать где угодно в программе и их может быть более одного.
 Обнаружение END вызывает закрытие прораммой всех открытых файлов и возврат в
 DOS (или в Турбо-Бейсик,в зависимости от того откуда была запущена программа
 в  работу).END компилятором строго не требуется,хотя практически его исполь-
 зовать рекомендуется.Если программа выходит ,исполнив все операторы,достига-
 ется тот же эффект.
   END ,за которым следуют резервированные слова DEF,IF,SUB,SELECT,определяют
 конец структурного блока.
   См.также  DEF
             IF
             SELECT
             STOP
             SUB
            
  Пример     sub ПустаяПроц
              print "алло"
             endsub
             def fn ПустаяФункц$
             end def
             input "Исполнить процедуру или функцию[1или2]";Который%
              if Который%>0 then
                select case Который%
                 case 1
                   call ПустаяПроц
                   end
                 case 2
                   print fnПустаяФункц$
                   end
                 case else
                  print "Был сделан незаконный выбор"
                end select
             end if
             end
            
            
             Оператор ENDMEM
             ---------------
            
 Функция     ENDMEM возвращает адрес конца физической памяти.
 -------
            
 Синтаксис   y=ENDMEM
 ---------
            
 Замечания ENDMEM возвращает длинное целое ,представляющего адрес  последнего
 ---------  байта физической памяти.ENDMEM в сочетании с MEMSET можно исполь-
 зовать для размещения пространства в высокой памяти для  программ  на  языке
 ассемблера.Пока используется программа ,находящаяся в памяти,ENDMEM в дейст-
 вительности возврващает конец физической памяти минус размер символьной таб-

                                     -110 -
          
          
 лицы.Когда Турбо-Бейсик осуществляет компилирование в память ,он обеспечива-


  ет хранение символьной таблицы по наивысшему адресу памяти.
   См.также MEMSET
            
 Пример     PRINT "Конец адресуемой памяти равен:",endmem
             end
             
            
             Оператор ENVIRON
             ----------------
            
 Функция    ENVIRON модифицирует информацию в таблице среды.
 -------
            
 Синтаксис  ENVIRON строчное выражение
 ---------
            
 Замечания  Строчное  выражение  определяет имя параметра,подлежащего измене-
 --------- нию,добавлению или стиранию,и собственно информацию о новом
 параметре.Эти две части должны разделятся знаком равенства(=).
 ENVIRON и родственная ему функция  ENVIRON$  используютяс  для  конфигурации
 среды,подлежащей  подаче  в программы,исполняемые через оператор SHELL.(Под-
 робную информацию см. в описании оператора SHELL и команды SET  в  справочном
 руководстве по DOS) .
             Например:ENVIRON "PATH=\TURBOBAS"
             устанавливает DOS-параметр PATH на "TURBOBAS".Следовательно про-
 пущенная через SHELL копия COMMAND.COM будет автоматически искать справочник
 \TURBOBAS для нахождения файлов,которых нетв текущем справочнике.Чтобы стереть
 параметр  из  таблицы среды ,после знака рквенства ставится только двоеточие
 (:):
             ENVIRON "PATH=:"
             стирает из таблицы среды параметр прохода(PATH)
            
 Ограничения Вы не можете расширять пространство среды.Чтобы добавлять  новые
 ----------- входы вы должны освободить пространство,стирая существующие вхо-
 ды.
     См.также ENVIRON$
              SHELL
            
 Пример      PRINT ENVIRON$("PATH")
             ENVIRON "PATH=\"
            
            
             Функция ENVIRON$
             ----------------
            
  Функция    ENVIRON$ выдает параметр таблицы среды
  -------
            
  Синтаксис  s$=ENVIRON$(строка параметров)
  ---------  s$=ENVIRON$(n)
            


  Замечания   Строка  параметров  -это  строчное  выражение,содержащее  пара-
  --------- метр,подлежащий выдаче. n- целое выражение в  диапазоне  от  1  до
 255.ENVIRON$ и родственный ей оператор ENVIRON используются для конфигуриро-
 вании   среды,подлежащей  подаче  в  программы,используемые  через  оператор
 SHELL.Если используется строчный аргумент ,ENVIRON$ возвращает текст,который
 следует за строкой параметров в таблице среды.Следует заметить ENVIRON$  де-
 лает  различие  букв  верхнего и нижнего регистров.Если строка параметров не
 обнаруживается или за знаком равенства никакой текст не следует,возврашается
 нуль-строка.Если используется числовая форма ,ENVIRON$ возвращает строку,со-
 держащую n-ый параметр,считая от начала таблицы.Если n-го параметра нет,воз-
 вращается нуль-строка.
            
            

                                     -111 -
          
          
             Функция EOF
             -----------
            
  Функция    EOF возвращает состояние конца файла.
  -------
            
  Синтаксис  y=EOF(ФайлНом)
  ---------
            
  Замечания  ФайлНом-это значение,специфицированное при открытии файла.
  ---------- EOF возвращает TRUE (-1) ,если на  специфицированном  файле  был
 достигнут  конец  файла;иначе  возвращается FALSE (0).EОF законна только для
 дисковых файлов,открытых для последовательного доступа и для  коммуникацион-
 ных  файлов .Возвращение функцией EOF (-1) для коммуникационных файлов озна-
 чает ,что буфер пуст.
            
  Пример     OPEN "TEXT.DTA" FOR INPUT AS #1
             верх:
                IF EOF(1) THEN
                  PRINT C"записей (строк) в файле TEXT.DTA"
                  ENDIF
                  INPUT#1,пусто$
                  C=C+1
                  GOTO верх
             'или ,более элегантно
             OPEN "TEXT.DTA" FOR INPUT AS #1
             WHILE NOT EOF(1)
               INPUT#1 пусто$
               INCR c


             WEND
             PRINT c" записей (строк в файле TEXT.DTA":END
            
            
            
            
             Функция ERADR
             -------------
            
 Функция     ERADR возвращает адрес самой последней ошибки.
 -------
            
 Синтаксис   y=ERADR
 ---------
            
 Замечания ERADR возвращает значение длинного целого ,представляющего положе-
 --------- ние самой последней ошибки .ERADR есть некоторое значение програм-
 много  счетчика ,которое выводилось бы ,но не выведено ,поскольку не включи-
 лось отслеживание ошибок(т.е. его можно можно использовать посредством вклю-
 чения выбора ошибок из меню опций для нахождения положения в исходной  прог-
 рамме того оператора,которое генерирует ошибку).
  ERADR предназначена в качестве функции некоторой последней пересортировки в
 подпрограммах обработки ошибок.Если какая-то подпрограмма ошибок не распола-
 гает  схемой обработки конкретной ошибки,вы ,по крайней мере ,можете вывести
 код ошибки(ERR) и ERADR на экран,и таким образом сообщить вашим  пользовате-
 лям о необходимости отчитаться о случившимся.
   См.также  ERL
             ERR
             ERROR
             ON ERROR
            
 Пример      ON ERROR GOTO ЛОВУШКА
             DIM X%(10)
             FOR I%=1 TO 10
              READ X%(I%) 'СЧИТАТЬ X 10 РАЗ
             PRINT X%(I%) '

                                     -112 -
          
          
             NEXT I%
             'В ПАМЯТИ НЕДОСТАТОЧНОЕ ЧИСЛО ЭЛЕМЕНТОВ ДАННЫХ
             DATA 1,2,3,4,5,6,7
             END 'СЛЕДУЮЩИЙ ОБРАБОТЧИК ОШИБОК ВЫВОДИТ НОМЕР И АДРЕС ОШИБКИ
             ЛОВУШКА :
             LOCATE 10,15
             'ВЫВЕСТИ СООбЩЕНИЕ В СЕРЕДИНЕ эКРАНА
             PRINT "ОШИбКА ТИПА "ERR" ПРОИЗОШЛА ПО АДРЕСУ "ERADR
             LOCATE 11,15
             PRINT "ПОжАЛУЙСТА ,ОТМЕТЬТЕ ЭТИ ЗНАЧЕНИЯ И СВЕРТЕСЬ С РУКОВОДСТ-
 ВОМ"
             END


            
            
             Оператор ERASE
             --------------
            
  Функция ERASE стирает динамические массивы и повторно устанавливает статиче
-------- ские.
            
 Синтаксис  ERASE имя массива[,имя массива]...
 ---------
            
 Замечания Имя массива -это имя того массива(вов),который вы желаете повторно
 ---------  установить или исключить из размещения .Следует заметить,что пус-
 тые скобки не должны входить в ИМЯ МАССИВА.Если ИМЯ МАССИВА относится к  ди-
 намическому массиву,его пространство в памяти освобождается и это имя масси-
 ва в дальнейшем можно образмерить вновь с помощью другого оператора DIM.Если
 ИМЯ  МАССИВА  относится к статическому массиву ,при стирании с помощью ERASE
 его элементы просто очищаются в 0(или в нуль-строку ,для строчных массивов).
      
 Ограничения Вы не можете стереть массив ,который никогда не  существовал,или
 ----------- в случае динамических массивов уже был стерт.
            
 Различия  Турбо-Бейсик дает возможность создания статических массивов ,кото-
 -------- рые быстрее динамических массивов.Интерпретаторный Бейсик допускает
 только динамические массивы.
    См.также CLEAR
             DIM
             $DYNAMIC
             FRE
             $STATIC
            
 Пример      ON ERROE GOTO ОшибокОбработчик
             PRINT FRE(-1)
             DIM DYNAMIC БольщойМассив(10000)
             БольшойМассив(6666)=66
             PRINT FRE9-10
             ERASE БольшойМассив
             PRINT FRE(-1)
             'этот оператор будет возвращать  ошибку  ,если  программа  будет
             'прогоняться с включенной проверкой границ
             PRINT БольшойМассив(6666)
             END
             ОшибокОбработчик:
             PRINT "ошибка типа "ERR
             PRINT "произошла по адресу "ERADR
             END
            
            
            
             Функции ERDEV,ERDEV$
             --------------------


            
 Функция  ERDEV,ERDEV$ возвращают информацию о приводном устройстве.
                                     -113 -
          
          
 -------
            
 Синтаксис  y=ERDEV
 ---------  y=ERDEV$
            
 Замечания  Когда возникает ошибка устройства ,целая функция ERDEV возвращает
 ---------  информацию об ошибке в своем младшем байте .Этот байт представляет
 код ошибки INT24.Старший байт содержит биты 15,14,13,3,2,1 и  0  атрибутного
 слова  устройства.ERDEV$ содержит имя устройства :8 байтор для литерных уст-
 ройств и 2-для блочных устройств.(См.более детальную информацию в  техничес-
  ком справочном руководстве по IBM DOS).
            
 Пример      ON ERROR GOTO ОшибокОбработчик
             PRINT "Открыть путь на устройство А и нажать любую клавишу..."
             WHILE NOT INSTAT:WEND
             FILES "A:\"." "
             END
             ОбработчикОшибок:
             PRINT USING "Угрожающая ошибка ## имела место на & ":ERDEV,ERDEV$
             RESUME NEXT
            
            
             Функции ERL,ERR
             ---------------
            
   Функция   ERL И ERR возврашают строку и код самой последней ошибки.
   -------
    
   Синтаксис y=ERL
   --------- y=ERR
            
   Замечания  ERL  возврашает номер строки самой последней ошибки.Если ошибка
   ---------  произошла в операторе без номера строки ,ERL возвращает номер
 ближайшей  нумерованной  строки в направлении к началу программы.Если между
 точкой ошибки и началом программы нумерованных строк нет,ERL возвращает 0.
   ERR возвращает номер самой последней ошибки периода прогона.Тестируйте  ее
 в  подпрограммах отслеживания ошибок с целью исполнения кода,подходящего для
 произошедшей ошибки по типу.
   Примечание: Операторы ERL RESUME и RESUME NEXT  приводят  к  генерированию
 компилятором  4-байтового указателя для каждого оператора в программе.Следо-
 вательно программисты,имеющие дело с размером генерируемых ими  кодов,должны


 принимать  это  во  внимание.При использовании RESUME [строка#] генерируется
 единственная инструкция перехода.ERL обычно используется в отладочных  целях
 ,поэтому все это ,вероятно имеет небольшое значение.
            
  Различия  Правила ,касающиеся того ,с какой стороны относительного оператора
  ---------  сравниваемый  по ERL номер должен находится,неприемлемы для Тур-
 бо-Бейсика.Это связано с тем ,что в Турбо-Бейсике нет инструкции RENUM.Кроме
 того,В Турбо- Бейсике неприемлен результат ERL Интерпретаторного  Бейсика,по-
 лучающийся при возникновении ошибки во время исполнения оператора DIRECT MODE.
   См.также  ERADR
             ERROR
             ON ERROR
            
  Пример     ON ERROR GOTO Ловушка
             DIM X%(10)
             FOR I%=1 TO 10
             40 READ X%(I%)
                PRINT X%(I%)
             NEXT I%
             'имеется недостаточное число элементов данных
             70 DATA 1,2,3,4,5,6,7
             80 END
             90 Ловушка:
             IF ERL=40 THEN
                                     -114 -
          
          
              RESTORE
              RESUME
             ELSE
              PRINT "Неизветсная ошибка":END
             ENDIF
                         
            
             Оператор ERROR
             -------------
            
  Функция    ERROR вынуждает ошибку периода прогона.
  -------
          
  Синтаксис  ERROR ОшибкиКод
  ---------
             
  Замечания  ОшибкиКод-это целое выражение от 0 до 255.Если ОшибкиКод-заранее
  --------- определенный код ошибки (см.приложение Е),то ERROR вызывает такое
  поведение  вашей  программы,как  если бы произошла ошибка.Это предусмотрено
 для отладки подпрограмм отслеживания ошибок .
  Чтобы определить ваши собственные коды ошибок,используйте в ОшибкиКод такие
 значения ,которые не используются Турбо-Бейсиком.Если вы не определяете про-
 цедуру обработки ошибок для этих  новых  потребительских  кодов  ошибок,Тур-


 бо-Бейсик отображает сообщение:
             Ошибка n в программном счетчике:адрес
             (Error n at pgm-ct :адрес)
             где n-код ошибки,адрес-значение из программного счетчика процес-
  сора во время обнаружения ошибки .
            
  Пример     DEF FN функ%=(x%)
             IF x%>65 THEN
              ERROR 5 'ошибка вызова незаконной функции
             ELSE
              FNфунк%=x%+100
             ENDIF
             END DEF
             PRINT FNфунк(65) 'вызвать ошибку незаконного вызова функции
            
            
             Оператор EXIT
             -------------
            
  Функция    EXIT преждевременно оставляет какую либо структуру.
  -------
            
  Синтаксис  EXIT{SELECT!DEF!FOR!IF!LOOP!SUB!WHILE}
  ---------
            
  Замечания  Оператор  EXIT  позволяет вам оставлять структурный оператор или
  --------- определение процедуры и функции в каком-то ином месте,чем ее  ко-
 нец.Тип структуры,подвергаемой действию оператора EXIT,должен включать в се-
 бя,как составную часть,оператора EXIT в соответствии со следущим списком:
             --------------------------------------------------
             EXIT-опция     Подвергаемая EXIT структура
             --------------------------------------------------
             SELECT         Оператор SELECT
             DEF            Определение функции
             FOR            Цикл FOR/NEXT
             IF             IF-блок
             LOOP           Цикл DO/LOOP
             SUB            Определение процедуры
             WHILE          Цикл WHILE/WEND
             --------------------------------------------------
   При использовании EXIT можно сэкономить на беспорядочных GOTO.
            
                                     -115 -
          
          
  Ограничения  Когда EXIT используется для выхода из функции,вы должны назна-
  -----------  чать функции результат до исполнения EXIT.
            
  Пример 'Эта программа демонстрирует все операторы EXIT.Для прекращения исп


         'олнения используются и процедура и функция.
             SUB Управление (Выб%,Пусто%)
             SELECT CASE Выб%
              CASE 1
             ' использовать оператор CASE для сообщения пользователю чего-то о
             'вводимом числе
             SELECT CASE Пусто%
               CASE<0
                PRINT "Число меньше нуля"
                'выити из оператора SELECT CASE
                EXIT SELECT
               CASE >0
                PRINT "Число больше нуля"
                EXIT SELECT
               CASE ELSE
                PRINT "Число равно нулю"
             END SELECT
             EXIT SUB
             CASE 2
              IF Пусто%<0 THEN
                PRINT "Число меньше нуля"
                EXIT IF
              ELSEIF Пусто%>0 THEN
               PRINT "Число больше нуля"
               EXIT IF
              ELSE
               PRINT "Число равно нулю"
              ENDIF
             END SELECT PRINT "Вы выбрали число 2"
             END SUB
             DEF FN Циклы(Выб%)
             'Параметр подаваемый в функцию ,указывает какое EXIT  будет  ис-
             'полняться  .Каждая цикловая структура делает одно и то же,чтобы
             'продемонстрировать как может использоваться EXIT для  завершения
             'исполнения  цикла.Мы также демонстрируем как можно использовать
             'EXIT для выхода из функции.EXIT DEF используется для выхода  из
             'первых  двух случаев выбора.Это предотвращает исполнение опера-
             'торов вывода на экран.
             'назначить значение результату функции
             FNциклы=-1
            SELECT CASE Выб%
             CASE 1
             'использовать EXIT ,чтобы оставить этот  цикл,вместо  того,чтобы
             'позволить ему завершится нормально
             FOR I%=1 TO 32767
              PRINT RND(Пусто%)
              EXIT FOR


             NEXT I%
             EXIT DEF
             CASE 2
             DO
              PRINT RND(Пусто%)
              EXIT LOOP
             LOOP
             EXIT DEF
             CASE 3
             WHILE 1
               PRINT RND(пусто%)
               EXIT LOOP
             WEND
             END SELECT
                                     -116 -
          
          
             PRINT "Вы исполнили выбор случая 3"
             END DEF
             'начать главную программу
     'сделать три вызова циклов , выбирая каждый раз иной из имеющихся
             PRINT FNЦиклы(1)
             PRINT FNЦиклы(2)
             PRINT FNЦиклы(3)
             INPUT "Введите число:"Пусто%
             FOR Счетчик%=1 to 2
               CALL Управление(Счетчик%,Пусто%)
               CALL Управление(Счетчик%,Пусто%)
             NEXT Счетчик%
             END
            
            
 
             Функции EXP,EXP2,EXP10
             ----------------------
                          x           x         x
  Функция    EXP возвращает e  ;EXP10- 10  ;EXP2- 2 .
   ------
      
  Синтаксис  EXP:
  ---------  y=EXP(x)
             EXP2:
             y=EXP2(x)
             EXP10:
             y=EXP10(x)
            
 Замечания EXP возвращает e встепени x,где x-числовое выражение ,а e-основа-
 ---------  ние натуральных логарифмов,равное приблизительно 2.718252.Тот же
 результат вы получите с помощью оператора e^x.Только с помощью EXP вы можете
 вычислить само e :e=EXP(1)
    EXP2 возвращает 2 в степени x ,где x  -числовая  переменная  или
 выражение.Тот  же результат вы можете получить с помощью выражения 2^x.
    EXP10  возвращает  10 в степени x ,где x числовая переменная или
 выражение.Тот же результат вы можете получить с помощью выражения 10^x.
    EXP,EXP2,EXP10 возвращают результат двойной точности.
            
 Пример      FOR I=1 TO 10
              PRINT USING "Экспонента ##=####^^^^":I,EXP(I)


             NEXT I
             END
            
            
             Оператор FIELD
             --------------
             
  Функция FIELD определяет переменные поля в буфере файла произвольного досту
 ------- па.
            
 Синтаксис FIELD [#]Файланом,ширина AS строчная переменная.
 ---------
            
 Замечания Файланом-это номер,используемый ,когда файл открывается,ширина-это
 --------- число байтов, распределяемой для переменной поля,а строчная  пере-
 менная-это сама переменная поля.
 Однажды используемые в операторе FIELD строчные переменные приобретают ста-
 тус "переменная поля".Они должны назначаться при подготовке записи в указан-
 ный файл произвольного доступа только с использованием RSET и LSET.
            
 Ограничения Идентификатор ,используемый в операторе FIELD,никогда не должен
 -----------  применяться  с левлй стороны в оперпторе присваивания.Если это
 происходит,то данный идеттификатор более не идентифицируется с  определени-
 яим полей файла произвольного доступа.
                                     -117 -
          
          
   См.также  LSET
             RSET
            
 Пример  OPEN "FIELD.DTA" FOR OUTPUT AS #1 LEN=18
         FIELD  #1,2  AS  Целое$,4  AS  ДлинноеЦелое$,4 AS ЕдиничнаяТоч-
 ность$,8 AS ДвойнаяТочность$
             FIELD #1,2 AS A$,4 AS B$,4 AS C$,8 AS D$
             МаксЦелое%=32767
             FOR I%=1 TO 5
             LSET Целое;=MKI$(I%)
             LSET ДлинноеЦелое$=MKL$(I%+CLNG(МаксЦелое%))
             LSET ЕдиничнаяТочность$=MKS$(CSNG(I%*CSNG(МаксЦелое%)))
             LSET ДвойнаяТочность$=MKD$(МаксЦелое%-I%)
             PUT #1,I%
             NEXT I%
             FOR I% TO 5
             GET #1,I%
              PRINT CVI(A$),CVL(B$),CVS(C$),CVD(D$)
             NEXT I%
             CLOSE #1
             END
            
            
             Оператор FILES
             --------------
            
 Функция FILES отображает содержание справочника (подобно DIR -команде DOS).


 -------
            
 Синтаксис  FILES [файласпец]
 ---------
            
 Замечания Файласпец-это строчное выражение ,следующее  соглашениям  DOS  об
 ---------  именовании файлов,и может опционально включать в себя специфика-
 тор привода и информацию о проходе.Если  файласпец  опускается,отображаются
 все файлы текущего справочника.
 Файласпец  может  содержать  свободно  определяемые литеры:?,*,аналогично
 DIR-команде из DOS.
             FILES *.*
             дает перечень всех файлов текущего справочника.
             FILES *.BAS
             дает перечень исходных файлов Турбо-Бейсика.
 В конце FILES ,отображается число свободных байтов на устройстве ,содержа-
 щем текущий справочник.Файлы субсправочника указуваются суффиксом DIR.
            
 Ограничения Спецификация несуществующего привода или справочника в операто-
 ----------- ре FILES будет вызывать ошибку периода прогона.
            
 Пример INPUT "Введите привод и справочник ,по которому вы желаете иметь п
         еречень":Спр$
             FILES Спр$
             END
            
            
             Функция FIX
             -----------
            
 Функция    FIX дает усечение целого.
 -------
            
 Синтаксис  y=FIX(числовое выражение)
 ---------
            
 Замечания FIX отсекает дробную часть аргумента и возвращает целую (в отличии
                                     -118 -
          
          
 --------- от CINT и INT ,которые выполняют округление).
    См.также CEIL
             CINT
             INT
            
  Пример   FOR I=50 TO 52 STEP RND
              PRINT USING "Целая часть ##.##=##":x,FIX(x)
           NEXT I
           END
            
            
             Операторы FOR/NEXT
             ------------------
            
 Функция  FOR и NEXT определяют цикл с автоматическим наращиванием (или умень-
 -------  шением).
  
 Синтаксис   FOR переменная=x TO y [STEP z]
 ---------   .


             .
             .
             NEXT [переменная[,переменная]...]
 Замечания  Переменная-это  числовая переменная,служащее  счетчиком цикла,тогда
 --------- как x,y,z-это числовые выражения,определяющие условия начала и ос-
 тановки цикла.X-начальное  значение  счетчика,y-конечное  значение  счетчика
 счетчика,а z-опциональное значение наращивания.
 Операторы  между  FOR  и  NEXT используются в режиме повторения.при каждом
  проходе через цикл переменная наращивается на z .Если z опускается,то  шаго-
 вое  значение по умолчанию равно 1.Цикл завершается ,когда значение счетчика
 больше или равно y (или ,для отрицательного z ,меньше или равно y)7
 Циклы FOR/NEXT прогоняются быстрее всего прицелых переменных,как  перемен-
 ной счетчика,так и константах x,y,z.Корпус цикла пропускается полностью,если
 начальное  значение  x  меньше  y.Циклы FOR/NEXT могут гнездоваться в других
 циклах FOR/NEXT.убедитесь в  том  ,что  используются  уникальные  переменные
 счетчиков и обеспечиваете гарантию появления оператора NEXT внутреннего цик-
 ла ранее NEXT внешнего цикла.
 Этот цикл имеет пересечение циклов и не будет компилироваться:
             FOR n=1 TO 10
             FOR m=1 TO 20
             .
             .
             .
             NEXT n
             NEXT m
 Если множество циклов оканчивается в одной и той же точке,достаточно един-
 ственного оператора NEXT,содержащего каждую переменную счетчика:
             FOR n=1 TO 10
             FOR m=1 TO 20
             .
             .
             .
             NEXT m,n
 Переменная  счетчика  в  операторе  NEXT  может опускаться вовсе,но если вы
 включаете ее,она должна быть правильной.
   Например:
             FOR n=1 TO 10
             .
             .
             .
             NEXT
 Хотя компилятор не заботится о  таких  вещах,делайте  уступ  в  операторах
 FOR/NEXT  на  два  или  три пробела для разметки структуры цикла.Используйте
 оператор EXIT FOR с целью покинуть цикл FOR/NEXT до его завершения.


  Если обнаруживается NEXT без соответствующего FOR ,возникает ошибка 1 .
            
                                     -119 -
          
          
   Пример FOR I%=1 TO 10
             PRINT "Для цикловой итерации "I%
          NEXT I%
          PRINT "Нажмите любую клавишу ..."
          WHILE NOT INSTAT
          WEND
          FOR I% TO 50 STEP -5
             PRINT "Для цикловой итерации"(45-I%)\5
          NEXT
          END
            
            
            
             Функция FRE
             -----------
            
 Функция FRE возвращает величину свободной памяти ,имеющейся для вашей прог-
 ------- раммы .
            
  Синтаксис  y=FRE({строчное выражение!-1!-2})
  ---------
            
 Замечания FRE со строчным аргументом возвращает длинное  целое,представляю-
 --------- щее  число байтов свободной RAM( с помощью произвольного доступа)
 в строчной памяти.FRE(-1) возвращает свободную RAM в  пространстве  массивов
 вашей прораммы.FRE(-2) говорит как много места осталось в стеке.
            
 Различия  Функция  FRE Турбо-Бейсика дает больше информации,чем аналогичная
 -------- функция Интерпретаторного Бейсика.Оператор FRE в  Интерпретаторном
 Бейсике  возвращает величину наличной памяти в сегментах данных Бейсика;сле-
 довательно вызов FRE (S$) и FRE(0) возвращают одно и то же число.
 Однако,поскольку Турбо-Бейсик обеспечивает больше памяти ,в которой  рабо-
 тает,его  оператор  FRE  имеет  больше  функций.Турбо-Бейсик имеет отдельный
 строчный сегмент ;следовательно FRE(S$) возвращает наличное строчное  прост-
 ранство.Турбо-Бейсик  имеет  большое  (64К)  массивное  пространство,поэтому
 FRE(-1) возврашает наличную память для массивов.И Турбо-Бейсик  поддерживает
 процедуры  и  реккурсивность,поэтому  FRE(-2)  возвращает  наличное стековое
 пространство.
  Пример     ON ERROR GOTO ОшибкиОбработчик
             PRINT FRE ("Строчное Пространство"),FRE(-1),FRE(-2)


             DIM DYNAMIC БольшойМассив(10000)
             БольшойМассив(6666)=66
  'отобразить память,имеющуюся в сегментах строк,данных и стека
             s$="abc...z"
             PRINT FRE("Строчное пространство"),FRE(-1),FRE(-2)
  'эта  программа  дает ошибку ,если прогоняется с включенной при-
              вязкой границ
             PRINT БольшойМассив(6666)
             END
             ОшибкиОбработчик:
             PRINT "Ошибка типа "ERR"произошла по адресу "ERADR
             END
            
            
             Оператор GET (файлы)
             --------------------
            
 Функция   GET обеспечивает считывание записи из произвольного файла.
 -------
            
  Синтаксис GET [#]файланом[,записином]
  ---------
            
 Замечания Файланом-это номер файла ,под которым он был открыт,а записином-
 --------- запись подлежащая считыванию от 1 до 16777215         ---------
                                     -120 -
          
          
 Если записином опускается,то считывается следущая по порядку запись  (после
 специфицированной самым последним GET или PUT).
 
  Пример OPEN "GET.DTA" AS #1 LEN 18
  FIELD #1,2 AS Целое$,4 AS ДлинноеЦелое$,4 as ЕдиничнаяТочность$,8 as
         ДвойнаяТочность$
         FIELD #1,2 AS a$,4 AS B$,4 AS C$,8 AS D$
         МаксЦелое%=32767
         FOR I% TO 5
          LSET Целое$=MKI$(I%)
          LSET ДлинноеЦелое$=MKL$(I%+CLNG(МаксЦелое%))
          LSET ЕдиничнаяТочность$=MKS$(CSNG(I%*CSNG(МаксЦелое%)))
          LSET ДвойноеЦелое$=MKD$(МаксЦелое%^I%)
          PUT #1,I%
         NEXT I%
         FOR I%=1 TO 5
          GET #1,I%
            PRINT CVI(A$),CVL(B$),CVS(C$),CVD(D$)
         NEXT I%
         CLOSE #1
         END
            
            
             Оператор GET (графика)
             ----------------------
            
 Функция GET обеспечивает считывание всего или части графического экрана в м


 ------- ассив.
           
  Синтаксис GET (x1,y1)-(x2,y2),Массив
  ----------
            
 Замечания (x1,y1) и (x2,y2) специфицируют верхнюю левую и нижнюю правую гра-
 ---------  ницы  зоны  графического  экрана,подлежащей  обработке оператором
 GET.Массив -это числовой массив.
 GET и его дополнительная команда PUT исползуются сначала для считывания ,а
 затем для записи графических изображений на  экран.Единственное  ограничение
 накладываемое на числовой массив,который используется для хранения считывае-
 мых с экрана данных,состоит в том ,что он должен быть достаточно большим для
 этого.Для  расчета  размера массива ,необходимого для хранения заданной доли
 экрана,используйте следующую формулу:
 Необходимо байтов:4+INT((x*битов на пиксел+7/8)*y,где y и x-горизонталь-
 ный и вертикальный размеры захватываемой зоны.
 Битов на пиксель-константа,относящееся к режиму :
             2-для средней
             1-для высокой разрешающей способности.
             --------------------------------------
              Экран       Битов на пиксель
             --------------------------------------
                  1                  2
                  2                  1
                  7                  4
                  8                  4
                  9                  4
                 10                  2
             --------------------------------------
 Например для хранении изображения при средней  разрешающей  способности  35
 пикселей шириной  и 45 высотой вам необходим массив
   4+int((32*2+7)/8)*45 байтов или 409 байтов.409 байтов представля-
 ют собой целый массив из 205 элементов,следовательно массив заявляемый с по-
 мощью  оператора  размера  DIM буфер%(204),примет проделанную работу.Помните
 ,что по умолчанию каждый массив имеет нулевой элемент;так что в массиве  бу-
 фер% имеется 205 двухбайтовых элементов,от 0 до 204,т.е всего 410 байтов).
 Турбо-Бейсик хранит графические данные в следущем формате:


            буфер%(0): число битов по горизонтали
                                     -121 -
          
           
             буфер%(1)%число битов по вертикали
             буфер%(2)
             .
             .  Собственно графическая информация
             .
             буфер%(204)
 
 В  силу  особенности  организации дисплейной памяти,оживление работы на базе
 GET и PUT идет быстрее ,если вы выбираете зоны экрана,выровненные по  байто-
 вым  границам.Для  средней  разрешающей  способности  используйте значения x
 кратное 4;для высокой разреш.способности -кратное 8.
 Базисная стратегия использования GET и PUT для живой обработки  обьекта  от
 точки А до точки В состоит в следущем:
             Чертить обьект
             GET обьект в массив
             позиция=старая ячейка=точка А
             DO UNTIL позиция =точка В
              PUT XOR обьект в старой ячейке
              позиция=позиция + приращение
              PUT XOR обьект в позиции
              задержать,если необходимо
              старая позиция=позиция
             LOOP
            
  Пример     'разместить буфер для хранения графического образа
             DIM Буфер%(143)
        'Переключить на графический режим среднего разрешения
             SCREEN 1
             CIRCLE (16,16),8,2 'чертить окружность
             GET (0,0)-(31,31),Буфер% 'получить окружность
             'копировать все на экран
             FOR I%=0 TO 9
              PUT (I%*32,100),Буфер%
             NEXT I%
             END
             
            
             Функция GET$
             ------------
            
 Функция GET$ считывает строку из файла,открытого в режиме BINARY (двоичном).
 -------
            
 Синтаксис GET$ [#]файланом,счетчик,строчная переменная
  ---------
            
 Замечания Счетчик -это целое выражение в диапазоне от 0 до 32767.
 ---------  GET$  считывает  счетчик  байтов,начиная с текущей файловой пози-
 ции(которая может быть установлена оператором SEEK),из файла номер  файланом


 и  назначает считанное строчной переменной. файл файлном должен быть открыт в
 режиме BINARY.После обработки GET$ текущая файловая позиция будет продвинута
 вперед на счетчик байтов.
 GET$,PUT$ и SEEK обеспечивают низкоуровневую альтернативу приемов обработ-
 ки последовательных и произвольных файлов,которая дает вам возможность иметь
 с файлами дело на байтовой основе.
            
   См.также  OPEN
             PUT$
             SEEK
            
  Пример     SUB создатьФайл
             'GET$ открывает файл и записывает в него 256 литер
             LOCAL I%
             OPEN "GET.DTA" FOR BINARY AS #1
             FOR I%=0 TO 256
                                     -122 -
          
          
             PUT$ #1,I%,CHR$(I%)
             NEXT I%
             END SUB
             DEF FNЧитатьЭл$(Начало%,Размер%)
             LOCAL времСтр$,Лит$,I%
             SEEK 1,Начало%
             GET$ #1,Размер%,ВремСтр$
             FNЧитатьЭл$=ВремСтр$
             END DEF
             CALL Создатьфайл
             PRINT "Введите строчную точку [0...255] и сколько"
             PRINT "байтов данных [0...255] вы желаете
             PRINT "считать из файла ",Ст%,Рз%
             PRINT FNчитать Эл$(Ст%,Рз%)
             END
            
            
             Оператор GOSUB
             --------------
            
  Функция  GOSUB возбуждает подпрограмму
  -------
            
  Синтаксис GOSUB метка
  ---------
            
 Замечания Оператор GOSUB вызывает переход Турбо-Бейсика к оператору ,имеюще-
 --------- му перед собой метку ,после предварительного обеспечения  хранения
 текущего  адреса в стеке.Использование RETURN возвращает управление к опера-
 тору ,следущему за GOSUB .Процедуры и функции Турбо-Бейсика могут  выполнять
 работу подпрограмм с добавлением выигрыша в реккурсивности,подачи параметров
 и локальных и статических переменных.
     
    См.также DEF FN
             SUB


             RETURN
            
  Пример     PI#=ATN(1)*4
             радиус =55
             GOSUB РасчетПлощади
             радиус=13
             GOSUB РасчетПлощади
             END
             РасчетПлощади:
               Площадь=PI#*радиус^2
             PRINT Площадь
             RETURN
            
            
             Оператор GOTO
             -------------
            
  Функция GOTO направляет программный поток к оператору идентифицируемуму мет-
 ------- кой .
            
  Синтаксис GOTO метка
  ---------
            
 Замечания  GOTO  вызывает  безусловное  смещение  программного потока к коду
 --------- идентифицирумому меткой.При умеренном использовании операторы GOTO
 представляют собой быстрое и эффективное средство программирования.При  без-
 заботном  использовании  они загромождают программу переплетениями,в которых
 невозможно разобраться( особенно через месяц и годы после написания ).В сов-
 ременной практике программирования стремятся минимизировать применение  GOTO
 с помощью подпрограмм,процедур и функций,а также структурных операторов ,та-
                                     -123 -
          
          
 ких  как FOR/NEXT,WHILE/WEND,DO/LOOP,IF BLOCK и SELECT.Уменьшению применения
 GOTO также способствует оператор EXIT.
    См.также EXIT
            
  Пример     x=0
             Начало:
             x=x+1
             IF x<20 THEN
              GOTO Распечатать
             END IF
             END
             Распечатать:
             PRINT "Переменная x="x
             GOTO Начало
            
            
             Функция HEX$
             ------------
             
 Функция   HEX$ преобразует число в его шестнадцптиричный строчный эквивалент.
  -------
            
  Синтаксис s$=HEX$(числовое выражение)
  ---------
            
 Замечания числовое выражение может  находиться  в  диапазоне  от  -32768  до
 --------- 65535.Любая  дробная  часть  числового выражения округляется перед


 созданием строки.Если аргумент HEX$ отрицателен ,то эта  функция  возвращает
 двоичное дополнение числа.
     См.также BIN$
              OCT$
            
    Пример  PRINT HEX$(65535)
             PRINT HEX$(-1)
            
            
            
             Оператор IF
             -----------
            
 Функция IF тестирует условие и изменяет программный поток,если условие удовл
 ------- етворяется.
            
 Синтаксис IF целое выражение[,] THEN оператор(ы)
 --------- [ELSE оператор(ы)]
            
 Замечания  Если  целое  выражение TRUE используются операторы следущие после
 --------- THEN и любого опционального ELSE.Если выражение FALSE ,то исполня-
 ются операторы после ELSE.Если опциональная статья ELSE опускается ,исполне-
 ние продолжается со следущей строки программы.
 Обычно целое выражение будет результатом,возвращаемым  оператором  отноше-
 ния,хотя и не всегда,как показано ниже:
             IF ПринтерВкл THEN LPRINT Ответ$
 Здесь  оператор lprint используется только ,"флаговая переменная Принтервкл
 имеет ненулевое значение.Перед ключевым словом  ELSE  не  должно  появляться
 двоеточие;например,следущий оператор компилироваться не будет:
             IF a<b THEN c=d:ELSE e=f
 Оператор IF и всеассоциируемые с ним операторы ,включая следущие после ELSE
 должны появляться в одной и той же логической строке.Поэтому следущее неза-
 конно:
             IF a<b THEN t=15:w=13:v=23
             ELSE t=17:w=16:v=15
 поскольку компилятор трактует вторую строку как совершенно новый оператор,не
 связанный  с  находящимся выше него .Если количество выших операторов больше
 ,чем можно разместить в одной строке,вы должны воспользоваться литерой  ука-
                                     -124 -
          
          
 зания  непрерывности  строки,подчеркиванием  (_) ,применяемой для разделения
 единой логической строки на нескоько физических строк.Например:
             IF a<b THEN t=15:w=16:v=23_


             ELSE t=17:w=16:v=15
 однако лучшая альтернатива состоит в использовании блокового оператора  IF
. Вы можете использовать блоковый оператор IF такжк для формирования многост-
  рочного ряда IF -операторов.
             
 Различия Турбо-Бейсик имеет расширенный оператор IF THEN ELSE для обеспечи-
 вания  множества строк кода в структцре IF THEN ELSE .Турбо-Бейсик обеспечи-
 вает также операторы ELSEIF ,ENDIF для блокового IF -оператора.
            
    См.также IF блок
             SELECT
            
    Пример   INPUT "Введите число",x
             IF x>100 THEN PRINT "Большое число" ELSE_
             PRINT "Малое число"
             END
            
            
             Блоковый оператор IF
             --------------------
            
   Функция IF блок создает ряд IF-операторов
   -------
            
   Синтаксис IF целое выражение [,] THEN
             .
             .
             .Операторы
             [ELSEIF целое выражение [,] THEN
             .
             .
             . Операторы]
             [ELSE
             .
             .
             .Операторы]
              ENDIF
            
                      
 Замечания IF блок -это расширение  Интерпретаторного  Бейсика  ,позволяющее
 --------- осуществлять множество тестов на множестве строк.
 При исполнении операторов IF блока проежде всего проверяется истинность вы-
 ражения  в  операторе  IF.Если  FALSE проверяется по порядку кождый следущий
 оператор ELSEIF.Как только находится TRUE ,Турбо-Бейсик исполняющий операто-
 ры следующие за соответствующим THEN ,осуществляет переход к оператору  сле-
 дующему за оператором ENDIF без проведения дальнейших тестов.Операторы после
 опциональной  статьи ELSE исполняются,если ни один из ранее проведенных тес-
 тов не оказался успешным.
 Следует заметить ,что в первой строке IF блока после ключевого слова  THEN
 ничего  не может быть ,таким образом компилятору сообщается ,что это IF блок


 ,а не обычный оператор IF.
 Операторы IF блока могут  гнездоваться,т.е.  любые  операторыпосле  любого
 THEN  могут содержать IF блоки.(Полезно делать отступ операторов,находящихся
  под управлением каждого теста на пару пробелов,как показано в следущем ниже
  примере.
 Блоковые операторы IF должны оканчиваться END IF.Заметьте,что END IF запи-
 сывается с пробелом ,а ELSEIF без пробела.
     
   См.также SELECT
            
   Пример:  RANDOMIZE TIMER
             БанкРулетки=100:Ставка=5:ЗначЗадержки=.5
                                     -125 -
          
          
             WHILE NOT INSTAT 'нажать клавишу останова
             Рулетка=INT(RND(1)*6)+INT(RND(1)*6)+2
             PRINT STRING$ (30."_")
             PRINT Рулетка:DELAY ЗначениеЗадержки
   IF Рулетка=2 OR Рулетка=3 OR Рулетка=12 THEN PRINT "вы проиграли"
             БанкРулетки=БанкРулетки+Ставка
             ELSE
              PRINT "ваша точка есть" Рулетка
              Неточка=-1
              WHILE Неточка
               СледРулетка=INT(RND(1)*6)+INT(RND(1)*6)+2
               PRINT СледРулетка:DELAY ЗначениеЗадержки
               IF Рулетка=СледРулетка THEN
                 PRINT "Вы проиграли"
                 БанкРулетки=БанкРулетки+Ставка
                 Неточка=0
               ELSEIF СледРулетка=7 THEN
                PRINT "Вы проиграли"
                БанкРулетка=БанкРулетка-Ставка
                Неточка=0
             'закончить IF рулетка=блок СледРулетка
             END IF
             WEND
             END IF
             WEND
            
            
             Оператор INCR
             -------------
            
    Функция  INCR наращивает значение.
    -------
            
   Синтаксис INCR числовая переменная[,размер]
   ----------
            
 Замечания  Размер-это  опциональное  числовое выражение,которым указывается
 --------- значение добавляемое к специфицированной  переменной.Если  размер


 опускается,используется 1.
 INCR  - это быстрый способ приращения переменной без применения оператора
 присваивания.
            
 Различия Этого оператора в Интерпретаторном Бейсике не существует.
 --------
            
   См.также DECR
            
   Пример    I%=-15
             J%=-500
             WHILE I%<0
             PRINT I%,J%
             INCR I%
             INCR J%,5
             WEND
             END
            
            
            
                                                                            
             Функция INKEY$
             --------------
            
 Функция    INKEY$ считывает клавиатуру без эхо-обработки литеры.
 --------
            
                                     -126 -
          
          
  Синтаксис  s$=INKEY$
  ---------
            
 Замечания  INKEY$  возвращает строку из 0,1 или 2 литер,отражающую состояние
 --------- буфера клавиатуры.
 Нуль-строка (LEN(s$)=0) означает ,что буфер пуст.Строка  длиной  (LEN(s$)=1)
 означает  ,что строка содержит ASCII- значение клавиши нажатой самой послед-
 ней;например ,13 для Enter(ввод),65 для A.
 Двумерная строка (LEN(s$)=2) означает ,что была  нажата  не  ASCII  -клави-
 ша.Первая  литера  в  этой  строке имеет значение 0,а вторая-код расширенной
 клавиатуры-представляет  одну  из  клавиш  не  ASCII  -клавиатуры,такую  как
 Home(исходное),PgDn(страница  вниз)  или клавиши стрелки (см.диаграмму кодов
 расширенной клавиатуры в приложении F).
 Если нажимается определенная функциональная клавиша  (см.оператор  KEY),то
 INKEY$  возврашает  последовательность литер (по одной на каждое возбуждение
 INKEY$),которая содержит литеры,которые получились бы при их независимом на-
 боре.INKEY$ как пуленепробиваемое устройство для получения пользовательского
 ввода в вашу программу без ограничений оператора INPUT .Поскольку INKEY$  не
 ожидает литеру,подлежащую нажатию до возвращения результата ,вы в большинст-
 ве  случаев  будете  использовать ее внутри цикла низкоуровневой подпрограм-


 мы,непрерывно проверяющей и строящей строку ввода,подлежащую проверке  подп-
 рограммами более высокого уровня.
 INKEY$  подает все удары по клавиатуре включая клавиши управления,такие как
 Таб,Enter,Backspace в вашу программу без их отображения  или  обработки  ,но
 при следующих исключениях :
 -  Ctrl-Break  (управление-разрыв)  завершает  программу ,если опция разрыва
 клавиатуры не была выключена во время компилирования программы.
 - Ctrl-Alt-Del (управление-изменить-стереть)  вызывает  повторную  установку
 системы.
 - Shift-PrtSc (сдвиг-вывод на экран)выполняет сброс экрана.
                
   См.также INSTAT
   --------
 Пример        PRINT "Введите несколько литер,за которыми следует <Enter>:"
                 WHILE лит$<>CHAR$(13)
                  лит$=INKEY$
                  ВводаСтрока$=ВводаСтрока+лит$
                 WEND
                 PRINT ВводаСтрока
                 END
                
                
                 Функция INP
                 -----------
                
 Функция     INP считывает с внешнего устройства ввода/вывода.
 -------
                
  Синтаксис  y=INP(портаном)
  ---------
                
 Замечания INP возврашает байт ,считываемый с устройства внешнего ввода/выво-
 --------- да портаном ,где портаном указывает аппаратное устройство внешнего
 ввода и должен иметь значение в диапазоне от 0 до 65635.
 INP полезна для считывания информации о состоянии,представляемой различными
 аппаратными подсистемами,такими как коммуникационные устройства(См.техничес-
 кое справочное руководство по Вашему компьютеру о назначении внешних устрой-
 ств).
 Для записи на внешний ввод/вывод используйте оператор OUT.
  См. также     OUT
                
 Пример 'эта программа издает вопль посредством считывания регистра сост
'ояния  и  тумблерного  переключения  (включения  и выключения ) би-
 тов,которыми управляется звукогенератор.
     'считать значение внешнего ввода 61 шестнадцатиричное


                                     -127 -
          
          
                 СостояниеРег%=INP(&61)
                 СостояниеРег%=СостояниеРег% AND H00FC
                 'маскировать считанное значение
                 ' сделать длину тона достаточной для слуха
                 FOR I=1 TO 1000
                  СостояниеРег%=СостояниеРег% XOR 2
                  OUT &H61,СостояниеРег%
                  Задержка  .001
                 NEXT I
                 END
                
                
                 Оператор INPUT
                 --------------
                
 Функция INPUT дает пользовательскую подсказку о необходимости назначить зна-
 ------- чения одной или более переменных.
                
 Синтаксис INPUT[;][строка-подсказка{;!,}]список переменных.
  ---------
                 
 Замечания Строка-подсказка-это опциональная строчная константа.Список  пере-
 ---------  менных-это  разделенная  запятыми последовательность из одной или
 более строчных либо числовых переменных.
 INPUT ожидает пользовательского ввода данных с клавиатуры  и  назначает  эти
 данные одной или более переменных.
 Если  после строки-подсказки вы включаете точку с запятой ,Турбо_Бейсик вы-
 водит после строки знак вопроса.Использованием вместо этого запятой вызывает
 подавление знака вопроса.
 Ваш ввод должен совпадать с типом переменных в операторе INPUT ;т.е. нечис-
 ловые литеры неприемлемы для  числовых  переменных.Если  ввод  не  совпадает
 ,Турбо-Бейсик  будет требовать повторного ввода информации.Например,введение
 нечисловых литер в числовую приводит к сообщению
                 ?Redo from start (Переделать с начала)
 Если дается подсказка на более ,чем одну переменную в единственном операто-
 ре INPUT,ваш ответ на каждую из них должен отделяться запятыми.
 Если точка с запятой появляется сразу после  ключевого  слова  INPUT,курсор
 будет оставаться в той же самой строке после нажатия вами Enter для заверше-
 ния ответа.Иначе на дисплей посылается пара возврат каретки/подача строки.


 Различия  Турбо-Бейсик  допускает разделение вводимой информации в ответ на
 оператор INPUT либо пробелами,либо запятыми.Интерпретаторный  Бейсик  требу-
 ет,чтобы весь ввод разделялся запятыми.
  
    Пример INPUT "Ведите ваш возраст и вес:",Возраст,Вес
                 PRINT USING "Вам ### лет и ваш вес ###";_
                              Возраст,Вес
                 END
                
                
                 Оператор INPUT #
                 ---------------
                
 Функция  INPUT #  загружает переменные данные из файла последовательного дос-
 ------- тупа.
              
 Синтаксис INPUT #файланом,список переменных
  ---------
                
 Замечания Файланом-это номер ,который дается при открывании файла ,а  список
 ---------  переменных-это  разделяемая  запятыми последовательность из одной
 или более строчных либо числовых переменных.
 Файл может быть дисковым,последовательного входного устройства (COM n)  или
 клавиатурным (KYBD).
 Данные в файле должны совпадать по типу с переменными 6определяемыми в опе-
 раторе  INPUT  #.Переменная должна появляться сразу ,как только была набрана
                                     -128 -
          
          
 вами в ответ на оператор INPUT;т.е. она должна отделяться запятыми с возвра-
 том каретки в конце.Это тот путь,которым оператором WRITE # создаются файлы.
                
   См.также      WRITE #
                
   Пример        SUB Сделатьфайл
                 OPEN "INPUT#.DTA" FOR OUTPUT AS #1
                 Строчнаяпеременная$="я вернусь"
                 Целая%=1000
                 Плавающаяточка!=30000.1234
                 WRITE #1
                 CLOSE 1
                 END SUB
                 SUB Читатьфайл
                 OPEN "INPUT#.DTA" FOR INPUT AS #1
                 Строчнаяпеременная$=" "
                 Целая%=0
                 Плавающаяточка!=0
       'читать одну строку текста из файла последовательного доступа


            INPUT #1,Строчнаяпеременная$,Целая%,Плавающаяточка!
                 PRINT Строчнаяпеременная$,Целая%,Плавающаяточка!
                 CLOSE #1
                 END SUB
                 CALL Сделатьфайл
                 CALL Читатьфайл
                 END
                     
                
                 Функция INPUT$
                 --------------
                
  Функция INPUT$ считывает специфицированное число литер с  клавиатуры  или  из
 ------- файла.
                
                
 Синтаксис s$=INPUT$(n)[,[#]файланом])
 ---------
                 
 Замечания n-это число литер,подлежащих считыванию,а файланом-файл,из которого
 --------- должно происходить считывание.Если файланом опускается,считывается
 клавиатура.
 Если  используется клавиатура,литеры на экране не появляются и все они пода-
 ются в строку назначения.Главным достоинством INPUT # по отношению к  другим
 приемам  считывания  файла или клавиатуры является то ,что она позволяет вам
 принимать все литеры ,включая литеры управления.
 Режим двоичного файла дает этот аттрибут несколько более гибким способом.
                
 Примечание: Определение клавиши и комбинации клавиш (например,клавиши  функ-
 ций  и  управления курсором ) не возвращают значение ASCII .Когда нажимается
 такая клавиша ,INPUT$ обеспечивает простановку CHAR$(0);INKEY$ не имеет это-
 го ограничения.
                
    См.также     INKEY$
                
    Пример       OPEN "INPUT#.DTA" FOR INPUT AS #1
                 s$=INPUT$(15,#1);
                 print s$
                 close #1
                 end
                
                
                
                 Функция INSTAT
                 --------------
                
                                     -129 -
          
          
   Функция  INSTAT возвращает состояние клавиатуры.
   -------
                
   Синтаксис y=INSTAT
   ---------
                
 Замечания INSTAT возвращает информацию о состоянии клавиатуры.Если какая-то


 --------- клавиша уже нажата, INSTAT  возвращает  -1;иначе  она  возвращает
 0.INSTAT  не реализует перемещение клавишного удара из буфера,т.ч. если даже
 она возвращает TRUE(-1),она будет продолжать возвращать TRUE до тех пор ,по-
 ка клавишный удар не будет перемещен с помощью  INKEY$  или  другой  команды
 считывания клавиатуры.
      См.также INKEY$
                
   Пример WHILE NOT INSTAT
                 LOCATE 1,1
                 PRINT "Ожидание клавиши..."
                 WEND
                 PRINT INKEY$
                 END
                 
                
                 Функция INSTR
                 -------------
                
 Функция    INSTR осуществляет поиск по строке некоего образчика.
 -------
                
 Синтаксис  y=INSTR([n,]целевая строка,строка-образчик)
 ---------
                
 Замечания  n-это  целое выражение в диапазоне от 1 до 32767,целевая строка и
 --------- строка-образчик любые строчные переменные,выражения или константы.
 INSTR$ возвращает позицию строки-образчика  в  целевой  строке.Если  стро-
 ки-образчика  в целевой строке нет INSTR возвращает 0.Если включается опцио-
 нальный параметр n ,поиск начинается с позиции n в целевой строке.Если стро-
 ка-образчик есть нуль(длина 0),INSTR DJPDHFOFTN 1 (или n ,если этот параметр
 специфицировался).
    INSTR чувствительна к регистру.
  Пример 'получить пользовательский ввод
          LINE INPUT "Пожалуйста введите строку:";ПустаяСтр$
          PRINT "Теперь введите субстроку,которая существует в ";
          INPUT "Первая строка: ";СубСтр$
          PRINT USING "Строка "&" существует,начиная с ";СубСтр$:
          PRINT USING "Местоположение ### в &":_
          INSTR (1,ПустаяСтр$,СубСтр$),ПустаяСтр$
          END
                
                
                 Функция INT
                 -----------
                
 Функция    INT преобразует числовое выражение в целое.


  -------
                
  Синтаксис  y=INT(числовое выражение)
  ---------
                
 Замечания INT возвращает наибольшее целое,меньше или равно числовому выраже-
 ---------  нию .
   См.также      CEIL
                 CINT
                 FIX
  Пример         PRINT "X","INT(X)"
                 PRINT
                                     -130 -
          
          
                 FOR N=1 TO 6
                  READ X#
                  PRINT X#,INT(X#)
                 NEXT N
                 DATA 3.1,-3.1,3.5,-3.5,3.6,-3.6
                 END
                
                
                 Оператор IOCTL,функция IOCTL$
                 -----------------------------
                
 Функция IOCTL и IOCTL$ обеспечивают коммуникацию с возбудителем устройства.
  -------
                
  Синтаксис IOCTL[#]файланом,строчное выражение
  ---------
            s$=IOCTL$[#]файланом
                
 Замечания файланом- это номер файла желаемого возбудителя устройства.Строчное
 --------- выражение  содержит  информацию,подлежащую  посылке  на
 возбудитель.Формат строчной  информации,посылаемой  на возбудитель устройства
 или принимаемой с него,является функцией самого возбудителя.
 IOCTL посылает данные на возбудитель устройства.IOCTL$ считывает  данные  с
  возбудителя устройства.
 При  необходимости более подробной информации консультируйтесь с разделом о
 возбудителях устройств технического справочного руководства по IBM DOS.
                
                 Оператор KEY
                 ------------
                
 Функция KEY устанавливает и отображает содержимое клавиши функций и  опре-
 ------- деляет значения отслеживающих ловушек клавиш.
                 
                
   Синтаксис  KEY{ON!OFF!LIST}
   ---------  KEY n,строчное выражение
              KEY n,CHR$(сдвигасостояние)+CHR$(сканкод)
                 
                
 Замечания  KEY ON и KEY OFF включают и выключают отображение функциональных


 ---------- клавиши в нижней части экрана.Заметьте ,что включение отображения
  не оказывает действия на определения функциональных клавиш.KEY LIST на экран
 текущие определения функциональных клавиш.Когда отображаются  функциональные
 клавиши  ,25-ая строка никогда не прокручивается и попытка разместить в этой
 строке курсор приводит к ошибке 5.
 KEY n,строчное выражение посылает в строчное выражение функциональную кла-
 вишу n,где строчное выражение имеет длину 15 литер или менее (в строке  сос-
 тояний появляются только первые 6),чтобы закрыть доступ  к функциональной
 клавише,назначайте  ей нуль-строку.Возврат каретки в строке (CHR$(13)) отоб-
 ражается как маленькая стрелка влево.
 KEY n,CHR$(сдвигасостояние)+CHR$(сканкод) ассоциирует клавишу (или  комби-
 нацию  клавиш  с  некоторым числом (n,от 15 до 20) для отслеживания клавиш с
 помощью последующих операторов ON KEY и KEY (n) ON.Формат определяется  сле-
 дущим образом:
   -сдвигасостояние-это  целое выражение в диапазоне от 0 до 255
 ,которое управляет ответной реакцией на слежение за состоянием  клавиш  Ctrl
 ,Caps Lock,Num Lock,Alt и обеих Shift.
   -сканкод-числовое  выражение от 1 до 83 ,которым определяется
 клавиша для отслеживания в соответствии с  таблицей  кодов  сканирования  из
 приложения F.Заметьте,что клавиши 59-68,72,75,77 и 80 уже отслеживаются (это
 функциональные клавиши и клавиши управления курсором),так что их определение
 не оказывает действия.
 Для построения значения сдвигасостояния пользуйтесь следущей таблицей:
        ----------------------------------------------------
            Клавиша-модификатор Двоичное значение Гекс-значение
                                     -131 -
          
          
                 ----------------------------------------------------
                 Right Shift            0000 0001              01
                 Left Shift             0000 0010              02
                 Ctrl                   0000 0100              04


                 Alt                    0000 1000              08
                 Num Lock               0010 0000              20
                 Caps Lock              0100 0000              40
                 ----------------------------------------------------
 Предположим     в    качестве    примера,что    мы    желаем    отследить
 "Shift-Escape";т.е. мыхотим иметь определенную подпрограмму дляполучения уп-
 равления всякий раз ,когда клавиша Escape нажимается вместе с одной из  кла-
 виш Shift.Прежде всего мы должны построить маску сдвига -состояния.Вы хотите
 распознавать  обе  клавиши  Shift,поэтому  должны  сложить  маски  для  обе-
 их:01H+02H=03H.Далее вы можете проконсультироваться по таблице кодов  скани-
 рования приложения F и обнаружить ,чтo клавиша Escape имеет код сканирования
 1.О вашем плане Турбо-Бейсику сообщает следущий оператор
                 KEY 15,CHR$(&03)+CHR$(1)
 Вы  обязаны использовать значение клавиши 15,поскольку первые 14 ранее оп-
 ределены для представления функциональных клавиш и клавиш управления  курсо-
 ром.Теперь вы определяете подпрограмму отслеживания ,которая Будет вызывать-
 ся при всяком нажатии Shift-Esc:
                 ON KEY(15) GOSUB ShiftEscape
 где  ShiftEscape-это  метка  в начале отслеживающей подпрограммы.Наконец,вы
 включаете отслеживание для клавиши 15 с помощью оператора:
                 KEY(15) ON
                
   См.также      KEY(n)
                 ON KEY
                
  Пример         FOR N%=1 TO 10
                  READ A$
                  KEY N%,A$+CHR$(13)
                 NEXT N%
                 KEY LIST
                 KEY ON
                 WHILE NOT INSTAT
                 WEND
                 DATA Help,Enter,Edit,Change,Report,Print,Setup
                 DATA DOS Copy,Quit
                 END
                
                                                                            
                 Оператор KEY(n)
                 ---------------


                
 Функция      KEY(n) включает или выключает отслеживание отдельной клавиши.
  --------
                
  Синтаксис   KEY(n){ON!OFF!STOP}
  ----------
                
 Замечания  n-это отслеживаемая клавиша,целое выражение от 1 до 20 в соответ-
 ---------  ствии со следущей таблицей:
                 --------------------------------------------------
                    n                       Клавиша
                 --------------------------------------------------
                  1-10    Функциональные клавиши 1-10
                  11      Курсор вверх
                  12      Курсор влево
                  13      Курсор вправо
                  14      Курсор вниз
                  15-20   Клавиши,отслеживаемые оператором KEY
                 --------------------------------------------------
 KEY(n) ON включает отслеживание клавиши n.Это означает,что между всеми опе-
 раторами делается проверка с целью посмотреть,не была ли нажата  клавиша  n;и
                                     -132 -
          
          
 если это имело место ,исполнение программы отклоняется на подпрограмму,специ-
 фицированную в операторе ON KEY для этой клавиши.
 KEY(n) OFF запрещает отслеживание клавиши n.
 KEY(n) STOP также запрещает отслеживание клавиши n ,но обеспечивает запоми-
 нание случая нажатия данной клавиши 6так что,если далее используется оператор
 KEY ON,захват в ловушку возникает немедленно.
       См.также  $EVENT
                 ON KEY
                
  Пример:        KEY ON
                 KEY 1,"Алло"+CHR$(13)
                 KEY 2,"Досвидания"+CHR$(13)
                 KEY 10,CHR$(13)
                 'НАСТРОИТЬ ОТСЛЕЖИВАНИЕ ДЛЯ F10
                 ON KEY(10) GOSUB Досвидания
                 'включить отображение F10
                 KEY(10) ON
                 INPUT "Нажать F1:";Пусто$
                 INPUT "Нажать F2:";Пусто$
                 Print "Теперь нажать F10..."


                 WHILE NOT INSTAT:WEND
                 END
                 Досвидания:
                 KEY(10) OFF
  ' теперь литерная строка назначенная для F10 будет воспроизво-
                 'диться
                 PRINT "Нажмите F10 для ухода из программы..."
                 RETURN
                
                
                 Оператор KILL
                 -------------
                
 Функция     KILL стираетфаил (подобно DOS-команде DEL)
 --------
                
  Синтаксис  KILL файлспец
  ---------
                
 Замечания Файлспец-это строчное выражение,представляющее файл или файлы,под-
 ---------  лежащие  стиранию,которое  может  опционально включать в себя имя
 прохода и/или свободно определяемой литеры.KILL  аналогично  DOS-команде  DEL
 (ERASE).
 Подобно  DEL,оператором  KILL  нельзя стирать справочник.Используйте вместо
 него RMDIR после предварительного стирания всех файлов справочника.
 Пример :       ON ERROR GOTO ФайлаОшибка
                INPUT "Ведите файл для стирания",Файлаимя$
                 IF Файлаимя$ <>" " THEN
                  KILL Файлаимя$
                 END IF
                 END
                 ФайлаОшибка:
                 PRINT "ошибка";
                 PRINT Ошб "произошла при стирании файла"
                 END
                
                
                 Функция LBOUND
                 --------------
                
 Функция LBOUND возвращает наинизшую возможную границу (наименьший подстрочн
 ------- ый индекс для специфицированного размера массива.
   
  Синтаксис LBOUND (массив[,размерность])
  ---------
                                     -133 -
          
          
                
 Замечания Массив -это имя  массива  ,подлежащего  образмериванию.Размерность
 ---------  представляет целое от 1 до числа измерений массива .Вы можете оп-
 ределять размер массива,используя LBOUND и  UBOUND.Чтобы  определить  верхнюю


 границу какой-то размерности массива,применяйте UBOUND.
 Если   вы   не  специфицируете  диапазон  подстрочных  индексов(см.оператор
 DIM), нижней границей по умолчанию является 0.Вы  можете  преодолевать  нижнюю
 границу по умолчанию,применяя оператор OPTION BASE.
    См.также     DIM
                 OPTION BASE
                 UNBOUND
                
  Пример         DIM Массив%(1900:2000,10:20)
                 PRINT   "Нижняя   граница   массива  по
                          размерности  2  есть";LBOUND(Массив%,2)
                
                 Функция LCASE$
                 --------------
                
 Функция    LCASE$ возвращает строку только в нижнем регистре.
 -------
                
  Синтаксис  s$=LCASE$(строчное выражение)
  ---------
              
 Замечания LCASE$ возвращает строку равную строчному выражению,за исключением
 --------- того,что все буквы верхнего  регистра  строчного  выражения  будут
 преобразованы в нижний регистр.
                
    См.также     UCASE$
   Пример        PRINT LCASE$("Для чего этот АРБУЗ?")
                
                
                 Функция LEFT$
                 -------------
                
 Функция    LEFT$ возвращает самые левые n литер строки.
 -------
                
   Синтаксис  s$=LEFT$(строчное выражение)
   ---------
          
 Замечания n- это целое выражение,которым специфицируется число литер строч-
 ---------  ного выражения,которые должны быть возвращены.n должно находится
 в диапазоне от 0 до 32767.
 LEFT$ возвращает строку ,содержащую n самых левых литер ее строчного  выра-
 жения.Если  n  больше  или  равно  длине строчного выражения,возвращается все
 строчное выражение.Если n=0 ,LEFT$ возвращает нуль-строку.
    См.также     MID$
                 RIGHT$
                
   Пример        PRINT LEFT$ ("Hello out there in the universal",5)
                
                
                 Функция LEN


                 -----------
                
 Функция    LEN возвращает длинну строки.
   -------
                
   Синтаксис  y=LEN(строчное выражение)
   ---------
                
  Замечания LEN возвращает значение от 0 до 32767,представляющее число  литер
 ---------  в  строчном выражении.Следует отметить ,что этот диапазон значи-
                                     -134 -
          
          
 тельно расширен по сравнению с максимальной длинной строки 255 литер в Интер-
 претаторном Бейсике.
                
 Пример     INPUT USING "Длина строки =###";LEN(ПустаяСтр$)
                 END
                 
                
                 Оператор LET
                 ------------
                
 Функция   LET назначает значение переменной.
  -------
                
  Синтаксис [LET] переменная=выражение
  ----------
                 
 Замечания Переменная-это строчная  или  числовая  переменная  ,а  выражение
 --------- должно быть соответствующего типа (т.е. строчная для строчных пе-
 ременных и числовая для числовых переменных.)
 LET  в операторах назначения проставляется опционально и практически обычно
 опускается.
   Пример    INPUT "Ввести строку :",ПустаяСтр$
                 LET темпстр$=ПустаяСтр$
                 PRINT темпстр$,ПустаяСтр$
                 END
                
                 Оператор LINE
                 -------------
                
 Функция LINE обеспечивает вычерчивание линии или опционально заполненной ра
 ------- мки.
                
   Синтаксис LINE [(X1,Y1)]-(X2,Y2)[,[цвет[,B[F]][,образчик]]
   ---------
                
 Замечания (X1,Y1) и (X2,Y2)-это координаты двух точек на графическом экране
 --------- которые могут специфицироваться в  абсолютной  или  относительной
 форме  .(Более  подробно  об  абсолютных и относительных координатах см.главу
 4).Цвет -это целое выражение ,описывающее цвет,в котором  должнавычерчиваться
 линия  или рамка.Образчик-целая маска,управляющая тем,как вычерчивается линия


 или рамка.
  Чтобы вычертить линию до точки (x,y) от LPR в цвете по  умолчанию,набирайте
 LINE -(x,y)
 Чтобы вычертить ту же линию в другом цвете ,набирайте
                 LINE -(x,y),2
 Чтобы вычертить линию от точки (x1,y1) до (x2,y2)
                 LINE (x1,y1)-(x2,y2)
 Чтобы вычертить рамку с верхним левым углом (x1,y1) и нижним в (x2,y2)
                 LINE (x1,y1)-(x2,y2),,B
 Чтобы заполнить рамку атрибутом 2
                 LINE (x1,y1)-(x2,y2),2,BF
 Чтобы вычартить несплошную линию ,включайте аргумент образчик.
                                                         --------
 Точечная линия ,образчик &HAAAA(двоичное число 1010 1010 1010 1010)Необхо-
 димо заметить ,что образчик не оказывает действия на заполняемые рамки.
                 LINE (x1,y1)-(x2,y2),,,маскированияслово
 После оператора LINE ,LPR оказывается во второй из двух точек в операторе.
     См.также    FILL
                
    Пример       'вычертить на экране диагональную линию
                 SCREEN 1,0
                 LINE (0,0)-(319,199)
                 'вычертить горизонтальную пунктирную линию
                 LINE (0,100)-(319,100),,,&HCCCC
                 'вычертить 50-пиксельный квадрат ,заполненный цветом 2,с вер-
                                     -135 -
          
          
                 'хним левым углом в (10,20)
                 LINE (10,20)-(60,70),2,BF
                 'поиграйте в соединение точек
                 READ X,Y
                 PSET (X,Y)
                 FOR N=1 TO 11
                  READ X,Y
                  LINE -(X,Y)
                 NEXT N
                 LOCATE 9.9
                 PRINT "ORLAND"
                 END
                 DATA 10,20,50,20,55,25,55,40,50,45,10,45
                 DATA 50,45,55,50,55,65,50,70,10,10,10,20
                
                
                 Оператор LINE INPUT
                 -------------------
                
 Функция LINE INPUT считывает строку с клавиатуры в строчную переменную,игнор


 ------- ируя разделители.
                
 Синтаксис LINE INPUT [;][строка-подсказка;]строчная переменная
  ---------
                
 Замечания  Строка-подсказка  -это опциональная строчная подсказка подлежащая
 --------- посылке на экран перед ожиданием вашего ответа. Строчная переменная
 это переменная ,которая будет загружаться данными ,которые  вы  вводите  на
 клавиатуре  .Используйте LINE INPUT вместо INPUT ,когда вы намереваетесь вво-
 дить строчную информацию,которая содержит разделители(например запятые),кото-
 рые иначе создали бы путаницу в операторе INPUT.Например:
                 INPUT "Введите адрес пациента:";a$
 будет давать сбой ,если адрес содержит запятую
     LINE INPUT принимает запятые без проблем.
 Если за оператором LINE INPUT следует точка с запятой,то  когда  нажимается
 Enter  в конце вводимой строки ,на дисплей не посылается возврат каретки(т.е7
 курсор остается в той же строке).
 Пример       PRINT "Ведите несколько полей ввода в которых вы не нуждаетесь"
              LINE INPUT "позаботтесь об их разделении";ПустаяСтр$
              print ПустаяСтр$
              END
                
                
                 Оператор LINE INPUT#
                 --------------------
                
 Функция LINE INPUT# считывает строку из последовательного файла  в  строчную
 ------- переменную ,игнорируя разделители.
                
  Синтаксис LINE INPUT#файланом,строчная переменная
  ---------
                
 Замечания  ФайлаНом-это  номер файла для считывания,а строчная переменная-
 ---------  это строчная переменная, в которую осуществляется загрузка.
 LINE INPUT# подобна LINE INPUT за тем исключением ,что  данные  считываются
 не с клавиатуры а из последовательного файла.Из файла считывается текущая за-
 пись,которая загружается в строчную переменную.Так же как LINE INPUT ,исполь-
 зуйте  LINE  INPUT#  для  собирания данних которые имеют разделительные лите-
 ры(запятые)вперемежку с данными.


  Если данные файла были записаны с помощью оператора WRITE#,они уже правиль-
 но разделены и лучшим способом их считывания является оператор INPUT#
                
   Пример        SUB СделатьФайл
                 OPEN "LINEINP#.DTA" FOR OUTPUT AS #1
                 СтрочнаяПеременная$="Не спокойно в Ривер-Сити"
                                     -136 -
          
          
                 Целое%=1000
                 Плавающаяточка!=30000.1234
            PRINT #1,Строчнаяпеременная$,Целое%,Плавающаяточка!
                 CLOSE #1
                 END SUB
                 SUB Читатьфайл
         'открывается последовательный файл для ввода
        'используются LINE INPUT# и INPUT$ для считывания
                 'из файла строк различных типов данных
                 OPEN "LINEINP#.DTA" FOR INPUT AS #1
                 СтрочнаяПеременная=""
                 LINE INPUT#1,СтрочнаяПеременная$
                 PRINT СтрочнаяПеременная$
                 CLOSE #1
                 END SUB
                 CALL СделатьФайл
                 CALL Читатьфайл
                 END
                
                
                 Функция LOC
                 -----------
                
   Функция LOC возвращает текущую позицию в файле.
   -------
                
   Синтаксис y=LOC(файланом)
   ---------
                
 Замечания Файланом-это значение ,под которым был открыт файл.Поведение  LOC
 --------- зависит от режима ,в котором был открыт файл.
 Если файланом-это файл произвольного доступа ,то LOC возвращает номер пос-
 ледней записанной или считанной записи.
 Если файланом-это файл последовательного доступа ,то LOC  возвращает  число
 128  байтовых  блоков,записанных  или  считанных с момента открытия файла.Как
 обычно ,LOC возвращает один блок для файлов ,которые уже  открыты,но  еще  не
 записывались и не считывались.
 Если файланом-это двоичный файл,LOC возвращает SEEK-файловую позицию.


  Для коммуникационных файлов LOC возвращае число литер в буфере ввода.
                
    Пример       OPEN "LOC.DTA" FOR BINARY AS #1
                 PUT$ #1 "ТурбоБейсик"
                 PRINT LOC(1)
                 CLOSE
                 END
                
                
                 Оператор LOCAL
                 --------------
                
 Функция LOCAL определяет локальные переменные в процедуре или функции.
 --------
                
   Синтаксис LOCAL список переменных
   ---------
                
 Замечания Оператор LOCAL законен только в определениях процедур и функций и
 ---------  должен появляться для любых исполнительных операторов в ассоции-
 руемом с ними определении .LOCAL определяет одну или более переменных как "ло-
 кальные" в рамках процедуры или функции.Локальная переменная может иметь то же
 имя,что и другие переменные в других частях программы,а также имя ,одинаковое
 с другими локольными переменными в определении других  процедур  или  функций
 без какого-то бы ни было их отрицательного взаимовлияния;они являются отдель-
 ными переменными.
 Чтобы  заявить  локальный массив ,включайте в заявлении его идентификатор и
                                     -137 -
          
          
 пустой комплект скобок в список переменных,а затем в следущем  DIM  операторе
 образмеривайте массив.Локальные переменные размещаются в стеке и возбуждаются
 в  ноль(для  строчных  переменных  используется нуль-строка) прикаждом вызове
 включающей их в себя процедуры или функции.Незаявленным  переменным  процедур
 по умолчанию дается статический атрибут,тем неменее мы рекомендуем явно опре-
 делять каждую переменную.
                
      См.также   DIM
                 SHARED
                 STATIC
    Пример       SUB Локальные
                 LOCAL a(),i%
                 DIM DYNAMIC a(10:20)
                   FOR i%=10 to 20
                    a(i%)=i%
                 NEXT i%


                 END SUB
                
                
                
                
                
                                       
                

     Заявление LOCATE
      
 Функция   LOCATE позиционирует курсор и/или определяет форму курсора.
 ----------
 Синтаксис  LOCATE [ред] [,[колонка] [,[курсор][,пуск][,останов]]]
 ----------
 Замечания  Ряд - это целое выражение, определяющеестроку экрана, в ко-
 ---------   торой должен позиционироваться курсор (1-25). Колонка специ-
 фицирует колонку (1-80). Курсор - числовое значение, которое управля-
 ет тем, будет или нет курсор видимым(0-означает невидимый;1-видимый). 25-ая
 строка недоступна, если не выведено из активного состояния отображение фун-
 кциональных клавиш (см.о заявлении KEY OFF).
      
  Пуск и останов - это целые выражение, которые управляют размером  кур-
  сора  и  представляют  сколь  много  строк сканирования будет занимать кур-
  сор.Верхней строкой сканирования является строка 0; нижней - строка  7  для
  цветных/графических Адаптеров и строка 13 для монохромных адаптеров.
  LOCATE наиболее часто используется перед заявлением PRINT для управле-
  ния прохождением вывода на экран.
       См. также     KEY OFF
      -----------
                      PRINT
                    
      Пример    CLS
      -------
               CRSLIN и POS
               INPUT "Ввести координаты X и Y:", X%, Y%
               'позиционировать курсор и изменить его форму
               LOCATE X%,Y%,1,4,5
               PRINT "Hi";
               WHILE NOT INSTAT: WEND  "ждать клавишу
               END   ' конец программы
                                     
  Функция  LOF возвращает длину файла.
  --------
       Синтаксис   y =LOF(файланом)
      -----------
  Замечания   файланом - это номер, под которым был открыт файл.
      -----------
 LOF  возвращает длину указанного файла в байтах.Для комму-
 никационных файлов LOF возвращаетт размер наличного пространства в коммуни-


 кационном буфере.
      Пример   OPEN"TB.EXE" FOR BINARY AS#1
      --------
                PRINT "Размер турбо-Бейсика равен";LOF(1)
                CLOSE #1
                END
       
       Функция LOG,LOG2 и LOG10
     -----------------------------
      
  Функция LOG возвращает натуральный (с основанием е) логарифм;LOG2 воз-
  вращает логарифм основания 2; LOG10 - логарифм основания 10.
        
     Синтаксис      LOG:
      -----------
                      y=LOG (числовое выражение)
                      LOG2:
                      y=LOG2(числовое выражение)
                      LOG10:
                      y=LOG10(числовое выражение)
      
 Замечания LOG возвращает натуральный логарифм  (с  основанием  е,  где
  е=2,718282.....  )своего аргумента.Если числовое выражение меньше или равно
  0, это дает ошибку 5 пер. прогона, вызов  незаконной  функции.  Натуральный
                                     -139 -
          
          
  логарифм x есть показатель степени, в которую должно быть возведено основа-
  ние е для получения значения x.
  LOG,LOG2 и LOG10 возвращают результат двойной точности.
   Пример    FOR I!=1 TO 50 STEP 2.5
   --------   PRINT USING "Натуральный логарифм ##=## : I!, LOG(I!)
             NEXT I!
              END        'конец программы
      
       Функция LPOS
      -------------
      
  Функция LPOS возвращает "курсорную позицию" буфера печатающего устрой-
  ства.
       Синтаксис   y=LPOS (печатающее устройство)
      -----------
      
      Замечание
      ---------
  Печатающее устройство - это целое выражение от 0 до 3, обес-
  печивающее выбор печатающего устройства из следующего списка:
                  0,1          LPT1
                  2            LPT2
                  3            LPT3
                                  
  LPOS сообщает сколько литер уже послано на печатающее устроцство с мо-
  мента вывода последней литеры возврата каретки.


       См.также POS
  Пример  'назначить ширину печатающего устройства
      -------- 'для именованных констант
                %Шир = 80
               'отобразить литеры ASCII и расширенного ASCII
               'на экране и печатающем устройстве.
                FOR I%=0 TO 255
                IF (I%>32) THEN
                PRINT USING "1"; CHRS(I%);
                END IF
  ' передвинуться на следующую строку, если имеет место выход за
  отведенное пространство IF LPOS(0)=%Шир THEN
                          LPRINT CHRS(13)+CHRS(10)
                          END IF
                          NEXT I%
                          END  конец программы
      
       Заявления LPRINT,LPRINT USING
     ---------------------------------
      
  Функция LPRINT и LPRINT USING посылает данные на печатающее устройство
  (LPT1:).
         Синтаксис  LPRINT [список выражений [;] ]
        ----------- LPRINT USING формат строка; список выражений
      
  Замечания  Список  выражений - это ряд числовых и/или строчных выраже-
  ний разделяемых запятыми либо точкой с запятой.Формат-строка  содержит  ин-
  формацию о формате печати.
  LPRINT  и  LPRINT  USING  выполняют  те-же  действия что PRINT и PRINT
  USING, за исключением того, что список выражений посылается  на  печатающее
  устройство, а не на экран.
  Примечание:  По  умолчанию  Турбо-Бэйсик  вставляет пару возврат карет-
  ки/подача строки после распечатки в одной строке 80 литер.
  Эта характеристика может быть изменена с помощью заявления WIDTH(ширина)
       См.также LPOS
                PRINT
                PRINT USING
                WIDTH
                                     -140 -
          
          
                    
    Пример    LPRINT USING"## -это мое счастливое число"; 7
              --------
                        END
      
       Заявление LSET
      -----------------
                      
  Функция   LSET перемещает срочные данные в буфер произвольного файла.


  --------
    
  Синтакси   LSET переменная поля = строчное выражение
     ----------
  Замечания  LSET и родственное ему заявление RSET перемещают строчную ин-
  формацию в переменные поля, определяемые как  принадлежащие  буферу  произ-
  вольного файла.
  Если  длина строчного выражения меньше размера переменной поля, специ-
  фицированной в заявлении FIELD, LSET выравнивает его в левую сторону  этого
  поля, заполняя оставшуюся часть пробелами.
  Это означает, что пробелы добавляются после последней литеры строчного
  выражения,  так  что послеLSET- назначения LEN (переменной поля) становится
  равной ширине, определенной в соответствующем заявлении FIELD.
  RSET осуществляет выравнивание с помощью пробелов вправо ( пробелы до-
  бавляются перед первой литерой строчного выражения).
  LSET и RSET могут также использоваться для  форматообразования  вывода
  на экран или печатающее устройство.
       а $=$ (20)
       RSET a$="Правое выравнивание"
       PRINT a$
       См. также  FIELD
                  LEN
                  RSET
      
       Пример     OPEN "LSET.DTA" AS#1 LEN=18
      --------
  Определить  имена  и размеры полей файла FIELD1,2 AS Файл цел $, 4ASФайл
  Длин $, - 4AS Файл Един $, & AS Файл Двойн $
  'назначить переменные полей и осуществить запись в файл  произвольного
  доступа FOR Счетчик% =1 TO S
       LSET Файл Цел $=MX1$ (счетчик %)
       LSET Файлдлин$=MXL $(счетчик %^2)
       LSET Файлtlby$=MXS $(счетчик %^2.1)
       lset ФайлДвойн$=MXD $ (счетчик %^4.4)
       PUT 1,счетчик %
       NEXT счетчик %
       CLOSE 1      'закрыт файл
       END          'конец главной программы
      
       Заявление MEMSET заявляет верхнее ограничение памяти
       ----------
       Синтаксис MEMSET адрес
       ----------
  Замечание Адрес - это длинное целое выражение, определяющее абсолютный
  адрес  верхней  границы памяти Турбо-Бейсика.Адрес должен быть меньше коли-
  чества памяти, установленной в системе.Практически адрес обычно вычисляется


  путем вычитания некоторой константы  из  значения,  возвращаемого  функцией
  ENDMEN.
  MEMSET сконструировано для установки отдельной памяти для подпрограммы
  на языке ассемблера. Если Турбо-Бейсик не в состоянии удолетворить запрос в
  силу  либо  неподходящего аргумента, либо недостаточности памяти, возникает
  ошибка 7 периода прогона, вне памяти.
       См. также ENDMEN
  Пример PRINT FRE (-1) 'отобразить наличное пространство для массивoв
                                     -141 -
          
          
      --------
       'хранить 128 байтов в верхней части памяти
       MEMSET ENDMEN - &H80
       PRINT FRE (-1)  'отобразить наличную память
       END              'конец программы
      
       Заявление MID$
       --------------
      
       Функция MID$ возвращает литерную строку.
       ------------
       Синтаксис S$=MID$ (строчное выражение, n[,m] )
       ----------
  Замечания n и m - это числовые переменные или выражения, которые могут
  лежать в диапазоне от 1 до 32767 и от щ до 32767 соответственно.
  MID$ как функция, возвращает m-литерную строку, начиная с n-ой  литеры
  строчного  выражения. Если m опускается или справа от n-ой литеры строчного
  выражения менее m литер,  выдаются  остальные  литеры  строчного  выражения
  вплоть  до  n-ой и включая ее.Если n больше длины строчного выражения ,MID$
  возвращает нуль-строку.
       См. также     LEFT$
                     Заявление MID$
                     RIGHT$
       Пример    INPUT 'Ввести строку:", Пустая стр$
      --------   Врем.Стр$ = Пустая Стр$
                 PRINT Пустая Стр $
   'резервировать порядок литер, используя функцию и  заявление
  MID$ одновременно.
   FOR I% = 1 TO LEN (Пустая стр%)
  MIDS (Пустая Стр %, I%,1) = MIDS (Врем Стр $,- (LEN (ВремСтр
  $)- I%) + 1,1)
   NEXT I%
   PRINT Пустая Стр%
   END    'конец программы
      
       Заявление MID$
     -----------------
      
       Функция MIDS замена литеры строки


       ------------
  Синтаксис MID$ (строчнаая переменная, n[,m] )= строка-замена
       ---------------
  Замечание n и m - это числовые переменные или выражения, которые могут
  находиться в диапазоне от 1 до 32767 и от 0 до 32767,соответственно.
  Как  заявление,  MID$  заменяет m литер строчной переменной, начиная с
  литерной позиции n, сожержимым строки-замены.
  Если m включается, оно определяет сколько литер строки-замены вставля-
  ется в строчную переменную. Если опускается, используется вся  строка-заме-
  на.MID$ никогда не изменяет длину строки.
       См. также LEFT$
           Функция MID$
           RIGHT$
       Пример   'MID$, заявление
       в $ = "Ураган Камилла"
       MID$ (в $,8) = "Карла--"  'опущен опциональный параметр m
       PRINT в $
      
       Заявление MKDIR
      -----------------
                      
  Функция MKDIR  создает субсправочник (подобно DOS-команде MKDIR)
  Синтаксис MKDIR проход
       --------
                                     -142 -
          
          
       
  Замечания   Проход - это строчное выражение, описывающий подлежащий соз-
  ---------- данию справочник (см. информацию об именах и проходах файло
 в в главе 4)
  MKDIR (делать справочник) создает субсправочник, специфици-
  руемый проходом.Если вы пытаетесь создать справочник, который уже существу-
  ет, возникает ошибка 5 периода прогона, вызов незаконной функции.
      
  Пример  'построить обработчик ошибок
      ON ERROR GOTO Спр ошибка
      PRINT "Пожалуйста введите справочник который вам нравится";
      INPUT "Создать:", Спр Имя $
      MKDIR Спр Имя $   'создать справочник
      END                'конец программы
     СпрОщибка:
  ------------- PRINT "Возникла проблема в создании справочника"
      END
      
  Функции MKI$, MKL$, MKS$, MKD$
  -------------------------------
  Функция  MKI$,MKL$,MKS$,MKD$ преобразуют числовые данные в строки (для


 вывода в произвольные файлы)
    Синтаксис S$=MKI$ (целое выражение)
    ---------
                 S$=MKL$ (длинное целое выражение)
                 S$=MKS$ (выражение единичной точности)
                 S$=MKD$ (выражение двойной точности)
     
  Замечания Функция MK (делать) представляет собой часть процесса  обра-
  ботки  получения  числовых значений в файлы произвольного доступа.Поскольку
  заявления, которые записывают информацию в буфер произвольного файла(LSET и
  RSET) работают только со строками, числовые  данные  должны  транслировать-
  ся,перед  их обработкой заявлением PUT в произвольный файл, в строчную фор-
  му.MKI$(i) возвращает двухлитерную строку, состоящую из двух битовых значе-
  ний, которые Турбо-Бейсик использует для внутреннего  представления  целого
  значения i. Функция MKL$ возвращает 4-байтовый строчный эквивалент длинного
  целого.  MKS$  возвращает  4-байтовый эквивалент значения единичной точнос-
  ти.MKD$ возвращает 8-байтовый строчный эквивалент значения двойной  точнос-
  ти.  Дополнительные  функции CVI, CVL, CVD используются, когда произвольные
  файлы считываются. Не путайте эти функции с STR$ и VAL , которые соответст-
  венно обращают числовые выражения в распечатываемые формы и наоборот:
       i=123.45
       a$=STR$(i): в$=MKS$(i)
 'a$ содержит что-то, стоящее размещения на экране; в $ не содержит
       PRINT a$, в$
       См. также СVD
       --------- CVI
                 CVL
                 CVS
       Пример OPEN "MKILSD.DTA" AS#1 LEN=18
      ------- 'определить имена и размеры полей
  FIELD 1, 2AS файла цел$, 4AS файла длин$, 4AS файла един$,  8AS
  файла двойн$
 'назначить значения полям и осуществить запись в файл произволь-
  ного доступа
             FOR счетчик%  = 1TOS
             LSET Файла Цел$= MKI$ (счетчик%)
             LSET Файла Длин$= MKL$ (счетчик %^2)
             LSET Файла Един$=MKS$ (счетчик %^2.1)
             LSET Файла Един$=MKD$ (счетчик %^4.4)


             PUT 1, счетчик %
             NEXT счетчик %
             CLOSE 1        'закрыть файл
             END            'конец главной программы
      
                                     -143 -
          
          
      
      
       Функции MKMD$,MKMS$
       --------------------
  функция  MKMD$  и  MKMS$  преобразуют числовые данные в строки формата
  Микрософт
       Синтаксис   S$=MKMS$ (выражение единичной точности)
      ----------   S$\MKMD$ (выражение двойной точности)
      
  Замечания   Функции MKM ( делать Микрософт) предусмотрены лишь для сов-
  ---------- местимости с существующими  произвольными  файлами,  которые
  содержат значения  с плавающей точкой в формате Микрософт.
  MKMS$  создает 4-байтовую строку формата Микрософт из значения единич-
  ной точности; MKMD$ делает 8-байтовую Микрософт-форматную строку из  задан-
  ного значения двойной точности.
      
       См.также    CVMD
      ---------    CVMS
      
       Пример
       --------     'открыть файл произвольного доступа
                    OPEN "CVMD.DTA" AS#1 LEN=12
                    FIELD#1, 4AS Единич.$, & AS Двойная $
                    МаксЦелое% =32767
                    FOR I%=1 TO 5 'записать данные в файл
                    LSET ДвойнаяS = MKMD$ (I%+МаксЦелое %)
                    PUT#1, I%
                    NEXT I%
                    FOR I% = 1TO 5  'читать данные из файла
                    GET#1, I%       'отобразить на экране
                    PRINT CVMS (Единичная$), CVMD (Двойная $)
                    NEXT I%
                    CLOSE#1        'закрыть файл
                    END            'конец программы
      
      
      
      Функция и заявление MTIMER
      ------------------------------
  Функция MTIMER считывает или повторно устанавливает микротаймер.
       Синтаксис
       ----------      Функция:
                      y=MTIMER
                      Заявление
                       MTIMER


      
       Замечания
 ---------- MTIMER сконструированы для измерения истекшего времени, гл
 авным  образом  для очень коротких операций. Это дает значительное улучшение
  разрешающей способности; однако точность резко падает по истечение 54  мил-
  лисекунд.
  Как  функция  MTIMER  возвращает число микросекунд, истекших с момента
  самого последнего заявления MTIMER. Точность MTIMER лежит в  пределах  при-
  мерно  двух микросекунд. Как заявление MTIMER повторно устанавливает микро-
  таймер в ноль.
      
  Ограничения Заявление и функция MTIMER используются в паре. Вы должны
  выдать заявление MTIMER, а затем вызвать функцию для получения  результата.
  Последующие ссылки на зту функцию будут давать значение ноль, если вы вновь
  не запустили микротаймер с помощью заявления MTIMER.
  MTIMER и SOUND/PLAY используют канал 2 таймерного типа 8255 и яиляются
  взаимоисключающими. Поэтому исполнения заявленной SOUND или PLAY между  за-
                                     -144 -
          
          
  явлениями  и  функцией MTIMER вынудит повторную установку микротаймера на
  ноль истекшего  времени.
      
       Пример
      --------       'возбудить таймер
                      MTIMER
                      PI#=ATN(1) * 4     'вычислить "пи"
              'получить значение таймера
              Истекшее Время % = MTIMER
               PRINT USING "Израсходовано #### миллисекунд";
               PRINT "на расчет значения "пи" "
               END   'конец программы
      
      
      
       Заявление NAME
       ----------------
      
       Функция NAME
 ------------ Обеспечивает переименование файла (подобно DOS-функции
  REN)
       Синтаксис     NAME файласпец1AS файласпец2
       ----------
      
  Замечания      Файласпец1 и файласпец2 - это строчные выражения, удолет-
  ---------- воряющие DOS-соглащениям об наименовании проходов и файлов.
  Операция NAME обеспечивает передачу данных, представляющих файлспец1, файлу с


  именем файлспец2. Так как файлспец2 может содержать имя прохода, существует
  возможность перемещения данных из одного справочника в другой,  но  до  тех
  пор,  пока  вы  не пытаетесь осуществить перенаименование с одного диска на
  другой.
      
       Пример
 -------   INPUT "Введите имя файла для перенаименования:",
           Старое имя $
           INPUT "Введите новое имя файла:", Новое имя $
           выдаются старое имя $, Новое имя $
           NAME Старое имя $ AS Новое имя $
           END        ' конец программы
      
      
      
       Функция OCT$
       -------------
      
  Функция OCT$   возвращает строку , представляющую  восьмеричную (с ос-
   ------------   нованием 8) форму числового выражения.
      
       Синтаксис    S$=OCT$ (числовое выражение)
       ----------
      
  Замечания   Числовое выражение находится в диапазоне от -32768 до 65535.
  ---------- OCT$ возвращает строку, представляющую  восьмеричную  форму
  своего целого аргумента. Если числовое выражение имеет дробную часть, перед
  преобразованием оно округляется. Для преобразования значений в шестнадцати-
  ричные или двоичные строки применяйте функции HEX$ и BIN$, соответственно.
      
       См.также        BIN$
       ---------       HEX$
               
       Пример       PRINT OCT$(-1)
       -------      PRINT OCT$(65535)
      
      
                                     -145 -
          
          
       Заявление ON COM(n)
       --------------------
      
  Функция  ON COM(n)    заявляет подпрограмму отслеживания событий на
  -------------------   последовательном входном устройстве.
      
       Синтаксис     ON COM(n) GOSUB метка
       ----------
  Замечания     n-это номер (1 или 2) коммуникационного адаптера ( пос-
  ---------- ледовательного входного устройства), подлежащего считыванию
  Метка  идентифицирует  подпрограмму  отслеживания. Если метка есть номер О
  особой строки, отслеживание запрещается.


  Заявление ON COM(n) не оказывает действия до тех пор, пока  коммуника-
  ционные события не оказываются доступными данному последовательному входно-
  му  устройству, что обеспечивается подходящим заявлением COM ON. Если заяв-
  ление COM ON однажды уже исполнено, проверка имеет место между исполнениями
  каждого следующего заявления с целью установить, не поступила ли  какая-либо
  литера  на  специфицированное последовательное входное устройство. Если это
  произошло, выполняется GOSUB к назначенной подпрограмме.
      
       См. также      Приложение В,"Отслеживание событий"
       ---------
      
      
      
       Заявление ON ERROR
       --------------------
      
  Функция ON ERROR   специфицирует стандартную программу обработки ошибок
  ------------------ и включает отслеживание ошибок.
      
       Синтаксис       ON ERROR GOTO метка
       ------------
      
  Замечания    Метка идентифицирует первую строку подпрограммы отслежива-
  ---------    ния ошибок. Однажды включенная обработка ошибок с помощью
  этого заявления обеспечивает переход к вашему  коду  обработки  ошибок  при
  возникновении  любых ошибок периода прогона вместо обычного отображения со-
  общения об ошибке и прекращения исполнения. Для продолжения исполнения  ис-
  пользуйте заявление RESUME (возобновить).
  Чтобы  запретить  отслеживание  ошибок используйте ON ERROR GOTO O. Вы
  можете воспользоваться этим приемом если возникает ошибка,  для  которой  у
  вас  нет  определенного прохода на восстановление ; вы также можете остано-
  вить свой выбор на отображении в этот момент содержимого ERL  (строка  пос-
  ледней ошибки)
  Если  вы  прогоняете  EXE-программу из DOS с выключенным отслеживанием
  ошибок, любая ошибка периода прогона вызывает выдачу сообщения о ее возник-
  новении и прекращение исполнения программы. Сообщение имеет форму:
  EROR ошибкином at pgm-ctr = адрес
  (ошибка)          (при программном счетчике)
  Если программа запущена в рамках Турбо-Бейсика и происходит ошибка, вы


  переводитесь в редактор на местоположение ошибки . В строке состояний будет
  содержаться краткое описание ошибки периода прогона:
  ERROR ошибкином : сообщение об ошибках
       (ошибка)
      
       См. также    ERADR
       ----------   ERL
                    ERR
                    ERROR
                    RESUME
      
       Пример   'настроить обработчик ошибок
     --------    ON ERROR GOTO ошибок обработчик
                 WHILE I  'этот цикл оканчивается ошибкой
                                     -146 -
          
          
                 I =10/0  'это вызывает ошибку периода прогона
                 WEND
                 Ошибок обработчик
                 ------------------
                 PRINT "Обработчик захватил ошибку периода прогона"
                 PRINT ERR, "в строке" ERL
                 END
      
      
       Заявление ON/GOSUB
       -------------------
      
  Функция ON/GOSUB   вызывает одну из нескольких возможных подпрограмм
  ----------------   в соответствии со значением числового выражения.
      
       Синтаксис   ON n GOSUB метка [,метка]....
       ----------
                                               
  Замечания   n - это числовое выражение в диапазоне от 0 до 255, а метка
  ---------- идентифицирует заявление на ветвление к ней. n определяет к
  какой из меток осуществляется переход (например если n=4, получает управле-
  ние четвертая метка в списке). Если n равно 0 или больше, чем число меток в
  списке, Турбо-Бейсик продолжает исполнение следующего по порядку заявления.
  Каждая подпрограмма должна оканчиваться  ключевым  словом  RETURN  для
  обеспечения возобнавления с того заявления, которое следует непосредственно
  за заявлением ON/GOSUB.
  Многопутевое  ветвление  может также реализоваться с помощью заявлений
  SELECT и IF-блоковое, причем они более гибкие, чем ON/GOSUB.
      
       Пример   FOR I% = 1 TO 3
       ------   ON I% GOSUB обработчик один, обработчик два, обработчик три


                NEXT I%
                END     'конец главной программы
      
                Обработчик один
                ----------------
                PRINT "Обработчик номер" , I%
                RETURN
                Обработчик два
                ----------------
                PRINT "Обработчик номер", I%
                RETURN
                Обработчик три
                ---------------
                PRINT "Обработчик номер", I%
                RETURN
               
      
      
       Заявление ON/GOTO
       ------------------
      
  Функция ON/ GOTO направляет программный поток по одному  из  нескольких
  возможных мест назначения на основе значения числового выражения.
      
       Синтаксис   ON n GOTO метка [,метка]....
       ----------
      
  Замечания  n - это числовое выражение в диапазоне от 0 до 255, а метка
  идентифицирует заявление программы на ветвление к ней.
  n определяет к какой из меток осуществляется переход  (например,  если
  n=4 то управление получает четвертая метка в списке).
  Если  n равно нулю или больше числа меток в списке , Турбо-Бейсик про-
  должает исполнение следующего по порядку заявления.
                                     -147 -
          
          
  С большей гибкостью многопутевое ветвление может  быть  реализовано  с
  помощью заявлений SELECT и IF-блоковое.
      
       Пример    FOR I% =1 TO3
     -------   ON I% GOTO обработчик один,обработчик два, обработчик три
                 Обратно:
                 NEXT I%
                 END     'конец главной программы
      
                 Обработчик один
                 ----------------
                 PRINT "Обработчик номер", I%
                 GOTO обратно:
                 Обработчик два
                 ---------------
                 PRINT "Обработчик номер"
                 GOTO Обратно:
                 Обработчик три
                 ----------------


                 PRINT "Обработчик номер", I%
                 GOTO Обратно
      
      
      
       Заявление ON KEY (n)
       ---------------------
      
  Функция  ON KEY (n) заявляет подпрограмму отслеживания с целью получе-
  -------------------  ния его управления , если нажимается особая клавиша.
      
       Синтаксис    ON KEY (n) GJSUB метка
       ----------
  Замечания Метка идентифицирует первое значение подпрограммы отслежива-
  ния, а n - это целое выражение в диапазоне от 1 до 20, которым  описывается
  подлежащая отслеживанию клавиша в соответствии со следующей таблицей.
  ---------------------------------------------------------------
         n                    Клавиша
  ---------------------------------------------------------------
       1-10        Функциональные клавиши F1-F10
        11         Курсор вверх
        12         Курсор влево
        13         Курсор вправо
        14         Курсор вниз
       15-25       Клавиши, определяемые заявлением KEY
        30         Функциональная клавиша F11
        31         Функциональная клавиша F12
   -----------------------------------------------------------------
      
  Заявление  ON KEY не имеют действия до тех пор, пока клавишные события
  не разрешаются заявлением KEY ON. Если заявление KEY ON однажды уже  испол-
  нено,  Турбо-Бейсик осуществляет проверку между исполнениями каждого после-
  дующего заявления с целью установить, имело ли место  нажатие  специфициро-
  ванной  клавиши.  Если это произошло, Турбо-Бейсик выполняет GOSUB к назна-
  ченной подпрограмме.
  Проверка клавиши n выключается заявлением KEY(n) OFF. Используйте  за-
  явление KEY для определения отслеживания клавиши, которая не является функ-
  циональной или клавишей управления курсором.
  Для  высококачественного управления генерированием Турбо-Бейсиком кода
  проверки событий пользуйтесь метазаявлением $EVENT.
      
       См. также        $EVENT
       ----------       KEY (n)


      
                                     -148 -
          
          
  Пример      'Эта программа демонстрирует заявление KEY(n)
  -------     'включить проверку клавиш
                   KEY ON
                   'назначить строки для клавищ
                   KEY 1, "Алло" + CHR$(13)
                   KEY 2, "Досвидание" + CHR$(13)
                   KEY 10, CHR$ (13)
             ' в дополнении к назначенной для этого строке
             'построить отслеживание клавиши для F10
                   ON KEY(10) GOSUB Досвидание
            'включить отслеживаниеF10
                    KEY(10) ON
            'получить пользовательский ввод
                    INPUT "Нажмите F1:";Пусто$
                    INPUT "Нажмите F2:";Пусто$
                    PRINT "Теперь нажмите F10...."
 ' когда пользователь нажимает теперь F10 ,будет вызываться
  подпрограмма Досвидание
                    WHILE NOT INSTAT:WEND 'ждать клавишу F10
                    END    'конец программы
                    Досвидание:
  KEY LIST 'перечислить определенные в данный момент клавиши.
                    KEY(10) OFF 'выключить отслеживание
      'теперь  когда пользователь нажимает F10, будет
      воспроизводиться литерная строка, назначенная клавише
       PRINT "Нажмите теперь F10 для того, чтобы покинуть  прог-
  рамму ......"
                    RETURN
                    
      
      
       Заявление ON PEN
       ----------------
      
  Функция ON PEN     заявляет подпрограмму отслеживания с целью получения
  ----------------   его управления если задействуется световое перо
      
       Синтаксис    ON PEN GOSUB метка
       ----------
  Замечания   Метка идентифицирует новое заявление подпрограммы обработки
  световогого пера. Заявление ON PEN не имеет действия до тех пор, по-
  ка  события светового пера не разрешаются заявлением PEN ON. Если заявление
  PEN ON уже исполнено, осуществляется проверка между всеми последующими  за-


  явлениями  с  целью проверки, было ли задействовано световое перо. Если это
  так, вызывается назначенная подпрограммая.
  Проверка светового пера выключается заявлением PEN OFF. После  захвата
  светового пера, с целью удержать от повторного вызова подпрограммы отслежи-
  вания из нее самой ( и переполнение стека), используется неявное  заявление
  PEN  STOP  .  При закрытии подпрограммы обработки посредством RETURN автома
  тически выполняется PEN ON , если стандартная подпрограмма не исполняет яв-
  ное заявление PENN OFF.
  Для более качественного управления генерированием Турбо-Бейсиком  кода
  проверки событий пользуйтесь метазаявлением $EVENT
       См. также  $EVENT
       ---------  PEN
      
  Пример    ON PEN GOSUB ПераОбработчик 'установить обработчик событий
       -------
                 PEN ON   'включить отслеживание событий
                 PRINT "Нажмите для останова любую клавишу..."
                 WHILE NOT INSTAT
                 WEND
                 END        'конец программы
      
                 ПераОбработчик
                                     -149 -
          
          
                 ---------------
                  FOR I% = 1TO 9
                  PRINT PEN (I%)
                  NEXT 1
                  RETURN
      
      
       Заявление ON PLAY
       -----------------
      
  Функция ON PLAY   заявляет подпрограмму отслеживания с целью получения
  ----------------  его  управления , если буфер фоновой музыки содержит
  менее специфицированного числа нот.
      
       Синтаксис   ON PLAY (нотсчетчик) GOSUB метка.
       ----------
  Замечания   Нотсчетчик - это целое выражение , а метка идентифицирует
  ----------  первое заявление в подпрограмме музыкального сопровождения.
  Заявление ON PLAY не имеет действия до тех пор, пока проверка  нот  не
  разрешается  заявлением  PLAY  ON. Если PLAY ON уже исполнено, Турбо-Бейсик
  осуществляет проверку между исполнениями каждого последующего  заявления  с


  целью  проверить не меньше ли осталось нот в музыкальном буфере, чем значе-
  ние нотсчетчика. Если это так, Турбо-Бейсик выполняет GOSUB  к  назначенной
  подпрограмме.
  Проверка  музыкального  буфера  выключается заявлением PLAY OFF. После
  музыкальной ловушки исполняется неявное заявление PLAY STOP с  целью  удер-
  жать  вызов  подпрограммы  отслеживания повторно из нее самой (и заполнения
  стека). При закрытии подпрограммы обработки посредством RETURN автоматичес-
  ки выполняется заявление PLAY ON, если ранее в подпрограмме не было  испол-
  нено явное заявление PLAY OFF.
  Событие  PLAY  не отслеживается, если при исполнении PlAY ON буфер уже
  пуст. Для управления генерированием кода проверки событий пользуйтесь мета-
  заявлением $EVENT. Для установки размера буфера фоновой музыки  пользуйтесь
  метазаявлением $SOUND.
       См.также   $EVENT
       --------   PLAY(заявление)
                  $SOUND
      
  Пример    Эта программа демонстрирует ON PLAY (n)
  -------   'разместить 30 байтов пространства звукового буфера
                $SOUND 100
           'включите проверку звуковых событий
                  PLAY ON
        настройке проверку буфера музыкального сопровождения
                  ON PLAY (S)GOSUB наполнить игры буфер
                  НотыS = "GEAFDCFECFEDGGG "
                  'играть октавы со 2 по 4
                  Игры СтрS ="MB"
                  FOR октава % =2 TO 4
                  Октава S ="0" + STR$(октава%)
                  Игры СтрS = ИгрыСтрS + ОктаваS + НотыS
                  NEXT Октава %
                  PLAY Игры СтрS
                  DO
                  LOOP UNTIL INSTAT
                  CLEAR
                  END    'конец программы
      
                  Наполнить игры буфер
                  ---------------------
                  PRINT Игры СтрS
                  PLAY Игры cтрS
                  RETURN
      
      
                                     -150 -


          
          
      
      
       Заявление ON STRIG
       -------------------
      
  Функция ON STRIG заявляет подпрограмму отслеживания кнопки управления.
  ------------------
      Синтаксис   ON STRIG (n) GOSUB метка
       ---------
  Замечания   Метка идентифицирует первое заявление подпрограммы обработки
  ---------  "нажатой  кнопки",  а  n - это целое выражение, указывающее
  подлежащую отслеживанию кнопку в соответствии со следующей таблицей:
  ---------------------------------------------------------------
        n                        Кнопка
  ---------------------------------------------------------------
        0             Кнопка 1, ручка управления А
        2             Кнопка 1, ручка управления В
        4             Кнопка 2, ручка управления А
        6             Кнопка 2, ручка управления В
  ----------------------------------------------------------------
                                
  Заявление ON STRIG не имеет действия до тех пор, пока события на кноп-
  ках управления не разрешаются с помощью заявления STRIG ON. Если  STRIG  ON
  уже  выполнено, проверка осуществляется между исполнениями всех последующих
  заявлений с целью проверить, не была ли нажата указанная кнопка.  Если  это
  так, вызывается назначенная подпрограмма.
  Для выключения проверки указанной кнопки управления используется заяв-
  ление STRIG OFF.
  После захвата события исполняется заявление STRIG STOP c целью пре
  дотвратить повторный вызов подпрограммы отслеживания из нее самой (и  запол-
  нение стека). Закрытие подпрограммы обработки с помощью RETURN вызывает ав-
  томатическое исполнения заявления STRIG ON, если ранее подпрограммой уже не
  исполнено  явное  заявление STRIG OFF. Для качественного генерирования кода
  проверки событий используйте метазаявление $EVENT.
       См. также   $EVENT
       ---------   STRING (n)
      
       Пример      Ноль X =1
       --------    Ноль Y =1
                   Один Z


                   Два  Y =1
                   ЧетыреХ=3
                   Четыре Y=1
                   ШестьХ=Y
                   ШестьY=1
                   'настроить обработчики событий
                    ON STRIG (0) GOSUB переключить ноль
                    ON STRIG (2) GOSUB переключить два
                    ON STRIG (4) GOSUB переключить четыре
                    ON STRIG (6) GOSUB переключить шесть
                   'включить проверку событий
                    STRIG (0) ON
                    STRIG (2) ON
                    STRIG (4) ON
                    STRIG (6) ON
 'пока кнопка не нажимается , отображать текущие координа-
  ты ручек управления
                    WHILE NOT INSTAT
                    LOGATE 15,15,0
                    PRINT STICK (0), STICK (1);
                    WEND
                    END       'конец программы
      
                    Переключить ноль:
                    LOGATE нольX,нольY
                                     -151 -
          
          
                    PRINT "Кнопка 1"
                    LOGATE 15,15,0
                    RETURN
                    Переключить два:
                    LOGATE ДваХ, ДваY
                    PRINT "Кнопка2"
                    LOGATE 15,15,0
                    RETURN
                    Переключить четыре:
                    LOGATE четыре Х, четыре Y
                    PRINT "Кнопка 4 "
                    LOGATE 15,15,0
                    RETURN
                    Переключить шесть:
                    LOGATE шесть Х, шесть Y
                    PRINT "КНОПКА 4"
                    LOGATE 15,15,0
                    RETURN
      
       Заявление ON TIMER
       -------------------
  Функция ON TIMER заявляет подпрограмму отслеживания с целью получения
  -----------------           управления каждые n секунд.
      
       Синтаксис   ON TIMER(n) GOSUB метка
       ----------


  Замечания   Метка указывает первое заявление подпрограммы обработки
  ---------  "истекшего времени", а n - целое выражение, указывающее ко-
  личество секунд ожидания от 1 до 86400 (24 часа)
  Заявление ON TIMER не имеет действия до тех пор, пока оно не  разреша-
  ется заявлением TIMER ON. Если TIMER ON уже исполнено начинается внутренний
  отсчет  секунд и между исполнениями каждого заявления делается проверка ис-
  течения числа секунд, идентифицированного в заявлении. Если время  истекло,
  вызывается подпрограмма, назначенная меткой.
  Заявление  TIMER OFF включает проверку времени. После ловушки исполня-
  ется неявное заявление TIMER STOP для предотвращения повторного вызова под-
  программы отслеживания из нее самой (и заполнение  стека).  При  закрывании
  подпрограммы обработки посредством RETURN автоматически выполняется заявле-
  ние  TIMER  ON , если подпрограмма ранее не исполняет явное заявление TIMER
  OFF. Это означает, что счетчик секунд повторно устанавливается в ноль после
  таймерной ловушки.
  Для управления генерированием кода проверки событий используется мета-
  заявление $EVENT.
       См. также     $EVENT
       ------------  TIMER
       Пример   ON TIMER(1) GOSUB отобразить время
       -------  настроить ловушку таймера
                'включить проверку таймерного события
                 TIMER ON
                 'ожидать нажатия клавиши
                 WHILE NOT INSTAT: WEND
                 END     'конец программы
                 Отобразить время:
                 LOGATE 1,70
                 PRINT TIME$: RETURN
   
      
       Заявление OPEN
       ---------------
      
  Функция OPEN    подготавливает файл или устройство считывания или зписи.
       -------------
  Синтаксис     OPEN файлспец [FOR режим] AS[#]файланом [LEN=размерзаписи]
       ---------- или OPEN режимная строка,[#]файланом, файласпец [,размер
                                     -152 -
 
  записи]
  Замечания   Режим может быть одним из следующих:


  ----------  OUTRUT  специфицируется последовательный файл для записи в
  него;
  INPUT - специфицируется последовательный файл для считывания из него;
  APPEND- специфицируется последовательный файл для добавления к нему;
  RANDON- специфицируется произвольный файл для считывания или записи;
  BINARY- специфицируется двоичный файл для считывания или записи;
  Режимная строка  это строчное выражение, первая (и обычно единственная)
  ---------------  литера которого может быть одной из следующих:
  0 специфицируется режим последовательного вывода
  I специфицируется режим последовательного ввода
  А специфицируется режим последовательного вывода в конец файла.
  R специфицируется режим произвольного ввода/вывода
  В специфицируется режим двоичного ввода/вывода
  Файланом может быть любым целым числом. Для увеличения или  уменьшения
  этого значения используйте DOS - заявление FILES в файле CONFIG.SYS (см.бо-
  лее подробную информацию в справочном руководстве по DOS)
  Файланец  - это строчное выражение специфицирующее имя файла, подлежа-
  щего открыванию, и, опционально, спецификация привода и/или прохода.
  Размер записи - это целое выражение, лежащее в диапазоне от 1 до 32767
  и специфицирующее длину в байтах каждой записи файла  произвольного  досту-
  па.По умолчанию, размер записи:128 байтов.
  Главная  функция OPEN состоит в привязке номера (файланом) к файлу или
  физическому устройству и в подготовке устройства для считывания и/или запи-
  си. Этот номер, а не имя файла, используется в  каждом  заявлении,  имеющем
  ссылку на файл. Содержимое заявление OPEN есть информация, указывающая "ре-
  жим файла"; т.е. способы, посредством которых будет осуществляться доступ к
  файлу: последовательный (для ввода, вывода в новый файл или вывода в сущес-
  твцющий файл), произвольный и двоичный. Заявление OPEN обычно уравновешива-
  ется согласованным с ним заявлением СLOSE (закрыть)
  Две формы команды отличаются только степенью многословности:


       OPEN "Мой файл.dta " FOR OUTRUT AS#1
       имеет то-же действие,что и :
       OPEN "0",#1 "мой файл.dta "
  Попытка открыть для Ввода несуществующий файл вызывает ошибку 53 пери-
  ода  прогона,  Файл  не обнаружен. Если вы пытаетесь открыть несуществующий
  файл для вывода , добавления, произвольного доступа или двоичных  операций,
  то он создается.
       См. также   OPEN COM
       ---------
  Пример  'эта программа подразделяется на пять процедур. Различие между
  процедурами состоит в режиме в котором открывается файл и способе манипу-
  лирования  данными файла.
       DEF FN дать клавишу $ (сообщ$)
  PRINT Сообщ $, " нажмите любую клавишу чтобы продолжить ..."
       WHILE NOT INSTAT:WEND
       FN дать клавишу $ =INKEY $
       END DEF    'конец процедуры дать клавишу
       SUB последовательный вывод
 'этот файл открывается для последовательного вывода и в него записыва-
 ются некоторые данные
 КлавишиНаж $=FN Дать клавишу $ (теперь для последовательного вывода)
       'открыть последовательный файл для вывода
       OPEN "OPEN.DTA" FOR OUTRUT AS#1
       Целое % =12345
       Время стр$="История делается ночью"
       'записать данные в последовательный файл
       WRITE#1,Времстр$,целое%*2,врем стр$, целое %\2
       CLOSE 1  закрыть файл
       END SUB 'конец процедуры " последовательный вывод".
       SUB последовательное добавление
 'файл открывается для последовательного вывода. Однако данные  в  этом
  случае добавляются в конце файла.
       Клавиши Наж$ = FN дать клавишу $ (теперь немного добавим)
                                     -153 -
          
          
  'открыть последовательный файл для добавления данных
       OPEN "OPEN.DTA"FOR APPEND AS#1
       Целое %=32123
       Врем Стр$ ="Наилучшее видение есть .... М.Форбе"
       'добавить данные
       WRITE#1,ВремСтр$, Целое%*0,2,Врем Стр$, Целое%\2
       CLOSE 1    'закрыть файл


       END SUB  'конец процедуры "последовательное добавление"
       SUB Последовательный Ввод
       -------------------------
  Файл  открывается для последовательного ввода, а данные которые считы-
  ваются, отображаются на экране.
       КлавишиНаж $=FN Дать клавишу $("теперь считаем обратно")
       'открыть последовательный файл и читать из него
       OPEN"OPEN.DTA" FOR INPUT AS#1
       ' читать первую строку используя LINE INPUT#
       LINE INPUT #1,ВремСтр$
       PRINT ВремСтр$
 'использовать INPUT$ для считывания остальной части файла по одной ли-
  тере
       ВремСтр$=" "
       WHILE NOT EOF(1)  'проверка конца файла
       ВремСтр$ = ВремСтр$ + INPUT$(1,1)
       WEND
      
       PRINT ВремСтр $
       CLOSE 1    'закрыть файл
       КлавишиНаж $=FN Дать клавишу $(" ")
       END SUB     'конец процедуры Последовательный ввод
       SUB Двоичный ВВ
       'файл открывается для двоичного ввода/вывода.
       'данные считываются с использованием GET$.
  'SEEK  явно перемещает файловый показатель до конца файла и вы записы-
  ваете те-же данные обратно в файл.
  Клавиши Наж$ = FN ДатьКлавишу $ (теперь для двоичного ввода и вывода)
       'открыть двоичный файл, читать из него
       OPEN "OPEN.DTA" FOR BINARY AS#1
       ВремСтр$=" "
  Использовать GET$ для считывания данных и их хранения в строке
       WHILE NOT EOF (1)
       GET$ 1,1 Лит $
       ВремСтр$ =ВремСтр $ + Лит$
       WEND
       PRINT ВремСтр $
       'переместить файловый указатель в конец файла
       SEEK 1, LOF (1)
       'PUT$ копирует данные обратно в двоичный файл
       FOR I% = 1 TO LEN (ВремСтр$)
       PUT$ 1, MID$ (ВремСтр$,I%,1)
       NEXT I%
       CLOSE 1     'закрыть файл
       КлавишиНаж$ = FN ДатьКлавишу $ (" ")
       END SUB    'конец процедуры Двоичный ВВ
       SUB Произвольный ВВ
       'открыть файл для произвольного ввода/вывода.
 'использовать FIELD для заявления буфера для утверждения данных, кото-


  рые записываются и считываются.
  GET и PUT считывают и записывают данные. Заметьте, что перед  выполне-
  нием  GET  для хранения данных в буфере в буфере файла используются 'LSET и
  RSET.
  КлавишиНаж$ = FNДатьКлавишу$ (теперь для произвольного ввода/вывода)
       'открыть файл произвольного доступа
       OPEN "OPEN.DTA" AS #1 LEN=1
       FIELD 1,1 AS Лит$    'определить 1-байтовый буфер
       ВремСтр$ = " "
                                     -154 -
          
          
       ВремРазмер% =LOF (1)   'хранить размер файла
       'используя GET, считать файл целиком
       FOR I% = 1 TO ВремРазм%
       GET 1, I%
       ВремСтр$ = ВремСтр$ + Лит$    'хранить данные
       NEXT I%
       'PUT копирует данные обратно в произвольный файл
       FOR I% = LEN (ВремСтр$) TO1 STEP-1
       LSET Лит$ = MID$ (ВремСтр$, I%,1)
       PUT 1, LOF (1)   'вывод до конца файла
       NEXT I%
       CLOSE 1       'конец процедуры Произвольный файл
       'печать главной программы
       CALL Последовательный вывод
       CALL Последовательное добавление
       CALL Последовательный ввод
       CALL Двоичный ВВ
       CALL Произвольный ВВ
       END     'конец программы
      
      
      
       Заявление OPEN COM
       -------------------
  Функция OPEN COM     открывает и конфигурирует коммуникационное высшее
       -------------------  устройство.
                        
  Смнтаксис     OPEN " COM n [боды][,четность][,данные][,останов][опции]"
  ----------    AS [*] файланом [LEN кол]
                                                                            
  Замечания   n - указывает надлежащее открыванию последовательное внешнее
  ---------- устройство ввода/вывода. Боды-это целая константа, специфи-
  цирующая    скорость    коммуникации:    законными    скоростями   являются
  75,110,150,300,600,1200,1800,2400,4800 и 9600 (по умолчанию 300)
  Четность - это единственная литера, специфицирующая статус четности  в


  соответствии со следующими определениями:
   S  четность по пробелу (бит четности всегда 0)
   О  нечетный параллелизм
   М  маркированная четность(бит четности всегда 1)
   Е  четный параллелизм
   N  без  четности  (игнорируется на применяемых литерах и опускается на
  передаваемых литерах)
       По умолчанию - четный параллелизм.
  Данные - это целая константа от 5 до 8,  специфицирующая  число  битов
  данных. По умолчанию 7.
  Останов  - это целая константа от 1 до 2, специфицирующая число битов
  ------- данных. о умолчанию бит останова 1(для бодовых скоростей 75 и
  110 эта константа равна 2)
  Файланом  - это целое выражение, которым специфицируется числовая панель
  ---------   через которую вы осуществляете доступ к коммуникационному
  внешнему устройству ввода/вывода.
  Кол - это максимальное число байтов, котрое можно считывать с коммуни-
  кационного  устройства или записывать на него с помощью GET и PUT; по умол-
  чанию - это 128. Данное значение не может быть больше  размера  буфера  для
  этого  внешнего устройства, который устанавливается с помощью метазаявления
  $COM.
  Заявление OPEN COM включает в себя блок опций, который управляет обра-
  боткой строки состояний, четностью  и  обработкой  возврата  каретки/подачи
  строки.
  Опции = [,RS][,CS[м сек]][,DS[м сек]][,CD[м сек]][,LF][,DF]
  RS подавляет строку RTS. CS [м сек] управляет CTS. DS [м сек] управля-
  ет DSR. CD [м сек] управляет CD. LF вызывает добавление литера подачи стро-
  ки к каждой литере возврата каретки. PE включает проверку четности.
  Аргумент м сек онций CS,DS,CD может лежать в диапазоне от 0 до 65535 и
  специфицирует сколь долго ( в миллисекундах ) Турбо-Бейсик будет находиться
                                     -155 -
          
          
  в состоянии ожидания перед возвращением ошибки Устройство на Перерыве. Если
  этот  аргумент  равен 0 или опускается, то проверка строки состояния не вы-
  полняется. По умолчанию м сек равен 1000 для СS и DS и 0 для CD


       См. также   COM
       ---------   $COM
                   ON COM
  Пример ' разместить строчный массив для хранения, ввода  DIM  КомПортВ-
  вод$ (1)
       $COM1 1024   'построить 1 К буфер ввода
       OPEN "COM1" AS#1 LEN = 1
       PRINT "нажмите любую клавишу для  завершения программы ...."
       WHILE NOT INSTAT 'пока клавиша еще не нажата
       'если в наличии есть какой-либо ввод
       IF LOF (1) > 0 THEM
       'читать все что имеется в буфере ком. устройства
       КомПортВвод$(0) = INPUT$ (1, LOF(1))
       Отобразить ввод
       PRINT "Ввод Ком-устройства:", КомПортВвод $(0)
       END IF
       WEND
       END    'конец программы
      
      
      
       Заявление OPTION BASE
       ----------------------
  Функция OPTION BASE устанавливает минимальное значение для подстрочных
       --------------------  индексов массивов .
  Синтаксис   OPTION BASE целое выражение
       ---------
  Замечания    Целое выражение может находиться в диапазоне от 0 до 32767.
  ----------  OPTION BASE управляет тем, какое значение подстрочного ин-
  декса относится к первому элементу переменных  массива.Нап-
  ример,  после  OPTION BASE 1, заявляющее массив x с помощью
  заявления DIM x(20) устанавливает отдельную память  для  20
  элементов  (от1 до 20), а не 21, устанавливаемое по умолча-
  нию(от 0 до 20).
  Хотя вы можете использовать OPTION  BASE  для  управления  диапазонами
  подстрочных  индексов, Турбо-Бейсик предлагает более мощный способ че-
  рез заявление DIM.
       Ст. также DIM
       --------------
       Пример   'разместить массив из трех целых
       -------   DIM Первый массив % (2)
  'установить начальный индекс любого заявленного массива
                 OPTION BASE 1
                 'разместить массив из двух целых
                 DIM Второй массив % (2)
                 FOR I% = 0 TO 2
                 'нет нулевого индекса; проверка на 0
                 IF I% > 0 THEN


                 Второй массив % (I%)=I%
                 END IF
                 Первый массив % (I%) =I%
                 NEXT I%
                 FOR I% =0 TO2
         ' нет нулевого индекса; проверка на ноль
                 IF I% >0 THEN
                 PRINT Второй массив
                 END IF
                 PRINT Первый массив% (I%)
                 NEXT I%
                 END  ' конец программы
      
                                     -156 -
          
          
      
       Заявление OUT
       --------------
  Функция  OUT  обеспечивает запись на внешнее устройство ввода/вывода
       ------------
       Синтаксис     OUT портном, целое выражение
       ----------
  Замечания  OUT  посылает байтовое значение (от 0 до 255) на аппаратное
  --------- внешнее устройство вывода портном, где портном -  это  целое
  выражение от 0 до 65535.
  OUT необходимо для управления различными аппаратными подсистемами, та-
  кими  как коммуниеационный или видео-адаптер. Используемое неправильно
  OUTможет легко разрушить систему.
  Пример   'программа делает вопль звукоизлучателя посредством считывания
  --------- регистра состояний и тумблерного переключения  (  включить  и
  выключить) битов, которые управляют звукоизлучателем.
       'считать значение в Порт 61 шестнадцатиричное
        СостояниеРег % = INP (&H61)
        СостояниеРег % = СостояниеРег % AND &HOOFC
  'маскировать считываемое значение
  'сделать тон достаточно длительным для слухового восприятия
        FOR I = 1 TO 1000
  СостояниеРег % = CостояниеРег% XOR 2 ' тумблерное переключение звуко-
        излучателя
        OUT &H61, СостояниеРег%   'вывод нового состояния
        DELAY.001
        NEXT I
        END
       
        Заявление PAINT
        ----------------
        
  Функция  PAINT обеспечивает заполнение замкнутой зоны экрана выбранным
  -------  цветом
        Синтаксис   PAINT(x,y) [I,цвет][I,граница][,фон]
        ---------


  Замечания  (x,y) - координаты исходной точки в замкнутой зоне, подлежа-
  ---------  щей  заполнению.  Если исходная точка в пределах замкнутой
  зоны, то заполняется ее внутренняя часть.  Если  исходная  точка  вне
  замкнутой  зоны,  то  будет заполняться поверхность экрана с наружной
  стороны замкнутой зоны. Цвет - может быть либо числовым, либо  строч-
  ным  выражением. Если это числовое выражение, им специфицируется атт-
  рибут (цвет) которым будет осуществляться заполнение.Если это строка,
  то она содержит информацию маски, которая вызывает заполнение  с  по-
  мощью  какого-то графического образчика, а не сплошным цветом.Если вы
  не специфицируете цвет, используется цвет нужного фона.
  Граница - это цвет бордюра заполняемой вами  фигуры.  Действие  PAINT
  прекращается всякий раз, когда на пути встречается цвет границы.
  Фон  - это опциональная строчная маска, используемая когда вы желаете
  перекрасить зоны. Фоновая маска представляет собой  некий  черепичный
  пластик перехода при  проверке уже закрашенных зон.
  С  помощью заявления PAINT можно заполнять любую замкнутую форму, вне
  зависимости от ее сложности. Турбо-Бейсик выбирает  байт,  подлежащий
  графической  обработке, с использованием формулы y mod tike length (y
  mod черепицы длина) . Обеспечивает уверенность в замкнутости подлежа-
  щего заполнению режима, поскольку при "утечке" заполнителя может ока-
  заться испорченной вся ваша картина.
  Если аргумент цвет числовой,  PAINT  заполняет  форму  указанным
  цветом,  останавливаясь на пикселах с атрибутом граница или атрибутом
  цвет. Если цвет - строчное выражение, то для  определения  образчика,
  которым подлежит заполнению зона, используется принцип "черепицы".
  Образчик, представляемый строчными значениями аргументов цвета, имеет
  1-байтовую ширину(4 пиксела при средней и 8 пикселов при высокой сте-
  пени разрешения) и от 1 до 64 байтов длину(т.е. от 1 до 64 строк ска-
                                     -157 -


          
          
  нирования  по вертикали). При черепичной обработке цвет должен предс-
  тавляться в таком формате:
                CHR$(&Hnn) + CHR$(&Hnn) ...
  Маска базируется на основных битовых значениях цвета,  причем  первая
  литера  представляет  первую строку образчика, вторая литера - вторую
  строку и т.д.
  Например, следующий образчик представляет образчик в виде шахмат-
  ной доски(50% серого) в режиме высокой разрешающей способности:
          10101010 (первый байт)
          01010101 (второй байт)
  Чтобы заполнить какую-либо зону этой шахматной доской, строится стро-
  ка с подходящей информацией маски. Прежде всего преобразуйте двоичную
  флрму в шестнадцатиричную:
          10101010 = &HAA
          01010101 = &H55
       
  Теперь конструируйте двухсимвольную строку, используя CHR$:
  Образчик $=CHR$(&HAA) + CHR$ (&H55)
        Далее заявление
        PAINT (50,50), образчик $
  Обеспечивает заполнение серой (шахматная доска) краской
  Фон - используется для определения условия останова, когда заполня-
  ется уже обработанная образчиком зона. Если операция заполнения попа-
  дает на пиксел, который согласуется с соответствующим битом  в  фоне,
  то заполнение не прекращается, даже этот пиксел имеет цвет границы.
  При  черепичной  обработке число цветовых аттрибутов в каждом экр-
  ранном режиме определяет каким образом конструируется экранный образ-
  чик. Помните, что число битов на пиксел коррелируется с числом цвето-
  вых аттрибутов в любом данном экранном режиме. Для  вычисления  коли-
  чества битов на пиксел вы можете воспользоваться следующей формулой:
         LOG  (X) = Y,
              2
  где  X равно сумме цветовых аттрибутов вашего экрана, а Y равно числу
  битов на пиксел.
                   Черепичная обработка в Экране 1.
  При средней разрешающей способности , используя  приведенную  выше
  формулу, X равно 4 пикселам (которые представляются 1 черепичным бай-


  том средней разрешающей способности), поэтому Y равно 2 битам на пик-
  сел. Поскольку каждый пиксел имеет соответствующий цветовой аттрибут,
  он  будет  занимать  2 бита черепичного байта для описания 1 вывода 4
  аттрибутов.
  В следующей таблице показаны десятичные и шестнадцатиричные  значе-
  ния, которые соответствуют каждому аттрибуту:
  ---------------------------------------------------------------------
    Цветовая       Аттрибут          Образчик             Образчик
    палитра        в двоичном        в двоичном       в шестнадцатиричном
   ---------------------------------------------------------------------
     0
     зеленый           01              01010101             &H55
     красный           10              10101010             &HAA
     коричневый        11              11111111             &HFF
   ----------------------------------------------------------------------
     1
     цинковый          01              01010101             &H55
     анилиновый        10              10101010             &HAA
     белый             11              11111111             &HFF
   -----------------------------------------------------------------------
       
                  Черепичная обработка на Экране 2
       
  Имеется 1 бит на пиксел при высокой разрешающей способности, позволя-
  ющий  каждую черепицу представлять &-пиксельным экраном. Где бы маска
  не оценивалась значением 1, на графике появляется точка. Строка может
  содержать до 64 байтов.
  Образчик вызывается одинаковым образом по всей протяженности  зоны,
                                     -158 -
          
          
  определяемой границей.Когда граница не определяетмя, обработанным об-
  разчиком оказывается весь экран.
      
                Черепичная обработка в Экранах 7,8,9,10
       
  Для  этих улучшенных экранных режимов черепичный образчик представ-
  ляет собой изобретение некоторого  приема  хранения  и  интерпретации


  строки,  как  стека  8-битовых  блоков,  известных в совокупности как
  бит-плоскость. В каждом экранном режиме, за  исключением  режима  10,
  для которого требуется 2 бит-плоскости, для определения 1 черепичного
  байта необходимо 4 бит-плоскости.
  Пример  'вот как используются черепичные образчики
        -------  SCREEN 1:CLS
   'определить диагональный образчик для диагональных линий
       TIL$  = CHR$(&H40)+CHR$(&H40)+CHR$(&H10)+CHR$(&H10)+CHR$(4)+
       CHR$(4)+CHR$(1)+CHR$(1)
                 CIRCLE(100,100),50
                 PLANT(100,100),TIL$
      'определить черепичный образчик-шахматная доска
      TIL2$=CHR$(&HAA)+CHR$(&HAA)+CHR$(&H80)+CHR$(&H80)+CHR$(&H80)+
      CHR$(&H80)+CHR$(&H80)+CHR$(&H80)
                 CIRCLE (225,100),50
                 PLANT (225,100),TIL2$
      
      
       Заявление PALETTE, PALETTE USING
       ---------------------------------
 Функция PALETTE и PALETTE USING позволяет вам менять один или более цв
  -------------------------------  етов в политре (чтобы воспольэоваться
  этими заявлениями, у вас должен быть улучшенный графический
  Адаптер)
       Синтаксис   PALETTE (атрибут, цвет)
  ----------  PALETTE USING имя целого массива( индекс в массиве)
  Замечания Аттрибутом представляется цвет в палитре. Цвет - это  факти-
  чески  отображаемый цвет, которым замещается аттрибут в па-
  литре. Отображаемый на вашем экране цвет зависит  от  уста-
  новки  экранного  режима и аппаратного дисплея(см.заявление
  SCREEN). Заявление PALETTE дает вам возможность менять цвет
  текста или графики имеющейся в данный момент  на  экране  и
  это изменение оказывает также действие на любые последующие
  тексты  или  графику.  Это подручное средство, освобождающее
  вас от необходимости перечерчивать текст или графику,  если
  вы вдруг пожелаете изменить цвет(см. раздел примеров)
  PALETTE  позволяет вам также маннировать число цветов в палитре более


  15. Вы даже можете отображать текст как невидимый на фоне,а
  затем изменить палитру для цвета текста, чтобы сделать  его
  внезапно видимым.
  Если  в  заявлении PALETTE аргументы не специфицируются, палитра уста-
  навливается в заранее определенные цвета умолчания.
  Заявления PALETTE USING позволяет вам модифицировать всю палитру в це-
  лом посредством одного заявленияя. Имя целого массива  име-
  нует массив. При установке вашей палитры используйте индекс
  в  массиве  для указания первого элемента массива ( в боль-
  шинстве случаев вы будете специфицировать в качестве индек-
  са в массиве 0). Добивайтесь уверенности в том, что  размер
  вашего  целого  массива  достаточно велик для хранения всех
  шестнадцати  входов  палитр  после индекса в массиве. Любой
  аттрибут в палитре находится в паре с цветом из целого мас-
  сива. Использование в качестве  цветового  аргумента  -1  в
  массивном  входе приводит к тому, что спаренный аттрибут не
  изменяется: однако все другие  отрицательные  значения  для
  цвета  незаконны. Ниже представлен список диапазонов аттри-
  бутов и цветов  для различных экранных режимов и мониторов:
      
                                     -159 -
          
          
               Таблица 5-1 Диапазоны цветов и аттрибутов
      
  -----------------------------------------------------------------------
   Режим        Монитор            Диапазон аттрибутов    Диапазон цветов
  -----------------------------------------------------------------------
    0          Моно/EGA                 0-15                  0-2
    0          Цветной/EGA              0-31                  0-15
    1          Цветной/EGA              0-3                   0-15
    2          Цветной/EGA              0-1                   0-15
    7          Цветной/EGA              0-15                  0-15
    8          Цветной/EGA              0-15                  0-15
    9          EGA(64 K)                0-3                   0-15


    9          EGA (>64K)               0-15                  0-63
   10         MONO/EGA                 0-3                   0-8
      
       Моно - монохромный
   EGA - Улучшенный графический адаптер /ВМ
  -----------------------------------------------------------------------
      
  Ограничения  Для заявлений PALETTE и PALETTE USING требуется улучшенный
  -----------  Графический Адаптер (EGA)
      
       Cм. также   COLOR
       ---------   DRAW
                   SCREEN
      
  Пример   'ниже  показано  как  применить  PALETTE для изменения цвета
  -------  графики ( и текста) без перечеркивания или повторного отобра-
  жения графики.
  SCREEN 8    'установить 16-цветный режим ECA 640x200
  PALETTE    'установить цвета палитры EGA по умолчанию
  LINE (10,10) -(630,190),1,BF 'чертить рамку, заполнить ее го-
  лубым
               DO
               FOR I% = 2 TO 14
               PALETTE 1, I%   'изменить цвет рамки с голубого
               DELAY,2      'задержать чтобы видеть изменения
               NEXT I%
 LOOP UNTIL INSTAT  'производятся изменения до нажатия клавиши
               END
      
      
      
       Функция PEEK
       -------------
  Функция PEEK   возвращает байт, хранимый в специфицированной ячейке
       -------------  памяти
       Синтаксис   y=PEEK(отступ)
       ----------
      
  Замечания Отступ - это числовое выражение от 0 до 65535,  представляю-
  ---------- щее 16-битовый отступ в текущем сегменте, установленном са-
  мым последним заявлением DEF SEG. Возвращаемое значение мо-
  жет  быть  в  диапазоне от 0 до 255. PEEK и дополняющее его
  заявление POKE представляют собой низкоуровневые  уходы  из
  определяемого  в  Турбо-Бейсике использования памяти. Одной
  из областей применения PEEK и  POKE  является  формирование
  массивов  байтов  для  такого  применения, где не трубуется
  полного, от -32768 до 32767 диапазона целых массивов.
       См. также  DEF SEG
       ---------  POKE


      
  Пример  DIM массивов % (5) 'разместить массив из 6 целых
  ------- DEF SEG =ПЕРСЕГ (массив%(0) )
   'используйте POKE, возбудить массив
                                     -160 -
          
          
               FOR I% = 0 TO 11
               POKE I%, &HFF
               NEXT I%
               'используйте PEEK, отобразить состояние массива
               FOR I% = 0 TO 11
               PRINT HEX$ (PEEK (I%) _
               NEXT I%
               END
      
      
       Фуцнкция  PEN
       --------------
       Функция PEN   считывает состояние светового пера.
      ------------
       Синтаксис   y=PEN (опция)
       ----------
  Замечания   Опция - это числовая опция, которая управляет информацией,
  ---------   возвращаемой PEN, в соответствии со следующей таблицей:
      
  ---------------------------------------------------------------------
    Опция                        Действие
  ----------------------------------------------------------------------
      0         Перо вниз с момента последней проверки?
           (-1= до; 0=нет)
      1    X-координаты, при которой последний раз задействовалось перо
               
      2    Y-координата, при которой последний раз задействовалось перо
      
      3    Текущее значение переключателя (-1=вниз; 0=вверх)
                                                                
      4    Самая последняя X-координата
      
      5    Самая последняя Y-координата
      
      6    Ряд в котором последний раз задействовалось перо
      
      7    Колонка, в которой последний раз задействовалось перо (1-80)
      
      8    Самый последний ряд (1-24)
      
      9    Самая последняя колонка (1-80)
  -----------------------------------------------------------------------
      
  Перед выполнением любого запроса функции PEN световое перо должно быть
  включено с помощью заявления PEN ON.
      
  Пример  ON PEN GOSUB  Пераобработчик 'построить обработчик событий


  ------  PEN ON  'включить отслеживание событий
               PRINT  'нажмите для останова любую  клавишу
               WHILE NOT INSTAT
               WEND
               END
             
               Пераобработчик:
               FOR I% = 1 TO 9
               PRINT PEN (I%)
               NEXT I%
               RETURN
      
      
       Заявление PEN
       --------------
       Функция   PEN управляет проверкой событий светового пера.
                                     -161 -
          
          
       --------
       Синтаксис   PEN (ON [OFF] STOP)
       ----------
  Замечания  Заявление PEN управляет проверкой событий светового пера.
  ---------  Перед выполнением любых запросов функций пера световое перо
  длжно быть включено с помощью PEN  ON.  Исполнение  PEN  ON
  также  обеспечивает доступ к отслеживанию событий светового
  пера с помощью подпрограммы, указываемой в заявлении ON PEN.
  PEN ON запрещает функцию PEN и включает проверку событий пера.
  PEN STOP отключает отслеживание событий пера, но события пера  запоми-
  наются, что если позднее выдается PEN ON, немедленно проис-
  ходит захват события в ловушку.
       См. также  ON PEN
  ----------
  Пример  'эта программа демонстрирует заявление PEN ON
  -------  ON PEN GOSUB Пераобработчик
                'настроить обработчик событий
                 PEN ON   'включить отслеживание событий
                 PRINT 'нажмите для останова любую клавишу
                 WHILE NOT INSTAT
                 WEND
                 END
                 Пераобработчик
                 FOR I% = 1 TO 9
                 PRINT PEN (I%)
                 NEXT I%
                 RETURN
      
     
      
      
       Функция PLAY
       ------------
  Функция PLAY возвращает число нот, содержащихся в буфере фоновой музы-
       -----------  ки
      
       Синтаксис     y=PLAY (x)
       ----------
  Замечания   X- это пустой числовой аргумент.


PLAY возвращает число нот,
  ----------  имеющееся  в  буфере фоновой музыки в ожидании исполнения.
  Если музыка должна исполняться на переднем фоне или не должна
  исполняться вовсе, PLAY возвращает 0.
       См. также  $SOUND
       ---------
  Пример    'играть до-ре-ми-фа и считать оставшиеся ноты
  -------    PLAY " MB CDEFG "
                  Вновь:
                  -----
                  n=PLAY (1) 'можно играть(что-нибудь)
                  PRINT n "нот осталось в буфере"
                  IF n=0 THEN PRINT "Буфер пуст": END
                   GOTO вновь
        
     Заявление    PLAY
    -------------------
    
     Функция PLAY создает музыку
    ----------------
     Синтаксис PLAY строчное выражение
    ---------------
  Замечания    PLAY представляет собой интерпретаторный мини-язык, который
  -------------  делает для музыки то же самое, что DRAW для графики. PLAY
  дает вам возможность определять музыкальные пассажи, как последо-
  вательность литер в строчном выражении, и исполнять их через звукоизлу-
                                     -162 -
          
          
  чатель компьютера.
  Имеется $4 ноты, соответствующие большинству клавиш пианино в ди-
  апазоне  тремя октавами ниже среднего С но одной нотой меньше , чем че-
  тыре октавы выше среднего С. Ноты могут представляться их числовым зна-
  чением (1-84) или в письменной нотации ( т.е. от А до G с диезами и бе-
  молями, а также с информацией об октаве)
  Например, PLAY N44" играет ноту 44, т.е. G выше среднего С,  PLAY
  "036" играет С в третьей октаве(ту же ноту).
  Заявления  музыкального  определения можно группировать в длинные
  составные последовательности:
            PLAY "03FGA"
            играет три ноты (F,C,A) в октаве 3.
  Пробелы музыкальным интерпретатором игнорируются и могут  использо-
  ваться для обеспечения четкого представления структуры командной строки.
            Команды


  Следуюшие одно и двухлитерные команды образуют язык заявления PLAY.
           нота-буква [(# 1+1 - )]
  Играть ноту нота-буква: нота-буква - это буква от А до G (регистр
  безразличен).  Включением опционального диеза (# или +) либо бекара (-)
  после нота-буквы осуществляется выбор эквивалента черной клавиши пиани-
  но.Вы не можете полутонировать ноту для получения какой-то белой клави-
  ши; например, "F-" незаконно.
            Nn
  Играть ноту n, где n-числовое представление ноты от 1 до 84. Нота
  1 это самое низкое с на пианино; 84 - самое высокое в.  Среднее  с  это
  нота 37. Нота О не дает звука и может использоваться в качестве паузы.
            Оn
  Выбирается  октава n, где n может быть 0-6. Каждая октава начина-
  ется с С и оканчивается В. Среднее С есть  первая  нота  октавы  3.  По
  умолчанию - октава 4.
            >n
  Перемещение  текущей октавы вперед на 1 и играть ноту n. Если те-
  кущая октава 6 (наивысшая октава) то остается шестая октава.
            <n
  Понижение текущей октавы и играть ноту n. Если октава О  (наиниз-
  шая октава) то остается нулевая октава.
            Ln
  Установить продолжительность нот, следующих далее, в соответствии
  с таблицей:
            L1  целая нота
            L2  половинная нота
            L4  четвертная нота
            L8 одна восьмая
           
           
           
            L64 одна шестьдесят четвертая
           
  Приемлмы и промежуточные значения (L5 это законное заявление про-
  должительности звучания). Наибольшее допустимое значение для n есть 64.
           Рn
  Паузы для n ударов (где n представляется в периодах времени, спе-
  цифицированных в последней команде L)
  Помещение  точки после ноты вызывает ее исполнение в полтора раза
  дольше ее нормального значения. Например, снабженная точкой  четвертная
  нота имеет общую продолжительность звучания в четвертную и восьмую доли
  ноты.
  Может использоваться более чем одна точка.


Вторая точка действует
  на  пару нота- точка как нечто целое; например, снабженная двумя точками
  четвертная нота играется на 1.5 (1.5 * 1/4) удара. Точками также  можно
  регулировать длину паузы.
            Tn
  Устанавливается  тема, где n - число четвертных нот в минуту, ко-
  торое может находиться в диапазоне от 32 до 255. По умолчанию - 120.
            MF
                                     -163 -
          
          
  "Музыкальный передний фон" приводит к тому что музыка,  создавае-
  мая  заявлением PLAY прогоняется на переднем фоне (т.е. следующее заяв-
  ление вашей программы не будет исполняться пока не завершится  исполне-
  ние музыкального сопровождения).
            МВ
  "  Музыка заднего фона" приводит к тому, что исполнение музыки сох-
  раняется, даже если ваша программа не делает ничего другого. По умолча-
  нию Турбо-Бейсик имеет 32-нотный буфер для игры на заднем фоне, который
  может быть удлинен с помощью заявления $SOUND. См. также заявление PLAY
  ON и ON PLAY с помощью которых можно периодически инспектировать испол-
  нение музыки заднего фона и при необходимости добавлять новые ноты.
         MN/MI/MS
        
  В  зависимости от этой установки ноты могут выдерживаться либо тремя
  четвертями времени, специфиуируемого L (MS : "Музыкальное стокатто),  либо
  семью  восьмыми  времени специфиуируемого L (MN "Нормальная музыка"), либо
  полным временем, специфицируемым L (ML : "Музыкальное легато")
   X VARPTR$ (строчная переменная) (исполнить субстроку)
   X (исполнить) - команда дает вам возможность вставлять  субстроку  в
  заявление PLAY  как музыкальную подпрограмму; например в:
         aS = "CDE " PLAY "EDEX" + VARPTR$ (aS)
         играются ноты EDECD и E  в указанном порядке.
         Переменные аргументы
  В  каждой  команде PLAY аргумент может быть постоянным значением или
  специфицироваться в форме = VARPTR$ (переменная),  где  переменная  -  это


  числовая  переменная. Примечание: Интерпретаторный Бэйсик позволяет специ-
  фицировать в игровой строке имена переменных. Например, PLAY "T =x;  уста-
  навливает  темы для содержимого переменной x. Хотя было бы прекрасно, если
  бы это делалось, но в Турбо-Бейсике такая возможность не реализуется, пос-
  колько именная информация, ассоциируемая с переменной x во  время  прогона
  нет. Вместо этого вы должны пользоваться описанным выше приемом VARPTR$ .
         См. также ON PLAY
                   PLAY ON
                   $SOUND
   Пример      первая строка $ = 0314cl2ee18el4eedcfl1<A"
   -------     вторая строка $ = 03l8cccl4edl2<Al4Al1 <1>c"
               третья строка $ = l4cl10ff.fl1e"
                     PLAY "T150"  скорость до темпа
                     FOR n = 1 TO4
                     PLAY первая строка $
                     NEXT n
                     PLAY вторая строка $ + третья строка $
        
        
         Функция PMAP
         ------------
  Функция PMAP транслирует физические координаты в мировые и наоборот.
        
         Синтаксис    y = PMAP (x, опция)
         -----------
  Замечания x -это координата точки подлежащей маппированию, а опция -
  это  целое  выражение от 0 до 3, которое управляет функцией PMAP следующим
  образом.
  --------------------------------------------------------------------
   Опция          Действие
  --------------------------------------------------------------------
   0      Маппировать мировую координату x в физическую координату x
     
   1       Маппировать мировую координату y в физическую координату y
       
   2       Маппировать физическую координату x в мировую координату x
        
   3       Маппировать физическую координату y в мировую координату y
        
                                     -164 -
          
          
         --------------------------------------------------------------------
        


  PMAP осуществляет масштабирование, специфицируемое  самым  последним
  заявлением WINDOW без размещения чего-либо на экране.
         См. также WINDOW
         ---------
  Пример "Переключить на графический экран средней размещающей способ-
  ности
         SCREEN 1
  "определить  декартово начало в средине экрана с исходным диапазоном
   значений x и y, которые получаются больше при перемещении вверх, а не вниз.
         WINDOW (-1000, 1000) - (1000, -1000)
  PMAP может теперь осуществлять масштабирование между декартовым  эк-
  раном и физическими пикселами
         PSET (PMAP (0,0), PMAP (0,1),2
         PSET (PMAP (50,2),PMAP (50,3)),2
         PEINT PMAP (0,0),PMAP(0,1),PMAP(50,2),PMAP(50,3)
         END
        
         Функция POINT
         --------------
  Функция POINT возвращает цвет пиксела или информацию об LPR.
         Синтаксис Первая форма
         --------- цвет = POINT (x,y)
                   Вторая форма:
                  y= POINT (опция)
        
  Замечания В первой форме (x,y) специфицирует координаты графического
  пиксела средней или высокой разрешающей способности. POINT возвращает атт-
  рибутное  значение (цвет) пиксела в точке (X,Y). Если либо x, либо y лежат
  вне диапазона, POINT возвращает 1.
  Во второй форме опция - это числовые переменная или выражение, кото-
  рое управляет действием POINT в соответствии со следующей таблицей:
  -------------------------------------------------------------------
    Опция             Действие
  -------------------------------------------------------------------
      0     Возвращается текущая физическая x- координата
      1     Возвращается текущая физическая y-координата
      2    Возвращается текущая мировая x-координата
      3    Возвращается текущая мировая y-координата
  ----------------------------------------------------------------------
  Первая форма POINT полезна просто для оживления пиксела вовремя. Ис-
  пользуйте POINT для считывания цветафонового окружения пиксела, подлежаще-


  го перезаписи во временную память. Затем  с  помощью  PSET  устанавливайте
  точку в цвет перемещающегося обьекта. И наконец , для стирания точки, воз-
  вращайте ее в первоначальный цвет.
         См. также PSET
         ---------
  Пример    "включить графический режим среднего разрешения SCREEN1
         --------   CIRCLE (160,100),50,2  " отобразить окружность
                    поставить точку в центре окружности
                    PSET (160,100),1
                   "отобразить цвет точки и ее положение
                     PRINT POINT (160,100)
                    PRINT POINT (0),POINT (1)
                     END
        
        
        
         Заявление POKE
         ----------------
         Функция POKE записывает байт по специфицируемому адресу
         -------------
         Синтаксис  POKE отступ, значение
         ----------
                                     -165 -
          
          
  Замечания Отступ - это адрес в диапазоне числовых значений от 0 до 65535.
  ---------- Значение - это значение байта , подлежащего записи по адресу
  в  диапазоне от 0 до 255. Отступ относится к сегменту, определенному
  самым последним заявлением DEF SEG.
  POKE записывает значения байтового размера по  указанному  адресу  и
  является  низкоуровневым уходом из нормального использования памяти в Тур-
  бо-Бейсике. POKE не выполняет проверку ошибок, поэтому при неправильном при-
  менении этой команды не трудно  разрушать DOS и иливашу прграмму.
         См. также PEEK
         ---------
   Пример DIM Массив % (5) разместить массив из 6 целых
         ------  DEF SEG = VARSEG (Массив %(0) )
                 возбудить массив используя POKE
                 FOK I% = 0 TO 11
                 POKE I%, &HFF
                 NEXT I%
     отобразить содержимое массива, используя PEEK
                FOR I% = 0 TO 11
                 PRINT HEX$ (PEEK (I%) )
                 NEXT I%
                 END


         
        
         Функция POS
         ------------
  Функция POS возвращает горизонтальное положение курсора  (номер  ко-
  лонки)
         Синтаксис  y = POS (x)
         ----------
  Замечания  x - это пустой числовой аттрибут. Возвращаемое POS значе-
  ние лежит в диапазоне от 1 до 80 и представляет собой горизонтальное  (но-
  мер  колонки) положение курсора. Для получения положения курсора по верти-
  кали пользуйтесь функцией CSRLIN
  Для перемещения и сокрытия курсора пользуйтесь заявлением LOGATE.
         См. также    CSRLIN
         ----------   LOGATE
                      LPOS
    Пример  " пострить обработчик событий
         -------   ON TIMER (1) GOSUB отобразить часы
                   " включить отслеживание событий
                   TIMER ON
                   " пока не нажата клавиша
                   PRINT "Нажмите для останова любую клавишу"
                   WHILE NOT INSTAT
                   WEND
                   END
                   Отобразить часы
                   ----------------
                  Старое X%=POS
                  Старое Y%=CSRLIN
                  LOGATE 1,72,1
                  PRINT TIME$
                  LOGATE старое Y%, старое X%,1
                  RETURN
         
        
         Заявление PRESET
         -------------------
  Функция PRESET обеспечивает представление точки на графическом экра-
  не.
         Синтаксис PRESET (x,y) [,цвет]
         ----------
  Замечания (x,y) - это координаты точки, изображаемой на  графическом
  экране,  которые  могут задаваться как в абсолютной, так и в относительной
                                     -166 -
          
          
  форме. Цвет - это целое выражение, определяющее цвет, который должна иметь
  точка. На цветной атрибут распространяются  обычные  ограничения  режима.О
  законных  диапазонах аттрибута в каждом экранном режиме см. в описании за-
  явления PALETTE. Если цвет специфицируется, PEESET и дополняющая  его  ко-


  манда  PSET  работает  идентично.  Различие  между ними состоит в том, что
  PRESET имеет значение 0 цвета по умолчанию (цвет заднего фона), тогда  как
  умолчанием для PSET является максимально возможное значение аттрибута того
  режима,  в  котором вы находитесь. Другими словами без цветовых аргументов
  PSET включает пикселы, а PRESET их выключает.
         См. также PSET
         ----------
 Пример    "включить графический режим среднего разрешения
         --------   SCREEN1
                    FOR I% = 0 TO 359
                    FOR I% = 0 TO 199
                    DELAY 0.01
                    PSET (I% ,I%)
                    NEXT J%
                    NEXT I%
                    FOR I% = 0 TO 359
                    FOR J% = 0 TO 199
                    DELAY 0.01
                    PRESET (I%,J%)
                    NEXT J%
                    NEXT I%
                    END
        
        
         Заявление PRINT
         ----------------
         Функция PRINT посылает данные на экран
         -------
         Синтаксис PRINT [список выражений ] [;]
         ---------
  Замечания Список выражений - это ряд числовых и/или строчных выраже-
  ний, разделяемые точками с запятой, пробелами или  запятыми.  Если  список
  выражений  не оканчивается точкой с запятой, Турбо-Бейсик после информации
  списка выражений выводит возврат каретки. Если список выражений  опускает-
  ся, PRINT  выводит только возврат каретки.
  PRINT  использует пунктуацию, разделяющую элементы списка выражений,
  для определения того, как осуществлять размещение на экране.
    Зоны экранного вывода
  Для быстрого и аккуратного вывода Турбо-Бейсик подразделяет экран на
  "зоны экранного вывода" (принт-зоны) по 14 колонок  каждая.  Использование
  запятой  между элементами списка выражений вызывает экранный вывод каждого
  из них с начала следующей зоны. Точкк с запятой или пробел между элемента-
  ми вызывает вывод каждого последующего элемента непосредственно за  преды-


  дущим вне зависимости от принт-зон.
  Если заявление PRINT оканчивается запятой, точкой с запятой или фун-
  кциями  SPC  либоTAB, следующее заявление PRINT будет осуществлять вывод в
  ту-же строку. Иначе следующее заявление PRINT начинает вывод с самой левой
  колонки следующей строки. За числовым значением всегда следует пробел. По-
  ложительным числам также предшествует пробел; отрицательным  числам  пред-
  шествует знак минус.
  Заявление PRINT можно представлять аббревиатурно, как знак вопроса
  (  набора  признака сомнения, появление которого относится ко временам ин-
  терпретаторов времен оно):
          ?" Алло "
   означает то-же самое, что PRINT "Алло"
         См. также   LPRINT
         ----------- LPRINT USING
                     PRINT USING
                     SPC
                     TAB
                                     -167 -
          
          
        
         Пример   М=2
 -------- PRINT "Строки и числа - это "М" возможности того,";
   "запятые в качестве разделителей дают размещение  данных  в
       14-колонных принт-зонах
                 A=1
                 B=2
                 C=3
                 PRINT A,B,C, "текст"
  "  пробелами  и  точками  с запятыми в качестве разделителей
        обеспечивается вывод данных потоком
                 PRINT A;B;C; "текст"
                 END
        
        
         Заявление PRINTA и PRINT USING
         --------------------------------
 Функция PRINT и PRINT USING  записывают форматную информацию в файл
         ---------------------------
  Синтаксис PRINT# файланом, [ USING форматная строка;] список выраже-
   ний [;]
  Замечания Файланом - это значение под которым был открыт файл.  Фор-
  матная  строка-  это опциональная последовательность форматизующих литер (
  описанная в заявлении PRINT USING). Список выражений -  это  ряд  числовых
  и/или  строчных выражений , подлежащих выводу в файл.


  PRINT#  посылает  данные  в файл точно так, как PRINT посылает их на
  экран. Поэтому если вы не проявете специальную  заботу,  можно  бесполезно
  потерять  массу дискового пространства на пробелы, в которых нет необходи-
  мости, либо, что еще хуже, установить поля так тесно друг к другу, что  не
  сможете разобрать их по отдельности, когда позднее будет осуществляться их
  обработка заявлением INPUT#.
         PRINT#1  1,2,3
         посылает
         1 --------- 2-------- 3
  в файл #1. Вследствии существования 14-колонной принт-зоны между ли-
  терами в файл посылаются избыточные пробелы. С другой стороны,
         PRINT#1 1;2;3
  посылает  в файл 1 - 2 - 3 и вы не можете считывать отдельные число-
  вые значения из это записи, посколько для INPUT# требуются в качестве раз-
  делителей запятые. Самым верным способом разделения полей являются помеще-
  ние между ними запятых; например PRINT#1, 1","2","3 обеспечивает запись  в
  файл  1,2,3  в  виде пакета, в котором теряется наименьшее пространство, и
  который легко читается  заявлением INPUT#.
  Заявлением WRITE# поля разделяются запятыми автоматически.
         Пример  SUB делать файл
  ------- INPUT# открывает последовательный файл для вывода
    " с использованием WRITE# он записывается строками различно-
      го типа данных.
    " назначить файловую переменную #1
                OPEN "INPUT#.DTA" FOR OUTPUT AS #1
    "определить несколько переменных и возбудить их
           Строчная переменная $="Я вернусь"
                Целая % = 1000
                Плавающая точка. = 30000.1234
     " записать строку текста в последовательный файл
        WRITEN1, строчная переменная $, цела%, плавающая точка.
                 CLOSE 1    " закрыть файловую переменную
                 END SUB   " конец процедуры делать файл
                 SUB  читать файл
 Зта процедура открывает последовательный  файл  для  ввода.С


  использованием INPUT из файла читаются строки различного типа данных.
                 "назначить файловую переменную #1
                 OPEN INPUT#.DTA" FOR INPUT AS #1
                                     -168 -
          
          
   Строчная переменная $ =" " определить несколько переменных и
                 возбудить их
                Целое % = 0
                Плавающая точка = 0
    " читать строку текста из последовательного файла
    INPUT# 1, строчная переменная $, целая %, плавающая точка.
    PRINT строчная переменная $,целая%, плавающая точка.
                CLOSE#1  "закрыть файловую переменную
                END SUB  "конец процедуры читать файл
                CALL делать файл
                СALL читать файл
                END
        
         Заявление PRINT USING
         ----------------------
 Функция PRINT USING посылает на экран форматную информацию
         -------------------
 Синтаксис PRINT USING форматная строка; список выражений [;]
         ---------------------
 Замечания     Форматная строка - это строчная константа или переменная
 ----------- которой описывается как образуется формат информации, со
  держащейся в списке выражений. Список выражений - это строчная или числовая
  информация,  подлежащая  выводу  на экран, разделяемая запятыми, пробелами
  или точками с запятыми. PRINT USING игнорирует пунктуацию в списке выраже-
  ний.
                   Форматизация строчных полей .
               
  Чтобы вывести на экран первые n литер строки: если форматная  строка
  состоит из обратных косых черт (\), заключающих в себе 0 или более пробелов,
  то  Турбо-Бейсик выводит на экран столько литер строки вывода, сколько оп-
  ределяет длину форматной строки ( включая обратные косые черты). Например,
  если форматная строка имеет вид "\" (нет пробелов,  длина=2),  то  выводятся
  две литеры; для "\--\" (два пробела, длина =4) выводится четыре литеры.


         a$ = "кошки и собаки"
         PRINT USING '\ --\"; a$; PRINT USING "\ \";a$
         Форматная строка "!" вызывает вывод заявлением
         PRINT USING  точно по одной литере в строке вывода:
         a$ = "кошки и собаки"
         PRINT USING "!";a$
  Чтобы распечатать всю строку в качестве форматной строки используйте
  амперсанд (&)
         a$ = "кошки и собаки"
         PRINT USING "&'; a$
        
         Форматизация чисел
        
  Знаками  номера  (#)  в форматной строке представляются цифры числа.
  Затем, для указания форматообразования, такого как число  цифр  справа  от
  десятичной  точки,  соответствующим образом размещаются десятичные точки и
  другие специальные литеры ( например, знаки доллара) Например:
         PRINT USING "##.##"; 3.14159, .01032
         PRINT USING "+##.##; 12.0101, -6.2
    (включается знак перед числом)
         PRINT USING "##.##-";12.0101, -6.2
    (включается знак минус после числа, если оно отрицательно)
         PRINT USING "$$##.##"; 12.0101
    (выводится знак доллара вместе с числом)
         PRINT USING "**##.##"; 12.0101
    (заполняются передние пределы звездочками)
         PRINT USING "**$##.##"; 12.0101
    (комбинация двух выше упомянутых)
         PRINT USING "#.#### ^^^^ "; 34567.12
    (4 знака вставки означают использование научной натации)
                                     -169 -
          
          
         PRINT USING "-###.##"; 12.1010
  (подчеркивание, предшествующее заранее определяемой  формообразующей
  литеры,  вызывает  дословный вывод литеры, а не ее использование для целей
  форматообразования)
  Если значение слишком велико для вывода на экран в специфицированном
  формате, впереди вывода проставляется знак процента(%):
         PRINT USING "#.#;27.4
        
         
         Заявление PSET


         ---------------
  Функция PSET обеспечивает построение точки на графическом экране.
         ------------
         Синтаксис PSET (x,y) [,цвет]
         --------------
  Замечания (x,y) -это координаты точки, появляющейся  на  графическом
  экране,  которые можно заявлять в абсолютной и относительной форме. Цвет -
  это целое выражение, которым определяется цвет точки.  Для  атрибута  цвет
  применимы  нормальные режимные ограничения.При средней разрешающей способ-
  ности приемлемы цветовые значения от 0 до 3; при высокой разрешающей  спо-
  собности возможны цветовые значения только 0 и 1.
  Если  цвет  специфицируется, PSET и дополняющее его заявление PRESET
  работают идентично. Различие между ними состоит в том,  что  PRESET  имеет
  цветовое  значение  по умолчанию 0 ( цвет заднего фона), тогда как PSET по
  умолчанию дает максимально допустимое значение этого аттрибута (т.е.  3  в
  режиме  средней  разрешающей  способности и 1 в высокой). Другими словами,
  без цветовых аттрибутов PSET включает пикселы, а PRESET их выключает.
         См. также  POINT
         ---------- PRESET
        
  Пример " включить графический режим средней разрешающей способности
         -------   SCREEN 1
                   FOR I% = 0 ТО 359
                   FOR J% = 0 ТО 199
                   DELAY 0,01
                   PSET (I%,J%)
                   NEXT J%
                   NEXT I%
                   FOR I% = 0 ТО 359
                   FOR J% = 0 ТО 199
                   DELAY 0.01
                   PRESET (I%,J%)
                   NEXT J%
                   NEXT I%
                   END
        
        
         Заявление PUT
         --------------
  Функция PUT записывает одну запись в произвольный файл.
         -----------
         Синтаксис PUT [#] файланом [, записи номер]
         -----------
  Замечания Файланом - это значение, специфицируемое при обработке фай
  ла заявлением OPEN. Записи номер - числовое выражение, описывающее подлежа-


  щую выяснению в файл запись, которое может находиться в диапазоне от 1  до
  16777216.
  PUT представляет собой дополнение заявления GET и обеспечивает поме-
  щение в файл произвольного доступа одной записи. Запись номер является оп-
  циональным  аттрибутом. Если он опускается, Турбо-Бейсик использует значе-
  ние, использовавшееся в последнем заявлении PUt или GET, добавляя 1.
        
    Пример   "открыть файл произвольного доступа
             OPEN "GET.DTA" AS#1 LEN=18
    "сделать по два определения поля для каждого элемента поля
                                     -170 -
          
          
   FIELD #1, 2AS Целое$, 4AS  Длинное  Целое  $,4AS  Единичная
   точность $, 8AS Двойная точность $
                  FIELD#1,2AS A$, 4AS B$, 4AS C$, 8AS D$
                  Макс. целое % = 32767
    FOR I% = 1 ТО 5 " записать несколько данных в файл
   "перед записыванием в файл данные преобразовать и назначить
    в  буфер
           LSET Целое $ = MKI$ (I%)
           LSET Длинное Целое $ = MKI$(I%=CLNG (макс целое %))
           LSET Единичная точность$=MKS$ (CSNG(I%*CSNG(максцелое %)))
           LSET Двойная точность$ = MKD$(максцелое% ^ I%)
           PUT#1,I%
           NEXT I%
           FOR I% = ! ТО 5 читать данные из файла
           GET #1,I%  отобразить их на экране
           PRINT CVI (A$),CVL(B$), CVS(C$), CVD(D$)
           NEXT I%
           CLOSE#1 закрыть файл
           END
        
         Заявление PUT (графика)
         -----------------------
  Функция  PUT обеспечивает отображение на графическом экране содержи-
  мого числового массива.
         Синтаксис  PUT(x,y), массив [,опция]
         ----------
  Замечания ( x,y ) - это координаты верхнего левого уровня угла  пря-
  моугольника,  в  который будет передаваться массив; они могут специфициро-
  ваться либо в абсолютной, либо в относительной форме . Массив - это число-
  вой массив, который содержит графические данные для размещения на экране.


  Опция - это одно из резервированных слов, перечисляемых ниже, с  по-
  мощью  которых  осуществляется  управление тем, как содержащаяся в массиве
  информация будет прилагаться к уже имеющейся на экране:
  ----------------------------------------------------------------------
   Опции PUT              Действие
  ----------------------------------------------------------------------
   PSET    Карта точной копии образа в массиве
   PRESET  Карта копии заполнения образа в массштабе
   XOR     Выполнение операции XOR между образом в массиве и экраном
   OR      Выполнение операции OR между образом в массиве и на экране
   AND     Выполнение операции AND между образом в массиве и на экране
  ----------------------------------------------------------------------
        
  Опция PSET вызывает помещение данных массива на экран  точно  в  том
  виде,  в котором они первоначально заложены заявлением GET вне зависимости
  от того, что есть в данный момент на экране. PRESET картографирует на  эк-
  ране образ дополнения. Например, если в каком-то пикселе оригинальные дан-
  ные  имели  аттрибут 3, копирование через PUT на экране с атрибутом PRESET
  будет давать для этого пиксела аттрибут 0 и наоборот. Точно также аттрибут
  1 будет преобразовываться в аттрибут 2 и наоборот.
  Опции AND,OR,XOR обеспечивают выполнение логических  операций  между
  каждым  пикселом  в  регионе назначения до PUT и данными в буферном масси-
  ве.Когда перемещающиеся обьекты пересекают сложные задние  фоны,  особенно
  полезна операция XOR; фактически это делается по умолчанию. Первый PUT XOR
  обеспечивает  вычерчивание  обьекта  на экране. Второе применение в том же
  месте восстанавливает фон в его предыдущее состояние.
  Базисная стратегия всех оживлений, основанная на GET и PUT состоит в
  следующем:
         DRAW обьект в прямоугольной зоне
         GET обьект в массив
         DO
         ERASE обьект с его старого места
         PUT обьект на новое место


         LOOP
                                     -171 -
          
          
  Пример:  " разместить буфер для хранения образа графики
                  DIM Буфер % (143)
      "включить графический режим среднего разрешения
                   SCREEN 1
              CIRCLE (16,16),8,2     "чертить окружность
              GET(0,0) - (31,31), Буфер%    "получить окружность
            "копировать все это на экран
                   FOR I% = 0 TO 9
                   PUT (I%*32,100), Буфер %
                   NEXT I%
                   END
         
         Функция PUT$
         -------------
         Функция PUT$ записывает строку в файл двоичного режима.
         ------------
  Замечания PUT$ записывает содержимое строчного выражения в  файл,оп-
  ределяемый как файланом на позиции, определяемый заявлением SEEK для этого
  файла. Файл должен быть открыт в режиме BINARY.
         См. также  GET
         ---------- OPEN
                    SEEK
        
         Пример   OPEN "BASIC.DOC" FOR BINARY AS1
         -------  PUT$ #1,BASIC - компиляторы- это 99% работы
                  PUT$#1, "в поте лица и 1% вдохновения"
                  CLOSE#1
                  END
        
        
         Заявление RANDOMIZE
         --------------------
         Функция RANDOMIZE задает генератор случайных чисел.
         ------------------
         Синтаксис RANDOMIZE [числовое выражение]
         --------------------
  Замечания Если числовое выражение опускается, исполнение программы о
  станавливается  и  пользователь  получает  подсказкус на значение задания при
  встрече с заявлением RANDOMIZE.
         RANDOMIZE NUMBER SEED?
  (Зададите начальное число генерирования случайных чисел)
              О случайных числах.
        
  Без повторного задания значения. возвращаемые функцией RND,  случай-
  ными не являются вовсе; для данного начального значения функция RND всегда
  возвращает  одну и ту-же последовательность значений.


Без повторного зада-
  ния моделирование игры в кости будет воспроизводиться одним и тем-же  спо-
  собом при каждом новом прогоне программы.
  Удобный  способ  обеспечивать  уникальным каждый прогон (полагая,что
  ваша программа не прогоняется каждый день в одно и то-же время) состоит  в
  использовании функции TIMER для обеспечения значения задания:
         RANDOMIZE TIMER
  Другой прием состоит в использовании заявления микротаймера с тонкой
  разрешающей способностью (MTIMER) для задания времени задержки, ассоцииру-
  емой  с  нажатием  на клавишу при запуске программы. Ею далее используется
  это значение для задания генератора случайных чисел:
         MTIMER
   PRINT "Чтобы начать нажмите любую клавишу ..."
         WHILE NOT INSTAT: WEND
         RANDOMIZE MTIMER
        
         См. также RND
         -------------
         Пример  возбудить микротаймер
         ------   MTIMER
                                     -172 -
          
          
                  PRINT "Чтобы начать нажмите любую клавишу...."
                  WHILE NOT INSTAT
                  WEND
                  ПУСТО $ = 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 и их считыванием,


  получается из-за нарушения синхронности и попыток загрузить строку в  чис-
  ловую  переменную.  Если  это  случается,  выдается  синтаксическая ошибка
  (ошибка 2 периода прогона).
  Вы не получите информацию об ошибке, если ваша программа ошибается в
  другом направлении, т.е. когда она загружает числовую константу в строчную
  переменную.
  Если вы пытаетесь обрабатывать заявлением READ  большее  число  раз,
  чем  имеет  констант  ваша программа, Турбо-Бейсик выдает ошибку 4 периода
  прогона , Вне Данных.
  Заявление RESTORE позволяет вам повторно считывать константы из пер-
  вого или любого специфицированного заявления DATA.
         См.также   RESTORE
         ---------
  Пример " эта программа демонстрирует заявление READ
  ------- SUB обработки результата (студента имя $,  студента средний %)
                 LOCAL Итог%, Значение%,,I%
                 Итог % = 0
                 READ студента имя $
                 FOR I% = 1 TO 10
                 READ значение %
                 Итог % = Итог% + значение %
                 NEXT I%
                 Студента средний % = итог%\10
                 END SUB
                 FOR студент% = 1 TO 3
                 CALL обработка результата (С имя $,средний %)
                 PRINT USING "& средний равен ###";Cимя $,средний %
                 NEXT студент%
                 END
                      
                       
        Функция и заявление RFG
       ------------------------
                      
  Функция REG устанавливает значение в буфере регистров или возвращает
  его.
  Синтаксис   Функция y=REG(регистр), регистр y=REG регистр, значение
  ----------
        
  Замечания  Регистр  указывает процессорный регистр в соответствии со
  ---------  следующей таблицей
        
                                     -173 -
          
          
  ---------------------------------------------------------------------
          Номер                   Регистр


  ---------------------------------------------------------------------
            0                     Флаги
            1                        Ax
            2                        Bx
            3                        Cx
            4                        Dx
            5                        SI
            6                        DI
            7                        BP
            8                        DS
            9                        ES
  --------------------------------------------------------------------
        
  Если регистр вне диапазона 0-9, генерируется ошибка 5 периода прого-
  на,вызов незаконной функции.
  Значение - это числовое переменное или числовое выражение в диапазо-
  не от 0 до 65535. REG как функция возвращает значение  выбранного  эле-
  мента в "буфере регистров". REG как заявление вызывает загрузку указан-
  ным целым значением выбранного элемента буфера регистров.
  Используйте REG для подачи информации в подпрограммы на языке ассем-
  блера  и для получения ее из этих подпрограмм. Буфер регистров загружа-
  ется в процессорные регистры непосредственно перед вызовом ABSOLUTE или
  INTERRUPT. Они возвращаются на хранение сразу-же после прогона. В любое
  данное время буфер содержит состояние процессорных регистров в том  ви-
  де,  в каком они находились по завершению самой последней внешней подп-
  рограммы.
        
         Пример   DEFINT a-z
         -------  DIM a (100)
                  DIM заполнение подпрограммы (10)
                  Заполнение подпрограммы (0)=&HF2FC
                  Заполнение подпрограммы (1) = &HCBAA
                  REG 1,-1
                  REG3,101^2
                  REG9,VARSEG [a(0)]
                  REG6, VARPTR [a(0)]
                  DEF SEG = VARSEG (заполнение подпрограммв (0) )
                  PRINT a(1)
                  WHILE NOT INSTAT:WEND
          Заполнение адр. = VARPTK (заполнения подпрограмма(0))


                  CALL ABSOLUTE заполнение адр "(REG)
                  PRINT a (1)
                  END
        
        
         Заявление REM
         --------------
         Функция REM отделяет замечания (комментарии)программиста
         -----------
         Синтаксис REM комментарий
         ----------
  Замечания Комментарий - это любая последовательность литер. В  отли-
  чие от трактовки комментариев в Турбо-Бейсике, REM замечания появляются
  только  в  исходной версии программы и следовательно ни коим образом не
  воздействуют на исполнение.
  Примечание: Комментарий может позволяться в  строке,  не  содержащий
  других заявлений, но он должен быть последней составляющей этой строки.
  Например, следующая строка не работает:
     REM теперь сложить числа:а = b+c
  Посколько  компилятор  не может отделить где кончается комментарий и
  начинается заявление.Правильно так:
         a = b+c: REM теперь складываются числа.....
        
                                     -174 -
          
          
  Альтернативным разделителем комментария является одинарный знак  ка-
  вычки("). Когда используется единичная кавычка, для отделения замечаний
  от других заявлений в той-же строке  двоеточие не требуется.
  Не  пользуйтесь  единичной кавычкой для отделения комментариев после
  заявления DATE. Вместо этого используйте :REM.
  Комментарии компилятором игнорируются и не занимают места в  обьект-
  ных программах, поэтому щедро ими пользуйтесь.
   Пример  REM эта программа демонстрирует заявление REM
         ------- PRINT "эта программа демонстрирует заявление REM
                 REM "END"
                 END
           DATA 1,2,3,Я вернусь! :REM комментарий
  Заметьте,что единичная кавычка не трактуется как комментари,й.
        
        
        
         Заявление RESET.----------------
    Функция RESET закрывает и убирает все дисковые файлы.
         --------------
         Синтаксис RESET


         ---------------
   Замечания RESET - это то-же, что заявление CLOSE без аргументов.
        
        
         Заявление RESTORE
         ------------------
  Функция RESTORE позволяет вновь считывать константы заявлений DATA.
         ---------------
         Синтаксис  RESTORE [метка]
         ------------------
  Замечания Метка - опциональный аргумент, указывающий заявление DATA,
  к  которому будет иметь доступ следующее заявление READ. RESTORE вы-
  зывает повторную установку Турбо-Бейсиком его счетчика  заявлений  DATA
  таким  образом,  что  когда встречается следующее заявление READ, вновь
  используйте первый элемент первого (или указанного) заявления.
        
         См. также  READ
         ----------
  Пример  "считать несколько данных и восстановить указатель данных
         ------  READ A$,B$
                 RESTORE
                 "считать еще несколько данных
                 READ C$,D$
                 "отобразить данные
                 PRINT A$,B$,C$,D$
      "поставит указатель данных на первые данные после метки
                 RESTORE еще  данные
           " считать и отобразить данные
                 READ A$,B$
                 PRINT A$,B$
                 END
           "определить несколько данных
                  DATA  Кошка  Собака
                 Еще данные:
                 DATA Обезьяна  Гну
        
        
         Заявление RESUME
         -----------------
  Функция RESUME  повторно запускает исполнение после обработки ошибки.
         ---------------
         Синтаксис  RESUME [(0INEXTIметка)]
         ------------------
  Замечания RESUME и RESUME O вызывает возобновление исполнения с  за-
  явления, которое вызвало ошибку. RESUME NEXT вызывает возобновление ис-
                                     -175 -
          
          
  полнения с заявления, непосредственно следующего за вызвавшим ошибку.
  RESUME метка вызывает возобновление исполнения с кода идентифицируе-


  мого меткой.
  Если  заявление  RESUME  встречается  когда программа не находится в
  подпрограмме отслеживания ошибок, это приводит к  возникновению  ошибки
  20 периода прогона. Возобновление без ошибки.
  Примечание: Заявление ERL, RESUME,RESUME NEXT вызывает генерирование
  компилятором 4-байтового указателя для каждого заявления программы. По-
  этому  программисты,  интересующиеся  размером  генерируемого или кода,
  должны принимать это во внимание. Использование заявления RESUME [стро-
  ка#] генерирует инструкцию перехода. ERRL обычно используется  для  от-
  ладки, поэтому сказанное имеет к нему, вероятно, малое отношение.
        
         Пример  " установить ловушку ошибок
        -------    ON ERROR GOTO Ошибкиобработчик
          "это заявление вызывает ошибку периода прогона
                    I# = LOG (-1)
                    PRINT "Была отслежена ошибка...."
                    END
                    Ошибкиобработчик
                   -----------------
                   PRINT "Ошибка" FRR "при" ERL
                   RESUME NEXT
         
         Заявление RETURN
         -----------------
        
  Функция  RETURN  обемпечивает  возврат  из подпрограммы в вызывающую
  программу.
         Синтаксис RETURN [метка]
         ----------
  Замечания Метка идентифицирует строку, к которой вы опционально  мо-
  жете направить поток программных кодов.
  RETURN  прекращает выполнение подпрограммы и передает управление за-
  явлению, следующему непосредственно за вызовом GOSUB.
  Опциональная метка конструируется для облегчения возврата  из  подп-
  рограмм  отслеживания  и  обработки ошибок. RETURN метка отбрасывает адрес
  верхней части стека и выполняет заявление GOTO к заявлению, идентифицируе-
  мому меткой. В некоторых версиях Бейсика эта операция  выполняется  с  по-
  мощью POP и GOTO.
  При  RETURN  без GOSUB, ему предшествующего, будут вызываться неожи-
  данные и трудно прослеживаемые ошибки.


Мы настоятельно рекомендуем для вы-
  явления подобных ошибок включать тестирование стека  в  вытягиваемых  вниз
  меню опций.
         См. также  GOSUB
         ---------- GOTO
        
         Пример См. пример в описании GOSUB
         -------
        
        
         Функция RIGHT$
         --------------
  Функция RIGHT$ возвращает n самых правых литер целевой строки.
         --------------
         Синтаксис s$=RIGHT$ (строчное выражение,n)
         ----------
  Замечания  n-  это  целое  выражение,  специфицирующее число литер в
  строчном выражении, подлежащих возврату, оно может находиться в  диапазоне
  от 0 до 32767.
  RIGHT$  возвращает  указанное число литер из ее строчного аргумента,
  начиная с правой стороны и работая влево. Если n  больше  длины  строчного
  выражения, возвращается все строчное выражение.Если n равно 0, RIGHT$ воз-
  вращает ноль-строку.
                                     -176 -
          
          
         См. также LEFT$
         --------- MID$
         Пример RIGHT$ ("ДЖОН ДЖОНС",5)
        
         Заявление RMDIR
         ---------------
   ФУНКЦИЯ RMDIR снимает справочник (подобно DOS команде RMDIR)
         --------------
         Синтаксис  RMDIR проход
         ---------
  Замечания  Проход  - это строка стандартного описания прохода. RMDIR
  снимает  справочник  указываемый  проходом.  Зто  заявление   эквивалентно
  DOS-команде  RMDIR  (за  исключением того, что оно не может представляться
  аббревиатурно). К нему применимы те-же ограничения, а именно то, что проход
  специфицирует законный, пустой справочник.
  Если справочник не пуст, возникает ошибка 75 периода прогона, ошибка
  доступа к прходу/файлу.
         Пример   "настроить обработчик ошибок
         ------    ON ERROR GOTO ошибкообработчик
                   INPUT "Вводимое имя снимаемого справочника:",D$
                   RMDIR D$  " снимается справочник
                   END


                   Ошибкообработчик:
                   PRINT "Ошибка" ERR "при" ERADR
                   RESUME NEXT
        
        
         Функция RND
         ------------
         Функция RND возвращает случайное число
         --------
         Синтаксис y=RND (числовое выражение)
        
  Замечания RND возвращает случайное значение двойной точности между 0
  и 1 . Числа, генерируемые RND, в действительности случайными не  являются,
  а  представляют собой результат применения алгоритма псевдослучайного пре-
  образования начального или задающего значения. При одном и том-же задающем
  значении RND алгоритм Турбо-Бейсика всегда дает одну и ту-же цепочку "слу-
  чайных" чисел.
  Качество работы RND зависит от опционального числового значения, ко-
  торое вы обеспечиваете в качестве аргумента. При отсутствии аргумента  или
  с  положительным  аргументом RND генерирует следующее число последователь-
  ности, базирующееся на ее начальном задающем значении.
  При аргументе равном 0 функция RND  повторит  число,  генерированное
  последним.
  Отрицательный аргумент вызывает перезадание генератора случайных чи-
  сел  таким  образом, что последующее использование RND без аргумента или с
  положительным аргументом дает новую последовательность значений.
  Как правило используйте при запуске вашей программы RANDOMIZE  TIMER
  для  получения  новой последовательности значений с помощью заявления RND.
  Не применяются нулевой или отрицательные аргументы, если вы не преследуюте
  цель наблюдать за особыми эффектами, вызываемыми  этими  значениями  чтобы
  получить  случайные целые между 1 и n, включая границы, применяйте следую-
  щий прием: случайное число % =INT (RND=n)+1
         Еще лучше создавать его как функцию:
         DEF FN Случцел%(x%)=INT (RND*x%)+1
        
         См. также RANDOMIZE
         ---------
         Пример  FOR I=1 TO 10 STEP 1.34
        -------- PRINT USING "###.##^^^^";RND(x!)


                 NEXT I!
                 END
        
               
                                     -177 -
          
          
         Заявление RSET
        ----------------
  Функция RSET перемещает строчные данные в буфер произвольного файла.
  Синтаксис RSET переменная поля=строчное выражение
         ---------
  Замечания RSET и LSET перемещают строчные данные в  "переменные  по-
  ля", которые уже определены в предыдущем заявлении FIELD , как принадлежа-
  щие буферу произвольного файла. Если длина строчного выражения меньше раз-
  меров  переменной поля, специфицируемой в заявлении FIELD, это поле вырав-
  нивается заявлением RSET вправо посредством заполнения пробелами. Это  оз-
  начает,  что  пробелы вставляются перед первой литерой строчного выражения
  таким образом, чтопосле операции RSET параметр LEN (переменной поля) оста-
  ется равным ширине, определенной в соответствуюшем заявлении FIELD.
  LSET осуществляет левое выравнивание заполнением пробелами  (пробелы
  добавляются после последней литеры строчного выражения)
  RSET  можно также использовать для образования формата вывода на эк-
  ран или печатающее устройство:
         a$ = пробел$(20)
         RSET a$ = "Выравнять вправо"
         PRINT a$
         См. также LSET
         ---------
  Пример OPEN "RSET.DTA"AS#1 LEN = 18
  ------- " определить имена и размеры полей файла
  FIELD 1,2 AS Заполнить целым $, 4AS заполнить длинным $, 4 AS
  заполнить еденичным$, 8 AS заполнить двойным $
  "назначить несколько значений полям и поместить запись в  файл
  произвольного доступа
               FOR счетчик %=1 TO 5
               RSET заполнить целым $=MKI$(счетчик %)
               RSET заполнить длинным $=MKL$(счетчик%^2)
               RSET заполнить еденичным$=MKS$(счетчик%^2.1)
               RSET заполнить двойным$=MKD$(счетчик%^4.4)
               PUT1, счетчик %
               NEXT счетчика %
               CLOSE 1  "закрыть файл


               END
        
        
         Заявление RUN
         --------------
         Функция RUN повторно запускает программу
         ------------
         Синтаксис RUN[файласпец]
         ----------
  Замечания RUN без аргумента вызывает повторный запуск самой програм-
  мы  на  Турюо-Бейсике. Все числовые переменные (включая элементы массивов)
  повторно устанавливаются в 0, а строчное переменное - в нуль-строку.
  Если включается файласпец, этот аргумент представляет собой строчное
  выражение для имени файла. TBC или EXE (получаемый с помощью цепочки  меню
  опций или при усиановке компилирования EXE). Если файласпец не имеет удли-
  нения,  предполагается  TBC; если удлинение есть, оно и используется. Если
  прогон или установление цепочки на EXE-файле, вы должны явно  добавлять  к
  имени вашего файла удлинение EXE.
        
         Пример  "компилировать программу в файл, вызываемой
         -------  MASTER.EXE
                  "ввести имя SLAVE в ответ
                  " на эту подсказку
                  INPUT "введите имя программы для RUN:",N$
                  RUN N$ "прогнать указанную программу
                  END
  "компилировать  эту программу в SLAVE.TBC с компилированием
   на вход цепочки из меню опций
                  PRINT "Теперь мы в программе SLAVE"
                                     -178 -
          
          
                  END
        
         Функция SCREEN
         ----------------
        
  Функция SCREEN возвращает код ASCII литеры специфицированного ряда и
  колонки
         Синтаксис y=SCREEN (ряд,колонка[,опция])
         -----------
  Замечания Ряд и колонка - это целые выражения, которые могут быть  в
  диапазоне от 1 до 25 и от 1 до 80,соответственно.
  Функция  SCREEN  представляет  собой копию функции POINT графических
  режимов для режимов текстовых. Она возвращает информацию о литере в специ-
  фицированных ряду и колонке; например, SCREEN1,1 возвращает код ASCII  ли-


  теры в ряду 1, колонке 1.
  Если опциональный параметр опция устанавливается в 1, это будет воз-
  врат функций SCREEN хранимого атрибута(по адресу ряд, колонка), а не литеры.
         Пример  LOGATE 10,10
         ------  PRINT "ASCII"
  "Кодом  ASCII для "A" является 65; аттрибутом отображения по
  умолчанию (белое на черном) является 7
                 PRINT SCREEN (10,10),SCREEN(10,10.1)
                 END
        
        
         Заявление SCREEN
         -----------------
  Функция SCREEN устанавливает режим экранного отображения .
         ---------------
         Синтаксис SCREEN[режим][,[цветафлаг]][,[а-страница]][,[в-страница]]
         -----------------
  Замечания Режим-это целое выражение в диапазоне от 0 до 10,  имеющее
  следующее децствие:
  ---------------------------------------------------------------------
    Режим                               Действие
  ---------------------------------------------------------------------
      0       Установить текстовый режим без измерения ширины
      1     Устанавливается графический режим со средней разрешающей спо-
         собностью; изменения ширины на 40
      2   Устанавливается графический режим с высокой разрешающей способн
        остью; изменение ширины на 80
      7   Устанавливается режим со средней разрешающей способностью на EGA
        допускающий 16 цветов и 640x200 пиксел
      8   Устанавливается режим с высокой разрешающей способностью на EGA,
        допускающий 16 цветов и 640x200 пиксел
          
      9   Устанавливается улучшенный режим высокой разрешающей способности
         на  EGA c улучшенным дисплеем; допускается 4 или 16 цветов ( в
         зависимости от памяти EGA) из палитры в 64 цвета и 640x350 пиксел.
         
     10 Устанавливается режим высокой разрешающей способности  на  EGA  с
  моно хромным монитором; разрешается 4 аттрибута и 640x350 пиксел
        
 ----------------------------------------------------------------------


        
  Цветафлаг  управляет тем, будет ли цветовая информация подаваться на
  композитные мониторы,которые подключаются к  композитному  устройству  ви-
  део-выхода цветного /геометрического адаптера. В текстовом режиме значени-
  ем  FALSE(0)  цвет  выключается. В графических режимах средней разрешающей
  способности цвет значением FALSE  включается.
  а-страница-это целое выражение в диапазоне  от  0  до  7буправляющее
  страницей  текста,подлежащей  записи,  когда PRINT и другие команды вывода
  осуществляют запись на экран. Этот аргумент является  законным  только  на
  цветном/графическом адаптере (CGA) и улучшенном графическом адаптере (EGA)
  и для экранных режимов 0,7,8,9,10. См. раздел о графике в главе 4.
                                     -179 -
          
          
  в-страница  обеспечивает выбор того, какой из возможных экранов(0-7)
  действительно отображается.Этот аргумент является законным только на цвет-
  ных/графических адаптерах и улучшенных графических адаптерах для  экранных
  режимов 0,7,8,9 и 10.
  Исполнением заявления SCREEN вызывается начало действия нового режи-
  ма и экран подлежит очистке. Цвет фона устанавливается белым, а цвета зад-
  него фона и бордюров-черным.
  Если  режим  специфицируемый в заявлении SCRREN тот-же, что текущий,
  не происходит ничего.
  Если режим является текстовым и включаются только аргументы  а-стра-
  ницы и в-страницы, то отображение настраивается на страницу и регулируется
  соответственно требуемому.
        
  Пример "включить графику со средним разрешением при запрещенном цвете
        ------  SCREEN 1,0
                 CIRCLE (160,100)50,2
                 WHILE NOT INSTAT:WEND
                 A$=INKEY$
  "включить  текстовый режим с запрещенным цветом и активную и
  видимую страницы установить на страницу 0
                 SCREEN0,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$, выполняемое на
  файле файланом будет реализовываться на глубине файла равной позиция  бай-
  тов. Файл файланом должен быть открыт в режиме BINARY.
  Для  возврата  текущей  SEEK  - позиции в двоичном файле используйте
  функцию LOG.
        
         См. также   LOG
         ---------
      Пример  SUB создать файл
    ------  "SEEK открывает и в него записывается 256 литер
                 LOGAL I%
                 "открыть файл для двоичного ввода/вывода
                 OPEN"SEEK.DTA" FOR BINARY AS#1
                 "записать в него несколько данных
                 FOR I% = 1TO 256
                 PUT$1, CHR$(I%-1)
                 NEXT I%
                 END SUB  "конец процедуры создать файл
                 DEF FN читать это $ (начало%,размер%)
                 "эта функция читает указанные данные из файла
                 LOGAL Врем Стр$,Лит$,I%
                 "искать правильную позицию в файле
                 SEEK 1, Начало %
                                     -180 -
          
          
                 I%=1
                 ВремСтр $="  "
      "читать указанные данные -- не читать после конца файла
                 WHILE (NOT EDF(1) AND (I%<=Размер %)
                 GET$1, I%, Лит$


                 Врем Стр $ = Врем Стр$ + Лит $
                 INCR I%
                 WEND
                 "назначить результат функции
                 FN читать это$ = Врем Стр $
                 END DEF  " конец функции  читать это $
                 "создать файл данных
                 CALL создать файл
                 "получить пользовательский ввод
                 PRINT " введите начальную точку [1....256] и сколько"
                 PRINT "байтов данных (256-начальная точка) вы желаете
                 INPUT "считать из файла:Нач%,РЕЗ%
                 Читать данные
                 PRINT FТ читать это $ (Нач%,Рез %)
                 END
        
        
         Заявление SELECT
         ------------------
  Функция SELECT возвращает заявление общецелевого  тестирования.
         ---------------
         Синтаксис SELECT CASE выражение
         --------------
                   CASE заявление списков тестов
                   [CASE заявление списков тестов]
                   [CASE ELSE заявление]
                   END SELECT
        
  Замечания список тестов - это один или более тестов, разделяемых за-
  пятыми, которые подлежат выполнению над выражением. Выражение  может  быть
  строчным или числовым, но все списки тестов в блоке SELECT должны быть од-
  ного и того-же типа.
  Тесты,  которые  могут  быть  выполнены посредством включения статьи
  CASE охватывают тестирование равенства, неравенства,  больше  чем,  меньше
  чем  и диапазона ("от до"). Примерами тестов, включенных в статью CASE яв-
  ляются:
            CASE <b  "относительный
            CASE 14  "равенство (предполагается "=")
            CASE b TO 99  "диапазон
            CASE 14,b  " два теста равенства
            CASE b TO 99,14  "комбинации (неявное ИЛИ)
           
  В одной и той-же статье CASE имеет место неявная операция логическо-
  го ИЛИ между множеством тестов.


Если обнаруживается, сто один или несколь-
  ко тестов оказываются TRUE (истинными), исполняются все заявления,  вплоть
  до  следующей CASE-статьи. После последнего заявления управление переходит
  к тому заявлению, которое следует за END SELECT.
  Заявление SELECT является мощным инструментом срвнения переменной  с
  рядом  возможных  значений и последующего продолжения в соответствии с его
  результатом.
  Используя это заявление можно создать более четкую  исходящую  прог-
  рамму, чем вы получаете с применением множества IF.
         См. также  END SELECT
         ---------  EXIT CASE
         
         Пример   INPUT "Вводное число", x
         ------   SELECT CASE x
                  CASE < 10
                  PRINT "малое число"
                  CASE < 1000
                                     -181 -
          
          
                  PRINT " среднее число"
                  CASE 1111,2222,3333,4444
                  PRINT "колибрующее число"
                  CASE ELSE
                  PRINT "только другое большое число"
                  END SELECT
        
        
         Функция SGN
         ------------
     Функция SGN возвращает знак числового выражения.
         -----------
    Синтаксис  y=SGN (числовое выражение)
         --------
  Замечания  Если  числовое выражение положительно, SGN возвращает +1.
  Если числовое выражение равно 0, SGN возвращает 0. Если числовое выражение
  отрицательно, SGN возвращает -1.
  В сочетании с заявлением ON/GOTO и ON/GOSUB функция SGN может давать
  тринаправленное ветвление, подобное имеющемуся в ФОРТРАНЕ:
         ON SGN (баланс) + 2 GOTO Вкрасном, РазрывЧетного, Вденьгах
        
         См. также  ON/GOSUB
         ---------  ON/GOTO
        
         Пример  " установить x и y в 0
         ------   x=0;y=0
     "пользователь определяет x и y
                  INPUT "Пожалуйста, вводное значение для x";x


                  INPUT "Пожалуйста, вводное значение для y", y
     " с помощью ON по значению знака  x+y  осуществить  переход
   GOSUB к подходящей подпрограмме
                  ON SGN (x+y) +2 GOSUB Минус, Ноль, Плюс
                   END
                  Минус:
                 PRINT "Вход по минусу" : RETURN
                  Ноль:
                 PRINT "Вход по нулю" :RETURN
                  Плюс
                 PRINT "Вход по плюсу" : RETURN
        
        
         Заявление SHARED
         -----------------
  Функция SHARED заявляет разделяемые (глобальные) переменные в проце-
  дуре или функции.
         Синтаксис SHARED список переменных.
         -----------------
  Замечания  SHARED определяет переменные своего разделяемого запятыми
  списка переменных как глобальные для программы в целом, а не  ограничиваю-
  щиеся сферой определения процедуры или функции. Это обеспечивает процедуре
  или функции доступ к переменным без необходимости подавать их как парамет-
  ры.Заявление SHARED может появляться только в определениях процедур и фун-
  кций и должно предшествовать любым исполнительным заявлениям соответствую-
  щего определения. Чтобы заявить массив как разделяемую переменную, принад-
  лежащую  процедуре или функции, включайте его идентификатор и пустой набор
  скобок в список переменных - вам нет необходимости образмеривать его вновь.
  Незаявленные переменные в определениях функций по умолчанию являются
  разделяемым аттрибутом , но вы не должны рассчитывать на переменность это-
  го умолчания в будущих версиях компилятора. Вы должны  явно  заявлять  все
  переменные  которые  появляются в функции или процедуре, соответственно их
  классу. (LOCAL,STATIC,SHARED)
         См. также LOCAL
         --------- STATIC
        
                                     -182 -
          
          
         Пример DIM массив $ (5)
         ------ DEF FN Пусто$
                SHARED массив $


                FN Пусто $ = массив (0)
               END DEF 'конец функции FN Пусто $
               Массив $ (0) = Это работает для меня
               PRINT FN Пусто $
               END
        
        
         Заявление SHELL
         ----------------
        
         Функция SHELL загружает и исполняет порождаемую обработку
         --------------
         Синтаксис SHELL [строка параметров ]
         ---------------
        
  Замечания Строка параметров - это строчное  выражение которое содержит
  ------------ имя программы. COM,.EXE или BAT (порождаемая обработка),
  подлежащей прогону, и опционально параметры, которые  вы  можете  пожелать
  подать в порождаемую обработку. Если строка параметров опускается, никакая
  программа не загружается. Вместо этого появляется DOS-подсказка и вы може-
  те  вводить стандартные DOS-команды; например DIR (справочник), COPY(копи-
  ровать). Вы можете возвращаться в вашу программу набирая в DOS - подсказке
  EXIT(уход).
  Если строка параметров включается,  то  исполняется  специфицируемая
  программа. Когда она завершается, ваша программа продолжается со следующе-
  го заявления.
         См. также ENVIRON
         --------- ENVIRON $
                   SHELL в DOS - руководстве.
        
  Пример  PRINT  "Теперь  мы  будем  использовать заявление SHELL ТУР-
  БО-Бейсика"
        PRINT "для выдачи DOS-команды DIR/W"
        PRINT "с целью просмотреть какие файлы имеются на вашем при-
    воде"
                 DELAY 3    'ждать 3 секунды
  Использовать SHELL с целью покинуть  Турбо-Бейсик  и  выдать
  DIR с опцией /W
                 SHELL "DIR/W
                 Выводить в нижней части дисплея
                 LOGATE 21'1
                 PRINT "Теперь вернемся в Турбо-Бейсик"
                 END
        
        
         Функция SIN
         -------------
        
         Функция SIN возвращает тригонометрический синус.


         -----------
         Синтаксис y=SIN (числовое выражение)
         ---------
  Замечания Числовое выражение - это угол, специфицируемый в радианах.
  Чтобы  преобразовать радианы в углы, умножайте на 57.296. Чтобы преобразо-
  вать углы в радианы, делите на 0,17453. (см. пояснения к радианам в описа-
  нии заявления ATN).
  SIN возвращает результат двойной точности.
        
         См. также ATN
         --------------
  Пример  Выбрать значение для в $ для вывода в образчике
        -------  в $ ="Турбо-Бейсик из Борленда"
                                     -183 -
          
          
                 "найти центр
                 центр - (79 - LEN ($) /2
   SIN (тэта) возвращает повторяющуюся  равномерную  последова-
   тельность в диапазоне от -1 до 1 таким образом, что таб значение находится
   всегда между - центр и + центр
                 таб значение = центр*SIN (тэта)
                 PRINT TAB (центр + таб значение +1) в $
                 тэта = тэта+ 1
                 WEND
                 END
        
        
         Заявление SOUND
         ---------------
  Функция  SOUND  генерирует  тон специфицированой частоты и продолжи-
  тельности.
         Синтаксис SOUND частоты, продолжительности.
         ----------
  Замечания Частота - это целое выражение, представляющее желаемую вы-
  соту тона в диапазоне от 37 до 32767 герц. Продолжительность - это выраже-
  ние с плавающей точкой, которое указывает длительность тона, измеряемой  в
  тиканьях  часов. Тиканья часов происходят с интенсивностью 18,2 раза в се-
  кунду так что значение продолжительности 36 соответствует примерно  2  се-
  кундам.  Продолжительность может находиться в диапазоне от 0,0015 до 65535
  (один час).
  Заявление SOUND не задерживает исполнение программы. Когда оно  вст-
  речается,  начинается  требуемый тон, а исполнение продолжается нормально.
  Если встречается другое заявление SOUND и параметр продолжительносьи в но-


  вом заявлении равен 0, то предыдущее SOUND выключается. Перед  исполнением
  нового заявления SOUND  Турбо-Бейсик ожидает завершения исполнения первого.
  SOUND при создании специальных эффектов лучше музыки.
  Ограничения Следует заметить, что заявление SOUND , будет вновь воз-
  буждать микротаймер MTEMER.
         См. также PLAY
         ---------
  Пример   настроить музыкальный буфер на 800 байтов
         -------  $ SOUND 100  ' 8 байтов на ноту
  использовать SOUND для создания звуковых эффектов имитирую-
  щих изменеия в коробке передач мотоцикла
                  'первая передача
                  FOR i=150 TO 175
                  SOUND i,2
                  NEXTI
                 'вторая передача
                  FOR j=125 TO 152
                  SOUND j,1.5
                  NEXTj
                  'третья передача
                  FOR k=100 TO 127
                  SOUND k,1.25
                  NEXTk
        
        
         Функция SPACE $
         ----------------
        
  Функция SPACE $ возвращает строку, состоящую из одних пробелов.
         --------------
         Синтаксис а$=SPACE $ (счетчик)
         --------------
  Замечания  Счетчик  -  это целое выражение в диапазоне от 0 до 32767
  которым специфицируется сколько пробелов  должна возвращать эта функция.
  SPACE $ - это одно из  многих  средств  форматообразования  текстов,
  имеющихся в Турбо-Бейсике.
                                     -184 -
          
          
         См. также LSET
         --------- PRINT USING
                   RSET
                   SPC
                   STRING $
                  TAB
                
         Пример  резервировать 46 пробелов для aS
        ------   aS = SPACE (46)
                 сделать строку длиной 46 литер
                 в $ = 'это строка длиной 46 литер'
                 сделать то-же, что a$, используя с$="
                 'вывести длины a$,в$, c$
                 PRINT LEN (a$),LEN (в$),len (c$)


                 PRINT
                 PRINT "как вы можете видеть ........
                 PRINT "я могу дать а$ то-же значение
                END

 
                                     Устройства
         COM  (n)       Управляет  прерываниями,  связанные  с   событиями
                        последовательного порта
         INP            Читает из порта ввода/вывода.
         IOCTL/IOCTL$   Работают с драйвером устройства.
         OPEN COM       Открывает и конфигурирует коммуникационный порт.
         OUT            Пишет в порт ввода/вывода.
 
                                        DOS
         CHDIR          Изменяет текущий каталог (команда CD DOS).
         KILL           Удаляет файл (подобно команде DEL DOS).
         MKDIR          Создает каталог (подобно команде MKDIR DOS)
         RMDIR          Удаляет каталог (подобно команде RMDIR DOS)
         SHELL          Загружает и выполняет порожденный  процесс  (только
                        для версии 3.0 DOS).
         SYSTEM         Завершает программу.
 
                                  Обработка_ошибок
         ERADR          Возвращает адрес самой последней ошибки.
         ERRDEV/ERRDEV$ Возвращает информацию драйвера устройства.
         ERL/ERR        Возвращает номер строки и код последней ошибки.
         ERROR          Имитирует ошибку выполнения.
 
                                       Файлы
         BLOADS         Загружает файл ВSAVED в память.
         BSAVE          Сохраняет на диске  содержимое  памяти  в  заданном
                        диапазоне адресов.
         CLOSE          Закрывает файл или устройство.
         EOF            Возвращает состояние конца файла.
         FIELD          Определяет  переменные  поля  в  буфере   файла   с
                        произвольным доступом.
         FILES          Выводит содержимое каталога (подобно команде DIR DOS)
         GET(файлы)     Читает запись из файла с произвольным доступом.


         GET(графика)   Считывает часть экрана или весь экран в массив.
         LINE  INPUT#   Считывает  строку  из  последовательного  файла  в
                        символьную переменную, игнорируя разделители.
         LOC            Возвращает текущую позицию в файле.
         LOF            Возвращает длину файла.
         LSET           Пересылает символьные данные в буфер файла.
         NAME           Переименовывает файл (подобно функции RЕN DOS).
         OPEN           Готовит файл или устройство к записи или чтению.
         PRINT#,        Записывает в файл сформатированную информацию.
         PRINT# USING
         PUT            Записывает запись в файл с произвольным доступом.
         PUT$           Записывает строку в файл в двоичном режиме.
         RESET          Закрывает и сбрасывает все дисковые файлы.
         RSET           Пересылает  символьные  данные  в  буфер  файла   с
                        произвольным доступом.
         SEEK           Устанавливает позицию в  двоичном  файле  для  GET$
                        и РUT$.
         WRITE#         Выводит данные в последовательный файл.
 
                             Управление_ходом_программы
         CALL           Вызывает процедуру, подпрограмму.
         CALL ABSOLUTE  Вызывает процедуру на языке ассемблер.
         CALL INTERUPT  Вызывает системное рперывание.
         DEF FN/END DEF Определяет функцию.
         DO/LOOP        Строит цикл с проверкой вначале и/или в конце
         END            Завершает выполнение программы или определяет конец
                        структурного блока.
 
 
                                         1

         EXIT           Преждевременный выход из структуры.
         FOR/NEXT       Задает  цикл  с  автоматически  возрастающим   (или
                        уменьшающимся параметром цикла).
         GOSUB          Вызывает подпрограмму.
         GOTO           Направляет    ход    программы     на     оператор,


                        идентифицируемый меткой.
         IF             Проверяет условие и изменяет  ход  программы,  если
                        условие выполнено.
         IF BLOCK       Создает последовательность операторов IF.
         INLINE         Объявляет встроенный машинный код.
         RESUME         Перезапускает выполнение программы после  обработки
                        ошибки.
         RETURN         Возвращает управление из подпрограммы в  вызывающую
                        программу.
         SELECT         Формирует оператор проверки общего назначения.
         STOP           Останавливает программу.
         SUB/END SUB    Определяет процедуру (подпрограмму).
         WHILE/WEND     Строит цикл с проверкой в начале.
 
 
                                      Графика
         CIRCLE         Рисует круг или часть круга.
         DRAW           Изображает контур на графическом экране.
         LINE           Рисует прямую линию или прямоугольник.
         PAINT          Закрашивает замкнутую область на графическом экране
                        выбранным цветом.
         PEEK           Возвращает  байт,  записанный  в  заданную   ячейку
                        памяти.
         PEN (функция)  Читает состояние светового пера.
         PEN (оператор) Управляет проверкой событий, связанных со  световым
                        пером.
         PMAP           Переводит физические координаты в  пользовательские
                        и наоборот.
         POINT          Определяет цвет пиксела или информацию LPR.
         POKE           Записывает бай по заданному адресу.
         PRESET         Изображает точку на графическом экране.
         PSET           Изображает точку на графическом экране.
         PUT            Изображает   на   графическом   экране   содержимое
                        числового массива.
         VIEW           Определяет  активную  область  (после  изображения)
                        графического окна.


         WINDOW         Определяет графическую систему координат.
 
                                 Аппаратные_события
         ON  COM  (n)   Создает  подпрограмму  обработки  прерывания   по
                        событиям последовательного порта.
         ON ERROR       Определяет процедуру обработки  ошибки  и  включает
                        прерывания по ошибке.
         ON /GOSUB      Вызывает одну из нескольких возможных подпрограмм в
                        соответствии со значением числового выражения.
         ON /GOTO       Направляет ход программы по  одному  из  нескольких
                        возможных  адресов  в   зависимости   от   значения
                        числового выражения.
         ON   KEY(n)    Объявляет   подпрограмму   обработки   прерывания,
                        получающую управление при нажатии заданной клавиши.
         ON PEN         Объявляет   подпрограмму   обработки   прерывания,
                        получающую управление, если  начинается  работа  со
                        световым переом.
         ON PLAY        Объявляет   подпрограмму   обработки   прерывания,
                        получающую управление, если  буфер  фоновой  музыки
 
 
                                         2

                        содержит меньше заданного количества нот.
         ON STRIG       Объявляет   подпрограмму   обработки   прерывания,
                        связанных с кнопками джостика.
         ON TIMER       Объявляет   подпрограмму   обработки   прерывания,
                        которая получает управление каждые n секунд.
         STICK          Возвращает информацию о позиции джостика.
         STRIG (функция)     Возвращает состояние кнопок джостика.
         STRIG  (оператор)   Управляет  проверкой  событий,  связанных   с
                             кнопками джостика.
         WAIT           Ждет заданных условий состояния кнопок клавиатуры.
 
                                        Ввод


         INKEY$         Читает с клавиатуры.
         INPUT          Запрашивает у пользователя значения, которые  будут
                        присвоены одной или нескольким переменным.
         INPUT#         Присваивает переменным данные из последовательного
                        файла.
         INPUT$         Читает заданное число символов с клавиатуры или  из
                        файла.
         INSTAT         Возвращает состояние клавиатуры.
         LINE  INPUT    Считывает  строку  с   клавиатуры   в   символьную
                        переменную, игнорируя разделители.
         READ           Загружает переменне константами из оператора DATA.
         RESTORE        Позволяет повторно читать константы оператора DATA.
 
                               Управление_клавиатурой
         KEY            Устанавливает    и     воспроизводит     назначения
                        функциональных клавиш и определяет значения
                        прерываний по клавишам.
         KEY (n)        Включает и  выключает  прерывание  по  определенной
                        клавише.
 
                                 Управление_памятью
         CLEAR          Очищает память переменных.
         DEF SEG        Определяет  сегмент  данных,  который  используется
                        операторами BLOAD, BSAVE, CALL ABSOLUTE, PEEK, POKE
         END MEM        Возвращает адрес конца физической памяти.
         ERASE          Удаляет  динамические  массивы   и   возвращает   в
                        исходное состояние.
         FRE            Возвращает  количество  свободной  памяти,  которая
                        доступна вашей программе.
         МEМSET         Объявляет вурхнюю границу памяти.
         POKE           Записывает бай по заданному адресу.
         VARPTR         Возвращает адрес переменной.
         VARPTR$        Возвращает  указатель   переменной   в   символьном
                        формате.
         VARSEG         Возвращает адрес сегмента переменной.


 
                                   Меткаоператоры
         $COM           Размещает принимающий буфер последоватльного порта.
         $DYNAMIC       Объявляет динамическими массивы, размещение которых
                        выполняется по умолчанию.
         $EVENT         Управляет генерацией кода прерывания по событиям.
         $IF/$ELSE/$ENDIF  Определяет  части  исходной  программы,  которые
                        компилируются или  пропускаются  в  зависимости  от
                        условий.
         $INCLUDE       Включает текстовый файл.
         $SEGMENT       Объявляет новй сегмент кода.
         $SOUND         Объявляет емкость буфера фоновой музыки.
         $STACK         Задает размер стека для прогона программы.
 
 
                                         3

         $STATIC        Объявляет статическими массивы, выполнение  которых
                        выполняется по умолчанию.
 
                                 Смешанные_команды
         DATA           Объявляет константы для оператора READ.
         DELAY          Устанавливает задержку.
         REG            Устанавливает или возвращает значение в регистровом
                        буфере.
         SWAP           Обменивает значение двух переменных.
 
                                 Числовые_операции
         ABS            Возвращает абсолютное значение.
         ASC            Возвращает ASCII код первого символа строки.
         ATN            Возвращает значение тригонометрического арктангенса
         CDBL           Преобразует число в формат с двойной точностью.
         CEIL           Возвращает наименьшее  целое,  большее  или  равное
                        аргументу.
         CINT           Преобразует в целое.
         CLNG           Преобразует в длиное целое.
         COS            Возвращает значение тригонометрического косинуса.
         CSGN           Преобразует числовое выражение в эквивалентное  ему
                        число.


         CVI/CVL/CVS/CVD/  Преобразует символьные  данные,  прочитанные  из
                        файла с произвольным доступом в числовую форму.
         CVMD/CVMS        Преобразует  символьные  переменные,  прочитанные
                        из файла с произвольным доступом в формате Microsoft
                        числовую форму.
         DECR           Уменьшает значение переменной.
 
         DEFINT/DELNG/  Объявляет    тип    идентификаторов     переменных,
         DEFSNG/DEFDBL/  установленный по умолчанию.
         DEFSTR
 
         EXP            Возвращает e в степени Х.
         EXP2           Возвращает 2 в степени Х.
         EXP10          Возвращает 10 в степени Х.
         FIX            Округляет до целого.
         INCR           Увеличивает значение переменной.
         INT            Преобразует числовое выражение в целое.
         LOG            Возвращает значение натурального (по  основанию  e)
                        логарифма.
         LOG2           Возвращает значение логарифма по  основанию  2.
         LOG10          Возвращает значение логарифма по  основанию  10.
         MKI$/MKL$/MKS$/  Преобразует числовые  данные  в (для
         MKD$              файлов с произвольным доступом).
 
         MKMD$/MKMS$     Преобразует числовые  данные  в формате Microsoft (для
                        файлов с произвольным доступом).
         RANDOMIZE      Устанавливает  начальное  значение  для  генератора
                        случайных чисел.
         RND            Возвращает случайное число.
         SGN            Возвращает знак числового выражения.
         SIN            Возвращает значение тригонометрического синуса.
         SQRT           Возвращает значение квадратного корня.
         TAN            Возвращает значение тригонометрического тангенса.
 
                                       Вывод
         PRINT          Посылает данные на экран.
         PRINT USING    Посылает на экран сформатированную информацию.


         SPC            Пропускает n пробелов  (используется  в  опреаторах
 
 
                                         4

                        PRINT)
         TAB            Устанавливает табуляцию на заданную позицию  вывода
                        n (используется  в  опреаторах PRINT).
         WRITE          Посылает на экран данные, разделенные запятыми.
 
                               Печатающее_устройство
         LPOS           Возвращает позицию  курсора  в  буфере  печатающего
                        устройства.
         LPRINT/        Посылает данные на принтер.
         LPRINT USING (LPT1:)
 
                                       Экран
         CLS            Очищает экран
         COLOR          Задает цвет
         COLOR          Задает цвет для графических операций
         CSR LIN        Возвращает  текущую  вертикальную  позицию  курсора
                        (номер строки)
         LOCATE         Размещает курсор и/или определяет размер  указателя
                        (курсора)
         POS            Возвращает текущую горизонтальную  позицию  курсора
                        (номер колонки )
         SCREEN(файлы)  Возвращает ASCII-код символа в  заданной  строке  и
                        колонке
         SCREEN(графика)  Устанавливает режим изображения на экране
         WIDTH          Устанавливает логическую длину строки
 
                                        Звук
         PLAY(функция)  Возвращает число нот в буфере фоновой музыки
         PLAY(оператор) Возвращает число нот в буфере фоновой музыки
         SOUND          Генерирует тон заданной частоты и длительности
 
                                Символьные_операции
         BIN$           Возвращает двоичный символьный эквивалент числа
         CHR$           Преобразует ASCII код в односимвольную строку
         GET$           Читает  в  символьном  формате  данные  из   файла,
                        открытого в режиме BINARY.
         HEX$           Преобразует число  в  шестнадцатиричный  символьный


                        эквивалент
         INSTR          Просматривает строки в поисках заданного шаблона
         LCASE$         Возвращает строку, состоящую  только  из  прописных
                        букв
         LEFT$          Возвращает n самых левых символов в строке
         LEN            Возвращает длину строки
         MID$           Возвращает символьную строку
         MID$           Замещает символьную строку
         OCT$           Возвращает строку, представляющую значение числа  в
                        восьмеричном (по основанию 8) виде
         RIGHT$         Возвращает n самых правых символов строки
         SPACE$         Возвращает строку, состоящую из n пробелов
         STR$           Возвращает символьный эквивалент числа
         STRING$        Возвращает строку, состоящую из многократных  копий
                        заданного символа
         UCASE$         Возвращает строку,  состоящую  только  из  строчных
                        букв
         VAL            Возвращает числовой эквивалент строки
 
 
 
 
 
 
 
                                         5

 
                                    ПРИЛОЖЕНИЕ_I
 
                         Подготовка_к_работе_ТУРБО_БЕЙСИКА
 
              Программа TBINST.COM позволяет
         * задавать маршрут для файлов, выполняющих настройку, и файлов  со
           вспомогательной информацией (help)
         * приспосабливать клавиатуру
         * модифицировать режимы редактора, устанавливаемые по умолчанию
         * настраивать режим работы с экраном по умолчанию.
              Если вы хотите хранить файлы со  вспомогательной  информацией
         (TBHELP.TBH)  и/или  файлы  настройки  (TBCONFIG.TB)  не   в   том
         каталоге, где хранится ТВ.ЕХЕ, а в другом, вам  потребуется  режим
         работы с каталогами ТУРБО БЕЙСИКА для задания маршрута поиска этих
         файлов.
              Если вы не знакомы с редактором ТУРБО БЕЙСИКА или прикованы к
         другому  редактору,  вы   можете   использовать   режим   "Команды


         редактора" для того, чтобы  переконфигурировать  (приспособить)  к
         вашим привычкам клавиши редактора.
              Для   установки   по   умолчанию   нескольких   характеристик
         редактора:  режима   вставки   или   перезаписи,   табуляторов   и
         автоматического  структурирования,-  можно  использовать   вариант
         "Default" (по умолчанию) в режиме редактирования.
              И, наконец, можно устанавливать режим экрана, в котором будет
         работать ТУРБО БЕЙСИК.
 
                                   Запуск_TBINST
               Для запуска программы введите на подсказку DOS TBINST. Первое
         меню позволит выбрать: каталог ТУРБО  БЕЙСИК,  команды  редактора,
         режимы редактирования  по  умолчанию,  режимы  работы  экрана  или
         выход.  Вы  можете  либо  нажать   высвеченную   заглавную   букву
         выбранного режима, либо использовать стрелки вверх  или  вниз  для
         перемещения указателя к выбранному пункту и нажать Enter. Нажмите,
         например, D для того,  чтобы  изменить  режимы  редактирования  по
         умолчанию.  Нажатие  клавиши  Esc  вернет  вас  в  основное   меню
         программы TBINST.
 
                           Режим_"Каталог_ТУРБО_БЕЙСИКА
              Режим "Каталог ТУРБО БЕЙСИКА"  полезен,  в  действительности,
         только пользователям, работающим  с  жестким  диском.  Этот  режим
         используется для задания маршрута к конфигурационным файлам с тем,
         чтобы они были  доступны  всякий  раз  при  вызове  ТУРБО  БЕЙСИКА
         (предполагается, что вы задали оператор маршрута для ТБ).
              После выбора режима "Каталог ТБ",  появляется  подсказака  на
         ввод полного маршрута к каталогу ТУРБО (т.е. каталога,  в  котором
         хранятся ваши конфигурационные файлы; см. в гл.3  описание  режима
         Directories в спускающемся меню SETUP). Например, если  вы  хотите


         хранитьконфигурационные файлы в подкаталоге с продуктами Борланда,
         вы должны в качестве маршрута указать:
         C:\BORLAND\BASIC
               После ввода маршрута нажмите Enter для приема ответа,  и  вам
         будет вновь предложено меню. При выходе из программы  вы  получите
         запрос о том, сохранить ли сделанные изменения. Если  вы  захотите
         сохранить маршрут, о

 
                                         9

                        ПРИЛОЖЕНИЕ А
    ---------------------------------------------------------
                Обсуждение работы с числами
                ---------------------------
        В процессе выполнения программы ТУРБО БЕЙСИКу
    приходится иногда преобразовывать внутренние
    представления числовых значений из одной формы в другую;
    например, число с одинарной точностью в целое:
        А=14.1
        В%=А
    В таких случаях ТУРБО БЕЙСИК решает, как быть с  излишней
    или  недостающей  точностью.  Следующие правила управляют
    преобразованием числовых типов:
         В  операторе  присваивания  число  запоминается   с
    точностью, соответствующей  точности переменной,  которой
    оно  присваивается  (т.е.  переменной,  стоящей  слева от
    знака равенства). Например:
        В=1.1
        А%=В
        PRINT A%
       Во всех  случаях, когда значение с большей  точностью
    присваивается переменной с меньшей точностью, выполняется
    округление. Например:
        A%=1.5
        B=123.456789
        PRINT A%,B
    Обратите,  однако,  внимание,  что  ТУРБО  БЕЙСИК  особым
    образом рассматривает любые числа, содержащие 5 в дробной
    части:  такое  число  всегда  округляется  до  ближайшего
    четного  числа.  Например,   0.5  округлится  в   сторону
    меньшего  -  до  0,  9.005  также  округлится  в  сторону
    меньшего - до 9.000.
       Если число с меньшей точностью преобразуется в  число
    с  большей  точностью,  результирующее  значение не может


    быть  более  точным,  чем  исходное.  После присваивания,
    приведенного  в  следующем  примере,  значимыми  являются
    только 6 цифр переменной B#:
        A=123.456
        B#=A
        PRINT B#
         При  вычислении  числового  выражения  ТУРБО БЕЙСИК
    преобразует  все  операнды  выражения  в  соответствии  с
    наиболее точным из них. Например:
        A=1.1: B#=1.123456
        C=A*B#
        PRINT A*B#,C
    Обратите внимание, что для выражений, содержащих операнды
    и с одинарной, и сдвойной точностью, точность  результата
    будет одинарной.

                Файлы произвольного доступа,
                ----------------------------
           содержащие данные с плавающей запятой.
           --------------------------------------
        Поскольку     Интерпретатор     БЕЙСИК     использует
    нестандартный  формат  Microsoft  для  чисел  с плавающей
    запятой, в программах на ТУРБО БЕЙСИКе должны выполняться
    специальные преобразования для  чтения и записи  данных в
    файлы с произвольным доступом, созданные  Интерпретатором
    БЕЙСИКа. Функции MKMS$  и MKMD$ (make  Microsoft) создают
    числовые строки в формате Microsoft; CVMS и CVMD (convert
    Microsoft)  обрабатывают   числовые  строки   в   формате
    Microsoft и  возвращают числовые  данные в  формате ТУРБО
    БЕЙСИКа.
          Внутреннее представление четырех типов чисел.
          ---------------------------------------------
                       -----------------T-------------------¬
                       ¦    байт  0     ¦     байт  1       ¦
    ------------------T+----------------+-------------------+
    ¦Шестнадцатеричное¦     13h         ¦       02h         ¦
    +-----------------+-----------------+-------------------+
    ¦Двоичное         ¦   00010011      ¦     00000010      ¦
    L-----------------¦-----------------+--------------------
    Дополнительный код  в двоичной системе означеет,  что все
    биты меняют значения на противоположные  и  к  результату


    добавляется 1.
        Длинные целые  представляются   в   виде   32-битовых
    (4-байтовых) чисел  со знаками.  Отрицательные числа хра-
    нятся в дополнительном коде.  Наименее значимое слово за-
    писывается первым (по младшему адресу), а наименее значи-
    мый байт каждого слова располагается до более значимого.
    Например, десятичное   число   79033  равно  000134B9H  и
    записывается в виде последовательности байтов B9H 34H 01H
    и 00H:
                       -----------------T-------------------¬
                       ¦байт 0 I байт 1 ¦ байт 2 I  байт 3  ¦
    ------------------T+----------------+-------------------+
    ¦Шестнадцатеричное¦   B9   I  34    ¦  01    I   00     ¦
    +-----------------+-----------------+-------------------+
    ¦Двоичное         ¦10111001 00110100I 00000001 00000000 ¦
    L-----------------¦-----------------+--------------------
    А десятичное число -79033 равно дополнению к  00013469H -
    FFFECB47H и  хранится в виде последовательности байтов 47
    CB FE FF.
        Компьютеры и множество вещественных чисел.
        ------------------------------------------
        Множество вещественных чисел  включает  и  бесконечно
    большие и бесконечно малые числа.  В дополнение к минус и
    плюс бесконечности,  между любыми двумя точками на число-
    вой прямой  имеется бесконечное число точек (чисел). Так,
    например, между 17,1  и  17,11  находятся  точки  17,101;
    17,104; 17,1041 и т. д.
        Будучи конечными автоматами, компьютеры не могут точ-
    но представлять это трансцендентное множество чисел,  од-
    нако, они могут представлять  их  приближенные  значения.
    Компромисс между качеством аппроксимации (т. е. точности)
    с одной стороны,  и скоростью вычислений и потребностью в
    памяти, с другой,  привели к созданию двух наиболее попу-
    лярных способов представления множества вещественных  чи-
    сел: числа  с  одинарной точностью и числа с двойной точ-


    ностью.
        Обе эти  модели  отображают конечное,  но практически
    очень большое множество дискретных значений на значитель-
    ном отрезке вещественной числовой прямой.  Между смежными
    значениями на ней имеются промежутки. Если при вычислени-
    ии результат попадает в промежуток,  выполняется округле-
    ние до ближайшей представимой точки.
        Плотность представимых значений распределена неодина-
    ково вдоль    числовой    прямой.    Равное    количество
    представимых чисел находится между целыми степенями двой-
    ки. Например,  между 1 и 2 столько же представимых чисел,
    сколько и между 131072 и 262144.  Другими словами, проме-
    жутки между представимыми  значениями  становятся  больше
    при движении в любом направлении от нуля на числовой пря-
    мой. Наконец,  вы заберетесь так далеко от нуля,  что там
    не останется представимых точек.  Использование чисел вне
    представимых значений в любом направлении числовой прямой
    приводит к переполнению.
             Переполнение и потеря значимости
             --------------------------------
        Переполнение числа с плавающей точкой возникает в тех
    случаях, когда результат вычислений  больше максимального
    представимого положительного  значения  или меньше макси-
    мального отрицательного числа. В силу обширности диапазо-
    на значений,  допустимых  в  ТУРБО БЕЙСИКЕ,  переполнение
    числа с плавающей точкой является нетипичной ситуацией. В
    отличие от переполнения целого числа,  переполнение числа
    с плавающей точкой всегда регистрируется.
        Потеря значимости  числа с плавающей точкой возникает
    в случаях,  когда результат вычислений попадает в крошеч-
    ный интервал  между 0 и первым представимым отрицательным
    или положительным числом на одном из лучей числовой  пря-
    мой. Математические  подпрограммы ТУРБО БЕЙСИКА обрабаты-
    вают подобные ситуации присвоением 0 величине,  у которой
    произошла потеря   значимости,  и  продолжают  выполнение


    программы без вывода сообщения об ошибке.
          Числа с плавающей запятой одинарной точности
          --------------------------------------------
        Числа с одинарной точностью в ТУРБО БЕЙСИКЕ соответс-
    твуют коротким  вещественным значениям,  принятым в стан-
    дарте IEEE.  В этом формате число записывается в 4 байтах
    памяти с  точностью  от  6 до 7 десятичных знаков и может
    иметь значение в приближенном диапазоне:
        8,43*10**(-37)<=IXI<=3,37*10**38
        Числа с одинарной  точностью  состоят  из  23-битовой
    нормализованной мантиссы,  8-битового  показателя степени
    со смещением 7FH и знакового бита,  размещенных так,  как
    показано на  рисунке А-1.  (Смещение относится к разности
    между беззнаеовым целым,  записываемым в поле  показателя
    степени числа с плавающей точкой, и непосредственно пока-
    зателем степени, который это целое представляет.)
   

   
    ---------------------------------------------------------
    I                        Растущая значимость            I
    I                                                       I
    I Целое   ---------------------                         I
    I         I   I               I                         I
    I         I S I   величина    I    дополнение до двух   I
    I         I   I               I                         I
    I         ---------------------                         I
    I          15                 0                         I
    I                                                       I
    I                                                       I
    I Длинное -------------------------------               I
    I целое   I   I                         I               I
    I         I S I         величина        I дополнение    I
    I         I   I                         I до двух       I
    I         -------------------------------               I
    I          31                           0               I


    I                                                       I
    I                                                       I
    IОдинарное-------------------------------               I
    I вещест- I   Iсмещенный I              I               I
    I венное  I S IпоказательI  мантисса    I               I
    I         I   Iстепени   I              I               I
    I         -------------------------------               I
    I          31            23 I           0               I
    I                                                       I
    I                                                       I
    I Двойное --------------------------------------------  I
    I вещест- I   I  смещенный     I                     I  I
    I венное  I S I  показатель    I       мантисса      I  I
    I         I   I  степени       I                     I  I
    I         --------------------------------------------  I
    I          63                 52 I                   0  I
    I                                                       I
    I     Замечания                                         I
    I                                                       I
    I   S - знаковый бит (0 - положительное число, 1 - отри-I
    I       цательное)                                      I
    I   D - десятичная цифра (2 на байт)                    I
    I   X - биты, не имеющие значения: 80287 игнорирует их  I
    I       при загрузке, заносит нули при записи           I
    I   I - целый бит значимости, хранится во временных     I
    I       вещественных числах, всегда равен 1 в коротких  I
    I       и длинных целых                                 I
    I                                                       I
    I     Смещенный показатель степени                      I
    I     ( нормализованное значение )                      I
    I   Короткое вещественное: 127 (7FH)                    I
    I   Длинное  вещественное: 1023 (3FFH)                  I


    I   Временное вещественное: 16383 (3FFFH)               I
    I                                                       I
    I-------------------------------------------------------I
          Рисунок А-1. Форматы данных
         
        Числа с плавающей запятой с двойной точностью
        ---------------------------------------------
        Вещественные числа с двойной точностью, используемые в
    ТУРБО БЕЙСИКЕ, соответствуют  длинным  вещественным числам
    в стандарте IEEE. В этом формате число  записывается  в  8
    байтах  памяти  с  точностью от 15 до 16 десятичных цифр и
    может иметь значение в приближенном диапазоне:
        4,19*10**(-37)<=IXI<=1,67*10**308
        Значения  с  двойной  точностью состоят из 52-битовой
    нормализованной мантиссы, 11-битового показателя  степени
    со смещением 3FFH и знакового бита, размещенных как пока-
    зано на рисунке А-1.
        Далее приводится программа,демонстрирующая внутренний
    форматпредставления числа с одинарной  точностью  в ТУРБО
    БЕЙСИКЕ:
        а1=167.25
        address=VARPTR(a)
        FOR n=0 TO 3
          byteval=PEEK(address+n)
          PRINT HEX$(byteval)
        NEXT n
        Давайте расшифруем полученные четыре байтовых значения,
    представляющие число 167,25 с одинарной точностью. Сначала
    перезапишем так, что наиболее значимый байт будет следовать
    первым:
        43 27 40 00
        Теперь представим в двоичном виде:
                      -----------------------------------------
   шестнадцатеричное  I  4 I  3 I  2 I  7 I  4 I  0 I  0 I  0 I
                      -----------------------------------------
   двоичное           I0100I0011I0010I0111I0100I0000I0000I0000I
                      -----------------------------------------
        Выделим знаковый бит, показатель степени и мантиссу:
             --------------------------------------------------
   двоичное  I 0 I 10000110 I   01001110100000000000000       I


             --------------------------------------------------
        Вычтем смещение 7FH из показателя степени:
        86H-7FH=7   -  получим истинное  двоичное  значение
   показателя степени.
        Нормализованная мантисса имеет подразумеваемые 1 и дво-
   ичную точку с левого края, так что в действительности значение
   мантиссы равно:
        1 010 011 101 000 000 000 000 00
        Перемещение двоичной точки на семь знаков с учетом пока-
   зателя степени приводит к результату:
        10 100 111. 010 000 000 000 000 0=167725
                                                                  
                    ПРИЛОЖЕНИЕ  В
     ------------------------------------------------------------
    
              Прерывания по событиям
              ----------------------
       ТУРБО  БЕЙСИК поддерживает возможность фоновой обработки, из-
   вестной как прерывания при возникновении событий,  которые  могут
   одновременно  и упростить и ускорить отдельные операции. Прерыва-
   ние по событию означает, что проверку  различных  событий,  таких
   как  нажатие  определенной клавиши, выполняет сам ТУРБО БЕЙСИК, и
   нет необходимости писать операторы, чтобы  делать  это  самостоя-
   тельно. ТУРБО БЕЙСИК может выполнять такую проверку между каждыми
   двумя операторами вашей программы и гарантирует при этом наиболее
   быстрый  возможный  ответ. Когда событие наступает, автоматически
   вызывается подпрограмма, которую вы задали для обработки прерыва-
   ния.
       Проверяться могут следующие типы событий:
   - Клавишные: была ли нажата клавиша F10? Или пробел? Или  клавиша
   SHIFT- ALT-K? Можно определить прерывания для 20 различных клавиш
   одновременно.
   - Состояние таймера, работающего в режиме вычитания - управление
   передаётся подпрограмме обработки прерывания по истечении n секунд,
   например, для обновления экранного времени каждые 60 секунд.
   - Нажатие кнопки джостика.
   - Действия светового пера.
   - Состояние буфера фоновой музыки (проверка необходимости загрузки


   в буфер дополнительного количества нот).
       Вы  можете получить краткое описание событий, вызывающих и не
   вызывающих прерывание, просмотрев в главе 5 "Справочное руководс-
   тво по ТУРБО БЕЙСИКУ" данного пособия разделы на букву "О". Боль-
   шинство операторов "ON что-либо  GOSUB"  управляют  прерываниями,
   связанными с событиями.
       Нет  нужды специальным образом сообщать ТУРБО БЕЙСИКУ о необ-
   ходимости генерации кода обработки прерывания  по  событиям.  Его
   автоматически  генерирует  компилятор всякий раз, когда встречает
   любые инструкции, связанные с прерываниями.
       ПРИМЕР
     ------------------------------------------------------------
       Представьте программу ведения учета с дюжиной меню для выбора
   варианта  работы с большим количеством выводимых экранов. Как ав-
   тор столь сложной прикладной системы, вы можете пожелать  включе-
   ния  вспомогательных экранов, содержащих основную информацию о её
   использовании, такую, как например, описание  комбинаций  клавиш,
   необходимых  для  редактирования полей данных или преждевременной
   отмены выбранного пункта меню. Для  простоты  рассмотрим  систему
   вызова вспомогательной информации, не являющейся контексо-зависи-
   мой,  т.е.  независимо  от того, в каком месте программы в момент
   запроса вспомогательной информации находится  пользователь  выво-
   дится всегда один и тот же текст.
       Пусть F1 - клавиша вызова вспомогательной информации. Другими
   словами,  когда бы ни была нажата клавиша F1, независимо от теку-
   щего контекста на экран будет выведена  вспомогательная  информа-
   ция.
       Возможность прерывания при возникновении событий в ТУРБО БЕЙ-
   СИКЕ  позволяет  кодировать  "вывод вспомогательной информации" в
   одном месте программы, а затем вызывать его без лишних  усилий  в
   любом  ее  месте.  Если бы возможности обработки событий не было,
   приходилось бы проверять состояние клавиши F1 ( с помощью перехо-


   да GOSUB на вспомогательную подпрограмму) в каждом месте програм-
   мы, где пользователь может на некоторое время задержаться.
       Во-первых, поскольку дело касается клавишного прерывания (  а
   не  прерывания по джостику или световому перу), следует с помощью
   оператора ON KEY(n) определить подпрограмму, которая получит  уп-
   равление при нажатии клавиши F1:
          ON KEY(1) GOSUB DispHelpText
       В  этой  строке определяется, что когда прерывание по клавише
   включено, между каждыми двумя операторами  выполняется  проверка:
   была  ли  нажата  клавиша  F1. Если была, вызывается подпрограмма
   DispHelpText; если не была, выполняется следующий оператор.
       Подпрограмма DispHelpText есть ни что  иное,  как  последова-
   тельность операто ров PRINT. Поскольку выполнение прерванной прг-
   раммы  при  этом  не должно быть нарушено, подпрограмма сохраняет
   текущую позицию курсора, а затем после завершения вывода  на  эк-
   ран,  восстанавливает  её. Вспомогательная информация воспроизво-
   дится в четырех нижних строках экрана, где  по  соглашению  ничто
   больше не выводится.
       DispHelpText:
         oldcsrx=pos(0): oldcsry=CSRLIN
         LOCATE 22,1
         PRINT "Эта программа была выпущена в эксплуатацию вместе с"
         PRINT "замечательным дорогостоящим руководством, тщательно"
         PRINT "подготовленным профессиональными писателями. Оно   "
         PRINT "содержит больше информации, чем вам когда-либо     "
         PRINT "понадобится. Используйте его. Нажмите пробел, чтобы"
         PRINT "продолжить." dummy$
         LOCATE 22,1: PRINT SPACE$(320)
         LOCATE oldcsrx, oldcsry
       RETURN
       Теперь,  когда подпрограмма обработки прерывания (код, на ко-
   торый будет передано управление при нажатии клавиши F1)  объявле-
   на, включите обработку прерывания с помощью оператора KEY(n)
          KEY(10) ON
       После  выполнения  этого  оператора, ТУРБО БЕЙСИК переходит в


  режим проверки событий. Перед выполнением каждого следующего  опе-
  ратора, он производит быструю проверку того, была ли нажата клави-
  ша  F1. Если не была, выполняется следующий оператор. Если клавиша
  F1 была нажата, вызывается подпрограмма DispHelpText. После  возв-
  рата из неё с помощью оператора RETURN, управление передается сле-
  дующему оператору в прерванной последовательности.
       Когда возникает прерывание, связанное с натуплением заданного
  события  выполняется  неявный оператор "остановки прерываний" для
  того, чтобы избежать повторных вызовов подпрограммы обработки пре-
  рываний из нее самой (и переполнения таким образом стека).  Завер-
  шающий  подпрограмму оператор RETURN автоматически выполняет неяв-
  ный оператор "включения прерывания"Б если  только  в  подпрограмме
  явно  не содержится оператор "отключить прерывание". Вы можете за-
  менить слова PEN, PLAY, KEY, STRIG, TIMER и COM  словом  "прерыва-
  ние".
       Настройка прерываний при наступлении события.
       ---------------------------------------------
       Прерывание  при  наступлении  заданных событий - это мощное
  средство, но оно имеет цену. Поскольку между выполнением  каждых
  двух  операторов  вашей  программы производится проверка события
  (или событий), ее работа замедляется, что, в зависимости от кон-
  кретных приложений, может привести к недопустимо маленькой  ско-
  рости. Кроме того, компиллятор для программы, связанной с преры-
  ваниями  по  событиям,  генерирует более длинный код (1 дополни-
  тельный байт на каждый оператор), чем для программы, не  связан-
  ной с ними.
       Для  управления  генерацией  кода  проверки событий в ТУРБО
  БЕЙСИКЕ служит метаоператор $EVENT. В программах, которые  обра-
  батывают  прерывания  по  событиям в отдельных частях программы,
  следует использовать метаоператор $EVENT.  $EVENT  OFF  отменяет
  генерацию кода проверки событий до тех пор, пока не будет выпол-


  нен метаоператор
  $EVENT ON.
       Для иллюстрации, рассмотрим подпрограмму сортировки в прог-
  рамме  ведения учета, упомянутой ранее. Сортировки работают мед-
  ленно, даже без остановки после  выполнения  каждого  оператора,
  чтобы  проверить, была ли нажата клавиша F1. Более того, так как
  сортировка не требует ввода от пользователя, какой смысл в выво-
  де на экран вспомогательной информации?
       Решение состоит в том, чтобы заключить  подпрограмму  между
  метаоператорами $EVENT:
 
       ON KEY(1) GOSUB DispHelpText
       KEY(1) ON
       .
       .   тело основной программы...
       .
       $EVENT OFF
       Sortroutine:
       .
       .   здесь код проверки событий не генериуется;
       .   это экономит время и память.
       .
       EndSortroutine:
       $EVENT ON
       .
       .   остальная часть программы
       .
       END
      
       Существует  значительная разница между $EVENT и отключением
  прерывания с помощью оператора KEY(10) OFF, обычно  используемым
  в  Интерпретаторе БЕЙСИКА. Дело в том, что KEY(10) OFF - это ди-
  намический оператор (т.е. он выполняется во время прогона  прог-
  раммы),  который  отключает реакцию на нажатие клавишы F1, но не
  отключает выполнения проверок, с соответствующими затратами вре-
  мени. Они участвуют в ходе работы программы, так как код провер-
  ки вставляется между каждыми двумя операторами. Тогда как $EVENT
  - оператор, выполняющийся на этапе компиляции, который управляет
  тем, будет ли компилятор генерировать код проверки события.
       Для отмены генерации кода проверки событий в части програм-
  мы используется метаоператор $EVENT OFF. В этом случае  выполне-
  ние оператора KEY(1) ON не вызывает никакого действия.
                                           
 

 
      
        ПРИЛОЖЕНИЕ C
     ------------------------------------------------------------
    
    
        Интерфейс с языком ассемблера
     ---------------------------------------


    
        При  разработке  некоторых прикладных систем может возник-
  нуть задача, которая либо слишком долго решается в ТУРБО  БЕЙСИ-
  КЕ,  либо  по каким-то причинам вообще не может быть реализована
  на нем. Для того, чтобы обеспечить потребность в большей скорос-
  ти и гибкости, ТУРБО БЕЙСИК позволяет программе  вызывать  подп-
  рограммы, написанные на ассемблере и обращаться к функциям DOS и
  BIOS.
       В ТУРБО БЕЙСИКЕ имеются три формы оператора CALL:
       1) Вызов процедуры (CALL). Процедурв может быть написана на
  на  ТУРБО  БЕЙСИКЕ  или является встроенной (ONLINE) процедурой,
  написанной на языке ассемеблера. Встроенное ассмеблирование  яв-
  ляется наиболее мощной формой интерфейса с ассмеблером.
       2)   Вызов   подпрограммы   по   абсолютному  адресу  (CALL
  ABSOLUTE). Подпрограмма, написанная на  ассмеблере,  уже  должна
  быть загружена в память. Эта возможность реализована для обеспе-
  чения максимальной совместимости с Интерпретатором БЕЙСИКА.
       3)  Вызов  подпрограммы  обработки  программного прерывания
  CALL INTERRUPT, в соответствии со значением вектора  программных
  прерываний.  Вызывает  подпрограмму и обычно применяется для ис-
  пользования служебных операций DOS и DIOS.
       В главе 5 "Справочное руководство по ТУРБО БЕЙСИКУ" описаны
  в деталях операторы ТУРБО БЕЙСИКА CALL и SUB. В этом приложении,
  мы рассмотрим аспекты CALL и SUB, касающиеся ассемблера.
       Обратите внимание, что средства интерфейса с подпрограммами
  на ассемблере трудны для понимания в силу сложности самого  про-
  цесса связи. Прежде, чем приступить к изучению тогоБ что изложе-
  но в данном приложении, следует ознакомиться с основными положе-
  ниями языка ассемблер.
                
 

 
                 Оператор CALL ABSOLUTE
      ------------------------------------------------
 
       Выполнение  оператора  CALL  ABSOLUTE  в программе на ТУРБО
  БЕЙСИКЕ вызывает подпрограмму на ассемблере, предварительно заг-


  руженную оператором BLOAD  или  являющуюся  частью  пространства
  данных программы.
       В примере:
      DEF SEG=$H5000
      MyAsmSub%=&H4000
      CALL ABSOLUTE MyAsmSub%
  вызывается ассемблерная процедура, расположенная в сегменте 5000H
  (20480 - десятичный адрес) со смещением 4000H (16384 десятичное).
  Адрес обычни указывается в виде сегмент:смещение, т. е. 5000:4000.
       Синтаксис оператора CALL ABSOLUTE:
  CALL ABSOLUTE <числовой-идентификатор>[(список-параметров)]
  где  числовой-идентификатор - это числовая скалярная переменная,
  которая находится в диапазоне от -32768 до 65535. Если  числовой
  идентификатор отрицателен, он преобразуется в положительное чис-
  ло  путем  дополнения  до 2. Он задает смещение и используется в
  совокупности с адресом сегмента, установленным в последнем  опе-
  раторе  DEF SEG, для задания вызываемого 32-битового абсолютного
  адреса. Если вы хотите использовать выражение для задания  адре-
  са,  вам следует присвоить его числовому идентификатору, а затем
  указать идентификатор в операторе CALL.
       В качестве необязательных параметров могут задаваться только
  короткие целые скалярные переменные. Параметры передаются по адресу
  с помощью 16-битовых указателей, размещенных в стеке слева направо.
  Сами параметры располагаются в главном сегменте данных, на который
  указывает DATA SEGMENT(DS).
       Эта форма оператора CALL  допускает  минимальную  совмести-
  мость  с интерпретатором БУЙСИКА. ТУРБО БЕЙСИК располагает более
  мощной возможностью вызова встроенных процедур (SUB INLINE)  для
  обеспечения полного доступа к хранилищам данных.
       После завершения требуемых действий, ассмеблерные процедуры
  должны выполнить межсегментный (дальний) возврат (RETURN) в ТУР-
  БО  БЕЙСИК. Выполнение программы затем продолжается с оператора,
  следующего за вызовом CALL.
       Заботиться о сохранении  регистров  сегмента  данных  (DS),
  указателя  базы (BP), сегметна стека (SS) и указателя стека (SP)


  должен сам программист.
      
       Оператор CALL INTERRUPT
      ------------------------
     
       Оператор CALL INTERRUPT использует значения вектора  преры-
  ваний  для  входа в подпрограмму на ассмеблере. Обычно эта форма
  CALL используется для вызова  подпрограмм  обработки  прерываний
  DOS  и  BIOS,  но  может употребляться и для вызова определенных
  пользователем программных обработчиков прерываний.
       Синтаксис оператора CALL INTERRUPT:
      CALL INTERRUPT <целое-выражение>
  где целое выражение должно быть в пределах от 0 до 255.
       Перед вызовом подпрограммы  обработки  прерывания  следует,
  пользуясь  оператором  REG,  установить значения соответствующих
  регистров. Доступ к результатам, записанным в регистрах и сохра-
  няемых компилятором, может быть осуществлен  с  помощью  функции
  REG.
       После  выполнения  нужной  операции  ассемблерная процедура
  должна выполнить возврат (RETURN) из прерывания (IRET)  в  ТУРБО
  БЕЙСИК. Затем продолжается выполнение следующего за вызовом CALL
  оператора.
       Заботиться о сохранении  регистров  сегмента  данных  (DS),
  указателя  базы (BP), сегметна стека (SS) и указателя стека (SP)
  должен сам программист.
        
       Регистровый буфер
       _________________
      
       Оператор  CALL  INTERRUPT  использует  для  передачи из и в
  программу на ассмеблере регистровый буфер. Он представляет собой
  последовательность 16- битовых целых чисел, соответствующих зна-
  чениям процессорных регистров непосредственно до и после  выпол-
  нения оператора CALL INTERRUPT.
       Оператор REG сохраняет содержимое 16-битовой целой перемен-
  ной в указанном регистре, в соответствии с заданным числовым ар-
  гументом (от 0 до 9).
       Функция  REG возвращает 16-битовое содержимое заданного ре-
  гистра, определяемого в соответствии со значением числового  ар-
  гумента  (от  0 до 9). Связь между аргументами и действительными
  процессорными регистрами приведена в следующей таблице:


       -------------------------------------------
       I    Номер           I   Регистр          I
       -------------------------------------------
       I        0           I   Флаги            I
       I        1           I   AX               I
       I        2           I   BX               I
       I        3           I   CX               I
       I        4           I   DX               I
       I        5           I   SI               I
       I        6           I   DI               I
       I        7           I   BP               I
       I        8           I   DS               I
       I        9           I   ES               I
       I------------------------------------------
      
       Для того, чтобы установить значение в  регистровом  буфере,
  пользуйтесь оператором REG, например:
       REG 5,&H8000
  загружает 16-ричное значение 8000H в регистр SI буфера.
       Обратите  внимание,  что REG не производит непосредственной
  записи или чтения процессорного регистра - REG читает или  запи-
  сывает в промежуточный буфер.
       Для чтения элемента из регистрового буфера пользуйтесь фун-
  кцией REG, например:
       y%=REG(1)
  загружает в целую переменную y% содержимое из дубликата регистра
  AX.
       И  вновь, заметьте, что значение регистрового буфера загру-
  жается в процессорные регистры с  началом  выполнения  оператора
  CALL INTERRUPT и копируется из процессора после возврата из выз-
  ванной подпрограммы.
      
                 О вызовах функций DOS и BIOS
                 ----------------------------
                
       Прерывание 10H - 1FH являются обращениями к BIOS и выполня-
  ют  различные служебные функции. (Для более детальной информации
  см. "Техническое справочное руководство по DOS IBM".)
       Прерывание 21H (33 десятичное) представляет особый  интерес
  по сравнению с остальными номерами прерываний, так как оно явля-
  ется  главным способом обращения к DOS.


Запрос на прерывание по-
  мещается в наиболее значимый байт регистра AX (AH),  а  дополни-
  тельные,  при необходимости, размещаются в других регистрах. DOS
  предоставляет множество полезных функций, доступ к которым может
  быть осуществлен с помощью описанного выше способа.
       В качестве примера рассмотрим функцию FNFreeSpace,  опреде-
  ляющую количество пустого дискового пространства.
       DEF FNFreeSPACE (drive%) 'Функция DOS 36H возвращает число
                                'свободных кластеров на выбранном
                                'устройстве: 0=устройство по умолчанию,
                                '1=А,2=В и т.д.
       REG 4,drive%
       REG 1,&H3600
       CALL INTERRUPT &H21
       'своб. пространство = доступные кластеры * байт/сектор *
       'сектор/кластер = BC*CX*AX
       FNFreeSpace = CSNG(REG(2))*REG(3)*REG(1)
       END DEF
      
       Определенная  в  одном месте программы, функция FNFreeSpace
  может быть вызвана в любом другом, также  как  и  все  остальные
  функции.
                Использование CALL вместе с INLINE
                ----------------------------------
       Встроенные  процедуры  на ассмеблере и обычные процедуры на
  ТУРБО БЕЙСИКЕ используют одну и ту же вызывающую  последователь-
  ность. Изменяется определение процедуры SUB при задании программ
  на  языке ассмеблера. Встроенные процедуры - наиболее мощный ре-
  жим использования ассмеблера в ТУРБО БЕЙСИКЕ.
       Синтаксис:
       CALL <имя процедуры> [(список параметров)]
      
       Синтаксис:
       SUB <имя процедуры> INLINE
         $INLINE <список-байтов>
         $INLINE <имя-файла-COM>
       END SUB
      
       Может  быть  задано  произвольное   количество   операторов
  $INLINE  в  любом порядке. Единственное ограничение - количество
  файлов COM в одной процедуре не должно быть больше 16.
       Список-байтов состоит из констант или  выражений,  значения
  которых находятся в диапазоне от 0 до 255, разделенных запятыми.


  Обычно   для   каждого   байта   задается   16-ричная  константа
  ($H4C,$H90).
       Команды возврата недопустимы ни в ассемблерном коде,  ни  в
  конце  процедуры  SUB.  За этим автоматически следит компилятор.
  Если необходимо выйти из процедуры до ее завершения, следует вы-
  полнить переход на ассемблерную метку в конце встроенного кода.
       Обратите внимание, что в определении SUB список  параметров
  не задается.
       Заботиться о сохранении  регистров  сегмента  данных  (DS),
  указателя  базы (BP), сегметна стека (SS) и указателя стека (SP)
  должен сам программист.
      
       Передача параметров встроенным процедурам
       -----------------------------------------
       Параметры в качестве 32-битовых указателей элементов данных
  (за исключением массивов) помещаются в стек в порядке слева нап-
  раво.
            
       Передача числовых переменных
       ----------------------------
       Для числовых переменных (целых и с плавающей запятой) пере-
  дается 32-битовый указатель данных (см. Приложение А "Обсуждение
  работы с числами" описание числовых форматов.)
      
       Передача символьных данных
       --------------------------
       Для символьных параметров (за исключением массивов) переда-
  ется  32-битовый  указатель  на  4-байтовый дескриптор строки. В
  первых двух байтах дескриптора содержится длина строки.  Следую-
  щие  два  байта  содержат  смещение символьных данных в сегменте
  символьных данных.
       Замечание. Старший бит байтов,  указывающих  длину  строки,
  использовать  не следует, он зарезервирован и может быть в даль-
  нейшем задействован. Прежде, чем  использовать  значение  длины,
  нужно  исключить  старший бит с помощью логической операции "И".
  Нельзя, однако, изменять значение в памяти. Можно изменять байты
  в строке символов, но не следует менять длину строки. Для  полу-
  чения  указателя  символьного  сегмента используйте первое слово
  сегмента данных, определенного по умолчанию.  Дескриптор  строки


  имеет следующий формат:
       Байты 0,1: Длина строки (старший бит зарезервирован)
             2,3: Смещение данных в символьном сегменте.
            
       Передача массивов
       -----------------
       Когда параметрами являются массивы, дескриптор массива, длина
  которого 60 байтов, помещается в стек. Дескриптор массива имеет
  следующий формат:
       Байты 0,1: Адрес сегмента данных массива. Первый элемент
                  массива начинается со смещения 0. Для динамических
                  массивов он содержит 0 до тех пор, пока не уста-
                  новлена размерность массива.
             2:   Описывает тип элементов массива
                    0 = целый
                    2 = длинный целый
                    4 = с плавающей запятой одинарной точности
                    6 = с плавающей запятой двойной точности
                    8 = зарезервирован
                   10 = символьный
             3:   Количество индексов
             4,5: Число элементов массива
             6,7: Длина элементов массива
                    2 байта = целый
                    4 байта = длинный целый
                    4 байта = с плавающей запятой одинарной точности
                    8 байтов = с плавающей запятой двойной точности
                    4 байта = символьный дескриптор
             8,9: Нижняя граница правого индекса массива
             10,11: Верхняя граница правого индекса массива
       Следующие 6 байтов повторяются для 8 размерностей (индексов)
       Байты 12,13 зарезервированы
             14,15 нижняя граница следующего индекса массива
             16,17 верхняя граница следующего индекса массива
            
             Передача результатов выражений
             ------------------------------
       Процедурам  на ассмеблере можно передавать значения выраже-
  ний, однако нельзя гарантировать числовой тип результата его вы-
  числения. Мы советуем присваивать значение выражения  переменной


  и затем передавать переменную.
        
            Передача констант
            -----------------
       Процедурам на ассмеблере можно передавать константы, но не-
  обходимо  явно  указать  их  числовой тип. Используйте для этого
  идентификаторы типов после значения константы.
            
            Создание файла INLINE.COM
            -------------------------
       Для создания файла можно использовать отладчик или макроас-
  семблер. Находясь в отладчике, можно выполнить команду А (ассем-
  блировать) для ввода с клавиатуры операторов, написанных на язы-
  ке ассемблер, команду N (имя) для задания имени файла и  команду
  W (запись) для записи файла на диск.
       При  использовании  макроассмеблера необходимо четыре прог-
  раммы: редактор, макроассемблер, компоновщик и программа,  назы-
  ваемая  EXE2BIN.  Сначала наберите в редакторе текст вашей прог-
  раммы на ассемблере. Затем запустите  макроассмеблер  для  того,
  чтобы  получить объектный файл вашей программы. Далее, с помощью
  компоновщика создайте выполняемый файл. И, наконец,  используйте
  EXE2BIN для преобразования выполняемого файла в файл типа .COM.
 

     На рисунке С-1 изображен простой пример распределения памяти
  во время выполнения:
 
 
   0000:0000 -------------------------------
             I                             I
             I        DOS                  I
             I                             I
             -------------------------------
             I Другие резидентные          I (SideKick и т.д.
             I          программы          I
             I                             I
             -------------------------------
             I    ТУРБО БЕЙСИК             I
             I      Система выполнения     I
             I      Область данных         I
             I      Рабочий стек           I FRE (-2)
             -------------------------------
             I    Область пользовательских I От 16 до 64К


             I               программ      I Сегменты
             I                             I пользовательских
             I                             I кодов
             -------------------------------
             I    Скалярный сегмент        I
             I      Набор констант         I
             I      Скалярные переменные   I
             I      Символьные дескрипторы I
             I      Дескрипторы массивов   I
             ------------------------------- YYYY:FFFF
             I    Пространство для         I            переменный
             I               массивов      I  FRE (-1)   размер
   XXXX:0000 -------------------------------
             I    Символьный сегмент       I  FRE ($$)
             I                             I
   XXXX:FFFF -------------------------------
             I    Свободное пространство   I  MEMSET
             I                             I
             -------------------------------
   A000:FFFF I                             I
             -------------------------------
            
              Рисунок С -1 Карта распределения памяти в
                           момент выполнения программы
                     
                         ПРИЛОЖЕНИЕ  D
         -----------------------------------------------------------------
        
                 Сравнение ТУРБО БЕЙСИКА и ИНТЕРПРЕТАТОРА БЕЙСИКА
                 ------------------------------------------------
              Между ТУРБО БЕЙСИКОМ и ИНТЕРПРЕТАТОРОМ БЕЙСИКА имеются три
         основные отличия:
         1. Компилятор против интерпретатора
         2. Расширение языка БЕЙСИК в ТУРБО БЕЙСИКЕ
         3. Реализация компилятора
              Каждое из этих основных отличий определяет связанные с ним
         более мелкие различающиеся детали в двух реализациях БЕЙСИКА. Их
         мы рассмотрим ниже.
             
                  Компилятор против интерпретатора
                  --------------------------------


              Интерпретаторы имеют тенденцию затуманивать различия  между
         командами для создания программ и командами, используемыми в про-
         грамма; другими словами, между системой сопровождения программ и
         самим языком. Так, например, EDIT и AUTO не составляют часть язы-
         ка в том смысле, в каком ими являются GOSUB и PRINT.
              Интерпретаторы выполняют программный код в заданном порядке.
         Компиляторы,  напротив, сначала просматривают исходные операторы,
         затем генерируют выполняемый код для исходного текста. Последнее
         свойство позволяет ТУРБО БЕЙСИКУ, как компилятору выявлять ошибки
         в  ветвях  программы, которые никогда не будут выполняться ИНТЕР-
         ПРЕТАТОРОМ БЕЙСИКА. В следующем примере, выполняемом в Интерпре-
         таторе, если X не будет равно 3 перед выполнением строки 20, опера-
         торы, следующие за THEN никогда выполняться не будут:
              10  X=5
              20 IF X=3 THEN GOTO 30: X=10: Z="ААА"
         При этом синтаксическая ошибка присвоения числовой переменной сим-
         вольного  значения обнаружена не будет. Кроме того, операторы Х=10
         и Z="ААА" никогда не будут выполняться, так как при Х=3 будет осу-
         ществлен переход GOTO на строку 30. Компилятор во время компиляции
         пометит любой "тупиковый код" как ошибку.
        
                   Неподдерживаемые команды
                   ------------------------
              В ТУРБО БЕЙСИКЕ имеется настоящий полноэкранный редактор и ко-
         манды работы с меню для выполнения вспомогательных функций. Поэтому
         нет необходимости в наличии каких-либо операторов,связанных с за-
         грузкой, сохранением и редактированием исходных программ. Таких
         команд в ТУРБО БЕЙСИКЕ нет. Соответствующие команды ИНТЕРПРЕТАТОРА
         Бейсика обычно используются в режиме непосредственной работы
         (DIRECT) и включают:


             AUTO               LOAD
             DELETE             NEW
             EDIT               RENUM
             LIST               SAVE
             ТУРБО БЕЙСИК позволяет создавать и модифицировать программы  с
         помощью текстового редактора, то есть, нет необходимости в измене-
         нии  или  стирании  строк  программы  (например,  командами EDIT и
         DELETE). Если вы захотите удалить  строку,  переместите  курсор  в
         нужную  строку и нажмите CTRL-Y. Аналогично, нет потребности в ко-
         манде LIST - вместо этого достаточно нажать соответствующие клави-
         ши и нужная часть программы будет выведена на экран.
             Команды основного меню ТУРБО БЕЙСИКА выполняют те же  (и  дру-
         гие)  функции,  что и команды SAVE, LOAD и NEW Интерпретатора БУЙ-
         СИК. А, так как в ТУРБО БЕЙСИКЕ необязательны номера строк,  то  и
         команды АUTO и RENUM не нужны.
             В ТУРБО БУЙСИКЕ не поддерживаются также следующие команды:
                             CONT
             В  ТУРБО  БЕЙСИКЕ  не  допускается повторный запуск прерванной
         программы. Прерывание программы по STOP или Ctrl-Break означает то
         же самое, что и выполнение оператора END.
                             MERGE
             ТУРБО  БЕЙСИК транслирует программу в выполняемый код, поэтому
         он не предоставляет возможности сливать строки исходной  программы
         в момент выполнения.
                             MOTOR
             Кассетный порт обычно не встречается на PC.
                             USR
             Оператор CALL выполняет те же (и другие) задачиБ что и USR.
                     
                      Операторы, требующие модификации
                      ---------------------------------
                             CALL ABSOLUTE
             В операторе CALL ABSOLUTE ТУРБО БЕЙСИКА допустимы только целые
             параметры.  Он  включен  в систему для обеспечения минимальной


             совместимости с интерпретируемым БЕЙСИКОМ. Для  программирова-
             ния на ассемблере ТУРБО БЕЙСИК располагает более мощными сред-
             ствами:  CALL INTERRUPT и встроенными ассемблерными процедура-
             ми. (Для более полной информации см. приложение С "Интерфейс с
             языком ассемблер").
                             CHAIN
             Программы типа СHAIN должны транслироваться в файлы .EXE или
         .TBC  с   помощью   выбора в меню "Варианты" компилятора режимов
         Compile to exe (компиляция  в  EXE) или Compile to Chain (компи-
         ляция в CHAIN). В операторах  COMMON как в обычных, так и цепных
         программах список переменных должен содержать общие переменные в
         надлежащем  порядке (хотя и необязательно с одними и теми же име-
         нами). Нельзя выполнять в среде ТУРБО БЕЙСИКА оператор CHAIN. Он
         может использоваться только  при  работе  в  DOS. Режимы MERGE и
         "DELETE диапазон-номеров-строк" не поддерживаются.
                            DEFtype,TRON,TROFF,OPION BASE
             Реализация этих операторов в ТУРБО  БЕЙСИКЕ  и  ИНТЕРПРЕТАТОРЕ
         БЕЙСИКА  несколько отличается. ТУРБО БЕЙСИК рассматривает физичес-
         кое местоположение каждого оператора в исходной  программе,  а  не
         его  появление в выполняемой ветви обёектного кода программы. Дру-
         гими словами, имеется в виду положение каждого оператора во  время
         компиляции, а не во время выполнения. Рассмотрим на примере следу-
         ющей программы оператор DEFtype:
             10  GOTO  30
             20 DEFINT X
             30 X=2.3
             40 PRINT X
             При выполнении этой программы в ИНТЕРПРЕТАТОРЕ БЕЙСИКА, опера-
         тор  в  строке20 обнаружен не будет. Таким образом, при выполнении
         строки 20 будет использован тип переменной Х по умолчанию (с  оди-
         нарной точность), а затем выведется значение 2.3.


             В  отличие  от  этогоБ ТУРБО БЕЙСИК устанавливает соглашения о
         типах во время компиляции. Поскольку,  оператор  DEFINT  физически
         предшествует первому появлению перменной Х, оператор PRINT выведет
         значение 2.
                            DRAW и PLAY
             Оба  эти оператора выполняют сложные командные строки, выводя-
         щие графические изображения или воспроизводящие музыку, соответст-
         венно. В ИНТЕРПРЕТАТОРЕ БЕЙСИКА символьная информация, управляющая
         выполнением команд, может включать  имена  символьных  переменных.
         Например, в Интерпретаторе БЕЙСИКА операторы:
             n=50
             PLAY "T=n;C"
         устанавливают  темп  в  50 четвертей в минуту и исполняет ноту до.
         ТУРБО БЕЙСИК не понимает подобной конструкции, так как после  ком-
         пиляции  вся ирформация, касающаяся переменной n,утрачивается. Од-
         нако, того же эффекта можно добиться с помощью функции VARPTR$:
              n=50
              PLAY "T=",VARPTR$(n) + "C".
 
 
                                 ПАРАМЕТРЫ ФУНКЦИИ
 
              Для  определения  параметров  функции  Интерпретатор   БЕЙСИК
         позволяет  использовать  те  же   имена   переменных   параметров.
         ТУРБО БЕЙСИК выдает сообщение  об  ошибке,  связанной  с  наличием
         дубликата локальной переменной.
              RUN
              Программа в ТУРБО БЕЙСИКЕ может использовать оператор RUN для
         загрузки и выполнения другой программы или перезапуска себя самой,
         но нет возможности запустить  текущую  программу  из  произвольной
         точки кроме ее начала, задавать номер строки, с  которой  начнется
         выполнение программы, в этом случае нельзя.
 
                 Преобразование  программ   Интерпретатора   БЕЙСИК
                             в   программы ТУРБО БЕЙСИК
 
              Первый шаг преобразования программы Интерпритатора  БЕЙСИК  в


         программу ТУРБО БЕЙСИК - сохранение ее на диске в  формате  ASCII.
         Например, чтобы сохранить текущую программу, введите:
                   SAVE "<имя программы>.txt",A.
              Режим ",А" заставляет  Интерпретатор  БЕЙСИКА  записывать  на
         диск текстовый (ASCII)  файл,  не  снабжая  его  "опознавательными
         знаками".    Такой    файл    может    непосредственно    читаться
         ТУРБО БЕЙСИКом, однако,  если  он  больше  64К,  следует  выделить
         основной  и  подключаемые  файлы  прежде,чем   редактировать   или
         компилировать его в ТУРБО БЕЙСИКе.
 
                              Дополнение языка БЕЙСИК
 
              ТУРБО БЕЙСИК  предоставляет  новые  командные  возможности  и
         дополнения языка БЕЙСИК. Ниже приводятся  некоторые  из  них  (см.
         для более детальной информации главу 5 "Справочное руководство по
         ТУРБО БЕЙСИКу).
                               Структурные операторы
              В дополнение к Интерпретатору БЕЙСИК, ТУРБО БЕЙСИК использует
         для управления ходом программы и создания легко читаемых  программ
         конструкции операторов IF/ELSEIF/ELSE/ENDIF и  SELECT CASE.  Новыу
         блочно-структурированные  операторы  DO/LOOP  позволяют  выполнять
         общее управление программными циклами с  проверкой  в  начале  или
         конце цикла.
                             Двоичный файл ввода/вывода
              ТУРБО БЕЙСИК поддерживает новый режим  BINARY  для  двоичного
         ввода и вывода в файлы. Операторы  GET$,  PUT$  и  SEEK  позволяют
         программисту управлять файлами на низком уровне.  Программа  может
         читать или записывать информацию в файл по-байтно  и  устанавливать
         указатель позиции в файле на любой байт.
                           Определение функций и процедур
              В ТУРБО БЕЙСИКе  определения  функций  могут  содержать  одну
         строку, как в стандартном интерпретируемом БЕЙСИКе, или  несколько


         строк,  предоставляя  тем   самым   более   структурный   механизм
         реализации  подпрограмм.  Операторы  SUB   и   END SUB   позволяют
         создавать процедуры. ( Для более полной информации  см.  главу  4,
         раздел "Подпрограммы,функции и процедуры").
              ТУРБО БЕЙСИК поддерживает  рекурсивные  процедуры  функции  с
 
 
                                         1

         настоящими локальными переменными. Используйте оператор LOKAL  для
         задания переменных,  которые  заносятся  в  стек  при  рекурсивных
         вызовах.
                            Интерфейс с языком ассемблер
              В ТУРБО БЕЙСИКе оператор CALL  используется  в  трех  формах:
         CALL имя процедуры, CALL INTERRUPT и CALL ABSOLUTE. Оператор  CALL
         INTERRUPT  использует  команду  REG  для  передачи  данных   через
         буферный регистр. Встроенные (INLINT) процедуры на ассемблере  или
         файл .COM могут быть заключены внутри процедур с помощью  директив
         $INLINE. (См. приложение С  "Интерфейс  с  языком  ассемблер"  для
         более детальной информации).
                                 Встроенные функции
              В  отличие  от   Интерпретатора   БЕЙСИКа   в   ТУРБО БЕЙСИКе
         трансцендентные функции возвращают значения с двойной точностью.
                                   Новые команды
              В ТУРБО БЕЙСИКе имеется большое  количество  новых  команд  и
         дополнительных режимов в старых командах. В таблице  D-1  частично
         приводятся дополнения к Интерпретатору БЕЙСИКа.
              Если Вы случайно используете некоторые из этих ключевых  слов
         в качестве имен переменных, то произойдет ошибка  компиляции.  Для
         безошибочной компиляции выполните операцию Find and replace (найти
         и изменить), чтобы изменить неподходящее имя переменной.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                                         2

                  Таблица D-1 Дополнения к БЕЙСИКу в ТУРБО БЕЙСИКе
         ------------------------------------------------------------------
         BIN$                Возвращает целое число в двоичном виде
         BINARY              Новый вид файла для доступа на низком уровне
         CETL,FIX            Функции  преобразования  чисел   с   плавающей
                             точкой в целые
         COMMAND$            Возвращает символ продолжения командной строки
         CVM$,CVMD,          Преобразуют из и в формат Microsoft
         MKMD$,MKMS$
         DECR/INCR           Альтернативный  способ   увеличения/уменьшения
                             значений переменных
         DEFLNG,MKL$,        Поддерживает  новый  числовой  тип  -  длинные
         CVL                 целые
         DELAY               Ждет   n   секунд   (для   машинно-независимых
                             задержек)
         DO/LOOP             Гибкие конструкции циклов в стандарте ANSI
         ERADR               Адрес последней ошибки
         EXIT                Выход  из  циклов  FOR/NEXT,  WHTLE/WEND   или
                             DO/LOOP, блоков IF, процедур, и функций
         EXP2,EXP10          Возвращает степени 2 и 10
         GET$                Читает данные из файлов с режимом BINARY
         IF/ELSEIF/ELSE/     Выполняет множественные тесты IF
         END IF
         INLINE              Встраевает байты непосредственно  в  обьектный
                             код
         INSTAT              Возвращает состояние клавиатуры
         LCASE$              Преобразует символы в строчные
         LOCAL/SHARED/STATIC Опрелеляют переменные в функциях и процедурах
         LOG2,LOG10          Возвращает логарифмы по основанию 2 и 10
         MEMSET              Определяет  свободное   пространство   старших
                             адресах памяти


         MTIMER              Таймер с высоким разрешением
         PUT$                Записывает данные в двоичные  файлы  в  режиме
                             BINARY
         REG                 Читает/записывает в регистровый буфер
         SEEK                Определяет позицию в файлах в режиме BINARY
         SELECT CASE         Мощный оператор проверки условий
         SUB/END SUB         Определяют процедуру
         VARSEG              Возвращает  адрес  сегмента   переменных   или
                             элемента массива
         ------------------------------------------------------------------
 
                               Реализация компилятора
 
              Использование  компилятора  в  качестве  транслятора  БЕЙСИКа
          влияет на уже существующие программы на  БЕЙСИКе  и,  кроме  того,
         допускает более детальное управление ходом компиляции  программ  и
         генерацией  кода.  Мы  уже  указывали  на  некоторые   отличия   и
         дополнения,   в   этом   разделе   рассмотрим   другие   свойства,
         проистикающие из мощной реализации ТУРБО БЕЙСИКа.
                            Редактор и большие программы
              Включенный  в  ТУРБО БЕЙСИК  редактор  не  может  работать  с
         программами, длина которых превышает 64К. Если исходная  программа
         более 64К, следует разделить ее  на  несколько  файлов.  Директива
         $INCLUDE допускает  компиляцию  программ  длиной  более  64К.  Для
         запуска  программы  в  ТУРБО БЕЙСИКе  на  компиляцию   следует   в
         спускающемся  меню  File  задать  режим   Main   (если   программа
         отличается от  файла,  находящегося  в  текущий  момент  в  буфере
         редактора).
              Редактор ТУРБО БЕЙСИКа может работать со строками  длиной  до
 
 
                                         3

         248  символов.  Интерпретатор  БЕЙСИКа  допускает  строки  по  255
         символов. Строки, длина которых больше 248  знаков,  автоматически


         снабжаются в 248-ой позиции символом  "возврат  каретки".  Однако,
         Вам понадобится проверить правильно ли формируется строка  прежде,
         чем Вы загрузите стоку в редактор ТУРБО БЕЙСИКа.
              ТУРБО БЕЙСИК допускает  программы,  выполняемый  код  которых
         превышает 64К. Директива $SEGMENT задает генерацию нового сегмента
         кода, при этом аргументы  операторов  CALL/GOTO  меняются,так  как
         многие переходы становятся "длинными".
 
             Файлы произвольного доступа с числами с плавающей запятой
 
              ТУРБО БЕЙСИК  использует  для  чисел  с   плавающей   запятой
         стандарт IEEE, а Интерпретатор БЕЙСИКа для  чисел  с  одинарной  и
         двойной  точностью   нестандартный   формат   Microsoft,   поэтому
         ТУРБО БЕЙСИК должен выполнять  преобразования  полей  с  плавающей
         запятой  в  уже  существующих  файлах  с  произвольным   доступом,
         созданных программами  Интерпретатора  БЕЙСИКа.  Функции  MKMS$  и
         MKMD$ создают числовые строки в формате Microsoft, а функции  CVMS
         и CVMD преобразуют стоки в формате Microsoft в числовые  данные  в
         формате ТУРБО БЕЙСИКа.
              Обратите внимание, что это касается только полей с  плавающей
         запятой в файлах с произвольным доступом, а не полей с целыми  или
         символьными данными.
 
                             Числа с плавающей запятой
 
              В отличие от Интерпретатора БЕЙСИКа, ТУРБО БЕЙСИК  использует
         стандартное представление IЕЕЕ для вещественных  значений  в  виде
         чисел  с   плавающей   запятой.   Числа   одинарной   точности   в
         ТУРБО БЕЙСИКе  занимают  6 байтов  памяти,  двойной  точности   -
         8 байтов.
              Использование формата IЕЕЕ в ТУРБО БЕЙСИКе  повышает  уровень
         точности представления чисел с плавающей запятой.  (Заметьте,  что
         функции МКМD$, МКМS$, СVМD и  СVМS  преобразуют  любые  данные  из


         ТУРБО БЕЙСИКа в формат Интерпретатора БЕЙСИКа и наоборот.)
              Кроме того, так как ТУРБО БЕЙСИК выполняет все математические
         операции  с  использованием  сопроцессора  (или  эмулятора  8087),
         округление дробной части не производится. Так, что при  округлении
         в ТУРБО БЕЙСИКе любого числа, содержащего 5 в дробной  части,  оно
         увеличивается  или  уменьшается  до  ближайшего   четного   числа.
         Например, 0,5 округляется до 0; 9,005 округляется до 9,01.
              При выполнении  следующей  программы  в  ТУРБО БЕЙСИКе  будет
         получен 0 0; а в Интерпретаторе БЕЙСИКа - 0 1.
                   10 DEFINT A
                   20 A=1/2       ` деление целых
                   30 B=1/2       ` деление чисел с плавающей запятой
                   40 PRINT A;B
 
                                   Работа в окне
 
              В  среде  ТУРБО БЕЙСИКа  программы,  выводящие  текст,  могут
         выполнятся  в   окне   RUN,   представляющем   виртуальный   экран
         25-строк-на-80-позиций.  Используйте  Аlt-F5   для   того,   чтобы
         распахнуть окно RUN в момент выполнения программы.
              Если в программе используются специальные операции  РОКЕ  для
         установки позиции курсора или изменения атрибутов цвета при работе
         в окне, вывод на экран может выполняться неправильно. Однако  если
         до  выполнения   распахнуть   окно   RUN   вывод   будет   отлично
         воспроизведен. Программы, воспроизводящие графические изображения,
 
 
                                         4

         работают с полным экраном.
 
                  Промежуточная точность чисел с плавающей запятой
 
              ТУРБО БЕЙСИК использует стандарт IЕЕЕ для чисел  с  плавающей
         запятой, поэтому промежуточные результаты вычисляются с  точностью
         до представления в 80 битах. Некоторые программы в  Интерпретаторе
         БЕЙСИКа  обрабатывают  усеченные  значения  с  плавающей   запятой


         добавлением в отдельных вычислениях "жульнической добавки" в 1 для
         получения   правильного   результата.    ТУРБО БЕЙСИК    допускает
         повышенную  точность,  поэтому  коды,  используещие   преимущества
         арифметики с усеченной точностью могут быть изменены.
 
                                       Строки
 
              В  ТУРБО БЕЙСИКе   имеется   расширенная   обработка   строк.
         Максимальная длина строки расширена с 255 до 32767 символов. Кроме
         того, покончено со "сборкой  мусора",  периодически  проводимой  в
         Интерпретаторе  БЕЙСИКа  -  поэтому  нет  смысла  в   лихорадочном
         выполнении команды FRE для вмешательства в эту операцию.
 
                          Расширенное использование памяти
 
              В ТУРБО БЕЙСИКе программе доступна вся системная память,  без
         строгих   ограничений   на   использование   не   более   64К   в
         Интерпретаторе  БЕЙСИКа.  Программы   могут   состоять   из   кода
         неограниченного объема, могут работать со  скалярными  переменными
         объемом до 64К, символьными данными до 64К и неограниченным числом
         массивов, длина каждого из которых не более 64К.
 
                                 Ячейки РЕЕК и РОКЕ
 
              В  графическом  режиме  цвет  текста  сохраняется  в   ячейке
         РЕЕК/РОКЕ со смещением 4ЕН в основном сегменте данных. РЕЕК и РОКЕ
         для остальных ячеек могут привести к непредсказуемым результатам.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                                         5

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


         обнаружения  ошибок,  которые  компилятор  помещает  в   объектной
         программе.
              Большая часть ошибок  компиляции  это  ошибки  в  синтаксисе,
         вызванные  пропуском  символа,  неправильным  написанием  команды,
         непарным числом скобок и т д.  Если  компилятор  встречает  что-то
         в исходной программе, чего он не может  понять  или  допустить  Вы
         немедленно окзываетесь в  редакторе,  и  курсор  указывает  на  то
         место, где произошла ошибка. Вам нужно ножать  на  любую  клавишу,
         чтобы  убрать  собщение  об  ошибке,  затем  исправить   ошибочный
         оператор и повторить компиляцию.
               ТУРБО БЕЙСИК выводит номер ошибки и краткое  ее  описание  в
         нижней строке экрана. Ошибки компиляции  имеют  номера  от  256  и
         выше. Ошибки выполнения возникают  при  прогоне  оттранслированной
         программы. Пример таких  ошибок:  ошибки  файловой  системы  (диск
         полон  или  защищен   для   записи),   неверные   вызовы   функций
         (графические  операторы  без   графического   адаптера),   попытка
         извлечения корня  из  -14,  ошибки  использования  памяти  (обычно
         связанные с ее недостатком) и множество других.
              Ошибки выполнения могут  вызывать  прерывания,  то  есть,  вы
         можете  установить  с  помощью  оператора  ON  ERROR,   что   если
         произойдет  ошибка,  управление  должно  быть  передано   заданной
         подпрограмме обработки ошибок. Эта подпрограмма может "рассудить",
         что делать дальше в зависимости от обнаруженной  ошибки.  Особенно
         удобно  использовать  такие  подпрограммы  для  обработки   ошибок
         файловой системы (например, диск  полон) - это  единственный  класс
         ошибок,  с  которыми  должна  иметь  дело   ещательно   отлаженная
         программа.
              С  помощью  оператора  ERROR  можно   симулировать    ошибки


         выполнения  выполнения  в  качестве  способа  отладки  подпрограмм
         обработки ошибок.
 
              Для более детальной информации  об  ошибках выполнения см.  в
         главе  5  "Справочное  руководство  по  ТУРБО  БЕЙСИКУ"   описание
         операторов ON  ERROR и ERROR, функций ERR, ERL и ERADR.
              Если ваша программа не  обрабатывает  ошибки,  тогда  при  их
         обнаружении ТУРБО  БЕЙСИКОМ  выполнение  программы  преждевременно
         прекращается,  выводится   номер   ошибки   и   краткое   описание
         создавшихся условий. Если программа выполнилась в  ТУРБО  БЕЙСИКЕ,
         курсор редактора указывает на оператор, вызвавший  ошибку.  Ошибки
         выполнения имеют номера между 0 и 255. Например:
              Error 5 Illegal function call at pgm-ctr: 761
 
           (Ошибка 5 неверный вызов функции по программному счетчику: 761)
              Сообщения об ошибках не  включаются  в  .ЕХЕ  файлы;  поэтому
         ошибки выполнения, возникающие в программах, запущенных из DOS, не
         содержат текст сообщения об ошибке, а только ее номер.  Отладочный
         режим поиска ошибок выполнения (FIND) может преобразовать значение
         программного счетчика, определяющего адрес  ошибки,  в  конкретный
         оператор в исходном файле, который вызвал ошибку. Например:
              nnn Error - distination <CR/LF>,
         где nnn - номер ошибки из трех цифр. Для более  полной  информации
         см. граву 3 "Команда DEBUG".
 
 
                                         6

 
                                 Ошибки_выполнения
         2 Syntax error
           Синтаксическая ошибка
              Синтаксическая  ошибка   выполнения,   которая   возникла   в
         операторе READ при попытке загрузки символьных данных  в  числовую
         переменную.   Остальные   синтаксические   ошибки   обнаруживаются
         компилятором.
 
         3 RETURN without GOSUB


           RETURN без GOSUB
              Задан оператор RETURN  без  соответствующего  ему  GOSUB;  то
         есть, собтветственно возврат (RETURN) осуществлять неоткуда.
 
         4 Out of data
           Конец данных
              Оператор READ вышел за пределы значений в операторе DATA.
 
         5 Illegal function call
           Неверный вызов функции.
              Всу  ошибки,   связанные   с   передачей   несоответствующего
         аргумента оператору или  функции.  Сразу  несколько  причин  могут
         вызыввать их:
         * слишком большое значение цвета или режима экрана;
         * наличие  оператора,  работающего  с  графикой  без  графического
           адаптера или при несоответствующем режиме,  заданном  оператором
           SCREEN;
         * попытка выполнения неверной математической операции, такой  как,
           например, извлечение корня из отрицательного числа;
         * слишком большой (или отрицательный) номер  записи  в  операторах
           GET и PUT;
         * попытка использования оператора WIDTH в последовательном файле.
 
         6 Overflow
           Переполнение
              Переполнение возникает при получении в результате  вычислений
         слишком больших значений, которые не  могут  быть  представлены  в
         виде числовых данных заданного типа. Например, х%=32767+1 приведет
         к переполнению, также как 32768 не может быть  представлено  целым
         числом.Ошибки переполнения целочисленных не обнаруживаются, если в
         меню "Вариант" не был установлен  режим  (Overflow);  переполнение
         значений с плавающей запятой всегда регистрируются.
 
         7 Out of memory
           Выход за пределы памяти
              Многочисленные  ситуации  могут  приводить  к  выводу   этого
         сообщения, в частности, определение слишком большого массива.
 
         9 Subscript out of range
           Индекс за пределами диапазона
              Возникает при попытке  использовать  индекса,  большего,  чем


         максимальное допустимое.
 
         10 Dublicate definition
            Двойное определение
              Повторная  попытка  размещения   динамического   массива   до
         освобождения уже размещенного массива с тем же именем.
 
         11 Division by zero
            Деление на ноль
 
 
                                         7

              Попытка деления на ноль или возведения нуля  в  отрицательную
         степень.
 
         13 Type mismatch
            Несоответствие типов данных
              Вместо  числового  значения  используется   символьное   или,
         наоборот. Возникает в операторах PRINT USING,DRAW или PLAY.
 
         14 Out of string space
            Выход  за пределы пространства символьных переменных
              Исчерпана память  для  символьных  переменных,  она  недолжна
         превышать 64К.
 
         15 String to long
            Слишком длинная строка
              Строка,  полученная  в   результате   символьного   выражения
         превышает 32767 байтов.
 
         19 No RESUME
            Нет оператора  RESUME
              Выполнение подпрограммы обработки ошибок дошло до физического
         конца программы. Возможно, в программе пропущен оператор RESUME.
 
         20 RESUME without error
            RESUME без ошибки
              Выполнение оператора RESUME, когда ошибки не было,  т.е.  нет
         подпрограммы обработки ошибки, из  которой  должен  быть  выполнен
         выход RESUME.
 
         24 Devise time out
            Тайм-аут устройства
              Истекло заданное время (Тайм-аут) для коммуникационной  линии
         состояния. Значения тайм-аута ьогут быть заданы для CTS (Clear  To
         Send), CD (CarrierDetect) и DSR  (DataSetReady)  линий  состояния.
         Программа   либо   преждевременно   завершается,   либо   повторно
         выполняются  коммуникационные  операции.   Для   более   детельной
         информации см. описание операторов OPEN COM в главе 5.


 
         25 Devise fault
            Ошибка устройства
              Возникла аппаратная ошибка; например, в интерфейсе  принтера,
         или коммуникационном адаптере.
 
         27 Out of paper
            Конец бумаги
              Интерфейс  принтера  указывает,  что  концилась   бумага.   В
         действительности, он может быть просто выключен или в нем  имеются
         какие-либо сложности.
 
         50 Field overflow
            Преполнение поля
              При заданной длине записи файла определяется слишком  большое
         множество переменых полей в операторе FIELD.
 
         51 Internal error
            Внутренняя ошибка
              Возник сбой в системе выполнения ТУРБО-БЕЙСИКА. Обратитесь  с
         информациуй о вашей программе в группу технического сопровождения.
 
         52 Bad file number
 
 
                                         8

            Неверный номер файла
              Номер файла,  указанный  в  операторе  работы  с  файлом,  не
         соответствует  номеру  в  операторе  OPEN  или  выходит  за  рамки
         диапазона допустимых номеров файлов.
 
         53 File not found
            Файл не найден
              Заданноу имя файла не обнаружено на указанном диске.
 
         54 Bad file mode
            Неверный режим работы с файлом
              Попытка  выполнить  PUT  или  GET  (или  PUT$  и  GET$)   для
         последовательного файла.
 
         55 File already more
            Файл уже открыт
              Попытка открыть уже открытый файл, или удалить открытый файл.
 
         57 Device I/O error
            Ошибка вода/вывода устройства
              Возникла серьезная аппаратная  неисправность  при  выполнении
         команды.
 
         58 File already exists
            Файл уже существует
              Новое имя файла, указанное в опраторе NAME уже существует.
 
         61 Disk full
            Диск полон
              На указанном диске или диске по умолчанию  не  хватает  места


         для выполнения операции с файлом. Убедитесь, что места  достаточно
         и запустите программу повторно.
 
         62 Input past end
            Попытка прочитать больше данных, чем имеется в файле. Для того,
         чтобы избежать этой  сложности,  используйте  функцию  EOF  (конец
         файла).   Ошибка   также   может   возникнуть   при   чтении    из
         последовательного файла,  открытого  для  записи  или  дозаписи  в
         конец.
 
         63 Bad record number
            Неверный номер записи
              В качестве номера записи в операторах GET или PUT для  файлов
         с произвольным доступом  указано  отрицательное  число  или  число
         больше чем 16.777.215.
 
         64 Bad file name
            Неверное имя файла
              Имя файла,  указанное  в  щператорах  FILES,  KILL  или  NAME
         содержит недопустимые символы.
 
 
         67 To many files
            Слишком много файлов
              Эта ошибка может быть вызвана либо попыткой создания  слишком
         большого количества файлов  в  корневом  каталоге,  либо  неверныь
         именем файла при выполнении системного  вызова  DOS  для  создания
         файла.
 
         68 Device unavailable
 
 
                                         9

            Устройство недоступно
              Попытка  открытия  (OPEN)  файла  устройства  на  машине,  на
         которой этого  устройства  нет;  например,  СОМ1:  в  системе  без
         серийного адаптера или модема.
 
         69 Communication buffer overflow
            Переполнение коммуникационного буфера
              Выполнение  оператора  INPUT  для  ввода   символов   в   уже
         заполненный  коммуникационный   буфер.   Программа   либо   должна
         проверять и чаще очищать буфер, либо увеличить размер буфера.
 
         70 Permission denied
            Нарушение защиты
              Попытка записи на защищенный для записи диск.
 
         71 Disk not ready


            Диск не готов
              Открыта крышка накопителя на гибком устройстве, или  диск  не
         установлен на заданном накопителе.
 
         72 Disk media error
            Ошибка дискового накопителя
              Панель контроллера гибкого  или  жествкого  диска  регистрирует
         постоянную ошибку в одном или нескольких секторах носителя.
 
         74 Rename across disks
            Переименование с переменой диска.
              Переименовать файл с  заданием  другого  диска  или  каталога
         нельзя. Оператор NAME а лишь присваивает ему новое имя.
 
         75 Path/File acces error
            Ошибка доступа в маршруте/файле
              В команде, требующей  указания  маршрута  (OPEN,RENAME,MKDIR)
         неправильно  использован  маршрут;  например,  открывается  (OPEN)
         подкоталог или удаляется используемый каталог.
 
         76 Path not found
            Маршрут не найден
              Маршрут, заданный в операторах CHDIR, MKDIR, OPEN и т.д.,  не
         найден.
 
         202 Out of string temp space
             Выход за пределы временного пространства для символьных данных
              Символьное выражение требует использования слишком большого
          количества временных буферов для символьных данных. Ошибка  может
         быть   вызвана   выражением   типа    MID$(LEFT$(MID$(RIGHT$(...).
         Попробуйте  упростить  символьное   выражение   путем   сохранения
         промежуточных результатов во временных символьных переменных.
 
 
         203 Mismatched common variables
             Несоответствие общих переменных
              Попытка выполнить CHAIN между двумя  програмными  сегментами,
         которые содержат несоответствующие друг  другу  операторы  COMMON.
         ТУРБО БЕЙСИК сверяет тип и число переменных в операторах COMMON.
 
         204 Mismatched program option
             Несоответствие програмных опций
              Попытка выполнить CHAIN между двумя  програмными  сегментами,


         компиляция которых происходила  с  несоответствующими  друг  другу
 
 
                                         10

         програмными  опциями  (различными  математическими   библиотеками,
         требованиями сопроцессора и т.д.).
 
         205 Mismatched program vervisions
             Несоответствие версий в программе
              Попытка выполнить CHAIN между двумя  програмными  сегментами,
         которые созданы различными версиями компилятора ТУРБО БЕЙСИК.
 
         206 Invalid program file
             Непригодный програмный файл
              Попытка  выполнить  CHAIN  или  RUN  для  програмнгосегмента,
         компиляция которого выполнилась не в ТУРБО БЕЙСИКЕ.
 
         242 String/array memory corrupt
             Разрушение памяти строки/массива
              Область памяти символьных данных была  неверно  перезаписана.
         Ошибка  может  быть  вызвана  неверными  действиями   ассемблерной
         подпрограммы, доступом к  символьному  массиву  за  пределами  его
         размерности или нарушениями в системе выполнения ТУРБО БЕЙСИКА.
 
         243 CHAIN/RUN from .EXE file only
             CHAIN/RUN допустимы только из файла .EXE
              Попытка выполнить CHAIN или RUN для програмного  сегмента  из
         среды ТУРБО БЕЙСИКА.  Следует  выполнить  компиляцию  программы  и
         записать оттранслированный модуль на диск с  помощью  команд  меню
         "Варианты", а  затем  запустить  из  DOS  программу,  использующую
         операторы CHAIN и RUN.
 
                                 Ошибки_компилятора
 
         401 Expression too complex
             Слишком сложное выражение
              Выражение  содержит   слишком   много   операторов/операндов;
         следует разбить его на два или несколько более простых выражений.
 
         402 Statement too complex
             Оператор слишком сложен
              Сложность оператора вызвала переполнение  внутреннего  буфера


         компилятора. Следует разбить его на два или несколько более
         простых оператора.
 
         403 $IF nesting overflow
             Переполнение вложеннных $IF
              Число блоков условной компиляции ($IF/$ELSE/$ENDIF) не должно
         составлять более 16 уровней.
 
         404 $INCLUDE nesting overflow
              Переполнение вложенгых $INCLUDE
              Вложенность  включаемых  файлов  не  должна  быть  больше   5
         уровней, включая саму основную программу. Это  позволяет  иметь  в
         программе 4 вложенных включаемых ($INCLUDE) файла.
 
         405 Block nesting overflow
              Переполнение вложенных блоков
              В вашей программе слишком много операторов блочных  структур,
         вложенных один в другой. Блочные структуры в ТУРБО  БЕЙСИКЕ  могут
         иметь не более 255 уровней вложенности.
 
         406 Compiler out of memory
              Компилятор вышел за пределы памяти
 
 
                                         11

              Исчерпана  доступная  память  компилятора   для   символьного
         пространства, буферов и т.д. Если память  исчерпана,  выделите  из
         вашей программы небольшую основную программу,  которая  использует
         метаоператор $INCLUDE для  включения  остальной  части  программы.
         Если вы компилируете программу в память и  возникает  эта  ошибка,
         попробуйте с помощью меню "Варианты" выполнить компиляцию на диск.
 
         407 Program too large
              Программа слишком велика
              Ваша программа содержит более 65530 операторов.
 
         408 Segment exceeds 64K
              Сегмент превышает 64К
              Ваша программа включает сегмент, превышающий ограничение 64К.
         Добавьте  метаоператор  $SEGMENT  в  исходную   программу,   чтобы
         разместить программный код в дополнительном сегменте.
 
         409 Variables exceeds 64K
              Переменные превышают 64К


              Общее пространство скалярных переменных ограничено 64К.  Вэто
         пространство включаются указатели  строк,  целые,  длинные  целые,
         вещественные числа с одинарной и двойной точностью. Избавьтесь  от
         неиспользуемых переменных или разбейте вашу программу на отдельные
         основную и цепные (CHAIN) программы.
 
         410 "," expected
              Предполагается ","
              Синтаксис оператора требует запятую (,).
         411 ";" expected
              Предполагается ";"
              Синтаксис оператора требует запятую (;).
         412 "(" expected
              Предполагается "("
              Синтаксис оператора требует запятую (().
         413 ")" expected
              Предполагается ")"
              Синтаксис оператора требует запятую ()).
         414 "=" expected
              Предполагается "="
              Синтаксис оператора требует запятую (=).
         415 "-" expected
              Предполагается "-"
              Синтаксис оператора требует запятую (-).
         416 Statement expected
              Предполагается оператор
              ТУРБО БЕЙСИК полагает, что в этом местедолжен быть  оператор.
         Некоторый символ не может быть идентифицирован ни как команда,  ни
         как метакоманда, ни как переменная.
 
         417 Label/line number expected
              Предполагается метка/номер строки
              В операторах IF,  GOTO,  GOSUB  или  ON  должна  быть  задана
         допустимая метка или номер строки.
 
         418 Numeric expression requires relational operator
              Численное выражение требует соответствующего оператора
              Компилятор обнаружил символьный  операнд  в  том  месте,  где
         должен быть числовой операнд.
 
         419 String expression requires string operand
 
 
                                         12



              Для символьного выражения требуется символьный операнд
              Компилятор ожидал символьное выражение, а нашел нечто другое,
         например: Х$=А$+В .
 
         420 Scalar variable expected
              Предполагается скалярная переменная
              Компилятор  ожидал  найти  скалярную  переменную  в  качестве
         формального   параметра   функции,   определенной   пользователем.
         Скалярные переменные  включают  строки,  целые,  длинные  целые  и
         вещественные числа с одинарной и двойной точностью.
 
         421 Array variable expected
              Предполагается переменная массив
              В опреаторах DIM или операторах работы с графикой GET или PUT
         должна быть указана переменная массив.
 
         422 Numeric variable expected
              Предполагается числовая переменная
              В опреаторах INCR, DECR или при задании смещения в операторе
         CALL ABSOLUTE должна быть указана числовая переменная.
 
         423 String variable expected
              Предполагается символьная переменная
              В опрераторах FIELD, GET$, PUT$ или LINE  INPUT  должна  быть
         указана символьная переменная.
 
         424 Variable expected
              Предполагается переменная
              В функциях VARPTR,  VARPTR  или  VARSEG  должна  быть  задана
         переменная.
 
         425 Integer constant expected
              Предполагается целая константа
              В поименованом присваивании константы или в командах условной
         компиляции $IF/$ELSEIF должна быть указана целая константа.
 
         426 Positive integer constant expected
              Предполагается положительная целафя константа
              При указании границ массива DIM  STATIC  и  в  метаоператорах
         $COM, $SOUND и $STACK  должна  быть  указана  положительная  целая
         константа.
 
         427 String constant expected
              Предполагается символьная константа


              В качестве имени файла в метаоператоре $INCLUDE  должна  быть
         указана символьная константа.
 
         428 Numeric scalar variable expected
              Предполагается числовая скалярная переменная
              Должна  быть  указана  целая,  длинная  целая,   вещественная
         переменная с одинарной или двойной  точностью;  например  в  цикле
         FOR/NEXT.
 
         429 Integer scalar variable expected
              Предполагается целая скалярная переменная
              В качестве параметра в операторе CALL  ABSOLUTE  должна  быть
         указана целая переменная.
 
         430 Integer array variable expected
              Предполагается целая переменная массив
 
 
                                         13

              Должна быть  указана  целая  переменная  массив;  например  в
         операторе PALETTE.
 
         431 End of line expected
              Предполагается конец строки
              В  строке,  содержащей  метаоператор,   недопустимы   никакие
         символы, кроме комментария.
 
         432 AS expected
              Предполагается AS
              Служебное слово AS пропущено в  операторах  FIELD  или  OPEN.
         Проверьте в главе 5 синтаксис операторов FIELD и OPEN.
 
         433 DEF FN expected
              Предполагается DEF FN
              Компилятор  обнаружил  операторы  END  FN  или  EXIT  FN  без
         определения функции DEF FN.
 
         434 IF expected
              Предполагается IF
              Компилятор  обнаружил  операторы  END  IF  или  EXIT  IF  без
         предшествующего им оператора IF.
 
         435 DO LOOP expected
              Предполагается DO LOOP
              Компилятор  обнаружил  операторы  LOOP  или  EXIT  LOOP  без
         предшествующего им оператора DO LOOP.
 
         436 SELECT expected
              Предполагается SELECT
              При определении оператора SELECT CASE вы либо забыли  указать
         служебное слово SELECT, либо компилятор  обнаружил  операторы  END


         SELECT или EXIT SELECT.
         437 CASE expected
              Предполагается CASE
              При определении опреатора SELECT CASE  НЕ  УКАЗАНО  СЛУжЕбНОЕ
         СЛОВО СASE. Эта ошибка может также  возникнуть  при  использовании
         служебного слова SELECT в качестве имени переменной.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                                         14

 
         438 FOR LOOP expected
              Предполагается FOR LOOP
              Компилятор обнаружил оператор EXIT  FOR  без  предшествующего
         ему оператора FOR.
 
         439 SUB expected
              Предполагается SUB
              Компилятор  обнуружил  оператор  END   SUB   или   EXIT   SUB
         ,без  предшествующего  ему  оператора  SUB.   Началом   объявления
         подпрограммы должен быть оператор SUB.
 
         440 END DEF expected
              Предполагается END DEF
              Определение  функции  не  завершается   соответствующим   ему
         оператором END DEF.
 
         441 END IF expected
              Предполагается END IF
              Блок IF не завершается соответствующим END IF.
 
         442 LOOP/WEND expected
              Предполагается LOOP/WEND
              Циклы  DO   или   WHILE   не   завершаются   соответствующими
         опреаторами LOOP/WEND.
 
         443 END SELECT expected
              Предполагается END SELECT
              Оператор SELECT CASE не был правильно завершен оператором END
         SELECT.
 
         444 END SUB expected
              Предполагается END SUB
              Процедура не была правильно завершена оператором END SUB.
 
         445 NEXT expected
              Предполагается NEXT
              Цикл FOR не был правильно завершен оператором NEXT.
 
         446 THEN expected
              Предполагается THEN
              В операторе IF пропущено служебное слово THEN.
 
         447 TO expected
              Предполагается ТО


              В операторе FOR пропущено служебное слово TO.
 
         448 GOSUB expected
              Предполагается GOSUB
              В опреаторе ON пропущена входящая в него часть GOSUB.
 
         449 GOTO expected
              Предполагается GOTO
              В опреаторе ON пропущена входящая в него часть GOТО.
 
         450 $ENDIF expected
              Предполагается $ENDIF
              В операторе условной компиляции $IF пропущено служебное слово
         $ENDIF. Посмотрите все метаоператоры $IF, чтобы найти  место,  где
         следует указать соответствующей ему $ENDIF.
 
 
 
                                         1

         451 Unmatched $ELSE
              Непарный метаоператор $ELSE
              Компилятор обнаружил метаоператор $ELSE  без  предшествующего
         ему метаоператора условной компиляции $IF. Посмотрите  в  исходном
         тексте предшествующие $ELSE, чтобы найти  место,  где следует
         указать соответствующей ему $IF.
 
         452 Unmatched $ENDIF
              Непарный метаоператор $ENDIF
              Компилятор обнаружил метаоператор $ENDIF  без  предшествующего
         ему метаоператора условной компиляции $IF. Посмотрите  в  исходном
         тексте предшествующие $ENDIF, чтобы найти  место,  где следует
         указать соответствующей ему $IF.
 
         453 Undefined name constant
              Неопределенная именная константа
              В  программе  использована  именная  константа,  которая   не
         определена.  Определите  именную  константу  или   используйте   в
         операторе литеральную константу.
 
         454 Undefined function reference
              Обращение к неопределенной фуркции
              В выражении указано имя функции, которая не определена.
         Проверьте,  нет  ли  ошибок  в  имени   функции   или   определите
         фуркцию.
 
         455 Undefined subprogram reference
              Обращение к неопределенной подпрограмме


              Выполнен  вызов  подпрограммы  (CALL),  но  в  программе  нет
         определения  подпрограммы.  Проверьте,  нет  ли  ошибок  в   имени
         подпрограммы или задайте подпрограмму.
 
         456 Undefined label/line reference
              Обращение к неопределенной метке/номеру строки
              В опреаторах  IF,  GOTO,  GOSUB  или  ON  указана  метка  или
         оператор строки, неопределенные в  программе.  Проверьте,  нет  ли
         ошибок в метке или номере строки, или задайте их в программе.
 
         457 Undefined array reference
              Обращение к неопределенному массиву
              Выполнено обращение к массиву, не определенному  в  операторе
         DIM. Проверьте, нет ли ошибок в имени массива, или укажите  его  в
         операторе DIM.
 
         458 Dublicate label/line number
              Двойное определение метки/номера строки
              Дважды указан один и тот же номер строки или метки. Найдите в
         вашей программе и включаемых файлах двойные определения и измените
         одно из них или оба.
 
         459 Dublicate named constant
              Двойное определение имени константы
              Две именные константы были заданы с одинаковыми именами.
         Найдите в вашей программе и включаемых файлах двойные определения
         и измените одно из них или оба.
 
         461 Dublicate subprogram definition
              Двойное определение имени подпрограммы
              Две процедуры SUB были определены с одинаковыми именами.
         Найдите в вашей программе и включаемых файлах двойные определения
 
 
                                         2

         и измените одно из них или оба.
 
         462 Dublicate common variable
              Двойная общая переменная
              В списке переменных оператора COMMON одна переменная  указана
         дважды. Найдите в вашей программе и включаемых файлах двойные
         определения и измените одно из них или оба.


 
         463 Dublicate variable declaration
              Двойное определение переменной
              В операторах LOCAL, STATIC или SHARED две переменные  указаны
         с одинаковыми именами. Найдите в вашей программе и включаемых
         файлах двойные определения и измените одно из них или оба.
 
         464 Dublicate $COM definition
              Двойное определение $COM
              Для каждого коммуникационного порта в вашей  программе  может
         быть только один метаоператор $COM. Найдите в вашей программе и
         включаемых файлах определения $COM и удалите одно из них .
 
         465 Dublicate $SOUND definition
              Двойное определение $SOUND
              В программе может быть использован только один метаоператор
         $SOUND. Найдите в вашей программе и включаемых файлах определения
         $SOUND и удалите одно из них .
 
         466 Dublicate $STACK definition
              Двойное определение $STACK
              В программе может быть использован только один метаоператор
         $STACK Найдите в вашей программе и включаемых файлах определения
         $STACK и удалите одно из них .
 
         467 Invalid line number
              Неверный номер строки
              Номер строки должен быть в диапазоне от 0 до 65535.
 
         469 Metastatements not allowed here
              Использование метаоператоров здесь недопустимо
              Метаоператоры должны быть первыми командами в строке
 
         470 Block/scanned statements not allowed here
              Блочные операторы здесь недопустимы
              Блочные операторы типа WHILE/WEND, DO/LOOP и SELECT  CASE  не
         могут быть использованы в однострочных операторах IF.
 
         471 Unknown identifier/syntax error
              Неизвестный оператор/синтаксическая ошибка
              В строке что-то  не  так  -  компилятор  не  может  подобрать
         соответствующее сообщение об ошибке.
 
         472 Array subscript error


              Ошибка в индексе массива
              Вы задали массив с одним числом индексов, а использовали  его
         с другим числом.
 
         473 Array bounds error
              Ошибка выхода за границы массива
              Программа  обращается  к  статическому  массиву   с   помощью
         литерального значения, выходящего за пределы диапазона.
 
 
 
                                         3

         474 Tipe mismatch
              Несоответствие числовых типов
              Типы переменных в операторе SWAP неодинаковы.
 
         475 Parameter mismatch
              Несоответствие параметров
              Типы  или  число  параметров  не  соответствуют   определению
         функции или процедуры.
 
         476 CLEAR parameter error - use MEMSET/$STACK
              Ошибка параметров CLEAR - используйте MEMSET/$STACK
              Дополнительные параметры,  допуступные  оператору  CLEAR,  не
         доступны в таком компиляторе БЕЙСИКА, как  ТУРБО БЕЙСИК.
 
         477 LOCAL requires DEF FN/SUB
              LOCAL требует DEF FN/SUB
              Локальные переменные могут быть объявлены только в  процедуре
         или функции.
 
         478 SHARED requires DEF FN/SUB
              SHARED требует DEF FN/SUB
              Разделяемые переменные могут быть объявлены только в
         процедуре или функции.
 
         479 STATIC requires DEF FN/SUB
              STATIC требует DEF FN/SUB
              Статические переменные могут быть объявлены только в
         процедуре или функции.
 
         480 COMMON array must be dynamic
              Массивы СOMMON должны быть динамическими
              Общие массивы, указанные  в  операторе  COMMON,  должны  быть
         объявлены как DYNAMIC.
 
         481 LOCAL array must be dynamic
              Массивы LOCAL должны быть динамическими
              Локальные массивы, указанные  в  операторе LOCAL, должны
         быть объявлены как DYNAMIC.
 
         482 Parameter arrays cannot be altered


              Массивы - параметры не могут быть изменены
              Нельзя  стереть  (ERASE)   или   разместить   (DIM)   массив,
         используемый в качестве параметра функции или подпрограмы.
 
         483 Array is not STATIC
              Массив не является статическим
              Нельзя определять размерность статического массива с  помощью
         переменных в качестве индекса. При задании индексов  массива  типа
         STATIC  следует  использовать   либо   именные   константы,   либо
         литеральные константы.
 
 
         484 Array previously STATIC
              Первоначально массив был определен как статический
              Если в вашей программе для  одного  и  того  же  массива  два
         оператора DIM, ьассив автоматически считается динамическим. Либо в
         другом месте программы пытались объявить массив как  STATIC,  либо
         ваша  программа  выполняет  команду  DIM  DYNAMIC   для   массива,
         объявленного ранее как  STATIC.
 
 
 
                                         4

         485 Array name without "()" expected
              Требуется имя массива без "()"
              При  использовании  оператора  ERASE  не  следует  за  именем
         массива указывать скобки.
 
         486 Array exceeds 64K
              Массив превосходит 64К
              Размеры массива не  должны  превышать  64К  (одного  сегмента
         данных). Если  вам  нужны  массивы  большего  размера,  вы  можете
         разбить один массив на несколько меньших.
 
         487 Arrays limited to eights dimensions
              Размерность массива не должна превышать 8
              Это внутренне ограничение для компилятора.
 
         488 Invalid numeric format
              Неверный числовой формат
              В программе объявлено число, содержащее более 36 цифр  или  в
         числе  с  плавающей  запятой  не  указано  значение  показателя  в
         компаненте Е.
 
         489 Invalid function/procedure name


              Неверное имя процедуры/функции
              В случае функции, за  FN  должна  следовать  буква,  а  затем
         другие буквы, цифры и точки, завершать  может  идентификатор  типа
         (%, &, !, #, или $). В случае процедуры имя  должно  начинаться  с
         буквы, включать другие буквы, цифры и точки, но не должно включать
         идентификатор типа.
         490 No parameters with INLINE SUB
              В INLINE SUB не заданы параметры
              Не указан список формальных параметров в объявлении процедуры
         INLINE SUB. За число и тип параметров, перем\даваемых ассемблерной
         программе отвечает она сама. Никакая проверка типов не выполняется
         компилятором.
 
         491 Only $INLINE allowed here
              Здесь допустимо только $INLINE INLINE
              В процедуре SUB с режимом INLINE допустимы  только  операторы
         $INLINE.
 
         492 $INLINE requires SUB INLINE
              Для $INLINE необходимы SUB INLINE
              Операторы $INLINE допустимы только в процедурах SUB с режимом
         INLINE.
 
         493 $INCLUDE file not found
              Файл $INCLUDE не найден
              Включаемый  файл  не  найден  в  заданном  маршруте,  текущем
         каталоге или маршруте,  указанном  в  режиме  DIRECTORIES  в  меню
         SETUP. Проверьте  маршруты  или  убедитесь  в  том,  что  заданный
         включаемый файл существует.
 
         494 $INCLUDE disk error
              Ошибка на диске при выполнении $INCLUDE
              При попытке  открытия  ТУРБО  БЕЙСИКОМ  включаемого  файла  в
         процессе компилляции возникла ошибка на диске.
 
         495 $INCLUDE file too large
              Файл $INCLUDE слишком велик
              Включаемые файлы, так же  как  и  все  файлы,  загружаемые  в
 
 
                                         5

         редактор ТУРБО БЕЙСИКА, не должны превосходить 64К.
 
         496 $INLINE file not found


              Файл $INLINE не найден
              Файл INLINE не найден ни в заданном маршруте,  ни  в  текущем
         каталоге.  Убедитесь  в  том,  что   указанный   включаемый   файл
         существует.
 
         497 $INLINE disk read error
              Ошибка чтении с диска файла $INLINE
              При попытке открытия ТУРБО БЕЙСИКОМ файла INLINE  в  процессе
         компиляции возникла ошибка на диске.
 
         498 Temporary file acces error
              Ошибка доступа к временному файлу
              При компиляции на диск (в файлы .ЕХЕ или .ТВС) компилятор  не
         смог осуществить доступ к временному файлу. Проверьте каталог ТУРБО
         в режиме DIRECTORIES в меню SETUP,  чтобы  убедиться  в  том,  что
         заданный каталог существует.
 
         499 Destination file write error
              Ошибка записи в файл назначения
              При компиляции на диск (в файлы  .ЕХЕ  или  .ТВС)  компилятор
         получил информацию об ошибке записи на диск.
 
         600-610 Internal error
              Внутренняя ошибка
              Если возникла какая-либо из этих ошибок  неьедленно  сообщите
         группе технического сопровождения.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                                         6

 
                                    ПРИЛОЖЕНИЕ_F
 
                                Справочные_материалы
              Этот  раздел  посвящен  справочным  материалам   и   включает
         скэн-коды клавиатуры и расширенные коды.
 
                              Расширенные_коды_клавиш
              Расширенными кодами клавиатуры кодируются клавиши,  или   их
         комбинации, которые не могут быть представленны в коде ASCII.
              Расширенные коды возвращаются системной переменной $INKEY.  В
         двухсимвольной строке  в  качестве  первого  символа  возвращается
         ноль. Обычно  вторым  информационным  символом  является  скэн-код


         первой клавиши.
              В таблице F- 1 представлены информационные кода и их значения.
 
         Таблица_F-1.  Расширенные_коды_клавиатуры
 
         _________________________________________________________________
                Информационный код     Значение
         __________________________________________________________________
                   3                   NULL (пустой символ)
                   15                  Shift Tab (-<++)
                   16-25               Alt-Q/W/E/R/T/Y/U/I/O/P
                   30-38               Alt-A/S/D/F/G/H/J/K/L
                   44-50               Alt-Z/X/C/V/B/N/M
                   59-68               Клавиши F1-F10 (Задействованы как
                                       програмные ключи)
                   71                  Home
                   72                  Стрелка вверх
                   73                  PgUp
                   75                  Стрелка влево
                   77                  Стрелка вправо
                   79                  End
                   80                  Стрелка вниз
                   81                  PgDn
                   82                  Ins
                   83                  Del
                   84-93               F11-F20 (Shift F1 до Shift F10)
                   94-103              F21-F30 (Ctrl F1 до F10)
                   104-113             F31-F40 (Alt F1 до F10)
                   114                 Ctrl-PrtSc
                   115                 Ctrl стрелка влево
                   116                 Ctrl стрелка вправо
                   117                 Ctrl-End
                   118                 Ctrl-PgDn
                   119                 Ctrl-Home
                   120-131             Alt-1/2/3/4/5/6/7/8/9/0/-/=
                   132                 Ctrl-PgUp
                   133                 F11
                   134                 F12


                   135                 Shift-F11
                   136                 Shift-F12
                   137                 Ctrl-F11
                   138                 Ctrl-F12
                   139                 Alt-F11
                   140                 Alt-F12
 
 
 
 
 
                                         7

 
                                Скэн-коды_клавиатуры
              В скэн-кодах  кодируются  клавиши  на  клавиатуру  IBM  PC  в
         соответствии с тем, как их  понимает  ТУРБО  БЕЙСИК.  Эти  клавиши
         особено полезны при работе на  уровне  языка  ассемблер.  Обратите
         внимание, что  скэн-коды  клавиатуры  приведены  в  таблице  F2  в
         шестнадцатиричном виде.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                                         8

 
         Таблица_F-2.  Скэн-коды_клавиатуры
 
         __________________________________________________________________
 
         Клавиша        Шестнадцатиричный   Клавиша        Шестнадцатиричный
                        скэн-код                           скэн-код
         __________________________________________________________________
 
         Esc            01                  Стрелка
                                            влево/вправо        0F
         !1             02                  Q                   10
         @2             03                  W                   11
         #3             04                  E                   12
         $4             05                  R                   13
         %5             06                  T                   14
         ^6             07                  Y                   15
         &7             08                  U                   16
         *8             09                  I                   17
         (9             0A                  O                   18


         )0             0B                  P                   19
         _-             0C                  [{                  1A
         +=             0D                  ]}                  1B
         BckSp          0E                  Enter               1C
         Ctrl           1D                  |\                  2B
         A              1E                  Z                   2C
         S              1F                  X                   2D
         D              20                  C                   2E
         F              21                  V                   2F
         G              22                  B                   30
         H              23                  N                   31
         J              24                  M                   32
         K              25                  ,<                  33
         L              26                  .>                  34
         ;:             27                  /?                  35
         "'             28                  Левый.Shift         36
         ~              29                  PrtScr              37
         Правый.Shift   2A                  Alt                 38
         Кл.пробел      39                  7Home               47
         Caps Lock      3A                  8Стрелка вверх      48
         F1             3B                  9Pg Up              49
         F2             3C                  -                   4A
         F3             3D                  4Стрелка влево      4В
         F4             3E                  6Стрелка вправо     4D
         F5             3F                  5                   4C
         F6             40                  +                   4E
         F7             41                  1End                4F
         F8             42                  2Стрелка вниз       50
         F9             43                  3PgDn               51
         F10            44                  Olns                52


         F11            D9                  Del                 53
         F12            DA
         Num Lock       45
         Scrol Lock     46
         _________________________________________________________________
 
 
 
 
 
 
 
                                         9

 
                                    ПРИЛОЖЕНИЕ_G
 
                                 DOS_для_начинающих
 
              Если вы не знакомы с компьютерами или DOS, у вас  могут  быть
         затруднения с пониманием отдельных терминов, используемых в данном
         руководстве.  В  этом  приложении  вашему  внимания   предлагается
         краткий обзор следующих положений и функций DOS:
         .Что такое DOS и для чего он нужен
         .Надлежащий способ загрузки программ
         .Каталоги, подкоталоги и команда PATH
         .Использование файлов АUTOEXEC.BAT
              Информация данного раздела ни в коей мере  не  претендует  на
         полное  описание  операционной  системы  DOS.  Для  более   полной
         информации обратитесь к руководству пользоввателя  по  MS-DOS  или
         РС-DOS, которым снабжена ваша вычислительная система.
              ТУРБО БЕЙСИК работает  под  управлением  операционных  систем
         MS-DOS и РС-DOS версий 2.0 и более поздних.
 
                                   Что_такое_DOS?
              DOS это сокращенное название дисковой  операционной  системы.
         Под МS-DOS понимают версию DOS фирмы Microsoft, РС-DOS - это DOS в
         исполнении IBM. DOS является координатором движения, менеджером  и
         опреатором  транзакций,  возникающих  между   отдельными   частями
         вычислительной системы, между компьютером и вами. DOS  работает  в
         фоновом  режиме,  зоботясь  о  выполнении  служебных  компьютерных
         функций, о которых вы нехотели бы и думать - например, о  передаче
         символов между клавиатурой  и  компьютером,  между  компьютером  и
         принтером, между вашими дисками и внутренней памятью (RAM).


              Выполнение   других   транзакций   вы   инициируете    вводом
         команды в командной  строке  DOS;  иначе  говоря,  непосредственно
         после подсказки DOS.
              Подсказки DOS выглядят следующим образом:
         А>
         В>
         С>
              Прописная буква относится к  активному  дисковому  накопителю
         (который DOS  и  вы  используете  в  данный  момент).  К  примеру,
         подсказка А> означает, что вы работаете с файлами на накопителе А,
         и  команды,  которые  вы  зададите  DOS  будут  обращены  к  этому
         накопителю. Если вы захотите переключиться на другой диск,  сделав
         его активным, все, что вам следует  сделать,-  это  набрать  букву
         диска, за которым следует двоеточие,  и  нажать  клавишу  "Enter".
         Например, чтобы перейти на накопитель В, ввудите:
         В:Enter
              Есть несколько команд,  которые  вам  в  DOS  придется  часто
         использовать, если уже не пришлось, такие как:
         DEL ERASE           Удалить файл
         DIR                 Посмотреть список файлов на диске, на который
                             вы настроились
         COPY                Скопировать файлы с одного диска на другой
         TB                  Загрузить ТУРБО БЕЙСИК.
              Для  DOS  не  имеет  значения,  вводите  вы  строчные  буквы,
         прописные или и те и другие в перемешку, так что вы можете вводить
         их как вам нравится.
              Предположим, что вы  уже  знаете,  как  пользоваться  первыми
         тремя указанными командами; а если нет, - обратитесь к руководству
         по DOS. Далее мы рассмотрим надлежащий способ загрузки  программы,
         такой как ТУРБО БЕЙСИК (см. последнюю команду в списке).
 
 
                                         10

 
                              Как_загрузить_программу
              На вашем диске с системой ТУРБО  БЕЙСИК  вы  найдете  файл  с


         именем ТВ.ЕХЕ. Этот програмный файл содержит все основные функции
         БЕЙСИКА. Имя файла с расширением (или последним именем)  .СОМ  или
         .ЕХЕ означает, что это програмный файл, который можно загружать  и
         запускать (использовать)  вводом  только  его  "первого  имени"  в
         командной строке DOS. Следовательно, для  вызова  программы  ТУРБО
         БЕЙСИКА  наберите  на  клавиатуре  ТВ  и  наберите  Enter,   чтобы
         загрузить ТУРБО БЕЙСИК в память вашего компьютера.
              При загрузке ТУРБО  БЕЙСИКА  или  другой  подобной  программы
         следует  помнить:  для  того,  чтобы  загрузить  программу,  нужно
         настроиться на диск и каталог, в котором она находится. Если вы не
         задали маршрут DOS,  опреационная  система  не  будет  знать,  где
         искать программу.
              Пусть  системный  диск  с  программой  ТВ.ЕХЕ  находится   на
         накопителе А, а вы видите на экране подсказку В>. Если вы  введете
         ТВ и нажмете Enter, DOS не будет  знать,  что  имеется  в  виду  и
         вывудут сообщение "Неверная команда или имя файла".
              Другими словами, вы на неправильном пути. Еаким образом, если
         получено  соответствующее  сообщение  об  ошибке,  настройтесь  на
         накопитель А с помощью ввода А: и нажмите Enter. Затем введите  ТВ
         и нажмите Enter, чтобы загрузить ТУРБО БЕЙСИК.
              Вы можете задать "маршрут" для ваших файлов на  БЕЙСИКЕ  так,
         что DOS сможет найти их  с  помощью  команды  Path.  Более  полную
         информацию вы найдете в разделе "Файл AUTOEXEC.BAT".
 
                                      Каталоги
              Каталог (или указатель)  -  это  удобный  способ  организации
         файлов  на  гибком   или   жестком   диске.   Каталоги   позволяют
         подразделить  диск  на  несколько  частей  подобно   раскладыванию
         различных групп архивных папок в отдельные ящики.


Если,  например,
         вы решили собрать все архивные папки, касающиеся финансов, скажем,
         банковые ведомости или  папку  с  пододными  налогами,  ил  др.  в
         отдельный ящик с ярлыком "Финансы".  На  вашем  компьютере  удобно
         иметь один каталог для хранения файлов ТУРБО БЕЙСИКА,  другой  для
         писем и т.д. При этом, если вы наберете  DIR  в  командной  строке
         DOS, вам не придется в посиках нужного файла  просматривать  сотни
         других имен. Будет выведен список файлов лишь  того  каталога,  на
         который вы настроились.
              Хотя каталоги можно  создавать  и  на  гибких  и  на  жестких
         дисках, чаще всего они используются на жестких дисках. Это связано
         с тем, что последние содержат значительно  больший  объем  данных,
         однако, это же приводит к необходимости структурной организации  и
         группировке данных.
              Работая на уровне DOS, а не в ТУРБО  БЕЙСИКЕ  или  какой-либо
         другой программе, вы можете создавать новые  каталоги,  перемещать
         файлы из одного каталога в  другой  и  выводить  список  файлов  в
         конкретном каталоге.
              В  приведенных   ниже   примерах   предполагается,   что   вы
         используете систему на жестком диске, и настроены на жесткий  диск
         так, что на экране вы видите подсказку С>. Если вы хотите  создать
         каталоги на гибких дисках, замените в примере С на А или В.
              Для того, чтобы создать каталог  для  файлов  ТУРБО  БЕЙСИКА,
         следует выполнить следующее:
         1. На подсказку С> наберите MRDIR BASIC и нажмите  Enter.  Команда
         MKDIR сообщает DOS о том,  что  нужно  создать  каталог  с  именем
         BASIC.
         2. Введите CHDIR BASIC и нажмите Enter. Команда CHDIR  настраивает
         DOS на ваш каталог.
 
 
                                         11

         3. Затем поместите  диск  с  ТУРБО  БЕЙСИКОМ,  который  вы  хотите


         скопировать на одно из устройств для гибких дисков, скажем,  А,  и
         введите команду  СОРY  А:  *.*  Enter  (звездочки  используются  в
         качестве  шаблонов,  обозначающие  в  данном  случае  все  файлы).
         Команда COPY заставляет DOS скопировать все файлы на устройстве  А
         в каталог BASIC на  устройстве  С.  По  мере  копирования  каждого
         файла, на экране появляется соответствующее сообщение.
              Oб этом все. К каталогу следует  относиться  также  как  и  к
         накопителю; для  того,  чтобы  загрузить  ТУРБО  БЕЙСИК,  следует,
         прежде чем вводить ТВ, настроиться на каталог BASIC, иначе DOS  не
         сможет найти нужную программу.
 
                                    Подкаталоги
 
              Если   вам   действительно   очень    нравится    структурная
         организация, вы можете  разбить  каталоги  на  подкаталоги.  Можно
         создать столько каталогов и подкаталогов, сколько вам захочется  -
         не забудьте только, куда какие файлы вы поместили.
              Подкаталог создается тем же  способом,  что  и  каталог.  Для
         того, чтобы создать подкаталог  в  каталоге  BASIC  (например  для
         хранения графических файлов), сделайте следующее:
         1. Убедитесь в том, что вы в каталоге BASIC
         2. Введите MKDIR GRAF Enter
         3. Введите CHDIR GRAF Enter
         4. Введите MKDIR GRAF Enter. Теперь вы в подкаталоге GRAF.
              Если вы хотите  хранить  в  этом  подкаталоге  уже  имеющиеся
         графические файлы, скопируйте их. Если  они  находятся  на  гибком
         диске с расширением .GRP, поставьте диск на накопитель А и нажмите
         Enter. Если файлы находятся в корневом  каталоге  жесткого  диска,
         наберите COPY *.GRP и нажмите Enter.
 
                           Где_я_нахожусь?_Подсказки_$p$g
              Возможно, что вы уже заметили, что при  смене  каталогов,  вы
         видите одну и ту же подсказку  С>;  т.е.,  не  очевидно,  в  каком


         каталоге  или  подкаталоге  вы  находитесь.  Это  может  запутать,
         особенно если вы на какое-то время ушли с  машины.  Легко  забыть,
         где вы до этого времени находились.
              DOS предоставляет простой способ обнаружить это. Введите
                                    prompt=$p$g
         и с этого момента (до тех пор, пока вы не выключите компьютер  или
         не  перезагрузитесь)  подсказака  точно  покажет   вам,   где   вы
         находитесь. Попробуйте. Если вы еще в подкаталоге GRAF,  подсказка
         DOS будет выглядеть как:
         С:\BASIC\GRAF>
 
                                 Ффйл_AUTOEXEC.BAT
              Можно избежать ввода команды  посказки  (которая  обсуждалась
         выше) для того, чтобы посмотреть "где вы  находитесь"  при  каждом
         включении компьютера, если внести ее в файл AUTOEXEC.BAT. Он будет
         выполнять эту команду каждый раз когад вы включите машину.
              Файл AUTOEXEC.BAT - это удобное средство и он может выполнять
         множество  других  функций  кроме  этой.  Но  вместо  того,  чтобы
         углубляться в детали здесь,мы предлагаем обратиться к  руководству
         по DOS. Однако, мы покажем вам,  как  создать  файл  AUTOEXEC.BAT,
         который автоматически изменит посказку  с  тем,  чтобы  вы  всегда
         знали, где в структуре каталогов вы находитесь, установит  маршрут
         каталога BASIC и загрузит ТУРБО БЕЙСИК.
              Команда задания маршрута (path) в  DOS  сообщает  компьютеру,
         где искать команды, которые операционная система не может  узнать.
         DOS узнает программы только в текущем (том, на  который  настроен)
 
 
                                         12

         каталоге, если не задан маршрут  каталога,  содержащий  подходящие
         программы или файлы.
              В следующем примере устанавливается маршрут к каталогу  BASIC
         и подкаталогу FILES.
              Если в  корневом  каталоге  имеется  файл  AUTOEXEC.BAT,  ваш


         компьютер выполнит все, что в нем содержится в тот  момент,  когда
         компьютер будет включен (корневой каталог - это тот, для  которого
         указывается С> или С:\ без всякого имени каталога).
              Далее, изложено, как создать файл AUTOEXEC.BAT:
         1.  Наберите  CHDIR\  для  того,  чтобы  настроиться  на  корневой
         каталог.
         2. Наберите COPY CON AUTOEXEC. BAT Enter. Эта команда сообщает DOS,
         что все введенное вами  дальше  должно  быть  скопировано  в  файл
         AUTOEXEC.BAT.
         3. Введите
         ECHO OFF
         PROMPT=$P$G
         PATH=C:\BASIC;C:\BASIC\FILES
         CHDIR\BASIC
         \BASIC
         Ctrl Z Enter
              Команда  Ctrl  Z  сохраняет   введенные   команды   в   файле
         AUTOEXEC.BAT.
              Для  того,  чтобы  проверить  ваш  новый  файл  AUTOEXEC.BAT,
         перезагрузите  систему,  нажав  одновременно  Ctrl+Alt+Del.  Когда
         загрузка завершится, вы увидите подсказку C:\BASIC>.
 
                                 Система_каталогов
              Как перейти из одного каталога в другой? Это зависит от того,
         куда вы хотите перейти. Основная команда DOS для смены каталогов -
         это CHDIR. Используйте ее следующим образом:
         * Для перехода из одного каталога в другой:
           например, для перехода из каталога BASIC в каталог WP, введите:
           C:\BASIC>CHDIR\WP Enter
           Обратите  внимание  на  обратную  косую  черту  (\)  перед  именем
           каталога. При каждом переходе из  одного  каталога  в  другой,  не
           связанный с ним, перед именем каталога следует указывать  обратную
           косую черту.
         * Для перехода из каталога в подкаталог:
           например, из  каталога  BASIC  в  подкаталог  GRAF,  введите  за
           подсказкой с именем каталога BASIC
           C:\BASIC>CHDIR GRAF Enter
           В этом случае обратная косая черта вам не понадобится,  так  как


           каталог GRAF является ответвлением каталога BASIC. На самом  деле,
           если  вы  используете  обратную  косую  черту,  DOS   поймет   вас
           неправильно. При указании обратной косой черты DOS посчитает,  что
           ее каталог GRAF входит в основной (корневой) каталог.
         * Для перехода из подкаталога в пораждающий его каталог:
           например, для перехода из  подкаталога  GRAF  в  каталог  BASIC,
           введите вслед за подсказкой подкаталога GRAF:
           C:\BASIC\GRAF>СHDIR ..Enter
           и DOS  вернет  вас  в  каталог  BASIC.  Каждый  раз,  когда  вам
           понадобится вернуться в пораждающий каталог, укажите за командой
           CHDIR пробел и две точки.
         * Для возврата в корневой каталог:
           корневой каталог - это исходный каталог, он является "родителем"
           (и  даже  "прародителем")  всех  каталогов   (и   подкаталогов).
           Находясь в корневом каталоге вы увидите посказку C:\>
           Для перехода в корневой каталог введите CHDIR  \Enter.  Обратная
           косая черта без имени  каталога  сообщает  DOS,  что  вы  хотите
 
 
                                         13

           вернуться в корневой каталог.
 
                        Конфигурирование_операционной_среды
              Если у вас есть специальные требования к аппаратным средствам
         или вы разработчик, нуждающийся в динамической среде,  возможность
         установки переменных среды предоставляет вам  определенный  выбор.
         Переменные  среды  задаются  с  помощью  команды  SET  в   DOS   и
         переопределяют опции компилятора и/или программы.
              Переменные среды  воздействуют  на  всю  среду,  в  кото  рой
         выполняется  программа.  Таким  образом,   установленный   однажды
         параметр действует до тех пор, пока он не будет переустановлен или
         пока  машина  не  будет  выключена.   Если   значения   параметров


         устанавливаются всегда одним и тем же образом,  вы  можете  ввести
         команду SET в  пакетный  (bath)  файл,  или  в  файл  AUTOEXEC.BAT
         (описание этого файла см. выше).
              Переменные среды в  ТУРБО  БЕЙСИКЕ  позволяют  переопределять
         опции компилятора и режимы  выполнения  для  сопроцессора  8087  и
         проверки цветного графического адаптера (CGA). Предположим, что вы
         хотите использовать сопроцессора 8087  в  опреационной  среде.  На
         подсказку DOS введите:
         SET 87=yes
         где "yes" означает, что у вас есть сопроцессор, "no" означает, что
         если даже 8087 имеется, использовать его не следует. По  умолчанию
         - "yes".
              В случае "снежной проверки" CGA, ввудите
         SET CGA SNOWCHK=no
         где "no"  отменяет  выполнение  "снежной  проверки",  а  "yes"  ее
         выполняет.  По  умолчанию - "yes".
              Когда  компилятор  начинает  работу,   или   запускается   на
         выполнение  сгенерированные  файлы   .ЕХЕ,   происходит   просмотр
         пространства переменной среды с  целью  определения  их  значений.
         Хотя и нет необходимости в установке  значений  переменной  среды,
         они  в  вашем  распоряжении  в  любой  момент,   когда   вам   это
         понадобится. Если вы предпочтете не задавать их,  текущий  каталог
         будет искать соответствующие файлы и создает временные  файлы  для
         хранения переменных по умолчанию.
              Это  приложение  предоставляет  лишь  краткий  обзор  DOS   и
         некоторых его функций. Если вы уже знакомы  с  тем,  что  изложено
         здесь, вы можете изучить  зуководство  по  DOS  и  обнаружить  там
         множество действий, которые  выполняются  с  помощью  операционной
         системы.  Там  вы  найдете  множество  других  функций,  здесь  не
         упомянутых, которые упростят и расширят вашу работу с компьютером.


 
                                    ПРИЛОЖЕНИЕ_H
 
                        Краткое_описание_функций_и_процедур
              Это приложение  можно  использовать  как  краткий  справочник
         процедур и функций, сгруппированных в соответствии с их действием.
         Так, например, под заголовком "Символьные операции"  приведена,  в
         частности, функция $BIN, которая  возвращает  двоичный  символьный
         эквивалент заданного числа, а также все остальные операции  работы
         со строками.
 
                                     Связывание
         CHAIN     Вызывает цепной  модуль  ТУРБО  БЕЙСИКА  (с  расширением
                   .ТВС).
         COMMON    Объявляет  переменную  (ые),   передаваемые   в   цепную
                   программу.
         RUN       Перезапускает программу.
 
 
 
                                         14

                                 Определение_данных
         DIM       Объявляет массивы.
         LET       Присваивает переменной значение.
         LOCAL     Объявляет локальные переменные в процедуре или функции.
         OPTION BASE Объявляет минимальное значение для индексов массива.
         REM       Отделяет програмные коментарии.
         SHARED    Определяет   разделяемые   (глобальные)   переменные   в
                   процедуре или функции.
         STATIC    Объявляет  статические  переменные   в   процедуре   или
                   функции.
         TRON/TROFF Включает и выключает трассировку выполнения.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                                         15

                                                                           
         ПРИЛОЖЕНИЕ D
         Сравнение Турбо-Бейсика с Интерпретаторным Бейсиком
        
         Существует три принципиальных различия между Т.Б. и И.Б.:
         1.Компилятор против Интерпретатора


         2.Расширение в Т.Б. языка Бейсик
         3.Реализация компилятора
         Каждая  из  этих  статей  определяет много других вторичных различий
     между реализациями этих двух Бейсиков,которые  будут  рассмотрены  здесь
     детально.
        
         Компилятор в сравнении с Интерпретатором
         ----------------------------------------
         В  Интерпретаторах  существует тенденция затушевывать различие между
     командами для создания программ и теми 6которые фактически  используются
     в  программах;другими  словами,системой  создания программы и собственно
     языком.Например,EDIT и AUTO не являются частью языка в том смысле,в  ка-
     ком его частями являются GOSUB и PRINT.Интерпретаторы исполняют програм-
     мный код в порядке его следования.Тогда как компиляторы сначала сканиру-
     ют  все исходные операторы,а затем генерируют исполнительный код для ис-
     ходных заявлений.Это последнее свойство позволяет Т.Б.  как  компилятору
     предупредить попадание ошибок в программный код.
         В следующем примере,где используется И.Б.:
         10 x=5
         20 if x=3 then goto 30:x=10:z="aaa"
         во-первых,если  Х  никогда  не равно 3,то операторы,следущие за then
     никогда не будут исполнены и синтаксическая ошибка,связанная с  попыткой
     назначить строку числовой переменной,никогда не будет обнаружена.Во-вто-
     рых,операторы  x=10 и z="aaa" никогда не будут исполнены,если x=3,потому
     что goto ориентировано на строку 30.Компилятор будет отмечать флагом лю-
     бой "мертвый код",как ошибку компилирования.
        
         Неподдерживаемые команды
         ------------------------
        
         Т.Б. благодаря его поистине полноэкранному редактору и командам воз-
     буждения из меню для вспомогательных функций ,не нуждается в любых  опе-
     раторах,относящихся  к загрузке,хранению и редактированию исходных прог-
     рамм;по этой причине они  из  Т.Б.  выпали.Соответствущие  команды  И.Б.


     обычно используются в режиме DIRECT и включают в свое число следущие:
         AUTO    (авто)                    LOAD    (загрузить)
         DELETE  (стереть)                 NEW     (новый)
         EDIT    (редактировать)           RENUM   (перенумеровать)
         LIST    (список)                  SAVE    (хранить)
         Т.Б. позволяет вам редактировать и создавать программы с использова-
     нием текстового редактора,так что у вас нет необходимости в командах для
     изменения  или  стирания программных строк(таких как EDIT и DELETE).Если
     вы желаете нарушить строку сразу же перемещайте курсор к специфицирован-
     ной  строке  и  нажимайте  Ctrl-Y.Точно  так  же  ,нет  необходимости  в
     LIST-вместо этого вы исполняете подходящие удары по клавишам для получе-
     ния желаемой части программы на экране.
         Функции  главного  меню  Т.Б.  обеспечивают выполнение некоторых за-
     дач,которые в И.Б. реализуются с применением SAVE,LOAD,и NEW.А поскольку
     в Т.Б. вы не нуждаетесь в нумерации строк,отпадает необходимость в  AUTO
     и RENUM.В Т.Б. не поддерживаются также и следущие команды:
         CONT (продолжать)
         Т.Б.  не  допускает повторный запуск прерванной программы.прерывание
     программы с помощью STOP или Ctrl-Break есть то же самое,что использова-
     ние оператора END (конец).
         MERGE (Слить)
         Т.Б. компилирует программы в исполнительный  код,поэтому  невозможно
     сливать воедино строки исходной программы во время исполнения.
         MOTOR (мотор)
         Кассетное  внешнее устройство,видимо ,не будет самой популярной осо-

                                     -202 -
          
          
     бенностью РС.
         USR (пользователь)
         Оператор CALL выполняет работу USR и даже более того.
        
         Операторы ,требующие модификации
         --------------------------------
        
         CALL ABSOLUTE (вызвать абсолютно)
         CALL ABSOLUTE принимает только целые параметры и было  включено  для


     обеспечения минимальной совместимости с И.Б..Т.Б. дает более мощные про-
     цедуры  для полного программирования на языке ассемблера CALL INTERRUPT и
     INLINE
         CHAIN (цепочка)
         сцепляемые программы должны компилироваться либо как .EXE-файлы,либо
     как .TBC-файлы,в зависимости от выбора переключателя меню опций  "Компи-
     лировать в .EXE" или "Компилировать в цепочку".В операторе COMMON и пер-
     воначальной,и  сцепленной программ общие переменные должны перечисляться
     в правильном порядке (хотя не обязательно с одинаковым именем).Вы не мо-
     жете исполнять оператор CHAIN ,когда прогон выходит  из  среды  Т.Б..Ис-
     пользование CHAIN возможно только при прогоне из DOS.Опции диапазона но-
     меров   строк   MERGE  и  DELETE  не  поддерживаются.DEFтип  (определить
     тип),TRON,TROFF(включить,выключить трассировку),OPTION BASE  (опциональ-
     ный базис).
         Эти  операторы  качественно отличаются от аналогичных И.Б.Т.Б. расс-
     матривает физическое положение каждого оператора в исходной  программе,а
     не  в исполнительном проходе обьектной программы.Другими словами,имеется
     ввиду,что положение этих операторов в период компилирования,а не прогона
     ,управляет их действием.Рассмотрим,в качестве примера  приведенную  ниже
     простую программу,где используется DEFтип:
         10 GOTO 30
         20 DEFINT X
         30 X=2.3
         40 PRINT X
         При  исполнении  этой  программы в И.Б. ,невозможно увидеть оператор
     определения типа в строке 20.Следовательно,используется  тип  переменной
     по  умолчанию(единичная точность),когда в строке 30 встречается перемен-
     ная X,а затем на экран выводится 2.3.
         Т.Б. рассматривает соображения касающиеся типа,попутно в период ком-
     пиляции.Поскольку оператор DEFINT физически предшествует первому появле-
     нию X,эта переменная становится целой и оператором PRINT выводится 2.
         DRAW (чертить),PLAY (играть)


         Оба эти оператора обеспечивают исполнение строк сложной инструкции,в
     результате чего вычерчивается требуемая графика или играется  заказанная
     музыка,соответственно.В  И.Б.  строчная  информация,которая обеспечивает
     приведение этих команд в действие,может  содержать  имена  строчных  или
     числовых переменных,заключенных в строке инструкций.Например,в И.Б. опе-
     раторами
         n=50
         play "t=n;c"
         устанавливается темп исполняемой музыки на 50 четвертых нот в минуту
     и  исполнение  ноты  с.Т.Б.  не может понять такую конструкцию,поскольку
     после компилирования вся информация  об  идентификаторе,ассоциируемой  с
     переменной  n,теряется.Однако вы можете добиться того же эффекта,пользу-
     ясь функцией VARPRT$:
         n=50
         play "t="+varprt$(n)+"c"
        
         Функциональные параметры
         ------------------------
         Что касается функциональных параметров,И.Б. дает вам возможность ис-
     пользовать то же самое имя переменной параметра.Т.Б. дает  сообщение  об
     ошибке по дублированию локальной переменной.
         RUN (прогон)
         Программа  на  Т.Б.  может исползовать RUN для загрузки и исполнения
     другой программы или повторного запуска себя  самой  ,но  не  существует

                                     -203 -
          
          
     способа  повторно  запустить  текущую программу с какой-либо точки,кроме
     начала;вы не можете специфицировать какую-либо опцию с номером строки.
        
         Преобразование программ Интерпретаторного бейсика в Турбо-Бейсик.
         -----------------------------------------------------------------
        
         Первый шаг в преобразовании программ на И.Б. в Т.Б. состоит в сохра-
     нении ее на диске в формате ASCII.Например,чтобы сохранить вашу програм-
     му,набирайте:
         SAVE "прогимя.txt",A
         опция "А" вызывает выписку И.Б.


текстового (ASCII) файла без  выпол-
     нения  символизации.Этот  файл  может непосредственно считываться в Т.Б.
     ,хотя если она больше 64К, вам придется разделять ее на отдельные главный
     и включаемые файлы до того,как ее можно будет редактировать или компили-
     ровать с помощью Т.Б.
        
         Расширения языка Бейсик
         ------------------------
        
         В Т.Б. добавлено много командных  возможностей  и  расширений  языка
     Бейсик.Ниже обсуждаются некоторые расширения.
         Структурированные операторы
         ---------------------------
         Как     усовершенствование    И.Б.,Т.Б.    используются    операторы
     IF/ELSEIF/ELSE/ENDIF и SELECT CASE для управления программным потоком  и
     поддержания легкого чтения программ.Новое блочно-структурированное заяв-
     ление  DO/LOOP  дает  возможность всеобьемлющего управления программными
     циклами с тестированием в начале и в конце цикла.
         Ввод/вывод двоичного файла
         ---------------------------
     Т.Б. поддерживает новый режим BINARY (двоичный) ввода и вывода файла.Ко-
     манды GET$(получить) ,PUT$ (ввести) и SEEK (найти)  предоставляют  прог-
     раммисту  очень низкий уровень управления файлом.Программам может считы-
     вать или записывать байты в файл и позиционировать файловый указатель на
     любом байте.
         Определения функций и процедур
         -------------------------------
         Определение функций в Т.Б. может быть в виде единственной строки,по-
     добной стандартным функциям  И.Б.,и  многострочным,допускающим  механизм
     более  структурированной  подпрограммы .Операторы SUB (подпрограмма) или
     ENDSUB (конец подпрограммы) дают возможность создавать процедуры.
         Т.Б. поддерживает процедуры и функции с истинной поддержкой  локаль-
     ных переменных.Для определения того,какие переменные будут проталкивать-
     ся на стек во время реккурсивного исполнения,используется оператор LOCAL.


         Интерфейс языка ассемблера
         ----------------------------
         Оператор CALL имеет в Т.Б. три формы:
         CALL  процедурыимя,CALL INTERRUPT и CALL ABSOLUTE.CALL INTERRUPT ис-
     пользует команду REG для подачи данных через буфер регистров.Вставляемые
     в строку (INLINE) байты языка ассемблера или .COM-файлы могутзаключаться
     в процедуры с использованием директивы $INLINE (в строку).
         Встроенные функции
         ------------------
         В отличии от И.Б.,трансцедентные функции Т.Б. возвращают  результаты
     двоичной точности.
         Новые команды
         ---------------
         В Т.Б. имеется много новых команд,а также опций для старых.В таблице
     частично перечислены улучшения И.Б.
         -------------------------------------------------------------------
         BIN$       возвращает двоичную форму целого
         -------------------------------------------------------------------
         BINARY     новый файловый режим для низкоуровнего доступа
         -------------------------------------------------------------------
         CEIL,FIX   плавающая точка для целых функций

                                     -204 -
          
          
         -------------------------------------------------------------------
         COMMAND$   возвращает трейлер командной строки
         -------------------------------------------------------------------
         CVMS,CVMD, транслирует существующие данные формата МИКРОСОФТ
         MKMS$,MKMD$
         -------------------------------------------------------------------
         DECR/INCR  альтернативный способ приращения и сбрасывания переменных
         --------------------------------------------------------------------
         DEFLNG,MKL$,CVL поддержка нового типа длинных целых
         --------------------------------------------------------------------
         DELAY ожидание n секунд (для независимых машинных задержек)
         --------------------------------------------------------------------


         DO/LOOP гибкая конструкция цикла в стандарте ANSI
         --------------------------------------------------------------------
         ERADR   адрес самой последней ошибки
         --------------------------------------------------------------------
         EXIT покидается цикл FOR/NEXT,WHILE/WEND или DO/LOOP,IF-блоковый,про
              цедура либо функция
         --------------------------------------------------------------------
         EXP2,EXP10 возвращается результат возведения в степень
         --------------------------------------------------------------------
         GET$  считываются данные из файлов в режиме BINARY
         --------------------------------------------------------------------
         IF/ELSEIF/ELSE/ END IF выполняется множественный тест если
         --------------------------------------------------------------------
         INLINE  вставляются байты непосредственно в обьектный код
         --------------------------------------------------------------------
         INSTAT  возвращается состояние клавиатуры
         --------------------------------------------------------------------
         LCASE$  преобразуется строка в нижний регистр
         --------------------------------------------------------------------
         LOCAL/SHARED/STATIC заявляются переменные процедур и функций
         --------------------------------------------------------------------
         LOG2,LOG10 возвращаются логарифмы по основанию 2 и 10
         --------------------------------------------------------------------
         MEMSET  определяется пространство в высокой памяти
         --------------------------------------------------------------------
         MTIMER  таймер тонкой разрешающей способности
         --------------------------------------------------------------------
         PUT$ записываются данные в файл в режиме BINARY
         --------------------------------------------------------------------


         REG считывание /запись буфера регистров
         --------------------------------------------------------------------
         SEEK определение позиции в файлах в режиме BINARY
         --------------------------------------------------------------------
         SELECT CASE мощные возможности тестирования по операторам CASE
         --------------------------------------------------------------------
         SUB/END SUB определяется процедура
         --------------------------------------------------------------------
         VARSEG возвращается адрес сегмента или переменной массива
         --------------------------------------------------------------------
         Если  вы непреднамеренно используете некоторые из этих резервирован-
     ных слов в качестве переменных6то получите  сообщение  о  синтаксической
     ошибке  периода компилирования.Для правильного компилирования выполняйте
     операцию найти и заменить с целью исправить конфликтный имена переменных.
        
         Реализация компилятора
         -----------------------
         Реализация компилятора затрагивает некоторые  существующие  Б.-прог-
     раммы,а также повышает возможности управления компилированием программ и
     генерированием  кода.Мы  уже  обсудили  ряд различий и расширений;другие
     важные моменты,которые проистекают из реализации Т.Б.,будут  обсуждаться
     в этом разделе.
         Редактор и большие программы
         -----------------------------

                                     -205 -
          
          
         Интегрированный  в Т.Б. редактор допускает размер исходной программы
     не более 64К.Директива $INCLUDE (включить) дает  возможность  компилиро-
     вать программы более 64 К.Если у вас есть программа более 64К,потребует-
     ся  расщепить  ее на несколько отдельных файлов.Для спецификациипрограм-
     мы,которую вы желаете запустить на компилирование в Т.Б. (если она отли-
     чается от файла,находящегося в данный момент в буфере редактора),исполь-
     зуйте опцию главного файла из меню.
         Редактор Т.Б. поддерживает строки шириной до 248 литер.И.Б.  поддер-
     живает строки шириной до 255 литер.Строки,которые длинее 248,будут авто-
     матически  разделяться возвратом каретки после колонки 248.Однако вы бу-
     дете продолжать нуждаться  в  привязке  правильности  форматообразования
     строк  перед загрузкой вашей программы в редактор Т.Б.Т.Б. также поддер-
     живает программы ,которые  больше  64К  исполнительного  кода.Директивой
     $SEGMENT специфицируется ,что будет генерироваться новый сегмент кодов,а
     все CALL/GOTO будут изменены на далекие вызовы и переходы.
         

Содержание раздела