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 - совместимых моделях.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября