_ОРГАНИЗАЦИЯ ПАМЯТИ
Постоянное запоминающее устройство ZX Spectrum имеет объем 16 К и занимает младшие адреса
памяти #0000...#3FFF. В нем расположены: тест, проверяющий работоспособность компьютера при
включении питания; интерпретатор языка Бейсик; знакогенератор; программы, обеспечивающие вы-
вод на экран, связь процессора с клавиатурой и др. Некоторые внешние устройства могут отклю-
чать стандартное ПЗУ, заменяя его своей памятью.
Остальные 4 8К адресного пространства занимает оперативное запоминающее устройство (адреса
#4000...#FFFF). Причем в большинстве случаев для пользовательских программ не может быть от-
ведено все пространство ОЗУ — часть его используется под экранную область и область систем-
ных переменных Бейсика.
В табл. 5 приведена карта распределения памяти ZX Spectrum. Справа указаны физические ад-
реса областей памяти, расположение которых жестко фиксировано. Адреса других областей могут
меняться в зависимости от наличия внешних устройств и работающих в данный момент программ.
Местоположение этих областей определяется системными переменными (см. «Системные перемен-
ные»), имена и адреса которых приведены в таблице слева. Области, наличие которых не обяза-
тельно для работы операционной системы ZX Spectrum, отмечены тонкими линиями.
_Экранная область памяти
Размер экрана в ZX Spectrum составляет 25 6 точек по горизонтали и 192 по вертикали. Опера-
ционной системой вывод символов на экран осуществляется в стандартные знакоместа 8x8 точек.
Таким образом, экран делится на 24 символьные строки по 32 знакоместа в каждой (см. рис.
13).
Для вывода изображения используется экранная область памяти объемом 6К и область атрибутов
— 7 68 байт. Каждый байт экранной области определяет состояние 8 расположенных горизонтально
одна за другой точек (бит 7 соответствует левой точке, бит 0 — правой). Если какой-либо бит
в байте установлен, то точка, определяемая этим битом, принимает цвет тона, если бит сброшен
— цвет фона. Байты, соответствующие строкам экрана, расположены в памяти не последовательно.
Первые 32 байта экранной области задают слева направо верхнюю строку, следующие 32 байта —
9-ю сверху, следующие — 17-ю и далее через 8 строк вплоть до 57-й. Затем расположены байты,
соответствующие строкам 2-й, 10-й и т. д. до 58-й. Таким образом, со смещением на одну и ша-
гом в 8 строк задаются верхние 64 строки, то есть треть экрана. Аналогично, начиная соответ-
ственно с 65-й и 12 9-й строк, определяются средняя и нижняя трети экрана.
В ZX Spectrum атрибуты (цвет тона, цвет фона, яркость и мерцание) задаются не для отдель-
ной точки, а для знакоместа. Каждому знакоместу в области атрибутов соответствует один байт,
в котором:
Биты DO...D2 определяют цвет тона;
Биты D3...D5 определяют цвет фона;
Бит D6 установлен в режиме повышенной яркости (задается одновременно и для тона, и для фо-
на);
Бит D7 установлен в режиме мерцания.
Байты атрибутов расположены в памяти последовательно. Первые 32 байта атрибутов соответст-
вуют верхней символьной строке, следующие 32 — второй символьной строке сверху и далее до
конца экрана.
Приведенные ниже программы помогут Вам разобраться со строением экрана ZX Spectrum. Первая
из них демонстрирует соответствие битов ячейки памяти экранной области точкам на экране:
10 BORDER 5: PAPER 7: INK 9: CLS :REM подготовка экрана
20 INPUT "bit numbers 0...7 ";b:REM ввод номера бита
30 LET n=2h b:REM вычисление «веса» бита
40 POKE 16384, n:REM запись байта, содержащего установленный в единицу бит, в первую ячейку экранной об-
ласти
50 GOTO 20
Следующая программа закрашивает экран, последовательно записывая в ячейки экранной области
значение 255. Работу программы можно приостановить, нажав любую клавишу.
10 BORDER 5: PAPER 7: INK 9: CLS :REM подготовка экрана
20 FOR a=16384 TO 22527: REM переменная перебирает все адреса экранной области
30 PRINT AT 6,6;" ";АТ 6,6^;:REM вывод адреса
40 РОКЕ а,255: REM запись в экранную область по адресу а
50 IF INKEY$<>"" THEN GO TO 50:REM пауза
60 NEXT a: REM завершение цикла
Соответствие байтов атрибутов знакоместам на экране демонстрирует следующая программа:
10 BORDER 7:PAPER 7:INK 7:CLS :REM цвет экрана белый
20 LET n=703:LET c=1:GO SUB 110:REM заполнение основного экрана
30 LET n=63:LET c=0:GO SUB 110:REM заполнение служебного экрана
40 FOR a=22528 TO 23295:REM указывает адреса атрибутов
50 LET b=INT(a/256):REM Ь присваивается значение 0...255
60 POKE a,b:REM запись очередного значения в область атрибутов
70 PRINT PAPER 7;INK 0;AT 5,5;b;:REM печать Ь
80 IF INKEY$<>"" THEN GO TO 50:REM пауза
90 NEXT a:REM завершение цикла
100 STOP :REM останов программы
110 FOR a=0 TO n:REM подпрограмма заполнения экрана
120 PRINT #c;"*";:REM заполнение экрана символом *
130 NEXT a: REM завершение цикла
140 RETURN :REM возврат из подпрограммы заполнения экрана
_Буфер принтера
Стандартный ZX Printer имеет одну иголку, которая в процессе печати последовательно прохо-
дит 25 6 позиций по горизонтали. Таким образом, символьная строка печатается за 8 проходов.
Подготовка символьной строки к печати происходит в буфере принтера.
Очень часто буфер принтера используется не по назначению, а как дополнительные 25 6 байт
памяти, например, при адаптации программ к дисковым системам или для размещения загрузчиков.
Но, занимая буфер под свою программу, следует учитывать, что она не будет работать на Spec-
trum 12 8, в котором область буфера принтера используется для размещения дополнительных сис-
темных переменных.*
_Каналы и потоки
Операторы языка Бейсик, такие как PRINT, INPUT и некоторые другие, работают несколько
сложней, чем это может показаться на первый взгляд. Выполните, например, оператор:
PRINT #0;"Test message": PAUSE 0
Сообщение будет выведено на служебный экран. Если заменить число после символа # на 2, то
вывод осуществится на основной экран, если подставить 3 — сообщение будет напечатано на
принтере.
Для достижения большей гибкости при организации ввода / вывода в ZX Spectrum нет твердо уста-
новленного соответствия между операторами ввода/вывода и внешними устройствами. Связь между ними
устанавливается с помощью системы каналов и потоков — каждый канал связан с конкретным устройст-
вом ввода/вывода, поток же указывает на канал, через который будут передаваться данные.
*) Работа с принтером в Spectrum 128 организована иначе.
Оператор ^ Поток ^ Канал ^ Внешнее устройство
Информация о существующих каналах хранится в области ОЗУ, на которую указывает системная
переменная CHANS (23631/32). Каждый канал задается так называемым описателем канала — блоком
памяти, состоящем не менее чем из пяти ячеек этой области. Первые два байта описателя со-
ставляют адрес программы вывода на связанное с каналом внешнее устройство, следующие два —
адрес программы ввода, пятый байт — символьное имя канала. Здесь же может храниться и другая
информация о канале, но операционная система использует только упомянутые пять байт.
Системная переменная CURCHL (23633/34) содержит адрес первого байта описателя текущего ка-
нала (канала, через который осуществляется ввод/вывод в данный момент). Записав в эту пере-
менную адрес первого байта описателя другого канала, можно установить его текущим.
При запуске компьютера операционной системой задаются четыре стандартных канала, которые
обеспечивают:
"К" — вывод на вспомогательный экран и ввод с клавиатуры;
"S" — вывод на основной экран;
"R" — запись байта в рабочую область памяти, адресуемую переменной K_CUR (23643/44);
"Р" — вывод байта на ZX Printer.
Описатели стандартных каналов занимают первые 2 0 байт в области информации о каналах. Их
порядок менять не следует. Каналы "S", "R" и "Р" работают только на вывод (при попытке ввода
управление передается на подпрограмму обработки ошибок (#15С4), выдающую при этом сообщение J
Invalid I/O device).
При написании собственных процедур ввода/вывода, которые впоследствии будут «подключены» к
какому-нибудь каналу, следует учитывать требования, предъявляемые к ним операционной систе-
мой ZX Spectrum. Обмен байтами (передача/прием) между операционной системой и подпрограммами
ввода/вывода осуществляется через аккумулятор. Программа ввода, кроме того, использует неко-
торые флаги: при получении байта устанавливает флаг переноса CY; если байт на данный момент
не введен, флаг CY сбрасывается и устанавливается флаг Z; при обнаружении конца файла или
ошибки сбрасываются флаги CY и Z, после чего системой будет выведено сообщение 8 End of file.
Заметим, что при ожидании ввода (флаг Z установлен) система не контролирует клавишу Break,
об этом нужно позаботиться в программе ввода. Программы ввода/вывода являются подпрограммами
относительно операционной системы ZX Spectrum.
В Бейсике не существует операторов для задания новых каналов, для этого необходимо написать
специальную программу в кодах (или на Бейсике, используя оператор РОКЕ). Не рекомендуется
«подключать» программы ввода/вывода к уже существующим каналам (то есть помещать в описатель
канала адреса новых программ ввода/вывода), лучше задать новый канал. Количество каналов ог-
раничено лишь свободным пространством ОЗУ.
Для осуществления ввода/вывода недостаточно только задать канал, необходимо еще и связать
его с конкретным потоком. Только после этого, указывая в бейсик-операторах ввода/вывода но-
мер потока (число, записываемое после символа #), через канал можно будет передавать и при-
нимать информацию.
В операционной системе ZX Spectrum имеется 19 потоков, которым присвоены номера от -3 до 15.
После запуска компьютера системой открываются (связываются с одним из каналов) 7 потоков с
номерами от -3 до 3 — эти потоки переназначать не рекомендуется. Потоки от —3 до —1 недос-
тупны из Бейсика (хотя поток -3 связан с тем же каналом, что и потоки 0 и 1, а поток —2 — с
тем же каналом, что и поток 2). Текущий поток устанавливается с помощью подпрограммы, распо-
ложенной по адресу #1601 (см. «Использование подпрограмм ПЗУ»).
Информация о связи потоков с каналами хранится в области системных переменных STRMS, начиная
с адреса 235 68 (#5С10). Первые две ячейки этой области указывают на канал, связанный с пото-
ком -3, следующие две — с потоком -2 и т. д. В этих ячейках хранятся увеличенные на единицу
смещения первого байта описателя канала, с которым связывается поток, относительно начала
области информации о каналах (системная переменная CHANS). Если поток не связан ни с одним
из каналов, ячейки обнулены, и считается, что поток свободен (закрыт). На рис. 14 приведена
диаграмма связи потоков и стандартных каналов после запуска компьютера.
Для открытия потока из Бейсика служит оператор OPEN #n,"t", где n — номер потока (0...15),
at — имя канала, связываемого с потоком. Например, после выполнения оператора
OPEN #7,"S"
при выводе в поток 7 информация будет передаваться в канал "S", то есть на основной экран:
PRINT #7;"Printing in 7th stream"
Поток п закрывается оператором CLOSE #n, например:
CLOSE #7
Если после закрытия потока Вы попытаетесь вывести в него информацию, то получите сообщение
об ошибке О Invalid stream.
К сожалению, с помощью операторов OPEN и CLOSE могут быть подключены только каналы "S",
"К" и "Р". При попытке использовать другие имена каналов выдается сообщение об ошибке*.
Ввод информации осуществляется оператором INPUT #n либо функцией INKEY$ #n. Используя
INPUT, помните, что оператор работает точно также, как и при вводе с клавиатуры. Например,
выполнение INPUT #4;а$ приведет к тому, что перед передачей информации из потока 4 в пере-
менную а$ через этот поток будут выведены две кавычки.
Операторы LIST и PRINT по умолчанию выводят информацию в поток 2 (на экран), a LLIST и
LPRINT — в поток 3 (на принтер), хотя при явном указании номера потока и те и другие могут
использоваться для вывода на любое устройство (например, оператор LLIST #2 будет выводить
листинг программы на экран).