Page 1 of 2

Кемпстон маус драйвер с переменной скоростью курсора

PostPosted: 09 Feb 2010, 00:13
by CAMAHACYKE
Кто-нибудь сабж делал? Что-то третий день фантазия буксует, не асилел придумать простой алгоритм что б можно было по условию замедлять курсор в 2 раза, 4 раза и т.п.
Все что придумалось, так это счетчик делать двух-байтный и ротировать регистровую пару через флаг С, и уже от нее вычислять дельту перемещения. Ну млин, громоздко получается... Никто не встречал уже готового?

Re: Кемпстон маус драйвер с переменной скоростью курсора

PostPosted: 09 Feb 2010, 13:02
by breeze
ооо… когда-то давным давно, когда деревья были большие, а Tom Hial писал smile у нас был чудо дрижер для мышки, но сие кануло где-то в коробах с кучей дискет и разгрести это… wacko

Re: Кемпстон маус драйвер с переменной скоростью курсора

PostPosted: 09 Feb 2010, 18:16
by lvd
ниасилел, что хочет автор топика. Возможно, если он не будет писать свои мысли в АлКо-стайле, его поймут и ему ответят :-))

Re: Кемпстон маус драйвер с переменной скоростью курсора

PostPosted: 09 Feb 2010, 19:32
by CAMAHACYKE
Сори.
Начну по порядку. Есть мышь. Есть некоторая программа эту мышь поддерживающая. Использован драйвер опубликованный в Спектрофоне 20, слегка переделанный. Драйвер производит перемещение курсора на экране при каждом приращении счетчиков координат мыши 1:1, на один шаг счетчика один пиксел экрана. Возникла необходимость при некоторых условиях снизить скорость курсора для более точного позиционирования. Хотелось сделать возможность переключения между тремя скоростями - нормальная, замедленная в два раза и замедленная в четыре раза.
Алгоритм драйвера мыши предельно простой. В DE загружаются предыдущие чтения из мыши, в HL координаты курсора, BC - адрес порта.
Читаем из порта в А, отнимаем Е (предыдущее состояние счетчика мыши) получаем разность (дельту) в виде BCD-арифметики. По флагу знака переход на свою обработку перемещения (лево/право) и там уже эта дельта прибавляется к предыдущей координате курсора с проверкой на краевые условия.
Перебрал несколько вариантов, пока остановился на таком: для замедления использую логическое деление дельты перед прибавлением к координате курсора, но предварительно сохраняю в ячейке памяти те биты, которые были выдвинуты операцией SRL A, что бы при следующем прерывании добавить их непосредственно перед логическим сдвигом. Иначе возникает ситуация когда при очень медленном движении мышью курсор остается на месте. Ну в общем имхо громоздко получилось.
А теперь вопрос, страдал ли еще кто-нибудь подобной фигней и с каким результатом? Ну и как вариант не встречал ли кто-нибудь готовой процедуры с описанным эффектом, и если да, то где?

Re: Кемпстон маус драйвер с переменной скоростью курсора

PostPosted: 09 Feb 2010, 20:00
by нолька
посмотри как меняется скорость курсора в этой проге:
http://trd.speccy.cz/system/DBS07.ZIP

Re: Кемпстон маус драйвер с переменной скоростью курсора

PostPosted: 09 Feb 2010, 20:14
by lvd
Ниасилил, причём тут BCD - или ты имел в виду знаковую арифметику?
Можно в вычисленном смещении (-128..+127), расширить знак до 16бит и добавлять это в аккумулятор координаты, тоже 16битный (чтоб потом эту координату можно было бы склиппировать). Соотвно после такого понижение чуйкости делается оч. просто - величины клиппирования увеличиваются вдвое, а когда нужно координату достать - делается sra h:rr l и в l имеем координату экранную, и младший бит не проипывается.

Re: Кемпстон маус драйвер с переменной скоростью курсора

PostPosted: 09 Feb 2010, 21:45
by CAMAHACYKE
lvd wrote:причём тут BCD - или ты имел в виду знаковую арифметику?


О, да. Лоханулся. Я всего лишь средней тупости связист посягнувший на таинства асемблера. Ты прав, то что я считал ВСД - это и правда знаковая арифметика.
По существу твоего предложения - первое неудобство в том что для каждой координаты приходится учитывать двухбайтное число, соответственно все операции тоже нужно делать регистровыми парами, а также при чтении из мыши однобайтного числа нужно учитывать момент переход через ноль с учетом знака.... в общем гемор, я лично асилел когда создал два промежуточных счетчика; второе неудобство в том что в момент перехода чувствительности курсор отпрыгивает, т.е. нужно еще и этот момент рассмотреть и скорректировать. За предложение спасибо, но мой вариант с сохранением сдвигаемых битов получается короче. Ну или я тебя не так понял (тоже Алко-стайл biggrin ).

нолька wrote:посмотри как меняется скорость курсора в этой проге:
http://trd.speccy.cz/system/DBS07.ZIP


Да, спасибо, посмотрел. Там с адреса 6A48 лежит драйвер мыши. Досконально не разбирал, есть там кое-что непонятное, но в целом видно что драйвер работает в два этапа - сначала как обычно вычисляет новые координаты,сохраняет, а потом уже берет какие-то предыдущие значения и преобразовывает. В целом получается очень длинно и не вкурил конечного результата. Как нибудь может на досуге погоняю процедуру в STS что бы понять нюансы, но в целом имхо громоздко.
Спасибо всем кто откликнулся.

Re: Кемпстон маус драйвер с переменной скоростью курсора

PostPosted: 09 Feb 2010, 22:04
by нолька
да не. я не про код, а про то как стрелка двигается. а код можно в журнале взять (щас сходу не скажу в каком)

Re: Кемпстон маус драйвер с переменной скоростью курсора

PostPosted: 09 Feb 2010, 22:30
by CAMAHACYKE
нолька wrote:да не. я не про код, а про то как стрелка двигается. а код можно в журнале взять (щас сходу не скажу в каком)


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

Re: Кемпстон маус драйвер с переменной скоростью курсора

PostPosted: 09 Feb 2010, 23:14
by lvd
CAMAHACYKE wrote:По существу твоего предложения - первое неудобство в том что для каждой координаты приходится учитывать двухбайтное число, соответственно все операции тоже нужно делать регистровыми парами,


это, конечно, меганеудобство, зато как удобно + и - отдельными ветвями кода обрабатывать...

CAMAHACYKE wrote: а также при чтении из мыши однобайтного числа нужно учитывать момент переход через ноль с учетом знака....

Чоо? Расширить знак байта до 16 бит ты ниасилил как? Подсказываю: rla:sbc a,a

CAMAHACYKE wrote:второе неудобство в том что в момент перехода чувствительности курсор отпрыгивает,

Значит в момент перехода надо патчить 16битный аккумулятор - очевидно же.

CAMAHACYKE wrote: За предложение спасибо, но мой вариант с сохранением сдвигаемых битов получается короче.


Ага, еще не забудь сохранить старшие биты для экрана 320х. А ещё, кстати out (fd),a короче чем ld bc,7ffd, out(c),a. Тоже учти - короче получится! tongue