Echo #03
31 марта 1997

Книга - Тайники ZX-Spectrum: ZX-Бейсик.

<b>Книга</b> - Тайники ZX-Spectrum: ZX-Бейсик.
   Глава 3.

   ZX - Б Е Й С И К


   В  этой  главе кратко представлен алфа-
витный  перечень  функций  и  команд языка
ZX-Бейсик. Его стоит просмотреть даже тем,
кто  хорошо знает этот диалект, так как мы
приводим  информацию, пропущенную в ориги-
нале инструкции по эксплуатации.

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

   @ - единичная литера;
   V - переменная любого типа;
   X,  Y, Z - численные выражения с дейст-
вительными значениями;
   K, M, N - численные выражения со значе-
ниями  автоматически  округляемыми ближай-
шими  целыми числами;
   E  -  численное выражение или строка;
   F - строка;
   S - последовательность команд, отделен-
ных друг от друга двоеточием;
   C  - последовательность инструкций, оп-
ределяющих цвета  и   способ  высвечивания
(INK,  PAPER,  BRIGHT, FLASH, OVER, INVER-
SE), отделяемые запятыми и точками с запя-
той.
   Символы, помещенные в квадратные скобки
( [ ] ),  можно не употреблять.  Например:
LOAD F CODE [M[, N]] означает, что верными
являются формы:

   LOAD F CODE
   LOAD F CODE M
   LOAD F CODE M, N.

   В этом случае SPECTRUM обычно дополняет
пропущенные параметры значениями, вытекаю-
щими  из  контекста, в нашем случае - счи-
танными с магнитной ленты. Запись @[Z] оз-
начает  или  @Z,  или @, т. е. допускается
использование как числовой переменной, так
и текстовой.

   SPECTRUM  почти  во всех случаях допус-
кает  использование  в качестве параметров
выражений,  требующих предварительных рас-
четов. Ограничения затрагивают лишь допус-
тимые  значения рассчитываемых результатов
и  их  типы.  Выражения типа K, M, N могут
давать  в  результате любые действительные
числа  меньшие 65535 (2^16-1), которые бу-
дут  округлены  ближайшими целыми числами.
Появление  большего  числа сигнализируется
как   ошибка  сообщением  INTEGER  OUT  OF
RANGE.


   3. 1. Структура программы

   Программа  на  Бейсике - это последова-
тельность инструкций, разделенных на стро-
ки. Каждая строка начинается со своего но-
мера - натурального числа в диапазоне 1...
9999.   Пронумерованные   операторы  могут
вводиться  в любой последовательности, они
будут  автоматически  упорядоченны по воз-
растанию номеров. Необязательно нумеровать
подряд, например 1, 2, 3,... , такой стиль
программирования не рекомендуется. Удобнее
пользоваться  номерами через 10, т. е. 10,
20,  30,...,  что  облегчит  вставку новых
строк между старыми.

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

   Единичный оператор программы может быть
значительно  длинее  экранной  строки  (32
знака),  но  не  может содержать более 127
инструкций.  Команды  в  операторе  должны
быть  отделены  двоеточием. Между инструк-
циями в строке можно размещать любое число
пробелов   с  целью  улучшения  читаемости
программы.

   Нажатие  <ENTER> завершает ввод строки.
Компьютер  проверяет  ее синтаксис и, если
она начинается с номера, включает ее в су-
ществующую  программу,  вставляя ее в тре-
буемое место, а если номер опущен, компью-
тер  приступает  к немедленному выполнению
введенной последовательности команд.


   3. 2. Типы данных

   ZX-Бейсик   позволяет   непосредственно
оперировать  числами и текстами. Числа мо-
гут записываться в одной из трех форм:

   - целочисленной:  0, +17, -12, 35 и так
     далее;
   - дробной: +31. 1768, 3303, 12, -. 72 и
     т. д.;
   - показательной:  7.32Е-7    обозначает
     число 7.32*10^-7;

   Максимальное  значение  действительного
числа  не  может превышать 1.7Е+38.  Числа
хранятся   с  точностью  до  9-10  значных
цифр.  Пробелы в середине записи числа  не
допускаются.   SPECTRUM  для  высвечивания
числа  потребует  максимально  14  знаков.
Значения, требующие не более 8 цифр, выво-
дятся  точно.  Остальные  в  показательной
форме.

   Другим типом данных ZX-Бейсика являются
текстовые  константы, называемые также це-
почками  (строками).  Это любая последова-
тельность  знаков  (символов с кодами от 0
до 256), размещенная в кавычках. В тексто-
вую  константу  можно также включать конт-
рольные (управляющие символы), коды ключе-
вых  слов и даже коды символов не задейст-
вованные  в  ZX-SPECTRUM.  Длина текстовой
константы  -  это число содержащихся в ней
символов,  а  не число знаков, необходимых
для  высвечивания константы на экране. Это
число ограниченно лишь размером допустимой
памяти. Допускаются и тексты длиной  0, т.
е. пустые.

   Во  время  конструирования текста боль-
шинство символов можно вводить непосредст-
венно  с  клавиатуры.  Но  некоторые могут
потребовать  дополнительных  усилий. Чтобы
ввести  в текст кавычку, необходимо ввести
ее с клавиатуры дважды. Универсальным спо-
собом вставки в текстовую строку символов,
не  задействованных в ZX, является исполь-
зование   алфавитно-цифровых  выражений  и
функции  CHR$.  Например,  конструкция "Э-
ТО"+CHR$   13+"ТЕКСТ"  даст  в  результате
текст:

   ЭТО
   ТЕКСТ

   ZX-Бейсик  не знает логических перемен-
ных.  Эту  роль исполняют числа. Значения,
отличающиеся  от  0,  интерпретируются как
ИСТИНА,  равные 0 - ЛОЖЬ. Результатом рас-
четов  логических выражений являются числа
0 и 1.

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

   Переменные,  хранящие число или цепочку
знаков,  называются  простыми переменными.
Кроме  них можно также применять так назы-
ваемые  табличные переменные (массивы), но
они  должны  быть  объявленны  инструкцией
DIM. Допускаются как числовые массивы, так
и  символьные.  Элементом числовой таблицы
является  число,  а символьной - единичный
символ с кодом от 0 до 255. Операторы зна-
ковых  массивов  могут  использоваться как
алфавитно-цифровые  переменные  постоянной
длины,   определенной  последним  индексом
(размерностью) декларации данного массива.
Число размерностей ограниченно 255. Индек-
сы  не  могут превышать значение 65535. На
практике  эти  значения должны быть значи-
тельно  меньше  из-за  допустимых размеров
памяти. В объявлении массива дается только
верхняя граница индекса. За нижнюю границу
всегда принимается 1.

   3. 3. Имена

   Одно из неудобств ZX-Бейсика, это огра-
ничения  в  определении  имен используемых
переменных.  Только простые числовые пере-
менные  могут быть любой последовательнос-
тью букв, цифр и пробелов. Первым символом
имени должна быть литера.

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

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

   Для  задания имен в программе можно ис-
пользовать  как малые, так и большие лите-
ры.   ZX-SPECTRUM  автоматически  заменяет
большие литеры на малые. Все пробелы игно-
рируются.

   Ограничение использования имен частично
компенсируется  возможностью использования
одной и той же литеры как имени переменных
различных  типов.  Естественное требование
при  этом:  текстовая переменная не должна
помечаться тем же символом, что и знаковый
массив. Например, литера A в программе мо-
жет означать:

   A  -  числовая или управляющая перемен-
ная;
   A$ или A$(I, J) - текстовая  переменная
или знаковый массив;
   A(I) - числовой массив;
   FN  A...  -  функция  с числовым значе-
нием;
   FN  A$...  - функция с текстовым значе-
нием;
   DEF  FN A$(A, A$,...) - параметры в оп-
ределении функции.

   Все  это  не  приводит к неоднозначному
толкованию этих имен.


   3. 4. Выражения

   Выражения в ZX-Бейсике строятся из пос-
тоянных,  переменных, операторов, функций,
а  также скобок. Последовательность выпол-
нения   действий  в  выражении  определяют
круглые скобки и приоритеты отдельных опе-
раций.  Ниже рассмотрены все допустимые  в
ZX-Бейсике  операции  в последовательности
их приоритетов.

   3. 4. 1 Выделение фрагмента текста

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

   - отсутствовать,  изменению  не подвер-
гать;
   (K) - арифметическое выражение, резуль-
тат - единичный символ, находящийся на К-й
позиции текста;
   (K  TO  M) - арифметическое выражение с
ключевым словом "TO", результат - фрагмент
текста, включающий символы от K-го до M-го
включительно.     Если K>M>0,    результат
- пустая  цепочка,  а  если  текст  короче
M,  сигнализируется  ошибка. Например, при
выполнении программы:

   10 LET A$="ТЕКСТ"
   20 DIM B$(2, 3)
   30 LET B$(1) ="ABC"
   40 LET B$(2) ="XYZ"

   получаем:

   A$=A$() =A$(TO) =A$(1 TO 5) ="ТЕКСТ"
   A$(1) =A$(TO 1) =A$(1 TO 1) ="Т"
   A$(3 TO 3) =A$(3) =A$(5-2) ="K"
   A$(TO 2) =A$(1 TO 2) ="ТЕ"
   A$(3 TO) =A$(3 TO 5) ="КСТ"
   A$(2 TO 4) ="ЕКС"
   B$(1) =B$(1,)=B$(1)()=B$(1,TO)=
         =B$(1)(TO) =B$(1, 1 TO 3)=
         =B$(1)( 1 TO 3) ="ABC"
   B$(2, 2) =B$(2)( 2) =B$(2, 2 TO 2) =
         =B$(2)( 2TO2) ="Y".

   В  других  диалектах  Бейсика  подобную
роль выполняют функции:

   LEFT(A$, N) = A$(TO N)
   RIGHT(A$, N) = A$(N TO)
   MID(A$, K, M) = A$(K TO M)
   TL(A$) = A$(2 TO)


   3. 4. 2 Возведение в степень

   Аргументами  операций возведения в сте-
пень  являются вещественные числа. Основа-
ние  всегда должно быть положительным чис-
лом.  Следует  помнить,  что A^B рассчиты-
вается как EXP(B*LN(A)), поэтому A^2 будет
вычислятся дольше, чем A*A.


   3. 4. 3  Минус как знак числа (-)


   Аргументом этой операции всегда являет-
ся число. Результатом - то же число с про-
тивоположным знаком. Минус  как знак числа
следует  отличать  от  обозначаемой тем же
символом операции вычитания. Высокий прио-
ритет  этой  операции  позволяет  написать
A*-B,  что  интерпретируется как A*(-B). В
иных  диалектах  Бейсика употребление двух
операций подряд не допускается.


   3. 4. 4 Умножение и деление (*, /)

   Умножение  и  деление арифметически вы-
полняются  в той же последовательности,  в
какой встречаются в выражении. Знаки умно-
жения  опускать  нельзя.  Умножение выпол-
няется  компьютером  быстрее  чем деление,
следовательно  лучше  писать  A*.5  вместо
A/2.


   3. 4. 5 Сложение и вычитание (+, -)

   Для числовых аргументов эти символы оз-
начают  сложение и вычитание. Обе операции
имеют одинаковый приоритет и выполняются в
очередности появления.

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


   3.  4. 6 Знаки отношений ( =, <, >, <=,
>=, <>)

   Это  двухаргументные операции сравнения
одного  типа.  Все  они  имеют  одинаковый
приоритет  и  означают  отношения:  РАВНО,
МЕНЬШЕ,  БОЛЬШЕ,  МЕНЬШЕ ИЛИ РАВНО, БОЛЬШЕ
ИЛИ  РАВНО, НЕ РАВНО. Результатом является
число  1,  если отношение соблюдается и 0,
если  нет.  Результаты  проверки отношений
могут  быть  использованы в арифметических
выражениях как обычные числа.

   Как пример разберем следующую проблему:
имеем в  программе числовой массив B, объ-
явленный  инструкцией  DIM B(100). Необхо-
димо  определить  сколько  элементов этого
массива  больше 7. Проще всего этого можно
добиться командами:

   LET X=0
   FOR I=1 TO 100
   LET X=X+(B(I)>7): NEXT I

   После выполнения этих команд переменная
X будет содержать искомое число.

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

   "" < "TEKST" < "TZ" < "TZ0"


   3. 4. 7 Логическое отрицание (NOT)

   Это операция логического отрицания зна-
чения  числового выражения, являющегося ее
аргументом,  которое  рассматривается  как
логическая величина.

           | 0, если X<>0
   NOT X = |
           | 1, если X=0

   Помните,  что логические выражения типа
(A>B) OR (C=D) компьютер трактует как чис-
ловые выражения.


   3. 4. 8 Логическое И (AND)

   Логическое  И  - двухаргументная опера-
ция.  Это весьма полезная операция, приме-
нение которой выходит далеко за расчет ло-
гических выражений. Первым аргументом опе-
рации  AND  может быть как числовое, так и
алфавитно-числовое выражение. Вторым долж-
но быть только числовое. Ниже дано опреде-
ление  логического  И,  как  его  понимает
ZX-Бейсик:

             | X, если Y<>0
   X AND Y = |
             | 0, если Y=0

             | F, если Y<>0
   F AND Y = |
             | "", если  Y=0

Определение  это может показаться странным
и не связанным с тем, что мы привыкли счи-
тать  логическим  И. Обратим внимание, что
если  оператор  AND будет находиться между
двумя  логическими выражениями, то 1 будет
его результатом тогда и только тогда, ког-
да  оба  эти  выражения будут истины. Дос-
тоинство  такого  определения операции AND
проявляется ниже в примерах. Допустим, что
переменной  MAKSIMUM  мы  хотим  присвоить
значение максимального из чисел A и B. Для
этого достаточно одной инструкции:

   LET  MAKSIMUM  =  (A  AND  A>B) +(B AND
A<=B)

   Скобки  в  этом  выражении  обязательны
ввиду  высокого приоритета операции "+".

Еще более наглядные результаты можно полу-
чить  работая  с текстами. Следующая прог-
рамма  распознает  пол пользователя по его
имени:

   10 PRINT "СООБЩИ СВОЕ ИМЯ" : A$
   20 PRINT  "ПРИВЕТ ПАН"+("И" AND A$(LEN
A$) ="A")

Ком. Ред.: книга  была переведена с польс-
кого.

   Не  распологая операцией AND такого ти-
па, необходимо было бы многократно исполь-
зовать  инструкции  IF...  THEN,  а  также
GOTO.. .


   3. 4. 9  Логическое сложение (OR)

   Операция  OR - двухаргументная. Оба ар-
гумента должны быть числовыми выражениями.
Действие этой операции следующее:

            | 1, если Y<>0
   X OR Y = |
            | X, если Y =0

   Применение  OR вне логических выражений
значительно  реже чем AND. Например, инст-
рукцию,  рассчитывающую  максимум  из двух
чисел можно записать в следующей форме:

   LET  MAKSIMUM  =  A*(0 OR A>B) +B*(0 OR
A<=B).


   3. 5 Функции

   ZX-Бейсик  содержит  набор  стандартных
функций  для математических расчетов, опе-
раций  над знаковыми последовательностями,
а  также  для  опроса экрана и клавиатуры.
За   исключением  функций  ATTR,  POINT  и
SCREEN$  аргументы, являющиеся константами
или  единичными  переменными (простыми или
массивами), не требуется заключать в скоб-
ки.

   ABS X - Абсолютная величина числа X.

   ACS X - Арккосинус X (в радианах). Если
X  не относится к диапазону [-1,1], сигна-
лизируется ошибка A (Ошибочный аргумент).

   ASN  X - Арксинус X (в радианах). Огра-
ничение  на использование такое же как и у
ACS.

   ATN  X - Арктангенс X (в радианах).

   ATTR (K, M) -  Задание аттрибутов в K-м
операторе, и M-й колонке. Способ кодирова-
ния аттрибутов описан в главе "Использова-
ние памяти". Если параметры не находятся в
диапазонах  0<=K<23  и 0<=M<=31 сигнализи-
руется  ошибка  B  (превышение допустимого
значения).

   BIN  -  Преобразование двоичного  числа
без знака (максимально 16 цифр) в десятич-
ное (на экране), либо в форму принятую   в
ZX-SPECTRUM (в памяти). ZX-Бейсик не имеет
функции,  осуществляющей обратное преобра-
зование десятичного числа в двоичное.

   CHR$  K - Замена числа на соответствую-
щие символы ASCII, или управляющий символ,
если  K  не относится к диапазону [0, 255]
сигнализируется ошибка B.

   CODE F - Замена символов ASCII на  чис-
ло.  Аргументом  является  любое алфавитно
-цифровое  выражение,  а значением функции
является код первого символа этого выраже-
ния или 0, если аргумент пустая цепочка.

   COS X - Косинус (X в радианах).

   EXP X - Функция e^x.

   IN K - Опрос  портов  процессора. Соот-
ветствует   двум   инструкциям  ассемблера
процессора Z80:

       LD BC, K , а также
       IN A,(C).

   Значением  функции  IN  является  целое
число в диапазоне [0, 255]. Это единствен-
ная  инструкция,  применение которой может
привести  к  тому,  что  Ваша программа не
будет  выполнятся  на  других  экземплярах
ZX-SPECTRUM! Применение IN к чтению с кла-
виатуры:  каждый  ряд  клавиш  разделен на
две  группы по пять и каждая пятерка отно-
сится  к  определенному порту (или буферу,
как кто называет):
   _____________________________________
  |               |                     |
  |               |   НОМЕР     БУФЕРА  |
  |    КЛАВИША    |---------------------|
  |               |  10-ный | 16-ричный |
  |---------------|---------|-----------|
  |  CS  ...  V   |  65276  |    #FEFE  |
  |  A   ...  G   |  65022  |    #FDFE  |
  |  Q   ...  T   |  64510  |    #FBFE  |
  |  1   ...  5   |  63486  |    #F7FE  |
  |  0   ...  6   |  61438  |    #EFFE  |
  |  P   ...  Y   |  57342  |    #DFFE  |
  | ENTER  ...  H |  49150  |    #BFFE  |
  | SPACE  ...  B |  32766  |    #7FFE  |
  |_______________|_________|___________|


   Пять младших битов в данном буфере сиг-
нализируют  какая клавиша нажата (0 -нажа-
та, 1 -отжата). Трудности возникают с тре-
мя  старшими битами. В 1-й версии ZX-SPEC-
TRUM  (самой  старой)  они всегда равны 1.
Cледовательно  IN 64510=255 означает осво-
бождение  клавиш  между Q  и T. В версии 2
шестой бит равен 0 и в  описанной ситуации
IN 64510=191. В версии 3 состояние шестого
бита  не  определено и необходимы дополни-
тельные операции, например:

   LET P=IN K : LET P=P-32*INT(P/32)

   Чтение с клавиатуры с помощью IN делает
возможным  распознавание нескольких однов-
ременно нажатых клавиш.

   INKEY$  -  Чтение клавиатуры. Значением
функции  является  знак  нажатой  клавиши.
Клавиатура  читается в режимах L и C. Если
нажато  несколько клавиш или не нажато  ни
одной,  то  значением  INKEY$ будет пустая
цепочка.  Эта функция не ждет нажатия кла-
виши.

   INT X - Целая часть числа. Действитель-
ное число округляется до ближайшего целого
не  превышающего  X. Например:

   INT 3.1=INT 3.9=3, INT -5.1=-6.

   LEN F - Длина цепочки знаков.

   LN  X - Натуральный логарифм от X. Если
X<=0, сигнализируется ошибка A.

   PEEK K - Содержимое ячейки памяти с ад-
рессом K.

   PI - Значение   постоянной   3.14159265
(число Пи).

   POINT (K, M) - Проверяет состояние точ-
ки экрана. Эта функция  имеет  значение 1,
если точка на экране с координатами (K, M)
имеет  цвет  чернил  (выведена)  и 0, если
имеет  цвет  фона. Обнаруживает выведенные
точки  даже при сливании цвета фона с цве-
том чернил и они невидимы. Координаты дол-
жны  находиться  в  диапазонах  0<=K<255 и
0<=M<=175.

   RND  - Генератор псевдослучайных чисел.
Очередное  значение  равняется SEED/65536,
где SEED двухбайтовая системная переменная
с адресом 23671(#5C76). Каждый раз с вызо-
вом RND она  модифицируется в соответствии
с  формулой:  SEED=((SEED+1)*75 MOD 65537)
-1  (X  MOD Y: остаток от деления X на Y).
Таким  образом генерируется последователь-
ность  в  пределах  65536. Переменной SEED
можно задавать первоначальное значение ин-
струкцией RANDOMIZE K.

   SCREEN$ (K, M) - Распознает знак на эк-
ране. Эта функция на основании формы опре-
деляет символ, выведенный на экран в пере-
сечение  K-й строки и M-й колонки. Распоз-
наются  только  символы  с кодами от 32 до
127. В случае не распознования знака, зна-
чением   функции  является  пустой  текст.
Координаты   должны   быть   в  диапазонах
 0<=K<=23 и 0<=M<=31.

   SGN X - Знак  числа. Значением  функции
являются  числа -1,  0, 1 в зависимости от
знака аргумента.

   SIN X - Синус (X в радианах).

   SQR X  -  Квадратный  корень из X. Если
X<0 сигнализируется ошибка A.

   STR$ X  - Замена  числа на цепочку зна-
ков.  Эта функция заменяет двоичное предс-
тавление  числа на символьное, которое мо-
жет быть представленно на экране.

   TAN X  -  Тангенс  (X в радианах). X не
должен быть кратен PI/2.

   USR  -  Работа  этой функции зависит от
типа  аргумента. Ее вызов с числовым аргу-
ментом (USR K) приводит  в действие машин-
ный  код с адреса K. После ее выполнения и
возврата   управления  Бейсику,  значением
функции является содержимое пары регистров
BC. При вызове функции с текстовым выраже-
нием  (USR F),  где  F  содержит малую или
большую  литеру  от  A  до U включительно,
значением функции является адрес в области
UDG,  начиная  с которого хранятся 8 байт,
определяющих   вид  графического  символа,
определенного пользователем  и получаемого
в  режиме  G путем нажатия клавиши с соот-
ветствующей литерой.

   VAL F - Рассчитывает значение числового
выражения, представленного   в  символьной
форме. Весьма важная функция с разнообраз-
ными  приложениями.   Если  выражение F не
представляет  верного (для Бейсика) число-
вого  выражения, сигнализируется ошибка C.
В  ходе  расчета  могут возникать и другие
ошибки, зависящие от вида выражения.

   VAL$ F - Определяет значение текстового
выражения,  представленного  в  символьной
форме.  Область  применения  меньше  чем у
VAL.  Трудно  найти ситуации, в которых ее
применение  необходимо, кроме вывода текс-
товых  переменных с именами, заранее неиз-
вестными,  определяемыми только в процессе
выполнения  программы.  Допустим, что зна-
чением   переменной  A$  является  литера,
определяющая  имя алфавитно-цифровой пере-
менной.  Не  располагая  этой  функцией мы
имели бы значительные трудности при распе-
чатке этой переменной. PRINT VAL$(A$+"$").

   К  сожалению не все функции выполняются
в  полном соответствии с замыслами авторов
интерпретатора  ZX-Бейсик. В главе "Ошибки
системы"  мы приводим известные неточности
в выполнении функций SCREEN$, STR$ и USR.

   3.6 Инструкции ZX-Бейсика


   ZX-Бейсик  представляет в наше распоря-
жение  50  инструкций.  Все они могут быть
помещены  в программе или выполнены сразу,
как приказы, отданные с клавиатуры.

   BEEP  X,Y - Позволяет генерировать зву-
ки.  0.5<=X<10.5 - время звучания в секун-
дах.  -60<=Y<=69.8 - высота тона. Значение
Y=0 отвечает ноте "си" средней октавы. Ди-
апазон изменения Y отвечает приблизительно
трем октавам. Выход за допустимые значения
сигнализируется сообщением B. Во время ге-
нерации  тона  не  контролируется  клавиша
<BREAK>, в связи с чем прерывание програм-
мы   возможно   лишь  по  завершению  этой
инструкции.

   BORDER K - Эта команда задает цвет рам-
ки (бордюра) на экране телевизора. 0<=K<=7
- обозначает номер выбранного цвета. Выход
за  пределы  сигнализируется сообщением B.
Командой BORDER K устанавливают также цвет
фона  в нижней части экрана, предназначен-
ного  для системных сообщений и ввода дан-
ных инструкцией INPUT.

   BRIGHT  K  -  Оттенок  фона. K=0 - нор-
мальный,  K=1  -  яркий.  K=8 - вызывает в
данном  поле  уже определенный в нем ранее
оттенок.BRIGHT  K  может выступать как са-
мостоятельная  инструкция  или  в  составе
PRINT  или  INPUT,  действуя в этом случае
только   на   время   выполнения  головной
инструкции.Проверим  это  на  печати  CHR$
19+CHR$  K. Эти символы можно ввести как в
текст   программы,   так   и  в  текстовые
константы,  нажимая  в  расширенном режиме
(курсор E) клавишу <8> как BRIGHT 0 и кла-
вишу <9> как BRIGHT 1.

   CAT  ...  -  Эта  инструкция  может ис-
пользоваться  лишь с подключенным ZX-ИТЕР-
ФЕЙСОМ-1.

   CIRCLE  [C,],K,M,N  -  Вывод окружности
радиуса  N  с центром в точке (K,M) цветом
C.  Если  C  опущен, то принимается INK 8,
PAPER  8,  BRIGHT  8,  FLASH 8. Допустимые
значения параметров: 0<=K<=255; 0<=M<=175.
Попытка  рисования окружности за пределами
экрана вызывает ошибку B.

   CLEAR [K] - Очищает область переменных,
освобождая занятую ими память, стирает эк-
ран  и  стек адрессов возврата из подпрог-
рамм,  выполняет инструкцию RESTORE, обну-
ляет  указатели,  определяющие  координаты
для  рисующих  и  пишущих инструкций. Если
задан  параметр K, его значение будет при-
нято  как  новый  RAMTOP.  K должно быть в
пределах 23821...65535, иначе появится со-
общение  M (RAMTOP NO GOOD). Если в памяти
компьютера уже есть программа, то K должно
соответственно   возрасти.  Слишком  малое
значение  RAMTOP может сделать невозможным
выполнение программ и команд с клавиатуры.

   CLOSE  #K  -  Эта команда отключает K-й
поток  от  приписанного ему канала. Хотя K
может  принимать  значения  от 0 до 15, на
практике  попытка  отключения потоков от 0
до 3 системой игнорируется. См. главы "Ка-
налы и потоки" и "Ошибки системы".

   CLS - Очищает экран и обнуляет экранные
указатели  инструкций  печати  и  графики.
После стирания экран приобретает цвет, оп-
ределенный последними инструкциями PAPER и
BRIGHT.

   CONTINUE  -  Эта  инструкция  позволяет
продолжить работу программы после останов-
ки. Если прерывание поступило в результате
ошибки, сигнализируемой от 9 до L, то пос-
ле  CONTINUE будет повторена последняя вы-
полненная  инструкция, в остальных случаях
будет  выполнена следующая инструкция. Это
позволяет исправить с клавиатуры найденные
ошибки и продолжить работу. Эта инструкция
не  применима  к  директивам, задаваемым с
клавиатуры.  Локализация  CONTINUE в прог-
рамме не сделана специально, т.к. ее рабо-
та  зависит от текущего значения системных
переменных  OLDPPC  и  OSPPC. Т.е., в свою
очередь,  модифицируется системой и отсле-
живание  и  управление их состоянием может
быть  затруднительно,  особенно  во  время
тестирования программы.

   COPY  - Если к SPECTRUM подключен прин-
тер,  то  по  этой  команде  содержимое 22
верхних  строк будет скопировано на бумагу
(копируется  не  только текст, но и рисун-
ки).  При отсутствии принтера эта инструк-
ция  просто игнорируется. SPECTRUM сам оп-
ределяет  подключен  ли  принтер. Во время
вывода  внутренний таймер останавливается.
Системные переменные FRAMES в это время не
модифицируются.

   DATA  -  Позволяет  размещать  в тексте
программы  списки  данных.  В списке можно
размещать любые выражения:

       100  DATA SIN X+COS X+1, "ЗНАЧЕНИЕ"
+ ("ПОЛОЖ." AND Z>0 + ("ОТРИЦ." AND Z<0)
       110 READ Z,Z$
Переменная Z примет значение SIN X + COS X
+  1 рассчитанное для текущих значений X и
Y.  Переменная  Z$ будет содержать цепочку
"ЗНАЧЕНИЕ ПОЛОЖ." или "ЗНАЧЕНИЕ ОТРИЦ.", в
зависимости от рассчитанного Z. Бессмысле-
но  задавать  команду  DATA  с клавиатуры,
т.к.  SPECTRUM  после  проверки синтаксиса
тут  же  забудет  о ней. В программе может
присутствовать   любое   число  инструкций
DATA, размещенные в любом месте.

   DEF FN @[$]([@1[$],@2[$],....,@I[$]]) =
E  -  Определение  функции  пользователем.
Именем  функции может быть только одна ли-
тера,  возможно со знаком $. Его использо-
вание  определяет  тип функции как тексто-
вой.  После  имени  в обязательных скобках
можно задавать список аргументов,разделен-
ных  запятыми. Допускается определение бе-
заргументных   функций.  Имена  аргументов
должны  быть  однолитерными  (возможно  со
знаком  $).  Ограничение на число аргумен-
тов: 52 (26 числовых и 26 алфавитно-цифро-
вых).  После закрытия скобкой списка пара-
метров  и  знака  "="  следует определение
функции. Им может быть любое выражение со-
ответствующего типа, состоящее из постоян-
ных,  переменных,  аргументов, стандартных
функций  и  функций, определенных програм-
мистом.  Следует избегать рекурсивного вы-
зова  процедур, как косвенно, так и непос-
редственно. SPECTRUM не распознает эту си-
туацию.  После  заполнения памяти появится
сообщение  (1  или  6), или даже дойдет до
краха  системы. Инструкцию DEF FN не имеет
смысла  задавать с клавиатуры. Зато с кла-
виатуры  можно вызывать функции, имеющиеся
в    программе.   Размещение   определений
функций  и  их  вызов не имеет значение. В
случае  многократного определения в тексте
программы  функций с одинаковыми именами и
типами,   действующим  определением  будет
версия  размещенная  в строке с наименьшим
номером. Обратим внимание, что в определе-
нии функции могут выступать имена перемен-
ных, используемых в других местах програм-
мы. Единственно: переменные, имеющие имена
идентичные  именам  параметров, становятся
для  функции  "невидимыми",  а  вместо них
выступают значения параметров функции.

     DIM   @[$](K1,....,KJ)  -  Объявление
массива.  Эта команда резервирует в памяти
место  для числового или текстового масси-
ва.  Размерность массива ограничена числом
255.  Определенные  индексы задают верхние
границы,  нижней  границей всегда является
1.  Приказ  стирает  в памяти существующий
массив  с  таким  же  именем того же типа.
Значения, определяющие размерности, должны
быть известны в момент выполнения инструк-
ции DIM, но не обязательно в момент запус-
ка  программы.  Числовые  массивы в момент
определения  автоматически заполняются ну-
лями,  а текстовые - пробелами. Элементами
знакового  массива являются единичные сим-
волы. Такие массивы могут трактоваться как
массивы  простых  текстовых  переменных  с
одинаковой, заранее заданной, длиной. Дли-
на  эта устанавливается последним заданным
параметром,   определяющим  массив.  Обра-
щаться к массиву знаков как к списку прос-
тых текстовых переменных следует при опус-
кании последнего индекса. Если в программе
объявлено:

     DIM A$(10):  DIM B$(5,20),

то A$=A$() является алфавитно-цифровой пе-
ременной с длиной 10, а B$(I)=B$(I,) явля-
ется пятью переменными с длиной 20. Если

     LET A$="ARA",

                            то   длина  A$
тоже  20 символов, нехватающие символы ав-
томатически дополняются пробелами.

     DRAW  [C,]K,M[,X]  -  Эта  инструкция
позволяет рисовать отрезки прямых (X опус-
кается  или  равен 0) и фрагменты дуги ок-
ружности с центральным углом X, выраженном
в  радианах. Началом рисунка является пос-
ледняя точка графической инструкции (POLT,
DRAW,  CIRCLE)  -  (XOLD,  YOLD), а концом
точка  (XOLD+K, YOLD+M). Если X>0, то дуга
рисуется против часовой стрелки, а для X<0
-  по  часовой. Любопытным советуем прове-
рить выполнение следующих команд:

     PLOT  55,27  : DRAW OVER 1, 120, 120,
59-3*PI

     ERASE   ...-   Инструкция   действует
только при наличии ZX-ИНТЕРФЕЙСА-1

     FLASH  K  -  Включение мерцания поля.
K=0  - нет мерцания, K=1 - есть мерцание и
K=8  -  означает,  что статус данного поля
должен  оставаться  неизменным.  FLASH как
самостоятельная инструкция определяет спо-
соб  высвечивания в пределах всей програм-
мы,  помещенная  же  в  список  PRINT  или
INPUT, только во время выполнения конкрет-
ной  инструкции.

  FOR  @=X  TO  Y [STEP Z] Цикл: выполнять
для  @ от X до Y с шагом Z (Z>0 - увеличе-
ние, Z<0 - уменьшение). Конец цикла указы-
вается  командой NEXT @. Заданием инструк-
ции  FOR является создание управляющей пе-
ременной  (после уничтожения в памяти чис-
ловых  или управляющих переменных с тем же
именем).  Эта  переменная  имеет  в памяти
представление,  отличное от числовых пере-
менных, кроме ее значения хранятся также Y
и  Z, а также номер строки инструкции FOR.
После  формирования переменной контролиру-
ется:  Может ли цикл быть выполнен хотя бы
раз.  Если  да,  то  управление передается
следующей  за FOR инструкции. Если нет, то
следующей  за  NEXT @ команде. Если NEXT @
нет,  то  выводится сообщение I. Если STEP
опущен,   то  Z=1.  Несмотря  на  то,  что
ZX-Бейсик  формально  не  отличает чисел с
плавающей  запятой  от целых, для целых X,
Y, Z обработка цикла ускоряется на 20% .

   FORMAT ...- Инструкция действует только
при наличии ZX-ИНТЕРФЕЙСА-1.

   GOSUB  K  - Вызов подпрограммы. Эта ко-
манда  размещает  в специальном стеке свой
собственный адрес, а затем передает управ-
ление  строке  под  номером  K (или первой
большей).  Далее  выполняются  команды  до
встречи  с  командой RETURN, после которой
со  стека снимается адрес последнего GOSUB
и управление передается адресу, следующему
за  ним.  Подпрограммы позволяют выполнять
одну  и  ту же последовательность команд в
разных  местах программы без их многократ-
ного повторения. На глубину вызов подпрог-
рамм  ограничений  нет.  Допускается реку-
рентность,  т.е. вызов подпрограммой самой
себя.

   GO  TO K - Переход к строке с номером K
или  следующей.  Если нет такой строки, то
программа  заканчивается сообщением 0. Эта
команда  набранная с клавиатуры, запускает
программу  с заданной строки. Запуск прог-
раммы  с помощью GO TO (в сравнении с RUN)
имеет то преимущество, что не вызывает по-
терь значений переменных.

   IF  X  THEN S - Условный оператор. Если
значение  выражения X отличается от 0, вы-
полняется  последовательность  команд S. В
противном  случае  все  команды  до  конца
строки пропускаются и управление передает-
ся следующей строке.

   INK  K  -  Определение  цвета очередных
знаков  на  экране. Эта команда определяет
цвет  "чернил". Значения K от 0 до 7 опре-
деляют  номер выбранного цвета, 8 - сигна-
лизирует  согласие  на цвет ранее заданный
для  данного  поля  экрана, 9 - задает ис-
пользование  белого  или  черного цветов в
зависимости от контрастности установленно-
го  в  данном  поле  цвета  фона. В нижних
строках  экрана  система всегда использует
INK  9.  Эта  инструкция может применяться
как   самостоятельно,   так   и  в  списке
инструкций PRINT, INPUT, CIRCLE и т.д..

   INPUT  ...- Позволяет во время выполне-
ния  программы вводить с клавиатуры данные
для указанных в списке переменных. Эта ко-
манда  также позволяет ввод в нижнюю часть
экрана.  Надпись сохраняется лишь на время
ввода. После ключевого слова INPUT следует
список  элементов,  определяющих что и как
должно  быть  выполнено.  Элементы  списка
должны  быть  разделены запятыми, точкой с
запятой  или апострофами. Запятая указыва-
ет,  что  надо сдвинуть курсор в следующую
половину  экрана  в той же самой строке, а
если это невозможно, то в начало следующей
строки.  Апостроф обозначает переход к но-
вой  строке, а точка с запятой не изменяет
положение  курсора.  Элементы списка, пре-
дусмотренные   к  отображению  на  экране,
должна быть константами, либо выражениями,
заключенными  в круглые скобки. Специфика-
ции  цветов  INK,  PAPER,  BRIGHT,  FLASH,
INVERSE  и  OVER  позволяют получить любые
цветовые эффекты. Переменные, значения ко-
торых  должны  быть  заданны с клавиатуры,
должны заноситься в список по одному между
разделителями.  Если мы хотим, чтобы прог-
рамма считала с клавиатуры элемент массива
A(I,J) и проинформировала пользователя че-
го  она  от него ожидает, то воспользуемся
инструкцией:

   INPUT     "ВВЕДИ    ЗНАЧЕНИЕ    ЭЛЕМЕН-
ТА";A(":I;",",";(J);")=;A(I,J)

   Инструкция INPUT ожидает ввода информа-
ции  и завершается только после ввода всех
переменных,  указанных  в  списке.  Каждое
значение  переменных  при вводе необходимо
завершать  нажатием  клавиши <ENTER>. Если
вводиться текстовая переменная, то клавиша
<ENTER>  вместо  ввода ее значения вызовет
дополнение  области  переменной пробелами.
Запросы  на числовые переменные нельзя иг-
норировать   этим  способом  и  необходимо
ввести  какое-либо  число, используя любые
выражения,   существующие   переменные   и
константы.  При считывании значений число-
вых  переменных внизу экрана мигает курсор
L  или C, но при вводе знаковой последова-
тельности курсор появится вместе с окружа-
ющими его кавычками. В случае необходимос-
ти  их  можно  удалить. Существует возмож-
ность  считывания текста без этих кавычек.
В этом случае текстовую переменную необхо-
димо  пометить  в списке с ключевым словом
LINE.  Одно  LINE будет относиться к одной
переменной. Недопустимо использование это-
го  слова  вместе с числовыми переменными.
Во  время исполнения инструкции INPUT, две
нижние строки экрана в случае необходимос-
ти  будут  передвигаться  вверх,  создавая
свободное место для вывода и ввода данных.
Область  эта может максимально расширяться
до 22 строк. Ввод данных базируется на ре-
дакторе.  Благодаря  этому  перед нажатием
<ENTER> возможны любые исправления введен-
ных  величин.  В  списке INPUT кроме этого
можно  размещать  TAB  n,  а также AT K,N.
Действие первого из них вызывает перемеще-
ние курсора до n-ой колонки в данной, либо
следующей  строке. В свою очередь, AT раз-
местит  курсор в положении (K,N), это зна-
чит в K-той строке и N-ой колонке. Некото-
рые  трудности может вызвать факт, что по-
ложение  начала координат - поля (0,0) из-
меняется вместе с расширением нижней части
экрана.   Поле   всегда   указывает  левый
верхний  угол  рабочей области редактора и
значение поля (K,N) определяется этим. По-
пытки заставить расширить эту область выше
22  строк кончаются сигналом ошибки 5. Пе-
ред этим компьютер может выражать свое не-
одобрение ворчанием.

   INVERSE   K  -  Очередной  определитель
цветности.  K  = 0 обозначает высвечивание
заданных цветов фона и чернил, а K = 1 ме-
няет их местами. Может применяться как са-
мостоятельно,  так  и  в списке инструкций
PRINT,INPUT,CIRCLE и т.д.

   LET  V = E -Присваивание значений пере-
менной.  Ее выполнение опирается на вычис-
ление выражения E и присвоения полученного
значения переменной V, если такая перемен-
ная уже существует. Если V еще нет, то она
организуется  в соответствующем поле памя-
ти.  Это  не относится к массивам, которые
обязательно  должны  быть  объявлены перед
использованием.

   LIST [K] - Выводит на экран текст прог-
раммы  на  языке  ZX-Бейсик с K-ой строки.
Если  K  опущен,  то  принимается значение
K=0.  Данная  команда устанавливает указа-
тель  текущей строки в K, делая ее доступ-
ной  для редактирования. Вывод всегда про-
изводится  до конца текста программы по 22
строки  (см.  PRINT).  Прервать  его можно
после появления в нижней части экрана воп-
роса:  SCROLL ? - нажатием одной из нижних
клавиш: BREAK, STOP или N.

   LLIST  [K] -Инструкция аналогична LIST,
но  печать  производится  на  подключенном
принтере. Когда принтера нет, LLIST только
устанавливает  указатель текущей строки на
строке  K. Во время печати программы оста-
навливается  таймер  (системные переменные
FRAMES не модифицируются).

   LOAD  ...  - SPECTRUM может считывать с
магнитофона  различные типы данных. LOAD F
вызывает считывание с кассеты программы на
языке  Бейсик, записанной на ленте как на-
бор  с названием F. Все другие наборы дан-
ных на кассете игнорируются. Вместо полно-
го  имени  отыскиваемого набора можно дать
пустую  цепочку  символов:  LOAD "". Тогда
будет считан первый найденный набор данных
на  языке  Бейсик независимо от его имени.
После отыскания на ленте необходимого бло-
ка, находящаяся в памяти программа и пере-
менные   удаляются  (модифицируются  соот-
ветствующие  системные  переменные  и лишь
незначительное  число  ячеек памяти меняет
свое  значение)  и  подготавливается место
для  новой  программы. Доступ  к удаленным
данным для системы невозможен.

   LOAD F DATE @[S][()] - Считывает число-
вой или текстовый массив и размещает его в
области  переменных  под  именем @, удаляя
перед этим массив с тем же названием и тем
же  типом  данных. @ должна иметь имя, под
которым  выступал  данный массив перед за-
писью  на кассету. Размерность массивов не
задается,   но   скобки  обязательны.  Как
текстовые  массивы можно считывать и запи-
сывать простые переменные этого типа.

   LOAD  F CODE [K[,N]] - Форма оператора,
позволяющая  считывать  наборы  байтов без
определения их структуры. Параметр K гово-
рит,  по какому адресу должен быть записан
в  память считываемый блок, а N определяет
его длину. Если эти параметры опустить, то
набор будет считан на то же самое место, с
которого   был   сброшен   на  ленту.  Эта
инструкция не проверяет, может ли считыва-
емый  блок  уничтожить жизненно важную для
системы информацию, и беззаботно заполняет
соответствующие  области  памяти новой ин-
формацией.  Задание  значения  параметра N
меньше,  чем  фактическая  длина набора на
ленте,  сигнализируется  сообщением  R,  а
следовательно, этой инструкцией нельзя чи-
тать  только  начальные  фрагменты  блоков
(разве  что выключая магнитофон в процессе
считывания).

   LOAD F SCREEN$ - Является особым случа-
ем  LOAD  F  CODE  и отвечает точно LOAD F
CODE  16384,6912  считывает экран вместе с
атрибутами.   После  считывания  данных  и
программ с кассеты возможны 2 рода ошибок.
Технические проблемы сигнализируются сооб-
щением  R.  При считывании слишком длинных
блоков (частный случай, когда RAMTOP уста-
новлен слишком низко) появляется сообщение
4.

   LPRINT...-   Инструкция   работает  как
PRINT,  но  данные  посылаются на принтер.
Когда принтера нет, инструкция игнорирует-
ся. Помещенные в список LPRINT определите-
ли  цветов PAPER, INC, FLASH, BRIGHT будут
игнорироваться.  Разделители,  а также TAB
действуют  обычным  способом.  В AT первый
параметр (номер строки) опускается. Печать
осуществляется  с помощью буфера длиной 32
знака (256 байт). Печать фактически насту-
пает  после наполнения буфера, команды пе-
рехода  к  новой  строке, а также в момент
обычного  завершения программы. После пре-
рывания программы в случае ошибки или вме-
шательства пользователя печать осуществля-
ется нажатием клавиши <ENTER>.

   MERGE  F - Считывание программы на Бей-
сике  с кассетной ленты и присоединение ее
к уже существующей в памяти. Строки, номе-
ра которых в обеих программах перекрывают-
ся,  заменяются новыми. Так же как и пере-
менные  с  одинаковыми именами. Оставшиеся
строки  и  переменные  заносятся  в  соот-
ветствующую  область памяти. Это позволяет
создавать  библиотеки подпрограмм для пос-
ледующего   их   использования.   Действие
инструкции основывается на считывании все-
го  блока в рабочую область и только после
этого старые и новые программы объединяют-
ся.  При  длинных  программах этот процесс
может  длится  несколько  минут. Директива
может  быть  применена даже когда в памяти
ничего  нет.  Отличается  от LOAD F значи-
тельно  долгим  временем выполнения и тем,
что  не  запускает программу даже если она
была  записана  SAVE  F  LINE K (что очень
ценно  для  пиратов!).  Вместо имени можно
использовать пустой текст.

   MOVE - Команда действует только при на-
личии ZX-ИНТЕРФЕЙСА-1.

   NEW  - Инструкция действует практически
как   отключение  питания.  Инициализирует
систему  Бейсик, сохраняя только системные
переменные  RAMTOP,  PRAM, RASP, PIP, UDG.
Память ниже RAMTOP очищена, а область выше
RAMTOP остается нетронутой.

   NEXT  @  -  Инструкция, замыкающая цикл
(FOR  ...).  После  встречи  с  NEXT @ ин-
терпретатор  отыскивает  управляющую пере-
менную @, увеличивает ее значение на вели-
чину шага и сравнивает с предельным значе-
нием.  Если оно еще не превзойдено, то уп-
равление  передается к инструкции, следую-
щей  за  соответствующим  FOR. В противном
случае,  выполнение  программы начнется со
следующей за NEXT @ команды. Если в облас-
ти  переменных  не найдется такая числовая
переменная @, то это сигнализируется сооб-
щением  2. Если же эта переменная не явля-
ется  управляющей - сообщением 1. Одновре-
менно  может быть организовано максимум 26
циклов.  Управляющие переменные могут быть
использованы  как  внутри цикла, так и вне
его как обычные числовые переменные. После
открытия  цикла  нельзя  модифицировать ни
предельного  значения,  ни  шага.  Не  су-
ществует  ограничения на взаимное располо-
жение  циклов. Например, конструкция, при-
веденная  ниже, недопустимая в других вер-
сиях Бейсика, будет восприниматься ZX-Бей-
сиком, как правильная конструкция:

     100 FOR I=1  TO 10
     200 FOR J=10 TO 20
     300 PRINT I,J
     400 NEXT I
     500 NEXT J

   OPEN #K - Спецификация канала директив,
позволяющая  подключить K-тый поток к ука-
занному  каналу  (см.главу "Каналы и пото-
ки").   "Голый"   SPECTRUM   (без  внешних
устройств,  а  конкретно  без ZX-ИНТЕРФЕЙ-
СА-1)     распознает     только     каналы
"S","K","P","s","k","p".  Нельзя использо-
вать  потоки 0...3, остальные 4...15 нахо-
дятся в распоряжении пользователя.

   OUT  M,N - М должно быть числом из диа-
пазона   0...65535,   N   -  из  диапазона
-255...255,  при  этом отрицательные числа
будут  автоматически  увеличиваться на 256
(следовательно  OUT  M,-3 это то же самое,
что OUT M,253). Эта инструкция позволяет с
уровня Бейсика посылать информацию в порты
вывода  процессора и может применяться для
работы   с   внешними   устройствами.  Эта
инструкция аналог команд Ассемблера:

     LD  A,N
     LD  BC,M
     OUT (C),A

   OVER K - Спецификатор способа наложения
точек  или  символов.  K=0 означает замену
существующей  точки  или знака на новый, а
K=1 вызывает наложение новых знаков на уже
существующие. В местах, где старый и новый
знак  или  точка  имеют одинаковые цвета -
остается цвет фона, там же, где цвета раз-
личные - появляется цвет чернил. Новый ри-
сунок  вызывает,  следовательно,  инверсию
предыдущего  цвета.  Это позволяет удалять
единичные  точки,  линии на экране и т.д..
Так  же  как для спецификаторов цветов об-
ласть  действия заданного режима рисования
может  быть  глобальной  во всей программе
или только на время действия одной пишущей
или рисующей инструкции.

   PAPER K - Спецификатор цвета фона. Зна-
чение K от 0 до 7 определяет номер выбран-
ного  цвета,  8  сигнализирует согласие на
цвет,  ранее заданный для данного поля эк-
рана,  9  задает  использование белого или
черного    цветов    в    зависимости   от
контрастности установленного в данном поле
цвета фона. В нижних строках экрана систе-
ма всегда использует PAPER 9. Эта инструк-
ция может применяться как самостоятельная,
так  и  в  списке инструкций PRINT, INPUT,
CIRCLE  и т.д.. Цвет фона может появляться
в двух разных оттенках (см.BRIGHT).

   PAUSE  K - Временная остановка програм-
мы.  Параметр K определяет задержку в 50-х
долях  секунды. Нажатие любой клавиши пре-
рывает  паузу  независимо  от  пройденного
времени.  Значение K=0 обозначает останов,
продолжающийся  до нажатия любой из клавиш
(см.главу  "Ошибки системы").

   PLOT [E,]K,M - Рисование единичной точ-
ки  с координатами 0<=ABS K <=255 и 0<=ABS
M  <=175 на экране. Начало координат поме-
щено  в левом нижнем углу, выше 2-х строк,
зарезервированных для системных сообщений.
Эта  директива не может применяться в двух
нижних операторах.

   POKE  K,N  -  Эта инструкция в ячейку с
адресом  0  <=  K <= 65535 загружает число
-255  <= M <= 255 (увеличенное на 256, для
M<0).

   PRINT...  -  Инструкция вывода на экран
последовательности  знаков  и чисел. PRINT
печатает  элементы своего списка в верхних
22  строках экрана. В списке можно размес-
тить  то  же самое, что и в списках INPUT.
Нет  необходимости  заключать  выражение в
скобки,  которые перед вызовом должны быть
рассчитаны.  Лучше  применять AT K,N, если
положение начала координат является посто-
янным  (левый верхний угол). Параметр 0 <=
K  <= 21 определяет строку, а 0 <= M <= 31
-  колонку. Превышение допустимых значений
параметров  сигнализируется  сообщением 5.
После  заполнения  22  строк экрана, перед
дальнейшим  выводом,  компьютер предлагает
продолжить   вывод  (SCROLL  ?).  Клавишей
<BREAK>,<STOP>  или <N> прерывает выполне-
ние  программы  с  сообщением D, остальные
выражают согласие на сдвиг экрана.

   RANDOMIZE [K] - В принципе эта процеду-
ра предназначена для инициализации генера-
тора псевдослучайных чисел (RND). Если па-
раметр  K задан и отличен от 0, то он раз-
мещается  в системной переменной SEED. Что
делается  там  с  ним,  было  описано выше
(функция RND). Пропуск параметра или зада-
ние  K  = 0 вызовет размещение SEED в двух
младших  байт системных переменных FRAMES.
Побочным  применением инструкции RANDOMIZE
может  быть назначение значения младшего и
старшего  байтов  данного  целого  числа K
размещенного    в   диапазоне   1...65535.
Меньший  байт обозначается как PEEK 23670,
а старший как PEEK 23671.

   READ  V1,  V2,...  - Эта команда задает
очередным  переменным  из  списка значений
соответствующих  выражений,  помещенных  в
списках  DATA.  Каждая  из инструкций READ
модифицирует соответствующую системную пе-
ременную DATADO, помнящую какое из выраже-
ний  списка  DATA  было считано последним.
Попытка  чтения  уже несуществующих данных
сигнализируется сообщением E.

   REM - Вставка комментариев. После слова
REM   можно  разместить  любую  последова-
тельность  знаков (за исключение символа с
кодом  13),  которая  при выполнении будет
игнорироваться.

   RESTORE [K] - Эта инструкция устанавли-
вает системный указатель на первое выраже-
ние в списке DATA в строке с номером K или
первым большем. Если K опущен, то по умол-
чанию  принимается значение 0. Перед новым
запуском  программы инструкцией GO TO обя-
зательно необходимо использовать директиву
RESTORE (если в этой программе есть опера-
торы READ).

   RETURN   - Возврат из подпрограммы.

   RUN  [K] - Запуск программы на Бейсике.
Выполнение  программы начинается со строки
K  или,  если K опущен с начала программы.
Перед запуском программы RUN автоматически
выполняет команду CLEAR, что соответствует
уничтожению всех переменных.

   SAVE ... - Инструкция, обратная LOAD. С
ее помощью на кассету записывают программу
на Бейсике, числовые или знаковые массивы,
а   также  последовательности  байтов  для
уточнения  их структуры. Форма команды та-
кая  же,  как  у  LOAD с той разницей, что
нельзя  опускать ни одного параметра. Имя,
под  которым данный блок должен быть запи-
сан  на ленту, должно быть непустой после-
довательностью знаков длиной, не превышаю-
щей  10.  При  записи программы на Бейсике
после  имени можно поместить LINE K. Запи-
санная таким образом программа, после счи-
тывания будет автоматически запускаться со
строки с номером K.

   STOP - Останов программы. Программа мо-
жет   быть   продолжена  нажатием  клавиши
<CONTINUE>.

   VERIFY  ...  - Форма представления этой
инструкции  аналогична инструкции LOAD ...
. Однако ничего в компьютере не считывает-
ся, а только проверяется, совпадает ли со-
держимое соответствующих областей памяти с
тем, что записано на кассете. Все выявлен-
ные несоответствия сигнализируются сообще-
нием R.


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

   Среди    символов,    используемых    в
ZX-SPECTRUM, есть так называемые управляю-
щие  символы.  Они  имеют  коды  меньше 32
(причем  не все коды используются). Приме-
нение  их на уровне ZX-Бейсика ограничено,
так как те же самые эффекты можно получить
с  помощью  других инструкций. Однако, они
незаменимы для программирования в машинных
кодах.  Ниже приведены те из них, ввод ко-
торых дает какой-либо эффект:

   CHR$  6  -  Этот символ может использо-
ваться   вместо  запятой  как  разделитель
списков INPUT и PRINT.
   CHR$ 8 - Вызывает сдвиг курсора на одно
поле влево. CHR$ 9 - Смотрите главу "Ошиб-
ки системы".
   CHR$  15- Это символ клавиши <ENTER>. В
списках  INPUT  и  PRINT может применяться
вместо  единичного апострофа. В программах
ZX-Бейсика  он  помещается  в конце каждой
строки.
   CHR$ 16- Ключевое слово INK.
   CHR$ 17- Ключевое слово PAPER.
   CHR$ 18- Ключевое слово FLASH.
   CHR$ 19- Ключевое слово BRIGHT.
   CHR$ 20- Ключевое слово INVERSE.
   CHR$ 21- Ключевое слово OVER.
   CHR$ 22- Ключевое слово AT.
   CHR$ 23- Ключевое слово TAB.

   Символы  от  CHR$  16 до CHR$ 21 должны
набираться  в  форме  CHR$  K + CHR$ M или
CHR$  K; CHR$ M, где M есть значение соот-
ветствующего данной инструкции параметра.

   После символов CHR$ 22 и CHR$ 23 должны
следовать 2 параметра. Для AT это понятно,
а  для TAB единственный аргумент представ-
ляется двумя байтами. На практике значение
второго  байта  (старшего) не имеет значе-
ния,  так  как это число берется по модулю
32.

   Оставшиеся   управляющие   символы  ис-
пользуются  редактором в процессе считыва-
ния  клавиатуры  и  не имеет практического
значения для программистов. Во время выво-
да  последовательности  знаков, символы не
описанные выше, с кодами меньше 32 заменя-
ются вопростительным знаком.


   3.8 Системные сообщения.

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

       НОМЕР  ТЕКСТ СООБЩЕНИЯ  K:M

Номер  - это цифра от 0 до 9 или литера от
A до R. Текст сообщает по-английски причи-
ну  передачи  управления в редактор. Числа
K:M   информируют  в  какой  строке  какой
инструкцией  вызвано данное сообщение. K =
0  относится, обычно, к командам, задавае-
мым непосредственно с клавиатуры.


                   0 OK

   Нормальное  завершение команд, выданных
с  клавиатуры, конец программы, либо пере-
ход с помощью GO TO на строку с наибольшим
номером.  При  обслуживании такой "ошибки"
не   модифицируются  системные  переменные
OLDPPC  и OSPPC, в результате чего команда
CONTINUE,  выданная после такого сообщения
заново    вызовет   выполнение   последней
инструкции в программе (это не относится к
директивам с клавиатуры).

            1 NEXT without FOR

   Интерпретатор  встретил инструкцию NEXT
@.  В  области  переменных нет управляющей
переменной  с  данном  именем  @,  но есть
простая  числовая переменная @. Если бы не
было  и  такой,  то в аналогичной ситуации
было  бы  выведено  сообщение  2. Наиболее
частой причиной ошибок является отсутствие
соответствующей инструкции FOR или переход
внутрь цикла.


           2 Variable not found

   Попытка  использования  переменной,  не
существующей  в области переменных, а сле-
довательно  такой,  которой еще не придано
никакого      значения      с      помощью
LET,READ,INPUT,FOR или DIM.


            3 Subscript wrong

   Индексы  массивов  вышли  за предельное
значение   (но   поместились   в  диапазон
0...65535),  или  задано  их  неправильное
число, а также попытка присвоения символов
простой  алфавитно-числовой  переменной, с
размерностью больше, чем длина переменной.
Если индексы превзойдут значения 65535, то
в  аналогичной ситуации появится сообщение
B.


             4 Out of memory

   Не  хватает места в памяти для выполне-
ния требуемой акции. Чаще всего бывает при
выполнении  инструкций  LET,  READ, INPUT,
DIM, GOSUB, LOAD, MERGE, попытки рекурсив-
ного обращения к функции. Вообще, причиной
является  слишком низкое положение RAMTOP.
Для  вывода  из  аварийной  ситуации может
оказаться  необходимым удаление какой-либо
строки  из  программы, так, чтобы получить
место,  необходимое  для выполнения дирек-
тив, задаваемых с клавиатуры.


             5 Out of screen

   INPUT  пытается  занять  более 22 строк
или  параметры  AT  указывают  поле  за 22
верхними строками экрана.


             6 Nomber too big

   Во время проводимых вычислений была по-
пытка выйти за 1.7E38. Этим сообщением за-
вершаются  попытки деления на ноль или вы-
числения TAN (PI/2).


          7 RETURN without GOSUB

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

              8 End of file

   Это сообщение может появиться при нали-
чии ZX-ИНТЕФЕЙСА-1.


             9 STOP statement

   Выполнена инструкция STOP.


            A Invalid argument

   Задан   неверный  аргумент  стандартной
функции,  к примеру, попытка вычислить SQR
или LN для отрицательного числа, или алфа-
витно-цифровой аргумент функции USR не яв-
ляется одной верной литерой. Эта ошибка не
относится к аргументам функций, определен-
ных программистом.


          B Integer out of range

   Целочисленный  параметр инструкции пре-
высил предельное значение.


            C Nonsens in BASIC

   Анализируемый текст некорректен с точки
зрения  правил языка. Чаще всего появляет-
ся,  когда  аргументы функции VAL или VAL$
не  представляют  верной  формы выражения.
Это  сообщение  появится также при попытке
выполнения команд нераспознанных системой,
например,  считана  и  запущена программа,
работающая  с  MICRODRIVE, а ZX-ИНТЕФЕЙС-1
не подключен.


           D BREAK-CONT repeats

   Работа  программы прервана во время вы-
полнения  инструкций, связанных с внешними
устройствами  (принтер, магнитофон или те-
левизор  -  после  вопроса SCROLL ? нажата
<BREAK>, <STOP> или <N>). Введенная с кла-
виатуры  директива  CONTINUE  повторит еще
раз прерванную команду.


              E Out of DATA

   Попытка  читать  данные из списка DATA,
если он исчерпан.


           F Invalid file name

   Попытка  записать  на кассету набор без
имени или с именем длинее 10 символов.

            G No room for line

   Нехватка  места  в памяти для очередной
сборки программы, если она слишком длинная
или слишком низко установлен RAMTOP.

             H Stop in INPUT

   Программа была остановлена во время вы-
полнения инструкции INPUT.

            I FOR without NEXT

   Инициализированный  цикл  не может быть
выполнен ни разу (например, FOR I=1 TO 0),
а в программе нет инструкции NEXT.

           J Invalid I/O device

   Ошибка  возможна при подключении ZX-ИН-
ТЕРФЕЙСА-1.

             K Invalid colour

   Аргумент инструкции INK, PAPER, BORDER,
BRIGHT,  FLASH,  OVER или INVERSE вышел за
пределы,  определенной для данной инструк-
ции.  Это  сообщение также может появиться
после  ввода символа, управляющего цветом,
если следующий вводимый символ имеет несо-
ответствие  с введенным управляющим симво-
лом.

           L BREAK into program

   Прерывание выполнения программы пользо-
вателем.


             M RAMTOP no good

   Попытка присвоения системной переменной
RAMTOP  слишком  малой или слишком большой
величины.


             N Statement lost

   Попытка  выполнения  с  помощью RETURN,
NEXT  или CONTINUE перехода к несуществую-
щей инструкции.


             O Invalid stream

   Попытка пересылки информации потоком до
подключения к какому-нибудь каналу или ка-
налу с номером больше 15.


             P FN without DEF

   Вызвана инструкция, которая не была оп-
ределена.


             Q Parametr error

   Рассогласованность количества или типов
аргументов  при вызове функций, определен-
ных пользователем.

           R Tape loading error

   Требуемый  набор был найден на кассете,
но  по какой-то причине не может быть счи-
тан в компьютер.



Другие статьи номера:

Введение - Об управлении интерфейсом газеты.

Ассемблер - одна интересная штучка с ассемблером.

Крышу снесло - DI:HALT не всегда вызывает зависание...Santa Claus.

Начнем развлекаться - Основные события 1996 года. Словарь программиста.

Собственное мнение - IMP рассказывает о развитие российской ZX-демосцены.

Чего слышно за бугром - Что сейчас делают всем известные Западные производители ПО на Спекки?..

Час оттяга - Записки Терминатора Т-1000.

Мелкие новости - Что происходит со Спекки в Белоруссии?..

Анкета - Анкетирование продолжается...

Фантастика - Фантастическая повесть "Лед и пламя" (продолжение).

Прикольчик - Прикольчик'с Новополоцка?. Какие же письма поступают к нам в лабораторию.

Описание - Описание-проходилка игры BLINKY'S SCARRY SCHOOL.

Презентация - REALSOFT представляет стратегическую игру Technodrom.

Оттяг - Оттягиваться можно по разному. Задачник - "задачки" математические.

Программистам - О дополнительных функциях TR-DOS 5.04.

Программистам - О формате музыкальных модулей Sound Tracker Pro и исходник проигрывателя.

HARDWARE - Переключатель режимов работы Profi/Pentagon.

Маленькие хитрости-2 - Как перекинуть целый экран в один INT.

Маленькие хитрости-2 - О корректной обработке Retry/Abort/Ignore в TR-DOS.

Интересное письмо - Письма читателей, содержащие разные вещи: - Если вы записали дискеты на глючном дисководе;

Презентация-2 - Описание программы TEXT PRINT v1.2.

Юмор - Рассказ про Штирлица.

Юмор - Штирлиц: Слоны идут на север.

Книга - Тайники ZX-Spectrum: оглавление.

Книга - Тайники ZX-Spectrum: Клавиатура.

Книга - Тайники ZX-Spectrum: Редактор.

Книга - Тайники ZX-Spectrum: ZX-Бейсик.

Книга - Тайники ZX-Spectrum: Компьютерная арифметика.

Книга - Тайники ZX-Spectrum: Использование Памяти.

Книга - Тайники ZX-Spectrum: Системные переменные Бейсика.

Книга - Тайники ZX-Spectrum: Каналы и Потоки.

Книга - Тайники ZX-Spectrum: Системные Процедуры.

Книга - Тайники ZX-Spectrum: Ошибки в Системе.

Реклама - Реклама и объявления ...

Послесловие - О том, что не вошло в этот номер.


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

Похожие статьи:
Код - 3D скролл на ZX Spectrum (часть 1).
Презентация - Авторские программы: ISLAND OF DARKNESS
Сенсации - Компания ZILOG сдержала обещание выпустить усовершенствованную версию знаменитого процессора Z80.
Подарок - О приложении к журналу.
Юмор из сети - Юмор.

В этот день...   19 апреля