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


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


Ссылка


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

Я как освобожусь, тоже посмотрю. Процедура задержки
будет полезна и в других проектах.
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
i8088, хорошо.
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Я проверял на плате XT IBM5160 (у нее таймер 8253) - при программировании канала 0 даже
тем же значением 0x36h (lsb/msb), режим 011, таймер просто перестает считать и системное
время стоит.

Если не трогать 0x43, то чтение канала0 исправно возвращает LSB/MSB (меняющиеся).

В исходниках IBM BIOS делается отключение прерываний от таймера при программировании
маскированием входа 8259. Ядумаю надо сделать также.
<<Назад  Вперед>> Страницы: 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