Глава 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 Требуемый набор был найден на кассете, но по какой-то причине не может быть счи- тан в компьютер.