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

Полигон-2

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

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

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

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

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

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

<<Назад  Вперед>> Страницы: 1 2 3 4 5 6 7 8 * 9 10 11 12 13 14 15 16 17
Печать
 
pahan
Advanced Member


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


Ссылка


Дата регистрации на форуме:
13 мар. 2015
[q]
к сожалению командный регистр - WO, что не позволяет сохранять настройки.
[/q]
У 8254 есть команда write-back.
[q]
принудительно установил бы чтение/запись только младшего байта
[/q]
[q]
Значения счетчика из таймера можно читать непосредственно?
in al, 040h ?
Ничего не собьётся?
[/q]
Есть риск, что он перейдёт через 0 и тогда задержка в эти моменты сильно увеличится. Но скорее всего придётся для получения адекватной производительности (см. ниже для примера чтения всех байт). В остальном - ОК.
[q]
Нужно ли предварительно делать "Access mode" = lobyte only ?
[/q]
В теории, кто-то может и поменять режим за то время, что мы к нему обращаемся. Безопаснее ставить.
[q]
прочитать содержимое счетчика и подождать, когда оно уменьшится на 18
[/q]
Можно, но стоит серьёзно подумать, 1)насколько нам нужна такая точность (ровно 15 мкс), 2) на каких процах и 3)в каких режимах мы будем наш код использовать. Потому что на всех 486 и топовых 286-386 всё это спокойно прокатит, на младших 386 в реальном режиме (чистый DOS) - да, в режиме виртуального 8086 (DOS-окно из-под Windows) - впритык, на младших 286 даже в реальном режиме вряд ли уложимся.

Считаем время выполнения инструкций
(данные отсюда - http://www.cs.dartmouth.edu/~m...c/x86.html) только для считывания текущего значения счётчика таймера 8253 (а значит, этот код повторится ещё как минимум 1 раз, + сравнение(2-2-1 такт), +цикл после сравнения(не меньше 7-не меньше 7-3), +служебные команды, если это будет подпрограммой (cli/sti/push/pop/ret)):
mov al, 0xD2
out 0x43, al
in al,0x40
mov ah,al
in al, 0x40
rol ax,8 - считали текущее значение канала 0
mov bx,ax - и запомнили его

В тактах проца это всё займёт:
286 - 2+3+5+2+5+13+2=32 такта (на частоте 8-25 МГц)= 4 мкс-1,3 мкс
386 - 2+10(4..24..24)+12(6..26..26)+2+12(6..26..26)+3+2=43 такта в реальном режиме/25-85 в защищённом/85 в V86 (на частоте 16-40 МГц)= 2,7/1,6/5,3 мкс - 1,1/0,6/2,1 мкс
486 - 1+16(11..31..29)+14(9..29..27)+1+14(9..29..27)+2+1=39 тактов в реальном режиме/34-94 в защищённом/88 в V86 (на частоте 25-133 МГц)= 1,6/1,4-3,8/3,5 мкс - 0,3/0,3-0,7/0,7 мкс
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
Небольшой фотоотчет.
Новый контроллер клавиатуры с обвязкой, установленный взамен старого.

На "брюхе" контроллера установлена небольшая платка с обвязкой. Прошу прощения за несмытую канифоль.
Ноги контроллера подогнуты и припаяны к плате. К ним припаяны "фиктивные" ноги, откушенные от ненужной микросхемы.
Никогда так не делайте!!! Припаять новые ноги ровно задача не из простых. Заняло несколько часов и немерено матерных слов. Новый прототип буду делать по-другому. Резисторы на картинке видно. Транзисторы (их почти не видно) - SMD 2n3904, снятые с какой-то нерабочей материнской платы. Конденсаторы не ставил. Не нашлось нужных по размеру и номиналу, ехать на радиорынок долго. Впрочем, работает и так.

Модифицированную прошивку зашивал во флэш (оригинальная в 27c512).
Как назло, места, чтобы поставить 32-пиновую DIP вместо 28-пиновой не оказалось. Микросхема упиралась в ISA8 разъём.
Пришлось городить колхоз из нескольких 28 и 32-х пиновых панелек.
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
pahan написал:
[q]
Есть риск, что он перейдёт через 0 и тогда задержка в эти моменты сильно увеличится.
[/q]
Предварительно проверяем, что текущее значение >18 (лучше с запасом - больше 30). Если меньше, ждём (считываем повторно, пока не станет >18, т.е. не пройдет через 0).

pahan написал:
[q]
1)насколько нам нужна такая точность (ровно 15 мкс)
[/q]
Если реальная задержка будет 15...30мкс, думаю это устроит. Это задержка между появлением флага переполнения буфера мыши в контроллере и появлением данных в выходном регистре. Не знаю, почему именно 15мкс. Это значение в исходнике Sergey Kiselev XT биос. Он, вероятно, скопировал из исходников Award bios.

pahan написал:
[q]
2) на каких процах
[/q]
От самого младшего 286 (8МГц?), до самого старшего 486 (AMD 5x133@160)

pahan написал:
[q]
3)в каких режимах мы будем наш код использовать. Потому что на всех 486 и топовых 286-386 всё это спокойно прокатит, на младших 386 в реальном режиме (чистый DOS) - да, в режиме виртуального 8086 (DOS-окно из-под Windows) - впритык, на младших 286 даже в реальном режиме вряд ли уложимся.
[/q]
Код инициализации - из под чистого DOS (если стоит Win95, то до её загрузки, из autoexec.bat). Сама задержка - вероятно и DOS, и Windows. Но Win95 ставят только на 386 и выше (лично я предпочитаю от 486-х).

Исходя из Ваших дальнейших расчетов
pahan написал:
[q]
286 - 2+3+5+2+5+13+2=32 такта (на частоте 8-25 МГц)= 4 мкс-1,3 мкс
[/q]
думаю нормально. Эта часть быдет выполнять только в чистом DOS.
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
Сейчас вы будете смеяться, но в Award BIOS такой задержки нет. Или я чего-то не понимаю.
Код Sergey-XT биос:
;=========================================================================
; kbc_aux_read - read data from auxiliary device
; Input:
;  none
; Output:
;  AL = data
;  CF == 0 - data is available
;  CF == 1 - time out
;-------------------------------------------------------------------------
kbc_aux_read:
  push  cx
;  xor  cx,cx      ; XXX too much?!
  mov  cx,20      ; retry 20 times
.1:
  call  kbc_wait_aux_full
  jnz  .2      ; if ZF=0 - data is available
  loopz  .1
  jmp  .error      ; time out
.2:
  mov  cx,1
  call  delay_15us   ; !!! ЗАДЕРЖКА 15мкс (комментарий Rio444)
  in  al,kbc_output_reg
  clc
  jmp  .exit
.error:
  stc
.exit:
  pop  cx
  ret

Аналогичный участок кода Award BIOS:

;*****************************************************************************
; Procedure Name:  get_data
;  receive data from mouse if Auxiliary device Output Buffer Full
; Saves:
; Inputs:  none
; Output:  zf = 1 : no data received
;    zf = 0 : successful
;      al = data byte received
; Destroy:  ah
; Author:  Ken Chen
; Date:   06/21/90
;
; Rev  | Name  | Date    | TPR#  | Description
; ------+-------+---------------+-------+-------------------------------------
; 1.00  | Ken  | 06/21/90  | NEW  | Initial revision
;
;*****************************************************************************

GET_DATA  PROC  NEAR
    push  cx
    xor  cx,cx
gd_loop:
    push  cx
    call  out_aux_full    ; check AOBF
    pop  cx
    jnz  short receive_data
    loop  short gd_loop
    jmp  short gd_ret
receive_data:
    in  al,data8042
gd_ret:
    pop  cx
    ret
GET_DATA  ENDP
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
pahan написал:
[q]
Есть риск, что он перейдёт через 0 и тогда задержка в эти моменты сильно увеличится.
[/q]
Это как раз не страшно, тк складывать текущее знасение с 18 мы тоже будем с переполнением.

Пример.
Текущее значение счетчика (младший байт) == 0xF0
Запоминаем, складываем с 18 , 0xF0 + 0x12 = 102
Перенос вызовет установку флага CF, но на это не обращаем внимания.
Ну и собственно ждем, когда счетчик достигнет значения 0x02

Это чем-то похоже на относительные внутрисегментные безусловные
переходы в x86: смещение перехода задается формально в пределах -32768
+32767, но "дотянуться" до любого адреса внутри сегмента не проблема.

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


Rio444 написал:
[q]
От самого младшего 286 (8МГц?),
[/q]
Первый 286 - 6MHz. PC/XT полюбому в пролете, там совсем другой
интерфейс клавиатуры и сама клавиатура. Ну за исключением очень
редких нестандартных XT с AT клавиатурой.
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
i8088 или я Вас не понял, или Вы ошибаетесь
[q]
Каждый период синхронизации происходит уменьшение на единицу содержимого внутреннего счётчика канала, начальное значение которого устанавливается программно.
[/q]
Т.е. 18 надо вычитать, а не прибавлять.
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Rio444 написал:
[q]
Т.е. 18 надо вычитать, а не прибавлять.
[/q]
Ой да, забыл, что счет в обратную сторону, мои извинения!

Но сути дела это не меняет.

Пример
Исходное значение 0x04
Вычисляем, чего ждать 0x04 - 0x12 == 0xFFF2 (старшие FF это я перенос обозначил)
На флаг CF не обращаем внимания, и ждем когда счетчик достигнет 0xF2

PS. Если бы КД канала 0 был бы не 65536, то переустановку счетчика при
переходе через 0 пришлось бы учитывать, и код был бы более сложным.
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
i8088 написал:
[q]
На флаг CF не обращаем внимания, и ждем когда счетчик достигнет 0xF2
[/q]
Не может такого быть, что счетчик не достигнет 0xF2, а "перескочит" его, когда будет очередное считывание?
Если процессор медленный.
И, видимо, надо будет запрещать аппаратные прерывания, иначе они сильно исказят расчет.
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Rio444 написал:
[q]
Не может такого быть, что счетчик не достигнет 0xF2, а "перескочит" его, когда будет
очередное считывание? Если процессор медленный. И, видимо, надо будет запрещать аппаратные
прерывания, иначе они сильно исказят расчет.
[/q]
При медленном CPU я думаю возможно, тогда ловить не равенство, а что число в счетчике ниже
чем рассчитанное (сравнивать беззнаково!).

К примеру (просто первое, что сходу пришло в голову, это не проверялось, возможны
грубые ошибки!)

======================================================================
DELAY_CONST EQU 18

mov al, 00010110b
out 043h, al
in al, 040h
mov bl, al
sub bl, DELAY_CONST (в bl вычисляем значение окончания задержки)

delay_ch0: in al, 040h
cmp al, bl ;(в bl у нас рассчитанное ранее значение)
jbe stop_delay_ch0 ;(сравнение беззнаковое!)

;; здесь должна быть дополнительная проверка, если к примеру у нас рассчитанное
;; конечное значение 0x01, CPU задержался, и в счетчике уже к примеру 0xff
;; Здесь я совсем не уверен в корректности моего решения (проверка чисел как
;; знаковых, если беззнаковая проверка дала "добро" на продолжение цикла и считанное
;; значение отрицательно (0x80-0xff), а конечное положительно. Надеюсь, что до 0x7f
;; запаздывание из-за CPU (положительные знаковые числа не дойдет).

cmp al, 00h ; просто для устанавки флагов
jns delay_ch0 ;проверка, что считанное значение положтельно, если да, то продолжаем цикл

; если мы здесь, то имеем считанное значение отрицательное, проверяем конечное значение
cmp bl, 00h
; если имеем ситуацию, когда конечное значение (bl) положительно, а текущее (al)
; отрицательно, то выходим из цикла
jns stop_delay_ch0

jmp short delay_ch0

stop_delay_ch0: ;эдесь процедура (код) задержки кончается
======================================================================

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

Для проверки можно сделать простую програму с бесконечным циклом из этой задержки, и
направить вывод например в LPT порт (например после каждой задержки иннвертировать
данные в 378h). И наблюдать осциллографом длительность импульса и паузы на линиях данных
LPT. Я так проверял реальные задержки во FreeBSD.

======================================================================
LPT_DATA_PORT EQU 0378h

mov dx, LPT_DATA_PORT
in al, dx
xor al, 0ffh ;инвертируем
out dx, al
======================================================================

После исполнения такой программы в цикле системные часы отстанут, но для проверки
это несущественно, особенно если цикл бесконечный:).
Rio444
Гость


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


Ссылка


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

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

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

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