СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
Для хранения и обработки служебной информации (значений координат точек, адресов таблиц, текущих
атрибутов и т. п.) операционная система ZX Spectrum использует так называемые системные перемен-
ные, под размещение которых отведена специальная область ОЗУ.
При описании системной переменной вслед за именем указывается
ее десятичный и шестнадцатиричный адрес. Адреса двух- и трехбайтовых переменных записываются через
косую черту, например: 23563/64 (#5С0В/0С) . В этих переменных младший байт числа, как принято в
микропроцессоре Z80, хранится в ячейке с меньшим адресом. Для блока переменных указываются началь-
ный и конечный адреса, разделенные многоточием, например,23552...23559(#5C00...#5C07).
Во время работы интерпретатора Бейсика индексный регистр IY содержит адрес переменной ERR_NR
23610 (#5C3A). и, следовательно, для обращения к системным переменным удобно использовать индекс-
ный метод адресации. Поэтому для каждой переменной приведена величина смещения адреса ее первого
байта относительно значения регистра IY, например, IY—50.
Русифицированный фонт может быть сформирован с помощью любой из многочисленных графических про-
грамм, позволяющих манипулировать шрифтами. Можно порекомендовать редактор Art Studio. При созда-
нии кириллицы встает вопрос, какому латинскому символу должна соответствовать конкретная русская
буква. Вопрос этот не слишком принципиальный, однако есть определенные стандарты, которыми стоит
руководствоваться. Обычно устанавливают такое соответствие:
Учитывая последнее, может возникнуть желание, изменив значение IY, переместить область системных
переменных. Однако авторы операционной системы, вероятно, не продумали этот вопрос и для обращения
к системным переменным использовали их физические адреса, привязав, таким образом, область систем-
ных переменных к конкретному месту в памяти.
KSTATE 23552...23559 (#5С00...#5С07)
Восемь байт составляют два блока, которые используются программой обслуживания клавиатуры (см.
табл. 7). Для организации работы внешних программ эти переменные практически не применяются.
LAST_K_23560 IY-50 (#5C08)
Код последней нажатой клавиши.
REPDEL_23561 IY-49 (#5C09)
Величина задержки (в 1/50 с) между нажатием клавиши и началом автоматического повторения нажа-
тия (автоповтора) .
PEPPER_23562 IY-48 (#5С0А)
Период автоповтора (в 1/50 с) при длительном нажатии на клавишу. Изменяя системные переменные
REPDEL и REPPER, можно настроить клавиатуру под конкретного пользователя.
DEFADD_23563/64 IY-47 (#5С0В/0С)
Адрес первого параметра пользовательской функции, определенной оператором DEF FN, в процессе ее
обработки. Например:
DEF FN n(a,b)=SIN a+COS b
DEF FN In ' | ( la #0E
T
DEFADD
K_DATA_23565 IY-45 (#5C0D)
Код цвета, заданный цифровой клавишей в режиме курсора Е.
TVDATA_23566/67 IY-44 (#5C0E/0F)
Первый байт - код управления, заданный цифровой клавишей в режиме курсора Е. Второй байт - первый
параметр в AT или TAB.
STRMS 23568...23605 IY-42 (#5С10...#5С35)
Область хранения информации о потоках (более подробно см. «Архитектура ZX Spectrum. Каналы и пото-
ки») .
CHARS_23606/07 IY-4 (#5С36/37)
Адрес размещения текущего набора символов. После запуска компьютера адрес стандартного набора
15360.
Поскольку символы с кодами от 0 до 31 являются управляющими и в фонте не определяются, то адрес
действительного положения текущего набора на 256 (32x8) больше, чем указанный системной переменной
CHARS. Например, для назначения текущим фонта, расположенного с адреса 64768, в переменную CHARS
необходимо записать число 64512 (64768-256).
RASP_23608 IY-2 (#5С38)
Число, пропорциональное длительности звукового сигнала, предупреждающего о заполнении буфера ре-
дактора.
PIP_23609 IY-1 (#5С39)
Число, пропорциональное длительности звучания сигнала при нажатии наклавишу.
ERR NR_23610 IY+0 (#5СЗА)
Число, на единицу меньшее кода сообщения, выдаваемого при ошибке (включая сообщение о нормальном завер-
шении выполнения программы 0 ОК).
FLAGS_23611 IY+1 (#5СЗВ)
Отдельные биты этой переменной используются операционной системой
(см. также переменную FLAGS2).
Бит 0 установлен, если не нужно выводить пробел перед бейсик-оператором. (При выводе на экран или пе-
чати большинства операторов Бейсика перед ними выводится пробел.)
Бит 1 установлен, для вывода используется поток #3 (обычно — принтер).
Бит 2 при вводе символа в режиме курсора L, сброшен при вводе в режиме курсора К.
Бит 3 установлен при ожидании ввода символа в режиме курсора L, сброшен при ожидании ввода в режиме
К.
Бит 4 установлен если комп'ютер работает в режиме ZX-128.
Бит 5 устанавливается при нажатии на любую символьную клавишу. Код клавиши можно прочитать из пере-
менной LAST_K.
Бит 6 установлен при обработке числового выражения, сброшен при обработке символьного.
Бит 7 установлен при выполнении программы, сброшен при проверке синтаксиса введенной строки.
TV FLAG_23612 IY+2 (#5C3C)
Отдельные биты этой переменной используются для управления выводом на экран.
Бит 0 установлен при выводе на служебный экран, сброшен при выводе наосновной экран.
Бит 3 установлен, если режим вывода на экран мог измениться и требуется проверка режима.
Бит 4 установлен при выводе листинга программы.
Бит 5 установлен при необходимости очистить служебный экран (например, перед выводом сообщения).
ERR SP_23613/14 IY+3 (#5C3D/3E)
Адрес, на который устанавливается указатель стека при запуске программы обработки ошибок. Изменив значе-
ние переменной, можно подключить собственные процедуры обработки ошибок (см. «Использование подпрограмм
ПЗУ»).
LIST SP_23615/16 IY+5 (#5C3F/40)
Сохраняет адрес вершины стека в процессе вывода листинга программы.
МОРЕ_23617 IY+7 (#5С41)
Число, определяющее режим ввода с клавиатуры:
0 — очередной символ вводится в режимах курсора К, L или С;
1 — очередной символ вводится в режиме курсора Е;
2 и более — очередной и последующие символы вводятся в режиме курсора G. При значении, превышающем 2,
меняется внешний вид курсора.
NEWPPC_23618/19 IY+8 (#5С42/43)
Номер строки бейсик-программы, в которой расположен следующий выполняемый оператор.
NSPPS_23620 IY+10 (#5C44)
Номер следующего зыполняемого оператора в строке бейсик-программы. Переменные NEWPPC и NSPPS можно ис-
пользовать для перехода к произвольному оператору в бейсик-программе.
РРС_23621/22 IY+11 (#5С45/46)
Номер строки бейсик-программы, в которой расположен выполняемый оператор. При выполнении оператора в не-
посредственном режиме в переменную
записано число 65534 (#FFFE).
SUBPPC_23623 IY+13 (#5С47)
Номер выполняемого оператора в строке бейсик-программы.
BORDCR_23624 IY+14 (#5С48)
Атрибуты служебного экрана. Цветом фона служебного экрана определяется
цвет бордюра.
Е_РРС_23625/26 IY+15 (#5С49/4А)
Номер строки бейсик-программы, отмеченной курсором.
VARS_23627/28 IY+17 (#5С4В/4С)
Адрес начала области переменных бейсик-программы.
DEST_23629/30 IY+19 (#5С4Р/4Е)
Адрес первого символа имени обрабатываемой в данный момент переменной.
CHANS_23631/32 IY+21 (#5C4F/50)
Адрес начала области информации о каналах (см. «Архитектура ZX Spectrum»).
CURCHL_23633/34 IY+23 (#5С51/52)
Адрес первого байта описателя текущего канала в области информации о каналах (см. «Архитектура ZX Spec-
trum»).
PROG_23635/36 IY+25 (#5C53/54)
Адрес начала бейсик-программы. Вычитанием значения системной переменной VARS из значения PROG, вычисля-
ется длина бейсик-программы.
NXTLIN_23637/38 IY+27 (#5C55/56)
Адрес начала следующей строки бейсик-программы.
DATADD_23639/40 IY+29 (#5С57/58)
Адрес последнего считанного оператором READ объекта данных в операторах DATA.
E_LINE_23641/42 IY+31 (#5С59/5А)
Адрес начала редактируемой строки.
K_CUR_23643/44 IY+33 (#5С5В/5С)
Адрес символа редактируемой строки, на который установлен курсор.
СН_АDD_23645/46 IY+35 (#5С5Р/5Е)
Адрес следующего обрабатываемого символа в бейсик-программе. Переменная может быть полезна при использо-
вании внешних процедур обработки синтаксиса.
X_PTR_23647/48 IY+37 (#5C5F/60)
Адрес символа бейсик-строки, вслед за которым установлен знак ? при обнаружении синтаксической ошибки. В
операциях, не связанных с проверкой синтаксиса, переменная может использоваться компьютером для времен-
ного хранения другой служебной информации.
WORKSP_23649/50 IY+39 (#5С61/62)
Адрес начала рабочей области бейсик-программы.
STKBOT_23651/52 IY+41 (#5С63/64)
Адрес начала стека калькулятора.
STKEND_23653/54 IY+43 (#5С65/66)
Адрес вершины стека калькулятора.
BREG_23655 IY+45 (#5С67)
Регистр В калькулятора.
MEM_23656/57 IY+46 (#5С68/69)
Адрес области памяти, используемой калькулятором. Как правило, для этих целей используется системная об-
ласть МЕМВОТ.
FLAGS2_23658 IY+48 (#5С6А)
Отдельные биты этой переменной используются операционной системой (см. также переменную FLAGS).
Бит 0 установлен при необходимости очистить основной экран после
ввода строки.
Бит 1 установлен, если буфер принтера уже использовался.
Бит 2 установлен, если основной экран очищен.
Бит 3 установлен при использовании режима курсора С, сброшен при использовании режима курсора L. Из-
менением состояния этого бита можно программно устанавливать режимы регистров клавиатуры С или L.
Бит 4 установлен при использовании режима курсора К.
Биты 5,6,7 используются интерфейсом ZX-LPRINT Ш(при наличии такового) .
DF_SZ_23659 IY+49 (#5C6B)
Количество строк в служебном экране. Число строк в основном экране может быть увеличено до максимума (24
строки) выполнением оператора РОКЕ 23659,0. Однако, если количество строк в служебном экране меньше 2,
то при попытке вывода на него любого сообщения, например, OK или BREAK—CONT repeats, система будет вести
себя самым неприличным образом. Запись в DF_SZ нуля — один из способов защиты бейсик-npoгpaмм от остано-
ва.
S_TOP_23660/61 IY+50 (#5C6C/6D)
Номер строки бейсик-программы, начиная с которой выводится автоматический листинг (по нажатию клавиши
Enter).
OLDPPC_23662/63 IY+52 (#5C6E/6F)
Номер строки бейсик-программы, начиная с которой будет продолжено выполнение программы после ввода опе-
ратора CONTINUE.
OSPCC_23664 IY+54 (#5С70)
Номер оператора в строке бейсик-программы, начиная с которого будет продолжено выполнение программы по-
сле ввода оператора CONTINUE.
FLAGX_23665 IY+55 (#5С71)
Используется при обработке оператора INPUT.
Бит 1 установлен, если оператором INPUT вводится новая переменная.
Бит 5 установлен при работе в режиме ввода оператором INPUT, сброшен — в режиме редактирования бей-
сик-строки.
Бит 6 установлен при обработке строки, введенной оператором INPUT.
Бит 7 установлен, если выполняется оператор INPUT LINE.
STRLEN_23666/67 IY+56 (#5C72/73)
Длина обрабатываемой символьной переменной (ранее определенной) либо идентификатор числовой или новой
символьной переменной (младший байт).
T_ADDR_23668/69 IY+58 (#5С74/75)
Адрес следующего элемента в таблицах синтаксиса, расположенных в ПЗУ.
SEED_23670/71 IY+60 (#5С76/77)
Значение, используемое для вычисления псевдослучайного числа. После выполнения оператора RANDOMIZE, пе-
ременная SEED изменяется в соответствии со введенным параметром. Если RANDOMIZE использовался без пара-
метров, то в переменную SEED копируются два младших байта из переменной FRAMES.
FRAMES 23672/73/74 IY+62 (#5C78/79/7A)
Системный счетчик. После запуска (сброса) компьютера обнуляется. При работе со стандартной процедурой
обработки прерываний значение счетчика каждые 1/50 секунды увеличивается на единицу.
UDG_23675/76 IY+65 (#5С7В/7С)
Адрес начала области, используемой для размещения определяемых пользователем символов (см. «Русификация
ZX Spectrum»).
COORDS_23677/78 IY+66 (#5C7D/7E)
Координаты X и Y последней изображенной на экране точки.
P_POSN_23679 IY+69 (#5C7F)
Содержит значение 33—n, где n — номер следующей позиции печати в буфере принтера.
PR_CC_23680 IY+70 (#5С80)
Младший байт адреса области, используемой в текущий момент под буферпринтера.
NOT_USED_23681 IY+71 (#5С81)
В большинстве описаний эта переменная характеризуется как неиспользуемая (о чем говорит ее название), но
в действительности она содержит старший байт адреса области, используемой в текущий момент под буфер
принтера.
При выводе на ZX Printer операционная система подготавливает строку к печати в буфере, расположенном по
адресу, указанному переменными PR_CC и NOT_USED.
ЕСНО_Е_23682/83 IY+72 (#5С82/84)
Позиция (номер строки и колонка) следующего символа вводимой бейсик-строки.
DF_CC_23684/85 IY+74 (#5С84/85)
Адрес байта, соответствующего верхней линии точек знакоместа основного экрана, в которое будет осуществ-
лен вывод следующего символа.
DFCCL_23686/87 IY+76 (#5С86/87)
Адрес байта, соответствующего верхней линии точек знакоместа служебного экрана, в которое будет осущест-
влен вывод следующего символа.
S_POSN_23688/89 IY+78 (#5С88/89)
Координаты следующей позиции вывода на основной экран. Координаты хранятся в виде:
24—nr, 33-nc
где nr — номер строки, пс — номер столбца.
SPONSL_23690/91 IY+80 (#5С8А/8В)
Координаты следующей позиции вывода на служебный экран.
SCR_CT_23692 IY+82 (#5С8С)
Число, на единицу большее количества строк, передвигаемых по экрану вверх без запроса scroll?. Изменени-
ем содержимого этой ячейки можно добиться безостановочного скроллинга экрана при выводе текста.
ATTR_P_23693 IY+83 (#5C8D)
Постоянные атрибуты экрана, задаваемые операторами PAPER, INK, FLASH и
BRIGHT*.
MASK_P_23694 IY+84 (#5C8E)
Маска для разделения постоянных (ATTR_T) и текущих атрибутов при выводе на экран. Если в MASK_P бит ус-
тановлен, то соответствующий бит атрибута при выводе на экран не изменяется.
*)Формат хранения атрибутов соответствует формату их записи в области атрибутов, см. «Архитектура ZX Spectrum».
ATTR_T_23695 IY+85 (#5C8F)
Временные атрибуты, используемые при выводе на экран, например, оператором PRINT INK 7; PAPER 1;"...".
MASK_T_23696 IY+86 (#5C90)
Маска для разделения временных (ATTR_P) и текущих атрибутов при выводе на экран.
P_FLAG_23697 IY+87 (#5C91)
Параметры вывода на экран. Четные биты используются для постоянных
параметров, нечетные — для временных:
Бит 0/1 установлен при использовании OVER 1;
Бит 2/3 установлен при использовании INVERSE 1;
Бит 4/5 установлен при использовании INK 9;
Бит 6/7 установлен при использовании PAPER 9.
МЕМВОТ_23698...23727 (#5C92...#5CAF|
Область, используемая калькулятором для размещения значений, которые
неудобно обрабатывать через стек калькулятора.
NMIADD_23728/29 IY+118 (#5СВ0/В1)
Не используется. Авторы системы, очевидно, предполагали задействовать эту системную переменную для об-
служивания немаскируемых прерываний, но из-за допущенной неточности переменная действительно оказалась
неиспользуемой.*
*) Интерфейсы некоторых внешних устройств задействуют эту переменную. Например, интерфейс принтера ZX Lprint III хра-
нит в ней значение скорости обмена по последовательному каналу.
RAMTOP_23730/31 IY+120 (#5CB2/B3)
Последний адрес в ОЗУ, разрешенный к использованию интерпретатором Бейсика. Устанавливается оператором
CLEAR.
P_RAMT_23732/33 IY+122 (#5CB4/B5)
Адрес последнего байта физического ОЗУ. Устанавливается при инициализации компьютера после теста доступ-
ной памяти. В исправном компьютере с объемом оперативной памяти 48К переменная должна содержать значение
65535 (#FFFF).
ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ ПЗУ
Использование подпрограмм ПЗУ ZX Spectrum может значительно облегчить программирование на ассемблере.
Например, почти полностью отпадает необходимость в самостоятельном написании процедур ввода/вывода (при-
бегать к этому приходится только в случаях, когда не удовлетворяет скорость или гибкость стандартных
подпрограмм).
Ниже описаны подпрограммы ПЗУ, наиболее часто используемые на практике. Перед вызовом большинства из
них необходимо настроить регистровую пару HL' на адрес 10082 (#2762) , а в индексный регистр IY записать
адрес системной переменной ERR_NR: 23610 (#5СЗА) .*