PDA

Просмотр полной версии : Джойстики на Векторе-06ц



svofski
26.07.2018, 18:41
Предлагаю вопросы, касающиеся подключения и использования разных вариантов джойстиков, обсуждать тут. Вариантов разных описывалось много и неплохо было бы собрать информацию в одном месте.

Варианты джойстиков:

УСПИД, БАЙТ, ПУ, Вектор-06ц.02.

Что-то забыл?

БАЙТ, если я правильно понял, то это из публикации "Байт":

"НАЗНАЧЕНИЕ ВЫВОДОВ ПУ: А0 - +5В,ОБЩИЙ ПРОВОД; А1 - СТРЕЛКА ВВЕРХ;
А2 - СТРЕЛКА ВПРАВО; А3- СТРЕЛКА ВНИЗ; А4 - СТРЕЛКА ВЛЕВО; А5 - ПРОБЕЛ"

Джойстик-П, потому что висит на ПУ:


05H порт PС параллельного интерфейса (разъем "ПУ")
Запись: Опрос джойстиков П1, П2
╓7┬6┬5┬4┬3┬2┬1┬0╖
║x│ │ │x│x│x│x│x║
╙─┴╥┴╥┴─┴─┴─┴─┴─� � бит
║ ╚═══════════ 5: 0=джойстик П1, 1=джойстик П2
╚═════════════ 6: 1=джойстик П1, 0=джойстик П2
06H порт PB параллельного интерфейса (разъем "ПУ")
Чтение: Джойстики П1, П2 (0 - клавиша нажата, 1 - отжата)
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │x│x│ │ │ │ ║
╙╥┴╥┴─┴─┴╥┴╥┴╥┴╥� � бит
║ ║ ║ ║ ║ ╚═ 0: "вправо"
║ ║ ║ ║ ╚═══ 1: "влево"
║ ║ ║ ╚═════ 2: "вверх"
║ ║ ╚═══════ 3: "вниз"
║ ╚═════════════ 6: кнопка 2
╚═══════════════ 7: кнопка 1


УСПИД


07H порт PA параллельного интерфейса (разъем "ПУ")
Чтение: Джойстик УСПИД (1 - клавиша нажата, 0 - отжата)
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │ │x│x│x║
╙╥┴╥┴╥┴╥┴╥┴─┴─┴─� � бит
║ ║ ║ ║ ╚═══════ 3: "кнопка"
║ ║ ║ ╚═════════ 4: "влево"
║ ║ ╚═══════════ 5: "вниз"
║ ╚═════════════ 6: "вправо"
╚═══════════════ 7: "вверх"


Джойстик С (предположительно Счетмаш), или Вектор-06ц.02:


0EH Запись: таблица цветности
Чтение: Регистр 1-го джойстика (0 - клавиша нажата, 1 - отжата)
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │1│1│ │ │ │ ║
╙╥┴╥┴─┴─┴╥┴╥┴╥┴╥� � бит
║ ║ ║ ║ ║ ╚═ 0: "вправо"
║ ║ ║ ║ ╚═══ 1: "влево"
║ ║ ║ ╚═════ 2: "вверх"
║ ║ ╚═══════ 3: "вниз"
║ ╚═════════════ 6: кнопка 1
╚═══════════════ 7: кнопка 2
0FH Запись: таблица цветности
Чтение: Регистр 2-го джойстика (0 - клавиша нажата, 1 - отжата)
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │1│1│ │ │ │ ║
╙╥┴╥┴─┴─┴╥┴╥┴╥┴╥� � бит
║ ║ ║ ║ ║ ╚═ 0: "вправо"
║ ║ ║ ║ ╚═══ 1: "влево"
║ ║ ║ ╚═════ 2: "вверх"
║ ║ ╚═══════ 3: "вниз"
║ ╚═════════════ 6: кнопка 1
╚═══════════════ 7: кнопка 2


Все вышеперечисленное я не поперчил знаками вопроса не потому, что у меня нет никакого сомнения, а наоборот потому, что я ни в чем из этого не уверен. Рад любым замечаниям и поправкам.

Ну и бтв:

Чтобы и на реале и в эмуляторе было удобно надо было или запараллелить с {q ^} или перенести на одинаково расположенные друг относительно друга, например {F1 F2}
Или джойстик.

ivagor
27.07.2018, 06:13
Или джойстик.
Джойстик - это хорошо, но конкретно в lode runnere неудобные (для реала) прожигательные клавиши, их на джой не повесишь, это, на мой субъективный взгляд, еще неудобнее.

KTSerg
27.07.2018, 06:27
Джойстик - это хорошо, но конкретно в lode runnere неудобные (для реала) прожигательные клавиши, их на джой не повесишь, это, на мой субъективный взгляд, еще неудобнее.
Ага, в "lode runner" нужно управление двухкнопочной мышью ;)

svofski
27.07.2018, 10:32
Просто добавить возможность жечь не отдельными кнопками, а комбинацией направление+кнопка.

ivagor
27.07.2018, 10:50
комбинацией направление+кнопка
Это мне и показалось неудобным. Требует тренировки игрока + (в идеале) некоторой доработки игрушки. Если сначала двинуть ручку, а потом нажать, то сначала раннер сдвинется (что, скорее всего, не требуется) и только потом выжгет пол. Нужно предусмотреть, чтобы при нажатой кнопке (её нужно нажать до дергания ручки) игрок не двигался. Это и мне неохота делать и игроку имхо неудобно.
А если задействовать две кнопки под прожигание справа/слева, то это примерно также "неправильно" по расположению, как z x на клавиатуре. На моем джойстике одна кнопка была сверху, другая - спереди.

svofski
27.07.2018, 11:14
Если сильно переделывать, то конечно. Но вообще на C64 да и на других компах так играли и ничего.

x-code
31.07.2018, 13:49
В играх довольно часто предлагались на выбор "Джойстик С" и "Джойстик П".
Детальнее должно быть здесь: http://sensi.org/scalar/ware/572/ (стр. 20 и 30)

Как я понял, "Джойстик С" изначально подключался к порту ВУ через собственную плату расширения, и впоследствии стал стандартом в Вектор-06ц.02. А "Джойстик П", вероятно, со временем отмер ввиду куда более простой схемы подключения "Джойстик УСПИД".

Под "Успид" я адаптировал несколько игр, включая Putup, но никуда в массы это не пошло.

ivagor
31.07.2018, 14:35
ПУ, потому что висит на ПУ:
Все же Джойстик-П, он и в оригинальной публикации Вектор-user так называется и в игрушках.


вариант Вектор-06ц.02:
Джойстик-С (вероятно "Счетмаш")


В играх довольно часто предлагались на выбор "Джойстик С" и "Джойстик П".
Поддержка джойстиков определялась в основном "географически". Кишиневские игрушки (ЦК) поддерживали -С/-П, УСПИДовские - УСПИД, Байтовские - их вариант. Причем это касалось не только оригинальных игрушек из этих городов, но иногда и в распространяемые добавляли поддержку "любимого" джоя. Если не путаю, кто-то из байта даже делал прогу для автоматического внедрения их джойстика в программы с драйверами устройств.

- - - Добавлено - - -


Если не путаю, кто-то из байта даже делал прогу для автоматического внедрения их джойстика в программы с драйверами устройств.
В байте (pdf, стр. 71) упоминается копировщик COPY v (JPAS. 1), который "при копировании программ, написанных на Паскале или Драйверах Устройств, пристыковывает к программам блок опроса джойстика-ПУ". Джойстик-ПУ - это байтовский.

x-code
31.07.2018, 15:18
Любопытно, а у схемы "Джойстик-П" есть какие-то существенные преимущества перед простым как двери вариантом "УСПИД", кроме поддержки двух джойстиков (которая я даже ХЗ какими играми поддерживалась)?

svofski
31.07.2018, 15:55
Поддержка двух джойстиков во времена, когда это была единственная форма мультиплеера —*большое дело. Жаль только, что игр для них так и не случилось.

Поправил названия П и С.

ivagor
31.07.2018, 16:19
Для двух игроков есть pairs и rotors, но когда их делали двух джойстиков еще не было. А потом адаптировать не стали. Хотя есть версия pairs под клавиатуру + УСПИД.

svofski
31.07.2018, 16:50
ivagor, без Arcade Volleyball грустно.

ivagor
31.07.2018, 17:13
Волейбол (http://www.sensi.org/scalar/ware/382/) явно сделан под его влиянием, есть даже версия для клавиатуры + джойстик ПУ. Но качество игрушки сильно (очень-очень сильно) не дотягивает до оригинала.

svofski
31.07.2018, 18:02
Ныы, от этого только еще грустнее.

KTSerg
31.07.2018, 18:20
Вроде в Abrams резались на пару, кнопок много использовалось, джойстики не помню...

b2m
31.07.2018, 21:06
Я тоже под влиянием делал, для Башкирии-2М. Даже графику кое-какую утянул:

http://bashkiria-2m.narod.ru/images/scrshot/va.png

svofski
31.07.2018, 21:22
b2m, пора доделать и спортировать на Вектор заодно :)

ivagor
01.08.2018, 06:53
Игрушка на диске доделанных (DISK2.CPM, VA.COM). Вполне играбельная, в детстве вдвоем было бы точно интересно играть. Разве что мячик хотелось бы покруче, но и так нормально.

b2m
01.08.2018, 09:03
Разве что мячик хотелось бы покруче
Оригинальный мяч забыл перетянуть, да и казалось, что несколько фаз слишком жирно будет. Его же в памяти попиксельно сдвигать надо было, т.е. каждую фазу 8 раз хранить. А свой рисовать не хотелось, статичный мяч выглядел бы совсем не круто.

А так - да, можно доделать мяч и портировать на Вектор, вроде бы никаких препятствий нет (кроме отсутствия времени и желания).

KTSerg
22.12.2018, 08:45
Эту тему видел,там теория одна.
Хочется увидеть ,как на практике всё это сделано.
Что значит: "Хочется увидеть ,как на практике всё это сделано." ?
Нужно фото джойстика подключенного к "ПУ" ?

Или схема подключения?
Вектор-Юзер №7 стр.2

svofski
11.08.2019, 02:39
Сделал тест для джойстиков на портах $07/$0e/$0f и их шадковых доппельгангеров на $27/$2e/$2f: [отсыл к прекрасному (https://svofski.github.io/pretty-8080-assembler/?https://gist.githubusercontent.com/svofski/5903638d517e282d14bbf7290346b50c/raw/9f0e59e6cbf0382aa29a89346f8b1b192cdc1799/joytestc)]

(Я неправильно считываю порт 7, следовало бы настроить порт А второго PPI).

У меня при включенных Шадках картинка такая:
https://i.imgur.com/czNNkNm.png

metamorpho
02.08.2021, 13:32
Привет !!
Подскажите как правильно опрашивать Джойстик П (ПУ) ?

Вот что я насочинял и поставил в прерывания:
joy:
mvi a,83h
out 4

in 06h
cma
ana 0fh

cpi 1; vpravo
jnz joykon2
mvi a,0BFH
sta KEYKOD
jmp joykon5

joykon2:
cpi 2 ; vlevo
jnz joykon3
mvi a,0EFH
sta KEYKOD
jmp joykon5

joykon3:
cpi 4 ; vverx
jnz joykon4
mvi a,0DFH
sta KEYKOD
jmp joykon5

joykon4:
cpi 8 ; vniz
jnz joykon5
mvi a,7FH
sta KEYKOD

joykon5:

Improver
02.08.2021, 14:17
Подскажите как правильно опрашивать Джойстик П (ПУ) ?В "Байте №8" за 1992 год (http://www.sensi.org/scalar/ware/553/) приведена немного другая подпрограмма для джойстика ПУ:

JOY: PUSH B ; сохраняем рег. пару ВС Выходной параметр:
XRA A ; обнуляем аккумулятор
OUT 07 ; обнуляем порт 07 в (A)-код
IN 07 ; считываем число из порта 07 бит: 0-"СС"
MOV B,A ; сохраняем его в регистре В 1-"УС"
IN 01 ; считываем число из порта 01 2-"FIRE2"
ANI 60H ; выделяем биты клавиш "УС" и "СС" 3-"FIRE1"
RAL ; передвигаем их на 3 разряда влево 4-"влево"
RAL ; 5-"вниз"
RAL ; 6-"вправо"
ORA B ; "накладываем" регистр В на аккумулятор 7-"вверх"
POP B ; восстанавливаем рег. пару ВС
RET ; возврат из п/п
К ней только надо добавить анализ результатов...

ivagor
02.08.2021, 14:22
Это разные джойстики. -П - это кишиневский центр компьютер (Вектор-USER 7), -ПУ (в девичестве УСПИД) - это изначально УСПИД, а в центре байт его стали называть -ПУ, вероятно чтобы не рекламировать конкурентов.

metamorpho
02.08.2021, 16:30
Improver, ivagor спасибо !!
Меня попросили добавить в игру "Binorum" возможность управлять джойстиком.
Просьба звучала так: "поддержка джойстика ПУ, он на порте 06H висит разъема ПУ"
Поэтому теперь я немного подзапутался как сделать его опрос :)

- - - Добавлено - - -

Ещё как пример сказали "сделай как в River Raid", поэтому svofski пожалуйста напиши как ты в River Raid опрос джойстика сделал :)

svofski
02.08.2021, 17:04
Ещё как пример сказали "сделай как в River Raid", поэтому svofski пожалуйста напиши как ты в River Raid опрос джойстика сделал :)
Это ржачно, потому что я как раз ничего не успел сделать -- Сергей подхачил Рива Рейд раньше, чем я успел пошевелиться. Но у меня уже был сделан опрос джойстиков, просто на других портах:
https://github.com/svofski/incursiondelrio/blob/master/input.inc

ivagor
02.08.2021, 18:10
поддержка джойстика ПУ, он на порте 06H висит разъема ПУ
Это как раз -П, он тоже висит на ПУ, порт 6 (на чтение).

- - - Добавлено - - -


Сергей подхачил Рива Рейд раньше, чем я успел пошевелиться.
Раскладка битов желаемого -П и реализованного у тебя -C совпадают, возможно он просто изменил номер порта в опросе. Но у такого минималистичного варианта есть подводные камни, надеюсь он все же инициализацию ПУшной ВВ55 добавил (пусть даже у него скорее всего работает и без инициализации в игрушке).

metamorpho
02.08.2021, 20:53
svofski, ivagor спасибо !!

Например вот опрос порта джойстика:
in JOYC1
cma
mov m, a

Мне непонятно зачем делается инверсия аккумулятора (сма) ?


....... Но у такого минималистичного варианта есть подводные камни, надеюсь он все же инициализацию ПУшной ВВ55 добавил (пусть даже у него скорее всего работает и без инициализации в игрушке).

Зачем нужна инициализация ПУшной ВВ55 ? И обязательна ли она ? Если да, то как она делается ?

В моём варианте опроса джойстика делается так:
- в подпрограмме прерывания идёт опрос клавиатуры и записывается в ячейку KEYKOD код нажатой клавиши или если ничего не нажато записывается код того что ничего не нажато
- далее в этой же подпрограмме прерывания идёт опрос порта джойстика и если там есть нажатие (влево,вправо,вверх,вниз) тогда в ячейку KEYKOD записывается код аналогичный коду стрелок с клавиатуры
- далее в основном цикле программа обрабатывает только то что находится в KEYKOD

Такой одновременный опрос клавиатуры и джойстика будет ли работать или в опросе джойстика есть какие-то "подводные камни" ?

- - - Добавлено - - -

Где лучше делать опрос джойстика в подпрограмме прерываний или разницы нет где ?

ivagor
02.08.2021, 21:13
Зачем нужна инициализация ПУшной ВВ55 ? И обязательна ли она ? Если да, то как она делается ?
Разные начальные загрузчики могут оставить ПУшную ВВ55 в разном состоянии.
Если загрузка была из внешнего пзу/картриджа, то порт 6 запрограммирован на ввод, но остается вопрос насчет порта 5, который управляет выбором джойстиков. Теоретически может получится ситуация, когда один или оба джойстики будут отключены, но я так понимаю, что это может быть неактуально для упрощенного подключения -П с одним джойстиком.
А вот 512 байтный загрузчик, который был штатно установлен в большинстве векторов, программирует порт 6 на вывод и опрос джойстика без инициализации не получится.

mvi a,83h
out 4
Это и есть инициализация для опроса джойстика-п (даже сразу двух джойстиков).

svofski
02.08.2021, 22:23
Мне непонятно зачем делается инверсия аккумулятора (сма) ?
Я проверяю не абсолютное состояние контактов, а инверсию относительно того состояния порта, которое было при старте. Таким образом если мы опрашиваем несуществующий порт, нам неважно ноль там или единица.
Дальше все порты пробегаем и сравниваем с нейтральным положением, если в каком-то бите была инверсия, это определяется как повернутая палка, или нажатая кнопка. Инверсия чтобы удобно было ксорить со считанным значением и потом and-ить, это детали реализации.

metamorpho
03.08.2021, 16:08
А у кого-нибудь есть Джойстик П и желание и возможность чтобы протестировать игру ? :)

svofski
03.08.2021, 17:18
А у кого-нибудь есть Джойстик П и желание и возможность чтобы протестировать игру ? :)

VV поддерживает все (ну или почти все) типы джойстиков при условии того, что к компьютеру подключен писишный джойстик или геймпад.

metamorpho
03.08.2021, 17:55
VV поддерживает все (ну или почти все) типы джойстиков при условии того, что к компьютеру подключен писишный джойстик или геймпад.

Вот это новость (для меня), хотя на РС у меня тоже нет джойстика. Но это уже более лучший вариант чем я думал, что только на реальном Векторе и реальном Джойстике П можно всё это проверить.

ivagor
03.08.2021, 18:08
Можно и без джойстика, надо нажать NumLock и управлять клавишами дополнительной клавиатуры.

metamorpho
05.08.2021, 10:46
Ситуация следующая - при тестировании Джойстика П (с помощью варианта NumLock и клавишами дополнительной клавиатуры) на эмуляторе VV - всё работает отлично.
Однако на реальном Векторе и Джойстике П происходит примерно так: "нет не работает.....иногда чтото срабатывает, раз сработала кнопка начала игры и еще раз перезапуск и один раз вверх сработал....".
В чём может быть причина того что на реале такая проблема ?

ivagor
05.08.2021, 11:09
В чём может быть причина того что на реале такая проблема ?
Не видя кода сложно что-то предполагать.

- - - Добавлено - - -

Или можно зайти с другой стороны - какие игры хорошо работают с той реализацией джойстика-п?

metamorpho
05.08.2021, 11:41
Не видя кода сложно что-то предполагать.
- - - Добавлено - - -
Или можно зайти с другой стороны - какие игры хорошо работают с той реализацией джойстика-п?

Хорошо работает RiverRaid.

Вот мой код опроса джойстика (в прерываниях):

; ============= Joystik
joy:
in 06h ;
cma
mov l,a
ana 0c0h ; выделяем биты кнопок джойстика

cpi 128 ; кнопка 1
jnz joykon2asd
mvi a,0FEH ; =TAB
sta KEYKOD
jmp joykon5

joykon2asd:
cpi 64 ; кнопка 2
jnz joykon3asd
mvi a,0FEH
sta KEYKOD
jmp joykon5

joykon3asd:
mov a,l
ana 0fh ; выделяем биты направлений джойстика


cpi 1 ; vpravo
jnz joykon2
mvi a,0BFH
sta KEYKOD
jmp joykon5

joykon2:
cpi 2 ; vlevo
jnz joykon3
mvi a,0EFH
sta KEYKOD
jmp joykon5

joykon3:
cpi 4 ; vverx
jnz joykon4
mvi a,0DFH
sta KEYKOD
jmp joykon5

joykon4:
cpi 8 ; vniz
jnz joykon5
mvi a,7FH
sta KEYKOD

joykon5:

svofski
05.08.2021, 12:07
При беглом просмотре -- этот код рассчитывает на то, что джойстик замыкает только один контакт за раз. В реальном джойстике, если только это не специальный джойстик с крестовиной для пакмана, очень часто оказываются замкнуты два контакта сразу, как для движения по диагонали. В таком случае этот код провалится до joykon5, ничего не определив.


В Биноруме движение по диагонали не предусмотрено, значит надо или решить какое направление приоритетно, или допустим запоминать первое сработавшее и игнорировать остальные, пока первое не будет отпущено.

С кнопками аналогично, но конфликтная ситуация наверное возникает реже.

metamorpho
05.08.2021, 12:09
А как работает джойстик ? Например я влево на джойстике движение сделал - как это фиксируется на порту, пока я держу влево и контакт замкнут то на порту сигнал влево ? Или же он ловит только первый момент нажатия (как на клавиатуре РС - ловит - сейчас нажата, была нажата, сейчас отжата) ?

ivagor
05.08.2021, 12:10
Частично вне приведенного фрагмента остался вопрос параллельного опроса клавиатуры (если он сделан параллельным, а не по выбору).
Но если даже пока оставить в покое клавиатуру, определять направления и кнопки лучше независимо от состояния других бит.
Например

joykon2:
mvi a,2 ;vlevo
ana l
jz joykon3
lda KEYKOD
ani 0EFH
sta KEYKOD
jmp joykon5


Хорошо работает RiverRaid.
Это поможет тем, кому доступна версия RR с поддержкой джойстика-п.

svofski
05.08.2021, 12:27
А как работает джойстик ? Например я влево на джойстике движение сделал - как это фиксируется на порту, пока я держу влево и контакт замкнут то на порту сигнал влево ? Или же он ловит только первый момент нажатия (как на клавиатуре РС - ловит - сейчас нажата, была нажата, сейчас отжата) ?
Пока держишь на порту сигнал.

metamorpho
05.08.2021, 13:34
Обнаружил ошибку в своём коде ana 0c0h - неправильно, нужно ani 0c0h
Проверить на реале смогут только завтра.

ivagor
05.08.2021, 14:07
ana 0c0h
А какой ассемблер это пропускает и неправильно компилирует?

metamorpho
05.08.2021, 14:55
Pretty 8080 Assemler
Он ошибки подсвечивает, но если не просматривать весь текст, то можешь не узнать о них и скомпилировать как есть.
А текст я набираю в NotePad и уже оттуда переношу в Pretty 8080 Assemler
Если же набирать текст в Pretty 8080 Assemler, то ошибки сразу видно.

svofski
05.08.2021, 15:50
Надеюсь, что ты пользуешься современной версией с интегрированным редактором (https://svofski.github.io/pretty-8080-assembler/), а не допотопной.

metamorpho
05.08.2021, 16:05
Я пользуюсь вот этой версией https://svofski.github.io/pretty-8080-assembler/?https://raw.githubusercontent.com/svofski/bazis-bbstro/master/tvnoise.asm

Pretty 8080 Assemler - мне нравится. А ошибки это моё - не просмотрел текст и в итоге прошляпил.

svofski
05.08.2021, 16:36
Когда набираешь в нем, текст сразу подсвечивается красным и потребности в какой-то дополнительной диагностике нет. С копипастой это не так заметно. Лучше бы мне сделать защиту от таких ситуаций и не запускать программу с ошибками. Это на будущее.

metamorpho
05.08.2021, 21:08
Когда набираешь в нем, текст сразу подсвечивается красным и потребности в какой-то дополнительной диагностике нет. С копипастой это не так заметно. Лучше бы мне сделать защиту от таких ситуаций и не запускать программу с ошибками. Это на будущее.

Как вариант можно сделать внизу (в строке где управляющие надписи BIN RUN WAV и др.) надпись например ярким жёлтым цветом "ОШИБКИ:" и указать количество ошибок если есть

artyr_n
05.08.2021, 22:20
Надеюсь, что ты пользуешься современной версией с интегрированным редактором (https://svofski.github.io/pretty-8080-assembler/), а не допотопной.

Баг или фича?
75932

Нажал кнопку RUN
получил первый TEST
в английской раскладке попробовал набрать TEST получил на экране TECT но прога запустилась
потом попробовал набрать TECT получил ТЕЦТ и прога не запустилась

svofski
05.08.2021, 22:58
artyr_n, ТЕЦТ == tect, а надо писать ТЕСТ, или test ;) Почему раскладка случилась русская я не знаю, но РУС/LAT в этом эмуляторе на кнопке F6.

metamorpho
06.08.2021, 15:56
Исправленная версия кода - успешно прошла проверку на реальном Векторе и реальном Джойстике П :)
Спасибо всем кто помог мне в этом вопросе !!

Вот окончательный вариант моего кода опроса "джойстика П" (может кому пригодится)

; этот код находится в подпрограмме прерываний
; вначале опрашивается клавиатура и результат опроса заносится в ячейку KEYKOD
; если на клавиатуре ничего не было нажато то в ячейку KEYKOD заносится код того что ничего не нажато
; далее идёт опрос "джойстика П" - результат опроса заносится тоже в ячейку KEYKOD
; таким образом работает и клавиатура и джойстик

; ============= Joystik P
; =============
JOY:
in 06h ; читаем порт где подключён джойстик П
cma ; инвертируем для удобства обработки
mov l,a ; сохраняем значение сигнала

ani 128 ; выделяем бит первой кнопки
cpi 128 ;
jnz joykon2asd
mvi a,0FEH ; эта кнопка джойстика аналогична нажатию кнопки "TAB" клавиатуры в игре
sta KEYKOD ; записываем в ячейку для дальнейшей обработки в основном коде
jmp joykon5 ; переход на конец опроса джойстика если было нажатие кнопки

joykon2asd:
mov a,l ; выделяем бит второй кнопки
ani 64 ;
cpi 64 ;
jnz joykon3asd
mvi a,0FEH
sta KEYKOD
jmp joykon5

joykon3asd:
mov a,l
ani 1 ; выделяем бит направления вправо
cpi 1 ; vpravo ?
jnz joykon2
mvi a,0BFH
sta KEYKOD
jmp joykon5

joykon2:
mov a,l
ani 2 ; выделяем бит направления влево
cpi 2 ; vlevo ?
jnz joykon3
mvi a,0EFH
sta KEYKOD
jmp joykon5

joykon3:
mov a,l
ani 4 ; выделяем бит направления вверх
cpi 4 ; vverx ?
jnz joykon4
mvi a,0DFH
sta KEYKOD
jmp joykon5

joykon4:
mov a,l
ani 8 ; выделяем бит направления вниз
cpi 8 ; vniz ?
jnz joykon5
mvi a,7FH
sta KEYKOD

joykon5:

Improver
06.08.2021, 23:32
metamorpho, небольшое замечание: в этом коде можно легко убрать все команды "cpi XX", т.к. стояшие перед ними "ani XX" уже устанавливают признак Z при отсутствии единицы в проверяемом разряде. Это сократит код на 12 байт и ускорит его, если не ошибаюсь, на 48 тактов.

- - - Добавлено - - -

И ещё запись "sta KEYKOD" можно было бы сделать всего один раз... В общем, принцип "любую программу можно сократить как минимум на одну команду" работает. :)

metamorpho
07.08.2021, 10:33
metamorpho, небольшое замечание: в этом коде можно легко убрать все команды "cpi XX", т.к. стояшие перед ними "ani XX" уже устанавливают признак Z при отсутствии единицы в проверяемом разряде. Это сократит код на 12 байт и ускорит его, если не ошибаюсь, на 48 тактов.

- - - Добавлено - - -

И ещё запись "sta KEYKOD" можно было бы сделать всего один раз... В общем, принцип "любую программу можно сократить как минимум на одну команду" работает. :)


Improver, спасибо за полезный совет !!
Реальная оптимизация кода :)

reddie
07.08.2021, 14:20
Влезу не в свою стихию (кодил для Z80), но захотелось поучаствовать из спортивного интереса.
Почитал доки по 580ВМ80 - это же аналог i8080, то есть лайтовая версия Z80. Так что вперед =)
Можно сократить процедуру, проверяя кнопки сдвигом аккумулятора вместо AND с перезагрузкой каждый раз.
Переделал обработку условий: вместо кучи jmp и jr (jnz) теперь однобайтовые ret, экономим память.
То есть подразумевается, что JOY вызывается по call, а не просто вставлена в текст кода.
Кстати, в процедуре или опечатка, или так и должно быть, но обе кнопки (1 и 2) дают значение FE на выходе.
Писал с учетом этого, но если должны выходить разные значения - раскомментировать команду "mvi l,число".
Убрал кучу лишних меток и переставил местами проверки направлений из-за положения битов в регистре.
Как понял, если ничего не нажимали - значение в KEYKOD не переписывается.
Получится примерно так (если где ошибся в написании команды - прощу пардонить):

JOY:
in 06h ; читаем порт джойстика
cma ; инвертируем
call joy_test ; проверки выделены в подпрограмму для замены jmp и jr на ret'ы
ret nc ; выходим без записи кода, если ничего не жали
mov a,l ; получаем код
sta KEYKOD ; записываем код
ret ; конец процедуры

joy_test:
mvi l,0FEH ; код "ТАБ"
rlc ; проверяем бит первой кнопки, флаг С=1 - кнопка нажата
ret c; кнопка нажата - возврат в JOY
; mvi l,число ; - это если нажатия кнопок 1 и 2 различаются, иначе не нужна
rlc ; проверяем бит второй кнопки, они равнозначны с 1-й, судя по исходному коду
ret c; любая из кнопок 1 и 2 дает код клавиши "ТАБ"

rlc
rlc ; пропускаем 5-й и 4-й незначащие биты

mvi l,07FH ; код "вниз"
rlc ; проверяем бит направления (3-й, значение 8)
ret c

mvi l,0DFH ; код "вверх"
rlc ; вверх (2-й, значение 4)
ret c

mvi l,0EFH ; код "влево"
rlc ; влево (1-й, значение 2)
ret c

mvi l,0BFH ; "код вправо"
rlc ; вправо (0-й, значение 1)
ret ; безусловный выход, все проверено


Итого процедура сократилась раза в два. Прошу написать точные числа исходной и моей, лень считать =)
Да, еще кое-что: в данном виде процедуры не предусматривают обработку диагональных направлений,
то есть нажатия сразу вверх+влево, например. При этом на джойстике может быть еще и огонь нажат.
Хотя на любой платформе с любым джойстиком возможно движение по диагонали + огонь сразу.

metamorpho
07.08.2021, 17:11
reddie, спасибо !!
Отличный вариант оптимизации кода, буду применять эти идеи в будущем.

reddie
07.08.2021, 20:55
буду применять эти идеи в будущем
Пользуйтесь на здоровье)) но в будущем при разработке блока управления, если предполагается джойстик, лучше сразу заложить возможность диагональных нажатий,
а также одновременных нажатий кнопки "огонь" или что там на ней будет, да и второй кнопки тоже. Код усложнится, зато игровой процесс станет интереснее.
Реализация клавиатуры Вектора, как понимаю, отслеживает только одну клавишу в момент времени (как на БК), это плохо, но терпимо. Для игр есть джойстик.
А чтобы реализовать момент с "диагоналями и fire", процедура скана выдает на выходе не код "клавиши", а суммарную маску нажатых клавиш.
То бишь, в принципе, можно брать прочитанный байт из порта джойстика и обрабатывать все "нажатые" биты, изменяя с их учетом координаты спрайта, например.
Если были нажаты биты влево и вверх - уменьшаем Х, увеличиваем Y (или уменьшаем, смотря откуда считается начало экрана, сверху или снизу).
Для особого прикола можно одновременно обработать и влево, и вправо, главное, чтобы при этом итоговая координата не изменилась (+1-1 равно ноль).
Зачем? Для сопряжения с управлением клавиатурой. Сканируем коды с нее (если клава позволяет, как на Спектруме, опросить сразу несколько клавиш)
или код (если можно опросить только одну), интерпретируем в коды направлений/нажатий и суммируем это с байтом из порта джойстика по OR.
На выходе получим универсальное значение от всех устройств, с которым проще работать. Надеюсь, идея понятна. С реализацией, если что, поможем.

ivagor
07.08.2021, 21:10
Реализация клавиатуры Вектора, как понимаю, отслеживает только одну клавишу в момент времени (как на БК), это плохо, но терпимо.
Можно отслеживать несколько клавиш клавиатуры одновременно, но с ограничениями.

и суммируем это с байтом из порта джойстика по OR.
Проще отказаться от лишних команд инвертирования и комбинировать клавиатуру и преобразованные направления с джойстика по and.

reddie
07.08.2021, 21:33
Проще отказаться от лишних команд инвертирования и комбинировать клавиатуру и преобразованные направления с джойстика по and
Да, это уже детали реализации на конкретной платформе. Не в курсе тонкостей опроса клавы на Векторе, поэтому описал саму идею.

ivagor
08.08.2021, 13:46
Несколько отвлеченное рассуждение. Авторы УСПИД/ПУ джойстика похоже собирались максимально упростить одновременный опрос джойстика и клавиатуры (если огонь - ЗБ). Единственный странный момент - они зачем-то поменяли вверх и вниз по сравнению с клавиатурой. Вот раскладка -П/-С более загадочная.

KTSerg
09.08.2021, 07:25
...
mvi l,07FH ; код "вниз"
rlc ; проверяем бит направления (3-й, значение 8)
ret c
...
Не помню, когда последний раз пользовался возвратом из подпрограммы по условию...
В i8080 это вроде-бы мнемоника не "RET C", а "RC" (но зависит от компилятора, возможно и ret c переварит).

Но если бы я делал обработку джойстика, то я бы вообще не занимался её обработкой, а наложил бы считанный код на код считанный из клавы, преобразовав его предварительно с помощью таблицы. Там таблицы всего 16 байт, из них полезных 9 байт.
В таблице коды соответствия состояния джойстика и клавиш клавиатуры.
Для простоты, таблицу расположил-бы начиная с адреса 0103h, тогда получился-бы примерно такой код.

in 06
ani 00Fh
adi 003h
sta adrk+1
adrk:
lda 0103h
mov b,a
lda KEYS (адрес где хранится уже считанный код клавы ряда с клавишами курсора)
ana b (наложил джойстик на клавиши)
sta KEYS (и пусть теперь основной код обработки нажатий клавиш разбирается)
;
in 06
ani 0C0h (выделение кнопок джойстика)
... тут код совмещения с нужными клавишами клавы, их меньше - таблица уже не нужна.


Главное преимущество, с моей точки зрения, что эта часть программы всегда выполняется одинаковое количество тактов вне зависимости от того используется-ли джойстик, и какие контакты на нём замкнуты... предсказуемость времени выполнения кода...

Если "нормализовать" код считанный из УСПИД-а, то и его таким методом можно юзать... таблица там будет возможно другая, но дело поправимое...

reddie
09.08.2021, 08:56
Не помню, когда последний раз пользовался возвратом из подпрограммы по условию...
Ну, на Спектруме (Z80) условные call и ret довольно распространенная практика. Таблицы там тоже юзают, тут просто суть задачи была максимально сократить код.
Любые таблицы это дополнительные байты, плюс 16 байт - это лишь кнопки направлений, без кнопок "огонь1" и "огонь2" (или как их принято называть на Векторе).
Про совмещенную обработку клавы+джойстика - да, в идеале так и делается. metamorpho, полагаю, учтет это в будущем =)
Его код опроса напоминает обработку бейсик-программы компилятором, но ему простительно, он только учится. Главное - подсказывать, как и что.

KTSerg
09.08.2021, 10:10
А если в начале сделать инверсию кода, то можно обойтись таблицей в 11 байт, из которых 9 полезных, т.к. одновременное срабатывание контактов вверх и вниз не возможно, а это будут старшие 4 кода, плюс ещё одна комбинация одновременного нажатия вправо/влево.

in 06
cma
ani 0F
...

- - - Добавлено - - -

[QUOTE=reddie;1126966]Ну, на Спектруме (Z80) условные call и ret довольно распространенная практика. ...QUOTE]
Из-за близости архитектуры процессоров, можно предположить, что использование call и ret с условиями, это вопрос стиля программирования, а не особенность программирования на конкретном железе.

- - - Добавлено - - -

Можно даже без инверсии использовать таблицу в 11 байт, нужно только предусмотреть смещение адреса начала таблицы на 5 байт вниз, т.к. они не будут востребованы.

Improver
09.08.2021, 10:18
Из-за близости архитектуры процессоров, можно предположить, что использование call и ret с условиями, это вопрос стиля программирования, а не особенность программирования на конкретном железе.Подтверждаю. Те же МДОС Т-34, Т-72, РДС имеют в своих исходниках достаточное количество и возвратов по условию, и вызовов продпрограмм.

reddie
09.08.2021, 11:56
имеют в своих исходниках достаточное количество и возвратов по условию, и вызовов

использование call и ret с условиями, это вопрос стиля программирования
Cогласен, это больше вопрос стиля, да и любую программу можно написать тысячью способов.
Но, учитывая, что Z80 - это 8080 (ВМ80) "на спидах", на нем полет фантазии шире.
Например, сдвиги любых регистров, индексные регистры и много чего еще. Но это к джойстикам не относится, оффтоп.

nzeemin
12.08.2021, 11:48
Имеем четыре типа джойстиков. Как они распределялись по популярности/распространённости? То есть, какие прежде всего стоит поддерживать у себя в игре?
(Пока предварительно считаю, что это Джойтик-П и Джойстик-С.)

KTSerg
12.08.2021, 14:55
Имеем четыре типа джойстиков. Как они распределялись по популярности/распространённости? То есть, какие прежде всего стоит поддерживать у себя в игре?
(Пока предварительно считаю, что это Джойтик-П и Джойстик-С.)
Джойстики "П" и "С" - это фактически аппаратные паты джойстиков, либо для игр на два игрока, либо предусматривать выбор не только типа Джойстика, но и конкретного джойстика ид пары - для корректности... если в игре обрабатывается/используется только один джойстик.
Причём нужно помнить, что Джойстик-С - это фишка .02-го Вектора.
Если в игру вставляется выбор джойстиков, воткнуть ещё и УСПИД - по идее не должно представлять особой проблемы.

svofski
12.08.2021, 15:32
А нельзя опрашивать сразу П, С и УСПИД? Или, если почему-то возникает конфликт, ждать что первым будет потрогано и на основе этого делать выбор контроллера.

KTSerg
12.08.2021, 15:41
А нельзя опрашивать сразу П, С и УСПИД? Или, если почему-то возникает конфликт, ждать что первым будет потрогано и на основе этого делать выбор контроллера.
На ПУ может не быть Джойстика, но при его опросе, может быть принят "шум" от чего-то висящего на "ПУ"... там много чего может быть подключено... кроме Джойстиков ;)

svofski
12.08.2021, 16:00
А что например может там так шуметь, постоянно дергая биты без провокации?

ivagor
12.08.2021, 16:09
Можно детектировать .02 или 6128, что автоматом даст -С. Инициализируем и опрашиваем -П, если там 1 во всех битах кнопок и направлений, то считая, что пользователь в данный момент не трогает джойстик, дальше можем опрашивать -П (если джойстика там нет - ничего страшного, главное чтобы значения порта не менялись и в битах джойстика оставались 1). -С и -П легко опрашивать параллельно, только надо отключить соответствующие inы (заменить на mvi a,), если -С или -П не обнаружены.

nzeemin
12.08.2021, 21:51
На экране написано "PRESS FIRE TO START".
По идее, можно автоматом выбирать джойстик по нажатию Fire на нём - изменившийся битик покажет, какой джой дальше опрашивать.

- - - Updated - - -


ivagor, без Arcade Volleyball грустно.

Таки сделали аутентичный Arcade Volleyball или нет?
В 2010 я делал клон под Dingoo, на чистом Си: https://boards.dingoonity.org/dingoo-releases/arcade-volleyball-0-2/

svofski
13.08.2021, 03:24
Таки сделали аутентичный Arcade Volleyball или нет?
В 2010 я делал клон под Dingoo, на чистом Си: https://boards.dingoonity.org/dingoo-releases/arcade-volleyball-0-2/

До сих пор не встречал. Может быть можно логику твоего клона скомпилировать ACK-ом, добавить спрайты и получить аутентичный AV на Векторе? CGA-шные цвета он потянет =)

KTSerg
20.08.2021, 07:13
Откопал сегодня свой старый джойстик 90-ых годов...
Не помню уже его историю... от какого компа он был в оригинале...
На основании две кнопки. На самом джойстике обе кнопки конструктивно представляют из себя одну кнопку, т.е. под кнопками расположены контактные/пружинные пластины, которые замыкаются между собой. :(
На шнурке уже мною сделан переходник на стандарт "Джойстика-П", с гнездом для подключения к переходнику второго джойстика.
И оставлен "родной" штекер DIN-5pin. Корпус штекера звонится как общий, контакты - это направления и спаренная кнопка джойстика. Судя по всему, в оригинале, кнопки на основании вообще не использовались.
Если пластик не треснет от старости, нужно подумать, как разделить кнопки на джойстике... разберу, может микрики получится воткнуть...

Improver
20.08.2021, 13:28
Откопал сегодня свой старый джойстик 90-ых годов...
Не помню уже его историю... от какого компа он был в оригинале...А это мой джойстик от Вектора:
75985

Историю его помню: покупал в магазине электроники "Алиса" (был такой в Волгограде), не думаю, что он был для какого-то конкретного компа, продавался без разъёма. Сам его переделывал -- контакты направлений заменил микриками, кнопки там две и они выведены отдельными проводами. Подключался в разъём ПУ в двух вариантах (переходник не помню где), и непосредственно к кнопкам клавиатуры, играл им в играх даже без поддержки джойстиков.

dk_spb
20.08.2021, 14:57
У вектора были вроде "родные" джойстики. По-крайней мере в комплекте с ПК6128 шли джои. Фотографировать пока некогда :-(

nzeemin
24.08.2021, 17:47
Разные начальные загрузчики могут оставить ПУшную ВВ55 в разном состоянии.
Если загрузка была из внешнего пзу/картриджа, то порт 6 запрограммирован на ввод, но остается вопрос насчет порта 5, который управляет выбором джойстиков. Теоретически может получится ситуация, когда один или оба джойстики будут отключены, но я так понимаю, что это может быть неактуально для упрощенного подключения -П с одним джойстиком.
А вот 512 байтный загрузчик, который был штатно установлен в большинстве векторов, программирует порт 6 на вывод и опрос джойстика без инициализации не получится.


mvi a,83h
out 4

Это и есть инициализация для опроса джойстика-п (даже сразу двух джойстиков).

Подскажите, как правильно инициализировать порты, чтобы все джойстики работали? - в смысле, чтобы успешно опрашивались.
Вот с такой инициализацией:
mvi a,60h \ out 5
mvi a,83h \ out 4
- под эмулятором VV 7.02 - работает джой-С (сразу оба порта 0e/0f) и джой-П (порт 06), но НЕ работает УСПИД (порт 07 - все нули);
- под MiSTer FPGA - работает джой-С (порт 0e) и УСПИД (порт 07), но НЕ работает джой-П (порт 06 - все единички).
Приложил свой тест в этом сообщении - он сделан на основе теста от svofski - может кто-то проверит на реале?

ivagor
24.08.2021, 18:28
Для одновременного опроса -П и УСПИД я бы попробовал инициализировать так
mvi a,92h (или 93h, вряд ли будет разница)
out 4
При этом оба -П теоретически должны быть запараллелены (опрашиваются одновременно).
А -С инициализировать не надо, да и не получится, но желательно детектировать его наличие. Возможны разные варианты, но я бы предложил остановиться на консервативном - если из 0E/0F читается FF, то -С есть (и даже если его на самом деле нет, это ничего не испортит и ничему не помешает).

nzeemin
24.08.2021, 18:38
Для одновременного опроса -П и УСПИД я бы попробовал инициализировать так
mvi a,92h (или 93h, вряд ли будет разница)
out 4
При этом оба -П теоретически должны быть запараллелены (опрашиваются одновременно).
А -С инициализировать не надо, да и не получится, но желательно детектировать его наличие. Возможны разные варианты, но я бы предложил остановиться на консервативном - если из 0E/0F читается FF, то -С есть (и даже если его на самом деле нет, это ничего не испортит и ничему не помешает).

Да, с инициализацией
mvi a,60h \ out 5
mvi a,92h \ out 4
в VV 7.02 заработали все три джоя - уже прогресс. Спасибо!
По-прежнему стоит вопрос - а что на реале? приаттачил тут поправленный бинарник.
Исходник тут - https://gist.github.com/nzeemin/db9333c66b02a68b25f8057cfb29be1a

ivagor
24.08.2021, 19:04
mvi a,60h \ out 5
А это зачем? И если после этого сделать mvi a,92h \ out 4, то становится неважно, что было записано в порт 5 ранее.

KTSerg
25.08.2021, 06:26
А это зачем? И если после этого сделать mvi a,92h \ out 4, то становится неважно, что было записано в порт 5 ранее.
Понятно ведь "зачем" - попытка отключить джойстики.
Просто последовательность должна быть наоборот:
сначала инит портов out 04, а уже потом вывод в них команд управления джойстиками out 05.

Только вариант:
mvi a,7fh \ out 5
возможно будет более корректным для "ПУ", т.к. значения "0" - обычно включают какую-нибудь периферию, исключение - старший бит включение внешнего ПЗУ при "1".

ivagor
25.08.2021, 08:14
попытка отключить джойстики
Зачем отключать (сразу оба) джойстика-п, если дальше предполагается их использовать? На большинстве ВВ55 последовательность mvi a,92h (или 93h) \ out 4 и настроит режимы ввода-вывода портов и включит параллельно оба джойстика-п (по крайней мере у меня с платкой из центра компьютер это работало именно так, только я засылал 83h, т.к. у меня УСПИД-джойстика не было и я не собирался его опрашивать). Ну и для полного счастья еще и старший бит порта 5 будет=0.

KTSerg
25.08.2021, 08:28
Зачем отключать (сразу оба) джойстика-п, если дальше предполагается их использовать? На большинстве ВВ55 последовательность mvi a,92h (или 93h) \ out 4 и настроит режимы ввода-вывода портов и включит параллельно оба джойстика-п (по крайней мере у меня с платкой из центра компьютер это работало именно так, только я засылал 83h, т.к. у меня УСПИД-джойстика не было и я не собирался его опрашивать). Ну и для полного счастья еще и старший бит порта 5 будет=0.
Можно конечно включить одновременно все три джоя и попросить пользователя сделать что-то конкретное, отследив изменения на входе "ПУ" и первым делом определив "П" это или "УСПИД"... а дальше решать - что делать...
Просто я сторонник сначала всё отключать, а потом уже включать/проверять наличие оборудования по списку...

ivagor
25.08.2021, 10:08
Что касается детекта -П, то в принципе после инициализации (и если пользователь пока не дергает джойстик) из порта 6 должно читаться значение 11XX1111. Если оно читается, то можно опрашивать -П, "плохого вклада" (ложных нажатий) он не внесет.

KTSerg
25.08.2021, 10:15
Что касается детекта -П, то в принципе после инициализации (и если пользователь пока не дергает джойстик) из порта 6 должно читаться значение 11XX1111. Если оно читается, то можно опрашивать -П, "плохого вклада" (ложных нажатий) он не внесет.
Вот блин, постоянно забываю, что УСПИД "инверсный", и в состоянии покоя читаются сплошные "0"...

nzeemin
25.08.2021, 13:08
Понятно ведь "зачем" - попытка отключить джойстики.

Вообще желание было получить кусок кода, который всё правильно инициализирует и включит все джойстики, чтобы дальше их все опрашивать.
Ну или для двух-трёх наиболее популярных джоев это сделать.

ivagor
25.08.2021, 14:04
для двух-трёх наиболее популярных джоев
Для вектора общеизвестны всего 3 варианта (УСПИД, -С и -П), так что если они поддержаны, то можно считать что поддержаны все виды джойстиков. В радиолюбителе еще был вариант с подключением джойстика параллельно курсорным клавишам, но это уже опрос клавиатуры.

parallelno
05.06.2023, 10:24
Ребята, что-то не клеется у меня с джойстиками.
В наличии имею XBox джойстик как тут https://www.xbox.com/en-US/accessories/controllers/xbox-wireless-controller-usb-c

Попробовал прекрасный тест тут https://svofski.github.io/pretty-8080-assembler/?https://gist.githubusercontent.com/svofski/5903638d517e282d14bbf7290346b50c/raw/9f0e59e6cbf0382aa29a89346f8b1b192cdc1799/joytestc
Не реагирует на нажатия.

Для проверки работоспособности установил эмулятор SNES от сюда https://www.emulator-zone.com/snes/snes9x,
зашел в MainMenu -> Input Config, назначил клавиши своего джойстика.
Скачал в игру от сюда https://dl.emulator-zone.com/download.php/roms/snes/Commodore-64_Collection_(E)_(PD).zip
Запустил, управление с джойстика отличное.

В чем может быть проблема? Подскажите пожалуйста.

- - - Добавлено - - -

Пожалуйста, может что-нибудь (кто уже разобрался с использование джойстиков) написать три примера с инициализацией, опросом, и выключением джойстика N1 для каждого типа джойстика УСПИД, ПУ, Вектор-06ц.02? Я перечитал тему несколько раз, почитал документы ссылки на которые тут опубликованы, но так и не нашел полную и непротиворечивую информацию к сожалению.

- - - Добавлено - - -

Из того что я нашел:

nzeemin опубликовал инициализацию джойстиков П1 и П2


mvi a, 60h ; биты для опроса обоих джойстиков-П
out 5 ; инициализация для джойстик-П
mvi a, 92h ; управляющее слово ВВ55
out 4 ; инициализация ВВ55


ivagor утверждает что последние две команды отключат оба джойстика и предлагает свой вариант


mvi a,92h (или 93h) \ out 4 ; настроит режимы ввода-вывода портов и включит параллельно оба джойстика-п


В примерах от svofski:
https://svofski.github.io/pretty-8080-assembler/?https://gist.githubusercontent.com/svofski/5903638d517e282d14bbf7290346b50c/raw/9f0e59e6cbf0382aa29a89346f8b1b192cdc1799/joytestc
https://github.com/svofski/incursiondelrio/blob/master/input.inc
я не нашел инициализацию через out 4 и out 5.

В журнале по ссылке от x-code на странице 30 для джойстика П указано что после mvi a,83h\out 4 нужно выбрать какой джойстик мы опрашиваем. Это нужно сделать записью в порт C но не указан пример программы как это сделать.

Improver поделился инициализацией и опросом джойстика УСПИД


JOY: PUSH B ; сохраняем рег. пару ВС Выходной параметр:
XRA A ; обнуляем аккумулятор
OUT 07 ; обнуляем порт 07 в (A)-код
IN 07 ; считываем число из порта 07 бит: 0-"СС"
MOV B,A ; сохраняем его в регистре В 1-"УС"
IN 01 ; считываем число из порта 01 2-"FIRE2"
ANI 60H ; выделяем биты клавиш "УС" и "СС" 3-"FIRE1"
RAL ; передвигаем их на 3 разряда влево 4-"влево"
RAL ; 5-"вниз"
RAL ; 6-"вправо"
ORA B ; "накладываем" регистр В на аккумулятор 7-"вверх"
POP B ; восстанавливаем рег. пару ВС
RET ; возврат из п/п


metamorpho поделился своим варианом инициализации джойстика П


joy:
mvi a,83h
out 4

b2m
05.06.2023, 10:24
В чем может быть проблема?
Видимо в том, что реальный джойстик не все эмуляторы поддерживают. Мой, например, не поддерживает.

parallelno
05.06.2023, 11:05
Можно и без джойстика, надо нажать NumLock и управлять клавишами дополнительной клавиатуры.

Можно ли как-то проверить какому джойстику NumLock и клавиши дополнительной клавиатуры соответствуют? Какие клавиши соответствуют кнопке1 и кнопке2 джойстика?

- - - Добавлено - - -

Еще заметил что в первом посте от svofski кнопки 1 и 2 для джойстика П соответствуют битам 7 и 6. У джойстика С соответствуют битам 6 и 7. Но ivagor вроде как пишет что они различаются только портом.

Еще в первом посте svofski у джойстика УСПИД указаны биты только для направлений и кнопка1, а в примере Improver еще есть "FIRE2" на втором бите.

- - - Добавлено - - -

Если кто в курсе какие данные верные, сообщите плиз.

svofski
05.06.2023, 11:06
В v06x должна засветиться иконка геймпада, или две: https://i.imgur.com/MxqRN98.png
У себя проверил, тест работает с 8bitdo SN30Pro по USB. Раньше проверял с блутусом тоже. Первый пультик на портах $7 и $e. П, который на ПУ, мой тест не показывает, но в эмуляторе $0e вроде бы должен дублироваться на PB2.

Pyk
05.06.2023, 15:46
У меня тоже руки не дошли пока прикрутить к Emu80 поддержку реального джойстика (геймпада)...

nzeemin
05.06.2023, 19:53
nzeemin опубликовал инициализацию джойстиков П1 и П2


mvi a, 60h ; биты для опроса обоих джойстиков-П
out 5 ; инициализация для джойстик-П
mvi a, 92h ; управляющее слово ВВ55
out 4 ; инициализация ВВ55


Я потом переделывал, потому что не работало на реале.
То как сейчас можно посмотреть тут: https://github.com/nzeemin/vector06c-asteroids/blob/master/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

В прерывании:


; Joystick scan
in 6 ; read Joystick-P
KEYINT_J:
xri 0 ; XOR with initial value - mutable param!
cma
sta JoystickP ; save to analyze later

Затем вот тут уже можно посмотреть как биты джойстика анализируются вместе с клавиатурой: https://github.com/nzeemin/vector06c-asteroids/blob/master/asteroid1.asm#L1648

parallelno
05.06.2023, 21:29
nzeemin, супер спасибо!!!

- - - Добавлено - - -

nzeemin,


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!

Поясни пожалуйста этот кусочек кода. В инициализации ты считываешь код клавиш джойстика. В опросе ты считываешь код снова и делаешь XOR с кодом который ты считал в инициализации. Что это дает?

nzeemin
05.06.2023, 21:40
nzeemin,


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!

Поясни пожалуйста этот кусочек кода. В инициализации ты считываешь код клавиш джойстика. В опросе ты считываешь код снова и делаешь XOR с кодом который ты считал в инициализации. Что это дает?

А это я у кого-то подсмотрел, наверное у svofski -- так ты фиксируешь "свободное" состояние битов, а потом смотришь только на их изменение.
То есть, тебе не важно, какое состояние является "нажато" - 0 или 1.
Плюс, видимо ещё -- если джойстика там вообще нет, ты опять же не будешь реагировать, какие бы битики там не стояли.

parallelno
05.06.2023, 22:28
nzeemin, правильно ли я понимаю что в случае если джойстик есть, то после инициализации в KEYINT_J будет FFh. Затем в опросе с помощью xri мы получим инвертированное значение, а потом ты еще раз инвертируешь значение. Скажи пожалуйста зачем это нужно?

Если джойстика нет, то что будет в KEYINT_J?

Твой код какие джойстики поддерживает?

nzeemin
05.06.2023, 23:41
nzeemin, правильно ли я понимаю что в случае если джойстик есть, то после инициализации в KEYINT_J будет FFh. Затем в опросе с помощью xri мы получим инвертированное значение, а потом ты еще раз инвертируешь значение. Скажи пожалуйста зачем это нужно?

Если джойстика нет, то что будет в KEYINT_J?

Твой код какие джойстики поддерживает?

Этот код рассчитан только на Джойстик П, любой из двух.
При инициализации в KEYINT_J+1 кладём значение из порта без инверсии -- т.е. то что там есть без всяких нажатий (предполагаем что при загрузке игры джойстик не трогают). Судя по описанию, это будет FFh.
Потом при опросе мы делаем xor с этим начальным значением - получаем биты в 1 которые отличаются от начального значения.
Ещё одно инвертирование (cma) сделано для того чтобы в процедуре ReadKeyboard биты джойстика обрабатывались так же как биты клавиатуры -- а там 1 это отжато, 0 нажато.

> Если джойстика нет, то что будет в KEYINT_J?
Там будет то что отдаёт порт, не важно что, лишь бы оно не менялось.

Проверял этот код на Векторе в MiSTer FPGA, и кто-то ещё проверял на реале, везде работает.

ivagor
06.06.2023, 06:54
Ещё одно инвертирование (cma) сделано для того чтобы в процедуре ReadKeyboard биты джойстика обрабатывались так же как биты клавиатуры -- а там 1 это отжато, 0 нажато.
Занудное (и наверное лишнее) замечание, но все же - чтобы изменившиеся биты джойстика обрабатывались так же как биты клавиатуры. Если брать исходные значения опроса -П (и -С), то они как и у клавиатуры - 1 отжато, 0 нажато. "Позитивный" джойстик только ПУ/УСПИД, насколько я помню.

parallelno
06.06.2023, 12:42
Все понял. Спасибо!

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
У тебя получается короче плюс хорошее преимущество в том что его можно легко масштабировать до большего числа опрашиваемых линий!

nzeemin
06.06.2023, 14:56
parallelno, возможность для оптимизации конечно есть. Но для вас сейчас наверное важнее возможность реконфигурирования опроса -- разные джои, переопределяемые клавиши.

А насчёт "У тебя получается короче" -- тут как на том меме, где два программиста:
-- Я украл твой код.
-- Это не мой.

parallelno
08.06.2023, 11:01
Я потом переделывал, потому что не работало на реале.
То как сейчас можно посмотреть тут: https://github.com/nzeemin/vector06c-asteroids/blob/master/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

В прерывании:


; Joystick scan
in 6 ; read Joystick-P
KEYINT_J:
xri 0 ; XOR with initial value - mutable param!
cma
sta JoystickP ; save to analyze later

Затем вот тут уже можно посмотреть как биты джойстика анализируются вместе с клавиатурой: https://github.com/nzeemin/vector06c-asteroids/blob/master/asteroid1.asm#L1648

я правильно понимаю что ты инициализируешь оба джойстика в Joystick init, но опрашиваешь только один? Если да, то зачем инициализировать два джойстика?

- - - Добавлено - - -


parallelno, возможность для оптимизации конечно есть. Но для вас сейчас наверное важнее возможность реконфигурирования опроса -- разные джои, переопределяемые клавиши.

А насчёт "У тебя получается короче" -- тут как на том меме, где два программиста:
-- Я украл твой код.
-- Это не мой.

Я кстати до сих пор не могу решить есть ли смысл давать пользователю переопределять клавиши перемещения. Это кажется сильно не нужной опцие так как на Векторе есть клавиши стрелок и на джойстике они тоже есть.

nzeemin
08.06.2023, 11:16
я правильно понимаю что ты инициализируешь оба джойстика в Joystick init, но опрашиваешь только один? Если да, то зачем инициализировать два джойстика?

Тут идея была, что черз порт 5 мы включаем оба джойстика, и после этого с порта 6 мы читаем состояние сразу для обоих.
Но это я не тестировал, не могу уверенно сказать что это так работает.

parallelno
08.06.2023, 19:13
nzeemin, ок, понял. Хорошо бы найти описание инициализации, а то как магия предков какая-то.