Zum Navigations-Menü
Kein Layout? Lesen Sie hier, warum...

Webplain.de Infosite

Tipps & Tricks


Webplain.de » Turbo Pascal » Tipps & Tricks

1. Ermitteln des Bootlaufwerks

Ermittelt das Laufwerk, von dem gebootet wurde.
Rückgabe von »1« für Laufwerk A, »2« für Laufwerk B etc.

uses dos;
var regs : registers;
function get_bootdrive : integer;
begin
  regs.ax := $3305;
  intr ($21, regs);
  get_bootdrive := regs.dl;
end;

2. Prüfung auf Installation eines CD-ROM-Treibers

Gibt »TRUE« zurück, wenn ein CD-ROM-Treiber installiert ist.

uses dos;
var regs : registers;
function cdrom : boolean;
begin
  regs.ax := $1500;
  regs.bx := $0;
  intr ($2F, regs);
  if regs.bx = 0 then cdrom := false else cdrom := true;
end;

3. Ermitteln des BIOS-Datums

Gibt das Datum des BIOS zurück.

var i : integer;
begin
  for i := 0 to 7 do write(chr(mem[$F000 : $FFF5 + i]));
end.

4. Leeren des Tastaturpuffers

Löscht den Tastaturpuffer.

begin
  inline($FA);
  memw[$40 : $1A] := memw[$40 : $1C];
  inline($FB);
end;

5. Füllen des Tastaturpuffers

Füllt den Tastaturpuffer, um z. B. Abfragen in Programmen (J/N) automatisch zu beantworten.

procedure write_buffer(s : string);
var anfang  : integer absolute 0 : 1050;
    ende    : integer absolute 0 : 1052;
    zaehler : integer;
    zeile   : string[15] absolute s;
begin
  zeile := zeile + chr(13);
  anfang := 30;
  ende := 30 + length(zeile)*2;
  for zaehler := 1 to length(zeile) do mem[0 : 1054 +
    (zaehler-1)*2] := ord(zeile[zaehler]);
end;

6. NumLock An/Aus

Schaltet die NumLock-Taste an oder aus.

uses dos;
procedure set_numlock(on : boolean);
var regs : registers;
begin
  if on
  then byte(ptr(seg0040, $17)^) := byte(ptr(seg0040, $17)^) or $20
  else byte(ptr(seg0040, $17)^) := byte(ptr(seg0040, $17)^) and (not $20);
  regs.ah := $01;
  intr($16, regs);
end;
begin
  set_numlock(true);  { Numlock an }
  readln;
  set_numlock(false); { Numlock aus }
end.

7. CapsLock An/Aus

Schaltet die Feststell-Taste an oder aus.

uses dos;
procedure set_capslock(on : boolean);
var regs : registers;
begin
  if on
  then byte(ptr(seg0040, $17)^) := byte(ptr(seg0040, $17)^) or $40
  else byte(ptr(seg0040, $17)^) := byte(ptr(seg0040, $17)^) and (not $40);
  regs.ah := $01;
  intr($16, regs);
end;
begin
  set_capslock(true);  { CapsLock an }
  readln;
  set_capslock(false); { CapsLock aus }
end.

8. Prüfung auf Laufwerksbereitschaft

Gibt »TRUE« zurück, wenn das Laufwerk mit dem übergebenen Buchstaben bereit ist.

uses dos;
var regs : registers;
function drive_ready(drive : char) : boolean;
begin
  regs.ah := $32;
  regs.dl := ord(upcase(drive))-64;
  msdos(regs);
  drive_ready := regs.al <> $FF;
end;

9. Durchsuchen der Festplatte

Durchsucht das angegebene Laufwerk nach bestimmten Dateien.

uses dos;
procedure scan(s : string);
var f : searchrec;
begin
  findfirst(s + '*.*', $3F, f);
  while (doserror = 0) do
  begin
    with f do
    if (f.name[1] <> '.') and (f.attr <> 40) then
    begin { Verzeichnis gefunden }
      if attr = $10 then scan(s + f.name + '\')
      { Datei gefunden }
      else writeln(s + f.name);
    end;
    findnext(f);
  end;
end;
begin
  scan('C:\');
end.

10. Ein-/Ausschalten des blinkenden Cursors

Schaltet den blinkenden DOS-Cursor im Textmodus aus oder ein.

uses dos;
var regs : registers;
procedure cursor_aus;
begin
  regs.ax := $0100;
  regs.cx := $2607;
  intr($10, regs);
end;

procedure cursor_ein;
begin
  regs.ax := $0100;
  regs.cx := $0607;
  intr($10, regs);
end;

Kommentare

Es gibt 7 Kommentare zu »Tipps & Tricks«.
Neuen Kommentar posten...

1 Am 05. Mai. 2002 schrieb Bl@ckJ@ck:

Moin

Als Tipps & Tricks für Anfänger vielleicht ein wenig zu schwierig! Welcher Anfänger versteht schon was von Assembler, Registern oder Interrupts?

2 Am 25. Nov. 2002 schrieb Freak:

Die 10 funzt nicht. Ich habs versucht, aber ich kann den nervigen Cursor einfach nicht abschalten. Entweder sind die Register-Adressen falsch oder aber es geht vielleicht nicht, weil ich Dev-Pascal v1.9 (Free Pascal Compiler unter Windows) benutze und der die Register ignoriert oder vielleicht den Cursor unter anderen Registern liegen hat.

Ich werd mal TP 7.0 (Original Compiler unter DOS) installieren und es erneut versuchen. Aber irgendwie bezweifle ich, dass es funzen wird, weil es wirklich scheissegal ist ob ich  nun den Quellcode unter Dev-Pascal, Free Pascal, VPascal, TP 5.5, TP 7.0 oder sonstwas laufen lasse. Alle basieren auf Delphi, also muss ein Fehler in Tipp Nr. 15 sein.

Checkt das bitte noch mal durch......

3 Am 26. Nov. 2002 schrieb Clemens Weiß:

Hi Freak,
bei mir unter TP7.0 funktioniert das einwandfrei.
Kannst ja mal folgendes probieren:

Const
  NoCursor      = $2000;
  DefaultCursor = $0607;
  BlockCursor   = $000A;

Procedure SetCursor(Cursor : Word);
Assembler;

Asm
  Mov AH,1
  Mov BH,0
  Mov CX,Cursor
  Int $10
end;


So kannst du drei Cursortypen einstellen: Kein Cursor, Standard Cursor oder Block Cursor.

4 Am 20. Feb. 2006 schrieb DOS_FRIEK:

Die Tips&Tricks sind super (zum abschreiben).

Bischen schwer zu verstehen..

5 Am 20. Feb. 2006 schrieb Caro:

Also mal ganz ehrlich, ich programmieren jetzt schon ca. 2 Jahre mit TP und hab mir auch vieles durch Probieren beigebracht; aber diese Seite zeigt noch vieles lernbares auf!
Die Seite ist super und ich denke ihr habt meine Projektarbeit gerettet!
Danke!
Eure Caro

6 Am 14. Dez. 2008 schrieb nuützlich:

Die 5 geht nicht...
Das  anfang  : integer absolute 0 : 1050;
    ende    : integer absolute 0 : 1052;
kriegt er einfach nicht auf die Reihe

7 Am 22. Nov. 2009 schrieb E. Brockhaus:

Die 5 und 6 bekomme ich nicht hin:
1) seg0040 wird vom Turbo Pascal-Compiler mit einer Fehlermeldung abgewiesen. Mit ptr($0040,$17) wird alles fehlerfrei compiliert
2) Trotzdem funktioniert es unter Windows XP nicht. Ich habe unter Windows 98 immer folgende einfachere Routinen erfolgreich verwendet, die aber unter XP auch nicht mehr gehen:
uses dos;
procedure set_numlock(on : boolean);
var status : byte;
begin
status := mem[$40:$17];
if on
  then mem[$40:$17] := status-(status and 32)+32
  else mem[$40:$17] := status-(status and 32);
end;

procedure set_capslock(on : boolean);
var status : byte;
begin
status := mem[$40:$17];
if on
  then mem[$40:$17] := status-(status and 64)+64
  else mem[$40:$17] := status-(status and 64)-(status and 3 );
end;

Woran kann es liegen, dass alles unter XP nicht mehr funktioniert?
mem[$40:$17] gibt den Status der NumLock- und CapLock-Taste zwar korrekt an, wenn diese Tasten manuell betätigt werden, aber eine Veränderung über Turbo-Pascal geht nicht mehr.
Danke im Voraus
E. Brockhaus

Neuer Kommentar

Richten Sie generelle Fragen bitte ins Turbo Pascal-Forum!








Webplain.de » Turbo Pascal » Tipps & Tricks

Nach oben
© 2000-2010 Clemens Weiß | Webplain.de
Link zu dieser Seite | Letzte Änderung: 26. Okt. 2008