En xp para controlar el puerto no se hace directamente como en win98 .
Con win98 la manera mas rapida :
asm
Mov DX, PUERTO
In AL, DX
mov Result,AL
end;
Con esto funciona tira que te vas , pero sumale el tiempo de atencion a las interrupciones que el sistema tiene muchas .
con XP:
DeviceIoControl(hDevice, dwReadByteCode, @PUERTO, sizeof(Index),@value, sizeof(value), cbBytesReturned,nil);
esto no es una lectura directa y usa esta funcion de windows que vete a saver lo que hace , sumale interrupciones etc .
La precision seria maxima en MsDos puro e inhiviendo todas las interrupciones en el momento de leer el puerto .
Esta es mi opinion personal .