Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ZX Spectrum для пользователей и программистов.doc
Скачиваний:
56
Добавлен:
28.09.2019
Размер:
1.92 Mб
Скачать

__________________________________Буфер принтера

Стандартный ZX Printer имеет одну иголку, которая в процессе печати последовательно проходит 256 позиций по горизонтали. Таким образом, символьная строка печатается за 8 проходов. Подготовка символьной строки к печати происходит в буфере принтера.

Очень часто буфер принтера используется не по назначению, а как дополнительные 256 байт памяти, например, при адаптации программ к дисковым системам или для размещения загрузчиков. Но, занимая буфер под свою программу, следует учитывать, что она не будет работать на Spectrum 128, в котором область буфера принтера используется для размещения дополнительных системных переменных.*

______________________________________Каналы и потоки

Операторы языка Бейсик, такие как 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.

Описатели стандартных каналов занимают первые 20 байт в области информации о каналах. Их порядок менять не следует. Каналы "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, начиная с адреса 23568 (#5С10). Первые две ячейки этой области указывают на канал, связанный с потоком -3, следующие две — с потоком -2 и т. д. В этих ячейках хранятся увеличенные на единицу смещения первого байта описателя канала, с которым связывается поток, относительно начала области информации о каналах (системная переменная CHANS). Если поток не связан ни с одним из каналов, ячейки обнулены, и считается, что поток свободен (закрыт). На рис. 14 приведена диаграмма связи потоков и стандартных каналов после запуска компьютера.

№ потока

STRMS

(CHANS)

Имя канала

-3

-2

-1

0

1

2

3

4

..........

..........

15

23568

23570

23572

23574

23576

23578

23580

23582

.........

.........

23604

(#5С10)

(#5С12)

(#5С14)

(#5С16)

(#5С18)

(#5С1А)

(#5С1С)

(#5С1Е)

.........

.........

(#5С34)

#01,#00

#06,#00

#0В,#00

#01,#00

#01,#00

#06,#00

#10,#00

#00,#00

.........

.........

#00,#00

#F4,#09

#А8,#10

#4В

#F4,#09

#С4,#15

#53

#81,#0F

#С4,#15

#52

#F4,#09

#С4,#15

#50

#80

"К"

"S"

"R"

"Р"

Маркер конца

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