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  -
         совместимых моделях.



Другие статьи номера:

От редакции - К процессу создания газеты подключилась группа Demention. Вопрос об электронном журнале на Алтае.

Soft group - Кое-что о подключении принтера. Порты устройств компьютера ZX-SPECTRUM.

Железо - О Covox'ах, General Sound'е и Sound Drive 2.

ZX-Поппури - Процедура "OPTION SELECTOR". О процедуре "Звезды", используемой в газете.

Club IM2 - Терминология и теоритические аспекты прерываний и многозадачности.

Club IM2 - Конкурс на лучший сценарий игры типа DIZZY.

Virus - О конкурсе по игре "Вирус 2".

Enjoy - Анекдоты...


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

Похожие статьи:
Железо - распайка разьема принтера EPSON порт CENTRONICS.
Железо - Описание блока памяти от принтера Robotron CM 6329.01 M. Часть 1.
Капля припоя - Использование принтера СМ-6337 с компьютером Скорпион ZS 256 Turbo+.

В этот день...   8 декабря