Home Programmierung
und BIOS
Shareware-
FAQ
Kontakt u.
Infos

DOS-Interrupte 20h und 21h

Interrupt 20h (Programm beenden)

Bedeutung Eingabe Ausgabe DOS - Implementierung Anmerkungen
Programm beenden CS=Segment PSP - 1.0 Beendet das aktive Programm.



Interrupt 21h (Schnittstelle zu DOS) - Teil 1

Funktion Unter-
funktion
Bedeutung Eingabe Ausgabe DOS - Implemen-
tierung
Anmerkungen
00h - Programm beenden AH=00h
CS=Segmentadresse des PSP
- 1.0 Beendet das aktive Programm, gibt dessen Speicher frei, setzt die Interruptvektoren 22h, 23h und 24h zurück und schließt alle vom Programm geöffneten Dateien.
01h - Zeicheneingabe mit Echo AH=01h AL=ASCII - Code 1.0 Liest ein Zeichen von der Standardeingabe (Tastatur) und gibt es auf der Standardausgabe (Bildschirm) aus. Bei erweiterten Tasten (z.B. Funktionstasten) liefert die Funktion 0, der darauffolgende Aufruf den Scancode der Taste.
02h - Zeichenausgabe AH=02h
DL=ASCII - Code
- 1.0 Gibt ein Zeichen auf der Standardausgabe (Bildschirm) aus.
03h - Zeichen von der seriellen Schnittstelle lesen AH=03h AL=ASCII - Code 1.0 Liest ein Zeichen von der seriellen Schnittstelle AUX (normalerweise COM1). Ist kein Zeichen verfügbar, wartet die Funktion.
04h - Zeichen auf serieller Schnittstelle ausgeben AH=04h
DL=ASCII - Code
- 1.0 Schreibt ein Zeichen auf die serielle Schnittstelle AUX (normalerweise COM1).
05h - Ausgabe an Drucker AH=05h
DL=ASCII - Code
- 1.0 Gibt ein Zeichen auf dem Gerät PRN aus. Sollte das Gerät nicht bereit sein, wartet der Interrupt bzw. ein Interrupt 24h wird ausgelöst.
06h - Direkte Zeicheneingabe und -ausgabe AH=06h
DL=0..254: dieses Zeichen ausgeben
DL=255: Zeichen einlesen
ZF=1: kein Zeichen verfügbar
ZF=0: AL=ASCII - Code
1.0 Dient zur Ein- und Ausgabe von Zeichen über die Standardeingabe / -ausgabe. Spezielle Tasten wie ^C und ^P (also mit Strg) werden nicht als solche erkannt.
07h - Zeicheneingabe ohne Echo AH=07h AL=ASCII - Code 1.0 Liest ein Zeichen von der Standardeingabe, ohne es auf der Standardausgabe auszugeben. Spezielle Steuercodes werden nicht also solche interpretiert.
08h - Zeichen von der Tastatur lesen AH=08h AL=ASCII - Code 1.0 Liest ein Zeichen von der Standardeingabe, ohne es auf der Standardausgabe auszugeben. Spezielle Steuercodes werden als solche erkannt.
09h - Ausgabe einer Zeichenkette AH=09h
DS=Segmentadresse der Zeichenkette
DX=Offsetadresse der Zeichenkette
- 1.0 Gbit einen String, der mit dem Zeichen $ (Dollar) enden muß, über die Standardausgabe aus. Spezielle Steuercodes werden als solche erkannt.
0Ah - Gepufferte Tastatureingabe AH=0Ah
AL=max. Stringlänge
DS=Segmentadresse des Puffers
DX=Offsetadresse des Puffers
- 1.0 Bietet die Möglichkeit der Texteingabe über die Standardeingabe. Spezielle Steuercodes werdem als solche erkannt.
Der Puffer muß zwei Zeichen größer sein als die maximale Zeichenzahl. Vor dem Aufruf trägt man in das erste Byte die maximale Anzahl Zeichen ein, die eingegeben werden dürfen. An das zweite Byte schreibt DOS die Anzahl der eingegebenen Zeichen. Die Eingabe wird mit Enter abgeschlossen.
0Bh - Eingabestatus prüfen AH=0Bh AL=0: kein Zeichen verfügbar
AL=255: Zeichen verfügbar
1.0 -
0Ch - Eingabepuffer leeren, dann Eingabe AH=0Ch
AL=Nummer der aufzurufenden Funktion: 01h, 06h, 07h, 08h, 0Ah
weitere Register je nach Funktion
je nach aufgerufener Funktion 1.0 Löscht den Eingabepuffer und ruft anschließend die in AL angegebene DOS-Funktion auf. Übergibt man in AL den Wert null (0), so kehrt die Funktion sofort zurück.
0Dh - Plattenpuffer leeren (Laufwerks - Reset) AH=0Dh - 1.0 Weist DOS an, die Plattenpuffer (Buffers) zu leeren.
0Eh - Standardlaufwerk setzen AH=0Eh
DL=Laufwerksnummer
AL=Nummer des höchsten Laufwerks plus 1 1.0 Setzt das angegebene Laufwerk (A=0, B=1,...) als Standardlaufwerk für weitere Operationen.
0Fh - 018h FCB - Funktionen. Diese Funktonen dienen der Dateiarbeit mit FCBs. Da diese Funktionen aber in der Regel überholt sind, werden sie hier nicht mehr aufgeführt.
19h - Standardlaufwerk ermitteln AH=19h AL=aktuelles Standardlaufwerk 1.0 A=0, B=1,...
1Ah - DTA - Adresse setzen AH=1Ah
DS=Segmentadresse der DTA
DX=Offsetadresse der DTA
- 1.0 Verändert die DTA-Adresse, die standardmäßg nach dem Programmstart auf Offset 80h des PSP steht. Die DTA (Disk Transfer Area) kommt bei FCB-orientierten Dateioperationen sowie bei den DOS-Funktionen 4Eh und 4Fh zum Einsatz.
1Bh - Informationen über aktuelles Laufwerk einholen AH=1Bh AL=Anzahl Sektoren pro Cluster
DS:BX=FAR - Zeiger auf das Media - Descriptor - Byte
CX=Anzahl Bytes pro Cluster
DX=Anzahl Cluster
1.0 -
1Ch - Informationen über ein beliebiges Laufwerk einholen AH=1Ch
DL=Laufwerksnummer
AL=Anzahl Sektoren pro Cluster
DS:BX=FAR - Zeiger auf das Media - Descriptor - Byte
CX=Anzahl Bytes pro Cluster
DX=Anzahl Cluster
1.0 0=aktuelles Laufwerk, A=1, B=2, ...
21h - 24h FCB - Funktionen. Diese Funktonen dienen der Dateiarbeit mit FCBs. Da diese Funktionen aber in der Regel überholt sind, werden sie hier nicht mehr aufgeführt.
25h - Interrupt - Vektor setzen AH=25h
AL=Nummer des Interrupts
DS=Segmentadresse der neuen Interruptroutine
DX=Offsetadresse der neuen Interruptroutine
- 1.0 Setzt für einen Interrupt eine neue Behandlungsroutine ein.
26h - Neuen PSP erstellen AH=26h
DX=Segmentadresse
- 1.0 Erstellt eine Kopie des aktiven PSPs und trägt dort alle relevanten Werte ein.
27h - 29h FCB - Funktionen. Diese Funktonen dienen der Dateiarbeit mit FCBs. Da diese Funktionen aber in der Regel überholt sind, werden sie hier nicht mehr aufgeführt.
2Ah - Datum ermitteln AH=2Ah AL=Wochentag (0=Sonntag, 1=Montag...)
DL=Monatstag
DH=Monat
CX=Jahr
1.0 -
2Bh - Datum ändern AH=2Bh
DL=Monatstag
DH=Monat
CX=Jahr
AL=0: neues Datum eingestellt
AL=255: ungültiges Datum
1.0 -
2Ch - Systemzeit ermitteln AH=2Ch CH=Stunde
CL=Minute
DH=Sekunde
DL=100stel Sekunde
1.0 -
2Dh - Systemzeit ändern AH=2Dh
CH=Stunde
CL=Minute
DH=Sekunde
DL=100stel Sekunde
AL=0: neue Zeit eingestellt
AL=255: ungültige Uhrzeit
1.0 Stellt die Uhrzeit. Ab DOS-Version 3.3 wird ebenfalls die Echtzeituhr gestellt.
2Eh - Verify AH=2Eh
AL=0: Verify aus
AL=1: Verify an
- 1.0 Ist Verify eingeschaltet, werden geschriebene Sektoren noch einmal eingelesen, um zu überprüfen, ob alle Sektoren beschreibbar waren.
2Fh - DTA-Adresse ermitteln AH=2Fh ES=Segmentadresse der DTA
BX=Offsetadresse der DTA
2.0 Ermittelt die gegenwärtige DTA-Adresse
30h - DOS-Version ermitteln AH=30h AH=Nebenversionsnummer
AL=Hauptversionsnummer
BX=OEM-Nummer oder Versions-Flag
BL=High-Byte der 24-Bit- Seriennummer
CX=Low-Byte der 24-Bit- Seriennummer
2.0 Ermittelt die installierte DOS-Version. "Setver" kann die die Werte verfälschen. DR-DOS bis Version 6.0 meldet über diese Funktion die Versionsnummer 3.31, MS-DOS 1.0 die Nummer 0.
OEM- und Seriennummer müssen nicht vorhanden sein.
31h - Programm resident beenden AH=31h
AL=Exitcode
DX=Anzahl der Paragraphen, die resident im Speicher bleiben.
- 2.0 Die Interruptvektoren 22h, 23h und 24h werden zurückgesetzt. Offene Dateien werden nicht geschlossen. Der belegte Speicherblock wird entsprechend der Größe in DX angepaßt.
32h - DPB ermitteln AH=32h
DL=Laufwerksnummer (0=aktuell, 1=A, 2=B,...)
AL=Status (0:erfolgreich, FFh:Fehler)
BX=Zeigeroffset auf DPB-Struktur
DS=Zeigersegment auf DPB-Struktur
k.A. -
33h 00h CTRL+C - Flag lesen AH=33h
AL=00h
DL=Break-Flag (0: aus, 1: an) k.A. -
33h 01h CTRL+C - Flag setzen AH=33h
AL=01h
DL=Break-Flag (0: aus, 1: an)
- k.A. -
33h 05h Bootlaufwerk ermitteln AH=33h
AL=05h
DL=Laufwerksbuchstabe 4.0 A=1, B=2,...
33h 06h MS-DOS Version ermitteln AH=33h
AL=06h
BX=Versionsnummer
DX=
Bits 0..2: Revisionsnummer
Bit 11: ROM-Version
Bit 12: DOS in HMA
MS-DOS 5.0 liefert die wahre DOS-Version, "Setver" ist wirkungslos.
34h - InDOS-Flag ermitteln AH=34h ES=Segmentadresse des Flags
BX=Offsetadresse des Flags
2.0 Wird in Verbindung mit speicherresidenten Programmen benötigt. Ermittelt die Adresse eines Flags, das auf 1 gesetzt wird, wenn ein DOS-Interrupt aktiv ist (andernfalls 0).
35h - Interrupt - Vektor ermitteln AH=35h
AL=Interruptnummer
ES=Segmentadresse der Interrupt - Routine
BX=Offsetadresse der Interrupt - Routine
2.0 Ermittelt die aktuelle Adresse eines Interrupt - Vektors. Wird in der Regel kurz vor Funktion 25h aufgerufen, um den alten Interrupt - Vektor zu sichern.
36h - Freien Speicherplatz ermitteln AH=36h
DL=Laufwerksnummer
AX=Sektoren pro Cluster (0FFFFh bei Fehler)
BX=Anzahl der freien Cluster
CX=Anzahl der Bytes pro Sektor
DX=Anzahl aller Cluster
2.0 A=1, B=2, ...
38h 00h Länderspezifische Daten lesen AH=38h
AL=Länder - Code oder FFh
BX=Länder -Code oder FFh
DX=Offset des Zeigers auf Countryinfo - Struktur
DS=Segment des Zeigers auf Countryinfo - Struktur
CF=Fehler
AX=Fehlercode (bei gesetztem Carry)
BX=Länder - Code (bei CF gelöscht)
Buffer=Länderdaten oder Countryinfo - Struktur
2.1 Ist der Länder - Code kleinergleich 254, ist AL=Länder - Code. Ist der Länder - Code größer als 254, ist AL=0FFh und BX=Länder - Code.
38h xxh Landesspezifische Daten setzen (xx=Länder - Code) AH=36h
AL=Länder - Code oder FFh
BX=Länder - Code, wenn AL=FFh
DX=FFFFh
DS=FFFFh
CF=Fehler
AX=Fehlercode (bei gesetztem Carry)
3.0 Ist der Länder - Code kleinergleich 254, ist AL=Länder - Code. Ist der Länder - Code größer als 254, ist AL=0FFh und BX=Länder - Code.
39h - Verzeichnis erstellen AH=39h
DS:DX=FAR-Zeiger auf den ASCIIZ - String
CF=Fehler
AX=Fehlercode (3: Pfad nicht gefunden; 5: Zugriff verweigert)
2.0 Der übergebene ASCIIZ-String (nullterminierte Zeichenkette) kann eine komplette Pfad- sowie Laufwerksbezeichnung enthalten. Es kann nur eine Verzeichnisebene auf einmal erstellt werden.
3Ah - Verzeichnis löschen AH=3Ah
DS:DX=FAR-Zeiger auf ASCIIZ - String
CF=Fehler
AX=Fehlercode (3: Pfad nicht gefunden; 5: Zugriff verweigert; 16: aktuelles Verzeichnis kann nicht gelöscht werden)
2.0 Löscht den angegebenen Verzeichnisnamen, der eine komplette Pfad- und Laufwerksbezeichnung enthalten darf.
3Bh - Verzeichnis wechseln AH=3Bh
DS:DX=FAR-Zeiger auf ASCIIZ - String
CF=Fehler
AX=Fehlercode (3: Pfad nicht gefunden; 5: Zugriff verweigert)
2.0 Der angegebene Verzeichnisnamen darf eine komplette Pfad- und Laufwerksbezeichnung enthalten.

Fortsetzung:
-> Teil2
-> Teil3


Media-Descriptor-Byte

Wert Bedeutung
F0h 3,5-Zoll-Diskette (80 Spuren, 18 Sektoren, 2 Seiten) oder (80 Spuren, 36 Sektoren, 2 Seiten)
F8h Festplatte oder RAM-Laufwerk
F9h 3,5-Zoll-Diskette (80 Spuren, 9 Sektoren, 2 Seiten) oder 5,25-Zoll-Diskette (80 Spuren, 15 Sektoren, 2 Seiten)
FDh 5,25-Zoll-Diskette (40 Spuren, 9 Sektoren, 2 Seiten)



DPB-Struktur (Funktionen 1Fh & 20h)

Offset Länge Name Inhalt
00h 1 Byte dpbDrive Laufwerksnummer (0=A, 1=B,...)
01h 1 Byte dpbUnit Unitnummer des Treibers
02h 1 Word dpbSectorSize Sektorgröße in Byte
04h 1 Byte dpbClusterMask Sektoren pro Cluster minus 1
05h 1 Byte dpbClusterShift Sektoren pro Cluster in Zweierpotenzen
06h 1 Word dpbFirstFAT Erster Sektor mit FAT
08h 1 Byte dpbFATCount Anzahl FAT's
09h 1 Word dpbRootEntries Anzahl Einträge im Stammverzeichnis
0Bh 1 Word dpbFirstSector Erster Sektor des ersten Clusters
0Dh 1 Word dpbMaxClusters Anzahl Cluster auf dem Laufwerk plus 1
0Fh 1 Word dpbFATSize Anzahl Sektoren, welche die FAT belegt
11h 1 Word dpbDirSector Erster Sektor mit Verzeichnis
13h 1 DWord dpbDriverAddr Adresse des Gerätetreibers
17h 1 Byte dpbMedia Media-Descriptor
18h 1 Byte dpbFirstAccess Zugriff auf Laufwerk
19h 1 DWord dpbNextAccess Adresse des nächsten Parameterblocks
1Dh 1 Word dpbNextFree Letzter reservierter Cluster
1Fh 1 Word dpbFreeCnt Anzahl freier Cluster



Countryinfo-Struktur

Offset Länge Name Inhalt USA-Wert
00h 1 Word ciDateFormat 0=U.S. (mm/dd/yy)
1=Europe (dd/mm/yy)
2=Japan (yy/mm/dd)
0
02h 5 Byte ciCurrency ASCIIZ-String $
07h 2 Byte ciThousands ASCIIZ-String ,
09h 2 Byte ciDecimal ASCIIZ-String .
0Bh 2 Byte ciDateSep ASCIIZ-String /
0Dh 2 Byte ciTimeSep ASCIIZ-String :
0Fh 1 Byte ciBitField 0=Währungssymbol vor Betrag, kein Leerzeichen
1=Währungssymbol nach Betrag, kein Leerzeichen
2=Währungssymbol vor Betrag, ein Leerzeichen
3=Währungssymbol nach Betrag, ein Leerzeichen
4=Währungssymbol ersetzt Dezimaltrennzeichen (laut IBM)
0
10h 1 Byte ciCurrencyPlaces Binärwert 2
11h 1 Byte ciTimeFormat 0=12 Stunden
1=24 Stunden
1
12h 1 DWord ciCaseMap Die Segment:Offset - Adresse der FAR-Prozedur, die Klein-/Groß- Buchstaben von 80h auf FFh abbildet NA
16h 2 Byte ciDataSep ASCIIZ-String NA
18h 10 Byte ciReserved   NA



Länder-Codes

Code Land Tastencode
001 USA US
002 Kanada (Französisch) CF
003 Lateinamerika LA
031 Niederlande NL
032 Belgien BE
033 Frankreich FR
034 Spanien SP
036 Ungarn HU
038 Jugoslavien (nur DOS 5.0) YU
039 Italien IT
041 Schweiz (Französisch) SF
041 Schweiz (Deutsch) SG
042 Tschechoslowakei (Tsch.) (nur DOS 5.0) CZ
042 Tschechoslowakei (Slow.) (nur DOS 5.0) SL
044 Großbritannien UK
045 Dänemark DK
046 Schweden SV
047 Norwegen NO
048 Polen (nur DOS 5.0) PL
049 Deutschland GR
055 Brasilien (nur DOS 5.0) BR
061 Internationales Englisch -
081 Japan (nur DOS 4.0) JA
082 Korea (nur DOS 4.0) KO
086 Volksrepublik China (nur DOS 4.0) CH
088 Taiwan (nur DOS 4.0) TN
351 Portugal PO
358 Finnland SU
785 Arabische Länder -
972 Israel (Hebräisch) -



Fehlercodes

Code Bedeutung
01h ungültiger Funktionscode
02h Datei nicht gefunden
03h Pfad nicht gefunden
04h zu viele offene Dateien
05h Zugriff verweigert
06h ungültiges Handle
07h Arena zerstört
08h nicht genug Speicherplatz
09h ungültiger Block
0Ah ungültige Umgebung
0Bh ungültiges Format
0Ch ungültiger Zugriffscode
0Dh ungültige Daten
0Eh reserviert
0Fh ungültiges Laufwerk
10h Versuch, das aktuelle Verzeichnis zu entfernen
11h nicht dasselbe Gerät
12h keine Datei mehr
13h Diskette ist schreibgeschützt
14h Disketten-Unit ist fehlerhaft
15h Laufwerk nicht bereit
16h ungültiger Befehl
17h CRC-Fehler
18h Länge der Request-Struktur falsch
19h Suchfehler
1Ah Keine DOS-Diskette
1Bh Sektor nicht gefunden
1Ch Papier aus
1Dh Schreibfehler
1Eh Lesefehler
1Fh Allgemeienr Fehler
20h Fehler bei gemeinsamen Zugriff
21h Sperr-Fehler
22h Falsche Diskette
23h FCB nicht zugänglich
24h Puffer für gemeinsamen Zugriff: Überlauf
25h Falsche Codeseite
26h Handle-EOF
27h Handle-Diskette voll
28h - 31h reserviert
32h Netzanfrage nicht unterstützt
33h entfernter Rechner nicht bereit
34h doppelter Name im Netz
35h Netzpfad nicht gefunden
36h Netz beschäftigt
37h Netztreiber existiert nicht mehr
38h BIOS-Befehlsgrenze ins Netz überschritten
39h Netzkartenfehler
3Ah Falsche Antwort vom Netz
3Bh unerwarteter Netzfehler
3Ch nicht kompatible Karte in fernem Computer
3Dh Druckerwarteschlange voll
3Eh Nicht genug Platz für Druckdatei
3Fh Druckdatei wurde gelöscht
40h Zugriff verweigert
41h Typ des Netztreibers nicht korrekt
42h Netzname nicht gefunden
43h Grenze der BIOS-Sitzung im Netz überschritten
44h temporäre Pause
45h Neztanfrage abgelehnt
46h Druck- oder Diskettenumlenkung angehalten
47h Netzanfrage nicht akzeptiert
48h Drucker oder Plattenumleitung angehalten
49h - 4Fh reserviert
50h Datei existiert schon
51h FCB doppelt
52h kann Verzeichniseintrag nicht erstellen
53h Interrupt 24h gescheitert
54h keine Strukturen mehr
55h schon zugewiesen
56h ungültiges Passwort (unter DR DOS ab Version 5.0)
57h ungültiger Parameter
58h Netz-Schreibe-Fehler
59h Funktion vom Netz nicht unterstützt
5Ah nötige Systemkomponente nicht installiert

Je nach Funktion sind meist nur bestimmte Codes relevant.


Die Funktionen können mit dem Turbo-Pascal-eigenen Assembler aufgerufen werden. Ein Anwendungsbeispiel könnte so aussehen:


ASM

  mov {...}

  {Register entsprechend der Spalte "Eingabe" belegen...}

  int $21;

  mov {...}

  {Register auslesen gemäß der Spalte "Ausgabe"...}

END;

Generell wird im Register AH die Funktionsnummer übergeben.

Alle Angaben ohne Gewähr.

Achtung: bitte Hinweise zur Aktualitšt der Daten beachten! Copyright