Ввод/Вывод в Денди.
Архитектура Денди не изобилует большим (а может и достаточным) количеством портов ввода/вывода. Программно под порты внешней периферии выделены две ячейки из адресного пространства 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) приведена на рисунке.
1 | GND |
2 | SND IN |
8 | J1 D0 |
9 | CLK1 |
12 | OUT0 (STRB) |
15 | VCC |
1 | GND |
2 | SND IN |
3 | #IRQ |
4 | J2 D4 |
5 | J2 D3 |
6 | J2 D2 |
7 | J2 D1 |
8 | J2 D0 |
9 | CLK2 |
10 | OUT2 |
11 | OUT1 |
12 | OUT0 (STRB) |
13 | J1 D1 |
14 | CLK1 |
15 | VCC |
Представленный «ассортимент» и распиновка портов типичны как для 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) для джойстиков, распиновка которых может быть такой:
2 | J1 D0 |
3 | OUT0 (STRB) |
4 | CLK1 |
6 | VCC |
8 | GND |
2 | J2 D0 |
3 | OUT0 (STRB) |
4 | CLK2 |
6 | VCC |
8 | GND |
А вместе с этим и 15-ти контактный порт расширений, для подключения другой периферии помимо джойстиков (или второго джойстика в 15-ти контактном «исполнении»):
1 | GND |
2 | SND IN |
3 | #IRQ |
4 | J2 D4 |
5 | J2 D3 |
6 | J2 D2 |
7 | J2 D1 |
8 | J2 D0 |
9 | CLK2 |
10 | OUT2 |
11 | OUT1 |
12 | OUT0 (STRB) |
13 | J1 D1 |
14 | CLK1 |
15 | VCC |
«Стандартные» джойстики.
Оригинальные джойстики 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). Информация считывается в следующей последовательности:
1 = A | 9 = Ignored | 17 = ID bite* |
2 = B | 10 = Ignored | 18 = ID bite* |
3 = SELECT | 11 = Ignored | 19 = ID bite* |
4 = START | 12 = Ignored | 20 = ID bite* |
5 = UP | 13 = Ignored | 21 = 0 |
6 = DOWN | 14 = Ignored | 22 = 0 |
7 = LEFT | 15 = Ignored | 23 = 0 |
8 = RIGHT | 16 = Ignored | 24 = 0 |
* ID bite - вероятно, в оригинальных NES-джойстиках биты 17-20 содержали дополнительную информацию, не связанную с нажатием клавиш. Во всех неоригинальных джойстиках, в том числе и «родных» Денди - аппаратно присутствуют только первые 8-бит, отвечающие непосредственно за нажатия кнопок. Дальнейшее чтение с такими джойстиками бессмысленно.
Нажатой кнопке соответствует единица, не нажатой – ноль.
«Мультикнопочный» джойстик.
Есть для консоли Famicom такой интересный аксессуар как «мультикнопочный» (название произвольное, авторское) джойстик (HVC-051). Вернее он является дополнением для другой «штуковины» - модема! (HVC-050). Посчастливилось раздобыть в коллекцию экземпляр такого набора. Модем вставляется вместо картриджа, этаким «вторым этажом» - нет, не для онлайн игр нескольких пользователей (а для их скачивания со специализированных BBS-ок? - вроде так, но это было не в нашей стране, и очень давно). Еще в модем предусмотрена установка собственного картриджа «уникального» формата (отдаленно напоминающего PCMCIA-устройства конструктивно) … Не факт, что предусматривалось использование мульти-джойстика (в части дополнительных кнопок) отдельно от программного обеспечения используемого совместно с модемом … Однако, внутри пользовательских разработок, ничего не мешает опрашивать и обрабатывать на свое усмотрение все кнопки такого джойстика.

Подключается к приставке мультикнопочный джойстик весьма экзотично: его необходимо вставлять исключительно в порт расширений («Порт В & C» или «Порт C») – однако при этом приставка будет его видеть не как «второй», а как «третий» (внезапно?! – это по аналогии с адаптером на 4 джойстика и его аппаратно-программной моделью). Некоторые программы (игры) в прочем работают с ним как с «первым» … При этом, соответственно, «второй» джойстик штатным образом уже подключить не удастся (разъем занят) … Причина? – распиновка:
1 | GND |
12 | OUT0 (STRB) |
13 | J1 D1 |
14 | CLK1 |
15 | VCC |
Опрашивается такой джойстик, штатным для системы образом, но в нем присутствуют три последовательно включенных регистра. Назначение битов кнопок приведено ниже:
1 = A | 9 = 0 | 17 = 8 |
2 = B | 10 = 1 | 18 = 9 |
3 = SELECT | 11 = 2 | 19 = * |
4 = START | 12 = 3 | 20 = # |
5 = UP | 13 = 4 | 21 = . |
6 = DOWN | 14 = 5 | 22 = C |
7 = LEFT | 15 = 6 | 23 = Ignored |
8 = RIGHT | 16 = 7 | 24 = Func |
Первые 8-бит – стандартные для всех джойстиков, далее биты остальных кнопок. Биту 23 нет соответствия в виде кнопки – т.е. не используется (всегда нулевой). Кнопка, соответствующая биту 24 названа «Func» условно, т.к. англоязычная маркировка для данной кнопки отсутствует.
Джойстик Super-NES.
В качестве справочного материала, для сравнения, возможного использования в собственных проектах, а также для конструирования враппера и т.п. приведем таблицу «скан-кодов» джойстика приставки Super-NES (более известной у нас как Супер-Нинтендо) – т.к. фактически такой джойстик является вариацией «мультикнопочного» джойстика описанного выше (с меньшим количеством кнопок, и двумя регистрами вместо трех), и является для Super-NES «стандартным» …
1 = B | 9 = A | 17 = Ignored |
2 = Y | 10 = X | 18 = Ignored |
3 = SELECT | 11 = L | 19 = Ignored |
4 = START | 12 = R | 20 = Ignored |
5 = UP | 13 = Ignored | 21 = Ignored |
6 = DOWN | 14 = Ignored | 22 = Ignored |
7 = LEFT | 15 = Ignored | 23 = Ignored |
8 = RIGHT | 16 = Ignored | 24 = Ignored |
Количество и назначение аппаратных линий, а также алгоритм опроса джойстика Супер-Нинтендо абсолютно идентичен таковому в Денди.