Просмотр полной версии : Адаптация "PENCIL-DISC" для работы с мышью (на разъёме "ПУ").
Для начала пытаюсь анализировать программу, на предмет управления курсором...
И до меня вдруг доходит, что если попытаться пользоваться преимуществом мыши - быстрым смещением курсора на несколько пикселей в произвольном направлении, то я буду вынужден (в рамках драйвера мыши) формировать траекторию, по которой курсор должен двигаться от предыдущей позиции до новой, эту траекторию преобразовать в последовательность кодов соответствующих клавиш курсора, и заполнить этими кодами буфер клавиатуры.
Хотя, возможно я и ошибаюсь.
Так как при рисовании не должно быть резких движений как в играх, и больших смещений, скорее всего не будет. Но даже смещение на 2-3 пикселя (за одно прерывание), это уже потребует расчётов траектории движения...
Зачем траектория? Глянул исходный (не дисковый) карандаш. Там нажатия клавиш управления приводят к изменению координат курсора, ничего сверхъестественного. Можно разве что учитывать "округление по сетке". По умолчанию там дискретность 8 точек, но вроде можно было менять, только я забыл как.
Зачем траектория? Глянул исходный (не дисковый) карандаш. Там нажатия клавиш управления приводят к изменению координат курсора, ничего сверхъестественного. Можно разве что учитывать "округление по сетке". По умолчанию там дискретность 8 точек, но вроде можно было менять, только я забыл как.
Дискретность переключается клавишей "стр" (вроде) либо 8 точек, либо 1 точка.
Если при рисовании курсор будет "перепрыгивать" через пиксели, это будет нервировать.
Буду смотреть, как джойстик встроен в управление.
Скорее всего, придётся использовать мышку в режиме эмуляции джойстика, и посмотреть на сколько это юзабельно.
Напрямую, просто менять координаты курсора не получится. Координаты меняются при обработке команд (кодов из буфера управления). Для простого перемещения курсора, программа кучу всего делает... восстанавливает экран под курсором, сохраняет часть экрана под новой позицией, рисует курсор на новом месте... Корректнее, подсовывать коды клавиш управления в буфер клавиатуры. Но не знаю ещё как джойстик интегрирован, может действительно есть возможность грубо менять координаты... посмотрим.
Если при рисовании курсор будет "перепрыгивать" через пиксели, это будет нервировать.
Что значит перепрыгивать? Мышью можно перемещать курсор быстро, но если слишком быстро, то можно делить приращения координат на некий коэффициент для большей точности (и, как вариант, переключать клавишей режимы скорость/точность).
Напрямую, просто менять координаты курсора не получится. Координаты меняются при обработке команд (кодов из буфера управления).
Так никто же не запрещает переделать под мышь нормально, чтобы сразу менялись координаты без эмуляции клавиатуры.
Что значит перепрыгивать? Мышью можно перемещать курсор быстро, но если слишком быстро, то можно делить приращения координат на некий коэффициент для большей точности (и, как вариант, переключать клавишей режимы скорость/точность).
...
Если за одно прерывание, мышь переместилась на 4 пикселя, то есть два варианта...
Сразу указать новую позицию курсора - при этом курсор перепрыгнет из начальной точки в конечную, будет разрыв линии на траектории движения курсора.
Либо рассчитать траекторию между предыдущей позицией и новой, и подсунуть буферу коды, которые заставят курсор постепенно двигаться по всему пути, не создавая разрыва в рисуемой линии.
Всё это домыслы, юзабельность мыши будет понятна только когда посмотрю, как интегрирован джойстик, и не попробую как работает мышь в режиме эмуляции джойстика.
Можно сделать буфер приращений мыши по аналогии с буфером клавиш. Плюс разделить координаты на 1) внутренние (точные) и 2) те, которые были в оригинале и которые используются для отображения курсора. При таком подходе в принципе можно даже сделать параллельное управление мышью и клавиатурой для любителей извращений.
Можно сделать буфер приращений мыши по аналогии с буфером клавиш. Плюс разделить координаты на 1) внутренние (точные) и 2) те, которые были в оригинале и которые используются для отображения курсора. При таком подходе в принципе можно даже сделать параллельное управление мышью и клавиатурой для любителей извращений.
Я уже думал о необходимости буфера приращений мыши. Без него приращения будут теряться, если программа не успеет выполнить какие-то действия за одно прерывание.
Делать параллельное управление, это с моей точки зрения, слишком большое вмешательство в программу.
Ведь адаптированным к мыши Арканоидом судя по всему почти никто не заинтересовался.
адаптированным к мыши Арканоидом судя по всему почти никто не заинтересовался
Как ты пришел к такому выводу? =)
Improver
07.09.2023, 11:30
Я уже думал о необходимости буфера приращений мыши. Без него приращения будут теряться, если программа не успеет выполнить какие-то действия за одно прерывание.Вот, ещё один плюс к созданию аппаратного буфера, т.е. передачи координат вместо приращений... :)
Не хочется заново поднимать спор, но аппаратный буфер != передача координат вместо приращений.
Джойстик интегрирован в управление, эмуляцией клавиатуры.
Драйвером джойстика читается только порт "0F". Этот вариант программы заточен для .02-го Вектора.
При получении данных о положении джойстика, эти данные преобразуются в код соответствующей клавиши, и вызывается штатная подпрограмма, для помещения кода в буфер, штатными средствами.
Для начала можно пойти тем-же путём, заменив драйвер джойстика на драйвер мыши (эмулирующий джойстик).
И посмотреть на результат.
Маловато свободного места в этой программе.
Можно конечно попытаться рассувать драйвер мыши кусками по огрызкам свободного места.
Но для эксперимента по перемещению курсора мышью и такого варианта достаточно. При некоторых действиях драйвер затирается и всё крашится, но представление о юзабельности мыши я получил.
Эмуляция джойстика - не круто :(
А думаю реальным джойстиком рисовать - вообще был гемор...
К сожалению, протокол PS/2 жрёт много ресурсов (времени), и процедуры рисования далеко не скоростные... даже просто при рисовании линий уже заполняется буфер клавиатуры и курсор начинает "блуждать" по экрану со значительным запаздыванием относительно перемещений мыши.
Подозреваю, что использование реальных приращений, а не фиксированного шага, не исправят ситуацию.
Может быть все-таки приделать последовательный порт с FIFO, а к нему последовательную мышку? Конвертер из PS/2 в Serial незначительное неудобство по сравнению с реализацией PS/2 битбенгом на 8080. А последовательный порт с FIFO еще много для чего может пригодиться.
Кстати, в "PENCIL-DISC" есть глюк, который попал в программу, видимо во время переделки её из ".r00" в ".rom".
В самом начале, вызывается подпрограмма, расположенная по адресу 1A8Ah, но в прерывании ячейки с адресами 1A8Ah и 1A8Bh используются для хранения переменных. И соответственно их значение искажается. При перезапуске программы (сбросом), вызывается эта подпрограмма, но выполняются уже другие инструкции.
По поводу затрат времени на получение от мыши данных по протоколу ps/2.
Раньше считал на пальцах, по частотам, но не был уверен в результате.
Сейчас глянул осциллогафом.
В протоколе 5 байт: запрос данных; ответ от мыши, что запрос получен; кнопки; X; Y.
По времени ~6мс ! И это только сам протокол обмена, без учета времени на обработку и преобразование полученных данных.
Если добавить ещё и байт на получение данных колеса прокрутки, будет ~7мс.
Итого из 20мс между прерываниями, 6мс отгрызает мышка... программе остается довольно мало. :(
Да и сам протокол (только подпрограммы записи/чтения) примерно 270 Байт.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot