PDA

Просмотр полной версии : Корректность поддержки Kempston Mouse в разных эмуляторах



Oleg N. Cher
10.03.2021, 12:34
Всем привет.

Столкнулся с тем, что в EmuZWin под Windows 7 мышка ведёт себя дёрганно и очень странно. По вертикали ещё ничего, хотя и дёргается, но терпимо. А вот по горизонтали даже нельзя проехать слева направо без глюков.
Делаю поддержку мышки для одной игры. На реале тестить возможности нет.
Под какими эмуляторами поведение мышки эмулируется самым правильным образом?
Является ли дёрганность мышки в EmuZWin особенностью, проявляющейся только на виндах выше XP? (или, предположительно, Vista). Ведь он был разработан ещё во времена, когда семёрки не было.
Что вообще делать? :-)

P.S. Код пробовал разный. И от Chris Cowley (https://worldofspectrum.net/infoseekid.php?id=0014620). И от Velesoft (https://velesoft.speccy.cz/k-mouse_driver.htm). Явно не в коде дело.

P.P.S. Spectaculator и FUSE ведут себя с мышкой тоже как-то неуверенно. Почему и парюсь. Ведь как-то делают, чтобы работало на разных эмулях.

tiboh
10.03.2021, 14:08
Тоже столкнулся с этой проблемой, дёрганым перемещением стрелки мыши в Windows 10 в эмуляторе unreal. В Spectaculator'е и EmuzWin'е всё работает нормально.

goodboy
10.03.2021, 14:21
Под какими эмуляторами поведение мышки эмулируется самым правильным образом?
CBSpeccy на Амиге, но там и система/железо изначально заточено под мышь

Oleg N. Cher
10.03.2021, 15:29
CBSpeccy на АмигеТо есть, ответ как бы намекае, что это эмули виноваты, так или иначе?
Ладно, в любом случае, ответ слишком экзотичный и малоприменимый для меня (CBSpeccy внутри эмуля Амиги?).

goodboy, я знаю, что Вы сделали поддержку мыши для многих игр. Поделитесь наработками, кодом? Может советами?

Даже код определения наличия мышки и то весьма широко варьируется в прессе. А у меня в этом опыта нет - я сидел в своё время на Орели-БК08 без мышки, AY и TR-DOS.

zebest
10.03.2021, 16:41
Z80Stealth - мышь одинаково хорошо бегает и в ХР, и в W7-64

goodboy
10.03.2021, 18:20
собственных наработок у меня нет, использовал от VeleSoft`a.
вспоминаю только что лучше координаты вычислять по максимуму,
а потом масштабировать (делить) под нужное окно.
ну и определить наличие мышки довольно проблематично,
на фирме может сработать эффект `порта #FF`

Spectramine
10.03.2021, 22:06
Координаты у кемпстон мыши изменяются циклически, в отличие от PC-мыши, из-за этого и рывки - из-за дискретности эмуляции некорректно пересчитывается абсолютное изменение координат PC-мыши в относительное изменение координат кемпстон мыши. Чтобы избавиться от рывков, попробуйте уменьшить чувствительность PC-мыши в настройках Windows.

По поводу определения kempston mouse - "мышь считается отсутствующей, если из всех 3 её портов считывается одинаковое значение". Правда, есть нюансы - 1) на фирме с незадействованных портов во время вывода растра читаются значения считанных атрибутов, поэтому определение кемпстон-мыши лучше делать сразу после HALT; 2) на компьютерах с нестабильной шиной данных может произойти ложное определение наличия мыши, поэтому желательно ещё проверить значения из портов мыши на стабильность (предполагается, что в этот момент мышь не перемещается и её кнопки не нажимаются); 3) с вероятностью 1/65536 мышь может не определиться (если обе её координаты = #FF).

aquillov
10.03.2021, 23:05
На UnrealSpeccy 0.38.0 под Win10x64 таких проблем с мышкой не замечено. Единственное что - в некоторых играх она слишком чувствительная, носится как бешенная.

Oleg N. Cher
11.03.2021, 13:17
Да, я тоже отмечаю разную чувствительность мышки в разных эмулях. Поэтому и интересно: а как оно на реале?

То есть, нет смысла учитывать глюки разных эмулей и фиксить их программно, т.е. кодом на ZX, а не правками эмулей?

Ещё такой вопрос: если наличие мышки определилось некорректно (т.е. её нету, а код думает, что есть), могут ли при одновременном управлении с клавиатуры артефакты чтения портов мыши давать наложение управления как бы от мыши?

Что вообще можно сказать про глюки с мышкой в эмулях? Неужто авторы эмулей не сильно парились правильной поддержкой мыши?

goodboy
11.03.2021, 14:11
ещё вспомнил такой момент.
перед началом главного цикла программы надо прочитать/занести в переменные данные из портовXY.
нужно это для того что-бы при начале работы программы стрелка появилась там где задумал автор (например посередине экрана),
а не в произвольном месте. также это необходимо делать например при выходе из режима паузы (если он предусмотрен)

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


могут ли при одновременном управлении с клавиатуры артефакты чтения портов мыши давать наложение управления как бы от мыши?
так и будет. работа станет (практически) невозможной

Oleg N. Cher
11.03.2021, 16:11
Понятно. Спасибо. Буду пробовать.

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

Чуть более прояснилась ситуация с глюком мышки в EmuZWin. Абсолютная координата мышки X, прочитанная из порта #FBDF:

В FUSE и Spectaculator при достижении 255 и следующем движении мышки вправо из порта следующим читается 0.
А в EmuZWin читается 136. И получается, что при движении мыши вправо координата X находится в диапазоне {136..255} и никогда не опускается < 136. Насколько я понимаю, это некорректное поведение, которое даже и пофиксить программно (в коде Z80) нельзя - ведь в порт ничего не пишется, только читается из него.

Были ли у кого-то ещё подобные проблемы с EmuZWin?

Фиксил ли Денис Грачёв что-то, связанное с мышью, в EmuZWin Hack Edition?

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

Программка для тестирования этого глюка:
74909

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

P.S. Даже не 136, а 134.

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

Нащупал выход. И он, похоже, есть. Корявый немного, но для моих нужд сгодится. Мне надо больше направление, а скорость возьму грубо, не попиксельно.

Просто беру 7 младших битов из порта #FBDF, а старший бит игнорирую. Потом умножаю полученный X на 2.
Думал, дёрганье останется. Ан нет, нормально всё.

Как-то так: 74910

Bedazzle
11.03.2021, 23:22
Фиксил ли Денис Грачёв что-то, связанное с мышью, в EmuZWin Hack Edition?

Насколько помню, он больше в ассемблере копался.
Сам эмуль проблематично компилить, нужная версия библиотеки KOL потерялась.

Oleg N. Cher
13.03.2021, 09:35
Ну, если бы ковырять серьёзно, то можно было бы и нужную версию KOL найти, и даже адаптировать к новой.
Однако Кладов не захотел открыть исходники. Ну да это его дело, как итог теперь все просто юзают другие эмули.

У меня ещё вопрос: насколько важно читать координаты мыши из порта каждое прерывание? Или можно каждые 10 прерываний, а смещения координат "накопятся", как это и требуется?

Вообще частота обновления координат мышки и прерывания IM 1 / IM 2 как-то связаны?

Bedazzle
13.03.2021, 15:26
Ну, если бы ковырять серьёзно, то можно было бы и нужную версию KOL найти, и даже адаптировать к новой.
Однако Кладов не захотел открыть исходники.

Кладов всё что удалось найти из исходников - передал Грачёву. Денис говорил, что даже имея нужную версию KOL компиляция - это танцы с бубном.
А исходников либы не осталось. Потому имеем то, что имеем.


Ну да это его дело, как итог теперь все просто юзают другие эмули.

Не надо всех под одну гребёнку. Я использую именно кладовский эмуль.

goodboy
13.03.2021, 16:02
В FUSE и Spectaculator при достижении 255 и следующем движении мышки вправо из порта следующим читается 0. А в EmuZWin читается 136. И получается, что при движении мыши вправо координата X находится в диапазоне {136..255} и никогда не опускается < 136.

только что проверил на версии 2.7
тупо 1 print in 64479:run
мышь работает корректно. x=0/255

http://web.archive.org/web/20131011104926/http://kolmck.net/apps/EmuZ/EmuZWin_Rus.htm

Oleg N. Cher
13.03.2021, 18:16
У меня эта же версия. Мышь работает некорректно. x=от 134 до 255 (при движении вправо).
При движении влево всё нормально.

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


Кладов всё что удалось найти из исходников - передал Грачёву. Денис говорил, что даже имея нужную версию KOL компиляция - это танцы с бубном.
А исходников либы не осталось. Потому имеем то, что имеем.Ну, Грачёв, возможно, и не спец по KOL. А кто-то другой и собрал бы, особенно при содействии Кладова.

KOL разрабатывался на SVN. Это значит, что все версии сохранились.


Не надо всех под одну гребёнку. Я использую именно кладовский эмуль.Да я тоже. В основном. Но он иногда ведёт себя странно. Например, под ним DI:HALT не всегда вешается намертво.

Bedazzle
13.03.2021, 18:33
Ну, Грачёв, возможно, и не спец по KOL. А кто-то другой и собрал бы, особенно при содействии Кладова.

А если нет времени или желания содействовать, то приехали.


KOL разрабатывался на SVN. Это значит, что все версии сохранились.

Вовсе не значит.

Lethargeek
13.03.2021, 18:36
У меня ещё вопрос: насколько важно читать координаты мыши из порта каждое прерывание? Или можно каждые 10 прерываний, а смещения координат "накопятся", как это и требуется?
смещения-то накопятся, но чем чаще опрос, тем меньше вероятность перепутать переполнение с обратным движением

goodboy
13.03.2021, 19:09
У меня эта же версия. Мышь работает некорректно. x=от 134 до 255 (при движении вправо).
При движении влево всё нормально.
наверно глюк в твоём коде, начни с простого, проверь (как я ) в бейсике
.........
хотя если драйвер нормально работает в другом эмуле,
возможна некорректная (установка флагов?) эмуляция в EmuZWin

jerri
13.03.2021, 19:49
Вообще частота обновления координат мышки и прерывания IM 1 / IM 2 как-то связаны?

чем чаще ты читаешь из портов мыши тем точнее позиционируется курсор мыши.
обычно 50 раз в секунду хватает.

если читать реже то есть вероятность ухода за 128 единиц и курсор поедет в другую сторону.

Oleg N. Cher
13.03.2021, 21:21
jerri, спасибо. Я примерно так и предполагал, что чем чаще опрашивать - тем лучше.
Но и чаще 50 раз в секунду опрашивать тоже смысла нет, правильно?

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


А если нет времени или желания содействовать, то приехали.Ну да. Вот поэтому я так резковато и выразился про EmuZWin. Для меня он по сей день самый удобный в плане дебажить код. Но полная остановка его разработки заставляет искать другие эмуляторы. Тем более, что я тоже просил Кладова открыть код. А Грачёву он его дал под обещание нераспространения.

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


наверно глюк в твоём коде, начни с простого, проверь (как я ) в бейсике
.........
хотя если драйвер нормально работает в другом эмуле,
возможна некорректная (установка флагов?) эмуляция в EmuZWinА может быть дело в настройках EmuZWin? Хотя там вроде по мышке никаких особо настроек и нету.

Не, глюка в моём коде точно нет. Вот как примерно это выглядит (ссылка на видео на гуглдиске):
https://drive.google.com/file/d/1GSQgRx5MgDdIDNXGr5-Cr-Qc8p6Xuu_E/view?usp=sharing

goodboy
13.03.2021, 21:42
А может быть дело в настройках EmuZWin?
я скачав сразу его запустил и проверил (прога на бейсике) что читка из портаX корректная.
неужели так сложно проверить ?

Oleg N. Cher
13.03.2021, 22:23
Ну так я тоже проверил и написал внятно, что EmuZWin у меня под Win 7 при движении вправо дурит с координатой X. И прогу приложил, которая на FUSE и Spectaculator работает нормально. Неужели надо ещё мусолить с прогой на Бейсике и долго сомневаться в том, что я всё правильно чекнул? Видео посмотрел? Вот его и комментируй, если есть что сказать конечно.

goodboy
13.03.2021, 23:31
Неужели надо ещё мусолить с прогой на Бейсике
сложно набрать одну строчку ?
на видео результат твоего драйвера ?

Bedazzle
14.03.2021, 02:56
В FUSE и Spectaculator при достижении 255 и следующем движении мышки вправо из порта следующим читается 0.
А в EmuZWin читается 136.


Win 7. Неровное движение из-за моих кривых рук думаю.
https://www.dropbox.com/s/bs9rhxz2ldydd3o/mouse.avi?dl=0

Едем вправо:

https://i.imgur.com/5nI4iGs.png

Доезжаем до 255... И дальше мыша перепрыгивает на 0.

https://i.imgur.com/EGlNiy8.png

Oleg N. Cher
14.03.2021, 08:57
сложно набрать одну строчку ?
на видео результат твоего драйвера ?На видео результат твоей проги на Бейсике, но малость модифицированной мной, чтобы не мигала.

В общем, я верю, что на других компах такого глюка нету. Но у меня-то есть. Были бы исходники EmuZWin - точно докопался бы до сути проблемы. Ну а так - что ж поделать. Спишем на эмуль, успокоимся, будем не брать его в расчёт.

null_device
14.03.2021, 10:52
если наличие мышки определилось некорректно (т.е. её нету, а код думает, что есть), могут ли при одновременном управлении с клавиатуры артефакты чтения портов мыши давать наложение управления как бы от мыши?

Лучше делать как в ZX Format - автодетект с возможностью отключения, в случае ложного обнаружения оборудования (это полезно делать и просто для кемпстон джойстика в случае мультипортового способа управления).

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


Вообще частота обновления координат мышки и прерывания IM 1 / IM 2 как-то связаны?

"Православная" схема мыши, железно не завязана на это никак. Тупо, набор счетчиков, которые откликаются при обращении к нужным портам.

Oleg N. Cher
14.03.2021, 11:25
Лучше делать как в ZX Format - автодетект с возможностью отключения, в случае ложного обнаружения оборудованияПринимается. Так и сделаю.


(это полезно делать и просто для кемпстон джойстика в случае мультипортового способа управления).А мультипортовый способ управления это как? Это не когда Кемпстон-джойстик опрашивается не по IN #1F, а через порты мышки?

null_device
14.03.2021, 12:52
А мультипортовый способ управления это как?

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

Oleg N. Cher
14.03.2021, 12:54
Понятно. Наличие Кемпстон-джойстика, насколько я понимаю, тоже не определяется на 100%?

null_device
14.03.2021, 13:03
Кроме, того, что на фирменных машинах (и играх) и отечественных клонах, несколько отличается дешифрация порта... Ну, вроде как из него еще может считываться разное значение (как минимум, должны быть нули в пять младших разрядах). По факту, где как реализовано в железе.

http://sblive.narod.ru/ZX-Spectrum/ZXPORTsLIST/ZXPORTsLIST.htm

Dart Alver
14.03.2021, 15:49
Понятно. Наличие Кемпстон-джойстика, насколько я понимаю, тоже не определяется на 100%?
При грамотной постановке вопроса практически на 99.9 % можно избежать влияния на программу ложного определения. А само определение будет срабатывать только при отпущенных кнопках.


Кроме, того, что на фирменных машинах (и играх) и отечественных клонах, несколько отличается дешифрация порта... Ну, вроде как из него еще может считываться разное значение (как минимум, должны быть нули в пять младших разрядах). По факту, где как реализовано в железе.
Это можно последовательно контролировать - вначале 5 основных нулей (если есть, то базовая версия работает), потом дополнительные. Гдето на форуме этот вопрос уже обсуждался и ктото из завсегдатаев даже давал неплохой вариант определялки.

jerri
14.03.2021, 17:47
Понятно. Наличие Кемпстон-джойстика, насколько я понимаю, тоже не определяется на 100%?Определяется.
В _core в файле с управлением есть детект кемпстона

Oleg N. Cher
15.03.2021, 09:52
Давайте освежим эту тему. Сейчас я определяю наличие Кемпстон-мышки таким кодом:

unsigned char KMouse_Detect (void) __naked {
__asm
LD DE, #0x301
LD L, E
LD BC, #0xFADF
MT_D0: IN A, (C)
CPL
AND #7
JR Z, MT_D1
DEC L
RET ; FALSE
MT_D1: DEC DE
LD A, E
OR D
JR NZ, MT_D0
RET ; TRUE
__endasm;
} //KMouse_Detect

А наличие Кемпстон-джойстика таким кодом:

unsigned char DetectKempstonJoystick (void) {
__asm
; AUTOconfig
LD L,#0 ; FALSE
LD B,#250
A_config01$:
IN A,(#0x1F)
AND #0x1F
RET NZ
DJNZ A_config01$
INC L ; TRUE
__endasm;
}
Прокомментируйте. Совсем плохо или приемлемо?

jerri
15.03.2021, 12:51
А наличие Кемпстон-джойстика таким кодом:

unsigned char DetectKempstonJoystick (void) {
__asm
; AUTOconfig
LD L,#0 ; FALSE
LD B,#250
A_config01$:
IN A,(#0x1F)
AND #0x1F
RET NZ
DJNZ A_config01$
INC L ; TRUE
__endasm;
}
Прокомментируйте. Совсем плохо или приемлемо?

вполне нормально.
у тебя джойстик же с 1 кнопкой?
сейчас уже есть с 3

Oleg N. Cher
15.03.2021, 16:32
А я не знаю, у меня и джойстика-то нет. И реала нет.
Как ведёт себя старый код, работающий с джойстиком, у которого три кнопки?

jerri
15.03.2021, 17:02
А я не знаю, у меня и джойстика-то нет. И реала нет.
Как ведёт себя старый код, работающий с джойстиком, у которого три кнопки?

да также. просто еще 2 допбита задействованы.

Oleg N. Cher
15.03.2021, 17:22
Ого, круто. Не знал. За доп. кнопки отвечают пятый и шестой биты?

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

В случае трёхкнопочного джойстика процедура опроса его наличия использует маску #7F вместо #1F? Или логика автодетекта остаётся прежней?

jerri
15.03.2021, 20:05
Ого, круто. Не знал. За доп. кнопки отвечают пятый и шестой биты?

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

В случае трёхкнопочного джойстика процедура опроса его наличия использует маску #7F вместо #1F? Или логика автодетекта остаётся прежней?

возможно.
пока набросал вот такой тест
но на реальном джойстике с кнопками еще не тестил.




test_kemp
ld bc,#001f
ld l,b
ld e,b
i_00
in a,(c)
or e
ld e,a
dec l
jr nz,i_00

ld a,e
and c
jr nz,kemp_absent
ld c,#ff
kemp_mask_loop
ld a,e
and c
jr z,kemp_mask_set
srl c
jr kemp_mask_loop
kemp_mask_set
ld a,c
ld (kemp_mask),a
xor a
jr kemp_enable
kemp_absent
ld a,#c9
kemp_enable
ld (kemp_act),a
ret

Black Cat / Era CG
16.03.2021, 00:54
У меня ваще все 8 бит на сегападе, у Некста тоже 8 бит. Никаких полумер!

Black Cat / Era CG
16.03.2021, 01:06
Xpeccy умеет 8 кноп, Анрил - 7.

zebest
16.03.2021, 01:21
Xpeccy умеет 8 кноп, Анрил - 7
для Xpeccy у меня скиллов не хватит, а в анрил-e от TS ноябрьский релиз - у мну 5 кнопок тест кажет.
к слову - ZXUno 6 кнопок может.
upd: последний декабрьский ts-релиз - у мну тоже 5 кнопок (бит)

Black Cat / Era CG
16.03.2021, 06:31
Там должны быть настройки такого типа

JB1=KFIRE2
JB2=KFIRE3
Версия от 18 января 2019 (0.39.0)
Тестить доп.кнопы удобно в этой утилитке: https://drive.google.com/file/d/1OrInCO6NhdR7stBe5I1J4jqCs-G4MFjS/view?usp=sharing

Oleg N. Cher
21.04.2021, 06:05
А разве Kempston Mouse нельзя использовать одновременно с Kempston Joystick? Тем более, они ж на разных портах.

Если это не так, то почему EmuZWin при включении мышки джойстик "гасит"?

goodboy
21.04.2021, 10:53
А разве Kempston Mouse нельзя использовать одновременно с Kempston Joystick? Тем более, они ж на разных портах.
joy дешифруется всего по одной адресной линии - испанцы вообще его почти всегда опрашивают по #DF

null_device
21.04.2021, 19:26
А разве Kempston Mouse нельзя использовать одновременно с Kempston Joystick? Тем более, они ж на разных портах.

Все зависит от схемной реализации дешифратора (чтобы не было конфликта адресов). Сколько по этому вопросу в спорах, копий было сломано - не сосчитать. И все из-за "укороченной" дешифрации. Железячниками, ради экономии корпусов логики, и программистами - по ряду других причин. :D

Oleg N. Cher
22.04.2021, 01:29
Спасибо всем. Мне просто достаточно знать, что это не глюк эмулятора или какой-то мой бзик :)

zebest
22.04.2021, 21:18
А разве Kempston Mouse нельзя использовать одновременно с Kempston Joystick?
а5 же Z80Stealth в тесте (что несколько выше) одномоментно и мышь и джой опрашивает. Сделано правильным программером :)