Объявление форума |
Если пользуетесь личными сообщениями и получили по электронной почте оповещение о новом письме, не отвечайте, пожалуйста, почтой. Зайдите на форум и ответьте отправителю через ЛС. |
Полигон-2 » IBM PC-совместимое. До 2000 года включительно » Переделка АТ интерфейса клавиатуры в 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 |
Профиль | Сообщить модератору
NEW! Сообщение отправлено: 2 ноября 2017 20:37 Сообщение отредактировано: 2 ноября 2017 20:54
Rio444 написал: Ой да, забыл, что счет в обратную сторону, мои извинения! Т.е. 18 надо вычитать, а не прибавлять. Но сути дела это не меняет. Пример Исходное значение 0x04 Вычисляем, чего ждать 0x04 - 0x12 == 0xFFF2 (старшие FF это я перенос обозначил) На флаг CF не обращаем внимания, и ждем когда счетчик достигнет 0xF2 PS. Если бы КД канала 0 был бы не 65536, то переустановку счетчика при переходе через 0 пришлось бы учитывать, и код был бы более сложным. |
Rio444
Гость
Откуда: Ростов-на-Дону Всего сообщений: 8632 Рейтинг пользователя: 0 Ссылка Дата регистрации на форуме: 14 сен. 2014 |
Профиль | Сообщить модератору
NEW! Сообщение отправлено: 2 ноября 2017 22:23 Сообщение отредактировано: 2 ноября 2017 22:23
i8088 написал: Не может такого быть, что счетчик не достигнет 0xF2, а "перескочит" его, когда будет очередное считывание? На флаг CF не обращаем внимания, и ждем когда счетчик достигнет 0xF2 Если процессор медленный. И, видимо, надо будет запрещать аппаратные прерывания, иначе они сильно исказят расчет. |
i8088
Advanced Member
Откуда: г. Баку, Азербайджан Всего сообщений: 2132 Рейтинг пользователя: 0 Ссылка Дата регистрации на форуме: 30 янв. 2015 |
Rio444 написал: При медленном CPU я думаю возможно, тогда ловить не равенство, а что число в счетчике ниже Не может такого быть, что счетчик не достигнет 0xF2, а "перескочит" его, когда будет чем рассчитанное (сравнивать беззнаково!). К примеру (просто первое, что сходу пришло в голову, это не проверялось, возможны грубые ошибки!) ====================================================================== 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. Ядумаю надо сделать также. |
pahan
Advanced Member
Откуда: Химки, М.О. Всего сообщений: 1070 Рейтинг пользователя: 0 Ссылка Дата регистрации на форуме: 13 мар. 2015 |
Обсудили же, что XT не трогаем и сами лезете на ней тестировать А в каком режиме он стоит (access mode)? Потому что если в lobyte/hibyte - всё ОК, он будет ждать след. байта. А режим мы проверить не можем, потому что зачем-то тестируем на XT (таймер 8253), а не AT (8254). при программировании канала 0 даже |
i8088
Advanced Member
Откуда: г. Баку, Азербайджан Всего сообщений: 2132 Рейтинг пользователя: 0 Ссылка Дата регистрации на форуме: 30 янв. 2015 |
pahan написал: Он стоит в режиме hi/lo 011, при записи того-же режима получаем останов А в каком режиме он стоит (access mode)? Потому что если в lobyte/hibyte - всё ОК, он будет ждать след. байта. А режим мы проверить не можем, потому что зачем-то тестируем на XT (таймер 8253), а не AT (8254). счетчика и поочередно получаем hi/lo одинаковые (те например 0xe4 0xf2 0xe4 0xf2 0xe4 0xf2 итд). При переводе в режим LSB - всегда одно значение. pahan написал: Меня интересует универсальная процедура задержки, к PS2 вопросу это не Обсудили же, что XT не трогаем и сами лезете на ней тестировать относится. Насколько я понял, у Rio444 на AT получилось то же самое. |
Rio444
Гость
Откуда: Ростов-на-Дону Всего сообщений: 8632 Рейтинг пользователя: 0 Ссылка Дата регистрации на форуме: 14 сен. 2014 |
Профиль | Сообщить модератору
NEW! Сообщение отправлено: 3 ноября 2017 19:19 Сообщение отредактировано: 3 ноября 2017 19:25
Пока ещё ничего не пробовал. Сегодня весь день на работе. Если завтра не буду работать, могу поэкспериментировать. Это Вы в 43h порт пишите? Что такое "LSB", "MSB"? i8088 написал: Сильно странно это. Таймер вообще не должен стоять. Я проверял на плате XT IBM5160 (у нее таймер 8253) - при программировании канала 0 даже |
<<Назад Вперед>> | Страницы: 1 2 3 4 5 6 7 8 9 * 10 11 12 13 14 15 16 17 | Печать |
Полигон-2 » IBM PC-совместимое. До 2000 года включительно » Переделка АТ интерфейса клавиатуры в PS/2 на старых платах |
1 посетитель просмотрел эту тему за последние 15 минут |
В том числе: 1 гость, 0 скрытых пользователей |
Последние | |
[Москва] LIQUID-Акция. Сливаются разъемы CF МС7004 и 7004А на AT и XT Пайка термотрубок Проммать s478 PEAK 715VL2-HT ( Full-Size SBC) Подскажите по 386 материке по джамперам. |
Самые активные 5 тем | |