|
ZX Club
#05
29 октября 1997 |
|
Soft group - Кое-что о подключении принтера. Порты устройств компьютера ZX-SPECTRUM.

КОЕ-ЧТО О ПОДКЛЮЧЕНИИ ПРИНТЕРА
И НЕ ТОЛЬКО
г.Черкассы (С) Борис Курицын
__________________________________________
Автор неоднократно встречался с пол-
ным непониманием или извращенным понима-
нием технологии подключения устройств к
компьютерам ZX Spectrum; поэтому в нас-
тоящем тексте описано кое-что, касающееся
этой темы.
А. Интерфейс
ПРОГРАММА - УСТРОЙСТВО
ZX Spectrum использует UNIX-подобную
концепцию каналов и потоков. В чем же она
состоит?
Канал, обозначаемый буквой латинского
алфавита, символизирует УСТРОЙСТВО. Напри-
мер, ZX Spectrum поддерживает следующие
стандартные устройства:
K - (Keyboard - клавиатура)
нечто, соответствующее понятию "кон-
соль", т.е. пульт управления; нижнее
окно дисплея по выводу, клавиатура по
вводу; является особенным для ZX
Spectrum;
S - (Screen - экран)
верхнее окно дисплея по выводу; ввод
невозможен;
P - (Printer - принтер)
принтер по выводу (именно ZX Printer);
ввод невозможен;
R - (RAM - ОЗУ)
внутрисистемный канал, предназначенный
для повышения эффективности программ;
символы, выводимые в этот канал, попа-
дают в БУФЕР РЕДАКТОРА КОМАНДНОЙ
СТРОКИ И ВВОДА;
т.е. если вывести в этот канал строку
символов, а затем вызвать встроенный
редактор (тот самый, который реализует
оператор INPUT), то эта строка будет
предложена пользователю для редактиро-
вания в нижнем окне экрана.
Подключение дополнительных устройств
раcширяет набор каналов.
Каждый канал имеет блок описания -
ракорд канала (channel record), который
содержит информацию о связывании функций
ввода/вывода системы и канала. Все ракорды
размещены последовательно в области памя-
ти, адрес начала которой записан в систем-
ной переменной CHANS (адрес 23631, слово).
За последним ракордом находится маркер
конца - байт со значением 80h.
Общий формат ракорда в нотации ассембле-
ра таков:
DEFW print_out
DEFW input_in
DEFB channel_name
DEFW internal1, internal2
DEFW record_length
DEFS record_length-11
Здесь:
PRINT_OUT
─────────
Адрес процедуры вывода символа в ка-
нал; символ в регистре A; теневой набор
регистров не должен разрушаться. Процедура
завершается командой RET. Если данный ка-
нал не поддерживает вывод информации, про-
цедура вывода заключается в инициации
ошибки:
RST 8 ; прерывание ошибки
DEFB 23 ; ошибка Invalid stream -
; неверно используется поток
INPUT_IN
────────
Адрес процедуры ввода символа из ка-
нала; символ должен помещаться в регистр
A, кроме того, должны быть установлены
флаги:
CF=1
символ действительно получен с ус-
тройства и передан через регистр A. Иначе
флаг CF должен быть сброшен в 0 и установ-
лено:
ZF=1
если устойство не готово дать сле-
дующий символ. Иначе,
ZF=0
будет означать, что в канале наступи-
ла ситуация КОНЕЦ ФАЙЛА, которая обычно
индуцируется ошибкой End of file. При
необходимости подпрограмма доступа к кана-
лу сама инициирует эту ошибку.
Такая система оповещения предусмотре-
на для того, чтобы можно было реализовать
не только операцию INPUT#, но и ввод без
ожидания INKEY$# так, чтобы для канала эти
операции никак не отличались.
Если канал на поддерживает ввод, он
должен инициировать ошибку (как показано
для print_out).
CHANNEL_NAME
────────────
Содержит символ имени канала. Естес-
твенно, они не должны повторяться.
INTERNAL
────────
Использование этих двух слов в разных
реализациях различно. Так, в Interface One
они содержат истинные адреса print_out и
input_in в дополнительном ПЗУ, а в канале
виртуального диска Spectrum 128K первое
слово содержит сигнатуру (обозначение)
пользовательского канала (число 1234h), а
второе - адрес процедуры закрытия канала
close. Эти слова можно определить как
внутренние.
RECORD_LENGTH
─────────────
Слово содержит длину ракорда канала
(минимум 11). Это позволяет хранить за ра-
кордом буфер и/или любую дополнительную
информацию, связанную с каналом. Например,
в TR-DOS, в канале "D", связанном с файлом
последовательного доступа, хранится буфер
для собираемого из символов 256-байтного
сектора, счетчик байтов в буфере, указа-
тель места на диске для записи сектора. На
приведенной выше схеме ракорда канала эта
дополнительная область обозначена как
DEFS.
Для указанных выше стандартных кана-
лов ракорд сокращен - он содержит только 3
первые строки вышеприведенной схемы. Эти
каналы первые в списке и вставлять свои
ракорды можно только за ними, перед марке-
ром конца.
Для создания места в области CHANS с
целью помещения туда нового ракорда канала
необходимо использовать подпрограмму ПЗУ
MAKE_ROOM, для удаления ракорда - подпрог-
рамму RECLAIM_2.
Второй элемент концепции - ПОТОК
(stream). Он символизирует поток данных,
направляющихся из программы в устройство
через канал. Поток обозначается номером от
0 до 15. На самом деле есть еще потоки с
номерами -3,-2,-1, но они являются потока-
ми операционной системы и могут переопре-
деляться только со специфическими целями.
Поток подключется к каналу оператором
Бейсика:
OPEN #stream,channel$
Здесь stream - номер потока, channel$
- символьная переменная с именем канала.
Например,
OPEN #6,"K"
подключит поток 6 к каналу "K". Это
можно проверить:
PRINT #6;"Hello, World!":
PAUSE 0
выведет в нижнее окно экрана привет-
ствие. То же самое со вводом:
INPUT #6;"Type line:";
LINE a$: PRINT a$
- от Вас требуется ввести строку, ко-
торая будет напечатана на вернем поле эк-
рана. Аналогично можете испробовать INKEY$
#6.
Точно также можно указать поток для
LIST:
LIST 200,#6
По окончании работы поток необходимо
закрыть:
CLOSE #6
Идея всей этой технологии состоит в
том, что программа становится независимой
от устройств ввода/вывода - она просто
пользуется потоками. А их можно переназна-
чить на требуемые в данный момент устройс-
тва.
Со стандартными каналами связаны
"стандартные" потоки: #0 и #1 с "K", #2 с
"S" и #3 с "P". Несложно догадаться, что
PRINT это тоже самое, что и PRINT#2,
LPRINT - PRINT#3, LLIST - LIST#3, INPUT -
INPUT#0 и INKEY$ - INKEY$#0.
Состояние потоков описано в ситемной
области STRMS (начинается с 23568, длина
19 слов). Каждое слово этой области описы-
вает один поток (-3,-2,-1,0,1,2 и т.д).
Оно содержит 0 для закрытого потока или
смещение от начала области CHANS до ракор-
да того канала, к которому подлючен этот
поток. Это значение увеличено на 1. Напри-
мер, описатель потока, подключенного к ка-
налу S, будет содержать значение 6, т.к.
канал S - второй в списке с сокращенным
ракордом (длиной 5 байт), а 5+1=6.
Необходимо знать, что ошибка в ПЗУ
приводит к тому, что нельзя пытаться зак-
рыть (по крайней мере, командой CLOSE#)
закрытый поток, или поток, открытый на
нестандартный канал.
Также следует учесть, что из Бейсика
Вы сможете открыть потоки только на стан-
дартные каналы, поскольку их открытие мо-
жет сопровождаться специфичными действиями
в устройстве. Поэтому TR-DOS имеет свои
команды для открытия/закрытия потоков, а
ZX Interface One расширяет возможности
оператора OPEN.
Для доступа к таблице потоков исполь-
зуется подпрограмма ПЗУ STR_DATA, для ус-
тановки текущего потока - CH_OPEN, для вы-
вода символа в поток - PRINT_A_1 (RST 16),
для считывания символа из потока -
WAIT_KEY.
Следует помнить, что подпрограмма CLS
заносит адрес совмещенного драйвера кана-
лов K, S, P в ракорд текущего используемо-
го потока. Поэтому при ее вызове обяза-
тельно должен быть текущим поток
0, 1 или 2.
Адреса и подробную информацию об упо-
мянутых выше и ниже подпрограммах ПЗУ Вы
найдете в "Полном дизассемблере ПЗУ
Spectrum" Логана и О'Хары.
Б. Конкретно о принтерах
Вполне нормально в отношении принтера
не создавать новый канал, переоткрывать на
него поток и т.д.
Ведь есть стандартный канал P, в ра-
корде которого можно просто подменить ад-
рес print_out. Саму процедуру в большинс-
тве случаев можно разместить в бывшем те-
перь буфере ZX - принтера (256 байт с ад-
реса 23296).
Нужно учесть, что в ZX Spectrum сим-
вол табуляции имеет код 6, а ее размер -
16, в то время как на "нормальных" принте-
рах код табуляции 9, а размер - 8. Поэтому
процедура print_out, получив код 6, должна
передать на принтер вместо него два кода
9. Далее, необходимо перекодировать символ
"копирайт" в другой, например, в "@".
Токены нужно передать посимвольно, взяв
тексты токенов из таблицы в ПЗУ по адресу
95h, или использовав подпрограмму
PO_MESSAGE с рекурсивным вызовом драйвера
(поскольку сама подпрограмма использует
RST 16).
Еще одна проблема: символ CR (код
13). У принтеров есть режим, когда код CR
возвращает каретку к началу строки, а LF
(код 10) переводит строку. Большинство
принтеров имеет DIP-переключатели, позво-
ляющие установить режим, когда оба дей-
ствия выполняются по коду CR, но некоторые
такого режима не имеют. Поэтому лучше та-
кой вариант предусмотреть в драйвере, а
принтер оставить в режиме "раздельной
реакции".
Наконец, для печати графики из прог-
рамм необходим вариант драйвера, который
не делает никаких перекодировок.
В. Совместимость
Аппаратная несовместимость, вообще, -
вещь весьма неприятная. Поэтому здесь при-
водится таблица адресов портов различных
устройств, которые нельзя использовать в
новых устройствах для совместимости. Де-
шифрацию адресов портов рекомендуется про-
изводить по обоим байтам адреса.
Порты устройств
компьютеров ZX Spectrum
Адрес Назначение
─────────────────────────────────
7FFD управление конфигурацией
(только 128 кб)
BFFD, музыкальный процессор
FFFD AY-3-8912 или аналог
xxFE по чтению - клавиатура
по записи - звук,
магнитная лента,
BORDER дисплея
1F Kempston Joystick
Interface
3F Dk'Tronics Light Pen
FB ZX Printer
Порты ZX Interface 1
EF control status
E7 data
F7 RS-232 / Network
Порты ZX Interface 2
EFFE IF2 joystick 1
F7FE IF2 joystick 2
Порты Beta Disk Interface
(доступ блокирован,
несовместимости не вызывают)
FF control / state
1F command / status
3F track
5F sector
7F data
Специальный порт
FF этот порт специально не реализо-
ван; поскольку на его запрос не
отвечает ни одно устройство, он
всегда содержит значение систем-
ной шины данных в высокоимпедан-
сном состоянии, равное FF. Но в
фирменном Sinclair среди значений
FF иногда "проскальзывают" значе-
ния текущего выводимого на дис-
плей атрибута, что позволяет иг-
рам более точно синхронозирова-
ться с обновлением видеопамяти -
именно по этой причине некоторые
игры не работают на Sinclair -
совместимых моделях.
Другие статьи номера:
Похожие статьи:
В этот день... 1 ноября
Dnieprobite #03,
ACNews #13,
ZX Time #10,
Echo #07,
Funeral #1.5,
Info Guide #02,
ZX Guide #02,
Plutonium #14,
Crossroads #07,
ZX Club #09,
Black Crow #02,
Spectrum Expert #01,
C-Net Week #03,
Maximum #46,
Review #01,
Anigdot #46,
Nicron #05,
Spectrum Land #02,
Crysral Dream #01,
Platinum #02,
Oberon #02,
Echo #01,
Emulate #03,
ZX Format #01,
Speccy #02,
ZX Panorama #01