Микро ЭВМ "ZX Spectrum" 1969 г.

Команды и функции Бейсика - введение. Команды Бейсика. Функции Бейсика. Управляющие символы.


ГЛАВА 2. Команды и функции Бейсика

2.1. Введение

Поскольку предполагается, что читатель уже достаточно близко знаком с языком Бейсик микро-ЭВМ "Спектр", при рассмотрении команд и функций языка Бейсик сосредоточимся на вопросах, которые недостаточно подробно обсуждены в двух руководствах, входящих в комплект поставки микро-ЭВМ "Спектр".

Интерпретатор языка Бейсик микро-ЭВМ "Спектр" признает 50 различных команд и 33 функции. Кратко остановимся на каждой из них. Рассмотрение проводится в алфавитном порядке.

2.2. Команды Бейсика

BEEP x,y

По этой команде подается сигнал на динамик, х - длительность в секундах, y - высота звукового тона, от ЛЯ первой октавы в десятичном диапазоне чисел -60 до +69,8. Каждый из операндов, x или y, либо оба вместе могут быть выражениями.

Интересно отметить, что BEEP не прерывается по клавише BREAK.

BREAK возможен только в конце оператора, содержащего команду ВЕЕР.

BORDER m

Имеется 8 возможных цветов, которые могут быть переданы граничной области (бордюру) ТВ-экрана. Используются целые числа от 0 до 7. Однако, допускается интервал от -0.5 < m < 7.5, где m - результат выражения, поскольку m округляется до целого.

По команде BORDER выходной сигнал поступает на порт 254 и это может быть выражено оператором:

OUT 254 m (где, например, m=2 - дает красный бордюр).

Но OUT и BORDER различны. Цвет, получаемый бордюром по команде OUT - "временный цвет", в то время как BORDER дает "постоянный" цвет, хранящийся в системной переменной BORDER (десятичный 23 624,16-ричный 5С48).

BORDER и ENTER - делает бордюр красным.

OUT 254,1 и ENTER - бордюр будет временно голубым, а затем опять вернется в красный цвет.

BRIGHT m

Это первая команда из команд управления цветом. Все они могут использоваться как команды в операторах Бейсика ( в этом случае их действие постоянно), либо включаться в операторы печати, и тогда их действие распространяется только на данный оператор печати; m может быть выражением, но результат должен быть целым числом 0, 1 или 8.

При m=8 "высветленным" будет текст, подлежащий печати.

Следующие примеры показывают 4 различных способа использования команды BRIGHT.

- два изменения яркости имеют постоянный характер:

10 BRIGHT 1: PRINT "Bright": BRIGHT 0: PRINT "Normal"

- изменения яркости временны в течение оператора:

20 PRINT BRIGHT 1; "BRIGHT -"; BRIGHT 8; "Normal"

- команда CHR$ - эквивалентна:

4 0 LET A$ = CHR$ 19 + CHR * : LET B$ = CHR$19 + CHR$ 8;

PRINT A$; "Bright -"; B$; "Normal"

-помещает команду цвета в строку переменных.

Также возможно использование последовательности:

- режим курсора "E" и клавиша "9" - для получения BRIGHT 1;

- режим курсора "E" и клавиша "8" - для получения BRIGHT 0.

Этот набор может быть размещен внутри скобок, т.е. между открывающей скобкой и первым символом или как единственный символ строки. Например:

LET a$ = "": REM - внутри кавычек набрана вышеприведенная последовательность с клавишей "9".

Строка а$ будет напечатана как при BRIGHT 1.

CAT

Используется с микроприводом (подробности отсутствуют).

CIRCLE x,y,z

Эта команда рисует окружность радиусом Z с координатами центра x,y. Z берется как абсолютное целое значение, а x и y используются как числа с плавающей запятой. Самая большая

окружность при радиусе 88 единиц получается оператором CIRCLE 127.5,87,88, а окружность с нулевым радиусом - представляет собой простую точку. Любая команда цвета может быть включена в оператор CIRCLE и ее влияние всегда будет временным. По некоторым стандартам команда CIRCLE довольно медленна и не точна, но тем не менее, она очень полезна.

CLEAR, CLEAR N

Система Спектрум имеет такое большое количество области RAM, доступной для пользователя, что выполнение команды CLEAR самой по себе вряд ли будет полезным. Однако, расширение команды возможностью перемещать указатель RAMTOR делает ее очень сильной. RAMTOR указывает на верхнюю границу системы Бейсик и содержимое адресов ниже RAMTOR может изменяться, в то время как любое содержимое выше RAMTOR остается невредимым, даже после выполнения команды NEW.

Нижнюю границу для N можно выбирать не меньше, чем 23 821. Иначе Спектрум выдает звуковой сигнал. Это говорит о том, что отведенного RAM не хватает на задачу. Верхней границей N является для системы 16К - 32767, а для системы 48К - 65535. Использование CLEAR N с соответствующим значением вызывает помещение стека GO SUB в область, отведенную для графики пользователя. Поучительно выполнить следующее упражнение :

Ввести CLEAR 32767 (или 65535) .

Изменить курсор на G и ввести литеры с L по U.

Нажать клавишу SPACE на несколько секунд и наблюдать изменение графики пользователя, поскольку каждое нажатие клавиши приводит к использованию машинного стека.

CLOSE

Используется с микроприводом.

CLS

Это очень простая команда, которая меньше, чем за 1/10 секунды выполняет много работы. Команда CLS очищает дисплейную область. Она зануляет адреса с 16384 по 22527 (4000-5800h) и сбрасывает байты атрибутов по адресам 22528 -23295 (58CC-5AFFh). Байты атрибутов не зануляются, а копируются из системной переменной ATTR-P, которая перемещается по адресу 23 6 93 (5C8Dh) и может быть изменена. В переменной ATTR-P бит 7 отвечает за "мерцание", бит 6 - за "яркость", биты 3-5 - за цвет "бумаги" и биты 0-2 - за цвет "чернил".

CONTINUE

В большинстве требуемых случаев эта команда работает хорошо. Но когда пользователь выполняет несколько команд непосредственно, компьютер зацикливается и сможет восстановить работу только по клавише BREAK. Существует два особых аспекта команды. Первый позволяет пользователю использовать в программе Бейсика оператор STOP, и тогда не требуется использование клавиши BREAK. Пользователь в этом случае может проверить переменные, установить их, и изменить программу. Использование операторов STOP и CONTINUE существенно облегчает отладку программ.

Второй аспект позволяет пользователю повторять выполнение после исправления ошибки. Например, если программа остановилась по ошибке "variable not found", то переменная может быть определена в непосредственном режиме и оператор заново выполнен по команде CONTINUE.

Шесть системных переменных - NEWPPC, NSPPC, PPC, SUBPPC, OLDPPC и OS PEC - определенным образом включаются в выполнение команды CONTINUE.

COPY

Это очень простая команда. Поскольку принтер управляется SP, верхние 22 строки ТВ экрана посылаются на принтер. Линии ТВ экрана выводятся по очереди. Команда COPY одна из немногих команд, которые останавливают часы реального времени на время выполнения команды. Это можно видеть из системной переменной FRAMES до и после использования команды.

DATA e, e...

Это команда, которая может использоваться только в программных строках, определяет список данных. Хотя это и упоминается в руководстве, но не становится ясным, что рассмотрение элементов в операторе DATA как выражений является особенностью, делающей эту команду очень полезной. Более детально см. READ и RESTORE.

DEF FN a (a, ..., z) = e и DEF FN a$(a, ...,z)=1

Команда DEF FN очень мощная. Пользователь может определять до 52 функций - 26 числовых и 26 строковых. Имена, используемые для функций, всегда должны быть одиночного характера (+$ - для строк), и они могут быть именами, используемыми где-нибудь еще как простые переменные.

Существует небольшое ограничение на имена аргументов, так как они тоже должны быть одинарными литералами (+$ для строк). Поэтому может быть не более 52 аргументов. Выражение, определяемое функцией, может быть любым, дающим числовой или строковый результат. Однако, рекурсивное использование приводит к неудаче (это известно автору как единственный путь к краху Бейсика для Спектрум).

DIM a(e ... l ) и DIM a$(e ... l ) 1 k 1 k

Команда DIM удаляет существующий массив с тем же именем и затем устанавливает новый. Числовые массивы обнуляются, а строковые заполняются пробелами.

В системе Спектр вся индексация начинается с 1, или более точно, с 0,5<e<1,5. Достижение индексом нулевого значения является обычной ошибкой, и приводит к сообщению "subscript wrong". Использование в Спектруме в литеральных массивах строк фиксированной длины, тогда как простая литеральная переменная изменяет длину, может привести к неудаче. Но наиболее просто, используя в определении литерального массива последний индекс, всегда фиксировать длину строки. Эта особенность может быть наиболее полезна при установлении формата ТВ экрана.

DRAW x,y DRAW x,y,z

Эта команда рисует линию от текущей позиции (но не включая ее) на расстояние х - по горизонтали, и y - по вертикали. Если аргумент z определен, рисуется дуга вместо прямой линии. Аргумент z должен быть определен в радианах, при z=PI получается полуокружность. При положительных значениях z, дуги рисуются справа от того места, где была бы прямая линия, а при отрицательных - слева. Любая из команд управления цветом может быть включена в оператор DRAW, и ее действие будет распространяться на время выполнения команды.

ERASE

Используется с микроприводом.

FLASH m

Это вторая команда управления цветом. Когда она используется в Бейсике, ее влияние постоянно, но когда используется при включении в оператор печати, ее влияние - только на данный оператор.

Как и BRIGHT, может принимать значения 0,1 или 8. При m=0, изображение статично, при m=1 - включено мерцание. При

m=8 значение не изменяется.

FOR A=x TO y STEP c

Команда FOR - наиболее интересная команда, и обычно она плохо понимается, хотя и широко используется.

Задачи, стоящие перед интерпретатором, при обработке команды FOR, таковы:

а) удалить все переменные с тем же именем, и любые управляющие переменные с тем же именем;

б) добавить к существующим переменным новую управляющую переменную.

Эта переменная требует 19 адресов памяти. Первый адрес содержит имя переменной, соответствующим образом помеченное. Следующие 5 байт содержат начальное значение цикла, хранящееся как действительное число в 5 байтах. Следующие 5 адресов - конечное значение счетчика цикла, затем - 5 байт приращения. Если приращение не задано, они содержат единицу в плавающем виде. Последние 3 байта содержат информацию о цикле: первые два указывают номер строки, в которой записан опера-тор FOR, а последний - номер оператора в строке, увеличенный на единицу. Таким образом, после окончания цикла, будет выполняться следующий оператор, вне зависимости от того, находится ли он в той же строке, или нет.

Если начальное значение, конечное значение и шаг приращения - целые числа из интервала -65535 до +65535, то операции выполняются на 20% быстрее.

Следующая программа демонстрирует содержимое управляющей переменной команды FOR. Заметьте, что оператор FOR в строке 10 устанавливает пустую переменную под именем А, которая в дальнейшем в программе не используется.

10 FOR A=1.6 TO 2.1 STEP 0.1 20 LET V= PEEK 23627 + 256*PEEK 23628 -1 3 0 FOR B=1 TO 19 40 PRINT B, PEEK (V+B) 50 NEXT B RUN

Добавьте 25 LET V=V+25 и увидите контрольную переменную

В.

в) третье действие, предпринимаемое интерпретатором, является весьма специфическим. В Спектрум не существует ошибок вызванных установлением шага в неправильном направлении. Это значит, что строка, подобная FOR A=2 TO 0 STEP 1 допустима. Однако, в действительности это приведет к полному игнорированию FOR-NEXT цикла. Это может быть показано изменением продемонстрированной выше программы следующим образом:

10 FOR A=1.6 TO 2.1 STEP -0.1 60 NEXT A

и программа будет успешно работать, но печати никакой не будет. Эта возможность - перепрыгивать через целые циклы - может быть преимуществом, ведь это позволяет распространить ограничение на 0, и может быть недостатком - ожидаемый результат не появится вообще.

FORMAT f

Используется с микроприводом

GO SUB n

Эта команда приводит к выполнению подпрограммы, которая начинается с номера n или с первого номера строки, имеющегося в программе и большего n. Переходы могут быть сделаны и REM-оператором, хотя делать этого, вероятно, не следует.

Команда GO TO помещает адрес перехода (номер строки) в системные переменные NEWPP и NSPPC, расположенные в 23618-23620 (5C42h-5C44h). Переходы к операторам, не являющимся первыми в строке, в обычной практике недопустимы.

IF x THEN s

В системе Спектрум значение нуль соответствует логическому значению "ложь", а любое значение, отличное от 0 - логическому значению "истина". Команда выполняет "s" и любые другие операторы в строке только, если значение x - "истина". Команда IF-THEN работает хорошо, но следующая небольшая программа написана, чтобы показать, используя повторное деление, что происходит, когда значение никогда не становится "ложью". Проблема, появляющаяся в этом случае, связана с получением в Спектруме величины 2**128.

10 LET A=1

20 IF NOT A THEN PRINT A:STOP 30 PRINT A 4 0 LET A=A/2 50 GO TO 20 RUN

"A" будет распечатываться (более 5 экранов) до тех пор, пока оно не достигнет значения 2**128. Однако, если строку 40 поменять на LET A=A*0.5, то значение "ложь" будет достигнуто.

INK n

Это третья из команд управления цветом. Когда используется самостоятельно в операторе Бейсика, ее действие постоянно, а когда находится в операторе печати - временно. Значение n может быть 0<= n <=7. Восемь основных цветов, используемых в Спектрум, закодированы и это ясно видно на клавиатуре. Использование INK 8 при печати дает цвет, хранящийся в атрибутах.

Использование INK 9, однако, немного более сложно: цвет чернил становится черным или белым в зависимости от цвета бумаги. Если цвет бумаги темный, т.е. черный, синий, красный или фиолетовый - цвет чернил - белый, а при светлом цвете бумаги - зеленом, голубом, желтом или белом - цвет чернил черный. Действие постоянной команды INK состоит: для N=0-7 устанавливаются биты 0-2 переменной ATTR-P; и для N=8 - устанавливается бит 5 переменной MASK-P. Если команда INK имеет временное действие, устанавливаются соответствующие биты временных системных переменных.

INPUT ...

Это очень мощная команда, позволяющая набором операторов INPUT совместно с элементами управления печатью добиваться желаемых результатов. Следующая программа показывает использование составных операторов INPUT. Заметьте, что команда INPUT работает с нижней (редакторской) областью экрана.

10 INPUT "Name please",A$; CHR$ 13; "Age please"; B$ 2 0 PRINT AT 5,0; "Name"; TAB 7; A$ CHR$ 13; "Age"; TAB 7; B$

Это четвертая команда управления цветом. Ее эффект может быть временным или постоянным. При INVERSE 1 цвета чернил и бумаги меняются местами, а при INVERSE 0 - нормальное значение цвета чернил и бумаги. При постоянном режиме по команде INVERSE устанавливается 5 бит P-FLAG, а при временной - 4.

LET v=e

Это основная команда в Бейсике. Переменная, выбранная пользователем, определяется интерпретатором либо как простая переменная, либо как управляющая переменная FOR-NEXT цикла, либо образует часть массива. Простая переменная может иметь любые существующие ссылки для переопределения и распределения нового места. Управляющая переменная и переменная массива будет размещена, но не переопределена. Далее определяется выражение, которое должно определить значение переменной и копируется в соответствующее место.

Все численные переменные имеют пять адресов, распределенные для определяемой величины. Эта величина затем сохраняется как число с плавающей запятой или целое. Простые строки имеют переменную длину, она представляет собой число адресов, отведенных для простой строки, и зависит от количества символов в строке в текущий момент. Все массивы строк имеют фиксированную длину, и строка, предназначенная для массива, будет уменьшаться, если она превышает длину элемента массива, и дополняться пробелами, если она короче фиксированной области, отведенной для нее.

Следующий пример показывает простой путь, которым можно проследить за областью переменной, и позволяющий пользователю ввести ряд переменных для наблюдения.

10 REM enter your variable.

20 LET V=PEEK 23627 + 256 - PEEK 23628

30 PRINT V, PEEK V: LET V=V+1: GO TO 30

Следует сделать несколько предложений для строки 10.

LET A= 0

LET A=9E4

LET A$="AAA"

DIM A(2): LET A(1)=9E4

DIM A$(5):LET A$="1234567"

DIM A$(2,5): LET A$(1)="AAA"

LIST n

Эта команда допускает, что величина n должна быть равна нулю до тех пор, пока она не будет определена другим образом .

Если строка с номером n существует, она становится текущей, и помечается стрелкой >.

Интересной особенностью системы является то, что LIST 49172, например, будет такой же, как и LIST 20.

LLIST n

Эта команда посылает листинг программы, написанной на Бейсике, на принтер. Также n становится текущей строкой. Для тех читателей, которые не лишены чувства юмора, интересно использовать LIST <> 3 и LLIST <> 2 и включить их в программу.

LOAD

Команда LOAD имеет много различных оттенков, и позволяет загружать программы Бейсика, массивы переменных и блоки кодов.

Вообще, команда LOAD хорошо освещена в инструкции "Программирование на языке Бейсик", поэтому далее приводится обсуждение вопросов, которые не приведены в инструкции.

Информация (код или программа), записанные на магнитной ленте, содержатся в двух частях. Первая представляет собой 17-байтовый заголовок, вторая - "блок кодов".

Каждая из этих частей использует одинаковый формат единичных битов, сопровождаемых звуковым сигналом, который в два раза длиннее нулевых битов. В Спектрум используется головной маркер (+D0 для заголовков и +FF для блока кодов), и завершающий байт четности после заголовка и после блока кодов.

Блок заголовка разбит на пять частей следующим образом:

1. Одиночный байт информации, который равен "0" для программы Бейсика, "1" - для числового массива, "2" - для массива символов и "3" - для блока кодов.

2. Следующие 10 байт содержат название файла. Название, которое имеет более 10 символов, отвергается.

3. Два байта, содержащие общую длину блока кодов. В случае использования Бейсика, область программы и область переменных содержатся на магнитной ленте.

4. Два байта, которые для программы на Бейсике содержат начальный номер строки или начало для блока кодов.

5. Два байта, содержащие для Бейсик-программы длину области программы. "Блок кодов" просто загружается в требуемую область ОЗУ, как указано в заголовке.

LPRINT

Эта команда вызывает посылку элементов печати на принтер. Для дальнейшего обсуждения см. ниже команду PRINT.

MERGE f

Эта команда позволяет загрузить Бейсик-программу и ее переменные с магнитной ленты и соединить с существующей программой и переменными. Там, где имеет место то же количество номеров строк в обоих программах, сохраняется только новая версия. Это относится также и к переменным с тем же названием и типом.

Команда выполняет обработку новой программы как блока данных, который должен быть загружен в рабочую область. Далее, области программ сравниваются строка за строкой, и новые строки копируются из рабочей области в основную область программы. Область программы "переопределяется" и "расширяется", если необходимо. Поскольку строки Бейсика соединены, подобная операция соединяет и область переменных.

MOVE f1, f2

Для использования с микроприводом.

NEW

Это команда повторного запуска системы без изменения системных параметров RAMTOP, P-RAMT, RASP, PIP, и UDG. Определенные пользователем графические символы, также не сбрасываются .

NEXT a

Эта команда должна рассматриваться как команда, выполняющая работу в цикле FOR-NEXT, в котором управляемая переменная установлена (см. FOR выше). Этапы, включающие в себя выполнение команды NEXT, следующие|

а) управляющая переменная расположена в области переменных, и величина STEP добавляется к VALUE, вне зависимости от того, является STEP положительным или отрицательным.

б) далее новая VALUE проверяется относительно LIMIT, но здесь следует обратить внимание на знак STEP. Если LIMIT превышается, то невозможна никакая дальнейшая организация циклов - команда NEXT закончена. Однако, если LIMIT не достигнут, выполняется дальнейшее прохождение цикла FOR-NEXT.

В Спектрум VALUE всегда увеличивается до того, как выполняется проверка ограничителя, следовательно, конечная VALUE после окончания цикла FOR-NEXT, будет всегда больше, чем LIMIT для отрицательной.

OPEN

Для использования с микродрайвом. Однако, возможно открывать и закрывать потоки данных следующим образом:

Используйте строку PRINT #5; "works?" и она не будет работать до тех пор, пока поток данных не открыт использованием строки OPEN #5,"S". Строка CLOSE #5 закрывает поток. Следующие строки показывают ввод с клавиатуры и вывод на экран ТВ.

10 OPEN #5, "K" 20 INPUT #4; A$ 30 OPEN #5; A$ 40 PRINT #5; A$

OUT m,n

Эта команда позволяет пользователю посылать сигналы на выходной порт Спектрум из Бейсика.

В пункте BORDER (см. выше) было показано, как порт 254 управляет цветом рамки; разные цвета приводились для случаев от n=0 до n=7. В то же время, порт 254 также может использоваться для управления звуковым динамиком, и следующая программа показывает, как это делать. Программа интересно показывает, как возможно получить оценку времени, требующегося Спектрум для интерпретации оператора, так как быстрый оператор даст высокий звук, а медленный - ряд щелчков.

10 OUT 254,23: _ ; OUT 254,7; GOTO 10

В программе оператор, проверяемый пользователем, может быть, например, таким: PRINT;:, RAND;, LET A=0:, или POKE 00: .

В программе OUT 254,23 не используется звуковой динамик, а в OUT 254,7 - используется. Операция повторяется очень быстро, что дает звук.

В дальнейшем, при наличии устройств ввода/вывода, команда будет использоваться более часто.

OVER n

Это пятая из команд элементов цвета.

Ее действие может быть постоянным или временным. Если используется команда OVER 1, то последовательная печать будет выполняться об'единением по команде XOR с уже существующим символом. При выполнении XOR бит перебрасывается - установленный бит сбрасывается.

При использовании OVER 0 все биты в данной области символа будут графическими.

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

10 OVER 1: PRINT "A"; CHR$ 8; "A"

где CHR$ 8 - возврат на одну позицию в строке. Бит 1 переменной P-FLAG - управляющий флаг OVER.

PAPER n

Это шестая и последняя команда управления цветом. Она может быть постоянной или временной. Как и в случае INK, команда PAPER может использоваться от n=0 до n=9.

При n=8 устанавливается режим высвечивания, и цвет бумаги области передаваемого символа будет оставаться неизменным. Использование команды PAPER 9 является очень полезным при оформлении заглавий. Команда PAPER 9 устанавливает, что цвет бумаги в области вывода информации будет контрастным по отношению к используемому цвету чернил. Следовательно, при светлых чернилах - зеленых, голубых, желтых и белых - бумага будет черной, но при темных чернилах - черных, синих, красных и фиолетовых - бумага будет белой.

Фактическое действие "постоянной команды" PAPER является: для n=8 установить биты 3, 4, 5 переменной MASK-P, и для n=9 - установить бит 7 переменной P-FLAG, а для n=0-7 - установить биты 3, 4, 5 переменной ATTR-P.

PAUSE n

Эта команда HALT останавливает Z80 на n прерываний. Единственная работа, которая выполняется за время паузы, заключается в выполнении программы прерывания клавиатуры. Период паузы закончится после n прерываний или при нажатии клавиши.

PLOT x,y

Экран Спектрум представляет собой 256176 элементов изображения, каждый из которых может управляться отдельно командой PLOT. В обычной работе команда PLOT установит бит ОЗУ, соответствующий биту элемента изображения. Команда делает также этот элемент изображения текущим в системной переменной COORDS, который записывает координаты последнего элемента изображения.

Любой из цветовых элементов может использоваться в команде PLOT и использование OVER 1 может привести к "UNPLOT", a INVERSE 1 - к "NOPLOT".

POKE m,n

Эта команда позволяет пользователю выводить значения по адресам непосредственно в память Спектрум. Значения m может принимать от 0 до 65535, но ошибка не фиксируется, если пользователь пытается ввести значения в ПЗУ. n может принимать значения от -256 до +255. Значения от 0 до 255 вводятся непосредственно, а к значениям от -255 до -1 прибавляется +256.

PRINT ...

Эта команда позволяет пользователю выводить символы на экран ТВ. Элементы отделяются друг от друга разделителями: ";" - элементы выводятся подряд, "," - выполняется табуляция к следующей половине строки, "/" - печать в начале следующей строки. Позицию экрана можно также указывать с помощью TAB и АТ .

Элементы печати могут быть элементами цвета, действие которых будет временным, числовыми выражениями, или наборами символов. Заметьте, что все элементы цвета, разделители и управление табуляцией могут быть выполнены использованием соответствующих значений CHR$ и это может оказаться полезным .

RANDOMIZE n

Эта команда устанавливает значение системной переменной SEED, расположенной в адресах 23670 и 23671 (5C76,5C77). Если n не задано, значение для SEED берется из двух младших байтов FRAMES и может рассматриваться как случайное число. Если n задано, тогда это значение копируется в SEED. Для дальнейшего уточнения работы генератора псевдослучайных чисел см. ниже функцию RND.

READ v1, v2, ....

Эта команда используется вместе со списком DATA и может рассматриваться как несколько команд LET. Элементы в DATA являются выражениями, а элементы в READ - переменными, которым это выражение присваивается.

Сообщение об ошибке появляется, если нет соответствия между переменными и выражениями.

Заметьте, что в оператор READ можно включить неописанные ранее переменные. Системная переменная DATADD, расположенная в адресах 23639 и 23640 (5057 и 5058h) используется для указания в списке DATA. Первоначально указатель устанавливается на адрес начала области программы и сбрасывается в это значение по RUN.

REM

Это полезная команда, так как позволяет вносить комментарии. Вся строка после нее рассматривается как комментарий и не интерпретируется.

RESTORE n

Эта команда используется вместе со списком DATA и относится к одному или нескольким DATA.

Если n=0, то переменная DATADD указывает на адрес перед областью программы. Если n определено, то указывает на адрес строки Бейсик с номером n, если она существует или на ближайшую после этого номера.

Если n>9999 (самый большой разрешенный номер строки Бейсик), или " ушел" за последний номер программы, то DATADD указывает на последний адрес в области программы.

RETURN

По этой команде извлекается верхнее значение из стека GOSUB. Если обращение корректно, интерпретатор будет выполнять это утверждение следующим. Иначе будет выдано сообщение об ошибке: "RETURN" без "GOSUB".

RUN n

Эта важная команда позволяет пользователю выполнять программы Бейсик. Если n не задано, принимается значение 1. Когда n определено, интерпретатор находит область программы строки Бейсик с этим номером или первую строку после нее, если строка n не существует.

Команда RUN инициирует требуемые указатели путем выполнения RESTORE и CLEAR до интерпретации какой-либо строки.

SAVE

Эта команда хорошо описана в инструкции "Программирование на языке Бейсик", а подробности представлены после LOAD (см. выше).

STOP

По этой команде появляется сообщение "STOP". Использование CONTINUE как прямую команду позволяет затем продолжить программу со следующего оператора. Как и в любой ошибочной ситуации, команда STOP передает номер ошибки в системную переменную ERR-NR, которая располагается по адресу 23610 (5С3АН), номер ошибки всегда на 1 меньше, чем код ошибки, который появляется перед сообщением об ошибке.

Поскольку ошибка имеет место, интерпретатор останавливает выполнение программы и переходит на программу обработки ошибки. Затем номер ошибки передается в ERR-NR, выбирается адрес возврата в командный режим (адрес расположен в 4367, или 1303Н). Этот адрес возврата всегда существует и расположен в двух адресах ниже стека GOSUB. Если отсутствуют текущие циклы GOSUB, стек GOSUB будет пустым, но, т.к. вызываются различные подпрограммы, адрес возврата опускается в стек и затем извлекается опять, когда программа завершается. Адрес возврата всегда указывается системной переменной ERR-NR, которая расположена в адресах 23613 и 23614 (5С3DH и 5С3ЕН).

Заметьте, что команды RUN и GOTO не очищают стек GOSUB и, следовательно, если программа останавливается без завершения выполнения подпрограммы, тогда ERR-SP постепенно указывает на все более низкие адреса в памяти (на три байта для каждой подпрограммы). Однако, команда CLEAR восстанавливает значение ERR-SP.

VERIFY

Наличие этой команды вселяет уверенность пользователя в Спектрум. Команда VERIFY позволяет сверить с оригиналом любую программу, выведенную на магнитофон с помощью SAVE. Процесс проверки осуществляется для обеих частей программы -заголовка и блока данных. Ошибка "R" - ошибка при загрузке с ленты - появляется, если запись на ленте не точно соответствует оригиналу.

2.3. Функции Бейсика.

ABS

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

ACS

Аргумент "х" берется как косинус и функция возвращает величину данного угла в радианах.

AND

Это двоичная операция, поэтому она требует два операнда. Если оба операнда логически "истинны", операция полностью "истинна". Однако, если один или оба логически "ложные", операция дает "ложь". Числовое выражение, которое является "ложным", будет иметь нулевую длину, т.е. пустую строку. Когда результат "истина", первый операнд возвращается пользователю.

ASN

Аргумент берется как синус и функция возвращает величину данного угла в радианах.

ATN

Аргумент берется как тангенс и функция возвращает величину в радианах. ATN является одной из четырех функций,определенных в Спектрум с использованием полиномов Чебышева.

ATTR

Эта функция имеет форму ATTR (строка, столбец). Она возвращает пользователю значение байта атрибутов.

Функция эквивалентна

РЕЕК 22528 + строка*32 + колонка

Величина признака может рассматриваться следующим образом :

INK + PAPER* 8 + BRIGHT*64 + FLASH*128

BIN

Это интересная функция, т.к. она позволяет любое целое число в диапазоне 0-65535 вводить в двоичной форме. Разрешается использовать любое число двоичных цифр до 16. Следующая строка Бейсика поэтому законна и дает числа от 1 до 10.

10 FOR A=SIN 1 TO BIN 1010 STEP 00000001: PRINT A: NEXT A

Хотя Спектрум позволяет ввести числа в двоичной форме, они не могут печататься в этой форме без использования Бейсик-программы.

CHR$

Эта функция возвращает пользователю символ, как строку для данного кода.

Следующая строка Бейсик показывает, как распечатать набор символов. Клавиши CONTINUE и ENTER должны будут использоваться 6 раз, чтобы установить коды управления цветом:

10 FOR A= 0 TO 255: PRINT CHR$ A: NEXT A

CODE

Эта функция возвращает пользователю код первого символа в аргументе х$; код будет равен нулю, если х$ является нулевой строкой.

COS

Аргумент рассматривается в радианах,и функция возвращает соответствующий косинус для данного угла.

ЕХР

Для данного аргумента х функция возвращает величину "е" в степени "х", где е=2.718281828...

ЕХР является второй функцией, определенной в Спектрум с использованием многочленов Чебышева.

FN

В Спектрум около 2 6 числовых и 2 6 строчных функций. За знаком функции FN должна следовать одна буква или одна буква и знак $, а затем - требуемые аргументы, заключенные в скобки.

IN x

Аргумент х используется как адрес порта, и считываемое значение будет в диапазоне 0-255. Если порт не используется, величина будет 255.

INKEY$

Эта функция позволяет опрашивать клавиатуру без обращения к INPUT. Если нажата одна клавиша, то длина входной строки определяется этой клавишей. INKEY$ распознает как символ на клавише с CAPS LOCK или без нее, а также символ, нажатый с SYMBOL SHIFT. Другие комбинации дают пробел или "?". Если ни одна клавиша не нажата или нажата более, чем одна, длина входной строки равна 0.

INT

Для данной величины х эта функция возвращает только целую часть. У отрицательного числа прежде всего отбрасывается дробная часть, затем вычитается 1, чтобы "округлить" результат. Например, +4.66 даст +4, в то время как -5.66 получит выражение -5 и затем уменьшится до -6.

LEN

Эта функция определяет длину заданной строки. Нулевая строка дает нулевой результат.

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

LN

Для заданного аргумента х функция возвращает логарифм по основанию е для величины х.

Представляет собой еще одну функцию, вычисляемую в Спектрум с использованием полиномов Чебышева.

NOT

Это интересная функция, т.к. она является единственной функцией, которая дает "логическое" состояние значения в системе Спектрум. Однако, важно отметить, что результат инвертируется и что "истина", логический результат, дается довольно трудным просмотром "NOT NOT x".

Для х=2 NOT x даст "ложь", а NOT NOT x - "истина".

Для х=0 NOT x даст "истина", а NOT NOT x - "ложь".

OR

Является двоичной операцией и требует два числовых операнда. Если любой из операндов является логически "истинным", тогда операция - "истинная".

Однако, если ни один из операндов не является "истиной", операция дает "ложь". "Истинный" результат будет равен единице, если второй операнд не равен нулю, и величине первого операнда, если второй операнд равен нулю.

РЕЕК

Это полезная функция возвращает величину, находящуюся по адресу х. Результат будет всегда выражен целым числом в десятичном диапазоне 0-255 включительно.

PI ()

Самая простая функция. Представление с плавающей запятой PI/2 является константой в "таблице постоянных" в ПЗУ. Эта величина выбирается, удваивается и передается пользователю. Величина Р! приблизительно равна 3.141592653...

POINT

Эта функция имеет форму POINT (х-точка^-точка), и возвращает величину 1, если элемент изображения в этом положении установлен, и величину 0, если сброшен.

RND

В Спектрум случайные числа выдаются генератором псевдослучайных чисел. Значение системной переменной SEED, находящейся в 23670 и 23671 (5076 и 5077), выбирается, модифицируется и возвращается при каждом обращении к функции RND. Случайное число, возвращенное пользователю, является новой величиной SEED, деленной на 65536.

Величина SEED сбрасывается в нуль при инициализации системы. С этого времени она является последовательностью целых чисел от 0 до 65535. Наконец, величина не будет повторяться до тех пор, пока все числа от 0 до 65535 не использовались.

Нижеприведенных два примера показывают эти особенности.

а) 10 PRINT RND: FOR A=1 TO 65535: POKE 0, RND: NEXT A: PRINT RND

Эта программа занимает 20 минут работы, но она показывает, что те же самые числа RND получаются каждые 65536 вызовов (POKE 0, RND - является фиктивным оператором). 10 POKE 23670,0: POKE 23671,0 20 LET SEED = 0 30 LET SEED = SEED + 1 40 LET SEED = SEED*75

50 LET SEED = SEED-INT (SEED/65537)*65537 60 LET SEED = SEED-1 70 PRINT SEED/65536, RND

Строка 10 устанавливает системную переменную SEED в нуль. Программа показывает, что такой же результат получается с помощью модифицированных шагов (строки 30-60), как и в случае вызова RND.

SCREEN$

Это самая интересная функция и очень слабо освещена в инструкциях. Форма этой инструкции - SCREEN$(строка,столбец) и она возвращает строку, содержащую символ для заданной позиции. Эта функция распознает символы с десятичными кодами 32-127 (20-7FH), когда они представлены в прямом или инвертированном виде.

Работа функции заключается в сравнении содержимого 8 байтов для области данного символа относительно 8 байтового представления, имеющего место в генераторе символов. Функция возвращает нулевую строку, если символ не является ни одним из 96 символов генератора. Нежелательно, чтобы функция исключала из сравнения символы, определенные пользователем, т.к. вполне возможно, что они могут появиться. Однако будет весьма трудно проверить обычные графические символы, которые не хранятся в 8-байтовой форме, а создаются, когда требуется .

Несмотря на трудоемкую работу, которая включает в себя вычисление этой функции, она выполняется удивительно быстро. Это можно показать довольно просто следующим образом:

10 PRINT " "; SCREEN$ (0,0) результат появится почти мгновенно.

SGN

Все положительные величины возвращают величину "+1". Все отрицательные - "-1", в то время, как нуль - дает "0".

SIN

Аргумент х рассматривается в радианах и функция возвращает соответствующий синус для данного угла. Эта функция является четвертой и последней, вычисляющейся по полиномам Чебышева .

SQR

Эта функция возвращает пользователю квадратный корень аргумента х. Альтернативой для SQR - использование "х**.5" и это покажет по существу каким образом Спектрум представляет SQR в своем калькуляторе. Квадратные корни отрицательных величин не вычисляются и дают сообщение об ошибке "неправильный аргумент".

STR$

Аргумент для этой функции рассматривается как числовое выражение. Операция STR$ включает в себя вычисление выражения, печать его в рабочей области так, как она будет выведена на экран ТВ, если требуется, и затем возвращает пользователю параметры строки.

TAN

Аргумент х рассматривается в радианах, и функция возвращает соответствующий тангенс этого угла. Тангенс находится путем определения синуса и косинуса угла отдельно и последующего деления одного на другое. Вычисление тангенса поэтому занимает в 2 раза больше времени, чем определение косинуса или синуса.

USR

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

USR-число

Эта важная функция может быть рассмотрена по существу как команда. Аргумент х, являющийся числовым выражением, принимается как адрес программы в машинных кодах, написанной пользователем. Когда "USR-число" вызывается, то Z80 останавливает выполнение программы монитора и вместо этого выполняет команды с адреса " х" и далее. Команда машинного кода RET вызовет возврат в программу монитора. Заметьте, что в программе, написанной пользователем в машинном коде, можно модифицировать регистр IY, но его содержимое необходимо восстановить перед возвратом в программу монитора. (Маскируемые прерывания должны быть запрещены, пока пара регистров IY содержит любую величину, отличную от +5С3AH). Однако, значение в альтернативной паре регистров HL должно быть сохранено и остановлено правильно, если требуется успешный возврат к Бейсику. Использование команды "USR-число" позволит получить значение, которое может быть возвращено. В Спектрум числовые значения передаются через пару регистров ВС.

USR-строка

Эта функция возвращает адрес требуемого символа из графики, определенной пользователем. Аргумент "USR-строка" состоит из одного символа и этот символ должен быть в диапазоне "A-U" или "a-u".

В стандартной версии 16К графическая область, определяемая пользователем, будет обычно начинаться с адреса 32600 (7F58H), но, т.к. она может быть перемещена, лучше всегда рассматривать область, как область, начинающуюся с адреса, определяемого системной переменной UDG, которая располагается в адресах 23675 и 23676 (5С7В и 5С7С) .

Если область графики, определенной пользователем, начинается с адреса 32600, то этот адрес задается с помощью USR-"А". Восемь адресов 32600 - 32607 содержат представление символа "А", который будет "А" или как определит пользователь. USR "B" возвращает адрес 32608, USR "С" дает 32616 и так далее, для двадцати одного графического символа.

Простого метода определения символов еще нет, но многократное использование операторов DATA и BIN дадут, по крайней мере, прекрасную идею. Нижеприведенная программа иллюстрирует эту точку зрения.

10 DATA BIN 00000001

11 DATA BIN 00000010

12 DATA BIN 00000100

13 DATA BIN 00000100

14 DATA BIN 00001000

15 DATA BIN 01001000

16 DATA BIN 00101000

17 DATA BIN 00010000

18 FOR A= 0 TO 7: READ B: POKE USR "A"+A,B: NEXT A

19 PRINT CHR$ 144: REM "A"

VAL

Эта функция требует строку в качестве аргумента. Строка затем рассматривается как числовое выражение, вычисленное и возвращенное пользователю. Эта функция по существу полезна, поскольку она позволяет вычислять выражения, которые содержатся в строках.

VAL$

Может показаться, что эту функцию всегда можно обойти. VAL$ требует строку в качестве аргумента, и эта строка должна быть заключена в кавычки, и даже простой оператор, содержащий VAL$, может иметь двойные или тройные кавычки. Функция затем возвращает пользователю результат в виде строки.

Как VAL, так и VAL$, могут в действительности оказаться более полезными, если они не дают сообщения об ошибке: "NON-SENCE IN BASIC", которое имеет место, когда функция повреждена, но дает нулевой результат.

2.4. Управляющие символы.

В Спектрум имеется 11 управляющих символов, которые могут быть использованы.

Процедура управляющего символа возможно не очень полезна для программиста на Бейсике, но она может быть очень полезной, когда вызывается из программы в машинных кодах.

CHR$6 - печать запятой.

Печатаемая позиция устанавливается в положении "следующая половина экрана". Внутри оператора PRINT использование "CHR$6" и "," взаимозаменяемо.

CHR$8 - перемешение на одну позицию назад.

Печатаемая позиция модифицируется для возврата на один символ. Эта операция работает даже когда используется возврат к предыдущей строке экрана.

Особый случай использования CHR$8 позволяет "подчеркивать" как показано ниже.

10 PRINT "*"; CHR$8; OVER 1; "_"; CHR$0 и т.д.

CHR$9 - перемешение вправо

CHR$13 - следующая строка экрана

Печатаемая позиция устанавливается в начальное положение следующей строки. В операторе PRINT использование "CHR$13" и " " взаимозаменяемо, но использование CHR$13 до некоторой степени понятнее в листинге.

CHR$16 до CHR$21 - элементы цвета.

Эти управляющие символы дают "временные цвета". Они соответственно эквивалентны следующим операторам: INK, PAPER, FLASH, BRIGHT, INVERSE, OVER.

Когда один из этих управляющих символов элемента цвета используется, за ним должен следовать соответствующий "номер цвета".

Следующая строка показывает, как цвет INK установить в

RED.

10 PRINT "XXXX", CHR$16; CHR$2; "YYYY"

CHR$22 - AT

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

Следующая строка показывает эквивалентность оператора

10 PRINT AT 12,6; "Here" оператору

10 PRINT CHR$22; CHR$12; CHR$6; "Here"

CHR$ 23 - TAB

Печатаемая позиция устанавливается в столбец, заданный следующими двумя символами. Если текущий номер столбца равен или превышает новое значение, печатаемая позиция определяется на следующей строке экрана.

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

Нижеследующая программа показывает эту возможность.

10 FOR A= 0 TO 2 0

2 0 PRINT PAPER 7; TAB RND 7;

PAPER RND *6.5; TAB RND*20+9; A

30 NEXT A

Строка 20 может быть:

20 PRINT PAPER 7, CHR$23, CHR$ (RND 7); CHR$0; PAPER RND 6.5; CHR$ 23, CHR$ (RND 20 9); CHR$0; A




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Мысли - историю создания первого номера ZX-ZОNE.
Посмеемся - Дpуг мой из USA pассказывал неописуемый случай!
Трибуна - Рассуждения на тему.
Садоводцы и морозовки - Синильная кослота приятно пощипывала желудок.
Юмор - Жизнь сетевая.

В этот день...   24 ноября