Добавить в корзинуПозвонить
Найти в Дзене

Орион-128. Мышь PS/2: программирование.

Всех приветствую! В первой статье я рассказал об одном из вариантов подключения мыши с интерфейсом PS/2 к компьютеру Орион-128 и решил самостоятельно разобраться в работе драйвера и как минимум попытаться написать простенькую программку, а как максимум - придумать несложный механизм подключения драйвера к своим программам, причём таким образом, чтобы при отсутствии контроллера мыши в системе на экране не отображался указатель, даже если программа поддерживает мышь. Ссылаться я буду на исходный текст драйвера, который мне предоставил его автор Алексей Михайлов, которого я упоминал в первой статье. Рекомендую статью к прочтению, а также скачать по приведённой в ней ссылке исходные тексты. Условно драйвер делится на три составляющих: опрос микроконтроллера и получение координат и состояние кнопок мыши, стирание изображения под указателем и сохранение его во временный буфер и рисование самого указателя, изображение которого, кстати говоря, уже из своей программы можно менять на лету. Для э

Всех приветствую!

В первой статье я рассказал об одном из вариантов подключения мыши с интерфейсом PS/2 к компьютеру Орион-128 и решил самостоятельно разобраться в работе драйвера и как минимум попытаться написать простенькую программку, а как максимум - придумать несложный механизм подключения драйвера к своим программам, причём таким образом, чтобы при отсутствии контроллера мыши в системе на экране не отображался указатель, даже если программа поддерживает мышь. Ссылаться я буду на исходный текст драйвера, который мне предоставил его автор Алексей Михайлов, которого я упоминал в первой статье. Рекомендую статью к прочтению, а также скачать по приведённой в ней ссылке исходные тексты.

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

Для работы драйвера необходимо последовательно вызывать процедуры MOUSE, CURCR и CURSET. Может это было сделано для гибкости, может ещё для чего-то, но попытка запихнуть все три процедуры в одну успехом не увенчалась, так как там всё переплетено и ссылается друг на друга крест накрест.

Прежде всего я упорядочил список переменных, которых оказалось аж целых 17 штук!

И, конечно же, они привязаны к конкретному участку памяти.

Одна переменная в исходном тексте и вовсе не используется. Это MOYES. Её я пока трогать не стал. Возможно, она ранее использовалась для определения наличия мыши как устройства, а потом автор решил её исключить, но имя осталось.

Изначально драйвер представлял из себя сборку драйвер+демо. Демонстрационную часть я вырезал и оставил только сам драйвер, дописал четыре переменные с удобочитаемыми именами для доступа к координатам XY, кнопкам и колесу.

Также заменил команды вида MVI A,000H на XRA A, которые не намного, но сократили размер драйвера. Немного структурировал текст, он стал нормально читаем. В результате получилась одна точка входа из основной программы: CALL MOUSE.
Внутри этого вызова содержится очистка места под указателем и рисование самого указателя.

Также в драйвер добавил определение наличия мышки. Если мышь отсутствует, то происходит возврат в основную программу и указатель на экране не отображается. Для этого служит переменна MO_OK. Содержимое 0FFH говорит об отсутствии контроллера мыши.

-2

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

Написал простую программу, в которой будет работать мышь.

ORG 0
START:
CALL MOUSE
JMP START
INCL MODRV.AS

Но работа этого варианта драйвера мне не понравилась. После запуска на экране появилась стрелочка и можно было двигать мышку. Но код настолько расписан "лапшой" (да простит меня автор за критику), что всё работало очень нестабильно и пытаться отладить что-то было весьма сложно. В итоге вся часть, касающаяся отображения указателя, была выброшена и заменена кодом Дениса Соловьёва (автор ОС DSDOS). В свою очередь я добавил в драйвер небольшое улучшение, ограничивающее указатель в пределах экрана, а также точки входа для получения текущих координат по осям XY, состояний кнопок и направления вращения колеса. В результате от прежнего драйвера осталось только чтение состояния контроллера и определение типа процессора (Z80 и КР580ВМ80А читают данные по-разному). В результате после применения нового варианта драйвера, мне всё понравилось. Вот так выглядит старт демо-программы с новым драйвером, написанной выше:

-3

После старта драйвера в центре появляется указатель (все вспомнили Windows😁) и можно двигать мышку. Указатель иногда появляется не в центре экрана (виноваты инопланетяне 😉). Но ведь нужно ещё нажимать кнопки и крутить колесо!
Для этого добавим ещё несколько строк. И помогут нам в этом переменные
MO_K и MO_W. А также добавим переменные MO_X и MO_Y, которые будут отображать текущие координаты на экране.

Координату X считываем командой LHLD MO_X, а координата Y командой LDA MO_Y. Состояния кнопок и колеса соответственно LDA MO_K и LDA MO_W.

Теперь основной цикл программы выглядит так:

-4

И запускаем!

-5

Перемещая мышь видим показания. Первые 3 байта это положение по оси X и Y, начало координат от левого верхнего угла. Четвёртый и пятый байты состояния нажатия кнопок и направление вращения колеса. Выход из программы - ESC. Если контроллер мыши не установлен, то экран будет пуст, но выход через клавиатуру будет доступен.

Итак, резюмируем.
Вызов -
CALL MOUSE.
MO_OK - переменная наличия контроллера мыши. Значение 0FFH - мыши нет.
Буфер
CIMG - можно грузить свой спрайт указателя (рисунок сверху вниз).
MO_X и MO_Y - переменные с координатами XY в HEX-виде.
MO_K и MO_W - переменные состояний кнопок и колеса в HEX-виде.

Теперь можно пользоваться драйвером. Осталось проявить фантазию в программировании!

Скачать драйвер и демонстрационную программу по работе с ним можно по ссылке https://disk.yandex.ru/d/RLgkorjssRhAbg

До новых встреч!