Gc-helper.ru

ГК Хелпер
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Розетка джойстики до денди

Джойстик для денди на stm32

Дата: 12 Октября 2016. Автор: Алексей

Насмотрелся я тут в ютубе как народ играет на старых, добрых приставках из моего детства, а именно на Dendy. И меня так торкнула ностальгия, что я решил тоже поиграть. Встал вопрос. Купить приставку, коих сейчас огромное количество. Но что делать с играми. Нужно покупать кучу картриджей. Можно конечно заказать многоигровку у Кластера, но это опять покупать. Короче я остановился на эмуляторе для ПК. К тому же в любом случае нужен выход видео изображения, а монитор под это подходит как раз кстати. Скачал эмулятор, ромы игр, запустил и поиграв с пол часа ощутил себя тапером немого кино. Ну невозможно играть в Dendyвские игры с клавиатурой. Короче решил я изобразить джойстик для Dendy. Черт возьми, я же собрал себе 3D принтер, нужно его эксплуатировать))) А если честно, то меня на эту идею подбил Кластер со своим видео «Пока все играют 2». Ближе к концу он подключил джойстик к компу по USB, а потом для приставки собрал свой джойстик. Зы, посмотрев я решил скрестить эти два девайса))) А именно сделать свой джойстик для ПК через USB. И так поехали.

Для этого нам понадобится МК. У меня с USB есть куча STM32, а именно возьмем народный STM32F103C8T6. Так, Кластер использовал библиотеку LUFA с готовым функционалом джойстика. А я не хочу быть копирастом и нужно изобрести что-нибудь другое. Из HID устройств, коими и является джойстик, остаются еще мышь и клавиатура. Ну мышь соответственно не подойдет, а вот USB клавиатура как раз. Просто нужно прикрутить к каждой кнопке джойстика свою клавишу, а в эмуляторе прописать их в настройках. Первое с чего нужно начать, так это узнать как работает USB клавиатура. Роем интернет. Час, два, три. Вашуж мать. Про PS/2 протокол написано столько, что можно энциклопедию по ней написать, а вот про USB молчек. Но все таки я нарыл. Официальная документация на Device Class Definition for Human Interface Devices (HID). Правда на басурманском но ничего. Я растолкую что к чему.

Протокол работы USB клавиатуры.

Передача данных происходит пакетно, то есть сама клавиатура ничего передать не может по причине того что она является девайсом. Девайс не может начать передавать данные сам, он лишь подготавливает их заранее, а когда хост(ПК) его об этом попросит, то девайс эти данные отдает. Из чего состоит пакет для передачи хосту. В пакете присутствует 8 байт. Первый байт отвечает за кнопки Shift, Alt, Ctrl, причем как за левые так и за правые. Второй байт передает что-то для клавиатуры OEM. Я честно не знаю что это и в доке пишут что для простой клавиатуры в этом байте должен быть всегда 0. Оставшиеся 6 байт передают код шести нажатых клавиш. Да, да, можно одновременно передавать 6 символов одновременно(

Правда не все клавиатуры так делают, а лишь передают последний зажатый символ

). Для того чтобы передать код нажатой клавиши, нужно записать заранее ее в один из шести байт и ждать пока хост не спросит. Как только спросил, передать этот пакет. Далее необходимо посмотреть, не нажата ли клавиша снова и если нет, то обязательно сказать об этом хосту. Для этого нужно в пакете исключить присутствие данного кода отпущенной клавиши. Если этого не сделать, то хост будет постоянно получать код нажатой клавиши и будет эффект удержания клавиши клавиатуры.

Теперь разрабатываем алгоритм. Пока хост занимается своими делами, нам нужно посмотреть на все кнопки джойстика и записать в пакет коды нажатых кнопок. Перед началом записи обязательно нужно обнулить пакет. После сборки данных о кнопках и записи всего этого добра, передаем эти данные хосту по его просьбе. А теперь самое интересное. Хост не может опрашивать клавиатуру как приведение, он должен это дело проворачивать в определенное время. А если быть точнее, то через какой-то оговоренный промежуток времени. Вот тут и начинаются шаманства с USB. Разбираться доскональна как работает USB я не горел желанием. Будет время почитаю, а вот чтобы срубиться с HID устройством мне пришлось полистать Агурова и почитать несколько статей и форумов. Здесь я расскажу лишь о том как я это понял и если что не так ляпну знающих попрошу меня поправить. И так USB.

На пальцах. С учетом того что шина является универсальной, то она понятия не имеет кто к ней подключился. Есть только физический уровень, который говорит хосту что подрубилось устройство. С учетом того что только хост может рулить передачей данных, то ему после подключения нового девайса не терпится узнать кто это. Для этого хост спрашивает у девайса данные о себе. Все запросы хоста к девайсу называются дескрипторы. Дескриптор это обычный массив с определенными данными в своих ячейках. Разбирать все дескрипторы я не буду, это нудно и если кому интересно почитайте Агурова. Здесь рассмотрим только самое важное. После обнаружения девайса хост просит ему представится, для этого девайс кидает хосту дескриптор устройства. Хост читает и начинает вникать кто это. Затем хост просит рассказать о конфиге девайса, на что девайс передает ему дескриптор конфигурации. Хост получив его определяет кто же это и подгружает необходимый драйвер. А затем определившись с девайсом, хост просит дескриптор репорта. Так как у нас HID устройство, а именно клавиатура, то дескриптор репорта один. А теперь давайте начнем программить. Открываем STM32CubeMX и.

Все. Сохраняемся и генерим проект для IAR.

Умная программа сгенерит нам код, который нужно будет по минимуму допилить. Начнем с дескрипторов девайса. Расскажем кто он и что он. Для этого открываем файл usbd_customhid.c.

И находим строчку вида За ней будет куча текста. Боятся не надо, нам нужна будет всего лишь одна строка. Находим строку вида: И меняем 0х00 на 0х01, таким образом сказав что мы будем клавиатурой.

Затем нам нужно заполнить дескриптор репорта. Для этого топаем в файл usbd_custom_hid_if.c

И в строке Двойку меняем на 63.

Все. Теперь мы можем общаться с хостом как клавиатура. Если скомпилить этот проект и загрузить в МК, то компьютер определит наш девайс как HID устройство, а именно как клавиатура.

Я специально PID задал как E2E4 чтобы легче было ее найти.)))

Читать еще:  Смс для отключения розетки

Топаем в main. В самом начале подключим файл с функционалом для общения с хостом. Затем ниже напишем. Что здесь написано. Для начала создаем псевдонимы функций чтения состояния каждой кнопки. Это для удобства, ведь понять BUTTON_UP проще чем HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3), согласитесь.
Теперь куда бы мы не записали псевдоним, на этом месте будет функция чтения бита порта, а именно возвращенной ей значение 1 или 0. Затем создаем псевдоним нажатой или не нажатой кнопки. Это нужно будет для функции которая будет собирать пакет перед отправкой. Далее идет массив байт с кодами кнопок. Нужно усечь, что клавиатура не возвращает ASCII код символа, она возвращает код нажатой клавиши и ей пофиг что на данной клавише нацарапано, хоть китайский иероглиф. Последним идет массив из 8 байт. Это как раз пакет для передачи хосту. На этом немного обострим внимание. Пакет хосту передается от первого элемента массива к последнему, поэтому первый элемент будет нести в себе шифты, альты и всю муру доп кнопок, а конкретно у нас нули, второй элемент всегда ноль, а с третьего до восьмого наши кнопки.

Далее идут две строки для работы с функциями USB. Первая нужна для передачи указателя на структуру USB Device handle, а вторая нужна для получения состояния прочитанного пакета. Далее инициализируем функцию для записи или удаления нажатой кнопки. В самом низу после функции main пишем тело нашей функции. В качестве аргументов функция получает код клавиши и состояние нажата или нет.
Помните #define BUTTON_ON 1

Следующий шаг это опрос клавиш и обработка их состояния. Делаем это все в бесконечном цикле while(1)<>. Здесь мы по очереди проверяем нажата ли клавиша или нет и в зависимости от ее состояния записываем в пакет для передачи. Проверив все кнопки отправляем пакет хосту. Но вот здесь немного по подробнее. Наш МК работает на большой скорости и проверку состояния клавиш и сбор пакета для отправки он делает очень быстро, а с учетм того что период опроса у нас в дескрипторе прописан 20мс, то мы успеем поменять данные о кнопках между запросами. Чтобы такого не случилось функция USBD_CUSTOM_HID_SendReport() может нам вернуть одно из трех значений, а именно Все хорошо, Я занята и Все упало. Из этого следует что можно просто в бесконечном цикле ждать ответа Все хорошо, а потом заново проверять кнопки. Так конечно делать не правильно, в данном цикле нужно еще проверять на Все упало или на отсутсвие занятости, но на практике за все время передача данных не разу не упала. Так что все это заливаем в МК и радуемся.

Джойстики Dendy в Севастополе

Беспроводной геймпад Microsoft Controller for Xbox One совместим с Android, Xbox One, ПК. Это необходимый аксессуар для заядлого геймера. Испытайте уникальную энергию, точность и удобство беспроводного геймпада Xbox One. Импульсные курки предоставляют вибрационную обрат.

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад Microsoft Xbox One Crete Wireless Con.

Джойстики выполнены в оригинальной форме и подходят для восьмибитных приставок Dendy. Обладают удобными ручками и предотвращают выскальзывание. Модель с узким 9 пиновым разъемом. В набор входят два джойстика серого цвета

Самовывоз, Почта РФ, Курьером, Логистическая компания

Набор из двух джойстиков Dendy 07-JS

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад Magistr 21-JS

Футболки изготавливаются на заказ. Используется экологичная HD печать. Выдерживает неограниченное количество стирок. Изображения имеют насыщенный и яркий цвет, хорошо носятся и переносят влагу

Самовывоз, Почта РФ, Курьером, Логистическая компания

Футболка Dendy Joystick для мальчиков

Проводной геймпад для ПК и PlayStation 3 Defender Omega USB.прекрасная модель для начинающих геймеров. При доступной цене геймпад имеет все необходимые функциональные клавиши и комфортно лежит в руках;12 функциональных кнопок;2 аналоговых джойстика. Два мини джойстика п.

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад defender Omega

Геймпад проводной 8 bit Dendy (золотой-красный) узкий разъем 9 pin по выгодной цене

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад проводной 8 bit Dendy (золотой-красны.

Контроллер игровой для игровых приставок Retro Genesis. Совместимость: -Retro Genesis 8 Bit Classic, -Retro Genesis 8 Bit Wireless, -Retro Genesis 8 Bit HD, -Retro Genesis 8 Bit HD Wireless. Переключение между джойстиками P1 и P2 невозможно. Особый 7-пиновый ассиметричн.

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад проводной Retro Genesis Controller P1.

Проводной геймпад для ПК подключение через USB виброотдача 2 мини-джойстика, крестовина

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад Oklick GP-200M

геймпад, USB, вибрация, совместимость: ПК

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад DVTech Horror Dragon (JS66)

геймпад, беспроводной, вибрация, совместимость: ПК, PS3, Android

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад CBR CBG 956

Невероятно точный беспроводной контроллер DualShock 4 обеспечивает удобные и интуитивно понятные способы игры благодаря изменённой сенсорной панели с индикатором цвета световой панели.Кнопка Share позволяет записывать и публиковать лучшие игровые моменты одним нажатием.

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад Sony Dualshock 4 v2 Color

геймпад, вибрация, совместимость: PS2

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад Sony Dualshock 2

Игровая приставка Dendy Master 195 игр + джойстики. 8bit по выгодной цене

Самовывоз, Почта РФ, Курьером, Логистическая компания

Игровая приставка Dendy Master 195 игр + джой.

геймпад, USB, совместимость: ПК

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад Logitech G Gamepad F310

Проводной геймпад Defender Game Master G 2 для ПК и PlayStation 3 это прекрасная модель для начинающих геймеров.· при доступной цене геймпад имеет все необходимые функциональные клавиши и комфортно лежит в руках.· 10 кнопок, кнопки Turbo | Clear | Auto· 8-позиционный пе.

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад defender Master G2

геймпад, совместимость: Wii, Wii U, для устройств: Nintendo Entertainment System

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад Nintendo Classic Controller Mini

Проводной геймпад для ПК подключение через USB виброотдача 2 мини-джойстика, крестовина, 12 кнопок

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад CBR CBG 910

Проводной геймпад для ПК подключение через USB без мини-джойстиков, крестовина, 10 кнопок

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад CBR CBG 905

Беспроводной джойстик Defender Blast USB для игр на смартфоне. Прекрасная модель для начинающих геймеров. При доступной цене геймпад имеет все необходимые функциональные клавиши и комфортно лежит в руках.- Bluetooth-соединение с устройствами на базе ОС Android:смартфон.

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад Defender Blast

Беспроводной геймпад для ПК, Android 2 мини-джойстика, крестовина

Читать еще:  Как снять корпус розетки

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад GEN GAME S5

Контроллер Joy-Con (левый) для консоли Nintendo Switch с официальной лицензией Nintendo Легко крепится на вашу консоль Кнопки блокировки (лево, D-pad, кнопки минус и захвата, разъем для подключения «рельсов») Перед использованием устройства, пожалуйста, обновите.

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад HORI D-PAD Controller Mario for Ninte.

Беспроводной геймпад для ПК, PS4 виброотдача 2 мини-джойстика, крестовина датчик движения

Самовывоз, Почта РФ, Курьером, Логистическая компания

Геймпад Sony Dualshock 4 v2 (CUH-ZCT2E) Fortn.

Подключаем джойстики от Dendy к PC через Arduino

Думаю многие из вас помнят те славные времена, когда мы часами рубились в танчики, черепашки ниндзя, батлтодс энд даблдрагон и еще пару десятков других суперских игр на Денди. Это было шикарное время! Большинство игр были чертовски сложные, но даже несмотря на это, неудача за неудачей, мы, все равно, шли к своей цели и начинали игру заново, чтобы уж сегодня-то пройти ее до конца.

Поностальгировав всласть, я решил, что очень хочу поиграть в Dendy и поиграть хочу на ноутбуке, но не на клавиатуре, а на старом добром джойстике.

Ниже я опишу, с какими проблемами я столкнулся и как их решил.

Немного поясню, почему именно так мне захотелось поиграть. Приставка у меня сохранилась и она отлично работает, но осталась всего пара картриджей(остальные раздал друзьям). А играть на клавиатуре в игры денди, ну это как-то совсем не айс.

Встала проблема, как подключить джойстик от Денди к ноутбуку.

Немного погуглив, я понял, что в основном это решается подключением через LPT порт и использованием готовых драйверов, но у меня ноутбук, и мне это не подходит. Тут я вспомнил, что у меня есть плата Arduino Uno и я решил, что пойду своим путем и буду использовать именно ее.

0. Определение распиновки на джойстике

Первая проблема оказалась в том, что коннекторы у джойстиков внутренние, а все описания распиновок найденные в интернете, были для внешних коннекторов.

Найти спецификацию на мою noname денди мне не удалось, поэтому я стал рассматривать внутреннюю плату, чтобы найти там питание и землю, и понять какие из пяти контактов на джойстике с ними соединяются. С этим я справился быстро. Оказалось это два крайних контакта.

К Ардуино, я подсоединил все напрямую, питание — питание 5В, земля — земля, остальные три контакта подсоединил к 2, 3 и 4 цифровому пину.

1. Описание протокола работы джойстика

Оказалось не так-то просто найти эту информацию. Лишь несколько сообщений на паре форумов. Лично мне помогла эта запись: code.google.com/p/avrtoys/wiki/joystick, а именно этот код: avrtoys.googlecode.com/svn/trunk/joystick/main.c. А вот ссылка на упомянутую в этой записи заметку в журнале Радио: ftp.radio.ru/pub/arhiv/1996/06-96/46-6-1996.gif. Из всего этого я сделал вывод, что нужно подать сигнал на Latch, а потом 8 раз подавать сигнал на Clock и каждый раз считывать значение с Data, в котором после каждого Clock-а будет содержаться информация о следующей кнопке джойстика.

2. Настройка среды

Если у вас уже все настроено или вас устраивает Arduino IDE, можете перейти к 3 пункту.
Не знаю, как вас, но лично меня официальная Arduino IDE ужасно угнетает, поэтому коротко расскажу, как использовать свою любимую IDE.
Первым делом я скачал исходники Arduino IDE и нашел там код отвечающий за компиляцию и аплоад прошивки. Потратив немного времени я выделил все команды, которые там используются:

В приведенной выше команде, при линковке, используется библиотека libArduino.a, ее можно получить скомпилировав все *.c и *.cpp файлы из папки с хэдэрами и собрав все объектники в один архив. А можно просто запустить Arduino IDE, скомпилировать любой проект и скопировать файл /tmp/build*.tmp/core.a. Это будет абсолютно эквивалентно.
Все эти команды актуальны для Arduino Uno, для других ардуин следует изменить некоторые параметры.

Теперь используя эти команды можно легко настроить свою IDE, на автоматическую компиляцию и загрузку прошивки.

3. Написание кода прошивки

Здесь нужно было лишь определить какие из 2, 3 и 4 пина отвечают за Latch, Clock и Data. Это я решил методом проб и ошибок. Предполагаем, что 4 это Data, и делаем Serial.println(digitalRead(4)), если при нажатии кнопок есть какая-то реакция, значит это оно. Остальные 2 контакта определились, когда уже была написана прошивка, если все работает значит угадали, нет — меняем местами.

В результате я получил 1 байт содержащий в себе информацию о всех 8-ми кнопках джойстика, о каждой в соответствующем бите. У меня получилось следующее расположение: A, B, Select, Start, Up, Down, Left, Right. После этот байт отправляется на компьютер, где принимается и обрабатывается моим «драйвером».
Несложно заметить, что можно легко подключить второй джойстик.

4. Написание «драйвера»

Здесь нужно было принять этот самый байт от Arduino и эмулировать нажатия кнопок клавиатуры. Да-да, нажатия на джойстике будут обрабатываться, как нажатия на клавиатуре, хорошо это или плохо.
В качестве языка программирования я выбрал Python. Простой и эффективный, полагаю, он отлично подошел для этой задачи.

Единственная проблема, которая здесь возникла это дребезг контактов джойстика. Я ее решил путем введения временного интервала, наступающего после смены состояния кнопки, в течение которого состояния не изменяется. Хватило 0.05 с.

Для эмуляции нажатия кнопок клавиатуры я использовал утилиту xte, идущую в комплекте Xautomation. Она очень проста в использовании, вот пример: xte ‘keydown Left’ . За дополнительной инфорацией смотрите man xte.

Для выхода из драйвера я использовал состояние, когда нажата вся крестовина целиком. Этому состоянию соответствует число 0xf0.

5. Ура! Играем!

Все! Осталось лишь настроить эмулятор денди, я выбрал FCEUX.
Указываем в настройках те клавиши, которые указаны в драйвере ииии вспоминаем детство!

Заключение

На самом деле есть и другие, возможно, более эффективные способы использования Ардуино в данной ситуации. Например, если у вас Arduino Leonardo, то можно использовать объект Keyboard для прямой посылки команд клавиатуры на компьютер. Так же можно, как я понял, перепрошить Ардуино так, чтобы она отображалась, как джойстик/клавиатура/мышь и так же напрямую посылать команды. Вот туториал: http://mitchtech.net/arduino-usb-hid-keyboard/. Впрочем, мой способ меня полностью устраивает и результатом я более чем доволен.

Как ни крути, но Ардуино это замечательная платформа для подобных экспериментов.
Теперь осталось только собрать все это в виде отдельного устройства.

Розетка джойстики до денди

Архитектура Денди не изобилует большим (а может и достаточным) количеством портов ввода/вывода. Программно под порты внешней периферии выделены две ячейки из адресного пространства CPU (на аппаратном уровне архитектуры). Это регистры с адресами $4016 и $4017. Аппаратных же линий и того меньше – а именно: 3 линии (бита) на выход и 5 + 2 линии на вход. Опрос линий чисто программный.

Читать еще:  Лючки кабельные для розеток

Вывод – 3 бита “OUT” (непосредственно с процессора), адресуются путем записи значения в регистр $4016, младшие биты. Бит 0 используется в качестве стробирующего сигнала-защелки состояния джойстиков, обоих сразу (см. ниже).

Ввод – порт $4016 “J1” (чтение), аппаратно присутствуют только два младших бита. Бит D0 выведен на «Порт A» и используется для чтения последовательного кода состояния джойстика 1. Бит D1 выведен на «Порт B».

Ввод – порт $4017 “J2” (чтение), аппаратно присутствуют 5 младших бит (два старших бита используются pAPU – см. ниже).

Наиболее распространены (в России) модели приставок Денди с двумя «разъёмами для джойстиков» (так их называют в быту) по 15 контактов каждый. Встречаются варианты и с двумя 9-ти контактными разъемами, или шнуры джойстиков могут быть «вделаны» в приставку (как у оригинального Famicom) — в этих случаях есть еще один 15-ти штырьковый разъём («порт расширений»). Условимся называть разъём для подключения первого джойстика «Порт A», второго «Порт B» (каждый по 15 или 9 штырьков). Если оба порта имеют по 9 штырьков (или джойстики неразъемные), то есть третий (или первый) «Порт C » – 15-ти штырьковый, который дублирует «Порт B» и содержит дополнительные сигналы. Если, как в большинстве случаев для Денди, оба разъема имеют 15 контактов, то к «Порту A» подключено не более шести, а ко второму – все 15 (в том числе и сигналы с «Порта A», правда, на другие контакты), т.е. получается что разъем «второго» джойстика — «Порт В», какбы объединен с портом расширений — «Порт С».

В общем случае «Порт A» предназначен для подключения «первого» джойстика (аппаратно возможно и подключение светового пистолета — «Zapper»). К «Порту B & C » (порту расширений) подключаются все другие периферийные устройства («второй» джойстик, световой пистолет, разветвитель на 4 джойстика и многое другое), фактически на него выведены все линии портов ввода/вывода Денди (за исключением одного из «Порта A»). Теперь подробнее об аппаратной реализации и программной модели.

Распиновка портов (по разъему совместимых с DB-15) приведена на рисунке.

«Порт A» ( 15 контактов )

« Порт B & C» (15 контактов )

Представленный «ассортимент» и распиновка портов типичны как для Dendy Junior, Dendy Classic .

При каждом чтении из $4016 или $4017 процессор выдает сигналы (#OE), разрешающие чтение из буферов портов (для каждого порта свой сигнал – процессором предусмотрено аппаратно, см. Приложение 5). Соответственно считываются значения входных линий. Кстати опять, ничто не мешало разработчикам NES (Денди) сделать на каждом порту по 8 линий на вход.

О других сигналах в портах ввода/вывода:

SND IN – аналоговый выход с pAPU (см. ниже) – например, в световой пистолет-пулемет («фирменный» от Стиплера) встроен динамик, из которого раздается звук стрельбы (этакий «фидбэк»), также на рукоятке данного пистолета-пулемета, помимо переключателя одиночной и автоматической стрельбы, была продублирована кнопка «B» (в некоторых играх, как то «Operation Wolf», таким пистолетом-пулеметом можно было не только постреливать вражье очередями, но и метать в них гранаты);

#IRQ – линия запроса пользовательского прерывания CPU (которая выведена и сюда и на разъем картриджа). Периферийное устройство может быть как источником прерывания, так и его обработчиком (для собственных нужд), если источником является, например, электроника на картридже (маппер);

CLK1/CLK2 – синхроимпульс опорной (тактовой) частоты процессора (1.79МГц для PAL) – аналогично сигналу #M2 в разъеме картриджа;

Некоторые (как правило, «не Денди») приставки имеют девяти контактные разъемы (совместимые с DB-9) для джойстиков, распиновка которых может быть такой:

«Порт A» (9 контактов)

«Порт B» (9 контактов)

А вместе с этим и 15-ти контактный порт расширений, для подключения другой периферии помимо джойстиков (или второго джойстика в 15-ти контактном «исполнении»):

«Порт C » (15 контактов)

«Стандартные» джойстики.

Оригинальные джойстики NES ( Famicom ) имеют по 8 клавиш. Джойстик, предназначенный для использования в качестве «второго» в оригинальном варианте ( Famicom ) не имеет кнопок Select и Start, но зато имеет микрофон с регулятором громкости для него (усиленный сигнал с которого подается в приставку). Джойстики китайских клонов, а также российского клона консоли — Денди — имеют, как правило, кнопки Select и Start на обоих джойстиках, так как допускают их подключение к любому из портов (для одинокого геймера второй джойстик был запасным). Помимо этого мы привыкли и воспринимаем как должное наличие турбо-вариантов кнопок A и В. Вещь, несомненно, удобная в ряде игр – но рассматривать их стоит как «чит» — т.к. в оригинальных версиях консоли их нет. Разумеется, что турбо-кнопки не генерирует каких-либо состояний в системе отличных от тех, что определяет факт нажатия обычных кнопок A и B – просто используя турбо-кнопки нет необходимости «долбить» по клавишам. Да и не любой геймер сможет так быстро, равномерно и беспристрастно «долбить» как встроенный триггер 😉

В примере наиболее распространенного варианта консоли: с двумя разъемами под джойстики по 15 ног в каждом (см. рисунок выше) — «стандартные» джойстики используют контакты: 1, 8, 9, 12 и 15.

Нажатие на клавиши джойстиков не вызывает в приставке никаких событий. Опрос джойстиков чисто программный, его частота должна выбираться программистом, исходя из необходимой точности и скорости реакции пользователя на события системы. Естественно, что очень частый опрос может замедлить работу системы, да и не стоит забывать, что джойстик это механическое устройство, а пользователь не может работать со скоростью ЭВМ (пусть даже такой как NES).

И так – как было сказано выше, для опроса состояния джойстиков используются два порта из адресного пространства CPU — $4016 и $4017. Алгоритм следующий: сначала необходимо «зафиксировать» состояние кнопок в сдвиговом регистре джойстиков (обоих сразу, если оба подключены). Для этого формируется строб, «защелкивающий» этот регистр – т.е. по адресу $4016 младший бит сначала устанавливается в единицу, а затем в ноль (строб). Далее можно прочесть состояние кнопок джойстика на момент «защелкивания». Информация считывается в последовательном коде (из сдвигового регистра джойстика). Младший бит порта $4016 – первый джойстик (Порт A), порта $4017 – второй джойстик (Порт B). Информация считывается в следующей последовательности:

голоса
Рейтинг статьи
Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector