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

Всё остальное

Postby CAMAHACYKE » 09 Feb 2010, 00:13

Кто-нибудь сабж делал? Что-то третий день фантазия буксует, не асилел придумать простой алгоритм что б можно было по условию замедлять курсор в 2 раза, 4 раза и т.п.
Все что придумалось, так это счетчик делать двух-байтный и ротировать регистровую пару через флаг С, и уже от нее вычислять дельту перемещения. Ну млин, громоздко получается... Никто не встречал уже готового?
User avatar
CAMAHACYKE
 
Posts: 510
Joined: 26 Sep 2007, 19:27
Group: Registered users

Postby breeze » 09 Feb 2010, 13:02

ооо… когда-то давным давно, когда деревья были большие, а Tom Hial писал smile у нас был чудо дрижер для мышки, но сие кануло где-то в коробах с кучей дискет и разгрести это… wacko
breeze
 
Posts: 538
Joined: 07 Feb 2009, 16:19
Group: Registered users

Postby lvd » 09 Feb 2010, 18:16

ниасилел, что хочет автор топика. Возможно, если он не будет писать свои мысли в АлКо-стайле, его поймут и ему ответят :-))
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7168
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby CAMAHACYKE » 09 Feb 2010, 19:32

Сори.
Начну по порядку. Есть мышь. Есть некоторая программа эту мышь поддерживающая. Использован драйвер опубликованный в Спектрофоне 20, слегка переделанный. Драйвер производит перемещение курсора на экране при каждом приращении счетчиков координат мыши 1:1, на один шаг счетчика один пиксел экрана. Возникла необходимость при некоторых условиях снизить скорость курсора для более точного позиционирования. Хотелось сделать возможность переключения между тремя скоростями - нормальная, замедленная в два раза и замедленная в четыре раза.
Алгоритм драйвера мыши предельно простой. В DE загружаются предыдущие чтения из мыши, в HL координаты курсора, BC - адрес порта.
Читаем из порта в А, отнимаем Е (предыдущее состояние счетчика мыши) получаем разность (дельту) в виде BCD-арифметики. По флагу знака переход на свою обработку перемещения (лево/право) и там уже эта дельта прибавляется к предыдущей координате курсора с проверкой на краевые условия.
Перебрал несколько вариантов, пока остановился на таком: для замедления использую логическое деление дельты перед прибавлением к координате курсора, но предварительно сохраняю в ячейке памяти те биты, которые были выдвинуты операцией SRL A, что бы при следующем прерывании добавить их непосредственно перед логическим сдвигом. Иначе возникает ситуация когда при очень медленном движении мышью курсор остается на месте. Ну в общем имхо громоздко получилось.
А теперь вопрос, страдал ли еще кто-нибудь подобной фигней и с каким результатом? Ну и как вариант не встречал ли кто-нибудь готовой процедуры с описанным эффектом, и если да, то где?
Last edited by CAMAHACYKE on 09 Feb 2010, 22:04, edited 1 time in total.
User avatar
CAMAHACYKE
 
Posts: 510
Joined: 26 Sep 2007, 19:27
Group: Registered users

Postby нолька » 09 Feb 2010, 20:00

посмотри как меняется скорость курсора в этой проге:
http://trd.speccy.cz/system/DBS07.ZIP
<alone> предлагаю тслабсу дать транк, но с условием чтобы он впилил туда спрайтотайлы, но не трогал атм
<LordVader> alone: яготов всосать срайты от тслабса )
<LordVader> атм режимы это пиздец
User avatar
нолька
рОвный
 
Posts: 1200
Joined: 08 Apr 2007, 20:12
Group: Registered users

Postby lvd » 09 Feb 2010, 20:14

Ниасилил, причём тут BCD - или ты имел в виду знаковую арифметику?
Можно в вычисленном смещении (-128..+127), расширить знак до 16бит и добавлять это в аккумулятор координаты, тоже 16битный (чтоб потом эту координату можно было бы склиппировать). Соотвно после такого понижение чуйкости делается оч. просто - величины клиппирования увеличиваются вдвое, а когда нужно координату достать - делается sra h:rr l и в l имеем координату экранную, и младший бит не проипывается.
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7168
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby CAMAHACYKE » 09 Feb 2010, 21:45

lvd wrote:причём тут BCD - или ты имел в виду знаковую арифметику?


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

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


Да, спасибо, посмотрел. Там с адреса 6A48 лежит драйвер мыши. Досконально не разбирал, есть там кое-что непонятное, но в целом видно что драйвер работает в два этапа - сначала как обычно вычисляет новые координаты,сохраняет, а потом уже берет какие-то предыдущие значения и преобразовывает. В целом получается очень длинно и не вкурил конечного результата. Как нибудь может на досуге погоняю процедуру в STS что бы понять нюансы, но в целом имхо громоздко.
Спасибо всем кто откликнулся.
Last edited by CAMAHACYKE on 09 Feb 2010, 21:58, edited 1 time in total.
User avatar
CAMAHACYKE
 
Posts: 510
Joined: 26 Sep 2007, 19:27
Group: Registered users

Postby нолька » 09 Feb 2010, 22:04

да не. я не про код, а про то как стрелка двигается. а код можно в журнале взять (щас сходу не скажу в каком)
<alone> предлагаю тслабсу дать транк, но с условием чтобы он впилил туда спрайтотайлы, но не трогал атм
<LordVader> alone: яготов всосать срайты от тслабса )
<LordVader> атм режимы это пиздец
User avatar
нолька
рОвный
 
Posts: 1200
Joined: 08 Apr 2007, 20:12
Group: Registered users

Postby CAMAHACYKE » 09 Feb 2010, 22:30

нолька wrote:да не. я не про код, а про то как стрелка двигается. а код можно в журнале взять (щас сходу не скажу в каком)


Ну имхо в начале движения курсор слишком резвый, я пытаюсь добиться большего замедления на малых перемещениях. С другой стороны еще фик его знает как оно реализованное себя поведет, может это у меня в воображении все клево, а когда сделаю ... В общем надо мне сначала доделать и поюзать, а потом уже говорить.
User avatar
CAMAHACYKE
 
Posts: 510
Joined: 26 Sep 2007, 19:27
Group: Registered users

Postby lvd » 09 Feb 2010, 23:14

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
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7168
Joined: 07 Apr 2007, 21:28
Group: Registered users

Next

Return to Other

Who is online

Users browsing this forum: No registered users and 1 guest

cron