Оператор MEMSET ----------------------------------------------------------------- Назначение MEMSET устанавливает верхнюю границу памяти Синтаксис MEMSET адрес Замечания адрес - длинное целое выражение, определяющее абсолютный адрес верхней границы памяти ТУРБО БЕЙСИКА. Адрес должен быть меньше, чем объем имеющейся памяти в системе. На практике адрес обычно вычисляется вычитанием некоторой констан- ты из величины, возвращаемой функцией ENDMEM. MEMSET предназначен для выделения дополнительной памяти для подпрограмм на ассемблере. Если ТУРБО БЕЙСИК не может удовлетворить запрос из-за неверного аргумента или недостаточного объема памяти, возникает ошибка выполнения 7 "Out of Memory" (выход за пределы памяти). См.также ENDMEM Пример PRINT FRE(-1) 'вывод объема доступной памяти 'отделить 128 байтов от верхней границы памяти MEMSET ENDMEM - &H80 PRINT FRE(-1) 'вывод объема памяти END 'конец программы Функция MID$ ----------------------------------------------------------------- Назначение MID$ возвращает символьную подстроку Синтаксис s$ = MID$ (символьное-выражение,n [,m]) Замечания n и m - числовые переменные или выражения, которые могут принимать значения в диапазоне от 1 до 32767 и от 0 до 32767 соответственно. MID$ возвращает m-символьную строку, начинающуюся с n-го знака символьного-выражения. Если m опущено или в симовльном-выражении менее n+m символов, возвращается остаток строки от n-го знака до конца. Если n больше длины символьного выраже- ния, MID$ возвращает пустую строку. См.также LEFT$ , RIGHT$ , оператор MID$ Пример INPUT "Введите строку:",DummyStr$ TempStr$ = DummyStr$ PRINT DummyStr$ ' перезапись строки в обратном порядке с ' помощью одновременного использования оператора ' и функции MID$ FOR I%=1 TO LEN(DummyStr$) MID$(DummyStr$,I%,1)=MID$(TempStr$,_ (LEN(TempStr$)-I%)+1,1) NEXT I% PRINT DummyStr$ END 'конец программы Оператор MID$ ----------------------------------------------------------------- Назначение MID$ заменяет символы в строке Синтаксис MID$ (символьная-переменная,n[,m]) = строка-замены Замечания n и m - числовые переменные или выражения, которые могут принимать значения в диапазоне от 1 до 32767 и от 0 до 32767 соответственно. Оператор MID$ за- меняет m знаков в символьной-переменной, начиная с n-ого символа, на строку-замены. Значение m, если оно задано, определяет количество символов из строки-замены, которые замещаются в символьной переменной. Если оно опущено, используется вся строка замены. Оператор MID$ не меняет длину сим- вольной переменной. См.также LEFT$ , функция MID$ , RIGHT$ Пример 'оператор MID$ b$ = "Hurritane Camille" MID$(b$, 11) = "Carla " 'параметр m опущен PRINT b$ Оператор MKDIR ----------------------------------------------------------------- Назначение MKDIR создает подкаталог (подобно команде MKDIR DOS) Синтаксис MKDIR маршрут Замечания маршрут - символьное выражение, описывающее созда- ваемый каталог (об именах файлов и маршрутах см. главу 4). MKDIR (make directory - создать каталог) создает подкаталог в соответствии с заданным марш- рутом. При попытке создать каталог, который уже су- ществует, возникает ошибка выполнения 5 - Illegal Function Call (неверный вызов функции). Пример ' Определить обработку ошибок ON ERROR GOTO DirError PRINT "Введите имя каталога, который вы хотите" INPUT "создать:", DirName$ MKDIR DirName$ 'создание каталога END 'конец программы DirError: PRINT "в создание каталога имеется трудность" END Функции MKI$, MKL$, MKS$ и MKD$ ----------------------------------------------------------------- Назначение MKI$, MKL$, MKS$, MKD$ преобразовывают числовые данные в символьные (для выходных файлов с произвольным доступом) Синтаксис s$ = MKI$ (целочисленное-выражение) s$ = MKL$ (длинное-целое-выражение) s$ = MKS$ (выражение-с-одинарной-точностью) s$ = MKD$ (выражение-с-двойной-точностью) Замечания функции Make являются частью процесса записи числовых значений в файлы с произвольным доступом. Операторы (LSET и RSET), записывающие информацию в буфер файла с произвольным доступом, работают только с символьными данными, поэтому числовые данные прежде, чем их можно будет записать (PUT) в файл с произвольным доступом, должны быть преобразованы в символьные. MKI$(i) возвращает символьную строку, состоящую из двух байтов, которые ТУРБО БЕЙСИК использует для внутреннего представления целой переменной i. MKL$ возвращает 4-байтовую строку эквивалентному длинному целому числу. MKS$ возвращает 4-байтовую символьную строку эквивалентную значению с одинарной точностью. MKD$ возвращает 8-байтовую символьную строку для значения с двойной точностью. При чтении из файла с произвольным доступом используются функции CVI, CVL, CVS и CVD, выполняющие обратные преобразования. Не следует путать приведенные выше функции с STR$ и VAL, которые преобразуют числовые выражения в форму, приемлемую для печати и, соответственно, наоборот: i = 123.45 a$ = STR$(i) : b$=MKS$(i) 'a$ содержит нечто, что имеет смысл 'выводить на экран, а b$ - нет PRINT a$,b$ См.также CVD , CVI , CVL , CVS Пример см. LSET Функции MKMD$, MKMS$ ----------------------------------------------------------------- Назначение MKMD$ и MKMS$ преобразуют числовые значения в символьные в форме Microsoft (для ввода в файлы с произвольным доступом). Синтаксис s$ = MKMS$ (выражение-с-одинарной-точностью) s$ = MKMD$ (выражение-с-двойной-точностью) Замечания Функции "Make Microsoft" предназначены исключительно для совместимости с имеющимися файлами с произвольным доступом, содержащими значения с плавающей запятой в формате Microsoft. MKMS$ преобразует значение с одинарной точностью в 4-байтовую строку в формате Microsoft. MKMD$ создает 8-байтовую строку в формате Microsoft для заданного значения с двойной точностью. См.также CVMD , CVMS Пример ' открытие файла с произвольным доступом OPEN "CVMD.DTA" AS #1 LEN = 12 FIELD #1,4 AS Single$,8 AS Double$ MaxInt%=32767 FOR I%=1 TO 5 'запись данных в файл LSET Single$=MKMS$(I%) LSET Double$=MKMD$(I%+MaxInt%) PUT #1,I% NEXT I% FOR I%=1 TO 5 'чтение данных из файла GET #1,I% 'вывод на экран PRINT CVMS(Single$),CVMD(Double$) NEXT I% CLOSE #1 'закрытие файла END 'конец программы Функция и оператор MTIMER ----------------------------------------------------------------- Назначение MTIMER читает или устанавливает микротаймер Синтаксис Функция: y = MTIMER Оператор: MTIMER Замечания MTIMER предназначен для измерения истекшего времени, главным образом, для очень коротких операций. Обеспечивается высокая точность измерений, которая, однако, быстро падает, если измеряемое время превышает 54 миллисекунды. Функция MTIMER возвращает время в микросекундах, которое прошло с момента выполнения последнего оператора MTIMER. Ограничения Оператор MTIMER устанавливает микротаймер в 0. Оператор и функция MTIMER используются в паре. Следует сначала выполнить оператор MTIMER, а затем вызвать функцию, чтобы получить результат. При последующих обращениях к функции, если микро- таймер не был перезапущен с помощью оператора MTIMER, на выходе будет получен 0. MTIMER и SOUND/PLAY используют 2-ой канал чипа 8255 таймера и являются взаимоисключающими. Таким образом, выполнение операторов SOUND или PLAY между оператором MTIMER и функцией MTIMER устанавливает микротаймер на нулевое значение истекшего времени. Пример ' инициализация таймера MTIMER PI%=ATN(1)*4 'вычисление PI ' чтение значения таймера ElapsedTime!=MTIMER PRINT USING_ "Вычисление значение PI заняло ##### микросекунд";_ ElapsedTime!; END 'конец программы Оператор NAME ------------------------------------------------------------------ Назначение NAME переименовывает файл (аналогично команде REN DOS) Синтаксис NAME имя-файла-1 AS имя-файла-2 Замечания Имя-файла-1 и имя-файла-2 - символьные выражения, соответствующие правилам маршрутов и имен файлов. Оператор NAME присваивает данным, представленным именем-файла-1, имя-файла-2. Имя-файла-2 может содержать описание маршрута, то есть данные можно перемещать из одного каталога в другой, но нельзя перемещать на другой диск. Пример PRINT "Введите имя файла, который нужно "; INPUT "переименовать:", OldName$ INOUT "введите новое имя файла:", NewName$ PRINT OldName$, NewName$ NAME OldName$, NewName$ END Функция OCT$ ----------------------------------------------------------------- Назначение OCT$ возвращает строку, представляющую численное выражение, в восьмеричном виде (по основанию 8) Синтаксис s$ = OCT$ (числовое-выражение) Замечания Числовое выражение должно быть в диапазоне от -32768 до 65535. OCT$ возвращает строку, представляющую восьмеричный вид целочисленного аргумента. Если численное выражение имеет дробную часть, оно перед преобразованием округляется. Для преобразования в шестнадцатеричные или двоичные строки используются, соответственно, функции HEX$ и BIN$. См. также BIN$ , HEX$ Пример PRINT OCT$(-1) PRINT OCT$(65535) Оператор ON COM(n) ----------------------------------------------------------------- Назначение ON COM(n) объявляет подпрограмму обработки прерывания для событий последовательного порта. Синтаксис ON COM(n) GOSUB метка Замечания n - номер (1 или 2) адаптера связи (последователь- ного порта), из которого должно осуществляться чтение. Метка идентифицирует подпрограмму обработки прерываний. Если метка - это номер строки 0, тогда прерывание отменяется. Оператор ON COM(n) не производит никакого действия до тех пор, пока коммуникационные события для данного последователь- ного порта не разрешаются соответствующим операто- ром COM ON. После того, как выполнен оператор COM ON, между каждыми двумя последующими оператора- ми проверяется, не поступил ли символ на указанный последовательный порт. Если поступил, то осуществляется GOSUB на заданную подпрограмму. См.также Приложение B "Прерывание по событию" Оператор ON ERROR ----------------------------------------------------------------- Назначение ON ERROR задает процедуру обработки ошибки и включает прерывание по ошибке. Синтаксис ON ERROR GOTO метка Замечания Метка идентифицирует первую строку подпрограммы обработки ошибки. Если обработка ошибок задана этим оператором, то при возникновении ошибки в ходе выполнения программы, вместо обычных в этом случае выдачи сообщения и прекращения выполнения программы, осуществляется переход на процедуру обработки ошибок. Для выхода из обработчика ошибок используйте оператор RESUME. Чтобы отменить преры- вание по ошибке, используйте ON ERROR GOTO 0. Вы можете применять этот способ, если возникает ошиб- ка, для которой вы не определили ветви программы для восстановления. Вы можете также в этот момент вывести содержимое ERL. Если вы осуществляете прогон программы типа .EXE из DOS с выключенной обработкой ошибок, то за всякой ошибкой в ходе выполнения программы следует сообщение об ошибке, и выполнение программы прерывается. Сообщение имеет вид: Error errnum at pgm-ctr=address Ошибка "номер ошибки" по адресу в программе = "зна- чение адреса" Если программа была запущена из ТУРБО БЕЙСИКА и возникает ошибка, вы оказываетесь в редакторе в том месте, где локализована ошибка. В строке состояния будет краткое описание ошибки в виде: Error "номер ошибки" : сообщение об ошибке. См.также ERADR , ERL , ERR , ERROR , RESUME Пример ' установка обработки ошибок ON ERROR ErrorHandler WHILE I 'этот цикл завершается ошибкой I=10/0 'этот оператор вызывает ошибку выполнения WEND ErrorHandler: PRINT "Обработчик ошибок поймал ошибку выполнения" PRINT ERR, "в строке" ERL END Оператор ON/GOSUB ----------------------------------------------------------------- Назначение ON/GOSUB вызывает одну из нескольких подпрограмм в соответствии со значением числового выражения. Синтаксис ON n GOSUB метка [,метка]... Замечания n - числовое выражение в диапазоне от 0 до 255, метка идентифицирует оператор, на который выполняется переход. n определяет, на какую метку осуществляется скачок (например, если n=4, то управление получает четвертая метка в списке). Если n равно 0 или больше числа меток в списке, ТУРБО БЕЙСИК продолжает выполнение следующего оператора. Каждая подпрограмма должна заканчиваться оператором RETURN, чтобы возобновить выполнение программы с оператора, следующего за оператором ON/GOSUB. Многовариантное ветвление может осуществляться также, и с большей гибкостью, с помощью операторов SELECT и IF. Пример FOR I% = 1 TO 3 ON I% GOSUB OneHandler, TwoHandler, ThreeHandler NEXT I% END 'конец основной программы OneHandler: PRINT "номер обработчика", I% RETURN TwoHandler: PRINT "номер обработчика", I% RETURN ThreeHandler: PRINT "номер обработчика", I% RETURN Оператор ON/GOTO ----------------------------------------------------------------- Назначение ON/GOTO направляет выполнение программы по одному из следующих путей в зависимости от значения чис- ленного выражения. Синтаксис ON n GOTO метка [,метка]... Замечания n - численное выражение, имеющее значение в диапа- зоне от 0 до 255, метка идентифицирует оператор, на который выполняется переход. n определяет на какую метку осуществляется скачок (например, если n=4, то управление получает четвертая метка в списке). Если n равно 0 или больше числа меток в списке, ТУРБО БЕЙСИК продолжает выполнение следую- щего оператора. Каждая подпрограмма должна заканчи- ваться оператором RETURN, чтобы возобновить выполнение программы с оператора, следующего за оператором ON/GOTO. Многовариантное ветвление может осуществляться также, и с большей гибкостью, с помощью операторов SELECT и IF. Оператор ON KEY (n) ----------------------------------------------------------------- Назначение ON KEY (n) задает подпрограмму обработки прерывания, на которую передается управление, если нажата определенная клавиша. Синтаксис ON KEY (n) GOSUB метка Замечания метка идентифицирует первый оператор в подпрограмме обработки прерывания, а n определяет клавишу, осуществляющую прерывание. n - целое выражение, имеющее значение от 1 до 25, 30, 31 в соответствии со следующей таблицей: ------------------------------------------------ n : клавиша ------------------------------------------------ 1-10 : Функциональные клавиши F1-F10 11 : Курсор вверх 12 : Курсор влево 13 : Курсор вправо 14 : Курсор вниз 15-25 : Клавиши, определенные в операторе KEY 30 : Функциональная клавиша F11 31 : Функциональная клавиша F12 ---------------------------------------------------- Оператор ON KEY не производит никакого действия до тех пор, пока прерывания по клавишам не разрешены оператором KEY ON. Если оператор KEY ON выполнен, то между каждыми двумя последующими операторами проверяется, не нажата ли указанная клавиша. Если нажата, ТУРБО БЕЙСИК осуществляет переход на заданную подпрограмму. Оператор KEY(n) OFF отменяет проверку клавиши с номером n. Для определения прерывания по клавише, не являющейся функциональной клавишей или клавишей управления движения курсором, используется оператор KEY. Для детального управления генерацией кода обнаружения событий ТУРБО БЕЙСИКОМ следует использовать метаоператор $EVENT. См.также $EVENT , KEY (n) Пример см. KEY (n) Оператор ON PEN ----------------------------------------------------------------- Назначение ON PEN задает подпрограмму обработки прерывания, на которую передается управление, если производятся действия с световым пером. Синтаксис ON PEN GOSUB метка Замечания метка идентифицирует первый оператор в подпрограмме обработки прерывания по световому перу. Оператор ON PEN не производит никакого действия до тех пор, пока события, вызываемые световым пером, не разрешены с помощью PEN ON. Если оператор PEN ON выполнен, то между каждыми двумя последующими операторами проверяется, не было ли использовано световое перо. Если было, вызывается заданная подпрограмма. Оператор PEN OFF отключает контроль за световым пером. После прерывания по световому перу неявно выполняется оператор PEN STOP, чтобы избежать повторного вызова подпрограммы из нее самой и переполнения, таким образом, стека. Вместе с заключительным оператором RETURN подпрограммы обработки прерывания автоматически осуществляется PEN ON, если только в подпрограмме не содержится явного оператора PEN OFF. Для детального управления генерацией кода обна- ружения событий ТУРБО БЕЙСИКОМ следует использовать метаоператор $EVENT. См.также $EVENT , PEN Пример ON PEN GOSUB PenHandler 'установить обработку события PEN ON 'включить прерывание по событию PRINT "Нажмите любую клавишу для останова..." WHILE NOT INSTAT WEND END 'конец программы PenHandler: FOR I% = 1 TO 9 PRINT PEN(I%) NEXT I% RETURN Оператор ON PLAY ----------------------------------------------------------------- Назначение ON PLAY задает подпрограмму, на которую передается управление, если в буфере подготовки музыки содер- жится менее определенного количества нот. Синтаксис ON PLAY (число-нот) GOSUB метка Замечания число-нот - целое выражение, метка идентифицирует первый оператор в музыкальной подпрограмме. Оператор ON PLAY не осуществляет никакого действия до тех пор, пока контроль за количеством нот не разрешается оператором PLAY ON. После того, как оператор PLAY ON выполнен, между каждыми двумя по- следовательными операторами проверяется, не стало ли количество несыгранных еще нот в музыкальном буфере меньше заданного числа нот. Если стало, ТУРБО БЕЙСИК осуществляет переход GOSUB на соответ- ствующую подпрограмму. Оператор PLAY OFF отключает контроль музыкального буфера. После прерывания по числу нот неявно осущест- вляется оператор PLAY STOP, чтобы предотвратить повторный вызов подпрограммы прерывания из нее са- мой (с переполнением стека). Вместе с заключитель- ным оператором RETURN подпрограммы обработки пре- рывания автоматически выполняется оператор PLAY ON, если только в подпрограмме не содержится явно оператор PLAY OFF. Обработки прерывания не проис- ходит, если к моменту выполнения оператора PLAY ON буфер уже пуст. Для детального управления генерацией кода обна- ружения событий следует использовать метаоператор $EVENT. Для задания размеров буфера подготовки му- зыки используйте метаоператор $SOUND. См.также $EVENT , PLAY , $SOUND Оператор ON TIMER ----------------------------------------------------------------- Назначение ON TIMER задает подпрограмму обработки прерываний, на которую передается управление через каждые n секунд. Синтаксис ON TIMER (n) GOSUB метка Замечание метка идентифицирует первый оператор подпрограммы обработки прерывания "по истекшему времени". n - целое выражение, задающее время между прерываниями в секундах. n должно принадлежать диапазону от 1 до 86400 (24 часа). Оператор ON TIMER не производит никакого действия до тех пор, пока контроль за вре- менем не разрешен оператором TIMER ON. После того, как оператор TIMER ON выполнен, начинается внутрен- ний отсчет секунд,и между каждыми двумя операторами проверяется, не превысило ли истекшее количество секунд заданного числа. Если превысило, вызывается указанная подпрограмма. Контроль за временем отклю- чается оператором TIMER OFF. После прерывания неявно выполняется оператор TIMER OFF, - чтобы предотвратить повторный вызов подпрограммы прерывания из нее самой (что ведет к переполнению стека). Вместе с заключительным опе- ратором RETURN подпрограммы автоматически выполняет- ся оператор TIMER ON, если только в подпрограмме не содержится ранее явно оператор TIMER OFF. Это озна- чает, что отсчет секунд после прерывания по времени устанавливается на 0. Для управления генерацией кода обнаружения события следует использовать метаоператор $EVENT. Сm.также $EVENT , TIMER Пример См. TIMER Оператор OPEN ----------------------------------------------------------------- Назначение Оператор OPEN подготавливает файл или устройство для чтения или записи. Синтаксис OPEN имя-файла [FOR режим] AS [#] номер-файла [LEN=длина-записи] или OPEN строка-режима, [#] номер-файла, имя-файла [,длина-записи] Замечания режим может быть одним из следующих: OUTPUT - задает последовательный файл для записи; INPUT - задает последовательный файл для чтения; APPEND - задает последовательный файл для дозаписи (в конец файла); RANDOM - задает файл с произвольной организацией для чтения и записи; BINARY - задает двоичный файл для чтения и записи, строка-режима - это символьное выражение, первый (и обычно единственный) знак которого принадлежит следующему списку и задает режим: O - последовательного вывода; I - последовательного ввода; A - последовательного вывода в конец файла; R - файл с произвольной организацией ввода/вывода; B - двоичный файл ввода/вывода, номером-файла может быть любое целое значение. имя-файла - символьное выражение, задающее имя файла и, возможно, адрес накопителя и/или описание маршрута. Длина-записи - это целое выражение, принимающее значение в пределах от 1 до 32767, которое задает длину в байтах каждой записи в файле с произвольной организацией. По умолчанию размер записи считается равным 128 байтам. Главное назна- чение оператора OPEN состоит в том, чтобы связать с файлом и физическим устройством некоторый номер и подготовить устройство для чтения и/или записи. Во всех операторах, которые имеют дело с файлом, используется, как правило, этот, приписанный файлу, номер, а не его имя. В операторе OPEN содержится также информация о "режиме" файла, то есть, о том, каким способом будет осуществляться доступ к файлу: последовательным (для ввода, вывода в новый файл, вывод в существующий файл), произвольным или двоичным. Оператору OPEN обычно соответствует оператор CLOSE. Две формы использования команды различаются только степенью подробности словесмого оформления: OPEN "myfile.dta" FOR OUTPUT AS #1 имеет тот же смысл, что и OPEN "O",#1,"myfile.dta" Попытка задать оператор OPEN с режимом INPUT для несуществующего файла приводит к ошибке выполнения 53 File Not Found (файл не найден). Если применить к несуществующему файлу оператор OPEN с режимом OUTPUT, APPEND, RANDOM или BINARY, такой файл будет создан. См.также OPEN COM Пример: ' эта программа разделена на пять процедур ' разница в процедурах состоит в режимах ' открытия файлов и способов манипулирования ' с данными DEF FNPForKey$ (Msg$) PRINT Msg$ PRINT "Для продолжения нажмите любую клавишу..." WHILE NOT INSTAT:WEND FNPForKey$=INKEY$ END DEF 'конец процедуры PForKey SUB SequentialOutput ' файл открывается для последовательного вывода ' и в него записываются некоторые данные KeyP$=FNPForKey$(" Для последовательного вывода") ' открытие последовательного файла для вывода OPEN "OPEN.DTA" FOR OUTPUT AS #1 Integer%=12345 TempStr$="История творится ночью" ' запись данных в последовательный файл WRITE #1,TempStr$,Integer%*2,TempStr$,Integer%\2 CLOSE 1 'закрытие файла END SUB 'конец процедуры SequentialOutput SUB SequentialAppend ' файл открывается для последовательного вывода, однако, ' данные в этом случае добавляются в конец файла KeyP$=FNPForKey$("Теперь для дозаписи данных") ' открытие последовательного файла для дозаписи данных OPEN "OPEN.DTA" FOR APPEND AS #1 Integer%=32123 TempStr$="Наилучшее видение - внутреннее -- M.Forbes" ' дозапись данных WRITE #1,TempStr$,Integer%*0.2,TempStr$,Integer%\2 CLOSE 1 'закрытие файла END SUB 'конец процедуры SequentialAppend SUB SequentialInput ' файл открывается для последовательного ввода, ' прочитанные данные выводятся на экран KeyP$=FNPForKey$("Теперь чтобы вновь прочитать данные") ' открытие последовательного файла и чтение из него OPEN "OPEN.DTA" FOR APPEND AS #1 ' чтение первой строки оператором LINE INPUT# LINE INPUT# 1,TempStr$ PRINT TempStr$ WHILE NOT EOF(1) ' проверка на конец файла TempStr$=TempStr$+INPUT$(1,1) WEND PRINT TempStr$ CLOSE 1 'закрытие файла END SUB 'конец процедуры SequentialInput SUB BinaryIO ' файл открывается для двоичного ввода/вывода ' данные читаются с помощью GET$ ' SEEK перемещает указатель файла в конец файла ' и в конец файла записываются те же данные KeyP$=FNPForKey$("Теперь для двоичного ввода и вывода") ' открытие последовательного файла, чтение из него OPEN "OPEN.DTA" FOR BINARY AS #1 TempStr$="" ' использование GET$ для чтения данных ' и записи их в символьную переменную WHILE NOT EOF(1) GET$ 1,1,Char$ TempStr$=TempStr$+Char$ WEND PRINT TempStr$ ' перемещение указателя в конец файла SEEK 1,LOF(1) ' PUT$ копирует те же данные обратно в файл FOR I%=1 TO LEN(TempStr$) PUT$ MID$(TempStr$,I%,1) NEXT I% CLOSE 1 'закрытие файла END SUB 'конец процедуры BinaryIO SUB RandomIO ' файл открывается для произвольного ввода/вывода ' использование FIELD для объявления буфера ' для хранения считываемых и записываемых данных ' GET и PUT записывают и читают данные ' Заметьте, перед выполнением GET для сохранения в ' буфере файла используются LSET и RSET KeyP$=FNPForKey$("Теперь для произвольного ввода и вывода") ' открытие файла с произвольным доступом OPEN "OPEN.DTA" AS #1 LEN=1 FIELD 1,1 AS Char$ 'определение 1-байтового буфера TempStr$="" TempSize%=LOF(1) 'сохранить длину файла ' чтение всего файла с помощью GET FOR I% = 1 TO TempSize% GET$ 1,1 TempStr$=TempStr$+Char$ 'сохранение данных NEXT I% ' PUT$ копирует те же данные обратно в файл FOR I% = LEN(TempStr$) TO 1 STEP -1 LSET Char$ = MID$(TempStr$,I%,1) PUT 1, LOF(1) 'запись в конец файла NEXT I% CLOSE 1 'закрытие файла END SUB 'конец процедуры RandomIO ' начало тела основной программы CALL SequentialOutput CALL SequentialAppend CALL SequentialInput CALL BinaryIO CALL RandomIO END 'конец программы Оператор OPEN COM ----------------------------------------------------------------- Назначение OPEN COM открывает и определяет конфигурацию порта связи Синтаксис OPEN "COMn: [бод] [,четность] [,данные] [,стоп] [,варианты] AS [#] номер-файла [LEN=число] Замечания n указывает открываемый последовательный порт, бод - целая константа, задающая скорость передачи инфомации: допустимые скорости - 75,110,150,300, 600,1200,1800,2400,4800 и 9600 (по умолчанию 300) Четность - один символ, определяющий способ кон- троля по четности согласно таблице: S - проверка на ноль (бит четности всегда 0 ) O - проверка на нечетность M - проверка на единицу (бит четности всегда 1) E - проверка на четность N - отсутствие проверки (игнорируется в получаемых символах и опускается в передаваемых) По умолчанию выполняется проверка на четность (E). Данные - это целая константа от 5 до 8, задающая число битов данных. По умолчанию 7. Стоп - целая константа, равная 1 или 2, задающая количество стоп-битов. По умолчанию, число стоп-битов равно 1 (для значений скорости передачи информации 75 или 110 число стоп-битов равно 2). Номер-файла - числовое выражение, задающее номер для доступа к коммуникационному порту. Число - максимальное число байтов, которые могут быть прочитаны из коммуникационного порта или пе- реданы в него, по умолчанию равно 128. Число байтов не может быть больше размеров буфера для соответ- ствующего порта, установленного с помощью метаопе- ратора $COM. Оператор OPEN COM включает необязательный блок, который управляет обработкой строки состояния, проверкой на четность и обработкой "возвратом каретки/переводом строки". опции = [,RS] [,CS[мсек]] [,DS[мсек] [,CD[мсек] [,LF] [,PE] RS подавляет линию RTS, CS[мсек] управляет CTS, DS[мсек] управляет DSR, CD[мсек] управляет CD, LF присоединяет символ "перевод строки" к каждому символу "возврат каретки", PE включает контроль по четности. Аргумент мсек параметров CS, DS, CD может варьироваться от 0 до 65535; он задает время ожидания в миллисекундах, по прошествии которого ТУРБО БЕЙСИК выдает сообщение "Ошибка простоя устройства". Если аргумент не задан или равен 0, проверка строки состояния не производится. По умолчанию, значение мсек равно 1000 для CS и DS, и 0 для CD. См.также COM , $COM , ON COM Пример 'размещение символьного массива для хранения вводимых данных DIM ComPortInput$(1) $COM 1024 'устанавливает буфер ввода равным 1К OPEN "COM1:300,n,8,1,DS,RS,CS,CD" AS #1 LEN=1 PRINT "нажмите любую клавишу, чтобы закончить работу программы" WHILE NOT INSTAT 'пока не нажата клавиша 'есть ли что-нибудь на входе? IF LOF(1) > 0 THEN 'чтение любых данных, доступных в буфере порта связи ComPortInput$(0)=INPUT$(LOF(1),#1) 'воспроизведение введенных данных PRINT "Ввод из коммуникационного порта:";ComPortInput$(0) END IF WEND END 'конец программы Оператор OPTION BASE ------------------------------------------------------ Назначение OPTION BASE устанавливает минимальное значение для индексов массивов Синтаксис OPTION BASE (целое-выражение) Замечания Целое-выражение должно иметь значение от 0 до 32767. OPTION BASE задает значение индекса, которое ставится в соответствии первому элементу массива, например, если оно задано OPTION BASE 1, то декларативный оператор DIM x(20), определяющий массив x отводит для него в памяти место под 20 элементов (соответствующих значениям индекса от 1 до 20), тогда как по умолчанию был бы определен 21 элемент (от 0 до 20). Хотя для управления границами изменения индексов можно использовать OPTION BASE, ТУРБО БЕЙСИК дает для этого более мощную возможность через оператор DIM. См.также DIM Пример ' выделить массив из трех целых переменных DIM FirstArray%(2) ' установить начальное значение индекса во ' всех массивах OPTION BASE 1 ' выделить место в памяти для массива из двух целых ' переменных DIM SecndArray%(2) FOR I=0 TO 2 ' в массиве SecndArray% нет значения индекса, ' равного нулю IF I% > 0 THEN SecndArray%(I%)=I% FirstArray%(I%)=I% NEXT I% FOR I% = 0 TO 2 ' в массиве нет значения индекса, равного 0 IF I% > 0 THEN PRINT SecndArray%(I%) PRINT FirstArray%(I%) NEXT I% END Оператор OUT ----------------------------------------------------- Назначение OUT осуществляет вывод в порт ввода/вывода Синтаксис OUT номер-порта, целое-выражение Замечания OUT посылает байтовую величину (от 0 до 255) в аппаратный выходной порт с заданным номером, где номер-порта - целое выражение в диапазоне от 0 до 65535. Оператор OUT необходим для управления различными аппаратными подсистемами, как, например, адаптером связи или видео-адаптером. Неправильное использование оператора OUT может привести к краху системы. Пример см. INP Оператор PAINT ----------------------------------------------------------------- Назначение PAINT окрашивает ограниченную область на графичес- ком экране в выбраный цвет Синтаксис PAINT (x,y) [[,цвет] [,граница] [,фон]] Замечания (x,y) задают точку, определяющую, где должна распо- лагаться краска. Если эта точка находится внутри ограниченной области, тогда будет окрашена эта об- ласть. Если точка находится вне границы, то будет окрашена внешняя по отношению к области часть экра- на. Цвет задается числовым или символьным выражением. Если это числовое выражение, оно определяет сплошной цвет. Если это символьное выражение, то оно содержит маску, по которой область заполняется некоторым шаблонным рисунком. Если цвет не задан, будет выбран цвет с наибольшим приоритетом. Граница дает цвет линии, ограничивающей закрашивае- мую фигуру. Окрашивание по оператору PAINT пре- кращается там, где встречается цвет границы. Фон - это необязательная символьная маска, исполь- зуемая в тех случаях, если требуется перекрасить области. Фоновая маска описывает "слой" избранных клеток, которые следует пропустить когда проверяет- ся, окрашена уже область или нет. С помощью оператора PAINT можно закрасить об- ласть любой формы, сколь угодно сложной. Следует убедиться в том, что закрашиваемая область является полностью замкнутой, иначе "утечки" через границу могут полностью исказить рисунок. Если аргумент "цвет" является числовым, то опе- ратор PAINT заполняет область заданным цветом, пре- кращая окраску при попадении на пикселы с атрибута- ми "цвет" или "граница". Если "цвет" - это символь- ное выражение, то применяется разбиение на клетки; оно используется для создания шаблонного рисунка, которым закрашивается область. Шаблонный рисунок, задаваемый символьными аргументами цвета имеет ши- рину 1 байт (представляющий 4 пиксела при среднем разрешении и 8 пикселов в режиме высокого разреше- ния) и длину от 1 до 64 байтов (представляющих от 1 до 64 строк развертки по вертикали). При разбиении на клетки цвет должен иметь формат вида: CHR$(&Hnn) + CHR$(&Hnn)... Маска состоит из битовых значений "цвета", первый ее символ представляет первую линию, второй символ-вторую, и т.д. Например, следующая маска задает шахматный рисунок (50%-ный серый цвет) в режиме высокого разрешения: 10101010 (первый байт) 01010101 (второй байт) Для того, чтобы заполнить область этим шахматным рисунком, следует построить строку с соответствую- щей маской. Сначала преобразовать из двоичной формы в шестнадцатеричную: 10101010=&HAA 01010101=&H55 Затем сконструировать с помощью CHR$ двухсимвольную строку: pattern$ = CHR$(&HAA) + CHR$(&H55) После этого, с помощью оператора PAINT (50,50), pattern$ закрашивают весь экран серой (шахматной) краской. "Фон" используется для того, чтобы определить условия остановки при перекрашивании области, уже окрашенной с помощью шаблона. Если окрашивание доходит до пиксела, которому соответствует 1 в фоновой маске, окрашивание не прекращается, даже если этот пиксел имеет цвет "границы". При разбивке на клетки, задание шаблона зависит от количества цветовых атрибутов в каждом режиме экрана. Следует помнить, что количество битов, приходящихся на один пиксел связано с количеством цветовых атрибутов в каждом режиме экрана. Количество битов на пиксел можно вычислить по следующей формуле: LOG2 (X)=Y где X - общее число цветовых атрибутов вашего экрана, а Y числу битов на пиксел. Разбиение на клетки в режиме 1 ------------------------------ При среднем разрешении, используя предыдущую формулу, получаем: X=4 пикселам (которые представляются одним клеточным байтом среднего разрешения) и, таким образом, Y равно двум битам на пиксел. Поскольку для каждого пиксела имеется соответствующий цветовой атрибут, потребуется два бита клеточного байта, чтобы описать один из четырех атрибутов. В следующей таблице приведены двоичные и шестнадцатеричные значения , соот- ветствующие каждому атрибуту: ---------------------------------------------------------- цветовая атрибут в шаблон в шаблон в палитра двоичн.коде двоичн.коде шестнадцат.коде ---------------------------------------------------------- 0 зеленый 01 01010101 &H55 красный 10 10101010 &HAA коричн. 11 11111111 &HFF ---------------------------------------------------------- 1 цианит 01 01010101 &H55 фуксин 10 10101010 &HAA белый 11 11111111 &HAA ---------------------------------------------------------- Разбиение на клетки в режиме 2 ------------------------------ При высоком разрешении пикселу соответствует 1 бит, что позволяет включить в одну клетку 8 пикселов. Там, где в маске стоит 1, на экране будет точка. Строка может содержать до 64 байтов. Рисунок последовательно заполняет всю область, заключенную в границу. Если граница не определена, закрашивается весь экран. Разбиение на клетки в режимах 7,8,9,10,11 и 12 ---------------------------------------------- Для этих усиленных режимов клеточный рисунок задается с помощью метода, по которому строка хранится и интерпретируется как стек 8-битовых элементов, известных в совокупности как битовая плоскость. Во всех режимах экрана требуется 4 битовых плоскости, чтобы определить один клеточный байт, кроме режима 10, в котором требуется 2 битовых плоскости. Пример ' Использование клеточных рисунков SCREEN 1 : CLS ' Определение клеточного шаблона для диагоналей TIL1$=CHR$(&H40)+CHR$(&H40)+CHR$(&H10)+CHR$(&H10)+_ CHR$(4)+CHR$(4)+CHR$(1)+CHR$(1) CIRCLE(100,100),50 PAINT (100,100),TIL1$ ' Определение клеточного шаблона для шахматного ' рисунка TIL2$=CHR$(&HAA)+CHR$(&HAA)+CHR$(&H80)+CHR$(&H80)+_ CHR$(&H80)+CHR$(&H80)+CHR$(&H80)+CHR$(&H80) CIRCLE(225,100),50 PAINT (225,100),TIL2$ END Оператор PALETTE и PALETTE USING ----------------------------------------------------------------- Назначение PALETTE и PALETTE USING позволяют изменять один или несколько цветов палитры. Для использования этих операторов необходим адаптер EGA или VGA. Синтаксис PALETTE [атрибут,цвет] PALETTE USING имя целого массива (индекс массива) Замечания атрибут представляет цвет в палитре, цвет - действи- тельный цвет экрана, заменяющий атрибут палитры. Цвет, выводимый на ваш экран, зависит от установленного ре- жима экрана и аппаратуры дисплея (см.оператор SCREEN). Оператор PALETTE позволяет изменять цвет текста или графики непосредственно на экране, заданные изменения влияют на последующее воспроизведение текста или гра- фики. Это удобное свойство, которое позволяет не пе- репечатывать текст или перерисовывать графику, если вы хотите изменить цвет (см.пример). PALETTE также по- зволяет заносить в палитру номера цветов, больше 15. Можно даже сделать текст невидимым относительно фона, а затем, изменив в палитре его цвет, "внезапно" высве- тить его. Если в операторе PALETTE не указаны аргумен- ты, цвета в палитре устанавливаются по умолчанию в со- ответствии с определением. PALETTE USING позволяет за- давать сразу несколько изменений цветов с помощью единственного оператора. Имя целочисленного массива задает массив данных для изменения цветов палитры. Ин- декс массива задает первый элемент массива (в боль- шинстве случаев - 0). Размерность массива должна быть достаточно большой, чтобы его элементы, начиная с за- данного индекса массива, могли вместить все 16 цветов палитры. Каждому атрибуту палитры поставлен в соответ- ствие цвет, номер которого задан в целочисленном мас- сиве. Значение цвета -1 в одном из элементов массива не влияет на соответствующий атрибут в палитре, одна- ко, все остальные отрицательные значения цвета недо- пустимы. Ниже приведены диапазоны атрибутов и цветов для различных режимов экранов и мониторов: -------------------------------------------------------- Режим Монитор Диапазон атрибутов Диапазон цветов -------------------------------------------------------- 0 Моно/EGA 0-15 0-2 Цвет/EGA 0-31 0-15 1 Цвет/EGA 0-3 0-15 2 Цвет/EGA 0-1 0-15 7 Цвет/EGA 0-15 0-15 8 Цвет/EGA 0-15 0-15 9 EGA (64K) 0-3 0-15 EGA (>64K) 0-15 0-63 10 Моно/EGA 0-3 0-8 11 MCGA/VGA 0-1 0-1 12 VGA 0-15 0-15 -------------------------------------------------------- Ограничение Для выполнения операторов PALETTE и PALETTE USING необходим адаптер EGA или VGA. См.также COLOR , DRAW , SCREEN Пример ' в следующем примере показано, как использовать ' оператор PALETTE для того, чтобы изменить ' цвет графики (и текста) без повторного ' рисования или воспроизведения рисунка SCREEN 8 'установить для EGA режим 640x200, 16 цветов PALETTE 'устанавливает для EGA палитру цветов 'по умолчанию LINE (10,10)-(630,190),1,BF 'нарисовать прямоугольник 'закрасить его синим цветом DO FOR I% = 2 TO 14 PALETTE 1,I% 'заменить синий цвет DELAY .2 'установить задержку NEXT I% LOOP UNTIL INSTAT END Функция PEEK ----------------------------------------------------------------- Назначение PEEK возвращает байт, хранящийся в заданной ячейке памяти Синтаксис y = PEEK (смещение) Замечания Смещение - это числовое выражение в диапазоне от 0 до 65535, которое представляет собой 16-битовое смещение от текущего элемента, установленного пос- ледним оператором DEF SEG. Возвращаемое значение может быть от 0 до 255. PEEK и дополняющий его оператор POKE осуществляют доступ к памяти на более низком уровне, чем основные операции ТУРБО БЕЙСИКА. Одно из применений PEEK и POKE сотоит в создании массивов из байтов для приложений, не требующих полного диапазона допустимых целых чисел. См.также DEF SEG , POKE Пример DIM Array%(5) 'массив из 6 целых элементов DEF SEG = VARSEG (Array%(0)) ' инициализация массива с помощью оператора POKE FOR I% = 0 TO 11 POKE I%, &HFF NEXT I% ' вывод содержимого массива с помощью оператора PEEK FOR I% = 0 TO 11 PRINT HEX$(PEEK(I%)) NEXT I% END Функция PEN ----------------------------------------------------------------- Назначение PEN читает состояние светового пера Синтаксис y = PEN (вариант) Замечания Вариант - число,управляющее информацией, возвращаемой функцией PEN согласно следующей таблице: ------------------------------------------------------ Вариант Значение ------------------------------------------------------ 0 Перо опущено с момента последней проверки (-1 = да, 0 = нет) 1 X координата последней активизации пера 2 Y координата последней активизации пера 3 текущее положение переключателя (-1 = вниз, 0 = вверх) 4 последнее значение X координаты 5 последнее значение Y координаты 6 строка, где последний раз было активизировано перо (1-24) 7 колонка, где последний раз было активизировано перо (1-80) 8 последняя строка (1-24) 9 последняя колонка (1-80) ----------------------------------------------------- Световое перо должно быть включено оператором PEN ON прежде, чем будут выполняться запросы функции PEN. См.также ON PEN Пример см. ON PEN Оператор PEN ------------------------------------------------------ Назначение PEN управляет проверкой событий по световому перу Синтаксис PEN {ON | OFF | STOP} Замечания Оператор PEN управляет проверкой событий,связанных со световым пером. До выполнения запросов функции PEN, световое перо должно быть включено с помощью оператора PEN ON. PEN ON разрешает также обработку прерываний по событиям,связанным со световым пером, с помощью процедуры, заданной в операторе ON PEN. PEN OFF блокирует функцию PEN и отменяет проверку событий, связанных со световым пером. PEN STOP отменяет прерывания по событиям, но запоминает эти события так, что если далее выполняется PEN ON, немедленно возникает прерывание. См.также ON PEN Пример см. ON PEN Функция PLAY ----------------------------------------------------------------- Назначение PLAY возвращает число нот в фоновом музыкальном буфере Синтаксис y = PLAY (x) Замечания x - это фиктивный числовой аргумент. PLAY возвраща- ет число нот в фоновом буфере подготовки музыки, ждущих исполнения. Если музыка исполняется с высо- ким приоритетом или не исполняется совсем, PLAY возвращает 0. См.также $SOUND Пример ' Исполнение до-ре-ми-фа-соль PLAY "MB CDEFG" Again: n = PLAY(1) 'может ли быть что-нибудь сыграно PRINT n "нот осталось в буфере" IF n = 0 THEN PRINT "Буфер пуст" : END GOTO Again Оператор PLAY ----------------------------------------------------------------- Назначение PLAY создает музыку Синтаксис PLAY символьное-выражение Замечания PLAY - интерпретируемый мини-язык, который играет для музыки ту же роль, что и DRAW для графики. PLAY позволяет задавать музыкальные пассажи как после- довательность символов в символьном-выражении и исполнять их с помощью динамика компьютера. Можно использовать 84 ноты, соответствующие большинству клавиш на пианино, начиная с нот на три октавы ниже среднего "до" и до четырех, без одной ноты, октав выше среднего "до". Нота может быть представлена своим номером по порядку (1-84) или с помощью непосредственного описания (то есть от A до G с диезами и бемолями и указанием октавы). Например, PLAY "N44" исполняет 44-ю ноту "соль", следующую за средним "до". PLAY "O3G" исполняет "соль" в третьей октаве (ту же ноту). Операторы задания нот могут быть сгруппированы в более длинные командные последовательности: PLAY "O3FGA" исполняет три ноты "фа", "соль" и "ля" в третьей октаве. Музыкальный интерпретатор игнорирует пробелы, поэтому их следует использовать для того, чтобы сделать команду более понятной. Команды Следующие одно- и двухсимвольные команды составляют язык оператора PLAY: нота [{ # | + | - }] формирует ноту, соответствующую строчной или про- писной букве от A до G. Включение диеза (# или +) или бемоля (-) после буквы, обозначающей ноту, позволяет выбрать заданную черную клавишу на пиа- нино. Однако нельзя с помощью диезов и бемолей вы- бирать белую клавишу; так, например, "F-" недопустимо. Nn Задает ноту n, где n - числовое представление ноты от 1 до 84. Нота 1 - нижнее "до" пианино, 84 - верхнее "си". Среднее "до" - нота номер 37. Нота 0 не создает звука и соответствует паузе. On Выбирает октаву n, где n от 0 до 6. Каждая октава начинается с "до" и заканчивается "си". Среднее до - первая нота третьей октавы. По умолчанию выбира- ется октава 4. >n Увеличивает текущую октаву на 1 и задает ноту n. Если текущая октава - шестая (самая высокая), номер октавы не увеличивается (остается 6). <n Уменьшает текущую октаву на 1 и задает ноту n. Если текущая октава - 0-ая (самая нижняя), выбран- ная октава остается 0-ой. Ln Устанавливает длительность последующих нот согласно таблице: L1 целая L2 половина L4 одна четверть L8 одна восьмая L16 одна шестнадцатая . . . L64 одна шестьдесят четвертая Допустимы также промежуточные значения (так L5 - правильное значение длительности). Наибольшее до- пустимое значение n - 64. Pn Означает паузу длиной в n долей (где n представ- ляет число долей, заданных в последней команде L). Точка в конце ноты увеличивает ее длительность в полтора раза. Например, четвертная нота с точкой имеет длительность одной четверти и одной восьмой. Можно использовать не одну точку. Вторая точка увеличивает длительность комбинации "нота с точкой" еще в полтора раза, так четверть ноты с двумя точками будет исполняться в течение 1,5 * (1,5 * 1/4) долей. Точки могут также удлинять паузы. Tn Устанавливает темп, где n - число четвертных долей в минуту. n может изменяться от 32 до 255. По умол- чанию, 120. MF Музыка с "высоким приоритетом" означает немедлен- ное исполнение музыки, созданной с помощью операто- ра PLAY (то есть, следующий оператор программы не будет выполняться до тех пор, пока не закончится PLAY). MB "Фоновая музыка" означает, что музыка исполняется тогда, когда программа занимается другими делами. По умолчанию, в ТУРБО БЕЙСИК есть 32-нотный буфер для фонового воспроизведения, размер буфера может быть увеличен метаоператором $SOUND. Просмотрите операторы PLAY ON и ON PLAY, которые также могут периодически контролировать процесс исполнения фоновой музыки и добавлять при необходимости новые ноты. MN/ML/MS Согласно этой установке ноты могут длиться либо три четверти времени, заданного с помощью L (MS: стаккато), либо семь восьмых (MN: нормально), либо все время, отведенное с помощью L (ML: легато). X + VARPTR$(символьная переменная) Команда X (выполнить подстроку) позволяет ввести в оператор PLAY подстроку, являющуюся музыкальной подпрограммой; например, операторы: a$ = "C D E" : PLAY "E D E X" + VARPTR$(a$) исполняют ноты E, D, E, C, D и E. Переменные аргументы В каждом операторе PLAY аргумент может иметь либо постоянное значение, либо задаваться в виде VARPTR$(переменная), где переменная - это числовая переменная. Обратите внимание, что Интерпретатор BASIC позволяет задавать имена переменных непос- редственно в строке оператора PLAY. Например, PLAY "T=x;" устанавливает темп согласно переменной x. Хотя это и неплохая возможность, но в ТУРБО БЕЙСИКЕ она не реализована, так как информация, связанная с переменной x, недоступна в момент выполнения.Вместо этого следует использовать описанные выше возмож- ности VARPTR$. См.также ON PLAY , PLAY ON , $SOUND Пример firstline$ = "O3 L4 C L2 E E L8 E L4 E E D C F L1 <A" secondline$ = "O3 L8 C C C L4 E D L2 <A L4 A L1 >C" thirdline$ = "L4 C L10 F F. F L1 E" PLAY "T150" 'увеличить темп FOR n = 1 TO 4 PLAY firstline$ NEXT n PLAY secondline$ + thirdline$ Функция PMAP ----------------------------------------------------------------- Назначение PMAP переводит физические координаты в координаты, заданные пользователем, и наоборот. Синтаксис y = PMAP (x, вариант) Замечания x - координата точки, подлежащая преобразованию; ва- риант - целое выражение от 0 до 3, которое управляет функцией PMAP согласно следующей таблице: ------------------------------------------------------- Вариант Действие ------------------------------------------------------- 0 Преобразует координату x в системе координат, заданной пользователем, в физическую координату x 1 Преобразует координату y в системе координат, заданной пользователем, в физическую координату y 2 Преобразует физическую координату x в координату x в системе координат пользователя 3 Преобразует физическую координату y в координату y в системе координат пользователя ------------------------------------------------------- PMAP выполняет масштабирование, заданное последним оператором WINDOW, при этом вывод на экран не производится. См.также WINDOW Пример ' переключение в графический режим со средним ' разрешением SCREEN 1 ' определение прямоугольных координат ' с центром в середине экрана с большим ' диапазоном значений x и y, где y растет ' при движении вверх, а не вниз WINDOW (-1000,1000) - (1000,-1000) ' PMAP устанавливает соответствие между ' декартовыми координатами и физическими пикселами PSET (PMAP (0,0), PMAP (0,1)),2 PSET (PMAP (50,2), PMAP (50,3)),2 PRINT PMAP(0,0), PMAP(0,1), PMAP(50,2), PMAP(50,3) END 'конец программы Функция POINT ----------------------------------------------------------------- Назначение POINT возвращает цвет пиксела или данные LPR. Синтаксис Первая форма: цвет = POINT (x,y) Вторая форма: y = POINT (вариант) Замечания В первой форме (x,y) задают координаты графического пиксела в среднем или высоком разрешении. POINT возвращает значение атрибута (цвет) в пикселе (x,y). Если либо x, либо y выходят за пределы допустимого диапазона, POINT возвращает -1. Во второй форме, вариант - это числовая переменная или выражение, которое управляет действием POINT согласно следующей таблице: ---------------------------------------------------------- Вариант Действие ---------------------------------------------------------- 0 Возвращает текущее значение физической координаты x 1 Возвращает текущее значение физической координаты y 2 Возвращает текущую координату x в системе координат, заданной пользователем 3 Возвращает текущую координату y в системе координат, заданной пользователем ---------------------------------------------------------- Первая форма POINT полезна для простого оживления изображения по одному пикселу за раз. Используйте POINT для определения цвета фонового пиксела и записи его цвета во временную переменную. Затем задайте с помощью PSET цвет движущегося объекта в этой точке. Наконец, сотрите точку, верните ей ее первоначальный цвет. См.также PSET Пример ' переключение в графический режим со средним ' разрешением SCREEN 1 CIRCLE (160,100),50,2 'нарисовать круг ' поставить точку в центре круга PSET (160,100),1 ' вывод цвета точки и ее местоположения PRINT POINT (160,100) PRINT POINT (0),POINT (1) END 'конец программы Оператор POKE ----------------------------------------------------------------- Назначение POKE записывает байт по заданному адресу Синтаксис POKE смещение, значение Замечания смещение - это адрес, числовое значение в диапазоне от 0 до 65535, значение - байтовая величина от 0 до 255, которая записывается по заданному адресу. Смещение указывается относительно сегмента, определенного в последнем операторе DEF SEG. POKE записывает однобайтовые величины по заданному адресу. Оператор POKE осуществляет доступ к памяти на более низком уровне, чем основные операции ТУРБО БЕЙСИКА. Поскольку оператор POKE не проверяет ошибки, неправильное его использование может привести к краху операционной системы или вашей программы. См.также PEEK Пример см. PEEK Функция POS ----------------------------------------------------------------- Назначение POS возвращает горизонтальную позицию курсора (номер колонки). Синтаксис y = POS (x) Замечания x - это фиктивный числовой аргумент. Значение, возвращаемое POS, изменяется в диапазоне от 1 до 80 и представляет собой горизонтальную позицию (номер колонки) курсора. Для определения вертикальной позиции (номера строки) следует использовать функ- цию CSRLIN. Для перемещения и упрятывания курсора используйте оператор LOCATE. См.также CSRLIN , LOCATE , LPOS Пример ' установка обработки события ON TIMER(1) GOSUB DisplayClock ' включение прерывания по событию TIMER ON ' до тех пор, пока не нажата клавиша, PRINT "Нажмите любую клавишу для завершения..." WHILE NOT INSTAT WEND END 'конец программы DisplayClock: OldX% = POS OldY% = CSRLIN LOCATE 1,72,1 PRINT TIME$ LOCATE OldY%,OLDX%,1 RETURN Оператор PRESET ----------------------------------------------------------------- Назначение PRESET изображает точку на графическом экране Синтаксис PRESET (x,y) [,цвет] Замечания (x,y) абсолютные или относительные координаты изображаемой точки на графическом экране. Цвет - это целое выражение, определяющее, каким цветом должна быть изображена точка. В зависимости от режима экрана на цвет накладываются соответствующие ограничения. Допустимые диапазоны атрибута в каждом режиме приведены в описании оператора PALETTE. Если цвет задан, то оператор PRESET и дополняющий его оператор PSET действуют одинаково. Различие между ними состоит в том, что по умолчанию значение цвета оператора PRESET равно 0 (цвет фона), тогда как у оператора PSET оно равно максимально допустимому в текущем режиме значению. Другими словами, если цвет не задан, PSET зажигает пикселы, а PRESET гасит их. См.также PSET Пример см. PSET Оператор PRINT ----------------------------------------------------------------- Назначение PRINT посылает данные на экран Синтаксис PRINT [список-выражений] [;] Замечания Список-выражений - последоватальность числовых и/или символьных выражений, разделенных точками с запятой, пробелами или запятыми. Если в конце списка выражений не указана точка с запятой, ТУРБО БЕЙСИК выводит после данных из списка возврат каретки. Если список выражений опущен, PRINT выполняет только возврат каретки. PRINT использует знаки пунктуации, разделяющие выражения в списке, для определения места на экране, где разместить выходные данные. Печатные зоны Для быстрого и аккуратного вывода, ТУРБО БЕЙСИК делит экран на "печатные зоны", каждая из которых состоит из 14 колонок. Запятая после выражения в списке задает вывод данных, определяемых следующим выражением, с начала следующей печатной зоны. Точка с запятой или пробел после выражения задает вывод данных следующего выражения непосредственно после предыдущих безотноси- тельно к печатным зонам. Если оператор PRINT заверша- ется запятой, точкой с запятой, функциями SPC или TAB, следующий оператор PRINT начнет вывод с той же строки. В остальных случаях следующий оператор PRINT начнет вывод с первой позиции следующей строки. После числовых значений всегда указывается пробел, положительным числам предшествует знак "+", отрицательным - "-". Оператор PRINT может быть сокращенно обозначен, как "?" (сомнительного достоинства удобство для ввода программы, сохранившееся от интерпретаторов прежних времен). ? "Hello" означает то же самое, что и PRINT "Hello" См.также LPRINT , LPRINT USING , PRINT USING , SPC , TAB Пример N = 2 PRINT "Строки и числа - это" N "примера"; PRINT " вещей, которые можно напечатать" ' запятые в качестве разделителей управляют ' размещением данных в зонах по 14 позиций каждая A = 1 B = 2 C = 3 PRINT A, B, C,"Текст" ' точки запятой и пробелы в качестве разделителей ' выводят данные слитно PRINT A;B;C;"Текст" END 'конец программы Операторы PRINT# и PRINT# USING ----------------------------------------------------------------- Назначение PRINT# и PRINT# USING записывают в файл форматиро- ванные данные Синтаксис PRINT # номер-файла, [USING строка-формата;] _ список-выражений [;]. Замечания Номер-файла - значение, определяемое при открытии файла. Строка-формата - это необязательная последовательность форматирующих символов (описание см. в операторе PRINT USING). Список выражений - это последовательность числовых и/или символьных выражений, выводимых в файл. PRINT# записывает данные в файл точно так же, как оператор PRINT выводит их на экран. Однако вывод с помощью PRINT# требует внимания, иначе вы можете заполнить большой объем дискового пространства лишними пробелами или, что еще хуже, разместить данные так близко друг к другу, что их невозможно будет разделить при последующем вводе с помощью оператора INPUT#. Например: PRINT#1 1,2,3 посылает в файл #1 1 2 3 Символы размещаются в 14-знаковых зонах, поэтому в файл посылается огромное количество избыточных про- белов. С другой стороны: PRINT#1 1;2;3 посылает в файл 1 2 3 причем нельзя прочитать отдельные числовые значения из этой записи, так как оператор INPUT# требует запятых в качестве разделителей. Наиболее надежный способ разделения полей состоит в указании запятых между каждыми двумя полями, например, оператор: PRINT#1, 1","2","3 записывает данные в файл в виде: 1, 2, 3 включающем наименьшее из возможных число пробелов и легко читаемым оператором INPUT#. Оператор WRITE# отделяет поля запятыми автоматически. Пример см. INPUT# Оператор PRINT USING ----------------------------------------------------------------- Назначение PRINT USING посылает на экран сформатированную информацию. Синтаксис PRINT USING строка-формата; список-выражений [;]. Замечания Строка-формата - это символьное константа или пере- менная, задающая способ форматирования информации в списке выражений. Список-выражений - это выводимые символьные или числовые данные, разделенные запяты- ми, пробелами или точками с запятой. Оператор PRINT USING игнорирует знаки пунктуации в выражени- ях из списка. Форматирование строковых значений Чтобы вывести всю строку, следует указать в строке формата амперсенд (&). Для вывода первых n символов строки нужно указать строку формата, со- стоящую из символов обратная косая черта ("\"), между которыми указаны (или не указаны) пробелы. ТУРБО БЕЙСИК выводит столько символов в выходной строке, сколько символов, включая символы косой черты, задано в строке формата. Например, если строка формата "\\" (нет пробелов, длина равна 2) выводятся два символа; для строки формата "\ \" (два пробела, длина равна 4) выводятся 4 символа. Строка формата "!" задает печать только одного символа выводимой строки: a$ = "cats and dogs" PRINT USING "&"; a$ PRINT USING "\ \"; a$: PRINT USING "\\", a$ PRINT USING "!"; a$ Форматирование числовых значений Знаки номера (#) в строке формата представляют цифры числа. Десятичная точка и другие специальные символы (например, знаки доллара) размещаются таким образом, чтобы указать вид форматного вывода числа, в частности, число цифр справа от десятичной точки. Например: PRINT USING "##.##"; 3.14159,.01032 PRINT USING "+##.##"; 12.0101,-6.2 (включение знака перед числом) PRINT USING "##.##-"; 12.0101, -6.2 (для отрицательных чисел знак указывается после числа) PRINT USING "$$##.##"; 12.0101 (вывести знак доллара слитно с числом) PRINT USING "**##.##"; 12.0101 (заполнение звездочками лидирующих пробелов) PRINT USING "**$##.##"; 12.0101 (комбинация предыдущих форматов) PRINT USING "#####,.##", 6666.66 (запятая перед десятичной точкой означает груп- пировку цифр по три) PRINT USING "#.####^^^^"; 34567.12 (четыре или пять знаков ^ означают использование научного представления) PRINT USING "_###.##"; 12.1010 (знак подчеркивания, предшествующий символу в строке формата, означает, что этот символ должен быть выведен без изменения, а не использован для форматирования). Если значение слишком велико для заданного фор- мата, перед ним печатается знак процента (%). PRINT USING "#.#"; 27.4 Оператор PSET ----------------------------------------------------------------- Назначение PSET изображает точку на графическом экране. Синтаксис PSET (x,y) [,цвет] Замечания (x,y) абсолютные или относительные координаты изображаемой точки на графическом экране. Цвет - это целое выражение, определяющее, каким цветом должна быть изображена точка. В зависимости от режима экрана на цвет накладываются соответствующие ограничения. В режиме со средним разрешением допустимы значения цветов от 0 до 3. В режиме с высоким разрешением допустимы лишь значения цветов 0 и 1. Если цвет задан, то оператор PSET и дополняющий его оператор PRESET действуют одинаково. Различие между ними состоит в том, что по умолчанию значение цвета оператора PRESET равно 0 (цвет фона), тогда как у оператора PSET оно равно максимально допустимому в текущем режиме значению (т.е. 3 для среднего разрешения и 1 для высокого разрешения). Другими словами, если цвет не задан, PSET зажигает пикселы, а PRESET гасит их. См.также POINT , PRESET Пример ' включение графического режима ' со средним разрешением SCREEN 1 FOR I% = 0 TO 359 FOR J% = 0 TO 199 DELAY 0.01 PSET (I%, J%) NEXT J% NEXT I% FOR I% = 0 TO 359 FOR J% = 0 TO 199 DELAY 0.01 PRESET (I%, J%) NEXT J% NEXT I% END 'конец программы Оператор PUT (файлы) ----------------------------------------------------------------- Назначение PUT заносит запись в файл с произвольным доступом Синтаксис PUT [#] номер-файла [,номер-записи] Замечания Номер-файла задается при открытии файла, номер-записи - числовое выражение в диапазоне от 1 до 16777216, описывающие заносимую запись. Оператор PUT является дополнительным по отношению к оператору GET. Оператор PUT заносит одну запись в файл с произвольным доступом, номер записи не является обязательным. Если он не задан, ТУРБО БЕЙСИК использует значения, определенного для последнего оператора PUT или GET плюс 1. Пример см. FIELD Оператор PUT (графика) ----------------------------------------------------------------- Назначение PUT изображает содержимое числового массива на графическом экране Синтаксис PUT(x,y), массив [,вариант] Замечания (x,y) - абсолютные или относительные координаты верхнего левого угла прямоугольника, в который будет переведено содержимое массива. Массив - это числовой массив, содержащий графические данные, которые будут размещены на экране. Вариант - это одно из слов следующей таблицы, управляющих тем, как данные массива будут соотнесены с уже имеющимся изображением на экране: ---------------------------------------------------------- Вариант для Действие PUT ---------------------------------------------------------- PSET размещает точную копию изображения из массива PRESET размещает комплементарную копию изображения из массива XOR выполняет операцию XOR между изображением из массива и экраном OR выполняет операцию OR между изображением из массива и экраном AND выполняет операцию AND между изображением из массива и экраном -------------------------------------------------------- Вариант PSET изображает на экране данные из массива, не выполняя никаких преобразований, не- зависимо от того, что в данный момент изображено на экране. PRESET изображает комплементарную копию массива. Например, если некоторый пиксел в массиве имеет цвет 3, его изображение на экране с помощью оператора PUT с атрибутом PRESET будет иметь цвет 0 и, наоборот. Аналогично, цвет 1 будет преобразован в цвет 2 и, наоборот. Варианты AND, OR и XOR выпол- няют логические операции между каждым пикселом, уже изображенным на экране, и изображаемым пикселом из массива. Вариант XOR (установленый по умолчанию) особенно полезен при изображении движения объектов на составном фоне. Первый оператор PUT XOR изо- бражает объект на экране, второе выполнение того же оператора восстановит фон в соответствии с пре- дыдущим состоянием. Пример см. GET (графика) Функция PUT$ ----------------------------------------------------------------- Назначение PUT$ записывает строку в файл типа BINARY Синтаксис PUT$ [#] номер файла, символьное выражение Замечания PUT$ записывает содержимое символьного выражения в файл, с заданным номером, в позицию, установлен- ную для этого файла оператором SEEK. Файл, в кото- рый производится запись, должен быть открыт в ре- жиме BINARY См.также GET$ , OPEN , SEEK Пример OPEN "BASIC.DOS" FOR BINARY AS 1 PUT$ #1, "компилятор БЕЙСИКА - это 99%" PUT$ #1, "труда и 1% вдохновения" CLOSE #1 END