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

Полигон-2

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

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

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

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

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

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

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


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
Вчера немного поигрался со своим драйвером, отключая отдельные участки кода.
Выяснились любопытные вещи.
Во-первых, если PS/2 мышь отсутствует в списке оборудования (адрес 40:10h BDA), все драйверы (включая cutemouse) пишут, что мышь отсутствует и отказываются загружаться. Тут попадание 100%.
Примерно то же самое происходит, если отключить службу C2h прерывания int 15h. Может быть, сообщения драйверов немного отличаются от предыдущего случая. Особо не обращал внимания.
А вот на службу C1h того же прерывания (которая возвращает в регистре ES сегмент EBDA) похоже всем драйверам пофиг. Которые работали - продолжают работать. Те, что не работали, по-прежнему так же не работают.

Если отключить обработчик irq12 (int 74h), это имеет фатальные последствия. Драйверы загружаются, но вешают систему (а скорее блокируют клавиатуру) сразу или после любых действий с мышью.
Также выяснилось, что Cutemouse версии 2.1 использует дефолтный обработчик int 74h (а не подменяет своим) и прекрасно работает.
То есть, мой обработчик irq12 его полностью устраивает.
Плюс этот драйвер занимает меньше всего места в памяти из числа протестированных. Всего 3,1кб (по данным CheckIt). Если прибавить размер драйвера поддержки PS/2 мыши, получаем 3,1+1,4 = 4,5кб. Это меньше, чем размер большинства драйверов мыши самих по себе.
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Немного не совсем по теме, но все же, возвращаясь к вопросу задержки.

Обнаружил любопытный эффект на плате IBM 5150 с таймером 8253 от AMD, образца 1983 года.
Простое чтение счетчиков канала 0 без latch приводит к резкому понижению коэффициента деления,
особенно при больших исходных коэффициентах. Так, при делителе по умолчанию (65536) просто
после чтения (в debug) порта 0x40, коэффициент деления канала 0 становится равным 2!
Проверялось осциллографом. При чтении с latch чтение нормальное.

Столь малые КД для канала 0 ведут к зависание машины (слишком высокая частота IRQ0).

Те просто:
debug
-i 40
и все, машина стала.

На IBM 5160 c таймером 8253 от Intel (плата выпуска 1986года) такого не наблюдалось,
я эксперименты в этой теме делал с ней.

У кого есть IBM 5150, большая просьба проверить проверить чтение порта 0x40!
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
Немного по теме добавлю. Как писал выше, наличие PS/2 мыши также фиксируется в CMOS.
Но оно не стандартизировано и для разных BIOS "mouse enable" находится в разных регистрах.
Стандартная карта CMOS: Фролов
Расширенная, для разных BIOS.

Поэтому, содержимое CMOS на работу драйвера мыши никак не влияет.
Вероятно сам BIOS использует эту информацию. Возможная лазейка - установить в CMOS "mouse enable", в надежде, что BIOS при загрузке воспользуется этой информацией и включит поддержку PS/2 мыши.
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
Нашел ещё одну ошибку.
Теперь работает :)
Пока не выкладываю, программа ещё сыровата. Надо ещё тестировать и оптимизировать. Но если кто-то оперативно повторит схему, пишите - поделюсь, в состоянии "как есть". Заодно потестируете.

Проверял:
- i486DX2-66, чипсет Sis471, BIOS Award 4.50, родной KBC LT38C41,
- AMD 386DX-40, чипсет PC Chips "Chip 11", Bios AMI ver. 2.11, KBC Sa6042A

Драйверы разные, включая драйверы от A4, Genius, Microsoft.
Windows 3.11 сама "подхватывает" мышь, без всяких драйверов.
Остаётся проверить на Win9x.

Отрицательный момент. Win NT 3.51 мышь не видит. Хотя должна полностью игнорировать BIOS.
По всей видимости, ей не хватает размаскированного прерывания Irq12 и/или наличия мыши в списке оборудования в области данных BIOS 40:10h.

Код для размаскирования/добавления очень простой и короткий. Но не знаю, куда и как его вставить до загрузки Win.
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Rio444 написал:
[q]
Нашел ещё одну ошибку.
Теперь работает :)
[/q]
Отлично!


Rio444 написал:
[q]
Код для размаскирования/добавления очень простой и короткий. Но не знаю, куда и как его вставить до загрузки Win.
[/q]
Можно рассмотреть вставление кода модифицировав какой либо менеджер загрузки с
открытыми исходниками.

Правильно однако сделать нормальный драйвер, сам по себе он простейший, но по
деталям не подскажу, тк не использую windows.

В качестве плана - найти DDK для NT3.51, посмотреть примеры кодов и сделать драйвер
который может даже не регистрироваться в системе, и не отвечать на команды OS. По
аналогии с DOS драйвером - он должен выполнить инициализацию, выполнить требуемый код и далее освободить память (как это делается, если устройства, с которым дрвйвер
работает не найдено).
Tronix
Advanced Member


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


Ссылка


Дата регистрации на форуме:
15 янв. 2008
i8088 написал:
[q]
найти DDK для NT3.51
[/q]
https://winworldpc.com/product/windows-sdk-ddk/nt-3x
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
i8088 написал:
[q]
В качестве плана - найти DDK для NT3.51, посмотреть примеры кодов и сделать драйвер
[/q]
Но тогда придется делать драйвер для каждой оси.
Это, как минимум, NT 4.0, OS/2, Linux.
Мне видится более интересным вариант модификации MBR. Делают же это как-то вирусы?

Другие, возможные варианты:
- дополнение кода bios в ПЗУ,
- отдельное ПЗУ (например на сетевой карте).

С этим вопросом перекликается другой, очень интересный. Возможно ли создание контроллера PS/2 мыши на отдельной ISA плате?
Основная сложность в том, что реальный PS/2 контроллер не самостоятельное устройство, а "часть" контроллера клавиатуры.
Взаимодействие с ним осуществляется по тем же адресам: 60h для данных и 64h - управление и чтение статуса.
Внешний PS/2 контроллер мыши можно создать как отдельное, независимое устройство. Но в этом случае он будет иметь свои, другие адреса шины портов и требовать драйвера для каждой ОС. Для DOS и Win3.x, Win9x драйвер можно сказать готов. Достаточно внести небольшие изменения в существующий код. На остальные оси драйвера нужно будет писать с нуля.

Второй вариант - попытаться "скрестить" существующий KBC и новый контроллер PS/2. По всей видимости, понадобится дополнительная схема, которая будет отключать основной контроллер, когда необходимо взаимодействие с контроллером PS/2. Задача если и возможная, то весьма нетривиальная. Вероятно надо будет подключаться (или включаться в разрыв) ног контроллера: "Chip Select", "Host Read", "Host Write".
<<Назад  Вперед>> Страницы: 1 2 3 4 5 ... 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