Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Für Fragen von Einsteigern und Programmieranfängern...
AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von AlterMann »

Hallo

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;
Verwendet hab ich ihn beispielsweise so:

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;
Natürlich gibt es das unter XP u. Konsorten nimmer.
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 :cry:

Danke für die Aufmerksamkeit
Christian
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10858
Registriert: Mo 11. Sep 2006, 19:01

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von theo »

AlterMann hat geschrieben: Wie würdet ihr das lösen?
Was denn eigentlich?
Könntest ohne DOS erklären, was du brauchst oder zu brauchen glaubst?

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von AlterMann »

theo hat geschrieben:... oder zu brauchen glaubst?
Hihi! Das trifft es wohl am besten.

Eigentlich geht's um dieses Stück:

Code: Alles auswählen

send_string(com,dc2,dly);
  starttimer(2);
  repeat until (zeichenempf = dc4) or (flag <> 0);
Ich sende ein bestimmtes Zeichen über die serielle Schnittstelle und warte auf ein anderes als Antwort.
Kommt dieses nicht innert einer bestimmten Zeit (Gegenstelle nicht anwesend, etc. ..) so beende ich das Warten ...
Früher war alles besser. Und aus Holz!

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von AlterMann »

Alles zurück! Wie's scheint macht die Methode RecvBufferEx von Synaser ohnedies alles was ich möchte von Hause aus.
Früher war alles besser. Und aus Holz!

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von Hitman »

... und dann gibts da auch noch Threads und Timer ;)

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von AlterMann »

Hitman hat geschrieben:... und dann gibts da auch noch Threads und Timer ;)
Bin soeben dabei mich mit TThread zu beschäftigen. Ist wohl die einzige (Beste?) Möglichkeit auf (unvorhersehbar auftretende) Zeichen die an der seriellen Schnittstelle ankommen, zu reagieren.
Bei TurboVision gab es eine procedure namens idle. Die wurde immer aufgerufen wenn die Application nichts anderes zu tun hatte. Sowas gibt es wohl auch nicht mehr?
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10858
Registriert: Mo 11. Sep 2006, 19:01

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von theo »

Application.OnIdle gibt's schon, das hilft dir aber nicht, wenn du auf blockierende Funktionen wartest (blocking sockets etc.), dann ist die Anwendung nämlich nicht Idle sondern eben blockiert.
Das kann man mit Threads lösen, um Funktionen auf die man warten muss vom GUI abzutrennen und diese ggf. auch abschiessen zu können.

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von AlterMann »

Das ist mir schon klar.
Das war auch nur z.B. darauf bezogen, daß ich in der OnIdle-Routine ja nachsehen könnte ob was an der Schnittstelle angekommen ist.
Ich werde das aber wohl doch mit TThread lösen, allein schon des Kennenlernens dieser Funktion wegen.

BTW: Ist das Neuzeichnen der Elemente einer Form blockiert, während eine OnClick-Methode eines Buttons ausgeführt wird?
Selbst wenn ich zwischendurch z.B. Label6.Show ausführe ändern sich Farbe u. Caption erst wenn die OnClick-Routine abgearbeitet ist.

Code: Alles auswählen

procedure TForm1.BitBtn1Click(Sender: TObject);
 
 var PortNr : string;
 
begin
  if AccPort.Connected then AccPort.Close(Label5) else
   begin
    PortNr := ComboBox1.Text;
    AccPort.Open(PortNr,9600,7,'N',SB1,Label5);
    Label5.Show;
    AccPort.TestAccConn(Label6);
   end;
end;
In AccPort.Open wird Textfarbe und Caption von Label5 geändert.
AccPort.TestAccConn braucht dann einige Sekunden wenn keine Gegenstelle antwortet.
Erst dann ändert sich das Label ...
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10858
Registriert: Mo 11. Sep 2006, 19:01

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von theo »

Ja, du kannst Application.Processmessages aufrufen, wenn du das sofort updaten willst.

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von Hitman »

Show ist da übrigens glaube nicht das, was du willst. Du willst wohl eher .Repaint. Allerdings brauchst du trotzdem das ProcessMessages (Neuzeichnen ist nämlich nur eine "Anfrage", kein direkter Befehl).

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von AlterMann »

Das war's. Danke!
Früher war alles besser. Und aus Holz!

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von RSE »

Zusammenfassend ist zu sagen: In Dos-Zeiten hattest du die Kontrolle über die volle Prozessorzeit, in Win hast du sie nur noch während der Abarbeitung von Events (z.B. wenn der User eine Aktion ausführt, wenn Timer ablaufen, wenn sich die Peripherie meldet). Ein Idle-Befehl ist daher einfach nicht mehr nötig. Stattdessen beendest du einfach deine Prozedur und reagierst auf das, auf das du wartest (Timerevent, Systemevent etc.) mit dem entsprechenden Event-Handler. Gibt es mal tatsächlich keinen entsprechenden Event (kommt selten vor), dann wartest du in einer Schleife, die Application.ProcessMessages; beinhaltet. Das ist aber nur noch als Notlösung anzusehen.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6764
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von af0815 »

Das Hauptproblem ist der 'gedankliche' Übergang vom Spaghetticode zum event-gesteuerten Code.

Man agiert nicht mehr :-) sondern reagiert.

Das hat mir am Anfang auch einiges an 'Umdenke' gekostet, mittlerweile gehts - lol
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von RSE »

schön gesagt, muss ich mir merken
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Ersatz für DOS-Int 15h Funkt. 83h (Timer)

Beitrag von AlterMann »

Was ihr schreibt ist zwar richtig, aber das Problem habe ich (zum größten Teil) schon hinter mich gebracht.
Als ich zuletzt in BP7 Programme geschrieben hab, war das durchaus vollständig OOP (und ehrlich gesagt das ist mir leichter gefallen, als ein paar Jahre davor der Umstieg von BASIC auf Pascal :P )
Und das was mir heute am meisten abgeht, sind ja eigentlich die Krücken die wir damals als Ersatz für ereignisgesteuerte Programmierung verwendeten: Der direkte Zugriff auf Hardwareinterrupts (Auch weil ich sehr oft nicht weiß, daß es ja Ersatz dafür gibt).
Aber mit jeder Zeile Code gefällt mir das Programmieren mit Lazarus besser, und es kommt mir auch vor, daß es etwas schneller geht, weil man sich auf's Wesentliche konzentrieren kann.
Früher war alles besser. Und aus Holz!

Antworten