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;
Webplain.de » Turbo Pascal » Tipps & Tricks
Nach oben
© 2000-2010 Clemens Weiß | Webplain.de
Link zu dieser Seite | Letzte Änderung: 26. Okt. 2008
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