Всех приветствую!
В первой статье я рассказал об одном из вариантов подключения мыши с интерфейсом PS/2 к компьютеру Орион-128 и решил самостоятельно разобраться в работе драйвера и как минимум попытаться написать простенькую программку, а как максимум - придумать несложный механизм подключения драйвера к своим программам, причём таким образом, чтобы при отсутствии контроллера мыши в системе на экране не отображался указатель, даже если программа поддерживает мышь. Ссылаться я буду на исходный текст драйвера, который мне предоставил его автор Алексей Михайлов, которого я упоминал в первой статье. Рекомендую статью к прочтению, а также скачать по приведённой в ней ссылке исходные тексты.
Условно драйвер делится на три составляющих: опрос микроконтроллера и получение координат и состояние кнопок мыши, стирание изображения под указателем и сохранение его во временный буфер и рисование самого указателя, изображение которого, кстати говоря, уже из своей программы можно менять на лету. Для этого предусмотрен буфер CIMG.
Для работы драйвера необходимо последовательно вызывать процедуры MOUSE, CURCR и CURSET. Может это было сделано для гибкости, может ещё для чего-то, но попытка запихнуть все три процедуры в одну успехом не увенчалась, так как там всё переплетено и ссылается друг на друга крест накрест.
Прежде всего я упорядочил список переменных, которых оказалось аж целых 17 штук!
И, конечно же, они привязаны к конкретному участку памяти.
Одна переменная в исходном тексте и вовсе не используется. Это MOYES. Её я пока трогать не стал. Возможно, она ранее использовалась для определения наличия мыши как устройства, а потом автор решил её исключить, но имя осталось.
Изначально драйвер представлял из себя сборку драйвер+демо. Демонстрационную часть я вырезал и оставил только сам драйвер, дописал четыре переменные с удобочитаемыми именами для доступа к координатам XY, кнопкам и колесу.
Также заменил команды вида MVI A,000H на XRA A, которые не намного, но сократили размер драйвера. Немного структурировал текст, он стал нормально читаем. В результате получилась одна точка входа из основной программы: CALL MOUSE.
Внутри этого вызова содержится очистка места под указателем и рисование самого указателя.
Также в драйвер добавил определение наличия мышки. Если мышь отсутствует, то происходит возврат в основную программу и указатель на экране не отображается. Для этого служит переменна MO_OK. Содержимое 0FFH говорит об отсутствии контроллера мыши.
Переписанный и дополненный драйвер может подключаться к головному исходному тексту как вставленный текст, либо как библиотека. Это на усмотрение программиста. Предпочтительно второе. При этом никаких дополнительных правок вносить в текст драйвера не нужно.
Написал простую программу, в которой будет работать мышь.
ORG 0
START:
CALL MOUSE
JMP START
INCL MODRV.AS
Но работа этого варианта драйвера мне не понравилась. После запуска на экране появилась стрелочка и можно было двигать мышку. Но код настолько расписан "лапшой" (да простит меня автор за критику), что всё работало очень нестабильно и пытаться отладить что-то было весьма сложно. В итоге вся часть, касающаяся отображения указателя, была выброшена и заменена кодом Дениса Соловьёва (автор ОС DSDOS). В свою очередь я добавил в драйвер небольшое улучшение, ограничивающее указатель в пределах экрана, а также точки входа для получения текущих координат по осям XY, состояний кнопок и направления вращения колеса. В результате от прежнего драйвера осталось только чтение состояния контроллера и определение типа процессора (Z80 и КР580ВМ80А читают данные по-разному). В результате после применения нового варианта драйвера, мне всё понравилось. Вот так выглядит старт демо-программы с новым драйвером, написанной выше:
После старта драйвера в центре появляется указатель (все вспомнили Windows😁) и можно двигать мышку. Указатель иногда появляется не в центре экрана (виноваты инопланетяне 😉). Но ведь нужно ещё нажимать кнопки и крутить колесо!
Для этого добавим ещё несколько строк. И помогут нам в этом переменные MO_K и MO_W. А также добавим переменные MO_X и MO_Y, которые будут отображать текущие координаты на экране.
Координату X считываем командой LHLD MO_X, а координата Y командой LDA MO_Y. Состояния кнопок и колеса соответственно LDA MO_K и LDA MO_W.
Теперь основной цикл программы выглядит так:
И запускаем!
Перемещая мышь видим показания. Первые 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
До новых встреч!