Для любителей периферии от Сега добавлю некоторую инфу, которая позволит оптимизировать процедуру опроса. Типичный код опроса 6ти кнопочного джойстика:
Т.е., пульс длинной в чтение 5ти слов (2 NOPа и 1 move.b с длинным EA). На 7,6МГц это будет примерно 6мкс. Далее, периферия у Сеги разнообразная. И она имеет некий аналог PnP. Вот известные коды:Код: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 *И сохраним состояние джойстика
Дока была издана до выхода расширенного 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х кнопочный.





Ответить с цитированием