Необходимо программно измерить сопротивление на игровом порту... Возможно у кого-нибудь есть подобный код? В гугле и т.п. искал, но увы, рабочего и подходящего - ничего не нашел Буду очень благодарен Спасибо!....
лет 10 назад информацию об этом было легко найти. Как сейчас, не знаю. если я ничего не путаю, то там нужно было поднять сигнал на каком-то выводе, а после этого мерять время, которое пройдет до появления сигнала на каком-то другом выводе. В терминах обращений к портам - чего-то послать в порт, а потом все время читать, пока прочитанный результат не будет чему-то равен (по маске). Все эти манипуляции связаны были с тем, что в джойстике для каждой оси ставился переменный резистор и конденсатор, который заряжался через этот резистр. Время заряда конденсатора как раз и определялось сопротивлением резистора, а значит и его положением.
_mel хреновенько искал. Вот тебе Предновогодний подарочек Вот те ресурс солидный, там еще много, что есть рядом, проштудируй... http://www.epanorama.net/documents/joystick/pc_joystick.html#introduction + даю рабочий код (очень вылизанный, реальный и рабочий на машинах разного поколения) плюс оптимизЁный под малый расход процессорного времени (ни таймера ни прерывания у этой гадости нет!...Делаем выводы!) Код (Text): DetectGamePort: mov dx, 0x201 ; адрес GAME порта in al, dx ; читаем GAME порт cmp al, 0xFF ; он читается как отсутствующий ? je @gmret out dx, al ; сброс порта, стартуем измерители координат mov [fs:iGAMEp.CntMaxLevel], 10 ; некое начальное значение границы циклов измерения ; минимальный цикл для возможности детекта подключения GAME манипулятора "на ходу" mov [fs:iGAMEp.CntCycleMeasure], 16 ; запомнить как текущее значение счетчмка циклов измерения xor bx, bx ; обнулить координату - Ax xor bp, bp ; обнулить координату - Ay xor si, si ; обнулить координату - Bx xor di, di ; обнулить координату - By mov cx, 0x50F ; CX максимально-возможное значение счетчика циклов измерения для грантированного обнаружения подключенного GAME манипулятора (наличия координат) push cx @readGamePort: in al, dx ; чтение GAME порта test al, 1 ; координата - Ax измерена ? jz @cnbit2 ; Да, переход к анализу следующего бита (координаты) inc bx ; увеличить координату Ax на один шаг @cnbit2: test al, 2 ; координата - Ay измерена ? jz @cnbit3 ; Да, переход к анализу следующего бита (координаты) inc bp ; увеличить координату Ay на один шаг @cnbit3: test al, 4 ; координата - Bx измерена ? jz @cnbit4 ; Да, переход к анализу следующего бита (координаты) inc si ; увеличить координату Bx на один шаг @cnbit4: test al, 8 ; координата - By измерена ? jz @cnbitLow ; Да, переход к анализу следующего бита (координаты) inc di ; увеличить координату By на один шаг @cnbitLow: and al, 0xF ; все координаты измерены GAME портом ? loopnew @readGamePort ; Если нет и счетчик циклов измерения не вычерпан, то повтор (продолжение измерения) mov [fs:iGAMEp.StatButton], al pop ax cmp ax, bx ; значение замера в BX равно предельному ? jne @obhbx ; Нет, значит по координате есть реальное измерениеа, обходим по метке mov bx, 8 ; Да, значит установим самый минимум для дальнейшего мажоритирования измерений с помощию BX @obhbx: cmp ax, bp ; по Ay есть реальное измерение ? je @nwkrBP ; Нет, обходим по метке cmp bx, bp ; замер Ay больше чем Ax ? cmovc bx, bp ; если да, то в BX теперь координата Ay вместо Ax, как большая @nwkrBP: cmp ax, si ; по Bx есть реальное измерение ? je @nwkrSI ; Нет, обходим по метке cmp bx, si ; замер SI больше ? cmovc bx, si ; если да, то в BX теперь координата Bx из SI, как большая @nwkrSI: cmp ax, di ; по By есть реальное измерение ? je @nwkrDI ; Нет, обходим по метке cmp bx, di ; замер DI больше ? cmovc bx, di ; если да, то в BX теперь координата By из DI, как большая @nwkrDI: ; теперь в BX наверняка самое максимальное значение измерений cmp bx, 0x510 ; это значение уже слишком велико для системы, чтобы его принять как новую границу ? jnc @gmret ; Да, обходим по метке cmp bx, [fs:iGAMEp.CntMaxLevel] ; это значение превышает граничное значение максимума ? jc @gmret ; Нет, обходим по метке add bx, 8 ; увеличим полученный максимум на 8 для наличия некого запаса до границы максимума mov [fs:iGAMEp.CntMaxLevel], bx ; сохраним новый порог максимума измерителей add bx, 8 ; дополнительно увеличим значение для рабочего счетчика циклов измерений mov [fs:iGAMEp.CntCycleMeasure], bx ; сохраним значение рабочего счетчика циклов измерений mov [fs:iGAMEp.FlagGAMEp], bl ; записать что либо > 0 как флаг наличия устройства @gmret: RET
VaStaNi Огромнейшее спасибо ... действительно предновогодний подарочек Ну не то что бы хреновенько, я искал на русских сайтах, а про буржуйские как-то забыл хотя логичнее было там поискать .... очевидно у логики новый год начался раньше Спасибо огромное и за ресурс, и за материал! С новым годом!