Тайники ZX Spectrum 1969 г.

Системные переменные - системные переменные хранятся с адреса #5C00 (23552) до области, занимаемой программой BASIC.


                    6. Системные переменные
   Системные переменные хранятся с адреса #5C00 (23552) до области,
занимаемой  программой BASIC. Программы из памяти 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)        CHARS    #5C36 (23606)
         WORKSP   #5C61 (23649)        UDG      #5C7B (23675)
         STKBOT   #5C63 (23651)
Применение   этих   переменных   описано   в   предыдущем  разделе.
Естественным    использованием    этих    переменных   может   быть
перераспределение   свободной   памяти,  либо  занятой  программой,
переменными  и  т.д.  Только  переменная  RAMTOP  может  быть легко
модифицирована  из  BASIC  посредством  CLEAR  k.  К сожалению, эта
команда  имеет  и другие побочные действия, что временами делает ее
использование невозможным.
P_RAMT    - Содержит  адрес  последней  физически присутствующей  в
            компьютере  ячейки  памяти.  Следовательно,  может быть
            использована  для  распознавания  программой,  на какой
            модели  компьютера  ZX  Spectrum она загружена (16К или
            48К).
CHARS     - Благодаря  этой   переменной  можно  определить  собст-
            венные  формы  вывода. После размещения их в память RAM
            под   адресом  k  достаточно  задать  переменной  CHARS
            значение  k-256.  Начиная  с этого момента, все тексты,
            включая  программный  листинг,  будут печататься нашими
            новыми  знаками. Этим способом можно изменить очертания
            всех   символов   с   кодами  от  32  до  127.  Следует
            подчеркнуть,  что  так  модифицируются только очертания
            знаков,  но  не  их  значения, которые зависят от кодов
            символов. Можно использовать эту переменную для трюков,
            делающих    текст   программы   абсолютно   нечитаемым.
            Достаточно  уменьшить  значение  CHARS  на 8, и тогда в
            распечатке  программы  трудно  будет  найти  какой-либо
            смысл. Зато надписи, выводимые запущенной на выполнение
            программой,    останутся   разборчивыми,   если   будут
            заблаговременно  сдвинуты на одно значение кода, т.е. в
            исходном тексте поместим "B" вместо "A", "O" вместо "N"
            и т.д.
UDG       - Польза  от размещения этого  адреса  в  списке  систем-
            ных  переменных  состоит  в том, что этот блок мы можем
            перемещать   в   памяти.   Столь   же  ценной  является
            возможность  использования нескольких наборов нетиповых
            символов  одновременно.  В  этом  случае  перед выводом
            данного  знака требуется модифицировать UDG, присваивая
            переменной   значение  набора,  необходимого  в  данный
            момент.  Модификация  остальных  переменных этой группы
            очень  опасна и может легко привести к сбою и зависанию
            операционной системы.
ERR_SP    - Эта переменная  указывает  основание  машинного  стека.
            Там,   в   свою   очередь,   помещен  адрес  процедуры,
            отвечающей  за  обслуживание  всех  ошибочных ситуаций,
            требующих     прерывания     программы     и     выдачи
            соответствующего    сообщения.    Под   ошибкой   здесь
            понимается  также  и  нормальное  завершение программы,
            сигнализируемое     сообщением    0    Ok.    Страстные
            программисты,  знающие  ассемблер  Z80, могут благодаря
            этому  писать  собственные  программы обработки ошибок,
            что  позволяет, между прочим, добавление новых команд к
            языку. Модификация ERR_SP с уровня BASIC всегда ведет к
            краху   системы   в   момент   возникновения  ситуаций,
            требующих    вывода   любого   сообщения.   Это   часто
            используется      для      защиты      программы     от
            несанкционированного   просмотра  и  копирования.  Этот
            метод  в соединении с записью программ с помощью 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.  Однако,  эту  информацию можно
            использовать  лишь  с  уровня  ассемблера.  Седьмой бит
            переменной    FLAGS   сигнализирует   системе,   пришла
            выполняемая  команда  с  клавиатуры  или  из программы.
            Размещенная в программе инструкция POKE 23611,0 прервет
            ее выполнение сообщением 0 Ok.
REPDEL       #5C09 (23561)
REPPER       #5C0A (23562)
          - Эти    две    переменные    необходимо    рассматривать
            одновременно.  Первая из них определяет, как долго надо
            нажимать клавишу, чтобы заработал механизм самоповтора,
            а   вторая   определяет   время   между  считыванием  с
            клавиатуры.  В обеих переменных время дано в 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-й строке, следовательно, действуют значительно точнее
            команды GO TO L.
         POKE 23618,L-256*(INT(L/256)):
         POKE 23619,INT(L/256):
         POKE 23620,M
PPC          #5C45 (23621)
SUBPPC       #5C47 (23623)
          - Эти переменные  содержат  соответственно номер строки и
            номер выполняемой команды.  Вместе с переменной  ERR_NR
            они  могут  служить  для  завершения  программы с ранее
            заданным  сообщением  без  провоцирования   фактической
            ошибки.  С  этой  целью  программу  следует   завершить
            инструкцией  GO  TO  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.
            Эти числа затем используются в различных выражениях для
            назначения кода  символу, который  должен высвечиваться
            как  курсор.  Программируя   на  BASIC,  можно   только
            склонить 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. За это отвечает третий бит FLAGS. 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 и  NCPPC, так как  переход наступает
            лишь  после  встречи  с  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 Переменные, обслуживающие экран телевизора
   Эта группа  переменных отвечает  за правильность  взаимодействия
компьютера  с  телевизором.  Одна  из  них управляет цветом, другие
определяют места вывода очередного знака или графического символа.
BORDER       #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 может  быть использована в  программе
            BASIC для установления всех атрибутов одной инструкцией
            POKE. ATTR_T,  в свою  очередь, может  быть важна   для
            программирующих  в  машинном   коде,  так  как   обычно
            используется  процедурами  памяти  ROM для установления
            заданных цветов.
MASK_P       #5C8E
MASK_T       #5C90
          - Эти однобайтовые переменные используются при
            реализации  команд  FLASH,  BRIGHT,   PAPER  и  INK   с
            параметром 8. Значение литер P и T в именах  переменных
            такое же самое,  как для переменных  ATTR. Установление
            какого-либо бита этих переменных в 1 означает, что  бит
            с  тем  же  самым   номером  в  соответствующем   байте
            атрибутов   должен   оставаться   неизменным.   Обратим
            внимание, что команда INK  8 устанавливает в 1  все три
            младших  бита  переменной   MASK_P.   Модифицируя   эту
            переменную   инструкцией    POKE,   можно,    например,
            установить в  1 только  один младший  бит. Тогда  будет
            получен  эффект  фильтра.  Неизменной  в  цвете  чернил
            останется только основная синяя компонента, в то  время
            как  остальные  могут  подвергаться изменениям (обратим
            внимание на то,  что нумерация цветов  совсем случайна.
            Цвет синий - 1, красный - 2, зеленый - 3. Это  основные
            цвета, смесь которых позволяет получить все  остальные.
            В Spectrum роль смешивания выполняет добавление номеров
            соответствующих цветов).
COORDS       #5C7D (23677)
          - Два последовательных байта  этой  переменной   содержат
            координаты (X,Y) точки  на экране, в  которой завершила
            рисование последняя инструкция  PLOT, DRAW или  CIRCLE.
            Модификация этой переменной  дает тот же  самый эффект,
            что и PLOT OVER  1,k,n, т.е. смещение указателя  экрана
            без рисования какой-либо точки или линии.
SPOSN        #5C88 (23688)
          - Эта переменная (2 байта)  содержит значения 33-k, 24-m,
            где k,m  - координаты  последнего выведенного  на экран
            знака.  Непосредственная  модификация  этих  переменных
            затруднительна,     т.к.     необходимо    одновременно
            модифицировать DF_CC.
DF_CC        #5C84 (23684)
          - Эта  переменная  содержит  адрес  байта  на  экране,  с
            которого начнется вывод очередного символа  инструкцией
            PRINT.   Модифицируется   только   вместе   с    SPOSN.
            Значительно проще применить инструкцию PRINT AT k,n.
SPOSNL       #5C8A (23690)
DFCCL        #5C86 (23686)
          - Переменные, аналогичные SPOSN и DF_CC, описывающие ниж-
            нюю часть экрана.
P_FLAG       #5C91 (23697)
          - Переменная, содержащая информацию  о  режиме  печати  и
            рисования  на  экране.  Описывает режимы, установленные
            BASIC с помощью инструкции 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,  то вместо  четырех команд  достаточно
            одной POKE 23697,2+8+32+128.
Внимание: Названия системных переменных не распознаются BASIC.  Они
введены авторами операционной системы и приняты во всей литературе,
относящейся к ZX Spectrum.



СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Мнение - Мнение о музыке на Paradox'99.
News - D.J.Crаck ушел в группу Flash inc.
Nostalgie - прошлое, где ты?
История - история ASCII арта (часть 1).
911 - Прохождение игры Homer Simpson In Russia 2.

В этот день...   28 апреля