Настройка клавиатуры
Меняя значения системных переменных REPDEL (адрес 23561)
и REPPER (23562), можно по своему вкусу настроить клавиатуру
компьютера. В переменной REPDEL хранится число, определяю-
щее величину задержки (в 1/50 сек) между нажатием клавиши и
началом автоматического повторения нажатия (автоповтора).
REPPER задает период автоповтора (также в 1/50 сек).
При желании можно изменить длительность звучания сигнала,
возникающего при нажатии клавиш. Число, пропорциональное
времени его звучания, содержится в системной переменной PIP
(23609).
Звуковой сигнал возникает и при переполнении буфера редак-
тора и некоторых других ошибках. Длительность сигнала регули-
руется значением системной переменной RASP (23608).
Полезная информация о памяти
Например, нас может заинтересовать длина написанной бей-
сик-программы. Выберем из системных переменных PROG
(23635/36) и VARS (23627/28) адреса начала бейсик-программы
и начала области бейсик-переменных и вычтем одно из другого:
print (реек 23635+256*реек 23636)-(реек 23627+256*реек 23628)
Под системные переменные, хранящие значения адресов, отво-
дятся по две ячейки памяти, поскольку в одну ячейку можно
записать число не более 255. Для записи числа до 65535 (мак-
симальный адрес памяти ZX Spectrum) его разбивают на два чис-
ла. Сначала делят на 255, после чего остаток от деления заносят в
первую ячейку (младший байт), а целую часть — во вторую (стар-
ший байт). Например, число 64768 разобьется на два байта так:
let l=64768-256*int(64768/256): rem АЛладший байт
let h=int(64768/256): rem Старший байт
Умение записывать значения адресов в системные переменные
может пригодиться, например, при оперировании с символами,
определяемыми пользователем (см. стр. 56).'Адрес начала области
памяти, в которой размещается информация об этих символах,
хранится в системной переменной UDG (адреса 23675/76). Изме-
няя ее .содержимое, можно определить несколько наборов символов
и по необходимости в программе переходить с одного на другой.
Аналогично можно переключать и основной набор символов.
Стандартный набор символов ZX Spectrum «зашит» в постоянном
запоминающем устройстве (ПЗУ), начиная с адреса 15616. Под
хранение этого адреса выделена системная переменная CHARS
(адреса 23606/07). Зная это, мы можем создать в памяти (или
загрузить с магнитофона как кодовый блок) новый набор симво-
лов и, переписав значение CHARS, переключить на него работу
компьютера. Как создавать символы, мы описывали в разделе,
посвященном псевдографике. Переопределяя адрес начала теку-
щего набора символов, необходимо помнить, что первые 32 кода
(от 0 до 31) являются управляющими и им не соответствуют
никакие символы. Поэтому адрес начала размещения символов
больше числа, записанного в CHARS, на 256 (32x8)*. Следователь-
но, загрузив новый набор символов цо адресу 64768, для подклю-
чения его в CHARS нужно записать число 64512 (64768-256)**.
Мы рассказали далеко не о всех системных переменных. Мно-
гим из неупомянутых трудно придумать какое-либо практическое
применение в бейсик-программах. Для понимания назначения
других недостаточно знаний, которые можно почерпнуть из этой
книги. Полный список- системных переменных и их описание
можно найти в [1].
сжатие бейсик-программ
Существенный недостаток ZX Spectrum — относительно малый
объем свободной памяти (около 40 килобайт). А тут еще интерпре-
татор Бейсика «транжирит» память: под запись любого числа ин-
терпретатор отводит 6 ячеек памяти независимо от размера числа.
Под каждый символ отводится 8 ячеек памяти.
** Более подробно о подключении альтернативных шрифтов см. [1].
Даже если это просто единица или ноль. Вот и приходится про-
граммистам, работающим на Бейсике, изощряться, чтобы втис-
нуться в узкие рамки памяти Speccy.
Прежде всего надо расширить область памяти, отведенную для
работы бейсик-программы. Границы, в которых может размещать-
ся программа с переменными, определяются компьютером, но мо-
гут быть изменены. Старший адрес памяти, разрешенный к ис-
пользованию интерпретатором Бейсика, хранится в системной пе-
ременной RAMTOP (23730/31). Стандартно он равен 65367. Но
если программа не вмещается, его можно увеличить до предела —
до 65535*. Для этого нет необходимости записывать новое значе-
ние RAMTOP с помощью РОКЕ. Изменить RAMTOP можно с по-
мощью специально предназначенного для этого оператора CLEAR с
параметром 65535. Правда, CLEAR к тому же очистит все перемен-
ные, массивы, выполнит операторы CLS и RESTORE, вообще подгото-
вит программу к новому пуску.
Если и после перемещения RAMTOP не хватает памяти, при-
дется применять более изощренные методы.
Приведем несколько самых распространенных способов ,сжатия
бейсик-программ. Хотя в этой области нет предела для фантазии.
Во-первых, надо свести к минимуму длину имен всех числовых
переменных. Если их меньше, чем букв в алфавите, то все сделать
однобуквенными.
Памятуя, что числовые константы занимают много места, не
помешает самые часто используемые из них заменить на перемен-
ные. Надо только единожды в начале программы присвоить им
требуемые значения.
Целые числовые константы выгоднее записывать как символь-
ные и помещать их «под» функцию VAL. К примеру, операторы
LET а=5 и LET a=VAL "5" тождественны, однако второй оператор
занимает в памяти на две ячейки меньше (но, следует учесть,
работает медленнее).
Для сокращения объема памяти, занимаемого программой, бы-
вает полезно вместо числовых массивов использовать символьные.
Ведь под каждый элемент числового массива, независимо от того,
что в нем хранится, отводится по пять ячеек памяти, в то время, как
под элемент символьного массива отводится лишь одна ячейка.
Преобразовать же символьную константу в число можно с по-
мощью той же VAL.
И, напоследок, парочку «хитростей». Например, вместо нуля,
который, как и любое число, занимает в памяти 5 байт, можно
записать просто BIN, либо NOT PI. Число «пи» отлично от нуля, и это
главное, а логический оператор NOT, по определению, превращает
его в ноль. Внешне получилось длиннее и мудреней, но в памяти,
тем не менее, такая запись займет лишь две ячейки. Вывернув-
шись, можно «смоделировать» и единицу. Например, записав
NOT BIN либо SNG PI.
При этом, правда, затирается область символов, определяемых пользователем.
защита бейсик-программ
Вообще говоря, коммерческие программы, которые требуют за-
щиты, обычно пишутся не на Бейсике. Но ради интереса немного
поговорим и на эту тему.
Простую (не защищенную) программу в любой момент можно
запустить, остановить, просмотреть, внести изменения — в общем,
сделать с ней все, что душе угодно.
Защита программы может происходить на трех этапах. Во-пер-
вых, делают так, чтобы ее невозможно было загрузить в память
компьютера без специального загрузчика. Во-вторых, чтобы ее
нельзя было нормальным образом остановить (по Break). И, в-
третьих, если уж ее остановили, то нельзя было бы ее просмотреть
с помощью LIST.
От просмотра программы можно защититься, расставив в ее
тексте коды управления цветом, окрашивающие листинг в одина-
ковый цвет тона и фона. Например, если после написания про-
граммы вызвать на редакцию ее первую строку и нажать комбина-
цию клавиш CS/SS+CS/7 (белый цвет тона), то строка «пропадет».
После ввода этой строки (Enter) бесцветным станет и весь текст
программы.
Против принудительного останова программы при нажатии кла-
виши Break (CS/Space) можно использовать ненормальную реакцию
интерпретатора Бейсика на отсутствие служебного экрана. Надо
только в системную переменную DF_SZ записать нулевое значе-
ние:
РОКЕ 23659,0
После нажатия Break компьютер должен отреагировать на него
выводом сообщения BREAK - CONT repeats на служебный экран. Но
не тут-то было. Дальше может быть все что угодно, но только не
просмотр листинга.
Информации, приведенной в данной главе, явно недостаточно
для обсуждения более изощренных способов защиты бейсик-про-
грамм и, тем более, способов ее «взламывания». Но мы надеемся
еще вернуться к этому разговору в другой книге.
справочник по spectrum-бейюику
В этом разделе в сжатой и более строгой форме повторено все, что
говорилось о Spectrum-Бейсике в первой главе. «Справочник»
предназначен для тех, кто постоянно работает с Бейсиком.
Ключевые слова размещаются в алфавитном порядке, для каждого
приведены: формат, класс, последовательность набора на клавиа-
туре, ссылка на страницу основного текста, краткое описание и
пример использования. Результаты выполнения примеров, выво-
димые на экран, выделены более жирным шрифтом. Примеры,
набираемые в непосредственном режиме (бе** номера строки), за-
пускаются нажатием клавиши Enter, программы — выполнением
оператора RUN. В примерах RUN и Enter опущены.
После описания ключевых слов приведены: «Тематический указа-
тель», в котором операторы и функции объединены по сферам их
применения, перечень сообщений об ошибках, таблица символов
ZX Spectrum и таблица контрольных кодов.
При описании ключевых слов используются обозначения, пере-
численные в начале книги, а также:
|£] - расширенный режим клавиатуры (включается
одновременным нажатием клавиш CS и SS).
Классы ключевых слов
По классу ключевые слова подразделяются на операторы, функ-
ции и логические операторы:
• операторы предписывают компьютеру выполнение определен-
ной последовательности действий, не связанных с преобразо-
ванием числовых и символьных значений; формируют про-
граммные строки;
• функции создают или преобразуют числовые и символьные
значения; исходное значение называется аргументом, конеч-
ное — результатом; используются только совместно с операто-
рами;
• логические операторы задают действия над условиями.
Терминология
При описании формата операторов и функций применяются сле-
дующие понятия:
• числовая константа — число в интервале от 2,8*10"39 до
1,7*1038; точность представления — 8 десятичных знаков;
• числовая переменная — имя переменной, хранящей числовую
константу, начинается с буквы и может состоять из произволь-
ного количества символов, пробелы игнорируются, заглавные
и строчные буквы не различаются;
• числовое выражение — допустимая интерпретатором комби-
нация констант, переменных, функций, объединенных знака-
ми математических операций, в результате вычисления кото-
рой получается числовая константа;
• числовое значение — числовая константа, числовая перемен-
ная, числовое выражение;
• целочисленное значение — числовая константа, переменная,
выражение, округляющиеся до ближайшего целого;
• символьная константа — последовательность символов, заклю-
ченная в кавычки (строка символов);
• символьная переменная — имя переменной, хранящей сим-
вольную константу; составляется из двух символов: буквы и
знака $; заглавные и строчные буквы не различаются;
• символьное выражение — допустимая комбинация констант,
переменных, функций, объединенных математическими опе-
рациями, в результате вычисления которой получается сим-
вольная константа;
• символьное значение — символьная константа, символьная
переменная, символьное выражение.
Формат
Формат отражает, какие ключевые слова и значения и в какой
последовательности необходимо использовать для составления опе-
раторов и функций. При записи формата приняты следующие
обозначения:
<z> — числовое значение;
<с> - целочисленное значение;
<string > — символьное значение;
<var> - числовая или символьная переменная;
< условие> — допустимая комбинация числовых и символьных
значений, объединенных знаками сравнения и
логическими операторами;
< оператор > - допустимый в данном контексте бейсик-оператор;
<addr> - значение адреса ячейки памяти (0...65535);
<п> - номер строки программы (0...9999);
<row> - номер строки экрана (0...21),
отсчитывается от верхнего края экрана;
<col> - номер столбца экрана (0...31),
отсчитывается от левого края экрана;
<х> — горизонтальная координата точки (0... 175),
отсчитывается от нижнего края основного экрана;
<у> — вертикальная координата точки (0...255),
отсчитывается от левого края экрана;
<q> - угол, заданный в радианах;
<color> — код цвета.
Коды цветов
0 - черный
1 - синий
2 - красный
3 — фиолетовый
4 — зеленый
5 - голубой
6 — желтый
7 - белый
8 - режим прозрачности*
9 - режим черно-белого
контраста**
Знаки математических операций
+ |
сложение |
= |
равно |
— |
вычитание |
О |
не равно |
* |
умножение |
< |
меньше |
/ |
деление |
> |
больше |
т |
возведение в степень |
< = |
меньше или равно |
0 |
скобки |
> = |
больше или равно |
Порядок выполнения операций при расчете выражений
1. выделение подстроки (сечение)
2. функции
3. возведение в степень
4. минус перед числом (отрицательное число)
5. умножение и деление
6. сложение и вычитание
7. сравнение (=, >, <, <=, >=, О)
8. NOT
9. AND
10. OR
Первыми рассчитываются части выражения, заключенные в
скобки.
* Не используется в операторе BORDER.
** Только в операторах INK и 0APER.
ABS <z> __№JG
функция стр. 1 6
модуль числового значения <z>.
Пример: PRINT ABS -3
3
ACS <z> [Ejss/w
функция стр. 15
арккосинус, значение аргумента <z> должно находиться в интерва-
ле от -1 до 1.
Пример*: PRINT 180/PI*ACS 0.5
AND __ss/y
логический оператор, функция стр. 35
Логический оператор
реализует логическое умножение. Комбинация условий, объеди-
ненных AND, истинна, если истинно каждое из условий.
Пример: LET Х=10: IF Х>5 AND Х<15 THEN PRINT "YES"
YES
Функция
• возвращает значение, стоящее перед ключевым словом, если
аргумент не равен нулю;
• возвращает ноль или «пустую строку» (в зависимости от того,
числовое или символьное значение стоит перед ключевым
словом), если аргумент равен нулю.
Пример: PRINT "A" AND 1
А
PRINT 3 AND 0
t
ASN <z> [e]ss/q
функция стр. 15
арксинус, значение аргумента <z> должно находиться в интервале
от -1 до 1.
Пример: PRINT 180/PI*ASN 0.5
Умножением на 180/PI радианы переводятся в градусы.
AT <row>f К col У___ss/1
оператор стр. 14
задает знакоместо для вывода данных в операторах PRINT и INPUT.
Параметр <row> (0...21) определяет номер строки, <col> (0...31) —
номер столбца. Данные отделяются от AT знаками-разделителями
(запятая, точка с запятой, апостроф).
Пример: PRINT "AAA"; AT 10f15; "QQQ"
ATN <»> [ejss/e
функция стр. 15
арктангенс числового значения <z>.
Пример: PRINT 180/PI*ATN 1
ATTR (<row>, <col>)_[El SS/L
функция стр. 55
возвращает значение, соответствующее атрибутам знакоместа.
Позиция знакоместа задается двумя целочисленными значениями,
записанными через запятую и заключенными в скобки: <row> —
номер строки (0...23), <col> — номер столбца (0...31). ATTR возвра-
щает число от 0 до 255, рассчитанное по следующей формуле:
lx<INK>+8x<PAPER>+64x<BRIGHT>+128x<FLASH>,
где <INK>, <PAPER>, <BRIGHT> и <FLASH> — значения атрибутов*.
Пример: Если символ в знакоместе с <row>=l 1, <col>=16 напеча-
тан синим (код 1) на желтом (6) с повышенной ярко-
стью без мерцания, то функция ATTR (11, 16) вернет чис-
ло 1+6x8+64+0=112
ВЕЕР <t>f <h> [е]ss/z
оператор стр. 40
генерирует звук заданной длительности и высоты. Параметр <♦>
задает длительность звучания в секундах, <h> — высоту в полуто-
нах: 0 соответствует ноте ДО первой октавы, диапазон изменения
от -60 до 69. При большой длительности звучания допустимый
диапазон высот уменьшается.
Пример: ВЕЕР 0.5( 1: REM Нота ДО# первой октавы
в течение 0,5 секунды
По сути, ATTR возвращает байт, в котором три младших разряда (0...2) определя-
ют код цвета тона, следующие три (3...5) — цвета фона, два остальных (6 и 7),
соответственно, — BRIGHT и FLASH. Число (0...255), возвращаемое функцией,
получается при переводе значения байта из двоичного представления в десяти-
чное: 2° х <|NK> + 23 * <PAPER> + * <BRIGHT> + 27*<FLA$H>.
BIN <b>__И»
функция стр. 53
переводит шестнадцатиразрядное двоичное число <Ь> в десятичное
(нули в левой части числа можно опускать).
Пример: PRINT BIN 11111110
254
BORDER <color>_ __^^^^_в
оператор стр. 22
задает цвет поля вокруг рабочей области экрана и цвет фона слу-
жебного экрана. Цвет определяется параметром < color >.
' В отличие от операторов INK и PAPER, оператор BORDER не может
быть использован в операторе PRINT.
BRIGHT <р>_[е] ss/b
оператор стр. 22
устанавливает яркостный режим отображения информации. Пара-
метр <р> может принимать одно из целочисленных значений:
1 - включает режим повышенной яркости отображения инфор-
мации;
8 - задает режим прозрачности, при котором яркость отображе-
ния информации будет повторять яркость, ранее установлен-
ную для. данного знакоместа, то есть при печати новых симво-
лов яркие знакоместа будут оставаться яркими, а нормальные
— нормальными;
О — отменяет режимы повышенной яркости и прозрачности.
Режим яркости устанавливается целиком для знакоместа и одно-
временно для цвета тона и цвета фона.
В качестве самостоятельного оператора BRIGHT устанавливает тот
или иной режим яркости для всех последующих выводов на экран
(постоянный атрибут).
BRIGHT может также использоваться в операторах PRINT, INPUT, PLOT,
DRAW, CIRCLE, устанавливая режим яркости отображения инфор-
мации, выводимой только данным оператором (временный атри-
бут) . В операторах PRINT и INPUT ключевое слово BRIGHT размещается
в любом месте блока данных, отделяясь от них знаками-разделите-
лями (запятая, точка с запятой, апостроф).
BRIGHT в операторах PLOT, DRAW, CIRCLE ставится сразу за ключе-
вым словом и отделяется от параметров точкой с запятой.
Пример: PRINT "AAA", BRIGHT 1; "AAA"; BRIGHT 0; "AAA"
AAAAAAAAA
CAT_
ключевое слово в Spectrum-Бейсике не задействовано.
CHR$ <к>__1Е]ХЗ
функция стр. 18
возвращает символ по указанному в аргументе коду <k> (0...255).
Соответствие символов кодам приведено в табл. 1 на стр. 100.
Коды от 0 до 32 являются управляющими и не имеют символьного
представления. Функция CHR$ с этими кодами в качестве аргумента
влияет на вывод информации на экран и принтер (см. табл. 2 на
стр. 101).
Пример: PRINT CHR$ 65
А
CIRCLE <х>, <у>, <г> _гоss/h
оператор стр. 20
строит на экране окружность. Параметры окружности задаются в
пикселях тремя целочисленными значениями: <х> (0...175) и <у>
(0...255) — вертикальная и горизонтальная координаты центра
окружности, <г> — радиус.
Цвет окружности соответствует текущим постоянным значениям
атрибутов либо задается операторами INK, PAPER и другими, постав-
ленными непосредственно за ключевым словом CIRCLE и отделен-
ными друг от друга и от параметров точкой с запятой.
Пример: CIRCLE INK 3; 128, 88f 87
CLEAR [ <addr>]_X
оператор стр. 65
обнуляет значения всех переменных, выполняет операторы CLS и
RESTORE, сбрасывает позицию PLOT и очищает стек GO SUB.
CLEAR с параметром, кроме того, заносит значение <addr> в систем-
ную переменную RAMTOP (см. стр.65).
CLOSE #<о_
оператор используется при работе с потоками и каналами (см. [1]).
CLS_v
оператор стр. 21
очищает основной экран и окрашивает его в текущий постоянный
цвет фона.
COPE < string > Iе!1
функция стр. 18
возвращает код первого символа символьного значения < string > в
соответствии с таблицей символов ZX Spectrum (см. табл. 1 на
стр. 100). Если аргумент равен «пустой строке», функция возвра-
щает 0.
Пример: PRINT CODE "ABC"
65
CONTINUE_£
оператор стр. 33
продолжает выполнение программы с оператора, на котором оно
было прервано.
COPY_.__*
оператор стр. 51
распечатывает копию экрана на принтере.
COS <q>_IE]W
функция стр. 15
вычисляет косинус угла <q>, заданного в радианах.
DATA < данные>f ... tEl р
оператор стр. 43
задает список данных — произвольный набор числовых и символь-
ных значений. Элементы данных размещаются непосредственно
за ключевым словом и отделяются друг от друга запятыми. Опера-
тор DATA можно помещать в любом месте программы. Список
данных может быть распределен между несколькими операторами
DATA.
Считывание данных (занесение данных в переменные) произво-
дится оператором READ. Переменные, используемые в качестве
элементов данных, к моменту считывания должны быть определе-
ны. Последовательность считывания данных изменяется с по
мощью оператора RESTORE.
Пример: 10 LET D1=31: LET D2=28
20 FOR N=1 TO 2
30 READ X,A$
40 PRINT A$;" ";X;" DAYS"
50 NEXT N
60 DATA DI/'JAN'^/'FEB"
JAN 31 DAYS FEB 28 DAYS
Ключевое слово DATA может быть использовано также в комбина-
ции с LOAD, SAVE, и VERIFY (см. LOAD...DATA, SAVE...DATA и
VERIFY...DATA).
PEF FN_ [E] ss/i
оператор
определяет пользовательские функции (дополнительно к «встроен-
ным» в Бейсик). Для задания числовой функции после DEF FN
ставится буква (имя функции), за ней в скобках одна или несколько
отделенных друг от друга запятыми однобуквенных переменных
(параметры функции) и следом через знак равенства — числовое
выражение, задающее саму функцию.
Пример: 100 DEF FN r(x,y)=x+y
Оператор DEF FN помещается в любое место программы.
Вызов пользовательской функции осуществляется ключевым сло-
вом FN. Вслед за ним указывается имя функции и в скобках через
запятую — значения параметров в порядке, соответствующем их
следованию в определении функции.
Пример: PRINT FN R(3f4)
7
В этом примере параметру X присваивается значение 3, a Y —
значение 4.
При расчете пользовательской функции переменные, совпадаю-
щие по имени с параметрами функции, не изменяются.
В выражении, задающем функцию, могут использоваться и не
указанные в скобках переменные. При вызове функции они при-
нимают значения, заданные в программе.
Символьная функция определяется аналогично числовой, только в
качестве ее имени используется буква со знаком $.
Пример: 150 DEF FN A$(C$,i,j)=C$(i ТО j)
200 PRINT FN A$ ("Speccy",2,4)
pec
DIM_
оператор
задает массив и его размерность.
Числовые массивы
d
стр. 41
При задании числового массива вслед за DIM ставится однобуквен-
ное имя массива и в скобках через запятые одно или несколько (в
зависимости от размерности массива) целочисленных значений,
задающих количество элементов массива по каждому измерению.
Пример: 10 DIM Y(5)
20 DIM Z(10,3)
В первой строке примера задается одномерный числовой массив,
состоящий из 5 элементов (индексированных переменных)
y(1)...y(5). Во второй — двумерный массив из 30 элементов
z(1,1 )...z(10,3).
После задания массива его элементам присваивается нулевое зна-
чение.
Число измерений массива не может превышать 255.
Параллельно с числовыми массивами в программе могут использо-
ваться неиндексированные числовые переменные с тем же именем.