Echo #03
31 марта 1997

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

<b>Книга</b> - Тайники ZX-Spectrum: Системные переменные Бейсика.
   Глава 6.

   С И С Т Е М Н Ы Е
   П Е Р Е М Е Н Н Ы Е



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

   - хранящие важные для системы адреса;
   - обслуживающие клавиатуру;
   - описывающие состояние системы;
   - связанные с каналами и потоками;
   - обслуживающие экран телевизора.


   6. 1 Важные для системы адреса

ERR_SP #5C3D (23613) STKEND #5C65 (23653)
VARS   #5C4B (23627) RAMTOP #5CB2 (23730)
PROG   #5C53 (23635) P_RAMT #5CB4 (23732)
E_LINE #5C59 (23641) CHANS  #5C36 (23606)
WORKSP #5C61 (23649) UDG    #5C7B (23675)
STKBOT #5C63 (23651)

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


   P_RAMT

   Содержит   адрес  последней,  физически
присутствующей  в компьютере, ячейки памя-
ти. Следовательно, может быть использована
для распознавания программой в какой моде-
ли  компьютера  ZX-SPECTRUM  она загружена
(16K или 48K).


   CHARS

   Благодаря этой переменной можно опреде-
лить  собственные формы вывода. После раз-
мещения их в память RAM под адресом K дос-
таточно  задать  переменной CHARS значение
K-256.  Начиная с этого момента, все текс-
ты, включая программный листинг, будут пе-
чататься  нашими новыми знаками. Этим спо-
собом можно изменить очертания всех симво-
лов  с  кодами  от 32 до 127. Следует под-
черкнуть,  что  так  модифицируется только
очертания знаков, но не их значения, кото-
рые  зависят  от кодов символов. Можно ис-
пользовать  эту переменную для трюков, де-
лающих  текст программы абсолютно нечитае-
мым.  Достаточно  уменьшить значение CHARS
на 8, и тогда в распечатке программы труд-
но будет найти какой-либо смысл. Зато над-
писи,  выводимые  запущенной на выполнение
программой,  останутся  разборчивыми, если
будут  заблаговременно  сдвинуты  на  одно
значение кода, т. е. в исходном тексте по-
местим "B" вместо "A", "O" вместо "N" и т.
д..


   UDG

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


   ERR_SP

   Эта  переменная указывает основание ма-
шинного  стека. Там, в свою очередь, поме-
щен адрес процедуры в памяти ROM, отвечаю-
щей  за обслуживание всех ошибочных ситуа-
ций,  требующих прерывание программы и вы-
дачи соответствующего сообщения. Под ошиб-
кой  здесь  понимается  также и нормальное
завершение    программы,   сигнализируемое
сообщением  0  OK. Страстные программисты,
знающие  ассемблер  Z80  могут,  благодаря
этому,  писать собственные программы обра-
ботки ошибок, что позволяет, между прочим,
добавление новых команд к языку. Модифика-
ция ERR_SP с уровня Бейсика всегда ведет к
краху  системы  в момент возникновения си-
туаций, требующих вывода любого сообщения.
Это часто используется для защиты програм-
мы от несанкционированного просмотра и ко-
пирования.  Этот  метод в соединении с за-
писью программ с помощью SAVE F LINE..., а
также с исключением возможности считывания
программы  инструкцией  MERGE  обычно пол-
ностью  позволяет обезопасить программу от
менее грамотных пиратов. К сожалению, спа-
сения  от  многочисленных копирующих прог-
рамм нет.



   6.  2 Переменные, обслуживающие клавиа-
туру

   KSTATE #5C00 (23552)

   Эта  переменная  построена  из 8 байт и
используется  для чтения клавиатуры и обс-
луживания  самоповторяемости  клавиш.  Для
программиста  лишь  ячейка с адресом #5C04
(23556) может иметь значение. Она содержит
значение  255, если ни одна клавиша не на-
жата,  или  код основного значения нажатой
клавиши в режиме C (большая литера алфави-
та  или  цифра).  PEEK  23556 дает поэтому
тот  же  самый эффект, что и CODE INKEY$ в
режиме  C. Достоинством является факт, что
значение  не  зависит от состояния курсора
(L  или  C).  В  случае нажатия нескольких
клавиш одновременно всегда будет распозна-
на  первая  (INKEY$ в такой ситуации может
игнорировать  все).  Клавиши  <CS> и <SS>,
нажимаемые по отдельности, не воздействуют
на нашу ячейку, но нажатые вместе дают код
14. Кроме того, комбинации <CS/9>, <CS/3>,
<CS/4>,  <CS/2> выдают соответственно коды
15,  4,  5,  6  (эти коды ловит также CODE
INKEY$).


   LAST_K #5C08 (23560)

   Эта байтовая переменная хранит код пос-
ледней  нажатой клавиши, независимо от то-
го, нажимают на нее или нет. В случае  на-
жатия нескольких - будет запомнен код пер-
вой.  В  отличие от предыдущей переменной,
LAST_K  следит  за  состоянием  курсора. С
этой переменной частично связана следующая
переменная.


   FLAGS #5C3B (23611)

   Сколько раз переменная LAST_K принимает
новое  значение, столько раз пятый бит пе-
ременной  FLAGS  устанавливается  в 1. Это
важно,  если  мы желаем распознать многок-
ратное  нажатие на одну и ту же клавишу. В
свою  очередь, третий бит этой переменной,
вместе  с  содержимым MODE, позволяет рас-
познать в какой ситуации относительно чте-
ния  клавиатуры  должен  быть  использован
курсор K. Однако, эту информацию можно ис-
пользовать лишь с уровня ассемблера. 7 бит
переменной  FLAGS  сигнализирует  системе,
что пришла выполняемая команда с клавиату-
ры  или  из программы. Размещенная в прог-
рамме  инструкция POKE 23611, 0 прервет ее
выполнение сообщением 0 OK.


   REPDEL  #5C09  (23651)  и  REPPER #5C0A
(23652)

   Две  эти переменные необходимо рассмат-
ривать одновременно. Первая из них опреде-
ляет как долго надо нажимать клавишу, что-
бы  заработал автоповтор, а вторая опреде-
ляет время между считыванием с клавиатуры.
В  обеих  переменных время дано в 1/50 се-
кунды.  По началу эти переменные инициали-
зированы  значениями  35  и 5, что обозна-
чает,  что  нажатая клавиша после 0. 7 сек
начинает саморазмножаться с темпом 10 зна-
ков в сек. В процессе считывания с клавиа-
туры  эти  значения  можно уменьшить до 0.
Придавая  им  значения  0, добиваются наи-
большей  остановки, продолжающейся столько
же,  сколько  PAUSE  256.  Занесение в эти
ячейки значения 1 приводят к тому, что ра-
бота  со  SPECTRUM  становится трудной, но
возможной  (ввод любой директивы с клавиа-
туры будет требовать от оператора отличной
реакции и чувствительности в пальцах).

   RASP #5C38 (23608) и PIP #5C39 (23609)

   Эти  переменные определяют звук, сопро-
вождающий  ввод  данных.  RASP задает дли-
тельность  (в 1/50 сек) предупредительного
ворчания,  когда SPECTRUM не желает больше
считывать   данные.   Начальное   значение
RASP=64  (1.  26 сек). PIP определяет дли-
тельность  звука,  подтверждающего нажатие
клавиши.  Начальное  значение PIP=0. Стоит
помнить,  что  RASP  и  PIP,  в отличие от
большинства  других  системных переменных,
не   инициализируются  заново  инструкцией
NEW.



   6. 3 Переменные состояния системы

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


   NEWPPC  #5C42  (23618)  и  NSPPC  #5C44
(23620)

   Первая  из них (2 байта) содержит номер
строки, а вторая (1 байт) осуществляет пе-
реход.  Следующие  команды вызывают непос-
редственный переход к M-й инструкции в L-й
строке,  следовательно,  действуют  значи-
тельно точнее команды GOTO L.

   POKE 23618, L-256*(INT(L/256)):
   POKE 23619, INT(L/256):
   POKE 23620, M


   PPC   #5C45   (23621)  и  SUBPPC  #5C47
(23623)

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

   9999 POKE 23621, L-256*INT(L/256):
   POKE 23622, INT(L/256):
   POKE 23610, M-1 : POKE 23623, K

   В   этом  случае  программа  завершится
сообщением:

   M ТЕКСТ L: K .



   ERR_NR #5C3A (23610)

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

   E_PPC #5C49 (23625)

   Эта переменная (2 байта) содержит номер
текущей строки и доступна для редактирова-
ния. Ее модификация вызовет тот же эффект,
что  и  LIST N, но без вывода программы на
экран.  Это  делает возможным выбор с кла-
виатуры  строки программы для модификации,
а  затем копирования ее в нижнюю часть эк-
рана  и  корректировку без уничтожения со-
держимого экрана.


   MODE #5C41 (23617)

   Эта переменная информирует редактор ка-
кой  курсор должен использоваться в данный
момент.  Система использует следующие зна-
чения:  0-L,  C или K, 1-E, 2-G. Эти числа
затем  используются в различных выражениях
для  назначения кода символу, который дол-
жен высвечиваться как курсор. Программируя
на Бейсике можно только склонить SPECTRUM,
чтобы  в ближайшей инструкции INPUT вместо
стандартного курсора L или C использовался
курсор  G  или  E.  Причем  режим  E будет
действовать  только  для первого вводимого
символа.  Режим E включится POKE 23617, 1.
Интересные  эффекты дает размещение в этой
переменной других значений (отличных от 1,
1,  2). POKE 23617, K для K=3,..., 127 вы-
зывает  курсор G, хотя на экране вообще не
будет печататься литера G, а нечто другое.
POKE  23617, K для K=0, 128,..., 255 уста-
навливается режим L или C, но с выводом на
экран другого мерцающего курсора.


   FLAGS #5C6A (23658)

   Эта  переменная определяет, какой необ-
ходим  режим  L или C. За это отвечает 3-й
бит  FLAGS2.  POKE  23658, 0 устанавливает
режим L, а POKE 23658, 8 - режим C. Подоб-
ные  изменения получают с клавиатуры с по-
мощью CS/2.


   DF_SZ #5C6B (23659)

   Эта  переменная  содержит  число  строк
нижней части экрана, зарезервированных для
системных  сообщений  и данных, вводимых с
помощью  INPUT. Инициализируется значением
2. Практически не используемая, хотя иног-
да  может  быть  использована  для  защиты
программ  от прерываний. Помещение в нее 0
вызывает  зависание  системы,  как  только
возникает необходимость вывода чего-нибудь
в нижнюю часть экрана (например, сообщения
о  нажатии  BREAK). Однако это не выгодное
оружие,  т.  к. одновременно делает невоз-
можным применение инструкций INPUT, CLS, а
также    не    позволяет   задать   вопрос
"SCROLL?".


   OLDPPC  #5C6E  (23662)  и  OCPPC  #5C70
(23664)

   Они  содержат  номер строки и команды в
строке,  к которым будет осуществлен пере-
ход  в случае выдачи команды CONTINUE. Мо-
дификация этих переменных в программе поз-
воляет  найти точнейшую альтернативу инст-
рукции  GO  TO.  В некоторых ситуациях это
лучше,  чем модификация NEWPPC и NSPPC, т.
к.  переход  наступает  лишь при встрече с
CONTINUE,  а не сразу же после модификации
переменных.  Эти  переменные автоматически
корректируются  системой всякий раз, когда
наступает  прерывание  программы с сообще-
нием, отличным от 0 OK.



   SEED #5C76 (23670)

   Эта  основа  генератора псевдослучайных
чисел.  Использование SEED рассматривалось
при описании функции RND.


   FRAMES #5C78 (23672)

   Три  байта  составляют  внутренние часы
ZX-SPECTRUM.  Они  представляют число PEEK
23672+256*PEEK  23673+65536*PEEK  23674  и
определяют  сколько  1/50 сек прошло с мо-
мента  инициализации системы. Максимальным
значением  является  2^24-1=16777215,  что
отвечает 3 суткам 21 часу 12 минутам и 24.
3  секундам.  Точность  таймера составляет
около 0. 01% или менее 9 сек в сутки. Этот
таймер   включается  на  то  время,  когда
SPECTRUM  обслуживает  внешние  устройства
(принтер, магнитофон, динамик), а также во
время  выполнения программы в машинном ко-
де, которые выключают или обходят контроль
за замаскированными прерываниями.


   DATADD #5C57 (23639)

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


   SCR_CT #5C8C (23692)

   Этот   байт  определяет,  после  вывода
скольких  строк  +1, на экране должен поя-
виться  вопрос "SCROLL?". Если надо, чтобы
вывод не прерывался, то , по крайней мере,
один раз на 255 выведенных строк необходи-
мо в эту ячейку занести значение 255. Если
нам  надо  прервать вывод раньше, то нужно
присвоить этой переменной значение меньшее
23.



   6.  4  Переменные,  обслуживающие экран
телевизора

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

   BORDCR #5C48 (23624)

   Эта  переменная содержит атрибуты, опи-
сывающие  нижнюю  часть  экрана,  а  также
цвет рамки. В обычных условиях ZX-SPECTRUM
не позволяет устанавливать одинаковый цвет
для  фона и чернил в нижних строках (поль-
зователь  всегда должен видеть вводимые им
символы).  Спецификаторы  цветов  в списке
INPUT будут действенны только для текстов,
печатаемых  в нижней части экрана, но цвет
чернил для вводимых данных всегда устанав-
ливается  в 9 (белый или черный, в зависи-
мости  от  цвета  фона).  Обойти это можно
(например, если компьютер должен считывать
с   клавиатуры  тайный  пароль)  используя
команду  POKE  23624,  128+F+64*B+8*P+I  и
присваивая литерам F, B, P, I значения па-
раметров  команд  FLASH,  BRIGHT,  PAPER и
INK,  необходимых  для получения желаемого
эффекта.  Тем, кто не убежден, рекомендуем
получить  этот эффект другим способом:


BORDER 3 : POKE 23624, 222 : CLS.

   ATTR_P  #5C8D  (23693)  и  ATTR_T #5C8F
(23695)

   Обе  переменные  однобайтовые  и хранят
значения  атрибутов FLASH, BRIGHT, PAPER и
INK.  Литера  P обозначает величины, уста-
новленные  постоянно  соответствующими ко-
мандами для всей программы, литера T - те-
кущие  значения,  устанавливаемые  теми же
самыми  командами,  размещенными в списках
соответствующих пишущих и рисующих команд.
При   отсутствии  спецификаторов  цвета  в
списках   пишущих  инструкций,  переменная
ATTR_P  копируется в ATTR_T. Способ хране-
ния информации о цветах в одном байте опи-
сан  в главе "Использование памяти". Пере-
менная  ATTR_P  может  быть использована в
программе  Бейсика  для  установления всех
атрибутов  одной инструкцией POKE. ATTR_T,
в свою очередь, может быть важна для прог-
раммирующих  в  машинном  коде,  так  как,
обычно,  используются  процедурами  памяти
ROM для установления заданных цветов.

   MASK_P  #5C8E  (23694)  и  MASK_T #5C90
(23696)

   Эти однобайтовые переменные используют-
ся  при  реализации  команд FLASH, BRIGHT,
PAPER,  INK с параметром 8. Значение литер
P  и T в именах переменных такое же самое,
как  для переменных ATTR. Установление ка-
кого-либо  бита  этих переменных в 1 озна-
чает,  что  бит  с  тем же самым номером в
соответствующем байте атрибутов должен ос-
таться  неизменным.  Обратим внимание, что
команда  INK  8  устанавливает  в  1 все 3
младших  бита переменной MASK_P. Модифици-
руя эту переменную инструкцией POKE можем,
например, установить в 1 только один млад-
ший бит. Тогда будет получен эффект фильт-
ра.  Неизменной  в  цвете чернил останется
только  основная  синяя  компонента,  в то
время как остальные могут подвергаться из-
менениям.  (Обратим  внимание  на  то, что
нумерация цветов совсем случайна. Цвет си-
ний  - 1, красный - 2, зеленый - 3 это ос-
новные  цвета, смесь которых позволяет по-
лучить  все  остальные. В ZX-SPECTRUM роль
смешивания  выполняет  добавление  номеров
соответствующих цветов.

   COORDS #5C7D (23677)

   Два  последовательных  байта этой пере-
менной  содержат  координаты  (X, Y) точки
на  экране,  в которой завершила рисование
последняя  инструкция  PLOT, DRAW, CIRCLE.
Модификация  этой  переменной  дает тот же
самый  эффект,  что  и  PLOT OVER 1, K, N:
PLOT OVER 1, K, N, т. е. смещение указате-
ля  экрана  без рисования какой-либо точки
или линии.


   SPOSN #5C88 (23688)

   Эта  переменная (2 байта) содержит зна-
чения  33-K,  24-M,  где K, M - координаты
последнего  выведенного  на  экран  знака.
Непосредственная модификация этих перемен-
ных  затруднительна,  т. к. необходимо од-
новременно модифицировать DF_CC.


   DF_CC #5C84 (23684)

   Эта  переменная содержит адрес байта на
экране,  с  которого начинается вывод оче-
редного символа инструкцией PRINT. Модифи-
цируется  только  вместе  с Z_POSN. Значи-
тельно проще применить команду PRINT AT K,
N.


   SPONSL  #5C8A  (23690)  и  DFCCL  #5C86
(23686)

   Переменные, аналогичные S_POSN и DF_CC,
описывающие нижнюю часть экрана.


   P_FLAG #5C91 (23697)

   Переменная, содержащая информацию о ре-
жиме  печати и рисования на экране. Описы-
вает режимы, установленные Бейсиком с  по-
мощью  инструкции  INVERSE,  OVER, INK 9 и
PAPER  9. Нечетные биты соответствуют пос-
тоянному заданию этих режимов, четные вре-
менному.
    __________________________________
   |           | временно | постоянно |
   |           | бит      | бит       |
   |-----------|----------|-----------|
   | OVER 1    | 0        | 1         |
   | INVERSE 1 | 2        | 3         |
   | INK 9     | 4        | 5         |
   | PAPER 9   | 6        | 7         |
   |___________|__________|___________|

   Если  необходимо  установить  постоянно
OVER  1:  INVERSE  1:  INK  9: PAPER 9, то
вместо  4-х  команд  достаточно одной POKE
23697, 2+8+32+128.

   ВНИМАНИЕ: названия системных переменных
не  распознаются Бейсиком. Они введены ав-
торами  операционной  системы и приняты во
всей     литературе,     относящейся     к
ZX-SPECTRUM.



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Похожие статьи:
Лучшее - игры и газеты.
Юмор - анекдоты.
Железо - Дисковод 3.5. От покупки до ремонта: выбор и установка, подключение,подменитель дисководов,выбор дискет,достоинства и недостатки 3.5.
Игроскоп - краткий обзор игровых программ, появившихся в Челябинске: Freddy Kruger Live, Mortal Kombat, Zybex Remix, Gorodki, Atomic Robo Kid, Turbo Skate Fighter, Gremlins 2, Robot, Mercs, The Big Slease, UFO 2, Twin, Клятва Ночи, Trinia, Randex, Hunter, Talisman, Killed Until Dead, Supertetris, Miner, Tarzan, Final Fight, Go Bear Go, Rings Wars, 48 Утюгов, Prince of Persia и т.д.
hAve a fUn - Мужчина-программист.

В этот день...   3 июля