Hola amigo puedes usar las siguientes funciones:
procedure EscribePuerto(Direccion:word;valor:byte);
begin
asm
mov dx,Direccion
mov AL,valor
out DX,AL
end;
end;
function LeePuerto(Direccion:Word):Byte;
begin
asm
mov dx,Direccion
in al,dx
mov Result,al
end;
end;
Ojo que windows Xp es fregado y no deja que lo manipulemos directamente, esto solo funciona en win95,98 y ME.
Si usas xp tienes que manejar una dll como inpout32.dll o un componente especialmente diseñado.
Un saludo.