Ранее автор уже рассказал о том, как с помощью джойстиков от различных видеоприставок и пакета программ DirectPadPro (DPP), разработанного в 1999 г. Эрлом Филхауэром (Earle F. Philhower), управлять работой не только компьютерных симуляторов “приставочных” игр, но и других прикладных программ.
Была сделана оговорка, что джойстики от игровой приставки “Sega” работают далеко не со всеми компьютерами. За прошедшее время автор упомянутой статьи не только разобрался в причинах несовместимости, но и, изменив схему подключения такого джойстика к порту LPT компьютера, доработал программы пакета DirectPadPro. Несовместимости больше не существует!
При подключении джойстика от видеоприставки “Sega” к LPT-порту по схеме, рекомендованной автором пакета DPP, современные IBM-совместимые компьютеры, в отличие от их морально устаревших версий, не реагируют на нажатия кнопок UP/Z и DOWN/Y джойстика. Согласно этой схеме ее можно найти в архиве dpadpr50.zip [1] в файле под названием genesis.gif упомянутые кнопки соединены с линиями STROBE и AUTOFEED порта LPT, состояние которых отображают разряды 0 и 1 регистра управления принтером. Для программиста это порт 37АН (LPT1) или 27АН (LPT2). Объяснения причины несовместимости не удалось найти ни на одном Интернет-сайте. Пришлось внимательно изучить устройство адаптеров LPT-порта персональных компьютеров различных поколений.
Рис.1.
На рис. 1 ,а приведена типовая схема входных и выходных цепей одного разряда регистра управления “старого” LPT-адаптера, применявшегося в IBM PC/XT, в их клонах и в некоторых компьютерах более поздних поколений. С контактом разъема непосредственно соединен выход с открытым коллектором инвертора DD1, нагруженный резистором R1.
Сюда же подключен и вход инвертора DD2. При стандартном использовании регистра для вывода сигналов управления принтером логический уровень на выходе элемента DD2 повторяет поданный на вход элемента DD1, а уровень на контакте разъема Х1.1 им инверсен.
Программный драйвер джойстика “Sega” использует “запрещенный прием”. Записью лог. 0 в соответствующий разряд регистра управления на выходе элемента DD1 установлен высокий уровень напряжения. В этом состоянии выходной транзистор инвертора DD1 закрыт и не влияет на работу узла. Подключенная к контактам разъема Х1 кнопка джойстика SB1, будучи нажатой, соединит вход инвертора DD2 с общим проводом.
В результате чтение регистра управления процессором компьютера даст в соответствующем разряде 0 при отпущенной кнопке и 1 при нажатой. В современных компьютерах входные и выходные цепи регистра управления построены по иной схеме, показанной на рис. 1,6, причем элементы DD1.1—DD1.3 находятся, как правило, внутри БИС. Логика стандартной (только на вывод) работы узла остается прежней, но описанный выше прием уже не проходит. Поэтому компьютер и не реагирует на нажатия кнопок UP/Z, DOWN Д джойстика.
Усовершенствованная схема соединения джойстика от видеоприставки “Sega” с компьютером показана на рис. 2. В ней три отличия от оригинала.
- Во-первых, сигнал от кнопки DOWN/Y подан на свободный ранее контакт 15 (ERROR) вилки Х1.
- Во-вторых, введены транзисторы VT1 и VT2, на базы которых поданы сигналы от кнопок UP/Z и LEFT/X, а их коллекторы соединены между собой и с контактом 10 (ACKNLG) вилки Х1. Эмиттеры транзисторов соединены соответственно с контактами 1 (STROBE) и 14 (AUTOFEED) вилки Х1.
- В-третьих, добавлен диод VD8, уменьшающий вероятность проявления “тиристорного” эффекта в КМОП-микросхеме джойстика.
Положение кнопки DOWN/Y теперь отображается в разряде 3 регистра состояния принтера по адресу 379h для LPT1 или 279h для LPT2. В разряде 6 того же регистра в зависимости от уровней напряжения, установленных программно на эмиттерах транзисторов, отображается положение кнопки UP/Z или LEFT/X. Например, если на контакте 1 низкий, а на контакте 14 — высокий уровень, транзистор VT2 постоянно закрыт, a VT1 открыт при высоком и закрыт при низком уровне на линии UP/Z. При инверсии уровней на контактах 1 и 14 постоянно будет закрыт транзистор VT1, a VT2 открыт при высоком и закрыт при низком уровне на линии LEFT/X.
Рис.2.
Питание на джойстик поступает по цепи VCC через разделительные диоды VD1—VD8 от восьми линий LPT-порта, на семи из которых (контакты 3—9 вилки Х1) высокий логический уровень присутствует постоянно. Ток потребления джойстика зависит от числа одновременно нажатых кнопок и не превышает, как правило, 2...4 мА. Напряжение питания джойстика при этом не выходит за пределы 3,5...3,8В (VD1—