Для любителей периферии от Сега добавлю некоторую инфу, которая позволит оптимизировать процедуру опроса. Типичный код опроса 6ти кнопочного джойстика:
Код:
clr.l d0 *Очищаем d0
clr.l d1 *Очищаем d1
move.b #$40,$A10003 *Сигнал SYN джойстика в 1
nop *Задержка
nop *Задержка
move.b $A10003,d1 *Считаем первые 6 кнопок
andi.b #$3F,d1 *Выделим их
move.b #$00,$A10003 *Сигнал SYN джойстика в 0
nop *Задержка
nop *Задержка
move.b $A10003,d0 *Считаем вторые 2 кнопки
and.b #$30,d0 *Выделим их
rol.b #2,d0 *Сдвинем на 2 разряда
or.b d0,d1 *И совместим все 8 основных кнопок и сохраним в d1
move.b #$40,$A10003 *Сигнал SYN джойстика в 1
nop *Задержка
nop *Задержка
move.b #$00,$A10003 *Сигнал SYN джойстика в 1
nop *Задержка
nop *Задержка
move.b #$40,$A10003 *Сигнал SYN джойстика в 1
nop *Задержка
nop *Задержка
move.b #$00,$A10003 *Сигнал SYN джойстика в 1
nop *Задержка
nop *Задержка
move.b #$40,$A10003 *Сигнал SYN джойстика в 1
nop *Задержка
nop *Задержка - этот 'мутор' нужен для активации дополнительных четырех кнопок джойстика (XYZM)
move.b $A10003,d0 *Считаем дополнительные кнопки
andi.b #$0F,d0 *Выделим их
eor.b #$0F,d0 *Проинвертируем их
rol.l #8,d0 *Сдвинем на 8 бит
or.w d1,d0 *И совместим их с основными 8ми
not.b d0 *Инвертируем основные кнопки
move.b #$40,$A10003 *Сигнал SYN джойстика в 1
move.w d0,KeyState *И сохраним состояние джойстика
Т.е., пульс длинной в чтение 5ти слов (2 NOPа и 1 move.b с длинным EA). На 7,6МГц это будет примерно 6мкс. Далее, периферия у Сеги разнообразная. И она имеет некий аналог PnP. Вот известные коды:
Дока была издана до выхода расширенного 6ти кнопочного джойстика, который имеет ID = 0110 или 6. Теперь об опросе. Кнопки D-pad'а (крестовины) мультиплексированы с ID (3х кнопочный джойстик) и с расширенными кнопками XYZM (6ти кнопочный джойстик).
Код:
3.2) Специфика геймпада
Геймпад использует 4 пина для направления (влево, вправо, вверх, вниз) и
мультиплексирует 4 кнопки (A, B, C, Start) через пины TL и TR.
Пин TH управляет мультиплексором при выборе кнопок (A и Start или C и
B) через пины TL и TR.
Чтобы прочитат все кнопки программа должна установить TH=1, считать
порт, установить TH=0 и еще раз считать порт. Считанные данные будут
в следующем формате:
TH = 0 : ?0SAIIII
TH = 1 : ?1CBRLDU
? = То, что было ранее записано в бит 7.
I = ID
S = Start
A = Кнопка A
B = Кнопка B
C = Кнопка C
U = Вверх
D = Вниз
L = Влево
R = Вправо
6ти кнопочный пад позволяет получить дополнительные кнопки, которое
основано на том, сколько раз пин TH был переключен с 1 на 0 (но не
наоборот с 0 на 1). Посмотрите на следующую последовательность:
TH = 1 : ?1CBRLDU Кнопки 3х кнопочного пада
TH = 0 : ?0SAIIII Кнопки 3х кнопочного пада
TH = 1 : ?1CBRLDU Кнопки 3х кнопочного пада
TH = 0 : ?0SA0000 D3-D0 сброшены в '0'
TH = 1 : ?1CBMXYZ Дополнительные кнопки могут быть считаны через D3-D0
TH = 0 : ?0SA1111 D3-D0 установлены в '1'
M = Mode
X = Кнопка X
Y = Кнопка Y
Z = Кнопка Z
Далее будут возвращаться данные стандартного 3х кнопочного
джойстика при любых переключениях пина TH.
Если пин TH не изменялся около 8192 (а может и меньше) цикла 68000
происходит таймаут и дополнительные кнопки могут быть считаны еще
раз. Игры обычно опрашивают джойстик один раз за телевизионный кадр,
поэтому времени достаточно чтобы произошл таймаут.
Я думаю, что проверка D3-D0 на сброс в '0' или установку в '1' может
быть еще одним методом проверки типа подключенного пада: 6ти или 3х
кнопочный.
Некоторые игры используют такой опрос пада, что считываются данные
6ти кнопочного пада, хотя ожидаются от 3х кнопочного. Чтобы исправить
это, нужно зажать кнопку MODE при включении и 6ти кнопочный пад
будет работать как 3х кнопочный.