Ввод/Вывод в Денди.

Архитектура Денди не изобилует большим (а может и достаточным) количеством портов ввода/вывода. Программно под порты внешней периферии выделены две ячейки из адресного пространства 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 контактов)

1

GND

2

SND IN

8

J1 D0

9

CLK1

12

OUT0 (STRB)

15

VCC

«Порт B & C» (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

Представленный «ассортимент» и распиновка портов типичны как для 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 контактов)

2

J1 D0

3

OUT0 (STRB)

4

CLK1

6

VCC

8

GND

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

2

J2 D0

3

OUT0 (STRB)

4

CLK2

6

VCC

8

GND

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

«Порт C» (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

Количество и назначение аппаратных линий, а также алгоритм опроса джойстика Супер-Нинтендо абсолютно идентичен таковому в Денди.

 

Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Приложение 1
Приложение 2
Приложение 3
Приложение 4
Приложение 5
Приложение 6