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

Полигон-2

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

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

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

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

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

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

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


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Rio444 написал:
[q]
Если только канал 2 уже ни для чего больше не используется.
[/q]
Штатно он в основном для диагностического speaker используется.
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
i8088 написал:
[q]
Штатно он в основном для диагностического speaker используется.
[/q]
Кстати, да. Но не уверен, что только диагностического.
Если в системе есть звуковуха, то наверное канал 2 ей и не нужен.
А если только спикер?
Фиг с ним, если временно собьётся его работа. А если конфликт в системе, с более неприятными последствиями?
i8088
Advanced Member


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


Ссылка


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

А штатно егоо функция например подавать гудки (тот же DOS), я не
уверен что он программирует его заново каждый раз. Ну можно по выходе оставлять настроенным на 1000Hz

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

Я еще подумаю.
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Только для AT (не слишком новых, где есть канал 1 8254)
можно попробовать процедуру из исходников IBM AT


;--- WAITF -------------------------------------------------------------
;  FIXED TIME WAIT ROUTINE HARDWARE CONTROLLED - NOT PROCESSOR)   :
;                       :
; ENTRY:                     :
;  (CX) = COUNT OF 15.085737 MICROSECOND INTERVALS TO WAIT        :
;    MEMORY REFRESH TIMER 1 OUTPUT USED AS REFERENCE        :
; EXIT:                      :
;    AFTER (CX) TIME COUNT (PLUS OR MINUS 16 MICROSECONDS)  :
;  (CX) = 0                   :
;-----------------------------------------------------------------------

REFRESH_BIT  EQU  00010000B  ; REFRESH TEST BIT
PORT_B    EQU  061H    ; PORT B READ/WRITE DIAGNOSTIC REGISTER


WAITF  PROC  NEAR      ;  DELAY FOR (CX)*15.085737 US
  PUSH  AX      ; SAVE WORK REGISTER (AH)

WAITF1:         ;  USE TIMER 1 OUTPUT BITS
  IN  AL,PORT_B    ; READ CURRENT COUNTER OUTPUT STATUS
  AND  AL,REFRESH_BIT    ; MASK FOR REFRESH DETERMINE BIT
  CMP  AL,AH      ; DID IT JUST CHANGE
  JE  WAITF1      ; WAIT FOR A CHANGE IN OUTPUT LINE

  MOV  AH,AL      ; SAVE NEW FLAG STATE
  LOOP  WAITF1      ; DECREMENT HALF CYCLES TILL COUNT END

  POP  AX      ; RESTORE (AH)
  RET        ; RETURN (CX)= 0

WAITF  ENDP
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
Очень просто, но очень неточно. Даже значение в Ah не инициализируют.
Перед WAITF1 должно быть:
IN  AL,PORT_B
MOV  AH,AL

Возможно именно этот алгоритм используется в int 15h функция 86h.
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Rio444 написал:
[q]
Даже значение в Ah не инициализируют.
[/q]
Мне тоже это не понравилось но я решил привести как в оригинале.

Дилемма в том, что с 8253/54 слишком много команд получается, что снизит точность.
Но при использовании канала2 будет чуть проще, тк его можно останавливать без latch.
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
Посмотрите вот такой вариант:

; Расчет значения счетчика для задержки 15мкс
; Выходное значение cx = значение счетчика для цикла с задержкой 15мкс
; Если cx = 0 - ошибка
  timer equ 040h    ; Используем таймер 0
  xor cx,cx  ; Обнуляем счетчик
  cli    ; Запрещаем прерывания
  in al,timer
  mov bh,al
  in al,timer
  mov bl,al  ; Теперь в bh, bl у нас два подряд считанных значения из тамера. Младший байт и старший байт. Порядок значения не имеет.
        ; Это начальные значения, с которыми будем сравнивать
start_loop:
  inc cx  ; Увеличиваем на 1 счетчик
  jz exit_15us  ; Если счетчик = 0, т.е. прошло 65536 циклов, то выходим. Ошибка.
  xchg  bl,bh  ; Меняем местами bh и bl. В первом цикле в bl 1-й принятый байт, во втором 2-й, опять 1-й, снова 2-й и т.д.
  mov ah,bl  ; То же самое теперь в ah
  in al,timer
  sub ah,al  ; Вычитаем новое значение в счетчике из начального
  cmp ah,18  ; Если разница > 18
  jb start_loop  ; Повторяем цикл
exit_15us:  
  mov word [const_15us],cx  ; Сохраняем рассчитанное значение
  sti    ; Включаем прерывания
const_15us: dw 0
  
; Теперь сам цикл с задержкой. Из-за того, что прерывания не отключаем, реальная задержка может быть больше 15мкс
  mov word cx,[const_15us]  ; Задаём начальное значение счетчика
loop_15:
  xchg  bl,bh  ; Фиктивные операции, которые бесполезны, но вносят такую же задержку, как в расчете начального значения счетчика
  mov ah,bl  ; Фиктивная
  in al,timer  ; Фиктивная
  sub ah,al  ; Фиктивная
  cmp ah,18  ; Фиктивная
  jb next_15  ; Фиктивная
next_15:  
  dec cx  ; Уменьшаем на 1 счетчик
  jnz loop_15  ; Если он не равен 0, повторяем цикл


На 386DX-40 получилось на выходе 10 циклов. Что вполне неплохо. На 286-й конечно точность будет очень низкая.
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Те Вы предлагаете сделать пре-калибровку, а потом всюду использовать найденную константу?

В принципе оба варианта (IBM и Ваш) могут использоваться, в
зависимости от целей.

А Вы пробовали проверить реальную задержку осциллографом?

Я проверял так

LPT_DATA_PORT  EQU  0378H

  MOV  DX, LPT_DATA_PORT
  MOV  AX, 55H
  OUT  DX, AL
  MOV CX,  0
CLI
LPT_LOOP:
  CALL  NEAR PTR DLY
  IN  AL, DX
  XOR  AL, 0FFH
  OUT  DX, AL
  LOOP  LPT_LOOP
STI

Это делает 65536 импульсов и пауз в порт принтера.
Проверить, насколько изменится длительность импульсов и паузы
если заккоментировать CALL DLY (для уменьшения потерь времени можно заменить макроопределением). Разность и даст задержку.

Цикл у Вас в конце лучше сделать так

loop_15:
  xchg  bl,bh  ; Фиктивные операции, которые бесполезны, но вносят такую же задержку, как в расчете начального значения счетчика
  mov ah,bl  ; Фиктивная
  in al,timer  ; Фиктивная
  sub ah,al  ; Фиктивная
  cmp ah,18  ; Фиктивная
  jb next_15  ; Фиктивная
next_15:  
  loop loop_15  ; Если он не равен 0, повторяем цикл
Rio444
Гость


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


Ссылка


Дата регистрации на форуме:
14 сен. 2014
i8088 написал:
[q]
Те Вы предлагаете сделать пре-калибровку, а потом всюду использовать найденную константу?
[/q]
Собственно я так изначально предлагал
Rio444 написал:
[q]
Вообще, первая мысль была - использовать тупой цикл, со счетчиком.Вопрос только, где брать начальное значение счетчика? Оно будет зависеть от скорости процессора.Это начальное значение можно считать на этапе инициализации (т.е. только один раз).Но нужен какой-то таймер, который работает на всех вышеуказанных машинах, и работает одинаково.
[/q]
i8088 написал:
[q]
Цикл у Вас в конце лучше сделать так
[/q]
Смысл в том, что сохраняется число тактов на один проход цикла. Весь код совпадает, только меняется порядок инструкций, и inc cx меняется на dec cx.
Будут ли по числу тактов loop и dec(inc) cx jnz равноценны?
i8088
Advanced Member


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


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Rio444 написал:
[q]
Будут ли по числу тактов loop и dec(inc) cx jnz равноценны?
[/q]
Навряд-ли, loop должна быть быстрее. Тогда оставим как есть.

Теперь осталось проверить реально получающуюся задержку.
<<Назад  Вперед>> Страницы: 1 2 3 4 5 ... 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