У меня тоже руки не дошли пока прикрутить к Emu80 поддержку реального джойстика (геймпада)...
У меня тоже руки не дошли пока прикрутить к Emu80 поддержку реального джойстика (геймпада)...
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Я потом переделывал, потому что не работало на реале.
То как сейчас можно посмотреть тут: https://github.com/nzeemin/vector06c.../asteroid0.asm
Инициализация:
В прерывании:Код:; Joystick init mvi a, 83h ; control byte out 4 ; initialize the I/O controller mvi a, 9Fh ; bits to check Joystick-P, both P1 and P2 out 5 ; set Joystick-P query bits in 6 ; read Joystick-P initial value sta KEYINT_J+1 ; store as xra instruction parameter
Затем вот тут уже можно посмотреть как биты джойстика анализируются вместе с клавиатурой: https://github.com/nzeemin/vector06c...oid1.asm#L1648Код:; Joystick scan in 6 ; read Joystick-P KEYINT_J: xri 0 ; XOR with initial value - mutable param! cma sta JoystickP ; save to analyze later
aGGreSSor(15.08.2025), parallelno(05.06.2023)
nzeemin, супер спасибо!!!
- - - Добавлено - - -
nzeemin,
Поясни пожалуйста этот кусочек кода. В инициализации ты считываешь код клавиш джойстика. В опросе ты считываешь код снова и делаешь XOR с кодом который ты считал в инициализации. Что это дает?Код:in 6 ; read Joystick-P initial value sta KEYINT_J+1 ; store as xra instruction parameter ... in 6 ; read Joystick-P KEYINT_J: xri 0 ; XOR with initial value - mutable param!
А это я у кого-то подсмотрел, наверное у @svofski -- так ты фиксируешь "свободное" состояние битов, а потом смотришь только на их изменение.
То есть, тебе не важно, какое состояние является "нажато" - 0 или 1.
Плюс, видимо ещё -- если джойстика там вообще нет, ты опять же не будешь реагировать, какие бы битики там не стояли.
Последний раз редактировалось nzeemin; 05.06.2023 в 21:42.
parallelno(05.06.2023)
nzeemin, правильно ли я понимаю что в случае если джойстик есть, то после инициализации в KEYINT_J будет FFh. Затем в опросе с помощью xri мы получим инвертированное значение, а потом ты еще раз инвертируешь значение. Скажи пожалуйста зачем это нужно?
Если джойстика нет, то что будет в KEYINT_J?
Твой код какие джойстики поддерживает?
Последний раз редактировалось parallelno; 05.06.2023 в 22:32.
Этот код рассчитан только на Джойстик П, любой из двух.
При инициализации в KEYINT_J+1 кладём значение из порта без инверсии -- т.е. то что там есть без всяких нажатий (предполагаем что при загрузке игры джойстик не трогают). Судя по описанию, это будет FFh.
Потом при опросе мы делаем xor с этим начальным значением - получаем биты в 1 которые отличаются от начального значения.
Ещё одно инвертирование (cma) сделано для того чтобы в процедуре ReadKeyboard биты джойстика обрабатывались так же как биты клавиатуры -- а там 1 это отжато, 0 нажато.
> Если джойстика нет, то что будет в KEYINT_J?
Там будет то что отдаёт порт, не важно что, лишь бы оно не менялось.
Проверял этот код на Векторе в MiSTer FPGA, и кто-то ещё проверял на реале, везде работает.
Последний раз редактировалось nzeemin; 05.06.2023 в 23:44.
parallelno(06.06.2023)
Занудное (и наверное лишнее) замечание, но все же - чтобы изменившиеся биты джойстика обрабатывались так же как биты клавиатуры. Если брать исходные значения опроса -П (и -С), то они как и у клавиатуры - 1 отжато, 0 нажато. "Позитивный" джойстик только ПУ/УСПИД, насколько я помню.
Все понял. Спасибо!
nzeemin, кстати если организовать не по байту на бит каждой линии, а по три байта на экшен клавишу где каждый байт это маска чтобы проверить что в линии нажат экшен, то возможно будет быстрее, так как не придется проверять неиспользуемые биты и плюс можно проверять одним ксором сразу несколько бит ответственных за экшен таких так выстрел.
- - - Updated - - -
Вот пример чтобы объяснить что я имею в виду. Это при условии что бит 1 если клавишу нажали. Извини заранее если это сильно не в тему и если код с ошибками.
Lda key_code_joy
Mov c, a
Lhld key_code_line1_line2
Mvi d, 0 ; key_code to return
Check_action_fire:
Mvi a, fire_mask_line1
Xra l
Mov b, a
Mvi a, fire_mask_line2
Xra h
Ora b
Mov b, a
Mvi a, fire_mask_joy
Xra c
Ora b
Jz check _next_action
Mvi d, key_code_fire ; for next key actions use mvi a, key_code_* / or d / mov d, a
Check_next_action:
- - - Updated - - -
Для экшенов не относящихся к выстрелу можно не проверять fire_mask_line2 так как там только битики для выстрела. С учётом того что массив масок не нужен то возможно будет не сильно больше чем твое решение. Но конечно нужно проверять.
- - - Updated - - -
Примерно получается 104 байта
Твой код 42+30=72
У тебя получается короче плюс хорошее преимущество в том что его можно легко масштабировать до большего числа опрашиваемых линий!
Последний раз редактировалось parallelno; 06.06.2023 в 12:23.
parallelno, возможность для оптимизации конечно есть. Но для вас сейчас наверное важнее возможность реконфигурирования опроса -- разные джои, переопределяемые клавиши.
А насчёт "У тебя получается короче" -- тут как на том меме, где два программиста:
-- Я украл твой код.
-- Это не мой.
parallelno(06.06.2023)
я правильно понимаю что ты инициализируешь оба джойстика в Joystick init, но опрашиваешь только один? Если да, то зачем инициализировать два джойстика?
- - - Добавлено - - -
Я кстати до сих пор не могу решить есть ли смысл давать пользователю переопределять клавиши перемещения. Это кажется сильно не нужной опцие так как на Векторе есть клавиши стрелок и на джойстике они тоже есть.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)