|
Часть 6
Метаоператоры $IF/$ELSE/$ENDIF
-----------------------------------------------------------------
Назначение Метаоператоры $IF, $ELSE и $ENDIF определяют
порции исходной программы, которые необходимо
компилировать или пропустить (это часто назы-
вается условным компилированием)
Синтаксис $IF const (постоянная)
.
. операторы
.
[$ELSE
.
. операторы]
.
$ENDIF
Комментарий const представляет собой константу с присвоен-
ным именем или постоянную величину. Если const
не равна нулю (TRUE), тогда операторы между
$IF и $ELSE компилируются, а операторы между
$ELSE и $ENDIF не компилируются. Если const
равна нулю (FALSE), тогда операторы между $IF
и $ELSE игнорируются, а между $ELSE и $ENDIF
компилируются.
Метаоператор $ELSE является необязательным,
а $ENDIF обязательным.
Операторы условной компиляции могут быть
вложены на уровне глубины 256.
Пример %ColorScreen = 1 ' установка константы с прис-
' военнным именем на величину
' не равную нулю, указывает
' на операцию на цветной сис-
' теме.
' установка виличины, равной нулю, указывает
' на операцию
' на монохронной системе
SIF %ColorScreen
DEF SEG = &HB800 ' графический адрес
' экранная память
$ELSE
DEF SEG = &HB800 ' монохронный адрес
' экранная память
FOR I% = 0 to 4000 STEP 2
POKE I%,ASC("A") ' заполнить экран буквами А
NEXT I%
' сохранить все 4000 блоков видео записи
BSAVE "SIF.DTA",0,4000
END ' закончить программу
Метаоператор INCLUDE
-----------------------------------------------------------------
Назначение $INCLUDE включает текстовой файл.
Синтаксис $INCLUDE filespec literal
Комментарий Используется $INCLUDE для компилирования текс-
та другого файла наряду с текущим файлом.
filespec literal - это символьная константа, а
файл, который она представляет, должен исполь-
зовать условные обозначения имени файла DOS и
должен представлять исходный ффайл ТУРБО БЕЙ-
СИКа. Если для файла включения не указывается
имя файла, то ему присваивается расширение
BAC.
Механизм $INCLUDE заявляет компилятор обхо-
диться с включенным файлом так, как будто он
физически присутствовал в этот момент в ориги-
нальном тексте. Это позволяет вам развить вашу
исходную программу на удобные в использовании
куски программы. Концепция ТУРБО БЕЙСИКа рабо-
чий-файл/главный-файл связана с $INCLUDE. В
качестве иллюстрации рассмотрите файлы CAL-
CAREA.BAS и CONCT.BAS:
File CALCAREA.BAS
PRINT "Circle area calculating program"
PRINT "If you find this program useful"
PRINT "Please send $3,500 to:"
PRINT
PRINT "Frank Borland"
PRINT "4585 Scorland"
PRINT "Scotts Valley, CA 95066"
PRINT "-------------------------------"
$INCLUDE "CONST.BAS"
INPUT "Enter radius", r
PRINT "Area =" pi * r * r
File CONST.BAS
' All purpose constants
pi = ATN(1) * 4
%true = -1
%false = 0
%maxx = 319
%maxy = 199
Для компилирования этой программы, CALCAREA
необходимо сделать "главным файлом", т.к. он
является файлом с оператором $INCLUDE. Рабочий
файд "путешествует" вперед и назад между файла-
ми, в зависимости от того, где требуется редак-
тирование (т.е. где есть ошибки). Независимо от
текущего рабочего файла, компиляция всегда на-
чинается с CALCAREA (главный файл). (Более под-
робно описывается в Главе 3 "Основное меню").
Когда компилятор ТУБРО БЕЙСИКа встречает ме-
таоператор $INCLUDE в 7 строке CALCAREA, он
приостанавливает считывание с кода, загружает и
начинает считывать знаки с CONST.BAS. Когда
этот код исчерпан, компилятор возвращается в то
место оригинальной программы, где было приоста-
новлено считывание.
Метаоператор $INCLUDE может быть помещён на
глубину 5; то есть включенный файл может иметь
свой собственный метаоператор $INCLUDE.
Пример ' Записать следующую информацию в файл
' называемый "EXAMPLE.INC".
SUB SayHello ' процедура печатает
PRINT "Hello" ' "Hello" ("привет") на экране
END SUB
' Далее идет главная программа
$INCLUDE "EXAMPLE.INC" ' включить исходный файл
CALL SayHello ' вызвать определенную процедуру
' в включенном файле
END ' закончить программу
Метаоператор $INLINE
-----------------------------------------------------------------
Назначение $INLINE об'являет встроенный машинный код в
встроенной процедуре.
Синтаксис $INLINE [byte list] [filespec literal]
Комментарий $INLINE встречается только в пределах тела
встроенной процедуры.
byte list представляет собой последователь-
ность целых чисел в пределах от 0 до 255,
кото-рые должны кодироваться непостредственно
в об'ектный код в этом месте.
filespec literal - это имя файла, содержа-
щего код, который необходимо встроить. Этот
код должен перемещаться, а также сохранять и
восстанавливать следующие регистры: Сегмент
Стека (SS), Указатель Стека (SP), Указатель
Базы (ВР), Сегмент Данных (DS). Встроенный
(inline) код может обращаться к параметрам,
использую относительную адресацию BP. (Более
подробно об этом см. Приложение А "Рассмотре-
ние чисел" и Приложение С "Интерфейс языка Ас-
семблера").
Пример SUB Shiek INLINE
' $INLINE заставляет говорящего издать крик
$INLINE &HBA, &HOO, &HO7, &HE4, &H61, &H24
$INLINE &HFC, &H34, &HO2, &HE6, &H61, &HB9
$INLINE &H4O, &HO1, &HE2, &HFE, &H4A, &H74
$INLINE &HO2, &HEB, &HF2
END SUB
CALL Shriek
END ' закончить программу
Метаоператор $SEGMENT
-----------------------------------------------------------------
Назначение $SEGMENT об'являет новый сегмент кода.
Синтаксис $SEGMENT
Комментарий Используйте метаоператор $SEGMENT "отсутстсвие
аргумента" для прерывания вашей исходной
программы, когда компилятор сообщает, что
произошло прерывание ограничения сегмента кода
64К:
Error 409 Segment Overflow
Вся информация после метаоператора $SEGMENT
будет помещена в новый сегмент кода. Это прев-
ращает каждый оператор управляющей логики
программы (GOSUB, GOTO), который проходит кон-
троль через данную границу, в движение интер-
сегмента, вызов или скачок, для выполнения ко-
торых требуется немного больше времени и об'-
ема стека. Эту потерю времени можно уменьшить,
поместив операторы $SEGMENT в местах, где
происходит естественное разделение вашей
программы; например, между главной программой
и подпрограммами или между главной программой
и кодом инициализации или окончание.
В программе ТУРБО БЕЙСИКа может быть до 16
сегментов кода. Данные состояния компиляции,
напечатанные после компиляции, покажут размеры
каждого сегмента, отделенные косой чертой (/).
Нельзя использовать оператор $SEGMENT в рам-
ках структурного блока; например, FOR/NEXT,
DO/LOOP, WHILE/WEND, IF BLOCK.
Пример SUB Proc1
PRINT "This is a dummy procedure"
END SUB
$SEGMENT ' определите второй сегмент
SUB Proc2
PRINT "This is another dummy procedure"
END SUB
$SEGMENT ' определите третий сегмент
SUB Proc3
PRINT "This is another dummy procedure"
END SUB
CALL Proc1
CALL Proc2
CALL Proc3
END ' закончить программу
Метаоператор $SOUND
-----------------------------------------------------------------
Назначение $SOUND об'являет емкость буфера фоновой
музыки.
Синтаксис $SOUND buffer size
Космментарий buffer size - это численная константа, показы-
вающая нотную емкость фонового буфера
оператора PLAY, от 1 до 4,096. Увеличение
ёмкости буфера до максимума (количество нот,
которые прозвучат в данной программе) делает
создание нотносчетной ловушки ненужным.
Каждая нота требует 8 байтов памяти;
емкость по умолчанию составляет 32 ноты или
256 байтов. Значение по умолчанию может быть
использовано и записано путем использования
элемента Music Byffer на меню Options. Значе-
ния по умолчанию заменяются метаоператорами,
встроенными в код.
Метаоператор $STACK
-----------------------------------------------------------------
Назначение $STACK описывает размер стека выполнения прог-
раммы.
Синтаксис $STECK count
Комментарий count- это численная константа от 1024 до 32К.
Метаоператор $STACK определяет какой об'м па-
мяти выполнения программы будет отведен стеку.
Стек используется для адреса возврата во время
вызовов программы и в рамках структурных
операторов, а также в локальных переменных
многострочных функций. Размер по умолчанию (и
минимальный) - 1024 (400Н) байтов.
Вам может понадобится больший об'ем стека,
если ваша программа ненормально расположена,
испльзует большие локальные переменные или
осуществляет рекурсию. Если вы предполагаете,
что вашей программе не хватит об'ма стека, то
вам необходимо вновь произвести компиляцию с
версией текста STACK в меню Options. Програм-
мы, генерируемые с настоящим переключателем
отладки во включенном состоянии, всегда прове-
ряют имеющийся в распоряжении об'ем стека до
входа в подпрограммы, процедуры и функции.
Значения по умолчанию заменяются метаоперато-
рами, встроенными в код.
Вы можете самостоятельно проверить количес-
тво свободного об'ема стека с помощью функции
FRE(-2).
См.также FRE
Пример ' Дает стек в 4,096 байтов...
$STACK &H1000
PRINT FRE(-2) ' показывает омеющийся в распоря-
' жении об'ём стека
Метаоператор $STATIC
-----------------------------------------------------------------
Назначение Метаоператор $STATIC описывает размещение мас-
сива по умолчанию как статическое.
Синтаксис $STATIC
Комментарий Метаоператор $STATIC не принимает аргумента и
приписывает размещение массива по умолчанию
как статический тип. Пространство для
статических массивов выделяется во время
компиляции. Массивы с постоянными размерами
являются всегда статическими, кроме тех случа-
ев, когда массив описывается локальным по от-
ношению к процедуре или функции, либо если для
одного и того же массива существует более, чем
одна величина (размер).
Статические массивы не уничтожаются. Опера-
тор ERASE только инициирует каждый элемент в
массиве к нулю или пустой строке.
Обратите внимание, что метаоператор
$STATIC, несмотря на косметическое сходство,
не имеет ничего общего с оператором STATIC,
который описывает специальный тип локальной
переменной в пределах процедур и функций.
Метаоператор $STATIC есть по умолчанию ком-
пилятора.
См.также DIM $DYNAMIC ERASE FRE
Пример $STATIC ' эксплицитно об'являет статические
' массивы
PRINT "Memory available:",FRE(-1)
' об'ём памяти остается таким же
DIM A(50) ' A является статическим массивом
PRINT "Memory available:",FRE(-1)
N = 50
' B является динамическим массивом из-за
' выражения, используемого в качестве ар-
' гумента в операторе DIM
DIM B(N)
PRINT "Memory available:",FRE(-1)
' теперь уже меньше
ERASE A
PRINT "Memory available:",FRE(-1)
' нет никакой разницы, потому что А не переме-
' щается
' просто обнуляется
ERASE B
PRINT "Memory available:",FRE(-1)
' больший об'ем памяти, т.к. динамические
' массивы перемещаются
END ' закончить программу
Функция ABS
-----------------------------------------------------------------
Назначение ABS возвращает абсолютное значение
Синтаксис y = ABS (numeric expression)
Комментарий ABS возвращает абсолютное значение численного
выражения. Абсолютное значение х указывает его
величину без учета знака. Например абсолютное
значение -3 это 3; абсолютное значение +3 это
3.
Пример ' ABS возвращает текущее расстояние от "дома"
' посредством учета абсолютного значения расс-
' тояния
' назначить размещение
Location# = -6,5
' показать текущую позицию
PRINT "Current location:", Location#
' показать расстояние от дома
PRINT "Расстояние от дома:", ABS (Distance#)
(Location#).
Функция ASC
-----------------------------------------------------------------
Назначение ASC возвращает код ASCII первого знака строки.
Синтаксис y = ASC (string expression)
Примечания ASC возвращает код ASCII (от 0 до 255) первого
знака символьного выражения.
Для перевода целочисленной строки в знако-
вую используйте комплементарную функцию CHR$,
которая производит однозначную строку при
подаче значения ASCII.
Ограничения Символьное выражение переходящее к АСЦ
может не быть нуль-строкой (пустой строкой).
Если же это происходит, генерируется ошибка
выполнения S, Illegal Function Call.
См.также CHR$
Пример PRINT "The ASCII value of is"; ASC("A")
Функция АТN
-----------------------------------------------------------------
Назначение ATN возвращает тригонометрический арктангенс.
Синтаксис y = ATN (numeric expression)
Комментарий ATN возвращает арктангенс (обратный тангенс)
численного выражения, т.е. угол с тангенсом
численного выражения. ATN возвращает результат
с удвоенной точностью.
Результат, как и во всех операциях с углами
в ТВ, выражается в радианах (большей частью),
а не в градусах. Радианы представляют собой
математически более удобное измерение угла,
выраженные в радианах. Углы в градусах бывают
от 0 до 360, углы, выраженные в радианах, име-
ют диапозон от 0 до pi, причем 0 радиан изме-
ряется вдоль положительной оси Х и возрастает
против часовой стрелки. Т.о. отрицательная ось
У (90 градусов) равняется pi/2 радианам, отри-
цательная ось Х (180 градусов) равняется pi
радианам, а отрицательная ось У (270 градусов)
равняется 3pi/2 радиан.
Если вам удобнее работать с градусами,
радианы можно перевести в градусы умножив
значение радианы на 57,2958. Например,
арктангенс 0,23456 равняется
ATN (.23456) радиан = 0.230395 радиан =
(0.230395 * 57.2958) градусов = 13.2 градуса
Для перевода градусов в радианы необходимо
умножить на 0.0174533. Например:
14 градусов = (0.174533 * 14) радиан = 0.24435
радиан
Чтобы не запоминать громоздкие условия пе-
ревода градусов в радианы, рекомендуем запом-
нить вот это соотношение 2п радиан = полному
кругу, равному 360 градусов, таким образом 1
радиан = 180/pi градусов. И наоборот, 1 гра-
дус = pi/180 радиан.
Для справки, величина числа pi с точностью
до 16 знаков равна 3,141592653589793
Данное значение можно вычислить по выражению
pi# = 4 * ATN(I)
Перевод градусов в радианы и радианы в гра-
дусы является хорошим применением для одноли-
нейных функций.
См.также COS SIN TAN
Пример ' вычислите значение pi используя ATN
PI# = 4*ATN(I)
PRINT PI#
Оператор BEEP
-----------------------------------------------------------------
напначение BEEP "звонок"
Синтаксис BEEP [count]
Комментарий BEEP воспроизводит тон на 800 Hz через встро-
енное устройство за 0,25 секунды. Необяза-
тельнфй численный аргумент вызывает счет BEEP
операторов.
BEEP имеет такой же эффект, как и вывод
символа звуковой сигнализацииASCII (код 7) на
экран. Например, PRINT CHR$(7). Более
мелодичные тоны создаются при помощи
операторов SOUND и PLAY.
См.также PLAY SOUND
Пример BEEP2 ' привлечь внимание пользователя
Функция BIN$
-----------------------------------------------------------------
Назначение BIN$ возвращает двоичный символьный эквивалент
числа.
Синтаксис s$ = BIN$ (numeric expression)
Комментарий численное выражение находится в диапазоне от
32.768 до 65.535. Любая дробная часть округля-
ется до того, как создается строка. Если чис-
ленное выражение отрицательное, BIN$
возвращает дополнительный код числа.
См.также HEX$ OCT$
Пример ' Этот пример иллюстрирует как десятичные,так
' и двоичные значения от -5 до 5.
FOR I% = -5 to 5 ' от -5 до 5
' показывает десятичные и двоичные значения I&
PRINT USING "The binary equivalant of -## =&";
I%,BIN$(1%)
NEXT I%
END ' закончить программу
Оператор BLOAD
-----------------------------------------------------------------
Назначение BLOAD загружает файл BSAVEd в память.
Синтаксис BLOAD filespec[,address]
Комментарий filespec есть симавольное выражение, определя-
ющее файл для загрузки, оно должно следовать
стандартным условным обозначениям присвоения
имени DOS, факультативно включая спецификатор
накопителя и/или маршрут address представляет
собой необязательное численное выражение от 0
до 65,535 с указанием где в текущем сегменте
должен загружаться файл. В случае опущения,
BLOAD помещает файл на адрес, с которого он
был первоначально BSAVEd.
Если дается адрес, он заменяет адресную ин-
формацию, записанную в файлах, произведенных
оператором BSAVE. Учитывая тот факт, что на
адресе BLOAD не происходит никакой проверки,
вполне возможно загрузить файл сверх DOS и/или
вашей программы и разрушить систему.
Ограничения BLOAD не будет загружать непосредственно па-
мять EGA.
См.также BSAVE DEF SEG
Пример REM LoadGraphicsScreen
DEF SEG &HB800
BLOAD "Pictcre",0
Оператор BSAVE
-----------------------------------------------------------------
Назначение BSAVE записывает диапазон памяти на диске.
Синтаксис BSAVE filespec,address,length
Комментарий filespec есть символьное выражение, определя-
ющее файл, в который должны быть занесены
данные. filespec должен соблюдать стандартные
условные обозначения присвоения имени DOS, и
может факультативно включать спецификатор на-
копителя и/или информацию о маршруте. Адрес
есть численное выражение с диапазоном от 0 до
65,535 и указывает на оффсетную часть адреса,
с которой будет записан filespec (см.оператор
DEF SEG), длина есть число байтов, которые
должны быть записаны, от 0 до 65,535.
BSAVE сохраняет объем памяти на диске (в дей-
ствительности записывает цифровой моментальный
снимок указанного объема памяти во время
BSAVE). Файлы, созданные с помощью BSAVE могут
затем перезагружаться с командой BLOAD; фа-
культативно файлы могут быть загружены по
другому адресу, чем с случае BSAVE.
BSAVE и BLOAD часто используются для записи
и загрузки экранных образов при помощи непос-
редственно считывания и записывания в память
дисплея. Буфера дисплея Монохромного Адаптера
Дисплея вмещает 4,000 байтов и начинается на
оффсете 0 в сегменте HB000. Буфер дисплея CGA
вмещает 4,000 байтов в режиме текста (SCREEN
0) и 16,384 байта в графическом режиме
среднего и высокого разрешения; оба начанаются
с 0 в сегменте &HB800.
Ограничения Перед выполнением оператора BSAVE, программа
должна эксплицитно установить сегмент, который
будет записан на диске с использованием опера-
тора DEF SEG.
См.также BLOAD DEF SEG
Пример 'BSAVE заполняет экран символами А и записыва-
ет на диске
FOR I% = 1 to 2000
PRINT "A"; ' заполняет экран символами А
NEXT I%
' определить сегмент для BSAVE
DEF SEG = &HB000
' записывает монохромный видео ram
BSAVE "TEXT".PIC",0,4000
' количество знаков, умноженные на два
' из-за атрибутов
END ' закончить программу
Оператора CALL
------------------------------------------------------------------
Назначение CALL вызывает процедуру(подпрограмму)
Синтаксис CALL procname [(список параметров)]
Комментарий procname представляет собой имя процедуры,
определенной где-либо в программе с помощью
оператора SUB. Список параметров является нео-
бязательным, с отдельным занятым списком пере-
менных, выражений, и/или констант,которые
должны быть переведены в имя процедуры.
Существует 3 типа процедур SUB: STATIC
(статические), стандартные процедуры и INLINE
(встроенные). Все, о чем здесь говорится,
относится ко всем 3 типам; однако, то, как
компилятор будет работать со списком парамет-
ров, зависит от типа процедуры SUB.
Количество и тип проходных аргументов
должны соответствовать вписку параметров в
определении имени процедуры; иначе произойдет
ошибка Parameter Mismatch времени компиляции.
Если процедура SUB является процедурой
INLINE, число аргументов варьируется и не
происходит проверка типов параметров. В
компетенцию процедуры SUB INLINE входит знание
и определение количества и типов параметров,
которые в нее переходят (более подробно об
этом см. Приложение C, "Интерфейс языка
ассемблера").
Когда аргументы процедуры проходят ссылками
(т.е. переменными), они могут изменяться выз-
ванными процедурами. Когда переменная заключа-
ся в круглые скобки, она проходит по значению
и оригинальное значение не может быть
изменено. Обратите внимание, что выражения и
постоянные всегда проходят по значению.
Аргументы массивов определяются с использо-
ванием пустых скобок после имени массива.
Массивы всегда проходят посредством ссылки.
Например:
CALL SumArray (a()) ' перевести массив a на
' SumArray
CALL SumArray (a(3)) ' перевести элементы 3 а
' на SumArray
См.также $INLINE SUB
Пример DIM Array (1) ' объявить массив 2 чисел
SUB Test Procedure (I%,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%, Logint%, SinglePre!,-
DoublePre#, Integer%2, Array())
END ' закончить программу
Оператор CALL ABSOLUTE
-----------------------------------------------------------------
Назначение CALL ABSOLUTE вызывает программу языка ассемб-
лера.
Синтаксис CALL ABSOLUTE address (parametr list)
адрес (список параметров)
Комментарий адрес является численным скаляром, содержащим
начальным номер вызываемой внешней программы.
Сегмент определяется самым последним
оператором DEF SEG. адрес должен находится в
диапазоне от 32,768 до 65,535. Отрицательные
значения будут переведены компилятором в
положительные.
Форма списка параметров поддерживает сов-
местимость с Интерпретатором БЕЙСИК переводом
коротких целых параметров на стек. Эта форма
позволяет переходить только целым параметрам
(см. Приложение С, "Интерфейс языка ассембле-
ра").
Буфер регистра загружается в регистры про-
цессора непосредственно перед CALL ABSOLUTE
или CALL INTERRUPT и записывается сразу после
возврата. В любой момент времени буфер со-
держит процессор в положении, в котором он
находился во время выполнения самой последней
по времени внешней подпрограммы.
У буфера регистра выборку осущетсвляет опе-
ратор REG и функция, которая использует чис-
ленный аргумент для обращения к соответ-
ствующему регистру, как показано в таблице:
-------------------------------------
Аргумент регистра Регистр
-------------------------------------
0 Флаги
1 AX
2 BX
3 CX
4 DX
5 SI
6 DI
7 BP
8 DS
9 ES
-------------------------------------
REG в качестве оператора загружает отобран-
ный элемент буфера регистра с указанным целым
значением:
REG2,&H1000 ' загрузить 1000H в BX буфера ре-
' гистра
REG в качестве функции возвращает значения
отобранного элемента в буфере регистра:
PRINT REG(2) ' печатать эначения в BX буфера '
регистра
Программист несет ответственность за сохра-
нение регистров Сегмента Данных (DS), Указа-
теля Базы (BP), Сегмента Стека (SS) и
Указатель Стека (SP).
См.также CALL INTERRUPT DEF SEG REG
Пример DEFINT a-z
DIM a(100)
DIM FillRoutine(10)
FillRoutine (0) = &HF2FC
FillRoutine (1) = &HCBAA
REG 1, -1
REG 3, 101 * 2
REG 9, VARSEG(a(0))
REG 6, VARPTR(a(0))
DEF SEG = VARSEG(FillRoutine(0))
PRINT a(1)
WHILE NOT INSTAT : WEND
FillAdr = VARPTR(FillRoutine(0))
CALL ABSOLUTE FillWdr '(REG)
PRINT a(1)
END
Оператор CALL INTERRUPT
-----------------------------------------------------------------
Назначение CALL INTERRUPT осуществляет системное прерывание
Синтаксис CALL INTERRUPT n
Комментарий
n - это целочисленное выражение, представляющее вызы-
ваемое прерывание от 0 до 255. Непосредственно перед
тем, как обработчик прерываний получает контроль,
регистры процессора загружаются значениями в буфере
машинного регистра. Когда обработчик прерывания
возвращается, буфер берется за значения в регистрах
процессора. В любое данное время буфер содержит
состояние регистров процессора на момент завершения
самого последнего внешнего вызова или оператора REG.
Техническое руководство DOS содержит полную инфор-
мацию по многим функциям, доступным через механизм
CALL INTERRUPT. Программист отвечает за сохранение
регистров сегмента стека (SS) и указателя стека (SP).
Ограничения
Перед выполнением оператора CALL INTERRUPT соответ-
ствующие регистры CPU должны быть выбраны из памяти
через функцию REG.
После выполнения CALL INTERRUPT значения реги-
стров достигаются с использование функции REG
См. также CALL ABSOLUTE REG
Пример 'CALL INTERRUPT выполняет стандартное DOS прерывание
$INCLUDE "REGNMES.INC"
REG %AX, &H0200
' AH=02 Hex DOS стандартная функция вывода символа
REG %DX, REG(%DX)AND &HFF02
' DL=02 Hex DH остается прежним
' DL:= символ, предназначенный для вывода
CALL INTERRUPT &H21 'вызов прерывания 21
Функция CDBL
-----------------------------------------------------------------
Назначение CDBL преобразовывает число в формат удвоенной
точности.
Синтаксис Y= COBL (численное выражение)
Комментарий CDBL преобразует численную переменную или выражение
в форму удвоенной точности.
Для устранения возможности избытка целых чисел в
выражениях с целочисленными и с операндами с плаваю-
щей запятой используйте оператор CDBL. Например:
Y = (2% + x%) /#
Результатом данного выражения будет избыток, если
(2% + X%) будет больше 32.767. Во избежание этого,
используйте оператор CDBL для преобразования одной
из целочисленных переменных в форму с удвоенной
точностью. Это дает нам оценку всего выражения с
удвоенной точностью.
Y# = (CDBL (2%) + X%))а#
Ограничения
Диапозон выражений, передаваемых CDBL должен быть в
пределах допукстимого диапозона числа удвоенной точ-
ности.
См. также CINT CLNG CSNG
Пример 'CDBL используется для профилактики ошибок выражения
X% = 2000 'обьявить целочисленную переменную
Y& = 2000 'присвоить Y% значения х%
# = CDBL (X%) = Y% 'предотвратить переполнения
'преобразованием x%
PRINT x%, Y%, Z# 'показать значения трех переменных
END
Функция CEIL
-----------------------------------------------------------------
Назначение Функция CEIL преобразует численную переменную
или выражение в целое число, возвращая наимньшее
целое число большее или равное его аргументу.
Синтаксис Y = CEIL (численное выражение)
Функция CEIL проеобразует численную переменную
или выражение в целое число, возвращая наибольшее
целое число большее или равное по аргументу.
Различия В Интерпретаторе БЕЙСИК такой функции нет.
См. также CINT FIX INT
Пример FOR I! = -2.5 to 2.5 STEP 0.5
`показать наименьшее целое число большее для
'серии значений
PRINT the ceiling of ### is ###."; i!, CEIL (I!).
NEXT I!
END `закончить программу
Оператор CHAIN
-----------------------------------------------------------------
Назначение Оператор CHAIN вызывает модуль цепочки ТБ (соз-
даваемый как файл).
Синтаксис CHFIN filespec.
Комментарий
filespec представляет символьное выражение, в соот-
ветствии со стандартными условными обозначениями DOS
и представляет цепочный модуль Турбо Бейсика (расши-
рение ТВС). Если расширение опущено, присваивается
ТВС. Поэтому, если вам необходимо определить файл
.ЕХЕ, вы должны к имени файла добавить .ЕХЕ. Перемен-
ные, перечисленные как COMMON в текущей программе и в
программе назначения, переходят к последней. В фазе
тестирования, вызывающая программа должна компилиро-
ваться в файл .ЕХЕ, т.к. нельзя сцеплять программы
изнутри Турбо Бейсика. Вызываемая программа должна
компилироваться на диск как цепочный модуль (файл
.ЕХЕ или .ТВС).
Если аргументы к операторам COMMON в вызывающей и
вызываемой программах не совпадают (например, пере-
менные с плавающей запятой в одном месте, а целые чи-
сла в другом), происходит ошибка выполнения.
Турбо бейсик не поддерживает версии CHAIN интер-
притатора БЕЙСИК, ориентированные на номер строки,
включая номер строки CHAIN, DElETE, MERGE. В виду
невозможности определения номера строки в пределах
целочисленнонго модуля назначения, выполнение всегда
идет с начала.
При трансляции системы CHAIN программ интерприта-
тора Бейсик в турбо Бейсик, вы обнаружите расширен-
ное использование памяти Турбо Бейсика позволяющее
объединить отдельные модули в единую программу,
необходимость в сцеплении модулей отпадает.
Ограничения
Сцепление можно осуществить только при условии, что
программа выполняется с DOS т.е. с файла .ЕХЕ MERGE,
DERLETE, ALL и CHAIN (сцепление) на номер строки не
поддерживаются.
Различия
В Турбо Бейсике операция CHAIN осуществляется из од-
ной компилированной программы в другую, которая была
уже скомпилированна в файл .ТВС или .ЕХЕ.
См. также COMMON.
Пример Рассмотрим PROG1, которая формирует цепочку в PROG2.
PROG1.BAS
'объявить переменные, которые должны бытьпереведены в
'программу со сцепленными модулями
`скалярные переменные одинарной точности а и b и
'целочисленный миассив C%
DIM c % (3000)
а = 65 b = 13: c%(2000)= 12
COMMON а,b,c%(1)
'определить # размеров в массиве
CHAIN "PROG2"
PROG2.BAS
'Обьявить переменные, которые должны быть получены из
'вызываемой программы
`они должны быить в таком же порядке, одного типа,
`но не требуют одинаковых имен
COMMON x, y, z%(1)
PRINT x, y, z%(2000)
Когда PROG1.EXE вызывается из DOS, она автоматичес-
ки "возьмет с собой модуль PROG2.TBC и выполнит его,
напечатав значения, присвоенные в PROG1. Когда закан-
чивается PROG2, она возврвщается в DOS, а не в PROG1.
Оператор CHDIR
-----------------------------------------------------------------
Назначение Оператор CHDIR изменяет каталог (команды DOS CHDIR
или CD.).
Синтаксис CHDIR path
Комментарий
path - это символьное выражение, соответствующее ус-
ловным обозначениям маршрута в DOS (описаны в статье
"Файлы" в 4-й главе). Если маршрут не указывает пра-
вильный каталог, происходит ошибка выполнения 76,
Path Not Found (маршрут не найден). Оператор CHDIR
изменяет текущий каталог (активный или по умолчанию).
CHDIR Турбо Бейсика аналогичен DOS команде CHDIR с той
лишь разницей, что не может сокращенно называться CD.
Выполнение программы, которая изменяет текущий каталог
изнутри Турбо Бейска, изменяет также и активный
каталог Турбо Бейска.
Пример INPUN "Nem directory:" Path$
CHDIR path$ 'изменяет на каталог, определенный
'пользователем
END
Функция CHR$
-----------------------------------------------------------------
Назначение CHR$ преобразует code ASCII в строку из одного сим-
вола
Синтаксис Y=CHR$ (integer ehpression)
Комментарий CHR$ возвращает строку из одного символа, кото-
рый имеет целочисленное выражение кода ASCII в диа-
пазоне значений от 0 до 255. CHR$ комплементирует
функцию ASC, которая возвращает код ASCII первого
символа строки. CHR$ используется для создания сим-
волов, трудновводимых с клавиатуры, таких как гра-
фические символы для вывода на экран и последова-
тельности контроля вывода принтера. Значение цело-
численного выражения, переходящее на CHR$, должно
быть в пределах от 0 до 255. Использование аргумен-
та, выходящего за рамки этого диапозона, дает ошиб-
ку выполнения 5. IllegaI Function Call
(неправельный вызов функции).
см. также ASC
Пример 'CHR$ выводит набор символов ASCII на экран
FOR I% = 0 то 255
PRINT USING "I"; CHR$ (I%);
'показывает символ ASCII,
'представленный I%
NEXT I%
END
Функция CINT
-----------------------------------------------------------------
Назначение Функция CINT преобразует аргумент в целое число.
Синтаксис Y = CINT (numeric expression)
Комментарий Функция CINT преобразует численную переменную
или выражение в целое число с округлением дробной
части численного выражения. Если численное выражение
выходит из пределов диапазона от -32.768 до +32.767,
то происходит ошибка overflow (переполнение) (ошибка
выполнения программы 6).
Это преобразование осуществляется имплицитно
назначением целочисленной переменной или вызовом
процедуры или функции, которая принемает
целочисленный аргумент.
Различия В отличие от интерпритатора Бейсик, Турбо Бейсик
не всегда округляет дробную частицу числа в большую
сторону. Если дробная часть числа равна .5, она
округляется в сторону четного числа .
См.также CDBL CEIL CLNG CSNC FIX INT
Пример FOR I! = 0.0 TO s.0 STEP 0.2
'показать результат преобразования
PRINT USING "CINT of #.# = #" I!,CINT(I!)
NEXT I!
END 'закончить программу
Оператор CIRCLE
-----------------------------------------------------------------
Назначение Оператор CIRCLE рисует круг или часть круга.
Синтаксис
CIRCLE (x,y) radius [, color [, start, end[, aspect]]]
Комментарий
(x,y) является центром круга и может быть описан либо
в абсолютной либо в относительной форме (с
использованием STEP). (См. раздел по графике в Главе
3 для более подробной информации об абсолютных и
относительных координатах).
radius представляет собой численное выражение,
управляющее размером круга.
color - это численное выражение определяющее цвет
круга. Допустимые значения от 0 до 3 в графических
устройствах со средней разрешающей способностью (по
умолчанию - 3) и от 0 до 1 вграфических устройствах с
высокой разрешающей способностью (по умолчанию 1).
Цвет по умолчанию - это наиболее высокий цвет для
режима в котором вы находитесь. Использование
аргумента цвета, выходящего за пределы данных
диапазонов, дает ошибку выполнения 5, illegal
function call (неправильный вызов функции). (Более
подробно об отборе цвета см. оператор STATEMENT).
start, end являются необязательными численными
параметрами, определяющими начальную и конечную точки
рисуемой дуги в радианах (о радианах смотри в статье
ATN). Используйте их при изображении только части
круга. Если начало и конец опускаются рисуется целый
круг.
Например: SCREEN: pi = 4 * ATN(1)
CIRCLE (160.100),50,3,0, pi
рисует белую дугу полукруга от 0 радиан (0 градусов)
до pi радиан (180 градусов).
Отрицательные значения начала и конца дают
круговую диаграмму с треугольной призмой на зкране
дисплея, края которой автоматически связываются
точкой. Например:
SCREEN 1 : pi = 4* ATN(1)
CIRCLE (160,100,50,,-pi/4, -pi/2
рисует отрезок диаграммы в 45 градусов, от pi/4 радиан
(45) до pi/2 радиан (90), который виден на стр. 149.
Для начала треугольной призмы (wedge) на положительной
оси x, используйте отрицательное число, немного
менньшее 0 (например , 0001), а не ноль.
aspect - это численное выражение, контролирующие
овальность или округлость круга. по умолчанию 5/6
(0.83333) со средней разрешающей способностью и 5/12
(0.416667) с высокой разрешающей способностью. В
зависимости от конкретной комбинации монитора дисплея
коммутационная доскв/видео, вам может понадобиться
"внести изменения" в данные значения (или исправить
ваш монитор) для получения круглых окружностей .
После нанесения изображения круга, LPR
становиться его центром.
Пример 'Данная программа демонстрирует возможности CIRCLE
'изменение места, радиуса, цвета
'и соотношения аспекта. CIRCLE может также
'рисовать дуги и треугольные призмы,
'используемые в играх
'типа "pak-man".
PI# = 48* ATN(1) 'вычислить значения PI
SCREEN1 'перейти в режим графиков
FOR Radius% = 1 то 20 'увеличить размер круга
Colour% = Radius% MOD 4 'вычислить цвет дисплея
CIRCLE(250,150).Raidius%, Coiour% 'центр на 250, 150
NEXT Radius%
CIRCLE(250,60), 50,1,-(PI#*5/4),-(PI#*3/4)
'тело "pak-man"
'и глаз
Rasing% = 50 'элипсы могут производить иллюзии
'типа сфер...
FOR Aspekt = 0 TO 2.0 STEP 0.09
CIRCLE(90.100),Radius%....Aspekt
NEXT Aspekt
END
Оператор CLEAR
-----------------------------------------------------------------
Назначение Оператор CLEAR ощчищает переменные памяти
Синтаксис CLEAR
Комментарий CLEAR - это команда без параметров, которая ус-
танавливает численные переменные на ноль, а
символьные переменные сводит к нулю. Оператор CLEAR
отключает ловушку (например, воспроизведение
музыки), и вновь инициализирует память массива и
содержимое символьной строки.
Замечание Оператор CLEAR, употребленный внутри цикла, вы-
зывает обнуление счетчика и тем самым делает цикл
бесконечным.
Для выборочной очистки массивов памяти ипользуй-
те команду ERASE.
Ограничения Турбо Бейсик не поддерживает динамическую уста-
новку сегмента стека и данных поэтому у оператора
CLEAR нет параметров.
Различия Различия между оператором CLEFR Интерпретатора
БЕЙСИК и ТБ происходят главным образом из различий
между компиляторами и интерпретаторами. Интерпрета-
тор БЕЙСИКа имеет возможность дминамически устанав-
ливать пространство стека и данных, в то время как
ТБ компилятор устанавливает это пространство во
время компиляции.
См.также ERASE $STACK
Пример 'Данная программа демонстрирует вощзможности опера-
'тора CLEAR
DIM Array$(1) 'объявить массив строк
PLAY "MB L1 EFGABCDEF" 'дать музыкальный фон
ON PEN GOSUB PenHandler 'установить ловушку свето-
'вого пера
ON STRIG(0) GOSUB ButtonOHandler 'установить лову-
'шку джойстика
'инициализировать символьные данные
Array$(0) = "This is string in Array$(0)
Array$(1) = "This is string in Array$(1)
'показать символьные данные
PRINT USING "Array element 1: &";Array$(0)
PRINT USING "Array element 2: &"; Array$(1)
CLEAR 'выполнить CLEAR
PRINT
'показать уже не существующие символьные даннные
PRINT USING "Array element 1: &";Array$(0)
PRINT USING "Array element 2: &"; Array$(1)
PRINT
PRINT "The string variables are now empty."
END 'конец программы
PenHandler: 'определить ложную метку для ловушки
RETURN 'светового пера
ButtonOHandler 'определить ложную метку для джойстика
RETURN
Функция CLNG
-----------------------------------------------------------------
Назначение Функция CLNG преобразует числовое выражение в длин-
ное целое число.
Синтаксис Y = CLNG(numeric expression)
(числовое выражение)
Комментарий Функция CLNG преобразует числовую переменную или
выражение в длинное целое число округлением дробной
части ее аргумента. Если значение аргумента выходит
за пределы диапазона от -2^31 до +2^31 - 1 (прибли-
зительно от -2000000000 до 1999999999), то происхо-
дит ошибка выполнения 6, Переполнение (run-time
error 6, Overflow).
Ограничения Числовое выражение, которое переходит к фунукции
CLNG, должно быть в пределах допустимого диапазона
значений длинных целых чисел.
Различия Данная функция невозможна в большинстве Интер-
претаторов БЕЙСИКа, т.к. онг не поддерживают
длинные целые числа.
См.также CDBL CINT CSNG FIX INT
Пример PRINT CLNG(2.0E9), CLNG(33.4), CLNG(-121,9),_
CLNG(100251.6)
END 'закончить программу
Оператор CLOSE
-----------------------------------------------------------------
Назначение Оператор CLOSE закрывает файл или устройство.
Синтаксис CLOSE [[#] имя файла [,[#] имя файла]...]
Комментарий Оператор CLOSE закрывает отношение между номе-
ром файла и файлом, созданным оператором OPEN, он
заключает ввод/вывод к этому файлу. Буфер файла
подавляется и если имя файла (номер файла) пред-
ставляет файл на дисковом носителе, а не устрой-
ство, то осуществляется DOS CLOSE для обновления
каталога.
Необходимо взять на вооружение использование
оператора CLOSE для периодического закрытия файлов,
создаваемых при написании программы. Это гарантиру-
ет сохранение информации и обнолвление соответству-
ющим образом статей каталога файлов на случай пос-
ледующего отключения системы или других проблем.
Оператор CLOSE без номерв или имени файла зак-
рывает все открытые файлы и устройства (как и опе-
раторы RESET, END, STOP и RUN).
См.также END OPEN STOP
Пример 'открыть файл, назначенный принтеру
OPEN "LPT1:" AS #1
'послать строку на принтер
PRINT# 1,"THIS IS A TEST"
CLOSE# 1 'закрыть переменную файла
'открыть два разных файла
OPEN "CLOSEFIL.ONE" FOR AS #1
OPEN "CLOSEFIL.TWO" FOR AS #2
'вписать строку в каждый файл
PRINT# 1,"THIS IS A TEST"
PRINT# 2,"THIS IS A TEST"
'закрыть все файлы
CLOSE
END
Оператор CLS
-----------------------------------------------------------------
Назначение Оператор CLS чищает экран.
Синтаксис CLS
Комментарий Оператор CLS в режиме текста очищает экран до
фонового цвета и устанавливает курсор в левый верх-
ний угол (в 1-ю позицию 1-й строки).
В графическом режиме после очистки экрана его
центром становится LPR (160, 100) или (320, 100), в
зависимости от того каким был текущий режим: соот-
ветственно со средней или высокой разрешающей спо-
собностью.
В сучае, если был выполнен оператор VIEW CLS
очищает только поле индикации. Для очистки всего
экрана сперва следует использовать оператор VIEW
без аргументов для выкдючения поля индикации, а за-
тем оператор CLS для очистки экрана.
См.также COLOR SCREEN VIEW
Пример 'очистка экрана оператором CLS
PRINT " Пример работы оператора CLS "
INPUT " Нажмите для очистки ...", Dummy$
Color 10, 'установлен зеленый цвет на синем фоне
CLS 'экран очищается до синего цвета
END
|
|