Программирование на Бейсик 48/128 для ZX-Spectrum 1993 г.

SPECTRUM-бейсик - настройка клавиатуры. Полезная информация о памяти.


Настройка клавиатуры

Меняя значения системных переменных 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.

Параллельно с числовыми массивами в программе могут использо-
ваться неиндексированные числовые переменные с тем же именем.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
С миру по биту - MicroSoft насильственно разбивают на два самостоятельные организации.
ZX-Preview - Artcomp'99: virtuаl pаrtу.
Слушаем вас ? - письмо в газету от Smont'a.
Программистам - The hacker club: Обзор защит.
Пpoлетаpии всеx стpан - pазъединяйтесь - Действительнo, пoчему мы неoбъединяемся?

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