ZX Spectrum для пользователей и программистов 1991 г.

Архитектура ZX Spectrum - память. Организация экранной памяти. Каналы и потоки.


_ОРГАНИЗАЦИЯ ПАМЯТИ

Постоянное запоминающее устройство 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 будет выводить
листинг программы на экран).




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Editorial
Аторы - Авторы журнала.
AD&D - описания монстров AD&D (часть вторая).
Party - Funtop`98.
Рассказ - Элеонора.

В этот день...   21 ноября