bawiłem się trochę driverem UserPort, a nawet napisałem sobie funkcje do sterowania nim, tak że już go poznałem
A co do LPT to w biosie dobrym rozwiązaniem będzie ustawienie portu w tryb Bi-Dir, i teraz jak chcesz wysyłać na port to zerujesz jeden lub wszystkie(jeśli nie używasz extra pinów lpt) bity portu 890:
_outp(890,255-32) <-- tutaj zmieniasz kierunek portu jako wyjście
'albo _outp(890,0)
for a = 1 to 15
_outp(888,255) /* dioda sobie miga kilka sekund*/
sleep(200)
_outp(888,0)
sleep(200)
next a
funkcja _outp (i _imp) jest importowana z biblioteki msvcrt.dll i sprawuje się doskonale

Wcześniej używałem wstawek
_asm
mov dx,888
out dx,byte [$zmienna]
_endasm
Jeśli kolega pracuje na XP lub podobnym, to dobrze skożystać z funkcji SetUnhandledExceptionFilter podając adres extra funkcji jako parametr tej funkcji. W razie jakiegokolwiek 'przestępstwa' windows najpierw uruchomi tą funkcję w której można zmienić licznik rozkazów procesora pomijając jednocześnie "zakazany" rozkaz powodujący błąd
W IBasic pro wygląda to tak:
SetUnhandledExceptionFilter(&LPTExceptionFilter) /*adres poniższej funkcji*/
INT BylError
BylError = FALSE
_inp(888) :' test czy wystąpił exception
if BylError=TRUE then ..... jakiś komunikat
'---------
Sub LPTExceptionFilter(ep:EXCEPTION_POINTERS),uint
UINT pER, pCR
pER = ep.ExceptionRecord
pCR = ep.ContextRecord
IF *<EXCEPTION_RECORD>pER.ExceptionCode = EXCEPTION_PRIV_INSTRUCTION
'zwiększ EIP o 1 - pomiń rozkaz in dx,al
*<CONTEXT>pCR.Eip ++
' zasygnalizuj error
BylError = TRUE
Return EXCEPTION_CONTINUE_EXECUTION
Endif
Return EXCEPTION_CONTINUE_SEARCH
EndSub
Uwaga dla nowicjuszy: EXCEPTION_POINTERS, EXCEPTION_RECORD i CONTEXT to struktury!
a jak to wygląda w c++ - odsyłam do przykładów dołączonych do UserPort
Jeszcze jedno ważne - userport trzeba zawsze zainicjować gdzieś na początku programu, byle przed kożystaniem z I/O. Nie ważne, że driver jest uruchomiony. Poprostu trzeba. Wystarczy otworzyć plik \\.\UserPort i zaraz go zamknąć. Ja o tym zapomniałem i ciągle miałem kochane okienko z napisem "program wykonał..." (XP pro/home)
Oczywiście na win98 nie trzeba żadnych driverów, poprostu in/out wystarczy
A może ktoś coś wie o driverze, który umożliwi kożystanie z przerwań pod XP ? Chodzi o generowanie opóźnień programowych które nie znęcają się na CPU

Sleep() odpada bo im mniejsza wartość, tym gorsza dokładność