Важной характеристикой любого современного ПК, определяющей возможность подключения к нему внешнего периферийного устройства, будь то джойстик, мышь или принтер, является наличие в составе его базового системного программного обеспечения специальных подпрограмм, называемых кратко драйверами, задача которых - обслуживание всего процесса обмена информацией между ПК и устройством.
П.А. Чирков (г. Львов)
Преобразование интерфейсов в системе Бейсик-БК
Чем более разнообразен набор интерфейсов, поддерживаемых ПЭВМ, тем проще решается задача сопряжения последней с внешним устройством (ВУ). Именно по этой причине хороший компьютер должен оснащаться несколькими типами интерфейсов. Очевидно, однако, что реально реализуемый ассортимент не может быть слишком большим, и в случае относительно недорогих моделей ПЭВМ выбор ограничивается, как правило, дуэтом последовательного интерфейса типа RS-232C и параллельного интерфейса типа ИРПР либо CENTRONICS. Сказанное в полной мере справедливо и для интерфейсов, которыми оснащаются ВУ.
В случае, когда в интерфейсных наборах ПК и ВУ имеются одинаковые типы интерфейсов, проблема их сопряжения не вызывает затруднений ни на программном, ни на аппаратном уровнях. Ситуация резко осложняется, если такое взаимно однозначное соответствие отсутствует. В этом случае для обеспечения совместной работы ПК и ВУ необходимо решать иную задачу, а именно задачу преобразования интерфейсов. Её оптимальное решение в каждом отдельном случае может быть найдено одним из трёх способов: программным, аппаратным и программно-аппаратным.
Какие же типы интерфейсов из упомянутых выше реализованы в ПК БК-0010, в каких ситуациях возникает проблема их преобразования у пользователя данного компьютера и, наконец, каков один из возможных программно-аппаратных вариантов разрешения этой проблемы в среде Бейсик-БК - на эти вопросы на очень актуальном примере подключения к БК печатающего устройства (ПУ) с последовательным интерфейсом и призвана кратко ответить предлагаемая статья.
Последовательный интерфейс БК
В ПК БК-0010 драйвер последовательного интерфейса с протоколом обмена RS-232C входит в состав базовой системной программы монитор, зашитой в ПЗУ К1801РЕ2-017. Доступ к драйверу осуществляется с помощью набора запросов программных прерываний ЕМТ 40, 42, 44, 46, 50, обеспечивающих возможность задания скорости передачи информации в канале интерфейса в диапазоне 50 - 9600 бод, а также организации процесса обмена данными между компьютером и ВУ как одиночными байтами, так и их массивами. В случае двунаправленной передачи информации используется четырёхпроводной канал интерфейса. Две его линии служат для приёма и передачи собственно данных, две другие - для приёма и передачи сигналов готовности.
Для подключения к ПК принтера с последовательным интерфейсом достаточно использовать лишь две линии, по одной из которых компьютер передаёт информацию на ПУ, а по другой ПУ передаст ПК сигнал готовности к приёму данных. Для реализации подобной односторонней передачи данных используются запросы программных прерываний ЕМТ 42, 46. Последний запрос в БК-0010 основан на циклическом вызове подпрограммы обработки прерывания ЕМТ 42. В этой подпрограмме, располагающейся в области адресов 1174748 - 1175648, указанного ранее ПЗУ, перед передачей каждого информационного байта проверяется готовность ПУ к его приёму. Сигнал готовности подаётся на седьмой разряд регистра управления ВУ - вывод 12 микросхемы D12 системной платы БК, от которого предварительно отсоединена "земля" компьютера. Адрес регистра - 1777168. При нулевом потенциале на выводе микросхемы информационные биты сначала поступают на четвёртый разряд регистра управления ВУ - вывод 13 микросхемы D13, - а затем по каналу интерфейса передаются на ПУ.
Таким образом, с аппаратной точки зрения для подключения к БК принтера с последовательным интерфейсом стандарта RS-232C (или ему подобных V24, стык С2) достаточно иметь трёхпроводной соединительный кабель, в котором к двум выше описанным линиям добавляется линия "земля". С программной точки зрения организация вывода данных на ПУ легко осуществляется путём размещения в программе пользователя запроса программного прерывания ЕМТ 42 или ЕМТ 46.
Параллельный интерфейс БК
Аппаратной основой для организации параллельного интерфейса в БК-0010 служит программируемый параллельный порт ввода-вывода, который специально предназначен для подключения к компьютеру ВУ пользователя и имеет для этого выход на внешний разъём ХТ5 "УП". Соответствие контактов разъёма сигналам порта приведено в [1]. Доступ к порту отдельно по записи и отдельно по чтению информации осуществляется с помощью соответственно двух 16-разрядных регистров, имеющих в адресном пространстве БК одинаковый адрес 1777148. В отличие от последовательного канала передачи данных аппаратная часть параллельного канала компьютера не обеспечена "штатной" программной поддержкой. Это означает, что в базовой системной программе монитор БК отсутствует какая-либо подпрограмма, которая бы обслуживала параллельный обмен информацией между ПК и ВУ пользователя в соответствии с одним из стандартных протоколов обмена. Иными словами, при работе пользователя в среде программы монитор, написание требуемого драйвера параллельного интерфейса - обязанность самого пользователя. Именно так и поступает каждый программист БК, желающий реализовать в своей программе вывод информации на параллельный принтер (принтер с параллельным интерфейсом).
Адрес |
Команда |
Код (в виде слова) |
Код (в виде двух смежных байтов) |
---|---|---|---|
122766 |
BIC #177000,R0 |
042700 |
105.300 |
|
|
177000 |
376.0 |
122772 |
BIS #400,R0 |
052700 |
125.300 |
|
|
000400 |
1.0 |
122776 |
BIT #400,@R5 |
032715 |
65.315 |
|
|
000400 |
1.0 |
123002 |
BEQ 122776 |
001775 |
3.375 |
123004 |
MOV R0,@R5 |
010015 |
20.15 |
123006 |
BIT #400,@R5 |
032715 |
65.315 |
|
|
000400 |
1.0 |
123012 |
BNE 123006 |
001375 |
2.375 |
123014 |
CLR @R5 |
005015 |
12.15 |
123016 |
CMPB 2136,#100 |
126727 |
255,327 |
|
|
057114 |
136,114 |
|
|
000100 |
0.100 |
123024 |
BLE 123032 |
003402 |
7.2 |
123026 |
CLRB 2136 |
105067 |
212.67 |
|
|
057104 |
136.104 |
123032 |
RTS R7 |
000207 |
0.207 |
Рис. 1
Вильнюсский вариант транслятора Бейсик имеет "штатную", зашитую в ПЗУ подпрограмму обслуживания параллельного интерфейса с протоколом обмена ИРПР. Эта подпрограмма, размещающаяся в постоянной памяти БК в области адресов 1227668 - 1230328 (распечатка которой в формате отладчиков серии PROT Прохорова В.В., приведена на рис. 1), обеспечивает программный интерфейс оператора вывода алфавитно-цифровой информации LPRINT на параллельный принтер. Поскольку дальнейшее изложение статьи базируется на алгоритме работы этого драйвера, рассмотрим приведённую выше подпрограмму в деталях.
Перед началом работы подпрограммы в младший байт регистра R0 помещается предназначенный для вывода на принтер байт данных, в регистр R5 записывается адрес параллельного порта ввода-вывода - восьмеричное число 1777148. Работа драйвера начинается с обнуления семи старших разрядов регистра R0 и установки младшего разряда (8-го разряда регистра R0) старшего байта регистра в единичное состояние - две первые команды BIC, BIS на рис. 1. Восьмой разряд регистра R0 выполняет в подпрограмме драйвера функции управляющего сигнала передатчика SC (см. табл. 1). Далее следует команда проверки установки 8-го разряда входного регистра порта ввода-вывода (команда BIT), выполняющего функции управляющего сигнала приёмника АС. Активное состояние сигнала АС, которому соответствует нулевой потенциал на контакте В31 разъёма ХТ5, означает, что ПУ требует от компьютера новых данных. В случае положительного результата проверки активности состояния линии АС командой MOV производится запись информационного младшего байта регистра R0 и его единичного восьмого разряда в выходной регистр параллельного порта ввода-вывода. В соответствии с протоколом обмена ИРПР активное состояние линии SC (которому соответствует нулевой потенциал на контакте А28 разъёма ХТ5) сигнализирует о том, что данные на информационных линиях ВД00-ВД07 интерфейса достоверны и ПУ может их считывать.
Номер контакта разъёма ХТ5 |
Обозначение сигнала разъёма ХТ5 |
Наименование сигнала интерфейса |
Направление передачи сигнала |
---|---|---|---|
А16 |
ВД00 |
Данные |
От ПК к ПУ |
А13 |
ВД01 |
Данные |
От ПК к ПУ |
В12 |
ВД02 |
Данные |
От ПК к ПУ |
В10 |
ВД03 |
Данные |
От ПК к ПУ |
В05 |
ВД04 |
Данные |
От ПК к ПУ |
В07 |
ВД05 |
Данные |
От ПК к ПУ |
В06 |
ВД06 |
Данные |
От ПК к ПУ |
А07 |
ВД07 |
Данные |
От ПК к ПУ |
В31 |
ВВ08 |
АС |
От ПУ к ПК |
А28 |
ВД08 |
SC |
От ПК к ПУ |
А,В (11, 18, 19) |
Общий |
S0 |
От ПК к ПУ |
Проверка того, что ПУ считало поступившую информацию, выполняется двумя следующими командами драйвера BIT и BNE (начала которых соответственно расположены по адресам 1230068 и 1230128). При условии считывания информации ПУ переводит линию АС в неактивное состояние. Откликом подпрограммы драйвера на это в части её взаимодействия с принтером является восстановление исходного состояния выходного регистра порта ввода-вывода посредством команды обнуления регистра CLR (ячейка 1230148). В исходном состоянии выходного регистра на всех контактах разъёма ХТ5 компьютера, соответствующих сигналам ВД00-ВД15, устанавливается напряжение логической единицы TTL-логики.
В заключение следует сказать, что подпрограмма драйвера параллельного принтера в системе Бейсик-БК не анализирует состояние ещё одной (четвёртой) линии управления интерфейса ИРПР, сигнализирующей о готовности ПУ к работе, - линии А0.
Проблема преобразования интерфейсов
Широкое распространение малогабаритных ПУ, подключаемых к ПЭВМ, не обошло стороной и БК. Сегодня совместно с БК работают такие ПУ как ’’Консул", "D-100", "УВВПЧ", "Роботрон" и др. Системные и прикладные программы, реализующие вывод информации на ПУ, имеют различные типы драйверов интерфейсов и, следовательно, не всегда могут быть использованы с конкретным устройством печати. Некоторые программы, такие, как монитор страничного просмотра текстовых файлов из серии МОНСТР Прохорова В.В. или отладчики из серии PROT того же автора, обслуживают как параллельный, так и последовательный каналы вывода данных на ПУ. Другие же как, например, программы для работы с принтером УВВПЧ, разработанные Радченко Л.И., рассчитаны только на параллельный интерфейс с протоколом обмена ИРПР. Подобная ситуация очень характерна для нынешнего состояния разработки программ обслуживания ПУ, и, видимо, для этого у создателей программного обеспечения компьютера БК имеются объективные основания - слишком небольшая оперативная память этого ПК.
Какой же выход может найти пользователь БК, если ему необходимо воспользоваться готовой программой обслуживания ПУ, не имеющей соответствующего ему драйвера? Один из возможных вариантов такого выхода - попытаться разыскать автора данной программы и уговорить его выполнить необходимую доработку. Однако такая возможность носит скорее вероятностный характер, да к тому же и продолжительный во времени. Другой вариант, наиболее часто реализуемый на практике, - пойти на небольшое нарушение прав автора программы и осуществить её доработку самостоятельно. Подобные изменения в программах, написанных в кодах процессора ПК, обычно выполняются с помощью какого-либо отладчика и состоят в замене имеющейся подпрограммы драйвера ПУ на подпрограмму пользователя.
Например, если в программе обслуживания принтера имеется драйвер параллельного интерфейса с протоколом обмена ИРПР (в качестве такового в программах компьютера БК, по существу став стандартом, используется подпрограмма драйвера устройства печати транслятора Бейсик-БК, приведённая на рис. 1), а ПУ, подключаемое к БК, имеет последовательный канал ввода-вывода информации стандарта RS-232C, то необходимая доработка программы будет состоять в нахождении в ней с помощью отладчика блока операторов, подобного блоку, показанному на рис. 1, и его замене на оператор запроса программного прерывания ЕМТ 42 и оператор выхода из подпрограммы RTS. Доработанная таким, по сути своей браконьерским способом программа будет прекрасно работать с ПУ, имеющим последовательный интерфейс, однако в силу нелегальности произведённых в ней изменений сможет приносить пользу лишь для очень ограниченного круга пользователей.
Предложенный способ замены программных блоков в отдельных случаях может решить проблему преобразования интерфейсов, но только для программ, в которых блоки драйверов либо операторы вызова этих драйверов хранятся в устройстве памяти компьютера с произвольной выборкой. Но что же делать с программами, полностью зашитыми в БИС ПЗУ, как это имеет место с транслятором Бейсик-БК? Как, например, решить задачу вывода информации на принтер с последовательным интерфейсом из программы, написанной на языке Бейсик-БК, с помощью оператора Бейсика LPRINT? Разумеется, возможны различные громоздкие, "лобовые" способы решения этой проблемы - будь они чисто программные или чисто аппаратные. В предлагаемой же статье описывается очень компактный программно-аппаратный метод решения проблемы преобразования параллельного способа передачи информации с протоколом обмена ИРПР (использующийся для обслуживания ПУ в системе Бейсик-БК), в последовательный способ передачи данных, с протоколом обмена RS-232C.
Программно-аппаратный метод преобразования интерфейсов в системе Бейсик-БК
Основная идея предлагаемого метода преобразования параллельного интерфейса Бейсик-БК в последовательный состоит в организации внешнего аппаратного прерывания работы драйвера ПУ, приведённого на рис. 1, и последующего выполнения требуемой подпрограммы обслуживания последовательного интерфейса. Для прерывания работы драйвера параллельного ПУ, зашитого в БИС ПЗУ транслятора, удобно воспользоваться незанятой в БК сигнальной линией разъёма пользователя ХТ5 - ПРТ. Переход потенциала на входе этой линии из состояния логической единицы в состояние логического нуля TTL-логики вызывает прерывание программы, выполняемой процессором компьютера, по вектору 1008. Следовательно, если поместить адрес драйвера пользовательского интерфейса в ячейку 1008 и затем в определённый момент из подпрограммы обслуживания параллельного интерфейса транслятора сынициировать подачу на вход линии ПРТ потенциала низкого уровня, то сформулированная выше проблема преобразования интерфейсов станет разрешимой. Ответ на вопрос о том, как сынициировать переход сигналов на линии ПРТ из высокого уровня в низкий (и обратно), не вызовет затруднений, если вспомнило о том, что аппаратная поддержка драйвера устройства печати в трансляторе реализована на основе программируемого параллельного порта ввода-вывода, к которому в драйвере есть необходимые обращения, позволяющие сформировать с помощью выходного регистра порта требуемые переходы сигналов.
Принципиальная электрическая схема аппаратной части преобразователя интерфейсов представлена на рис. 2 и 3 в виде двух вариантов. Как видно на рис. 3, второй вариант схемы не содержит ни одной радиодетали, однако, как это будет видно из дальнейшего изложения, может потребовать для своей программной поддержки более длинной подпрограммы. Простота схем аппаратной части преобразователя позволяет сразу обратиться к рассмотрению их программной поддержки.
Рис. 2
Рис. З
Поскольку в подпрограмме, представленной на рис. 1, имеются только два оператора непосредственного воздействия на выходной регистр параллельного порта ввода-вывода, содержащиеся в ячейках постоянной памяти БК 1230048 и 1230148, то именно эти два временных момента выполнения подпрограммы и можно использовать для организации внешнего аппаратного прерывания по вектору 1008 и установки линии ПРТ в исходное состояние логической единицы. При указанных на схемах 2 и 3 соединениях выполнение первого оператора из ячейки 1230048 вызывает появление на линии ПРТ сигнала с низким уровнем, после чего управление передаётся подпрограмме пользователя, адрес которой предварительно записан в ячейке 100.
Для варианта схемы, показанной на рис. 2, текст подпрограммы обработки прерывания в формате ассемблера МИКРО-10 приведён на рис. 4. Первая команда BIS инициирует разрядку конденсатора С1. Следующая команда запроса программного прерывания осуществляет передачу байта данных на ПУ по каналу связи с последовательным интерфейсом. Команда очистки CLR выходного регистра порта ввода-вывода, во-первых, формирует короткий единичный импульс на контакте В31 разъёма ХТ5 (линия АС интерфейса ИРПР) и, во-вторых, приводит в исходное состояние высокого уровня линию запроса прерывания ПРТ. Продолжительность единичного импульса на контакте В31 должна быть такой, чтобы после выхода из прерывания по команде RTI процессор БК успел дойти до выполнения команды CLR драйвера параллельного ПУ, расположенной в случае транслятора Бейсик-БК в ячейке 1230148. Таким образом, длина подпрограммы обработки прерывания для первого варианта схемы составляет всего лишь 16 байтов.
Рис. 4 |
Рис. 5 |
Текст подпрограммы обработки прерывания по вектору 1008, предназначенной для второго, более простого варианта аппаратной части преобразователя интерфейсов представлен на рис. 5.
Идея алгоритма подпрограммы состоит в том, чтобы обойти две команды BIT и BNE драйвера, параллельного ПУ (в случае транслятора Бейсик-БК, расположенных в ячейках постоянной памяти 1230068 - 1230128) чисто программным способом. При этом условии из схемы преобразователя, показанной на рис. 2, можно убрать формирователь единичного импульса, собранный на элементах R1, С1 и ограничиться лишь двумя перемычками, которые устанавливаются на разъёме кабеля ПУ со стороны БК, что и сделано на схеме рис. 3.
Для того чтобы понять работу данной подпрограммы, необходимо вспомнить, что отклик процессора БК на аппаратное прерывание эквивалентен следующей последовательности операторов ассемблера (см. рис. 6):
MOV PS, -(SP) MOV PC, -(SP) MOV @#100,PC MOV @#102,PS
Рис. 6
Сначала в стек заносится слово состояния процессора, затем содержимое счётчика команд, которое, как нетрудно догадаться, после выполнения команды драйвера транслятора MOV R0,@R5 (инициирующей прерывание) равно числу 1230068. Новые значения счётчика команд и слова состояния процессора выбираются из ячеек памяти 1008 и 1028 соответственно. Выполнив указанные на рис. 6 команды, процессор компьютера приступает к выполнению подпрограммы обработки прерывания, т.е. подпрограммы, приведённой на рис. 5, если в ячейке 1008 содержится её адрес.
Первая команда подпрограммы поддержки преобразователя интерфейсов пересылает байт данных на линию последовательного канала связи с ПУ. Следующая команда сохраняет содержимое регистра R0 в стеке. Далее следует группа из трёх команд, назначение которых - записать в регистр R0 значение счётчика команд, которое было сохранено в стеке при выполнении процессором компьютера последовательности операторов, показанных на рис.6. Не будет ошибки, если в случае транслятора Бейсик-БК вышеуказанную тройку команд заменить одним оператором MOV #123006,R0. Следующие три команды (INC, СМРВ и BNE) осуществляют поиск адреса ячейки драйвера ПУ, содержащей команду короткого перехода BNE. Известно [2], что все команды короткого перехода транслируются в одно машинное слово. При этом в старшем байте содержится код операции, а в младшем задаётся смещение относительно текущего значения счётчика команд процессора. Код операции команды BNE равен 2, и, значит, для нахождения её адреса в драйвере параллельного ПУ содержимое старших байтов драйвера, располагающихся сразу после ячейки с адресом из R0, следует сравнивать с 2, что и сделано в рассматриваемой подпрограмме. Работа подпрограммы завершается замещением значения счётчика команд процессора, которое он имел в момент входа в подпрограмму обработки прерывания, адресом ячейки памяти, следующей за командой BNE.
Заключение
Предложенные в статье два способа программно-аппаратного преобразования параллельного интерфейса ПУ в последовательный были успешно апробированы в среде транслятора Бейсик-БК с помощью короткой тест-программы, содержащей последовательность команд LPRINT. В качестве ПУ к компьютеру БК-0010 подключался принтер "Роботрон СМ6329.01", имеющий последовательный интерфейс с протоколом обмена V24.
По ходу изложения статьи уже отмечалось, что драйвер параллельного устройства печати транслятора Бейсик-БК, по существу, стал стандартом такого драйвера ПУ при разработке прикладного и системного программного обеспечения, предназначенного для компьютера БК. По этой причине приводимые в статье тексты подпрограмм обработки прерывания не "привязывались" жёстко к каким-то конкретным адресам драйвера транслятора и в силу этой универсальности обладают определённой избыточностью. Последнее замечание касается второй подпрограммы обработки прерывания, приведённой на рис. 5. В случае привязки алгоритма этой подпрограммы для работы только с транслятором Бейсик-БК, зашитого в стандартный комплект БИС ПЗУ типа КР1801РЕ2-106, 107, 108, возможно существенное сокращение числа её операторов до трёх. Оптимизированный с этой целью вариант подпрограммы (длиной 10. байт) имеет следующий вид:
Команда |
Код |
---|---|
ЕМТ 42 |
104042 |
MOV #123014,(SP) |
012716 |
|
123014 |
RTI |
000002 |
Рис. 7
При работе в среде транслятора Бейсик-БК следует учитывать тот факт, что прерывания, инициируемые при нажатии клавиши СТОП, приводят к переинициализации вектора 1008. Это, в свою очередь, приводит к необходимости каждый раз восстанавливать содержимое ячейки 1008. Для облегчения выполнения такой операции была разработана небольшая (длиной 2768 байтов) программа V24.BIN, коды которой приведены на рис. 8.
012701 |
001166 |
004767 |
000136 |
122700 |
000061 |
001037 |
004767 |
000136 |
012701 |
001226 |
004767 |
000114 |
012701 |
000060 |
012702 |
000012 |
120001 |
001403 |
005201 |
077204 |
000767 |
122700 |
000060 |
001003 |
012700 |
000012 |
000402 |
162700 |
000060 |
012701 |
001254 |
104012 |
004767 |
000052 |
105721 |
005002 |
104020 |
012700 |
001136 |
012701 |
001000 |
012702 |
000004 |
012021 |
077202 |
000457 |
104042 |
012716 |
123014 |
000002 |
005002 |
104020 |
104006 |
104016 |
000207 |
012700 |
000012 |
000773 |
151360 |
143717 |
140722 |
146715 |
151311 |
153717 |
152301 |
020330 |
146313 |
157300 |
024040 |
026461 |
140744 |
037451 |
026440 |
000000 |
147756 |
142715 |
020322 |
146313 |
157300 |
020301 |
030050 |
034455 |
037451 |
026440 |
000040 |
050017 |
045517 |
020105 |
032066 |
026045 |
047446 |
030061 |
030060 |
000000 |
|
|
|
Рис. 8
Данная программа, загруженная с 10008-го адреса командой BLOAD "V24",R, сначала по желанию пользователя программирует один из десяти ключей клавиатуры (автор для этой цели использует девятый ключ) для вывода на экран монитора строки текста POKE 64%,&01000, а затем переписывает программный блок, показанный на рис. 7, с адреса 10008 (в стек транслятора). После установки вектора 1008 оператором POKE описанный в статье программно-аппаратный преобразователь интерфейсов готов к работе.
Наконец можно отметить, что замена в описанных в статье подпрограммах обработки прерывания оператора ЕМТ 42 на требуемый пользователю программный интерфейс позволяет согласовать с драйвером параллельного ПУ, стандарта транслятора Бейсик-БК, широкий класс интерфейсов с протоколом обмена, отличным от RS-232C.
Литература
- Осетинский Л.Г. и др. ФОКАЛ для микро- и мини-компьютеров. - М.: Машиностроение, 1988. - 303 с.
- Сингер М. Мини-ЭВМ FDF-11: Программирование на языке ассемблера и организация машины. - М: Мир, 1984.-272 с.