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

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

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

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

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

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

Распиновка портов (2 по 15) приведена на рисунке.

«Порт A»

1

GND

2

SND IN

8

J1 D0

9

CLK

12

OUT0 (STRB)

15

VCC

«Порт B»

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

CLK

15

VCC

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

О других сигналах:

SND IN – аналоговый выход с pAPU (см. ниже);
#IRQ – линия запроса прерывания (от периферийного устройства);
CLK/CLK2 – синхроимпульс тактовой частоты процессора (1.79МГц для PAL);

Джойстики.

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

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


1 = A          9 = Ignored   17 = +--¬           
2 = B         10 = Ignored   18 =    +-- Идентификатор устройства
3 = SELECT    11 = Ignored   19 =    |           
4 = START     12 = Ignored   20 = +---           
5 = UP        13 = Ignored   21 = 0              
6 = DOWN      14 = Ignored   22 = 0              
7 = LEFT      15 = Ignored   23 = 0              
8 = RIGHT     16 = Ignored   24 = 0              


Нажатой кнопке соответствует единица, не нажатой – ноль.


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

Яндекс.Метрика