Unter DOS hab ich gerne den Int 15h - Unterfunktion 83h verwendet. Dem konnte man eine Zeit vorgeben und die Adresse einer beliebigen byte-Variable im Speicher. Dann rief man ihn auf und bekam sofort wieder die Kontrolle zurück. Nach Ablauf der Zeit wurde die Variable gesetzt und man konnte sie abfragen.
Das sah ungefähr so aus:
Code: Alles auswählen
procedure tserial.starttimer;
var ober,unter : word;
offs,segment : word;
begin
flag := 0;
offs := ofs(flag);
segment := seg(flag);
case s of
2 : begin
ober := $001E;
unter := $8480;
end;
end;{case}
asm
mov ah,$83
mov al,0
mov es,segment
mov bx,offs
mov cx,ober
mov dx,unter
int $15
end;
end;
Code: Alles auswählen
function tserial.transfer;
var st : string;
a : byte;
c : char;
begin
st := s + prfs(s);
transfer := false;
send_string(com,dc2,dly);
dwrite('<DC2>');
starttimer(2);
repeat until (zeichenempf = dc4) or (flag <> 0);
if flag <> 0 then exit;
st := stx + st + etx;
dwrite('[DC4]'+st);
send_string(com,st,dly);
starttimer(2);
repeat until (buffercheck(com)) or (flag <> 0);
if buffercheck(com) then check_buffer(com,c);
if c = ack then
begin
dwrite('[Ack]');
transfer := true
end
else
begin
dwrite('[NAK]');
transfer := false;
end;
end;
Gibt es da vergleichbares? (Sei es in der Riesen-RTL von Lazarus oder bei den Win-API-Funktionen)
Wie würdet ihr das lösen?
Der direkte Zugriff auf Ports, Speicher und InterruptserviceRoutinen feeeeeeehlt mir sooooo

Danke für die Aufmerksamkeit
Christian