Внимание! Это временный неофициальный архив старой версии форума Полигон Призраков, созданный сочувствующим форуму участником. Этот сайт просуществует лишь до тех пор, пока администрация Полигона не сдержит своё обещание и не откроет официальный архив по адресу 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
Печать
 
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Rio444, OK, я чего-то не сообразил сразу.
Приношу свои извинения!
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
i8088, извинения излишни. :)
Значения счетчика из таймера можно читать непосредственно?
in al, 040h ?
Ничего не собьётся? Всегда ли он работает?
Нужно ли предварительно делать "Access mode" = lobyte only ?
[q]
Bits Usage
6 and 7 Select channel :
0 0 = Channel 0
0 1 = Channel 1
1 0 = Channel 2
1 1 = Read-back command (8254 only)
4 and 5 Access mode :
0 0 = Latch count value command
0 1 = Access mode: lobyte only
1 0 = Access mode: hibyte only
1 1 = Access mode: lobyte/hibyte
1 to 3 Operating mode :
0 0 0 = Mode 0 (interrupt on terminal count)
0 0 1 = Mode 1 (hardware re-triggerable one-shot)
0 1 0 = Mode 2 (rate generator)
0 1 1 = Mode 3 (square wave generator)
1 0 0 = Mode 4 (software triggered strobe)
1 0 1 = Mode 5 (hardware triggered strobe)
1 1 0 = Mode 2 (rate generator, same as 010b)
1 1 1 = Mode 3 (square wave generator, same as 011b)
0 BCD/Binary mode: 0 = 16-bit binary, 1 = four-digit BCD
[/q]
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
По ссылке pahan как раз есть пример, думаю ответы на все Ваши вопросы -да.
[q]
Reading The Current Count
To read the current count using the "lobyte only" or "hibyte only" access modes, you can just do an "in al,0x40" (for PIT channel 0) without problems. For frequencies higher than 4.7 KHz it can be easiest to set the high byte of the reload value to zero, and then use the "lobyte only" access mode to minimize hassles.

For the "lobyte/hibyte" access mode you need to send the latch command (described above) to avoid getting wrong results. If any other code could try set the PIT channel's reload value or read its current count after you've sent the latch command but before you've read the highest 8 bits, then you have to prevent it. Disabling interrupts works for single CPU computers. For example, to read the count of PIT channel 0 you could use something like:
[/q]
Я только рекомендую не использовать 386+ инструкции,
для совместимости с 286.
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
i8088 написал:
[q]
Я только рекомендую не использовать 386+ инструкции, для совместимости с 286.
[/q]
Вы зря переживаете. Я и 8086 инструкции плохо знаю. ;) 386+ для меня вообще темный лес.

i8088 написал:
[q]
По ссылке pahan как раз есть пример, думаю ответы на все Ваши вопросы -да.
[/q]
Не нравится мне пример по ссылке:read_PIT_count:
  pushfd
  cli
  mov al, 00000000b    ; al = channel in bits 6 and 7, remaining bits clear
  out 0x43, al         ; Send the latch command

  in al, 0x40          ; al = low byte of count
  mov ah, al           ; ah = low byte of count
  in al, 0x40          ; al = high byte of count
  rol ax, 8            ; al = low byte, ah = high byte (ax = current count)
  popfd
  ret

Он устанавливает собственный режим работы канала 0, нарушая работу системного таймера.

Я бы сделал
mov al, 00010110b
out 043h,al
in al,040h

Т.е. принудительно установил бы чтение/запись только младшего байта. Остальное без изменений.
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Rio444 написал:
[q]
Вы зря переживаете. Я и 8086 инструкции плохо знаю. ;) 386+ для меня вообще темный лес.
[/q]
Я это просто к тому, что в тех примерах полно 386+ инструкций, тот же pushd/popfd.


Rio444 написал:
[q]
Я бы сделал
mov al, 00010110b
out 043h,al
in al,040h
Т.е. принудительно установил бы чтение/запись только младшего байта. Остальное без изменений.
[/q]
Согласен, в книге Джордейна (правда для для канала 2 тоже сделано так, как Вы хотели),
к сожалению командный регистр - WO, что не позволяет сохранять настройки.
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 клавиатурой.
<<Назад  Вперед>> Страницы: 1 2 3 4 5 6 7 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