Внимание! Это временный неофициальный архив старой версии форума Полигон Призраков, созданный сочувствующим форуму участником. Этот сайт просуществует лишь до тех пор, пока администрация Полигона не сдержит своё обещание и не откроет официальный архив по адресу old.sannata.org.

Полигон-2

Форум о старых компьютерах

Объявление форума

Если пользуетесь личными сообщениями и получили по электронной почте оповещение о новом письме, не отвечайте, пожалуйста, почтой. Зайдите на форум и ответьте отправителю через ЛС.

Полигон-2 »   IBM PC-совместимое. До 2000 года включительно »   Переделка АТ интерфейса клавиатуры в PS/2 на старых платах
RSS

Переделка АТ интерфейса клавиатуры в PS/2 на старых платах

Уровня 386-х, 486-х, чтобы можно было подключить PS/2 мышь.

<<Назад  Вперед>> Страницы: 1 2 3 4 5 ... 8 9 10 11 12 * 13 14 15 16 17
Печать
 
Rio444
Гость


Откуда: Ростов-на-Дону
Всего сообщений: 8632
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
14 сен. 2014
Не прошло и месяца, как появились хоть немного заметные подвижки)))
Наконец есть рабочая "альфа" версия программы.
Работает пока через одно место, не со всеми драйверами и многое не понятно. Но работает.
Довольно много драйверов мыши "плюют" на "штатный" обработчик прерывания мыши Irq12 (Int 74h) и полностью подменяют его собственным.
Вот некоторые из таких драйверов и заработали. В частности, проверил на CuteMouse (версии 1.9, 2.0, 2.1 - работает со всеми).
И какой-то старый драйвер от А4 Tech.
Некий неизвестно чей драйвер "amouse.com" отказывается загружаться, сообщая, что "установка драйвера PS/2 мыши невозможна".
Драйвер, который при запуске пишет, что он ©Microsoft и ©IBM, 1992-го года, загружается, но сразу вешает систему (или отрубает клавиатуру?).
Пока так.

В процессе инициализации размаскировываю прерывание Irq12, но к концу программы какая-то хрень снова его маскирует.
Не могу понять какая. Сейчас перед выходом из программы приходится повторно его размаскировывать.
i8088
Advanced Member


Откуда: г. Баку, Азербайджан
Всего сообщений: 2132
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Роман, поздравляю с первым вариантом программы!!


Rio444 написал:
[q]
В процессе инициализации размаскировываю прерывание Irq12, но к концу программы какая-то хрень снова его маскирует.
Не могу понять какая. Сейчас перед выходом из программы приходится повторно его размаскировывать.
[/q]
Это под чистым DOS делается? По идее кроме драйвера мыши
заниматься манипуляциями с irq12 некому? Он уже загружен при
запуске программы?
Rio444
Гость


Откуда: Ростов-на-Дону
Всего сообщений: 8632
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
14 сен. 2014
Спасибо!

i8088 написал:
[q]
Это под чистым DOS делается?
[/q]
Да, MS-DOS 6.22

i8088 написал:
[q]
По идее кроме драйвера мышизаниматься манипуляциями с irq12 некому? Он уже загружен призапуске программы?
[/q]
Нет. Ни один драйвер мыши не грузится до запуска проги. Чтобы не запутаться, пусть прога будет называться "ps2supp.com".

Программа ps2supp добавляет PS/2 мышь в список устройств, хранящийся по адресу 40:10h (и вызываемый через int 11h).
Драйверы в первую очередь проверяют, есть ли мышь в этом списке.
Ps2supp также подменяет обработчик int 15h. Оставляет в памяти свой, который проверяет, не являются ли запрашиваемые функции службами работы с мышью (AH = C2h, AL = 00-07h). Если не являются, передаёт управление дефолтному обработчику. Если являются - обрабатывает сам.
Кроме этого ps2supp.com подменяет int 74h - прерывание, вызываемое по irq12. Обработка int74h видимо пока не работает должным образом, поэтому драйверы мыши, которые его используют тоже не работают. Но как писал выше, многие драйверы подменяют int74h своим обработчиком.

Штатный обработчик irq12 (int 74h) не так прост, как кажется.
Он не только вызывает драйвер мыши, а готовит для него данные.
Пакет данных от мыши содержит 3 или 4 байта (мышь без колесика и с колесиком). Отправляет их мышь по очереди, по одному байту. После каждого байта генерируется irq12. Штатный обработчик irq12 (int74h) собирает все эти 3 или 4 байта вместе, помещает их в стек и только после этого вызывает драйвер мыши.
Для того, чтобы можно было хранить промежуточные данные до того, как пакет придет полностью, плюс адрес драйвера мыши, плюс флаги и счетчики, в конце RAM (в конце 640кб) резервируется 1кб памяти под EBDA - "Extended BIOS Data Area". Основное её назначение именно хранение данных для поддержки PS/2 мыши. Но как пишут в источниках, биос мождет хранить там и другие данные.
Тут я немного схитрил, и разместил первые 30h байт EBDA (которые используются для PS/2 мыши) в теле резидентной части ps2supp.com. Точнее в конце её PSP.
Возможно некоторый драйверы видят "подвох" и отказываются грузиться.

Возможная причина также может быть в том, что наличие PS/2 мыши фиксируется в CMOS. Это пока не реализовано.
Помимо этого, прерывание int 15h, служба C0h возвращает адрес таблицы конфигурации системы, в которой содержится информация, выделена ли область EBDA. Находится эта таблица в ROM. В принципе, эту службу тоже можно подменить, переместив таблицу в RAM.
Маловероятно, но возможно какие-то драйверы проверяют и эту таблицу.
i8088
Advanced Member


Откуда: г. Баку, Азербайджан
Всего сообщений: 2132
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Вроде все логично.

Относительно маскирования - а может быть какое-то действие в
программе вызывает маскирование, как побочный эффект (вызов
какой-либо функции BIOS, хотя в TSR это ограничено)?

А если попробовать в программу через определенные интервалы
вставлять чтение регистра маски secondary int controller, 0a1h ?
И в debug пронаблюдать, когда происходит маскирование?
pahan
Advanced Member


Откуда: Химки, М.О.
Всего сообщений: 1070
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
13 мар. 2015
[q]
Но как пишут в источниках, биос мождет хранить там и другие данные.
[/q]
Не "может", а обязательно будет. И формат её не стандартизирован...
[q]
может быть какое-то действие в
программе вызывает маскирование, как побочный эффект (вызов
какой-либо функции BIOS, хотя в TSR это ограничено)?
[/q]
Скорее всего это именно куски биоса и возможно недокументированные.
Рекомендую ещё глянуть обработчики всех остальных прерываний (аппартаных, IRQx) - скорее всего "гадит" кто-то из-них.
Rio444
Гость


Откуда: Ростов-на-Дону
Всего сообщений: 8632
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
14 сен. 2014
i8088 написал:
[q]
Относительно маскирования - а может быть какое-то действие впрограмме вызывает маскирование, как побочный эффект (вызовкакой-либо функции BIOS, хотя в TSR это ограничено)?
[/q]
Тоже об этом подумал. Но это ещё не TSR (точнее не резидентная часть) , это инициализация, которая выполняется один раз, как обычная программа.

i8088 написал:
[q]
А если попробовать в программу через определенные интервалывставлять чтение регистра маски secondary int controller, 0a1h ?И в debug пронаблюдать, когда происходит маскирование?
[/q]
Что-то подобное попробую сделать.

pahan написал:
[q]
[q]
Но как пишут в источниках, биос мождет хранить там и другие данные.
[/q]
Не "может", а обязательно будет. И формат её не стандартизирован...
[/q]
Если "будет", то это ещё проще. В этом случае область EBDA уже выделена. И можно использовать её готовую.
Но пока на платах без поддержки PS/2 она отсутствует в принципе. В ячейке BDA, хранящей указатель на EBDA - "0000h".
pahan
Advanced Member


Откуда: Химки, М.О.
Всего сообщений: 1070
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
13 мар. 2015
[q]
В этом случае область EBDA уже выделена. И можно использовать её готовую.
Но пока на платах без поддержки PS/2 она отсутствует в принципе.
[/q]
Учитывая, что она появилась в IBM PS/2 и оттуда была скопирована остальными - ожидаемо.
Так что или она сразу есть и там полно и других данных или её изначально нет. Были ли платы (точнее, биосы) с EBDA, но без PS/2-мыши - если только экспериментально проверять.
[q]
В ячейке BDA, хранящей указатель на EBDA - "0000h".
[/q]
Раньше (до появления EBDA) она определялась как адрес порта LPT4.
Rio444
Гость


Откуда: Ростов-на-Дону
Всего сообщений: 8632
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
14 сен. 2014
Причина отключения irq12 оказалась весьма нетривиальной.
Помехой послужила операция чтения статусного регистра 8042: "in al,064h".
Если размаскирование irq12 выполнить после этой операции, то всё работает.
Если до - irq12 по-прежнему отключено.
Вот участок кода с "in al,064h":
kbc_wait_aux_full:
  push  cx
  xor  cx,cx
.1:
  in  al,kbc_status_reg  ; kbc_status_reg = 064h
  test  al,kbc_stat_obf
  loopz  .1    ; Если буфер клавиатуры свободен, идем дальше
  or  cx,cx
  pop  cx
  jz  .error    ; Закончились попытки, ошибка
  test  al,kbc_stat_aobf  ; Проверяем, есть ли данные в буфере мыши
.error:
  ret

Для размаскирования irq12 вставлял код:
  push ax
  mov al,0Dh ; Только для проверки, в данной системе исходно 1Dh
  out 0A1h,al
  pop ax

Сразу не понял в чем дело.
Между этими операциями не должно быть никакой связи.
Видимо причина в том, что контроллер прерываний слишком тормознутый, и, если после операции записи в него, через короткое время следует операция с другим портом (или именно 064h??), он не успевает считать данные.
Эксперимент это подтвердил. Если в Debug запускать сразу весь участок кода - маска прерываний не меняется. Если в режиме трассировки (когда появляются паузы) - всё работает.
i8088
Advanced Member


Откуда: г. Баку, Азербайджан
Всего сообщений: 2132
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Роман, очень ценное наблюдение, я думаю, мне тоже пригодится!!

А Вы пробовали поставить небольшую задержку после размаскирования
8259 (перед чтением регистра статуса 8042), для проверки гипотезы?
Rio444
Гость


Откуда: Ростов-на-Дону
Всего сообщений: 8632
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
14 сен. 2014
Буду пробовать. Не хватает времени плотно заняться. Приходится урывками.

UPD
Не могу повторить утренний результат.
Запуск pa2supp.com вызывает маскирование irq12 (маска 1Dh), даже если оно было ранее замаскировано (маска 0Dh).
В Debug код
mov AL,0D
out A1,AL
in AL,64
in AL,A1

работает как ни в чем не бывало.
Т.е. в результате в регистре AL = 0D, как и должно быть.
Хотя утром он не работал. Или я был не внимателен.
В коде основной программы место работающего фрагмента кода включения irq12 тоже "гуляет".
В нескольких попытках оно сначало оказалось перед строкой in al,064h, потом "вернулось" на то же место, что и утром - после этой строки.
В общем, ничего не понимаю.

Остаётся забить на эту проблему и включать irq12 в конце кода.
<<Назад  Вперед>> Страницы: 1 2 3 4 5 ... 8 9 10 11 12 * 13 14 15 16 17
Печать
Полигон-2 »   IBM PC-совместимое. До 2000 года включительно »   Переделка АТ интерфейса клавиатуры в PS/2 на старых платах
RSS

0 посетителей просмотрели эту тему за последние 15 минут
В том числе: 0 гостей, 0 скрытых пользователей

Последние RSS
[Москва] LIQUID-Акция. Сливаются разъемы CF
МС7004 и 7004А на AT и XT
Пайка термотрубок
Проммать s478 PEAK 715VL2-HT ( Full-Size SBC)
Подскажите по 386 материке по джамперам.

Самые активные 5 тем RSS