выражение" задает величину угла в радианах. Чтобы преобразовать радианы в градусы, эту величину следует умножить на 57.296. Чтобы преобразовать градусы в радианы, следует разделить на 0.17453. (Обсуждение измерения угловых величин приведено в описании оператора ATN.) SIN возвращает результат двойной точности. Смотри также: ATN Пример: ' Зададим значение для b$, чтобы напечатать его в примере b$ = " Turbo Basic from Borland " ' найдем центр center = (79 - LEN(b$)) / 2 ' SIN(theta) возвращает повторяющуюся последовательность ' значений, плавно изменяющуюся в диапазоне от -1 до 1; ' поэтому tabValue всегда имеет значение между -center ' и +center tabValue = center * SIN(theta) PRINT TAB(center + tabValue + 1) b$ theta = theta + .1 WEND END ' конец программы Оператор SOUND Функция: SOUND генерирует звук заданной частоты и длительности. Синтаксис: SOUND частота, длительность Комментарии: Параметр "частота" является выражением целого типа, задающим желаемую высоту звука в диапазоне от 37 до 32767 герц. Параметр "длительность" является выражением в формате с плавающей запятой, значение которого управляет длительностью звучания, измеряемой в тиках таймера. Таймер работает с частотой 18.2 герца, поэтому значение этого параметра, равное 36, соответствует длительности звука около 2 секунд. Значение этого параметра должно лежать в диапазоне от 0.0015 до 65535 (один час). Оператор SOUND не задерживает выполнение программы. Когда в программе встречается этот оператор, то он инициирует заданный звук, а программа продолжает нормально выполняться. Если встерчается еще один оператор SOUND со значением параметра "длительность", равным 0, то звук, порожденный предыдущим оператором SOUND, прекращается. Если значением этого параметра является не 0, то Turbo Basic ждет завершения звука, порожденного предыдущим оператором, а заетм уже выполняет новый оператор SOUND. Для создания различных специальных эффектов (например, сирена, щелчки, шипение) лучше использовать SOUND, чем операторы, задающие музыкальное сопровождение. Ограничения: Заметим, что оператор SOUND инициализирует микротаймер MTIMER. Смотри также: PLAY Пример: ' Установим размер музыкального буфера 800 байтов $SOUND 100 ' 8 байтов на ноту ' Используем SOUND для создания звуковых эффектов ' Ниже имитируется звук переключения передач на мотоцикле ' первая передача FOR i = 150 TO 175 SOUND i, 2 NEXT i ' вторая передача FOR j = 125 TO 152 SOUND j, 1.5 NEXT j ' третья передача FOR k = 100 TO 127 SOUND k, 1.25 NEXT k Функция SPACE$ Функция: SPACE$ возвращает строку, состоящую из одних пробелов. Синтаксис: s$ = SPACE$(счетчик) Комментарии: Параметр "счетчик" является положительным целым выражением со значением, лежащим в диапазоне от 0 до 32767, которое определяет сколько пробелов возвратит эта функция. SPACE$ является одним из многих средств форматирования текстов, имеющихся в Turbo Basic. Смотри также: LSET PRINT USING RSET SPC STRING$ TAB Пример: ' зарезервируем 46 пробелов a$ = SPACE$(46) ' создадим строку из 46 символов b$ = "This is a string 46 characters long" ' сделаем то же самое, что и в a$, но используя клавишу ' "пробел" c$ = " " ' напечатаем длины символьных строк a$, b$ и c$ PRINT LEN9a$), LEN(b$), LEN(c$) PRINT PRINT "As you can see, by using the Space$ I can " PRINT "Give a$ same value as b$ and c$." END ' конец программы Функция SPC Функция: SPC вставляет n пробелов (используется в операторе PRINT). Синтаксис: PRINT SPC(n) Комментарии: n - выражение целого типа со значением в диапазоне от 0 до 255. В отличие от родственной функции TAB, SPC может использоваться только в списке выражений в операторах PRINT, LPRINT или PRINT #. SPC(n) вызывает печать n пробелов. Не путайте SPC с функцией SPACE$. Если n больше, чем ширина строки, заданная оператором WIDTH, то SPC вставляет (n MOD ширина) пробелов. Если SPC появляется в конце списка выражений с, или без, последующей точки с запятой, символ возврат каретки не выводится. Смотри также: TAB WIDTH Пример: ' Используя SPC напечатаем слова boy и girl ' с промежутком в 40 пробелов и подчеркнем их, ' используя функцию STRING$. PRINT SPC(5)"Boys" SPC(40) "Girls" PRINT SPC(5) STRING$(4,61) SPC(40) STRING$(5,61) FOR i = 1 TO 5 READ boy$ READ girl$ ' напечатаем имена каждого мальчика и девочки ' в соответствующей колонке PRINT SPC(5) boy$ SPC(40) girl$ NEXT i END ' конец программы DATA "John","Ann" DATA "Mark","Eve" DATA "Mike","Kathy" DATA "Paul","Elizabeth" DATA "Tony","Sue" Функция SQR Функция: SQR возвращает значение квадратного корня. Синтаксис: y = SQR(числовое выражение) Комментарии: Значение "числового выражения" должно быть больше или равно нулю. SQR вычисляет значение квадратного корня, используя более быстрый алгоритм, чем известный метод возведения в степень 0.5 (т.е. y = SQR(x) будет вычислено быстрее, чем y = x^.5). Попытка извлечь квадратный корень из отрицательного числа приведет к фиксации ошибки 5 в период выполнения - Illegal Function Call (Неправильный вызов функции). SQR возвращает результат с двойной точностью. Пример: ' Таблица значений квадратного корня ' разместим две колонки PRINT "NUMBER" TAB (10) "SQUARE ROOT VALUE" PRINT FOR N = 1 TO 10 ' используем TAB, чтобы печатать значения квадратного ' корня в соответствующей колонке; используем SQR для ' вычисления квадратного корня PRINT N, TAB(15) SQR(N) NEXT N END ' конец программы Оператор STATIC Функция: STATIC объявляет в процедуре или в функции статические переменные. Синтаксис: STATIC список переменных Комментарии: Оператор STATIC, который допустим только в определениях процедур или функций, устанавливает, что переменные, перечисленные в списке через запятые, будут иметь постоянные адреса в памяти, а не будут располагаться в стеке. Идентификатор, связанный со статической переменной, известен только в данной процедуре или функции; т.е. другие переменные в других частях программы и другие локальные переменные в других определениях могут иметь такое же имя. Оператор STATIC должен стоять в определении до выполняемых операторов. Чтобы объявить статическим массив, принадлежащий процедуре или функции, включите его идентификатор с пустой парой скобок в список переменных, а затем задайте размер массива в последующем операторе DIM. В отличие от локальных переменных, статические переменные не изменяют своего значения в промежутках между обращениями к данной процедуре или функции. Они инициализируются только при первоначальном запуске программы. Смотри также: LOCAL SHARED Пример: ' объявим статическую процедуру ' со статической переменной SUB Dummy STATIC 'переменная STATIC I% INCR I PRINT I END SUB 'конец процедуры Dummy I = 16 ' двойной вызов процедуры CALL Dummy CALL Dummy PRINT I END ' конец программы Функция STICK Функция: STICK возвращает информацию о положении джой-стика. Синтаксис: y = STICK(параметр) Комментарии: Единственный параметр является выражением целого типа со значением от 0 до 3, которое определяет следующее: ______________________________________________________ Параметр Действие ______________________________________________________ 0 Возвращает координату x джой-стика A 1 Возвращает координату y джой-стика A 2 Возвращает координату x джой-стика B 3 Возвращает координату y джой-стика B ______________________________________________________ Примечание: Из-за существующей конструкции интерфейса джой-стика необходимо сначала выполнить функцию STICK(0), чтобы были произведены соответствующие переключения, а затем уже считывать значение любой координаты любого джой-стика. Смотри также: STRIG(оператор) Пример: ' опросим джой-стик, чтобы ' определить его текущее положение WHILE NOT INSTAT LOCATE 15,15 PRINT STICK(0), STICK(1), STICK(2), STICK(3); WEND END ' конец программы Оператор STOP Функция: STOP останавливает выполнение программы. Синтаксис: STOP Комментарии: STOP завершает выполнение программы и возвращает управление операционной системе (или Turbo Basic, в зависимости от того, откуда программа была запущена). Оператор END выполняет ту же функцию, и его использование является более предпочтительным. Различия: В отличие от интерпретирующего BASIC, программы на Turbo Basic не могут быть продолжены после останова. Смотри также: END Пример: ' зададим бесконечный цикл DO ' останов, если нажата клавиша IF INSTAT THEN STOP LOOP END ' конец программы Функция STR$ Функция: Функция STR$ возвращает символьное представление числа. Синтаксис: y = STR$(числовое выражение) Комментарии: Функция STR$ возвращает символьное представление числовой переменной или выражения; т.е. то, что вы увидели бы на кране, если бы выполнили оператор PRINT числовое_выражение. Если числовое_выражение больше нуля, STR$ добавляет первым символом пробел; например, STR$(14) возвращает 3-х символьную строку, первый символ которой пробел. Обратной STR(x) фукцией VAL, которая берет символьный аргумент и возвращает число. Смотри также: VAL Пример: ' назначает а% числовое значение а% = 56.789 ' использует STR$ для возвращения числового значения а$ а$ = STR(a%) PRINT a%, a$ ' проверка того, что а% и а$ имеют одинаковые значения IF a% = VAL(a$) THEN PRINT "STR$ and VAL appear to work" END IF END 'конец программы Функция STRIG Функция: Функция STRIG возвращает сoстояние кнопок джой-стика. Синтаксис: y = STRIG(n) Комментарии: y - числовая переменная для запоминания результата. Функция STRIG(n) возвращает информацию о кнопках джой-стика, соответствующую значению n. n - числовое выражение, управляющее действием, выполняемым функцией STRIG, в соответствии со следующей таблицей: ------------------------------------------------------------- Значение n Возвращаемое значение ------------------------------------------------------------- 0 Если кнопка 1 джой-стика А нажата после последнего вызова функции STRIG(0), в озвращaется -1: В противном случае, STRIG возвращает 0. 1 STRIG возвращaет -1, eсли кнопка 1 джой-стика А была нажата в данный момент; в противном случае STRIG возвращает 0. 2 Если кнопка 1 джой-стика В была нажата после последнего вызова функции STRIG(2), STRIG возвращает -1; в противном случае, возвращает 0. 3 STRIG возвращaет -1, eсли кнопка 1 джой-стика В нажата в данный момент; в противном случае, STRIG возвращает 0. 4 Если кнопка 2 джой-стика А была нажата после последнего вызова функции STRIG(4), STRIG возвращает -1; в противном случае, возвращает 0. 5 STRIG возвращaет -1, eсли кнопка 2 джой-стика А нажата в данный момеент; в противном случае, STRIG возвращает 0. 6 Если кнопка 2 джой-стика В была нажата после последнего вызова функции STRIG(6), STRIG возвращает -1; в противном случае, возвращает 0. 7 STRIG возвращaет -1, eсли кнопка 2 джой-стика В нажата в данный момеент; в противном случае, STRIG возвращает 0. ------------------------------------------------------------- Перед вызовов функции STRING, вы должны разрешить проверку состояния кнопок джой-стика оператором STRIG ON. Используйте функцию STICK для считывания положения самого джой-стика. Смотри также: STICK Пример: Смотри пример в описании оператора STRIG. Оператор STRIG Функция: Оператор STRIG управляет обработкой прерываний от джой-стика. Синтаксис: STRIG{ON|OFF|STOP} Комментарии: Оператор STRIG управляет обработкой прерываний от джой-стика. STRIG ON разрешает проверку состояния кнопок джой-стика, так что функция STRIG может быть теперь задействована, и обработку прерываний от него, которая выполняется программой, определенной в операторе ON STRIG. STRIG OFF запрещает обработку прерываний от джой-стика. STRIG STOP запрещает реакцию программы на нажатие кнопки, но сохраняет в памяти это событие, так что, если оператор STRIG ON выполняется позднее, то соответствующее прерывание будет иметь место. Смотри также: ON STRIG Пример: 'разрешает обработку прерываний STRING(0) ON STRING(2) ON STRING(4) ON STRING(6) ON ' опрашивает состояние события для ' проверки нажатия кнопки WHILE NOT INSTAT LOCATE 1, 1 PRINT STRIG(0), STRIG(1), STRIG(2), STRIG(3) PRINT STRIG(4), STRIG(5), STRIG(6), STRIG(7) WEND END 'конец программы Функция STRING$ Функция: STRING$ возвращает строку, состоящую из нескольких копий указанного символа. Синтаксис: s$ = STRING$(счетчик,{значение|символьное выражение}) Комментарии: "Счетчик" и "значение" - целочисленные выражения. Значения "счетчика" находятся в диапазоне от 1 до 32767; "значение" изменяется от 0 до 255. STRING$ с числовым аргументом возвращает строку из копий символа, код ASCII которого равен "значению", а число копий равно значению "счетчика". STRING$ с символьным аргументом возвращает строку из копий первого символа "символьного выражения", число копий равно значению "счетчика". STRING$((n,32), STRING$(n," "), и SPACE$(n) - выполняют одни и действия - создают строку из n пробелов. Пример: ' STRIG и TAB строят прямоугольник ' используем 40 знаков равенства для ' построения верхней части прямоугольника, ' затем напечатаем top$ = STRING$(40,61) PRINT top$ ' используйте секундную задержку, чтобы можно было ' видеть построение прямоугольнока DELAY 1 ' используйте цикл для построения сторон FOR i=1 TO 5 PRINT TAB(1)"="TAB(40)"=" DELAY 1 NEXT i DELAY 1 ' используйте верхнюю строку для построения нижней PRINT top$ DELAY 1 ' найдите центр прямоугольника и ' напечатайте текст LOCATE 4,15 PRINT "THE MIDDLE" DELAY 1 ' поставьте курсор вне прямоугольника LOCATE 20,1 END 'конец программы Операторы SUB/END SUB, SUB INLINE Функция: SUB/END SUB и SUB INLINE определяют процедуру (подпрограмму). Синтаксис: SUB идентификатор [(список параметров)] [LOCAL список переменных] [STATIC список переменных] [SHARED список переменных] . . операторы . [EXIT SUB] END SUB Для SUB INLINE: SUB имя_процедуры INLINE Комментарии: Аргумент "идентификатор" представляет имя процедуры; он должен соответствовать соглашениям об именах, принятым в Turbo Basic. Аргумент "список параметров" представляет собой необязательную последовательность формальных параметров, разделенных запятыми. Параметры, используемые в этом списке, служат только для того, чтобы определить процедуру; Они не имеют никакой связи с другими переменными программы, имеющими те же имена. SUB и END SUB ограничивают и присваивают имя группе операторов, подобных подпрограмме и называемых процедурой (или подпрограммой), которая может быть вызвана оператором CALL с передачей параметров по значению или по ссылке. При работе со встроенными процедурами на языке ассемблера используется такая же вызывающая последовательность, что и при работе с обычными процедурами. Например: CALL имя_процедуры INLINE $INLINE список байтов $INLINE "COM Имя файла" END SUB Любое число операторов $INLINE может быть задано в любом порядке. Единственным ограничением является количество файлов COM в одной процедуре, которое не должно превышать 16. Заметим, что список параметров не надо задавать в определении SUB. Аргументы "список байтов" вводят константы или выражения со знеачениями в диапазоне от 0 до 255, разделенные запятыми. (Обычно, для задания байтов используются шестнадцатеричные константы.) Операторы возврата не нужны ни в процедуре на ассемблере, ни в конце оператора SUB. Компилятор сам определит ее конец. (Более подробная информация приведена в приложении C "Связь с языком ассемблера".) Определения процедур и ход выполнения программы. Расположение определений процедур в программе не имеет значения. Процедура может быть определена в строке 1 или в строке 1000 программы, независимо от того, где она используется. И вам не надо направлять процесс выполнения программы для обхода определения процедуры, компилятор сам найдет их и сделает это за вас. Кроме того, в отличие от подпрограмм, при выполнении программы вы не можете "случайно" попасть внутрь определения процедуры. С точки зрения хода выполнения программы, определения функций и процедур являются невидимыми. Например: CALL PrintStuff SUB PrintStuff PRINT "Printed from within PrintStuff" END SUB При выполнении этой программы из четырех строк сообщение появится на экране только один раз, т.к. Printstuff вызывается в первой строке. Определения процедур можно рассматривать как изолированные участки программы; нельзя ни войти, ни выйти из них посредством операторов GOTO, GOSUB или RETURN. В пределах определений, однако, эти операторы допустимы. Отметим, что определения функций и процедур не могут быть вложенными; т.е. вы не можете определить процедуру или функцию в определении другой процедуры или функции (хотя в определении процедуры или функции могут содержаться вызовы других процедур и функций). Параметры-массивы. Массивы, при передаче их в качестве параметров, объявляются посредством указания после имени количества размерностей массива в круглых скобках (но не элементов массива). Например: SUB CalcArray (a(2),sizDim1,sizdim2) объявляет, что процедура CalcArray ожидает передачи трех аргументов: двумерного массива из элементов обычной точности и двух скалярных переменных обычной точности. Как правило, через такие скалярные аргументы передается размер массива (количество элементов) по каждому измерению. Объявление локальных переменных. Чтобы объявить в процедуре локальные переменные, используйте в определении оператор LOCAL перед выполняемыми операторами. Например: LOCAL a%, b#, bigArray%() создает три локальные переменные: скалярные переменные a% и b# (целая и двойной точности, соответственно), и массив целого типа bigArray%. Для массива должна быть определена размерность: DIM DYNAMIC bigArray%(1000) Локальные массивы должны быть динамическими. Они автоматически уничтожаются при завершении процедуры. Статические и общие переменные По умолчанию, переменные, которые появляются в определениях процедур считаются локальными. Однако, это соглашение может быть изменено. Для этого надо в явном виде описать каждую переменную, используемую в процедуре. Используйте оператор SHARED для объявления переменных, которые должны быть глобальными для всей программы. Используйте для объявления переменных оператор STATIC, если вы хотите, чтобы они не теряли своих значений в промежутке между двумя обращениями к процедуре. Определение процедуры должно завершаться оператором END DEF, который обеспечивает возвращение управления на оператор, следующий в программе непосредственно после оператора вызова CALL. Используйте оператор EXIT SUB для выхода из процедуры в каком-либо другом месте, отличном от ее конца. Смотри также: $INLINE CALL EXIT SUB LOCAL SHARED STATIC Пример: DIM Array(1) ' объявление массива чисел SUB TestProcedure(I%, L&, S!, D#, E, A(1)) ' процедура выводит значения ' передаваемых ей параметров PRINT I%; L&; S!; D#; E; A(0) END SUB ' конец процедуры TestProcedure Integer% = 1 LongInt& = 2 SinglePre! = 3 DoublePre# = 4 Array(0) = 5 CALL TestProcedure(Integer%, LongInt&, SinglePre!,_ DoublePre#, Integer% ^2, Array()) END ' конец программы Оператор SWAP Функция: SWAP меняет между собой значения двух переменных. Синтаксис: SWAP переменная1, переменная2 Комментарии: Параметры "переменная1" и "переменная2" задают две переменные одного и того же типа. Если вы попытаетесь поменять значения у переменных разного типа (например, символьной и целой, или обычной и двойной точности), то компилятор зафиксирует ошибку 475 - Type Mismatch (несоответствие типа). SWAP удобен в использовании, т.к. два последовательных оператора присваивания не могут выполнить ту же операцию: a = b : b = a При выполнении второго присваивания переменная a уже не содержит свое первоначальное значение. Чтобы выполнить операцию обмена значениями без оператора SWAP, требуется ввести временную переменную и выполнить третье присваивание: temp = a : a = b : b = temp Пример: ' зададим значения a% и b% a% = 15 : b% = 17 ' напечатаем заданные значения на одной строке PRINT TAB(6)"The value of 'a%' is:"; a%_ TAB(42) " The value of 'b%' is:"; b% PRINT ' используем SWAP, чтобы поменять значения SWAP a%,b% ' напечатаем новые значения под старыми PRINT " The value of 'a%' is now"; a%_ TAB(38) " The value of 'b%' is now:";b% END 'конец программы Оператор SYSTEM Функция: SYSTEM завершает программу. Синтаксис: SYSTEM Комментарии: SYSTEM завершает программу и возвращает управление операционной системе (или Turbo Basic, в зависимости от того, откуда программа была запущена). Оператор END реализует ту же функцию, и его использование является предпочтительным. Смотри также: END STOP Пример: ' ответ равен 5 ans% = 5 ' отгадаем число FOR i = 1 TO 10 INPUT " Please enter a number between 1 and 10 "; x% ' если пользователь отгадает число, то выход из цикла IF x% = ans% THEN GOTO reward ' спросим пользователя, хочет ли он попробовать еще раз INPUT " Do you want to try another number (Y/N) "; x$ ' если пользователь хочет прекратить попытки, то выход IF UCASE$(x$) <> CHR$(89) THEN SYSTEM NEXT i reward: PRINT PRINT " You got it ! " END ' конец программы Функция ТAB Функция: TAB перемещает курсор на определенную позицию n (только для оператора PRINT). Синтаксис: PRINT TAB(n) Комментарии: n - целочисленнoе выражениe в диапазоне от 1 до 255. Так же как SPC, TAB может использоваться только в списке выражений операторов PRINT, LPRINT или PRINT#. Используйте оператор TAB для выравнивания колонок информации. Использование TAB в операторах печати Turbo Basic вызывает продолжение печати с n-ой позиции текущей строки. Если текущая позиция курсора находится уже дальше n (например, PRINT TAB(20) с курсором в позиции 30), то Turbo Basic переведет курсор на n-ую позицию следующей строки. Если TAB появляется в конце списка выражений оператора PRINT с последующей точкой с запятой или без нее, Turbo Basic не выводит возврат каретки; т.е., после TAB всегда предполагается точка с запятой. Смотри также: LPRINT PRINT PRINT# SPC Пример: ' программа считывает список друзей и номера телефонов ' затем, используя операторы PRINT и TAB, выводит их на дисплей ' зададим размерность двух массивов DIM friend$(1), phone$(1) ' печатает пустую строку, затем печатает ' имя и телефон в 5-ой и 40-ой позиции PRINT PRINT TAB(5) "NAME" TAB(40) "PHONE" PRINT FOR i=1 TO 5 READ friend$ READ phone$ ' печатает данные под заголовками PRINT TAB(5) friend$ TAB(40) phone$ NEXT i END 'конец программы DATA "John Blaze","423-4598" DATA "Ann Span","335-2343" DATA "Bill Write","668-9834" DATA "Mark Jones","425-5593" DATA "Dan Moore","438-4593" Функция TAN Функция: TAN возвращает значение тригонометрической функции тангенс. Синтаксис: y = TAN(числовое выражение) Комментарии: "Числовое выражение" задает значение угла, выраженное в радианах. Чтобы преобразовать радианы в градусы, умножьте на 180/pi. Чтобы преобразовать градусы в радианы, умножьте на pi/180. (Понятие радиана обсуждается в описании оператора ATN.) TAN возвращает результат с двойной точностью. Смотри также: ATN COS SIN Пример: DEFDBL a-z ' используя функцию арктангенса ATN ' зададим значение pi# pi = ATN(1) * 4 ' напечатаем значение pi# PRINT pi ' pi, деленное на 4 радиана, равно 45 градусам ' используя функцию тангенса, ' напечатаем результат PRINT TAN(pi / 4) END ' конец программы Системная переменная TIME$ Функция: TIME$ считывает и устанавливает время в системе. Синтаксис: Чтобы считать время: s$ = TIME$ Чтобы установить время: TIME$ = символьное выражение Комментарии: Системная переменная TIME$ содержит восьмисимвольную строку, которая представляет время, установленное на системных часах, в формате hh:mm:ss, где hh - часы (от 0 до 23), mm - минуты, ss - секунды. TIME$ не будет давать точное значение времени, если внутренние часы DOS не были точно установлены при последней загрузке компьютера. Присваивание значения переменной TIME$ соответствует установке часов системы. Задайте символьное выражение, содержащее информацию о времени (в 24-часовом формате) и присвойте его переменной TIME$. Информация о минутах и секундах может быть опущена. Например: TIME$ = "12" ' установка часов на 12 часов дня TIME$ = "13:01" ' установка часов на 1:01 дня TIME$ = "13:01:30" ' установка часов на 30 секунд после ' 1:01 дня TIME$ = "0:01" ' установка часов на 1 минуту после ' полуночи Если задаваемое значение часов, минут или секунд выходит за допустимый диапазон (например, задано значение минут 61), то фиксируется ошибка периода выполнения 5 - Illegal Function Call (Неправильный вызов функции). Используйте функцию TIMER, чтобы получить число секунд, прошедшее с момента загрузки системы. Пример: ' включим прерывания от таймера TIMER ON ' распечатаем время с системных часов PRINT " The time is now "; TIME$ ' зададим новое время INPUT " Please set a new time ( 0 to 23 )"; ANS$ ' установим новое значение TIME$ = ANS$ ' напечатаем новое значение времени PRINT " The new time is "; TIME$ END ' конец программы Функция TIMER Функция: TIMER возвращает число секунд, прошедшее с полуночи. Синтаксис: y = TIMER Комментарии: Функция TIMER не имеет аргументов и возвращает число секунд, прошедшее с полуночи, в виде числа с плавающей запятой обычной точности с разрешением около одной десятой секунды. Если с момента загрузки системы время не устанавливалось (либо командой DOS TIME, либо с помощью системной переменной TIME$), то TIMER возвращает число секунд, прошедшее с момента загрузки системы. Смотри также: MTIMER Пример: TIME$ = "12" PRINT USING "Noon is ##### seconds past midnight";TIMER END ' конец программы Оператор TIMER Функция: Оператор TIMER управляет разрешением прерываний от таймера. Синтаксис: TIMER {ON|OFF|STOP} Комментарии: Оператор TIMER управляет разрешением прерываний от таймера; т.е. он определяет, следует или нет передавать управление подпрограмме, заданной в операторе ON TIMER, по прошествии заданного числа секунд. TIMER ON разрешает прерывания от таймера. TIMER OFF запрещает их. TIMER STOP запрещает прерывания, но запоминает их так, что после выполнения впоследствии оператора TIMER ON, прерывание сразу произойдет. Смотри также: ON TIMER Пример: ' зададим программу обработки прерываний ON TIMER(2) GOSUB UpdateClock ' разрешение прерываний TIMER ON WHILE NOT INSTAT : WEND END ' конец программы UpdateClock: SaveX% = CSRLIN ' сохранение позиции курсора SaveY% = POS(0) LOCATE 24, 36 PRINT TIME$; LOCATE SaveX%, SaveY% ' восстановление позиции курсора RETURN Команды TRON и TROFF Функция: TRON и TROFF включает и выключает трассировку при выполнения программы. Синтаксис: TRON(включить трассировку) TROFF(выключить трассировку) Комментарии: TRON переключает вашу программу в режим отладки, при котором номера строк исходного текста, метки операторов, имена процедур и функций пересылаются в окно трассировки (Trace) при выполнении соответствующих операторов; TROFF выключает этот отладочный режим. При запуске программы в текстовом режиме под управлением Turbo Basic, трассируемые номера строк, метки и имена процедур и функций пересылаются в окно трассировки. В процессе трассировки используйте клавиши Alt-F9 для перехода от режима трассировки к режиму исполненияб, и обратно. Используйте Alt-F10 для разового перехода к следующему номеру строки, метке, или к процедуре или функции с заданным именем. Различия: В отличие от интерпретирующего BASIC, в Turbo Basic значение имеет физическое расположение операторов TRON и TROFF в исходной программе, а не в объектной программе во время исполнения. Например, рассмотрим программу: 10 GOTO 30 20 TRON 30 x = y + z 40 TROFF 50 END При исполнении этой программы, интерпретирующий BASIC никогда не начнет трассировку, поскольку оператор TRON в строке 20 никогда не будет выполнен. Turbo Basic, наоборот, принимает решение о необходимости трассировки в период компиляции и считает все операторы, следующие за оператором TRON, подлежащими трассировке. Поэтому эта программа, странслированная в Turbo Basic в результате выполнения выдаст на экран: [30] [40] Пример: ' зададим значения для X, Y, Z 10 X = 0 : Y = 1 : z = 2 20 GOTO 40 30 TRON ' при исполнении будут выведены номера строк 20, 30 ' и 40, а не их содержимое 40 X = Y + Z ' после отмены трассировки, ' будет напечатано значение X 50 PRINT X 60 TROFF 70 END ' конец программы Оператор UBOUND Функция: UBOUND возвращает наибольшую возможную границу (наибольший индекс) для массива, заданного оператором DIM. Синтаксис: UBOUND (массив(размерность)) Комментарии: "Массив" - массив, размерность которого установлена с помощью оператора DIM. "Размерность" - целая величина в диапазоне от 1 до числа размерностей массива. Для определения наименьшей границы индексов массива используйте функцию LBOUND. Смотри также: LBOUND OPTION BASE Пример: ' определяет нижнюю и верхнюю границы индексов массива DIM Array%(1900:2000) ' печатает значения массива FOR index% = LBOUND(Array%(1)) TO UBOUND(Array%(1)) PRINT "Array Element (";Index%;") is =";Array%(Indent5) NEXT Index% END Функция UCASE$ Функция: UCASE$ возвращает строку с символами на верхнем регистре. Синтаксис: s$ = UCASE$(символьное_выражение) Комментарии: UCASE$ возвращает строку, равную "символьному_выражению", за исключением того, что все алфавитные символы нижнего регистра в символьном выражении преобразуются в символы верхнего регистра. Смотри также: LCASE$ Пример: PRINT UCASE$("TB or not TB..."); Функция VAL Функция: VAL возвращает числовой эквивалент символьной строки. Синтаксис: y = VAL(символьное_выражение) Комментарии: Функция VAL преобразует свой символьный аргумент в число. Если "символьное_выражение" начинается с числовых символов (0 - 9, +, -, ., Е, Д), но также содержит нечисловые символы, тогда VAL возвращает число, сответствующее строке до нечисловых символов. Если "символьное_выражение" начинается не с числового символа, VAL возвращает 0. Начальные пустые символы (пробелы, табуляция) игнорируются. VAL часто используется в подпрограммах ввода, поскольку позволяет запрашивать пользователя символьные данные. Затем VAL преобразует данные в числовую информацию, как это требуется программе без риска вашего попадания нечисловых данных в числовые переменные; при этом в случае ошибки, можно вывести сообщение ? Redo From Start errors. (Повторить с начала?). Смотри также: STR$ Пример: ' строка адресного типа a$ = "34 N. Main St." ' строка без чисел c$ = "that's right, thirty four" ' числа с символами c$ = "+3.4e1 ' числа с пробелом в начале d$ = " 123 go" ' печатает числовое значение каждой строки PRINT VAL(a$), VAL(b$), VAl(c$), VAL(d$) END 'конец программы Функция VARPTR Функция: VARPTR возвращает адрес переменной. Синтаксис: y = VARPTR(переменная) Комментарии: Функция VARPTR возвращает смещение (относительный адрес) ячейки, в которой хранится "переменная". Такую адресную информацию иногда называют "указателем"; например, говорят, что VARPTR(x) возвращает "указатель на х". Благодаря расширенной модели памяти, используемой программами Turbo Basic, для полного определения адреса переменной требуется еще функция VARSEG. (VARSEG возвращает сегментную часть адреса). VARPTR в большинстве случаев используется для передачи подпрограммам на ассемблере адресов переменных. Когда вы используете VARPTR для получения смещения символьнойстроки или массива, не забывайте, что возвращаемое значение - это смещение описателя символьной строки или массива, а не самих данных из строки или массива. Смотрите в приложении C "Связь с языком ассемблера" описания форматов описателей символьных строк и массивов и карту распределения памяти периода выполнения программы. Смотри также: VARSEG Пример: B%=55 DEF SEG=VARSEG(B%) Address%=VARPTR(B%) PRINT PEEK(Address%) END 'конец программы Функция VARPTR$ Функция: VARPTR$ возвращает указатель на переменную в символьной форме. Синтаксис: s$ = VARPTR$(переменная) Комментарии: "Переменная" - любая числовая или символьная переменная или элемент массива. Функция VARPTR$ возвращает указатель на переменную в символьной форме и используется главным образом в операторах PLAY и DRAW для включения имен переменных в командные строки. Смотри также: DRAW PLAY VARSEC Пример: ' переключает в графический режим со средней ' разрешающей способностью SCREEN 1 Houses$ = "U20 G5 E20 F20 H5 D20 L30" DRAW Houses$ DRAW "BE3" DRAW "P1,3" FOR I% = 1 TO 280 STEP 40 DRAW "M = " + VARPTR$(I%) + ",40" DRAW I% NEXT I% END 'конец программы Функция VARSEG Функция: VARSEG возвращает адрес сегмента переменной. Синтаксис: y = VARSEG(переменная) Комментарии: "Переменная" - любая числовая или символная переменная или элемент массива. Благодаря расширенной модели памяти, используемой в Turbo Basic, для полного определения адреса переменной требуются две функции - VARSEG и VARPTR. VARSEG возвращает числовое значение в диапазоне от 0 до 65535. Используйте VARSEG в сочетании с VARPTR для определения адреса переменной, чтобы чеерез оператор CALL можно было сообщить подпрограмме на ассемблере, где в памяти размещается аргумент, который должен быть обработан. Программы в Turbo Basic помещают все скалярные переменные (не массивы) в один сегмент, длина которого может быть до 64К. Следовательно, при использовании VARSEG для всех скалярных переменных в данной программе всегда возвращается одно и то же значение. В действительности это значение сегмента является значением по умолчанию для операторов, которые ссылаются на оператор DEF SEG (например, PEEK, POKE). Когда вы используете VARPTR для получения смещения символьной строки или массива, не забывайте, что возвращаемое значение является сегментом описателя символьной строки или массива, а не данных для строки или массива. Смотрите в приложении C "Связь с языком ассемблера" описания форматов описателей символьных строк и массивов и карту распределения памяти периода выполнения программы. Смотри также: VARPTR Пример: 'B%=55 DEF SEG=VARSEG(B%) Address%=VARPTR(B%) PRINT PEEK(Address%) END 'конец программы Оператор VIEW Функция: VIEW определяет активную область (поле отображения) графического экрана. Синтаксис: VIEW [[SCREEN][(x1,y1)-(x2,y2)[,[цвет,[граница]]]] Комментарии: (x1, y1) - координаты верхнего левого угла, (x2, y2) - координаты нижнего правого угла поля отображения. "Цвет" - необязательный числовой аргумент; если он включен, то новое поле индикации заполняется этим цветом. "Граница" - необязательный числовой аргумент, если он включен, то Turbo Basic вокруг нового отображения нарисует рамку заданного цвета. Если этот аргумент опущен, то никакой рамки нарисовано не будет. VIEW определяет область графического экрана, куда может осуществляться запись или, наоборот, куда запись производиться не может. Попытки вывести точку вне поля отображения терпят неудачу; это называется отсечением графического изображения. Параметр SCREEN. Если параметр SCREEN опущен, будущие ссылки на точки считаются заданными относительно левого верхнего угла поля отображения, а не относительно левого верхнего угла экрана. Например, после VIEW(100,50) - (300,180) затем PSET(0,0) выводит точку с координатами (100,50). Если SCREEN включен, точки определяются обычным образом; т.е. относительно левого верхнего угла экрана. Например, PSET(0,0) ссылается на точку в левом верхнем углу экрана. Однако, только те точки, которые попадают в заданное поле отображения, являются видимыми (точки вне поля отображения отсекаются). VIEW без аргументов определяет весь экран как поле отображения. Использование оператора SCREEN для изменения экранного режима (например, перейти от режима среднего разрешения к режиму высокого разрешения) отменяет любые установки, сделанные ранее оператором VIEW. Когда поле отображения определено, CLS очищает только поле отображения. Смотри также: CLS SCREEN WINDOW Пример: SCREEN 1 FOR I = 0 TO 6 ' устанавливает поле отображения VIEW (10 * (I + 1), 10 * (I + 1))-_ (25 * (I + 1),25 * (I + 1)), I, 3 - I ' выводит на дисплей в поле отображения окружность CIRCLE (10, 10),I + 1, 3 - I NEXT I END 'конец программы Оператор WAIT Функция: WAIT ожидает заданное условие состояния аппаратуры. Синтаксис: WAIT интерфейс, n [,m] Комментарии: "Интерфейс" - выражение целого типа (в диапазоне от 0 до 65535), определяющее входной интерфейс аппаратуры. n и m - целые выражения в диапазоне от 0 до 255. WAIT останавливает выполнение программы, до тех пор, пока заданный интерфейс не выставит определенные сочетания битов. Над байтом, считанным с интерфейса выполняются операции исключающего ИЛИ с m и И с n. В случае нулевого результата, процесс повторяется. Если результат ненулевой, Turbo Basic продолжит выполнение программы со следующего оператора. Если m опущен, то WAIT использует его значение, равное 0. Пример: wait &H60,1 PRINT "hi" END Операторы WHILE/WEND Функция: WHILE и WEND образуют цикл с проверкой в начале. Синтаксис: WHILE целое_выражение . . [операторы] . WEND Комментарии: Если значение "целое_выражение" - ИСТИНА (т.е. оно не равно нулю), выполняются все операторы, заключенные между WHILE и завершающим WEND. Затем Turbo Basic выполняет переход на оператор WHILE и повторяет проверку, если результат все еще ненулевой, снова выполняются операторы тела цикла. Этот процесс повторяется до тех пор, пока проверяемое выражение не дает в результате ноль, после чего управление передается оператору, следующему за WEND. Если значение "целое_выражение" является ЛОЖЬ (нуль) при первой проверке, то не выполняется ни один из операторов тела цикла. Циклы, построенные с помощью операторов WHILE/WEND могут быть вложенными (заключены один в другой). Каждому WEND соответствует ближайший оператор WHILE. Если Turbo Basic встречает оператор WEND без предшествующего WHILE, то фиксируется ошибка 30 периода выполнения "WEND Without WHILE" (WEND без WHILE). WHILE без соответствующего WEND вызывает фиксацию ошибки 29 периода выполнения "WHILE Without WEND" (WHILE без WEND). Хотя для компилятора это и не имеет значения, сдвигайте операторы, заключенные между WHILE и WEND на два пробела вправо для того, чтобы сделать более наглядной структуру построенного цикла. Примечание: WHILE -1 ... WEND создает бесконечный цикл. Чтобы выйти из цикла WHILE/WEND до его завершения, используйте оператор EXIT WHILE. Смотри также: DO/LOOP EXIT Пример: ' устанавливает значение I, равное 0 ' и значение X, равное 10 I = 0 X = 10 ' выполняет цикл до I = 10 WHILE I < X ' добавляет 1 к значению I I = I + 1 ' смотри значение I PRINT "I = ";I ' ждет одну секунду DELAY 1 ' конец цикла, если условие не выполняется WEND PRINT PRINT "The value of I и X both = 10" PRINT I PRINT X END 'конец программы Оператор WIDTH Функция: WIDTH устанавливает длину логической строки. Синтаксис: WIDTH [{устройство| # номер файла},] Комментарии: "Размер" - выражение целого типа, со значением от 0 до 255, которое устанавливает новую длину строки. Необязательный параметр "устройство" - задает устройство, длина строки которого должна быть установлена. Допустимыми являются следующие имена устройств: SCRN:, LPT1:, LPT2:, LPT3:, COM1 и COM2. Если "устройство" опущено, то оператор WIDTH относится к дисплею (SCRN:). "Номер файла" - выражение целого типа, представляющее файл, открытый для вывода. В общем, оператор WIDTH определяет, сколько символов может быть "напечатано" на данном устройстве перед тем, как будет выведен символ "возврат каретки", хотя его точное действие изменяется в зависимости от устройства, к которому он относится. WIDTH размер или WIDTH "SCRN:",размер устанавливает ширину экрана. Единственно допустимыми значениями являются 40 и 80. Для монохромного дисплея недопустимым является также значение 40. Если для экрана установлен графический режим, то при изменении его ширины изменяется и графический режим. Например, если текущим режимом является режим высокого разрешения, то WIDTH 40 переводит экран в режим среднего разрешения. WIDTH устройство, размер определяет длину логической строки заданного устройства, если оно затем будет открыто. Если устройство уже было открыто, его установленная ширина не изменяется. Примечание: LPRINT неявно открывает принтер; следовательно, действие оператора WIDTH "LPT1:",размер будет немедленным. WIDTH #номер файла,размер сразу изменяет ширину устройства, заданного "номером файла". Устройства, на которые этот оператор действует, следующие: LPT1:, LPT2:, LPT3:, COM1: и COM2:. Каждый принтер имеет по умолчанию ширину строки 80 символов. Задание ширины строки 255 символов при формировании логической строки отменяет подсчет ее длины и вставление символов "возврат каретки". Пример: ' устанавливаем графический режим со средним значением SCREEN 1,0 PRINT " This is a sample of medium res graphics mode." DELAY 3 'ожидание 3 секунды ' используя WIDTH, устанавливаем графику с ' высоким разрешением WIDTH 80 PRINT " This is sample of Hi-res graphics mode " DELAY 3 ' переводит обратно в графический режим ' со средним разрешением WIDTH 40 PRINT " Note, the letters are bigger in medium graphics mode" DELAY 3 SCREEN 0,1 'текстовый режим WIDTH 80 PRINT " This is 80-character text mode " DELAY 3 ' 40-символьный текстовый режим WIDTH 40 PRINT " This is 40-character text mode " ' 80-символьный текстовый режим WIDTH 80 ' запрашивает, может ли принтер пользователя ' продолжать работу с этим примером INPUT " Are EPSON printer codes supported? (Y or N)"; ans$ 'конец, если ваш принтер не поддерживает коды принтера EPSON IF UCASE$(ans$) <> CHR$(89) THEN END LPRINT CHR$(15) 'устанавливаем физическую ширину WIDTH "LPT1:",130 'устанавливаем логическую ширину LPRINT "Testing in compressed mode set to 130 columns."; LPRINT " The same line continued to the end of the page." LPRINT CHR$(18) 'сброс WIDTH "LPT1:",80 END 'конец программы Оператор WINDOW Функция: WINDOW определяет графическую систему координат экрана. Синтаксис: WINDOW [[SCREEN](х1,y1)-(x2,y2)] Комментарии: (x1,y1) и (x2,y2) представляют собой две пары координат обычной точности. (x1,y1) представляют координаты нижней левой части экрана, а (x2,y2) представляют координаты верхней правой части экрана. Если вас не устраивает обычный метод адресации графического экрана в Turbo Basic от 0 до 314 (или от 0 до 639) и от 0 до 199 с началом координат в левом верхнемо углу экрана, оператор WINDOW позволяет вам выбрать свой способ адресации. Оператор WINDOW преобразует произвольно выбранные координаты "мира" (которые могут быть более удобными для выражения положения объектов в вашей программе) в "физические" координаты (адреса точек дисплея). Одним из применений оператора WINDOW является отображение дисплея на соответствующие координаты экрана, используемые в другой компьютерной системе. Например, графический дисплей Apple II состоит из 280 точек по горизонтали и 192 точек по вертикали. Оператор WINDOW WINDOW SCREEN (0,0) - (279,191) позволяет дисплею персонального компьютера типа PC использовать ту же самую схему адресации. После выполнения этого оператора, можно использовать на PC программу для Apple II, которая выводит точку в правом нижнем углу экрана Apple II. Например, PSET(279,191) выводит точку с физическими координатами 319,199 (в нижнем правом углу экрана PC). Другой пример: предположим, вы работаете с задачами, в которых удобнее описывать строки и, другие предметы в терминах координат, изменяющихся в большем диапазоне, а не от 0 до 199 и от 0 до 639, что обеспечивается стандартной адресацией экрана. В этом примере предположим также, что полезно иметь начало координат в центре дисплея, и положительные значения y увеличиваются при движении от начала координат вверх как в аналитической геометрии. Оператор WINDOW позволяет работать с экраном в графическом режиме со средним и высоким разрешением так, как если бы он действительно работал таким образом. WINDOW позволяет отображать весь диапазон чисел с обычной точностью на дисплей; например: WINDOW (-1E6,1E6) - (1E6,-1E6) создает координатную систему из 4 триллионов точек (2 миллиона на 2 миллиона). Точка с координатами (-1000000,1000000) отображается в верхнюю левую точку, (0,0) - в центр экрана, а (1000000,-1000000) - нижнюю правую точку. Это является аппроксимацией декартовой системы координат на плоскости: начало - в середине, положительные значения х возрастают вправо от начала, а положительные значения y - вверх от начала координат. После выполнения этого оператора, любая операция вывода на экран (CIRCLE, LINE и тому подобные) будет использовать новую координатную систему PSET (0,0) выводит точку в центр экрана. PSET (25000,25000) выводит точку немного вверх и вправо от центра экрана. Аргументы в WINDOW - числа обычной точности с плавающей запятой, позволяющие отображать экран на огромную область чисел (миллионы точек в двух измерениях) или маленькую область дробных чисел, расположенную между 0 и 1. Если в оператор WINDOW включено ключевое слово SCREEN, то новая координатная система будет сохранять по умолчанию свойство увеличения координаты y при движении вниз. Например: WINDOW SCREEN (1,-1) - (-1,1) создает координатную систему, в которой верх экрана соответствует координате y, равной -1 и низ экрана - координате y, равной 1. Любое отображение экрана на систему координат, установленное с помощью оператора WINDOW, отменяется при выполнении операторов RUN, SCREEN или WINDOW без аргументов. Функция PMAP выполняет масштабирование в соответствии с отображением, установленным текущим оператором WINDOW, но без вывода чего-либо на экран. Смотри также: COS PMAP Пример: ' устанавливает графический режим со средним разрешением SCREEN 1 pi=ATN(1)*4 ' определяем константу val1=5:val2=6: steps=400 'выбираем некоторые значения WINDOW (-1,1)-(1,-1) ' начало координат в центре ' движение по окружности FOR theta=0 to 2 * pi STEP 2 * pi/steps ' окружности с единичными радиусами radius=COS(2 * theta) ' преобразование в декартовые координаты x = radius * cos(val1 * theta) ' координаты с вращением y = radius * sin(val2 * theta) PSET(x,y) ' устанавливаем пиксель NEXT theta ' повторяем ' нажимаем любую клавишу для возврата в редактор WHILE NOT INSTAT : WEND END ' конец программы Оператор WRITE Функция: WRITE посылает данные, разделенные запятыми, на экран. Синтаксис: WRITE [список выражений] Комментарии: "Список выражений" - последовательность числовых и/или символьных выражений, разделенных запятыми или точками с запятой. Если "список выражений" опущен, выводится пустая строка. WRITE аналогичен оператору PRINT, за исключением того, что WRITE вставляет запятые между элементами в списке выражений, заключает символьные данные в двойные кавычки, и не вставляет пробел перед положительными числами. Cмотри также: PRINT Пример: ' Этот цикл считывает часть данных и печатает их, ' используя оператор PRINT. Затем печатает те же данные, ' используя оператор WRITE. FOR i = 1 TO 3 READ words$, number% PRINT words$ PRINT number% WRITE words$,number% NEXT i DATA " HELLO ",10," HOW ARE ",20," YOU ",30 END 'конец программы Оператор WRITE# Функция: WRITE# записывает данные в последовательный файл. Синтаксис: WRITE #номер файла, список выражений Комментарии: "Номер файла" - номер, связанный с устройством или файлом во время его открытия. "Список выражений" - последовательность числовых и/или символьных выражений, разделенных запятыми или точками с запятой. WRITE# аналогичен оператору PRINT#, за исключением того, что WRITE# вставляет запятые между элементами в "списке выражений", заключает символьные данные в двойные кавычки, и не вставляет пробел перед положительными числами. WRITE# предпочтительнее использовать для записи полей данных в последовательный файл, так как он автоматически разделяет переменные запятыми и заключает строки в кавычки. Это облегчает ввод записанных данных посредством оператора INPUT#. Cмотри также: PRINT# Пример: ' открывает последовательный файл для вывода OPEN "FILE.PRN" FOR OUTPUT AS #1 ' считывает данные из операторов DATA ' записывает их в файл. FOR I = 1 TO 6 READ info$ WRITE # 1,info$ NEXT I CLOSE 1 'закрывает файл END 'конец программы ' определяет данные DATA "Mike","Smith","12 Main St.","Paris","Ca","95066" Приложение А. Внутреннее представление чисел. Во время выполнения программы компилятору требуется иногда преобразовывать числа из одного внутреннего представления в другое, например, из вещественного в целое: a = 14.1 b% = a В таких случаях, компилятору требуется решить, что делать с избыточной или недостаточной точностью. Преобразования типов чисел осуществляются по следующим правилам: 1. В операторе присваивания точность определяется типом переменной в левой части равенства; например: b = 1.1 a% = b PRINT a% 2. При присвоении переменной с меньшей точностью значения числовой величины с большей точностью происходит округление; например: a% = 1.5 b = 123.456789 PRINT a%,b Заметим, однако, что Turbo Basic специальным образом рассматривает числа, содержащие 5 в дробной части. В этом случае число всегда округляется к ближайшему четному. Например, число 0.5 будет округлено до 0; 9.005 округляется до 9.000. 3. При преобразовании числа с меньшей точностью в число с большей точностью, точность результата не может превышать точность первого числа. Например, после выполнения присваивания, у переменной b# значащими являются только первые 6 цифр: a = 123.456 b# = a PRINT b# 4. При вычислении арифметических выражений все операнды преобразуются к типу самого точного операнда в выражении. Например, a = 1.1 : b# = 1.123456 c = a * b# PRINT a * b#, c Примечание: если выражение содержит операнды с обычной и двойной точностью, то результат будет иметь обычную точность. Числа с плавающей запятой в файлах с произвольным доступом. В связи с тем, что интерпретирующий Basic использует нестандартный формат записи чисел с плавающей запятой фирмы Microsoft, программы на Turbo Basic должны осуществлять специальное преобразование при чтении и записи в файлы с произвольным доступом данных в формате с плавающей запятой, созданных в интерпретирующем Basic. Функции MKMS$ и MKMD$ ("сделать Microsoft") создают числовые строки в формате Microsoft; функции CVMS и CVMD ("преобразовать Microsoft") преобразуют строки чисел в формате Microsoft в числа в формате Turbo Basic. Внутреннее представление четырех числовых типов. Целые числа представляются 16-битовыми (2 байта) величинами со знаком, причем отрицательное число хранится в виде двоичного дополнения. Младший байт числа имеет меньший адрес. Например, десятичное число 531, равное шестнадцатеричному 213H, хранится в 2-х байтах: 13H 02H (13H имеет меньший адрес). байт 0 байт 1 ----------------------------------- Шестнадцатеричное I 13H I 02H I ----------------------------------- Двоичное I 00010011 I 00000010 I ----------------------------------- Десятичное число -531 представляется двоичным дополнением к 213H, равным FDEDH, хранится в 2-х байтах: ED FD (ED имееет меньший адрес): байт 0 байт 1 ----------------------------------- Шестнадцатеричное I EDH I FDH I ----------------------------------- Двоичное I 11101101 I 11111101 I ----------------------------------- Двоичное дополнение получается инвертированием всех разрядов числа с добавлением единицы к младшему разряду. Длинные целые занимают 32 бита (4 байта).Отрицательные величины хранятся в виде двоичного дополнения. Младшее слово имеет меньший адрес, а младший байт каждого слова идет перед старшим. Например, десятичное число 79033, равное 000134B9H, хранится в виде последовательности байтов B9H 34H 01H 00H: байт 0 байт 1 байт 2 байт 3 ------------------------------------- Шестнадцатеричное I B9 I 34 I 01 I 00 I ------------------------------------- Двоичное 10111001 00110100 00000001 00000000 ------------------------------------- А десятичное число -79033 , равное двоичному дополнению числа 000134B9H, т.е. FFFECB47H, хранится в последовательности байтов 47 CB FE FF. Вещественные числа и компьютеры. Объем и плотность множества вещественных чисел бесконечны. Это означает, что на числовой оси множество простирается от минус до плюс бесконечности, а между любыми двумя его точками может находиться бесконечное множество точек (чисел). Например, между числами 17.1 и 17.11 находятся числа 17.101, 17.104, 17.1041 и т.д. Поскольку размер ячеек в компьютерах конечен, в них нельзя с абсолютной точностью представить трансцендентную систему чисел, а только лишь приближенно. На пути компромисса между качеством приближения (т.е. точностью), с одной стороны, и скоростью вычислений и объемом памяти, с другой, были выбраны два варианта представления вещественных чисел: числа с обычной и двойной точностью. Оба эти варианта представляют конечный, но достаточно большой набор дискретных величин на числовой оси c промежутками между соседними точками. Если в результате вычислений получается число, расположенное в одном из таких промежутков, осуществляется округление до ближайшего числа, которое может быть представлено в машине. Плотность представляемых чисел неравномерно распределена вдоль числовой оси. Между любыми двумя числами, представляющими последовательные степени числа 2, находится одинаковое количество представляемых в машине чисел. Например, между числами 1 и 2 и между числами 131.072 и 262.144. Другими словами, промежутки между представляемыми числами увеличиваются по мере удаления от нуля в обе стороны числовой оси. Следовательно, на определенном расстоянии от нуля дальше уже не существует представлляемых величин. Результат, выходящий за пределы, определяемые последними представляемыми значениями, называется переполнением. Переполнение и потеря значимости. Переполнение в формате с плавающей запятой происходит в том случае, когда результат вычислений больше максимального положительного или меньше минимального отрицательного представляемого числа. Благодаря большому диапазону представляемых чисел в Turbo Basic переполнение в формате с плавающей запятой происходит относительно редко. В отличие от целого переполнения, переполнение в формате с плавающей запятой всегда может быть зафиксировано. Потеря значимости происходит, когда результат находится в промежутке от нуля до первых представляемых чисел в отрицательном и положительном направлении на числовой оси. При потере значимости математические подпрограммы Turbo Basic устанавливают результат равным нулю; сообщение об ошибке при этом не выдается. Вещественные числа с обычной точностью. Числа с обычной точностью в Turbo Basic эквивалентны коротким вещественным числам в стандарте IEEE. Этот формат требует 4 байта памяти и имеет точность 6-7 десятичных знаков после запятой. Представляемые числа находятся в диапазоне 8.43 * 10E(-37) <= |x| <= 3.37 * 10E38 Числа с обычной точностью состоят из поля нормализованной мантиссы (23 бита), поля порядка (8 бит), смещенного на 7FH, и знакового бита (рис. A-1). Смещение 7FH перводит порядок в область положительных значений и равно разности между беззнаковым целым в поле порядка числа с плавающей запятой и действительным значением порядка, который представляет это число. _______________ Обычное | | | целое | S | Число | (Двоичное дополнение) |___|___________| 15 0 ______________________________ Длинное | | | целое I S | Число | (Двоичное |___|__________________________| дополнение) 31 0 Число с ______________________________ плавающей | | | | запятой | S | Смещенный | Мантисса | обычной | | порядок | | точности |___|___________|______________| 31 23 i 0 Число с _______________________________________________ плавающей | | | | запятой | S | Смещенный | Мантисса | двойной | | порядок | | точности |___|___________|_______________________________| 63 52 i 0 Пояснения: S - Знаковый бит (0 = положительное, 1 = отрицательное). dn - десятичная цифра (по 2 на байт). X - Биты, не имеющие значения: 80287 игнорирует их при загрузке и зануляет при записи. Позиция неявной двоичной точки. i - бит целого значения: запоминается во временных вещественных числах, неявно присутствует (всегда равен 1) в коротких и длинных вещественных числах. Смещение порядка (нормализованные числа): Короткие вещественные: 127 (7FH) Длинные вещественные: 1023 (3FFH) Временные вещественные: 16383 (3FFFH) Рис.A-1. Форматы данных. Вещественные числа с двойной точностью. Числа с двойной точностью в Turbo Basic эквивалентны длинным вещественным числам в стандарте IEEE. Этот формат требует 8 байтов памяти и имеет точность 15-16 знаков после запятой. Представляемые числа находятся в диапазоне 4.19 * 10E(-307) <= |x| <= 1.67 * 10E308 Числа с двойной точностью состоят из поля нормализованной мантиссы (52 бита), поля порядка (11 бит), смещенного на 3FFH, и знакового бита (рис.А-1). Следующий фрагмент программы демонстрирует использование вещественных чисел с обычной точностью. a! = 167.25 address = VARPTR(a!) ' address указывает на a! FOR n = 0 TO 3 ' используется сегмент по ' умолчанию byteval = PEEK(address+n) PRINT HEX$(byteval) NEXT n Представим число 167.25 в виде четырех байтов, соответствующих формату обычной точности. Для начала расположим байты таким образом, чтобы старший байт шел первым: 43 27 40 00 В двоичном формате получим: Шестнадцатеричое 4 3 2 7 4 0 0 0 Двоичное 0100 0010 0010 0111 0100 0000 0000 0000 А теперь выделим знаковый бит, порядок и нормализованную мантиссу. Знак Порядок Мантисса ------------------------------------------------ Двоичное I 0 I 10000110 I 01001110100000000000000 I ------------------------------------------------ Вычтем смещение 7FH из значения порядка: 86Н - 7FH = 7 (действительное значение порядка для двоичного формата) У мантиссы в нормализованной форме всегда предполагаются слева 1 и двоичная точка, поэтому действительное значение мантиссы 1.01001110100000000000000 Сдвинув двоичную точку вправо на 7 разрядов, получим исходное число: 10100111.0100000000000000 = 167.25 Приложение В. Обработка прерываний. В Turbo Basic имеется возможность реакции на внешние по отношению к программе события, известная как механизм обработки прерываний, что позволяет упростить и ускорить выполнение некоторых операций. Механизм обработки прерываний основан на периодической проверке возникновения различных событий, таких, например, как нажатие определенной клавиши, Код таких проверок автоматически генерируется компилятором и может осуществляться после выполнения каждого оператора вашей программы, обеспечивая наиболее быструю реакцию на событие. При возникновении некоторого события (прерывания) автоматияески вызывается подпрограмма обработки этого прерывания, написанная пользователем. Возможны проверки следующих событий: - Клавиши: Нажата клавиша F10?, или "пробел"?, или Shift-Alt-K?. Вы можете одновременно задать обработку прерываний от 20 различных клавиш. - - Таймер: управление передается на программу обработки прерывания от таймера по прошествии n секунд; например, это можно использовать для изменения показаний времени на экране каждые 60 секунд. - Нажатие кнопки на рукоятке управления. - Работа со световым пером. - Появление символов на последовательном интерфейсе (для решения задач связи). - Необходимость дозагрузки фонового музыкального буфера нотами. Перечень обрабатываемых прерываний содержится в разделе ON главы 5 "Справочное руководство по Turbo Basic" данного руководства. Большинство операторов типа ON событие GOSUB связаны с обработкой прерываний. Нет нужды явно указывать компилятору на необходимость генерации кода проверки события. Этот код автоматически включается в программу, когда компилятор встречает инструкции, требующие таких проверок. Пример. Пусть имеется достаточно сложная программа с несколькими меню для выбора различных возможностей и с несколькими экранами для вывода информации. Вам необходимо включить в нее вывод справочной информации о пользовании программой, например, о клавишах, используемых для редактирования полей данных, или для выхода из меню. Для простоты допустим, что эта справочная информация контекстно-независима, т.е. один и тот же текст появляется на экране независимо от того, в каком месте выполняемой программы ее затребовал пользователь. Пусть вывод справочной информации происходит при нажатии клавиши F1. Другими словами, при нажатии F1 в любой момент на экран будет выведена справочная информация. Механизм обработки прерываний в Turbo Basic позволяет создать подпрограмму выдачи справочного текста и вызывать ее без каких-либо усилий в любое время. Если бы не было такого механизма, вам нужно было бы проверять состояние клавиши F1 (посредством выполнения оператора GOSUB на эту подпрограмму) в каждом свободном от вычислений месте программы. Поскольку источником прерывания является клавиша (а не кнопка рукоятки или световое перо), вам необходимо использовать оператор ON KEY(n) для указания подпрограммы, которой передается управление при нажатии F1, где n - целое число, определяющее номер проверяемой клавиши. По соглашению, функциональной клавише F1 соответствует номер 1. ON KEY(1) GOSUB DispHelpText Эта строка означает следующее. Когда разрешены прерывания от клавиш, по выполнении каждого оператора проверяется, была ли нажата клавиша F1. Если да, то вызвается подпрограмма DispHelpText; если нет - выполняется следующий оператор. Подпрограмма DispHelpText представляет собой не что иное, как набор операторов PRINT. Поскольку нежелательно нарушать выполнение прерываемой программы, эта подпрограмма прежде всего сохраняет текущее положение курсора и восстанавливает его в конце работы. Подпрограмма печатает справочный текст на четырех нижних строках экрана, куда, по принятому соглашению, не может выводить текст любая другая часть программы. DispHelpText: oldscrx = POS(0) : oldscry = CSRLIN LOCATE 22,1 PRINT "This programm was shipped with a fantastic manual" PRINT "carefully prepared by professional writers" PRINT "at great expense" PRINT "It contains more information than you will ever need" INPUT "Use it. Press Enter to proceed`", dummy$ LOCATE 22,1 : PRINT SPACE$(320) LOCATE oldscrx, oldscry RETURN Теперь, когда создана подпрограмма обработки прерываний (которая будет получать управление при нажатии клавиши F1), разрешим прерывания с помощью оператора KEY(n): KEY(10) ON После выполнения этого оператора, Turbo Basic переходит в режим проверки возникновения прерываний. В промежутке между выполнением двух последовательных операторов он проверяет, была ли нажата клавиша F1. Если нет - выполняется следующий оператор, если да - вызывается подпрограмма DispHelpText. По возвращении из подпрограммы управление передается на следующий оператор из прерванной программы. Когда происходит прерывание, автоматически выполняется оператор "trap stop" (останов прерываний) с тем, чтобы подпрограмма не могла быть прервана повторно по тому же событию (и таким образом произошло бы переполнение стека). По выполнении последнего оператора подпрограммы (RETURN), автоматически исполняется оператор "trap on" (разрешение прерываний), если только в теле подпрограммы не был выполнен в явном виде оператор "trap off" (запрещение прерываний). В командах управления прерываниями вместо слова "trap" следует подставлять слова PEN, PLAY, KEY, STRING, TIMER и COM. Точная настройка механизма обработки прерываний. Механизм обработки прерываний - мощное, но дорогое средство. Поскольку ваша программа должна проверять возникновение указанных событий в промежутках между выполнением любых двух операторов, выполнение программы замедляется, что, в зависимости от применения, может привести к недопустимой потере времени. Кроме того, программа, осуществляющая обработку прерываний, имеет больший объем по сравнению с программой, не использующей данный механизм (по одному дополнительному байту на каждый оператор). Вы можете управлять генерацией кода проверки события в Turbo Basic с помощью метаоператора $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, используемого в интерпретирующем BASIC. KEY(10) OFF - это динамический оператор (исполняемый во время выполнения программы), который запрещает реакцию программы на нажатие клавиши F1, но не предотвращает самих проверок этого события, что приводит к потере времени, поскольку код проверок уже находится в программе после каждого оператора. $EVENT - оператор, исполняемый в период компиляции, который управляет включением самого кода проверки события в генерируемую программу. Если в некоторой части программы используется метаоператор $EVENT OFF для отмены генерации кода проверки события, то оператор KEY(1) ON не влияет на выполнение этой части программы. Приложение C. Связь с языком ассемблера. При решении некоторых прикладных задач на Turbo Basic может оказаться, что соответствующие программы выполняются слишком медленно или не могут выполняться вообще. Для решения этих проблем в Turbo Basic имеется возможность вызывать подпрограммы, написанные на ассемблере, а также выдавать запросы к DOS и BIOS. В Turbo Basic имеются 3 вида оператора CALL: 1. Вызов процедуры (CALL), которая может быть написана как на Turbo Basic, так и на встроенном (INLINE) языке ассемблера. Использование встроенного ассемблера - самое мощное средство связи с языком ассемблера. 2. Вызов подпрограммы на ассемблере, уже загруженной в память, с абсолютного адреса (CALL ABSOLUTE). Этот тип вызова сохранен для обеспечения минимальной совместимости с интерпретирующим BASIC. 3. Вызов по номеру вектора программного прерывания, по которому управление передается на программу обработки прерываний, написанную на ассемблере (CALL INTERRUPT). CALL INTERRUPT в основном используется для вызова функций DOS и BIOS. В главе 5 "Справочное руководство по Turbo Basic" обсуждается детально использование операторов CALL и SUB для вызова подпрограмм на Бейсике. В этом приложении мы рассмотрим использование данных операторов применительно к языку ассемблера. Отметим, что механизм связи с подпрограммами на ассемблере достаточно сложен. Вам необходимо серьезно познакомиться с основами языка ассемблера, перед тем как изучить это приложение. Оператор CALL ABSOLUTE. Оператор CALL ABSOLUTE используется для вызова из Turbo Basic подпрограмм на языке ассемблера, которые предварительно были загружены оператором BLOAD, или являются частью пространства данных программы. Например, операторы: DEF SEG = $H5000 MyAsmSub% = &H4000 CALL ABSOLUTE MyAsmSub% вызывают подпрограмму на ассемблере, расположенную в сегменте с шестнадцатиричным адресом 5000 (20480 десятичное) с шестнадцатиричным смещением 4000 (16384 десятичное). Этот адрес как правило, записывается в виде сегмент:смещение - 5000:4000. Синтаксис оператора: CALL ABSOLUTE <числовой идентификатор> [(список параметров)] где числовой идентификатор - скалярная переменная со значением в диапазоне от -32768 до +65535. Отрицательная величина представляется в виде двоичного дополнения. Эта переменная представляет собой смещение, которое в совокупности с последним объявленным оператором DEF SEG дает 32-битовый абсолютный адрес вызова. Если вы хотите использовать арифметическое выражение для представления адреса, то оно должно быть первоначально присвоено числовому идентификатору, и уже этот идентификатор указывается в операторе CALL. Дополнительные параметры должны быть только короткими целыми. Параметры передаются по ссылке с 16-разрядными указателями, занесенными в стек в порядке следования параметров слева направо. Все параметры находятся в основном сегменте данных, адресуемом регистром сегмента данных (Data Segment - DS). Этот тип вызова обеспечивает минимальную совместимость с интерпретирующим BASIC. Turbo Basic обеспечивает полный доступ к расширенным областям данных с помощью более мощных процедур SUB INLINE. По завершении работы подпрограмма на ассемблере должна выполнить межсегментный (дальний) возврат (RETURN) в основную программу, выполнение которой продолжается с оператора, следующего за CALL. На программисте лежит ответственность за сохранение регистров сегмента данных (DS), указателя базы (BP), сегмента стека (SS) и указателя стека (SP). Оператор CALL INTERRUPT. C помощью оператора CALL INTERRUPT вызывается подпрограмма на ассемблере, находящаяся по адресу, указанному в векторе прерываний с заданным номером. Этот тип вызова обычно используется для обращения к программам обработки прерываний DOS и BIOS, но может быть также использована для обращения к программам, написанным пользователем. Синтаксис: CALL INTERRUPT <целое выражение> где значение целого выражения лежит в пределах от 0 до 255. Перед вызовом подпрограммы необходимо установить соответствующие регистры с помощью оператора REG. Результаты работы подпрограммы возвращаются через эти регистры и хранится во внутренней области, отводимой компилятором, доступ к которой осуществляется с помощью функции REG. По окончании работы подпрограмма на ассемблере должна выполнить команду выход из прерывания (IRET) для возврата в основную программу. Выполнение программы продолжается с оператора, следующего за CALL. Программист должен следить за сохранением регистров сегмента стека (SS) и указателя стека (SP). Буфер регистров. При выполнении оператора CALL INTERRUPT передача и прием данных из подпрограммы осуществляется через буфер регистров. Это пронумерованная последовательность 16-битовых целых, в которойотражается состояние регистров процессора непосредственно перед и после выполнения оператора CALL INTERRUPT. Оператор REG засылает 16-разрядное содержимое целой переменной в указанный регистр, в соответствии с заданным числовым аргументом (от 0 до 9). Функция REG возвращает 16-разрядное содержимое указанного регистра, в соответствии с заданным числовым аргументом (от 0 до 9). Соответствие аргументов функции REG и регистров процессора приведено в следующей таблице: ___________________________ Аргумент Регистр ___________________________ 0 Флаги 1 AX 2 BX 3 CX 4 DX 5 SI 6 DI 7 BP 8 DS 9 ES ___________________________ Для загрузки значения в буфер регистров используйте оператор REG; например: REG 5,&H8000 загружает шестнадцатиричное число 8000 в регистр SI буфера. Заметим, что оператор REG не выполняет непосредственную загрузку или чтение из регистра процессора; чтение и запись осуществляются в промежуточный буфер. Чтобы прочитать число из буфера регистров, используйте функцию REG; например: y% = REG(1) заносит в целую переменную y% содержимое ячейки буфера регистров, соответствующей регистру AX. Снова отметим, что содержимое буфера регистров записывается в регистры процессора в начале выполнения подпрограммы и копируется из регистров по ее окончании. Обращение к функциям DOS и BIOS. Различные функции BIOS вызываются через векторы от 10H до 1FH. (Подробное описание BIOS можно найти в Техническом справочном руководстве по DOS фирмы IBM). Вектор прерывания 21H (33 десятичное) представляет особый интерес, так как через него реализуется общий механизм вызова в DOS. Номер запроса заносится в старший байт (AH) регистра AX, а дополнительные параметры - в другие регистры, по мере необходимости. В DOS имеется множетво полезных функций, обратиться к которым можно с помощью этого механизма. Более подробная информация приведена в Справочном руководстве по DOS. В качестве примера рассмотрим функцию FNFreeSpace, которая возвращает размер свободного пространства на диске: DEF FNFreeSpace(drive%) ' функция DOS 36H возвращает число ' свободных кластеров на указанном ' диске; 0 = диск по умолчанию, ' 1 = A:, 2 = B:, и т. д. REG 4,drive% ' записать номер диска в DX REG 1,&H3600 ' AH = номер функции CALL INTERRUPT &H21 ' свобод.место = число своб.кластеров * число байт в секторе ' * число секторов в кластере ' = BX * CX * AX FNFreeSpace = CSNG(REG(2)) * REG(3) * REG(1) END DEF После такого определения, функция FNFreeSpace может быть вызвана как и любая другая функция: ' Cколько свободного места на текущем диске? PRINT FNFreeSpace(0) Вызов встроенных подпрограмм на ассемблере (CALL INLINE). Последовательность вызова втроенных подпрограмм на ассемблере и обычных процедур Turbo Basic одна и та же. Изменяется лишь определение для процедуры SUB, задающее программу на языке ассемблера. Это наиболее эффективный способ программирования на ассемблере в Turbo Basic. Синтаксис: CALL <имя процедуры> [(список параметров)] Синтаксис: SUB <имя процедуры> INLINE $INLINE <список байтов> $INLINE "Имя COM файла" END SUB Допускается любое количество операторов $INLINE в любом порядке. Единственное ограничение в любой процедуре максимально можно использовать 16 файлов типа COM. Списки байтов состоят из констант или выражений со значениями от 0 до 255, разделенных запятыми. Обычно используют шестнадцатиричные константы(&H4C,&H90). Операторы возврата не допускаются ни из тела подпрограммы, ни в конце процедуры SUB. За этим следит компиллятор. Чтобы осуществить выход из подпрограммы до ее завершения, необходимо просто сделать переход на метку, обозначающую конец встроенного кода. Заметим, что в операторе SUB нельзя задавать список параметров. Программист должен обеспечивать сохранение регистров сегмента данных (DS), указателя базы (BP), сегмента стека (SS) и указателя стека (SP). Передача параметров во встроенные процедуры. Параметры заносятся в стек в виде 32-разрядных указателей на элементы данных (кроме передачи целиком массивов). Параметры заносятся в стек в порядке их следования слева направо. Передача числовых переменных. Числовые переменные (целые и с плавающей запятой) передаются посредством 32-разрядных указателей на данные. Форматы чисел описаны в Приложении A "Внутреннее представление чисел". Передача символьных строк. Параметры в виде символьных строк (кроме передачи целиком символьных массивов) передаются в виде 32-разрядного указателя на 4-байтовый дескриптор строки. Его первые два байта содержат длину строки, другие два - смещение строки в сегменте символьных строк. Примечание: Старший разряд в первом слове дескриптора необходимо игнорировать, т.к. он не используется (зарезервирован), но может оказаться установленным в 1. Этот бит нужно очищать перед использованием слова в качестве длины строки, но значение этого бита в памяти изменять нельзя. Примечание: Можно изменять содержимое строки, но не ее длину. Указатель на сегмент символьных строк находится в первом слове сегмента данных по умолчанию (слово по адресу DS:0). Дескриптор строки имеет следующий формат: Байты 0,1 : Длина строки (Старший бит не используется); 2,3 : Смещение данных в сегменте символьных строк. Передача массивов. Массивы передаются посредством занесения в стек 60-байтного дескриптора массива. Формат дескриптора следующий: Байты 0,1 : Адрес сегмента, содержащего массив. Первый элемент всегда начинается со смещения 0. Для динамических массивов адрес равен нулю до тех пор, пока не будет задана размерность массива. 2 : Тип элементов массива: 0 = целый; 2 = длинный целый; 4 = с плавающей запятой обычной точности; 6 = с плавающей запятой двойной точности; 8 = резерв; 10 = символьная строка. 3 : Размерность (число индексов). 4,5 : Число элементов в массиве. 6,7 : Длина элемента массива: 2 байта = целый; 4 байта = длинный целый; 4 байта = с плавающей запятой обычной точности; 8 байтов = с плавающей запятой двойной точности; 4 байта = дескриптор символьной строки. 8,9 : Нижняя граница первого индекса. 10,11: Верхняя граница первого индекса. Следующие 6 байтов повторяются для каждого следующего индекса (всего может быть до восьми индексов). Байты 12,13: Зарезервированы. 14,15: Нижняя граница сдедующего индекса. 16,17: Верхняя граница следующего индекса. Предупреждение: Некоторые байты дескриптора массива зарезервированы и могут изменяться в следующих версиях компилятора. Мы настоятельно рекомендуем передавать число элементов, а также первый и последний элементы массива и использовать соответствующие указатели. Элементы массива всегда хранятся в непрерывной области памяти (по строкам). Передача значения выражения. Значение выражения можно передавать в подпрограмму на ассемблере, но при этом вы не можете гарантировать тип числовых данных, которые могут получиться. Рекомендуется присваивать значение выражения переменной и передавать уже эту переменную. Передача констант. Константы можно передавать в подпрограмму на ассемблере, но при этом необходимо задать их тип. Чтобы сделать это, ставьте после константы идентифицирующий символ (%, &, ! или #). Создание файла INLINE.COM. Можно создать файл INLINE.COM с помощью отладчика (например, DEBUG, которы поставляется на системном диске DOS) или макроассемблера (приобретается отдельно). Использование отладчика DEBUG для создания файла .COM. В отладчике DEBUG вы можете использовать команду A(ассемблер), чтобы ввести текст программы на ассемблере; с помощью команды N(имя) файлу, в который будет помещен текст программы, присваивается имя с расширением .COM, а по команде W (запись) этот файл записывается на диск. Описание программы DEBUG дано в руководстве по DOS. Использование макроассемблера для создания файла .COM. Чтобы создать файл .COM с помощью макроассемблера, в действительности необходимо использовать 4 программы: редактор (например, SideKick), макроассемблер, компоновщик, и программу EXE2BIN. Сначала наберите текст программы на ассемблере в редакторе. Затем с помощью макроассемблера создайте объектный файл. После этого создайте выполняемый (.EXE) файл с помощью компоновщика (это может быть программа LINK на системном диске DOS или компоновщик, поставляемый с вашим макроассемблером). И наконец программа EXE2BIN (она имеется на системном диске) преобразует выполняемый файл в файл типа .COM. Для автоматизации этого процесса можно использовать следующий командный файл: MASM %1 LINK %1 EXE2BIN %1 %1.COM Вот некоторые рекомендации для успешного преобразования файлов ассемблерных программ из типа .EXE в тип .COM, используемый в Turbo Basic: - Не включайте в программу сегмент стека (компоновщик выдаст сообщение об ошибке No Stack Segment (нет сегмента стека), но вы игнорируйте его). - Используйте в командах только относительную адресацию как для данных, так и для программы. - Желательно хранить все локальные данные в стеке и использовать для обращения к ним адресацию относительно стека. - Используйте оператор ORG 100H в начале программы. - Сохраняйте регистры сегмента данных (DS), указателя базы (BP), сегмента стека (SS) и указателя стека (SP). Пример использования встроенных подпрограмм на ассемблере. Рассмотрим программу, в которой нужно быстро записать ненулевую величину, скажем 100, в каждый из 200 элементов массива целого типа. Это можно было бы сделать с помощью такого цикла: DEFINT a-n DIM a(199) FOR n = 0 TO 199 a(n) = 100 NEXT n К сожалению, в данном конкретном случае такая поэлементная пересылка слишком медленна. Можно ускорить решение этой задачи, записывая число 100 в массив с помощью программы на ассемблере. Как упоминалось ранее, в Turbo Basic можно вызвать процедуру на ассемблере точно так же, как и обычную процедуру на BASIC. В определении процедуры указывается, что используется встроенный код на ассемблере. Рассмотрим следующую программу: DEFINT A-Z DIM ARRAY(200) CALL FILL(ARRAY(0)) FOR I = 0 TO 199 PRINT ARRAY(I) NEXT I END SUB FILL INLINE $INLINE &H55 'push BP сохранить BP в стеке $INLINE &H89,&HE5 'mov BP,SP записать SP в BP $INLINE &HC4,&H7E,&H06 'les DI,[BP+6] адр.смещ.парам. $INLINE &HB8,&H64,&H00 'mov AX,64H константа 100 $INLINE &HB9,&HC8,&H00 'mov CX,C8H длина массива $INLINE &HFC 'cld очистить флаг направления $INLINE &HF3 'rep записать значения $INLINE &HAB 'stosw $INLINE &H5D 'pop BP восстановить BP END SUB Встроенная подпрограмма на ассемблере FILL ничего не знает о массивах. Она лишь загружает в память константу заданное число раз, начиная с заданного начального адреса. Передача в качестве параметра первого элемента массива ARRAY реализует такое задание. Простой вариант распределения памяти в периоды выполнения программы представлен на рис.С-1. 0000:0000 ---------------------------------- I DOS I I--------------------------------I I Другие резидентные I(SideKick, I программы I SuperKey, I I Lightning) I--------------------------------I I Turbo Basic I I Система выполнения I I программы I I Область данных I I Стек периода выполнения I FRE(-2) I--------------------------------I I Область программы I До 16 сегментов I пользователя I программы I I пользователя I I по 64К каждый I--------------------------------I YYYY:0000 I Сегмент скалярных величин I I Константы I I Скалярные переменные I I Дескрипторы символьных строк I I Дескрипторы массивов I I--------------------------------I YYYY:FFFF I Пространство массивов I FRE(-1) XXXX:0000 I--------------------------------I I Сегмент символьных строк I FRE(S$) XXXX:FFFF I--------------------------------I I Свободное пространство I MEMSET I--------------------------------I I I A000:FFFF I--------------------------------I Рис.С-1. Распределение памяти в период выполнения программы. Приложение D. Сравнительная характеристика Turbo Basic и интерпретирующего Basic. Существуют три принципиальных различия между Turbo Basic и интерпретирующим Basic: 1. Первый является компилятором, а второй - интерпретатором. 2. Turbo Basic имеет ряд расширений по отношению к стандартному языку Basic. 3. Отличия, связанные с использованием компилятора. С каждым из них связано множество более мелких различий между двумя версиями языка Basic, которые мы здесь детально рассмотрим. Отличия компилятора от интерпретатора. В интерпретаторах размываются различия между командами для создания программ и собственно операторами языка, другими словами, между системой разработки программы и самим языком. Например, команды EDIT и AUTO не являются частью языка в отличие от операторов GOSUB и PRINT. Интерпретаторы выполняют по очереди каждый оператор программы. Компиляторы, напротив, сначала просматривают весь исходный текст программы, а затем генерируют для всей программы машинный код. Это свойство позволяет Turbo Basic, как компилятору выявлять такие ошибки в программе, которые никогда не выполнились бы интерпретатором. Рассмотрим следующий пример с использованием интерпретирующего Basic: 10 X = 5 20 IF X = 3 THEN GOTO 30 : X = 10 : Z = "AAA" Прежде всего, так как X никогда не равен 3, то операторы, следующие за THEN, никогда не будут выполняться интерпретатором, и синтаксическая ошибка присвоения символьного значения числовой переменной никогда не обнаружится. Во-вторых, операторы X = 10 и Z = "AAA" не будут выполняться даже при X = 3, так как при этом будет выполнен оператор перехода на 30-ую строку GOTO 30. Компилятор же пометит любой такой "бесполезный" оператор как ошибочный во время компиляции. Команды, не поддерживаемые в Turbo Basic. Так как в Turbo Basic имеется свой экранный редактор, а также возможность выполнения дополнительных команд с помощью меню, то у него нет необходимости в командах, связанных с загрузкой, сохранением и редактированием исходных программ; поэтому они могут быть исключены. Соответствующие команды интерпретирующего Basic, обычно используемые в непосредственном режиме (DIRECT), и включают: AUTO LOAD DELETE NEW EDIT RENUM LIST SAVE Turbo Basic позволяет создавать и изменять программы с помощью текстового редактора, так что нет необходимости в командах изменения и удаления строк программы (таких как EDIT или DELETE). Если требуется удалить строку, нужно подвести к ней курсор и нажать Ctrl-Y. Также не нужна команда LIST - с помощью соответствующих клавиш вы можете получить на экране текст нужной вам части программы. Функции главного меню Turbo Basic выполняют те же действия (и даже больше), что и команды SAVE, LOAD и NEW в интерпретирующем Basic. Не нужны также команды AUTO и RENUM, так как номера строк в Turbo Basic не используются. Следующие команды также не поддерживаются в Turbo Basic: CONT - в ТБ нет возможности продолжить выполнение прерванной программы. Останов программы по оператору STOP или Ctrl-Break аналогичен выполнению оператора END. MERGE - Turbo Basic компилирует программы в исполняемый машинный код, поэтому невозможно объединять строки исходной программы во время ее выполнения. MOTOR - кассетные магнитофоны не самые распространенные устройства ввода-вывода на ПЭВМ. USR - оператор CALL эквивалентен оператору USR и даже имеет более широкие возможности. Модифицированные операторы. CALL ABSOLUTE. Допускает только параметры целого типа и включен в Turbo Basic для обеспечения минимальной совместимости с интерпретирующим Basic. Turbo Basic предоставляет более мощные средства для программирования на ассемблере - CALL INTERRUPT и встроенные ассемблерные процедуры. (Более подробная информация приведена в Приложении С "Связь с языком ассемблера".) CHAIN. Связанные оператором CHAIN программы должны компилироваться как файлы типов .EXE или .TBC (посредством задания команды Compile to EXE или Compile to Chain в меню компилятора Options). Общие переменные в операторах COMMON как в главной, так и в связанных с ней программах должны располагаться в одинаковом порядке (хотя и необязательно с одинаковыми именами). Оператор CHAIN не выполняется при запуске программы в среде Turbo Basic. Его можно использовать только при запуске программы из DOS. Команды MERGE и DELETE <диапазон номеров строк> не поддерживаются. DEFтип, TRON, TROFF, OPTION BASE. Действие этих операторов в Turbo Basic немного отличается от стандарта интерпретирующего Basic. Turbo Basic учитывает физическое расположение операторов в исходной программе, а не их расположение в последовательности выполнения объектной программы. Другими словами, на работу программы большее влияние оказывает расположение операторов во время компиляции, а не во время выполнения. Рассмотрим оператор DEFтип в следующем примере: 10 GOTO 30 20 DEFINT X 30 x = 2.3 40 PRINT x При выполнении этой программы интерпретирующий Basic никогда не увидит оператор в строке 20. Таким образом, для переменной X в строке 30 он применяет тип по умолчанию (с плавающей запятой обычной точности) а затем печатает значение 2.3. Turbo Basic, напротив, во время компиляции сначала просматривает все объявления типов. Так как оператор DEFINT физически предшествует первому вхождению переменной X, последняя становится целой и на печать выдается значение 2. DRAW, PLAY. Оба эти оператора выполняют сложные последовательности команд, связанные с выводом графических изображений и музыки, соответственно. В интерпретирующем Basic командные строки могут содержать имена символьных или числовых переменных в символьномвиде, которые оказываются встроенными в символьную строку. Напрмер, операторы интерпретирующего Basic: n = 50 PLAY "T=n; C" задают такт мелодии 50 четвертных нот в минуту и звучание ноты "До". В Turbo Basic такая конструкция не работает, так как после компиляции вся информация об идентификаторе, связанном с переменной n, исчезает. Однако, в Turbo Basic для выполнения тех же действий используется функция VARPTR$ : n = 50 PLAY "T=" + VARPTR$(n) + "C" Параметры функции. В интерпретирующем Basic можно использовать параметры функции с теми же именами, что и переменные. Turbo Basic в этом случае зафиксирует ошибку - одинаковые имена у локальных переменных. Команда RUN. Программы на Turbo Basic могут использовать команду RUN для загрузки и выполнения другой программы или своего перезапуска. Однако перезапуск может быть осуществлен только с начала программы, так как нет возможности задать номер строки, т.е. перезапустить текущую программу с произвольного места. Преобразование программ интерпретирующего Basic в программы на Turbo Basic. Первый шаг преобразования программы - сохранить ее на диске в формате ASCII. Например, чтобы сохранить вашу текущую программу, напечатайте: SAVE "progname.txt",A Параметр А указывает интерпретирующему Basic, что необходимо записать текстовый (ASCII) файл без выполнения маркирования. Этот файл будет непосредственно читаться в Turbo Basic. Если размер файла превышает 64К, необходимо разделить его на главный и включаемые файлы перед редактированием или компиляцией с помощью Turbo Basic. Расширения, введенные в Turbo Basic. В Turbo Basic имеются несколько дополнительных конструкций, расширяющих стандартный язык Basic. Некоторые из этих конструкций описываются ниже.(Более подробно см. Главу 5 "Справочное руководство по Turbo Basic). Структурированные операторы. Для управления ходом выполнения программы и обеспечения ее удобочитаемости введены дополнительные операторы IF/ELSEIF/ ELSE/END IF и SELECT CASE. Новый блочный оператор DO/LOOP позволяет управлять выполнением циклов, проверяя условие цикла в начале и конце цикла. Ввод/вывод двоичных файлов. Turbo Basic поддерживает новый режим ввода/вывода файлов - BINARY. Функции GET$, PUT$ и SEEK позволяют работать с файлами на самом низком уровне. Программа может читать и писать файл по байтам, а также устанавливать указатель файла на любой байт. Определения функций и процедур. Определения функций в Turbo Basic могут располагаться как на одной строке (как в интерпретирующем Basic), так и на нескольких строках, что дает возможность создавать подпрограммы с более сложной структурой. Операторы SUB и END SUB позволяют определять процедуры. (Более подробно см. в Главе 4 раздел "Подпрограммы, функции и процедуры"). Turbo Basic поддерживает рекурсивные процедуры и функции с использованием локальных переменных. Оператор LOCAL указывает, какие переменные будут засылаться в стек при выполнении рекурсивного вызова. Интерфейс с языком ассемблера. В Turbo Basic есть три типа оператора CALL: CALL имя_процедуры, CALL INTERRUPT и CALL ABSOLUTE. Оператор CALL INTERRUPT используется совместно с функцией REG для передачи данных через буфер регистров. Собственно код ассемблера или файлы типа .COM, содержащие этот код, могут быть встроены в тело процедуры по директиве $INLINE.(Более подробная информация приведена в Приложении C "Связь с языком ассемблера".) Встроенные функции. В отличие от интерпретирующего Basic трансцендентные функции в Turbo Basic возвращают результат с двойной точностью. Новые команды. В Turbo Basic имеется много новых функций и, а ко многим старым добавлены дополнительные возможности по сравнению с интерпретирующим Basic. Некоторые из них приведены в табл. D-1. Если вы по ошибке воспользуетесь этими зарезервированными словами в качестве имен переменных, компилятор выдаст синтаксическую ошибку. Исправьте такие ошибки, заменив конфликтные имена переменных с помощью команды редактора Find and replace (Найти и заменить). Таблица D-1. Расширения языка Turbo Basic по отношению к стандартному Basic. ______________________________________________________________ BIN$ Преобразует целое в двоичный формат. BINARY Новый режим работы с файлами, обеспечивающий доступ на нижнем уровне. CEIL,FIX Функции преобразования из формата с плавающей запятой в целый. COMMAND$ Возвращает содержимое командной строки. CVMS,CVMD,MKMS$, Преобразует данные из формата Microsoft. MKMD$ DECR/INCR Еще один способ уменьшать и увеличивать значения переменных. DEFLNG,MKLS$,CVL Поддержка нового числового типа - длинное целое. DELAY Приостанов программы на n секунд (для выполнения машинно-независимой задержки). DO/LOOP Оператор цикла, соответствующий стандарту ANSI. ERADR Возвращает адрес последней ошибки. EXIT Выход из циклов FOR/NEXT, WHILE/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 Задание позиции указателя в двоичных файлах. SELECT CASE Мощный оператор множественных проверок и ветвления. SUB/END SUB Определение процедуры. VARSEG Возвращает адрес сегмента переменной или элемента массива. ------------------------------------------------------------- Реализация компилятора. Реализация компилятора Turbo Basic будет влиять на работу существующих программ на языке Basic; кроме того, она дает более широкие возможности по управлению процессом компиляции и генерации обектного кода. Мы уже обсуждали некоторые отличия Turbo Basic от стандартного Basic. Ниже будут рассмотрены другие возможности Turbo Basic, связанные с реализацией компилятора. Работа с большими программами в редакторе. Встроенный в Turbo Basic редактор позволяет работать с программами объемом не более 64К. Программы, превышающие 64К, можно транслировать с помощью директивы $INCLUDE. Такую программу необходимо разбить на несколько отдельных файлов. Используйте команду Main file в просматриваемом меню File для задания программы, с которой вы хотите начать компиляцию (если это не текущий файл в буфере редактора). Редактор Turbo Basic работает со строками длиной не более 248 символов. Интерпретирующий Basic может иметь строки длиной 255 символов. Строки, превышающие 248 символов, будут разбиты редактором на несколько строк (после 248-й колонки автоматически будет вставлен символ возврата каретки). Все же необходимо проверить правильность формата строк перед загрузкой программы в редактор Turbo Basic. Turbo Basic позволяет прогонять программы, размер объектного кода которых превышает 64К. По директиве $SEGMENT генерируется новый сегмент программы и все операторы CALL и GOTO будут изменены таким образом, чтобы выполнять дальний вызов и дальний переход. Файлы с произвольным доступом, содержащие числа с плавающей запятой. В связи с тем, что для представления чисел с плавающей запятой с обычной и двойной точностью в Turbo Basic используется стандарт IEEE, а в интерпретирующем Basic - нестандартный формат фирмы Microsoft, программа на Turbo Basic должна преобразовывать соответствующие поля существующих файлов с произвольным доступом, созданных программами на интерпретирующем Basic. Функции MKMS$ и MKMD$ преобразуют числа в формат Microsoft. Функции CVMS и CVMD преобразуют числа из формата фирмы Microsoft в стандарт, принятый в Turbo Basic. Отметим, что это относится только к полям чисел с плавающей запятой в файлах с произвольным доступом, а не к полям целых чисел или символьных строк. Числа с плавающей запятой. В отличие от интерпретирующего Basic в Turbo Basic для представления чисел с плавающей запятой используется стандарт IEEE. Числа с обычной точностью в Turbo Basic занимают 6?байтов памяти, числа с двойной точностью - 8 байт. В интерпретирующем Basic для представления этих чисел используется 4 и 6 байтов соответственно. Использование стандарта IEEE в Turbo Basic увеличивает точность представления вещественных чисел. (Отметим, что функции преобразования MKMD$, MKMS$, CVMD и CVMS преобразуют данные из формата Turbo Basic в формат интерпретирующего Basic и наоборот.) Кроме того, поскольку для выполнения математических операций в Turbo Basic используется сопроцессор 8087 (или его эмулятор) округление дробной части числа не всегда происходит в сторону увеличения. Так, при наличии цифры 5 в дробной части округление происходит в сторону увеличения или уменьшения до ближайшего четного значения. Например, число 0,5 будет округляться до 0; число 9,005 - до 9,01. При исполнении следующей программы Turbo Basic выводит на печать числа 0 0 , а интерпретирующий Basic - числа 0 1. 10 DEFINT A-Z 20 A = 1/2 'целое деление 30 B = 1/2 'деление с плавающей запятой 40 PRINT A;B Использование окна исполнения. В среде Turbo Basic программы, выводящие текст на экран, могут запускаться в окне исполнения (RUN), которое является виртуальным экраном размером 25 строк на 80 колонок. Используйте клавиши ALT-F5 для увеличения размера этого окна при выполнении вашей программы. Если в программе при работе в окне используются функции POKE для позиционирования курсора или изменения цвета, информация на экране может отображаться неправильно. Однако при увеличении размера окна до запуска программы содержимое экрана не исказится. Программы, работающие с графикой, занимают весь экран. Точность промежуточных вычислений с плавающей запятой. Поскольку в Turbo Basic для представления вещественных чисел используется стандарт IEEE, промежуточные результаты вычисляются с максимальной точностью (80 бит). Некоторые программы интерпретирующего Basic работают с числами с плавающей запятой с ограниченной точностью, добавляя при некоторых вычислениях "фиктивное число" 1, чтобы получить правильный результат. Так как в Turbo Basic используется повышенная точность вычислений, то программа, рассчитанная на вычисления с ограниченной точностью, может потребовать модификации. Символьные строки. В Turbo Basic расширены возможности для работы с символьными строками. Максимальная длина строки увеличена с 255 до 32767 символов. К тому же "сборка мусора", периодически выполняемая интерпретирующим Basic, отменена, так что нет необходимости использовать функцию FRE для периодического выполнения этой операции. Использование памяти. Turbo Basic делает всю память системы доступной для ваших программ без ограничения в 64К, принятого в интерпретирующем Basic. Программы могут занимать неограниченную память под сегмент программы, до 64К памяти под скалярные переменные (не массивы), до 64К под символьные строки и неограниченную память под массивы, каждый из которых не должен превышать 64К. Ячейки функций PEEK и POKE. В графическом режиме цвет текста хранится в ячейке PEEK/POKE сегмента данных со смещением 4E (Шестнадцатеричные). Использование других ячеек в функциях PEEK/POKE может дать непредсказуемые результаты. Приложение E. Сообщения об ошибках. В Turbo Basic существуют два основных типа ошибок: ошибки периода компиляции и ошибки периода выполнения. Первые - это в основном синтаксические ошибки, обнаруженные компилятором, вторые - это ошибки, выявленные соответствующими средствами их обнаружения, помещенными компилятором в объектный код программы. Большинство ошибок периода компиляции это синтаксические ошибки - пропуск символов, описки в операторах, недостающие скобки и т. д. Если компилятор находит в исходной программе недопустимые конструкции, которые он не может разрешить или понять, то вы автоматически переходите в режим редактирования, причем курсор указывает на место, где обнаружена ошибка. Нажмите любую клавишу, чтобы удалить сообщение об ошибке, а затем исправьте ошибку и оттранслируйте заново программу. В нижней части экрана компилятор выдает номер ошибки и краткое ее описание. Коды ошибок периода компиляции имеют номера с 256 и выше. Ошибки периода выполнения происходят при исполнении программы. Это могут быть, например, ошибки файловой системы (диск переполнен или защищен от записи), неверные вызовы функций (использование графических функций без графического адаптера), попытка извлечения квадратного корня из отрицательного числа, ошибки памяти (как правило, переполнение), и многие другие. Ошибки периода выполнения можно обнаруживать и обрабатывать с помощью механизма прерываний. С помощью оператора ON ERROR управление в случае обнаружения ошибки может быть передано заданной пользователем подпрограмме обработки ошибок. Эта подпрограмма может проанализировать тип ошибки и предпринимать соответствующие действия. В частности, ошибки файловой системы (например, переполнение диска) можно удобно обрабатывать такими подпрограммами; это единственный тип ошибок, с которыми должна иметь дело тщательно отлаженная программа. Оператор ERROR имитирует ошибки периода выполнения и используется для отладки подпрограмм обработки ошибок. Более подробные сведения о средствах обнаружения ошибок периода выполнения приведены в Главе 5 "Справочное руководство по Turbo Basic" в описаниях оператров ON ERROR, ERROR и функций ERR, ERL, ERADR. Если вы не используете средства обнаружения и обработки ошибок периода выполнения, то первая возникшая ошибка вызовет прекращение работы программы, а на экран выведется краткое сообщение об ошибке и ее номер. Если программы была запущена в Turbo Basic, включается режим редактирования, при этом курсор указывает на оператор, вызваший ошибку. Ошибки периода выполнения имеют коды от 0 до 255. Например: Error 5 Illegal function call at pgm-ctr: 761 Текстовые сообщения об ошибках не содержатся в программах типа .EXE; поэтому при обнаружении ошибки при работе программ, запущенных из DOS, на экран выводятся только номера ошибок. При использовании ключа Find отладчика значение счетчика команд, возвращаемое средствами обнаружения ошибки, пересчитывается в номер оператора исходной программы, содержащего эту ошибку. Например: nnnОписание-ошибки где nnn код ошибки из трех цифр.(Более подробно см. в Главе 3 раздел "Команда Debug") Ошибки периода выполнения. 2 Syntax error (Синтаксическая ошибка). Синтаксическая ошибка периода выполнения возникает при попытке загрузить символьные данные в числовую переменную с помощью оператора READ. Другие синтаксические ошибки обнаруживаются компилятором. 3 RETURN without GOSUB (RETURN без GOSUB). Встретился оператор RETURN без предварительного выполнения оператора GOSUB (вне вызванной подрограммы); т.е. система не знает, откуда делать возврат. 4 Out of data (Отсутствие данных). Число аргументов в операторе READ больше числа аргументов в соответствующем операторе DATA. 5 Illegal fuction call (Неправильный вызов функции). Это обобщенная ошибка, связанная с передачей неправильного аргумента некоторому оператору или функции. Вот некоторые из многих причин, вызывающих данную ошибку: - Слишком большое значение кода цвета или экранного режима. - Использование графического оператора без графического адаптера или без установки соответствующего режима оператором SCREEN. - Попытка выполнить недопустимую математическую операцию, например, извлечение квадратного корня из отрицательного числа. - Слишком большой (или отрицательный) номер записи в операторах GET или PUT. - Попытка применить оператор WIDTH к последовательному файлу. 6 Overflow (Переполнение). Переполнение возникает в результате вычислений когда полученное число слишком велико, чтобы его можно было представить указанным числовым типом. Например, операция x% = 32767 + 1 вызывает переполнение, так как число 32768 не может быть представлено целым типом. Переполнение чисел целого типа обнаруживается только в том случае, если программа скомпилирована с установленным ключом Overflow в меню Options; переполнение чисел с плавающей запятой обнаруживается всегда. 7 Out of memory (Отсутствие памяти). Это сообщение появляется во многих случаях, например при определении массива слишком большого размера. 9 Subscript out of range (Индекс вне диапазона). Значение индекса массива превосходит максимальную величину, указанную при описании массива. Ошибка фиксируется только в том случае, когда программа скомпилирована с ключом Bounds в меню Options. 10 Duplicate definition (Двойное определение). Попытка повторно задать размер динамического массива, не удалив старый массив. 11 Division by zero (Деление на нуль). Деление на нуль или возведение нуля в отрицательную степень. 13 Type mismatch (Несоответствие типа). Использование символьного значения вместо числового или наоборот. Это может произойти в операторах PRINT USING, DRAW или PLAY. 14 Out of string space (Отсутствие памяти в области символьных строк). Нет места для хранения символьной строки; пространство для строк ограничено 64К. 15 String too long (Слишком длинная строка). Строка, полученная при вычислении символьного выражения, превышает 32767 байт. 19 No RESUME (Нет оператора RESUME). Выполнение программы дошло до ее физического конца после обращения подпрограммы обработки прерывания по ошибке. По всей вероятности в подпрограмме пропущен оператор RESUME. 20 RESUME without error (Оператор RESUME без фиксации ошибки). Выполнение оператора RESUME вне подпрограммы обработки прерывания по ошибке; т.е нет подпрограммы обработки прерывания, из которой надо сделать выход по этому оператору. 24 Device time-out (Тайм-аут устройства). С линии связи не пришел ответ в течение заданной величины тайм-аута. Значение тайм-аута может быть задано для следующих линий связи последовательного интерфейса: ClearToSend (Очистка посылки), CarrierDetect (Несущая частота), DataSetReady (Готовность данных). Программа должна либо завершить выполнение либо повторить операцию связи.(См. описание оператора OPEN COM в Главе 5). 25 Device fault (Отказ устройства). Аппаратная ошибка; например, неиспраность интерфейса принтера или адаптера связи. 27 Out of paper (Отсутствие бумаги). Контроллер принтера фиксирует отсутствие в нем бумаги. Он может быть просто выключен или неисправен. 50 Field overflow (Переполнение поля). Задавая длину записи файла, вы попытались определить слишком длинный набор переменных поля в операторе FIELD. 51 Internal error (Внутренняя ошибка). Ошибка в самой системе Turbo Basic, обеспечивающей выполнение программы. Обратитесь в группу технической поддержки фирмы Borland. 52 Bad file number (Неверный номер файла). Номер файла, заданный в операторе работы с файлом, не был определен в операторе OPEN или этот номер превышает максимально допустимое значение. 53 File not found (Файл не найден). Файл с заданным именем на указанном устройстве не найден. 54 Bad file mode (Неверный режим работы с файлом). Применение операторов PUT или GET (либо функций PUT$ или GET$) к файлу с последовательным доступом. 55 File already open (Файл уже открыт). Попытка открыть ранее открытый файл или удалить открытый файл. 57 Device I/O error (Ошибка ввода/вывода на устройстве). Аппаратная ошибка при попытке выполнения какой-либо команды. 58 File already exists (файл уже существует). Файл с именем, указанным в операторе NAME, уже существует. 61 Disk full (Диск заполнен). Нет достаточного места на указанном или текущем диске при выполнении файловой операции. Необходимо обеспечить требуемый объем свободного пространства на диске и перезапустить программу. 62 Input past end (Ввод после конца). Попытка считать из файла больше данных, чем он содержит. Чтобы избежать этого, используйте функцию EOF (конец файла). Ошибка может быть вызвана также попыткой чтения из файла с последовательным доступом, открытого для записи или добавления. 63 Bad record number (Неверный номер записи). При работе с файлом с произвольным доступом в качестве аргумента оператора PUT или GET было указано отрицательное число или число, превосходящее 16777215. 64 Bad file name (Неверное имя файла). Имя файла, указанное в операторах FILES, KILL или NAME, содержит недопустимые символы. 67 Too many files (Слишком много файлов). Ошибка возникает либо при создании слишком большого числа файлов в корневом справочнике диска, либо при задании неверного имени файла, которое оказывает воздействие на системный вызов DOS Create File (создать файл). 68 Device unavailable (Устройство недоступно). Попытка открыть файл на несуществующем устройстве; например, COM1: в системе без последовательного адаптера или модема. 69 Communications buffer overflow (Переполнение буфера связи). Выполнение оператора INPUT, приводящее ко вводу данных в уже заполненный буфер связи. Необходимо в программе чаще проверять и очищать буфер либо увеличить его размер. 70 Permission denied (Нет разрешения). Попытка записи на защищенный от записи диск. 71 Disk not ready (Диск не готов). Не закрыт дисковод или не вставлен диск. 72 Disk media error (Ошибка на диске). Обнаружены плохие сектора на гибком или жестком диске. 74 Rename across disks (Переименование с переносом на другой диск). Нельзя переименовывать файл при переписи на другой диск или справочник. Оператор NAME не перемещает файл, а только дает ему новое имя. 75 Path/File access 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 с несовпадающими аргументами. Turbo Basic проверяет число и тип переменных в операторах COMMON. 204 Mismatched program options (Несоответствие параметров программы). Попытка связать (CHAIN) два сегмента программы, скомпилированных с разными параметрами (разные математические библиотеки, разные сопроцессоры и т.д.). 205 Mismatched program revisions (Несоответствие версий программы). Попытка связать (CHAIN) два сегмента программы, созданные разными версиями компилятора Turbo Basic. 206 Invalid program file (Неверный файл с программой). Попытка связать (CHAIN) или запустить (RUN) программу, оттранслированную компилятором, отличным от Turbo Basic. 242 String/array memory corrupt (Нарушение границ памяти символьных строк и массивов). Выход за границы области памяти символьных строк при записи. Причиной ошибки может быть неправильное действие подпрограммы на ассемблере, обращение к символьному массиву, приводящее к выходу за его пределы, или ошибки в системе выполнения программы Turbo Basic. 243 CHAIN/RUN from .EXE file only (Использование команд CHAIN/RUN возможно только в файлах типа .EXE). Попытка связать (CHAIN) или запустить (RUN) сегмент программы из среды. Необходимо скомпилировать программу на диск, используя ключи меню Options, а затем запустить программу, которая использует команды CHAIN или RUN из DOS. Ошибки периода компиляции. 401 Expression too complex (Слишком сложное выражение). Выражение содержит слишком много операторов или операндов. Разбейте его на более простые выражения. 402 Statement too complex (Слишком сложный оператор). Обработка слишком сложного оператора вызвала переполнение внутренних буферов компилятора. Разбейте оператор на более простые операторы. 403 $IF nesting overflow (Переполнение вложенных $IF). Количество вложений блоков условной трансляции ($IF/$ELSE/$ENDIF) превысило максимальное значение (16). 404 $INCLUDE nesting overflow (Переполнение вложенных $INCLUDE). Количество уровней вложенности файлов, включаемых по директиве $INCLUDE, не должно превышать 5, включая главную программу. Т.е. главная программа может иметь четыре уровня вложения включенных файлов. 405 Block nesting overflow (Переполнение вложенных блоков). Слишком много вложенных блочных операторов. Число уровней вложения блочных структур в Turbo Basic не должно превышать 255. 406 Compiler out of memory (Компилятору не хватает памяти). Не хватает памяти, отводимой компилятором под символы, буферы и т.д. Разбейте вашу программу на небольшую главную программу и несколько частей, включаемых в главную программу по директиве $INCLUDE. Если эта ошибка произошла при компиляции программы в память, попытайтесь скомпилировать программу на диск с помощью соответствующего ключа в меню Options. 407 Program too large (Программа слишком велика). Программа содержит более 65530 операторов. 408 Segment exceeds 64K (Сегмент превышает 64К). Размер сегмента программы превышает 64К. Включите метаоператор $SEGMENT в исходную программу, чтобы переместить часть программы в другой сегмент. 409 Variables exceed 64K (Переменные превышают 64К). Размер пространства, отводимого под скалярные переменные, превышает 64К. В этом пространстве размещаются указатели на строки и переменные различных типов - целые, длинные целые, числа с плавающей запятой с двойной и обычной точностью. Удалите ненужные переменные или разбейте вашу программу на главную и связанные (CHAIN) части. 410 "," expected (Ожидается ","). По синтаксису оператора требуется запятая (,). 411 ";" expected (Ожидается ";"). По синтаксису оператора требуется точка с запятой (;). 412 "(" expected (Ожидается "("). Пропущена правая скобка ((). 413 ")" expected (Ожидается ")"). Пропущена левая скобка ()). 414 "=" expected (Ожидается "="). Пропущен знак равенства (=). 415 "-" expected (Ожидается "-"). Пропущен знак дефиса (-). 416 Statement expected (Ожидается оператор). Требуется оператор Turbo Basic. Рассматриваемый символ не может быть идентифицирован как оператор, метаоператор или переменная. 417 Label/line number expected (Ожидается метка или номер строки). В операторе IF, GOTO, GOSUB или ON отсутствует метка или номер строки. 418 Numeric expression requires relational operator (Числовое выражение требует оператора отношения). Вместо числового оператора указан символьный операнд. 419 String expression requires string operand (Символьное выражение требует символьного операнда). Недопустимый несимвольный операнд в символьном выражении; например: X$ = A$ + B 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 или в метаоператорах $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 (Ожидается имя целого массива). Не указано имя целого массива; например, в операторе PALETTE. 431 End of line expected (Ожидается конец строки). Никакие символы (кроме комментария) не могут находиться на одной строке с метаоператорами, оператором END SUB или меткой. 432 AS expected (Ожидается AS). Пропущено зарезервированное слово AS в операторе FIELD или OPEN. Синтаксис этих операторов описан в Главе 5. 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 или EXIT LOOP нет соответствующего оператора DO, открывающего тело цикла. 436 SELECT expected (Ожидается SELECT). В операторе SELECT CASE пропущено зарезервированное слово SELECT либо для операторов END SELECT или EXIT SELECT нет соответствующего оператора SELECT CASE. Эта ошибка может быть вызвана также использованием зарезервированного слова CASE в качестве имени переменной в программе. 437 CASE expected (Ожидается CASE). В операторе SELECT CASE пропущено зарезервированное слово CASE. Эта ошибка может быть также вызвана использованием зарезервированного слова SELECT в качестве имени переменной в программе. 438 FOR LOOP expected (Ожидается цикл FOR). Для оператора EXIT FOR нет соответствующего оператора FOR, открывающего тело цикла. 439 SUB expected (Ожидается SUB). Операторы END SUB или EXIT SUB находятся вне подпрограммы. Подпрограмма должна начинаться оператором SUB. 440 END DEF expected (Ожидается END DEF). Отсутствует оператор END DEF, завершающий описание функции. 441 END IF expected (Ожидается END IF). Отсутствует оператор END IF, завершающий блок IF. 442 LOOP/WEND expected (Ожидается LOOP или WEND). Отсутствуют операторы LOOP или WEND, завершающие циклы DO или WHILE. 443 END SELECT expected (Ожидается END SELECT). Отсутствует оператор END SELECT в конструкции SELECT CASE. 444 END SUB expected (Ожидается END SUB). Отсутствует оператор END SUB, завершающий описание подпрограммы. 445 NEXT expected (Ожидается NEXT). Отсутствует оператор NEXT, завершающий цикл FOR. 446 THEN expected (Ожидается THEN). В операторе IF нет соответствующей части THEN. 447 TO expected (Ожидается TO). Отсутствует TO в конструкции FOR. 448 GOSUB expected (Ожидается GOSUB). В операторе ON нет соответствующей части SUB. 449 GOTO expected (Ожидается GOTO). В операторе ON нет соответствующей части GOTO. 450 $ENDIF expected (Ожидается $ENDIF). Отсутствует часть $ENDIF в метаоператоре условной трансляции $IF. Просмотрите все метаоператоры $IF, чтобы определить, куда надо вставить недостающий $ENDIF. 451 Unmatched $ELSE (Неожиданный $ELSE). Не было метаоператора $IF, соответствующего встретившемуся метаоператору $ELSE. Просмотрите исходную программу назад от метаоператора $ELSE, чтобы определить, куда надо вставить $IF. 452 Unmatched $ENDIF (Неожиданный $ENDIF). Не было метаоператора $IF, соответствующего встретившемуся метаоператору $ENDIF. Просмотрите исходную программу назад от метаоператора $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 Duplicate label/line number (Двойная метка или номер строки). Повторное определение метки или номера строки. Найдите одинаковые метки или номера строк в главной программе и включенных файлах и исправьте их. 459 Duplicate named constant (Двойная именованная константа). Две именованные константы имеют одинаковые имена. Найдите одинаковые имена именованных констант в главной программе и включенных файлах и измените их имена. 460 Duplicate function definition (Двойное определение функции). Описаны две функции оператором DEF FN с одинаковыми именами. Найдите эти функции в главной и включенных программах и измените их имена. 461 Duplicate subprogram definition (Двойное определение подпрограммы). Описаны две подпрограммы с одинаковыми именами. Найдите эти подпрограммы в главной и включенных программах и измените их имена. 462 Duplicate common variable (Двойная общая переменная). В операторе COMMON указаны две переменные с одинаковыми именами. Найдите этот оператор в главной или включенных программах и измените имена переменных. 463 Duplicate variable declaration (Двойное объявление переменной). Две переменные с одинаковыми именами объявлены в операторах LOCAL, STATIC или SHARED. Найдите эти переменные в главной и включенных программах и измените их. 464 Duplicate $COM definition (Двойное определение $COM). Найдены два метаоператора $COM для одного последовательного интерфейса. Найдите и удалите одну из директив. 465 Duplicate $SOUND definition (Двойное определение $SOUND). В программе найдены два метаоператора $SOUND. Удалите один из них в главной или включенных программах. 466 Duplicate $STACK definition (Двойное определение $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 (Ошибка в границах массива). Индекс статического массива при обращении к нему превосходит заданные в описании границы. 474 Type mismatch (Несоответствие типа). Типы переменных в операторе SWAP не совпадают. 475 Parameter mismatch (Несоответствие параметров). Тип или число параметров при вызове функции или процедуры не совпадают с ее определением. 476 CLEAR parameter error - use MEMSET/$STACK (Ошибка в параметре оператора CLEAR - используйте MEMSET или $STACK). Дополнительные параметры для оператора CLEAR недопустимы в компиляторе Turbo Basic. 477 LOCAL requires DEF FN/SUB (LOCAL требует DEF FN или SUB). Локальные (LOCAL) переменные можно объявлять только при описании функции или процедуры. 478 SHARED requires DEF FN/SUB (SHARED требует DEF FN или SUB). Общие (SHARED) переменные можно объявлять только при описании функции или процедуры. 479 STATIC requires DEF FN/SUB (STATIC требует DEF FN или SUB). Статические (STATIC) переменные можно объявлять только при описании функции или процедуры. 480 COMMON arrays must be dynamic (Массивы COMMON должны быть динамическими). Массивы, указанные в операторе COMMON должны быть объявлены динамическими (DYNAMIC). 481 LOCAL arrays must be dynamic (Массивы LOCAL должны быть динамическими). Локальные массивы (LOCAL) не могут быть объявлены статическими (STATIC). Удалите спецификатор STATIC или перенесите определение массива из функции или процедуры в главную программу. 482 Parameter arrays cannot be altered (Массивы, передаваемые как параметры, не могут быть изменены). Нельзя удалять (ERASE) или переопределять (DIM) массив, являющийся параметром в функции или подпрограмме. 483 Array is not STATIC (Массив не статический). При определении статического массива нельзя использовать переменные в качестве индексов. Допускается использовать либо именованные, либо литеральные константы. 484 Array previosly STATIC (Массив уже объявлен как STATIC). Если массив определяется дважды, то он автоматически считается динамическим. При попытке описать его в дальнейшем как STATIC фиксируется ошибка. Ошибка может быть вызвана также попыткой применить оператор DIM DYNAMIC к массиву, ранее определенному как STATIC. 485 Array name without "()" expected (Ожидается имя массива без "()"). В операторе ERASE имя массива должно стоять без скобок. 486 Array exceeds 64K (Массив превышает 64K). Размер массива не может превышать 64К (один сегмент данных). Если вам нужен массив большего размера, то его можно разбить на несколько массивов. 487 Arrays limited to eight dimensions (Размерность массива не может превышать 8). Размерность массива не должна превышать 8. Это внутреннее ограничение компилятора. 488 Invalid numeric format (Неправильный формат числа). В программе использовано число, имеющее более 36 цифр или у числа с плавающей запятой в формате с буквой E отсутствует значение экспоненты. 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. 492 $INLINE requires SUB INLINE ($INLINE требует SUB INLINE). Операторы $INLINE могут быть использованы только в процедуре, объявляемой оператором SUB с параметром INLINE. 493 $INCLUDE file not found (Включаемый файл не найден). Включаемый файл не найден в указанном или текущем справочнике или в справочнике, указанном командой Directories в меню Setup. Проверьте спецификацию справочника или убедитесь, что данный включаемый файл существует. 494 $INCLUDE disk error (Ошибка диска на включаемом файле). Ошибка диска при открытии компилятором включаемого файла. Эта ошибка фиксируется в период компиляции. 495 $INCLUDE file too large (Включаемый файл слишком большой). Включаемые файлы, как и все файлы, загружаемые редактором Turbo Basic, не могут быть больше 64К. 496 $INLINE file not found (Встроенный файл не найден). Встроенный (INLINE) файл не найден в указанном или текущем справочнике. Убедитесь, что файл с указанным именем существует. 497 $INLINE disk read error (Ошибка диска при чтении встроенного файла). Ошибка диска при открытии компилятором встроенного (INLINE) файла. Эта ошибка фиксируется в период компиляции. 498 Temporary file access error (Ошибка доступа к временному файлу). При компиляции на диск (в файлы .EXE или .TBC) компилятор не имеет доступа к своему временному файлу. Проверьте справочник Turbo c использованием команды Directory в меню Setup, чтобы убедиться, что заданный справочник существует. 499 Destination file write error (Ошибка записи в файл). Ошибка записи при компиляции на диск (в файлы .EXE или .TBC). 600-610 Internal Error (Внутренняя ошибка). При возникновении такой ошибки немедленно сообщите об этом в группу технической поддержки фирмы Borland. Приложение F. Справочные материалы. В этом приложении приведены различные справочные материалы, включающие таблицу кодов ASCII, скэн-коды клавиатуры и расширенные коды. Коды ASCII. Американский стандартный код для обмена информацией (ASCII) предназначен для кодирования в 7-битовом двоичном формате алфавитно-цифровых, специальных и управляющих символов, приведенных в табл.F-1. Расширенные коды клавиатуры. Расширенные коды соответствуют тем клавишам клавиатуры или их комбинациям, которые не могут быть представлены стандартными ASCII кодами, перечисленными в табл. F-1. Расширенные коды передаются через в системную переменную INKEY$. Они представляют собой строку из двух байтов, первый из которых содержит нулевой код (символ NUL). Второй символ, как правило, является скэн-кодом первой клавиши. В таблице F-2 представлены коды второго байта и соответствующие им клавиши. Таблица F-1. Коды ASCII. D = десятичный H = шестнадцатеричный Ctrl = управляющий символ Mne = мнемоника Ch = символ Таблица F-2. Расширенные коды клавиатуры. ---------------------------------------------------- Второй байт Клавиши ---------------------------------------------------- 3 NUL (нулевой символ) 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/I/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 - Ctrl-F10) 104-113 F31-F40 (Alt-F1 - Alt-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 ---------------------------------------------------- Скэн-коды клавиатуры. Скэн-коды клавиатуры - это коды, поступающие от клавиш клавиатуры IBM PC в том виде, в каком они воспринимаются в Turbo Basic. Знание этих кодов полезно при работе на языке ассемблера. В Таблице F-3 представлены скэн-коды клавиатуры в шестнадцатеричном формате. Таблица F-3. Скэн-коды клавиатуры. ---------------------------------------------------------- Клавиша Скэн-код Клавиша Скэн-код ---------------------------------------------------------- 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 Backspace 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 PtrSc 37 Левая Shift 2A Alt 38 Пробел 39 7Home 47 Caps Lock 3A 8Стрелка Вверх 48 F1 3B 9PgUp 49 F2 3C - 4A F3 3D 4Стрелка Влево 4B F4 3E 5 4C F5 3F 6Стрелка Вправо 4D F6 40 + 4E F7 41 1End 4F F8 42 2СтрелкаВниз 50 F9 43 3PgDn 51 F10 44 0Ins 52 F11 D9 Del 53 F12 DA Num Lock 45 Scroll Lock 46 ------------------------------------------------------- Приложение G. Введение в операционную систему DOS. Eсли вы не знакомы с операционной системой DOS, некоторые термины, используемые в этом руководстве, могут оказаться для вас непонятными. В этом приложении представлен краткий обзор следующих концепций и функций DOS: - Что такое DOS. - Запуск программ. - Справочники, подсправочники и команда Path. - Использование файла AUTOEXEC.BAT. Данный обзор не претендует на полноту изложения информации о DOS. Более подробные сведения можно получить в руководствах пользователя по MS-DOS или PC-DOS, поставляемых с компьютером. Turbo Basic работает в операционных системах MS-DOS или PC-DOS, версия 2.0 и более поздние. Что такое DOS? DOS это сокращенное название Дисковой Операционной Системы. MS-DOS это версия DOS фирмы Microsoft, PC-DOS - версия фирмы IBM. DOS осуществляет координацию информационных потоков, управление взаимодействием различных устройств компьютера между собой и с пользователем. DOS работает как бы в фоновом режиме, избавляя пользователя от таких обыденных функций как, например, управление потоком символов между клавиатурой и компьютером, между компьютером и принтером и между дисками и оперативной памятью. К другому типу взаимодействия с системой относятся команды оператора, вводимые в виде командной строки по запросу DOS. Запрос DOS представляет собой один из следующих вариантов: A> B> C> Заглавной буквой обозначается текущий дисковод, с которым работают DOS и пользователь в данный момент. Например, запрос A> означает, что в данный момент вы работаете с файлами на дисководе A, и все команды оператора будут относиться к этому дисководу. Чтобы поменять текущий дисковод, необходимо ввести букву, обозначающую этот дисковод, после которой вводится двоеточие, и нажать Enter. Например, чтобы переключиться на дисковод B, надо ввести B:Enter. Очень часто, работая в DOS, вы будете пользоваться следующими командами: DEL или ERASE Удалить файл. DIR Выдать список файлов на текущем диске. COPY Скопировать файлы с диска на диск. TB Запустить Turbo Basic. DOS воспринимает команды, состоящие из букв как на верхнем, так и на нижнем регистре или их комбинациях. Поэтому вы можете вводить команду в том виде, каком вам нравится. Будем считать, что вы знаете, как пользоваться тремя первыми командами, приведенными выше. В противном случае обратитесь к руководству по DOS. А теперь покажем, как правильно запустить программу, например Турбо Бейсик (см. последнюю из вышеприведенных команд). Загрузка программы. На диске с Turbo Basic вы найдете файл с именем TB.EXE. Этот файл содержит все основные функции языка BASIC. Вторая часть имени, или расширение - .COM или .EXE - говорит о том, что данную программу можно загрузить в память и запустить, указав в командной строке DOS лишь первую часть имени файла. Таким образом, чтобы запустить Turbo Basic, просто введите команду TB и нажмите Enter. При загрузке Turbo Basic и других программ важно помнить о следующем: НЕОБХОДИМО УСТАНОВИТЬ ТЕКУЩИМИ ДИСК И СПРАВОЧНИК, ГДЕ НАХОДИТСЯ ТРЕБУЕМАЯ ПРОГРАММА. В противном случае DOS не будет знать, где искать вашу программу, если, конечно, не указан путь поиска с помощью команды Path, описанной ниже. Предположим, системный диск с файлом TB.EXE находится в дисководе A, но на экране вы видите запрос B>. Если сейчас ввести команду TB, DOS не найдет требуемый файл и выдаст сообщение "Bad command or file name" (Неверная команда или имя файла). Другими словами, вы находитесь не на том диске, где нужно. Получив это сообщение, вы должны перейти на диск A, введя просто A: и нажав Enter. Затем введите команду TB, нажмите Enter, и компилятор запустится. Вы можете указать путь к файлу TB.EXE с помощью команды Path, чтобы DOS смогла найти его. Описание команды см. в разделе "Файл AUTOEXEC.BAT". Справочники. Справочник - это удобный способ организации работы с файлами на гибких или жестких дисках. С помощью справочников можно разделить диск на несколько разделов точно так же, как можно разместить папки с документами в разных секциях. Например, папки с финансовыми документами - банковскими счетами, подоходными налогами и т.д. - можно поместить в секцию "Финансы". В компьютере также удобно было бы держать файлы Turbo Basic в одном справочнике, файлы редактора SideKick - в другом, текстовую информацию - в третьем, и т.д. Теперь по команде DIR будут печататься имена только тех файлов, которые находятся в вашем текущем справочнике, а не всех файлов на диске. Система справочников чаще всего используется на жестких дисках, хотя справочники можно создавать и на гибких дисках. Это связано с тем, что жесткие диски имеют большую емкость; однако при этом необходимо более тщательно систематизировать данные. Находясь непосредственно на уровне DOS (а не в системе Turbo Basic или в какой-либо другой), можно пользоваться командами DOS для создания справочников, перемещения файлов между справочниками, распечатки содержимого конкретного справочника. В приведенных ниже примерах предполагается использование жесткого диска в качестве текущего, так что запрос на экране имеет вид C>. Для создания справочников на гибких дисках нужно в текстах примеров лишь заменить символ C на A или B. Чтобы создать справочник для файлов Turbo Basic необходимо сделать следующее: 1. На запрос C> ввести команду MKDIR BASIC и нажать Enter. По этой команде DOS создаст справочник с именем BASIC. 2. Ввести команду CHDIR BASIC и нажать Enter. По этой команде DOS установит текущим справочник BASIC. 3. Вставить гибкий диск с компилятором Turbo Basic, который вы хотите скопировать, в один из дисководов (например, А) и ввести команду COPY A:*.* Enter. (Звездочки являются знаками подстановки, что означает "все файлы"). По этой команде DOS перепишет все файлы с гибкого диска в дисководе А в справочник BASIC на диске С. Завершение операции копирования каждого файла сопровождается соответствующим информационным сообщением на экране. Завершая раздел, отметим, что справочник можно рассматривать как самостоятельный диск: чтобы загрузить Turbo Basic, нужно прежде, чем ввести команду TB, сделать текущим справочник BASIC, иначе DOS не найдет нужной программы. Подсправочники. Для организации иерархической системы справочников, любой справочник можно разбивать на подсправочники. Вы можете создавать любое число справочников и подсправочников; не забывайте только, где находятся ваши файлы. Подсправочник создается точно так же, как и справочник. Чтобы создать подсправочник справочника BASIC (например, для хранения файлов графики), нужно сделать следующее: 1. Убедиться, что вы находитесь в справочнике BASIC. 2. Ввести команду MKDIR GRAPH Enter. 3. Ввести команду CHDIR GRAPH Enter. Теперь вы находитесь в подсправочнике GRAPH. 4. Перепишите файлы графики BASIC, имеющие расширение .GRP в этот подсправочник. Если файлы находятся на гибком диске, вставьте его в дисковод А и дайте команду COPY А:*.GRP Enter. Если файлы находятся в корневом справочнике на жестком диске, введите команду COPY \*.GRP Enter. Как узнать, где вы находитесь? Запрос $p$g. Вы, возможно, уже заметили, что при смене справочников запрос C> остается неизменным и не отражает, в каком справочнике этого устройства вы находитесь. Это, конечно, неудобно, т.к. вы можете легко забыть, где вы находитесь, особенно, если прервете работу на компьютере на некоторое время. DOS дает вам возможность преодолеть этот недостаток. Введите команду: prompt=$p $g и с этого момента (до тех пор, пока вы не выключите компьютер или перезагрузите систему), в запросе будет точно отражаться ваше текущее состояние. Попробуйте ввести эту команду. Если вы все еще находитесь в подсправочнике GRAPH, то запрос теперь будет выглядеть так: C:\BASIC\GRAPH> Файл AUTOEXEC.BAT. Чтобы не вводить команду prompt (см. предыдущий раздел) всякий раз, когда вы включаете компьютер, вы можете включить ее в файл AUTOEXEC.BAT, который выполнит эту команду за вас при загрузке системы DOS. Файл AUTOEXEC.BAT это удобное средство, обладающее многими возможностями, однако здесь мы не будем вдаваться в подробности, которые вы можете найти в вашем Руководстве по DOS. Мы покажем лишь, как создать файл AUTOEXEC.BAT, который позволит автоматически изменить вид запроса, чтобы вы знали текущее местоположение в системе справочников, установить путь к справочнику BASIC и затем загрузить компилятор Turbo Basic. Команда Path указывает системе, где искать файлы, соответствующие вводимым командам. Если в командной строке не указан путь к справочнику, содержащему требуемые файлы, DOS будет просматривать только текущий справочник. В следующем примере установим пути к справочнику BASIC и подсправочнику FILES. Если в корневом справочнике есть файл AUTOEXEC.BAT, то при загрузке системы будут выполнены все команды, содержащиеся в этом файле. (Запрос, соответствующий корневому справочнику, имеет вид С> или С:\). Файл AUTOEXEC.BAT нужно создавать так: 1. Ввести команду CHDIR \ ,чтобы перейти в корневой справочник. 2. Ввести команду COPY CON AUTOEXEC.BAT Enter. По этой команде DOS поместит все последующие вводимые строки в файл AUTOEXEC.BAT. 3. Наберите следующие строки: ECHO OFF PROMPT=$P $G Enter 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 к подсправочнику GRAPH, введите команду: C:\BASIC> CHDIR GRAPH Enter В этом случае обратная косая черта не нужна, так как справочник GRAPH является прямым потомком справочника BASIC. В самом деле, если включить черту в командную строку, то DOS будет считать, что спавочник GRAPH находится сразу после корневого, и не выполнит команды. - Чтобы перейти от подсправочника к породившему его справочнику: например, чтобы перейти из подсправочника GRAPH к справочнику BASIC, введите команду: C:\BASIC\GRAPH> CHDIR .. Enter Пользуйтесь командой CHDIR .. (после CHDIR - пробел и две точки) всегда, когда нужно перейти от справочника-потомка к справочнику-родителю. - Чтобы перейти к корневому справочнику: корневой справочник - это исходный справочник. Он является прародителем всех справочников (и подсправочников). Корневой справочник отображается на экране запросом вида C:\>. Чтобы перейти из любого справочника в корневой справочник, введите команду: CHDIR \ Enter Обратная косая черта без имени справочника указывает системе на переход к корневому спавочнику. Установка операционной среды. В системе DOS имеется возможность менять переменные операционной среды. Это позволяет подстраиваться под характеристики конкретных устройств или изменять динамические свойства среды. Переменные среды устанавливаются в DOS по команде SET и являются более приоритетными по сравнению с параметрами компилятора и/или программ. Область действия переменных среды распространяется на все системное окружение, в котором выполняется программа. Таким образом, установленная переменная действительна, до тех пор, пока она не будет переопределена или не будет выключен компьютер. Если вы постоянно пользуетесь одним и тем же набором команд SET, вы можете поместить их в командный файл или файл AUTOEXEC.BAT (описанный выше). Переменные среды Turbo Basic позволяют изменять параметры системы периода компиляции и периода выполнения, относящиеся, например, к поддержке сопроцессора 8087 и к проверке "снега" в цветном графическом адаптере (CGA). В следующем примере показана настройка операционной среды на работу с сопроцессором 8087: SET 87=yes где yes означает присутствие сопроцессора, no - отсутствие необходимости работы с ним (даже если физически он имеется). Значение по умолчанию - yes. Что касается проверки "снега" в CGA, можно ввести команду: SET CGASNOWCHK=no где no и yes означают, соответственно, не выполнять и выполнять проверку "снега". Значение по умолчанию - yes. Когда компилятор, или другая построенная программа типа .EXE начинает работу, он просматривает пространство переменных среды для определения значений этих переменных. Хотя устанавливать эти переменные и необязательно, они доступны в любой момент. Если вы решили не устанавливать их, тогда в текущем справочнике создаются временные файлы для хранения их значений по умолчанию. В этом приложении дан лишь краткий обзор системы DOS и некоторых ее функций. Ознакомившись с этой информацией, вы можете обратиться за более подробными сведениями к Руководству по DOS. Существует множество других полезных функций DOS, не упомянутых здесь, которые могут дать вам новые возможности при работе на компьютере. Приложение H. Перечень функций и подпрограмм. Это приложение является кратким справочником функций и подпрограмм Turbo Basic, сгруппированных по действиям, которые они выполняют. Например, чтобы найти функцию $BIN, возвращающую строку в двоичном формате, соответствующую данному числу, а также другие функции, работающие со строками, обращайтесь к разделу "Операции над строками". Связывание. CHAIN Включает связанный модуль Turbo Basic (расширение .TBC) COMMON Объявляет переменные, передаваемые связанной программе. RUN Перезапуск программы. Определение данных при компиляции. DIM Объявляет массивы. LET Присваивает значение переменной. LOCAL Объявляет локальные переменные в процедуре или функции. OPTION BASE Задает минимальное значение индексов массива. REM Ограгичивает комментарии программиста. SHARED Объявляет общие (глобальные) переменные в процедуре или функции. STATIC Объявляет статические переменные в процедуре или функции. TRON/TROFF Разрешает и запрещает выполнение трассировки. Управление внешними устройствами. COM(n) Управление прерываниями от последовательного интерфейса. INP Считывает данные из интерфейса ввода/вывода. IOCTL/IOCTL$ Осуществляет связь с драйвером внешнего устройства. OPEN COM Открывает и конфигурирует интерфейс связи. OUT Записывает данные в интерфейс ввода/вывода. Запросы к DOS. CHDIR Изменяет текущий справочник (команда DOS CD). KILL Удаляет файл (аналогично команде DOS DEL). MKDIR Создает подсправочник (аналогично команде DOS MKDIR). RMDIR Удаляет справочник (аналогично команде DOS RMDIR). SHELL Загружает и выполняет порожденный процесс (только в DOS версии 3.0). SYSTEM Завершает программу. Обработка ошибок. ERADR Возвращает адрес последней обнаруженной ошибки. ERDEV/ERDEV$ Возвращает информацию о драйвере устройства. ERL/ERR Возвращает номер строки и код последней обнаруженной ошибки. ERROR Имитирует ошибку периода выполнения. Работа с файлами. BLOAD Загружает файл, созданный с помощью BSAVE, в память. BSAVE Сохраняет содержимое области памяти пользователя на диске. CLOSE Закрывает файл или внешнее устройство. EOF Возвращает признак конца файла. FIELD Определяет переменные полей в буфере файла с произвольным доступом. FILES Выводит содержимое справочника (аналогично команде DOS DIR). GET(файлы) Считывает запись из файла с произвольным доступом. GET(графика) Считывает весь или часть графического экрана в массив. LINE INPUT # Считывает строку из последовательного файла в символьную переменную, игнорируя разделители. LOC Возвращает текущее значение указателя файла. LOF Возвращает длину файла. LSET Помещает символьные данные в буфер файла с произвольным доступом. NAME Переименовывает файл (аналогично команде DOS REN). OPEN Подготавливает файл или внешнее устройство к чтению или записи. PRINT #, Записывает сформатированную информацию в файл. PRINT # USING PUT Помещает запись в файл с произвольным доступом. PUT$ Записывает символьную строку в двоичный файл. RESET Закрывает все дисковые файлы и очищает их буферы. RSET Помещает символьные данные в буфер файла с произвольным доступом. SEEK Устанавливает указатель в двоичном файле для последующих операций GET$ и PUT$. WRITE # Выводит данные в последовательный файл. Операторы управления. CALL Вызывает процедуру (подпрограмму). CALL ABSOLUTE Вызывает подпрограмму на ассемблере. CALL INTERRUPT Вызывает системное прерывание. DEF FN/END DEF Определяет функцию. DO/LOOP Определяет цикл с проверкой на выход в начале и (или) в конце тела цикла. END Завершает выполнение программы или определяет конец структурного блока. 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 Объявляет подпрограмму обработки прерываний, на которую будет передаваться управление, если количество нот в фоновом музыкальном буфера меньше заданного. ON STRING Объявляет подпрограмму обработки прерываний для кнопки джой-стика. 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. ENDMEM Возвращает адрес конца физической памяти. ERASE Удаляет динамические массивы и инициализирует статические массивы. FRE Возвращает размер свободной памяти, доступной программе пользователя. MEMSET Объявляет верхнюю границу памяти. POKE Записывает байт по заданному адресу. VARPTR Возвращает адрес переменной. VARPTR$ Возвращает указатель на переменную в символьной форме. VARSEG Возвращает адрес сегмента, в котором находится переменная. Метаоператоры. $COM Выделяет область памяти для приемного буфера последовательного интерфейса. $DINAMIC Объявляет размещение массивов, установленное по умолчанию, динамическим. $EVENT Управляет генерацией программы обработки прерываний по событию. $IF/$ELSE/ Определяет части исходной программы, которые $ENDIF должны быть либо скомпилированы, либо опущены. $INCLUDE Включает в программу текстовые файлы. $SEGMENT Объявляет новый сегмент программы. $SOUND Задает объем фонового музыкального буфера. $STACK Задает объем стека периода выполнения. $STATIC Задает объявление массивов по умолчанию статическими. Разные операторы. DATA Объявляет константы для операторов READ. DELAY Обеспечивает паузу в выполнении программы. REG Устанавливает или возвращает содержимое буфера регистров. SWAP Меняет местами значения двух переменных. Операции над числами. ABS Возвращает абсолютное значение. ASC Возвращает численное значение, соответствующее коду ASCII первого символа строки. ATN Возвращает значение тригонометрической функции арктангенс. CDBL Преобразовывает число в формат с двойной точностью. CEIL Возвращает нименьшее целое, большее или равное аргументу функции. CINT Преобразует число в целое. CLNG Преобразует число в длинное целое. COS Возвращает значение тригонометрической функции косинус. CSNG Преобразует числовое выражение в его эквивалент обычной точности. CVI/CVL/ Преобразует символьные данные, считанные из CVS/CVD файла с произвольным доступом, в числовую форму. CVMD/CVMS Преобразует символьные переменные, считанные из файла с произвольным доступом, записанного в формате Microsoft, в числовой формат. DECR Уменьшает значение переменной. DEFINT/DEFLNG Объявляет тип переменных по умолчанию. DEFSNG/DEFDBL /DEFSTR EXP Возвращает значение экспоненты е^x. EXP2 Возвращает значение степенной функции 2^x. EXP10 Возвращает значение степенной функции 10^x. FIX Осуществляет усечение до целого числа. INCR Увеличивает значение переменной. INT Преобразует числовое выражение в целое. LOG Возвращает значение функции натурального логарифма (основание е). LOG2 Возвращает значение функции логарифма с основанием 2. LOG10 Возвращает значение функции логарифма с основанием 10. MKI$/MKL$/ Преобразует числовые данные в символьные MKS$/MKD$ (для записи в файл с произвольным доступом). MKMD$/MKMS$ Преобразует числовые данные в символьный формат Microsoft (для записи в файл с произвольным доступом). RANDOMIZE Задает начальное значение для генератора случайных чисел. RND Возвращает случайное число. SGN Возвращает знак числового выражения. SIN Возвращает значение тригонометрической функции синус. SQR Возвращает значение функции квадратный корень. TAN Возвращает значение тригонометрической функции тангенс. Функции вывода. PRINT Выводит данные на экран. PRINT USING Выводит сформатированную информацию на экран. SPC Пропускает n пробелов (используется совместно с оператором PRINT). TAB Переводит курсор на заданную n-ю позицию (используется только с оператором PRINT). WRITE Выводит на экран данные, разделенные запятыми. Работа с принтером. LPOS Возвращает "положение курсора" в буфере принтера. LPRINT, Выводит данные на принтер (LPT1:). LPRINT USING Работа с экраном. CLS Очищает экран. COLOR Устанавливает цвет текста. COLOR Устанавливает цвета для графических операций. CSRLIN Возвращает число, соответствующее номеру текущей строки, на которой находится курсор. LOCATE Позиционирует курсор и/или определяет его форму. POS Возвращает позицию курсора в строке (номер колонки). SCREEN(файлы) Возвращает код ASCII символа, находящегося в указанных строке и колонке. SCREEN(графика) Устанавливает экранный режим. WIDTH Устанавливает размер логической строки. Управление звуком. PLAY(функция) Возвращает количество нот в фоновом музыкальном буфере. PLAY Возвращает количество нот в фоновом музыкальном (оператор) буфере. SOUND Генерирует звук заданной частоты и продолжительности. Операции над строками. BIN$ Возвращает двоичный символьный эквивалент числа. CHR$ Преобразует код ASCII в строку из одного символа. GET$ Считывает символьную строку из файла, открытого в режиме BINARY HEX$ Преобразует число в его шестнадцатеричный символьный эквивалент. INSTR Осуществляет поиск образца в строке. LCASE$ Возвращает строку, сотоящую только из символов нижнего регистра. LEFT$ Возвращает строку, содержащую n левых символов заданной строки. LEN Возвращает длину символьной строки. MID$ Возвращает символьную строку. MID$ Замещает символы в строке. OCT$ Возвращает строку, содержащую восьмеричное представление целого числа. RIGHT$ Возвращает строку, содержащую n правых символов заданной строки. SPACE$ Возвращает строку, состоящую из одних пробелов. STR$ Возвращает строку, содержащую символьный эквивалент числа. STRING$ Возвращает строку, состоящую из нескольких копий заданного символа. UCASE$ Возвращает строку, сотоящую только из символов верхнего регистра. VAL Возвращает числовой эквивалент символьной строки. Приложение I. Настройка системы Turbo Basic. Настройка системы осуществляется с помощью файла TBINST.COM и заключается в следующем: - установка пути для справочного и установочного файлов; - настройка клавиатуры; - установка режимов редактирования; - установка режима экрана; Если вы хотите сохранить справочный файл (TBHELP.TBH) и/или установочный файл (TBCONFIG.TB) в справочнике, отличном от того, в котором находится файл TB.EXE, вам необходимо установить путь к этим файлам с помощью возможностей, предоставляемых Turbo Basic - команда Directory. Если вы незнакомы с редактором Turbo Basic или пользуетесь командами другого редактора, то с помощью команды Editor commands (команды редактора) вы можете переопределить (настроить) клавиатуру редактора на ваш вкус. Вы можете использовать команду Default edit modes (Режим редактирования по умолчанию), чтобы задать значения по умолчанию для некоторых параметров редактора: режим вставки или наложения, табуляция и авто-отступ. И, наконец, можно установить режим отображения информации на экране при работе в Turbo Basic. Запуск TBINST. Чтобы начать, наберите команду TBINST в ответ на запрос DOSа. На экране появляется меню, которое позволяет выбрать одну из команд: Turbo Basic directory (справочник Turbo Basic), Editor commands (команды редактора), Default edit modes (режимы редактирования по умолчанию), Screen mode (экранный режим), Quit (окончание работы). Для выбора команды необходимо ввести заглавную букву ее названия (выделенную на экране) либо с помощью стрелок "вверх"- "вниз" подвести указатель к требуемой команде и нажать клавишу Enter. Например, для выбора команды Default edit modes, т.е. для изменения режима редактирования нужно нажать клавишу D. Для возврата в главное меню нажмите клавишу Esc. Команда Turbo Basic Directory (Справочник Turbo Basic). Эта команда полезна только при работе с жесткими дисками. Она позволяет установить путь к файлам конфигурации, так что они всегда будут доступны независимо от того, из какого справочника был запущен Turbo Basic. (При этом предполагается, что вы установили оператор пути для Turbo Basic.) При выборе команды Turbo Basic directory на экране появится запрос на ввод полного пути к вашему справочнику Turbo. (Т.е. к справочнику,в котором находятся файлы конфигурации; см. команду Directories меню Setup в Главе 3). Например, если файлы конфигурации будут храниться в подсправочнике справочника Borland, нужно ввести имя пути: C:\BORLAND\BASIC После ввода пути нажмите Enter, чтобы система приняла его, и на экране снова появится главное меню. При выходе из программы появится запрос, нужно ли сохранить сделанные изменения. Если путь сохранен, то он записывается на диск. (Заметьте, что на 25-й строке дается информация о клавишах, используемых в данном меню.) Команда Editor Command. Эта команда позволяет изменить значение по умолчанию клавиш, используемых в редакторе Turbo Basic. Для выбора этой команды нажмите клавишу E или передвиньте к ней указатель и нажмите Enter. Справочная строка в верхней части экрана указывает, какие клавиши использовать для перемещения и выполнения изменений. Это в основном команды перемещения по экрану, однако, команда R позволяет восстановить прежние значения клавиш, которые они имели при первоначальном запуске системы. Вы заметите, что изменять можно лишь вторичные, или подсвеченные, клавиши. Когда вы нажмете Enter, чтобы модифицировать значение клавишы, указатель выделит следующую команду после той, значение которой вы изменили. Теперь в справочной строке в верхней части экрана приведены все возможные команды: <-backspace C clear R restore <-|accept edit literal Клавиша Backspace(шаг назад) позволяет перемещать на позицию назад и/или стирать что-либо в выделенном прямоугольнике клавиши. Команда C очищает, или стирает, все содержимое прямоугольника. Команда R восстанавливает исходные значения клавиш перед выходом из меню. Команда <-| (Enter) сохраняет введенное изменение значения клавиши. И, наконец, клавиша является ключом, который устанавливает либо командный либо литеральный режим. Рассмотрим действие клавиши на примере клавиши Enter, которая используется для модификации и подтверждения отредактированной команды. Если вы хотите использовать Enter, как часть команды, скажем Find string (найти строку) (клавиши ), вам нужно нажать , чтобы перейти в литеральный режим. Теперь, когда вы нажмете клавишу Enter, то соответствующий ей код будет воспринят как литерал, составляющий часть новой команды, которую вы определяете. Выполните следующие действия: 1. Убедитесь, что клавишей установлен командный режим (режим отображается в правом верхнем углу экрана). 2. Подведите указатель к команде Find string и нажмите Enter. 3. Нажмите Backspace, чтобы удалит часть строки - символ . 4. Нажмите , чтобы перейти в литеральный режим, эатем нажмите Enter, чтобы ввести соответствующий ей символ как часть командной строки. 5. Снова нажмите , чтобы вернуться в командный режим, затем нажмите Enter для подтверждения отредактированной строки. После того, как вы определили новую последовательность клавиш, составляющих команду, нажмите Enter для подтверждения результатов редактирования. Если вы сделали все изменения, нажмите Esc для выхода из меню. Если же требуется сделать еще изменения, выберите следующую команду из списка с помощью клавиш-стрелок. Если вы случайно при определении команды ввели последовательность управляющих символов, уже используемую системой (такие последовательности выведены в первой колонке), то на экране появится сообщение Command conflicts need to be corrected. Press Esc (Исправить конфликтующие команды. Нажмите Esc) Любые одинаковые последовательности будут выделены более ярким цветом, что позволит быстро найти и исправить ошибку. Для отмены введенных вами определений команд нажмите R, чтобы восстановить исходные значения команд. Команда Default Edit Mode. Чтобы войти в меню Default edit mode (режим редактирования по умолчанию), нажмите клавишу D. Можно установить три режима редактирования: Режим вставки(Insert mode), Режим авто-отступа (Auto-indent mode) и Табуляция(Tabs). В режиме вставки любые вводимые символы вставляются на позицию, указанную курсором, сдвигая остальную часть строки вправо от курсора. При выключении режима вставки ввод будет осуществляться поверх символов, на которые указывает курсор. В режиме авто-отступа при переходе на новую строку курсор возвращается на начальную колонку предыдущей строки. При выключении этого режима курсор возвращается на первую колонку экранной строки. Режим табуляции позволяет вставлять символы табуляции в требуемом месте. При выключении этого режима табуляция автоматически устанавливается на начало первого слова предыдущей строки. При загрузке Turbo Basic для всех трех режимов редактирования устанавливаются значения по умолчанию. Можно изменить и сохранить значения режимов по умолчанию, чтобы они соответствовали вашим потребностям. И конечно, вы всегда можете изменить эти режимы, работая в редакторе Turbo Basic. На 25-й строке экрана описаны действия по выбору режима: используйте клавиши-стрелки для передвижения указателя к нужному режиму и нажмите Enter либо нажмите клавишу, соответствующую заглавной букве режима, выделенной цветом. Команда Screen Mode. Для выбора этой команды из главного меню нажмите клавишу S. На экране появится просматриваемое меню, из которого вы сможете выбрать один из следующих экранных режимов Turbo Basic: - режим по умолчанию; - цветной; - черно-белый; - монохромный. Экранный режим по умолчанию. По умолчанию Turbo Basic всегда будет работать в режиме, который был установлен при его загрузке. Режим цветного отображения. В Turbo Basic используется режим цветного отображения 80х25 символов независимо от текущего режима, который вновь будет установлен по окончании работы с Turbo Basic. Режим черно-белого отображения. В Turbo Basic используется режим черно-белого отображения 80х25 символов независимо от текущего режима, который вновь будет установлен по окончании работы по окончании работы с Turbo Basic. Режим монохромного отображения. В Turbo Basic используется монохромный режим независимо от текущего режима, который будет вновь установлен по окончании работы с Turbo Вasic. Выход из программы. Окончив все желаемые изменения, выберите команду Quit (Выход) в главном меню. В нижней части экрана появится сообщение: "Save changes to TB.EXE?" (Сохранить изменения в TB.EXE?). Если вы ответите Y (да), все изменения будут сделаны постоянными в Turbo Basic. (Конечно, вы всегда сможете вновь запустить эту программу для внесения новых изменений). Если вы ответите N (нет), изменения не будут сохранены и вы возвратитесь в операционную систему. Если вам потребуется восстановить исходные значения по умолчанию для Turbo Basic, просто скопируйте файл TB.EXE с вашего дистрибутивного диска на рабочий. Восстановить команды редактора можно также, введя команду E в главном меню, а затем нажимая R (команда "восстановить") и Esc.