СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
Интерпретатору Бейсика для «служебного пользования» в ком-
пьютере отводится специальная область оперативной памяти. В
ячейках этой области хранятся настроечные параметры интерпре-
татора, а также данные, необходимые для обработки бейсик-про-
грамм. Читая содержимое этих ячеек, можно узнать много интерес-
ного о состоянии компьютера. Записывая же в них необходимые
нам значения, можно влиять на работу компьютера.
Эти ячейки памяти называют системными переменными. У каж-
дой из переменных есть свое имя и фиксированное положение в
памяти*.
Наверное, нет необходимости пояснять, что системные переменные ничего обще-
го не имеют с переменными бейсик-программ.
Многие из системных переменных непосредственного отноше-
ния к Бейсику не имеют, но использование некоторых из них
намного расширяет возможности программиста, тем более, что
изменять значения системных переменных можно с помощью опе-
раторов Бейсика.
Чтение содержимого памяти
РЕЕК
Память ZX Spectrum состоит из множества отдельных ячеек, в
каждой из которых может быть записано число от 0 до 255 (байт).
Всего ячеек 65535. Для того чтобы различать ячейки, каждой из
них приведено в соответствие число от 0 до 65535, называемое
адресом. С помощью оператора РЕЕК прямо из Бейсика можно
читать содержимое любых ячеек памяти. Выполним в непосредст-
венном режиме оператор
print реек 23560
13
По сути, мы выяснили, что в ячейке памяти с адресом 23560
записано число 13. «Зациклим» считывание этой ячейки:
10 print реек 23560
20 go то 10
run
13
Вполне естественно, что первоначальный результат выполнения
программы будет таким же, как и при выполнении строки. Но если
теперь, не останавливая программу, нажимать разные клавиши,
на экране будут появляться коды соответствующих символов.
Итак, мы познакомились с системной переменной LAST_K (ад-
рес 23560), в которой постоянно хранится код последней нажатой
клавиши.
В некоторых случаях пользоваться системной переменной
LAST_K предпочтительнее, чем функцией inkey$. Ведь inkey$ воз-
вращает символ клавиши, нажатой именно в момент ее выполне-
ния, и требует обязательного «зацикливания» программы на опро-
се клавиатуры. Переменная LAST_K сохраняет код клавиши и
после ее отпускания. Это позволяет после завершения программой
каких-либо действий проверить, была ли нажата клавиша в мо-
мент выполнения этих действий.
Системный счетчик
Системный счетчик — внутренние часы ZX Spectrum. Под него
в памяти компьютера отведено три ячейки памяти с адресами
23672/7 3/74*. Они носят общее название «системная переменная
FRAMES».
После включения или сброса компьютера содержимое всех трех
ячеек обнуляется. По прошествии 1/50 секунды в ячейку 23762
записывается число 1. И далее, через каждые 1/50 секунды ее
содержимое увеличивается на 1. При достижении значения 255
ячейка 23762 обнуляется, а содержимое ячейки 23673 увеличива-
ется на 1. И, соответственно, когда переполняется ячейка 2367 3
(записанное в ней значение достигает 255), к содержимому ячейки
23674 прибавляется 1. Следовательно, в нашем распоряжении
имеются часы, отсчитывающие время с момента включения компь-
ютера с точностью в 1/50 секунды непрерывно в течение
(255+255х256+255х256x256)/50=335544,3 секунд,
то есть 3 суток и еще 21 часа. Потом все сначала.
Для определения числа полных секунд, прошедших с момента
включения или сброса компьютера, нужно рассчитать следующее
выражение:
LET T=INT((65536*PEEK 23674+256+РЕЕК 23673+РЕЕК 23672)/50)
Таким образом можно смоделировать на компьютере часы:
10 INPUT "Час ";hour
20 INPUT "Минуты ";min
30 POKE 23674,0: POKE 23673,0: POKE 23672,0
40 LET t=PEEK 23672+2569+PEEK 23673+65536+PEEK 23674+
hour* 180000+min*3000
50 LET h=INT (t/180000)
60 LET h$=STR$ h
70 IF LEN h$=l THEN LET h$="0"+h$
80 LET h$=h$( TO 2)+":"
90 LET m=INT ((t-h*180000)/3000)
100 LET m$=STR$ m
110 IF LEN m$=1 THEN LET m$="0"+m$
120 LET m$=m$( TO 2)+":"
130 LET s=INT ((t—h*180000—m*3000)/50)
140 LET s$=STR$ s
150 IF LEN s$=1 THEN LET s$="0"+s$
160 LET s$=s$( TO 2)
170 PRINT AT 20,24;h$;m$;s$
180 GO TO 40
Эти «часы» можно включить в любую программу. Следует толь-
ко учитывать, что на время ожидания ввода данных операторами
INPUT вывод времени на экран будет остановлен**. Чтобы задержка
была не так заметна, лучше из программы, моделирующей часы,
В таком виде мы будем приводить адреса системных переменных, занимающих
более одной ячейки. В данном случае это адреса 23672, 23673, 23674.
** Это относится и к другим операторам, приостанавливающим выполнение про-
граммы (LOAD, SAVE, PAUSE).
исключить строки 130...160 и убрать переменную s$ из строки
170, то есть не выводить на экран секунды.
Запись в память_
РОКЕ
Запись чисел в память производится с помощью оператора
РОКЕ. Вслед за ним через запятую располагаются два значения:
адрес от 0 до 65535 и заносимое в память по указанному адресу
число от 0 до 255.
Невидимая точка на экране_
Оператор draw начинает чертить отрезок линии или дуги от
последней выставленной на экране точки. Координаты этой точки
он берет из системной переменной COORDS. В ячейках с адресами
23677 и 23678 этой переменной хранятся, соответственно, значе-
ния координат х и у последней выставленной на экран точки. Зная
это, можно, не выставляя точки с помощью оператора PLOT, запи-
сывать начальную координату для draw сразу в переменную
COORDS:
10 роке 23677,100: роке 23678, 100
20 draw 50, 50
Другое полезное применение в программе переменной
COORDS — это получение из нее с помощью РЕЕК информации о
координатах последней выставленной точки.
Окраска экрана
Оперируя системными переменными, можно добиться того, что
невозможно сделать с помощью обычных операторов и функций
Бейсика.
Например, в Бейсике нет оператора, изменяющего все атрибу-
ты служебного экрана (оператор border устанавливает только цвет
фона). Задать их можно только, записывая соответствующие значе-
ния в системную переменную BORDCR (адрес 23624). Число,
которое необходимо записать по этому адресу, формируется по
принципу, изложенному в описании функции attr (см. стр. 55).
Определяя через системную переменную BORDCR цвет фона
служебного экрана, мы одновременно задаем цвет бордюра.
Точно также, выполнив лишь один оператор
роке 23693, x
- можно задать атрибуты и основного экрана (вместо привычных
ink, paper, flash и bright). 23693 — это адрес системной перемен-
ной ATTR_P, значение которой определяет «окрас» основного экра-
на. X — число, которым зашифрованы атрибуты. Может, этот
способ сложнее, но он короче и изящнее.
Другие операции с экраном
Оперируя системными переменными, можно менять привыч-
ные характеристики Бейсика ZX Spectrum. Например, можно уве-
личить основной экран: занять под него все 24 строки. Для этого
нужно модифицировать содержимое системной переменной DF_SZ
(адрес 23659), задающей количество строк в служебном экране:
роке 23659,0
Правда, в этом случае следует исключить в программе вывод на
служебный экран, иначе не оберешься беды. Когда же без служеб-
ного экрана не обойтись (при работе с оператором input или при
ожидании вывода сообщения, например, о завершении работы
программы) необходимо восстановить содержимое DF_SZ:
роке 23659,2
Существует системная переменная SCR_CT (адрес 23692), зада-
ющая количество строк текста, передвигаемых вверх по экрану без
запроса scroll?. Требуемое значение этой переменной устанавлива-
ется только из программы (изменить SCR_CT в непосредственном
режиме невозможно).