MS-DOS Programmierhandbuch

Transcription

MS-DOS Programmierhandbuch
1
DOS Programmierhandbuch
Günter Born
Das MS-DOS-Programmierhandbuch
MS-DOS 1.x - 6.x
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
2
DOS Programmierhandbuch
Günter Born
Die Informationen in diesem Buch werden ohne Rücksicht auf einen eventuellen
Patentschutz gemacht. Eventuell vorkommende Warennamen werden benutzt, ohne daß
ihre freie Verwendbarkeit gewährleistet werden kann.
Das Buch wurde mit größter Sorgfalt erstellt und korrigiert. Dennoch können Fehler und
Ungenauigkeiten nicht ausgeschlossen werden - wir sind auch nur Menschen.
Weder Verlag noch Autor können für fehlerhafte Angaben oder gar deren Folgen eine
juristische Verantwortung oder irgendeine Haftung übernehmen. Bitte haben Sie
Verständnis, dass ich Verbesserungsvorschläge oder Hinweise auf Fehler nicht mehr
einarbeiten kann.
Alle Rechte, auch der fotomechanischen Wiedergabe und der Veröffentlichung in
elektronischen oder sonstigen Medien, behalten wir uns vor. Dieses elektronische Buch
darf frei benutzt werden
Dieses Buch wurde im Rahmen der »Free Library« als Donation-Ware aufbreitet. Dies
bedeutet, Sie können es kostenlos von der Webseite www.borncity.de herunterladen und
frei (gegen eine kleine, aber freiwillige, Spende - Donation – z.B. über PayPal an
[email protected]) für private Zwecke auf der Basis AS-IS nutzen. Ein Support oder eine
Unterstützung bei der Anwendung ist nicht möglich. Die gewerbliche Nutzung der in
diesem Buch gezeigten Beispiele, Modelle, Abbildungen und Ideen ist untersagt.
© 1993 by Günter Born
Satz: Günter Born
Herstellung: Günter Born
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
3
DOS Programmierhandbuch
Inhaltsverzeichnis
Inhaltsverzeichnis
Vorwort
31
1 Einführung
33
3
1.1 Das Speicherabbild der 8086/8088-Prozessoren ....................................................... 33
1.2 Die Segment Offset-Notation.................................................................................... 34
1.3 Die Speicheraufteilung durch Intel............................................................................ 35
1.4 Die Speicherbelegung durch MS-DOS ..................................................................... 36
1.5 Die Aufteilung des 640-Kbyte-MS-DOS-RAM-Bereiches....................................... 38
1.6 Die MS-DOS-Interupt-Vektor-Tabelle ..................................................................... 39
Division durch 0 (INT 0)
43
Single Step (INT 1) 43
NMI (Non Maskable Interrupt INT 2) 43
Break-Point-Interrupt (INT 3) 44
Overflow (INT 4) 44
Systemzeit 8253 Timer (INT 8)
44
Tastatur (INT 9)
44
Diskette (INT 0E) 44
1.7 Der BIOS-Datenbereich ............................................................................................ 45
1.8 Der DOS-Datenbereich ............................................................................................. 49
1.9 Die Funktion des Programmes IO.SYS (IBMBIO.COM)......................................... 51
1.10 Die Funktion des Programmes MSDOS.SYS (IBMDOS.COM) ............................ 53
1.11 Die Funktion des Programmes COMMAND.COM ................................................ 53
DOS 2.1
54
DOS 3.0-6.0
54
2 Die BIOS-Funktionen 54
2.1 Print-Screen-Funktion (INT 5).................................................................................. 55
2.2 BIOS-Bildschirmausgabe (INT 10)........................................................................... 55
Bildschirmmodus wählen (AH = 00H) 55
Cursor-Größe definieren (AH = 01H) 56
Cursor positionieren (AH = 02H)
57
Cursorposition ermitteln (AH = 03H) 57
Position Lichtgriffel (AH = 04H)
58
Bildschirmseite selektieren (AH = 05H)
Bildschirmfenster Scroll Up (AH = 06H)
Bildschirmfenster Scroll Down (AH = 07H)
58
59
59
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
4
DOS Programmierhandbuch
Zeichen und Attribute an Cursorposition lesen (AH = 08H)
60
Zeichen und Attribut an Cursorposition schreiben (AH = 09H) 61
Zeichen an Cursorposition schreiben (AH = 0AH)
62
Farbpalette für Grafik setzen (AH = 0BH)
62
Grafikpunkt setzen (AH = 0CH)
63
Grafikpunkt lesen (AH = 0DH)
64
Zeichen ausgeben (AH = 0EH)
64
Bildschirmstatus lesen (AH = 0FH) 65
Zeichenkette ausgeben (AH = 13H) 65
Microsoft Maustreiber EGA Support (AH = F0H)
66
Microsoft Maustreiber EGA Support (AH = F1H)
66
Microsoft Maustreiber EGA Support (AH = F2H)
67
Microsoft Maustreiber EGA Support (AH = F3H)
67
Microsoft Maustreiber EGA Support (AH = F4H)
67
Microsoft Maustreiber EGA Support (AH = F5H)
68
Microsoft Maustreiber EGA Support (AH = F6H)
68
Microsoft Maustreiber EGA Support (AH = F7H)
68
Microsoft Maustreiber EGA Support (AH = FAH)
69
2.3 Hardwarekonfiguration (INT 11) .............................................................................. 69
2.4 Speichergröße ermitteln (INT 12) ............................................................................. 70
2.5 Disketten- und Festplatten-Steuerung (INT 13) ........................................................ 71
Disk-System zurücksetzen (AH = 00H)
71
Status lesen (AH = 01H)
72
Sektor Read (AH = 02H)
74
Sektor Write (AH = 03H)
76
Sektor Verify (AH = 04H)
76
Spur formatieren (AH = 05H) 77
Harddisk-Format Track (AH = 06H) 78
Harddisk-Format ab n. Spur (AH=07H)
79
Get Current Drive Parameter (AH = 08H)
80
Init Drive Characteristics (AH = 09H) 80
Read Long (AH = 0AH)
81
Write Long (AH = 0BH)
81
Seek (AH = 0CH) 82
Alternate Disk Reset (AH = 0DH)
82
Read Sector Buffer (AH = 0EH)
83
Write Sector Buffer (AH = 0FH)
83
Test For Drive Ready (AH = 10H)
84
Recalibrate Drive (AH = 11H)
84
Controller RAM Diagnose (AH = 12H)
84
Drive Diagnose (AH = 13H) 84
Controller internal Diagnose (AH = 14H)
85
Read DASD Type (AH = 15) 85
Change of Disk Status (Diskette) (AH = 16H) 86
Set Disk Type for Format (Diskette) (AH = 17H)
Set Media Type for Format (Diskette) (AH = 18H)
Park Hard Disk Heads (AH = 19H)
87
86
87
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
5
DOS Programmierhandbuch
ESDI Harddisk-Format (AH = 1AH) 87
2.6 Serielle Schnittstelle (INT 14)................................................................................... 88
Schnittstelle initialisieren (AH = 00H) 88
Zeichen ausgeben (AH = 01H)
89
Zeichen lesen (AH = 02H)
90
Status lesen (AH = 03H)
90
Extended Initialize (AH = 04H)
91
Extended Communication Port Control (AH = 05H)
92
2.7 INT 15 ....................................................................................................................... 92
ABIOS Build System Parameter Table (AH = 04)
93
ABIOS Build Initialisation Table (AH = 05)
93
ESDI-Format-Unit-Interrupt (AH = 0FH)
94
Tastatur-Interrupt (AH = 4FH)
95
Open Device (AH = 80H)
95
Close Device (AH = 81H)
95
Program Termination (AH = 82H)
96
Event Wait (AH = 83H)
96
Joystick Support (AH = 84H) 97
System Request Key (AH = 85H)
97
Wait (AH = 86H)
98
Move Block (AH = 87H)
98
Extended Memory Size (AH = 88H) 100
Virtual Modus (AH = 89H) 101
Device Busy (AH = 90H)
102
Set Complete Interrupt Flag (AH=91H)
103
Get Configuration Parameter (AH=C0H)
104
Return Extended BIOS-Data Area Segment Adresse (AH = C1H) 105
PS/2-BIOS Maus Interface (AH = C2H)
106
PS/2-BIOS Maus Enable/Disable(AX = C200H)
106
PS/2-BIOS Maus Reset (AX = C201H)
106
PS/2-BIOS Set Sampling Rate(AX = C202H) 107
PS/2-BIOS Set Resolution(AX = C203H)
107
PS/2-BIOS Get Type(AX = C204H) 107
PS/2-BIOS Initialize(AX = C205H) 108
PS/2-BIOS Get/Set Scaling Faktor (AX = C206H)
108
PS/2-BIOS Set Device Handler Adresse (AX = C207H) 109
EISA-ROM Funktionen(AH = D8H) 109
EISA-ROM Read Slot Configuration(AX = D800H)
109
EISA-ROM Read Funktion Configuration(AX = D801H)
111
EISA-ROM Clear EISA-CMOS-RAM(AX = D802H) 111
EISA-ROM Write EISA-CMOS-RAM(AX = D803H) 112
EISA-ROM Read Physical Slot(AX = D804H) 112
EISA-ROM 32-Bit CS-Adress-Mode-Calls(AX = D88xH)
113
Compac Systempro Multiprozessor(AX = ExxxH)
113
2.8 Tastatur abfragen (INT 16) ..................................................................................... 113
Zeichen aus Puffer lesen (AH = 00H) 113
Status des Puffers abfragen (AH = 01H)
113
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
6
Shift-Status abfragen (AH = 02H)
114
Wiederholrate ändern (AH = 03H)
114
Zeichenfolge speichern (AH = 05H) 115
MF2-Tastatur abfragen (AH = 10H) 116
Zeichen in Puffer (AH = 11H)116
Check extended Status (AH = 12H) 116
2.9 Druckerschnittstelle (INT 17) ................................................................................. 117
Zeichen ausgeben (AH = 00H)
117
Printer Port initialisieren (AH = 01H) 118
Printer Status lesen (AH = 02H)
118
2.10 ROM-Basic (INT 18) ............................................................................................ 119
2.11 Bootstrap (INT 19)................................................................................................ 119
2.12 Systemzeit (INT 1A) ............................................................................................. 119
Zeit lesen (AH = 00H)
119
Zeit setzen (AH = 01H)
120
Read Real Time Clock (AH = 02H) 120
Set Real Time Clock (AH = 03H)
120
Read Date from RTC (AH = 04H)
121
Set Date into Real Time Clock (AH = 05H)
121
Set the Alarm (AH = 06H) 121
Reset the Alarm (AH = 07H) 122
2.13 Tastatur-Break (INT 1B)....................................................................................... 122
2.14 Timerinterrupt (INT 1C) ...................................................................................... 122
2.15 Bildschirm-Initialisierung (INT 1D) ..................................................................... 123
2.16Disk-Parameter (INT 1E) ....................................................................................... 123
2.17 Grafik-Tabelle (INT 1F)........................................................................................ 124
3 Die MS-DOS-Interrupts
125
3.1 Program Terminate (INT 20) .................................................................................. 126
3.2 MS-DOS-Funktionsdispatcher (INT 21)................................................................. 127
3.3 Terminate Process Exit Address (INT 22) .............................................................. 128
3.4 Control-C Exit Handler Address (INT 23).............................................................. 128
3.5 Critical Error Handler Address (INT 24) ................................................................ 129
Disk-Error-Code
131
Device-Error-Code 132
3.6 Absolute Disk Read (INT 25) ................................................................................. 133
3.7 Absolute Disk Write (INT 26) ................................................................................ 137
3.8 Terminate But Stay Resident (INT 27) ................................................................... 139
3.9 Start a Resident Process (INT 28 undokumentiert) ................................................. 140
3.10 Screen Output (INT 29 undokumentiert) .............................................................. 141
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
7
DOS Programmierhandbuch
3.11 Microsoft Netzwerk-Session Layer Interrupt (INT 2A undokumentiert).............. 142
3.12 Start a Child Process (INT 2E undokumentiert).................................................... 143
3.13 Mulitplexerinterrupt (INT 2F undokumentiert)..................................................... 145
3.14 Der INT 30H ......................................................................................................... 145
3.15 Der INT 31H ......................................................................................................... 146
3.16Der INT 32H .......................................................................................................... 146
3.17 Der Maus-Treiber-Interrupt (INT 33) ................................................................... 146
Maus INIT (AX = 00H)
146
Mauszeiger einblenden und löschen (AX = 01H, AX = 02H)
Get Parameter (AX = 03H) 147
Set Cursor (AX = 04H)
147
Get Cursorposition and Pressed Buttons (AX = 05H)
148
Get Cursorposition and Free Buttons (AX = 06H)
148
Set X-Koordinates (AX = 07H)
149
Set Y-Koordinates (AX = 08H)
149
Define Cursor Symbol (AX = 09H)
149
Define Textcursor Symbol (AX = 0AH)
150
Read Steps (AX = 0BH)
151
Set Event-Interrupt (AX = 0CH)
151
Emulate Lightpen (AX = 0DH, 0EH) 152
Set Step Size (AX = 0FH)
152
Restore Old Screen (AX = 10H)
153
PC-Mouse Set Large Graphics Cursor (AX = 12H)
153
Define Speed (AX = 13H)
154
(MS-Maus) Exchange Interrupt Subroutines (AX = 14H)154
(MS-Mouse) Return Driver Storage Requirements (AX = 15H)
(MS-Mouse) Save Driver State (AX = 16H)
154
(MS-Mouse) Restore Driver State (AX = 17H) 155
(MS-Maus) Set alternate Mouse User Handler (AX = 18H)
(MS-Mouse) Return User alternate Interrupt Vektor (AX = 19H)
(MS-Mouse) Set Mouse Sensitivity (AX = 1AH)
156
(MS-Mouse) Get Mouse Sensitivity (AX = 1BH)
156
(MS-Mouse) Set Interrupt Rate (AX = 1CH) 157
(MS-Mouse) Define Display Page Number (AX = 1DH) 157
(MS-Mouse) Return Display Page Number (AX = 1EH) 158
(MS-Mouse) Disable Mouse Driver (AX = 1FH)
158
(MS-Mouse) Enable Mouse Driver (AX = 20H) 158
(MS-Mouse) Software Reset (AX = 21H)
158
(MS-Mouse) Set Language for Messages (AX = 22H) 159
(MS-Mouse) Get Language for Messages (AX = 23H) 159
(MS-Mouse) Get Software Version and Mouse Typ (AX = 24H)
(MS-Mouse) Set Acceleration Profile (AX = 2CH)
160
(MS-Mouse) Select Acceleration Profile (AX = 2DH) 160
(PC-Mouse) Get MS-Mouse storage Requirements (AX = 42H)
(MS-Mouse/Logitech) Return Copyright String (AX = 4DH)
147
154
155
156
159
160
161
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
8
(PC-Mouse) Save MS-Mouse State (AX = 50H)
161
(PC-Mouse) Restore MS-Mouse State (AX = 52H)
161
(MS-Mouse/Logitech) Get Version String (AX = 6DH) 162
3.18 INT 34 bis INT 3E ................................................................................................ 162
3.19 Overlay Manager (INT 3FH) ................................................................................ 163
3.20 Disktreiber (INT 40) ............................................................................................. 163
3.21 Parametertabelle Festplatte (INT 41, INT 46)....................................................... 163
3.22 EGA-Videostatus (INT 42) ................................................................................... 164
3.23 EGA-Grafikzeichensatz (INT 43) ......................................................................... 164
3.24 EGA-Interrupt (INT 44) ........................................................................................ 165
3.25 Timer-Alarm (INT 4A, INT 50)............................................................................ 165
3.26 VDS Virtual DMA Specification (INT 4BH) ....................................................... 165
VDS Get Version (AX=8102H)
165
VDS Lock DMA Region (AX=8103H)167
In ES:SI wird die Adresse auf die DMA-Descriptor-Struktur (DDS) übergeben. Der
Aufbau dieser Struktur ist beim Aufruf AX=8102H beschrieben. Bei einem Fehler ist
das Carry-Flag nach dem Aufruf gesetzt. Der Fehlercode in AL entspricht der
Kodierung gemäß AX=8102H. Das region size field in der DDS ist mit der maximalen
zusammenhängenden Speichergröße gefüllt. Bei gelöschtem Carry-Flag ist der
Bereich gesperrt. Dann kann die physiklische Seite nicht ausgelagert werden. In der
DDS sind das »physikalische Adress-FeldVDS Unlock DMA Region (AX=8104H)
167
VDS Scatter/Gather Lock Region (AX=8105H) 168
VDS Scatter/Gather Unlock Region (AX=8106H)
169
VDS Request DMA Buffer (AX=8107H)
169
VDS Release DMA Buffer (AX=8108H)
170
VDA Copy into DMA Buffer (AX=8109H)
170
VDA Copy out of DMA Buffer (AX=810AH) 171
VDA Disable DMA Translation (AX=810BH) 171
VDA Enable Translation (AX=810CH)
172
3.27 Common Access Method SCSI Interface (INT 4FH) ........................................... 172
3.28 GSS Computer Graphic Interface (INT 59H) ....................................................... 172
3.29 AT&T Starlan Extended NetBIOS (INT 5BH) ..................................................... 173
3.30 NETBIOS Interface (INT 5CH) ............................................................................ 173
3.31 PC/TCP Packet Driver (INT 60H) ........................................................................ 173
3.32 EMS-Treiber (INT 67H) ....................................................................................... 173
3.33 DECnet DOS CTERM Schnittstelle (INT 69H) ................................................... 174
3.34DECnet DOS LAT Schnittstelle (INT 6AH).......................................................... 174
3.35 Novell serial I/O (INT 6BH) ................................................................................. 174
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
9
DOS Programmierhandbuch
3.36 DOS 3.2 Realtime Clock Update (INT 6CH)........................................................ 174
3.37 VGA-Interrupt (INT 6DH).................................................................................... 174
3.38 HP ES-12 Extended BIOS (INT 6FH) .................................................................. 174
Read CMOS-Memory (AH = 22H)
Write CMOS-Memory (AH = 24H)
4 Die MS-DOS-Funktionen (INT 21)
174
175
175
In der Spalte »DOS4.1 Terminate Program (Funktion 00H, DOS 2.0 - 6.x).................. 180
4.2 Read Keyboard and Echo (Funktion 01H, DOS 2.0 - 6.x) ....................................... 180
4.3 Display Character (Funktion 02H, DOS 2.0 - 6.x) ................................................... 181
4.4 Auxiliary Input (Funktion 03H, DOS 2.0 - 6.x) ....................................................... 182
4.5 Auxiliary Output (Funktion 04H, DOS 2.0 - 6.x)..................................................... 182
4.6 Print Character; (Funktion 05H, DOS 2.0 - 6.x)...................................................... 183
4.7 Direct Console I/O (Funktion 06H, DOS 2.0 - 6.x).................................................. 183
4.8 Direct Console Input (Funktion 07H, DOS 2.0 - 6.x)............................................... 184
4.9 Read Keyboard (Funktion 08H, DOS 2.0 - 6.x) ....................................................... 184
4.10 Display String (Funktion 09H, DOS 2.0 - 6.x)....................................................... 184
4.11 Buffered Keyboard Input (Funktion 0AH, DOS 2.0 - 6.x)..................................... 185
4.12 Check Keyboard Status (Funktion 0BH, DOS 2.0 - 6.x)........................................ 186
4.13 Flush Buffer, Read Keyboard (Funktion 0CH, DOS 2.0 - 6.x) .............................. 187
4.14 Reset Disk (Funktion 0DH, DOS 2.0 - 6.x)............................................................ 187
4.15 Select Disk (Funktion 0EH, DOS 2.0 - 6.x) ........................................................... 188
4.16 Open File (Funktion 0FH, DOS 2.0 - 6.x).............................................................. 189
4.17 Close File (Funktion 10H, DOS 2.0 - 6.x).............................................................. 190
4.18 Search for First Entry (Funktion 11H, DOS 2.0 - 6.x) ........................................... 191
4.19 Search for Next Entry (Funktion 12H, DOS 2.0 - 6.x) ........................................... 192
4.20 Delete File (Funktion 13H, DOS 2.0 - 6.x) ............................................................ 192
4.21 Sequential Read (Funktion 14H, DOS 2.0 - 6.x) .................................................... 193
4.22 Sequential Write (Funktion 15H, DOS 2.0 - 6.x) ................................................... 194
4.23 Create File (Funktion 16H, DOS 2.0 - 6.x) ............................................................ 195
4.24 Rename File (Funktion 17H, DOS 2.0 - 6.x).......................................................... 196
4.25 Get Current Drive (Funktion 19H, DOS 2.0 - 6.x) ................................................. 197
4.26 Set Disk Transfer Address (Funktion 1AH, DOS 2.0 - 6.x) ................................... 197
4.27 Get Default Drive Data (Funktion 1BH, DOS 2.0 - 6.x) ........................................ 198
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
10
4.28 Get Drive Data (Funktion 1CH, DOS 2.0 - 6.x) ..................................................... 199
4.29 Get Default Disk Parameter Block (Funktion 1FH, DOS 2.0 - 5.0)...................... 200
4.30 Random Read (Funktion 21H, DOS 2.0 - 6.x) ....................................................... 202
4.31 Random Write (Funktion 22H, DOS 2.0 - 6.x) ...................................................... 203
4.32 Get File Size (Funktion 23H, DOS 2.0 - 6.x) ......................................................... 204
4.33 Set Relativ Record (Funktion 24H, DOS 2.0 - 6.x)................................................ 205
4.34 Set Interrupt Vektor (Funktion 25H, DOS 2.0 - 6.x).............................................. 205
4.35 Create New PSP (Funktion 26H, DOS 2.0 - 6.x) ................................................... 206
4.36 Random Block Read; (Funktion 27H, DOS 2.0 - 6.x)........................................... 206
4.37 Random Block Write (Funktion 28H, DOS 2.0 - 6.x) ............................................ 207
4.38 Parse File Name (Funktion 29H, DOS 2.0 - 6.x).................................................... 208
4.39 Get Date (Funktion 2AH, DOS 2.0 - 6.x)............................................................... 209
4.40 Set Date (Funktion 2BH, DOS 2.0 - 6.x)................................................................ 210
4.41 Get Time (Funktion 2CH, DOS 2.0 - 6.x) .............................................................. 210
4.42 Set Time (Funktion 2DH, DOS 2.0 - 6.x) .............................................................. 211
4.43 Set/Reset Verify Flag (Funktion 2EH, DOS 2.0 - 6.x) ........................................... 211
4.44 Get Disk Transfer Address (Funktion 2FH, DOS 2.0 - 6.x) ................................... 212
4.45 Get MS-DOS Version Number (Funktion 30H, DOS 2.0 - 6.x)............................. 212
4.46 Keep Process (Funktion 31H, DOS 2.0 - 6.x) ........................................................ 213
4.47 Get Disk Parameter Block (Funktion 32H, DOS 2.0 - 6.x) .................................... 214
4.48 Control-C Check (Funktion 33H, DOS 2.0 - 6.x)................................................... 217
4.48.1 Control-C Check (Funktionen AX=3300H/3301H)
217
Achtung: Falls ein Programm die Funktionen 06H oder 07H (Direct Console I/O)
benutzt und das Zeichen Ctrl-C als Wert eingelesen werden soll, muß vorher das Flag
auf »AusFehler! Verweisquelle konnte nicht gefunden werden.4.48.2 Get/Set State
(Funktion AX=3302H)
218
4.48.3 Get Boot Drive (Funktion AX=3305H) 218
4.48.4 Get Version/Location (Funktion AX=3306H)
219
4.49 Get DOS Critical Interval Flag (Funktion 34H, DOS 2.0 - 6.x) ............................. 220
4.50 Get Interrupt Vektor (Funktion 35H, DOS 2.0 - 6.x) ............................................. 221
4.51 Get Free Disk Space (Funktion 36H, DOS 2.0 - 6.x) ............................................. 221
4.52 Get/Set Switch Character (Funktion 37H, DOS 2.0 - 6.x) ..................................... 222
4.53 Get/Set Country Data (Funktion 38H) .................................................................. 223
4.53.1 Get Country Data (Funktion 38H, DOS 2.x)
223
4.53.2 Get Country Data (Funktion 38H, DOS 3.0 - 6.x) 224
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
11
4.53.3 Set Country Data (Funktion 38H, DOS 3.0 - 6.x) 227
4.54 Create Directory (Funktion 39H, DOS 2.0 - 6.x) ................................................... 228
4.55 Remove Directory (Funktion 3AH, DOS 2.0 - 6.x) ............................................... 229
4.56 Change Current Directory (Funktion 3BH, DOS 2.0 - 6.x).................................... 230
4.57 Create Handle (Funktion 3CH, DOS 2.0 - 6.x) ...................................................... 231
4.58 Open Handle (Funktion 3DH)............................................................................... 232
4.58.1 Open Handle (Funktion 3DH, DOS 2.x) 232
4.58.2 Open Handle (Funktion 3DH, DOS 3.0 - 6.x)
232
4.59 Close Handle (Funktion 3EH, DOS 2.0 - 6.x) ........................................................ 235
4.60 Read from a File or Device (Funktion 3FH, DOS 2.0 - 6.x) .................................. 236
4.61 Write to a File or Device (Funktion 40H, DOS 2.0 - 6.x) ...................................... 237
4.62 Delete (Unlink) Directory Entry (Funktion 41H, DOS 2.0 - 6.x).......................... 238
4.63 Move File Pointer (Funktion 42H, DOS 2.0 - 6.x) ................................................. 239
4.64 Get/Set File Attributes (Funktion 43H, DOS 2.0 - 6.x) ......................................... 240
4.65 IOCTL Data (Funktion 44H, DOS 2.0 - 6.x) ......................................................... 241
4.65.1 IOCTL Data (Funktion 44H, Code 0 und 1, DOS 2.0 - 6.x) 242
4.65.2 IOCTL Character (Funktion 44H, Code 2 und 3, DOS 2.0 - 6.x)
245
4.65.3 IOCTL Block (Funktion 44H, Code 4 und 5, DOS 2.0 - 6.x)
246
4.65.4 IOCTL Status (Funktion 44H, Code 6 und 7, DOS 2.0 - 6.x)
247
4.65.5 IOCTL is Changeable (Funktion 44H, Code 8, DOS 3.0 - 6.x)
247
4.65.6 IOCTL is Redirected Block (Funktion 4409H, DOS 3.1 - 6.x)
248
4.65.7 IOCTL is Redirected Handle (Funktion 440AH, DOS 3.1 - 6.x)
249
4.65.8 IOCTL Retry (Funktion 44H, Code 0BH, DOS 3.1 - 6.x) 250
4.65.9 Generic IOCTL Handle Request (Funktion 440CH, DOS 3.2 - 6.x) 251
4.65.10 Generic IOCTL Request (Funktion 44H, Code 0DH, DOS 3.2 - 6.x)
258
4.65.11 I/O Control for Device (Funktion 440EH, DOS 3.2 - 6.x) 265
4.65.12 Set Logical Drive (Funktion 440FH, DOS 3.2 - 6.x)
266
4.65.13 Query Support (Handle) (Funktion 4410H, DOS 6.x)
267
4.65.14 Query Support (Block) (Funktion 4411H, DOS 6.x)
267
4.66 Duplicate File Handle (Funktion 45H, DOS 2.0 - 6.x)........................................... 268
4.67 Force Duplicate File Handle (Funktion 46H, DOS 2.0 - 6.x)................................. 269
4.68 Get Current Directory (Funktion 47H, DOS 2.0 - 6.x)........................................... 269
4.69 Allocate Memory (Funktion 48H, DOS 2.0 - 6.x).................................................. 270
4.70 Free Allocated Memory (Funktion 49H, DOS 2.0 - 6.x)........................................ 271
4.71 Set Block (Funktion 4AH, DOS 2.0 - 4.x) ............................................................. 272
4.72 Load or Execute a Program (Funktion 4BH, DOS 2.0 - 6.x) ................................. 272
4.72.1 Load and Execute (AL = 0)
273
4.72.2 Load (AL = 1 undokumentiert) 274
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
12
DOS Programmierhandbuch
4.72.3 Load Overlay (AL = 3) 276
4.72.4 EXEC: Enter EXEC-State (AL = 5)
277
4.73 Terminate a Process (Funktion 4CH, DOS 2.0 - 6.x)............................................. 279
4.74 Get Returncode (Funktion 4DH, DOS 2.0 - 6.x).................................................... 279
4.75 Find First Matching File (Funktion 4EH, DOS 2.0 - 6.x) ...................................... 280
4.76 Find Next File (Funktion 4FH, DOS 2.0 - 6.x) ...................................................... 281
4.77 Set Active PSP (Funktion 50, DOS 2.0 - 6.x) ........................................................ 282
In DOS 2.x darf die Funktion nicht aus dem INT 28H heraus aufgerufen werden, falls
nicht vorher das Critical-Error-Flag gesetzt wurde (Funktion AH = 5D06H). Dann
benutzt die Funktion den »critcal error stack4.78 Get Active PSP (Funktion 51, DOS 2.0
- 6.x) .............................................................................................................................. 282
In DOS 2.x darf die Funktion nicht aus dem INT 28H heraus aufgerufen werden, falls
nicht vorher das Critical-Error-Flag gesetzt wurde (Funktion AH = 5D06H). Dann
benutzt die Funktion den »critcal error stack4.79 Get DOS List of Lists (Funktion 52,
............................................................................ DOS 2.0 - 6.x, undokumentiert)
4.80 Translate BIOS Parameter Block (Funktion 53, DOS 2.0 - 6.x, undokumentiert) . 287
4.81 Get Verify State (Funktion 54H, DOS 2.0 - 6.x).................................................... 289
4.82 Install New Process (Funktion 55H,
DOS 2.0 - 6.x, undokumentiert) ............. 289
4.83 Rename File (Funktion 56H, DOS 2.0 - 6.x).......................................................... 290
4.84 Get/Set File Date and Time (Funktion 57H, DOS 2.0 - 6.x) .................................. 290
4.85 Get/Set Allocation Strategie (Funktion 58H, DOS 2.0 - 6.x) ................................. 291
4.86 Get Extended Error (Funktion 59H, DOS 3.0 - 6.x)............................................... 293
4.87 Create Temporary File (Funktion 5AH, DOS 3.0 - 6.x)......................................... 295
Um in einem Netzwerk eine temporäre Datei anzulegen, benötigt der rufende Prozeß das
»Create Access«Privileg. Andernfalls kann z.B. der Fehler 5 auftreten. Die erweiterten
Fehlercodes lassen sich mit der Funktion 59H abfragen.»4.88 Create New File (Funktion
5BH, DOS 3.0 - 6.x)....................................................................................................... 296
4.89 Lock/Unlock File Access (Funktion 5CH, DOS 3.0 - 6.x)..................................... 297
Lock (AL = 00)
297
Über die Funktion 59H lassen sich die erweiterten Fehlercodes abfragen. Die
Funktion sollte nur auf Dateien angewandt werden, die mit dem »deny readFehler!
Verweisquelle konnte nicht gefunden werden.deny noneFehler! Verweisquelle konnte
nicht gefunden werden.Unlock (AL = 01)
298
Über die Funktion 59H lassen sich die erweiterten Fehlercodes abfragen. Die Funktion
sollte nur auf Dateien angewandt werden, die mit dem »deny readFehler! Verweisquelle
konnte nicht gefunden werden.deny noneFehler! Verweisquelle konnte nicht gefunden
werden.4.90 Interne Funktion (Funktion 5DH, DOS 3.1 -6.x) ..................................... 299
4.90.1 Indirect Function Call (AX = 5D00H)
299
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
13
DOS Programmierhandbuch
4.90.2 Commit all Files (AX = 5D01H)
300
4.90.3 SHARE Close all Files by Name (AX = 5D02H) 300
4.90.4 SHARE Close all Files for a Computer (AX = 5D03H)
301
4.90.5 SHARE Close all Files for a Process (AX = 5D04H)
301
4.90.6 SHARE Get Open File List Entry (AX = 5D05H) 302
4.90.7 Get Address of DOS Swappable Data Area (AX = 5D06H)
302
4.90.8 Get Redirected Printer Mode (AX = 5D07H)
306
4.90.9 Set Redirected Printer Mode (AX = 5D08H)
306
4.90.10 Flush Redirected Printer Output (AX = 5D09H) 306
4.90.11 Set Extended Error Info (AX = 5D0AH)
307
4.90.12 Get DOS Swappable Data Areas (AX = 5D0BH)
307
4.91 Get Machine Name (Funktion 5EH, Code 00H, DOS 3.1 - 6.x) ...................... 310
2.92 Set Machine Name (Funktion 5EH, Code 01H,
DOS 3.1 - 6.x)....................... 311
4.93 Set Printer Setup (Funktion 5EH, Code 02H, DOS 3.1 - 6.x) ................................ 312
4.94 Get Printer Setup (Funktion 5EH, Code 03H, DOS 3.1 - 6.x)................................ 312
Es ist zu beachten, daß der Zuordnungsindex für die Einheit bei jedem Aufruf der
Funktion 5F03H (Redirect Device) und bei Funktion 5F04H (Cancel Redirection)
geändert wird. Daher sollte die Set-Funktion sofort nach dem Aufruf »Get Printer
SetupFehler! Verweisquelle konnte nicht gefunden werden.4.95Set Printer Mode
(Funktion 5EH, Code 04H, DOS 3.1 - 6.x) .................................................................... 313
4.96Get Printer Mode (Funktion 5EH, Code 05H, DOS 3.1 - 6.x) ................................ 314
4.97 Get Redirection Mode (Funktion 5FH, Code 00H,
DOS 3.1 - 6.x) .................... 315
4.98 Set Redirection Mode (Funktion 5FH, Code 01H,
DOS 3.1 - 6.x)..................... 315
4.99 Get Redirection List Entry (Funktion 5FH, Code 02H, DOS 3.1 - 6.x) ................. 316
4.100Redirect Device (Funktion 5FH, Code 03H, DOS 3.1 - 6.x)................................. 317
Printer (BL = 03)
318
Laufwerk (BL = 04) 318
4.101 Cancel Redirection (Funktion 5FH, Code 04H, DOS 3.1 - 6.x) ........................... 319
4.102 Get Redirection List Extended Entry (Funktion 5FH, Code 05H, DOS 4.x - 6.x) 319
4.103 Enable Drive (Funktion 5FH, Code 07H, DOS 6.x) ........................................... 320
4.104 Disable Drive (Funktion 5FH, Code 08H, DOS 6.x) .......................................... 321
4.105 Expand Filename (Funktion 60H, DOS 3.0 - 6.x, undokumentiert)..................... 321
4.106 Get Program Segment Prefix Address
(Funkt. 62H, DOS 3.0 - 6.x) .............. 322
4.107 DCBS-Support (Funktion 63H, undokumentiert) ............................................... 323
4.107.1 Get Lead Byte Table (AL = 00H)
323
4.107.2 Set/Clear Interim Console Flag (AL = 01H)
323
4.107.3 Get Interim Console Flag (AL = 02H) 324
4.108 Set Device Driver Lookahead Flag (Funktion 64H, DOS 3.2 - 6.x) .................... 324
4.109 Get Extended Country Information (Funktion 65H, DOS 3.3 - 6.x) .................... 325
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
14
Landesinformationen (AL = 01H)
326
Codierungstabelle Großbuchstaben (AL = 02H) 326
Kodierungstabelle Filenamen (AL = 04H)
327
Kodierungstabelle Filename-Terminator (AL = 05)
327
Collate Size (AL = 06H)
328
DBCS-Vektor (AL = 07H) 328
Country dependent Character Capitalization (AL = 20H, 21H, 22H)
329
Convert Character (Funktion 6520H) 329
Convert String (Funktion 6521H)
329
Convert ASCIIZ-String (Funktion 6522H)
330
YES/NO Character Check (Funktion 6523H) 331
Convert Country Dependent Filenames (Funktionen AX = 65A0H, 65A1H, 65A2H)
331
4.110 Get Global Code Page (Funktion 6601H, DOS 3.3 - 6.x) .................................... 332
Mit dem Wert 01H im Register AL wird die gerade aktive »Code Page«Einstellung
abgefragt. Im Feh_lerfall ist nach dem Aufruf das Carry-Flag gesetzt. Nur falls das
Carry-Flag gelöscht ist, finden sich in den Registern BX und DX Informationen über die
Ein_stel_lung.»Das Register BX enthält den Wert des aktuell eingestellten »Code
Page«Sets, während in DX der »Code PageCode PageFehler! Verweisquelle konnte
nicht gefunden werden.4.111 Set Global Code Page (Funktion 6602H, DOS 3.3 - 6.x) 332
Der »Code PageFehler! Verweisquelle konnte nicht gefunden werden.Code Page«Datei
durch DOS ladbar sein. An_dern__falls erfolgt eine Fehlermeldung (02H).»Um die
»Code Page«Einstellung der aktuellen Landeseinstellung zu verändern, besteht nur der
Weg, die Einträge in CONFIG.SYS zu än_dern und das System neu zu starten.»Um
diesen Funktionsaufruf zu nutzen, muß das Programm NLSFUNC vorher von der
Kommandoebene aus gestartet worden sein. Weiterhin müssen die Einheiten in der Lage
sein, verschiedene »Code PagesFehler! Verweisquelle konnte nicht gefunden
werden.4.112Set Handle Count (Funktion 67H, DOS 3.3 - 6.x).................................... 333
4.112Set Handle Count (Funktion 67H, DOS 3.3 - 6.x) ................................................ 334
4.113 Commit File (Funktion 68H, DOS 3.3 - 6.x)........................................................ 334
4.114 Get/Set Disk Serial Number (Funktion 69H, DOS 4.0 - 6.x) .............................. 335
4.115 Extended Open/Create (Funktion 6CH, DOS 4.0 - 6.x) ...................................... 336
5 Der DOS-Multiplexerinterrupt INT 2F 339
5.1 PRINT-Time-Slice (AX = 0080H, DOS 3.1 - 6.x).................................................. 340
5.2 Kommunikation with PRINT (AH = 01H, DOS 3.0 - 6.x) ..................................... 341
5.2.1 Get Installationsstatus (AL = 00H, DOS 3.0 - 6.x) 342
5.2.2 Datei in Liste einfügen (AL = 01H, DOS 3.0 - 6.x) 342
5.2.3 Datei aus Liste entfernen (AL = 02H, DOS 3.0 - 6.x)
343
5.2.4 Lösche Liste (AL = 03H, DOS 3.0 - 6.x) 344
5.2.5 Lese Status (AL = 04H, DOS 3.0 - 6.x) 344
5.2.6 Ende Statusabfrage (AL = 05H, DOS 3.0 - 6.x)
345
5.2.7 Get Printer Device (AL = 06H, DOS 3.3 - 6.x)
345
5.3 Kommunikation with PC LAN Programm REDIR/REDIRIFS (AH = 02H).......... 345
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
15
5.4 DOS 3.X Critical-Error-Handler (AH = 05H, DOS 3.0 - 6.x) ................................ 346
5.4.1 Get Installationsstatus (AL = 0) 346
5.4.2 Handle Error (AL = XXH)
346
5.5 Kommunikation with ASSIGN (AH = 06H, DOS 3.0 -6.x).................................... 347
5.5.1 Get Installation Status (AL = 00H)
347
5.5.2 Get ASSIGN Memory Segment (AL = 01H)
348
5.6 Kommunikation with DRIVER.SYS (AH = 08H, DOS 3.0 - 6.x).......................... 348
5.6.1 Get Installation Status (AL = 00H)
349
5.6.2 Add New Block Device (AL = 01H)
349
5.6.3 Execute Device Driver Request (AL = 02H)
349
5.6.4 Get Drive Data Table (AL = 03H)
351
5.7 Kommunikation with SHARE (DOS 3.0 - 5.0, AH = 10H).................................... 353
5.7.1 SHARE Installation Check (AX = 1000H)353
5.7.2 SHARE Turn ON File Sharing Checks (AX = 1080H)
354
5.7.3 SHARE Turn OFF File Sharing Checks (AX = 1081H)
354
5.8 Kommunikation with Network Redirector (AH = 11H, DOS 3.1 - 5.0) ................. 355
5.8.1 Get Installation Status (AL = 00H)
355
5.8.2 Unterfunktionen Network Redirector
356
5.9 Kommunikation with DOS 3.x internal Funktions (AH = 12H) ............................. 356
5.9.1 Get Installationsstatus (AL = 00H)
357
5.10 Set Disk Interrupt Handler (AH = 13H, ab DOS 3.3) ........................................... 361
5.11 Kommunikation with NLSFUNC.COM (AH = 14H) ........................................... 361
5.11.1 Get Installation Status (AL = 00H)
361
5.12 Kommunikation with CD-ROM/Graphics (AH = 15H)........................................ 362
5.12.1 GRAPHICS Get Installation Status (AL = 00H) 362
5.12.2 Kommunikation with CD-ROM (AL = 00H)
363
5.13 Kommunikation with WINDOWS, DOS, DPMI (AH = 16H).............................. 366
5.13.1 WINDOWS Enhanced Mode Install Check (AX = 1600H) 367
5.13.2 WINDOWS/386 2.x Get API Entry Point (AX = 1602H) 367
5.13.3 WINDOWS Enhanced Mode Broadcast (AX = 1605H) 367
5.13.4 WINDOWS Enhanced Mode und 286-DOS-Extender Exit Broadcast (AX =
1606H)
369
5.13.5 WINDOWS Virtual Device Call out API (AX = 1607H) 369
5.13.6 WINDOWS Enhanced Mode Init complete Broadcast (AX = 1608H)
370
5.13.7 WINDOWS Enhanced Mode Begin Exit Broadcast (AX = 1609H) 370
5.13.8 Idle Call / Release Current VM Time Slice (AX = 1680H) 370
5.13.9 WINDOWS 3.x Begin Critical Section (AX = 1681H)
371
5.13.10 WINDOWS 3.x End Critical Section (AX = 1682H)
371
5.13.11 WINDOWS 3.x Get Current Virtual Maschine ID (AX = 1683H) 371
5.13.12 WINDOWS 3.x Get Device API Entry Point (AX = 1684H)
372
5.13.13 WINDOWS Switch VM and Callback (AX = 1685H)
373
5.13.14 DOS-DPMI Detect Mode (AX = 1686H)
374
5.13.15 DOS-DPMI Installation Check (AX = 1687H) 374
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
16
DOS Programmierhandbuch
5.13.16 DOS-DPMI Get Vendor specific API Entry Point (AX = 168AH) 376
5.14 WINDOWS WinOldAp-Schnittstelle (AH=17H) ................................................. 376
5.14.1 WinOldAp Identify WinOldAp Version (AX = 1700H) 376
5.14.2 WinOldAp Open Clipboard (AX = 1701H)
377
5.14.3 WinOldAp Empty Clipboard (AX = 1702H)
377
5.14.4 WinOldAp Set Clipboard Data (AX = 1703H)
377
5.14.5 WinOldAp Get Clipboard Data Size (AX = 1704H)
378
5.14.6 WinOldAp Get Clipboard Data (AX = 1705H) 378
5.14.7 WinOldAp Close Clipboard (AX = 1708H)
379
5.14.8 WinOldAp Compact Clipboard (AX = 1709H) 379
5.14.9 WinOldAp Get Device Capabilities (AX = 170AH)
380
5.15 Kommunikation with SHELL (AH = 19H)........................................................... 381
5.15.1 Get Installation Status (AL = 00H)
381
5.15.2 SHELLB.COM - SHELLC.EXE Interface (AL = 01H)
382
5.15.3 SHELLB.COM - COMMAND.COM Interface (AL = 02H)
382
5.15.4 SHELLB.COM - COMMAND.COM Interface II (AL = 03H)
383
5.15.5 SHELLB.COM - SHELLB.COM transient TSR Interface (AL = 04H)
384
5.16 Kommunikation with DOS-ANSI.SYS (AH = 1AH) ........................................... 384
5.16.1 Get Installation Status (AX = 1A00H) 384
5.16.2 DOS 4.x ANSI.SYS Get/Set Display Informations (AX = 1A01H) 385
5.16.3 DOS 4.x ANSI.SYS-Misc Requests (AX = 1A02H)
385
5.17 DOS 4.0 Kommunikation with XMA2EMS.SYS (AH = 1BH)............................ 386
5.17.1 Get Installation Status (AL = 00H)
386
5.17.2 XMA2EMS.SYS Get hidden frame Info (AL = 01H)
386
5.18 OS/2 Compatibility-Box (AH = 40H) ................................................................... 386
5.18.1 Switch DOS to Background (AL = 01H) 387
5.18.2 Switch DOS to Foreground (AL = 02H) 387
5.19 Kommunikation with XMS (AH = 43H) .............................................................. 387
5.19.1 XMS Get Installation Status (AL = 00H) 387
5.19.2 XMS Get Driver Address (AL = 10H) 388
5.20 DOS 5.0 Kommunikation (AH = 46H) ................................................................. 388
5.20.1 WINDOWS 3.0 Installation Check (AX = 4680H)
388
5.21 DOSKEY Funktionen (AX = 48, DOS 5.0-6.0).................................................... 389
5.21.1 DOSKEY Installation Check (AX = 4800H)
389
5.21.2 DOSKEY Read Input Line from Console (AX = 4810H) 389
5.22 DOS 5.0/6.0 HMA-SPACE (AH = 4AH) ............................................................. 390
5.22.1 DOS 5.0/6.0 Query Free HMA-Space (AX = 4A01H)
390
5.22.2 DOS 5.0/6.0 Allocate HMA-Space (AX = 4A02H)
390
5.23 DOS 5.0/6.0 TaskSwitcher Interface (AH = 4BH)................................................ 391
5.23.1 Build Call Out Chain (AX = 4B01H)
5.23.2 Installation Check (AX = 4B02H)
5.23.3 Allocate Switcher ID (AX = 4B03H)
5.23.4 Free Switcher ID (AX = 4B04H)
392
397
401
401
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
17
DOS Programmierhandbuch
5.23.5 Identify Instance Data (AX = 4B05H) 402
5.24 DOS 5.0/6.0 COMMAND.COM Interface (AX = 5500H) ................................... 403
5.25 Novell NetWare IPX Installation Check (AH = 7AH).......................................... 403
5.26 ERGO-DOS-Extender Installation Check (AH = A1H)........................................ 403
5.27 GRAPHICS.COM Installation Check (AX = AC00H) ......................................... 404
5.28 Kommunikation with DISPLAY.SYS (AH = ADH) ............................................ 404
5.28.1 Get Installation Status (AL = 00H)
404
5.29 DOS 3.3 -Kommunikation mit KEYB.COM (AX = AD8XH) ............................. 405
5.29.1 KEYB.COM Get Installation Status (AX = AD80H)
405
5.29.2 KEYB.COM Set Keyboard Code Page (AX = AD81H) 405
5.29.3 KEYB.COM Set Keyboard Mapping (AX = AD82H)
406
5.29.4 KEYB.COM Get Keyboard Mapping (AX = AD83H)
406
5.30 DOS Installable Command (AH = AEH).............................................................. 407
5.30.1 Installable Command Install Check (AX = AE00H)
407
5.30.2 Installable Command Execute Command (AX = AE01H) 407
5.31 DOS 3.3 GRAFTABL.COM INSTALLATION CHECK (AH = B0H) ............... 408
5.32 Kommunikation with APPEND (AH = B7H) ....................................................... 408
5.32.1 Get Installationsstatus (AX = B700H) 409
5.32.2 Get APPEND Version (AX = B702H) 409
5.32.3 APPEND Hook INT 21 (AX = B703H) 410
5.32.4 Get APPEND Path Pointer (AL = 04H) 410
5.32.5 Get APPEND Function State (AL = 06H)
410
5.32.6 Set APPEND Function State (AL = 07H)
411
5.32.7 Get Version Info (AL = 10H) 411
5.32.8 Set Return Found Name (AL = 11H)
411
5.33 Kommunikation with Network (AH = B8H)......................................................... 411
5.33.1 Netzwerk Installation Check (AL = 00H)412
5.34 DOS/WINDOWS EGA.SYS Check (AH = BCH)................................................ 412
5.34.1 EGA.SYS Installation Check (AX = BC00H)
412
5.34.2 EGA.SYS Get Version Info (AX = BC06H)
413
5.35 REDIRIFS.EXE Interface (AX = BFXXH) .......................................................... 413
6 Die Fehlerbehandlung in DOS 415
6.1 Funktionen ohne Fehlermeldung............................................................................. 415
6.2 Critical-Error-Handler............................................................................................. 416
6.3 Die FCB-orientierten Fehlermeldungen .................................................................. 417
6.4 Die handleorientierten Fehlermeldungen ................................................................ 417
6.5 Erweiterte Fehlercodes............................................................................................ 419
6.6 Funktionen mit abweichenden Fehlercodes ............................................................ 421
7 DOS-Memory-Manager und DOS-Datenstrukturen
422
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
18
7.1 Die Speicherverwaltungsstrategie des Memory-Managers ..................................... 422
first fit
423
best fit
424
last fit
424
7.2 Die Memory-Control-Blocks (MCB) ...................................................................... 426
Änderungen ab DOS 4.0
427
Änderungen ab DOS 5.0
430
7.3 Struktur und Aufbau des DOS-Control-Blocks (DCB)........................................... 431
7.4 Die Disk-Parameter-Blocks (DPB) ......................................................................... 435
7.5 Die Device-Treiberkette.......................................................................................... 438
7.6 Die DOS-Puffer....................................................................................................... 440
Änderungen in DOS 4.X
442
Änderungen ab DOS 5.0
445
7.7 Die DOS-Stackverwaltung...................................................................................... 447
7.8 Die Current Directory Structure (CDS)................................................................... 450
7.9 Die DOS-Dateitabelle ............................................................................................. 451
7.10 Der Environmentbereich ....................................................................................... 455
7.11 Der Aufbau des DOS-Program-Segment-Prefix (PSP) ......................................... 457
7.12 Der Aufbau der File-Control-Blocks (FCB).......................................................... 460
7.13 Der erweiterte File Control Block (Extended FCB).............................................. 463
8 Die DOS-Einheitentreiber
466
8.1 Die Verwaltung der Treiber .................................................................................... 466
8.2 Das Format der Einheitentreiber ............................................................................. 466
Next Device Pointer 467
Das Attributfeld
467
8.3 Zeiger zu den Strategie- und Interruptroutinen ....................................................... 470
Das Feld mit dem Einheitennamen
470
8.4 Installation eines Einheitentreibers ......................................................................... 471
Dann wird der Dateiname des Treibers in CONFIG.SYS eingetragen. Beim nächsten
Systemstart installiert das Programm IO.SYS zuerst diese Treiber. Wird hier bereits
der Name eines Standardtreibers (z.B. CON) gefunden, unterbleibt die Aktivierung
des »residentenDer Aufruf eines Treibers durch DOS 471
Die Struktur der Aufrufparameter (Request Header)
472
Tabelle 8.3: Aufbau des »Request HeadersLängenfeld 472
Das Einheitencode-Feld
472
Das Kommandocode-Feld
472
Das Statusfeld
474
8.5 Die Funktionen der Einheitentreiber (DOS 2.0 - 6.0) ............................................. 475
8.6 INIT (Code = 0, DOS 2.0 - 6.0) .............................................................................. 475
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
19
Number of Units
476
Im ersten Feld hinter dem Request-Header tragen blockorientierte Treiber die Zahl der
unterstützten Einheiten ein. Anhand dieses Wertes weist DOS die
Laufwerksbezeichnungen an den Treiber zu. Sind z.B. alle Laufwerke bis C bereits
zugewiesen und ist das Feld mit dem Wert 3 belegt, ordnet DOS dem Treiber die
logischen Laufwerke D, E und F zu (siehe auch »Das Attributfeld«. Bei
zeichenorientierten Treibern bleibt das Feld unbelegt, da diese jeweils nur eine Einheit
unterstützen.»End Address 476
BIOS-Parameter-Block (BPB) Adreßfeld
476
Das Feld mit der Laufwerksnummer 477
8.7 Media Check (Code = 1);........................................................................................ 478
Tabelle 8.7: Aufbau des »Request HeaderFehler! Verweisquelle konnte nicht
gefunden werden.Das DOS-Media-Descriptor-Byte
478
Returncode 479
· Falls weniger als 2 Sekunden seit dem letzten Zugriff vergangen sind, wird
ebenfalls der Status »not changedFehler! Verweisquelle konnte nicht gefunden
werden.· Die FAT des Mediums wird gelesen und die Media-Bytes oder die Volume
ID werden verglichen. Bei unterschiedlichen Werten wird der Status »changedFehler!
Verweisquelle konnte nicht gefunden werden.nicht feststellbar, ob das Medium
gewechselt wurdeFehler! Verweisquelle konnte nicht gefunden werden.Volume-IDZeiger
479
8.8 Build BPB (Code = 2, DOS 2.0 - 6.0)..................................................................... 480
8.9 Read/Write (Code 3, 4, 8, 9, 12 und 16, DOS 2.0 - 6.0) ......................................... 484
8.10 Nondestructive Read no Wait (Code = 5, DOS 2.0 - 6.0) ..................................... 486
8.11 Status (Code 6 und 10, DOS 2.0 - 6.0).................................................................. 486
8.12 Flush (Code 7 und 11, DOS 2.0 - 6.0)) ................................................................. 487
8.13 Open/Close (Code 13 und 14, DOS 3.0 - 6.0)....................................................... 487
8.14 Removable MEDIA (Code 15, DOS 3.0 - 6.0) ..................................................... 488
8.15 Generic IOCTL Request (Code 19, DOS 3.2 - 6.0) .............................................. 489
Major Function Field 490
Minor Function Field490
Inhalt der SI- und DI-Register 490
Zeiger auf das IOCTL-Request Paket 490
Major Function Field 491
Minor Function Field491
Inhalte der SI- und DI-Register
491
Zeiger auf das IOCTL-Request-Paket 491
8.16 Get Logical Device (Code 23, DOS 3.2 - 6.0) ...................................................... 491
8.17 Set Logical Device (Code 24, DOS 3.2 - 6.0) ....................................................... 492
8.18 IOCTL Query (Code 25, DOS 6.0) ....................................................................... 493
9 Die DOS-Dateiverwaltung
494
9.1 Die Struktur einer Diskette/Festplatte ..................................................................... 494
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
20
9.2 Die Numerierung der Sektoren ............................................................................... 495
9.2.1 Die logische Sektornumerierung 495
9.2.2 Die relative Sektornumerierung 497
9.3 Die Boot-Partition einer Festplatte.......................................................................... 497
Boot Indicator
499
Kopf
500
Zylinder und Sektor 500
System Indicat or
501
Partition-Relativ-Sektor
501
Sektorenzahl
501
9.4 Die Extended-DOS-Partition................................................................................... 502
Start und End
505
9.5 Der Boot-Record einer Einheit................................................................................ 506
9.6 Die File-Allocation-Tabelle (FAT) ......................................................................... 508
9.7 Das DOS-Inhaltsverzeichnis ................................................................................... 512
Bytes 00-07H
513
Bytes 08-0AH
513
Byte 0BH 513
Bytes 0CH-15H
514
Bytes 16H-17H
515
Bytes 18H-19H
515
Bytes 1AH-1BH
515
Bytes 1CH-1FH
515
9.8 Der DOS-Datenbereich auf der Platte/Diskette....................................................... 516
10 Die DOS-Dateiformate
517
10.1 Die DOS-Textdateien............................................................................................ 517
10.2 Die DOS-COM-Dateien........................................................................................ 518
10.3 Die DOS-EXE-Dateien ......................................................................................... 519
Der Aufbau der Relokationstabelle
520
10.4 Die Font-Dateistruktur .......................................................................................... 521
11 Sonderfragen zu DOS
523
11.1 Der Programmablauf nach einem temstart ............................................................ 523
11.2 Der Aufbau des Konfigurations-RAM im CMOS-Clock-Baustein....................... 524
Status-Byte (0EH) 526
Diskettentyp (Byte 10H)
526
Festplattentyp (Byte 12H)
526
Equipment-Byte (Bytes 14H) 527
Speichergröße
527
11.3 Die Dateibehandlung in DOS................................................................................ 528
Die FCB-Funktionsaufrufe
528
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
21
Die Handle-Funktionsaufrufe 528
11.4 Das DOS-20-File-Problem.................................................................................... 533
11.5 Commit File .......................................................................................................... 540
11.6 Tochterprozesse in DOS (die EXEC-Funktion) .................................................... 545
release_mem
546
get_environment
546
EXEC
546
11.7 Aufruf interner DOS-Kommandos durch den INT 2EH ....................................... 552
11.8 Residente Programme (TSR) ................................................................................ 556
Erzeugung eines TSR-Prozesses
557
Aktivierung residenter Prozesse
557
Periodische Aktivierung per Timerfolgeinterrupt
557
Aktivierung über die Tastaturinterrupts 558
Der INT 9 des Tastaturkontrollers
559
Aktivierung per INT 10
559
Aktivierung durch einen beliebigen Softwareinterrupt 559
Aktivierung per CALL oder JMP
560
Abfrage des Installationsstatus
560
Abfrage per INT 2F 560
Signatur eines Interruptvektors
560
Signatur des RAM's 561
Abfrage der Memory-Control-Blocks 561
Kommunikation mit residenten Programmen 562
Das DOS-Reentrance-Problem
562
Abfrage des DOS-Critical-Region-Flags
564
Der INT-28-Aufruf 564
DOS 5.0/6.0 Idle Call (INT 2F, AX = 1680); 564
Abfangen des INT-21-Aufrufes
565
Sicherung des DOS-Datenbereiches 565
Sonderfragen zu TSR-Programmen
565
Aktivierung der korrekten Segmente 565
Aktivierung des Program-Segment-Prefix (PSP)
566
Ein Beispielprogramm
567
Das Hauptmodul
567
Der int_handler
568
11.9 BIOS-Aufrufe........................................................................................................ 572
Write_hex 573
rom_check 573
Memo_check
573
memo_size 573
bios_chk 573
dos_ver
573
sys_config 573
12 DOS-Speichererweiterungen 578
DOS-Speicherarten 578
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
22
DOS Programmierhandbuch
Konventioneller Speicher
578
Upper Memory Block (UMB) 578
Extended Memory (XMS)
579
Expanded Memory (EMS)
579
Der High-Memory-Bereich (HMA)
580
12.1 Extended-Memory-Zugriffe (per INT 15)............................................................. 580
Move Block (AH = 87H)
582
Extended Memory Size (AH = 88H) 583
12.2 High Memory Area (HMA) .................................................................................. 583
12.3 Die XMS-Schnittstelle .......................................................................................... 584
Kommunikation with XMS (INT 2F, AH = 43H)
584
Get Installation Status (AL = 00H)
584
Get Driver Address (AL = 10H)
585
12.3.1 Die XMS-Funktionen 585
Get XMS-Version Number (AH = 00H)
585
Request High Memory Area (AH = 01H)
586
Release High Memory Area (AH = 02H)
586
Global Enable A20 (AH = 03H)
587
Global Disable A20 (AH = 04H)
587
Local Enable A20 (AH = 05H)
588
Local Disable A20 (AH = 06H)
588
Query A20 State (AH = 07H) 589
Query free Extended Memory (AH = 08H)
589
Allocate Extended Memory Block (AH = 09H) 589
Free allocated Extended Memory Block (AH = 0AH) 590
Move Extended Memory Block (AH = 0BH) 590
Lock Extended Memory Block (AH = 0CH)
591
Unlock Extended Memory Block (AH = 0DH) 592
Get Handle Information (AH = 0EH) 592
Reallocate Extended Memory Block (AH = 0FH)
593
Request Upper Memory Block (AH = 10H)
593
Release Upper Memory Block (AH = 11H)
594
12.4 Das Expanded Memory......................................................................................... 595
12.4.1 Der Zugriff auf den EMS-Speicher
598
12.4.2 Die Prüfung des Installationsstatus
598
12.4.3 Die Funktionen des EMS-Treibers (INT 67)
600
Get Manager Status (AH = 40H, Version 3.2, 4.0)
600
Get Page Frame Segment Adresse (AH = 41H, Version 3.2, 4.0)
Get Unallocated Page Count (AH = 43H, Version 3.2, 4.0)
Get Handle and Allocate Memory (AH = 43H, Version 3.2, 4.0)
Map/Unmap Memory (AH = 44H, Version 3.2, 4.0)
603
Release Handle and Memory (AH = 45H, Version 3.2, 4.0)
Get EMM Version (AH = 46H, Version 3.2, 4.0)
604
Save Mapping Context (AH = 47H, Version 3.2, 4.0)
604
Restore Page Map (AH = 48, Version 3.2, 4.0) 605
Funktion 49H (Version 3.0, reserviert) 606
Funktion 4AH (Version 3.0, reserviert) 606
601
602
602
604
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
23
Get Number of EMM Handles (AH = 4BH, Version 3.2, 4.0)
606
Get Pages Owned by Handle (AH = 4CH, Version 3.2, 4.0)
606
Get Pages for All Handles (AH = 4DH, Version 4.0)
607
Get or Set Page Map (AH = 4EH, Version 4.0) 607
Get Page Map (AL = 00H) 607
Set Page Map (AL = 01H)
608
Change Page Map (AL = 02H)
608
Get Page Map Table Size (AH = 03H) 609
Get/Set Partial Page Map (Funktion 4FH, Version 4.0) 609
Get Partial Page Map (AL = 00H)
609
Set Partial Page Map (AL = 01H)
610
Get Size of Partial Page Map Save Array (AL = 02H) 610
Map/Unmap Multiple Pages (Funktion 50H, Version 4.0)
611
Reallocate Pages (Funktion 51H, Version 4.0) 612
Get/Set Handle Attributes (Funktion 52H, Version 4.0) 612
Get Handle Attributes (AL = 00H)
612
Set Handle Attribut (AL = 01H)
613
Get Attribute Capability (AL = 02H) 613
Handle Name Functions (AH = 53H, Version 4.0)
614
Get Handle Name (AL = 00H)
614
Set Handle Name (AL = 01H) 615
Handle Directory Functions (AH = 54H, Version 4.0) 615
Get Handle Directory (AL = 00H)
615
Search for named Handle (AL = 01H) 616
Get Total Handles (AL = 02H)
616
Alter Page Map and Jump (Funktion 55H, Version 4.0). 616
Alter Page Map and Call (Funktion 56H, Version 4.0) 617
Get Page Map Stack Space Size (AL = 02H) 618
Move/Exchange Memory Region (Funktion 57H, Version 4.0) 619
Move Memory Region (AL = 00H)
619
Exchange Memory Region (AH = 01H)
620
Mappable Physical Address Array (Funktion 58H, Version 4.0) 620
Get Mappable Physical Address Array (AL = 00H)
620
Get Physical Page Address Array Entries (AL = 01H) 621
Get Expanded Memory Hardware Information (Funktion 59H, Version 4.0)
621
Get EMS Hardware Info (AL = 00H) 621
Get Unallocated Raw Page Count (AL = 01H) 622
Allocate Raw Pages (Funktion 5AH, Version 4.0)
623
Alternate Map Register Set-DMA Registers (Funktion 5BH, Version 4.0) 623
Get Alternate Map Register Set (AL = 00H)
623
Findet sich nach dem Aufruf im Register BL der Wert 0, zeigt das Registerpaar ES:DI
auf die Map-Register-Context-Sicherungstabelle. Alle Werte un-gleich 0 in BL geben
die Nummer des Alternate«Registersatzes) an. In AH wird ein Fehlercode (00H, 80H,
84H, 81H, 8FH, A4H) zurückgegeben.»Set Alternate Map Register Set (AL = 01H)
624
Get Alternate Map Save Array Size (AL = 02H)
624
Allocate Alternate Register Set (AL = 03H)
624
Deallocate Alternate Map Register Set (AL = 04H)
625
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
24
DOS Programmierhandbuch
Allocate DMA-Register Set (AL = 05H)
625
Enable DMA on Alternate Map Register Set (AL = 06H)
625
Disable DMA on Alternate Map Register Set (AL = 07H)
626
Deallocate DMA-Register Set (AL = 08H)
626
Prepare EMS Hardware for Warm Boot (Funktion 5CH, Version 4.0)
626
Enable/Disable OS Function Set Functions (Funktion 5DH, Version 4.0) 627
12.5 Die EEMS-Funktion 60H bis 6AH ....................................................................... 627
Get Physical Window Array (Funktion 60H, EEMS 3.2) 628
Generic Accelerator Card Support (Funktion 61H, EEMS 3.2) 628
Get Addresses of All Page Frames in System (Funktion 68H, EEMS 3.2) 628
Map Page Into Frame (Funktion 69, EEMS 3.2) 628
Page Mapping (Funktion 6AH, EEMS 3.2)
629
Save partial Page Map (AL = 00H)
629
Restore partial Page Map (AL = 01H) 629
Save and Restore partial Page Map (AL = 02H) 629
Deallocate Pages mapped to Frames in Conventional Memory (AL = 06H)
630
EMS-Zugriffe durch MS-DOS
630
12.6 Die VCPI-Schnittstelle.......................................................................................... 630
VCPI Installation Check (INT 67, AX = DE00H)
631
VCPI Get Protected Mode Interface (INT 67, AX = DE01H)
631
VCPI Get Maximum physical Memory (INT 67, AX = DE02H) 632
VCPI Get Number of free 4K Pages (INT 67, AX = DE03H)
632
VCPI Allocate a 4K Page (INT 67, AX = DE04H)
633
VCPI Free a 4K Page (INT 67, AX = DE05H) 633
VCPI Get physikal Adress of Page in first MB (INT 67, AX = DE06H) 633
VCPI Read CR0 (INT 67, AX = DE07H)
634
VCPI Read Debug Register (INT 67, AX = DE08H)
634
VCPI Set Debug Register (INT 67, AX = DE09H)
635
VCPI Get 8259 Interrupt Vector Mappings (INT 67, AX = DE0AH)
635
VCPI Set 8259 Interrupt Vector Mappings (INT 67, AX = DE0BH)
635
VCPI Switch to Protected Mode (INT 67, AX = DE0CH)
636
Aufruf der VCPI-Funktionen im Protected Mode
636
Switch from Protected Mode to V86-Mode
637
12.7Das DOS-Protected-Mode-Interface (DPMI)......................................................... 637
Die Real-Mode-DPMI-Funktionen.
638
Release Virtual Maschine Time Slice (INT 2F, AX = 1680H, V 1.0)
639
Get CPU Mode (INT 2F, AX = 1686H, V 0.9) 639
Detect DPMI-Server (INT 2F, AX = 1687H, V 0.9)
639
Protected Mode Umschaltung 640
Get Vendor API Entry Point (INT 2F, AX = 168AH, V 1.0)
640
12.8 Die Protected Mode DPMI-Funktionen ................................................................ 641
Allocate LDT Descriptors (INT 31, AX = 0000H, V 0.9) 641
Free LDT Descriptor (INT 31, AX = 0001H, V 0.9)
642
Segment to Descriptor (INT 31, AX = 0002H, V 0.9)
642
Get Next Selector Increment Value (INT 31, AX = 0003H, V 0.9)
Get Segment Base Address (INT 31, AX = 0006H, V 0.9)
643
643
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
25
Set Segment Base Address (INT 31, AX = 0007H, V 0.9)
644
Set Segment Limit (INT 31, AX = 0008H, V 0.9)
644
Set Descriptor Access Rights (INT 31, AX = 0009H, V 0.9)
645
Create Code Segment Alias Descriptor (INT 31, AX = 000AH, V 0.9)
646
Get Descriptor (INT 31, AX = 000BH, V 0.9) 646
Set Descriptor (INT 31, AX = 000CH, V 0.9) 646
Allocate Specific LDT Descriptor (INT 31, AX = 000DH, V 0.9) 647
Get Multiple Descriptors (INT 31, AX = 000EH, V 1.0) 647
Set Multiple Descriptors (INT 31, AX = 000FH, V 1.0) 648
Allocate DOS Memory Block (INT 31, AX = 0100H, V 0.9)
649
Free DOS Memory Block (INT 31, AX = 0101H, V 0.9) 650
Resize DOS Memory Block (INT 31, AX = 0102, V 0.9)
650
Get Real Mode Interrupt Vector (INT 31, AX = 0200H, V 0.9) 650
Set Real Mode Interrupt Vector (INT 31, AX = 0201H, V 0.9) 651
Get Processor Exception Handler Vector (INT 31, AX = 0202H, V 0.9) 651
Set Processor Exception Handler Vector (INT 31, AX = 0203H, V 0.9) 652
Get Protected Mode Interrupt Vector (INT 31, AX = 0204H, V 0.9)
652
Set Protected Mode Interrupt Vector (INT 31, AX = 0205H, V 0.9)
653
Get Processor Exception Handler Vector (INT 31, AX = 0210H, V 1.0) 653
Get Processor Exception Handler Vector (INT 31, AX = 0211H, V 1.0) 654
Simulate Real Mode Interrupt (INT 31, AX = 0300H, V 0.9)
654
Call Real Mode Procedure RET FAR (INT 31, AX = 0301H, V 0.9)
655
Call Real Mode Procedure IRET (INT 31, AX = 0302H, V 0.9) 656
Allocate Real Mode Call-Back Address (INT 31, AX = 0303H, V 0.9)
657
Free Real Mode Call-Back Address (INT 31, AX = 0304H, V 0.9)
658
Get State Save/Restore Addresses (INT 31, AX = 0305H, V 0.9) 658
Get Raw Mode Switch Addresses (INT 31, AX = 0306H, V 0.9) 659
Get Version (INT 31, AX = 0400H, V 0.9)
660
Get DPMI Capabilities (INT 31, AX = 0401H, V 1.0) 660
Get Free Memory Information (INT 31, AX = 0500H, V 0.9)
661
Allocate Memory Block (INT 31, AX = 0501H, V 0.9) 662
Free Memory Block (INT 31, AX = 0502H, V 0.9)
662
Resize Memory Block (INT 31, AX = 0503H, V 0.9)
663
Allocate Linear Memory Block (INT 31, AX = 0504H, V 1.0) 663
Resize Linear Memory Block (INT 31, AX = 0505H, V 1.0)
664
Get Page Attributes (INT 31, AX = 0506H, V 1.0)
665
Set Page Attributes (INT 31, AX = 0507H, V 1.0)
665
Map Device in Memory Block (INT 31, AX = 0508H, V 1.0)
666
Map Conventional Memory in Memory Block (INT 31, AX = 0509H, V 1.0)
667
Get Memory Block Size and Base (INT 31, AX = 050AH, V 1.0) 668
Get Memory Information (INT 31, AX = 050BAH, V 1.0)
668
Lock Linear Region (INT 31, AX = 0600H, V 0.9)
669
Unlock Linear Region (INT 31, AX = 0601H, V 0.9)
669
Mark Real Mode Region as Pageable (INT 31, AX = 0602H, V 0.9)
670
Relock Real Mode Region (INT 31, AX = 0603H, V 0.9)
670
Get Page Size (INT 31, AX = 0604H, V 0.9) 671
Mark Page as Demand Paging Candidate (INT 31, AX = 0702H, V 0.9) 671
Discard Page Contents (INT 31, AX = 0703H, V 0.9) 672
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
26
DOS Programmierhandbuch
Physical Address Mapping (INT 31, AX = 0800H, V 0.9)
673
Free Physical Address Mapping (INT 31, AX = 0801H, V 1.0) 673
Get and Disable Virtual Interrupt State (INT 31, AX = 0900H, V 0.9)
Get and Enable Virtual Interrupt State (INT 31, AX = 0901H, V 0.9)
Get Virtual Interrupt State (INT 31, AX = 0902H, V 0.9)
674
Get Vendor spezific API Entry Point (INT 31, AX = 0A00H, V 0.9)
Set Debug Watchpoint (INT 31, AX = 0B00H, V 0.9) 675
Clear Debug Watchpoint (INT 31, AX = 0B01H, V 0.9) 676
Get State of a Debug Watchpoint (INT 31, AX = 0B02H, V 0.9) 676
Reset Debug Watchpoint (INT 31, AX = 0B03H, V 0.9) 677
Install Resident Service Provider Callback (INT 31, AX = 0C00H, V 1.0)
Terminate and Stay Resident (INT 31, AX = 0C01H, V 1.0)
678
Allocate Shared Memory (INT 31, AX = 0D00H, V 1.0) 678
Free Shared Memory (INT 31, AX = 0D01H, V 1.0)
679
Serialize on Shared Memory (INT 31, AX = 0D02H, V 1.0)
680
Free Serialization on Shared Memory (INT 31, AX = 0D03H, V 1.0)
Get Coprozessor Status (INT 31, AX = 0E00H, V 1.0) 681
(INT 31, AX = 0E01H, V 1.0)681
13 Ergänzungen des BIOS-INT 10 durch EGA- und VGA-Adapter
674
674
675
677
680
683
13.1 Die BIOS-Ergänzungen der EGA-Karten ............................................................. 683
Die Funktionen des EGA-BIOS-INT 10
685
EGA-Set Palette Register (AH = 10H) 685
Set Palette Register (AL = 0) 685
Set Boarder Color Register (AL = 1) 685
Set all Palette Register (AL = 2)
686
Video-Toggle Intensity/Blinking Bit (AL = 3) 686
EGA-Text Mode Character Generator (AH = 11H)
686
Load user spezified Characterset (AL = 0)
686
Load ROM-Monochrom Characterset (AL = 1) 686
Load ROM 8x8 double dot Characterset (AL = 2)
686
Set block spezifier (AL = 3) 687
Set User 8x8 Graphic Characterset (AL = 20H) 687
Set User Graphic Characterset (AL = 21H)
687
Set ROM 8x14 Characterset (AL = 22H)
687
Set ROM 8x8 double dot Characterset (AL = 23H)
687
Get Font Info (AL = 30H)
688
EGA-Video alternate Function Select (AH = 12H)
688
Alternate Function select (BL = 10H) 688
Select alternate Print Screen Routine (BL = 20H)
688
13.2 Die Funktionen des VGA-BIOS-INT 10............................................................... 689
Set Video Mode (AH = 00H) 689
Set Cursor Size (AH = 01H) 694
Set Cursor Position (AH = 02H)
Get Cursor Position (AH = 03H)
Position Light Pen (AH = 04H)
Select Display Page (AH = 05H)
Page Scroll Up (AH = 06H) 695
694
695
695
695
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
27
DOS Programmierhandbuch
Page Scroll Down (AH = 07H)
696
Read Attributes and Character at Cursor Position (AH = 08H)
Write Attributes and Characters at Cursor Position (AH = 09H)
Write Character at Cursor Position (AH = 0AH)697
Set Color Palette (AH = 0BH) 698
Set Graphik Pixel (AH = 0CH)
698
Get Graphik Pixel (AH = 0DH)
699
Write Character (AH = 0EH) 699
Get current Video Mode (AH = 0FH) 699
Set Palette Register (AH = 10H)
700
Set Palette Register (AL = 00H)
700
Set Overscan-Register (AL = 01H)
700
Set all Palette/Overscan-Register (AL = 02H) 700
Toggle Intensity/Blink (AL = 03H)
701
Get individual Palette-Register (AL = 07H)
701
Get Overscan-Register (AL = 08H)
701
Read all Palette/Overscan-Registers (AL = 09H)
702
Set individual DAC-Register (AL = 10H)
702
Set Block of DAC-Register (AL = 12H)
702
Select Video DAC Color Page (AL = 13H)
703
Read individual DAC-Register (AL = 15H)
704
Read Block of DAC-Registers (AL = 17H)
704
Set PEL-Mask (AL = 18H, undokumentiert)
704
Get PEL-Mask (AL = 19H, undokumentiert) 705
Get Video DAC Color Page State (AL = 1AH) 705
Perform Gray-Scale Summing (AL = 1BH)
705
EGA/VGA-Video Textmode Character Generator (AH = 11H)
Load User Characterfont (AL = 0)
706
Load ROM 8x14 Monochrom Characterfont (AL = 1) 707
Load ROM 8x84 Monochrom Characterfont (AL = 2) 707
Set Block specifier (AL = 3) 707
Load ROM 8x16 Characterfont (AL = 4)
707
Load User Characterfont (AL = 10) 708
Load ROM 8x14 Monochrom Characterfont (AL = 11H)
Load ROM 8x8 double dot Characterfont (AL = 12H) 708
Load ROM 8x16 Characterfont (AL = 14H)
709
Set User 8x8 Graphik Characterfont (AL = 20H)
709
Set User Graphik Characterfont (AL = 21H)
709
Load ROM 8x14 Graphik Characterfont (AL = 22H)
709
Load ROM 8x8 double dot Graphik Characterfont (AL = 23H)
Load ROM 8x16 Graphik Characterfont (AL = 24H)
709
Get Font Info (AL = 30H)
709
Alternate Function select (AH = 12H) 710
Get EGA/VGA Info (BL = 10H)
710
Alternate Print Screen (BL = 20H)
710
Select vertical Resolution (BL = 30H) 710
Load Palette (BL = 31H)
711
Video Addressing (BL = 32H)
711
Gray Scale Summing (BL = 33H)
711
697
697
706
708
709
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
28
DOS Programmierhandbuch
Cursor Emulation (BL = 34H) 711
Display Switch Interface (BL = 35H) 711
Video Refresh Control (BL = 36H)
712
Zeichenkette ausgeben (AH = 13H) 712
Write String (AL = 0)
712
Write String with Attributbyte (AL = 1)
712
Write String and Attributebytes (AL = 2)
713
Write String and Attributbytes (AL = 3)
713
Read/Write Display Combination Code (AH = 1AH)
713
Read Monitor Status (AL = 0) 713
Set Display Combination (AL = 01H) 713
Get Video-Status (AH = 1BH)
714
Save/Restore-Video-Status (AH = 1CH)
716
State Buffer Size (AL=00H) 716
Save Video-Status (AL=01H) 717
Restore Video-Status (AL=02H)
717
13.3 Die erweiterten VGA-Funktionen (AH=6FH) ...................................................... 717
INT 10-Installation Check (AX = 6F00H)
717
INT 10-GET INFO (AX = 6F01H)
717
INT 10-Get Mode and Screen Resolution (AX = 6F04H) 718
INT 10-Set Video Mode (AX = 6F05H)
718
INT 10-Select Autoswitch Mode (AH = 6F06H)
719
INT 10-Get Video Memory Configuration (AX = 6F07H)
14 Netzwerkfunktionen 721
720
14.1 Die Funktionen des INT 2A .................................................................................. 721
LANtastic Installation Check (INT 2A, AH = 00H)
721
LANtastic Execute NetBIOS Request, no Error Request (INT 2A, AH = 01H)
721
LANtastic Check Direct I/O (INT 2A, AH = 03H)
722
LANtastic Execute NetBIOS Request (INT 2A, AH = 04H)
722
LANtastic Get Network Resource Availability (INT 2A, AH = 05H)
723
LANtastic Network Print-Stream Control (INT 2A, AH = 06H) 723
14.2 Die Funktionen des NetBIOS (INT 5CH) ............................................................. 724
14.3 Der Netzwerk-Control-Block (NCB) .................................................................... 724
14.4 Die NetBIOS-Kommandos ................................................................................... 726
Anhang 729
Die historische Entwicklung von MS-DOS .................................................................. 729
Versionsspezifische Unterschiede in DOS.................................................................... 731
Funktionsaufrufe (INT 21) ............................................................................................ 732
COMMAND.COM Intern............................................................................................. 734
Der Keyboard-Interrupt (INT 9H)................................................................................. 740
Das TesSeRact Interface (INT 2F)................................................................................ 741
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
29
DOS Programmierhandbuch
Call User Procedure (BX = 20H)
747
Portadressen für Peripheriebausteine ............................................................................ 749
Das DOS-Speichermodell ............................................................................................. 756
Die Installation des EMS-Managers ............................................................................. 759
EMM386.EXE in MS-DOS 4.0-6.0 .............................................................................. 759
DOS und Windows 3.x ................................................................................................. 762
NetBIOS-Funktionen .................................................................................................... 763
Das SMARTDRIVE 4.0 Interface ................................................................................ 763
SMARTDRV - Installation check and hit ratios (INT 2F)
763
SMARTDRV - Flush (Commit) Buffers (INT 2F)
764
SMARTDRV - Reset Cache (INT 2F) 764
SMARTDRV - Get Status & Set Cache Drive (INT 2F) 765
SMARTDRV - Get Cache Info (INT 2F)
765
SMARTDRV - Get Double Buffer Status (INT 2F)
766
SMARTDRV - Check if drive cacheable (INT 2F)
766
SMARTDRV - Get Device Driver for Drive (INT 2F) 767
SMARTDRV - Signal serious Error (INT 2F) 767
Das DBLSPACE Interface ............................................................................................ 768
DBLSPACE - Installation Check (INT 2F)
768
DBLSPACE - Get Drive Mapping (INT 2F)
768
DBLSPACE - Swap Drive Letters of CVF & Host (INT 2F)
769
DBLSPACE - Get Device Driver Entry Points (INT 2F) 769
DBLSPACE - Set Device Driver Entry Points (INT 2F) 770
DBLSPACE.BIN - Mount Compressed Drive (INT 2F) 770
DBLSPACE - Unmount Compressed Drive (INT 2F) 771
DBLSPACE - Get Space available on compressed Drive (INT 2F)
771
DBLSPACE - Get Size of Fragment Heap (INT 2F)
772
DBLSPACE - Determine Number of Disk_Unit Strutures (INT 2F)
772
DBLSPACE - Relocate (INT 2F)
773
DBLSPACE - Get Relocation Size (INT 2F) 773
Microsoft Realtime Compression Interface (MRCI) - RAM-Based Server (INT 2F)
773
Power Management auf dem PC................................................................................... 774
Get Status Power Management (INT 15)
774
Power Management - Interface Connect (INT 15)
775
Power Management - Protected Mode Interface (INT 15)
Power Management - Disconnect Interface (INT 15)
775
Power Management - CPU Idle (INT 15)
775
Power Management - CPU Busy (INT 15)
776
Power Management - Set Power State (INT 15) 776
Power Management - Status/Control (INT 15) 777
Power Management - Restore Power On defaults (INT 15)
Power Management - Get Power Status (INT 15)
778
Power Management - Event Notofication (INT 15)
779
775
778
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Glossar 780
Literatur
782
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
30
DOS Programmierhandbuch
31
Vorwort
Der eine oder andere Leser wird sich sicher die Frage stellen: wieso wird hier noch ein
Buch über DOS geschrieben? Gibt es denn nicht schon genug Literatur zu diesem Thema,
ganz abgesehen von den Unterlagen der Rechnerhersteller.
Zur Erklärung der Beweggründe möchte ich kurz auf die Entwicklungsgeschichte dieses
Buches eingehen. Als ich Mitte 1983 im Rahmen eines Projektes mit einem der ersten IBM
PC/XT in Europa konfrontiert wurde, war meine Welt noch in Ordnung. Als
Betriebssysteme wurden damals CP/M 86 und ein unbekanntes System Namens MS-DOS
mitgeliefert. Es handelte sich um die Version 1.0, die sich nicht besonders stark von CP/M
unterschied, aber die vorhandene Festplatte nicht unterstützte. Nach wenigen Wochen kam
dann DOS 2.0 hinzu, so daß die Festplatte auch betrieben werden konnte. Bemerkenswert
war das hierarchische Dateisystem und die Möglichkeit, im Hintergrund zu drucken. Mit
der Dokumentation gab es auch kaum Probleme, da sie nicht zur Verfügung stand. Um die
Zeit bis zur Lieferung der DOS-Version 2.1 zu überbrücken, wurde vom Lieferanten
schließlich die Fotokopie einer Microsoft-Dokumentation ausgegeben. Hierbei handelte es
sich um einen gut 5 cm dicken Wälzer, der viele Informationen über das Betriebssystem,
einschließlich der Beschreibung der INT-21-Aufrufe, enthielt. Außerdem bot die
Softwareentwicklung mit dBase II genügend Probleme, so daß eine Beschäftigung mit den
DOS-Interna nicht zur Debatte stand. Als nach einem Monat die PC-DOS-Version 2.1
geliefert wurde, war der Umfang der Original-Dokumentation bereits merklich geringer.
Die Interna von DOS wurden nicht mehr beschrieben. Informationen über die
Systemprogrammierung sind nur in zusätzlichen Handbüchern erhältlich. Selten werden
jedoch die Randgebiete wie BIOS-Aufrufe, Graphikausgabe, Mausschnittstelle, etc.
behandelt. Der Programmierer benötigt daher eine Reihe unterschiedlicher Werke zu den
jeweiligen Themen.
Ein anderer Aspekt betrifft die Vollständigkeit der Informationen. Insbesondere in früheren
DOS-Versionen wies das Betriebssystem eine Vielzahl undokumentierter Schnittstellen
auf. Insbesondere die vielen als »reservedUm die Informationen aus den vielen
verschiedenen Quellen für eigene Zwecke besser aufzubereiten, wurden die Erkenntnisse
und Informationen in Form fliegender Blätter zusammengeschrieben. Mit wachsender
Erfahrung konnten dann viele Informationen, die alleine betrachtet keinen Sinn ergaben, im
Gesamtkontext bewertet werden, so daß das Puzzle Stück für Stück aufgedeckt wurde. MSDOS liegt mittlerweile in verschiedenen Versionen (bis DOS 6.0) vor und ist weltweit
mehr als 60 Millionen mal verbreitet. Da die Literatur andererseits kaum geschlossene
Informationen über die verschiedenen Versionen und die undokumentierten Eigenschaften
bietet, entstand die Idee, die bisher angesammelten Informationen in Form eines Buches
aufzubereiten und einem breiteren Kreis zugänglich zu machen. Die erste Version dieses
Buches wurde 1988 publiziert und eroberte sich schnell einen festen Platz auf den
Schreibtischen der Entwickler.
In Laufe der folgenden Jahre wurde das Werk mehrfach überarbeitet. Ein eigenes Kapitel
über die Funktionen der EGA- und VGA-Karten einschließlich der herstellerspezifischen
Eigenheiten oder der Abschnitt über den INT 2F kamen in späteren Jahren hinzu. Das
fehlende Wissen um das Thema Speichererweiterung war für mich der Grund, ein eigenes
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
32
Kapitel über Extended/Expanded Memory aufzunehmen. Weitere Themen wie die
NetBIOS-Funktionen sollen das Wissen über neue Entwicklungen einem breiteren Kreis
nahebringen. Erweiterungen um die neuen DOS 5.0-Funktionen, sowie die Erstellung
residenter Programme sind weitere Stichpunkte.
Nun noch ein Wort zur Informationsbeschaffung: Als freier Autor stehen mir keinerlei
Insiderinformationen des Herstellers zur Verfügung. Der Stoff besteht vielmehr aus einer
Zusammenfassung allgemein zugänglicher Informationen, die durch eigene Erfahrungen
ergänzt wurden. So viel zur Entstehungsgeschichte dieses Buches. Nun ist es an der Zeit,
mich bei den Personen zu bedanken, die dieses Buch überhaupt erst ermöglicht haben.
An erster Stelle sei Mark Zbikovski (einem der Entwickler von DOS) gedankt, dessen
Initialen mir bei so mancher nächtlichen Sitzung am Debugger begegneten. Sie verhalfen
zu unerwarteten Erfolgserlebnissen und erlaubten die Orientierung im Innern von DOS.
Erwähnen möchte ich hier auch die Gruppe der Insider und Freaks, stellvertretend seien
hier Ray Duncan und Adrew Schulman genannt, die viele Interna von DOS erforschten und
ihre Erkenntnisse veröffentlichen.
Die Erstellung und Korrektur des Manuskriptes wäre ohne die tatkräftige Unterstützung
meiner Frau und das Verständnis meiner Familie nicht möglich gewesen. Auch ihnen gilt
mein Dank.
Und hier verließen ihn die Kräfte...
Denn es ist ein hoffnungsloses Unterfangen, alle Personen namentlich zu erwähnen.
Zum Abschluß nun noch mein Dank an die Firma Microsoft, die sich zur Veröffentlichung
dieser Informationen entschloß und somit viele offene Fragen der Entwickler beantwortet.
Allen Lesern wünsche ich viel Erfolg und neue Erkenntnisse beim Umgang mit den
bekannten und unbekannten Seiten von MS-DOS.
Günter Born
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
33
1 Einführung
Der Umgang mit MS-DOS gehört mittlerweile für viele PC-Besitzer zum Alltag. Dabei ist
es oft unerläßlich, sich tiefer mit dem Betriebssystem zu beschäftigen. Für SoftwareEntwickler sind die Schnittstellen zum BIOS genau so wichtig, wie die DOSFunktionsaufrufe. Dabei sind nicht nur die Kenntnisse rudimentärer Aufrufkonventionen
wichtig, sondern es kommt vielfach auf das grundlegende Verständnis der internen
Arbeitsweise des Betriebssystems an. Dieses grundlegende Verstehen der Abläufe kann
auch bei der Verwendung von Anwenderprogrammen weiterhelfen, falls die Software nicht
in der vorgesehenen Weise läuft (Leistungseinbußen, Fehlfunktionen, Fehlerabbrüche). Im
Verlaufe der folgenden Kapitel werden die Schnittstellen zu MS-DOS (PC-DOS) und die
BIOS-Aufrufe beschrieben. Weiterhin widmet sich das Buch der Erklärung der internen
Abläufe.
1.1 Das Speicherabbild der 8086/8088-Prozessoren
MS-DOS hat sich innerhalb kürzester Zeit als Standard-Betriebssystem für die auf IntelProzessoren basierenden PCs durchgesetzt.
Ö--------------------Ì
°
AX
°
û--------------------À
°
BX
°
û--------------------À
°
CX
°
û--------------------À
°
DX
°
Û--------------------ì
Ö--------------------Ì
°
IP
°
û--------------------À
°
Flags
°
Û--------------------ì
Ö--------------------Ì
°
SP
°
û--------------------À
°
BP
°
û--------------------À
°
SI
°
û--------------------À
°
DI
°
Û--------------------ì
Ö--------------------Ì
°
CS
°
û--------------------À
°
DS
°
û--------------------À
°
SS
°
û--------------------À
°
ES
°
Û--------------------ì
Bild 1.1: 8086- Registerstruktur;
Die Ursprünge von MS-DOS und PC-DOS gehen auf das von der Firma Seattle Computer
für den 8086-Prozessor entwickelte QDOS (quick and dirty operating system) zurück.
Später wurde das Produkt von Microsoft gekauft und unter dem Namen MS-DOS
vermarktet. Auch wenn mittlerweile gravierende Erweiterungen vorgenommen wurden,
lehnt sich MS-DOS nach wie vor stark an die Architektur der 8086/8088-Prozessoren an.
Diese arbeiten intern mit 16 Bit breiten Adreß- und Datenpfaden. Dies gilt auch für die
80286- und 80386-CPUs, sofern sie im 8086-Real-Mode betrieben werden. Der interne
Registeraufbau des 8086 wird in Bild 1.1 kurz skizziert.
Da mit den 16-Bit-Registern nur ein Adreßbereich von 64 Kbyte erreicht wird, haben sich
die Entwickler etwas einfallen lassen, um auf einen Adreßraum von 1 Mbyte zu kommen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
34
DOS Programmierhandbuch
Die 80x86/8088-Prozessoren benutzen zwei Register zur Erzeugung der physikalischen
Adresse.
1.2 Die Segment Offset-NotationEs sind insgesamt 20 Bit zur
Adressierung des 1-Mbyte-Bereiches notwendig. Die Arbeitsregister (AX .. DX, SP, BP,
SI, DI, IP) erreichen jedoch nur jeweils einen Ausschnitt von 64 Kbyte. Die CPU unterteilt
nun den 1-Mbyte-Bereich in Segmente mit einer Größe von 16 Byte bis 64 Kbyte (Bild
1.2).
64Kbyte * 16 Byte
16 * 64 Kbyte
Ö--------------------Ì
°
16 Byte
°
û--------------------À
.
û--------------------À
°
16 Byte
°
Û--------------------ì
Ö--------------------Ì
°
64 Kbyte
°
û--------------------À
.
û--------------------À
°
64 Kbyte
°
Û--------------------ì
1 Mbyte
0000
Bild 1.2: Aufteilung des 8086-Adreßraumes in Segmente
Die Basisadresse eines solchen Segments wird durch eines der vier Segmentregister
(Codesegment, Datensegment, Stacksegment und Extrasegment) festgelegt. Eine
Speicherzelle innerhalb dieses Segments wird nun durch den Offsetwert innerhalb der
Arbeitsregister angesprochen.
Segmentanfang
°
.
°
û--------------------À
° Speicheradresse
° <------- Offsetadresse
û--------------------À
°
.
°
+
°
.
°
û--------------------À <------- Segmentadresse
°
.
°
Bild 1.3: Adressierung einer Speicherzelle
Die Adreßberechnung der Businterface-Einheit (BIU) addiert daher bei jedem
Speicherzugriff den Wert des Segmentregisters und den Offsetwert in einem
Arbeitsregister. Hierbei spezifiziert das Segmentregister die Bits b4 bis b19, während der
Offset die Bits b0 bis b15 belegt. Das Segmentregister ist also um 4 Bit nach
»links(Segmentadresse:Offsetadresse).
Adresse in Segment:Offset-Schreibweise = F000:8000
F000
8000
------F8000H
Segment * 16
Offset
physikalische Adresse
Bild 1.4: Umrechnung der Segment:Offset-Adressen in absolute Adressen
Diese Segment:Offset-Notation wird häufig auch in der Literatur verwendet. Der Wert
F8000H (20-Bit-Adresse) kann daher als F000:8000 oder F800:0000 angegeben werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
35
Eine Umrechnung der Segment:Offset-Angaben in physikalische Adressen ist recht
einfach. Hierzu wird der Wert des Segments mit 16 multipliziert und zum Offset addiert.
Eine Multiplikation mit 16 (10H) läßt sich im Hexadezimalsystem leicht durch
Verschieben um eine Stelle nach links erreichen. Das Beispiel in Bild 1.4 zeigt noch einmal
diesen Vorgang.
Durch diese Verschiebung um vier Bit wird eine Adresse im 1-Mbyte-Bereich generiert.
Andererseits bedingt dies auch, daß die minimale Segmentgröße 16 Byte beträgt. Die
maximale Größe eines Segments wird durch die Breite der Arbeitsregister bestimmt und
liegt bei 64 Kbyte.
1.3 Die Speicheraufteilung durch Intel
Die Firma Intel reservierte bereits beim Entwurf der Prozessoren bestimmte
Speicherbereiche innerhalb des 1-Mbyte-Adreßraumes. Einmal handelt es sich um den
Restartpunkt, an dem der Prozessor nach einem RESET mit der Abarbeitung des
Programmes beginnt. Beim 8086/8088 sind hierfür die oberen 16 Adressen FFFF0H bis
FFFFFH reserviert, wobei die erste Anweisung bei FFFF0H stehen muß. Bei den
80286/80386-Prozessoren werden im Real Mode die oberen physikalischen Adressen (24
Bit oder 32 Bit) in den 1-Mbyte-Bereich gespiegelt, so daß im Prinzip die gleichen
Bedingungen vorliegen.
Der zweite reservierte Bereich liegt zu Beginn des Speicherbereiches und enthält die
Interrupttabelle. Die Prozessoren können im 8086-Mode insgesamt 256 verschiedene
Interrupts bearbeiten. Tritt eine Unterbrechung auf, verzweigt der Prozessor in eine
Interrupt-Service-Routine. Deren Adresse ist für jeden Interrupt separat als 4-Byte-Vektor
in einer Tabelle eingetragen. Diese Tabelle ist 1 Kbyte groß und befindet sich im
Adreßbereich von 000 bis 3FFH. Intel hat innerhalb dieser Tabelle die ersten 128 Byte (00
bis 7FH) für eigene Zwecke reserviert. Das bedeutet, daß die Interrupts 0 bis 31 nicht vom
Anwender belegt werden dürfen, falls eine Kompatibilität mit anderen Intel-Hard- undSoftwareprodukten gewährleistet werden soll.
Damit ergibt sich folgendes Speicherabbild innerhalb des 8086/8088-Adreßraumes.
FFFFF
FFFF0
3FF
7F
00
Ö--------------------Ì
° 16 Byte reserviert °
û--------------------À
.
.
û--------------------À
° INT 32 bis 255
°
û--------------------À
° INT 0 bis 31
°
Û--------------------ì
1 Mbyte
Restart-Bereich
Anwender-Interrupts
reservierte Interrupts
Bild 1.5: Reservierte Speicherbereiche des 8086/8088
Aus den Intel-Datenbüchern der 80x86-und 8088-Prozessoren ergibt sich die Belegung der
reservierten Interrupt-Bereiche (die mit einem * markierten Interrupts werden nur vom
80286 benutzt, während die mit + markierten Interrupts durch den 80386-Prozessor belegt
sind).
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
36
INT
° Bemerkung
-------é------------------------------0
° Divide Error
1
° Single Step
2
° NMI (Non Maskable Interrupt)
3
° INT3 (Breakpoint Interrupt)
4
° INT0 (Overflow Interrupt)
5 * ° Bound Range Exeded Exeption
6 * ° Invalid Opcode
7 * ° Processor Extension not available (ESC, WAIT)
8 * ° Interrupt Table Limit too small Exeption
+ ° Double Fault
9 * ° Processor Extension Segment Overrun
+ ° Coprozessor Segment Overrun
10 + ° Invalid TSS (JMP, CALL, IRET, RET)
11 + ° Segment not present
12 + ° Stack Fault
13 * ° Segment Overrun Exeption
+ ° General Protection Fault
14 + ° Page Fault
° INT 15 reserved
16 * ° Processor Extension Error
+ ° Coprozessor Error
° INT 17-31 reserved
° INT 32-255 user interrupt
Tabelle 1.1: Vorbelegung der Interrupts durch Intel
Bei der Entwicklung von Software sollten diese Spezifikationen berücksichtigt werden, um
eine Kompatibilität hinsichtlich zukünftiger Hard- und Softwareprodukte zu gewährleisten.
Insbesondere die Tabelle zeigt, daß bereits beim Übergang vom 8086- auf den 80286Prozessor die Interrupts 5,6,7,8,9,13 und 16 belegt wurden. Nur wenn die 80286-CPU im
Real Mode (8086-Emulation) betrieben wird, sind diese Interrupts noch unbenutzt.
1.4 Die Speicherbelegung durch MS-DOS
Die Entwickler von MS-DOS konnten die Intel-Vorgaben natürlich nicht komplett
ignorieren. Deshalb lehnt sich die Aufteilung des Speicherbereiches an Bild 1.5 an.
Allerdings waren weitere Festlegungen bezüglich der Adreßbelegung erforderlich. Bild 1.6
gibt einen groben Überblick über die wichtigsten MS-DOS-Speicherstrukturen.
Die Adressen von 0000:0000 bis 9000:FFFF sind für den 640-Kbyte-MS-DOS-RAMBereich reserviert. Der verbleibende Adreßraum dient zur Aufnahme von Erweiterungen
(Bildschirmadapter, BIOS etc.). Die Belegung ist etwas abhängig von der vorliegenden
Hardwarekonfiguration. Insbesondere bei den Bildschirmadaptern spiegelt sich in der
Adreßbelegung die technische Entwicklung der letzten Jahre wieder.
Insgesamt ist der Adreßraum von A000:0000H bis B000:FFFFH für Grafikadapterkarten
reserviert. Tabelle 1.2 gibt einen Überblick über die heutige Belegung. Der Bereich von
C000:0000 bis E000:FFFF ist für die ROMs der Hardwareerweiterungen wie z.B.
Festplatten vorgesehen. Besitzt das System eine Festplatte, findet sich das BIOS-ROM des
Plattenkontrollers meist oberhalb des Bildspeicherbereiches. Die Adressen variieren
zwischen C800:0000 und E800:0000. Innerhalb dieses BIOS-ROMs sind neben den
Routinen zur Ansteuerung der Platte auch Hilfsprogramme zur physikalischen
Formatierung der Platte abgespeichert. Erst nach einer solchen Formatierung läßt sich die
Platte mit FDISK und FORMAT für MS-DOS herrichten.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
37
Adreßbereich
° Bemerkung
----------------é----------------------------------------------------------B000:0000
° Bildschirmspeicher Monochrom-Karte
B000:0FFF
° (4 Kbyte)
----------------é----------------------------------------------------------B800:0000
° Bildschirmspeicher Color-Grafikadapter
B800:3FFF
° (16 Kbyte)
----------------é----------------------------------------------------------B000:0000
° Bildschirmspeicher Herkules-Grafikadapter
B000:7FFF
° (32 Kbyte Seite 0)
°
B800:0000
° Bildschirmspeicher Herkules-Grafikadapter
B800:7FFF
° (32 Kbyte Seite 1)
----------------é----------------------------------------------------------A000:0000
° Bildschirmspeicher EGA-Adapter volle
A000:FFFF
° Aufrüstung. (64 Kbyte pro Seite)
Tabelle 1.2: Belegung des Adreßraumes durch die Grafikadapter
F000:FFFF
F000:FFF0
FE00:0000
C800:0000
B800:0000
B000:0000
A000:0000
0000:0000
Ö--------------------Ì
° 16 Byte reserviert °
° - - - - - - - - - -°
° BIOS ROM Teil
°
û--------------------À
° - - - - - - - - - -°
° BIOS ROM Harddisk °
û--------------------À
° Bildschirmspeicher °
° Color Adapter
°
û--------------------À
° Bildschirmspeicher °
° Monochrom Adapter °
û--------------------À
° Bildschirmspeicher °
° EGA-/VGA-Adapter
°
û--------------------À
.
.
° COMMAND.COM
°
° - - - - - - - - - -°
°
°
° Anwenderprogramme °
û--------------------À
° COMMAND.COM
°
û--------------------À
° Device Treiber
°
û--------------------À
° DOS Puffer
°
û--------------------À
° MS - DOS
°
û--------------------À
° BIOS RAM Teil
°
û--------------------À
° Interrupttabelle
°
Û--------------------ì
1 Mbyte
Restart Bereich
Raum für Hardwareerweiterungen
Raum für Grafikadapter
Ende 640 Kbyte RAM
nicht residenter Teil
residenter Teil
Bild 1.6: Aufteilung des 1-Mbyte-Speichers durch MS-DOS
Das BIOS-ROM für den PC beginnt ab der Adresse FE00:0000. Es enthält den
hardwareabhängigen Teil und ist fest abgespeichert. Auf den im RAM-Bereich liegenden
Ergänzungsteil (IO.SYS oder IBMBIO.COM) wird später noch eingegangen. Im BIOSROM findet sich auch die Restart-Routine für den Neuanlauf des Systems.
Beim IBM PC befindet sich im Bereich F000:0000 bis FE00:0000 das Basic-ROM. Bei
kompatiblen PCs bleibt der Bereich entweder frei, oder er wird durch Zusatz-EPROMs
(z.B. für Monitorprogramme) benutzt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
38
Damit ist die grobe Aufteilung des Speichers bekannt. Die Intel-Vorgaben bezüglich der
oberen und unteren Speicherbelegung wurden offensichtlich berücksichtigt. Im folgenden
Schritt soll die Organisation innerhalb des MS-DOS-RAMs untersucht werden.
1.5 Die Aufteilung des 640-Kbyte-MS-DOS-RAM-Bereiches
Die Entwickler von MS-DOS reservierten die unteren 640 Kbyte für das Betriebssystem
und die Anwenderprogramme. Sie standen aber vor dem Problem, daß nicht alle Geräte mit
den vollen 640 Kbyte ausgerüstet waren. Insbesondere die ersten IBM-PCs enthielten im
Grundausbau nur 64 Kbyte RAM. Weiterhin besteht ab der Version 2.0 die Möglichkeit,
daß Betriebssystem in gewissem Umfang durch den Benutzer zu konfigurieren (DeviceTreiber, Puffer etc.). Eine starre Einteilung des RAM-Bereiches für bestimmte Funktionen
war deshalb nicht möglich. Aus diesem Grunde wurde MS-DOS mit einer eigenen
Speicherorganisation, die abhängig von der Systemkonfiguration die Aufteilung dynamisch
vornimmt, ausgestattet. Damit lassen sich auch nur wenige Adressen angeben, an denen
bestimmte Informationen stehen. Andererseits ist die relative Lage einzelner Systemteile
im Speicherbereich aber immer gleich, so daß sich der schematische Aufbau angeben läßt.
Lage und Größe der Interrupttabelle wurden bereits durch Intel fixiert. Daran schließen
sich die BIOS- und DOS-Datenbereiche an. Anschließend folgt der residente RAM-BIOSTeil, der aus den Dateien IO.SYS oder IBMBIO.COM geladen wird. Dahinter findet sich
das eigentliche MS-DOS, dessen Systemkern aus den Dateien MSDOS.SYS oder
IBMDOS.COM geladen wird. Welche der beiden Dateien Verwendung findet, hängt vom
PC ab. Das Betriebssystem der IBM-Personalcomputer (PC-DOS) verwendet die Dateien
IBMBIO.COM und IBMDOS.COM. Innerhalb der kompatiblen Systeme gelangen die
Dateien IO.SYS und MSDOS.SYS zum Einsatz. Die Bezeichnung der Dateien deutet
schon an, daß zwischen MS-DOS und PC-DOS kleinere Unterschiede bestehen.
Um eine möglichst hohe Kompatibilität mit den IBM-Personalcomputern zu erreichen,
verwenden die Hersteller kompatibler Systeme teilweise lizenzierte Versionen von
IBMBIO.COM und IBMDOS.COM.
Oberhalb der DOS-Systemprogramme finden sich die Datenbereiche für die I/O-Puffer,
sowie ein Kontrollbereich, in dem MS-DOS bestimmte Steuerinformationen ablegt. Daran
schließt sich der Bereich an, in dem die residenten Treiber geladen werden. Diese werden
durch Auswertung der Datei CONFIG.SYS aktiviert. Der Aufbau dieser Treiber wird in
einem eigenen Kapitel beschrieben. Der residente Teil des Kommandointerpreters
COMMAND.COM schließt den Systemteil ab. Der nicht residente Teil von
COMMAND.COM wird immer an das Ende des RAM-Bereiches geladen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
RAM Ende
0000:0500
0000:0400
0000:0000
Ö--------------------Ì
° COMMAND.COM
°
° - - - - - - - - - -°
° 256 Byte Stack
°
° - - - - - - - - - -°
° Anwender-Programme °
° (COM oder EXE )
°
û--------------------À
° COMMAND.COM
°
û--------------------À
° Device-Treiber
°
û--------------------À
° DOS-Kontrollber.
°
û--------------------À
° DOS-Puffer
°
û--------------------À
° MS-DOS
°
°( MSDOS.SYS oder
°
° IBMDOS.COM )
°
û--------------------À
° BIOS RAM Teil
°
°( IO.SYS oder
°
° IBMBIO.COM )
°
û--------------------À
° DOS-Datenbereich
°
û--------------------À
° BIOS-Datenbereich °
û--------------------À
° Interrupttabelle
°
Û--------------------ì
39
max. 640 Kbyte
nicht residenter Teil
User Stack
residenter Teil
residente Treiber und Programme
Bild 1.7: Aufteilung des 640-Kbyte-RAM durch MS-DOS
Anwenderprogramme finden sich zur Laufzeit zwischen dem residenten und nicht
residenten Teil von COMMAND.COM. Reicht der freie Speicherbereich nicht aus, wird
der nicht residente Teil von COMMAND.COM überschrieben. Nach Beendigung des
Anwenderprogramms lädt DOS diesen Teil wieder nach.
Die komplette Verwaltung des Speichers erfolgt automatisch durch MS-DOS, ohne den
Anwender zu belasten.
1.6 Die MS-DOS-Interupt-Vektor-Tabelle
Im Abschnitt 1.3 wurde bereits die Tatsache besprochen, daß der 8086 insgesamt 256
Interrupts besitzt, von denen die ersten 32 von Intel für Hard- und Softwareerweiterungen
reserviert wurden. Der Einsprung in eine Interrupt-Service-Routine erfolgt über eine (1
Kbyte) Tabelle, die zu Beginn des Speicherbereiches liegt. Jedem Interrupt ist in dieser
Tabelle ein 4-Byte-Adreßvektor mit folgendem Aufbau zugeordnet:
Ö--------------------Ì
° Offset Lowbyte
°
û--------------------À
° Offset Highbyte °
û--------------------À
° Segment Lowbyte
°
û--------------------À
° Segment Highbyte °
Û--------------------ì
Low-Adresse
High-Adresse
Bild 1.8: Aufbau des Interruptvektors
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
40
DOS Programmierhandbuch
Der Prozessor rettet das Flagregister, sowie die Programmadresse auf den Stack. Dann wird
zu der Programmstelle verzweigt, deren Adresse unter dem Interruptvektor abgespeichert
ist. Nicht benutzte Interrupts sollten deshalb mit einem Vektor auf eine Routine mit einer
IRET-Anweisung abgeschlossen werden. Wie aber aus folgendem Bild ersichtlich ist,
besetzt MS-DOS den nicht genutzten Bereich teilweise mit den Werten 00 00 00 00. Tritt
hier ein Interrupt auf, verzweigt das Programm zur Adresse 0000:0000 und stürzt ab, da
hier kein Code vorhanden ist. Lediglich einige Interrupts, im nachfolgenden Bild mit dem
Vektor 029C:1374 belegt, sind mit einer IRET-Anweisung abgefangen.
-d 0:0 3fff
0000:0000 88
0000:0010 60
0000:0020 36
0000:0030 18
0000:0040 3B
0000:0050 A4
0000:0060 EF
0000:0070 4D
0000:0080 6E
0000:0090 BD
0000:00A0 74
0000:00B0 74
0000:00C0 EA
0000:00D0 74
0000:00E0 74
0000:00F0 74
0000:0100 59
0000:0110 00
51
0C
09
04
05
0F
0A
3F
13
02
13
13
75
13
13
13
2C
00
9C
70
2F
70
2F
00
00
00
9C
CB
9C
9C
13
9C
9C
9C
00
00
02
00
0D
00
0D
FC
FC
FC
02
0E
02
02
9C
02
02
02
FC
00
.
.
60
2C
1F
92
B8
C2
37
A4
8F
0B
7A
74
02
74
74
74
00
00
0C
0F
03
04
0B
0B
20
30
13
15
01
13
13
13
13
13
00
00
70
00
AB
70
00
00
70
00
9C
9C
70
9C
9C
9C
9C
9C
00
00
00-A5
FC-39
0C-24
00-0C
FC-AE
FC-00
00-C6
FC-22
02-F5
02-4E
00-74
02-57
02-74
02-74
02-74
02-74
00-00
00-00
01
0A
03
05
0B
11
0C
05
02
15
13
02
13
13
13
13
00
00
70
2F
70
70
00
00
00
00
CB
9C
9C
B6
9C
9C
9C
9C
00
00
00
0D
00
00
FC
FC
FC
00
0E
02
02
0B
02
02
02
02
00
00
60
4D
9E
47
D8
AB
5A
00
2E
00
74
D5
BF
74
74
74
00
00
0C
3F
03
3F
18
0E
0C
00
03
5E
13
1F
04
13
13
13
00
00
70
00
70
00
70
00
70
00
CB
9C
9C
70
2F
9C
9C
9C
00
00
00
FC
00
FC
00
FC
00
00
0E
02
02
00
0D
02
02
02
00
00
Bild 1.9: Auszug aus der MS-DOS-Interruptvektor-Tabelle
Weiterhin haben sich die Entwickler von MS-DOS nicht an die Intel-Spezifikation
gehalten, wonach die ersten 32 Interrupts reserviert sind. Die folgende Tabelle zeigt die
Belegung der Interruptvektoren durch die Hardware, das BIOS und MS-DOS.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Ö-----Ú------Ú----------------------------------------------------Ì
° INT ° Adr ° Bemerkungen
°
û-----é------é----------------------------------------------------À
°
0 ° 00 ° Division durch Null
°
û-----é------é----------------------------------------------------À
°
1 ° 04 ° Single-Step-Interrupt (z.B. von DEBUG belegt)
°
û-----é------é----------------------------------------------------À
°
2 ° 08 ° NMI (per Hardware für Parity Error belegt)
°
û-----é------é----------------------------------------------------À
°
3 ° 0C ° Break-Point-Interrupt (z.B. von DEBUG belegt)
°
û-----é------é----------------------------------------------------À
°
4 ° 10 ° Arithmetik-Overflow
°
û-----é------é----------------------------------------------------À
°
5 ° 14 ° BIOS-Routine Print Screen
°
û-----é------é----------------------------------------------------À
°
6 ° 18 ° reserviert für Hardware (z.B. Mausabfrage beim
°
°
°
° Schneider PC)
°
û-----é------é----------------------------------------------------À
°
7 ° 1C ° reserviert für die Hardware
°
û-----é------é----------------------------------------------------À
°
8 ° 20 ° System-Zeit
(IRQ 0 Master PIC)
°
û-----é------é----------------------------------------------------À
°
9 ° 24 ° Tastatur-Interrupt
(IRQ 1 Master PIC)
°
û-----é------é----------------------------------------------------À
° 0A ° 28 ° reserviert für Hardware (IRQ 2 z.B. vom Slave PIC) °
û-----é------é----------------------------------------------------À
° 0B ° 2C ° reserviert für Hardware (IRQ 3 z.B. COM 2 beim AT) °
û-----é------é----------------------------------------------------À
° 0C ° 30 ° reserviert für Hardware (IRQ 4 z.B. COM 1 beim AT) °
û-----é------é----------------------------------------------------À
° 0D ° 34 ° reserviert für Hardware (IRQ 5 z.B. LPT 2 beim AT) °
û-----é------é----------------------------------------------------À
° 0E ° 38 ° Disketten-Controller-Interrupt (IRQ 6 Master PIC) °
û-----é------é----------------------------------------------------À
° 0F ° 3C ° reserviert für Hardware (IRQ 7 z.B. LPT 1 beim AT) °
óëëëëëÄëëëëëëÄëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëÂ
° 10 ° 40 ° BIOS-Bildschirm-Ausgabe
°
û-----é------é----------------------------------------------------À
° 11 ° 44 ° BIOS-Konfiguration-Test
°
û-----é------é----------------------------------------------------À
° 12 ° 48 ° BIOS-Speichergröße ermitteln
°
û-----é------é----------------------------------------------------À
° 13 ° 4C ° BIOS-Disketten und Disk I/O
°
û-----é------é----------------------------------------------------À
° 14 ° 50 ° BIOS-serielle Schnittstelle
°
û-----é------é----------------------------------------------------À
° 15 ° 54 ° BIOS (IBM-PC - Kassettenrecorder-Abfrage)
°
°
°
°
(IBM-AT - Extended-Memory-Zugriffe )
°
°
°
° (Schneider PC - NVR und Graphic-Backplanes)
°
û-----é------é----------------------------------------------------À
° 16 ° 58 ° BIOS-Tastaturroutinen
°
û-----é------é----------------------------------------------------À
° 17 ° 5C ° BIOS-Druckerroutinen
°
û-----é------é----------------------------------------------------À
° 18 ° 60 ° IBM-PC - ROM-Basic aktivieren, sonst unbelegt
°
û-----é------é----------------------------------------------------À
° 19 ° 64 ° BIOS-System-Warmstart
°
û-----é------é----------------------------------------------------À
° 1A ° 68 ° BIOS-Zeit
°
û-----é------é----------------------------------------------------À
° 1B ° 6C ° Tastatur-Break-Interrupt
°
û-----é------é----------------------------------------------------À
° 1C ° 70 ° Timer-Interrupt (Folgeroutine)
°
û-----é------é----------------------------------------------------À
° 1D ° 74 ° Pointer auf Tabelle mit Bildschirmparametern
°
û-----é------é----------------------------------------------------À
° 1E ° 78 ° Pointer auf Tabelle mit Floppy-Drive-Parametern
°
û-----é------é----------------------------------------------------À
° 1F ° 7C ° Pointer auf Tabelle mit Bildschirm-Grafikzeichen
°
óëëëëëÄëëëëëëÄëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëÂ
° 20 ° 80 ° DOS Program Terminate
°
û-----é------é----------------------------------------------------À
° 21 ° 84 ° DOS Function Request
°
û-----é------é----------------------------------------------------À
° 22 ° 88 ° DOS Terminate Process Exit Address
°
û-----é------é----------------------------------------------------À
° 23 ° 8C ° DOS Control-C-Handler Address
°
û-----é------é----------------------------------------------------À
° 24 ° 90 ° DOS Critical Error Handler Address
°
û-----é------é----------------------------------------------------À
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
41
DOS Programmierhandbuch
° 25 ° 94 ° DOS Disk Absolute Read
°
û-----é------é----------------------------------------------------À
° 26 ° 98 ° DOS Disk Absolute Write
°
û-----é------é----------------------------------------------------À
° 27 ° 9C ° DOS Program Terminate and Stay Resident
°
û-----é------é----------------------------------------------------À
°---- °------° INT 28 - INT 3F reserviert für DOS (undokumentiert)°
û-----é------é----------------------------------------------------À
° 28 ° A0 ° Idle Flag
°
° 29 ° A3 ° Character Output
°
°
. °
. ° reserviert
°
° 2E ° B8 ° EXEC-CALL
°
° 2F ° BC ° Multiplexerinterrupt
°
°
. °
. ° reserviert
°
° 33 ° CC ° Maustreiber
°
°
. °
. ° reserviert
°
° 34 ° D0 ° Turbo Lang. Floating Point Emulator (Opcode D8H) °
° 35 ° D4 ° Turbo Lang. Floating Point Emulator (Opcode D9H) °
° 36 ° D8 ° Turbo Lang. Floating Point Emulator (Opcode DAH) °
° 37 ° DC ° Turbo Lang. Floating Point Emulator (Opcode DBH) °
° 38 ° E0 ° Turbo Lang. Floating Point Emulator (Opcode DCH) °
° 39 ° E4 ° Turbo Lang. Floating Point Emulator (Opcode DDH) °
° 3A ° E8 ° Turbo Lang. Floating Point Emulator (Opcode DEH) °
° 3B ° EC ° Turbo Lang. Floating Point Emulator (Opcode DFH) °
° 3C ° F0 ° Turbo Lang. Floating Point Emulator (mit ES:)
°
° 3D ° F4 ° Turbo Lang. Floating Point Emulator (FWAIT..)
°
° 3E ° F8 ° Turbo Lang. Floating Point Emulator
°
° 3F ° FC ° Overlay Manager Interrupt
°
û-----é------é----------------------------------------------------À
°
°
° INT 40 - INT 5F reserviert von IBM für zukünftige °
°
°
° (BIOS-)Erweiterungen
°
° 40 ° 100 ° Disktreiber bei Festplattensystemen
°
° 41 ° 104 ° Parametertabelle Festplatte Drive 0
°
° 42 ° 108 ° Videostatustabelle EGA-Karten
°
° 43 ° 10C ° EGA-Grafik-Zeichensatztabelle
°
° 44 ° 110 ° EGA-Zeichengenerator
°
° 45 ° 114 ° reserviert
°
° 46 ° 118 ° Parametertabelle Festplatte Drive 1
°
°
. °
. ° reserviert
°
° 4A ° 128 ° Timer Alarm (BIOS)
°
°
. °
. ° reserviert
°
° 50 ° 140 ° Timer Alarm (BIOS)
°
°
. °
. ° reserviert
°
° 5F ° 17F ° reserviert
°
û-----é------é----------------------------------------------------À
° 60 ° 180 ° frei für Anwenderprogramme und Erweiterungen
°
°
. °
. ° (beim PC sind die Interrupts bis 7F frei für
°
°
. °
. ° Anwenderprogramme). Die Interrupts werden teil°
°
. °
. ° weise von Netzwerktreibern und VGA-Karten be°
°
. °
. ° nutzt.)
°
° 67 ° 19F ° EMS-Treiber
°
û-----é------é----------------------------------------------------À
° 68 ° 1A0 ° Diese Interrupts sind beim PC frei für Anwender°
°
. °
. ° programme. (Bei späteren Versionen sind sie als
°
° 6F ° 1BF ° unbenutzt markiert)
°
û-----é------é----------------------------------------------------À
° 70 ° 1C0 ° IRQ-8-Eingang (REAL Time Clock beim AT)
°
û-----é------é----------------------------------------------------À
° 71 ° 1C4 ° IRQ-9-Eingang (BIOS Redirect beim AT)
°
û-----é------é----------------------------------------------------À
° 72 ° 1C8 ° IRQ-10-Eingang (z.B. COM 3 beim AT)
°
û-----é------é----------------------------------------------------À
° 73 ° 1CC ° IRQ-11-Eingang (z.B. COM 4 beim AT)
°
û-----é------é----------------------------------------------------À
° 74 ° 1D0 ° IRQ-12-Eingang (Slave PIC beim AT)
°
û-----é------é----------------------------------------------------À
° 75 ° 1D4 ° IRQ-13-Eingang (Arithmetikprozessor beim AT)
°
û-----é------é----------------------------------------------------À
° 76 ° 1D8 ° IRQ-14-Eingang (Slave PIC beim AT)
°
û-----é------é----------------------------------------------------À
° 77 ° 1DC ° IRQ-15-Eingang (Slave PIC beim AT)
°
û-----é------é----------------------------------------------------À
° 78 ° 1E0 ° frei für Anwenderprogramme beim PC, beim AT als
°
°
. °
. ° unbenutzt markiert
°
° 7F ° 1FF °
°
û-----é------é----------------------------------------------------À
° 80 ° 200 ° reserviert für Basic (PC-DOS)
°
°
. °
. °
°
° 85 ° 217 °
°
û-----é------é----------------------------------------------------À
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
42
DOS Programmierhandbuch
43
° 86 ° 218 ° benutzt durch den Basic-Interpreter (PC-DOS)
°
°
. °
. °
°
° F0 ° 3C3 °
°
û-----é------é----------------------------------------------------À
° F1 ° 3C4 ° nicht benutzt
°
°
. °
. °
°
° FF ° 3FF °
°
Û-----Ù------Ù----------------------------------------------------ì
Tabelle 1.3: Belegung der 8086-Interrupts durch MS-DOS (PC-DOS)
Die ersten fünf Unterbrechungsvektoren (INT 0 bis INT 4) werden durch die 8088/8086und 80286-Prozessoren belegt. Nachfolgend findet sich eine Kurzbeschreibung der
Interrupt-Service-Routinen.
Division durch 0 (INT 0)
Der Vektor wird durch DOS initialisiert. Ein entsprechender Interrupt wird ausgelöst, falls
das Ergebnis eines Divisionsbefehls (DIV oder IDIV) ungültig ist (Division durch 0 oder
Überlauf). Das laufende Programm wird dann mit der Meldung:
Divide Overflow;
abgebrochen. Anschließend erscheint der MS-DOS Prompt (C>), um Bedienereingaben zu
erlauben.
Single Step (INT 1)
Die Intel-80x86-und 80x88-Prozessoren besitzen die Möglichkeit, Programme im
Einzelschrittbetrieb abzuarbeiten. Sobald das Trap Flag gesetzt ist, führt der Prozessor
nach jedem Befehl einen INT 1 aus. Der Interruptvektor kann dann auf eine Routine
zeigen, die die Registerbelegung und den letzten Befehl auswertet. Der Vektor wird von
DOS immer so initialisiert, daß er auf eine IRET-Routine zeigt. Sollte ein Programm den
Single-Step-Mode aktivieren, bleibt dies dann ohne Folgen, da nach jedem Interrupt das
Programm an der alten Stelle fortgesetzt wird. Lediglich die Ablaufgeschwindigkeit
verringert sich. Das DOS-Hilfsprogramm DEBUG benutzt diesen Interrupt für die Traceund Procedure-Befehle, um so den Programmablauf anzuzeigen.
NMI (Non Maskable Interrupt INT 2)
Dieser Interrupt wird durch einen externen Signaleingang aktiviert und kann nicht durch
den CLI (Clear Interrupt Enable Flag)-Befehl gesperrt werden. Bei vielen PCs wird der
Interrupt zur Anzeige von Speicherfehlern benutzt. Der RAM-Bereich ist hierfür mit einer
einfachen Paritätsprüfung ausgestattet, die bei Fehlern den NMI-Eingang des Prozessors
setzt. Der INT 2 aktiviert eine BIOS-Routine, die mit der Meldung:
Parity Check 1 oder Parity Check 2
reagiert und anschließend das Interruptsystem sperrt und den Prozessor mit einem HLTBefehl stoppt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
44
Break-Point-Interrupt (INT 3)
Neben den Interrupts, die intern durch den Prozessor ausgelöst werden (INT 0 ...), sowie
den externen Interupts (NMI, INTR), besteht die Möglichkeit per Software eine
Unterbrechung zu erzeugen. Diese Unterbrechung wirkt im Programm wie ein Sprung zu
einer Speicherstelle, wobei aber die Konditionen für Interrupts gelten. Ein SoftwareInterrupt läßt sich deshalb nicht sperren. Für einen Software-Interrupt sind normalerweise
zwei Operationscodebyte notwendig, was im Gegensatz zu einem FAR CALL einige Byte
spart. Andererseits sind zwei Byte zum Setzen von Unterbrechungspunkten beim
Programmtest noch zuviel. Hierfür existiert deshalb ein Interrupt (INT 3), der sich durch
ein Opcodebyte aktivieren läßt. DOS initialisiert den Interruptvektor so, daß er auf eine
IRET-Anweisung zeigt. Das MS-DOS-Hilfsprogramm DEBUG benutzt den INT 3 zur
Erzeugung von Breakpoints. Hierzu wird an der betreffenden Stelle der Opcode durch
einen INT 3 ausgetauscht. Der MS-DOS-Debugger kann bis zu 10 Unterbrechungspunkte
gleichzeitig verwalten.
Overflow (INT 4)
Diese Unterbrechung wird ausgeführt, falls in einem Programm der Befehl INTO (Interrupt
if Overflow) auftritt. MS-DOS setzt den Vektor auf eine IRET-Anweisung, da die
Behandlung von Overflows Aufgabe der Anwendersoftware ist.
Systemzeit 8253 Timer (INT 8)
Der Timer des IBM-PC unterbricht über den INT 8 das laufende Programm alle 5/91
Sekunden (zirka 18,2mal). Innerhalb dieser Service-Routine werden die Speicherzellen für
Timer Low und Timer High erhöht. Beim 24-Stunden-Übertrag wird das Overflow Flag
gesetzt und die Zeit wird für zirka 9,65 Sekunden angehalten. Dies ist erforderlich, um die
Gangabweichung der Uhrzeit halbwegs zu korrigieren. Allerdings können bei kompatiblen
PCs andere Taktraten als 5/91 Sek. gelten.
Tastatur (INT 9)
Das BIOS enthält eine Service-Routine, die die Kommunikation mit der Tastatur über
diesen Interrupt abwickelt. Dieser Interrupt ist durch die Anwendersoftware kaum nutzbar
und wird deshalb nicht weiter besprochen.
Diskette (INT 0E)
Hier sind die Interrupt-Service-Routinen für die Kommunikation mit dem
Diskettencontroller abgelegt. Dieser Interrupt ist ebenfalls per Anwenderprogramm kaum
zu nutzen, weshalb er nicht weiter besprochen wird.
Aus dieser Tabelle geht weiterhin hervor, daß fast alle der von Intel reservierten Interrupts
durch das BIOS oder MS-DOS mit anderen Funktionen belegt wurden. Dies bringt bereits
beim 80286 Probleme, wie ein Vergleich mit Tabelle 1.1 zeigt. Da die Interrupts 5 bis 7
belegt oder für Hardwarezwecke reserviert sind, läßt sich der 80286 nicht im Protected
Mode betreiben, da hier andere Bedingungen gelten. Der INT 15 ist beim IBM-PC noch für
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
45
das Kassettenrecorder-Interface reserviert. Moderne PCs besitzen keinen Recorder, so daß
der Interrupt für andere Zwecke verwendet wird. Beim AT liegt hier zum Beispiel der
BIOS-Einsprung für Schreib-Lese-Zugriffe auf dem Extended Memory Bereich (EMS).
In den nachfolgenden Kapiteln werden die Schnittstellen zu den BIOS- und DOS-Interrupts
noch detaillierter behandelt.
1.7 Der BIOS-Datenbereich
An die Interruptvektor-Tabelle schließt sich ein Datenbereich von 256 Byte an, in dem das
BIOS bestimmte Systemdaten verwaltet. Leider gibt die von Microsoft veröffentlichte
Dokumentation kaum Informationen über den Aufbau der Datenstrukturen. Dies ist
einerseits sinnvoll, da ja das BIOS prinzipiell die Verwaltung der Daten übernimmt. Da
andererseits die Entwicklung neuer BIOS-Versionen auf die Kompatibilität zum OriginalIBM-PC-BIOS Rücksicht nehmen muß, bleibt die Belegung in der Regel erhalten.
Aus diesem Grunde wird nachfolgend der Aufbau dieses Datenbereiches, sofern er bekannt
ist, aufgezeigt. Es sei aber nochmals darauf hingewiesen, daß es sich bei der Aufstellung
um nicht von Microsoft dokumentierte Daten handelt, die nicht bei jedem PC stimmen
müssen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Ö------------Ú----------------------------------------------------Ì
°Adr 0:Ofs. ° Bemerkungen
°
û------------é----------------------------------------------------À
°
0400 ° Port-Adresse COM1 (Wert normal = 03F8H)
°
°
0401
°
°
û------------é----------------------------------------------------À
°
0402 ° Port-Adresse COM2 (Wert normal = 02F8H)
°
°
0403
°
°
û------------é----------------------------------------------------À
°
0404 ° Port-Adresse COM3 (erst ab DOS 3.3 benutzt)
°
°
0405
°
°
û------------é----------------------------------------------------À
°
0406 ° Port-Adresse COM4 (in DOS nicht benutzt)
°
°
0407
°
°
û------------é----------------------------------------------------À
°
0408 ° Port-Adresse LPT1 (Wert normal = 03BCH)
°
°
0409
°
°
û------------é----------------------------------------------------À
°
040A ° Port-Adresse LPT2 (Wert normal = 03B8H)
°
°
040B
°
°
û------------é----------------------------------------------------À
°
040C ° Port-Adresse LPT3 (Wert normal = 02B8H)
°
°
040D
°
°
û------------é----------------------------------------------------À
°
040E ° Port-Adresse LPT4 (in DOS nicht benutzt )
°
°
040F
°
°
û------------é----------------------------------------------------À
°
0410 ° Equipment-Flag (Hardwarekonfiguration)
°
°
0411
°
°
û------------é----------------------------------------------------À
°
0412
° Test-Flag während der Initialisierung
°
û------------é----------------------------------------------------À
°
0413 ° freie Speicherkapazität in Kbyte (beim PC =
°
°
0414
° Kapazität auf der Systemplatine)
°
û------------é----------------------------------------------------À
°
0415 ° Speicher in Kbyte auf Erweiterungskarten (PC), beim°
°
0416
° AT Fehlerflag für Herstellercodes und das Err-Flag °
û------------é----------------------------------------------------À
°
0417 ° Tastatur-Flag
°
°
0418
°
°
û------------é----------------------------------------------------À
°
0419
° ALT-Keypad-Flag (Status CTRL, ALT, Shift etc.)
°
û------------é----------------------------------------------------À
°
041A ° Zeiger auf den Beginn des Tastaturpuffers
°
°
041B
°
°
û------------é----------------------------------------------------À
°
041C ° Zeiger auf das Ende des Tastaturpuffers
°
°
041D
°
°
û------------é----------------------------------------------------À
°
041E ° Tastatur-Ringpuffer von 32 Byte für 16 Tastatur°
°
.
° codes à 2 Byte
°
°
043D
°
°
û------------é----------------------------------------------------À
°
043E
° Seek Status 1 Bit per Floppy Drive, 0 recalibrate °
û------------é----------------------------------------------------À
°
043F
° Drive Motor Status, 1 Bit per Drive, 1 = Motor on °
°
° Bit 7 = 1 -> Write in Progress
°
û------------é----------------------------------------------------À
°
0440
° Count Down Value Motor off
°
û------------é----------------------------------------------------À
°
0441
° Status of last Operation
°
û------------é----------------------------------------------------À
°
0442 ° Status des Floppy Disk Controllers 765
°
°
.
°
°
û------------é----------------------------------------------------À
°
0449
° CRT-Mode
°
û------------é----------------------------------------------------À
°
044A ° Zahl der Bildschirmspalten
°
°
044B
°
°
û------------é----------------------------------------------------À
°
044C ° Länge der Bildschirmseite für den Refresh
°
°
044D
°
°
û------------é----------------------------------------------------À
°
044E ° Startadresse (Offset) Bildschirmseite, die
°
°
044F
° refresht werden soll
°
û------------é----------------------------------------------------À
°
0450 ° Cursorposition Bildschirmseite 1
°
°
0451
°
°
û------------é----------------------------------------------------À
°
0452 ° Cursorposition Bildschirmseite 2
°
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
46
DOS Programmierhandbuch
°
0453
°
°
û------------é----------------------------------------------------À
°
0454 ° Cursorposition Bildschirmseite 3
°
°
0455
°
°
û------------é----------------------------------------------------À
°
0456 ° Cursorposition Bildschirmseite 4
°
°
0457
°
°
û------------é----------------------------------------------------À
°
0458 ° Cursorposition Bildschirmseite 5
°
°
0459
°
°
û------------é----------------------------------------------------À
°
045A ° Cursorposition Bildschirmseite 6
°
°
045B
°
°
û------------é----------------------------------------------------À
°
045C ° Cursorposition Bildschirmseite 7
°
°
045D
°
°
û------------é----------------------------------------------------À
°
045E ° Cursorposition Bildschirmseite 8
°
°
045F
°
°
û------------é----------------------------------------------------À
°
0460 ° Cursorgröße in Rasterzeilen
°
°
0461
°
°
û------------é----------------------------------------------------À
°
0462
° Nummer der aktuellen Bildschirmseite
°
°
0463 ° Basis-I/O-Adresse des aktiven Bildschirmadapters
°
û------------é----------------------------------------------------À
°
0464
°
°
û------------é----------------------------------------------------À
°
0465
° Bildschirmmode des 3x8-Registers
°
û------------é----------------------------------------------------À
°
0466
° aktuelle Farbpalette beim Color Graphics Adapter
°
û------------é----------------------------------------------------À
°
0467 ° Taktlänge Kassettenrecorderaufzeichnung (IBM-PC)
°
°
0468
° Zeiger auf Zusatz ROM-Initialisierung
(IBM-AT)
°
û------------é----------------------------------------------------À
°
0469 ° CRC-Register Kassettenaufzeichnung (IBM-PC)
°
°
046A
° Zeiger auf das I/O-ROM-Segment
(IBM-AT)
°
û------------é----------------------------------------------------À
°
046B
° letzter Eingabewert Kassettenaufzeichnung (IBM-PC) °
°
° Interruptflag (IBM-AT)
°
û------------é----------------------------------------------------À
°
046C ° Timer Low Word
°
°
046D
°
°
û------------é----------------------------------------------------À
°
046E ° Timer High Word
°
°
046F
°
°
û------------é----------------------------------------------------À
°
0470
° Timer Overflow Byte
°
û------------é----------------------------------------------------À
°
0471
° Break-Flag: Bit 7 = 1 Break-Taste gedrückt
°
û------------é----------------------------------------------------À
°
0472 ° Tastatur-Reset-Flag; Wert = 1234H -> Reset
°
°
0473
°
°
û------------é----------------------------------------------------À
°
0474
° unbelegt beim PC mit Diskettenlaufwerken
°
°
° Disk Status beim PC/AT mit Harddisk
°
û------------é----------------------------------------------------À
°
0475
° unbelegt beim PC mit Diskettenlaufwerken
°
°
° Harddisk-Nummer beim PC/AT mit Harddisk
°
û------------é----------------------------------------------------À
°
0476
° unbelegt beim PC mit Diskettenlaufwerken
°
°
° Kontrollflag beim PC/AT mit Harddisk
°
û------------é----------------------------------------------------À
°
0477
° unbelegt beim PC mit Diskettenlaufwerken
°
°
° Portadresse Disk AUS beim PC/AT mit Harddisk
°
û------------é----------------------------------------------------À
°
0478° unbelegt beim PC
°
°
047B
° Printer (LPT) Time - Out bei neueren BIOS-ROMs
°
û------------é----------------------------------------------------À
°
047C° unbelegt beim PC
°
°
047F
° RS 232 (COM) Time - Out bei neueren BIOS-ROMs
°
û------------é----------------------------------------------------À
°
0480
° Zusatztastatur Pufferanfang
°
û------------é----------------------------------------------------À
°
0482
° Zusatztastatur Pufferende
°
û------------é----------------------------------------------------À
°
0484° -°
°
0486
°
°
û------------é----------------------------------------------------À
°
0487
° EGA-Video-Mode
°
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
47
DOS Programmierhandbuch
48
û------------é----------------------------------------------------À
°
0488
° EGA-Statusbyte
°
û------------é----------------------------------------------------À
°
0489° -°
°
048A
°
°
û------------é----------------------------------------------------À
°
048B
° letzte Datentransferrate bei Floppy Disk
°
û------------é----------------------------------------------------À
°
048C
° Statusbyte-Festplatte
°
û------------é----------------------------------------------------À
°
048D
° Errorregister-Festplatte
°
û------------é----------------------------------------------------À
°
048E
° Interruptflag-Festplatte
°
û------------é----------------------------------------------------À
°
048F
° Kontrollflag-Festplatte
°
û------------é----------------------------------------------------À
°
0490
° Drive 0 - 90 Medium-Status (zusätzl. Disk-Daten)
°
û------------é----------------------------------------------------À
°
0491
° Drive 1 - 91 Medium-Status (zusätzl. Disk-Daten)
°
û------------é----------------------------------------------------À
°
0492
° Drive 0 - 90 Start-Status (zusätzl. Disk-Daten)
°
û------------é----------------------------------------------------À
°
0493
° Drive 1 - 91 Start-Status (zusätzl. Disk-Daten)
°
û------------é----------------------------------------------------À
°
0494
° Drive 0 - 90 aktueller Zylinder
°
û------------é----------------------------------------------------À
°
0495
° Drive 1 - 91 aktueller Zylinder
°
û------------é----------------------------------------------------À
°
0496
° Tastaturflag Byte 3 beim AT
°
û------------é----------------------------------------------------À
°
0497
° Tastatur-LED-Anzeigeflag
°
û------------é----------------------------------------------------À
°
0498° Offsetadresse User Wait Flag (Real Time Clock)
°
°
0499
°
°
û------------é----------------------------------------------------À
°
049A° Segmentadresse User Wait Flag (Real Time Clock)
°
°
049B
°
°
û------------é----------------------------------------------------À
°
049C° Low Word User Wait Flag
(Real Time Clock)
°
°
049D
°
°
û------------é----------------------------------------------------À
°
049E° High Word User Wait Flag
(Real Time Clock)
°
°
049F
°
°
û------------é----------------------------------------------------À
°
04A0
° Wait Aktiv Flag
(Real Time Clock)
°
û------------é----------------------------------------------------À
°
04A1 ° reserviert
°
°
04EF
°
°
û------------é----------------------------------------------------À
°
04F0 ° Kommunikationsbereich für Zwischenanwendungen
°
°
04FF
° (Programm- und Intertask-Kommunikation)
°
Û------------Ù----------------------------------------------------ì
Tabelle 1.4: Belegung des BIOS-Datenbereiches
Interessant sind Adressen, die über die Systemkonfiguration Auskunft geben. Es zeigt sich,
daß die Entwickler von MS-DOS ursprünglich im BIOS die Unterstützung von je vier
seriellen und parallelen Schnittstellen vorgesehen hatten, die dann allerdings nicht
implementiert wurden.
Für die Bildschirmdarstellung sind insgesamt 8 Seiten im BIOS reserviert. Dies resultiert
noch aus den Ursprüngen der PCs, als man mit TV-Sichtgeräten nur 25 Zeilen zu je 40
Zeichen darstellen konnte. Die Betriebsart läßt sich mit dem Kommando:
MODE 40
selektieren. Die Größe eines Zeichens wird in etwa verdoppelt. Bei Verwendung eines
Color-Graphics-Adapter (CGA) reichen die 16 Kbyte Speicher, um insgesamt 8
Bildschirmseiten anzulegen. Im 25 x 80-Zeichen-Modus sind immerhin noch 4 Seiten
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
49
wählbar. Nur im Grafikmodus und beim Monochromadapter ist die Darstellung auf eine
Seite begrenzt.
Auch die Lage des Tastaturpuffers mag für manche Anwendungen interessant sein.
Im Laufe der Zeit wurden weitere Datenbereiche belegt. So kamen beim Übergang vom PC
auf den AT die Echtzeituhr und die Festplatte hinzu, die eigene Datenbereiche belegen.
Ähnliches gilt für den Status der EGA-Karten, die den vormals unbelegten BIOSDatenbereich ab 0487H benutzen.
Die letzten 16 Byte sind als Kommunikationsbereich für Zwischenanwendungen reserviert.
Damit können zum Beispiel zwei Programme Daten ohne größeren Aufwand untereinander
austauschen, da ja der Datenbereich an einer absoluten Speicheradresse steht. Bei
umfangreicheren Daten reicht es, einen Adreßzeiger im BIOS-Datenbereich abzulegen.
Dieser läßt sich von allen Prozessen lesen. Weiterhin können residente Programme ihre
Signatur dort ablegen (1).
Der überwiegende Teil der Daten läßt sich per BIOS-Aufruf lesen oder modifizieren. So
existiert z.B. ein eigener BIOS-Aufruf, um die Systemkonfiguration zu lesen (2,3,4). Die
genaue Beschreibung dieser BIOS-Funktionen ist in einem getrennten Kapitel enthalten.
1.8 Der DOS-Datenbereich
Ein zweiter Datenbereich mit 256 Byte schließt sich an den BIOS-Datenbereich an. Dort
verwaltet MS-DOS seine Systemdaten. Auch hier gibt die von Microsoft veröffentlichte
Dokumentation kaum Informationen über den Aufbau der Datenstrukturen.
Aus diesem Grunde werden nachfolgend Auszüge aus der Belegung dieses Datenbereiches
aufgezeigt. Es sei auch hier darauf hingewiesen, daß es sich um nicht dokumentierte
Funktionen handelt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
50
Ö------------Ú---------------------------------------------------Ì
°Adr 0:Ofs. ° Bemerkungen
°
û------------é---------------------------------------------------À
°
0500
° Print Screen Status-Flag
°
°
°
0 Print Screen nicht aktiv oder fertig
°
°
°
1 Print Screen arbeitet gerade
°
°
° 255 Fehler in der Print-Screen-Funktion
°
û------------é---------------------------------------------------À
°
0501
° Durch Basic belegt (IBM-PC)
°
û------------é---------------------------------------------------À
°
0504
° Single Drive Mode Status Byte
°
°
°
0 Disklaufwerk A: zuletzt benutzt
°
°
°
1 Disklaufwerk B: zuletzt benutzt
°
û------------é---------------------------------------------------À
°
050F
° Durch Basic belegt (IBM-PC) 1 = Basic geladen
°
û------------é---------------------------------------------------À
°
0510 ° Durch Basic belegt (IBM-PC) Standard Segment
°
°
0511
°
°
û------------é---------------------------------------------------À
°
0512 ° Basic Interrupt Vektor für die CLOCK
°
°
0515
°
°
û------------é---------------------------------------------------À
°
0516 ° Basic Interrupt Vektor für Tastatur Break
°
°
0519
°
°
û------------é---------------------------------------------------À
°
051A ° Basic Interrupt Vektor für Disk Error
°
°
051D
°
°
û------------é---------------------------------------------------À
°
051E
° -°
°
0521
°
°
û------------é---------------------------------------------------À
°
0522
° DOS Diskparam. Tab. Steppertime = D, HD Unload = F°
°
0523
°
"
HD Load = 1, Mode = DMA
°
°
0524
°
"
Motor Wait
°
°
0525
°
"
n * 256 Byte pro Sektor
°
°
0526
°
"
Last Sector per Track
°
°
0527
°
"
GAP length ID-Data
°
°
0528
°
"
Disk Transfer length
°
°
0529
°
"
GAP length for Format
°
°
052A
°
"
Fill Byte for Format
°
°
052B
°
"
Head settle Time (ms)
°
°
052C
°
"
Motor Start Time (1/8) Sek.
°
û------------é---------------------------------------------------À
°
052D ° -°
°
052F
°
°
û------------é---------------------------------------------------À
°
0530 ° benutzt durch das Mode-Kommando
°
°
° in PC-DOS
°
°
°
°
°
0533
°
°
û------------é---------------------------------------------------À
°
0534 ° Belegung nicht bekannt
°
°
.
°
°
°
05FF
°
°
Û------------Ù---------------------------------------------------ì
Tabelle 1.5: Belegung des DOS-Datenbereiches
An der Systemadresse 0000:0500 befindet sich das Print-Screen-Status-Flag. Hier kann
leicht überprüft werden, ob die PrtScr-Funktion noch aktiv ist, oder ob beim letzten Aufruf
ein Fehler auftrat.
Der zweite interessante Bereich ist die Disk-Parameter-Tabelle, die üblicherweise ab
0000:0522 beginnt. Hier verwaltet MS-DOS die Einstellparameter für die
Diskettenlaufwerke. Zwar legt das BIOS bereits eine Tabelle an, aber DOS bietet die
Möglichkeit, mit Hilfe dieser Tabelle die Parameter an die Laufwerke anzupassen.
In verschiedenen PC-DOS-Dokumentationen wird erwähnt, daß der Bereich 0000:530 bis
0000:0533 durch das Mode-Programm belegt wird. Dies konnte aber bei MS-DOS nicht
eindeutig nachvollzogen werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
51
Der Bereich zwischen 600H und 6FFH ist in der Regel unbelegt. Sie können dies mit dem
DOS-DEBUG- oder MEM-Programm leicht verifizieren.
1.9 Die Funktion des Programmes IO.SYS (IBMBIO.COM)
Da MS-DOS (PC-DOS) ein hardwareunabhängiges Betriebssystem ist, muß eine
Anpassungssoftware zwischen Hard- und Software existieren. Diese Aufgabe übernimmt
das Programm IO.SYS bei MS-DOS oder IBMBIO.COM bei PC-DOS. Es stellt die
Verbindung zwischen der Hardware, den ROM-BIOS-Routinen und MS-DOS her.
Insbesondere besteht die Möglichkeit in IO.SYS Anpassungen an veränderte
Hardwarekonfigurationen vorzunehmen, ohne daß das BIOS-ROM geändert werden muß.
Dies hat sich als sehr hilfreich erwiesen, da sich damit Fehler innerhalb der ROM-BIOSRoutinen ausgleichen lassen.
Beim Programmstart lädt eine Routine im ROM-BIOS den Boot-Record von der
Systemdiskette in den Speicher. Dieses Boot-Programm prüft, ob die Dateien IO.SYS
(IBMBIO.COM) und MSDOS.SYS (IBMDOS.COM) auf der Diskette an bestimmten
Stellen vorhanden sind und lädt diese anschließend in den Speicher.
Dann wird das Programm IO.SYS gestartet, welches aus drei Teilen besteht:
·
Initialisierungsmodul
·
residenter Teil
·
SYSINIT
Zuerst wird ein Initialisierungsteil durchlaufen, der den Hardwarestatus ermittelt und die
Diskettenlaufwerke zurücksetzt. Diese Aufgabe wurde zwar bereits teilweise durch das
BIOS-ROM ausgeführt. Da aber im Laufe der Zeit immer neue Hardwarekomponenten
eingeführt werden, bietet eine Wiederholung die Möglichkeit, auch solche neuen
Komponenten zu unterstützen, deren Treiber nicht im BIOS-ROM stehen. Die Version 3.3
des Betriebssystems MS-DOS (PC-DOS) unterstützt z.B. erstmals 3,5-ZollDiskettenlaufwerke. Es ist nun ohne weiteres möglich, einen älteren PC auf DOS 3.3 mit
3,5-Zoll-Laufwerken hochzurüsten, ohne das BIOS-ROM auszutauschen. Die Anpassung
wird durch IO.SYS vorgenommen. Nur wer in DOS-Versionen unterhalb 3.2 diese
Laufwerke einsetzt, muß das BIOS selbst erw
itern.
Im nächsten Schritt sind die Einheitentreiber zu installieren. Hierfür kennt DOS zwei
Möglichkeiten. Der residente Teil von IO.SYS besteht im wesentlichen aus den
»residentenh Anweisungen der Form:
DEVICE = Treibername (ab DOS 2.0)
DEVICEHIGH = Treibername (ab DOS 5.0)
eintragen, die durch IO.SYS ausgewertet werden. Wird eine entsprechende Anweisung
gefunden, dann lädt IO.SYS diesen Treiber oberhalb des Programmes MSDOS.SYS in den
Speicher. Für diese Auswertung wird das Modul SYSINIT benötigt. SYSINIT bearbeitet
zuerst die installierbaren Treiber aus CONFIG.SYS, bevor es die Standardtreiber aus
IO.SYS konfiguriert. Diese Option ermöglicht die Installation zusätzlicher Treiber (Maus,
Plotter, etc.). Andererseits lassen sich damit die residenten Treiber aus IO.SYS leicht
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
52
DOS Programmierhandbuch
deaktivieren und durch eigene Routinen ersetzen. In einem weiteren Schritt wird der untere
Bereich der Interruptvektor-Tabelle (BIOS-Interrupts bis INT 1F) initialisiert.
Dann wird das Programm MSDOS.SYS (IBMBIO.COM) direkt an den residenten Teil von
IO.SYS verschoben (relocate) und gestartet, um DOS zu initialisieren. Ab DOS 5.0 läßt
sich ein Teil von MSDOS.SYS mit der Anweisung:
DOS=HIGH
in den HMA-Bereich (siehe Kapitel 12.2) verlagern. MSDOS.SYS gibt später die Kontrolle
an IO.SYS wieder zurück, damit der Kommandoprozessor COMMAND.COM geladen
werden kann. Im letzten Schritt wird durch einen Sprung zum ersten Codebyte des
Kommandoprozessors die Kontrolle an diesen übergeben.
Der Speicherbereich von IO.SYS enthält ab Offset 0 einen Sprung in den Programmbereich
mit dem Initialisierungscode. Da nach der Initialisierung dieser Bereich nicht mehr
notwendig ist, wird er als Datenbereich und für den Kommandoprozessor benutzt.
Nachfolgender Speicherauszug zeigt einen solchen Datenbereich:
-d 0:500 1B0
0000:0500 00
0000:0510 00
0000:0520 4D
0000:0530 00
0000:0540 43
0000:0550 00
0000:0560 44
0000:0570 00
0000:0580 4D
0000:0590 00
0000:05A0 44
0000:05B0 00
0000:05C0 47
0000:05D0 00
0000:05E0 47
0000:05F0 00
0000:0600 47
0000:0610 00
0000:0620 47
0000:0630 00
0000:0640 49
0000:0650 00
0000:0660 42
0000:0670 00
0000:0680 45
0000:0690 00
00
00
53
00
4F
00
4F
00
53
00
4F
00
45
00
45
00
45
00
45
00
4D
00
41
00
58
00
20
00
DF
00
4D
00
53
00
44
00
53
00
4D
00
4D
00
4D
00
4D
00
41
00
53
00
45
00
20
00
02
00
4D
00
20
00
4F
00
50
00
42
00
41
00
44
00
53
00
47
00
49
00
43
00
00
00
25
00
41
00
20
00
53
00
4C
00
4F
00
50
00
45
00
59
00
45
00
43
00
55
00
00
00
02
00
4E
00
20
00
20
00
55
00
4F
00
50
00
53
00
53
00
53
00
32
00
54
00
20
90
09
00
44
17
20
90
20
91
53
92
54
92
53
93
4B
93
20
94
20
95
20
95
45
D7
20-53
1B-21
2A-FF
00-49
20-43
92-49
20-53
1B-21
20-20
1B-21
20-20
1B-21
20-20
1B-21
20-20
1B-21
20-20
1B-21
20-20
1B-21
20-20
1B-21
20-20
1B-21
20-43
9D-06
59
00
50
0E
4F
0E
59
00
20
00
20
00
20
00
20
00
20
00
20
00
20
00
20
00
4F
0F
53
02
F6
0B
4D
19
53
25
20
2E
20
2F
20
30
20
31
20
32
20
34
20
35
20
36
4D
F4
25
00
01
00
20
00
25
00
10
00
10
00
10
00
10
00
10
00
10
00
10
00
10
00
20
0D
00
55
02
40
00
EC
00
55
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
1B
00
40
00
6F
00
5D
00
40
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
34
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
.. .. SYS%....
........!...U@..
MS..%..*.P......
....... ..@o..
COMMAND COM ....
....... ...]..
DOS
SYS%....
........!.%.U@..
MSDOS
.....
........!.......
DOSPLUS
.....
........!./.....
GEMBOOT
.....
........!.0.....
GEMAPPS
.....
........!.1.....
GEMDESK
.....
........!.2.....
GEMSYS
.....
........!.4.....
IMAGES
.....
........!.5.....
BASIC2
.....
........!.6.....
EXECUTE COM ....
.............4..
Bild 1.10: Speicherauszug aus dem DOS- und IO.SYS-Bereich
Ab Adresse 0:500 beginnt der DOS-Datenbereich, an den sich bei Adresse 0:700 das
Programm IO.SYS anschließt. Es ist deutlich zu sehen, daß der Speicherbereich ab 0:500
mit einem Auszug aus dem Inhaltsverzeichnis der Festplatte überschrieben wurde.
Lediglich innerhalb der DOS-Daten finden sich einige Parameter (z.B. die Disk-ParameterTabelle ab Adresse 0:522), die durch DOS neu initialisiert wurden.
Der residente Teil von IO.SYS befindet sich noch im Speicher und wird auch nicht
überschrieben. Dieser Teil bearbeitet die MS-DOS I/O-Aufträge und verwaltet die
Peripheriegeräte auf der hardwarenahen Ebene.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
53
1.10 Die Funktion des Programmes MSDOS.SYS
(IBMDOS.COM)
Das Programm MSDOS.SYS bildet den Kern des DOS-Systems und wird oberhalb des
IOSYS-Programmteils geladen. Dies erfolgt während des Startvorganges durch das
Bootprogramm. Die Lage im Hauptspeicher ist abhängig von der DOS-Version und kann
nicht allgemeingültig angegeben werden. Sobald die Initialisierung durch IO.SYS
abgeschlossen ist, wird der DOS-Initialisierungsteil von MSDOS.SYS aufgerufen. Er baut
die internen DOS-Arbeitstabellen auf, initialisiert die DOS-Interruptvektoren (INT 20 bis
INT 27). Ab den DOS-Versionen 3.1 bis 6.0 initialisiert MSDOS.SYS zusätzlich die
Interruptvektoren 0FH bis 3FH. Dann wird im niedrigsten freien Speicherbereich ein
Program-Segment-Prefix; (PSP) für den MS-DOS Kommandoprozessor eingerichtet. Dann
geht die Kontrolle wieder an das Programm IO.SYS zurück, welches nun den
Kommandoprozessor (COMMAND.COM) lädt.
Der Initialisierungsteil von MSDOS.SYS wird nicht mehr gebraucht, so daß dieser Bereich
teilweise als DOS-Datenpuffer genutzt wird. Der residente Teil von MSDOS.SYS enthält
das MS-DOS-Interface zu den Anwenderprogrammen (INT 20 bis INT 27). Hierunter
befinden sich die Dateiverwaltungsroutinen, die Datenaufbereitung (Blocking/ Deblocking)
für File I/O, sowie interne Funktionen. Diese Funktionen lassen sich durch
Anwenderprogramme ansprechen. Die Parameter finden sich in Registern oder
Kontrollblöcken. Das Programm transferiert diese Informationen in BIOS-Aufrufe und
wickelt den Auftrag ab. Eine genaue Beschreibung der Interrupts und Funktionen findet
sich in den nachfolgenden Abschnitten.
1.11 Die Funktion des Programmes COMMAND.COM
Die Verbindung zwischen Anwender und dem DOS-Betriebssystem wird durch den
Kommandoprozessor COMMAND.COM abgewickelt. Dieser besteht aus vier separaten
Teilen:
Ein residenter Teil findet sich oberhalb der DOS-Puffer und Datenbereiche. Dieser Teil
enthält die Interrupt-Service-Routinen für INT 22 (Terminate Adresse), INT 23 (ControlC-Handler) und INT 24 (Critical Error Handler).
Weiterhin ist ein Programm vorhanden, um den transienten Teil von COMMAND.COM
bei Bedarf nachzuladen. Dieser transiente Teil befindet sich am oberen Ende des RAMBereiches und kann von Anwenderprogrammen überschrieben werden. Über eine
Checksum-Prüfung läßt sich feststellen, ob Teile des Programmcodes überschrieben
wurden. Sobald ein Anwender- oder ein externes DOS-Programm beendet wurde, wird
diese Checksumme überprüft und der zerstörte Teil nachgeladen. Die Standard-DOSFehlerbehandlung (Abort, Retry, or Ignore) wird durch den residenten Teil (INT 24)
abgewickelt. In den DOS-Versionen 3.0 bis 6.0 enthält der residente Teil neben der
Routine zum Laden des transienten Teils von COMMAND.COM auch die EXECFunktion. Mit dieser Funktion lassen sich beliebige Programme laden und starten.
An den residenten Teil schließt sich ein Initialisierungsprogramm an, welches beim
Programmstart aktiviert wird. Dieser Initialisierungsteil wertet z.B. die Datei AUTOEXEC.BAT aus. Weiterhin bestimmt es das unterste freie Speichersegment, ab dem ein
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
54
Anwenderprogramm geladen werden kann. Diese Adresse liegt meist noch im
Initialisierungsteil von COMMAND.COM, da dieser nicht länger benötigt wird und
folglich von Anwenderprogrammen belegt werden kann.
Neben diesen zwei Teilprogrammen findet sich ein nicht residenter Teil von
COMMAND.COM, der immer an die RAM-Obergrenze geladen wird. Bei Bedarf kann
dieser Bereich durch Anwenderprogramme überschrieben werden. Sobald diese
Programme beendet sind, lädt der residente Teil von COMMAND den transienten Teil
nach. Es werden hier zwei Funktionen zur Verfügung gestellt:
Einmal findet sich hier der Kommandointerpreter, der den Systemprompt (z.B. C>)
ausgibt. Dann werden die Anwendereingaben decodiert. Dieser Teil enthält auch alle
internen DOS-Kommandos (DIR, DEL, COPY, etc.). Weiterhin findet sich hier der
BATCH-File-Prozessor. Sofern ein externes Kommando erkannt wurde, wird die EXECFunktion aufgerufen, um das Programm zu laden und auszuführen.
Weiterhin findet sich hier in DOS 2.x eine Routine, um externe Kommandos (COM- oder
EXE-Programme) zu laden und zu starten. Diese Routine übernimmt die Entrelativierung
von EXE-Dateien, da diese in ihrer Urform nicht lauffähig sind. Der Lader befindet sich im
höchsten Speicherbereich und wird durch die EXEC-Funktion aktiviert.
Die Größe des DOS-Kommandoprozessors (COMMAND.COM) ist abhängig von der
DOS-Version.
DOS 2.1
In dieser Version ist die EXEC-Funktion im transienten Teil von COMMAND.COM
enthalten, so daß 17 Kbyte permanent belegt werden.
DOS 3.0-6.0
Diese Versionen halten die EXEC-Funktion im residenten Teil von COMMAND.COM.
Die DOS 3.0 Version benötigt ebenfalls ca. 17 Kbyte Speicher für den
Kommandoprozessor, während ab DOS 3.1 zirka 23 Kbyte belegt werden.
2 Die BIOS-Funktionen
Zur Abwicklung der I/O-Anforderungen an die Hardware dient das BIOS (Basic Input
Output System). Es gliedert sich in einen Teil, der im IBM-PC im ROM ab der Adresse
FE00:0000 liegt und die hardwarenahen Funktionen übernimmt. Ein weiterer Teil wird
durch die Dateien IO.SYS (MS-DOS) oder IBMBIO.COM (PC-DOS) direkt oberhalb des
DOS-Datenbereichs geladen. Weiterhin blenden die Adapter (z.B. EGA-Karte) BIOSBereiche im Adressraum von C000H bis FDFFH ein.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
55
Das BIOS stellt Funktionen wie die Ausgabe von Zeichen auf dem Bildschirm, einlesen
des Tastaturpuffers, etc. zur Verfügung. Diese Funktionen werden per Interrupt aktiviert.
Im Rahmen der Systemprogrammierung sind sie oft nützlich und werden deshalb
nachfolgend kurz vorgestellt.
Es sei aber darauf hingewiesen, daß nicht alle BIOS-Funktionen bei jedem kompatiblen
Personalcomputer implementiert wurden. Neuere Geräte enthalten aber aus
Kompatibilitätsgründen meist BIOS-ROM's (AMI, PHÖNIX), die die beschriebenen
Schnittstellen aufweisen.
2.1 Print-Screen-Funktion (INT 5)
Diese Routine wird jedesmal aktiviert, wenn die Taste µPrtSc· gedrückt wurde. Das
Interruptsystem bleibt während der Abarbeitung freigegeben. Anhand des Status-Flags
(Adr 0000:0500) wird geprüft, ob der letzte Aufruf erfolgreich beendet wurde. Ist das Flag
<> 0, bricht die Routine ab. Das Modul verwendet den INT 10 zur Ausgabe der einzelnen
Zeichen auf dem Bildschirm. Die benutzten Register (AX, BX, CX, DX, DS) werden beim
Aufruf gesichert, während die restlichen Register zerstört werden.
2.2 BIOS-Bildschirmausgabe (INT 10)
Diese Funktion erlaubt die Ansteuerung des Bildschirmadapters zur Cursoreinstellung,
Zeichenausgabe, Bildscroll etc.). Die Register CS, SS, DS, ES, BX, CX und DX bleiben
beim Aufruf erhalten, während die restlichen Registerinhalte zerstört werden. An Hand der
Information aus dem BIOS-Konfigurationswort ermittelt die Routine die Adresse des
Bildschirmadapters und schreibt den Wert (B000,B800,...) in das Register ES. Ist im
System eine EGA-Karte vorhanden, befindet sich das BIOS zur Bildschirmsteuerung auf
dieser Karte. Beim Systemstart wird der entsprechende Vektor von der POST-Routine
(Power-On-Systemstart) eingetragen (siehe Abschnitt über den Systemstart). Es gelten aber
die gleichen Funktionsschnittstellen wie bei den nachfolgend beschriebenen Routinen. Die
Auswahl der jeweiligen Unterfunktion wird durch das Register AH selektiert. Es sind
folgende Funktionen implementiert.
Bildschirmmodus wählen (AH = 00H)
Dieser Aufruf ermöglicht es, den Bildschirmmodus (Mono, Color, Grafik) einzustellen.
Der Wert des Registers AL selektiert den Modus.
Ö-------------------------------Ì
°
CALL: INT 10
°
°
°
° AH: 00H (Mode select)
°
° AL: Bildschirmmodus
°
û-------------------------------À
°
RETURN
°
° -°
Û-------------------------------ì
Die folgende Tabelle gibt die möglichen Einstellungen wieder.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
56
Register° Bildschirmmodus
--------é-------------------------------------AL = 0 ° Text 40 Zeichen x 25 Zeilen monochrom
AL = 1 ° Text 40x25 color
AL = 2 ° Text 80x25 monochrom
AL = 3 ° Text 80x25 color
AL = 4 ° Grafik 320x200 color
AL = 5 ° Grafik 320x200 monochrom
AL = 6 ° Grafik 640x200 monochrom
AL = 7 ° CRT Modus 80x25 monochrom (intern)
Tabelle 2.1: Auswahl des Bildschirmmodus per INT 10
Der Modus AL = 7 wird intern vom BIOS zur monochromen 80x25-Zeichen-Darstellung
benutzt. Bei Aufruf der Funktion AH = 0 wird der Bildschirm gelöscht.
Cursor-Größe definieren (AH = 01H)
Dieser Aufruf dient dazu, die Größe des sichtbaren Cursors zu definieren. Die Form ist
abhängig von der Zahl der Linien und wird durch das Register CX spezifiziert.
Startzeile
Endzeile
Ö----Ì
°
°
Û----ì
Cursorfeld aus n Linien
Bild 2.1: Aufbau des Cursorfeldes
Der Cursor kann dabei maximal die Größe eines Zeichenfeldes einnehmen. Bei der
Colordarstellung umfaßt ein Zeichen die Größe von 5x8 Punkten in einer 8x8-Matrix.
Beim Monochromadapter ist die Größe auf 5x14 Punkte erweitert. Der Cursor läßt sich nun
aus mehreren Zeilen innerhalb des Zeichenfeldes zusammensetzen.
Ö-------------------------------Ì
°
CALL: INT 10
°
°
°
° AH: 01H (Cursor Size)
°
° CH: Bit 0-4 Startzeile Cursor °
° CL: Bit 0-4 Endzeile Cursor
°
û-------------------------------À
°
RETURN
°
° -°
Û-------------------------------ì
Beim Coloradapter liegen die Werte zwischen 0 und 7, während sie beim
Monochromadapter zwischen 0 und 13 variieren dürfen.
Einen Blockcursor (Rechteck) erhält man mit den Werten:
CH
= 0
CL = 7
(Color)
CH = 0
CL = 13 (Mono)
Soll der Cursor durch zwei Striche am oberen und unteren Zeichenrand dargestellt werden,
gilt die Einstellung:
CH = 7
CL = 0
(Color)
CH = 13
CL = 0 (Mono)
Mit den Werten:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
CH = 6
CL = 7
(Color)
CH = 12
57
CL = 13 (Mono)
wird der Cursor als Unterstrich dargestellt. Diese unterschiedlichen Wertebereiche für den
Monochrom- und Coloradapter sind bei der Softwareerstellung zu beachten.
Bit 5,6 in CH werden bei einigen Grafikadaptern zum Ein- und Ausblenden des Cursors
benutzt. Es gilt folgende Vereinbarung:
Ö-------------------------------Ì
° Bit 6,5
°
û-------------------------------À
°
0 0: Cursor blinkend
°
°
0 1: Cursor statisch
°
°
1 0: Cursor statisch
°
°
1 1: Cursor ausgeschaltet °
Û-------------------------------ì
Bit 7 sollte beim Aufruf zu 0 gesetzt werden.Cursor positionieren (AH = 02H)
Der Cursor läßt sich mit dieser Funktion auf dem Bildschirm positionieren. Die
Koordinaten werden durch das DX-Register angegeben. Die Position (0,0) befindet sich in
der linken oberen Bildschirmecke.
Ö-------------------------------Ì
°
CALL: INT 10
°
°
°
° AH: 02H (Set Cursor)
°
° BH: Bildschirmseite
°
° DH: Zeilennummer
°
° DL: Spaltennummer
°
û-------------------------------À
°
RETURN
°
° -°
°
°
Û-------------------------------ì
Da die Colorkarte im Gegensatz zur Monochromkarte 16-Kbyte-Speicher enthält, ein
Textbildschirm aber nur 4 Kbyte belegt, sind insgesamt 4 Bildschirmseiten à 24x80
Zeichen möglich. Durch den Inhalt des BH-Registers wird die Bildschirmseite definiert, für
die die neue Cursorposition gilt. Das BIOS sieht im Datenblock insgesamt 8
Bildschirmseiten vor.
Dies resultiert aus der Tatsache, daß im 25x40-Zeichen-Modus insgesamt 8
Bildschirmseiten vorhanden sind. In der Praxis wird man jedoch meist die 25x80-ZeichenAnzeige verwenden. Bei Anwahl des Grafikmodus muß der Wert von BH = 0 gesetzt
werden, da hier nur eine Seite existiert.
Cursorposition ermitteln (AH = 03H)
Die Position des Cursors innerhalb einer Bildschirmseite läßt sich mit der Unterfunktion
AH = 3 abfragen. Das Register BH spezifiziert dabei die Bildschirmseite (bei Grafik = 0).
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
58
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: 03H (Get Cursor)
°
° BH: Bildschirmseite
°
û---------------------------------À
°
RETURN
°
°
°
° DH: Zeilennummer
°
° DL: Spaltennummer
°
° CH: Startzeile Cursor
°
° CL: Endzeile Cursor
°
Û---------------------------------ì
Die Funktion liefert als Ergebnis Lage und Größe des Cursors zurück. Die Cursorgröße
findet sich analog zur Funktion AH = 1 im CX-Register.
Position Lichtgriffel (AH = 04H)
Diese BIOS-Funktion ermöglicht die Positionsbestimmung eines angeschlossenen
Lichtgriffels innerhalb des Bildschirms. Es werden folgende Parameter übergeben:
Ö---------------------------------Ì
°
CALL: INT 10
°
°
°
°
AH: 04H (Light Pen)
°
û---------------------------------À
°
Return:
°
°
°
° AH: 0 keine Position gefunden °
°
1 gültige Position
°
° DH: Zeilenposition (Textmodus) °
° DL: Spaltenposition (Textmodus)°
° CH: Rasterzeile (Grafikmodus) °
° BX: Rasterspalte (Grafikmodus) °
Û---------------------------------ì
In der Praxis dürften die wenigsten Geräte mit Lichtgriffeln ausgestattet sein. Die BIOSFunktion wurde beim IBM-PC vermutlich nur auf Grund der Möglichkeiten des
Anzeigebausteins eingeführt. Bei kompatiblen PCs ist dieser Aufruf nicht immer
implementiert.
Bildschirmseite selektieren (AH = 05H)
Befindet sich der Bildschirmadapter im Textmodus (siehe Funktion AH = 00H), läßt sich
mit dieser Funktion die aktuelle Bildschirmseite umschalten. Der Wert des Registers AL
bestimmt die Bildschirmseite.
Ö---------------------------------Ì
°
°
°
CALL: INT 10
°
°
°
° AH: 05H (Set Page)
°
° AL: Bildschirmseite
°
û---------------------------------À
°
RETURN
°
° -°
Û---------------------------------ì
Im 40x25-Zeichen-Modus existieren 8 Seiten, während der 80x25-Modus nur 4 Seiten
erlaubt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
59
Bildschirmfenster Scroll Up (AH = 06H)
Innerhalb der aktiven Bildschirmseite läßt sich im Textmodus ein Fenster einblenden, in
dem mit dieser Funktion der Text nach oben gescrollt wird. Dabei läßt sich der Ausschnitt
auf den kompletten Bildschirm vergrößern, um die Scrollfunktion auf die gesamte Seite
auszudehnen. Im unteren Fensterbereich werden beim Scroll Leerzeilen eingefügt. Es sind
folgende Register zu definieren:
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: 06H (Scroll Up)
°
° AL: Anzahl der Zeilen, um die
°
°
nach oben geschoben wird
°
° CH: Eckzeile oben links
°
° CL: Eckspalte oben links
°
° DH: Eckzeile unten rechts
°
° DL: Eckspalte unten rechts
°
° BH: Attribut der Leerzeile
°
û---------------------------------À
°
RETURN
°
° -°
----------------------------------ì
Der Bildschirm wird im 80x25-Modus in 25 Zeilen zu je 80 Spalten aufgeteilt.
Z
e
i
l
e
n
0 1 . . . Spalten
. . . . . . 79
Ö-Ú-Ú-------------------------Ú-Ú-Ì
0 û-é-é
-é-À
1 û-é Ö- - - - - - - - - -Ì
é-À
2 û
°
°
°
Fenster
°
°
Û- - - - - - - - - -ì
23 û-éé-é-À
24 Û-Ù-Ù-Ù-----------------------Ù-Ù-ì
Bild 2.2: Bildschirmraster im 80x25-Textmodus
Mit den Werten in den Registern CX, DX werden die beiden Eckpunkte des ausgewählten
Bildschirmfensters spezifiziert. Die Koordinaten (0,0),(24,79) setzen das Fenster über den
gesamten Bildschirm. Das AL-Register gibt an, wie viele Zeilen nach oben gescrollt
werden. Ist der Wert = 0, dann wird das Fenster gelöscht. Der gleiche Effekt tritt auf, wenn
der Wert in AL der Zeilenzahl innerhalb des Fensters entspricht, da ja von unten Leerzeilen
eingefügt werden. Mit dem Wert des Registers BH wird das Attribut der Leerzeile
(blinkend, unterstrichen, invers etc.) festgelegt. Die Kodierung der Attribute wird bei der
Unterfunktion (AH = 8) vorgestellt. Einige Implementierungen besitzen einen Bug, so daß
das BP-Register zerstört wird.
Bildschirmfenster Scroll Down (AH = 07H)
Analog der Unterfunktion (AH = 6) existiert die Möglichkeit, einen Bildschirmausschnitt
um mehrere Zeilen nach unten zu scrollen. Am oberen Fensterrand werden Leerzeilen
eingefügt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
60
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: 07H (Scroll Down)
°
° AL: Anzahl der Zeilen, um die
°
°
nach unten geschoben wird
°
° CH: Eckzeile Ecke oben links
°
° CL: Eckspalte Ecke oben links
°
° DH: Eckzeile Ecke unten rechts °
° DL: Eckspalte Ecke unten rechts °
° BH: Attribut der Leerzeile
°
û---------------------------------À
°
RETURN
°
° -°
Û---------------------------------ì
Es gelten die gleichen Bedingungen wie bei der Unterfunktion (AH = 6). Bei einigen
Versionen wird BP beim Aufruf zerstört.
Zeichen und Attribute an Cursorposition lesen (AH = 08H)
Im Textmodus läßt sich das an der aktuellen Cursorposition abgespeicherte Zeichen, sowie
das zugehörige Attributbyte lesen. Der Inhalt des BH-Registers spezifiziert dabei die
Bildschirmseite. Das Ergebnis wird im AX-Register zurückgegeben.
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: 08H (Get Char Attribut)
°
° BH: Bildschirmseite (Textmodus) °
û---------------------------------À
°
RETURN
°
° AL: gelesenes Zeichen
°
° AH: Attributbyte (Textmodus)
°
Û---------------------------------ì
In diesem Zusammenhang soll nun auf die Kodierung des Attributbytes eingegangen
werden.
7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙÚÙ-ÙÚÙÚÙÚÙ-ÙÚì
° Û-Ú-ì ° Û---Ù-°
°
Û-------°
Û-----------Û----------------
Vordergrundfarbe
Intensitätsbit
Hintergrundfarbe
Blink Bit
Bild 2.3: Kodierung des Attributbytes bei der Bildschirmausgabe
Ö---------------------------------------------Ì
° Darstellung
b7 b6 b5 b4 b3 b2 b1 b0 °
û---------------------------------------------À
° normal
b
0 0 0
i
1 1 1 °
° invers
b
1 1 1
i
0 0 0 °
° unterstrichen
b
0 0 0
i
0 0 1 °
° weiß & weiß
b
0 0 0
i
0 0 0 °
° schwarz & schw. b
1 1 1
i
1 1 1 °
û---------------------------------------------À
° normal : weißes Zeichen auf schwarzem
°
°
Hintergrund
°
° invers : schwarzes Zeichen auf weißem
°
°
Hintergrund
°
û---------------------------------------------À
° b = 1
Zeichen blinkend
°
° i = 1
erhöhte Intensität
°
Û---------------------------------------------ì
Tabelle 2.2: Attribute beim Monochromadapter
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
61
Ein am Bildschirm angezeigtes Zeichen besteht aus 2 Byte, dem Code für das Zeichen und
auf der folgenden Adresse das dazugehörige Attributbyte. Dieses Byte gibt an, wie das
Zeichen darzustellen ist (Intensität, unterstrichen, Farbe etc.). Für das Attributbyte ist
folgende Kodierung festgelegt.
Das Zeichen blinkt, falls Bit 7 = 1 gesetzt wird. Weiterhin kann über Bit 3 entschieden
werden, ob die Intensität erhöht (Bit 3 = 1) wird. Die weitere Darstellung hängt davon ab,
ob ein Monochrom- oder Coloradapter zur Verfügung steht. Die Tabelle 2.2 gibt die
Möglichkeiten für die Monochromdarstellung wieder.
7
R
G
B
I
R
G
B
°
Û---Ú---ì
Û-----Ú-----ì
°
°
Û-------- Vordergrundfarbe
°
Û----------------------- Hintergrundfarbe
Û------------------------------- Blinkbit
I
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
R
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
G
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
B
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
Schwarz
Blau
Grün
Cyanblau
Rot
Violett
Braun
Weiß
Dunkelgrau
Hellblau
Hellgrün
Hellcyanblau
Hellrot
Hellviolett
Gelb
Weiß
Vorder- und
Hintergrundfarbe
Vordergrundfarbe
Tabelle 2.3: Kodierung der Colorkarte
Colorkarten-Kodierung
An Hand dieser Tabelle lassen sich nun verschiedene Darstellungskombinationen
selektieren. Wird an Stelle der Monochromkarte ein Farbgrafikadapter verwendet, ergibt
sich eine andere Belegung, da hier 16 Vorder- und 8 Hintergrundfarben wählbar sind. Die
Farben werden dabei aus den Grundfarben Rot, Grün, Blau gemäß dem Schlüssel in
Tabelle 2.3 kombiniert.
Die 16 Vordergrundfarben setzen sich im Grunde aus den 8 Hintergrundfarben zusammen.
Durch das Intensitätsbit läßt sich aber eine zweite Palette mit hellen Farben erzeugen.
Zeichen und Attribut an Cursorposition schreiben (AH = 09H)
Diese Funktion erlaubt die Ausgabe von Zeichen in den Bildspeicher, wobei jedem
Zeichen ein Attributbyte angehängt wird. Es gelten folgende Registerbelegungen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
62
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: 09H (Set Char & Attribut) °
° AL: Zeichencode
°
° BH: Bildschirmseite der Aus°
°
gabe (nur im Textmodus)
°
° BL: Attributbyte des Zeichens °
° CX: Zahl der Kopien
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Die Kodierung des Attributbytes wurde bereits bei der Funktion (AH = 08) vorgestellt. Der
Wert im Register CX spezifiziert, wie oft das Zeichen ausgegeben wird. Der Wert 0003
schreibt das Zeichen ab der aktuellen Cursorposition 3 mal in die durch das Register BH
selektierte Ausgabeseite. Bei der Ausgabe wird der Cursor automatisch mitgeführt. Im
Graphikmode führt ein Wert von CX > Zahl der Spalten bis zum Zeilenende zu
unvorhersagbaren Resultaten.
Zeichen an Cursorposition schreiben (AH = 0AH)
Für die Fälle, wo lediglich Zeichen ohne Attributbyte ausgegeben werden müssen, läßt sich
diese Funktion benutzen. Es gilt folgende Registerbelegung:
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: 0AH (Write Char)
°
° AL: Zeichencode
°
° BH: Bildschirmseite der Aus°
°
gabe (nur im Textmodus)
°
° CX: Zahl der Kopien
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Das im Bildschirmspeicher gesetzte Attributbyte bleibt beim Schreibvorgang erhalten.
Schreib-Lese-Vorgänge im Grafikmodus lassen sich ebenfalls über die gerade vorgestellten
Funktionen abwickeln. Die Zeichengenerierung erfolgt aber aus dem BIOS-ROM.
Allerdings lassen sich so nur die ersten 128-ASCII-Zeichen ausgeben.
Sollen Sonderzeichen angezeigt werden, ist der Grafikvektor des INT 1F auf eine Tabelle
mit den entsprechenden Bitmustern umzulenken. Zumindest beim IBM-ROM (Vers. 24. 4.
81) tritt ein weiteres Problem auf. Falls der Wiederholfaktor in CX größer als 1 ist, werden
die Zeichen nur in der aktuellen Zeile korrekt ausgegeben. Eine Fortsetzung in der
Folgezeile erbringt dann keine korrekten Resultate mehr.
Farbpalette für Grafik setzen (AH = 0BH)
Im Grafikmodus lassen sich Vorder- und Hintergrundfarbe definieren. Es gilt folgende
Registerbelegung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
63
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: 0BH (Select Palette)
°
° BH: Code der zu setzenden
°
°
Farbpalette
°
° BL: Farbwert (0 - 15) für
°
°
diese Palette
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Über das BH-Register wird also spezifiziert, ob der Farbwert für die Vordergrund- oder
Hintergrundfarbe gilt. Mit dem Wert BH = 0 wird die Hintergrundfarbe selektiert. In BL ist
ein Wert von 0-15 aus der Farbscala (siehe Tabelle 2.3) zu definieren. Um die
Vordergrundfarbpalette zu definieren, ist BH = 1 zu setzen.
Mit dem Register BL wird dann die Farbpalette spezifiziert:
Ö-----Ú---------------------------------------Ì
° BL ° Palette
°
û-----é---------------------------------------À
° 0 ° Satz mit Grün, Rot, Braun, (Gelb)
°
û-----é---------------------------------------À
° 1 ° Satz mit Cyan, Magenta, Weiß
°
Û-----Ù---------------------------------------ì
Tabelle 2.4: Farbpaletten im Colormodus
Grafikpunkt setzen (AH = 0CH)
Im Grafikmodus lassen sich einzelne Punkte mit einer bestimmten Farbe setzen. Die
Koordinaten dieses Punktes werden in der Notation (Zeile, Spalte) angegeben. Die
folgende Tabelle gibt die gültigen Werte für die entsprechenden Farben wieder:
Ö-----------Ú---------Ú--------------Ì
° Auflösung ° Zeile ° Spalte
°
û-----------é---------é--------------À
° 320x200
° 0-199
° 0-319
°
û-----------é---------é--------------À
° 640x200
° 0-199
° 0-639
°
Û-----------Ù---------Ù--------------ì
Tabelle 2.5: Werte für Zeile und Spalte im Grafikmodus
Die Position (0,0) liegt in der linken oberen Bildschirmecke.
Um den Punkt zu setzen, sind die folgenden Register zu definieren.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
64
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: 0CH (Set Pixel)
°
° DX: Zeile
°
° CX: Spalte
°
° AL: Bit 0 - 6 : Farbe
°
°
Bit 7 = 1 Verknüpfung des °
°
Farbwertes über XOR mit
°
°
dem Punkt im RAM
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Interessant ist Bit 7 im AL-Register. Falls der vorgegebene Farbwert mit dem Wert im
Bildschirmspeicher übereinstimmt, läßt sich durch Setzen des Bit 7 = 1 der angegebene
Punkt löschen (XOR-Verknüpfung).
Grafikpunkt lesen (AH = 0DH)
Im Grafikmodus lassen sich einzelne Punkte mit dieser Funktion lesen. Dies ist z.B. dann
erforderlich, falls ein Punkt gelöscht werden soll (AH = 6) und die Farbe nicht bekannt ist.
Es sind die folgenden Register zu definieren.
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: 0DH (Get Pixel)
°
° DX: Zeile
°
° CX: Spalte
°
° AL: Bit 0 - 6 : Farbe
°
û---------------------------------À
°
RETURN
°
° AL: Farbwert des Punktes
°
Û---------------------------------ì
Der Farbwert wird im AL-Register zurückgegeben.
Zeichen ausgeben (AH = 0EH)
Mit dieser Funktion wird ein Teletype-Interface für die Bildschirmausgabe simuliert. Pro
ausgegebenem Zeichen wird der Cursor um eine Stelle weiter bewegt. Die Funktion
erwartet folgende Eingaben.
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: 0EH (Write Char)
°
° AL: Zeichen
°
° BL: Vordergrundfarbe im
°
°
Grafikmodus
°
° BH: Ausgabeseite im
°
°
Textmodus
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Der Bildschirmmodus (25x40 oder 25x80 Zeichen) muß separat über die Funktion AH = 0
gesetzt werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
65
Bildschirmstatus lesen (AH = 0FH)
Als Komplement zur Funktion AH = 0 (setze Bildschirmmodus) läßt sich hier der Modus
wieder auslesen. Die Funktion gibt folgende Werte zurück.
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: 0FH (Read Status)
°
û---------------------------------À
°
RETURN
°
° AL: Bildschirmmodus
°
° AH: Bildschirmspalten (40 /80) °
° BH: aktuelle Bildschirmseite
°
Û---------------------------------ì
Die Kodierung des Bildschirmmodus wurde bereits bei der Funktion AH = 0 vorgestellt.
Bei der Abfrage kann auch der Modus 7 (interne 80x25 Monochromdarstellung) auftreten.
Zeichenkette ausgeben (AH = 13H)
Die Aufrufe AH = 10H, 11H und 12H sind bisher nicht belegt. Bei einigen BIOSVersionen existiert allerdings noch der Aufruf 13H, um ganze Zeichenketten auszugeben.
Es gilt folgende Aufrufkonvention.
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: 13H (Write String)
°
° AL: Untercode
°
° CX: Stringlänge in Bytes
°
° DX: Cursorposition
°
° BH: Bildschirmseite
°
° BL: Attributcode
°
° ES:BP Anfangsadresse String
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Der Aufruf kennt mehrere Unterfunktionen, die über den Wert im AL-Register selektiert
werden.
AL = 0
Die Zeichenkette enthält nur die auszugebenden Zeichen. Im Register BL wird das
Attributbyte übergeben. Das Attribut gilt dann für den gesamten String. Die Ausgabe
erfolgt ab der aktuellen Cursorposition. Zeichen wie CR, LF, BS und Bell werden
innerhalb des Strings als Steuerzeichen für die Cursorbewegung interpretiert. Das DXRegister bleibt bei diesem Aufruf unbelegt.
AL = 1
Die Zeichenkette enthält ebenfalls nur die auszugebenden Zeichen, wobei das Attributbyte
per BL-Register gesetzt wird und für den ganzen String gilt. Bei diesem Aufruf wird der
Cursor vor der Ausgabe auf die in DX angegebene Position gesetzt.
AL = 2
In der Zeichenkette findet sich immer ein Zeichen mit dem jeweiligen Attribut im
folgenden Byte:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
66
DOS Programmierhandbuch
<Zeichen, Attribut, Zeichen, Attribut, . . . , Zeichen, Attribut>
Damit läßt sich jedes Zeichen mit Attributen belegen. Das BL-Register wird bei diesem
Aufruf nicht benutzt. Die Funktion gibt den String an der aktuellen Cursorposition aus, so
daß das Register DX ebenfalls nicht belegt ist.
AL = 3
Wie beim Aufruf AL = 2 finden sich im String sowohl Zeichen, als auch die zugehörigen
Attribute. Das BL-Register bleibt unbenutzt. Der Wert in DX setzt den Cursor vor der
Ausgabe auf die spezifizierte Position.
Weitere Informationen über die EGA-, VGA-BIOS-INT 10-Aufrufe finden sich im Kapitel
über die EGA-/VGA-Erweiterungen.
Microsoft Maustreiber EGA Support (AH = F0H)
Der Aufruf erlaubt ein Register der EGA-Chips auszulesen. Der Wert wird bei der
Rückgabe in BL übergeben. Der Code im Register BL definiert beim Aufruf die
Registernummer. Der Inhalt von DX definiert den Gruppenindex.
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: F0H (Read one Register)
°
° BL: Register Nummer
°
° BH: 00
°
° DX: Index Gruppe
°
û---------------------------------À
°
RETURN
°
° BL: Daten
°
Û---------------------------------ì
Für den Gruppenindex gelten folgende Belegungen:
Registergruppen
00H CRT Controller (25 Register) 3B4H
3D4H
08H Sequencer (5 Register) 3C4H
10H Graphik Controller (9 Register)
18H Attribut Controller (20 Register)
Mono Mode
Color Mode
3CEH
3C0H
Einzelregister
20H Ausgaberegister 3C2H
28H Controlregister (3BAH Mono Mode, 3DA Color Mode)
30H Graphik 1 Positions Register 3CCH
38H Graphik 2 Positions Register 3CAH
Die Belegung der Registernummer ist allerdings nicht genau bekannt.
Microsoft Maustreiber EGA Support (AH = F1H)
Der Aufruf erlaubt ein Register der EGA-Chips zu beschreiben. Beim Aufruf eines
Einzelregisters wird der Wert in BL übergeben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
67
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: F1H (Write one Register) °
° BL: Register Nummer
°
° BH: Ausgabewert
°
° DX: Index Gruppe
°
û---------------------------------À
°
RETURN
°
° BL: Daten
°
Û---------------------------------ì
Beim Aufruf eines Registers einer Gruppe, enthält BL die Registernummer und BH den
Wert.
Microsoft Maustreiber EGA Support (AH = F2H)
Der Aufruf erlaubt es, mehrere Register des EGA-Chips zu lesen. Die Werte werden in den
mit ES:BX übergebenen Puffer gespeichert.
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: F2H (Read Register Range) °
° CH: Register Startnummer
°
° CL: Registerzahl (> 1)
°
° DX: Index Gruppe
°
° ES:BX Pufferadresse
°
û---------------------------------À
°
RETURN
°
° ---°
Û---------------------------------ì
Für den Code in DX gilt dabei:
00H
08H
10H
18H
CRTC (3B4H Mono Mode, 3D4H Color Mode)
Sequencer 3C4H
Graphik Controller 3CEH
Attribut Controller 3C0H
Das genaue Format des Aufrufes ist allerdings nicht bekannt.
Microsoft Maustreiber EGA Support (AH = F3H)
Der Aufruf erlaubt es, mehrere Register des EGA-Chips zu beschreiben.
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: F3H (Write Register Range)°
° CH: Register Startnummer
°
° CL: Registerzahl (> 1)
°
° DX: Index Gruppe
°
° ES:BX Pufferadresse
°
û---------------------------------À
°
RETURN
°
° ---°
Û---------------------------------ì
Die Werte sind in dem mit ES:BX übergebenen Puffer abzuspeichern. Es gilt die gleiche
Belegung für DX wie bei der Funktion F2H.
Microsoft Maustreiber EGA Support (AH = F4H)
Der Aufruf erlaubt mehrere Register der EGA-Chips auszulesen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
68
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: F4H (Read Register Set) °
° CX: Register Zahl
°
° ES:DX Adresse Buffer
°
û---------------------------------À
°
RETURN
°
° ---°
Û---------------------------------ì
Die Werte werden bei der Rückgabe in den durch ES:DX adressierten Puffer gespeichert.
Für den Puffer gilt folgende Belegung:
Registergruppen
00H CRTC (3B4H Mono Mode, 3D4H Color Mode)
08H Sequencer (3C4H)
10H Graphik Controller (3CEH)
18H Attribut Controller (3C0H)
Einzelregister
20H Ausgaberegister 3C2H
28H Controlregister (3BAH Mono Mode, 3DA Color Mode)
30H Graphik 1 Positions Register 3CCH
38H Graphik 2 Positions Register 3CAH
Die Zahl der Registernummern ist allerdings nicht genau bekannt.
Microsoft Maustreiber EGA Support (AH = F5H)
Der Aufruf erlaubt mehrere Register der EGA-Chips zu beschreiben.
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: F1H (Write Register Set) °
° CX: Registerzahl
°
° ES:DX Adresse Buffer
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Es gelten die Aufrufkonvention wie bei der Funktion F4H.
Microsoft Maustreiber EGA Support (AH = F6H)
Der Aufruf stellt die ursprünglichen Werte wieder ein.
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: F6H (Revert to default)
°
û---------------------------------À
°
RETURN
°
° ---°
Û---------------------------------ì
Microsoft Maustreiber EGA Support (AH = F7H)
Der Aufruf erlaubt es, die Register mit den Werten der Tabelle zu initialisieren. Die
Adresse der Tabelle wird in ES:DX übergeben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
69
DOS Programmierhandbuch
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: F7H (Define default Table) °
° DX: Port Nummer
°
° ES:BX Tabelle
°
û---------------------------------À
°
RETURN
°
° ---°
Û---------------------------------ì
Für den Code in DX gilt dabei:
Registergruppen
00H CRT Controller (25 Register) 3B4H
3D4H
08H Sequencer (5 Register) 3C4H
10H Graphik Controller (9 Register)
18H Attribut Controller (20 Register)
Mono Mode
Color Mode
3CEH
3C0H
Einzelregister
20H Ausgaberegister 3C2H
28H Controlregister (3BAH Mono Mode, 3DA Color Mode)
30H Graphik 1 Positions Register 3CCH
38H Graphik 2 Positions Register 3CAH
Das genaue Format des Aufrufes ist allerdings nicht bekannt.
Microsoft Maustreiber EGA Support (AH = FAH)
Der Aufruf erlaubt die Prüfung, ob der Treiber aktiv ist.
Ö---------------------------------Ì
°
CALL : INT 10
°
°
°
° AH: FAH (Interrogate Driver) °
° BX: 0000
°
û---------------------------------À
°
RETURN
°
° BX: 0000 Treiber nicht da
°
° ES:BX Pufferadresse
°
°
°
Û---------------------------------ì
Ist BX nach dem Aufruf = 0, ist kein Treiber aktiv. Andernfalls enthält der Puffer (ES:BX)
die EGA Register Interface Versions Nummer. Byte 0 enthält die Hauptversionnummer,
während Byte 2 die Unterversionsnummer enthält.
Die Funktionen des INT 10 werden durch das BIOS der Graphikkarte (und g.g.f. den
Maustreiber) zur Verfügung gestellt. Ergänzende EGA/VGA-Funktionen zum INT 10
werden in Kapitel 13 beschrieben.
2.3 Hardwarekonfiguration (INT 11)
Beim Booten des Systems wird die aktuelle Hardwarekonfiguration ermittelt und im BIOSDatenbereich eingetragen. Über den INT 11 läßt sich dieser Konfigurationswert auslesen.
Es sind keine Register zu setzen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
70
DOS Programmierhandbuch
Ö---------------------------------Ì
°
CALL : INT 11
°
°
°
°
(Get Hardware Konfiguration) °
û---------------------------------À
°
RETURN
°
° AX: Hardwarekonfiguration
°
Û---------------------------------ì
Das Ergebnis wird im AX-Register zurückgegeben. Die Hardwarekonfiguration ist gemäß
Bild 2.4 kodiert.
Die Angabe der Speichergröße auf der Hauptplatine (Bits 2, 3) ist historisch zu sehen, da
heute kein PC mehr mit 64 Kbyte bestückt wird. Andere BIOS-Versionen können eine
abweichende Kodierung verwenden. Bei einigen Versionen sind die Bits sogar unbelegt.
Auch Bit 12 (Spieleadapter) ist oft nicht benutzt. In neueren BIOS-Versionen zeigt Bit 1
die Präsenz eines Arithmetikprozessors an.
15
13 11 9 8 7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ø-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙÚÙÚÙÚÙÚÙ-ÙÚÙÚÅÚÙÚÙÚÙÚÙÚÙÚÙÚÙÚì
ÛÚì ° ° Û-Ú-ì ° ÛÚì ÛÚì ÛÚì ° Û-° ° °
°
° °
°
° °
° ° °
°
° °
°
° Û---° ° °
°
° °
°
°
° ° °
°
° °
°
°
° ° °
°
° °
°
Û------° ° °
°
° °
°
° ° °
°
° °
°
° ° °
°
° °
Û----------° ° °
°
° °
° ° °
°
° °
° ° °
°
° °
° ° °
°
° °
° ° °
°
° °
° ° °
°
° °
° ° °
°
° Û--------------° ° °
°
°
° ° °
°
°
° ° °
°
Û-----------------° ° °
°
° ° °
Û---------------------° ° °
° ° Û-------------------------° °
° Û---------------------------°
Û-------------------------------
0 = kein Diskettenlaufwerk
1 = Disklaufwerk vorhanden
Coprozessor, oder unbelegt
Speicher auf der Hauptplatine
00 = 16 Kbyte, 01 = 32 Kbyte
10 = 48 Kbyte, 11 = 64 Kbyte
Videomodus
00 unbelegt
01 40x25 S/W auf Colorkarte
10 80x25 S/W auf Colorkarte
11 80x25 S/W auf Monokarte
Zahl der Diskettenlaufwerke
00 = 1, 01 = 2, 10 = 3, 11 =4
(nur gültig, falls Bit1 = 1)
x unbelegt
Zahl d. seriellen Schnittst.
1 Spieladapter vorh., oder
0 unbelegt
x unbelegt
Zahl der parallelen Schnittstellen
Bild 2.4: Kodierung des Konfigurationswertes
2.4 Speichergröße ermitteln (INT 12)
Diese BIOS-Funktion ermittelt die Speichergröße, die beim Systemstart festgestellt wurde.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
71
Ö---------------------------------Ì
°
CALL : INT 12
°
°
°
° -- (Get RAM Size)
°
û---------------------------------À
°
RETURN
°
° AX: Speichergröße in Kbytes
°
Û---------------------------------ì
Das Ergebnis wird im AX-Register zurückgegeben. Der Wert spezifiziert die Größe in
Kbyte. Allerdings kann es bei kompatiblen BIOS-ROMs zu Problemen kommen, falls
andere Kodierungen verwendet wurden.
2.5 Disketten- und Festplatten-Steuerung (INT 13)
Der BIOS-Interrupt 13 wird teilweise durch den Disketten-/Festplattencontroller verwaltet
und bietet einige Low-Level-Funktionen zur Steuerung der Disketten- und
Festplattenlaufwerke. Er erlaubt das Lesen, Schreiben und Überprüfen von Einzelsektoren,
sowie das Formatieren einer Diskette/Festplatte. Ähnlich wie beim INT 10 steuert der
Inhalt des AH-Registers die Unterfunktion. Allerdings sei noch auf eine Besonderheit
hingewiesen. Ursprünglich war nur die Unterstützung von mehreren Diskettenlaufwerken
vorgesehen. Im Laufe der Entwicklung mußten aber auch Festplatten eingesetzt werden.
Die Funktionen zur Unterstützung dieser Festplatten befinden sich meist in einem eigenen
BIOS-ROM auf dem Festplattencontroller. Das BIOS durchsucht beim Systemstart den
Bereich von C000:0000 bis E000:0000 auf zusätzliche BIOS-ROMs. Befindet sich dort ein
BIOS für eine Festplatte, wird die Initialisierungsroutine dieses BIOS aktiviert, die dann
den INT 13-Vektor auf eigene Routinen umsetzt. Der ursprüngliche Vektor auf die
Diskettenfunktionen wird dann auf den INT 40 umgelegt.
Da aber der INT 13 für beide Speichermedien benutzt wird, muß ein Selektionskriterium
zur Auswahl der jeweiligen Einheit vorhanden sein. Da auch die Kompatibilität zu älteren
BIOS-Versionen erhalten bleiben mußte, griffen die Entwickler zu einem Trick. Das
Register DL gibt den Laufwerkstyp an und wurde früher bei allen Aufrufen auf Werte <
80H gesetzt. In den BIOS-Routinen zur Unterstützung der Festplatte wird deshalb der
Inhalt von DL untersucht. Ist er kleiner als 80H, bezieht sich der Aufruf auf die
Diskettenlaufwerke und ein INT 40 wird ausgelöst. Andernfalls bezieht sich der Aufruf auf
die Festplatte, deren Routinen im ROM stehen. Damit ergeben sich allerdings kleinere
Unterschiede beim Aufruf der INT 13-Funktionen.
Disk-System zurücksetzen (AH = 00H)
Mit diesem Aufruf läßt sich der Controller zurücksetzen, falls eine Operation abgebrochen
werden soll oder falls ein Fehler auftritt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
72
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 00H (Reset Disk)
°
° DL: Laufwerkstyp
°
û-------------------------------À
°
RETURN
°
° AH: Status
°
°
°
Û-------------------------------ì
Falls keine Festplatte im System vorhanden ist, bezieht sich der Aufruf immer auf die
Diskettenlaufwerke. In diesem Fall ist das Register DL ohne Bedeutung. Findet sich eine
Platte im System, wird bei DL < 80H ein INT 40 ausgelöst, der die Einsprungadresse der
Diskettenroutinen enthält. Werte >= 80H beziehen sich auf das BIOS der Festplatte.
Status lesen (AH = 01H)
Der Status des Controllers nach der letzten Operation wird ausgelesen und im AL-Register
zurückgegeben. Es gilt folgende Aufrufkonvention:
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 01H (Get Status)
°
° DL: Laufwerktyp
°
û-------------------------------À
°
RETURN
°
° AX: Status des Controllers
°
Û-------------------------------ì
Besitzt das System nur Diskettenlaufwerke, wird das DL-Register nicht belegt. Andernfalls
spezifiziert es mit DL < 80H die Diskettenlaufwerke und sonst die Platte.
Der Status wird bei der Funktion AH = 1 als Byte im Register AX zurückgegeben. Welche
Registerhälfte belegt ist, hängt von der BIOS-Version ab. Beim IBM-PC ohne Festplatte
findet sich der Wert in AL. Neue Versionen unterscheiden zwischen Diskette und Platte.
Bei Diskettenlaufwerken findet sich das Statusbyte in AH, während die Platte es im ALRegister zurückgibt. Das Statusbyte besitzt folgende Belegung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
73
Ö-----------------------------------------------------------------Ì
° 7 6 5 4 3 2 1 0
°
°Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
°
°ÛÚÙÚÙÚÙÚÙÚÙÚÙÚÙÚì
Operation nicht durchgeführt
°
° ° ° ° ° ° ° ÛÚì
01 ungültiger Befehl, oder Versuch über eine °
° ° ° ° ° ° ° Û-64-Kbyte-Grenze zu übertragen (Bit 3 = 1) °
° ° ° ° ° ° °
10 Adreßmarke nicht gefunden
°
° ° ° ° ° ° °
11 Write auf eine schreibgesch. Diskette
°
° ° ° ° ° ° °
°
° ° ° ° ° ° Û----angegebener Sektor nicht gefunden
°
° ° ° ° ° °
°
° ° ° ° ° Û------DMA-Überlauf, oder 64-Kbyte-Grenze erreicht, °
° ° ° ° °
falls Bit 1 = 1 ist.
°
° ° ° ° °
°
° ° ° ° Û--------CRC-Fehler beim Lesen
°
° ° ° °
°
° ° ° Û----------Controllerfehler
°
° ° °
°
° ° Û------------SEEK-Operation erfolglos
°
° °
°
° Û--------------Time-Out-Fehler des Laufwerks
°
°
°
û-----------------------------------------------------------------À
°
Status-Codes
°
û-----------------------------------------------------------------À
° 00H
successful completion
°
° 01H
bad command
°
° 02H
address mark not found
°
° 03H
tried to write on write-protected disk
°
° 04H
sector not found
°
° 05H
reset failed (hard disk)
°
° 06H
diskette removed or changed
°
° 07H
bad parameter table (hard disk)
°
° 08H
DMA overrun
°
° 09H
attempt to DMA across 64K boundary
°
° 0AH
bad sector detected (hard disk)
°
° 0BH
bad track detected (hard disk)
°
° 0CH
unsupported track
°
° 0DH
invalid number of sectors on format (hard disk)
°
° 0EH
control data address mark detected (hard disk)
°
° 0FH
DMA arbitration error (hard disk)
°
° 10H
bad CRC/EEC on read
°
° 11H
data ECC corrected
°
° 20H
controller failure
°
° 40H
seek failed
°
° 80H
timeout
°
° AAH
drive not ready (hard disk)
°
° BBH
undefined error (hard disk)
°
° CCH
write fault
(hard disk)
°
° E0H
status error
(hard disk)
°
° FFH
sense operation failed (hard disk)
°
Û-----------------------------------------------------------------ì
Bild 2.5: Belegung des Floppy- und Hard-Disk-Statusbyte;s
Die Bits können einerseits auf Grund von Hardwarefehlern, oder bei falschen Aufrufen der
Diskettenfunktionen, gesetzt werden. Der Versuch, den Sektor 20 einer (360 Kbyte)
Diskette zu lesen, bringt den Fehler Bit 2 (Sektor nicht gefunden), da eine Diskette
maximal 9 Sektoren besitzt.
Im BIOS-Datenbereich finden sich weitere Informationen über den Status des
Diskettenlaufwerkes (Tabelle 2.6).
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
74
Ö------------Ú---------------------------------------------------Ì
°Adresse 0:x ° Bedeutung
°
û------------é---------------------------------------------------À
°
0490
° Drive 0 - 90 Medium Status (zusätzl. Disk Daten) °
û------------é---------------------------------------------------À
°
0491
° Drive 1 - 91 Medium Status (zusätzl. Disk Daten) °
û------------é---------------------------------------------------À
°
0492
° Drive 0 - 90 Start Status (zusätzl. Disk Daten) °
û------------é---------------------------------------------------À
°
0493
° Drive 1 - 91 Start Status (zusätzl. Disk Daten) °
û------------é---------------------------------------------------À
°
0494
° Drive 0 - 90 aktueller Zylinder
°
û------------é---------------------------------------------------À
°
0495
° Drive 1 - 91 aktueller Zylinder
°
Û------------Ù---------------------------------------------------ì
Tabelle 2.6: Disk-Statusbyte; im BIOS-Datenbereich
Für das Medium Status Feld gilt dabei folgende Kodierung:
7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙÚÙÚÙÚÙÚÙÚÙÚÙÚì
° ÛÚì ° ° Û-é-ì
° ° ° °
Û-° ° ° °
° ° ° °
° ° ° °
° ° ° °
° ° ° °
° ° ° °
° ° ° °
° ° ° °
° ° ° °
° ° ° Û----° ° °
° ° Û------° °
° °
° Û---------°
°
°
°
°
Û---------------
Status
000 360 Kbyte
eingerichtet
001 360 Kbyte
eingerichtet
010 1.2 Mbyte
eingerichtet
011 360 Kbyte
100 360 Kbyte
101 1.2 Mbyte
in 360-Kbyte-Laufwerk nicht
in 1.2-Mbyte-Laufwerk nicht
in 1.2-Mbyte-Laufwerk nicht
in 360-Kbyte-Laufwerk eingerichtet
in 1.2-Mbyte-Laufwerk eingerichtet
in 1.2-Mbyte-Laufwerk eingerichtet
Laufwerk/Medium eingerichtet
Doppelstep erforderlich
(360 Kbyte in 1.2 Mbyte Drive)
Tatentransferrate
00 500 Kbyte/Sek.
01 300 Kbyte/Sek.
10 250 Kbyte/Sek.
11 reserviert
---
Bild 2.6: Belegung des Medium-Statusbytes bei Disketten
Diese Kodierung wurde aber erst bei Systemen mit 1,2-Mbyte-Laufwerken eingeführt und
ist damit nicht immer gültig.
Sektor Read (AH = 02H)
Mit diesem Befehl läßt sich ein absoluter Sektor von einer Diskette/Platte lesen. Jedes
Medium wird in einzelne Sektoren aufgeteilt, die in konzentrischen Kreisen (Spuren)
aufgebracht werden. Die Zahl der Sektoren pro Spur ist abhängig von der
Aufzeichnungsdichte.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
75
Ö-------Ú--------------Ú--------Ú-------------Ú----------Ú--------------Ì
° Kbyte ° Spuren/Seite ° Seiten ° Sektor/Spur ° Sektoren ° Bemerkungen °
û-------é--------------é--------é-------------é----------é--------------À
° 160
°
40
°
1
°
8
°
320
° 5 1/4 Zoll
°
° 180
°
40
°
1
°
9
°
360
° 5 1/4 Zoll
°
° 320
°
40
°
2
°
8
°
640
° 5 1/4 Zoll
°
° 360
°
40
°
2
°
9
°
720
° 5 1/4 Zoll
°
°1200
°
80
°
2
°
15
° 2400
° 5 1/4 Zoll
°
Û-------Ù--------------Ù--------Ù-------------Ù----------Ù--------------ì
Tabelle 2.7: Sektoraufteilung einzelner Diskettenformate
Um einen solchen Sektor zu lesen, müssen die folgenden Register vor dem Aufruf
initialisiert werden:
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 02H (Sektor Read)
°
° DL: Drive-Nummer
°
° DH: Kopfnummer
°
° CH: Spur-(Zylinder-)Nummer
°
° CL: Sektornummer
°
° AL: Zahl der Sektoren
°
° ES:BX Adresse Lesepuffer
°
û-------------------------------À
°
RETURN
°
° CY: 0
°
°
kein Fehler
°
° CY: 1
°
° AH: Fehlercode
°
Û-------------------------------ì
Im Register DL wird die Laufwerksnummer (0 = A:, 1 = B: etc.) übergeben. Da die
Funktion den Inhalt auf Gültigkeit überprüft, sind nur bestimmte Werte zulässig. Soll die
Festplatte angesprochen werden, sind die Eingaben 80H und 81H erlaubt. Bei Disketten
haben die Werte 00H und 01H Gültigkeit. DH enthält die Kopfnummer (Diskette 0-1,
Platte 0-15), von der gelesen werden soll. Dieser Wert wird nicht überprüft. In das Register
CH wird die Spurnummer geladen, während CL die Sektornummer innerhalb der Spur
enthält. Bei Festplatten spricht man allerdings nicht mehr von einer Spur, sondern von
einem Zylinder. Hier ergibt sich auch die Abweichung, daß die Zylindernummer 10 Bit
umfaßt, wobei die unteren 8 Bit sich im Register CH (Spurnummer) befinden. Die beiden
höherwertigen Bits der Zylindernummer werden in den oberen Bits des Registers CL
(Sektornummer) übergeben. Die Sektornummern reichen in Abhängigkeit vom Medium
nur von 1 bis 17, belegen also kein ganzes Byte. Beide Werte werden nicht überprüft. Im
Register AL ist die Zahl der zu lesenden Sektoren anzugeben. Es können immer nur
logisch aufeinanderfolgende Sektoren gelesen werden. Der Wert wird nicht überprüft.
Weiterhin muß ein Puffer zur Aufnahme der gelesenen Werte angelegt werden, dessen
Anfangsadresse als Zeiger im Registerpaar ES:BX übergeben wird.
Das Carry-Flag zeigt an, ob beim Aufruf der Funktion ein Fehler auftrat. Bei gesetztem
Carry-Flag findet sich im Register AH ein Fehlercode, dessen Bedeutung bereits bei der
Funktion (AH = 1 Status lesen) besprochen wurde. Im Fehlerfall ist anschließend das
Laufwerk mit dem Aufruf AH = 0 zurückzusetzen. Anschließend kann der Leseaufruf
wiederholt werden, um eventuelle Probleme durch die Motor-Hochlaufzeit auszuschließen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
76
Sektor Write (AH = 03H)
Analog der Lesefunktion existiert die Möglichkeit, einen absoluten Sektor auf die Diskette/
Festplatte zu schreiben. Hierzu sind die Register wie bei der Funktion AH = 02 zu setzen.
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 03H (Sektor Write)
°
° DL: Drive-Nummer
°
° DH: Kopfnummer
°
° CH: Spur-(Zylinder-)Nummer
°
° CL: Sektornummer
°
° AL: Zahl der Sektoren
°
° ES:BX Adresse Datenpuffer
°
û-------------------------------À
°
RETURN
°
° CY: 0
°
°
kein Fehler
°
° CX: Zahl der 512-Byte-Blocks, °
° DX: die geschrieben wurden
°
° CY: 1
°
° AH: Fehlercode
°
Û-------------------------------ì
Im Register DL wird die Laufwerksnummer (0 = A:, 1 = B: etc.) übergeben. Da die
Funktion den Inhalt auf Gültigkeit überprüft, sind nur bestimmte Werte zulässig. Soll die
Festplatte angesprochen werden, sind die Eingaben 80H und 81H erlaubt. Bei Disketten
haben die Werte 00H und 01H Gültigkeit. DH enthält die Kopfnummer (Diskette 0-1,
Platte 0-15), auf die geschrieben werden soll. Dieser Wert wird nicht überprüft. In das
Register CH wird die Spurnummer geladen, während CL die Sektornummer innerhalb der
Spur enthält. Bei Festplatten wird die 10-Bit-Zylindernummer im Register CH (untere 8
Bit) und im Register CL (obere 2 Bit) übergeben. Es gelten die gleichen Konventionen wie
bei AH = 02H. Die Sektornummern reichen in Abhängigkeit vom Medium nur von 1 bis
17, belegen also kein ganzes Byte. Beide Werte werden nicht überprüft. Im Register AL ist
die Zahl der zu schreibenden Sektoren anzugegeben. Es können immer nur logisch
aufeinanderfolgende Sektoren geschrieben werden. Der Wert wird nicht überprüft.
Weiterhin muß ein Puffer mit den zu schreibenden Daten angelegt werden, dessen
Anfangsadresse als Zeiger im Registerpaar ES:BX übergeben wird. Beim Aufruf werden
dann die Daten aus dem Puffer in die angegebenen Sektoren übertragen.
Das Carry-Flag zeigt an, ob beim Aufruf der Funktion ein Fehler auftrat. Bei gesetztem
Carry-Flag findet sich im Register AH ein Fehlercode, dessen Bedeutung bereits bei der
Funktion (AH = 1 Status lesen) besprochen wurde. Im Fehlerfall ist anschließend das
Laufwerk mit dem Aufruf AH = 0 zurückzusetzen. Anschließend kann der Schreibaufruf
wiederholt werden, um eventuelle Probleme durch die Motor-Hochlaufzeit auszuschließen.
Erst nach dreimaligem Versuch sollte die Operation abgebrochen werden.
Bei Festplatten enthält das Registerpaar CX:DX nach dem Aufruf die Zahl der
geschriebenen 512-Byte-Blocks.
Sektor Verify (AH = 04H)
Mit dieser Funktion läßt sich prüfen, ob die Daten korrekt auf die Diskette geschrieben
wurden. Hierzu sind die Register ebenfalls, wie bei der Read-Funktion beschrieben, vor
dem Aufruf zu initialisieren.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
77
Ö--------------------------------Ì
°
CALL : INT13
°
°
°
° AH: 04H (Sektor Verfiy)
°
° DL: Drive-Nummer
°
° DH: Kopfnummer
°
° CH: Spur-(Zylinder)-Nummer
°
° CL: Sektornummer
°
° AL: Zahl der Sektoren
°
° ES:BX Adresse Datenpuffer
°
û--------------------------------À
°
RETURN
°
° CY: 0 kein Fehler
°
° AH: Statuscode
°
° AL: verifizierte Sektoren
°
° CY: 1
°
° AH: Fehlercode
°
Û--------------------------------ì
Das Ergebnis der Verify-Operation wird über das Register AH und das Carry-Flag (siehe
Funktion Read) zurückgegeben. Im Fehlerfall ist anschließend das Disksystem mit dem
Aufruf AH = 0 zurückzusetzen. Anschließend kann der Leseaufruf wiederholt werden, um
eventuelle Probleme durch die Motor Hochlaufzeit auszuschließen.
Spur formatieren (AH = 05H)
Um eine Diskette/Platte zu formatieren, läßt sich diese BIOS-Unterfunktion benutzen. Sie
ist aber nicht mit dem MS-DOS-Programm FORMAT zu verwechseln, welches neben der
physikalischen Formatierung der Diskette auch noch logische Informationen, wie BootRecords oder Directory-Informationen, auf dem Medium ablegt. Pro Aufruf läßt sich eine
Spur physikalisch formatieren, d.h. neben der Einteilung in Sektoren werden Informationen
in den Kopf der einzelnen Sektoren geschrieben.
Ö--------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 05H (Sektor Format)
°
° ES:BX Zeiger auf Tabelle
°
û--------------------------------À
°
°
°
RETURN
°
° CY: 0
°
°
kein Fehler
°
° CY: 1
°
° AH: Fehlercode
°
Û--------------------------------ì
Für die Format-Operation benötigt die BIOS-Routine einen Zeiger auf die Tabelle mit
Steueroperationen. Dieser Zeiger wird im Registerpaar ES:BX, in der Segment:OffsetNotation übergeben (ES = Segment, BX = Offset).
Pro Sektor muß ein Eintrag in der Tabelle vorhanden sein. Jeder Eintrag besteht aus vier
Byte mit folgender Kodierung:
Byte ° Bemerkung
-----é----------------------------------0 ° Spurnummer
1 ° Kopfnummer
2 ° Sektornummer
3 ° Bytes pro Sektor (00=128, 01=256,
°
02=512, 03=1024)
Tabelle 2.8: Belegung des Formatsteuerblock;s
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
78
Zur Formatierung einer 360-Kbyte-Diskette muß die Tabelle 2.8 also 9 Einträge zu je 4
Byte enthalten, da die Diskette pro Spur 9 Sektoren besitzt. Interessant ist in diesem
Zusammenhang die Möglichkeit, innerhalb einer Spur die Zahl der Bytes pro Sektor zu
variieren. MS-DOS speichert normalerweise 512 Byte pro Sektor. Die Informationen aus
der Tabelle finden sich im Kopf eines jeden Sektors und dienen später zur Identifizierung
des Sektors bei Schreib-Lese-Operationen. Allerdings gibt es Unterschiede in den
einzelnen BIOS-Versionen. Sobald 1,2-Mbyte-Laufwerke unterstützt werden, ist vor dem
Formatieren die Funktion AH = 01H aufzurufen, um den Diskettentyp zu setzen. Sollen
320/360-Kbyte-Disketten in einem 1,2-Mbyte-Laufwerk formatiert werden, sind vor dem
Aufruf die folgenden Parameter in der Disk-Parameter-Tabelle zu modifizieren.
GAP Length
Last Sektor/Track
=
=
050H
8 oder 9 Sektoren
Die Adresse der Disk-Parameter-Tabelle findet sich in der DOS-Interruptvektor-Tabelle ab
Adresse 0000:0078H. Der Aufbau ist im Abschnitt 1.8 (Der DOS-Datenbereich)
beschrieben. Anschließend sind die alten Werte wieder zu restaurieren.
Bei einer Festplatte muß der Vektor in ES:BX auf eine 512-Byte-Tabelle zeigen, die für
jeden Sektor zwei weitere Bytes enthält. Im ersten Byte wird markiert, ob der erste Sektor
benutzbar oder gesperrt ist:
00H
80H
: der Sektor ist benutzbar
: der Sektor ist gesperrt
Im zweiten Byte steht die Sektornummer, wobei bei Festplatten ein InterleaveFaktorFehler!
Verweisquelle
konnte
nicht
gefunden
werden.en.
Bei
aufeinanderfolgenden Sektoren müßte der Controller warten, bis der folgende Sektor nach
einer Umdrehung wieder unter dem Schreib-Lese-Kopf vorbeikommt. Der Versatz um
einige physikalische Sektoren stellt sicher, daß der Controller wieder lesebereit ist, wenn
der folgende logische Sektor unter dem Kopf vorbeikommt. Damit lassen sich alle
logischen Sektoren einer Spur mit einer Umdrehung der Platte lesen, was die Zugriffszeiten
erheblich minimiert.
1
5
2
6
3
7
4 <- logische Sektoren
Ö----Ú----Ú----Ú----Ú----Ú----Ú----Ì
Û----Ù----Ù----Ù----Ù----Ù----Ù----ì
1
2
3
4
5
6
7 <- physikalische Sektoren
Bild 2.7: Interleave-Faktor; (2) bei Festplatten
Die Daten für den Aufbau der Festplatte bezieht die BIOS-Funktion aus der DiskParameter-Tabelle.
Im BIOS-ROM des IBM-PC/AT wurden weitere Funktionen unter dem INT 13
implementiert, die nachfolgend ebenfalls kurz besprochen werden. Die Funktionscodes AH
= 06H und 07H sind unbelegt.
Harddisk-Format Track (AH = 06H)
Diese Funktion wird nur von einigen Harddisk-Controllern (z.B. XT) unterstützt. Sie
formatiert eine Spur und setzt die bad sector flags. Es gilt folgende Aufrufschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
79
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 06H (Format Track)
°
° AL Interleave-Faktor (nur XT)°
° CH Zylindernummer
°
° CL Sektornummer
°
° DH Kopf
°
° DL Drive
°
° ES:BX 512-Byte-Format-Buffer °
û-------------------------------À
°
RETURN
°
° AH: Statuscode
°
Û-------------------------------ì
Die Bits 8,9 der Zylindernummer werden in den Highbits des Registers CL übergeben. Im
512-Byte-Format-Buffer enthalten die ersten 2*(Sector/Track) die Kennungen f,n für jeden
Sektor:
f
n
0FH Sektor benutzbar
80H Bad Sektor
Sektornummer
Die Funktion gibt in AH den Statuscode der Operation zurück.
Harddisk-Format ab n. Spur (AH=07H)
Dieser Aufruf ist ebenfalls nur bei einigen Harddisks (z.B. PC 2, XT) vorhanden. Er
formatiert eine Platte ab der gewünschten Spur.
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 07H (Format Disk)
°
° AL Interleave-Faktor (nur XT)°
° CH Zylindernummer
°
° CL Sektornummer
°
° DH Kopf
°
° DL Drive
°
° ES:BX 512-Byte-Format-Buffer °
û-------------------------------À
°
RETURN
°
° AH: Statuscode
°
Û-------------------------------ì
Die Bits 8, 9 der Zylindernummer werden in den Highbits des Registers CL übergeben. Im
512-Byte-Format-Buffer enthalten die ersten 2*(Sector/Track) die Kennungen f,n für jeden
Sektor:
f
n
0FH Sektor benutzbar
80H Bad-Sektor
Sektornummer
im Register AL ist der Interleave-Faktor (1-10H beim XT) zu übergeben. Die
Zylindernummer darf zwischen 0 und 3FFFH liegen, während die Kopfnummer bei 0-7
liegt. Die Funktion gibt in AH den Statuscode der Operation zurück.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
80
Get Current Drive Parameter (AH = 08H)
Ö--------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 08H (Get Drive Parameter) °
° DL: Drive Nr (0-2)
°
û--------------------------------À
°
RETURN
°
° CY: 1 --> Fehler
°
° AH: Fehlercode
°
° CY: 0 --> kein Fehler
°
° CL: Laufwerksnummer (0 - 2)
°
° DH: Kopfzahl
°
° DL: Zahl der Drives
°
° CH: Zylindernummer
°
° CL: Sektornummer
°
Û--------------------------------ì
Dieser Funktionsaufruf erlaubt es, die Parameter des aktuell eingestellten Laufwerkes
abzufragen. Die Funktion ist nur in Verbindung mit einer Festplatte aufrufbar, wobei
nebenstehende Parameter zu übergeben sind. Ist in DL beim Aufruf Bit 7 gesetzt, bezieht
sich die Angabe auf eine Harddisk.
Die Zylindernummer teilt sich wieder auf die Register CH und CL auf, wobei die beiden
oberen Bits in CL die Bits 8 und 9 der Zylindernummer bilden. (CH = Bit 0-7, CL = Bit 89). Die Werte sind nur gültig, falls kein Carry-Flag gesetzt ist.
Init Drive Characteristics (AH = 09H)
Das BIOS legt auch für die Festplatten Datenblöcke an, die die Eigenschaften eines
Laufwerkes charakterisieren. Die Adressen dieser Datenblöcke finden sich in den
Interruptvektoren:
INT 41 : Adresse Datenblock Drive 0
INT 46 : Adresse Datenblock Drive 1
Der Aufruf beeinflußt immer die Daten für ein Laufwerkspaar, da die Festplattencontroller
meist zwei Einheiten unterstützen.
Ö--------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 09H (Init Drive)
°
û--------------------------------À
°
RETURN
°
° CY: 1 --> Fehler
°
° AH: Fehlercode
°
° CY: 0 --> kein Fehler
°
Û--------------------------------ì
Die Urdaten sind im CMOS-RAM der Echtzeituhr gespeichert. Die Routine liest die Daten
aus diesem Bereich und kopiert sie in in die Tabelle. Der Adreßvektor wird dann unter den
Interruptvektoren eingetragen. Die Struktur ist in Tabelle 2.9 dargestellt.
Nach dem Aufruf sind die Tabellen mit den Werten aus dem CMOS-RAM belegt. Um
andere Werte einzustellen, ist eine zweite Tabelle aufzubauen. Dann ist der Vektor auf
diese Tabelle umzusetzen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
81
Ö--------Ú-------Ú------------------------------------Ì
° Offset ° Bytes ° Feld
°
û--------é-------é------------------------------------À
°
00
°
2
° maximale Zylinderzahl
°
û--------é-------é------------------------------------À
°
02
°
1
° maximale Kopfzahl
°
û--------é-------é------------------------------------À
°
03
°
2
° --°
û--------é-------é------------------------------------À
°
05
°
2
° Startzylinder zum Schreiben
°
û--------é-------é------------------------------------À
°
07
°
1
° maximale Datenlänge für ECC
°
û--------é-------é------------------------------------À
°
08
°
1
° Kontrollbyte:
°
°
°
° Bit 7 - 6 disable retry
°
°
°
° Bit 5 = mehr als 8 Köpfe
°
û--------é-------é------------------------------------À
°
09
°
3
° --°
û--------é-------é------------------------------------À
°
0C
°
2
° Landezone für Köpfe
°
û--------é-------é------------------------------------À
°
0E
°
1
° Sektoren pro Spur
°
Û--------Ù-------Ù------------------------------------ì
Tabelle 2.9: Aufbau der Disk-Parameter-Tabelle; bei Platten
Read Long (AH = 0AH)
Mit diesem Aufruf lassen sich mehr als die Sektoren einer Spur auf einmal lesen. Ein ReadLong-Aufruf kann zwischen 1 und 79 Sektoren lesen. Es gelten folgende
Aufrufkonventionen:
Ö--------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 0AH (Read Long)
°
° DL: Laufwerksnummer (80H,81H) °
° DH: Kopfnummer (0 - 15)
°
° CH: Zylindernummer (0 - 1023) °
° CL: Sektornummer (0 - 17)
°
° AL: Sektoren zu lesen
°
° ES:BX Lesepuffer für Daten
°
û--------------------------------À
°
RETURN
°
° CY: 1 --> Fehler
°
° AH: Fehlercode
°
° CY: 0 --> kein Fehler
°
Û--------------------------------ì
Für die Registerbelegungen gelten die üblichen Konventionen. Die Daten werden in einem
Lesepuffer abgelegt, dessen Anfangsadresse im Registerpaar ES:BX übergeben wird. Die
Zahl der zu lesenden Sektoren findet sich in AL. Tritt ein Fehler auf, wird das Carry-Flag
gesetzt. Der Aufruf der Long-Read-Funktion umgeht den Error-Correction-Code (ECC),
der sich normalerweise auf 512 Byte bezieht.
Write Long (AH = 0BH)
Mit diesem Aufruf lassen sich mehr als die Sektoren einer Spur auf einmal schreiben. Ein
Write-Long-Aufruf kann zwischen 1 und 79 Sektoren bearbeiten. Es gelten folgende
Aufrufkonventionen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
82
Ö--------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 0BH (Write Long)
°
° DL: Laufwerksnummer (80H,81H) °
° DH: Kopfnummer (0 - 15)
°
° CH: Zylindernummer (0 - 1023) °
° CL: Sektornummer (0 - 17)
°
° AL: Sektoren zu schreiben
°
° ES:BX Datenpuffer
°
û--------------------------------À
°
RETURN
°
° CY: 1 --> Fehler
°
° AH: Fehlercode
°
° CY: 0 --> kein Fehler
°
Û--------------------------------ì
Für die Registerbelegungen gelten die üblichen Konventionen. Die Daten werden in einem
Puffer übergeben, dessen Anfangsadresse sich im Registerpaar ES:BX findet. Die Zahl der
zu schreibenden Sektoren findet sich in AL. Tritt ein Fehler auf, wird das Carry-Flag
gesetzt. Der Aufruf der Long-Write-Funktion umgeht den Error-Correction-Code (ECC),
der sich normalerweise auf 512 Byte bezieht.
Seek (AH = 0CH)
Mit diesem Aufruf läßt sich eine SEEK-Funktion ausführen. Es gelten folgende
Aufrufkonventionen.
Ö--------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 0CH (SEEK)
°
° DL: Laufwerksnummer (80H,81H) °
° DH: Kopfnummer (0 - 15)
°
° CH: Zylindernummer (0 - 1023) °
° CL: Sektornummer (0 - 17)
°
û--------------------------------À
°
RETURN
°
° CY: 1 --> Fehler
°
° AH: Fehlercode
°
° CY: 0 --> kein Fehler
°
Û--------------------------------ì
Für die Registerbelegungen gelten die üblichen Konventionen. Tritt ein Fehler auf, wird
das Carry-Flag gesetzt.
Im BIOS der Festplatte sind weitere Funktionsaufrufe implementiert:
AH
AH
AH
AH
=
=
=
=
0CH
10H
11H
14H
Alternate Disk Reset
Test Drive Ready
Recalibrate
Controller internal Diagnosis
die nicht näher diskutiert werden sollen. Es gelten beim Aufruf die üblichen Konventionen.
Für weitere Informationen sei auf die Literatur der jeweiligen Hersteller verwiesen.
Alternate Disk Reset (AH = 0DH)
Mit diesem Aufruf wird eine Festplatte zurückgesetzt. Es gelten folgende Aufrufparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
83
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 0DH (Reset Disk)
°
° DL Drive
°
û-------------------------------À
°
RETURN
°
° CF -> 0 kein Fehler
°
° CF -> 1 Fehler
°
° AH: Statuscode
°
Û-------------------------------ì
Die Funktion kann beim PC und bei PS/2-Modellen mit ESDI-Platten nicht benutzt
werden.
Read Sector Buffer (AH = 0EH)
Dies ist ebenfalls ein neuer Aufruf, der beim XT und den PS/2-Modellen eingeführt wurde.
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 0EH (Read Sektor Buffer) °
° AL Zahl der Sektoren
°
° CH Zylindernummer
°
° CL Sektornummer
°
° DH Kopf
°
° DL Drive
°
° ES:BX Zeiger auf Puffer
°
û-------------------------------À
°
RETURN
°
° CF -> 0 kein Fehler
°
° CF -> 1 Fehler
°
° AH: Statuscode
°
Û-------------------------------ì
Der Aufruf transferiert die Daten aus dem Puffer des Controllers in den angegebenen
Puffer im Hauptspeicher. Es werden allerdings keine Daten von der Platte gelesen! Der
Aufruf wird bei PS/2-Systemen im wesentlichen für Diagnosezwecke benutzt.
Write Sector Buffer (AH = 0FH)
Der Aufruf ist beim XT, PS/2 und einigen Portablen vorhanden.
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 0FH (Write Sector Buffer) °
° AL Zahl der Sektoren
°
° CH Zylindernummer
°
° CL Sektornummer
°
° DH Kopf
°
° DL Drive
°
° ES:BX Zeiger auf Puffer
°
û-------------------------------À
°
RETURN
°
° CF -> 0 kein Fehler
°
° AL: Zahl der transf. Sektoren °
° CF -> 1 Fehler
°
° AH: Statuscode
°
Û-------------------------------ì
Der Aufruf transferiert die Daten aus dem Puffer des Speichers in den Puffer des
Controllers. Er sollte vor einem Formatieraufruf benutzt werden, um den Controller zu
initialisieren. Der Aufruf wird bei PS/2-Systemen im wesentlichen für Diagnosezwecke
eingesetzt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
84
Test For Drive Ready (AH = 10H)
Der Aufruf prüft, ob das angegebene Laufwerk bereit ist.
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 10H (Test Drive Ready)
°
° DL Drive
°
û-------------------------------À
°
RETURN
°
° CF -> 0 kein Fehler
°
° CF -> 1 Fehler
°
° AH: Statuscode
°
Û-------------------------------ì
Recalibrate Drive (AH = 11H)
Der Aufruf ruft ein Recalibrate des Laufwerkes auf.
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 11H (Recalibrate Drive)
°
° DL Drive
°
û-------------------------------À
°
RETURN
°
° CF -> 0 kein Fehler
°
° CF -> 1 Fehler
°
° AH: Statuscode
°
Û-------------------------------ì
Der Controller sucht auf dem spezifizierten Laufwerk den Zylinder 0.
Controller RAM Diagnose (AH = 12H)
Der Aufruf dient zur Überprüfung des Controllers bei XT, PS/2 und einigen Portablen.
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 12H (RAM Diagnose Kontr.) °
û-------------------------------À
°
RETURN
°
° CF -> 0 kein Fehler
°
° CF -> 1 Fehler
°
° AH: Statuscode
°
Û-------------------------------ì
Drive Diagnose (AH = 13H)
Der Aufruf dient zur Überprüfung des Laufwerkes bei XT, PS/2 und einigen Portablen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
85
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 13H (Drive Diagnose)
°
û-------------------------------À
°
RETURN
°
° CF -> 0 kein Fehler
°
° CF -> 1 Fehler
°
° AH: Statuscode
°
Û-------------------------------ì
Controller internal Diagnose (AH = 14H)
Der Aufruf dient zur Überprüfung des Controllers bei XT, PS/2 und einigen Portablen.
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 14H (Controller Diagnose) °
û-------------------------------À
°
RETURN
°
° CF -> 0 kein Fehler
°
° CF -> 1 Fehler
°
° AH: Statuscode
°
Û-------------------------------ì
Der Aufruf wird für Western Digital 1003-WA2 Hard/Floppy-Disk-Controller in AT und
XT/286 benutzt. Er ist auch in PS/2-Systemen vorhanden.
Read DASD Type (AH = 15)
Mit diesem Aufruf läßt sich der Laufwerkstyp bei Disketten feststellen. Daher ist dieser
Aufruf nur für Diskettenlaufwerke erlaubt. Es wird auch geprüft, ob die Selektleitung für
zwei Laufwerke umschaltbar ist.
Ö--------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 15H (Read DASD Type)
°
° DL: Laufwerksnummer (< 80H)
°
° DH: Kopfnummer (1 - 2)
°
° CH: Spurnummer
°
° CL: Sektornummer (0 - 17)
°
û--------------------------------À
°
RETURN
°
° CY: 1 --> Fehler
°
° AH: Fehlercode
°
° DL: Laufwerk
°
° CY: 0 --> kein Fehler
°
° AH: Status
°
Û--------------------------------ì
Falls kein Carry-Flag gesetzt ist, enthält das Register AH den Status:
0
1
2
3
:
:
:
:
nicht vorhanden
Diskette besitzt keine Change Line
Diskette besitzt eine Change Line
Festplatte
Bei Diskettenlaufwerken existiert eine Leitung, mittels derer der Controller zwischen den
Laufwerken A und B umschaltet. Der Aufruf prüft, ob diese Umschaltung unterstützt wird.
Die Aufrufe:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
AH = 16H
AH = 17H
86
Disk Change Line Status
Set DASD Typ for Format
beeinflussen ebenfalls diese Leitung. Es gelten die üblichen Aufrufkonventionen. Nähere
Informationen finden sich in den jeweiligen Unterlagen der Hersteller.
Damit sind die Aufrufe innerhalb des Festplatten/Disketten-BIOS-Teils besprochen. Falls
bei gesetztem Carry-Flag der Fehlercode 11H im Register AH auftritt, ist dies ein Hinweis
auf einen Lesefehler, der durch den Error-Correction-Code kompensiert werden konnte.
Das Anwenderprogramm besitzt die Möglichkeit, die Häufigkeit solcher Fehler zu erfassen
und auszuwerten, um Aussagen über die Güte des Mediums zu treffen.
Change of Disk Status (Diskette) (AH = 16H)
Der Aufruf wird nicht beim PC und XT unterstützt. Er prüft, ob die Diskette ausgewechselt
wurde. Dabei gilt folgende Aufrufschnittstelle:
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 16H (Disk Change Status) °
û-------------------------------À
°
RETURN
°
° CF -> 0 kein Fehler
°
° CF -> 1 Fehler
°
° AH: Statuscode
°
° DL: Drive
°
Û-------------------------------ì
Der Statuscode besitzt folgende Kodierung:
00H
01H
no disk change
disk changed
Im Register DL wird die Laufwerksnummer übergeben, dessen Diskette gewechselt wurde.
Set Disk Type for Format (Diskette) (AH = 17H)
Der Aufruf wird nicht bei PC- und XT-Systemen unterstützt. Er setzt den Diskettentyp vor
einer Formatierung.
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 17H (Set Disk Typ)
°
° AL: Disk Typ
°
° DL: Drive
°
û-------------------------------À
°
RETURN
°
° CF -> 0 kein Fehler
°
° CF -> 1 Fehler
°
° AH: Statuscode
°
Û-------------------------------ì
Im Register AL ist der Code für den Diskettentyp gemäß folgender Aufstellung zu
übergeben:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
00H
01H
02H
03H
04H
no disk
360-Kbyte-Diskette
360-Kbyte-Diskette
1.2-Mbyte-Diskette
720-Kbyte-Diskette
in
in
in
in
87
360-Kbyte-Drive
1.2-Mbyte-Drive
1.2-Mbyte-Drive
720-Kbyte-Drive
In DL ist die Nummer des Laufwerkes zu übergeben.
Set Media Type for Format (Diskette) (AH = 18H)
Der Aufruf wird bei AT-, XT/286- und PS/2-Modellen unterstützt.
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 18H (Set Media Typ)
°
° CH Zahl der Spuren (Lowbyte) °
° CL Bit 6/7 Tracks 0-5 Sekt. °
° DL Drive
°
û-------------------------------À
°
RETURN
°
° AH: Statuscode
°
° ES:DI Zeiger auf Parameter
°
Û-------------------------------ì
In CH werden die unteren 8 Bit der Spurzahl übergeben. Die Bits 6 und 7 in CL enthalten
die höheren Bits der Spurzahl, während in den Bits 0 bis 5 die Zahl der Sektoren pro Spur
steht. In DL wird die Laufwerksnummer übergeben. Nach dem Aufruf steht in AH der
Statuscode mit folgender Bedeutung:
00H
01H
0CH
80H
if
if
if
if
requested combination supported
function not available
not suppported or drive type unknown
there is no media in the drive
In Registerpaar ES:DI findet sich ein Zeiger auf eine 11 Byte lange Parametertabelle.
Park Hard Disk Heads (AH = 19H)
Mit diesem Aufruf lassen sich die Köpfe in eine Parkposition bringen (XT/286, PS/2).
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 19H (Park Disk Heads)
°
° DL Drive
°
û-------------------------------À
°
RETURN
°
° CF -> 0 kein Fehler
°
° CF -> 1 Fehler
°
° AH: Statuscode
°
Û-------------------------------ì
ESDI Harddisk-Format (AH = 1AH)
Dieser Aufruf wird nur bei PS/2-Systemen unterstützt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
88
Ö-------------------------------Ì
°
CALL : INT 13
°
°
°
° AH: 1AH (Format Disk)
°
° AL Defect Table Count
°
° CL Format Modifier
°
° DL Drive
°
° ES:BX Zeiger auf Tabelle
°
û-------------------------------À
°
RETURN
°
° CF -> 0 kein Fehler
°
° CF -> 1 Fehler
°
° AH: Statuscode
°
Û-------------------------------ì
In AL wird die Zahl der defekten Bereiche angegeben, während in ES:BX der Zeiger auf
die Tabelle mit den defekten Bereichen steht. In CL ist ein Format Code gemäß folgender
Kodierung zu übergeben:
Format modifier
------Ú--------------------------bit 0:° ignore primary defect map
bit 1:° ignore secondary defect map
bit 2:° update secondary defect map
bit 3:° perform surface analysis
bit 4:° generate periodic interrupt
Falls bei diesem Aufruf der periodische Interrupt angewählt wurde, löst die Funktion einen
INT 15H mit AH=0FH nach jeder Formatierung eines Zylinders aus.
Der INT 13H wird weiterhin von verschiedenen Cache-Programmen abgefangen (PCKwik, PC-Cache, IBMCACHE.SYS). Wegen der Vielzahl der Produkte wird hier auf eine
Beschreibung der Aufrufschnittstelle verzichtet.
2.6 Serielle Schnittstelle (INT 14)
Die Abwicklung der Ein-/Ausgaben zu den zwei seriellen Schnittstellen COM1 und COM2
kann über diese BIOS-Funktion erfolgen. Wie bei anderen Funktionen erfolgt die
Parameterübergabe per Register. Zur Auswahl der Schnittstelle dient das DX-Register:DX=
0 Schnittstelle COM1:
DX= 1 Schnittstelle COM2:
Mit dem AH-Register lassen sich die Unterfunktionen selektieren.
Schnittstelle initialisieren (AH = 00H)
Bei
der
seriellen
Datenübertragung
sind
bestimmte
Parameter
wie
Übertragungsgeschwindigkeit (Baudrate), Zahl der Datenbits, Stoppbits etc. festzulegen. Es
gelten folgende Aufrufparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
89
DOS Programmierhandbuch
Ö-------------------------------Ì
°
CALL : INT 14
°
°
°
° AH: 00H (Init V24)
°
° AL: Initialisierungswerte
°
° DX: Schnittstellen-Nummer
°
û-------------------------------À
°
RETURN
°
° AX:
Statuswort
°
Û-------------------------------ì
Der Wert AH = 0 aktiviert die Unterfunktion zur Initialisierung der seriellen Schnittstelle.
Im Register DX wird die Schnittstelle selektiert (0 = COM1:, 1 = COM2:). Das
Initialisierungsbyte zur Einstellung der Baudrate, Stoppbits etc. findet sich im Register AL.
Es gilt folgende Kodierung:
7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙ-ÙÚÙÚÙÚÙÚÙÚÙÚì
Û-Ú-ì ÛÚì ° ÛÚì
°
° ° Û-°
° °
°
° Û----°
°
°
°
°
°
°
Û-------°
°
°
°
Û-------------
Zahl der Datenbits
10 = 7 Datenbits
11 = 8 Datenbits
Zahl der Stoppbits
0 = 1 Stoppbit
1 = 2 Stoppbits
Parity Check
x0 No Parity Check
01 Odd Parity Check
11 Even Parity Check
Baudrate
000 = 110
001 = 150
010 = 300
011 = 600
100
101
110
111
=
=
=
=
1200
2400
4800
9600
Bild 2.8: Modus-Byte zur Einstellung der seriellen Schnittstelle
Nach der Rückkehr findet sich im AX-Register das Statuswort, welches bei der
Unterfunktion AH = 3 (Status lesen) besprochen wird.
Zeichen ausgeben (AH = 01H)
Mit dieser Unterfunktion kann ein Zeichen in das Senderegister des 8250-Bausteines
übertragen werden. Das Zeichen wird im AL-Register übergeben.
Ö-------------------------------Ì
°
CALL : INT 14
°
°
°
° AH: 01H (Send Data)
°
° AL: Zeichen
°
° DX: Schnittstellen-Nummer
°
û-------------------------------À
°
RETURN
°
° AH:
Statuswort
°
Û-------------------------------ì
Im Register DX wird wieder die entsprechende Schnittstelle selektiert. Der Status der
Operation wird im AH-Register zurückgegeben. Falls Bit 7 gesetzt ist, konnte das Zeichen
nicht übertragen werden. Die Kodierung der restlichen Bits wird bei der Funktion AH =
03H (lese Status) besprochen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
90
DOS Programmierhandbuch
Zeichen lesen (AH = 02H)
Die Funktion liest ein Zeichen ein und gibt es im Register AL zurück. Der Status wird im
AH-Register zurückgegeben, wobei die Kodierung innerhalb der AH = 03H-Funktion
vorgestellt wird.
Ö-------------------------------Ì
°
CALL : INT 14
°
°
°
° AH: 02H (Read Data)
°
° DX: Schnittstellen-Nummer
°
û-------------------------------À
°
RETURN
°
° AH: Statuswort
°
° AL: Zeichen
°
Û-------------------------------ì
Allerdings sind die Bits 5, 6 nicht definiert. Bit 7 = 1 zeigt an, daß das Data-Set-ReadySignal nicht gesetzt war. Nur wenn der Registerinhalt AH = 00H ist (No Error), ist das
Zeichen in AL gültig.
Status lesen (AH = 03H)
Zur Übertragungssteuerung verfügt der 8250-Baustein über mehrere externe Anschlüsse.
Weiterhin können Fehler beim Empfang eines Zeichens auftreten. Der 8550-Baustein legt
alle Informationen in Statusregistern ab, die sich mit der Funktion AH = 03H abfragen
lassen.
Ö-------------------------------Ì
°
CALL : INT 14
°
°
°
° AH: 03H (Read Status)
°
° DX: Schnittstellen-Nummer
°
û-------------------------------À
°
RETURN
°
° AX: Statuswort
°
Û-------------------------------ì
Die Kodierung der Bits entspricht nachfolgender Darstellung. Der Status der externen
Signalanschlüsse (Modem Control) wird im Register AL zurückgegeben.
7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙÚÙÚÙÚÙÚÙÚÙÚÙÚì
° ° ° ° ° ° ° Û° ° ° ° ° ° Û--° ° ° ° ° Û----° ° ° ° Û------° ° ° Û--------° ° Û----------° Û------------Û---------------
Delta Clear to Send
Delta Data Set Ready
Trailing Edge Ring Indicator
Receive Line Signal detect
Clear to Send
Data Set Ready
Ring Indicator
Received Line Signal detect
Bild 2.9: Modem-Control-Byte (serielle Schnittstelle)
Der Status des
zurückgegeben.
Kommunikationsports
(8250-Baustein)
wird
im
AH-Register
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
91
DOS Programmierhandbuch
7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙÚÙÚÙÚÙÚÙÚÙÚÙÚì
° ° ° ° ° ° ° Û° ° ° ° ° ° Û--° ° ° ° ° Û----° ° ° ° Û------° ° ° Û--------° ° Û----------° Û------------Û---------------
Data Ready
Overrun Error
Parity Error
Framing Error
Break Detect
Transmitter holding register empty
Transmitter shift register empty
Time out
Bild 2.10: Kommunikationsport; Statusbyte (serielle Schnittstelle)
Die Schreib-Lese-Funktionen geben dieses Statusbyte ebenfalls nach dem Aufruf zurück.
Extended Initialize (AH = 04H)
Dieser Aufruf existiert
Aufrufschnittstelle:
beim
PC
Convertible
/
PS/2
und
besitzt
folgende
Ö--------------------------------Ì
°
CALL:
INT 14
°
°
°
° AH: 04H (Extended Initialize) °
° AL: Break Status
°
° BH: Parity
°
° BL: Stoppbits
°
° CH: Zahl der Datenbits
°
° CL: Baud-Rate
°
û--------------------------------À
°
RETURN
°
° AH: Kommunikationsport Status °
° AL: Modem-Controll-Byte-Status °
Û--------------------------------ì
Für den Break-Status gilt folgende Kodierung:
01H
00H
Break
No Break
In BH wird die Parity-Prüfung selektiert:
00H
01H
02H
03H
04H
No parity
Odd parity
Even parity
Stick Parity odd
Stick Parity even
In BL steht die Zahl der Stoppbits:
00H
01H
1 Stoppbit
2 Stoppbit
In CH wird die Zahl der Datenbits pro Zeichen gesetzt. Bei einer Übertragung von
5 Datenbit werden an Stelle von 2 Stoppbit nur 11/2 Stoppbit gesendet. Für die Einstellung
der Datenbits gilt folgende Kodierung:
00H
01H
02H
03H
5
6
7
8
Bit
Bit
Bit
Bit
Die Baudrate wird in CL übergeben, wobei folgende Kodierung gilt:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
00H
01H
02H
03H
04H
05H
06H
07H
08H
92
110
150
300
600
1200
2400
4800
9600
19200
Im Register AX stehen die Statusbytes gemäß der Kodierung in Bild 2.9 und 2.10.
Extended Communication Port Control (AH = 05H)
Dieser Aufruf existiert nur beim PS/2 und besitzt folgende Aufrufschnittstelle:
Ö--------------------------------Ì
°
CALL:
INT 14
°
°
°
° AH: 05H (Extended Port Control)°
° AL: 00 Read Modem Control Reg. °
°
01 Write Modem Control Reg.°
° BL: Modem Control Register
°
û--------------------------------À
°
RETURN
°
° AH: Status
°
Û--------------------------------ì
Mit dem Aufruf AL = 0 wird das Modem-Control-Register gelesen. Das Ergebnis wird in
BL zurückgegeben. Mit AL= 1 wird der in BL übergebene Inhalt in das Modem-ControlRegister geschrieben. Für BL gilt dabei folgende Kodierung:
Bits ° Bedeutung
------é-----------------------0
° data terminal ready
1
° request to send
2
° out1
3
° out2
4
° loop
5,6,7° reserved
Nach dem Aufruf steht im Register AH der Statuscode.
Einige Netzwerke fangen ebenfalls den INT 14 ab, um eine Kommunikation per serieller
Schnittstelle zu erlauben (z.B. 3COM).
2.7 INT 15
Diese Funktion wurde beim IBM-PC für die Ein-/Ausgaberoutine des Kassettenrecorders
benutzt. Bei Folgemodellen bleibt die Funktion frei oder wird für andere Zwecke belegt.
Im BIOS des IBM-PC/AT sind z.B. weitere Funktionen im INT 15 implementiert.
Die einzelnen Funktionen werden über den Inhalt des Registers AH selektiert. Die Codes
00H bis 03H sind durch die Kassetten-I/O-Funktionen belegt. Sie geben im Register AH
jeweils den Wert 86H zurück, falls der Ausgang für den Recorder fehlt. Gleichzeitig wird
das Carry-Flag gesetzt.
Die Aufrufe AH = 04H bis 7FH sind bei älteren BIOS-Versionen nicht implementiert und
geben ebenfalls den Wert 86H im Register AH zurück, wobei ebenfalls das Carry-Flag
gesetzt wird. Erweiterungen ergeben sich nur bei neueren BIOS-Versionen (AT03, PS/2
etc.).
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
93
Auch Betriebssystemerweiterungen wie TopView und DesqView benutzen einige
Funktionen des Interrupt 15. Da diese Softwareprodukte in Deutschland nicht allgemein
verbreitet sind, wird auf die Schnittstellen nicht eingegangen. Bei einigen Systemen
benutzt das Programm PRINT.COM die Funktion 20H des INT 15 zur Speicherung
interner Flags.
Die Funktionsaufrufe 80H, 81H, 82H und 85H wurden im BIOS der älteren IBM PC/ATComputer bereits reserviert. Sie sind aber mit einem einfachen IRET-Statement
abgeschlossen. In den erweiterten BIOS-Versionen lassen sich hier besondere Funktionen
einbringen, die nachfolgend beschrieben werden.
ABIOS Build System Parameter Table (AH = 04)
Eine der Ausnahmen im Bereich der Funktionscodes AH=04H bis 7FH bieten die Aufrufe
der erweiterten ABIOS-Funktionen der PS/2-Systeme. Der INT 15 mit der Funktion AH =
04H besitzt folgende Übergabeschnittstelle:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 04H (Build Table)
°
° ES:DI: Ergebnispuffer
°
° DS: Segment RAM
°
û-------------------------------À
°
RETURN
°
° CY: 0 o.k.
°
° AH: 00
°
° CY: 1 Fehler
°
Û-------------------------------ì
Beim Aufruf ist in ES:DI die Adresse eines 32 Byte (20H) großen Ergebnispuffers zu
übergeben. Dieser Puffer besitzt folgende Struktur:
Offset Bytes Bedeutung
00H
04H
08H
0CH
0EH
1EH
04
04
04
02
16
02
FAR Adr. ABIOS Common Startroutine
FAR Adr. ABIOS Interrupt Routine
FAR Adr. ABIOS Time-out Routine
Stackgröße in Byte
reserviert
Einträge in der Init. Tabelle
Nach dem Aufruf finden sich in diesem Puffer die Daten, sofern das Carry-Flag gelöscht ist
und AH den Wert 0 enthält. In DS ist das Segment für die ABIOS-RAM-Erweiterungen zu
übergeben. Der Wert 0 in DS bedeutet, daß keine Erweiterungen vorgenommen werden
sollen.
ABIOS Build Initialisation Table (AH = 05)
Dieser Aufruf erzeugt die Initialisierungs-Tabelle für die ABIOS-Routinen. Es gilt
folgende Übergabeschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
94
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 05H (Build Init Table)
°
° ES:DI: Adresse Puffer
°
° DS: Segment RAM
°
û-------------------------------À
°
RETURN
°
° CY: 0 o.k.
°
° AH: 00
°
° CY: 1 Fehler
°
Û-------------------------------ì
Beim Aufruf ist in ES:DI die Adresse eines n (18H * Zahl der Einträge) Byte großen
Puffers zu übergeben. Dieser Puffer besitzt für jeden Eintrag folgende Struktur:
Offset Byte Bedeutung
00H
02 Device ID
02H
02 Zahl der logische ID's
04H
02 Device Blocklänge (0 bei gepatchten
Funktionen oder Erweiterungen)
06H
04 Init Routine Device Block und
Funktions Transfer Tabelle
0AH
02 Request Block Länge
0CH
02 Länge Funktions Transfer Tabelle
(0 = Funktion gepatcht)
0EH
02 Länge Datenzeiger
10H
01 Second Device ID (HW Level)
11H
01 Revision Number
12H
06 reserviert
Nach einem erfolgreichen Aufruf (CY = 0 und AH = 0) enthält der Puffer die
Ergebnisdaten.
ESDI-Format-Unit-Interrupt (AH = 0FH)
Eine weitere Ausnahme im Bereich der Funktionscodes AH=04H bis 7FH bildet der
Aufruf der Funktion AH = 0FH der PS/2-ESDI-Schnittstelle. Er wird bei den PS/2Systemen beim Low-Level-Format über den INT 13 periodisch aufgerufen, sobald ein
Zylinder formatiert ist. Hierbei gilt folgende Übergabeschnittstelle:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 0FH (Format Interrupt)
°
° AL: Phasencode
°
û-------------------------------À
°
RETURN
°
° CY: 0 Formatierung fortsetzen °
° CY: 1 beende Formatierung
°
Û-------------------------------ì
Der Interrupt 15 wird von der BIOS-INT-13-Routine ausgelöst, wobei im Register AL ein
Code für die aktuelle Phase des Formatiervorganges übergeben wird:
AL =
00H
01H
02H
reserviert
Oberflächenanalyse
Formatierung
Das Anwenderprogramm kann den Formatiervorgang durch Setzen des Carry-Flags
unterbrechen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
95
Tastatur-Interrupt (AH = 4FH)
Eine weitere Ausnahme bietet der Tastatur-Interrupt (AH = 4FH). Diese Funktion läßt sich
durch den Anwender jedoch nicht aufrufen. Vielmehr löst die INT 9-Routine des BIOS bei
neueren Versionen einen INT 15 mit der Funktion 4FH aus. Hierbei gilt folgende
Übergabeschnittstelle:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 4FH (Key Interrupt)
°
° AL: Scan Code
°
° CY: 1
°
û-------------------------------À
°
RETURN
°
° CY: 0 ignore Scan Code
°
Û-------------------------------ì
Während der Abarbeitung des INT 9-Aufrufes ermittelt die zugehörige BIOS-Routine den
Scan-Code der betreffenden Taste. Vor der Weitergabe an den Tastaturpuffer aktiviert die
Routine dann den INT 15 mit der Funktion 4FH. Hier kann das Betriebssystem nun eine
eigene Routine installieren, die den im Register AL übergebenen Scan Code auswertet und
gegebenenfalls modifiziert. Löscht die Routine das Carry-Flag, ignoriert der INT 9-Handler
anschließend den Scan Code im Register AL. So lassen sich zum Beispiel einzelne Tasten
softwaremäßig sperren. Bei einem gesetzten Carry-Flag speichert die INT 9-Routine
anschließend den Scan Code im Tastaturpuffer.
Open Device (AH = 80H)
Mit dieser Funktion läßt sich eine Geräteeinheit öffnen. Der Funktionscode ist bei allen
BIOS-Versionen bereits für diese Aufgabe reserviert. Es gelten folgende Aufrufparameter:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 80H (Open Device)
°
° BX: Device ID
°
° CX: Prozess ID
°
û-------------------------------À
°
RETURN
°
° CY: 0 ok
°
° AH: 0
°
° CY: 1 Fehler
°
° AH: Status
°
° 80H invalid function
°
° 86H unsupported function
°
Û-------------------------------ì
Im Register BX ist die Identifikationsnummer des zu öffnenden Gerätes zu hinterlegen,
während in CX der Kenncode des zugehörigen Prozesses steht. Das Carry-Flag ist vor dem
Aufruf zu löschen.
Close Device (AH = 81H)
Mit dieser Funktion läßt sich eine per INT 15 geöffnete Geräteeinheit wieder schließen.
Der Funktionscode ist bei allen BIOS-Versionen bereits für diese Aufgabe reserviert. Es
gelten folgende Aufrufparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
96
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 81H (Close Device)
°
° BX: Device ID
°
° CX: Prozess ID
°
û-------------------------------À
°
RETURN
°
° CY: 0 ok
°
° AH: 0
°
° CY: 1 Fehler
°
° AH: Status
°
° 80H invalid function
°
° 86H unsupported function
°
Û-------------------------------ì
Im Register BX ist die Identifikationsnummer des zu öffnenden Gerätes zu hinterlegen,
während in CX der Kenncode des zugehörigen Prozesses steht. Das Carry-Flag ist vor dem
Aufruf zu löschen.
Program Termination (AH = 82H)
Mit diesem Aufruf läßt sich ein Programm mit der angegebenen Devicenummer abbrechen.
Es gelten folgende Aufrufkonventionen:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 82H (Program Termination) °
° BX: Device ID
°
û-------------------------------À
°
RETURN
°
° CY: 0 ok
°
° AH: 0
°
° CY: 1 Fehler
°
° AH: Status
°
° 80H invalid function
°
° 86H unsupported function
°
Û-------------------------------ì
Die Aufrufe 80H bis 82H geben keine Parameter zurück. Lediglich der Status der
Operation findet sich im Carry und AH. Die Funktionen werden vom BIOS reserviert.
Einige Hersteller benutzen die Codes bei erweiterten BIOS-Versionen. Diese Funktionen
lassen sich von Multitasking Erweiterungen abfangen.
Event Wait (AH = 83H)
Mit dieser Funktion können Zeitaufträge an das BIOS abgesetzt werden. Das BIOS reagiert
dann auf den Ablauf der Uhr mit dem Setzen des Event-Flags. Es gelten folgende
Aufrufparameter:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 83H (Event Wait)
°
° AL: Steuercode (0 oder 1)
°
° CX:DX Wartezeit in Mikrosek. °
° ES:BX Zeiger auf Flagadresse °
û-------------------------------À
°
RETURN
°
°
°
° CY: Fehler
°
Û-------------------------------ì
Mit dem Wert AL = 0 wird der Zeitauftrag an das BIOS abgesetzt. Das Registerpaar
CX:DX enthält dabei die Wartezeit in Mikrosekunden. Nach Ablauf der spezifizierten
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
97
Zeitdauer setzt die Funktion das höchste Bit des Event-Flags. Dieses Event-Flag ist als
Bytefeld vom Anwenderprozeß einzurichten, wobei die Adresse im Registerpaar ES:BX
übergeben wird. Das Bit muß vorher gelöscht worden sein, so daß der Anwenderprozeß
durch Abfrage des Bits auf das Ereignis warten kann.
Wird die Funktion mit AL = 1 aufgerufen, löscht die Routine den letzten Zeitauftrag aus
der Tabelle (Cancel). Dann wird das Bit nicht mehr gesetzt.
Im Fehlerfall ist das Carry-Flag nach dem Aufruf gesetzt. Dies ist zum Beispiel der Fall,
wenn im Register AL ein Wert ungleich 0 oder 1 übergeben wird. Eine andere
Fehlermöglichkeit besteht darin, bei einem noch laufenden Zeitauftrag die Funktion erneut
mit dem Code AL = 0 aufzurufen. Dann ist nach dem Aufruf das Carry-Flag gesetzt.
Joystick Support (AH = 84H)
Mit diesem Aufruf läßt sich ein eventuell angeschlossener Joystick abfragen. Für den
Aufruf gelten folgende Parameter:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 84H (Joystick Support)
°
° DX: Steuercode (0 oder 1)
°
û-------------------------------À
°
RETURN
°
° CY = 1 -> kein Joystick
°
° CY = 0 -> Joystick vorhanden °
° bei DX = 1 gilt:
°
° AX: Wert A(x) Koordinate
°
° BX: Wert A(y) Koordinate
°
° CX: Wert B(x) Koordinate
°
° DX: Wert B(y) Koordinate
°
° bei DX = 0
°
° AL: Status
°
Û-------------------------------ì
Falls kein Joystick vorhanden ist, wird das Carry-Flag gesetzt. Mit DX = 0 wird der
aktuelle Status des Joysticks abgefragt. Das Ergebnis findet sich im AL-Register in den
Bits 4-7.
Mit DX = 1 lassen sich die Koordinaten der zwei Joystickhebel abfragen. Diese finden sich
anschließend in den Registern AX, BX, CX und DX.
System Request Key (AH = 85H)
Mit dieser Funktion des INT 15 läßt sich der Zustand der System-Request-TasteFehler!
Verweisquelle konnte nicht gefunden werden.Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 85H (Get System Request) °
° AL: Key Status
°
û-------------------------------À
°
RETURN
°
° CF: 0 ok
°
° CF: 1 Fehler
°
° AH: Fehlerstatus
°
Û-------------------------------ì
Die Funktion wird durch den Tastaturtreiber aufgerufen. Im Register AL wird der Status
der System-Request-Taste zurückgegeben. Dabei gilt folgende Kodierung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Taste gedrückt
:
Taste losgelassen :
98
AL = 0
AL = 1
Dabei ist das Carry-Flag gelöscht. Normlerweise wird dieser Aufruf sofort durch den
Standard Handler beendet. Programme können sich aber in den Funktionsaufruf einklinken.
Auch dieser Aufruf wird nur in erweiterten BIOS-Versionen unterstützt.
Wait (AH = 86H)
Ähnlich der Funktion 83H (Wait Event) kann mit diesem Aufruf eine Zeitfunktion des
BIOS genutzt werden. Es gelten folgende Übergabeparameter:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 86H (Wait)
°
° CX:DX Delay-Zeit in Mikrosek. °
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Im Registerpaar CX:DX wird die Verzögerungszeit in Mikrosekunden angegeben.
Während die Funktion 83H (Wait Event) aber sofort die Kontrolle an den rufenden Prozeß
zurückgibt und nach Ablauf der Wartezeit das Event-Flag setzt, suspendiert dieser Aufruf
den Anwender-Task für die angegebene Zeitspanne. Erst dann kann der Anwender-Task
wieder aktiv werden. Damit läßt sich ein Programm für eine definierte Zeit anhalten.
Move Block (AH = 87H)
Ab dem 80286-Prozessor besteht die Möglichkeit, einen Speicherbereich bis 16 Mbyte zu
adressieren. MS-DOS erlaubt jedoch nur den Real-Modus des 8088/8086-Prozessors, in
dem 1 Mbyte adressiert werden kann. Es gibt aber Systeme, die den Bereich oberhalb
1 Mbyte belegen. Die Funktion 87H erlaubt es, aus MS-DOS diesen erweiterten (Extended
Memory) Bereich anzusprechen. Es gelten folgende Aufrufkonventionen.
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 87H (Move Block)
°
° CX: Zahl der Worte im Puffer °
° ES:SI Adresse Descriptor Tab. °
û-------------------------------À
°
RETURN
°
° CY: 0 kein Fehler
°
° CY: 1 Fehler
°
° AH: Status
°
Û-------------------------------ì
Im Register CX wird die Zahl der zu transferierenden Wörter spezifiziert. Es läßt sich
immer nur ein Bereich von maximal 64 Kbyte (32 Kwörter) transferieren, wodurch der
maximale Wert in CX auf 8000H begrenzt ist.
Das Registerpaar ES:DI zeigt auf eine Tabelle mit Steuerparametern für den Transfer. Da
die Speicherbereiche oberhalb der 1-Mbyte-Grenze liegen, erfolgt der Transfer über
24-Bit-Adressen im Protected Modus des 80286-Prozessors. Die Tabelle mit den
Steuerparametern (Descriptor-Tabelle) enthält Einträge für die Quelle und das Ziel. Es
ergibt sich folgende Struktur:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
ES:SI ->
99
Ö-----------------------------Ì<--Ì
°
Dummy
°
°
û-----------------------------À
°
°
Tabellenanfangsadresse
û---ì
û-----------------------------À
°
Descriptor Quelladresse
°
û-----------------------------À
°
Descriptor Zieladresse
°
û-----------------------------À
°
Codesegment BIOS
°
û-----------------------------À
°
Stacksegment
°
Û-----------------------------ì
Bild 2.11: Der Aufbau der Descriptor-Tabelle bei der Move-Funktion
Das erste Feld besitzt eine Länge von 8 Byte und ist vom Anwenderprogramm mit den
Werten 00H aufzufüllen (Dummy-Feld).
Ab Offset 08H findet sich ein 8-Byte-Feld mit der Segmentadresse des Datenbereiches.
Das Feld ist vom Benutzer zu null zu setzen. Später findet sich hier die Anfangsadresse der
Tabelle.
Die Beschreibung der Quell- und Zieladressen (Descriptoren) besteht aus je einem Feld mit
folgendem Aufbau:
Ö-------Ú----------------------------------Ì
° Bytes ° Feld
°
û-------é----------------------------------À
°
2
° Segmentgröße in Bytes (1-65536) °
û-------é----------------------------------À
°
2
° Low Word 24 Bit Segmentadresse
°
û-------é----------------------------------À
°
1
° Highbyte 24 Bit Segmentadresse
°
û-------é----------------------------------À
°
1
° Flag mit Zugriffsrechtkennung
°
û-------é----------------------------------À
°
2
° reserviert
°
Û-------Ù----------------------------------ì
Tabelle 2.10: Der Aufbau der Descriptoren mit den Quell- und Zieladressen bei der Move-Funktion
Die Segmentgröße muß kleiner als 64 Kbyte sein. Im Feld »ZugriffsrechtFehler!
Verweisquelle konnte nicht gefunden werden.91H nur lesen
93H schreiben und lesen
abgespeichert.
Der Sourcedescriptor findet sich ab Offset 10H und besitzt den in Tabelle 2.10
beschriebenen Aufbau. Ab Offset 18H findet sich der Descriptor für die Zieladresse mit der
gleichen Struktur.
Die restlichen zwei Descriptoren sind vom Anwender mit den Werten 00H zu füllen. Der
erste dieser Descriptoren findet sich ab Offset 20H und dient zur Aufnahme eines
»virtuellenFehler! Verweisquelle konnte nicht gefunden werden.Nach dem Aufruf zeigt
das Carry-Flag den Fehlerstatus an. Ist es gesetzt, findet sich im AH-Register der
Statuscode aus Tabelle 2.11.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
100
Ö-------Ú----------------------------------Ì
° Code ° Status
°
û-------é----------------------------------À
° 00
° Transfer ohne Fehler beendet
°
û-------é----------------------------------À
° 01
° RAM - Parity Error (gelöscht)
°
û-------é----------------------------------À
° 02
° Exception Interrupt Error
°
û-------é----------------------------------À
° 03
° Gate Address Line 20 gestört
°
Û-------Ù----------------------------------ì
Tabelle 2.11: Fehlercodes bei der Move-Funktion (INT 15)
Die Funktion sichert alle Registerinhalte bis auf das AX-Register. Es lassen sich also
bestimmte Datensegmente im 16-Mbyte-Adreßbereich transferieren. Die Größe eines
einzelnen Segments darf dabei 64 Kbyte nicht überschreiten. Quell- und Zielsegment
müssen dabei eine Mindestgröße von 2*CX-1 Byte aufweisen, da sonst Daten
verlorengehen.
Während des Transfers ist das komplette Interruptsystem wegen der in Kapitel 1
beschriebenen Inkompatibilitäten mit den Intel-Spezifikationen gesperrt. Die InterruptDescriptor-Tabelle für den 80286 »Protected ModusEs ist zu beachten, daß eventuell die
Uhrzeit durch das gesperrte Interruptsystem nachgeht. Der Abgleich ist Aufgabe des
Anwenderprogrammes. In der Compatibility Box von OS/2 wird die Funktion nicht
unterstützt. Falls Sie auf das Extended Memory oberhalb 1 Mbyte zurückgreifen möchten,
sollten Sie die Funktionen des XMS-Treibers (siehe Abschnitt 12.3) nutzen.
Extended Memory Size (AH = 88H)
Dieser Aufruf des INT 15 erlaubt die Größe eines erweiterten Speicherbereiches (Extended
Memory) im Bereich oberhalb von 1 Mbyte festzustellen. Es gelten folgende
Aufrufkonventionen:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 88H (Extend. Memory Size) °
û-------------------------------À
°
RETURN
°
° CY: 0 kein Fehler
°
° AX: Speichergröße in Kbyte
°
° CY: 1 Fehler
°
° AH: Status
°
Û-------------------------------ì
Die Speichergröße oberhalb 1 Mbyte wird beim Systemstart ermittelt und ab Adresse 20H
und 31H im CMOS-RAM des Uhrenbausteins abgelegt. Dieser Extended-Memory-Bereich
kann aber erst ge-nutzt werden, wenn das Gerät mit mindestens 512 Kbyte im
Grundbereich ausgerüstet ist.
Nach dem Aufruf enthält das AX-Register die Größe des Extended Memory in Kbyte,
sofern das Carry-Flag gelöscht ist. Bei gesetztem Carry-Flag enthält AH einen Fehlercode
(80H ungülitges Kommando, 86H Funktion wird nicht unterstützt).
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
101
Virtual Modus (AH = 89H)
Mit dem Aufruf dieser INT 15-Funktion läßt sich die 80286 CPU aus DOS heraus in den
Protected Modus schalten. Nach dem Aufruf findet sich der Prozessor im virtuellen Modus
und das im Register ES:SI übergebene Segment wird abgearbeitet. Es gelten folgende
Aufrufkonventionen:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 89H (Virtual Modus)
°
° ES:SI Zeiger auf Descriptor- °
°
Tabelle
°
° BX: Offset-INT-Tabelle
°
° CX: Offset-Codesegment
°
û-------------------------------À
°
RETURN
°
° CY: 0 -> ok
°
° AH: 0 -> Virtual Modus ok
°
° CY: 1 -> Fehler
°
° AH: FF
°
Û-------------------------------ì
Beim Aufruf werden alle Register zerstört. In dem Registerpaar ES:SI wird wieder die
Adresse der Descriptor-Tabelle übertragen. Diese besitzt folgenden Aufbau:
ES:SI ->
Ö-----------------------------Ì<--Ì
°
Dummy
°
°
û-----------------------------À
°
°
Tabellenanfangsadresse
°---ì
û-----------------------------À
°
Interrupt-Tabelle
°
û-----------------------------À
°
User Datensegment
°
û-----------------------------À
°
User Extrasegment
°
û-----------------------------À
°
User Stacksegment
°
û-----------------------------À
°
User Codesegment
°
û-----------------------------À
°
internal Codesegment
°
Û-----------------------------ì
Bild 2.12: Der Aufbau der Descriptor-Tabelle; im Virtual Modus
Die Descriptoren sind gemäß den Konventionen in Tabelle 2.10 aufgebaut. Die ersten 8
Byte sind mit 00 zu füllen. Die folgenden 8 Byte der Global-Descriptor-Tabelle sind
ebenfalls mit 00 zu initialisieren.
Der dritte Descriptor zeigt auf die Interrupttabelle, die vom Anwenderprozeß anzulegen ist.
Im Register BH findet sich der Offset in diese Tabelle, ab der die ersten 8 HardwareInterrupts (IRQ8) beginnen. Der Wert in BL spezifiziert den Offset in die Tabelle mit den
folgenden 8 Hardware-Interrupts (IRQ0).
Die weiteren Descriptoren dienen zum Spezifizieren der DS-, ES-, SS- und CS-Register im
Virtual Modus. Sie sind durch den Anwenderprozeß vor dem Aufruf zu definieren.
Lediglich der letzte Descriptor wird für interne Zwecke benutzt und ist vor dem Aufruf zu
null zu setzen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
102
Im Register CX ist die Adresse des Codesegmentes für den Protected-Mode-Betrieb
anzugeben. Die CPU beginnt dort mit der Abarbeitung der Programmanweisungen.
Weiterhin ist das Carry-Flag vor dem Aufruf zu löschen.
Nach dem Aufruf dieser Funktion steht kein BIOS mehr zur Verfügung, d.h., das
Anwenderprogramm muß alle Ein-/Ausgabefunktionen selbst übernehmen. Auch die
Interruptvektoren müssen gemäß den Konventionen des 80286 verändert und initialisiert
werden. Es besteht keine offizielle Möglichkeit mehr, den 80286-Prozessor in den Real
Modus zurückzuschalten, es sei denn, der Rechner wird abgeschaltet. Im BIOS nutzt man
den Trick, einen Reset-Befehl im CMOS-RAM abzulegen und diesen dann auszuführen.
Dann wird das System an dem alten BIOS-Punkt wieder aufgesetzt. Alternativ besteht die
Möglichkeit, die Länge der Interrupt-Descriptor-Tabelle auf 0 zu setzen. Wird dann ein
Software-Interrupt ausgeführt, gerät das System in einen illegalen Zustand (triple fault),
worauf die CPU einen internen Reset ausführt.
Die Funktionen 90H (Device Busy) und 91H (Interrupt Complete Flag) sind im AT-BIOS
bereits für zukünftige Erweiterungen vorgesehen, aber nicht implementiert. In erweiterten
BIOS-Versionen gilt folgende Aufrufschnittstelle:
Device Busy (AH = 90H)
Mit dem Aufruf läßt sich prüfen, ob eines der angeschlossenen Geräte belegt (busy) ist.
Hierbei gelten folgende Aufrufparameter.
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 90H (Device Busy)
°
° AL: Type Code
°
° ES:BX Zeiger auf Request
°
°
Kontrollblock
°
û-------------------------------À
°
RETURN
°
° CY: 0 -> Gerät frei
°
° CY: 1 -> Geräte busy
°
Û-------------------------------ì
Vor dem Aufruf ist weiterhin das Carry-Flag zu löschen.
Der Aufruf prüft im Grunde, ob beim angeschlossenen Gerät ein Time Out aufgetreten ist.
Im Register AL ist hierzu der Code für das angeschlossene Gerät zu übergeben. Dabei gilt
die folgende Kodierung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
103
Ö------Ú---------------------------------------------Ì
° Code ° Gerät
°
û------é---------------------------------------------À
° 00 ° Festplatte (Time Out)
°
û------é---------------------------------------------À
° 01 ° Diskettenlaufwerk (Time Out)
°
û------é---------------------------------------------À
° 02 ° Tastatur (kein Time Out)
°
û------é---------------------------------------------À
° 03 ° Zeiger-Einheit (Time Out)
°
û------é---------------------------------------------À
° 80 ° Netzwerk (kein Time Out) ES:BX zeigt auf
°
°
° den Netzwerkkontrollblock
°
û------é---------------------------------------------À
° FC ° Festplatten-Reset für PS/2 (Time Out)
°
û------é---------------------------------------------À
° FD ° Diskettenlaufwerk Motorstart (Time Out)
°
û------é---------------------------------------------À
° FE ° Drucker (Time Out)
°
Û------Ù---------------------------------------------ì
Tabelle 2.12: Type Codes der INT 15-Funktion 90H
Unterstützt das BIOS den Aufruf nicht, gibt das BIOS im Register AH den Wert 86H
zurück und setzt gleichzeitig das Carry-Flag.
Die Device-Typen werden in drei Gruppen unterteilt:
00-7FH
80-BFH
C0-FFH
nicht reentrante Einheiten, Zugriffskoordinierung per Betriebssystem
reentrante Einheiten, ES:BX zeigt dann
auf einen Controll Block
Wait only Aufrufe
Die Aufrufe im Bereich C0-FFH besitzen kein Äquivalent bei der Funktion 91H.
Bei Device-Typen im Bereich zwischen 80H und BFH muß ES:BX auf einen
Kontrollblock zeigen. Bezieht sich der Aufruf zum Beispiel auf eine Netzwerkeinheit
(Code=80H), dann ist im Registerpaar ES:BX ein Zeiger auf den zugehörigen
Netzwerkkontrollblock in der Segment:Offset-Notation zu übergeben. Innerhalb des
Netzwerkes wird allerdings kein Time Out gemeldet.
Nach dem Aufruf zeigt ein gesetztes Carry-Flag an, daß bei der Einheit ein Time Out
aufgetreten ist. Die Funktion kann von Multitasking System abgefangen werden. Aufrufe
mit den Codes zwischen C0H und FFH erlauben zum Beispiel, daß ein Task ausgeführt
wird, wenn das BIOS auf das Ende einer I/O-Operation wartet.
Set Complete Interrupt Flag (AH=91H)
Mit diesem Aufruf unterstützt das erweiterte BIOS den Abschluß eines Interrupts durch
Setzen des Interrupt Complete Flag. Dabei gilt folgende Aufrufschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
104
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: 91H (Set Interrupt Flag) °
° AL: Type Code
°
° ES:BX Zeiger auf Request
°
°
Kontrollblock
°
û-------------------------------À
°
RETURN
°
° AH = 00
°
Û-------------------------------ì
Der Aufruf gibt keine Parameter zurück. Im Register AL ist der Code für die gewünschte
Einheit zu übergeben. Es gilt dabei die in Tabelle 2.12 gezeigte Kodierung (00 -> Disk, 01
-> Diskette etc.). Die Codes in AL lassen sich dabei gemäß folgender Tabelle in drei
Gruppen zusammenfassen:
Ö----------Ú------------------------------------------Ì
° AL
° Bemerkung
°
û----------é------------------------------------------À
° 00 - 7FH ° Einheiten, auf die vom Betriebssystem
°
°
° sequentiell zugegriffen wird. Das Be°
°
° triebssystem übernimmt dabei die Ko°
°
° ordinierung der Aufrufe.
°
û----------é------------------------------------------À
° 80 - BFH ° Reentrante Aufrufe, die sich im wesent- °
°
° lichen auf das Netzwerk beziehen. Es
°
°
° lassen sich daher mehrere Aufrufe zur
°
°
° gleichen Zeit bearbeiten. Die Übergabe- °
°
° parameter sind deshalb vom rufenden Pro- °
°
° zeß in Kontrollblöcken zu speichern,
°
°
° deren Adresse als Zeiger übergeben wird. °
û----------é------------------------------------------À
° C0 - FFH ° Diese Aufrufe beziehen sich auf Verzö°
°
° gerungszähler (z.B. Diskette Motor
°
°
° Start oder Printer Time Out)
°
Û----------Ù------------------------------------------ì
Tabelle 2.13: Zusammenfassung der Type-Codes in Gruppen
Unterstützt das BIOS den Aufruf nicht, setzt es das Carry-Flag und gibt den Wert 86H im
Register AH zurück.
Get Configuration Parameter (AH=C0H)
Mit diesem Aufruf läßt sich die Adresse eines Parameterblocks mit Informationen über die
BIOS- und Systemkonfiguration abfragen. Es gelten folgende Aufrufkonventionen:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: C0H (Get Configuration)
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AL: 86 Funktion fehlt
°
° CY: 0 ok
°
° ES:BX Adresse Parameterblock °
Û-------------------------------ì
Es wird beim Aufruf der Funktionscode C0H im Register AH übergeben. Ist die
entsprechende Funktion im BIOS nicht implementiert, setzt dieses das Carry-Flag und gibt
in AH den Wert 86H zurück.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
105
DOS Programmierhandbuch
Bei einem erfolgreichen Aufruf ist das Carry-Flag gelöscht und das Registerpaar ES:BX
enthält einen Zeiger auf den Parameterblock im BIOS. Dieser Parameterblock besitzt
folgenden Aufbau:
Ö--------Ú-------Ú--------------------------------------Ì
° Offset ° Bytes ° Bedeutung
°
û--------é-------é--------------------------------------À
° 00
°
2
° Länge der Parametertabelle in Byte
°
û--------é-------é--------------------------------------À
° 02
°
1
° Code des Systemmodells
°
û--------é-------é--------------------------------------À
° 03
°
1
° Unterversion des Systemmodells
°
û--------é-------é--------------------------------------À
° 04
°
1
° BIOS-Systemrevisionsnummer
°
û--------é-------é--------------------------------------À
° 05
°
1
° Systeminformation
°
°
°
° Bit 7 Disk BIOS benutzt DMA Chan. 3 °
°
°
° Bit 6 kaskadierter Interrupt (2)
°
°
°
° Bit 5 CMOS Clock vorhanden
°
°
°
° Bit 4 Tastaturumleitung aktiv
°
°
°
° Bit 3 Wait ext. Event implementiert °
°
°
° Bit 2 extend. BIOS-Ber. reserviert °
°
°
° Bit 1 PS/2 I/O-Channel
°
°
°
° Bit 0 reserviert
°
û--------é-------é--------------------------------------À
° 06
°
4
° reserviert für Systeminformationen
°
Û--------Ù-------Ù--------------------------------------ì
Tabelle 2.14: Kodierung der Systeminformationen;
In der Tabelle sind verschiedene Informationen über die Systemhardware und die aktuelle
Systemkonfiguration abgelegt. Diese lassen sich dann durch das Betriebssystem oder die
Anwendersoftware abfragen.
Die Länge der Tabelle wird im ersten Byte zurückgegeben, so daß diese zukünftig variiert
werden kann. Die folgenden zwei Byte enthalten eine Information über das Modell des
verwendeten Rechners. Daran schließt sich die Revisionsnummer des BIOS an, die vom
Hersteller vergeben wird. Der Wert 00H bezeichnet die erste Ausgabe.
Ab Offset 05H findet sich ein Byte mit Informationen über den Hardwarezustand. Jedem
einzelnen Bit sind dabei bestimmte Informationen zugeordnet. So signalisiert Bit 7 = 1, daß
das Festplatten-BIOS den DMA-Kanal 3 des Systems zum Datentransfer benutzt. Mit Bit 6
= 1 steht zum Beispiel fest, daß zwei Interrupt-Controller kaskadiert wurden.
Die restlichen Bytes sind für zukünftige Erweiterungen reserviert.
Return Extended BIOS-Data Area Segment Adresse (AH = C1H)
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: C1H (Get Adress)
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° CY: 0 ok
°
° ES: Adresse
°
Û-------------------------------ì
Mit der Unterfunktion AH = C1H
Datensegmentes abfragen.
läßt sich die Adresse des Extended-BIOS-
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
106
PS/2-BIOS Maus Interface (AH = C2H)
Die Funktionen mit dem Code AH=C2H sind nur bei IBM PS/2-Systemen implementiert
und unterstützen rudimentäre Funktionen zur Ansteuerung der intergrierten Maus. Hierbei
gelten folgende Unterfunktionen.
PS/2-BIOS Maus Enable/Disable(AX = C200H)
Dieser Aufruf erlaubt es, den Maustreiber aus- oder einzuschalten.
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: C2H (Get Adress)
°
° AL: 00H
°
° BH: 00H disable
°
°
01H enable
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
Û-------------------------------ì
Nach dem Aufruf wird im Carry-Flag der Status zurückgegeben. Bei gesetztem Carry-Flag
enthält AH einen Statuscode.
Für diesen Code gilt folgende Belegung:
Code
00H
01H
02H
03H
04H
05H
Status
Aufruf erfolgreich
ungültige Funktion
ungültige Eingabe
Interface Fehler
Abfrage muß wiederholt werden
kein Device Treiber installiert
Weitere Informationen enthalten die Unterlagen über das PS/2-BIOS.
PS/2-BIOS Maus Reset (AX = C201H)
Dieser Aufruf erlaubt es, den Maustreiber des BIOS zurückzusetzen.
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: C2H
°
° AL: 01H (Reset)
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
° BH: Device ID
°
Û-------------------------------ì
Nach dem Aufruf wird im Carry-Flag der Status zurückgegeben. Bei gesetztem Carry-Flag
enthält AH einen Statuscode gemäß Funktion C200H. Bei gelöschten Carry-Flag wurde der
Treiber zurückgesetzt und in BH findet sich die ID-Nummer.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
107
PS/2-BIOS Set Sampling Rate(AX = C202H)
Dieser Aufruf erlaubt es, die Abtastrate des Maustreibers im BIOS zu setzen.
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: C2H
°
° AL: 02H (Set Sampling Rate)
°
° BH: Sampling Rate
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
Û-------------------------------ì
Im Register BH ist die Abtastrate für den Maustreiber zu übergeben. Nach dem Aufruf
wird im Carry-Flag der Status zurückgegeben. Bei gesetztem Carry-Flag enthält AH einen
Statuscode gemäß Funktion C200H. Bei gelöschten Carry-Flag wurde die neue Abtastrate
eingestellt.
Für die in BH übergebene Abtastrate gilt folgende Codierung:
BH = 00H
01H
02H
03H
04H
05H
06H
Sampling
Sampling
Sampling
Sampling
Sampling
Sampling
Sampling
Rate
Rate
Rate
Rate
Rate
Rate
Rate
10/Sekunde
20/Sekunde
40/Sekunde
60/Sekunde
80/Sekunde
100/Sekunde
200/Sekunde
PS/2-BIOS Set Resolution(AX = C203H)
Dieser Aufruf erlaubt es, die Auflösung des Maustreibers im BIOS zu setzen.
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: C2H
°
° AL: 03H (Set Resulution)
°
° BH: Resolution
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
Û-------------------------------ì
Im Register BH ist die Auflösung in mm für den Maustreiber zu übergeben. Nach dem
Aufruf wird im Carry-Flag der Status zurückgegeben. Bei gesetztem Carry-Flag enthält AH
einen Statuscode gemäß Funktion C200H. Bei gelöschten Carry-Flag wurde die neue
Auflösung eingestellt.
Für die in BH übergebene Auflösung gilt folgende Codierung:
BH = 00H
01H
02H
03H
1
2
4
8
Count
Counts
Counts
Counts
pro
pro
pro
pro
Millimeter
Millimeter
Millimeter
Millimeter
PS/2-BIOS Get Type(AX = C204H)
Dieser Aufruf erlaubt es, den Typ des Treibers abzufragen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
108
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: C2H
°
° AL: 04H (Get Type)
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
° BH: Type
°
Û-------------------------------ì
Im Register BH wird bei fehlerfreiem Aufruf (Carry-Flag = 0) der Type zurückgegeben.
PS/2-BIOS Initialize(AX = C205H)
Dieser Aufruf erlaubt die Initialisierung des Maustreibers.
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: C2H
°
° AL: 05H (Initialize)
°
° BH: Paketgröße
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
Û-------------------------------ì
Der Fehlerstatus wird im Carry-Flag zurückgegeben. Es gilt die Fehlercodierung wie bei
der Funktion C200H.
PS/2-BIOS Get/Set Scaling Faktor (AX = C206H)
Dieser Aufruf erlaubt es, die Skalierungsfaktoren des Maustreibers im BIOS zu setzen oder
abzufragen.
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: C2H
°
° AL: 06H (Get/Set Scale Faktor)°
° BH: Subfunktion
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
° BL: Treiber Status
°
° CL: Auflösung
°
° DL: Abtastrate
°
Û-------------------------------ì
Im Register BH ist der Subcode für die Unterfunktion zu übergeben. Nach dem Aufruf
wird im Carry-Flag der Status zurückgegeben. Bei gesetztem Carry-Flag enthält AH einen
Statuscode gemäß Funktion C200H. Bei gelöschten Carry-Flag wurde die Funktion
fehlerfrei ausgeführt.
Für die in BH übergebenen Untercodes gilt folgendes:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
109
BH = 00H Return Device Status
Rückgabe
in BL:
Bit 0: rechte Taste gedrückt
Bit 1: reserviert
Bit 2: linke Taste gedrückt
Bit 3: reserviert
Bit 4: 0 = 1:1 Skalierung, 1 = 2:1 Skalierung
Bit 5: Device enabled
Bit 6: 0 = Stream Mode, 1 = Remote Mode
Bit 7: reserviert
in CL: Auflösung (s. C203H)
in DL: Abtastrate (Reports / Sekunde)
BH = 01H Set Scaling Rate 1:1
BH = 02H Set Scaling Rate 2:1
Weitere Informationen sind den BIOS-Unterlagen zu entnehmen.
PS/2-BIOS Set Device Handler Adresse (AX = C207H)
Dieser Aufruf erlaubt es, einen neuen Treiber aus einer Anwendung zu installieren.
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: C2H
°
° AL: 07H (Set Device Handler) °
° ES:BX: Handler Adresse
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
Û-------------------------------ì
Im Registerpaar ES:BX ist die Segment:Offset-Adresse des neuen Treibers zu übergeben.
Ist das Carry-Flag nach dem Aufruf gelöscht, wurde die neue Routine als Maushandler
aktiviert. Andernfalls findet sich in AH der Fehlerstatus mit der Codierung gemäß Funktion
C200H.
Die Funktionen AH = C3H und C4H sind vom BIOS der PS/2 Modelle 50 bis 80 belegt.
Näheres findet sich in den BIOS-Unterlagen des Herstellers.
EISA-ROM Funktionen(AH = D8H)
Dieser Aufruf des INT 15 erlaubt bei Systemen mit dem EISA-Bus verschiedene
Statusabfragen der installierten Adapterplatinen. Im folgenden werden die entsprechenden
Aufrufe beschrieben.
EISA-ROM Read Slot Configuration(AX = D800H)
Diese Unterfunktion erlaubt die Überprüfung der Konfigurierung des Bussystems. Es gilt
folgende Aufrufschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
110
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: D8H
°
° AL: 00H (Read Configuration) °
° CL: Slot Nummer
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
° AL: Bit Flags
°
° BX: Version
°
° CX: Checksum
°
° DX: Infobytes
°
° SI:DI 4 Byte ID
°
Û-------------------------------ì
Beim Aufruf ist im Register CL die Nummer des abzufragenden Steckplatzes (Slot) zu
übergeben. Bei einem fehlerfreien Aufruf (Carry-Flag = 0) enthalten die angegebenen
Register die Informationen.
In AL wird ein Bitfeld mit folgender Kodierung zurückgegeben:
AL Bit 7
: 1 bei duplicate ID's
Bit 6
: 1 Produkt ID lesbar
Bit 4,5 : Typ des Steckplatzes (Slots)
00 = expansion, 01 = embedded
10 = virtual device
Bit 0-3 : duplicate ID-Nummer, falls Bit 7
gesetzt ist.
Jeder Steckplatz muß eine Karte mit einer eindeutigen Busnummer besitzen. Ist dies nicht
der Fall, wird Bit 7 gesetzt und die Nummer ist in den Bits 0 bis 3 enthalten.
Im Register BX wird die Versionnummer der Konfigurierutility zurückgegeben. Hierbei
gilt:
BH: Hauptrevisionsnummer Konfigurier-Utility
BL: Unterversionsnummer Konfigurier-Utility
In CX findet sich nach einem fehlerfreien Aufruf die Checksumme der
Konfigurierungsdatei. Das Register DH enthält die Nummer der Device Funktion, erlaubt
also die Identifikation, um welchen Kartentyp es sich handelt. DL enthält ein
Informationsbyte, dessen Kodierung zur Zeit nicht bekannt ist.
In SI:DI wird eine komprimierte 4 Byte lange ID-Nummer zurückgegeben. Für die
Belegung gelten die üblichen Intel Konventionen. Wird die Funktion im 16-Bit-Mode
aufgerufen, ist der Code D800H in AX zu übergeben. Bei 32-Bit-CS-Adressen ist der Code
in AX in D880H zu ändern.
Ist das Carry-Flag nach dem Aufruf gesetzt, liegt ein Fehler vor. Der entsprechende Code
wird in AH zurückgegeben:
Fehlercode in AH
80H ungültige Slotnummer
82H EISA CMOS Inhalt ungültig
83H leerer Slot
86H ungültiger BIOS-Firmware Funktionsaufruf
87H ungültige Systemkonfiguration
Bei gelöschtem Carry-Flag ist der Inhalt von AH auf den Wert 00H zurückgesetzt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
111
DOS Programmierhandbuch
EISA-ROM Read Funktion Configuration(AX = D801H)
Diese Unterfunktion erlaubt die Abfrage der
Busteilnehmers. Es gilt folgende Aufrufschnittstelle:
Konfigurierinformationen
eines
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: D8H
°
° AL: 01H (Read Configuration) °
° CH: Funktionsnummer
°
° CL: Slot Nummer
°
° DS:SI Bufferadresse
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
° DS:SI Buffer
°
Û-------------------------------ì
Beim Aufruf ist im Register CH eine Nummer für die zu lesende Funktion zu übergeben.
CL enthält die Nummer des abzufragenden Steckplatzes (Slot). Weiterhin muß in DS:SI
die
Adresse
eines
320
Byte
umfassenden
Ergebnisspuffers
für
den
Standardkonfigurationsdatenblock angegeben werden. Bei einem fehlerfreien Aufruf
(Carry-Flag = 0) enthalten die angegebenen Register die Informationen.
Bei gesetztem Carry-Flag enthält AH den Fehlercode mit der Belegung gemäß Funktion
D800H. Beim Aufruf der Funktion wird der Inhalt von BX zerstört. Ein Einsatz im 32-BitMode erfordert beim Aufruf in AL den Wert 81H.
EISA-ROM Clear EISA-CMOS-RAM(AX = D802H)
Diese Unterfunktion erlaubt es, daß EISA-CMOS-RAM zu löschen. Es gilt folgende
Aufrufschnittstelle:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: D8H
°
° AL: 02H (Clear CMOS-RAM)
°
° BX: Revision Level
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
° AH: 00H
°
Û-------------------------------ì
Beim Aufruf ist im Register BX die Revisionsnummer der Konfigurierutility zu übergeben.
BH einhält die Hauptversion, während BL die Unterversion aufnimmt.
Bei fehlerfreiem Aufruf wird das CMOS-RAM gelöscht und das Carry-Flag ist nach der
Rückkehr auf 0 gesetzt. Bei gesetztem Carry-Flag liegt ein Fehler vor. Dann gilt folgende
Belegung:
Fehlercode in AH
84H Fehler beim Löschen des CMOS-RAM's
86H ungültiger BIOS-Firmware Funktionsaufruf
88H Konfigurierutility Version nicht unterstützt
Wird die Funktion im 32-Bit-Mode aufgerufen, ist in AL der Code 82H zu übergeben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
112
EISA-ROM Write EISA-CMOS-RAM(AX = D803H)
Diese Unterfunktion erlaubt es, daß EISA-CMOS-RAM zu beschreiben. Es gilt folgende
Aufrufschnittstelle:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: D8H
°
° AL: 03H (Write CMOS-RAM)
°
° CX: Länge Daten
°
° DS:SI Datenpuffer
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
° AH: 00H
°
Û-------------------------------ì
Beim Aufruf ist im Register CX die Zahl der Datenbytes im Puffer anzugeben. Ein Wert
von 0000H bedeutet, daß ein Slot leer ist.
Die Konfigurierungsdaten befinden sich in einem Puffer, dessen Adresse im Registerpaar
DS:SI übergeben wird.
Bei fehlerfreiem Aufruf werden die Daten in das CMOS-RAM übertragen und das CarryFlag ist nach der Rückkehr auf 0 gesetzt. Bei gesetztem Carry-Flag liegt ein Fehler vor.
Dann gilt folgende Belegung:
Fehlercode in AH
84H Fehler beim Löschen des CMOS-RAM's
85H EISA-CMOS-RAM ist voll
86H ungültiger BIOS-Firmware Funktionsaufruf
Wird die Funktion im 32-Bit-Mode aufgerufen, ist in AL der Code 82H zu übergeben.
EISA-ROM Read Physical Slot(AX = D804H)
Diese Unterfunktion erlaubt die Überprüfung der Daten einer Steckkarte. Es gilt folgende
Aufrufschnittstelle:
Ö-------------------------------Ì
°
CALL: INT 15
°
°
°
° AH: D8H
°
° AL: 04H (Read Configuration) °
° CL: Slot Nummer
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AH: Status
°
° CY: 0 ok
°
° SI:DI 4 Byte ID
°
Û-------------------------------ì
Beim Aufruf ist im Register CL die Nummer des abzufragenden Steckplatzes (Slot) zu
übergeben. Hierbei kann es sich auch um eine embedded oder virtual Slotnummer handeln.
Bei einem fehlerfreien Aufruf (Carry-Flag = 0) wird in den Registern SI:DI eine
komprimierte 4-Byte-ID-Nummer zurückgegeben.
Bei gesetztem Carry-Flag liegt ein Fehler vor. Dann gilt folgende Belegung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
113
Fehlercode in AH
80H ungültige Slot Nummer
83H leerer Slot
86H ungültiger BIOS-Firmware Funktionsaufruf
Wird die Funktion im 32-Bit-Mode aufgerufen, ist in AL der Code 84H zu übergeben.
EISA-ROM 32-Bit CS-Adress-Mode-Calls(AX = D88xH)
Diese Unterfunktionen sind identisch zu den Funktionen D800H und D804H. Sie sollten
aber verwendet werden, falls das System im 32-Bit-Mode betrieben wird. Dann nutzen die
Zeiger das Register ESI an Stelle des SI-Registers.
Compac Systempro Multiprozessor(AX = ExxxH)
Einige Funktionen im Bereich ExxxH werden von Compac für Multiprozessor Operationen
genutzt. Nähere Hinweise finden sich in den Compac BIOS-Unterlagen.
2.8 Tastatur abfragen (INT 16)
Die BIOS-Funktion erlaubt es, den Status des Tastaturpuffers abzufragen sowie Zeichen
aus dem Puffer zu lesen. Die Steuerung erfolgt über das AH-Register, mit dem sich die
einzelnen Funktionen selektieren lassen. Beim Aufruf werden alle Register bis auf AX
erhalten.
Zeichen aus Puffer lesen (AH = 00H)
Mit der Unterfunktion AH = 0 läßt sich ein Zeichen aus dem Tastaturpuffer lesen. Es
gelten folgende Aufrufkonventionen.
Ö-------------------------------Ì
°
CALL: INT 16
°
°
°
° AH: 00H (Keyboard Read)
°
û-------------------------------À
°
RETURN
°
° AH: Scan Code
°
° AL: Zeichen
°
Û-------------------------------ì
Das ASCII-Zeichen findet sich in AL, während das AH-Register den Scan Code enthält.
Dies ist eine interne Darstellung der Zeichen auf der Tastatur.
Status des Puffers abfragen (AH = 01H)
Hiermit kann der Status des Tastaturpuffers abgefragt werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
114
DOS Programmierhandbuch
Ö-------------------------------Ì
°
CALL: INT 16
°
°
°
° AH: 01H (Get Status)
°
û-------------------------------À
°
RETURN
°
° AH: Scan Code
°
° AL: Zeichen
°
° Zero Flag:
°
° 1 : kein Zeichen im Puffer
°
° 0 : Zeichen im Puffer
°
Û-------------------------------ì
Das Ergebnis wird über das Zero-Flag angezeigt. Ist dieses Flag gesetzt, liegen keine
Zeichen im Tastaturpuffer vor. Falls Z = 0 ist, wird im AX-Register das Zeichen und der
Scan Code (wie bei Funktion AH = 0) zurückgegeben. Das Zeichen bleibt aber im Puffer
erhalten. Mit dieser Funktion läßt sich offenbar der Puffer auf Zeichen abfragen, ohne daß
diese zerstört oder entfernt werden.
Shift-Status abfragen (AH = 02H)
Mit dieser Abfrage läßt sich prüfen, ob die Shift- oder Alt-Tasten gedrückt sind. Im BIOSDatenbereich ist hierfür ein eigenes Statusbyte reserviert.
Ö-------------------------------Ì
°
CALL : INT 16
°
°
°
° AH: 02H (Read Shift Status)
°
û-------------------------------À
°
RETURN
°
° AL: Alt Keyboard Flag
°
Û-------------------------------ì
Das Ergebnis wird im AL-Register zurückgegeben. Es gilt folgende Belegung:
7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙÚÙÚÙÚÙÚÙÚÙÚÙÚì
° ° ° ° ° ° ° Û° ° ° ° ° ° Û--° ° ° ° ° Û----° ° ° ° Û------° ° ° Û--------° ° Û----------° Û------------Û---------------
1
1
1
1
1
1
1
1
=
=
=
=
=
=
=
=
rechte Shift-Taste gedrückt
linke Shift-Taste gedrückt
CTRL-Taste gedrückt
ALT-Taste gedrückt
SCROLL-LOCK-Status Ein
NUM-LOCK-Status Ein
CAPS-LOCK-Status Ein
Insert-Modus Ein
Bild 2.13: Kodierung des Keyboard-Statusflags
Durch Auswertung des Statusbytes
Tastenkombinationen gedrückt wurden.
läßt
sich
feststellen,
ob
bestimmte
Wiederholrate ändern (AH = 03H)
Bei moderneren BIOS-Versionen existiert die vielfach nicht dokumentierte Möglichkeit,
die Wiederholrate der Tastatur zu verändern. Die Funktion wird mit dem Code 03H in AH
aufgerufen und besitzt folgende Schnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
115
Ö-------------------------------Ì
°
CALL: INT 16
°
°
°
° AH: 03H (Repeat Rate)
°
° AL: 05H
°
° BL: Wiederholrate
°
° BH: Verzögerung in ms
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Im Register AL ist immer der Wert 05H zu übergeben. Das Register BH enthält einen Code
für die Verzögerungszeit in Millisekunden, vom Beginn des Tastendrucks, bis die
Repeatfunktion aktiviert wird. Es sind die Werte erlaubt:
Ö--------Ú-----------------------Ì
°
Code ° Verzögerungszeit (ms) °
û--------é-----------------------À
°
00 ° 250
°
°
01 ° 500
°
°
02 ° 750
°
°
03 ° 1000
°
Û--------Ù-----------------------ì
In BL ist ein Code für die Wiederholrate (Zeichen/Sekunde) zu übergeben. Dabei gilt
folgende Belegung:
Ö------Ú---------------Ú------Ú---------------Ì
° Code ° Wiederholrate ° Code ° Wiederholrate °
û------é---------------é------é---------------À
° 00 ° 30.0
° 10 ° 7.5
°
° 01 ° 26.7
° 11 ° 6.7
°
° 02 ° 24.0
° 12 ° 6.0
°
° 03 ° 21.8
° 13 ° 5.5
°
° 04 ° 20.0
° 14 ° 5.0
°
° 05 ° 18.5
° 15 ° 4.6
°
° 06 ° 17.1
° 16 ° 4.3
°
° 07 ° 16.0
° 17 ° 4.0
°
° 08 ° 15.0
° 18 ° 3.7
°
° 09 ° 13.3
° 19 ° 3.3
°
° 0A ° 12.0
° 1A ° 3.0
°
° 0B ° 10.9
° 1B ° 2.7
°
° 0C ° 10.0
° 1C ° 2.5
°
° 0D ° 9.2
° 1D ° 2.3
°
° 0E ° 8.6
° 1E ° 2.1
°
° 0F ° 8.0
° 1F ° 2.0
°
Û------Ù---------------Ù------Ù---------------ì
Zeichenfolge speichern (AH = 05H)
Bei moderneren BIOS-Versionen existiert eine weitere Funktion zum Speichern von
Zeichenfolgen im System. Hierbei gelten folgende Übergabekonventionen:
Ö-------------------------------Ì
°
CALL: INT 16
°
°
°
° AH: 05H (Zeichen speichern)
°
° CH: Scan Code
°
° CL: ASCII-Code
°
û-------------------------------À
°
RETURN
°
° AL: Statuscode
°
Û-------------------------------ì
In den Registern CL und CH werden das Zeichen und der zugehörige Scan Code
übergeben. Dabei gelten die gleichen Werte wie bei der Funktion AH = 00H. Nach dem
Aufruf enthält das Register AL einen Statuscode:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
116
Code ° Status
-----é-----------------------------------------00 ° Das Zeichen wurde im Puffer gespeichert
01 ° Zeichen nicht gespeichert, da Puffer voll
In den Puffer lassen sich maximal 15 Zeichen ablegen. Allerdings können parallel von der
Tastatur Zeichen einlaufen, so daß die Puffergröße nochmals reduziert wird. Mit dem
Aufruf lassen sich Tastaturmakros recht einfach programmieren.
MF2-Tastatur abfragen (AH = 10H)
Dieser Aufruf ist nur in BIOS-Version der AT 03- und PS/2-Modelle implementiert und
erlaubt die Sondertasten der MF2-Tastaturen abzufragen. Es gilt folgende Schnittstelle:
Ö-------------------------------Ì
°
CALL: INT 16
°
°
°
° AH: 10H (MF2-Tastatur)
°
û-------------------------------À
°
RETURN
°
° AH: Scan Code
°
° AL: ASCII-Zeichen
°
Û-------------------------------ì
Die Funktion gibt den Scan-Code und das Zeichen im Register AX zurück.
Zeichen in Puffer (AH = 11H)
Dieser Aufruf ist nur in BIOS-Version der AT 03- und PS/2-Modelle implementiert und
erlaubt die Prüfung, ob Zeichen im Puffer vorliegen. Es gilt folgende Schnittstelle:
Ö-------------------------------Ì
°
CALL: INT 16
°
°
°
° AH: 11H (Check Puffer)
°
û-------------------------------À
°
RETURN
°
° ZF: 0 -> Zeichen gelesen
°
° AH: Scan Code
°
° AL: ASCII-Zeichen
°
Û-------------------------------ì
Die Funktion gibt den Scan-Code und das Zeichen im Register AX zurück. Die Werte sind
jedoch nur definiert, falls das Zero-Flag nach dem Aufruf gelöscht ist. Andernfalls war der
Puffer leer und es werden keine Zeichen zurückgegeben.
Check extended Status (AH = 12H)
Dieser Aufruf ist nur in BIOS-Version der AT 03- und PS/2-Modelle implementiert und
erlaubt die Prüfung, ob die Caps-, Num- oder Scroll-Lock-Taste gedrückt ist. Es gilt
folgende Schnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
117
Ö-------------------------------Ì
°
CALL: INT 16
°
°
°
° AH: 12H (Check Status)
°
û-------------------------------À
°
RETURN
°
° AX: Status der Tasten
°
Û-------------------------------ì
Die Funktion 02H gibt nur die Information zurück, ob die Tasten Caps-, Num- oder ScrollLock gerade aktiv sind, d.h. irgendwann gedrückt wurden. Die Funktion 12H prüft jedoch,
ob die Tasten aktuell gedrückt sind. Dabei gilt folgende Kodierung des im Register AH
zurückgegebenen Statusbytes.
Bit 7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙÚÙÚÙÚÙÚÙÚÙÚÙÚì
° ° ° ° ° ° ° Û° ° ° ° ° ° Û--° ° ° ° ° Û----° ° ° ° Û------° ° ° Û--------° ° Û----------° Û------------Û---------------
linke CTRL-Taste gedrückt
linke ALT-Taste gedrückt
rechte CTRL-Taste gedrückt
rechte ALT-Taste gedrückt
SCROLL LOCK gedrückt
NUM LOCK gedrückt
CAPS LOCK gedrückt
SYS-REQUEST-Taste gedrückt
Die Kodierung des Registers AL entspricht der Belegung von Bild 2.13.
Bei Compac-Rechnern werden die Funktionscodes FxxxH des INT 16 durch das BIOS
verwaltet. Hier läßt sich zum Beispiel die CPU-Geschwindigkeit abfragen oder setzen.
Weiterhin benutzen die PC Tools mit dem DESKTOP API den INT 16 mit den
Funktionscodes FFxxH für bestimmte Befehle.
2.9 Druckerschnittstelle (INT 17)
Zur Steuerung der parallelen Druckerschnittstellen existiert der BIOS-Interrupt 17. Ähnlich
wie bei den seriellen Schnittstellen selektiert der Registerinhalt in DX die betreffende
Einheit:
DX ° Drucker
---é-------0 ° LPT1:
1 ° LPT2:
2 ° LPT3:
Über das AH-Register werden dann die Unterfunktionen aktiviert. Alle Register, bis auf
AH, bleiben beim Aufruf erhalten.
Zeichen ausgeben (AH = 00H)
Das im AL-Register befindliche Zeichen wird über die Schnittstelle ausgegeben. Die
Schnittstelle wird durch den Inhalt des DX-Registers ausgewählt (0 = LPT1:, 1 = LPT2:
etc.).
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
118
Ö-------------------------------Ì
°
CALL: INT 17
°
°
°
° AH: 00H (Print Character)
°
° AL: Zeichen
°
° DX: Schnittstelle
°
û-------------------------------À
°
RETURN
°
° AH: Statusbyte
°
Û-------------------------------ì
Das Ergebnis dieser Operation findet sich im AH-Register. Falls AH = 1 gesetzt ist, konnte
das Zeichen nicht ausgegeben werden. Die Kodierung des Statusbytes findet sich unter der
Funktion (02H Status lesen).
Printer Port initialisieren (AH = 01H)
Bei diesem Aufruf wird die Schnittstelle für die Ausgabe initialisiert. Es gelten folgende
Aufrufkonventionen.
Ö-------------------------------Ì
°
CALL: INT 17
°
°
°
° AH: 01H (Init Port)
°
° DX: Schnittstelle
°
û-------------------------------À
°
RETURN
°
° AH: Statusbyte
°
Û-------------------------------ì
Die Schnittstelle wird durch das Register DX selektiert (0 = LPT1:, 1 = LPT2:, 2 = LPT3:).
Im AH-Register wird anschließend der Status zurückgegeben.
Printer Status lesen (AH = 02H)
Der Status eines angeschlossenen Druckers läßt sich mit dieser Funktion abfragen. Das
Ergebnis wird im AH-Register zurückgegeben.
Ö-------------------------------Ì
°
CALL: INT 17
°
°
°
° AH: 02H (Read Status)
°
° DX: Schnittstelle
°
û-------------------------------À
°
RETURN
°
° AH: Statusbyte
°
Û-------------------------------ì
Die Belegung der einzelnen Bits entspricht nachfolgendem Bild.
7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙÚÙÚÙÚÙÚÙÚÙÚÙÚì
° ° ° ° ° ° ° Û° ° ° ° ° ° Û--° ° ° ° ° Û----° ° ° ° Û------° ° ° Û--------° ° Û----------° Û------------Û---------------
Time out
----I/O Error
Drucker selektiert
Papierende
Acknowledge
not busy
Bild 2.14: Belegung des Drucker-Statusbyte;s
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
119
Die Bits 1, 2 sind im Statusbyte nicht belegt.
2.10 ROM-Basic (INT 18)
Dieser Interrupt ist beim IBM-PC für das ROM-Basic vorgesehen. Es bleibt bei den
meisten kompatiblen PCs unbelegt und wird deshalb auch nicht weiter besprochen.
2.11 Bootstrap (INT 19)
Der Interrupt aktiviert die Bootstrap-Routine im BIOS-ROM. Diese lädt den Code der
Systemdiskette von Spur 0, Sektor 0 in den Speicher ab Adresse 0:700. Anschließend wird
das Programm ab dieser Adresse ausgeführt. Damit wird faktisch das MS-DOSBetriebssystem neu geladen. Um einen Warmstart auszuführen muß im BIOS-RAM ab
Adresse 0040:0072H der Wert 1234H eingetragen werden. Fehlt dieser Wert im BIOS,
führt das System einen Kaltstart aus. Das PC-DOS-Programm VDISK.SYS benutzt diesen
Interrupt zur Kommunikation mit einer RAM-Disk. Konkret wird über den INT 19
abgefragt, wieviel Extended Memory durch VDISK belegt wurde. Die 3 Bytes ab Offset
2CH im VDISK-INT 19-Treiber enthalten die Adresse des ersten freien Bytes im
Extended Memory.
2.12 Systemzeit (INT 1A)
Das BIOS führt die Systemzeit als 4-Byte-Variable im BIOS-Datenbereich. Sie wird aus
dem Timer-Interrupt gewonnen. Mit dem INT 1A läßt sich der Wert dieser Zeitvariablen
lesen und stellen. Hierzu gelten folgende Konventionen:
Zeit lesen (AH = 00H)
Mit diesem Aufruf läßt sich der Inhalt der Timervariablen lesen.
Ö-------------------------------Ì
°
CALL: INT 1A
°
°
°
° AH: 04 (Get Time)
°
û-------------------------------À
°
RETURN
°
° CX: Zähler High Word
°
° DX: Zähler Low Word
°
° AL: Übertragsflag
°
Û-------------------------------ì
Die Uhrzeit wird in Ticks zurückgegeben (siehe auch Zeit setzen). Im Register AL wird ein
Flag zurückgegeben, welches einen 24-Stunden-Zeitüberlauf anzeigt. AL = 0 bedeutet, daß
kein 24-StundenÜbertrag seit dem letzten Lesen der Zeit aufgetreten ist. Bei AL = 1 liegt
ein Überlauf vor.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
120
Zeit setzen (AH = 01H)
Mit dieser Unterfunktion läßt sich die Timervariable im BIOS-Datenbereich setzen. Es gilt
folgende Aufrufkonvention:
Ö-------------------------------Ì
°
CALL: INT 1A
°
°
°
° AH: 01H (Set Time)
°
° CX: Zähler High Word
°
° DX: Zähler Low Word
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Im Register CX findet sich das Timer-High-Word, welches die Zeit in Stunden (0-23)
angibt. Das Register DX enthält die Zeit in Ticks vom Grundtakt. Beim IBM-PC sind dies
1/18,2 Sekunden. Mittlerweile besitzen viele PCs CMOS-Uhrenbausteine mit
Batteriepufferung, die dann meist auch durch das BIOS-ROM unterstützt werden. Damit
finden sich bei diesen Systemen erweiterte Funktionsaufrufe beim -INT 1A.
Read Real Time Clock (AH = 02H)
Mit diesem Aufruf läßt sich die interne Zeit der CMOS-Uhr lesen. Es gelten folgende
Aufrufkonventionen.
Ö-------------------------------Ì
°
CALL: INT 1A
°
°
°
° AH: 02H (Read RTC Time)
°
û-------------------------------À
°
RETURN
°
° CY:1 -> keine RTC
°
° CY:0 -> RTC gefunden
°
° CH: Stunden im BCD-Format
°
° CL: Minuten im BCD-Format
°
° DH: Sekunden im BCD-Format
°
Û-------------------------------ì
Die Werte werden in BCD-Notation zurückgegeben. Dies ist zu beachten, falls die Werte
in den BIOS-Datenbereich geschrieben werden sollen (AH = 01H Set Clock).
Set Real Time Clock (AH = 03H)
Dieser Funktionsaufruf erlaubt es, die interne Zeit der CMOS-Uhr zu setzen. Es gelten
folgende Aufrufkonventionen:
Ö-------------------------------Ì
°
CALL: INT 1A
°
°
°
° AH: 03H (Set RTC Time)
°
° CH: Stunden im BCD-Format
°
° CL: Minuten im BCD-Format
°
° DH: Sekunden im BCD-Format
°
° DL: 1 = 24 Std. 0 = 12 Std. °
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Die Werte werden in BCD-Notation übergeben. Im Register DL wird das Zeitformat
eingestellt. Der Wert 1 setzt die Uhr auf die 24-Stunden-Anzeige, während bei DL = 0 nach
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
121
12 Stunden ein Uhrzeitüberlauf auftritt. Falls keine CMOS-Clock vorhanden ist, bleibt der
Aufruf ohne Folgen.
Read Date from RTC (AH = 04H)
Mit diesem Aufruf läßt sich das Datum der Real-Time-Clock lesen. Es gelten folgende
Aufrufkonventionen.
Ö-------------------------------Ì
°
CALL: INT 1A
°
°
°
° AH: 04H (Read RTC Date)
°
û-------------------------------À
°
RETURN
°
° CY:1 -> keine RTC
°
° CY:0 -> RTC gefunden
°
° CH: Jahrhundert im BCD-Format °
° CL: Jahr im BCD-Format
°
° DH: Monat im BCD-Format
°
° DL: Tag im BCD-Format
°
Û-------------------------------ì
Die Werte werden in BCD-Notation zurückgegeben. Dies ist zu beachten, falls die Werte
weiterverarbeitet werden sollen. Das Ergebnis im Jahrhundertfeld bewegt sich zwischen 19
und 20, während die restlichen Werte im gewohnten Rahmen liegen.
Set Date into Real Time Clock (AH = 05H)
Dieser Funktionsaufruf erlaubt es, das interne Datum der CMOS-Uhr zu setzen. Es gelten
folgendende Aufrufkonventionen.
Ö-------------------------------Ì
°
CALL: INT 1A
°
°
°
° AH: 05H (Set RTC Date)
°
° CH: Jahrhundert im BCD-Format °
° CL: Jahr im BCD-Format
°
° DH: Monat im BCD-Format
°
° DL: Tag im BCD-Format
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Die Werte werden in BCD-Notation übergeben. Der Wert in CH muß auf 19 oder 20
gesetzt werden. Falls keine CMOS-Clock vorhanden ist, bleibt der Aufruf ohne Folgen.
Set the Alarm (AH = 06H)
Neuere BIOS-Versionen erlauben es, bestimmte Zeitaufträge an die CMOS-Uhr
abzusetzen. Nach Ablauf dieser Zeit wird ein Alarm ausgelöst. Es gelten folgende
Aufrufkonventionen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
122
Ö-------------------------------Ì
°
CALL: INT 1A
°
°
°
° AH: 06H (Set Alarm)
°
° CH: Stunde im BCD-Format
°
° CL: Minuten im BCD-Format
°
° DH: Sekunden im BCD-Format
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Die Werte werden in BCD-Notation übergeben. Es ist möglich, Zeiten zwischen 00:00:00
und 23:59:59 Uhr anzugeben. Die Werte werden in den Uhrzeit-baustein übertragen.
Sobald die Alarmzeit erreicht wird, löst der Baustein per Hardware (Level 8) einen INT 50
aus. Diese Routine behandelt dann den Alarm.
Das Anwenderprogramm muß den INT 4A-Vektor auf eine eigene Routine setzen und so
die Alarmbedingung weiterverarbeiten.
Reset the Alarm (AH = 07H)
Falls mit dem Aufruf 06H (Set Alarm) ein entsprechender Auftrag abgesetzt wurde, läßt
sich dieser mittels der Funktion 07H löschen. Es gelten folgende Aufrufkonventionen.
Ö-------------------------------Ì
°
CALL: INT 1A
°
°
°
° AH: 07H (Reset Alarm)
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Die BIOS-Funktion löscht dann den Auftrag aus der CMOS-Uhr (Reset).
In einigen Systemen sind weitere Funktionen im Bereich AH = 08H bis 0BH implementiert
um einzelne spezielle Funktionen des RTC-Bausteins anzusprechen. Da diese Funktionen
aber nicht allgemein vorhanden sind, möchte ich sie an dieser Stelle übergehen.
2.13 Tastatur-Break (INT 1B)
Diese Unterbrechung wird aktiviert, sobald die Tasten <Ctrl> und <Break> gedrückt werden.
Im BIOS wird der Interruptvektor auf eine IRET-Routine initialisiert. MS-DOS setzt dann
diesen Vektor auf die DOS-Control-C-Routine um.
2.14 Timerinterrupt (INT 1C)
Bei jedem Überlauf des Timers 0 wird der INT 8 ausgelöst. Anschließend setzt die
Software einen INT 1C (Timer-Folgeinterrupt). Dieser Vektor wird vom BIOS auf eine
IRET-Anweisung initialisiert. Es besteht dann die Möglichkeit, den Vektor auf
Anwenderprogramme umzulegen, die dann bei jedem Timertick aktiviert werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
123
2.15 Bildschirm-Initialisierung (INT 1D)
Hierbei handelt es sich nicht um einen echten Interruptvektor. Vielmehr findet sich hier ein
Zeiger, der in eine Tabelle mit den Initialisierungswerten für den Bildschirmcontroller
zeigt.
2.16Disk-Parameter (INT 1E)
Der Vektor zeigt auf den aktuellen Parameterblock mit den Laufwerksdaten. Das BIOS
setzt ihn auf eine Tabelle im BIOS-ROM. MS-DOS schaltet den Vektor dann auf eine
zweite Tabelle im DOS-Bereich um. Zweck dieser Aktion ist die Anpassung der
Laufwerksparameter an die eingesetzten Laufwerke. Durch Optimierung der Parameter
kann die Zugriffsgeschwindigkeit der Laufwerke erhöht werden. Die Belegung dieser
Tabelle ist nachfolgend aufgeführt:
Ö--------Ú---------Ú--------------------------------Ì
° IBM PC ° PC 1512 ° Bedeutung
°
û--------é---------é--------------------------------À
° CF
°
DF
° Steppertime = D, HD Unload = F °
° 02
°
02
° HD Load = 1, Modus = DMA
°
° 25
°
25
° Motor Wait
°
° 02
°
02
° n * 256 Byte pro Sektor
°
° 08
°
09
° Last Sector per Track
°
° 2A
°
2A
° GAP length ID - Data
°
° FF
°
FF
° Disk Transfer length
°
° 50
°
50
° GAP length for Format
°
° F6
°
F6
° Fill Byte for Format
°
° 25
°
0F
° Head settle Time
ms
°
° 04
°
02
° Motor Start Time (1/8) Sek.
°
Û--------Ù---------Ù--------------------------------ì
Tabelle 2.15: Aufbau der Disk-Parameter-Tabelle
Die Aufstellung enthält die Werte, die im BIOS des IBM-PC abgelegt sind, und zum
Vergleich die Einstellungen des Amstrad PC 1512. Das erste Byte spezifiziert in den
obersten 4 Bit den Wert für die Stepperzeit des Motors. Interessant sind auch die Bytes 10
und 11. Während in Byte 11 die Wartezeit nach dem Einschalten des Motors in 1/8Sekunden-Schritten abgelegt wurde, enthält Byte 10 die Kopf-Beruhigungszeit in
Millisekunden. Tabelle 2.15 zeigt bereits deutlich die Verbesserungen der Laufwerke seit
Einführung des IBM-PC. Byte 2 enthält die Konstanten für Head Load und DMA Modus,
während in Byte 3 die Verzögerungszeit der Motorabschaltung steht. Der Wert in Byte 4
gibt an, wie viele Blöcke à 256 Byte ein Sektor umfaßt. Im MS-DOS-Format sind dies
üblicherweise
2 Blöcke, womit sich 512 Byte/Sektor ergeben. Byte 5 spezifiziert die Sektoren pro Spur.
Während im IBM-BIOS noch die Zahl 8 steht, um auch 320-Kbyte-Disketten zu
bearbeiten, weisen neuere Rechner nur noch 9 Sektoren pro Track (360 Kbyte) auf. In Byte
6 und 8 sind die Lücken (GAPs) spezifiziert, die zwischen den Sektoren (beim
Formatieren) und zwischen der Identifikationsmarke und den Daten liegen.
Auch hier wird der Interrupt nicht aktiviert, sondern der Vektor dient lediglich als Zeiger in
die Tabelle.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
124
2.17 Grafik-Tabelle (INT 1F)
Auch hier handelt es sich nicht um einen echten Interrupt. Der Vektor dient lediglich als
Zeiger in eine Tabelle mit den Grafikzeichen. Das BIOS initialisiert den Vektor mit dem
Wert 0:0. Es gibt aber Programme, wie z.B. GRAFTABL.COM, die den Vektor umleiten.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
125
DOS Programmierhandbuch
3 Die MS-DOS-Interrupts
Oberhalb des BIOS-Teils (IO.SYS) wird das eigentliche Betriebssystem MS-DOS geladen.
Es besteht aus dem Code der Datei MSDOS.SYS, den Datenbereichen für Puffer, den
Systemtreibern und dem Kommandointerpreter COMMAND.COM. Ähnlich wie das BIOS
stellt MS-DOS bestimmte Systemfunktionen zur Verfügung, die über Interrupts aktiviert
werden. Der Bereich von INT 20 bis INT 3F ist bereits ab MS-DOS 2.0 in folgende
Bereiche aufgeteilt:
Ö-----Ú----------------------------------------------------Ì
° INT ° Bemerkungen
°
û-----é----------------------------------------------------À
° 20 ° Interrupts, die durch Anwenderprogramme oder DOS
°
°
. ° benutzt werden dürfen. Die Interrupts sind durch
°
° 27 ° Microsoft dokumentiert.
°
û-----é----------------------------------------------------À
° 28 ° Interrupts, die von DOS für interne Zwecke be°
°
. ° nutzt werden. Diese Interrupts sind nur teil°
° 2F ° weise durch Microsoft dokumentiert.
û-----é----------------------------------------------------À
° 30 ° Interrupts, die für DOS reserviert wurden. Die
°
°
. ° meisten sind nicht belegt und wurden auch nicht
°
° 3F ° durch Microsoft dokumentiert.
°
Û-----Ù----------------------------------------------------ì
°
Tabelle 3.1: Aufteilung der INT 20 bis INT 3F durch DOS
Der Bereich der Interrupts 28-3F ist für MS-DOS-interne Zwecke reserviert und
normalerweise für den Anwender nicht zugänglich. Die bisherige MicrosoftDokumentation enthält nur wenige Informationen über diesen Bereich. Trotzdem sind
mittlerweile einige Informationen über die reservierten Interrupts verfügbar. Die
nachfolgende Tabelle enthält (soweit bekannt) die Belegung der offiziellen und reservierten
DOS-Interruptvektoren.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
126
Ö-----Ú------Ú---------------------------------------------------Ì
° INT ° Adr ° Bemerkungen
°
û-----é------é---------------------------------------------------À
° 20 ° 80 ° DOS Program Terminate
°
û-----é------é---------------------------------------------------À
° 21 ° 84 ° DOS Function Request
°
û-----é------é---------------------------------------------------À
° 22 ° 88 ° DOS Terminate Process Exit Address
°
û-----é------é---------------------------------------------------À
° 23 ° 8C ° DOS Control-C-Handler Address
°
û-----é------é---------------------------------------------------À
° 24 ° 90 ° DOS Critical Error Handler Address
°
û-----é------é---------------------------------------------------À
° 25 ° 94 ° DOS Disk Absolute Read
°
û-----é------é---------------------------------------------------À
° 26 ° 98 ° DOS Disk Absolute Write
°
û-----é------é---------------------------------------------------À
° 27 ° 9C ° DOS Program Terminate and Stay Resident
°
û-----é------é---------------------------------------------------À
° 28 ° A0 ° Start a Resident Process
°
û-----é------é---------------------------------------------------À
° 29 ° A4 ° Screen Output
°
û-----é------é---------------------------------------------------À
° 2A ° A8 ° reserviert für MS-DOS, aber meist mit einer
°
°
. °
. ° IRET-Anweisung abgeschlossen
°
° 2D ° B4 °
°
û-----é------é---------------------------------------------------À
° 2E ° B8 ° Start a Child Process
°
û-----é------é---------------------------------------------------À
° 2F ° BC ° Multiplexerinterrupt
°
û-----é------é---------------------------------------------------À
° 30 ° C0 ° reserviert für MS-DOS, aber meist mit einer
°
°
. °
. ° IRET-Anweisung abgeschlossen
°
° 3F ° FF °
°
Û-----Ù------Ù---------------------------------------------------ì
Tabelle 3.2: Belegung der MS-DOS-Interrupts
Ein Großteil der Interrupts 20-27 wurde aus Kompatibilitätsgründen zu DOS 1.x erhalten.
Mittlerweile stehen über den INT 21 aber wesentlich leistungsfähigere Ersatzfunktionen
zur Verfügung, die bei Neuentwicklungen von Software benutzt werden sollten.
Bevor wir allerdings die Schnittstellen dieser Interrupts diskutieren, sollen noch kurz einige
Begriffe angerissen werden. Der genauen Beschreibung sind eigene Kapitel gewidmet.
Ein laufendes Programm wird unter MS-DOS als Prozeß bezeichnet. MS-DOS bietet nun
die Möglichkeit, aus einem laufenden Prozeß, auch als parent process bezeichnet, einen
weiteren Subprozeß zu erzeugen. Dieser Subprozeß wird allgemein als child process
bezeichnet. Während der Ausführung des child process ruht der parent process so lange,
bis der child process beendet wird und die Kontrolle zurückgibt.
Ein weiterer Begriff betrifft das Program Segment Prefix (PSP). Hierbei handelt es sich um
einen Datenbereich von 256 Byte, der vor jedem geladenen Programm im Speicher steht.
Hier legt MS-DOS bestimmte Informationen über die Umgebung des Prozesses ab. Der
Aufbau und die Bedeutung dieses PSP werden in einem eigenen Kapitel beschrieben.
3.1 Program Terminate (INT 20)
Mit diesem Interrupt wird ein laufender Prozeß beendet und die Kontrolle geht an den
aufrufenden parent process zurück. Dieser ist in der Regel der MS-DOSKommandoprozessor (COMMAND.COM). Hierdurch wird die DOS-Kommandoebene
wieder aktiviert. Der Interrupt besitzt folgende Parameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
127
Ö---------------------------------Ì
°
CALL: INT 20
°
°
°
° CS: Segmentadresse des Program °
°
Segment Prefix (PSP)
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Vor dem Aufruf muß im Codesegment-Register die Segmentadresse des PSP geladen
werden. Der INT 20 restauriert aus diesem PSP-Bereich nebenstehende Adressen.
Program Terminate Address
Control-C Handler Address
Critical Error Handler Address
Bei Programmen mit der Fileextension .COM befindet sich bereits der Wert des PSP im
CS-Register, da hier eine Größe von 64 Kbyte nicht überschritten wird.
Vor Aufruf des INT 20 sind alle geöffneten Dateien zu schließen, da die Funktion dies
nicht übernimmt. Die Ursache ist in der DOS-Dateiverwaltung begründet. Wird eine Datei
verändert, trägt DOS die Informationen über die Dateilänge, das Datum des letzten
Schreibzugriffs, sowie Zeit und Lage auf dem Speichermedium erst beim CLOSE-Befehl
in die Directories ein. Weiterhin wird sichergestellt, daß vorher alle Pufferinhalte
abgespeichert werden. Wird der INT 20 aktiviert, ohne vorher die geöffneten Dateien zu
schließen, befinden sich alle modifizierten Dateien in einem inkonsistenten Zustand, wobei
die abgespeicherten Daten teilweise verloren gehen können.
Der INT 20 wurde aus Kompatibilitätsgründen zu früheren MS-DOS-Versionen (1.x)
übernommen. Bei Neuentwicklungen sollte die Funktion 4CH des INT 21 benutzt werden.
Diese benötigt die Information über die Lage des PSP nicht mehr und ermöglicht zusätzlich
die Übergabe eines return codes an den parent process.
3.2 MS-DOS-Funktionsdispatcher (INT 21)
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: Funktionsnummer
°
°
weitere Register siehe
°
°
Unterfunktion
°
û---------------------------------À
°
RETURN
°
° siehe Unterfunktion
°
Û---------------------------------ì
Dies ist aus Sicht des Anwenderprogrammierers der wohl wichtigste Interrupt. Über INT
21 lassen sich zahlreiche Funktionen aktivieren, wobei die Parameterübergabe per Register
erfolgt. Die Funktionen werden über das Register AH selektiert.
Wegen der zahlreichen Funktionen erfolgt die Beschreibung des INT 21 in einem eigenen
Kapitel.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
128
3.3 Terminate Process Exit Address (INT 22)
MS-DOS legt unter dem Vektor des INT 22 die Adresse der Folgeroutine ab. Sobald der
laufende Prozeß terminiert, verzweigt DOS zu der angegebenen Programmadresse. Beim
Laden eines neuen Programmes erzeugt MS-DOS das Program Segment Prefix. Ab
Offsetadresse 0AH findet sich im PSP auch die unter dem INT 22-Vektor eingetragene
Adresse.
Der Interrupt sollte nicht direkt durch Anwenderprogramme verändert werden, da er durch
die MS-DOS-EXEC-Funktion belegt ist.
Falls die Notwendigkeit besteht, einen eigenen Terminate Process Handler einzubinden,
stellt der INT 21 hierfür die Funktionen:
Funktion 35H:
Funktion 25H:
lese den Interruptvektor
setze den Interruptvektor
zur Verfügung, um den INT 22 auf die eigene Routine zu setzen. Mit der Funktion 35H
wird der eingetragene Vektor gelesen. Dann kann der alte Wert gesichert werden.
Anschließend läßt sich der neue Vektor per Funktion 25H setzen. Diese Funktionen
garantieren, daß die gelesenen/geschriebenen Vektoren konsistent sind. Ein direkter Zugriff
per Anwenderprogramm kann dies nicht sicherstellen.
3.4 Control-C Exit Handler Address (INT 23)
In MS-DOS ist die Möglichkeit vorgesehen, ein laufendes Programm durch die
Tastenkombinationen <Ctrl><C> oder <Ctrl><Break> zu unterbrechen. Hierfür sind in
MS-DOS zwei verschiedene Module zuständig. Da der Control-C-Interrupt nicht per
Hardware erzeugt wird, muß eine Softwareroutine die Tastencodes auf Control-C
untersuchen. Wird diese Kombination erkannt, setzt das Programm intern das Control-CFlag. Dieses Flag wird durch verschiedene DOS-I/O-Funktionen abgefragt. Bei gesetztem
Flag lösen diese Funktionen per Software einen INT 23 aus, um den Control-C-Handler zu
aktivieren. Durch diese Strategie wird vermieden, daß der Aufruf des Handlers innerhalb
einer kritischen Phase, z.B. während eines Diskzugriffs, erfolgt. Das Erkennen einer
Control-C-Bedingung und die Aktivierung des Interrupts ist Bestandteil von MS-DOS,
während der Interruptservice durchaus per Anwenderprogramm abgewickelt werden kann.
Hierzu wird der Adreßvektor des entsprechenden Interrupt-Handlers in der Interrupttabelle
unter dem INT 23 (Adresse: 0000:008CH) eingetragen. Dies sollte allerdings nur unter
Verwendung der INT 21-Funktionen 35H (Get-Interruptvektor) und 25H (Set Interrupt
Vektor) erfolgen. Nur so kann die Konsistenz der Vektortabelle sichergestellt werden.
Die Abfrage des Control-C-Flags erfolgt softwaremäßig bei jedem Aufruf der DOS-I/OFunktionen. Die meisten der INT 21-Funktionsaufrufe, bis auf Funktion 06H und 07H,
prüfen den Status und lösen einen INT 23 aus. Falls keine I/O-Funktionen ausgeführt
werden, oder falls ein Programm »abgestürztInnerhalb des Handlers dürfen beliebige
weitere DOS-Funktionen aufgerufen werden, da das System nicht in einem kritischen
Bereich unterbrochen wurde. Allerdings sind die Registerinhalte vor Eintritt in die
Serviceroutine zu sichern, um sie gegebenenfalls zu restaurieren. Falls Control-C während
einer Tastaturabfrage oder Bildschirmausgabe auftritt, oder falls innerhalb des Handlers die
BIOS-Funktionen 09H (Tastaturabfrage) und 0FH (Bildschirmausgabe) benutzt werden,
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
129
gibt der INT 23 die Codes 03H, 0DH, 0AH an den Bildschirm aus. Auf diesem erscheint
die Zeichenkombination:
^C
und ein Linefeed (Zeilenvorschub).
Der Control-C-Interrupt-Handler kann mit einer IRET-Anweisung abgeschlossen werden.
In diesem Fall müssen die Register des Prozessors in den Zustand vor Eintritt in die
Serviceroutine, versetzt werden. Anschließend wird das Programm an der unterbrochenen
Stelle fortgesetzt. Es kann aber auch auf die Betriebssystemebene per INT 20
zurückgekehrt werden.
Es besteht die Möglichkeit, den DOS-INT 23-Handler durch eine benutzerspezifische
Service-Routine zu ersetzen, die dann durch einen RET-FAR-Befehl beendet wird. In
diesem Fall wird das Carry-Flag benutzt, um MS-DOS zu signalisieren, ob das Programm
abzubrechen ist:
Carry-Flag gesetzt -> Programm abbrechen
Carry-Flag gelöscht -> Programm fortsetzen.
Der Wert des INT 23-Vektors wird von MS-DOS beim Erstellen des PSP an die
Offsetadresse 0EH kopiert. Falls ein laufender Prozeß einen child process erzeugt, wird
diesem auch ein eigenes PSP zugewiesen. Falls der child process eine eigene Control-CRoutine installiert, wird der INT 23-Vektor verändert. Beim Prozeß-Exit restauriert MSDOS den Original-Vektor, bevor der parent process aktiviert wird, so daß dieser seinen
alten Control-C-Handler vorfindet.
Ein Beispiel für die Funktion der Control-C-Routine liefert das DOS-Batch-Management.
Wird die Taste <Ctrl><C> betätigt, erscheint die Meldung:
^C
Stapeljob beenden (J/N) ?
Die Eingabe J aktiviert den MS-DOS-Kommandoprozessor, während bei N der Stapeljob
fortgesetzt wird.
3.5 Critical Error Handler Address (INT 24)
Mit dieser Routine lassen sich »kritischest wird. Der INT 24-Vektor wird beim Erzeugen
des Program Segment Prefix in die Offsetadresse 12H kopiert. Der INT 24 (Critical-ErrorHandler) ist für die interne Benutzung durch DOS reserviert und sollte deshalb nie durch
ein Anwenderprogramm ausgelöst werden. Allerdings besteht die Möglichkeit, den DOSCritical-Error-Handler durch eine benutzerspezifische Serviceroutine zu ersetzen.
Falls ein I/O-Zugriff innerhalb DOS dreimal mit einem Fehler endet, wird der INT 24
ausgelöst. Beim Eintritt in den Handler wird das Interruptsystem gesperrt. In den Registern
AH, SI und BP liefert der DOS-Handler Informationen über die Fehlerart zurück:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
130
Ö---------------------------------Ì
°
CALL: INT 24
°
°
°
û---------------------------------À
°
RETURN
°
° AX:
Fehlercode
°
° DI:
erweiterter Fehlercode
°
° BP:SI Zeiger auf den Device
°
°
Header
°
Û---------------------------------ì
Die Register AX und DI enthalten Fehlercodes, die Hinweise auf die Fehlerursache geben.
Im Registerpaar BP:SI findet sich ein Zeiger auf den Device Header Block; der gestörten
Einheit. Hier lassen sich eventuell weitere Informationen hinsichtlich der Ursache finden.
Ein anwendungsspezifischer INT 24-Handler muß als erstes das Flagregister auf dem
Anwenderstack sichern, um dann mit einem FAR CALL den Original DOS-INT 24Handler aufzurufen. Die Adresse dieses Handlers muß bei der Installation des AnwenderHandlers gesichert werden. Der DOS-INT 24-Handler gibt die Meldung:
Abort, Retry, or Ignore
aus und wartet auf eine Benutzereingabe. Sobald dies erfolgt ist, geht die Kontrolle wieder
an den anwendungsspezifischen INT 24-Handler zurück. Dieser sollte nun die Register auf
den Stack sichern. Innerhalb der Routine dürfen nur die DOS-INT-21-Funktionen 01H bis
0CH, sowie 30H und 59H verwendet werden, da nicht bekannt ist, ob sich DOS in einem
kritischen Bereich befindet. Die restlichen DOS-Funktionen verändern den System-Stack
und hinterlassen einen unkonsistenten Zustand.
Auf dem Anwenderstack finden sich folgende Informationen:
Top
IP
CS
Flags
AX
BX
CX
DX
SI
DI
BP
DS
ES
IP
CS
Flags
-Ì
û-ì
-Ì
°
°
°
û°
°
°
-ì
-Ì
û-ì
durch den INT 24 vom Prozessor automatisch gesicherte Register
Register, gesichert durch die INT 21-Funktion, Zustand vor
Eintritt in die INT 21-Routine
durch den INT 21 vom Prozessor automatisch gesicherte Register
Falls nun die Kontrolle direkt durch den Handler an das Anwenderprogramm
zurückgegeben werden soll, sind vorher die Register zu restaurieren. Hierbei ist die oben
beschriebene Struktur des Stacks zu beachten. Es sind alle Informationen bis auf die drei
letzten Einträge:
IP
-Ì
CS
ûFlags -ì
durch den INT 21 vom Prozessor automatisch gesicherte Register
vom Stack zu entfernen. Anschließend ist eine IRET-Anweisung auszuführen, womit das
Programm hinter der unterbrochenen I/O-Anforderung fortgesetzt wird. Allerdings befindet
sich DOS so lange in einem unstabilen Zustand, bis eine INT 21-Funktion oberhalb 0CH
aufgerufen wird.
Die zweite Möglichkeit besteht darin, die Kontrolle vom Handler durch eine IRETAnweisung an DOS zu übergeben. In diesem Fall restauriert MS-DOS die
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
131
Prozessorregister vor Eintritt in das Programm. Der Handler kann durch den Wert im ALRegister festlegen, welche Aktionen innerhalb DOS ablaufen:
AL ° Bemerkung
----é--------------------------------------------------0 ° ignoriere den Fehler und setze das Programm fort
1 ° versuche die Operation zu wiederholen
2 ° Programmabbruch über den INT 23
3 ° Systemaufruf abbrechen
Tabelle 3.3: Steuercodes für den INT 24
Es ist zu beachten, daß der Befehl Ignore zu unvorhersehbaren Resultaten führen kann, da
DOS die Operation als erfolgreich ausgeführt betrachtet.
Bei Aufruf des INT 24 wird im Register AX ein Fehlercode übergeben. Ist Bit 7 im AHRegister gelöscht, handelt es sich um einen DISK-Fehler.
Disk-Error-Code
Bei Bit 7 = 0 im AH-Register, resultiert der Fehler aus einem Diskzugriff. Im Register AL
findet sich die Nummer des fehlerhaften Laufwerks (0 = A:, 1 = B:, etc.). Die restlichen
Bits des AH-Registers sind dann gemäß folgender Darstellung kodiert:
7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙÚÙÚÙÚÙÚÙÚÙÚÙÚì
° ° ° ° ° ÛÚì Û° ° ° ° ° °
° ° ° ° ° °
° ° ° ° ° Û---° ° ° ° °
° ° ° ° °
° ° ° ° °
° ° ° ° °
° ° ° ° Û------° ° ° °
° ° ° °
° ° ° Û--------° ° °
° ° °
° ° Û----------° °
° Û------------°
Û---------------
0 Fehler bei Read-Zugriff
1 Fehler bei Write-Zugriff
00
01
10
11
Fehler
Fehler
Fehler
Fehler
im
in
in
im
MS-DOS-Bereich
der FAT
der Directory
Datenbereich
0 Fehler nicht erlaubt
1 Fehler zulässig
0 Wiederholung nicht erlaubt
1 Wiederholung möglich
0 Ignore nicht erlaubt
1 Ignore zulässig
--0 Fehler in Diskdrive
1 Fehler in FAT oder
in einem Characterdevice
Bild 3.1: Belegung des Disk-Error-Code
Die Bits 3, 4, 5 geben den gültigen Bereich für die Aktionen Retry, Ignore, Abort und Fail
an. Ab DOS 3.0 wird der Wert im Register AL überprüft und gegebenenfalls korrigiert. Es
gelten folgende Festlegungen:
Bit 5 = 0
Bit 4 = 0
Bit 3 = 0
Ignore nicht erlaubt -> falls AL = 0 ist,
dann setzt DOS den Wert auf AL = 3 (Fail).
Retry nicht erlaubt -> falls AL = 1 ist,
dann setzt DOS den Wert auf AL = 3 (Fail).
Fail nicht erlaubt -> falls AL = 3 ist,
dann setzt DOS den Wert auf AL = 2 (Abort)
Die Übergabe des Wertes Wert AL = 2 (Abort) an DOS ist immer zulässig.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
132
Device-Error-Code
Falls Bit 7 in AH gesetzt (1) ist, dann liegt entweder ein Fehler in der File-AllocationTabelle (FAT) einer Disk vor, oder eine zeichenorientierte Einheit ist gestört. Als Beispiel
für die zweite Möglichkeit sei die Ausgabe auf einen Drucker genannt, der kein Papier
enthält. Im Registerpaar BP:SI findet sich ein Zeiger auf den Datenblock des Treibers, in
dem weitere Informationen über die Einheit gespeichert sind.
Ö--------Ú-------------------------------------------Ì
° Offset ° Bemerkung
°
û--------é-------------------------------------------À
° 00
° Zeiger auf den Folgetreiber
°
û--------é-------------------------------------------À
° 04
° Attributword
°
°
° Bit 15 = 0 Blockdevice 1 = Zeichendevice °
°
° Bit 14 IOCTL Bit
°
°
°
°
°
° Bit 0 = 1 aktueller Standard Inputdevice °
°
° Bit 1 = 1 aktueller Standard Outputdev. °
°
° Bit 2 = 1 aktuelles Nulldevice
°
°
° Bit 3 = 1 aktuelles Clockdevice
°
û--------é-------------------------------------------À
° 06
° Zeiger auf die Strategieroutine
°
û--------é-------------------------------------------À
° 08
° Zeiger auf Interruptservice Teil
°
û--------é-------------------------------------------À
° 0A
° 8 Byte Einheiten Name (ASCII)
°
Û--------Ù-------------------------------------------ì
Tabelle 3.4: Belegung des Device-Headers
Ab Offset 04H findet sich das Attributbyte, welches in Bit 15 angibt, ob es sich um eine
zeichen- oder blockorientierte Einheit handelt. Bei blockorientierten Treibern (Disketten)
resultiert ein Fehler meist aus einem ungültigen FAT-Abbild; im Speicher.
Zeichenorientierte Treiber setzen Bit 15 = 0. Im Lowbyte des DI-Registers findet sich ein
erweiterter Fehlercode.
Code ° Bemerkung
-----é---------------------------------------------------00H ° Schreibversuch auf eine schreibgeschützte Diskette
01H ° unbekannte Einheit
02H ° Laufwerk nicht bereit
03H ° unbekanntes Kommando
04H ° CRC-Datenfehler
05H ° ungültige Aufrufstruktur
06H ° SEEK-Fehler bei Disketten
07H ° unbekanntes Datenmedium
08H ° Sektor nicht gefunden
09H ° Papierende Drucker
0AH ° Schreibfehler
0BH ° Lesefehler
0CH ° allgemeiner Fehler
0DH ° sharing violation (ab DOS 3.3)
0EH ° lock violation (ab DOS 3.3)
0FH ° invalid disk change
10H ° FCB nicht verfügbar (ab DOS 3.3)
11H ° sharing Puffer Überlauf (DOS 3.3)
Tabelle 3.5: Erweiterte Fehlercodes bei kritischem DOS-Fehler
Das Highbyte in DI ist nicht definiert. Auch der Inhalt des Registers AL ist bei
zeichenorientierten Einheiten nicht definiert. Es besteht die Möglichkeit, durch die DOSFunktion 58H einen erweiterten DOS-Fehlercode zu lesen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
133
Allgemein gelten für den INT 24-Handler folgende Bedingungen:
·
Alle Register sind innerhalb des Handlers zu sichern.
·
Während des Aufrufes ist das Interruptsystem gesperrt.
·
Bei Disk-Fehlern wird ab DOS 3.0 der Zugriff 5mal versucht, bis ein INT 24 ausgelöst
wird.
·
Bei einem Fehler in der FAT wird ein Zugriff 3mal versucht, bis ein INT 24 ausgelöst
wird.
·
Der INT 24 wird nur bei I/O-Aufrufen durch INT 21-Funktionen aktiviert.
·
Die Interrupts 25 (Absolute Read) und 26 (Absolute Write) benutzen eine
Fehlerroutine des Kommandoprozessors.
·
Der Handler darf nur die INT 21-Funktionen 01H-0CH und 59H benutzen. Alle
anderen Funktionen zerstören den Systemstack.
·
Falls der Handler die Kontrolle direkt an das Programm zurückgibt, sind vorher die
Register und der Stack zu restaurieren. Anschließend ist innerhalb des
Anwenderprogramms eine INT 21-Funktion oberhalb von 0CH aufzurufen. Weiterhin
ist das Interruptsystem freizugeben.
3.6 Absolute Disk Read (INT 25)
Dieser Interrupt erlaubt es, absolute Sektoren direkt von einer Platte oder Diskette zu lesen.
Die Parameterübergabe erfolgt über Register:
Ö---------------------------------Ì
°
CALL: INT 25
°
°
°
° AL:
Laufwerksnummer
°
° DS:BX Disk Transfer Address
°
° CX:
zu lesende Sektoren
°
° DX:
erster Sektor
°
û---------------------------------À
°
RETURN
°
° CY: 1 Lesefehler
°
° AX:
Fehlerstatus
°
° CY: 0 kein Fehler
°
° --°
Û---------------------------------ì
Im Register AL wird das Laufwerk spezifiziert (0 = A:, 1 = B:, etc.). Die Register DS:BX
enthalten einen Zeiger auf die Disk Transfer Area; (DTA). Dies ist ein Pufferbereich, in
den die gelesenen Daten abgespeichert werden. DOS legt standardmäßig im PSP ab
Adresse 80H eine DTA von 128 Byte an. Diese Länge reicht aber nicht aus, um einen
Sektor von 512 Byte zu speichern.
Das Anwenderprogramm ist dafür verantwortlich, daß ein genügend großer Pufferbereich
vorhanden ist, um alle gelesenen Sektoren (à 512 Byte) aufzunehmen. Der Aufruf liest ab
dem Sektor DX die Daten von ein oder mehreren logisch aufeinanderfolgenden Sektoren.
Die Zahl der zu lesenden Sektoren steht in CX. Die Anordnung der Sektoren auf einer
Diskette ist in einem getrennten Kapitel beschrieben. Die Eingabeparameter werden nicht
überprüft, weshalb die Funktion mit Vorsicht zu behandeln ist. Fehler beim Aufruf des
INT 25 führen zu falschen Daten oder zum Systemabsturz. Es wird auch nicht der Critical-
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
134
Error-Handler aufgerufen, sondern der Interrupt übergibt die Kontrolle sofort an den
entsprechenden Einheitentreiber. Dieser ruft im Fehlerfall eine Routine in
COMMAND.COM auf.
Alle Register, außer den Segmentregistern, werden beim Aufruf zerstört. Lediglich das
Flag-Register wird automatisch beim INT 25 durch den Prozessor auf dem AnwenderStack gesichert. Nach dem Aufruf enthält es Informationen über den Fehlerstatus:
Tritt während des Ablaufs ein Fehler auf, wird das Carry-Flag gesetzt, und im Register AH
findet sich ein Fehlercode mit folgender Bedeutung:
Code ° Bemerkung
-----é------------------------------------------80 ° Zugriffsfehler
40 ° SEEK-Fehler
20 ° Controller Fehler
10 ° CRC-Fehler beim Lesen
08 ° DMA Fehler
04 ° spezifizierter Sektor nicht gefunden
03 ° Schreibversuch auf eine geschützte Diskette (INT 26)
02 ° bad Adress Marke
01 ° falsches Kommando
Tabelle 3.6: Fehlercodes des INT 25
Die oben aufgeführten Fehlercodes werden im AH-Register übergeben. Im AL-Register
finden sich gültige MS-DOS-Fehlercodes, die im Kapitel über die DOS-Fehler beschrieben
werden. Die gleichen Codes werden biem INT 24 im Register DI übergeben.
Tritt kein Fehler auf, ist das Carry-Flag gelöscht. Nur in diesem Fall sind die gelesenen
Daten gültig. Microsoft empfiehlt daher, diesen Interrupt nur in absolut notwendigen Fällen
zu nutzen, insbesondere da im INT 21 mehrere Funktionen zur Dateibehandlung
implementiert sind. Es wird auch keine Aufwärtskompatibilität mit neueren MS-DOSVersionen garantiert.
Ab DOS 4.0 ergeben sich einige Änderungen beim direkten Diskzugriff per INT 25. Bis
zur DOS-Version 3.3 wird die Sektoradresse im Register DX übergeben. Der
Speicherbereich von Festplatten ist deshalb auf (16-Bit-Sektoradresse) 65536 Sektoren *
512 Byte = 32 Mbyte begrenzt. Ab DOS 4.0 umfaßt die Sektoradresse nun 32 Bit, so daß
bis zu 2 Gbyte Plattenspeicher verwaltet werden können. (In DOS 4.X werden zwar nur
Platten bis 512 Mbyte unterstützt, aber ab DOS 5.0 liegt die Obergrenze bei den 2 Gbyte).
Dies bedingt aber einen etwas geänderten Aufruf des INT 25.
Ö---------------------------------Ì
°
CALL: INT 25
°
°
°
° AL:
Laufwerksnummer
°
° DS:BX Zeiger auf Parameterblock°
° CX:
-1
°
û---------------------------------À
°
RETURN
°
° CY: 1 Lesefehler
°
° AX:
Fehlercode
°
° CY: 0 kein Fehler
°
° --°
Û---------------------------------ì
Im Register AL wird wieder das Laufwerk spezifiziert (0 = A:, 1 = B:, etc.). Da DOS 4.0
auch die Formate der älteren Versionen unterstützt, dient das Register CX zur Selektion der
Aufrufkonventionen. Bis DOS 3.3 findet sich in diesem Register die Zahl der zu lesenden
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
135
Sektoren. Besitzt das Register vor dem Aufruf den Wert -1 (FFFFH), interpretiert DOS 4.0
dies als einen Befehl zum Zugriff auf Platten mit erweiterten Partitionen größer als 32
Mbyte.
Dann enthält das Registerpaar DS:BX einen 32-Bit-Zeiger auf einen erweiterten
Parameterblock. In diesem Parameterblock sind die Informationen für den Zugriff auf das
Medium gespeichert. Der Block ist vom rufenden Prozeß anzulegen und besitzt folgende
Struktur:
Ö-------Ú---------------------------------------------------Ì
° Byte ° Bedeutung
°
û-------é---------------------------------------------------À
° 00-01 ° Low Word der ersten zu lesenden Sektornummer
°
û-------é---------------------------------------------------À
° 02-03 ° High Word der ersten zu lesenden Sektornummer
°
û-------é---------------------------------------------------À
° 04-05 ° Zahl der zu lesenden Sektornummern
°
û-------é---------------------------------------------------À
° 06-07 ° Low Word Disk Transfer Address
°
û-------é---------------------------------------------------À
° 08-09 ° High Word Disk Transfer Address
°
Û-------Ù---------------------------------------------------ì
Tabelle 3.7: Aufbau des Parmeterblocks
In den ersten vier Byte findet sich eine 32-Bit-Sektoradresse, ab der gelesen wird. Die Zahl
der zu lesenden Sektoren wird dann ab Offset 04H als 16-Bit-Zahl abgelegt. Die Adresse
des Disk-Transfer-Buffers findet sich als 32-Bit-Vektor ab Offset 08H. In diesen Puffer
legt der INT 25 die gelesenen Daten ab.
Tritt während des Aufrufes ein Fehler auf, ist anschließend das Carry-Flag gesetzt. Im
Register AX steht dann ein Fehlercode, der ab DOS 4.0 folgendermaßen zu interpretieren
ist:
Der Wert in AH entspricht der Codierung gemäß Tabelle 3.6. Steht in AL ein Wert, ist
dieser gemäß folgenden Konventionen zu decodieren:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
136
Ö-------Ú----------------------------------------Ì
° Code ° Fehler
°
û-------é----------------------------------------À
° 00
° Zugriff auf schreibgeschützte Diskette °
û-------é----------------------------------------À
° 01
° unbekannte Einheit
°
û-------é----------------------------------------À
° 02
° Laufwerk nicht bereit
°
û-------é----------------------------------------À
° 03
° unbekanntes Kommando
°
û-------é----------------------------------------À
° 04
° Datenfehler (CRC-Fehler)
°
û-------é----------------------------------------À
° 05
° fehlerhafte Aufrufstruktur-Länge
°
û-------é----------------------------------------À
° 06
° Seek-Fehler
°
û-------é----------------------------------------À
° 07
° unbekannter Medium-Typ
°
û-------é----------------------------------------À
° 08
° Sektor nicht gefunden
°
û-------é----------------------------------------À
° 09
° (Printer Papierende)
°
û-------é----------------------------------------À
° 0A
° Schreibfehler
°
û-------é----------------------------------------À
° 0B
° Lesefehler
°
û-------é----------------------------------------À
° 0C
° genereller Fehler
°
Û-------Ù----------------------------------------ì
Tabelle 3.8: Fehlercodes des INT 25/INT 26 in AL
Wird der INT 25 mit den DOS-3.3-Konventionen aufgerufen, obwohl ein Medium mit
Partitionen größer 32 Mbyte vorliegt, findet sich anschließend im Register AX der
Fehlercode 0207H.
Es ist wichtig, daß die Zahl der zu lesenden Bytes den Bereich von 64 Kbyte nicht
überschreitet, da sonst undefinierte Resultate auftreten. Dies ist bei der Definition der Zahl
der zu lesenden Sektoren zu beachten, da ja die Zahl der Byte pro Sektor variieren kann.
Weiterhin muß der reservierte Buffer (Disk Transfer Area (DTA)) genügend groß sein, um
alle Daten aufzunehmen. Dies ist der Pufferbereich, in den die gelesenen Daten
abgespeichert werden. DOS legt standardmäßig im PSP ab Adresse 80H eine DTA von 128
Byte an. Diese Länge reicht aber nicht aus, um einen Sektor von 512 Byte zu speichern.
Das Anwenderprogramm ist dafür verantwortlich, daß ein genügend großer Pufferbereich
vorhanden ist, um alle gelesenen Sektoren (à 512 Byte) aufzunehmen.
Die Numerierung der logischen Sektoren beginnt mit dem Wert 0 bei Spur 0, Kopf 0,
physikalischer Sektor 0. Alle folgenden Sektoren werden dann in aufsteigender Reihenfolge gezählt. Diese Zählweise weicht von der Nomenklatur unter DOS 1.1 ab. Weitere
Hinweise finden sich in einem getrennten Kapitel.
Die Eingabeparameter werden nicht überprüft, weshalb die Funktion mit Vorsicht zu
behandeln ist. Alle Register, außer dem Segmentregister, werden beim Aufruf zerstört.
Lediglich das Flag-Register wird automatisch beim INT 25 durch den Prozessor auf dem
Anwenderstack gesichert. Der Treiber gibt ab DOS 4.0 die Kontrolle an den Anwenderprozeß über eine einfache RET-Anweisung zurück. Dies bedeutet, daß der Zustand der
Flags vor dem Aufruf auf dem Stack verbleibt. Nach dem Aufruf enthält der Stack deshalb
noch einen 16-Bit-Eintrag, der durch eine POP-Anweisung zu entfernen ist.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
INT 25
JC ERROR
POP AX
..
137
; Stack bereinigen
Es ist aber zu beachten, daß bei der Stackbereinigung mittels des POP-AX-Befehls der
Fehlercode in AX überschrieben wird. Deshalb sollte zuerst das Carry-Flag geprüft
werden. Liegt ein Fehler vor, ist zuerst eine Fehlerbehandlung erforderlich. Bei gelöschtem
Carry-Flag kann der POP-AX-Befehl direkt ausgeführt werden.
3.7 Absolute Disk Write (INT 26)
Dieser Interrupt erlaubt es, absolute Sektoren direkt auf eine Platte oder Diskette zu
schreiben. Die Parameterübergabe erfolgt über Register:
Ö---------------------------------Ì
°
CALL: INT 26
°
°
°
° AL:
Laufwerksnummer
°
° DS:BX Disk Transfer Address
°
° CX:
zu schreibende Sektoren °
° DX:
erster Sektor
°
û---------------------------------À
°
RETURN
°
° CY: 1 Schreibfehler
°
° AL:
Fehlercode
°
° CY: 0 kein Fehler
°
° --°
Û---------------------------------ì
Im Register AL wird das Laufwerk spezifiziert (0 = A:, 1 = B:, etc.). Die Register DS:BX
enthalten einen Zeiger auf die Disk-Transfer-Area (DTA). Dies ist ein Pufferbereich, in den
die zu schreibenden Daten abgespeichert sind. DOS legt standardmäßig im PSP ab Adresse
80H eine DTA von 128 Byte an. Diese Länge reicht aber nicht aus, um einen Sektor von
512 Byte zu speichern.
Der Aufruf schreibt ab dem Sektor DX die Daten für ein oder mehrere logisch
aufeinanderfolgende Sektoren auf das Speichermedium. Die Zahl der zu schreibenden
Sektoren steht in CX. Die Anordnung der Sektoren auf einer Diskette/Platte ist in einem
getrennten Kapitel beschrieben. Die Eingabeparameter werden nicht überprüft, weshalb die
Funktion mit Vorsicht zu behandeln ist. Fehler beim Aufruf des INT 26 führen zu falschen
Daten oder zum Systemabsturz. Es wird auch nicht der Critical Error Handler aufgerufen,
sondern der Interrupt übergibt die Kontrolle sofort an den entsprechenden Einheitentreiber.
Dieser ruft im Fehlerfall eine Routine in COMMAND.COM auf.
Alle Register, außer dem Segmentregister, werden beim Aufruf zerstört. Lediglich das
Flag-Register wird automatisch beim INT 26 durch den Prozessor auf dem Anwenderstack
gesichert. Nach dem Aufruf enthält es Informationen über den Fehlerstatus.
Tritt während des Ablaufs ein Fehler auf, wird das Carry-Flag gesetzt und im Register AX
findet sich ein Fehlercode mit folgender Bedeutung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
138
Code ° Bemerkung
-----é--------------------------------------------80 ° Zugriffsfehler
40 ° SEEK-Fehler
20 ° Controller Fehler
10 ° CRC-Fehler beim Lesen
08 ° DMA Fehler
04 ° spezifizierter Sektor nicht gefunden
03 ° Schreibversuch auf eine geschützte Diskette (INT 26)
02 ° bad Adress Marke
01 ° falsches Kommando
Tabelle 3.9: Fehlercodes des INT 26 im Register AH
Die oben aufgeführten Fehlercodes werden im AH-Register übergeben. Im AL-Register
finden sich gültige MS-DOS-Fehlercodes, die im Kapitel über die DOS-Fehler beschrieben
werden.
Tritt kein Fehler auf, ist das Carry-Flag gelöscht. Nur in diesem Fall wurden die Daten
erfolgreich abgespeichert. Microsoft empfiehlt daher, diesen Interrupt nur in absolut
notwendigen Fällen zu nutzen, insbesondere da im INT 21 mehrere Funktionen zur
Dateibehandlung implementiert sind. Es wird auch keine Aufwärtskompatibilität mit
neueren MS-DOS-Versionen garantiert.
Ab DOS 4.0 ergeben sich auch Änderungen beim direkten Schreibzugriff auf Diskettenoder Plattenbereiche. Analog zum INT 25 gelten die folgenden Aufrufkonventionen.
Ö---------------------------------Ì
°
CALL: INT 26
°
°
°
° AL:
Laufwerksnummer
°
° DS:BX Zeiger auf Parameterblock°
° CX:
-1
°
û---------------------------------À
°
RETURN
°
° CY: 1 Schreibfehler
°
° AX:
Fehlercode
°
° CY: 0 kein Fehler
°
° --°
Û---------------------------------ì
Im Register AL wird wieder das Laufwerk spezifiziert (0 = A:, 1 = B:, etc.). Da DOS 4.0
auch die Formate der älteren Versionen unterstützt, dient das Register CX wieder zur
Selektion der Aufrufkonventionen. Besitzt das Register vor dem Aufruf den Wert -1
(FFFFH), bezieht sich der Aufruf auf die erweiterten Partitionen von DOS 4.X. Das
Registerpaar DS:BX enthält einen 32-Bit-Zeiger auf den erweiterten Parameterblock.
In diesem Parameterblock sind die Informationen für den Zugriff auf das Medium
gespeichert. Der Block ist vom rufenden Prozeß anzulegen und besitzt die gleiche Struktur
wie beim INT 25.
In den ersten vier Byte findet sich eine 32-Bit-Sektoradresse, ab der geschrieben wird. Die
Zahl der zu schreibenden Sektoren wird dann ab Offset 04H als 16-Bit-Zahl abgelegt. Die
Adresse des Disk Transfer Buffers findet sich als 32-Bit-Vektor ab Offset 08H. In diesem
Puffer müssen die zu schreibenden Daten stehen.
Tritt während des Aufrufes ein Fehler auf, ist anschließend das Carry-Flag gesetzt. Im
Register AX steht dann ein Fehlercode, der ab DOS 4.0 folgendermaßen zu interpretieren
ist:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
139
Der Wert in AH entspricht der Codierung gemäß Tabelle 3.6. Steht in AL ein Wert, ist
dieser gemäß Tabelle 3.8 zu decodieren.
Wird der INT 26 mit den DOS-3.3-Konventionen aufgerufen, obwohl ein Medium mit
Partitionen größer 32 Mbyte vorliegt, findet sich anschließend im Register AX der
Fehlercode 0207H.
Die Länge des Schreibpuffers darf 64 Kbyte nicht übersteigen. Es ist deshalb erforderlich,
die Zahl der zu schreibenden Sektoren auf die Pufferlänge zu justieren, da sonst
undefinierte Resultate auftreten.
Die Numerierung der logischen Sektoren beginnt mit dem Wert 0 bei Spur 0, Kopf 0,
physikalischer Sektor 0. Alle folgenden Sektoren werden dann in aufsteigender
Reihenfolge gezählt.
Die Eingabeparameter werden nicht überprüft, weshalb die Funktion mit Vorsicht zu
behandeln ist. Alle Register, außer dem Segmentregister, werden beim Aufruf zerstört.
Lediglich das Flag-Register wird automatisch beim INT 26 durch den Prozessor auf dem
Anwenderstack gesichert. Der Treiber gibt ab DOS 4.0 die Kontrolle an den
Anwenderprozeß über eine einfache RET-Anweisung zurück. Dies bedeutet, daß der
Zustand der Flags vor dem Aufruf auf dem Stack verbleibt. Nach dem Aufruf enthält der
Stack deshalb noch einen 16-Bit-Eintrag, der durch eine POP-Anweisung zu entfernen ist.
INT 26
JC ERROR
POP AX
..
; Stack bereinigen
Es ist aber zu beachten, daß bei der Stackbereinigung mittels des POP-AX-Befehls der
Fehlercode in AX überschrieben wird. Deshalb sollte zuerst das Carry-Flag geprüft
werden. Liegt ein Fehler vor, ist zuerst eine Fehlerbehandlung erforderlich. Bei gelöschtem
Carry-Flag kann der POP-AX-Befehl direkt ausgeführt werden.
3.8 Terminate But Stay Resident (INT 27)
Dieser Interrupt erlaubt es, daß ein Prozeß die Kontrolle an den residenten Teil von
COMMAND.COM zurückgibt, ohne daß der zugehörige Programm- und Datenbereich freigegeben
wird. Das heißt, es werden keine anderen Programme in diesen Bereich geladen. Der
Prozeß verbleibt im Speicher und wird lediglich in den Zustand »ruhendFehler!
Verweisquelle konnte nicht gefunden werden.Ö---------------------------------Ì
°
CALL: INT 27
°
°
°
° CS:DX Zeiger auf das Ende des
°
°
belegten Speichers
°
°
°
û---------------------------------À
°
RETURN
°
° --°
°
°
Û---------------------------------ì
Im Registerpaar CS:DX wird ein Zeiger übergeben, der auf das erste freie Byte hinter dem
belegten Speicherbereich zeigt. MS-DOS behandelt dann den Bereich, beginnend bei der
Segmentadresse und dem Offset 0, bis zur in CS:DX übergebenen Adresse als erweiterten
internen Speicher, in den keine anderen Programme geladen werden können.
Sobald nun der INT 27 aufgerufen wird, terminiert der Programmablauf und die Kontrolle
geht an DOS zurück. Alle geöffneten Dateien bleiben erhalten, und der Programmcode
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
140
DOS Programmierhandbuch
steht auch weiterhin im Speicher. Das Programm kann später z.B. durch einen Interrupt
aktiviert werden, wobei die Register CS, DS und ES auf die gleiche Segmentadresse
gesetzt werden müssen.
Die Größe des Programmes darf 64 Kbyte nicht überschreiten. EXE-Dateien können nicht
mit dem Aufruf beendet werden, da sie einerseits nicht auf 64 Kbyte begrenzt sind und
andererseits in den oberen freien Speicherbereich geladen werden.
Der INT 27 restauriert (siehe auch die INT 21-Funktion 30) die folgenden Adreßvektoren:
INT 22
INT 23
INT 24
Programm Terminate Address
Control-C Handler Address
Critical Error Handler Address
auf den Zustand vor dem Laden des Programmes, welches den INT 27 ausgibt. Aus diesem
Grund ist es nicht möglich, über den INT 27 einen der drei oben genannten Handler durch
benutzerspezifische Routinen zu ersetzen. Die Handler würden zwar resident im Speicher
liegen, aber die Interruptvektoren zeigen auf die Original-DOS-Serviceroutinen.
Der Interrupt läßt sich aber
Anwenderprogramme zu laden.
verwenden,
um
benutzerspezifische
residente
Da viele dieser Programme nicht unbedingt Informationen über ihre Umgebung benötigen,
kann der durch den Environmentblock belegte Speicher an MS-DOS zurückgegeben
werden. Hierzu ist die im PSP ab Offset 2CH gespeicherte Segmentadresse des
Environments zu lesen und der Speicher durch die INT 21-Funktion 49H (free allocated
memory) zurückzugeben. Manche Programme ermöglichen es auch den PSP-Bereich über
diese Funktion freizugeben.
Dieser Interrupt wurde aus Kompatibilitätsgründen (MS-DOS 1.x) erhalten. Für EXEProgramme und Neuentwicklungen sollte die Funktion 31H des INT 21 (Keep Process)
benutzt werden.
3.9 Start a Resident Process (INT 28 undokumentiert)
Der Interrupt wird intern durch DOS benutzt und die Funktion wurde erst ab DOS 5.0
offiziell durch Microsoft publiziert. Der Interrupt wird bereits ab DOS 2.0 verwendet.
Wozu dient nun aber dieser Interrupt?
Die Funktionen von DOS sind nicht reentrant programmiert, was bedeutet, daß innerhalb
einer Interrupt-Service-Routine keine DOS-Funktionen oberhalb 0CH aufgerufen werden
können. Wenn DOS bestimmte Operationen wie Diskzugriffe ausführt, dann legt es
temporäre Werte nicht auf dem Stack, sondern in internen Datenbereichen ab. Wird nun die
Funktion vor ihrer Beendigung ein zweites Mal aufgerufen, speichert sie die neuen
Zwischenwerte ebenfalls in diesem Speicherbereich. Die Interruptroutine rettet ja nur die
Register des Prozessors und nicht die Datenbereiche. Nach Beendigung dieses Aufrufes
sind nun für den unterbrochenen Prozeß die Daten zerstört, was im günstigsten Fall zu
falschen Ergebnissen führt, meist aber in einem Systemabsturz endet. Da aber Programme
wie PRINT.COM Diskzugriffe parallel zu DOS durchführen, muß es Mechanismen geben,
diese kritischen Zustände in DOS zu erkennen und abzufangen. Hierzu existiert unter
anderem auch der INT 28. Der Aufruf besitzt keine Parameter.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
141
Ö-------------------------------Ì
°
CALL: INT 28
°
°
°
° --°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Jedesmal, wenn DOS Zeichen über die INT 21-Funktionsaufrufe 01H bis 0CH bearbeitet,
liegt ein Zustand vor, in dem eine Benutzung der INT 21-Funktionen 00H und oberhalb
0CH erlaubt ist. Um diesen »sicheren ZustandFehler! Verweisquelle konnte nicht
gefunden werden.Ein residenter Prozeß kann nun die eigene Startadresse unter dem
INT 28-Vektor ein-tragen. Hierzu sind die INT 21-Funktionen 35H (Get Interrupt Vector)
und 25H (Set Inter-rupt Vector) zu nutzen. Jedesmal, wenn DOS einen Funktionsaufruf zur
Zeichenbearbeitung (INT 21-Funktion 01H bis 0CH) ausführt, wird dann der residente
Prozeß aktiviert. Innerhalb dieses Prozesses dürfen dann die INT 21-Funktionen 00H und
oberhalb 0CH benutzt werden.
Die Ursache für diesen INT 28-Aufruf liegt wohl in der Tatsache begründet, daß DOS bei
den Funktionen 01H bis 05H und 08H bis 0CH das interne Control-C-Flag abfragt.
Lediglich die Funktionen 06H und 07H verzichten darauf. Im Rahmen dieser Abfrage wird
der INT 28 ausgelöst.
Nun besteht aber noch die Frage, wann INT 21-Funktionsaufrufe im Bereich 01H bis 0CH
aufgerufen werden dürfen. Hier bietet der INT 28 einen weiteren Mechanismus zur
Ermittlung des sicheren Zustandes an. Vor dem Aufruf des INT 28 wird ein Flag auf dem
Stack gesichert. Dessen Inhalt signalisiert, ob DOS im sicheren Zustand ist, oder ob
kritische Operationen noch offenstehen. Das Flag befindet sich 6 Byte oberhalb des
Stackpointers, wobei nur das untere Bit definiert ist. Es gilt folgende Kodierung:
Flag = 0
Flag = 1
Es dürfen keine INT 21-Funktionen im Bereich zwischen
01H und 0CH genutzt werden.
DOS befindet sich in einem sicheren Zustand und alle
INT 21-Funktionsaufrufe lassen sich nutzen.
Zusammen mit dem INT 21-Aufruf 34H (Get Critical Region Flag) läßt sich in einem
residenten Programm prüfen, ob ein sicherer Zustand vorliegt. Vorsicht ist allerdings bei
Verwendung der INT 21-Funktion 51H (Get Active PSP) geboten. Erfolgt ein Aufruf
dieser (vor DOS 5.0) undokumentierten Funktion aus einem INT 28-Handler, kommt es zu
einem Systemabsturz, da die Funktion einen Fehler enthält, der den Stack nicht korrekt
bearbeitet. Ab DOS 3.0 läßt sich ersatzweise die INT 21-Funktion 62H zur Ermittlung des
aktiven PSP benutzen. Weitere Hinweise zu dieser Thematik und zum Umgang mit
residenten Programmen finden sich in dem entsprechenden Kapitel und in /1/. Der Interrupt
wird ab DOS 5.0 durch die INT 2F-Funktion 1680H ersetzt und sollte nicht mehr
verwendet werden.
3.10 Screen Output (INT 29 undokumentiert)
Dieser Interrupt wird intern durch DOS benutzt und dessen Funktion wurde bisher nicht
offiziell durch Microsoft publiziert. Er wird aber zumindest ab DOS 2.0 unterstützt.
DOS muß natürlich die Ausgabe von Zeichen abwickeln. Hierfür bedient es sich neben den
BIOS-Funktionsaufrufen auch des Interrupts 29H. Der Interrupt gibt selbst nur ein
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
142
einzelnes Zeichen an der Cursorposition aus. Das Zeichen muß im AL-Register stehen,
wobei alle anderen Register vom Interrupt-Handler gesichert werden.
Ö-------------------------------Ì
°
CALL: INT 29
°
°
°
° AL: Zeichen
°
û-------------------------------À
°
RETURN
°
° --°
°
°
Û-------------------------------ì
Da aber der INT 21 genügend Funktionen zur Zeichenausgabe besitzt, ist der INT 29
normalerweise uninteressant. Es gibt aber DOS-Versionen (z.B. PC-DOS), die auch die
Zeichenattribute über den INT 29 beeinflussen können.
Die Serviceroutine verwaltet dann die Daten für das Attributbyte und die Bildschirmseite
auf folgenden Adressen:
Adresse
CS:115H
CS:116H
Bedeutung
Attributbyte für das auszugebende Zeichen
Bildschirmseite der Ausgabe
Die Segmentadresse bezieht sich auf das Codesegment der Serviceroutine. Eine Ausgabe
von Attributen kann auf folgende Art erfolgen:
Segmentadresse INT 29 ermitteln
Werte an Offset 115H und 116H sichern
gewünschte Einstellung setzen
String zeichenweise ausgeben
alte Werte an Offset 115H restaurieren
Die Daten müssen nicht unbedingt gesichert werden, falls die Einstellung für längere Zeit
gelten soll. Allerdings können bestimmte DOS-Programme sowie der IBM-BasicInterpreter die Einstellung zurücksetzen. Es ist aber zu beachten, daß es sich hier um eine
undokumentierte Funktion handelt, die nicht in allen DOS-Implementierungen unterstützt
wird. Weiterhin können sich die Offsetadressen innerhalb der verschiedenen DOSVersionen ändern.
In den Versionen DOS 3.2 und 3.3 vergleicht COMMAND.COM die Vektoren des INT 29
und INT 20. Liegt das INT 20-Segment oberhalb des INT 29-Segmentes, nimmt DOS an,
daß ANSI.SYS geladen ist.
3.11 Microsoft Netzwerk-Session Layer Interrupt (INT 2A
undokumentiert)
Dieser Interrupt wird von der Microsoft Netzwerksoftware benutzt. Es sind mir allerdings
nur wenige Einzelheiten über die Aufrufschnittstelle bekannt.
Der Aufruf bietet folgende Funktionen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
143
AH ° Funktion
----é-------------------------------------------------00H° Netzwerk installiert?
° Return: AH <> 0 falls installiert
----é-------------------------------------------------01H° NETBIOS-Aufruf
----é-------------------------------------------------02H° Setze Printer-Mode im Netz
----é-------------------------------------------------03H° Lese shared device status (check direct I/O)
° AL = 00H
° DS:SI Zeiger auf den ASCII Disk Namen
° Return: CF 0 falls shared device erlaubt
----é-------------------------------------------------04H° NETBIOS-Aufruf
° AL = 0 Error retry
°
1 No retry ----é-------------------------------------------------° ES:BX Zeiger auf den NCB (Network Control Block)
° Return: AX 0 -> kein Fehler
°
AH 1 -> Fehler
°
AL
Fehlercode
----é-------------------------------------------------05H° Lese Netzwerk-Resourcen-Informationen
° AL
00H
° Return: AX reserved
°
BX Zahl der Netzwerknamen
°
CX Zahl der Kommandos
°
DX Zahl der Sessionen
----é-------------------------------------------------06H° NETBIOS-Netzwerk Print Stream Control
° AL
01H Setze Concatenations Mode
°
02H Setze Truncations Mode (default)
°
03H Truncate Print Stream
° Return: CY = 1
°
AX = Fehlercode
----é-------------------------------------------------80H° NETBIOS Begin DOS Critical Section
° AL = 01 bis 06 kritische Sektionsnummer
----é-------------------------------------------------81H° NETBIOS End DOS Critical Section
° AL = 01 bis 06 kritische Sektionsnummer
----é-------------------------------------------------82H° NETBIOS Server Hook
° Stack: AX vom INT 21-Aufruf
° Wird von den INT 21-Funktionen bis auf 0CH
° und 59H aufgerufen
----é------------------------------------------------84H° NETBIOS Keyboard Busy Loop
° Vergleichbar mit dem INT 28
Weitere Informationen über die Netzwerkfunktionen finden sich im Kapitel mit der
Beschreibung der NetBIOS-Funktionen.
3.12 Start a Child Process (INT 2E undokumentiert)
Bei diesem Interrupt handelt es sich ebenfalls um einen undokumentierten Interrupt, der ab
DOS 2.x reserviert ist. Dieser Interrupt bietet eine Hintertür, um interne DOS-Prozeduren
wie DIR und DEL über COMMAND.COM, den Kommandointerpreter, zu starten. Der
Interrupt wird über die Register DS und SI mit Parametern versorgt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
144
Ö-------------------------------Ì
°
CALL: INT 2E
°
°
°
° DS:SI Zeiger auf einen
°
°
Kommandostring
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Es wird ein Zeiger übergeben, der auf einen Kommandostring mit gültigen DOSKommandos zeigt. Dieser String besitzt ein festes Format:
Ö------Ú---------------------------------------------------------Ì
° Byte ° Bemerkung
°
û------é---------------------------------------------------------À
°
1 ° Länge des Strings in Byte, ohne d. Abschlußzeichen (n-1)°
û------é---------------------------------------------------------À
°
2 ° Kommandostring
°
°
. °
.
°
°
n °
.
°
û------é---------------------------------------------------------À
° n+1 ° Carrige Return (0DH) als Abschlußzeichen
°
Û------Ù---------------------------------------------------------ì
Tabelle 3.10: Kommandostring; für den INT 2E-Aufruf
Ein gültiger Kommandostring wäre zum Beispiel:
03,"DIR",0D
Sobald der INT 2E aufgerufen wird, führt der residente Teil von COMMAND.COM die
Funktion aus. Dies kann dazu genutzt werden, um aus einem laufenden Programm heraus
andere Funktionen aufzurufen.
So läßt sich das Master Environment aus einem child process leicht mit dem internen
DOS-Kommando:
0D,"SET ... = ....",0DH
beeinflussen. Dies ist ansonsten nur durch direkte Zugriffe in den Speicherbereich des
Environments möglich. Allerdings ist die Adresse des Master-Environments nur schwierig
zu ermitteln (über die MCB-Kette). Eine Änderung per INT 21-Funktion 4BH (Load and
Execute-Programm)
mit
einem
Aufruf
des
DOS-Kommandointerpreters
(COMMAND.COM) über die Anweisung:
/C SET ... = ...
ist nicht möglich, da dann ja eine zweite Kopie des Kommandoprozessors geladen wird.
Diese erhält auch einen eigenen Environmentbereich, auf den sich alle anschließenden
SET-Kommandos beziehen. Damit bietet der INT 2E die einzige Möglichkeit, diese
Änderung aus einem laufenden Prozeß schnell und elegant vorzunehmen.
Der INT 2E übernimmt keine Speicherverwaltung, so daß nur die »internen INT 2E es
erlaubt, einen DOS-Befehl auszuführen, ohne eine zweite Kopie des
Kommandointerpreters (COMMAND.COM) zu laden, wie dies bei der INT 21-Funktion
4B00H (Load and Execute-Programm) der Fall ist.
Falls externe Programme aufzurufen sind (z.B. PRINT), muß vorher über die INT 21Funktion 4AH ein entsprechender Speicherbereich freigegeben werden. Falls das geladene
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
145
Programm länger als der freie Speicherbereich ist, werden Teile von DOS überschrieben
und es kann zu einem Systemabsturz kommen. Daher sollte der Interrupt nur für die
Aktivierung interner DOS-Funktionen benutzt werden.
3.13 Mulitplexerinterrupt (INT 2F undokumentiert)
Dies ist ein intern durch MS-DOS benutzter Interrupt, der in MS-DOS 2.X überhaupt nicht
und in den anderen DOS-Versionen nur teilweise offiziell dokumentiert ist. Der Interrupt
erlaubt die Kommunikation zwischen zwei laufenden Prozessen. In DOS 2.X muß ein
Prozeß vor einer Benutzung prüfen, ob der Vektor bereits initialisiert wurde. Ab DOS 3.0
übernimmt das Betriebssystem die Initialisierung.
Der INT 2F besitzt, ähnlich dem INT 21, einen Funktionsdispatcher, der über den Inhalt
des Registers AH die jeweilige Unterfunktion aufruft. Jeder dieser Unterfunktionen wird
eine eigene Codenummer zugeordnet. Weitere Parameter lassen sich mittels der restlichen
Register übergeben. Leider existieren keine festgelegten Mechanismen zur Vergabe dieser
Codenummern, so daß der Softwareentwickler darauf zu achten hat, daß eine Nummer
nicht durch zwei Applikationen belegt wird. In diesem Fall muß eine der Applikationen mit
einer anderen Codenummer versehen werden. Zur groben Orientierung sei folgende
Tabelle angegeben:
Ö----------Ú-------------------------------------------Ì
° Code
° Bemerkung
°
û----------é-------------------------------------------À
° 00 - 7F ° reserviert für MS-DOS-Zwecke
°
û----------é-------------------------------------------À
° 80 - BF ° reserviert für zukünftige Erweiterungen
°
û----------é-------------------------------------------À
° C0 - FF ° frei für Anwenderprogramme
°
Û----------Ù-------------------------------------------ì
Tabelle 3.11: Zuordnung der Codenummern des INT 2F
Ab DOS 4.0 sind die Codes 00H bis BFH für das Betriebssystem reserviert. Der
dokumentierte Teil des Multiplexerinterrupt 2FH wird zur Zeit im wesentlichen zur
Kommunikation mit der PRINT-Utility genutzt. Weitere Informationen finden sich im
Kapitel über den Multiplexerinterrupt.
3.14 Der INT 30H
Der INT 30 besitzt keinen Vektor, vielmehr legt DOS unter der entsprechenden Adresse in
der Interruptvektor-Tabelle einen 5 Byte umfassenden JMP-FAR-xxx:xxx-Befehl ab. Die
Adresse zeigt in den DOS-Teil mit den CP/M-orientierten Funktionen. Der CALL FAR
CS:0005 zum Beenden eines Prozesses führt zum Beispiel einen FAR JMP auf diese
Adresse aus und wird dann zu den entsprechenden Routinen geleitet. Allerdings zeigt der
Vektor unter DOS 2.x zwei Byte unter den Einsprungpunkt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
146
3.15 Der INT 31H
Damit ist der INT 31H ebenfalls nicht mehr benutzbar, da ein Byte des vorhergehenden
JMP-FAR-Befehls in den Adreßraum des INT 31H reicht.
Wird in DOS eine Software eingesetzt, die das DOS-Protected-Mode-Interface (DPMI)
unterstützt, ist den INT 31 nicht mehr frei. Die DPMI-Spezifikation definiert den INT 31
als Einsprungpunkt für den Dispatcher. Genauere Informationen finden sich im Kapitel
über die Speicherverwaltung, wo die DPMI-Spezifikation detailliert beschrieben wird.
3.16Der INT 32H
Dieser Interrupt ist in MS-DOS nicht belegt und reserviert.
3.17 Der Maus-Treiber-Interrupt (INT 33)
Die Interrupts 30H bis 3FH sind für MS-DOS reserviert. Allerdings belegen verschiedene
Produkte diese Interrupts. Dies ist auch beim von Microsoft entwickelten Maus-Treiber der
Fall. Der MS-MOUSE-Treiber wird meist in CONFIG.SYS oder AUTOEXEC.BAT
gestartet. Er installiert sich resident und hängt sich in die Treiberkette ein. Der Interrupt
kann dann als erweiterte BIOS- oder DOS-Funktion, zur Abfrage der Maus, gesehen
werden.
Nachfolgend soll die Softwareschnittstelle dieses Treibers beschrieben werden.
Maus INIT (AX = 00H)
Mit diesem Aufruf wird der MS-Maus-Treiber initialisiert. Es gelten folgende
Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 00H (Maus INIT)
°
û---------------------------------À
°
RETURN
°
° AX: 0 kein Treiber installiert °
°
FF Treiber vorhanden
°
° BX: Anzahl der Maustasten
°
Û---------------------------------ì
Falls der Treiber nicht vorhanden ist, gibt das Register AX den Wert 00H zurück. Ist er
installiert, enthält BX die Zahl der Maustasten. Es gilt dabei folgende Nomenklatur:
BX:
FFFFH
0000H
0003H
2 Maustasten
Maus besitzt keine 2 Tasten
Mouse System / Logitech Maus
Der Wert 00 bedeutet, daß die Maus keine 2 Tasten besitzt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
147
Mauszeiger einblenden und löschen (AX = 01H, AX = 02H)
Mit diesem Aufruf wird das Mauszeigersymbol auf dem Anzeigeschirm eingeblendet (AX
= 01H) oder gelöscht (AX = 02H).
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 01H (Show Cursor)
°
°
02H (Clear Cursor)
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Es werden sonst keine weiteren Parameter übergeben. Ein mehrfacher Aufruf der Funktion
02H bedeutet, daß auch die Funktion 01H mehrfach aufzurufen ist.
Get Parameter (AX = 03H)
Mit diesem Aufruf lassen sich die Koordinaten des Mauscursors und die Zustände der
Tasten abfragen. Es gelten folgende Aufrufkonventionen:
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 03H (Get Parameter)
°
û---------------------------------À
°
RETURN
°
° CX: X - Koordinate Cursor
°
° DX: Y - Koordinate Cursor
°
° BX: Tastenstatus
°
Û---------------------------------ì
In den Registern CX und DX werden die X- und Y-Koordinaten des Mauszeigers mit der
Auflösung der jeweiligen Grafikkarte zurückgegeben. Das Register BX enthält die Maske
mit dem Status der Maustasten. Es gilt folgende Belegung:
Bit 0 :
Bit 1 :
Bit 2 :
Linke Taste
Rechte Taste
Mittlere Taste
Ein gesetztes Bit signalisiert, daß die Taste gerade gedrückt wurde. Falls die Maus nur
2 Tasten besitzt, ist Bit 2 undefiniert.
Set Cursor (AX = 04H)
Diese Funktion positioniert den Mauszeiger auf die angegebenen Koordinaten. Es gelten
folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 04H (Set Cursor)
°
° CX: X - Koordinate Cursor
°
° DX: Y - Koordinate Cursor
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Die Cursorkoordinaten beziehen sich auf die Auflösung der verwendeten Grafikkarte.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
148
Get Cursorposition and Pressed Buttons (AX = 05H)
Diese Funktion erlaubt es, die Position des Mauscursors beim letzten Tastendruck
abzufragen. Es gelten folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 05H (Get Cursorposition)
°
° BX: 0 -> linke Taste
°
°
1 -> rechte Taste
°
û---------------------------------À
°
RETURN
°
° CX: X - Position
°
° DX: Y - Position
°
° BX: Anzahl Tastendrucke
°
° AX: Tastenstatus
°
Û---------------------------------ì
Die Cursorkoordinaten beziehen sich auf die Auflösung der verwendeten Grafikkarte. Im
AX-Register wird der Status der Maustasten zurückgegeben. Es gilt folgende Nomenklatur:
Ö-----Ú---------------------------Ì
° Bit ° Status
°
û-----é---------------------------À
° 0 ° linke Taste gedrückt
°
û-----é---------------------------À
° 1 ° rechte Taste gedrückt
°
û-----é---------------------------À
° 2 ° mittlere Taste gedrückt
°
Û-----Ù---------------------------ì
Tabelle 3.15: Status der Maustasten
Im Register BX findet sich die Zahl der Tastendrucke seit dem letzten Funktionsaufruf. Die
Register CX und DX enthalten die Koordinaten des Mauscursors beim letzten Tastendruck.
Eine Maus mit 3 Tasten gibt den Wert AX = 4 zurück, falls die mittlere Taste gedrückt
wird.
Get Cursorposition and Free Buttons (AX = 06H)
Diese Funktion arbeitet komplementär zur Funktion 05H, denn sie erlaubt es,
Informationen über die freigegebenen Tasten abzufragen.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 06H (Get Status)
°
° BX: 0 -> linke Taste
°
°
1 -> rechte Taste
°
°
2 -> mittlere Taste
°
û---------------------------------À
°
RETURN
°
° CX: X - Position
°
° DX: Y - Position
°
° BX: Anzahl Tastenfreigaben
°
° AX: Tastenstatus
°
Û---------------------------------ì
Im Register BX ist ein Wert für die abzufragende Taste zu übergeben. Der Code 02H gilt
dabei nur für die Mouse System Maus. Die zurückgegebenen Cursorkoordinaten beziehen
sich auf die Auflösung der verwendeten Grafikkarte. Im AX-Register wird der Status der
Maustasten zurückgegeben. Es gilt folgende Nomenklatur:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
149
Ö-----Ú---------------------------Ì
° Bit ° Status
°
û-----é---------------------------À
° 0 ° linke Taste gedrückt
°
û-----é---------------------------À
° 1 ° rechte Taste gedrückt
°
û-----é---------------------------À
° 2 ° mittlere Taste gedrückt
°
Û-----Ù---------------------------ì
Tabelle 3.16: Kodierung der Maustasten
Im Register BX findet sich die Zahl der Tastenfreigaben seit dem letzten Funktionsaufruf.
Die Register CX und DX enthalten die Koordinaten des Mauscursors bei der letzten
Tastenfreigabe.
Set X-Koordinates (AX = 07H)
Diese Funktion setzt die minimalen und maximalen Positionen der X-Achse, zwischen
denen sich der Cursor bewegen kann.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 07H (Set X - Koordinates)
°
° CX: X - Position Minimum
°
° DX: X - Position Maximum
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Die Cursorkoordinaten beziehen sich auf die Auflösung der verwendeten Grafikkarte. Der
minimale Wert wird im Register CX übergeben, während das Register DX den
Maximalwert enthält.
Set Y-Koordinates (AX = 08H)
Diese Funktion setzt die minimalen und maximalen Positionen der Y-Achse, zwischen
denen sich der Cursor bewegen kann.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 08H (Set Y - Koordinates)
°
° CX: Y - Position Minimum
°
° DX: Y - Position Maximum
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Die Cursorkoordinaten beziehen sich auf die Auflösung der verwendeten Grafikkarte. Der
minimale Wert wird im Register CX übergeben, während das Register DX den
Maximalwert enthält.
Define Cursor Symbol (AX = 09H)
Diese Funktion erlaubt es, das Aussehen des Mauscursors zu definieren. Dieser Cursor
besteht aus einem Bitfeld zur Darstellung der Form. Es gelten folgende Aufrufparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
150
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 09H (Define Cursor Symbol) °
° BX: X - Koordinate Mausspitze
°
° CX: Y - Koordinate Mausspitze
°
° ES:DX Zeiger auf Symbolmaske
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Das Register BX enthält die X-Koordinate des Mauszeigers innerhalb der Symbolmaske.
Das Register CX enthält analog die Y-Koordinate des Mauszeigers. Im Registerpaar
ES:DX findet sich ein Zeiger auf den Anfang zweier Bitfelder, die die Form des
Mauscursors und das Muster des Bildschirmhintergrundes spezifizieren. Das erste Feld von
16 Bit * 16 Byte definiert das Muster des Bildschirmhintergrundes. Jedes gesetzte Bit
entspricht dabei einem hellen Punkt. Man beachte, daß Grafikoberflächen häufig schwarze
Zeichen auf hellem Hintergrund ausgeben (Inversdarstellung). An dieses Feld schließt sich
ein zweites Feld von 16 Bit * 16 Byte an, in denen die Pixel des Maussymbols abgelegt
werden. Jedes gesetzte Bit entspricht einem hellen Punkt auf dem Bildschirm. Der
Bildschirmausschnitt an der Mausposition wird bei der Ausgabe mit der 16 Bit * 16 Byte
Maske des Cursorhintergrundes über die AND-Funktion verknüpft. Das Ergebnis wird
anschließend noch mit der Cursormaske über XOR verknüpft. Der Wert FFFFH in der
Maske des Bildschirmhintergrundes und gesetzte Bits in der Cursormaske löschen das
entsprechende Pixel, so daß der Cursor invertiert dargestellt wird.
Define Textcursor Symbol (AX = 0AH)
Diese Funktion definiert das Aussehen des Textcursors auf dem Bildschirm. Es gelten
folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 0AH (Set Textcursor Symbol) °
° BX: 0
°
° CX: Bildschirmmaske
°
° DX: Cursormaske
°
° BX: 1
°
° CX: 1. Cursor Rasterzeile
°
° DX: n. Cursor Tasterzeile
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Das Register BX steuert die Definition des Textcursors. Falls BX = 0 ist, wird im Register
CX die Bildschirmmaske übergeben. Das Register DX enthält die Cursormaske. Im
Textmode bestehen die zwei Masken jeweils aus einem 16 Bit Feld mit folgender
Kodierung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
151
Ö-----Ú---------------------------Ì
° Bit ° Bedeutung
°
û-----é---------------------------À
° 0-7 ° ASCII - Zchn. d. Cursors °
û-----é---------------------------À
° 8-A ° Vordergrundfarbe (RGB)
°
û-----é---------------------------À
° B ° Intensität
°
û-----é---------------------------À
° C-E ° Hintergrundfarbe
°
û-----é---------------------------À
° F ° blinkende Darstellung
°
Û-----Ù---------------------------ì
Tabelle 3.17: Kodierung des Mauscursors; im Textmode
Im Textmode wird vom Cursor jeweils nur ein Zeichenfeld belegt. Der Mode BX = 0
bedeutet, daß der Cursor softwaremäßig erzeugt wird.
Falls BX = 1 ist, wird ein Blockcursor über die Hardware dargestellt. Das Register CX gibt
an, in welcher Rasterzeile der Cursor beginnt (s. auch Beschreibung des INT 10). Die letzte
Rasterzeile wird in DX spezifiziert.
Read Steps (AX = 0BH)
Diese Funktion ermittelt die Zahl der Mausschritte seit dem letzten Funktionsaufruf. Es
gelten folgende Konventionen:
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 0BH (Read Steps)
°
û---------------------------------À
°
RETURN
°
° CX: X - Schritte
°
° DX: Y - Schritte
°
Û---------------------------------ì
Die Werte der internen Schrittzähler finden sich in den Registern CX und DX. Ein Schritt
entspricht dabei einer Distanz von ca 1/200 Inch und wird als Mickey bezeichnet.
Set Event-Interrupt (AX = 0CH)
Durch diesen Aufruf kann dem Treiber die Adresse einer neuen Serviceroutine übergeben
werden. Diese wird bei bestimmten Ereignissen aktiviert.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX:
0CH (Set New Interrupt)
°
° CX:
Aktivierungsmaske
°
° ES:DX FAR Routine Address
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Im Registerpaar ES:DX ist die Adresse der neuen Serviceroutine zu übergeben. Diese wird
über einen CALL FAR-Aufruf vom Treiber aktiviert. Das Register CX enthält die
Aktivierungsmaske, die definiert, wann die Routine aufzurufen ist. Es gilt folgende
Belegung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
152
Ö-----Ú---------------------------Ì
° Bit ° Aktion
°
û-----é---------------------------À
° 0 ° Änderung Cursorposition
°
° 1 ° linke Taste gedrückt
°
° 2 ° linke Taste freigegeben
°
° 3 ° rechte Taste gedrückt
°
° 4 ° rechte Taste freigegeben °
° 5 ° mittlere Taste gedrückt
°
° 6 ° mittlere Taste freigeg.
°
Û-----Ù---------------------------ì
Tabelle 3.18: Belegung der Aktivierungsmaske (Maustreiber)
Die Bits für die mittlere Taste gelten nur bei der Mouse-Systems-Maus. Sobald eine der
spezifizierten Bedingungen auftritt, aktiviert der Treiber den definierten Interrupt. Beim
Aufruf der neuen Service-Routine sind die Register mit folgenden Werten:
Ö-----Ú---------------------------Ì
° Reg ° Wert
°
û-----é---------------------------À
° AX ° Aktivierungsmaske
°
° BX ° Zustand Maustaste
°
° CX ° x - Koordinate Cursor
°
° DX ° y - Koordinate Cursor
°
° SI ° horizont. Auflösung
°
° DI ° vertikale Auflösung
°
Û-----Ù---------------------------ì
Tabelle 3.19: Belegung der Register beim Event-Interrupt
belegt. Die Routine kann dann entsprechend auf den Registerinhalt reagieren.
Emulate Lightpen (AX = 0DH, 0EH)
Durch diesen Aufruf kann der Treiber einen Lichtgriffel emulieren.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 0DH (Emulate Lightpen ON)
°
°
0EH (Emulate Lightpen OFF) °
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Mit AH = 0DH wird die Emulation eingeschaltet, während AH = 0EH die Emulation
beendet.
Set Step Size (AX = 0FH)
Durch diesen Aufruf kann der Treiber die Maus auf die Standard Schrittweite einstellen. Es
gelten folgende Übergabeparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
153
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 0FH (Set Step Size)
°
° CX:
X - Step Size (1 - 7FFFH) °
° DX:
Y - Step Size (1 - 7FFFH) °
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Im Registerpaar CX und DX wird die Schrittweite in X- und Y-Richtung in 1/200 Inch pro
Step (Mickey) eingestellt. Bei einem X-Wert von 16, bezogen auf 8 Bildpunkte, muß die
Maus um 6,4 Inch bei 640 Bildpunkten bewegt werden, um den gesamten Bildschirm in XRichtung zu überqueren.
Restore Old Screen (AX = 10H)
Soll der Cursor ausgeblendet werden, kann die Funktion 02H benutzt werden. Eine andere
Möglichkeit besteht mit dem Aufruf 10H, womit der Treiber den Zustand des Bildschirms
ohne das Maussymbol restauriert, die Maus wird also nicht mehr angezeigt. Es gelten
folgende Parameter:
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 10H (Restore Old Screen)
°
° CX: obere X - Koordinate
°
° DX: obere Y - Koordinate
°
° SI: untere X - Koordinate
°
° DI: untere Y - Koordinate
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Im Registerpaar CX und DX findet sich die linke obere Ecke des Fensters, welches
restauriert werden soll. Die rechte untere Ecke wird in den Registern SI und DI übergeben.
Innerhalb dieses Fensters wird der alte Bildschirminhalt restauriert. Der Mauscursor muß
nach dem Aufruf wieder explizit eingeschaltet werden.
PC-Mouse Set Large Graphics Cursor (AX = 12H)
Dieser Aufruf ist bei der Microsoft-Maus nicht implementiert. Es gilt folgende
Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 12H (Set large Graphic Cur.)°
° BH: Cursorbreite in Worten
°
° CH: Cursorhöhe in Zeilen
°
° BL: horizontale Mausspitze
°
° CL: vertikale Mausspitze
°
° ES:DX Bit Map Cursor
°
û---------------------------------À
°
RETURN
°
° AX: -1 ok
°
Û---------------------------------ì
Der Aufruf entspricht der Funktion 09H bei der Microsoft-Maus.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
154
Define Speed (AX = 13H)
Die Geschwindigkeit der Bewegung des Mauszeigers auf dem Bildschirm läßt sich
einstellen. Mit diesem Aufruf kann die maximale Geschwindigkeit spezifiziert werden.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 13H (Define Speed)
°
° DX: Geschwindigkeit
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Die Geschwindigkeit der Bewegung des Mauszeigers wird in Schritten pro Sekunde
angegeben und im Register DX übergeben.
Die folgenden Aufrufe des MS-Treibers sind nicht alle dokumentiert, so daß eine
Verwendung mit Vorsicht zu handhaben ist.
(MS-Maus) Exchange Interrupt Subroutines (AX = 14H)
Mit diesem Aufruf läßt sich die Adresse einer neuen Interrupt-Subroutine übergeben. Es
gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 14H (Exchange Interrupt)
°
° CX: CALL Maske
°
° ES:DX Adresse neue Routine
°
û---------------------------------À
°
RETURN
°
° CX: alte CALL Maske
°
° ES:DX Adresse alte Routine
°
Û---------------------------------ì
Im Register ES:DX ist die Adresse der neuen Serviceroutine zu übergeben, während das
Register CX die Information über die Aufrufmaske (siehe Funktion 0CH) enthält. Nach
dem Aufruf enthalten die Register CX und ES:DX die Werte des alten Treibers.
(MS-Mouse) Return Driver Storage Requirements (AX = 15H)
Die Funktion ermittelt die Puffergröße zur Rückgabe des Treiberstatus.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 15H (Storage Requirements) °
û---------------------------------À
°
RETURN
°
° BX: Buffer Size
°
Û---------------------------------ì
Im Register BX steht nach dem Aufruf die Puffergröße, die zur Aufnahme des
Treiberstatus benötigt wird.
(MS-Mouse) Save Driver State (AX = 16H)
Die Funktion dient zur Abfrage des aktuellen Treiberstatus.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
155
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 16H (Save Driver State)
°
° ES:DX Adresse Puffer
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Im Register ES:DX ist die Adresse des Puffers zu übergeben, in dem der Maustreiber die
Statusinformationen ablegt.
(MS-Mouse) Restore Driver State (AX = 17H)
Die Funktion dient zur Restaurierung des Treiberstatus.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 17H (Restore Driver State) °
° ES:DX Adresse Puffer
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Im Register ES:DX ist die Adresse des Puffers zu übergeben, in dem die
Statusinformationen abgelegt sind.
(MS-Maus) Set alternate Mouse User Handler (AX = 18H)
Mit diesem Aufruf läßt sich die Adresse einer User-Interrupt-Subroutine übergeben. Es gilt
folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 18H (Exchange Interrupt)
°
° CX: CALL Maske
°
° ES:DX Adresse neue Routine
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Der Aufruf ist leider von Microsoft nicht dokumentiert. Im Register ES:DX ist die Adresse
der neuen Serviceroutine zu übergeben, während das Register CX die Information über die
Aufrufmaske enthält. Für die Werte in CX gilt folgende Festlegung:
Bit ° Bedeutung
-----é------------------------------------------0 ° Aufruf, falls Alt-Taste gedrückt
1 ° Aufruf, falls Ctrl-Taste gedrückt
2 ° Aufruf, falls Shift-Taste gedrückt
3 ° Aufruf, falls rechte Maustaste freigegeben
4 ° Aufruf, falls rechte Maustauste gedrückt
5 ° Aufruf, falls linke Maustaste freigegeben
6 ° Aufruf, falls linke Maustaste gedrückt
7 ° Aufruf, falls Maus sich bewegt
Beim Aufruf des Treibers sind folgende Register definiert:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
156
Register ° Bedeutung
----------é-------------------------------------AX
° Bedingungsmaske wie beim Aufruf in CX
BX
° Status der Maustasten
CX
° Y-Position Cursor
DX
° X-Position Cursor
DI
° horizontale Auflösung (in Mickeys)
SI
° vertikale Auflösung (in Mickeys)
Es sind bis zu drei Handler über diese Funktion installierbar.
(MS-Mouse) Return User alternate Interrupt Vektor (AX = 19H)
Mit diesem Aufruf läßt sich prüfen, ob ein User-Treiber mit dem Aufruf 18H installiert
wurde.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 19H (Return Interrupt Adr.) °
° CX: CALL Maske
°
û---------------------------------À
°
RETURN
°
° BX:DX Adresse Routine
°
° CX: CALL Maske
°
Û---------------------------------ì
Im Register BX:DX wird die Adresse des User-Treibers zurückgegeben. Ist kein Treiber
installiert, enthält CX den Wert 00H. Durch die Maske in CX läßt sich einer der drei
Handler selektieren. Stimmt die Maske nicht überein, wird CX = 0 zurückgegeben.
(MS-Mouse) Set Mouse Sensitivity (AX = 1AH)
Mit dem Aufruf läßt sich die Empfindlichkeit und die Auflösung einer MS-Maus
einstellen.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 1AH (Mouse Sensitivity)
°
° BX: horizontale Geschwindigk.
°
° CX: vertikale
Geschwindigk.
°
° DX: Schranke für 2 x Geschw.
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
In BX und CX wird die Geschwindigkeit angegeben, mit der der Cursor über das Bild
bewegt wird. In DX steht eine Schwelle, ab der die Cursorgeschwindig-keit auf den
doppelten Wert angehoben wird. Dies wird bei der Funktion 13H wirksam.
(MS-Mouse) Get Mouse Sensitivity (AX = 1BH)
Mit dem Aufruf läßt sich die Empfindlichkeit und die Auflösung einer MS-Maus abfragen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
157
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 1BH (Mouse Sensitivity)
°
û---------------------------------À
°
RETURN
°
° BX: horizontale Geschwindigk.
°
° CX: vertikale
Geschwindigk.
°
° DX: Schranke für 2 x Geschw.
°
Û---------------------------------ì
In BX und CX wird die Geschwindigkeit angegeben, mit der der Cursor über das Bild
bewegt wird (siehe auch Funktion 0FH). In DX steht eine Schwelle, ab der die
Cursorgeschwindigkeit auf den doppelten Wert angehoben wird. Dies wird bei der
Funktion 13H wirksam.
(MS-Mouse) Set Interrupt Rate (AX = 1CH)
Der Aufruf wird nur bei der Inport Maus unterstützt und setzt die Interruptrate des
Treibers.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 1CH (Set Interrupt Rate)
°
° BX: Interrupt Rate
°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Für den in BX übergebenen Wert gilt:
BX = 00H
01H
02H
03H
04H
keine Interrupt erlaubt
30 Interrupts / Sekunde
50 Interrupts / Sekunde
100 Interrupts / Sekunde
200 Interrupts / Sekunde
Werte größer als BX = 4 verursachen undefinierte Ergebnisse.
(MS-Mouse) Define Display Page Number (AX = 1DH)
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 1DH (define display page)
°
° BX: Display Page Nummer
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Der Aufruf selektiert, auf welcher Bildschirmseite der Cursor ausgegeben wird.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
158
(MS-Mouse) Return Display Page Number (AX = 1EH)
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 1EH (select display page)
°
û---------------------------------À
°
RETURN
°
° BX: Display Page Nummer
°
Û---------------------------------ì
Der Aufruf prüft, auf welcher Bildschirmseite der Cursor ausgegeben wird.
(MS-Mouse) Disable Mouse Driver (AX = 1FH)
Der Aufruf blockiert den Maustreiber.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 1FH (diable driver)
°
û---------------------------------À
°
RETURN
°
° AX: FFFFH Fehler
°
°
1F00H ok
°
° ES:BX INT 33 Vektor
°
Û---------------------------------ì
Läßt sich der Treiber abschalten, enthält das Register AX den Wert vor dem Aufruf. Sonst
wird der Wert FFFFH zurückgegeben. In ES:BX steht der Vektor, der vor der Installation
des Treibers in der Interruptvektor-Tabelle geladen war. Der Aufruf restauriert die
Vektoren des INT 10H und des INT 71H bei 8086-Systemen. Bei 80286/80386-Systemen
wird der INT 74H restauriert. Das Anwenderprogramm kann anschließend den in ES:BX
zurückgegebenen Wert unter dem INT 33 eintragen. Dann ist der Treiber komplett
abgeschaltet.
(MS-Mouse) Enable Mouse Driver (AX = 20H)
Der Aufruf gibt den Maustreiber wieder frei.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 20H (enable driver)
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Der Aufruf gibt die mit der Funktion 1FH restaurierten Vektoren wieder frei.
(MS-Mouse) Software Reset (AX = 21H)
Mit dieser Funktion läßt sich der Maustreiber zurücksetzen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
159
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 21H (Software Reset)
°
û---------------------------------À
°
RETURN
°
° AX = Status
°
Û---------------------------------ì
Im Register AX gibt der Treiber einen Statuscode zurück. Wurde das Register beim Aufruf
nicht verändert, ist der Treiber nicht installiert. Andernfalls findet sich in AX der Wert
FFFFH. Die Funktion ist mit dem Aufruf AH = 00H identisch, mit der Einschränkung, daß
der Mausstatus nicht zurückgelesen wird.
(MS-Mouse) Set Language for Messages (AX = 22H)
Mit dieser Funktion läßt sich die Sprache für die Ausgabemeldungen selektieren. Im
Register BX ist hierzu ein entsprechender Landescode zu übergeben.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 22H (Set Language)
°
° BX: Languagecode)
°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Für den Landescode gilt folgende Belegung:
BX = 00H
01H
02H
03H
04H
05H
06H
07H
08H
englisch
französich
holländisch
deutsch
schwedisch
finnisch
spanisch
portugiesisch
italienisch
Diese Funktion ist nur bei internationalen Versionen des Microsoft Maustreibers verfügbar.
(MS-Mouse) Get Language for Messages (AX = 23H)
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 23H (Get Language)
°
û---------------------------------À
°
RETURN
°
° BX: Languagecode)
°
Û---------------------------------ì
Mit dieser Funktion läßt sich die Sprache für die Ausgabemeldungen abfragen. Im
Register BX wird ein entsprechender Landescode zurückgegeben. Es gilt dabei die
Kodierung gemäß Funktion 22H. Die US-Version gibt hier immer den Wert 0 zurück.
(MS-Mouse) Get Software Version and Mouse Typ (AX = 24H)
Mit dieser Funktion läßt sich die Mausversion und der -typ abfragen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
160
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 24H (Software Reset)
°
û---------------------------------À
°
RETURN
°
° AX = Status
°
° BH = Hauptversion
°
° BL = Unterversion
°
° CH = Maustyp
°
° CL = Interrupt
°
Û---------------------------------ì
Im Register AX gibt der Treiber einen Statuscode zurück. Enthält das Register den Wert
FFFFH, liegt ein Fehler vor und die restlichen Register sind undefiniert. Alle anderen
Werte deuten auf einen erfolgreichen Aufruf hin. Im Register BH steht dann die
Hauptversionsnummer des Maustreibers, während BL die Unterversion enthält. In CH
findet sich der Maustyp (1 = Bus, 2 = serial, 3 = InPort, 4 = PS/2, 5 = HP). Der Interrupttyp
wird in CL kodiert (0 = PS/2, 2 = IRQ2, 3 = IRQ3,...., 7 = IRQ7).
(MS-Mouse) Set Acceleration Profile (AX = 2CH)
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 2CH (Set Profile)
°
° ES:DX Filename
°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Diese Version setzt ein Profil für die Beschleunigung der Maus. Die Datei mit dem
Maustreiber MOUSEPRO.FIL enthält ein Beispiel für ein solches Profile. Der Name der
Datei mit den Profildefinitionen wird in ES:DX übergeben.
(MS-Mouse) Select Acceleration Profile (AX = 2DH)
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 2DH (Select Profile)
°
° BX = Level
°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Dieser Aufruf selektiert ein Profil aus der Definitionsmenge. Der Wert für die
Beschleunigung ist über das Register BX beim Aufruf zu übergeben. Die Werte dürfen
zwischen 01H und 04H liegen.
(PC-Mouse) Get MS-Mouse storage Requirements (AX = 42H)
Dies ist ein erweiterter Aufruf des PC-Maustreibers. Es gilt folgende Aufrufschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
161
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 42H (Get storage Requirem.) °
û---------------------------------À
°
RETURN
°
° AX = Status
°
° BX = Buffer Size
°
Û---------------------------------ì
Das Register AX enthält nach dem Aufruf einen Statuscode. Mit dem Wert 4200H steht
fest, daß die erweiterten Funktionsaufrufe mit den Codes 42H, 50H und 52H nicht
unterstützt werden. Der Wert 0000H signalisiert, daß es sich um keine MS-Maus handelt.
Nur falls der Wert FFFFH zurückgegeben wird, enthält das Register BX die benötigte
Puffergröße in Byte für die Aufrufe 50H und 52H.
(MS-Mouse/Logitech) Return Copyright String (AX = 4DH)
Mit dieser Funktion läßt sich die Copyright Meldung abfragen.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 4DH (Return Copyright)
°
û---------------------------------À
°
RETURN
°
° ES:DI: Stringadresse
°
Û---------------------------------ì
Mit dieser Funktion läßt sich eine Copyright Nachricht abfragen. Nach dem Aufruf enthält
ES:DI einen Zeiger auf den entsprechenden String Copyright 1983 Microsoft ***. Dieser
String wird auch von anderen Treibern zurückgeliefert.
(PC-Mouse) Save MS-Mouse State (AX = 50H)
Mit dem Aufruf läßt sich der Status des Treibers in einem Puffer sichern. Es gilt folgende
Aufrufschnittstelle.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 50H (Save Status)
°
° BX: Puffergröße in Byte
°
° ES:DX Adresse Puffer
°
û---------------------------------À
°
RETURN
°
° AX = FFFFH ok
°
Û---------------------------------ì
In BX ist die mit dem Aufruf 42H ermittelte Puffergröße in Byte zu übergeben. Der Puffer
ist im Anwenderprozeß einzurichten. Die Adresse wird vor dem Aufruf in ES:DX
gespeichert. Nach einem erfolgreichen Aufruf enthält AX den Wert FFFFH.
(PC-Mouse) Restore MS-Mouse State (AX = 52H)
Mit dem Aufruf läßt sich der Status des Treibers aus dem Puffer restaurieren. Es gilt
folgende Aufrufschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
162
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 52H (Restore Status)
°
° BX: Puffergröße in Byte
°
° ES:DX Adresse Puffer
°
û---------------------------------À
°
RETURN
°
° AX = FFFFH ok
°
Û---------------------------------ì
In BX ist die mit dem Aufruf 42H ermittelte Puffergröße in Byte zu übergeben. Der Puffer
enthält die mit dem Aufruf 50H gelesenen Statusinformationen. Die Adresse wird vor dem
Aufruf in ES:DX gespeichert. Nach einem erfolgreichen Aufruf enthält AX den Wert
FFFFH.
(MS-Mouse/Logitech) Get Version String (AX = 6DH)
Mit dieser Funktion läßt sich die Copyright Meldung abfragen.
Ö---------------------------------Ì
°
CALL: INT 33
°
°
°
° AX: 6DH (Return Copyright)
°
û---------------------------------À
°
RETURN
°
° ES:DI: Stringadresse
°
Û---------------------------------ì
Mit dieser Funktion läßt sich eine Copyright Nachricht bei einem Logitech Treiber
abfragen.
Bei Verwendung obiger Mausaufrufe ist zu prüfen, ob der aktuelle Treiber diese
Funktionen unterstützt, da kleinere Abweichungen zwischen den einzelnen Treibern
auftreten können.
Bei Logitech-Treibern sind zusätzlich die Funktionsaufrufe AX=1DXXH, AX=20XXH bis
AX=24XXH implementiert. Auf die Beschreibung wurde jedoch verzichtet, da die MSAufrufe einen Herstellerstandard darstellen.
3.18 INT 34 bis INT 3E
Diese Interrupts bilden das Interface für die Borland/Microsoft-Floation-PointEmulationsaufrufe. Dabei gilt folgende Abbildung der Interrupts:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
163
Ö-------Ú------------------------------Ì
° INT ° Floating Point Code
°
û-------é------------------------------À
° 34H ° Opcode D8H
°
û-------é------------------------------À
° 35H ° Opcode D9H
°
û-------é------------------------------À
° 36H ° Opcode DAH
°
û-------é------------------------------À
° 37H ° Opcode DBH
°
û-------é------------------------------À
° 38H ° Opcode DCH
°
û-------é------------------------------À
° 39H ° Opcode DDH
°
û-------é------------------------------À
° 3AH ° Opcode DEH
°
û-------é------------------------------À
° 3BH ° Opcode DFH
°
û-------é------------------------------À
° 3CH ° Emulation mit Override Anw. °
û-------é------------------------------À
° 3DH ° FWAIT
°
û-------é------------------------------À
° 3EH ° shortcut calls
°
Û-------Ù------------------------------ì
Der Interrupt 3C bildet die Schnittstelle für Floating Point Aufrufe, die ein Segment
Override benutzen. Es wird die Codefolge CD 3C .... generiert. Dabei lassen sich die 4
Segmentregister in der Codefolge angeben.
Der INT 3E wird für Aufrufe innerhalb der Librarys benutzt.Die genaue Aufrufschnittstelle
ist aber nicht dokumentiert.
3.19 Overlay Manager (INT 3FH)
Dieser Interrupt wird vom Microsoft LINK.EXE zur Verwaltung von Overlays benutzt.
Borlands Turbo Linker belegt diesen Interrupt ebenfalls. Weiterhin nutzt der MicrosoftDynamik-Link-Library-Manager den Interrupt. Die genaue Aufrufschnittstelle ist
allerdings nicht bekannt.
3.20 Disktreiber (INT 40)
Falls im System eine Festplatte vorhanden ist, wird der BIOS-INT 13-Vektor zur
Diskettensteuerung auf den INT 40 umgeschaltet. Dies erfolgt beim Systemstart durch das
BIOS des Festplattentreibers. Alle Aufrufe zur Diskettensteuerung werden aber vom
Anwenderprozeß über den INT 13 abgewickelt. Dieser Treiber unterscheidet dann
zwischen Platte/Diskette und löst gegebenenfalls einen INT 40 aus, um die
Diskettenfunktionen zu aktivieren. Weitere Informationen finden sich bei der INT 13Beschreibung der BIOS-Funktionen.
3.21 Parametertabelle Festplatte (INT 41, INT 46)
Hier handelt es sich eigentlich nicht um einen Interruptvektor, vielmehr wird analog dem
INT 1EH (Diskette Parameters) von der BIOS-Funktion ein Adreßvektor der DiskParameter-Tabelle eingetragen (INT 41 = Drive 0, INT 46 = Drive 1). Die Tabelle besitzt
folgende Struktur:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
164
Ö--------Ú-------Ú------------------------------------Ì
° Offset ° Bytes ° Feld
°
û--------é-------é------------------------------------À
°
00
°
2
° maximale Zylinderzahl
°
û--------é-------é------------------------------------À
°
02
°
1
° maximale Kopfzahl
°
û--------é-------é------------------------------------À
°
03
°
2
° --°
û--------é-------é------------------------------------À
°
05
°
2
° Startzylinder zum Schreiben
°
û--------é-------é------------------------------------À
°
07
°
1
° maximale Datenlänge für ECC
°
û--------é-------é------------------------------------À
°
08
°
1
° Kontroll Byte:
°
°
°
° Bit 7 disable access retry
°
°
°
° Bit 6 disable ECC retry
°
°
°
° Bit 5 set defect map = zylinder+1 °
°
°
° Bit 4 = 0
°
°
°
° Bit 3 = 1 -> mehr als 8 Köpfe
°
°
°
° Bit 0-2 = Drive Option (XT)
°
û--------é-------é------------------------------------À
°
09
°
1
° Timeout (XT, sonst 0)
°
û--------é-------é------------------------------------À
°
0A
°
1
° Format Timeout (XT, sonst 0)
°
û--------é-------é------------------------------------À
°
0B
°
1
° Drive Check Timeout (XT, sonst 0) °
û--------é-------é------------------------------------À
°
0C
°
2
° Landezone für Köpfe
°
û--------é-------é------------------------------------À
°
0E
°
1
° Sektoren pro Spur
°
û--------é-------é------------------------------------À
°
0F
°
1
° 0
°
Û--------Ù-------Ù------------------------------------ì
Tabelle 3.19: Aufbau der Disk-Parameter-Tabelle; bei Platten
Sollen die Werte verändert werden, ist eine zweite Tabelle anzulegen. Die Anfangsadresse
dieser Tabelle kann dann mit der INT 21-Funktion 25H (Set Interrupt Vector) umgesetzt
werden.
3.22 EGA-Videostatus (INT 42)
Dieser Vektor wird durch das BIOS einiger EGA-Karten belegt. Der Vektor zeigt auf eine
64 Byte große Tabelle mit den Funktions- und Videostatusinformationen. Der Inhalt dieser
Tabelle läßt sich aber auch über die INT 10-Funktion 1BH lesen. Eine Beschreibung der
Tabelle findet sich in Kapitel 13 (EGA-BIOS-Erweiterung).
3.23 EGA-Grafikzeichensatz (INT 43)
Unter diesem Vektor legt das BIOS einiger EGA-Karten einen 32-Bit-Vektor auf die
Tabelle mit den ersten 128 Zeichen des grafischen Zeichensatzes ab. Dieser Satz wird in
den Modi 04H, 05H und 06H des EGA-Adapters benutzt. Bei anderen Grafikmodi enthält
die Tabelle alle 256 Zeichen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
165
3.24 EGA-Interrupt (INT 44)
Dieser Vektor wird durch den Charactergenerator der EGA-Karten belegt. Die Bedeutung
des Vektors ist allerdings nicht eindeutig klar.
Die Novell NetWare belegt diesen Interrupt ebenfalls für das Hochsprachen API.
3.25 Timer-Alarm (INT 4A, INT 50)
Das BIOS der 80286 Prozessoren erlaubt meist die Funktion der Real-Time-Clock für
Alarmfunktionen zu nutzen. Der INT 50 wird vom Timer mit ca. 1024 Hz angesprochen
(externer Interrupteingang). Mittels der Funktion AH = 06 des Interrupts 1AH läßt sich der
INT 50 so einstellen, daß zu einer bestimmten Uhrzeit ein Alarm ausgelöst wird. Der
Anwenderprozeß muß vorher eine eigene Alarmbehandlungsroutine unter dem Vektor des
INT 4A installieren, welche diesen Alarm dann auswertet. Weitere Informationen finden
sich bei der Beschreibung des INT 1A. Diese Funktion ist jedoch nicht bei allen BIOSVersionen implementiert.
3.26 VDS Virtual DMA Specification (INT 4BH)
Diese Spezifikation eröffnet einen Weg um im Protected Mode mit virtueller
Speicherverwaltung einen DMA-Transfer durchzuführen. Innerhalb der Spezifikation wird
der INT 4B mit folgenden Funktionsaufrufen belegt.
VDS Get Version (AX=8102H)
Mit diesem Aufruf läßt sich die aktuelle Version ermitteln. Es gelten folgende
Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 4B
°
°
°
° AX: 8102H
°
° DX: 0000H
°
û---------------------------------À
°
RETURN
°
° CF = 1 Error
°
° AL = Fehlercode
°
° CF = 0 ok
°
° AH = Hauptversion
°
° AL = Unterversion
°
° BX = Produkt Nummer
°
° CX = Revisons Nummer
°
° DX = Flags
°
° SI:DI Puffer Größe
°
Û---------------------------------ì
Beim Aufruf ist das Registerpaar DX mit dem Wert 0000H zu belegen. Das Carry-Flag
spezifiziert, ob der Aufruf erfolgreich war. Bei gesetztem Flag enthält AL einen Fehlercode
mit folgender Codierung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
166
° Fehlerursache
----------------------------------------------------01H ° region not in contigous memory
02H ° region crossed a physical alignment boundary
03H ° unable to lock pages
04H ° no buffer available
05H ° region too large for buffer
06H ° buffer currently in use
07H ° invalid memory region
08H ° region was not locked
09H ° number of physical pages greater as table length
0AH ° invalid buffer ID
0BH ° copy out of buffer range
0CH ° invalid DMA channel number
0DH ° disable count overflow
0EH ° disable count underflow
0FH ° function not supported
10H ° reserved flag bits set in DX
AL
Ist das Carry-Flag nach dem Aufruf gelöscht, enthalten die Register AX, BX und CX
Informationen über die Versionsnummer und den Revisionsstand. In DX werden
verschiedene Flags zurückgegeben. Diese besitzen folgende Kodierung:
DX Flagcodierung
Bit 0:
1:
2:
3:
4-15:
PC/XT Bus (1 Mbyte Adressraum)
physical buffer/remap region in 1. Mbyte
automatic remap enabled
all memory physically contigous
reserviert
Das Registerpaar SI:DI enthält die maximale Größe des DMA-Puffers.
Bei verschiedenen Subfunktionen werden Descriptor-Tabellen zur Beschreibung der DMAParameter verwendet. Diese Tabellen besitzen folgenden Aufbau:
Format der DMA descriptor struktur (DDS)
Offset Bytes Bedeutung
00H
4
Größe der Region
04H
4
Offset
08H
2
Segment / Selektor
0AH
2
Puffer ID
0CH
4
physikalische Adresse
Einige Aufrufe nutzen eine erweiterte DMA-Descriptor-Struktur (EDDS).
Format der Extended DMA descriptor struktur (EDDS)
Offset Bytes
00H
4
04H
4
08H
2
0AH
2
0CH
2
0EH
2
10H
4
14H
4
18H
4
1CH
4
......
Bedeutung
Größe der Region
Offset
Segment / Selektor
reserviert
verfügbare Nummer
benutzte Nummer
Region 0 physikalische Adresse
Region 0 Größe in Byte
Region 1 physikalische Adresse
Region 1 Größe in Byte
Falls in der Extended-DMA-Descriptor-Struktur Einträge in der Page Table vorliegen, gilt
folgende Struktur:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
167
Format der Extended DMA descriptor struktur (EDDS) mit page table entries.
Offset Bytes
00H
4
04H
4
08H
2
0AH
2
0CH
2
0EH
2
10H
4
14H
4
......
Bedeutung
Größe der Region
Offset
Segment / Selektor
reserviert
verfügbare Nummer
benutzte Nummer
Page Table Entry 0 (386 page table)
Page Table Entry 1
Die Bits 1-12 eines Page Table Entries sollten zu 0 gesetzt werden. Bit 0 ist zu setzen, falls
die Seite vorhanden und im Status locked ist.
VDS Lock DMA Region (AX=8103H)
Mit diesem Aufruf läßt sich eine Region im Speicher für einen DMA-Transfer fixieren.
Ö---------------------------------Ì
°
CALL: INT 4B
°
°
°
° AX: 8103H
°
° DX: Flags
°
° ES:SI DMA Descriptor
°
û---------------------------------À
°
RETURN
°
° CF = 1 Error
°
° AL = Fehlercode
°
° CF = 0 ok
°
Û---------------------------------ì
Beim Aufruf wird das Register DX als Flag verwendet, welches die Aktion steuert. Für die
einzelnen Bits gilt folgende Belegung:
Codierung des Flagregisters DX beim Aufruf
Bit 0: reserviert (0)
1: Daten in Puffer kopieren
(wird ignoriert falls Bit 2 = 1)
2: Puffer nicht allocieren, falls Region
nicht zusammenhängend ist, oder die
pyhsikalischen Grenzen (Bit 4,5) überschreitet
3: kein Versuch eines automatischen Remaps
4: Region darf 64 Kbyte nicht überschreiten
5: Region darf 128 Kbyte nicht überschreiten
6-15: reserviert (0)
In ES:SI wird die Adresse auf die DMA-Descriptor-Struktur (DDS)
übergeben. Der Aufbau dieser Struktur ist beim Aufruf AX=8102H
beschrieben. Bei einem Fehler ist das Carry-Flag nach dem Aufruf
gesetzt. Der Fehlercode in AL entspricht der Kodierung gemäß
AX=8102H. Das region size field in der DDS ist mit der maximalen
zusammenhängenden Speichergröße gefüllt. Bei gelöschtem CarryFlag ist der Bereich gesperrt. Dann kann die physiklische Seite nicht
ausgelagert werden. In der DDS sind das »physikalische AdressFeldVDS Unlock DMA Region (AX=8104H)
Mit diesem Aufruf läßt sich eine Region im Speicher nach einen DMA-Transfer freigeben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
168
Ö---------------------------------Ì
°
CALL: INT 4B
°
°
°
° AX: 8104H
°
° DX: Flags
°
° ES:DI DMA Descriptor
°
û---------------------------------À
°
RETURN
°
° CF = 1 Error
°
° AL = Fehlercode
°
° CF = 0 ok
°
Û---------------------------------ì
Beim Aufruf wird das Register DX als Flag verwendet, welches die Aktion steuert. Für die
einzelnen Bits gilt folgende Belegung:
Codierung des Flagregisters DX beim Aufruf
Bit 0: reserviert (0)
1: Daten aus Puffer kopieren
2-15: reserviert (0)
In ES:SI wird die Adresse auf die DMA-Descriptor-Struktur (DDS) übergeben. Der
Aufbau dieser Struktur ist beim Aufruf AX=8102H beschrieben. Die Felder region size,
physical address und buffer id sind zu setzen. Bei einem Fehler ist das Carry-Flag nach
dem Aufruf gesetzt. Der Fehlercode in AL entspricht der Kodierung gemäß AX=8102H.
Das region size field in der DDS ist mit der Größe des maximal zusammenhängenden
Speicherblocks gefüllt. Bei gelöschtem Carry-Flag ist der Bereich freigegeben. In der DDS
ist das physical adress field und das buffer id field belegt. (ein Wert von 0 im buffer id field
signalisiert, daß kein Puffer allociert war).
VDS Scatter/Gather Lock Region (AX=8105H)
Dieser Aufruf erlaubt es, Teile des Speichers zu sperren. Dies nützlich, falls Teile des
virtuellen Speichers ausgelagert wurden.
Ö---------------------------------Ì
°
CALL: INT 4B
°
°
°
° AX: 8105H
°
° DX: Flags
°
° ES:DI DMA Descriptor
°
û---------------------------------À
°
RETURN
°
° CF = 1 Error
°
° AL = Fehlercode
°
° CF = 0 ok
°
Û---------------------------------ì
Beim Aufruf wird das Register DX als Flag verwendet, welches die Aktion steuert. Für die
einzelnen Bits gilt folgende Belegung:
Codierung des Flagregisters DX beim Aufruf
Bit 0-5: reserviert (0)
6: EDDS mit page table entries zurückgeben
7: nur vorhandene Pages sperren (lock),
nicht vorhandene Seiten mit 0000 belegen.
8-15: reserviert (0)
In ES:SI wird die Adresse auf die erweiterte DMA-Descriptor-Struktur (EDDS) übergeben.
Dabei sind die Felder region size, linear segment, linear offset und number available zu
belegen. Der Aufbau dieser Struktur ist beim Aufruf AX=8102H beschrieben. Bei einem
Fehler ist das Carry-Flag nach dem Aufruf gesetzt. Der Fehlercode in AL entspricht der
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
169
Kodierung gemäß AX=8102H. Das region size field in der EDDS ist mit der Größe des
maximal zusammenhängenden Speicherblocks gefüllt. Bei gelöschtem Carry-Flag wurde
der gewünschte Bereich gesperrt. In der EDDS ist die Zahl der belegten Seiten im Feld
number used gespeichert. Ist Bit 6 gesetzt, enthalten die untersten 12 Bit des Registers BX
den Offset auf die erste Seite (first page).
VDS Scatter/Gather Unlock Region (AX=8106H)
Dieser Aufruf erlaubt es, gesperrte Teile des Speichers wieder freizugeben.
Ö---------------------------------Ì
°
CALL: INT 4B
°
°
°
° AX: 8106H
°
° DX: Flags
°
° ES:DI DMA Descriptor
°
û---------------------------------À
°
RETURN
°
° CF = 1 Error
°
° AL = Fehlercode
°
° CF = 0 ok
°
Û---------------------------------ì
Beim Aufruf wird das Register DX als Flag verwendet, welches die Aktion steuert. Für die
einzelnen Bits gilt folgende Belegung:
Codierung des Flagregisters DX beim Aufruf
Bit 0-5: reserviert (0)
6: EDDS enthält page table entries
7: EDDS kann nicht vorhandene Seiten
enthalten.
8-15: reserviert (0)
In ES:SI wird die Adresse auf die erweiterte DMA-Descriptor-Struktur (EDDS) übergeben.
Diese Struktur wurde beim Aufruf AX=8105H initialisiert. Der Aufbau dieser Struktur ist
beim Aufruf AX=8102H beschrieben. Bei einem Fehler ist das Carry-Flag nach dem
Aufruf gesetzt. Der Fehlercode in AL entspricht der Kodierung gemäß AX=8102H.
VDS Request DMA Buffer (AX=8107H)
Dieser Aufruf erlaubt es, einen DMA-Puffer anzulegen.
Ö---------------------------------Ì
°
CALL: INT 4B
°
°
°
° AX: 8107H
°
° DX: Flags
°
° ES:DI DMA Descriptor
°
û---------------------------------À
°
RETURN
°
° CF = 1 Error
°
° AL = Fehlercode
°
° CF = 0 ok
°
Û---------------------------------ì
Beim Aufruf wird das Register DX als Flag verwendet, welches die Aktion steuert. Für die
einzelnen Bits gilt folgende Belegung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
170
Codierung des Flagregisters DX beim Aufruf
Bit 0:
1:
2-15:
reserviert (0)
Daten in Puffer kopieren
reserviert (0)
In ES:SI wird die Adresse auf die DMA-Descriptor-Struktur (DDS) übergeben. Das Feld
region size ist dabei zu besetzen. Wurde Bit 1 in DX gesetzt, sind weiterhin die Felder
region offset und region segment zu initialisieren. Der Aufbau der DDS-Struktur ist beim
Aufruf AX=8102H beschrieben. Bei einem Fehler ist das Carry-Flag nach dem Aufruf
gesetzt. Der Fehlercode in AL entspricht der Kodierung gemäß AX=8102H. Bei
erfolgreichem Aufruf ist das Carry-Flag gelöscht und in der DDS sind die Felder physical
address und buffer id gesetzt, sowie das Feld region size mit der Bufferlänge belegt.
VDS Release DMA Buffer (AX=8108H)
Dieser Aufruf erlaubt es, einen DMA-Puffer wieder freizugeben.
Ö---------------------------------Ì
°
CALL: INT 4B
°
°
°
° AX: 8108H
°
° DX: Flags
°
° ES:DI DMA Descriptor
°
û---------------------------------À
°
RETURN
°
° CF = 1 Error
°
° AL = Fehlercode
°
° CF = 0 ok
°
Û---------------------------------ì
Beim Aufruf wird das Register DX als Flag verwendet, welches die Aktion steuert. Für die
einzelnen Bits gilt folgende Belegung:
Codierung des Flagregisters DX beim Aufruf
Bit 0:
1:
2-15:
reserviert (0)
Daten aus Puffer kopieren
reserviert (0)
In ES:SI wird die Adresse auf die DMA-Descriptor-Struktur (DDS) übergeben. Das Feld
buffer id ist dabei zu besetzen. Wurde Bit 1 in DX gesetzt, sind weiterhin die Felder region
size, region offset und region segment zu initialisieren. Der Aufbau der DDS-Struktur ist
beim Aufruf AX=8102H beschrieben. Bei einem Fehler ist das Carry-Flag nach dem
Aufruf gesetzt. Der Fehlercode in AL entspricht der Kodierung gemäß AX=8102H. Bei
erfolgreichem Aufruf ist das Carry-Flag gelöscht.
VDA Copy into DMA Buffer (AX=8109H)
Dieser Aufruf erlaubt es, Daten in einen DMA-Puffer zu speichern.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
171
Ö---------------------------------Ì
°
CALL: INT 4B
°
°
°
° AX: 8109H
°
° DX: 0000
°
° ES:DI DMA Descriptor
°
° BX:CX Offset
°
û---------------------------------À
°
RETURN
°
° CF = 1 Error
°
° AL = Fehlercode
°
° CF = 0 ok
°
Û---------------------------------ì
Beim Aufruf ist das Register DX = 0000 zu setzen. Die Kombination BX:CX enthält den
Offset in den DMA-Puffer.
In ES:SI wird die Adresse auf die DMA-Descriptor-Struktur (DDS) übergeben. Die Felder
buffer ID, region offset, region segment und region size sind zu initialisieren. Der Aufbau
ist beim Aufruf AX=8102H beschrieben. Bei einem Fehler ist das Carry-Flag nach dem
Aufruf gesetzt. Der Fehlercode in AL entspricht der Kodierung gemäß AX=8102.
VDA Copy out of DMA Buffer (AX=810AH)
Dieser Aufruf erlaubt es, Daten aus einen DMA-Puffer zu transferieren.
Ö---------------------------------Ì
°
CALL: INT 4B
°
°
°
° AX: 8109H
°
° DX: 0000
°
° ES:DI DMA Descriptor
°
° BX:CX Offset
°
û---------------------------------À
°
RETURN
°
° CF = 1 Error
°
° AL = Fehlercode
°
° CF = 0 ok
°
Û---------------------------------ì
Beim Aufruf ist das Register DX = 0000 zu setzen. Die Kombination BX:CX enthält den
Offset in den DMA-Puffer.
In ES:SI wird die Adresse auf die DMA-Descriptor-Struktur (DDS) übergeben. Die Felder
buffer ID, region offset, region segment und region size sind zu initialisieren. Der Aufbau
ist beim Aufruf AX=8102H beschrieben. Bei einem Fehler ist das Carry-Flag nach dem
Aufruf gesetzt. Der Fehlercode in AL entspricht der Kodierung gemäß AX=8102.
VDA Disable DMA Translation (AX=810BH)
Dieser Aufruf schaltet die DMA Übertragung aus. In BX ist die Nummer des DMA-Kanals
zu übergeben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
172
Ö---------------------------------Ì
°
CALL: INT 4B
°
°
°
° AX: 810BH
°
° DX: 0000
°
° BX: DMA Kanal
°
û---------------------------------À
°
RETURN
°
° CF = 1 Error
°
° AL = Fehlercode
°
° CF = 0 ok
°
Û---------------------------------ì
Bei einem Fehler ist das Carry-Flag nach dem Aufruf gesetzt. Der Fehlercode in AL
entspricht der Kodierung gemäß AX=8102.
VDA Enable Translation (AX=810CH)
Dieser Aufruf schaltet die DMA Übertragung ein. In BX ist die Nummer des DMA-Kanals
zu übergeben.
Ö---------------------------------Ì
°
CALL: INT 4B
°
°
°
° AX: 810CH
°
° DX: 0000H
°
° BX: DMA Kanal
°
û---------------------------------À
°
RETURN
°
° CF = 1 Error
°
° AL = Fehlercode
°
° CF = 0 ok
°
Û---------------------------------ì
Bei einem Fehler ist das Carry-Flag nach dem Aufruf gesetzt. Der Fehlercode in AL
entspricht der Kodierung gemäß AX=8102. Bei gelöschtem Carry-Flag war der Aufruf
erfolgreich. Falls der Zustand disable count = 0 wird das Zero-Flag bei der Rückkehr
gesetzt.
3.27 Common Access Method SCSI Interface (INT 4FH)
Dieser Interrupt wird durch die Spezifikation für das SCSI-Interface belegt. Die
Spezifikation liegt nach meinen Informationen jedoch erst im Entwurf vor, so daß an dieser
Stelle auf eine Beschreibung verzichtet wird.
3.28 GSS Computer Graphic Interface (INT 59H)
Dieser Interrupt wird durch das Computer Graphic Interface belegt. Über den Interrupt
werden die Aufrufe aus verschiedenen Hochsprachen (Language Bindings) zum Kontroller
abgewickelt. Der IBM-Graphic-Development-Kit benutzt diesen Interrupt ebenfalls.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
173
Ö---------------------------------Ì
°
CALL: INT 59
°
°
°
° DS:DX Puffer mit Array Pointer °
û---------------------------------À
°
RETURN
°
° CF = 1 Error
°
° AX = Fehlercode
°
° CF = 0 ok
°
° AX = Returncode
°
Û---------------------------------ì
Vor dem Aufruf wird in DS:DX die Adresse auf einen Puffer mit den Zeigern auf das
Ausgabearray geladen. Das Carry-Flag zeigt nach dem Aufruf den Fehlerstatus an. Weitere
Informationen sind den entsprechenden Herstellerunterlagen zu entnehmen.
3.29 AT&T Starlan Extended NetBIOS (INT 5BH)
Dieser Interrupt wird durch die erweiterte NetBIOS-Schnittstelle des Starlan Netzwerkes
belegt. Da dieses Netzwerk im deutschsprachingen Raum kaum eingesetzt wird, verzichte
ich an dieser Stelle auf eine Beschreibung.
3.30 NETBIOS Interface (INT 5CH)
Dieser Interrupt wird vom NETBIOS für Netzwerkzugriffe benutzt. Es gilt folgende
Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 5C
°
°
°
° ES:BX Adresse NCB
°
û---------------------------------À
°
RETURN
°
° AL = Status
°
Û---------------------------------ì
Im Registerpaar ES:BX wird die Adresse des Netzwerk-Control-Blocks übergeben. Die
Beschreibung der Funktionen ist im Abschnitt über die Netzwerkfunktionen enthalten.
3.31 PC/TCP Packet Driver (INT 60H)
Dieser Interrupt wird von einigen Netzwerken (z.B. TCP) belegt.
3.32 EMS-Treiber (INT 67H)
Der LIMS-EMS-Treiber belegt diesen Interrupt zur Kommunikation mit dem EMSSpeicher. Die Aufrufschnittstelle ist im Kapitel über die Speichererweiterungen enthalten.
Für 80386-Rechner existieren weiterhin Programme (Virtual Control Programm Interface)
zum Zugriff auf die erweiterten Eigenschaften des Prozessors. Diese benutzen ebenfalls
einige Unterfunktionen des INT 67H. Genauere Informationen finden sich im Kapitel über
die Speichermanager.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
174
3.33 DECnet DOS CTERM Schnittstelle (INT 69H)
Unter DECnet DOS benutzt der Terminal Emulator den Interrupt zur Kommunikation.
3.34DECnet DOS LAT Schnittstelle (INT 6AH)
Unter DECnet DOS benutzt der Local Area Transporttreiber (LAT) den Interrupt zur
Kommunikation.
3.35 Novell serial I/O (INT 6BH)
Dieser Interrupt wird von Novell zur Kommunikation über serielle Leitungen belegt.
3.36 DOS 3.2 Realtime Clock Update (INT 6CH)
Unter DOS 3.2 wird hier ein Treiber zur Kommunikation der Real Time Clock hinterlegt.
3.37 VGA-Interrupt (INT 6DH)
Dieser Interrupt wird von einigen VGA-Karten von IBM, Paradise, Video7 und NCR für
interne Zwecke benutzt.
3.38 HP ES-12 Extended BIOS (INT 6FH)
Die Firma HP benutzt den INT 6FH für die Kommunikation mit dem Extended BIOS der
ES-12-Rechner. Es sind folgende Unterfunktionen implementiert:
Read CMOS-Memory (AH = 22H)
Mit dieser Unterfunktion läßt sich ein Byte aus dem CMOS-RAM lesen. Es gilt folgende
Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 6F
°
°
°
° AH: 22H (Read CMOS RAM)
°
° BP: 12H
°
° BL: Adresse CMOS Byte
°
û---------------------------------À
°
RETURN
°
° AH = Status
°
° AL = gelesenes Byte
°
Û---------------------------------ì
Im Register AL wird das gelesene Byte aus dem CMOS-RAM zurückgegeben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
175
Write CMOS-Memory (AH = 24H)
Mit dieser Unterfunktion läßt sich ein Byte in das CMOS-RAM schreiben. Es gilt folgende
Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 6F
°
°
°
° AH: 24H (Write CMOS RAM)
°
° AL = neuer Wert
°
° BP: 12H
°
° BL: Adresse CMOS Byte
°
û---------------------------------À
°
RETURN
°
° AH = Status
°
Û---------------------------------ì
Im Register AL wird das neue Byte für das CMOS-RAM übergeben.
Weitere Interrupts werden durch Netzwerktreiber und andere Software belegt. Novell
Netware belegt zum Beispiel den INT 6F und den INT 7A. Der INT 7A bildet die
Hauptschnittstelle zum IPX-Treiber. Weiterhin belegt der BASIC-Interpreter der IBM-PC's
einige Vektoren im Bereich zwischen INT 83 und INT FF.
4
Die MS-DOS-Funktionen (INT 21)
Der MS-DOS-Interrupt 21 besitzt aus Sicht des Anwendungsprogrammierers die wohl
wichtigsten Funktionen. Über diesen Interrupt wickelt DOS fast alle Systemdienste ab.
Beginnend mit der Version DOS 2.0 werden immer mehr Funktionen geboten, wobei
allerdings einige für interne Zwecke reserviert sind und deshalb nicht dokumentiert
wurden. Sofern die Parameterübergabe und die Funktion bekannt ist, wird sie nachfolgend
mit beschrieben.
Die Funktionen dienen zur Programmverwaltung, Datenein-/ausgabe, Speicherverwaltung,
etc. Historisch gesehen kann man zwischen den aus der CP/M-Welt übernommenen
Diensten und den mehr XENIX orientierten Aufrufen unterscheiden. Dies resultiert aus der
Entwicklung von DOS, welches in der Version 1.x sehr nahe mit CP/M verwandt ist. In
den späteren Versionen wurde dann der Schwerpunkt auf die Erweiterungen Richtung
XENIX und Netzwerkverwaltung gelegt. Die alten Aufrufe blieben aus
Kompatibilitätsgründen aber erhalten. Nachfolgende Tabelle enthält einen kurzen
Überblick über die Funktionsgruppen des INT 21.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
176
Code
° Funktionsgruppe
-----------é-------------------------------------------------00H
° Programm Terminate
01 - 0CH ° Traditionelle Zeichen-Ein-/Ausgabe
0D - 24H ° CP/M orientierte Dateiverwaltung
25 - 26H ° Traditionelle nicht device-orientierte Funktionen
27 - 29H ° CP/M orientierte Dateiverwaltung
2A - 2EH ° Traditionelle nicht device-orientierte Funktionen
2F - 38H ° Erweiterte Funktionen
39 - 3BH ° Directory-Funktionen
3C - 46H ° Erweiterte Dateiverwaltungsfunktionen
47H
° Directory-Funktionen
48 - 4BH ° Speicherverwaltungsfunktionen
4C - 4FH ° Erweiterte Funktionen
54 - 57H ° Erweiterte Funktionen
57 - 6CH ° Erweiterte Funktionen
Tabelle 4.1: Funktionsgruppen des INT 21
Im Text wird auf diese Funktionen hingewiesen, da für Programmneuentwicklungen nur
noch die XENIX-orientierten Aufrufe verwendet werden sollten. Die nachfolgende Tabelle
zeigt eine Gegenüberstellung der neuen und der alten Funktionen des INT 21.
-------------------------------------------------Alter Aufruf
Neue Funktion
Code Funktion
Code Funktion
-------------------------------------------------00H Terminate Program
4CH End Process
0FH Open File
3DH Open Handle
10H Close File
3EH Close Handle
11H Search for First Entry
4EH Find First File
12H Search for Next Entry
4FH Find Next File
13H Delete File
41H Delete Directory
14H Sequential Read
3FH Read Handle
15H Sequential Write
40H Write Handle
16H Create File
3CH Create Handle
17H Rename File
56H Change Directory Entry
21H Random Read
3FH Read Handle
22H Random Write
40H Write Handle
23H Get File Size
42H Move File Pointer
24H Set Relative Record
42H Move File Pointer
26H Create New PSP
4BH Load and Execute Program
27H Random Block Read
3FH Read Handle
28H Random Block Write
40H Write Handle
Tabelle 4.2: Alte und neue DOS-Funktionsaufrufe
Manche dieser Funktionen besitzen ihrerseits Unterfunktionen, die in der Regel über den
Code im AL-Register ausgewählt werden. Die Funktionen werden grundsätzlich über den
INT 21 verwaltet. Es bestehen aber aus Sicht des Anwendungsprogramms mehrere
Möglichkeiten, diese Funktionen anzusprechen.
a) Intrasegment CALL 0005H
Aus Kompatibilitätsgründen zu früheren DOS-Versionen wurde die Möglichkeit dieses
Aufrufes über den DOS-Funktions-Dispatcher beibehalten. Die Nummer der gewünschten
Funktion ist im Register CL zu übergeben. Weiterhin sind die restlichen Register gemäß
den Anforderungen der jeweiligen Unterfunktion zu setzen. Anschließend muß ein
Intrasegment CALL auf die Adresse 05H ausgeführt werden. Dort findet sich das aktuelle
Program Segment Prefix, welches ab Offset 05H den Code für einen Long CALL zum
DOS-Dispatcher enthält. Diese Aufrufart besitzt jedoch verschiedene Nachteile:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
177
·
Es sind nur Aufrufe innerhalb des 64-Kbyte-Segmentbereiches möglich. Wird das
Programm verschoben, findet sich das PSP nicht mehr im gleichen Segment. Ein
CALL auf diese Adresse führt dann zu einem Systemabsturz.
·
Das Register AX wird beim Aufruf zerstört, während bei anderen Aufrufarten die
Zustände der Register vor dem Aufruf gesichert werden. Weiterhin wird in diesen
Fällen im Register AX ein Fehlercode übergeben.
·
Der Aufruf ist nur bei den INT 21-Funktionen 00H bis 24H erlaubt.
·
Es sind im Prinzip 2 CALL-Aufrufe notwendig, bis der Dispatcher aktiviert wird
(code- und zeitaufwendig).
·
Die Aufwärtskompatibilität zu neuen DOS-Versionen ist nicht gewährleistet.
Aus diesen Gründen sollte diese Aufrufkonvention nicht mehr benutzt werden.
b) Intersegment CALL PSP:0050H
Die zweite Möglichkeit besteht darin, den Funktionscode im Register AH zu plazieren. Die
anderen Register sind gemäß den Anforderungen der jeweiligen Funktion zu initialisieren.
Dann ist ein Intersegment Long CALL zur Offsetadresse 0050H des aktiven ProgramSegment-Prefix (PSP) durchzuführen. In diesem PSP steht ab Offsetadresse 50H der
Programmcode für einen INT 21-Aufruf, der den DOS-Funktions-Dispatcher dann
aktiviert. Die Benutzung dieser Aufrufart ist ebenfalls mit einigen Nachteilen behaftet:
·
Wird der Wert des Codesegmentregisters (CS) geändert, ist die Adresse des PSP nicht
unbedingt im Programm bekannt.
·
Der Long CALL benötigt insgesamt 5 Byte, was bei vielen Aufrufen die
Programmlänge vergrößert.
·
Der indirekte Aufruf über einen Long CALL mit nachgeschaltetem INT 21 ist
zeitintensiv.
Da im Grunde der INT 21 zum Aufruf des Dispatchers benutzt wird, sollte diese Aufrufart
nicht weiter benutzt werden.
c) Aufruf über den INT 21
Dies ist die zu bevorzugende Aufrufart für die Aktivierung des DOS-FunktionsDispatchers. Hierzu ist der Code der Funktion im Register AH zu definieren. Die restlichen
Register sind gemäß den Anforderungen der jeweiligen Unterfunktion zu initialisieren.
Dann ist ein INT 21-Befehl auszuführen. Dies ist die kürzeste und einfachste Form des
Aufrufes, die folgende Vorteile bietet:
·
Der INT 21 kann aus jedem Codebereich, ohne Kenntnis der Lage des PSP, aktiviert
werden.
·
Der INT 21 benötigt lediglich zwei Codebytes und veranlaßt, daß neben der
Rückkehradresse auch der Zustand der Flagregister auf dem Stack gesichert wird.
Der Aufruf des DOS-Dispatchers über den Interrupt 21 wird von Microsoft für zukünftige
Softwareentwicklungen empfohlen.
Nachfolgende Tabelle enthält die Aufstellung aller INT 21-Funktionsaufrufe, die
anschließend detailliert besprochen werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Ö------Ú-----------Ú----------------------------------------Ì
° Code °
DOS
° Funktion
°
û------é-----------é----------------------------------------À
° 00
° 2.0 - 6.x ° Terminate Program
°
° 01
° 2.0 - 6.x ° Read Keyboard and Echo
°
° 02
° 2.0 - 6.x ° Display Character
°
° 03
° 2.0 - 6.x ° Auxiliary Input
°
° 04
° 2.0 - 6.x ° Auxiliary Output
°
° 05
° 2.0 - 6.x ° Print Character
°
° 06
° 2.0 - 6.x ° Direct Console I/O
°
° 07
° 2.0 - 6.x ° Direct Console Input
°
° 08
° 2.0 - 6.x ° Read Keyboard
°
° 09
° 2.0 - 6.x ° Display String
°
° 0A
° 2.0 - 6.x ° Buffered Keyboard Input
°
° 0B
° 2.0 - 6.x ° Check Keyboard Status
°
° 0C
° 2.0 - 6.x ° Flush Buffer, Read Keyboard
°
° 0D
° 2.0 - 6.x ° Reset Disk
°
° 0E
° 2.0 - 6.x ° Select Disk
°
° 0F
° 2.0 - 6.x ° Open File
°
° 10
° 2.0 - 6.x ° Close File
°
° 11
° 2.0 - 6.x ° Search for First Entry
°
° 12
° 2.0 - 6.x ° Search for Next Entry
°
° 13
° 2.0 - 6.x ° Delete File
°
° 14
° 2.0 - 6.x ° Sequential Read
°
° 15
° 2.0 - 6.x ° Sequential Write
°
° 16
° 2.0 - 6.x ° Create File
°
° 17
° 2.0 - 6.x ° Rename File
°
° 19
° 2.0 - 6.x ° Get Current Disk
°
° 1A
° 2.0 - 6.x ° Set Disk Transfer Address
°
° 1B
° 2.0 - 6.x ° Get Default Drive Data
°
° 1C
° 2.0 - 6.x ° Get Drive Data
°
° 1F
° 2.0 - 6.x ° Get Default Disk Parameter Block
°
° 21
° 2.0 - 6.x ° Random Read
°
° 22
° 2.0 - 6.x ° Random Write
°
° 23
° 2.0 - 6.x ° Get File Size
°
° 24
° 2.0 - 6.x ° Set Relativ Record
°
° 25
° 2.0 - 6.x ° Set Interrupt Vector
°
° 26
° 2.0 - 6.x ° Create New PSP
°
° 27
° 2.0 - 6.x ° Random Block Read
°
° 28
° 2.0 - 6.x ° Random Block Write
°
° 29
° 2.0 - 6.x ° Parse File Name
°
° 2A
° 2.0 - 6.x ° Get Date
°
° 2B
° 2.0 - 6.x ° Set Date
°
° 2C
° 2.0 - 6.x ° Get Time
°
° 2D
° 2.0 - 6.x ° Set Time
°
° 2E
° 2.0 - 6.x ° Set / Get Verify Flag
°
° 2F
° 2.0 - 6.x ° Get Disk Transfer Address
°
° 30
° 2.0 - 6.x ° Get MS-DOS Version Number
°
° 31
° 2.0 - 6.x ° Keep Process
°
° 32
° 2.0 - 6.x ° Get Disk Parameter Block
°
° 33
° 2.0 - 6.x ° Control-C Check
°
° 34
° 2.0 - 6.x ° Get DOS Critical Interval Flag
°
° 35
° 2.0 - 6.x ° Get Interrupt Vector
°
° 36
° 2.0 - 6.x ° Get Free Disk Space
°
° 37
° 2.0 - 6.x ° Set Switch Character
°
° 38
° 2.0 - 6.x ° Get Country Data
°
° 38
° 3.0 - 6.x ° Set Country Data
°
° 39
° 2.0 - 6.x ° Create Directory
°
° 3A
° 2.0 - 6.x ° Remove Directory
°
° 3B
° 2.0 - 6.x ° Change Current Directory
°
° 3C
° 2.0 - 6.x ° Create Handle
°
° 3D
° 2.0 - 6.x ° Open Handle
°
Û------Ù-----------Ù----------------------------------------ì
Tabelle 4.3: INT 21-Funktionsaufrufe
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
178
DOS Programmierhandbuch
Ö------Ú-----------Ú----------------------------------------Ì
° Code °
DOS
° Funktion
°
û------é-----------é----------------------------------------À
° 3E
° 2.0 - 6.x ° Close Handle
°
° 3F
° 2.0 - 6.x ° Read from a File or Device
°
° 40
° 2.0 - 6.x ° Write to a File or Device
°
° 41
° 2.0 - 6.x ° Delete (Unlink) Directory Entry
°
° 42
° 2.0 - 6.x ° Move File Pointer
°
° 43
° 2.0 - 6.x ° Get/Set File Attributes
°
° 4400 ° 2.0 - 6.x ° IOCTL Data
°
° 4402 ° 2.0 - 6.x ° IOCTL Character
°
° 4404 ° 2.0 - 6.x ° IOCTL Block
°
° 4406 ° 2.0 - 6.x ° IOCTL Status
°
° 4408 ° 3.0 - 6.x ° IOCTL is Changeable
°
° 4409 ° 3.1 - 6.x ° IOCTL is Redirected Block
°
° 440A ° 3.1 - 6.x ° IOCTL is Redirected Handle
°
° 440B ° 3.0 - 6.x ° IOCTL Retry
°
° 440C ° 3.3 - 6.x ° Generic IOCTL Handle Request
°
° 440D ° 3.2 - 6.x ° Generic IOCTL Request
°
° 440E ° 3.2 - 6.x ° I/O Control for Device
°
° 440F ° 3.2 - 6.x ° Set Logical Drive
°
° 4410 ° 5.0 - 6.x ° Query Support Handle
°
° 4411 ° 5.0 - 6.x ° Query Support Block
°
° 45
° 2.0 - 6.x ° Duplicate File Handle
°
° 46
° 2.0 - 6.x ° Force Duplicate File Handle
°
° 47
° 2.0 - 6.x ° Get Current Directory
°
° 48
° 2.0 - 6.x ° Allocate Memory
°
° 49
° 2.0 - 6.x ° Free Allocated Memory
°
° 4A
° 2.0 - 6.x ° Set Block
°
° 4B00 ° 2.0 - 6.x ° Load and Execute
°
° 4B01 ° 2.0 - 6.x ° Load Program
°
° 4B03 ° 2.0 - 6.x ° Load Overlay
°
° 4B05 ° 5.0 - 6.x ° Enter EXEC State
°
° 4C
° 2.0 - 6.x ° Terminate a Process
°
° 4D
° 2.0 - 6.x ° Get Returncode
°
° 4E
° 2.0 - 6.x ° Find First Matching File
°
° 4F
° 2.0 - 6.x ° Find Next File
°
° 50
° 2.0 - 6.x ° Set Active PSP
°
° 51
° 2.0 - 6.x ° Get Active PSP
°
° 52
° 2.0 - 6.x ° Get DOS Data Address
°
° 53
° 2.0 - 6.x ° Set Disk Parameter Block
°
° 54
° 2.0 - 6.x ° Get Verify State
°
° 56
° 2.0 - 6.x ° Rename File
°
° 57
° 2.0 - 6.x ° Get / Set File Date and Time
°
° 58
° 3.0 - 6.x ° Get / Set Allocation Strategy
°
° 59
° 3.0 - 6.x ° Get Extended Error
°
° 5A
° 3.0 - 6.x ° Create Temporary File
°
° 5B
° 3.0 - 6.x ° Create New File
°
° 5C
° 3.0 - 6.x ° Lock / Unlock File Access
°
° 5D00 ° 3.1
° Server Call
°
° 5D01 ° 3.1
° Update all Files
°
° 5D02 ° 3.1
° Close File by Name
°
° 5D03 ° 3.1
° Close Maschines File
°
° 5D04 ° 3.1
° Close Process File
°
° 5D05 ° 3.1
° Get Open File List Entry
°
° 5D06 ° 3.0
° Get DOS Variable Area
°
° 5D07 ° 3.1
° Redirect Printer
°
° 5D08 ° 3.1
° Redirect Printer
°
° 5D09 ° 3.1
° Redirect Printer
°
° 5D0A ° 3.1
° Set Extended Error
°
° 5D0B ° 3.1
° Get DOS Variable Areas
°
° 5E00 ° 3.1 - 6.x ° Get Machine Name
°
° 5E02 ° 3.1 - 6.x ° Set Printer Setup
°
° 5E03 ° 3.1 - 6.x ° Get Printer Setup
°
° 5E04 ° 3.1 - 6.x ° Set Printer Tabs
°
° 5E05 ° 3.1 - 6.x ° Get Printer Tabs
°
° 5F00 ° 3.1 - 6.x ° Set Redirection Mode
°
° 5F01 ° 3.1 - 6.x ° Get Redirection Mode
°
° 5F02 ° 3.1 - 6.x ° Get Redirection List Entry
°
° 5F03 ° 3.1 - 6.x ° Redirect Device
°
° 5F04 ° 3.1 - 6.x ° Cancel Redirection
°
° 5F05 ° 4.0 - 6.x ° Get Extended Redirect List
°
° 5F07 ° 4.0 - 6.x ° Activate Local Drive
°
° 5F08 ° 4.0 - 6.x ° Delete Local Drive
°
° 60
° 3.0 - 6.x ° Expand Filename
°
° 62
° 3.0 - 6.x ° Get Program Segment Prefix Address
°
° 63
° 2.25, 6.x ° Get Lead Byte Table, DCBS Support
°
° 65
° 3.3 - 6.x ° Get Extended Country Information
°
° 66
° 3.3 - 6.x ° Get Global Code Page
°
° 66
° 3.3 - 6.x ° Set Global Code Page
°
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
179
DOS Programmierhandbuch
180
° 67
° 3.3 - 6.x ° Set Handle Count
°
° 68
° 3.3 - 6.x ° Commit File
°
° 69
° 4.0 - 6.x ° Get/Set Disk Serial Number
°
° 6A
° 4.0 - 6.x ° Update Network Units
°
° 6C
° 5.0 - 6.x ° Extended Open/Create
°
Û------Ù-----------Ù----------------------------------------ì
Tabelle 4.3: INT 21-Funktionsaufrufe (Ende)
In der Spalte »DOS4.1 Terminate Program (Funktion 00H,
DOS 2.0 - 6.x)
Diese Funktion ermöglicht es, ein Programm zu beenden und gibt die Kontrolle an den
Parent Process zurück. Vor dem Aufruf sind folgende Parameter zu setzen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 00H
°
° CS: Segmentadresse des PSP
°
°
°
û-------------------------------À
°
RETURN
°
° -°
°
°
Û-------------------------------ì
Im Codesegment-Register muß die Adresse des Program-Segment-Prefix stehen. Beim
Aufruf ist zu beachten, daß das Programm nicht länger als 64 Kbyte sein sollte. Dies ist
unbedingt bei EXE-Dateien zu relevant. Wird die Funktion aufgerufen, ohne daß CS die
Segmentadresse des PSP enthält, stürzt das System ab. Weiterhin müssen alle Dateien
vorher geschlossen werden, da sonst die Änderungen nicht im Inhaltsverzeichnis der
Diskette/Platte eingetragen werden und so verlorengehen.
Lediglich der Inhalt der DOS-Ausgabedateipuffer wird auf das Speichermedium
ausgelagert und offene Handles werden noch geschlossen.
Die Funktion restauriert folgende Adressen aus dem Program-Segment-Prefix-Bereich:
Offset
Bedeutung
0AH
0EH
12H
Program Terminate Address
Control-C Handler Address
Critical Error Handler Address
auf den Wert des Parent Process. Wurde zum Beispiel die Adresse des Critical-ErrorHandlers vom Child Process verändert, wird anschließend die alte Adresse restauriert.
Es gelten im Prinzip die gleichen Bedingungen, wie sie bereits beim INT 20 diskutiert
wurden. Letztendlich ruft der INT 20 die Funktion 00 des INT 21 auf. Bei neuen
Programmen sollte die INT 21-Funktion 4CH (End Process) benutzt werden.
4.2 Read Keyboard and Echo (Funktion 01H, DOS 2.0 - 6.x)
Diese Funktion erlaubt die Zeicheneingabe per Tastatur bei gleichzeitiger Ausgabe auf der
Ausgabeeinheit. Es gelten folgende Registerbelegungen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
181
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 01H
°
û-------------------------------À
°
RETURN
°
° AL: eingelesenes Zeichen
°
Û-------------------------------ì
Die Funktion liest das Zeichen immer von der Standardeingabeeinheit aus. Dies ist in der
Regel die Tastatur. Die Eingabe kann aber z.B. auch über das DOS-Kommando:
C>PROGR < AUX:
von der Auxillary Einheit erfolgen. Eine weitere Möglichkeit besteht in der Zuordnung von
COM1: zur Standardeingabeeinheit CON:. Die Umleitung ist dagegen nicht zulässig, da
anschließend die Endekennung (Ctrl+Z) nicht mehr erkannt wird. Die Funktion wartet, bis
ein Zeichen vorliegt, bevor sie es auf der Standardausgabeeinheit ausgibt. Dann wird zum
aufrufenden Programm zurückgekehrt. Das eingelesene Zeichen befindet sich im ALRegister.
Nun tritt bei der Tastatur aber das Problem auf, daß bestimmte Tastenkombinationen nicht
mehr mit 8 Bit darstellbar sind (z.B. Funktionstasten). Um diese Tastencodes an ein
Programm zu übergeben, wurde ein erweiterter (extended) ASCII-Code definiert. Dieser
besteht aus zwei Byte. Das erste Byte eines extended ASCII-Codes ist immer 00H. Im
folgenden Byte steht dann der Code der jeweiligen Taste. Die Zuordnung der Tasten ist den
jeweiligen Rechnerunterlagen zu entnehmen.
Um einen erweiterten ASCII-Code von der Tastatur zu lesen, sind zwei Aufrufe der
Funktion 01H notwendig. Falls ein erweiterter Code vorliegt, wird beim ersten Aufruf der
Wert 00H zurückgegeben. Es wird kein Fehlerstatus durch die Funktion zurückgegeben.
Auch wenn keine Zeichen empfangen werden, bricht die Funktion nicht ab, sondern wartet
auf ein eintreffendes Zeichen. Das rufende Pogramm kann somit nicht abgearbeitet werden.
Beim Aufruf wird die Control-C-Routine aktiviert. Falls diese Tasten gedrückt wurden, löst
DOS einen INT 23 aus.
4.3 Display Character (Funktion 02H, DOS 2.0 - 6.x)
Diese Funktion erlaubt es, ein Zeichen im DL-Register an die Standard-Ausgabeeinheit zu
senden. Es gelten folgende Registerbelegungen.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 02H
°
° DL: auszugebendes Zeichen
°
û-------------------------------À
°
RETURN
°
° -°
Û-------------------------------ì
Es wird keine Status- oder Fehlermeldung zurückgegeben. Die Funktion ermittelt lediglich
beim Aufruf den Control-C-Status und löst gegebenenfalls einen INT 23 aus.
Bei Ausgaben in Dateien funktioniert <Ctrl>+<C> nur, falls Break = ON gesetzt wird. Bei
einer Ausgabe in eine Datei kann eine weitere Eigenart zu Problemen führen. Die Funktion
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
182
führt keine Fehlerprüfung aus, so daß ein volles oder schreibgeschütztes Medium nicht
erkannt wird. Ab DOS 2.0 sollte deshalb die Funktion 40H des INT 21 benutzt werden.
4.4 Auxiliary Input (Funktion 03H, DOS 2.0 - 6.x)
Diese Funktion erwartet ein Zeichen von der Standard-Auxiliary-Einheit. Als AuxiliaryEinheiten lassen sich in DOS die AUX:, COM1: und COM2: angeben. Es ist zu beachten,
daß DOS für die Auxiliary-I/O-Devices weder Puffer anlegt, noch einen
interruptgesteuerten Ablauf zuläßt. Falls ein Zeichen empfangen wird, gibt die Routine es
im AL-Register zurück. Vor der Benutzung müssen die Übertragungsparameter der
Schnittstelle durch das DOS-Programm MODE gesetzt werden.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 03H
°
û-------------------------------À
°
RETURN
°
° AL: empfangenes Zeichen
°
Û-------------------------------ì
Es wird kein Fehlerstatus von dieser Funktion zurückgegeben.
Die Funktion fragt beim Aufruf ebenfalls den Control-C-Status des Systems ab und löst
gegebenenfalls einen INT 23 aus.
Ab DOS 2.0 sollte die Funktion 3FH benutzt werden.
4.5 Auxiliary Output (Funktion 04H, DOS 2.0 - 6.x)
Diese Funktion gibt ein Zeichen auf der Standard-Auxiliary-Einheit aus. Es wird kein
Fehler- oder Statuscode zurückgegeben.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 04H
°
° DL: auszugebendes Zeichen
°
û-------------------------------À
°
RETURN
°
° -°
Û-------------------------------ì
Als Auxiliary-Einheiten lassen sich in DOS die AUX:, COM1: und COM2: angeben. Es ist
zu beachten, daß DOS für die Auxiliary-I/O-Devices weder Puffer anlegt, noch einen
interruptgesteuerten Ablauf zuläßt. Ab DOS 2.0 sollte die Funktion 40H benutzt werden.
Die Funktion fragt beim Aufruf ebenfalls den Control-C-Status der Tastatur ab und löst
gegebenenfalls einen INT 23 aus. Die Übertragungsparameter der Schnittstelle müssen vor
der Benutzung durch den Mode-Befehl gesetzt werden. Die Funktion wartet bei belegter
Ausgabe solange, bis das BIOS den AUX:-Treiber als frei meldet.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
183
4.6 Print Character; (Funktion 05H, DOS 2.0 - 6.x)
Diese Funktion überträgt Zeichen an den Standard-Druckertreiber. Vor dem Aufruf sind
folgende Parameter zu setzen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 05H
°
° DL: Zeichen
°
û-------------------------------À
°
RETURN
°
° ---°
Û-------------------------------ì
Das auszugebende Zeichen wird im DL-Register übergeben. Die Funktion prüft den
Control-C-Status und löst gegebenenfalls einen INT 23 aus.
Es wird kein Status oder Fehlercode zurückgegeben, d.h. bei abgeschaltetem Drucker
erfährt das Programm nichts von dem Fehler.
DOS wartet vielmehr bis der Drucker bereit ist, oder die Time-Out-Zeit abgelaufen ist. Ab
DOS 2.0 ist deshalb die Funktion 40H zu bevorzugen.
4.7 Direct Console I/O (Funktion 06H, DOS 2.0 - 6.x)
Diese Funktion erlaubt die Zeichen-Ein-/Ausgabe über die Standard-Konsole. Der Inhalt
des Registers DL bestimmt, ob ein Zeichen gelesen oder ausgegeben werden soll. Vor dem
Aufruf sind folgende Parameter zu setzen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 06H
°
° DL: Zeichen oder Steuerflag °
û-------------------------------À
°
RETURN
°
° AL: gelesenes Zeichen
°
° Z : Flag, ob Zeichen gültig °
Û-------------------------------ì
Enthält das Register DL vor Aufruf der Funktion den Wert 0FFH, dann wird versucht ein
Zeichen einzulesen. Das Zero-Flag zeigt den Status an. Ist es gesetzt, dann konnte kein
Zeichen gelesen werden. Falls Z = 0 ist, dann wird das Zeichen im AL-Register
zurückgegeben.
Werden über die Funktion 06H Zeichen gelesen, dann ist zu prüfen, ob erweiterte ASCIICodes vorliegen. In diesem Fall ist der erste gelesene Wert = 00H. Dann kann der Code des
Zeichens erst beim zweiten Aufruf gelesen werden.
Falls der Inhalt des DL-Registers <> 0FFH ist, wird der Wert als Zeichen interpretiert und
an die Standard-Ausgabeeinheit weitergegeben.
Die Funktion 06H prüft nicht den Control-C-Status des Systems.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
184
4.8 Direct Console Input (Funktion 07H, DOS 2.0 - 6.x)
Diese Funktion erlaubt es, ein Zeichen von der Standard-Eingabeeinheit zu lesen. Die
Funktion wartet so lange, bis ein Zeichen eintrifft. Bei I/O-Umleitung werden die Zeichen
aus einer Datei gelesen. Die Funktion erkennt kein EOF (Ctrl+C), wodurch sich das
Programm aufhängt.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 07H
°
û-------------------------------À
°
RETURN
°
° AL: gelesenes Zeichen
°
Û-------------------------------ì
Das Zeichen findet sich anschließend im AL-Register. Es wird kein Fehler- oder
Statuscode zurückgegeben. Die Funktion überprüft auch nicht den Control-C-Status. Das
eingegebene Zeichen wird auch nicht als Echo an der Standard-Ausgabeeinheit angezeigt.
4.9 Read Keyboard (Funktion 08H, DOS 2.0 - 6.x)
Diese Funktion erwartet ein Zeichen von der Standard-Eingabe. Es wird so lange gewartet,
bis das Zeichen eintrifft. Bei Verwendung der DOS-I/O-Umleitung liest die Funktion
Zeichen aus der angegebenen Datei und bleibt hängen, da EOF nicht erkannt werden kann.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 08H
°
û-------------------------------À
°
RETURN
°
° AL: empfangenes Zeichen
°
Û-------------------------------ì
Bei erfolgreichem Aufruf wird das Zeichen im AL-Register zurückgegeben. Es wird kein
Fehlerstatus von der Funktion ausgegeben. Die Funktion fragt beim Aufruf lediglich den
Control-C-Status der Tastatur ab und löst gegebenenfalls einen INT 23 aus.
Die Verarbeitung von erweiterten ASCII-Codes erfordert einen zweimaligen Aufruf der
Funktion. Beim ersten Aufruf wird in diesem Fall der Wert 00H zurückgegeben. Erst ein
weiterer Aufruf liefert den Code der jeweiligen Sondertaste. Ist das interim console flag
gesetzt (siehe AX=6301H), werden einzelne Bytes einer Double Byte Character Sequence
(DCBS) zurückgegeben (gilt nur für asiatische DOS-Versionen).
4.10 Display String (Funktion 09H, DOS 2.0 - 6.x)
Diese Funktion gibt einen String, der mit dem Zeichen $ endet, auf der StandardAusgabeeinheit aus. Vor dem Aufruf sind folgende Parameter zu setzen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
185
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
09H
°
° DS:DX Zeiger auf den String- °
°
anfang
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Das $-Zeichen wird nicht mit ausgegeben. Das Registerpaar DS:DX enthält einen Zeiger
auf die Anfangsadresse des Strings, wobei in DX der Offset steht. Die Stringlänge ist auf
das aktuelle Datensegment begrenzt (maximal 64 Kbyte). Die Funktion gibt weder Fehlernoch Statusmeldungen zurück. Es wird lediglich der Control-C-Status des Systems
abgefragt und gegebenenfalls ein INT 23 ausgelöst. Die Funktion verändert das Register
AL bei der Ausgabe. Bei I/O-Umleitung in Dateien ist zu beachten, daß die Funktion keine
Status- oder Fehlermeldungen zurückgibt. Ist zum Beispiel der Datenträger voll, hängt sich
das Programm auf. Die Ausgabe erfolgt über das BIOS, wobei die Zeichencodes 07, 08,
09, 0A und 0D interpretiert werden.
4.11 Buffered Keyboard Input (Funktion 0AH, DOS 2.0 - 6.x)
Diese Funktion liest einen String von der Standard-Eingabeeinheit und überträgt ihn in den
angegebenen Puffer im Hauptspeicher. Es gelten folgende Übergabeparameter.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
0AH
°
° DS:DX Zeiger auf den Puffer- °
°
anfang
°
û-------------------------------À
°
RETURN
°
° -°
Û-------------------------------ì
Das Registerpaar DS:BX enthält einen Zeiger auf den Pufferbereich, in den der String
übertragen werden soll.
Dieser Puffer muß folgenden Aufbau besitzen:
DS:DX
Ö-------------------------------Ì
------>° Pufferlänge in Bytes
°
û-------------------------------À
° Zeichenzähler
°
û-------------------------------À
° Puffer
°
°
.
°
°
.
°
Û-------------------------------ì
Bild 4.1: Der DOS- Tastaturzwischenpuffer
Die Länge des Puffers wird immer ohne die zwei ersten Byte für Pufferlänge und
Zeichenzahl angegeben. Im Byte für die Zeichenzahl findet sich ein Wert, der proportional
zur Zahl der im Puffer abgespeicherten Zeichen ist. Daran schließt sich ein Bereich von n
Byte an, der für die Aufnahme der Zeichen reserviert wurde. Dies ist die im ersten Byte
spezifizierte Pufferlänge. So lassen sich insgesamt bis zu 255 Zeichen ablegen. Die
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
186
angegebene Pufferlänge muß größer als Null sein, wobei ja die ersten beiden Byte (Len
und Count) nicht mitgerechnet werden.
Die Funktion liest Zeichen für Zeichen ein und überträgt diese in den Puffer. Dabei werden
die Informationen im Pufferkopf mit verwaltet. Tritt ein RETURN (0DH) auf, bricht die
Funktion ab. Vorher wird dieses RETURN-Zeichen aber noch abgespeichert. Dieses
RETURN wird allerdings nicht innerhalb des Zeichenzählers berücksichtigt. Falls der
Puffer überläuft, bevor ein RETURN erkannt wurde, ignoriert die Funktion die zuletzt
eingegebenen Zeichen und sendet jeweils ein BELL (07H) Signal an die Ausgabeinheit, bis
ein RETURN eingelesen wird. Bei einer Zeicheneingabe per Konsole lassen sich diese so
lange editieren, bis ein RETURN empfangen wurde. Falls die Tastenkombination ControlC betätigt wird, löst die Funktion einen INT 23 aus. Falls keine I/O-Umleitung
vorgenommen wurde, kann DOS den INT 28 aufrufen, solange kein Zeichen von der
Tastatur kommt. Beim Einlesen aus einer Datei (I/O-Umleitung) besteht keine Möglichkeit
zur Statusabfrage. Sind die Eingabezeilen länger als 254 Zeichen, gehen Zeichen verloren.
4.12 Check Keyboard Status (Funktion 0BH, DOS 2.0 - 6.x)
Diese Funktion überprüft den Status der Standard-Eingabeeinheit und gibt diesen im ALRegister zurück.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
0BH
°
û-------------------------------À
°
RETURN
°
° AL: Tastaturstatus
°
Û-------------------------------ì
Sind Zeichen im Tastaturpuffer vorhanden, wird dies mit dem Wert AL = FFH signalisiert,
andernfalls ist AL = 0. Falls die Eingabe nicht umgeleitet wurde, fragt die Funktion den
Zwischenpuffer im BIOS-Datenbereich ab. Beim Einlesen aus Dateien (I/O-Umleitung)
bedeutet AL=FFH, daß das Dateiende noch nicht erreicht ist.
In asiatischen DOS-Versionen werden Zeichen bei zeichenorientierten Geräten in 2 Byte,
auch als DBCS bezeichnet (Double Byte Character Sequence), abgelegt. Ist das interims
console flag gesetzt, liefert der Funktionsaufruf ein Byte. Gleichzeitig ist AL = FFH gesetzt
um anzuzeigen, daß noch ein zweites Byte zu lesen ist.
Steht in diesem die Control-C-Sequenz, wird ein INT 23 ausgelöst. Die Funktion 0BH
erlaubt somit die Abfrage, ob Zeichen im Puffer vorliegen, bevor die Funktion 0AH
aufgerufen wird.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
187
4.13 Flush Buffer, Read Keyboard (Funktion 0CH, DOS 2.0 6.x)
Ö-------------------------------Ì
°
CALL:
INT 21
°
°
°
° AH: 0CH
°
° AL: Code der Subfunktion
°
û-------------------------------À
°
RETURN
°
° AL: 0 -> Puffer ist leer
°
Û-------------------------------ì
Der Standard-Eingabepuffer wird beim Aufruf gelöscht (Flush). Weitere Aktionen hängen
dann vom Wert des Registers AL ab.
Falls die Eingabe nicht umgeleitet wurde, löscht der Funktionscode AL=00H den
Tastaturpuffer im BIOS-Datenbereich.
Andere Werte in AL erlauben es, die MS-DOS-Funktionen:
01
06
07
08
0A
Read Keyboard and Echo
Direct Console I/O
Direct Console Input
Read Keyboard
Buffered Keyboard Input
nach dem Löschen des Puffers zu aktivieren. In diesem Fall gelten die Registerbelegungen
der jeweiligen Subfunktion. Andere als die oben spezifizierten Werte im Register AL
werden von der Funktion abgewiesen, so daß nur der Puffer gelöscht wird. In diesem Fall
zeigt das Register AL nach der Rückkehr den Wert 0. Ansonsten gilt für AL die Belegung
wie bei den Subfunktionen 01, 06, 07 und 08, d.h. AL enthält das gelesene Zeichen. Bei
Löschaktionen (AL=00H) und bei AL = 0AH bleibt AL unverändert erhalten.
Abgesehen von fehlerhaften Subfunktionscodes im Register AL gibt die Routine keine
weiteren Status- oder Fehlermeldungen zurück. Lediglich bei Anwahl der Unterfunktionen
wird der Control-C-Status des Systems überprüft und gegebenfalls ein INT 23 ausgelöst.
Diese Funktion läßt sich sehr gut bei Sicherheitsabfragen (z.B. alle Dateien löschen [J/N]
?) verwenden, da vor dem Einlesen der Benutzereingabe erst der Tastaturpuffer geleert
wird. Der Benutzer ist also gezwungen, explizit auf die Abfrage zu reagieren und kann
nicht im voraus Zeichen eingeben.
Die Löschfunktion bezieht sich nur auf den Tastaturpuffer. Bei Verwendung der I/OUmleitung wird die Eingabedatei nicht beeinflußt, d.h. hier empfiehlt es sich die
gewünschte Eingabefunktion (01, 06, 07, etc.) direkt aufzurufen. Zu beachten ist weiterhin,
daß durch das Löschen eventuell im Puffer befindliche Ctrl+C-Zeichen entfernt werden,
d.h. das Programm läßt sich unter Umständen nicht abbrechen.
4.14 Reset Disk (Funktion 0DH, DOS 2.0 - 6.x)
Der Aufruf setzt die interne DOS-Dateiverwaltung in einen definierten Zustand zurück.
Hierzu werden alle Blocktreiber mit dem Kommando »FLUSHe-Befehl zuständig (s. auch
INT 21, Funktion 3EH oder 5D01H, 68H, 6AH, INT 2F, Funktion AX=1120).
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
188
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 0DH
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Der Aufruf Reset Disk wird meist benutzt, um das System in einen bekannten Zustand zu
versetzen. Der Control-C-Handler sollte z.B. diese Funktion benutzen, um vor der
Rückkehr nach DOS das Dateisystem in einen definierten Zustand zu versetzen. Es wird
kein Status- oder Fehlercode zurückgegeben.
4.15 Select Disk (Funktion 0EH, DOS 2.0 - 6.x)
Diese Funktion selektiert ein Standard-Laufwerk.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
0EH
°
° DL:
Laufwerksnummer
°
û-------------------------------À
°
RETURN
°
° AL: Zahl der logischen Dives °
Û-------------------------------ì
Das Register DL spezifiziert das logische Laufwerk, welches selektiert werden soll. Es gilt
die Codierung A: = 0, B: = 1, etc. Die Funktion weicht damit in der Kodierung der
Laufwerke (0 = A:, 1 = B:, etc.) von den üblichen DOS-Konventionen (1 = A:, 2 = B:, etc.)
ab. Lediglich die Funktion 19H des INT 21 benutzt die gleiche Kodierung wie die Funktion
0EH.
Nach dem Aufruf bezieht DOS alle folgenden INT 21-I/O-Anforderungen ohne explizite
Laufwerksangabe auf das per Funktion 0EH selektierte Laufwerk. Wird in DL ein nicht
existierendes Laufwerk adressiert, ignoriert DOS den Funktionsaufruf und läßt die alte
Einstellung bestehen. Da die Funktion keinen Status zurückgibt erhält der rufende Prozess
über diesen Vorgang allerdings keine Rückmeldung.
Im AL-Register gibt die Funktion allerdings die Zahl der logischen Laufwerke innerhalb
des Systems zurück. Wird dieser Wert um 1 erniedrigt, entspricht der Wert dem Code des
letzten logischen Laufwerkes. Mit AL = 2 stehen dann die Diskettenlaufwerke A: und B:
zur Verfügung. Allerdings muß der Wert mit Vorsicht betrachtet werden, da im Prinzip nur
die Nummer des höchsten Laufwerkes angegeben wird. Falls z.B. der Wert 5
zurückgegeben wird, ist nicht sicher, daß die Laufwerke A B C D E auch wirklich
existieren. Es ist zusätzlich zu beachten, daß neben der Zahl der physikalisch vorhandenen
Einheiten auch die Angabe LASTDRIVE = xx, innerhalb der Datei CONFIG.SYS, den
Wert in AL beeinflußt. Die Funktion gibt den jeweils größeren Wert aus beiden
Einstellungen (Laufwerkszahl und LASTDRIVE) zurück. Systeme mit einem
Diskettenlaufwerk ordnen diesem die Einheitennummern 0 = A:, 1 = B: zu. Ab DOS 3.0
gibt die Funktion immer eine Minimalanzahl von 5 Laufwerken im Register AL zurück.
Bei Novell NetWare wird beim Aufruf in AL dagegen immer der Wert 32 (20H)
zurückgegeben, was der Zahl der maximal unterstützten Laufwerke entspricht. Dies wird
von vielen Zusatz-Tools nicht berücksichtigt, so daß beim Sysinfo oft falsche Zahlen
auftauchen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
189
4.16 Open File (Funktion 0FH, DOS 2.0 - 6.x)
Diese Funktion dient zur Eröffnung einer Datei. Vor dem Aufruf sind folgende Parameter
zu setzen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
0FH
°
° DS:DX Zeiger auf FCB
°
û-------------------------------À
°
RETURN
°
° AL: Statusflag
°
Û-------------------------------ì
Im Registerpaar DS:DX findet sich ein Zeiger auf einen ungeöffneten File-Control-Block
(FCB). Dieser FCB ist nichts anderes als eine Datenstruktur im Speicher, die von CP/M
übernommen wurde und in der vor dem Aufruf der Dateiname hinterlegt wurde.
Diese Struktur umfaßt in der Standard Version 37 Byte und wird in der erweiterten Version
auf 44 Byte verlängert. Die DOS-Funktionen speichern in diesem Bereich weitere
Informationen über die Datei ab. Der Aufbau dieses FCB wird in einem eigenen Kapitel
beschrieben. Beim Aufruf der Funktion wird das Inhaltsverzeichnis der Disk nach dem
Dateinamen durchsucht. Falls ein Eintrag vorliegt, gibt die Funktion im Register AL den
Wert 0 zurück. Anschließend werden folgende Daten in den FCB geschrieben:
Ist die Laufwerksnummer (Offset 0) auf den Wert 0 gesetzt, was per Konvention Default
Drive bedeutet, dann ersetzt die Funktion den Wert durch 1 = A:, 2 = B:, etc. Dies ist
notwendig, da ja bei einem späteren Dateizugriff die Einstellung des Default-Drive
geändert sein kann, womit die geöffnete Datei nicht mehr gefunden wird.
Der Current Block (Offset 0CH-0DH) wird auf den Wert 0 initialisiert, womit dieser Zeiger
auf den ersten Record innerhalb der Datei zeigt. Die Recordlänge (Offset 0EH-0FH) wird
auf den Standardwert von 128 Byte pro Satz gesetzt.
Dateigröße (Offset 10H), Datum (Offset 14H) und Zeit (Offset 16H) werden mit den
Werten aus dem Inhaltsverzeichnis der Diskette/Platte belegt.
Falls kein Directory-Eintrag gefunden wird, oder falls die Datei mit dem Attribut System
belegt ist, gibt die Funktion den Wert 0FFH im Register AL zurück. Bei erfolgreichem
Aufruf enthält AL den Wert 00H.
Vor einem ersten sequentiellen Zugriff auf die Datei ist der Wert des Current Record Field
(Offset 20H) auf den ersten zu lesenden Block zu setzen. Bei einem Random Zugriff ist das
Relativ Record Field (Offset 21H) auf den entsprechenden Wert zu setzen. Stimmt die
Recordlänge von 128 Byte nicht, kann sie durch einen Eintrag ab Offset 0EH angepaßt
werden. Alle Einstellungen sind nach dem Open File Call, aber vor dem ersten
Dateizugriff vorzunehmen. Die Funktion 0EH (Open File) gehört zu den älteren CP/M
orientierten Dateioperationen. Sie unterstützt keine netzwerkorientierten Dienste (SHARE)
und keine Aufrufe mit Pfadangaben. Um mit den XENIX-Aufrufen (per Handle)
kompatibel zu sein, darf der Zugriff nur im Kompatibilitäts-Modus erfolgen. In diesem
Mode darf die Datei zwar beliebig oft, aber nur von einem Prozeß, geöffnet werden. Falls
die Datei bereits in einem anderen Mode eröffnet wurde, resultiert der File-Open-Call im
Kompatibilitätsmode in einem INT 24 (Critical Error). Auf dem Bildschirm erscheint die
Meldung Drive not ready. Weiterhin wirkt sich bei Verwendung der FCB-Funktionen ein
DOS-Programmierfehler aus. Der FCB wird standardmäßig im Program-Segment-Prefix
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
190
(PSP) ab Offset 5CH angelegt. Das PSP ist eine 256 Byte lange Datenstruktur, die von
DOS vor jedem Programm im Speicher ab Offset 0000H angelegt wird. Da die FCBStruktur aber 37 Byte umfaßt, reicht das letzte Byte bis zur Adresse 80H. Hier beginnt aber
bereits ein Bereich (80H bis FFH), der durch DOS für zwei weitere Zwecke benutzt wird.
Einmal wird hier beim Start des Programmes die Kommandozeile des Aufrufes
gespeichert. Damit können beim Aufruf Parameter (z.B. DIR /W) an das Programm
übergeben werden. Weiterhin benutzt DOS den Bereich ab Offset 80H als Disk-TransferArea (DTA). Hierbei handelt es sich um einen 128-Byte-Puffer, in dem Daten für die
Disketten-/Platten-Ein-/Ausgabe zwischengespeichert werden. Damit kommt es bei
Verwendung von FCB's zu Überlappungen der einzelnen Puffer, die durch den
Anwenderprogrammierer abzufangen sind. Ein Ausweg ist die Verlagerung des FCB's in
einen anderen Speicherbereich, wobei dann die neue Adresse beim Funktionsaufruf in
DS:DX anzugeben ist. Weitere Hinweise über den Aufbau der FCB's und des PSP finden
sich im Kapitel über die DOS-Datenstrukturen. Einzige interessante Eigenschaft der
Funktion 0FH ist die Tatsache, daß im Filenamen Wildcardzeichen (*,?) auftreten dürfen.
DOS öffnet dann die erste Datei, auf die das Suchmuster paßt. Da dieser Effekt allerdings
nicht immer gewollt ist und angesichts der oben beschriebenen Probleme sollte für
Neuentwicklungen die Funktion 3DH (Open Handle) verwendet werden, da diese
wesentlich flexibler ist.
4.17 Close File (Funktion 10H, DOS 2.0 - 6.x)
Diese Funktion ist das Gegenstück zum Open File-Aufruf, da sie eine Datei schließt.
Hierzu ruft die Funktion die Blocktreiber mit dem Code für FLUSH auf. Hierdurch werden
eventuell noch im Puffer befindliche Daten auf das Medium ausgelagert. Als wichtigste
Aufgabe übernimmt die Funktion es, bei veränderter Dateilänge diese Information, sowie
das aktuelle Datum und die Uhrzeit in das Directory einzutragen. Es gelten folgende
Parameterübergaben:
Ö-------------------------------Ì
°
CALL:
INT 21
°
°
°
° AH:
10H
°
° DS:DX Zeiger auf FCB
°
û-------------------------------À
°
RETURN
°
° AL:
Status Flag
°
Û-------------------------------ì
Die Register DS:DX dienen wieder als Zeiger auf einen geöffneten FCB. Das
Inhaltsverzeichnis wird nach dem angegebenen Namen durchsucht. Wird ein Eintrag
gefunden, vergleicht die Funktion die Informationen innerhalb des FCB mit den Einträgen
des Directory.
Bei Abweichungen werden die Daten aus dem FCB auf die Platte in den Directory-Bereich
übertragen. Anschließend wird der Wert AL = 0 zurückgegeben. Falls kein Eintrag
gefunden wird, enthält das Register AL den Wert FFH. Dies kann z.B. vorkommen, falls
die Diskette seit dem Open Call gewechselt wurde, oder falls das aktuelle Unterverzeichnis
auf der Platte gewechselt wurde. Bei gewechselten Disketten muß davon ausgegangen
werden, daß DOS diesen Wechsel nicht sofort merkt. Der Close-Aufruf lagert dann erst
einmal die Pufferdaten auf das Medium aus. Dabei werden die in internen Tabellen
gespeicherten Positionsangaben benutzt, die natürlich bei der neuen Diskette nicht mehr
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
191
passen. Dies kann dazu führen, daß bereits auf der Diskette befindliche Daten zerstört
werden. Die der Datei zugeordneten Ausgabepuffer werden gelöscht und zur weiteren
Verwendung freigegeben. Der Aufruf dieser Funktion sollte immer dann erfolgen, wenn
eine Datei nicht länger benötigt wird. Es ist dann sichergestellt, daß alle Änderungen auf
dem Medium abgespeichert sind. Der Systemaufruf stammt aus der Menge der CP/Morientierten Funktionen und sollte bei Neuentwicklungen durch den Aufruf 3EH (Close
File Handle) ersetzt werden.
4.18 Search for First Entry (Funktion 11H, DOS 2.0 - 6.x)
Diese Funktion bezieht sich auf das aktuelle Inhaltsverzeichnis eines Speichermediums und
erlaubt es, einen bestimmten Dateinamen zu suchen. Vor dem Aufruf sind folgende
Parameter zu setzen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
11H
°
° DS:DX Zeiger auf einen FCB
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
Û-------------------------------ì
Der Zeiger DS:DX muß auf einen ungeöffneten File Control Block (FCB) zeigen. In DX
steht dabei die Offsetadresse dieses FCB. Der Dateiname innerhalb des FCB wird für den
Vergleich verwendet. In DOS 2.x sind nur Fragezeichen (?) als Sonderzeichen innerhalb
des Dateinamens erlaubt.
Ab DOS 3.0 dürfen alle globalen Zeichen, einschließlich des (*) als Wildcard, im
Dateinamen vorkommen. Wird kein Eintrag im Inhaltsverzeichnis gefunden, enthält das
AL-Register den Wert FFH als Status. Andernfalls wird 0 als Status zurückgegeben. Wenn
ein Eintrag gefunden wird, dann legt die Funktion eine Kopie des FCB in der DiskTransfer-Area (DTA) ab. Der Aufbau richtet sich danach, ob ein normaler oder ein
erweiterter FCB verwendet wird. Erweiterte FCBs müssen z.B. benutzt werden, um System
oder Hidden Files zu bearbeiten. Bei einem erweiterten FCB wird das erste Byte in der
Disk-Transfer-Area (DTA) auf den Wert FFH gesetzt, während die folgenden 5 Byte 0
bleiben. Das sechste Byte erhält die Kopie des Attributbytes aus der Directory. Der
restliche Bereich entspricht der Belegung eines normalen FCB, d.h., im nächsten Byte
findet sich der Code für das Laufwerk (1 = A:, 2 = B:, etc.). Die verbleibenden 32 Byte
enthalten den Directory-Eintrag.
Bei Verwendung von erweiterten FCBs kann durch das Attributbyte die Suche nach dem
gewünschten Dateitype gesteuert werden. Mit dem Wert = 0 sucht die Funktion nur nach
normalen Dateien, während die Namen von Unterverzeichnissen, sowie Dateien mit den
Attributen Hidden oder System, nicht erkannt werden. Werte von 02H (Hidden-File), 04H
(System-File) oder 10H (Directory-Eintrag) lassen sich ebenfalls angeben. In diesem Fall
werden alle Dateien, die die gesetzten Bedingungen erfüllen, z.B. normale und HiddenFiles, zurückgegeben. Das Bitfeld läßt sich so setzen, daß alle Dateitypen, mit Ausnahme
des Volume Labels gefunden werden. Lediglich bei der expliziten Suche nach diesem
Volume Label wird nur dieses zurückgegeben. Eine detaillierte Beschreibung des FCB
erfolgt in einem eigenen Kapitel.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
192
Falls die Funktion 12H benutzt werden soll, darf der mit dem Zeiger DS:DX bezeichnete
FCB zwischenzeitlich nicht verändert werden. Die Funktion 11H gehört noch zur Gruppe
der älteren CP/M-orientierten Dateioperationen und unterstützt keine Pfadangaben. Bei
Programmneuentwicklungen sollte die Funktion 4EH (Find First Matching File) benutzt
werden.
4.19 Search for Next Entry (Funktion 12H, DOS 2.0 - 6.x)
Diese Funktion bezieht sich auf das aktuelle Inhaltsverzeichnis eines Speichermediums und
wird nach der Funktion 11H benutzt, um weitere Einträge mit dem Dateinamen zu finden.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
12H
°
° DS:DX Zeiger auf einen FCB
°
°
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
°
°
Û-------------------------------ì
Es gelten die gleichen Bedingungen wie bei der Funktion 11H. Im Registerpaar DS:DX
findet sich der Zeiger auf den ungeöffneten FCB, der beim Aufruf der Funktion 11H
definiert wurde. Wichtig ist, daß der bei der Funktion 11H benutzte FCB zwischenzeitlich
nicht durch andere Diskoperationen verändert wurde (z.B. durch Öffnen der Datei).
Wird ein weiterer Eintrag gemäß den in der Funktion 11H spezifizierten Bedingungen
gefunden, enthält das Statusbyte im Register AL den Wert 00H. Ist die Suche erfolglos,
wird der Wert 0FFH zurückgegeben. Die DTA enthält bei erfolgreichem Aufruf eine FCBStruktur mit dem Namen der gefundenen Datei.
Der Aufruf 12H gehört zu den CP/M-orientierten Funktionen, und wurde mittlerweile
durch den Aufruf 4FH (Find Next Matching File) ersetzt.
4.20 Delete File (Funktion 13H, DOS 2.0 - 6.x)
Mit der Funktion 13H läßt sich eine Datei im aktuellen Verzeichnis löschen. Vor dem
Aufruf sind folgende Parameter zu setzen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
13H
°
° DS:DX Zeiger auf einen FCB
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
Û-------------------------------ì
Der Zeiger DS:DX ist einem FCB zugeordnet, der Laufwerk und Dateiname enthält.
Wichtig ist, daß die zu löschende Datei geschlossen ist, d.h., der durch den Zeiger DS:DX
adressierte FCB darf nicht geöffnet sein. Das Directory wird nach dem (innerhalb) des
FCBs angegebenen Namen durchsucht.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
193
Falls dieser existiert, wird er aus dem Inhaltsverzeichnis gelöscht und im Register AL wird
0 zurückgegeben. Andernfalls enthält AL den Wert FFH. Als Dateiname sind auch
Wildcards (*,?) möglich. Wird keine Datei mit dem Muster gefunden, oder sind alle Files
schreibgeschützt, dann enthält AL bei der Rückkehr den Wert FFH. Es ist zu beachten, daß
nicht die Datei, sondern nur der Eintrag im Inhaltsverzeichnis gelöscht wird. Im Grunde
wird sogar nur das erste Byte des Dateinamens auf den Wert E5H gesetzt (siehe Kapitel
über das DOS-Inhaltsverzeichnis). Falls die Datei nicht geschlossen war, tritt bei der
anschließenden Close-Operation ein Fehler auf, da ja die Datei nicht mehr existiert.
Weiterhin darf bei der Datei nicht das Read Only-Attribut gesetzt sein. Ist dieses Attribut
definiert, kann die Datei nicht gelöscht werden. Bei Einsatz innerhalb einer
Netzwerkumgebung (ab DOS 3.1) benötigt die Funktion das Zugriffsrecht Create Access,
um eine Datei zu löschen.
Die Funktion besitzt allerdings noch einen recht unangenehmen Effekt. Wird ein
erweiterter FCB benutzt, kann der Filename und die Extension nach den Konventionen mit
Wildcards ????????.??? auffüllt werden. Sind zusätzlich noch alle Attribute freigegeben,
löscht ein Aufruf mit diesen Einstellungen (bis zur Version 6.0) alle Dateien im aktuellen
Directory. Hierzu gehören auch Dateien, deren Directory-Attribut gesetzt ist, die demnach
die Einträge für die Dateien im Unterverzeichnis enthalten. Dadurch geht das
Unterverzeichnis und die darin befindlichen Dateien verloren, ohne das diese explizit
gelöscht wurden. Hierdurch werden die durch diese Dateien belegten Cluster nicht mehr
freigegeben. Das erste Byte wird dabei nicht auf E5H, sondern auf 00H gesetzt. Damit
lassen sich die Dateien auch mit Hilfstools nicht mehr restaurieren. Weiterhin befinden sich
anschließend jede Menge verlorene Cluster auf der Platte, die nur mit CHKDSK wieder
freigegeben werden können.
Der Aufruf wurde mittlerweile durch die xenixorientierte Funktion 41H (Delete a File from
the spezified Device) ersetzt.
4.21 Sequential Read (Funktion 14H, DOS 2.0 - 6.x)
Diese Funktion liest einen Satz (Record) aus der spezifizierten Datei im aktuellen
Verzeichnis. Vor dem Aufruf sind folgende Parameter zu setzen:
Ö-------------------------------Ì
°
CALL:
INT 21
°
°
°
° AH:
14H
°
° DS:DX Zeiger auf einen FCB
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
Û-------------------------------ì
Das Registerpaar DS:DX enthält einen Zeiger auf den FCB. Die im FCB angegebene Datei
muß bereits eröffnet sein. Der zu lesende Satz wird durch die FCB-Einträge Current Block
Field (Offset 0CH) und Current Record (Offset 20H) spezifiziert. Der adressierte Satz wird
dann gelesen und in der Disk-Transfer-Area abgelegt.
Die Länge eines Satzes ist im Record Size Field des FCB spezifiziert. Im Register AL wird
der Status der Leseoperation zurückgegeben. Es gilt folgende Belegung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
194
Code ° Status
------é------------------------------------------------0 ° Funktion ohne Fehler ausgeführt
1 ° Versuch, über das Dateiende hinaus zu lesen,
° keine Daten gelesen (EOF)
2 ° Nicht genügend Platz in der DTA, der Lese° befehl wurde abgebrochen
3 ° Dateiende wurde erreicht, ein Teilsatz wurde
° gelesen, die restlichen Bytes in der DTA wurden
° mit 00 aufgefüllt
Es ist zu beachten, daß die Standard DTA von DOS im PSP ab Adresse 80H angelegt wird.
Damit stehen aber nur 128-Byte-Puffer zur Verfügung. Werden längere Datensätze im FCB
spezifiziert, läuft der Pufffer in den Codebereich des zugehörigen Programmes über, d.h.
das Programm wird zerstört. Hier muß eine neue DTA vom Programm angelegt werden,
dessen Adresse mittels der INT 21-Funktion 1AH an DOS übergeben wird.
Ein Einsatz innerhalb eines Netzwerkes (ab DOS 3.1) setzt voraus, daß die Funktion das
Zugriffsrecht Read Access auf der Datei besitzt. Bei neuen Programmen sind die Handle
orientierten Funktionen des INT 21 zu nutzen.
4.22 Sequential Write (Funktion 15H, DOS 2.0 - 6.x)
Diese Funktion schreibt einen Satz (Record) in die spezifizierte Datei, die sich im aktuellen
Verzeichnis befinden muß. Vor dem Aufruf sind folgende Parameter zu setzen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
15H
°
° DS:DX Zeiger auf einen FCB
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
Û-------------------------------ì
Die im FCB angegebene Datei muß bereits eröffnet sein. Der zu schreibende Satz wird
durch die FCB-Einträge Current Block Field (Offset 0CH) und Current Record (Offset
20H) spezifiziert. Der Satz wird dann aus der DTA gelesen und im adressierten
Dateibereich ab der aktuellen Schreibposition gespeichert.
Die Lage des Schreibzeigers (current block * current record) bestimmt, ob die Daten an das
Dateiende angehängt werden, oder ob die Bytes innerhalb der Datei überschrieben werden.
Die Länge eines Satzes ist im Record-Size-Field des FCB spezifiziert. Falls diese Länge
kleiner als die Sektorgröße des Speichermediums ist, legt die Funktion die Daten in einem
MS-DOS-Zwischenpuffer ab. Erst wenn dieser Puffer gefüllt ist, oder falls die Datei
geschlossen wird, oder falls das Disk-System zurückgesetzt wird (Funktion 0DH), dann
werden die Daten auf die Platte geschrieben. Nach diesem Schreibvorgang wird
anschließend das FCB-Feld Current Record auf den neuen Wert gesetzt. Das Register AL
enthält nach dem Aufruf den Status der Schreiboperation. Es gilt folgende Kodierung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
195
Code ° Status
------é----------------------------------------------0 ° Funktion ohne Fehler ausgeführt
1 ° Disk voll, Schreibversuch abgebrochen
2 ° Nicht genügend Platz in der DTA, der Schreib° befehl wurde abgebrochen
Beim Zugriff auf Dateien innerhalb eines Netzwerkes (ab DOS 3.1), benötigt der
aufrufende Prozeß das Write-Access-Privileg. Wegen der Größe der DTA ist die
Verwendung der Funktion etwas problematisch. Deshalb sollte bei Neuentwicklungen der
Aufruf 40H (Write to a File or Device) verwendet werden.
4.23 Create File (Funktion 16H, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich eine Datei im aktuellen Verzeichnis neu anlegen. Hierzu muß
im Register DS:DX ein Zeiger auf einen ungeöffneten FCB eingerichtet werden. Im
Filenamen (im FCB) sind keine Wildcardzeichen (*,?) erlaubt. Für den Aufruf gelten
folgende Übergabeparameter:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
16H
°
° DS:DX Zeiger auf einen FCB
°
°
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
°
°
Û-------------------------------ì
MS-DOS prüft nach dem Aufruf, ob bereits eine Datei mit dem angegebenen Namen
vorliegt. Falls kein Eintrag vorliegt, wird einer im Inhaltsverzeichnis angelegt. Existiert
bereits eine Datei mit dem angegebenen Namen, dann setzt die Funktion die Länge auf 0,
d.h., das bestehende File wird gelöscht und eine neue leere Datei wird angelegt.
Gleichzeitig wird die Datei geöffnet. Falls im Inhaltsverzeichnis kein freier Eintrag für die
Datei gefunden wird, bricht die Funktion mit einer Fehlermeldung im Register AL ab.
Hierfür existieren nur zwei Werte:
Code ° Bedeutung
--------é-------------------------------------00 ° Leereintrag gefunden, Datei angelegt
FF ° Directory voll, Datei nicht angelegt
Die Dateiattribute lassen sich über erweiterte FCBs setzen. Für die Eröffnung der Datei
gelten die gleichen Bedingungen wie bei der Funktion 0FH (Open File).
Falls auf eine Datei innerhalb eines Netzwerkes zugegriffen wird, benötigt die Funktion
das Zugriffsrecht Create Access, um die Dateilänge auf den Wert 0 zu begrenzen.
Bei Softwareneuentwicklungen ist vorzugsweise die Funktion 3CH (Create a File) zu
verwenden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
196
4.24 Rename File (Funktion 17H, DOS 2.0 - 6.x)
Mit diesem Aufruf läßt sich der Name einer existierenden Datei (im aktuellen Verzeichnis)
ändern. Das Registerpaar DS:DX muß auf einen modifizierten FCB zeigen. In diesem FCB
müssen Laufwerksnummer, erster Dateiname und zweiter Dateiname angegeben werden.
Der modifizierte FCB besitzt dabei folgenden Aufbau:
Bytes ° Bedeutung
--------é-------------------------------------01 ° altes Laufwerk (0 = default, 1 = A:, etc.)
08 ° alter Filename (Wildcards ? erlaubt)
03 ° alte Extension
01 ° neues Laufwerk = altes Laufwerk
08 ° neuer Filename (Wildcards ? erlaubt)
03 ° neue Extension
Die Laufwerksangabe zwischen altem und neuem Drive muß identisch sein. Umfaßt der
Filename oder eine Extension nicht die maximale Länge von 8/3 Zeichen, sind die
restlichen Byte mit dem Wert 00H aufzufüllen. In DOS 2.x sind nur ? als Wildcards
erlaubt, während ab DOS 3.x auch * als Wildcards akzeptiert werden. Für die Funktion
gelten folgende Aufrufkonventionen.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
17H
°
° DS:DX Zeiger auf einen FCB
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
Û-------------------------------ì
MS-DOS durchsucht das Inhaltsverzeichnis nach dem ersten Dateinamen. Wird dieser
gefunden, prüft DOS, ob eine Datei mit dem zweiten Dateinamen vorkommt. Ist dies nicht
der Fall, wird die Datei auf den zweiten Namen umbenannt. Bei Verwendung von
Wildcardzeichen im ersten Filenamen wird die Rename-Operation auf jede Datei
angewandt, auf die das Suchmuster zutrifft.
Im AL-Register wird dann der Wert 00 zurückgegeben. Wurden im zweiten Dateinamen
Wildcards (*) angegeben, bleiben die zugehörigen Zeichen im Dateinamen erhalten. Mit
dieser Funktion lassen sich nur normale DOS Dateien umbenennen, d.h. der Versuch, einen
Hidden-, System- oder Volumenamen umzubenennen, wird abgewiesen. Die Funktion 17H
ignoriert allerdings ein gesetztes Read-only-Attribut und benennt die Datei auf den neuen
Namen um. Die Fehlercodes im AL-Register besitzen folgende Bedeutung:
Code ° Bedeutung
------é-------------------------------------------------------0 ° Funktion ohne Fehler ausgeführt
FF ° Datei nicht gefunden, oder Dateiname existiert bereits
Wurden Wildcardzeichen verwendet, bedeutet AL=00H bei der Rückkehr, daß mindestens
eine Datei umbenannt wurde. Bei Fehlern (AL = FFH) können verschiedene Ursachen
vorliegen, die sich ab DOS 3.0 mit der INT 21-Funktion 59H abfragen lassen.
Um die Datei umzubenennen, wird ein modifizierter FCB benutzt. Die Laufwerksangabe
steht wie üblich ab Offset 0H. Der erste Dateiname findet sich bei Offset 01H, und der
zweite Name wird ab Ofset 11H gespeichert (s. oben).
Bei Zugriffen auf Dateien innerhalb eines Netzwerkes muß die Funktion das CreateAccess-Privileg besitzen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
197
Der Aufruf 17H wurde durch die Funktion 56H (Rename a File) abgelöst und sollte
deshalb bei Neuentwicklungen nicht mehr zum Einsatz gelangen.
Die nicht dokumentierte Funktion 18H ist intern für DOS reserviert, ist aber nicht belegt.
4.25 Get Current Drive (Funktion 19H, DOS 2.0 - 6.x)
Der Aufruf dieser Funktion gibt die Nummer des aktuell eingestellten Laufwerkes zurück.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
19H
°
û-------------------------------À
°
RETURN
°
° AL:
Laufwerksnummer
°
Û-------------------------------ì
Im Register AL findet sich die Nummer des Default-Laufwerkes mit der Kodierung A: = 0,
B: = 1, etc.
Die Funktion bildet das Gegenstück zum Aufruf 0EH des INT 21, der das Laufwerk setzt.
Hier weicht die Laufwerksnotation (0 = A:, 1 = B:, etc.) ebenfalls von den DOSKonventionen ab.
4.26 Set Disk Transfer Address (Funktion 1AH, DOS 2.0 6.x)
Die CP/M kompatiblen Funktionen zur Datei-Ein-/Ausgabe verwenden einen Bereich als
Zwischenpuffer, der nachfolgend als Disk-Transfer-Area (DTA) bezeichnet wird.
Standardmäßig reserviert DOS beim Programmstart eine 128 Byte große DTA im PSP ab
Offset 80H. Die Funktion 1AH teilt MS-DOS die Lage dieses Datenbereiches (DTA) mit.
Ö-------------------------------Ì
°
CALL:
INT 21
°
°
°
° AH:
1AH
°
° DS:DX Zeiger auf die DTA
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Der DTA-Bereich erstreckt sich von der angegebenen Adresse (DS:DX) bis zum Ende des
Datensegments (DS:FFFFH). Die DTA darf allerdings nicht über die Segmentgrenze
hinausreichen. Wie groß der genutzte Bereich der DTA wirklich ist, wird mit der
Recordgröße im FCB definiert.
Ein Überlauf auf das nachfolgende Segment ist genauso ausgeschlossen, wie ein Überlauf
auf den Anfang des aktuellen Datensegments. Falls die Lage des DTA nicht explizit
angegeben wird, benutzt DOS den Bereich im PSP ab 80H als DTA. Die Lage des DTA
läßt sich mit der Funktion 2FH ermitteln. Es ist aber zu beachten, daß DOS intern immer
nur die Lage einer DTA speichert. Probleme gibt es bei (residenten) Programmen, die auf
eine fixe Lage des DTA eingestellt sind und abstürzen, wenn sich die DTA-Adresse ändert.
Dies ist zum Beispiel nach dem Start eines Subprozesses über die EXEC-Funktion der Fall.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
198
Um die diversen Probleme im Zusammenhang mit den FCB's und der DTA zu umgehen,
empfiehlt sich ein Verzicht auf die CP/M orientierten Filefunktionen.
4.27 Get Default Drive Data (Funktion 1BH, DOS 2.0 - 6.x)
Mit dieser Funktion lassen sich verschiedene Informationen über das aktuelle Laufwerk,
b.z.w die File-Allocation-Table (FAT) abfragen.
Ö-------------------------------Ì
°
CALL:
INT 21
°
°
°
° AH:
1BH
°
û-------------------------------À
°
RETURN
°
° AL: Sektoren per Cluster
°
° CX: Bytes per Sektor
°
° DX: Cluster per Drive
°
° DS:BX Pointer auf FAT ID Byte °
Û-------------------------------ì
Die Daten über das aktuell selektierte Laufwerk werden in den Registern AL, CX, DX und
DS:BX zurückgegeben. Im Register AL findet sich die Größe eines Clusters. Bei diesen
Clustern handelt es sich um eine Speichereinheit, in die eine Datei aufgeteilt wird (siehe
DOS-Dateiverwaltung).
Damit kann die Datei nie kleiner als dieser Wert sein. Die belegte Speichergröße auf einer
Platte umfaßt dann immer ein Vielfaches dieser Clustergröße. Sollen z.B. 10 Byte bei einer
Clustergröße von 2 Sektoren a 512 Byte abgespeichert werden, belegt die Datei insgesamt
1 Kbyte auf dem Speichermedium. Die Größe eines Sektors in Byte findet sich im Register
CX. Standardmäßig legt MS-DOS diese mit 512 Byte pro Sektor fest. Weiterhin enthält das
Register DX die Zahl der Cluster auf dem Speichermedium. Im Registerpaar DS:BX findet
sich ein Zeiger auf einen Datenbereich, der die File-Allocation-Tabelle beinhaltet und
dessen erstes Byte den Disk Typ identifiziert. Für dieses Byte gilt folgende Kodierung:
Wert °
Diskettenformat
-----é------------------------------------------FF
° Double sided Diskette, 8 Sektoren pro Spur
° 40 Spuren, (320 Kbyte, 5 1/4")
FE
° Single sided Diskette, 8 Sektoren pro Spur
° 40 Spuren, (160 Kbyte, 5 1/4")
FD
° Double sided Diskette, 9 Sektoren pro Spur
° 40 Spuren, (360 Kbyte, 5 1/4")
FC
° Single sided Diskette, 9 Sektoren pro Spur
° 40 Spuren, (180 Kbyte, 5 1/4")
FB
° Double sided Diskette, 8 Sektoren pro Spur
° 80 Spuren, (640 Kbyte, 3 1/2")
FA
° Single sided Diskette, 8 Sektoren pro Spur
° 80 Spuren, (330 Kbyte, 3 1/2")
F9
° Double sided Diskette, 15 Sektoren pro Spur
° 40 Spuren, (600 Kbyte, 5 1/4")
° Double sided Diskette, 9 Sektoren pro Spur
° 80 Spuren, (720 Kbyte, 3 1/2")
F8
° Fixed Disk (mit nicht näher bestimmter
° Formatierung)
F0
° andere Medien
° Double sided Diskette, 15 Sektoren pro Spur
° 80 Spuren, (1,2 Mbyte, 5 1/4")
° Double sided Diskette, 18 Sektoren pro Spur
° 80 Spuren, (1,44 Mbyte, 3 1/2")
° Double sided Diskette, 36 Sektoren pro Spur
° 80 Spuren, (2,88 Mbyte, 3 1/2")
Tabelle 4.4: Kodierung des Media-Byte
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
199
Ab DOS 5.0 kommt noch der Code für 2,8 Mbyte Disketten hinzu.
Um die Daten eines speziellen Laufwerkes abzufragen, existiert die Funktion 1CH.
Weiterhin liefert die Funktion 36H (Get Disk Free Space) ähnliche Informationen.
4.28 Get Drive Data (Funktion 1CH, DOS 2.0 - 6.x)
Mit dieser Funktion lassen sich analog der Funktion 1BH verschiedene Informationen über
ein spezielles Laufwerk abfragen.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
1CH
°
° DL:
Laufwerksnummer
°
û-------------------------------À
°
RETURN
°
° AL: Sektoren per Cluster
°
° CX: Bytes per Sektor
°
° DX: Cluster per Drive
°
° DS:BX Pointer auf FAT ID Byte °
Û-------------------------------ì
Die Daten über das Laufwerk werden in den Registern AL, CX, DX und DS:BX
zurückgegeben. Falls im Register AL der Wert FFH steht, war die angegebene
Laufwerksnummer ungültig.
Diese wird vor dem Aufruf im Register DL eingestellt, wobei gilt:
Code ° Laufwerk
------é------------------------0 ° Default Drive
1 ° Drive A:
2 ° Drive B:
.
Die Kodierung der zurückgegebenen Daten (FAT-ID-Byte) wurde bereits im Rahmen der
Funktion 1BH besprochen. Im Registerpaar DS:BX findet sich der Zeiger auf den
Datenbereich, der die File-Allocation-Tabelle beinhaltet und den Disk-Typ identifiziert. Es
gilt die Kodierung aus Tabelle 4.4.
Bei Fehlern (z.B. wenn eine Diskette im abgefragten Laufwerk fehlt), löst die Funktion
einen INT 24 aus, der gegebenenfalls durch das Programm abzufangen ist. Wird ein
ungültiger Laufwerkscode in AL übergeben, enthält AL nach dem Aufruf den Wert FFH.
Dann lassen sich ab DOS 3.0 die erweiterten Fehlercodes mit der INT 21-Funktion 59H
ermitteln.
Um die Daten des Default-Laufwerkes abzufragen, existiert die Funktion 1BH. Ähnliche
Daten liefert auch die Funktion 36H (Get Disk free Space).
Die nicht dokumentierten Funktionen 1CH und 1EH sind für DOS reserviert, aber nicht
implementiert.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
200
4.29 Get Default Disk Parameter Block (Funktion 1FH, DOS
2.0 - 5.0)
Hierbei handelt es sich um eine Funktion, die intern durch DOS benutzt wird und deren
Funktion erst ab DOS 5.0 offiziell durch Microsoft dokumentiert wurde. Mit dieser
Funktion läßt sich der Disk-Parameter-Block (DPB) des Default-Laufwerkes lesen. Es
gelten folgende Aufrufparameter:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
1FH
°
û-------------------------------À
°
RETURN
°
° AL: 0 kein Fehler
°
° DS: Segmentadresse DPB
°
° BX: Offsetadresse DPB
°
Û-------------------------------ì
Bei dem Disk-Parameter-Block (DPB) handelt es sich um eine durch MS-DOS verwaltete
Datenstruktur, die Informationen über die Einheitennummer, den Aufbau des
Speichermediums etc. enthält. In DOS verwalten die beim Start installierten Blocktreiber
für jedes logische Laufwerk einen solchen DPB. Die Funktion liest beim Aufruf dann den
Inhalt des Bootsektors des Mediums vom angegebenen Laufwerk. Im Registerpaar DS:BX
wird anschließend ein Adreßvektor auf diesen Speicherbereich zurückgegeben.
Falls das Register nach dem Aufruf den Wert 0 erhält, dann ist dieser Vektor gültig. Die
Datenstruktur variiert etwas mit der DOS-Version und besitzt folgenden Aufbau:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
201
Ö--------Ú-------Ú----------------------------------------------Ì
° Offset ° Bytes ° Bemerkung
°
û--------é-------é----------------------------------------------À
°
00
°
1
° Drive-Nummer (Nummer des Treibers)
°
°
01
°
1
° Einheiten-Nummer (Subunit im DPB)
°
°
02
°
2
° Bytes pro Sektor
°
°
04
°
1
° Sektors pro Cluster - 1
°
°
05
°
1
° Cluster to Sector-Shift (2**n)
°
°
06
°
2
° Zahl der reservierten Boot-Sektoren
°
°
08
°
1
° Zahl der FATs
°
°
09
°
2
° Zahl der Einträge im Hauptverzeichnis
°
°
0B
°
2
° Sektornummer des ersten Datenclusters
°
°
0D
°
2
° Clusterzahl + 1
°
û--------é-------é----------------------------------------------À
°
°
°
DOS 2.x
°
û--------é-------é----------------------------------------------À
°
0F
°
1
° Zahl der Sektoren pro FAT
°
°
10
°
2
° Start-Sektor der Root-Directory
°
°
12
°
4
° Zeiger auf den Device-Header
°
°
16
°
1
° Media Descriptor Byte
°
°
17
°
1
° Zugriffsbyte (FFH = DPB neu aufbauen)
°
°
18
°
4
° Zeiger auf den folgenden DPB (FFFFH = letzter°
°
°
° Block)
°
°
1C
°
2
° Start Cluster aktives Verzeichnis
°
°
°
° 0 = Stamverzeichnis
°
°
1E
° 64
° ASCIIZ-String mit dem Namen des ak°
°
°
° tiven Verzeichnisses
°
û--------é-------é----------------------------------------------À
°
°
°
DOS 3.x
°
û--------é-------é----------------------------------------------À
°
0F
°
1
° Zahl der Sektoren für die FATs
°
°
10
°
2
° Start-Sektor der Root-Directory
°
°
12
°
4
° Zeiger auf den Device-Header
°
°
16
°
1
° Media Descriptor Byte
°
°
17
°
1
° Zugriffsbyte (FFH = DPB neu aufbauen)
°
°
18
°
4
° Zeiger auf den folgenden DPB (FFFFH = letzter°
°
°
° Block)
°
°
1C
°
2
° Cluster bei dem die Suche nach
°
°
°
° freien Blocks beginnt
°
°
1E
°
2
° freie Cluster (FFFF = unbekannt)
°
û--------é-------é----------------------------------------------À
°
°
°
ab DOS 4.0 - 6.0
°
û--------é-------é----------------------------------------------À
°
0F
°
2
° Zahl der Sektoren für die FATs
°
°
°
° wird als Word gespeichert
°
°
11
°
2
° Start-Sektor der Root-Directory
°
°
13
°
4
° Zeiger auf den Device-Header
°
°
17
°
1
° Media Descriptor Byte
°
°
18
°
1
° Zugriffsbyte (FFH = DPB neu aufbauen)
°
°
19
°
4
° Zeiger auf den folgenden DPB (xxxx:FFFFH =
°
°
°
° letzter Block)
°
°
1D
°
2
° Start Cluster (free space Suche)
°
°
1F
°
2
° Anzahl der freien Cluster
°
°
°
° FFFFH = unbekannt
°
Û--------Ù-------Ù----------------------------------------------ì
Tabelle 4.5: Aufbau des Disk-Parameter-Block;s (DPB)
DOS legt die DPB der einzelnen Laufwerke hintereinander im Speicher ab. Mittels der
Funktion 32H lassen sich die Daten eines jeden Laufwerkes abfragen. Bei Disketten
müssen die Daten beim Aufruf erst ermittelt werden. Aus diesem Grunde bringt DOS einen
INT 24-Fehler, falls keine Diskette im Laufwerk eingelegt ist. Bei Festplatten legt DOS
den DPB bereits beim Bootvorgang an.
Im ersten Byte wird der Laufwerkscode (0 = A:, 1 = B:, etc.) zurückgegeben. Das folgende
Feld enthält den Unit Code, der dem Treiber bei der Installation zugeordnet wird (siehe
Kapitel über die Einheitentreiber). Dieser Code ist relevant, falls der Treiber mehr als ein
logisches Laufwerk unterstützt. Das dritte Feld enthält die Zahl der Bytes pro Sektor, die in
DOS meist auf 200H (512) gesetzt wird. Ab Offset 04H steht die Zahl der Sektoren pro
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
202
Cluster, wobei die Zahl 0 einem Sektor pro Cluster entspricht. Bei 4 Sektoren pro Cluster
findet sich also der Wert 03H.
Das Feld Cluster to Sector-Shift beschreibt wieviele Sektoren ein Cluster besitzt. Der Wert
x ist als 2**x zu interpretieren, d.h. die Zahl 0 bedeutet 1 Sektor pro Cluster, die Zahl 1
bedeutet 2 Sektoren pro Cluster usw.
Offset 06H gibt die Zahl der Boot-Records an, d.h. der Wert entspricht dem Startcluster der
ersten FAT. Darauf folgt das Feld mit der Zahl der FATs (Standard = 2). Die Zahl der
möglichen Dateieinträge im Hauptverzeichnis findet sich ab Offset 09H.
Dann kommen die Felder mit den Nummern des ersten und letzten belegten Datenclusters.
Ab Offset 0FH ist die Zahl der Sektoren für die FAT gespeichert. Hier beginnt der
versionsspezifische Teil der Datenstruktur. Bis DOS 3.3 wurde die Zahl der Sektoren pro
FAT als Byte gespeichert. Ab DOS 4.0 umfaßt dieser Wert dann 2 Byte, wodurch sich die
restlichen
Einträge
um
ein
Byte
verschieben.
Der
Startsektor
des
Hauptinhaltsverzeichnisses schließt sich daran an. Als nächstes findet sich der Adreßzeiger
auf den Kopf des Gerätetreibers. Das Media-Descriptor-Byte (Offset 16H/17H ab DOS
4.0) beschreibt grob den Speichertyp. Ein Flag ab Offset 17H (18H bie DOS 4.0) dient zur
Markierung des Diskzugriffes, welcher nach Beendigung der Operation gelöscht wird. Ein
Wert von FFH signalisiert, daß der DPB neu aufzubauen ist (z.B. nach dem Wechsel der
Diskette). Zum Abschluß findet sich ein Adreßzeiger (Segment:Offset) auf den DPB des
nächsten Laufwerkes. Ein Wert XXXX:FFFFH zeigt das Ende der DPB-Kette an. Das
folgende Wort ist abhängig von der DOS-Version unterschiedlich belegt. In DOS 2.X steht
hier die Nummer des Start-Clusters des aktuellen Unterverzeichnisses. Der Wert 0
signalisiert, daß das Hauptverzeichnis selektiert ist. In DOS 2.X beginnt die Suche nach
freien Clustern grundsätzlich am Anfang der FAT. Um die Fraktionierung möglichst gering
zu halten, wurde ab DOS 3.0 eine Optimierung eingebaut. Nur beim Systemstart beginnt
die Suche nach freien Blöcken am Beginn der FAT. Anschließend merkt sich DOS die
Lage des letzten beschriebenen Clusters, und setzt bei den folgenden Aufrufen mit der
Suche an diesem Punkt wieder auf. Ab DOS 3.0 findet sich deshalb ab Offset 1CH (1DH
bei DOS 4.0) ein Wort mit der Nummer des Start-Clusters, ab dem die Suche nach freien
Clustern beginnt.
Die Datenstruktur wird in DOS 2.X mit dem Namen des aktuellen Verzeichnisses (64 Byte
ASCIIZ-String) beendet. Ab DOS 3.0 entfällt dieser Namen und es folgt ein Wort mit der
Zahl der freien Cluster des Mediums. Ein Wert von FFFFH steht für den Zustand
»unbekannt«»Die nicht dokumentierte Funktion 20H ist für interne Zwecke von DOS
reserviert, aber nicht implementiert.
4.30 Random Read (Funktion 21H, DOS 2.0 - 6.x)
Diese Funktion liest einen Satz (Record) aus der spezifizierten Datei. Vor dem Aufruf sind
folgende Parameter zu setzen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
203
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
21H
°
° DS:DX Zeiger auf einen FCB
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
Û-------------------------------ì
Die im FCB angegebene Datei muß bereits eröffnet sein. Der zu lesende Satz wird durch
den FCB-Eintrag Relativ Record Field (Offset 21H) spezifiziert. Der adressierte Satz wird
gelesen und in den Disk-Transfer-Bereich (DTA) übertragen.
Die Zeiger im FCB für Current Block Field (Offset 0CH) und Current Record Field
(Offset 20H) werden so gesetzt, daß sie mit dem durch die Variable Relativ Record Field
(Offset 21H) adressierten Satz übereinstimmen. Die Satzlänge wird aus dem Record Size
Field (Offset 0EH) des FCB gelesen. Im Register AL wird der Status der Leseoperation
zurückgegeben. Es gilt folgende Belegung:
Code ° Bedeutung
------é------------------------------------------------0 ° Funktion ohne Fehler ausgeführt
1 ° Versuch über das Dateiende hinaus zu lesen,
° keine Daten gelesen (EOF)
2 ° Nicht genügend Platz in der DTA, der Lese° befehl wurde abgebrochen
3 ° Dateiende wurde erreicht, ein Teilsatz wurde
° gelesen, die restlichen Bytes in der DTA wurden
° mit 00 aufgefüllt
Wird die Operation auf einer Datei innerhalb eines Netzwerkes ausgeführt, muß der Prozeß
das Read-Access-Privileg besitzen, andernfalls wird der Lesezugriff abgewiesen.
Für Programmneuentwicklungen sollte die Funktion 3FH (Read from a File or Device)
verwendet werden, da die Funktion 21H zu den älteren CP/M-orientierten I/O-Aufrufen
zählt.
4.31 Random Write (Funktion 22H, DOS 2.0 - 6.x)
Diese Funktion schreibt einen Satz (Record) in die spezifizierte Datei. Vor dem Aufruf sind
folgende Parameter zu setzen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
22H
°
° DS:DX Zeiger auf einen FCB
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
Û-------------------------------ì
Die im FCB angegebene Datei muß bereits eröffnet sein. Der zu schreibende Satz wird
durch den FCB-Eintrag Relativ Record Field (Offset 21H) spezifiziert. Der Satz wird dann
aus der DTA gelesen und im adressierten Dateibereich abgelegt.
Die Länge eines Satzes ist im Record Size Field des FCB spezifiziert. Falls diese Länge
kleiner als die Recordlänge des Speichermediums ist, legt die Funktion die Daten in einem
MS-DOS Zwischenpuffer ab. Erst wenn dieser Puffer gefüllt ist, oder falls die Datei
geschlossen wird, oder falls das Disk-System zurückgesetzt wird (Funktion 0DH), dann
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
204
werden die Daten auf die Platte geschrieben. Im Register AL wird der Status der
Schreiboperation zurückgegeben. Es gilt folgende Belegung:
Code ° Bedeutung
-----é------------------------------------------------0 ° Funktion ohne Fehler ausgeführt
1 ° Disk voll, Schreibversuch abgebrochen
2 ° Nicht genügend Platz in der DTA, der Schreib° befehl wurde abgebrochen
Die Einträge im FCB Current Block (Offset 0CH) und Current Record (Offset 20H)
werden so justiert, daß sie auf den gleichen Satz zeigen, in den gerade geschrieben wurde.
Die Positionierung des Ausgabezeigers ist allerdings problematisch. Zeigt er auf Daten
innerhalb der Datei, werden die folgenden Datenbytes überschrieben. Zeigt er hinter das
Dateiende, füllt DOS den Zwischenbereich mit undefinierten Daten auf. Falls die Datei mit
dem Attribut Read Only versehen ist, wird ein Schreibzugriff abgewiesen.
Bei Zugriff auf Dateien innerhalb eines Netzwerkes (ab DOS 3.1), benötigt der Prozeß das
Write Access-Privileg.
Da es sich bei der Funktion um eine ältere CP/M-orientierte I/O-Anweisung mit allen ihren
Problemen handelt, sollte bei Neuentwicklungen von Programmen der Aufruf 40H (Write
to a File or Device) verwendet werden.
4.32 Get File Size (Funktion 23H, DOS 2.0 - 6.x)
Diese Funktion ermittelt die Größe einer angegebenen Datei und gibt diese zurück. Vor
dem Aufruf sind folgende Parameter zu setzen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
23H
°
° DS:DX Zeiger auf einen FCB
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
Û-------------------------------ì
Der Zeiger DS:DX muß auf einen ungeöffneten FCB zeigen. In diesem FCB müssen vor
dem Aufruf folgende Felder definiert worden sein: Im Laufwerksbyte muß ein gültiger
Wert für das Laufwerk stehen. Der Filename muß als maximal 8 Byte langer ASCII-String
eingetragen werden.
Fehlende Zeichen sind mit 00H aufzufüllen. Im Namen sind Wildcardzeichen (? ab DOS
2.x, * ab DOS 3.X) erlaubt. Das Feld mit der Dateiextension muß belegt, oder mit 00 00 00
gefüllt werden. Im Feld record size (Offset 0EH) ist vor dem Aufruf die Größe eines Satzes
(1..FFFFH Byte) korrekt einzusetzen.
Wurde eine Datei gefunden, gibt die Funktion im Feld »relativ recordn:
Code ° Bedeutung
-----é---------------------------------00 ° Operation fehlerfrei durchgeführt
FF ° keine Datei gefunden
Der Wert des Feldes Record Size muß vor dem Aufruf auf einen definierten Wert gesetzt
werden, sonst ist das Ergebnis nicht gültig. Der Wert kann zum Beispiel durch den Aufruf
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
205
Open File initialisiert werden. Wegen der Probleme mit den FCB orientierten Filezugriffen
sollten die handleorientierten INT 21-Funktionen für Neuentwicklungen verwendet
werden. Zur Ermittlung der Dateilänge eignet sich die INT 21-Funktion 42H.
4.33 Set Relativ Record (Funktion 24H, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich das Feld Relativ Record Field des FCB setzen.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
24H
°
° DS:DX Zeiger auf einen FCB
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Durch Aufruf der Funktion wird das Relativ Record Field (Offset 21H) so justiert, daß es
den gleichen Record adressiert, der durch die Werte der Felder Current Block Field (Offset
0CH) und Current Record Field (Offset 20H) referiert wird.
Der Zeiger DS:DX muß auf einen ungeöffneten FCB zeigen. Die Funktion sollte vor der
Benutzung der Random-Read- und Random-Write-Funktionen (Aufrufe 21H, 22H, 27H
und 28H) benutzt werden. Die Funktion gibt keine Status- oder Fehlermeldung nach dem
Aufruf zurück.
4.34 Set Interrupt Vektor (Funktion 25H, DOS 2.0 - 6.x)
Der direkte Zugriff aus Anwenderprogrammen auf die Interruptvektor-Tabelle ist nicht
zulässig. Tritt zum Beispiel während des Setzens eines neuen Vektors ein Interrupt auf, der
diesen Vektor benutzt, befindet sich das System in einem inkonsistenten Zustand.
Probleme gibt es ebenfalls, wenn Software unter DOS-Emulatoren (WINDOWS, OS/2)
läuft und die Vektoren direkt modifiziert. Um dies zu vermeiden, bietet das MS-DOSBetriebssystem die Funktion 25H (Set-Interruptvektor). Es gelten folgende
Übergabeparameter:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
25H
°
° AL:
Interruptnummer
°
° DS:DX Interruptvektor
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Beim Aufruf wird im Register AL die Nummer des gewünschten Interrupts angegeben. Die
Funktion lädt dann die im Registerpaar DS:DX befindliche Adresse in die InterruptvektorTabelle. Es gilt dabei folgende Zuordnung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
û-----------------À
° Adresse + 2
° <--û-----------------À
° Adresse INT n
° <--û-----------------À
206
Segmentadresse im Register DS
Offsetadresse im Register DX
Bild 4.2: Anordnung eines Interruptvektors
Die Funktion gibt keine Status- oder Fehlermeldungen zurück. Um den aktuellen Wert des
Interruptvektors zu sichern, läßt sich die Funktion 35H (Get Interrupt Vektor) benutzen.
Die PharLap 386-DOS-Extender nutzen die Funktion 25H des INT 21 ebenfalls als
Eintrittspunkt für Systemaufrufe.
4.35 Create New PSP (Funktion 26H, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich ein neues Program-Segment-Prefix (PSP) erzeugen. Es sind
folgende Parameter zu übergeben:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
26H
°
° DX:
Segmentadresse PSP
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Der Wert in DX spezifiziert die Segmentadresse, wo der neue PSP angelegt wird. Der PSPBereich besitzt eine Größe von 256 Byte (0FFH) und befindet sich ab der Segmentadresse
0 im Codesegment. Ab Offset 100H beginnt dann der Programmcode.
Beim Erstellen des PSP-Segments kopiert DOS die Werte der Interruptvektoren 22H
(Programm Exit Address), 23H (Control-C Exit Address) und 24H (Critical Error Exit
Address) in diesen Bereich. Dadurch ist es nach Abbruch des laufenden Prozesses möglich,
diese Vektoren zu restaurieren, auch wenn diese vorher durch den Prozeß variiert wurden.
In DOS 2.x nimmt das Betriebssystem an, daß in CS die Segmentadresse des PSP steht.
Bei EXE-Files kann es hier zu Problemen kommen.
Der Systemaufruf sollte bei Programmneuentwicklungen nicht mehr verwendet werden, da
die Funktion 4B00H (Load- and -Execute-Programm) automatisch ein PSP anlegt.
4.36 Random Block Read; (Funktion 27H, DOS 2.0 - 6.x)
Diese Funktion liest einen oder mehrere Sätze (Records) aus der spezifizierten Datei. Vor
dem Aufruf sind folgende Parameter zu setzen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
207
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
27H
°
° DS:DX Zeiger auf einen FCB
°
° CX:
Zahl der Records die
°
°
zu lesen sind
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
° CX:
Zahl der gelesenen
°
°
Records
°
Û-------------------------------ì
Die im FCB angegebene Datei muß bereits eröffnet sein. Der zu lesende Satz wird durch
den FCB-Eintrag Relativ Record Field (Offset 21H) spezifiziert. Dieser Wert muß vorher
durch Aufruf der Funktion 24H gesetzt werden. Die Zahl der zu lesenden Sätze wird in CX
angegeben. Die Recordlänge wird durch DOS auf 128 Byte gesetzt, kann aber explizit im
FCB zwischen 1 und FFFFH variiert werden.
MS-DOS ermittelt die Zahl der zu lesenden Bytes durch Multiplikation der Recordzahl *
Recordlänge. Nach der Operation enthält das Register CX die Zahl der wirklich gelesenen
Sätze. Die Einträge im FCB Current Block Field, Current Record Field und Relativ Record
Field werden auf den nächst folgenden Satz gesetzt. Falls der Wert in CX = 0 ist, wird kein
Satz gelesen. Im Register AL erscheint die Statusinformation:
Code ° Bedeutung
-----é------------------------------------------------0 ° Funktion ohne Fehler ausgeführt
1 ° Versuch über das Dateiende hinaus zu lesen,
° keine Daten gelesen (EOF)
2 ° Nicht genügend Platz in der DTA, der Lese° befehl wurde abgebrochen
3 ° Dateiende wurde erreicht, ein Teilsatz wurde
° gelesen, die restlichen Bytes in der DTA wurden
° mit 00 aufgefüllt
Beim Zugriff auf eine Datei innerhalb eines Netzwerkes muß der Prozeß das Read-AccessPrivileg besitzen. Die Funktion gehört zur Gruppe der älteren CP/M-orientierten Aufrufe
und sollte bei Neuentwicklungen nicht weiter verwendet werden.
4.37 Random Block Write (Funktion 28H, DOS 2.0 - 6.x)
Diese Funktion schreibt einen oder mehrere Sätze (Records) in die spezifizierte Datei. Vor
dem Aufruf sind folgende Parameter zu setzen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
28H
°
° DS:DX Zeiger auf einen FCB
°
° CX:
Zahl der Records die
°
°
zu schreiben sind
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
° CX:
Zahl der geschriebenen °
°
Records
°
Û-------------------------------ì
Die im FCB angegebene Datei muß bereits eröffnet sein. Die zu schreibenden Sätze
werden durch den FCB-Eintrag Relativ Record Field (Offset 21H) spezifiziert. Dieser Wert
muß vorher durch Aufruf der Funktion 24H gesetzt werden. Die Zahl der zu lesenden Sätze
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
208
wird in CX angegeben. Die Recordlänge kann im FCB variiert werden und ist
standardmäig auf 128 Byte gesetzt.
Falls der Wert in CX = 0 ist, werden keine Daten geschrieben, sondern MS-DOS setzt die
Dateigröße im FAT-Bereich auf den Wert des Feldes Relativ Record Field im FCB. Es
werden dann die entsprechenden Cluster, je nach Dateigröße, belegt oder freigegeben. Bei
Werten größer 0 werden entsprechend viele Sätze geschrieben.
MS-DOS ermittelt die Zahl der zu schreibenden Bytes durch Multiplikation der Recordzahl
* Recordlänge. Nach der Operation enthält das Register CX den Wert der wirklich
geschriebenen Sätze. Die Einträge Current Block Field, Current Record Field und Relativ
Record Field im FCB werden auf den nächst folgenden Satz gesetzt. Falls der Wert in CX
= 0 ist, wird kein Satz geschrieben. Im Register AL erscheint die Statusinformation:
Code ° Bedeutung
-----é------------------------------------------------0 ° Funktion ohne Fehler ausgeführt
1 ° Disk voll, keine Sätze geschrieben
2 ° Nicht genügend Platz in der DTA, der Schreib° befehl wurde abgebrochen
Falls nicht genügend Speicherplatz auf dem Medium vorhanden ist, enthält das ALRegister den Statuscode 01H. In diesem Fall werden keine Daten auf die Einheit
geschrieben. Wird der Schreibzeiger hinter das Dateiende positioniert, füllt DOS die Lücke
zwischen EOF und der aktuellen Position mit undefinierten Zeichen.
Bei Verwendung innerhalb eines Netzwerkes (ab DOS 3.1) muß der Prozeß das
Zugriffsrecht Write Access besitzen. Die Funktion sollte bei Programmneuentwicklungen
nicht weiter verwendet werden.
4.38 Parse File Name (Funktion 29H, DOS 2.0 - 6.x)
Diese Funktion analysiert Zeichenketten (Strings) auf gültige Filenamen. Die Strings
müssen das Format:Device:Filename.Extension
besitzen. Es sind folgende Übergabeparameter zu definieren:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
29H
°
° AL:
Steuercode
°
° DS:SI Zeiger auf den String °
° ES:DI Zeiger auf einen Puffer°
°
für den FCB
°
û-------------------------------À
°
RETURN
°
° AL:
Statusbyte
°
° DS:SI Zeiger auf das analys. °
°
Stringende
°
° ES:DI Zeiger auf den FCB
°
Û-------------------------------ì
Im Registerpaar DS:SI wird die Adresse (Segment:Offset) der zu analysierenden
Zeichenkette abgelegt. Das Registerpaar ES:DI enthält einen Zeiger auf einen
Pufferbereich, in dem die Funktion einen ungeöffneten FCB anlegen kann. Wird ein
gültiger Dateiname im String gefunden, baut die Funktion einen FCB in diesem Bereich
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
209
auf. Mit dem Wert des Registers AL wird die Funktion des Parsers gesteuert, wobei nur die
untersten 4 Bit belegt sind.
3 2 1 0
Ö-Ú-Ú-Ú-Ì
ÛÚÙÚÙÚÙÚì
0
° ° ° Û-° ° °
1
° ° °
° ° °
0
° ° Û--° °
1
° °
° °
° °
0
° Û----°
1
°
°
°
0
Û-----1
Analyse abbrechen, falls ein Fileseparator gefunden
wird (Fileseparator = Blank, Komma, etc.)
Ignoriere führende Separatoren
Setze Default Drive im FCB, falls im String kein
Drive angegeben wurde
Drive Nummer nicht verändern, falls keine Angabe
im String
Ersetze den Dateinamen im FCB durch 8 Blanks, falls
im String kein Dateiname vorkommt
Dateiname im FCB nicht verändern, falls im String
kein Name vorkommt
Ersetze die Extension im FCB durch 3 Blanks, falls
im String keine Extension vorkommt
Extension im FCB nicht verändern, falls im String
keine Extension vorkommt
Bild 4.3: Steuercodes für die Funktion Parse File Name
Die restlichen Bits im Register AL sind vor dem Aufruf auf den Wert 0 zu setzen. Falls im
String Wildcards (*) vorkommen, werden alle betroffenen Zeichen (Filename oder
Extension) durch ein ? ersetzt.
Als gültige Fileseparatoren sind folgende Zeichen erlaubt:
: . ; , = + / " [ ] \ < > Space Tab
Weiterhin gelten alle Control-Zeichen als Fileseparatoren. Innerhalb eines Dateinamens
dürfen diese Separatoren nicht verwendet werden, da sonst die Analyse an dieser Stelle
abbricht.
Falls ein gültiger Dateiname im String gefunden wurde, setzt die Funktion folgende
Registerinhalte:
AL
° Bemerkungen
------é----------------------------------------------------0
° falls Dateiname und Extension keine Wildcards
° enthalten
1
° falls Dateiname oder Extension Wildcards enthalten
FF
° falls die Laufwerksangabe falsch ist
------é----------------------------------------------------DS:SI ° Zeiger auf das erste Zeichen im String, welches noch
° nicht analysiert wurde
ES:DI ° Zeiger auf das erste Byte des ungeöffneten FCB
Falls der String keinen gültigen Laufwerksnamen enthält, wird das Register AL auf den
Wert FFH gesetzt. Bei ungültigen Dateinamen zeigt ES:DI+1 auf eine Speicherzelle die ein
Blank (20H) enthält.
4.39 Get Date (Funktion 2AH, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich das Datum des Systems abfragen. Es gelten folgende
Übergabeparameter.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
210
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
2AH
°
û-------------------------------À
°
RETURN
°
° CX:
Jahr (1980 - 2099)
°
° DH:
Monat (1 - 12)
°
° DL:
Tag (1 - 31)
°
° AL:
Wochentag (0 - 6)
°
Û-------------------------------ì
Die Funktion gibt das aktuelle Datum in den Registern zurück. Die Kodierung der
Wochentage erfolgt mittels des Registers AL:
Code ° Wochentag
------é-----------0 ° Sonntag
1 ° Montag
2 ° Dienstag
3 ° Mittwoch
4 ° Donnerstag
5 ° Freitag
6 ° Samstag
Das Jahr befindet sich im 16-Bit-Register CX und liegt zwischen 1980 und 2099. Ein
Überlauf der Uhrzeit (24:00) bewirkt, daß das Datum um einen Tag weitergezählt wird.
Monats-, Jahresüberlauf und Schaltjahre werden durch die Funktion automatisch
berücksichtigt.
4.40 Set Date (Funktion 2BH, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich das Datum des Systems setzen. Dies gilt auch, wenn eine
CMOS-Uhr im System vorhanden ist. Es sind folgende Übergabeparameter zu definieren:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
2BH
°
° CX:
Jahr (1980 - 2099)
°
° DH:
Monat (1 - 12)
°
° DL:
Tag (1 - 31)
°
û-------------------------------À
°
RETURN
°
° AL: 00H Datum gültig
°
°
FFH Datum ungültig
°
Û-------------------------------ì
Die Funktion setzt das in den Registern übergebene Datum. Falls ein ungültiger Wert
übergeben wurde (z.B. Jahr 1900), enthält das Register AL anschließend den Wert FFH. In
diesem Fall wird das Datum nicht verändert. Sobald der Wert 00H im Register AL
zurückgegeben wird, ist das neue Datum gesetzt. Ab DOS 3.3 wird bei Systemen mit RealTime-Clock auch die Uhr auf dem Chip gestellt, falls das BIOS dies erlaubt.
4.41 Get Time (Funktion 2CH, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich die Zeit des Systems lesen. Es gelten folgende
Übergabeparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
211
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
2CH
°
û-------------------------------À
°
RETURN
°
° CH:
Stunden (0 - 23)
°
° CL:
Minuten (0 - 59)
°
° DH:
Sekunden (0 - 59)
°
° DL:
1/100 Sek. (0 - 99)
°
Û-------------------------------ì
Die Funktion gibt die aktuelle Zeit über die Register zurück. Das Registerpaar CX:DX
enthält die Zeit in Stunden, Minuten, Sekunden und 1/100 Sekunden. Die Stundenwerte
stehen im Register CH, während der Wert im Register DL die 1/100 Sekunden enthält. Das
Format ist so organisiert, daß Anzeigen und Rechenoperationen möglichst einfach
durchzuführen sind.
Achtung: Das Ergebnis der Funktion kann von der verwendeten Hardware abhängen. Falls
die Uhr z.B. keine 1/100 Sekunden hat, wird DL immer den Wert 0 enthalten.
4.42 Set Time (Funktion 2DH, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich die Zeit des Systems setzen. Dies gilt auch für den Fall, daß
das System standardmäßig mit einer CMOS-Uhr ausgerüstet ist. Es gelten folgende
Übergabeparameter:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
2DH
°
° CH:
Stunden (0 - 23)
°
° CL:
Minuten (0 - 59)
°
° DH:
Sekunden ( 0 - 59)
°
° DL:
1/100 Sek. (0 - 99)
°
û-------------------------------À
°
RETURN
°
° AL: 00 Zeit gültig
°
°
FF Zeit ungültig
°
Û-------------------------------ì
Die Funktion setzt die in den Registern übergebene Zeit. Falls ein ungültiger Wert
übergeben wurde (z.B. Minuten 79), enthält das Register AL anschließend den Wert FFH.
In diesem Fall wird die Zeit nicht verändert. Der Wert AL = 00H zeigt an, daß ein gültiger
Wert für die Zeiteinstellung übernommen wurde. Ab DOS 3.3 wird auch die Uhrzeit auf
dem Chip gestellt, falls das BIOS dies zuläßt.
Achtung: Das Ergebnis der Funktion kann von der verwendeten Hardware abhängen. Falls
die Hardware bestimmte Werte nicht unterstützt, sind diese Register irrelevant. So kann
z.B. die Zeit in 1/100 Sekunden nicht von jeder Hardwareuhr gestellt werden.
4.43 Set/Reset Verify Flag (Funktion 2EH, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich das MS-DOS Verify-Flag setzen oder löschen. Es gelten
folgende Übergabeparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
212
Verify-Flag setzen
Verify-Flag löschen
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
2EH
°
° AL:
0 = No Verify
°
°
1 = Verify
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Bei Schreiboperationen in Dateien besteht die Möglichkeit, daß das Ergebnis dieser
Operation verifiziert wird. Dies kann z.B. in DOS durch den Befehl VERIFY = ON
erzwungen werden. Mit der Funktion 2EH läßt sich dies ebenfalls erreichen. Falls AL = 0
ist, wird der Verify-Befehl abgeschaltet. In DOS 2.x sollte DL=0 gesetzt werden.
Bei AL = 1 verifiziert DOS jeden geschriebenen Satz innerhalb einer Diskettendatei.
Das Flag wird normalerweise durch DOS ausgeschaltet, da die Operation, insbesondere bei
Disketten, lange dauert. Der Zustand des Verify-Flags läßt sich durch die Funktion 54H
abfragen. Bei Zugriffen auf Dateien innerhalb eines Netzwerkes wird die Verify-Operation
nicht unterstützt.
4.44 Get Disk Transfer Address (Funktion 2FH, DOS 2.0 6.x)
Die Lage der Disk-Transfer-Area (DTA) läßt sich mit dieser Funktion ermitteln. Der DTA
dient als Puffer für die Disk-Ein-/Ausgabedaten.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
2FH
°
û-------------------------------À
°
RETURN
°
° ES:BX Zeiger auf die DTA
°
Û-------------------------------ì
Im Registerpaar ES:DX wird dann ein Zeiger (Segment:Offset) mit der DTA-Adresse
zurückgegeben. In der Standardeinstellung benutzt DOS den Bereich ab Offset 80H im
PSP als DTA, der demnach auf 128 Byte begrenzt ist.
Wurde die DTA in einen eigenen Speicherbereich umgesetzt, läßt sich die betreffende
Adresse mit der Funktion abfangen.
4.45 Get MS-DOS Version Number (Funktion 30H, DOS 2.0 6.x)
Die Funktion gibt die Versionsnummer des aktuell geladenen Systems zurück. Bei Aufruf
sollte das Register AL auf den Wert 0 gesetzt werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
213
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
30H
°
° AL:
00H
°
û-------------------------------À
°
RETURN
°
° AL
Haupt - Versionsnummer °
° AH
Unter - Versionsnummer °
° BH
OEM - Seriennummer
°
°BL:CX
24 Bit User Seriennr. °
Û-------------------------------ì
Im AX-Register wird dann die Versionsnummer zurückgegeben, wobei die Hauptnummer
in AL steht (Beispiel: Version 3.1 -> AL = 3, AH = 10). Es ist zu beachten, daß die Werte
als Hexzahlen zurückgegeben werden. Bei DOS 3.1 enthält das Register die Werte AL =
03H, AH = 0AH. Bei DOS 3.2 werden die Werte AL = 03H und AH = 14H
zurückgegeben.
Falls die Versionsnummer kleiner als 2.0 ist, enthält AL den Wert 0. Die restlichen
Register sind für die Seriennummern des Herstellers reserviert (FFH für MS-DOS, 00H für
PC-DOS). Das hierfür reservierte Registerpaar BL:CX wird aber üblicherweise immer auf
00:00 gesetzt, da bisher kein Hersteller diese vorgesehene Option nutzt.
Diese Aussagen gelten allerdings nur für die Versionen 2.x und 3.x des Betriebssystems.
Ab DOS 4.0 modifizierte Microsoft die Abfrage der Version, um Kompatibilitätsprobleme
mit Altsoftware in den Griff zu bekommen. Ziel ist es, einem Programm eine vom
Benutzer definierbare Versionsnummer zurückzugeben. In DOS 4.x findet sich eine interne
Tabelle (im DOS-Datenbereich), in dem die Namen der betreffenden (Microsoft)
Programme abgelegt werden. Fragt eines dieser Programme die Versionsnummer ab, erhält
es die Version 3.40 zurückgeliefert.
Ab DOS 5.0 besteht sogar die Möglichkeit, mittels des Befehls SETVER, jedem Programm
eine beliebige Versionsnummer zuzuordnen. SETVER installiert sich resident als Treiber
(SETVERXX) im Speicher und überwacht die Versionsabfrage. Es baut sich zu diesem
Zweck eine interne Tabelle mit den Programmnamen und den Versionsnummern auf. Der
Treiber SETVERXX kann nur die Funktion INIT (Code 00H) ausführen. Die Tabelle mit
den Programmnamen findet sich im Treiber ab Offset 4BH. Der transiente Teil von
SETVER vermag die Liste zu modifizieren. Die Original Versionsnummer kann ab DOS
5.0 über eine Erweiterung der Funktion 33H ermittelt werden.
In AL läßt sich beim Aufruf ebenfalls ein Steuercode definieren. Bei AL <> 1 wird die
OEM-Seriennummer in BH zurückgegeben. Bei AL = 1 erfolgt die Abfrage des
Versionsflags. Das Flag wird ebenfalls in BH zurückgegeben und signalisiert, ob eine
ROM-Variante des Betriebssystems benutzt wird. Die Unterscheidung erfolgt in einem Bit
von BH. Ist BH = 08H liegt die ROM-Version vor, bei BH = 00H wird eine normale DOSVersion benutzt.
4.46 Keep Process (Funktion 31H, DOS 2.0 - 6.x)
Die Funktion erlaubt es, Terminate-and-Stay-Resident-Programme zu erzeugen. Es gelten
folgende Übergabeparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
214
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
31H
°
° AL:
Return Code
°
° DX:
belegte Paragraphen
°
û-------------------------------À
°
RETURN
°
° --°
Û-------------------------------ì
Ein geladenes Programm läßt sich mit diesem Aufruf beenden, ohne daß es aus dem
Speicher entfernt wird. Diese Technik wird häufig benutzt, um spezielle Interrupt-Treiber
zu installieren. Diese lassen sich anschließend durch den entsprechenden Interrupt
aktivieren.
Die Funktion ersetzt den INT 27 (Terminate But Stay Resident) und erlaubt auch
Programme, die mehr als 64 Kbyte Speicher belegen, zu installieren.
Im AL-Register kann ein Returncode an den Parent Process zurückgegeben werden. Falls
es sich bei diesem Prozeß um MS-DOS handelt, läßt sich der Code mit dem Befehl
ERRORLEVEL lesen. Jeder andere Parent Prozeß kann den Returncode mittels der INT
21-Funktion 4DH abfragen. Im Register DX steht die Zahl der belegten
Speicherparagraphen (16-Byte-Blöcke). Es ist jedoch darauf zu achten, daß bei EXEProgrammen neben dem Codebereich auch der Datenbereich in die reservierte
Speichergröße eingerechnet wird. Weiterhin muß auch der Speicherbereich des PSP (10H
Paragraphen) berücksichtigt werden. Minimal muß DX = 06 gesetzt werden (PSP-Init).
MS-DOS beendet das Programm und versucht die angeforderten Speicherblöcke diesem
Prozeß zuzuordnen. Es werden aber keine von dem Programm reservierten Blöcke
freigegeben. Falls das Programm vorher mehr Paragraphen belegt hat, müssen diese
explizit freigegeben werden. Dateien, die durch diesen Prozeß bereits geöffnet wurden,
bleiben auch weiterhin erhalten.
Weiterhin kann der durch das Environment belegte Speicher in vielen Fällen freigegeben
werden. Hierfür existiert die Funktion 48H, der im Register ES die Segmentadresse des
Environments übergeben wird. Diese Adresse findet sich ab Offset 2CH im PSP-Block.
4.47 Get Disk Parameter Block (Funktion 32H, DOS 2.0 - 6.x)
Bei diesem Aufruf handelt es sich um eine interne DOS-Funktion, die den Disk-ParameterBlock (DPB) liest. Der DPB ist eine interne Datenstruktur, die Informationen über das
Speichermedium, die Einheit etc. enthält. Die Aufrufparameter, sowie die Struktur der
Parameterblöcke wurde erst ab DOS 5.0 von Microsoft offiziell publiziert. Die bisherigen
DOS-Versionen unterstützen aber diese Funktion. In der OS/2-Kompatibility-Box wird die
Funktion DOS 3.3 konform abgebildet. Lediglich die Datenstruktur zeigt in der Adresse
des Device Treibers einen falschen Wert. Es gelten folgende Übergabeparameter für die
Funktion:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
215
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
32H
°
° DL:
Laufwerkscode
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AL:
Fehlercode
°
° Carry: gelöscht -> ok
°
° DS: Segmentadresse DPB
°
° BX: Offsetadresse DPB
°
Û-------------------------------ì
Im Register DL wird die Laufwerksnummer (0 = Default, 1 = A:, 2 = B:, etc.) angegeben.
Tritt ein Fehler auf, wird das Register AL zur Rückgabe des Fehlercodes benutzt. Ein
gesetztes Carry-Flag zeigt einen Fehler an. Es gelten folgende Fehlercodes:
Code ° Bemerkung
-----é--------------------------------15 ° ungültige Laufwerksangabe in DL
Andere Fehlercodes sind den DOS-Error-Code-Tabellen zu entnehmen.
Falls der Aufruf fehlerfrei abgearbeitet wird (Carry gelöscht und AX = 0), dann findet sich
im Registerpaar DS:BX ein Zeiger auf den Disk-Parameter-Block (DPB). Diese
Datenstruktur besitzt folgenden Aufbau:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Ö--------Ú------Ú--------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é--------------------------------------------------À
°
00
°
1 ° Drive-Nummer (Nummer des Treibers)
°
û--------é------é--------------------------------------------------À
°
01
°
1 ° Einheiten-Nummer (Subunit im DPB)
°
û--------é------é--------------------------------------------------À
°
02
°
2 ° Byte pro Sektor
°
û--------é------é--------------------------------------------------À
°
04
°
1 ° Sektor pro Cluster - 1
°
û--------é------é--------------------------------------------------À
°
05
°
1 ° Cluster to Sector-Shift
°
û--------é------é--------------------------------------------------À
°
06
°
2 ° Zahl der reservierten Boot-Sektoren
°
û--------é------é--------------------------------------------------À
°
08
°
1 ° Zahl der FATs
°
û--------é------é--------------------------------------------------À
°
09
°
2 ° Zahl der Einträge im Hauptverzeichnis
°
û--------é------é--------------------------------------------------À
°
0B
°
2 ° Sektornummer des ersten Daten-Clusters
°
û--------é------é--------------------------------------------------À
°
0D
°
2 ° maximale Clusternummer
°
û--------é------é--------------------------------------------------À
° ---- ° --- ° --- Aufbau für DOS 2.x --°
û--------é------é--------------------------------------------------À
°
0F
°
1 ° Zahl der Sektoren für eine FAT
°
û--------é------é--------------------------------------------------À
°
10
°
2 ° Start-Sektor des Root Directories
°
û--------é------é--------------------------------------------------À
°
12
°
4 ° Zeiger auf den Device Header des Laufwerks
°
û--------é------é--------------------------------------------------À
°
16
°
1 ° Media Descriptor Byte
°
û--------é------é--------------------------------------------------À
°
17
°
1 ° Zugriffsbyte (0 = Disk Access, FFH rebuild Block)°
û--------é------é--------------------------------------------------À
°
18
°
4 ° Zeiger auf den folgenden DPB (FFFFH = last Block)°
û--------é------é--------------------------------------------------À
°
1C
°
2 ° Start Cluster current Directory (0 = Root)
°
û--------é------é--------------------------------------------------À
°
1E
° 64 ° ASCIIZ-String aktueller Directory-Pfad
°
û--------é------é--------------------------------------------------À
° ---- ° --- ° --- Aufbau für DOS 3.x --°
û--------é------é--------------------------------------------------À
°
0F
°
1 ° Zahl der Sektoren für eine FAT
°
û--------é------é--------------------------------------------------À
°
10
°
2 ° Start-Sektor des Root Directories
°
û--------é------é--------------------------------------------------À
°
12
°
4 ° Zeiger auf den Device Header des Laufwerks
°
û--------é------é--------------------------------------------------À
°
16
°
1 ° Media Descriptor Byte
°
û--------é------é--------------------------------------------------À
°
17
°
1 ° Zugriffsbyte (0 = Disk Access, FFH rebuild Block)°
û--------é------é--------------------------------------------------À
°
18
°
4 ° Zeiger auf den folgenden DPB (FFFFH = last Block)°
û--------é------é--------------------------------------------------À
°
1C
°
2 ° Startcluster für Free Space Suche
°
û--------é------é--------------------------------------------------À
°
1E
°
2 ° Zahl der freien Cluster (FFFFH = unbekannt)
°
û--------é------é--------------------------------------------------À
° ---- ° --- ° --- Aufbau ab DOS 4.x --°
û--------é------é--------------------------------------------------À
°
0F
°
2 ° Zahl der Sektoren für die FATs
°
Û--------Ù------Ù--------------------------------------------------ì
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
216
DOS Programmierhandbuch
217
Ö--------Ú------Ú--------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é--------------------------------------------------À
°
11
°
2 ° Start-Sektor des Root Directories
°
û--------é------é--------------------------------------------------À
°
13
°
4 ° Zeiger auf den Device Header
°
û--------é------é--------------------------------------------------À
°
17
°
1 ° Media Descriptor Byte
°
û--------é------é--------------------------------------------------À
°
18
°
1 ° Zugriffsbyte (0 = Disk Access, FFH rebuild Block)°
û--------é------é--------------------------------------------------À
°
19
°
4 ° Zeiger auf den folgenden DPB (FFFFH = last Block)°
û--------é------é--------------------------------------------------À
°
1D
°
2 ° letzter geschriebener Cluster
°
û--------é------é--------------------------------------------------À
°
1F
°
2 ° Zahl der freien Cluster (FFFFH = unbekannt)
°
Û--------Ù------Ù--------------------------------------------------ì
Tabelle 4.6: Der Aufbau des Disk-Parameter-Blocks (DPB)
Die nachfolgende Abbildung zeigt einen Speicherdump des DPB einer Festplatte.
-d 029C:6E20
029C:6E20 02 02 00 02 03 02 01 00-02 00 02 73 00 73 28 29
029C:6E30 53 00 02 10 70 00 F8 00-FF FF FF FF 00 00 FF FF
Bild 4.4: Speicherdump des DCB einer Platte
DOS legt die DPB der einzelnen Laufwerke hintereinander im Speicher ab. Mittels der
Funktion 32H lassen sich die Daten eines jeden Laufwerkes abfragen. Bei Disketten
müssen die Daten beim Aufruf erst ermittelt werden. Aus diesem Grunde bringt DOS einen
Fehler, falls keine Diskette im Laufwerk eingelegt ist. Bei Festplatten legt DOS den DPB
bereits beim Bootvorgang an. Der DPB des Default-Laufwerkes läßt sich mit der Funktion
1FH abfragen. Dort findet sich auch eine ausführliche Beschreibung des DPB.
4.48 Control-C Check (Funktion 33H, DOS 2.0 - 6.x)
Diese Funktion wurde im Laufe der verschiedenen DOS-Versionen schrittweise erweitert.
Nachfolgend werden die verschiedenen Unterfunktionen beschrieben.
4.48.1 Control-C Check (Funktionen AX=3300H/3301H)
Die Subfunktion ist ab DOS 2.0 implementiert und besitzt folgende Aufrufsyntax:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
33H
°
° AL:
1. Unterfunktion
°
° DL:
2. Unterfunktion
°
û-------------------------------À
°
RETURN
°
° AL:
Fehlercode
°
° DL:
Status des Flags
°
Û-------------------------------ì
Mit dieser Funktion läßt sich bei allen DOS-Versionen der Zustand des internen Control-C
Flags prüfen. Es gilt nebenstehende Übergabeschnittstelle.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
218
Das Register AL spezifiziert, ob der Status gelesen oder gesetzt werden soll:
Code ° Bemerkung
------é------------------------------------------------AL= 0 ° lese den Status des Flags in das Register DL
1 ° setze den Status des Flags aus dem Register DL
Das Register DL dient zur Übergabe des gewünschten Wertes. Bei der Leseoperation (AL
= 0) wird der aktuelle Wert in DL zurückgegeben, während bei der Schreiboperation der
Wert des Registers den Zustand des Flags beeinflußt. Es gilt folgende Zuordnung:
DL ° Bedeutung
---é--------------------0 ° Control-C Check Aus
1 ° Control-C Check Ein
Falls beim Aufruf das Register AL nicht die Werte 0 oder 1 enthält, terminiert die Funktion
und gibt den Fehlercode FFH in AL zurück. Der Control-C Check wird normalerweise nur
bei Aufrufen der INT 21-Funktionen 01H bis 0CH ausgeführt. Ob die jeweilige Funktion
den Status abfragt, ist in der entsprechenden Beschreibung vermerkt. Falls der Control-C
Status gesetzt ist, wird bei jedem INT 21-Funktionsaufruf auf Control-C abgeprüft.
Achtung: Falls ein Programm die Funktionen 06H oder 07H (Direct
Console I/O) benutzt und das Zeichen Ctrl-C als Wert eingelesen
werden soll, muß vorher das Flag auf »AusFehler! Verweisquelle konnte
nicht gefunden werden.4.48.2 Get/Set State (Funktion AX=3302H)
Ab DOS 3.0 erlaubt die Funktion den undokumentierten Aufruf mit AL = 02H. Der Aufruf
wird in der Regel nur intern durch DOS benutzt, wobei folgende Aufrufschnittstelle gilt:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 33H (Control-C Check)
°
° AL: 02H (Get/Set State)
°
° DL: 00H Set Break OFF
°
°
01H Set Break ON
°
û-------------------------------À
°
RETURN
°
° AL: Status
°
° DL: alter Wert von Break
°
Û-------------------------------ì
Mit diesem Aufruf wird der Zustand des Break-Flags gesetzt und gleichzeitig der alte
Zustand zurückgegeben (exchange). Vor dem Aufruf ist in DL der neue Zustand für Break
(0 = OFF, 1 = ON) zu setzen. Nach dem Aufruf enthält das Register DL dann den alten
Zustand (0 = OFF, 1 = ON) des Break-Flags. Findet sich im Register AL der Wert FFH,
trat beim Aufruf ein Fehler auf.
Ab DOS 3.0 benutzt die Funktion keinen der internen DOS-Stacks, so daß ein Aufruf aus
TSR-Programmen und Interruptroutinen erlaubt ist.
4.48.3 Get Boot Drive (Funktion AX=3305H)
In DOS 4.x wurde der Funktionsumfang nochmals erweitert. Ab DOS 4.0 läßt sich mittels
der INT 21-Funktion 33H auch das Bootlaufwerk abfragen. Hierzu gelten folgende
Aufrufparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
219
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 33H (Control-C Check)
°
° AL: 05H (Get Boot Device)
°
û-------------------------------À
°
RETURN
°
° AL: FF Fehler
°
° AL: 00 -> ok
°
° DL: Bootdrive
°
Û-------------------------------ì
Vor dem Aufruf ist der Inhalt des Registers AL auf den Wert 05H zu setzen. Enthält AL
nach dem Aufruf den Code FFH, wird die Funktion nicht unterstützt. Ist der Wert in AL =
5, wurde das Laufwerk ermittelt. Anschließend gibt die Funktion im Register DL den Code
des Bootlaufwerkes zurück. Hierbei gilt:
DL = 1
2
3
->
->
->
A:
B:
C:
4.48.4 Get Version/Location (Funktion AX=3306H)
Diese Subfunktion ist erst ab DOS 5.0 implementiert und gibt die wirkliche DOSVersionsnummer, sowie ein Flag zurück. Hierzu gelten folgende Aufrufparameter:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 33H (Get Version)
°
° AL: 05H
°
û-------------------------------À
°
RETURN
°
° AL: FF -> Fehler
°
° AL: 00 -> ok
°
° BX: DOS-Version
°
° DX: Bitflag
°
Û-------------------------------ì
Vor dem Aufruf ist der Inhalt des Registers AL auf den Wert 06H zu setzen. Enthält AL
nach dem Aufruf den Code FFH, wird die Funktion nicht unterstützt. Ist der Wert in AL =
6, wurde die wirkliche DOS-Version ermittelt. In BH steht dann die Unterversion und in
BL die Hauptversion. Der Inhalt von DX ist als Bitfeld zu interpretieren.
Hierbei gilt folgende Belegung:
DX Bit 12: 1 DOS im HMA-Bereich geladen
11: 1 ROM-Version des Betriebssystems
3-10: 0 reserviert
0- 2:
Revisionsnummer (0 .. 7)
Interessant ist vor allem Bit 12, mit dem sich prüfen läßt, ob Teile von DOS im HMABereich geladen wurden. Alle Aufrufe der Funktion 33H sind reentrant implementiert.
Wird bei der Funktion 33H in AL ein ungültiger Code (ungleich 0, 1, 2, 5 oder 6)
übergeben, enthält AL nach dem Aufruf den Wert FFH.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
220
4.49 Get DOS Critical Interval Flag (Funktion 34H, DOS 2.0 6.x)
Hier handelt es sich ebenfalls um eine erst ab DOS 5.0 dokumentierte Funktion, die
normalerweise nur intern durch DOS benutzt wird. Es gelten folgende
Aufrufkonventionen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
34H
°
û-------------------------------À
°
RETURN
°
° ES:
Segmentadresse Flag
°
° BX:
Offsetadresse Flag
°
Û-------------------------------ì
Nach dem Aufruf gibt DOS die Adresse des Critical Interval Flags im Registerpaar ES:BX
zurück. Das Flag ist gemäß folgender Notation kodiert:
Flag ° Bedeutung
-------é----------------------------------------------------0 ° Die DOS-Resourcen sind für den rufenden Prozeß frei
>= 1 ° DOS befindet sich gerade in einem kritischen Bereich
° Der rufende Prozeß kann keine Betriebsmittel belegen
Was hat es nun aber mit diesem Flag auf sich? DOS wurde als Single-User, SingleTasking-Betriebssystem entworfen. Um die Implementierung möglichst einfach zu halten,
sind die Funktionsaufrufe nicht reentrant ausgeführt. Ruft nun ein aktiver Prozeß eine
INT 21-Funktion oberhalb 0CH auf, legt DOS Zwischenergebnisse in einem internen
Arbeitsbereich ab. Vor einer Rückkehr in den laufenden Prozeß werden diese Daten wieder
restauriert. Es besteht aber durchaus die Möglichkeit, daß ein zweiter Prozeß (z.B. durch
einen Interrupt gestartet) die DOS-Funktion unterbricht. Ruft dieser Prozeß ebenfalls die
INT 21-Funktionen auf, wird der Inhalt des internen DOS-Arbeitsbereiches nicht auf dem
Stack gesichert, sondern die Ergebnisse werden einfach überschrieben. Sobald der gerade
laufende Prozeß beendet ist, kann auch der unterbrochene Prozeß wieder aktiviert werden.
Leider ist der interne DOS-Arbeitsbereich zerstört, so daß die Funktion in der Regel falsche
Ergebnisse liefert.
Um Programme wie PRINT von MS-DOS dennoch im Hintergrund betreiben zu können,
besitzt DOS ein internes Flag, welches anzeigt, ob sich gerade eine INT 21-Funktion in
einem kritischen Bereich befindet. Ist dies der Fall, darf der INT 21 nicht ein zweites Mal
aufgerufen werden. Der rufende Prozeß muß so lange warten, bis das Flag den Wert 0
besitzt. Erst dann kann z.B. eine Disk-I/O-Operation über den INT 21 abgesetzt werden.
Das Byte an der Adresse ES:BX+1 wird in der DOS-Version 2.x als Critical-Error-Flag
verwaltet. In DOS 3.x befindet sich dieses Flag an der Adresse ES:BX-1. Nur bei der DOS3.0-Version von Compac befindet sich das Flag an der Adresse ES:BX-1AAH. Ab DOS
3.1 läßt sich die Lage des Critical-Error-Flag über die undokumentierte Funktion
AX=5D06H ermitteln. Ein Programm sollte immer prüfen, ob Critical-Interval-Flag und
Critical-Error-Flag den Wert 0 besitzen, bevor sie einen laufenden DOS-Funktionsaufruf
unterbrechen. Weitere Hinweise bezüglich des Umgangs mit residenten Programmen und
den Flags finden sich im Abschnitt über die TSR-Programmierung und in (1).
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
221
4.50 Get Interrupt Vektor (Funktion 35H, DOS 2.0 - 6.x)
Soll ein Interruptvektor gelesen werden, muß die Funktion 35H benutzt werden, um die
Konsistenz
sicherzustellen.Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
35H
°
° AL:
Interrupt Nummer
°
û-------------------------------À
°
RETURN
°
° ES:BX Interrupt Vektor
°
Û-------------------------------ì
Im Register AL ist die entsprechende Interrupt-Nummer zu hinterlegen.
Der gelesene Vektor besteht aus einer Segmentadresse, die in ES zurückgegeben wird. Die
Offsetadresse findet sich in BX.
Es besteht natürlich die Möglichkeit, einen Interruptvektor direkt zu lesen. Falls aber bei
dieser Operation ein Interrupt auftritt, der den Vektor verändert, dann ist das Ergebnis nicht
definiert. Aus diesem Grund sollen alle Operationen auf der Interrupt-Tabelle mittels der
Funktionen 25H und 35H erfolgen.
4.51 Get Free Disk Space (Funktion 36H, DOS 2.0 - 6.x)
Diese Funktion gibt die Zahl der freien Cluster innerhalb des Speichermediums zurück.
Damit läßt sich der freie Speicherbereich auf einer Diskette/Platte bestimmen. Es gelten
folgende
Aufrufkonventionen:Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
36H
°
° DL:
Drive Nummer
°
û-------------------------------À
°
RETURN
°
° AX:
Sektoren per Cluster
°
° BX:
Freie Cluster
°
° CX:
Byte pro Sektor
°
° DX:
Cluster pro Drive
°
Û-------------------------------ì
Im Register DL wird das Laufwerk angegeben, wobei die übliche MS-DOS-Kodierung (0
= Default Drive, 1 = A:, 2 = B:, ...) gilt. Falls das angegebene Laufwerk nicht existiert,
enthält das Register AX nach dem Aufruf den Wert 0FFFFH als Fehlercode. Bei Zugriffen
auf Diskettenlaufwerke löst DOS einen INT 24 aus, falls die Diskette nicht eingelegt ist.
Ansonsten gibt die Funktion in den Registern AX, BX, CX und DX verschiedene
Informationen über die Belegung des Speichermediums zurück.
DOS unterteilt eine Diskette/Platte in logische Speichereinheiten (Cluster), in denen die
Daten dann abgelegt werden. Ein Cluster besitzt immer ein Vielfaches der Speichergröße
eines Sektors. Die Zahl der Sektoren pro Cluster wird im AX-Register zurückgegeben. Im
Register BX findet sich die Zahl der freien Cluster innerhalb des Speichermediums,
während DX die Gesamtzahl der Cluster des Speichermediums anzeigt. In CX steht noch
die Zahl der Byte pro Sektor (512 Byte Standard).
Die freie Kapazität in Byte läßt sich leicht durch Multiplikation der Registerinhalte DX *
AX * CX ermitteln.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
222
Mit dieser Funktion werden die älteren Aufrufe 1BH und 1CH ersetzt, die bei
Neuentwicklungen nicht mehr benutzt werden sollten.
4.52 Get/Set Switch Character (Funktion 37H, DOS 2.0 - 6.x)
Die nicht dokumentierte Funktion 37H ist für den internen MS-DOS-Gebrauch reserviert.
Sie dient dazu, das Switch-Zeichen zu setzen oder zu lesen. Allerdings macht die
Verwendung nur unter DOS 2.x einen Sinn.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
37H
°
° AL:
Subcode
°
° DL:
Hilfsregister
°
û-------------------------------À
°
RETURN
°
° CY:
1 = Fehler
°
° AX:
Fehlercode
°
° CY:
0 = kein Fehler
°
° DL:
Ergebnisregister
°
Û-------------------------------ì
Der DIR-Befehl benutzt zum Beispiel standardmäßig ein solches Zeichen (/). Mit dem
Befehl DIR /W wird dann eine erweiterte Bildschirmdarstellung selektiert. In DOS 2.x ist
es möglich, dieses Zeichen zu beeinflussen. So kann das /-Zeichen durch einen Bindestrich
oder ein Gleichheitszeichen = ersetzt werden. Für die Funktion 37H gelten dabei folgende
Aufrufparameter:
Im Register AL wird dabei ein Code zur Selektion der jeweiligen Unterfunktion übergeben.
Der Aufruf erlaubt es, die Unterfunktionen 0 bis 3 aufzurufen.
AL = 00H (Get Switch Character)
Mit dieser Unterfunktion läßt sich das eingestellte Zeichen abfragen. Die Funktion gibt
dann den ASCII-Code des Zeichens im Register DL zurück. Dies erfolgt jedoch nur, falls
das Carry-Flag nicht gesetzt ist. Andernfalls findet sich in AX ein Fehlercode.
AL = 01H (Set Switch Character)
Mit dieser Unterfunktion läßt sich die Einstellung des Switchcharacters ändern. Das neue
Zeichen wird dabei im Register DL übergeben. Nach einem fehlerfreien Aufruf enthält das
Register DL dann das eingestellte Zeichen. Andernfalls findet sich im Register AX ein
Fehlercode.
AL = 02H (Get Device Access Mode)
In DOS 2.x besteht die Möglichkeit, Ein-/Ausgaben von und zu Geräten über PseudoDateien abzuwickeln. Dabei wird ein Gerätename in einem Unterverzeichnis \DEV
eingetragen. Anschließend behandelt DOS dieses Gerät wie eine Datei, wobei aber die
Zeichen an das Gerät weitergereicht werden. Eine Eingabe \DEV\LPT1 leitet dann die
Zeichen für den Drucker in die Pseudo-Datei LPT1 um.
Physikalisch gelangen die Daten aber zum Drucker. Bei DOS 2.x muß vorher in
CONFIG.SYS allerdings die Einstellung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
223
AVAILDEV = FALSE
gesetzt werden. Der Befehl wurde in DOS 3.x nicht übernommen, da es Probleme in einer
Netzwerkmgebung geben kann. Allerdings blieb der INT 21-Funktionsaufruf 37H erhalten.
Nach einem Aufruf mit dem Untercode AL = 02H enthält das Register DL den Status. Der
Wert 00 signalisiert, daß die Geräte nur über die Pseudo-Einheit erreichbar sind.
Andernfalls wird 0FFH zurückgegeben. In DOS 4.x und 5.x liefert die Funktion den Wert
AL=FFH zurück.
AL = 03H (Set Device Access Mode)
Mit dem Unterfunktionscode 03H läßt sich per INT 21 die Einstellung der Funktion
AVILDEV beeinflussen. Der neue Wert wird per Register DL übergeben. Mit 00H lassen
sich anschließend die Geräte nur noch über die Pseudo-Einheit \DEV erreichen. Die
Eingabe DL = 0FFH schaltet die Einstellung wieder zurück. Nach dem Aufruf enthält das
DL-Register die aktuelle Einstellung. Der Aufruf wird ab DOS 4.0 komplett ignoriert.
Die Funktion wurde bei DOS 2.x eingeführt. Allerdings unterstützen nicht alle Programme
die modifizierten Switchcodes. Ab DOS 3.x wurde dann die AVILDEV-Funktion wieder
entfernt, um Konsistenzprobleme in Netzwerkumgebungen vorzubeugen. DOS 4.x
speichert noch das Trennzeichen, wertet es aber nicht aus. In DOS 5.0 wird selbst das
Zeichen nicht mehr gespeichert. Der Funktionsaufruf 37H blieb aber erhalten.
4.53 Get/Set Country Data (Funktion 38H)
Die Funktion wird bereits ab DOS 2.0 unterstützt, besitzt aber je nach Version
verschiedene Übergabeparameter. Sie dient dazu, die landesspezifischen Informationen
abzufragen und zu verändern.
4.53.1 Get Country Data (Funktion 38H, DOS 2.x)
Für DOS 2.1 gelten folgende Übergabeparameter, um die Daten zu lesen.
Ö-------------------------------Ì
°
CALL: INT 21 (DOS 2.x) °
°
°
° AH:
38H
°
° AL:
00H
°
° DS:DX Zeiger auf einen Puffer°
û-------------------------------À
°
RETURN
°
° CY:
1 = Fehler
°
° AX:
Fehlercode
°
° CY:
0 = kein Fehler
°
° DS:DX Zeiger auf einen Puffer°
Û-------------------------------ì
Der Wert im Register AL muß vor dem Aufruf (DOS 2.1) zu Null gesetzt werden. Im
Registerpaar DS:DX findet sich ein Zeiger auf einen 32-Byte-Puffer, der vom rufenden
Prozeß angelegt wird. In diesen Puffer übergibt die Funktion die landesspezifischen Daten,
die gemäß folgender Aufstellung kodiert werden:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
224
Ö-------Ú----------------------------------------------Ì
° Bytes ° Bedeutung
°
û-------é----------------------------------------------À
° 2
° Datums- und Zeitformat
°
û-------é----------------------------------------------À
° 2
° ASCIIZ-String für das Währungssymbol
°
û-------é----------------------------------------------À
° 2
° ASCIIZ-String für die Tausender Markierung
°
û-------é----------------------------------------------À
° 2
° ASCIIZ-String für die Dezimal
Markierung
°
û-------é----------------------------------------------À
° 24
° reserviert
°
Û-------Ù----------------------------------------------ì
Tabelle 4.7: Puffer für die Landesinformationen; (DOS 2.x)
Für das Datums- und Zeitformat gelten in DOS 2.1 folgende Kodierungen:
Ö-------Ú----------------------------------------------Ì
° Code ° Format
°
û-------é----------------------------------------------À
° 0
° USA Std:Min:Sek Monat/Tag/Jahr
°
û-------é----------------------------------------------À
° 1
° Europa Std:Min:Sek Tag/Monat/Jahr
°
û-------é----------------------------------------------À
° 2
° Japan Std:Min:Sek
Jahr/Monat/Tag
°
Û-------Ù----------------------------------------------ì
Tabelle 4.8: Kodierung der Uhrzeit; (DOS 2.x)
Die nachfolgenden Felder enthalten ASCIIZ-Strings (ASCII-Zero-String), deren erstes
Byte jeweils das Zeichen für das Währungssysmbol, die Tausender-Markierung und das
Dezimalzeichen enthält. Die ASCIIZ-Strings werden durch ein Nullbyte (00H)
abgeschlossen. Die restlichen 24 Byte werden bei DOS 2.1 nicht benutzt.
Bei DOS 2.0 gelten die gleichen Aufrufkonventionen, wobei die ASCII-Strings nur aus
einem Byte bestehen. Es handelt sich also nicht um ASCIIZ-Strings, so daß das Nullbyte
fehlt. In DOS 2.0 bleiben 27 Byte innerhalb der Datentabelle unbenutzt.
Bei allen DOS-Versionen unter 3.0 lassen sich nur die landesspezifischen Informationen
abfragen, aber nicht setzen.
4.53.2 Get Country Data (Funktion 38H, DOS 3.0 - 6.x)
Ab DOS 3.0 lassen sich mit dieser Funktion landesspezifische Informationen setzen und
abfragen. Es gelten folgende Übergabeparameter, um die Daten zu lesen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
225
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
38H
°
° AL:
Steuercode
°
° BX:
Landescode (16 Bit)
°
° DS:DX Zeiger auf einen Puffer°
û-------------------------------À
°
RETURN
°
° CY:
1 = Fehler
°
° AX:
Fehlercode
°
° CY:
0 = kein Fehler
°
° BX:
Landescode
°
Û-------------------------------ì
Das Betriebssystem MS-DOS ist in der Lage, sich auf landesspezifische Besonderheiten
(Datumsschreibweise, Währungen, Separatoren für Zeit etc.) einzustellen. Der Wert im
Register AL steuert dabei die Aktionen der Funktion 38H. Es gelten folgende Belegungen:
Ö--------------Ú-------------------------------------------------Ì
° AL = 0
° lese die Daten des aktuell eingestellten Landes °
û--------------é-------------------------------------------------À
° AL = 1 - FEH ° spezifiziert den gewünschten Landescode
°
û--------------é-------------------------------------------------À
° AL = FFH
° Der Landescode besitzt einen Wert über 255 und °
°
° wird im Register BX übergeben
°
û--------------é-------------------------------------------------À
° BX
° 16 Bit Landescode, falls der Wert > 255 ist
°
Û--------------Ù-------------------------------------------------ì
Tabelle 4.9: Übergabe des Landescodes (DOS 3.x - 6.x)
Das Register AL besitzt eine Mehrfachfunktion. Falls der Wert = 0 ist, werden die Daten
des aktuell eingestellten Landes gelesen. Werte zwischen 01H und 0FEH spezifizieren
einen bestimmten Landescode, dessen Parameter gelesen werden sollen. Falls der
Landescode über 255 liegt, wird der Wert von AL auf 0FFH gesetzt. Dies signalisiert, daß
sich der eigentliche Landescode im Register BX befindet.
Der Landescode lehnt sich an der internationalen Telefonvorwahl an. Folgende kleine
Tabelle enthält einen Auszug aus diesen Codes.
Ö---------------------Ú----------------------Ú-------------------Ì
° 01 USA / Kanada
°
34 Spanien
° 47 Norwegen
°
° 07 UDSSR
°
39 Italien
° 48 Polen
°
° 30 Griechenland
°
41 Schweiz
° 49 Deutschland
°
° 31 Niederlande
°
44 Großbritannien ° 61 Australien
°
° 32 Belgien
°
45 Dänemark
° 81 Japan
°
° 33 Frankreich
°
46 Schweden
°
°
Û---------------------Ù----------------------Ù-------------------ì
Tabelle 4.10: Auszug aus der Landescode-Tabelle
Da die Funktion verschiedene Daten zurückgibt, muß im rufenden Programm ein
Speicherbereich von 34 Byte reserviert werden. Das Registerpaar DS:DX enthält einen
Zeiger auf diesen Speicherblock.
Die landesspezifischen Daten werden dann in dem 32-Byte-Feld abgelegt. Es gilt folgender
Aufbau des Feldes:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
226
Ö--------Ú-------Ú------------------------------------------Ì
° Offset ° Bytes ° Bemerkung
°
û--------é-------é------------------------------------------À
°
00
°
2
° Datumsformat
°
°
02
°
5
° Währungssymbol (ASCIIZ - String)
°
°
07
°
2
° Trennzeichen Tausender (ASCIIZ - String) °
°
09
°
2
° Dezimalzeichen (ASCIIZ - String)
°
°
0B
°
2
° Trennzeichen Datum (ASCIIZ - String)
°
°
0D
°
2
° Trennzeichen Zeit (ASCIIZ - String)
°
°
0F
°
1
° Bitfeld für weitere Kodierungen
°
°
10
°
1
° Währungsformat
°
°
11
°
1
° Zeitdarstellung
°
°
12
°
4
° Case Map Call Adresse für Codes > 7FH
°
°
16
°
2
° Data List Separator (ASCIIZ - String)
°
°
18
° 10
° reserviert
°
Û--------Ù-------Ù------------------------------------------ì
Tabelle 4.11: Belegung des Feldes mit den landesspezifischen Informationen
Bei den ASCIIZ-Strings handelt es sich um Zeichenketten, die durch ein Nullbyte (00H)
abgeschlossen werden. Die Bedeutung der einzelnen Einträge läßt sich noch weiter aufgliedern. Das Datumsformat (Offset 02H) wird in drei verschiedenen Formaten ausgegeben:
0 = USA (m/d/y)
1 = Europa (d/m/y)
2 = Japan (y/m/d)
Für das Währungssymbol ist ein String von 5 Zeichen (Offset 02H) vorgesehen. Die
Darstellung innerhalb der Ausgabe wird durch das Bitfeld kodiert.
2 1 0
Ö-Ú-Ú-Ì
ÛÚÙÚÙÚì
° ° Û° °
° °
° °
° Û--°
°
Û-----
0
1
Währungssymbol vor die Zahl stellen
Währungssymbol hinter die Zahl stellen
0
1
kein Leerzeichen zwischen Zahl und Währungssymbol
Leerzeichen zwischen Zahl und Währungssymbol
1
Das Dezimalzeichen wird durch das Währungssymbol
ersetzt
Bild 4.5: Kodierung des Bitfeldes
Die restlichen Bits sind undefiniert. Das Feld Währungssymbol (Offset 10H) gibt an, wie
viele Stellen nach dem Dezimalpunkt auszugeben sind (Beispiel: 2 Stellen bei DM).
Das Zeitformat ermöglicht eine Ausgabe im 12- oder 24-Stunden-Format:
Code ° Darstellung
------é------------------0 ° 12 Stunden Uhrzeit
1 ° 24 Stunden Uhrzeit
Die Case Map Call Address bezeichnet einen Vektor (Segment:Offset), der auf eine
Routine zeigt, die die Konvertierung von Klein- in Großbuchstaben vornimmt. Dies sind
die Zeichen im Bereich 80H bis FFH. Da diese Konvertierung landesspezifisch ist, existiert
hier eine eigene Prozedur. Diese wird mit einem FAR CALL auf diese Adresse aktiviert.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
227
Ö-------------------------------Ì
°
FAR CALL auf Case°
°
MAP Adresse
°
°
°
° AL: zu wandelndes Zeichen
°
û-------------------------------À
°
RETURN
°
° AL: gewandeltes Zeichen
°
Û-------------------------------ì
Das zu wandelnde Zeichen wird im AL-Register übergeben. Falls ein Großbuchstabe zu
diesem Zeichen existiert, gibt die Funktion das Ergebnis im AL-Register zurück. Falls kein
Zeichen existiert, oder der Wert kleiner als 80H war, bleibt der Urwert im Register AL
erhalten.
Der Versuch das Zeichen ß zu konvertieren, dürfte zu einem solchen Ergebnis führen. Die
Umsetzungsroutine benutzt nur das AL-Register und die Flags.
Falls beim Aufruf der Funktion 38H ein Fehler auftritt, wird das Carry-Flag gesetzt. Im
Register AL findet sich dann ein Fehlercode mit folgender Bedeutung:
Code ° Bedeutung
------é-------------------------------------2 ° falscher oder unbekannter Landescode
Den erweiterten Fehlercode kann man über den Funktionsaufruf 59H (Get Extended Error)
abfragen.
4.53.3 Set Country Data (Funktion 38H, DOS 3.0 - 6.x)
Die Funktion 38H dient auch dazu, bestimmte landesspezifische Einstellungen zu setzen.
Es gelten dann folgende Übergabeparameter:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
38H
°
° DX:
0FFFFH -> setze Daten °
° AL:
Steuercode
°
° BX:
Landescode
°
û-------------------------------À
°
RETURN
°
° CY:
1 = Fehler
°
° AX:
Fehlercode
°
° CY:
0 = kein Fehler
°
Û-------------------------------ì
Falls das Register DX den Wert -1 (0FFFFH) enthält, setzt die Funktion den im Register
übergebenen Landescode. Da DX normalerweise die Offsetadresse des Ergebnispuffers
enthält, scheint sich hier ein Problem zu ergeben. Da aber der Puffer nicht über eine
Segmentgrenze hinausreichen kann, ist der größte erlaubte Offsetwert 0FFFDH. Der Code
0FFFFH ist also frei.
Die Kodierung des Landes erfolgt analog dem oben beschriebenen Muster:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
228
Ö--------------Ú-------------------------------------------------Ì
° AL = 1 - FEH ° spezifiziert den gewünschten Landescode
°
û--------------é-------------------------------------------------À
° AL = FFH
° Der Landescode besitzt einen Wert über 255 und °
°
° wird im Register BX übergeben
°
û--------------é-------------------------------------------------À
° BX
° 16 Bit Landescode, falls der Wert > 255 ist
°
Û--------------Ù-------------------------------------------------ì
Tabelle 4.12: Übergabe Landescode (DOS 3.x - 4x)
Tritt ein Fehler auf, z.B. der Landescode existiert nicht, ist das Carry-Flag nach dem Aufruf
gesetzt. Im Register AL steht der Wert 2 (Landescode ungültig oder es existiert keine
Tabelle für diesen Code).
Weiterhin lassen sich die erweiterten Fehlercodes über den Aufruf 59H (Get Extended
Error) abfragen.
DOS kann intern nur die Landescodes 01 (USA) und 61 (Australien) bearbeiten. Andere
Ländercodes werden über die speziellen Tastaturtreiber (z.B. KEYBGR, oder
COUNTRY.SYS) unterstützt. Diese sind beim Systemstart mittels der Datei
AUTOEXEC.BAT zu aktivieren. Weiterhin muß das Programm NLSFUNCTION geladen
sein. Neben der Umcodierung der Tastatur generieren sie auch die landesspezifischen
Daten.
Wenn nun ein solcher Treiber aktiviert wird, lädt DOS den Code in den unteren Bereich
des Anwenderprogrammspeichers. Von der Routine wird der Interruptvektor der Tastatur
auf den Treiber umgesetzt. Damit ist die landesspezifische Umsetzung der
Tastatureingaben installiert. Durch gleichzeitiges Betätigen der Tasten <Ctrl><Alt><F1>
läßt sich die Original-US-Darstellung reaktivieren. Mit <Ctrl><Alt><F2> gelangt man
wieder in die landesspezifische Darstellung zurück. Die Umschaltung erfolgt innerhalb des
Treibers, der zusätzlich die Umsetztabelle für die US-Version besitzt. Falls die
Tastaturanpassung lediglich über BIOS-ROM-Routinen unterstützt wird, ist die
Umschaltung allerdings meist nicht möglich.
4.54 Create Directory (Funktion 39H, DOS 2.0 - 6.x)
Diese Funktion erzeugt ein Unterverzeichnis in der File-Allocation-Tabelle (FAT).
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
229
Unterverzeichnis erzeugen
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
39H
°
° DS:DX Zeiger auf den ASCIIZ- °
°
String mit dem Pfad
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
°
kein Fehler
°
Û-------------------------------ì
Im Register DS:DX findet sich ein Zeiger, der auf einen ASCIIZ-String mit dem
Pfadnamen zeigt. Dieser wird mit einem Nullbyte abgeschlossen. Falls bei der Operation
ein Fehler auftritt, ist bei der Rückkehr das Carry-Flag gesetzt.
Im AX-Register findet sich ein Fehlercode:
Code ° Bedeutung
------é----------------------------------------------------3 ° Pfad nicht gefunden
5 ° Unterverzeichnis nicht anlegbar, Zugriff abgewiesen
Der Fehlercode 5 kann mehrere Ursachen haben:
·
Es ist kein Eintrag im Hauptinhaltsverzeichnis; mehr frei.
·
Es existiert bereits eine Datei mit dem Namen des Unterverzeichnisses.
·
Der Pfad gibt ein Laufwerk ohne Subdirectory an.
In allen diesen Fällen kann kein Unterverzeichnis angelegt werden.
Über die Funktion 59H lassen sich die erweiterten Fehlercodes abfragen. Bei
Anwendungen innerhalb eines Netzwerkes (ab DOS 3.1) muß der Prozeß das CreateAccess-Zugriffsrecht besitzen. Die maximale Länge des ASCIIZ-Strings mit dem
Pfadnamen darf 64 Zeichen nicht überschreiten.
4.55 Remove Directory (Funktion 3AH, DOS 2.0 - 6.x)
Diese Funktion löscht ein Unterverzeichnis in der File-Allocation-Tabelle (FAT), falls das
Verzeichnis keine Dateien mehr enthält.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
3AH
°
° DS:DX Zeiger auf den ASCIIZ -°
°
String mit dem Pfad
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
°
kein Fehler
°
Û-------------------------------ì
Im Register DS:DX findet sich ein Zeiger, der auf einen ASCIIZ-String mit dem
Pfadnamen zeigt. Falls bei der Operation ein Fehler auftritt, ist bei der Rückkehr das CarryFlag gesetzt. Im AX-Register findet sich ein Fehlercode:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
230
DOS Programmierhandbuch
Code ° Bedeutung
------é-----------------------------3 ° Pfad nicht gefunden
5 ° Zugriff abgewiesen
16 ° aktuelles Inhaltsverzeichnis
Der Fehlercode 5 kann mehrere Ursachen haben:
·
Das Unterverzeichnis ist nicht leer.
·
Der Pfad gibt kein Unterverzeichnis an.
·
Es wurde versucht, das Hauptverzeichnis zu löschen.
·
Es existiert kein Eintrag mit dem angegebenen Namen.
Der Fehler 16 gibt an, daß versucht wurde, daß aktuelle Unterverzeichnis zu löschen. Es ist
jedoch nur möglich, aus dem aktuellen Verzeichnis die jeweiligen Unterverzeichnisse zu
löschen. Die Ursache liegt unter anderem in der Directory-Struktur begründet.
Über die Funktion 59H lassen sich die erweiterten Fehlercodes ermitteln. Falls kein Fehler
auftritt, wird das Unterverzeichnis aus dem Inhaltsverzeichnis entfernt.
Bei Zugriffen innerhalb eines Netzwerkes wird vom rufenden Prozeß das Create-AccessPrivileg verlangt.
4.56 Change Current Directory (Funktion 3BH, DOS 2.0 - 6.x)
Diese Funktion selektiert
Übergabeparameter definiert:
das
angegebene
Unterverzeichnis.
Es
sindfolgende
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
3BH
°
° DS:DX Zeiger auf den ASCIIZ -°
°
String mit dem Pfad
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
°
kein Fehler
°
Û-------------------------------ì
Im Register DS:DX findet sich ein Zeiger, der auf einen ASCIIZ-String mit dem
Pfadnamen zeigt. Hierbei kann es sich auch um eine unvollständige Pfadangabe handeln.
Falls bei der Operation ein Fehler auftritt, ist bei der Rückkehr das Carry-Flag gesetzt. Im
AX-Register findet sich ein Fehlercode:
Code ° Fehler
--------é--------------------3
° Pfad nicht gefunden
Die erweiterten Fehlercodes lassen sich über die Funktion 59H ermitteln. Der String des
Pfadnamens ist auf 64 Zeichen begrenzt. Diese Beschränkung gilt auch für Pfadnamen, die
innerhalb der DOS-Kommandoebene eingegeben werden. Falls der Pfad nicht existiert,
oder falls der Pfad unkorrekt ist, dann bricht die Funktion ohne Änderungen ab. Im
Pfadnamen darf kein Zugriff auf einen Netzwerkknoten spezifiziert werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
231
4.57 Create Handle (Funktion 3CH, DOS 2.0 - 6.x)
Diese Funktion gehört zu den neueren MS-DOS-File-I/O-Befehlen. Sie erzeugt eine leere
Datei und ordnet dieser den ersten freien Filehandle zu. Der Begriff Handle wird in einem
eigenen Kapitel beschrieben. Es sind folgende Übergabeparameter definiert:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
3CH
°
° DS:DX Zeiger auf den ASCIIZ -°
°
String mit dem Pfad
°
° CX:
Fileattribut
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° AX:
Handle
°
Û-------------------------------ì
Im Registerpaar DS:DX findet sich ein Zeiger auf den ASCIIZ-String mit dem Pfadnamen.
In CX lassen sich die Dateiattribute ablegen. Diese Attribute werden im Rahmen der
Funktion 43H besprochen.
Falls die angegebene Datei noch nicht existiert, legt DOS sie an. Andernfalls wird die
bestehende Datei auf die Länge 0 begrenzt. Damit geht der Dateiinhalt verloren und läßt
sich mit Undelete-Tools nicht wieder restaurieren.
Deshalb ist ab DOS 3.0 die Funktion 5BH zu bevorzugen.
Die Attribute in CX werden dann dieser Datei zugewiesen. Falls ein Fehler auftritt, ist bei
der Rückkehr das Carry-Flag gesetzt. Im Register AX findet sich ein Fehlercode:
Code ° Bedeutung
------é-------------------------3 ° Pfad nicht gefunden
4 ° zu viele offene Dateien
5 ° Zugriff abgewiesen
Der Fehler 5 tritt auf, falls kein Platz im Inhaltsverzeichnis für eine neue Datei vorhanden
ist, oder falls der Name bereits für ein Unterverzeichnis vergeben wurde. Weiterhin kann
der Zugriff abgewiesen werden, falls eine Datei mit dem Namen besteht, deren Attribute
aber eine Veränderung nicht zulassen (z.B. Read Only). Mit der DOS-Funktion 59H lassen
sich die erweiterten Fehlercodes abfragen.
Tritt kein Fehler auf, öffnet die Funktion die Datei für Schreib-/Leseoperationen und
positioniert den Zeiger auf das erste Byte der Datei. Soll das Dateiattribut geändert werden,
läßt sich die Funktion 43H (Change Mode) verwenden. Der zugewiesene Filehandle wird
im Register AX zurückgegeben.
Bei Einsatz innerhalb eines Netzwerkes ist das Create-Access-Zugriffsrecht erforderlich.
Der Funktion 3CH fehlt allerdings eine Festlegung mit welchen SHARE-Flags die Datei zu
öffnen ist. Ab DOS 4.0 wurde deshalb die Funktion 6CH eingeführt. Eine Datei wird durch
die Funktion 3CH mit dem Code 02H (read/write) für den aktiven Prozeß geöffnet. Der
Zugriff ist für andere Netzwerkteilnehmer gesperrt. Diese Eigenschaft wird auch an
Subprozesse vererbt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
232
4.58 Open Handle (Funktion 3DH)
Bei diesem Aufruf handelt es sich um eine Xenix-orientierte Form der Dateibehandlung.
4.58.1 Open Handle (Funktion 3DH, DOS 2.x)
In DOS 2.x gelten jedoch etwas andere Aufrufkonventionen als bei den 3.x Versionen.
Diese Funktion öffnet eine bereits vorhandene Datei.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
3DH
(DOS 2.x)
°
° AL:
Zugriffscode
°
° DS:DX Zeiger auf den ASCIIZ -°
°
String mit dem Pfad
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° AX:
Filehandle
°
Û-------------------------------ì
Der Vektor DS:DX zeigt auf einen ASCIIZ-String (ASCII-Zero-String) mit dem
Pfadnamen. Das Register AL enthält den Zugriffscode (Accesscode):
Code ° Zugriffsart
------é---------------------------------------0 ° Datei für Lesezugriffe öffnen
1 ° Datei für Schreibzugriffe öffnen
2 ° Datei für Schreib-/Lesezugriffe öffnen
Der Aufruf bezieht sich auf Dateien mit dem Attribut normal oder hidden, die zusätzlich
mit dem im Pfad spezifizierten Namen übereinstimmen müssen. Falls der Name mit einem
Doppelpunkt (:) endet (z.B. PRN:), dann wird die Datei nicht geöffnet. Der Schreib-/
Lesezeiger wird auf das erste Byte der Datei positioniert und die Größe eines Records wird
auf den Wert 1 Byte initialisiert. Mittels der Funktion 42H läßt sich anschließend der
Zeiger innerhalb der Datei positionieren. Das Dateiattribut kann per Funktionsaufruf 43H
neu gesetzt werden, während der Aufruf 57H die Einträge für Uhrzeit und Datum
modifiziert.
Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt und im AX-Register
befindet sich ein Fehlercode. Es gelten die gleichen Fehlercodes wie bei der Funktion 59H
(Get Extended Error).
Läßt sich die Datei öffnen, befindet sich in AX anschließend der zugewiesene Handlecode.
Dieser wird für spätere I/O-Zugriffe auf diese Datei benötigt.
4.58.2 Open Handle (Funktion 3DH, DOS 3.0 - 6.x)
Dieser Aufruf gehört zu den Xenix-orientierten Systemdiensten, die Ein-/Ausgaben auf
Dateien oder I/O-Einheiten (Printer, Console etc.) ermöglichen. Die Funktion öffnet eine
vorhandene Datei, unabhängig von ihren Attributen, für Ein-/Ausgaben. Bei Namen, die in
DOS mit einem Doppelpunkt (:) enden (z.B. COM1:) wird kein Versuch unternommen,
eine entsprechende Datei zu öffnen, da ja eine Einheit angesprochen wurde. Allerdings darf
der Doppelpunkt beim Open-Aufruf nicht im String auftauchen, da er nur auf der
Kommandoebene gültig ist. Es gelten folgende Übergabekonventionen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
233
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
3DH (DOS 3.x)
°
° AL:
Access Code
°
° DS:DX Zeiger auf den ASCIIZ -°
°
String mit dem Pfad
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° AX:
Filehandle
°
Û-------------------------------ì
Im Registerpaar DS:DX befindet sich ein Zeiger auf einen ASCIIZ-String mit dem
Pfadnamen der Datei. Das Register AL enthält den Zugriffscode für die Datei. Hierbei
handelt es sich um ein Byte mit folgender Kodierung:
7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙÚÙ-ÙÚÙÚÙÚÙ-ÙÚì
° Û-Ú-ì ° Û-Ú-ì
°
°
°
Û---°
°
°
°
°
Û-------°
°
°
Û-----------°
Û----------------
Access Code
reserviert
Sharing Code
Inherit (vererbbar) Bit
Bild 4.6: Zugriffscodes für den Open-Handle-Aufruf;
Das Byte gibt an, welche Zugriffsrechte auf die Datei existieren.
Zugriffs-(Access-)Codes
Die Bits 0 bis 2 spezifizieren, ob die Datei zum Lesen oder Schreiben geöffnet wurde:
Ö-------Ú---------Ú----------------------------------------------Ì
° Wert ° Zugriff ° Bemerkung
°
û-------é---------é----------------------------------------------À
° 000 ° read
° Nur ein lesender Zugriff auf die Datei
°
û-------é---------é----------------------------------------------À
° 001 ° write ° Nur ein schreibender Zugriff auf die Datei
°
û-------é---------é----------------------------------------------À
° 010 ° both
° Schreib- und Lesezugriffe sind auf die Datei °
°
°
° erlaubt.
°
Û-------Ù---------Ù----------------------------------------------ì
Tabelle 4.13: File Access Codes;
Sharing Mode
Dieses Bitfeld (Bit 4, 5, 6) legt die Zugriffsberechtigung für verschiedene Prozesse
innerhalb eines Netzwerkes fest. Um zu den netzwerklosen DOS-Programmen kompatibel
zu bleiben, existiert ein Compatibility Mode. Wird eine Datei mit diesem Zugriffsmode
geöffnet, kann kein anderer Netzwerkteilnehmer mehr auf diese Datei zugreifen. Um einen
gleichzeitigen Zugriff von mehreren Netzwerkteilnehmern zu erlauben, kann ein Sharing
Code angegeben werden. Um diese Funktion allerdings zu nutzen, muß vorher das DOSKommando SHARE.COM geladen werden, um die netzwerkspezifischen Funktionen zu
installieren. Die folgende Tabelle spezifziert die Share-Zugriffsstufen sowie die Kodierung
des Bitfeldes:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
234
Code ° Zugriffsmode
------é--------------000 ° compatibility
001 ° deny both
010 ° deny write
011 ° deny read
100 ° deny non
Es sind nur diese Kombinationen zulässig. Innerhalb der einzelnen Zugriffsmodi gelten
unterschiedliche Bedingungen.
Compatibility Mode
Dieser Mode ermöglicht eine Kompatibilität zu Softwareprogrammen, die für einen
netzwerklosen Betrieb ausgerichtet sind. Ein Prozeß kann die Datei beliebig oft öffnen,
Zugriffe von anderen Netzwerkteilnehmern werden aber abgewiesen. Der Compatibility
Mode wird einer Datei zugewiesen, falls sie per:
·
CREATE-Funktionsaufruf
·
FCB-Funktionsaufruf
·
Handle-Funktionsaufruf mit Compatibility Mode
eröffnet wird. Falls die Datei bereits in einem anderen Mode eröffnet wurde, führt ein
weiterer Versuch mit dem Attribut Compatibility zu einem INT 24 (Critical Error). Es wird
die Meldung Drive not ready ausgegeben und eine Abfrage des Extended Error Codes zeigt
einen Sharing Violation Error an. Neben dem Compatibility Mode, welcher alle Zugriffe
fremder Prozesse abweist, läßt sich das Zugriffsrecht auch explizit spezifizieren.
Deny read/write
Mit diesem Mode kann ein Prozeß einen exklusiven Zugriff auf die Datei erwirken. Falls
die Datei erfolgreich mit diesem Mode geöffnet wird, kann nur noch der öffnende Prozeß
auf die Datei zugreifen. Alle Schreib-/Lesezugriffe anderer Prozesse (Netzwerkteilnehmer)
werden abgewiesen. Es ist auch nicht möglich, das Zugriffsrecht durch andere Prozesse zu
ändern. Lediglich der aktuelle Prozeß darf die Datei beliebig oft mit beliebigen Attributen
öffnen. Der Mode wird automatisch zurückgesetzt, falls die Datei geschlossen wird.
Deny write
Wird eine Datei mit diesem Attribut geöffnet, hat nur noch der aktuelle Prozeß das
Schreibzugriffsrecht, bis die Datei geschlossen wird. Alle Schreiboperationen anderer
Prozesse werden abgewiesen. Der Versuch einer Open-File-Anweisung mit dem Mode
Deny Write ist nicht möglich, falls die Datei bereits anderweitig mit dem Zugriffsrecht
Write Access eröffnet wurde.
Deny read
Eine mit diesem Mode eröffnete Datei weist alle Lesezugriffe fremder Prozesse zurück.
Der Mode wird automatisch beim File Close gelöscht. Der Versuch, die Datei mit Deny
Read zu öffnen, wird abgebrochen, falls die Datei bereits anderweitig im Compatibility
Mode oder mit dem Zugriffsrecht Read Access geöffnet wurde.
Deny none
Mit diesem Attribut werden keine Schreib-/Lesebeschränkungen für andere Prozesse
gesetzt. Der Aufruf ist nicht möglich, falls die Datei bereits anderweitig im Compatibility
Mode eröffnet wurde.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
235
Grundsätzlich gilt für Deny Read/Deny None, daß innerhalb eines Netzwerkes keine
lokalen Datenpuffer für die Dateien angelegt werden. Die Modes Deny Read/Write, Deny
Write und Compatibility arbeiten dagegen innerhalb eines Netzwerkes mit lokalen Puffern.
Inherit Bit
Dieses Bit gibt an, ob die Datei an Child Processes vererbt werden kann. Falls das Bit = 0
ist, kann die Datei auch aus einem Child Process bearbeitet werden, andernfalls ist sie nur
für den Hauptprozeß zugreifbar.
Das reservierte Bit 4 sollte immer auf den Wert 0 gesetzt werden.
Falls ein Fehler auftritt, wird das Carry-Flag gesetzt und AX enthält einen Fehlercode mit
folgender Kodierung:
Code ° Bedeutung
-----é------------------------------------------------------1 ° File Sharing muß geladen werden, um einen Sharing Code
° zu nutzen
°
2 ° Der Dateiname ist ungültig oder unbekannt
°
3 ° Der Pfadname ist ungültig oder unbekannt
°
4 ° Es ist kein Handle mehr frei, oder die intenen
° Systemtabellen laufen über
°
5 ° Das Programm versucht ein Unterverzeichnis oder das
° Volume Label als Datei zu öffnen
°
12 ° Der Zugriffcode ist nicht 0, 1 oder 2
Falls der Systemaufruf wegen eines File Sharing Errors abgebrochen werden muß, erzeugt
die Funktion einen INT 24 mit dem Code 2 (Drive not ready). Dieser Code läßt sich durch
die Funktion 59H abfragen.
Bei der Eröffnung der Datei müssen die Zugriffsrechte festgelegt werden. Standardmäßig
gilt der Compatibility Mode für frühere DOS-Versionen, die keinen Fremdzugriff erlauben.
4.59 Close Handle (Funktion 3EH, DOS 2.0 - 6.x)
Diese Funktion schließt eine Datei, die mit den Befehlen 3DH (Open Handle) oder 3CH
(Create Handle) eröffnet wurde.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
3EH
°
° BX:
Handle
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
6 = Invalid Handle
°
° Carry: nicht gesetzt
°
°
kein Fehler
°
Û-------------------------------ì
Im Register BX muß lediglich der Handle der Datei angegeben werden. Dieser Handlecode
wird bei der Create- oder Open-Handle-Operation zurückgegeben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
236
DOS lagert den Inhalt der Schreibpuffer auf das Medium aus und aktualisiert die Filegröße,
sowie Datum und Uhrzeit des letzten Schreibzugriffs. Im Netzwerk werden zusätzlich alle
mit Lock gesetzten Sperren auf der Datei aufgehoben.
Bei einem fehlerhaften Handle wird das Carry-Flag gesetzt und das Register AX enthält
den Fehlercode 6 Invalid Handle. Über die Funktion 59H lassen sich die erweiterten
Fehlercodes abfragen. Nach einem fehlerfreien Aufruf ist das Inhaltsverzeichnis
aktualisiert und die internen Puffer sind gelöscht. Weiterhin ist der betreffende Handle
wieder freigegeben (FFH im PSP).
4.60 Read from a File or Device (Funktion 3FH, DOS 2.0 6.x)
Diese Funktion erlaubt es, aus einer geöffneten Datei oder Einheit zu lesen. Es gelten die
Übergabeparameter der folgenden Tabelle.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
3FH
°
° BX:
Handle
°
° CX:
Zahl der zu lesenden
°
°
Bytes
°
° DS:DX Zeiger auf einen Puffer°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° AX:
Zahl der gelesenen
°
°
Bytes
°
Û-------------------------------ì
Neben der Nummer des Handle in BX wird die Zahl der zu lesenden Bytes im Register CX
geführt. So lassen sich auf einen Schlag bis zu 64 Kbyte lesen. Im Registerpaar DS:DX
findet sich ein Zeiger auf den Puffer, in dem die gelesenen Zeichen abgespeichert werden.
Der Lesezugriff auf Dateien erfolgt ab der aktuellen Position des Lesezeigers. Der Zeiger
wird anschließend um die Zahl der gelesenen Bytes verschoben.
Falls ein Fehler auftritt, ist das Carry-Flag gesetzt und im AX-Register findet sich ein
Fehlercode:
5
6
Handle nicht zum Lesen geöffnet
Handle nicht geöffnet, oder ungültig
Bei fehlerfreiem Zugriff ist das Carry-Flag = 0 und im Register AX steht die Zahl der
gelesenen Bytes. Der Versuch, hinter der EOF-Marke zu lesen, führt zum Wert AX = 0. Es
werden dann keine Zeichen gelesen. Die in CX angegebene Zeichenzahl kann nicht immer
erreicht werden. Ein Einlesen aus dem Tastaturpuffer bricht z.B. ab, sobald ein CR auftritt.
Wird CX = 0 gesetzt, läßt sich prüfen ob das Handle für Leseoperationen geöffnet ist, ohne
daß ein Zeichen übertragen wird.
Die Funktion erlaubt eine Umleitung der Einheiten. Bei Zugriffen auf Geräte unterscheidet
die Funktion über Bit 5 des Geräteattributes zwischen den Modes raw und cooked. Im raw
mode werden die gelesenen Daten nicht interpretiert. Für die Einheit CON: ist der Mode
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
237
cooked standardmäßig eingestellt. Dies bedeutet, daß bei I/O-Umleitungen über CON: die
Eingaben durch ein RETURN-Zeichen abzuschließen sind. Andernfalls terminiert die
Funktion nicht und das System muß neu gebootet werden.
Für einen Zugriff auf Dateien innerhalb eines Netzwerkes ist das Read-Access-Privileg
erforderlich. Wurde SHARE (oder ein anderer Netwerktreiber) geladen, sind Zugriffe auf
gesperrte Dateien oder Sätze unzulässig. Wurde die Datei im Compatibility Mode geöffnet
und an einen Subprozess vererbt (inherit), dann löst ein Zugriff auf diese Datei einen INT
24 aus. Zugriffe auf nicht gesperrte Bereich sind dagegen immer möglich, auch wenn das
inherit-Flag nicht gesetzt ist.
Bei Zugriffen auf gesperrte Dateien, die mit SHARE-Flags für Lesezugriffe anderer
Prozesse geöffnet wurden bricht die Funktion mit einem Fehlercode AX=0005H ab.
4.61 Write to a File or Device (Funktion 40H, DOS 2.0 - 6.x)
Diese Funktion erlaubt es, in eine geöffnete Datei oder zu einer Einheit zu schreiben. Es
gelten folgende Übergabeparameter.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
40H
°
° BX:
Handle
°
° CX:
Zahl der zu schreiben- °
°
den Bytes
°
° DS:DX Zeiger auf einen Puffer°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° AX:
Zahl der geschriebenen °
°
Bytes
°
Û-------------------------------ì
Neben der Handlenummer in BX wird die Zahl der zu schreibenden Bytes im Register CX
geführt. So lassen sich auf einen Schlag bis zu 64 Kbyte schreiben. Im Registerpaar DS:DX
findet sich ein Zeiger auf den Puffer, in dem die Zeichen zwischengespeichert sind.
Falls ein Fehler auftritt, ist das Carry-Flag gesetzt und im AX-Register findet sich der
Fehlercode:
5
6
Handle nicht zum Schreiben geöffnet
Handle nicht geöffnet, oder ungültig
Die erweiterten Fehlercodes lassen sich durch die Funktion 59H abfragen.
Bei fehlerfreiem Zugriff ist das Carry-Flag = 0 und im Register AX steht die Zahl der
geschriebenen Bytes. Falls AX nach dem Aufruf den Wert 0 hat, ist die Disk voll. Wenn
der Wert kleiner als CX ist, trat während des Schreibvorgangs ein Fehler auf, ohne daß das
Carry-Flag gesetzt wurde. Die Funktion erlaubt eine Ein-/Ausgabeumleitung der Ausgaben
an verschiedene Einheiten, falls sich die Ausgabe auf die Standardausgabe bezieht.
Es wird ab der aktuellen Position des Schreibzeiger ausgegeben. Um eine Datei auf eine
bestimmte Länge zu begrenzen, wird üblicherweise die gewünschte Zahl der Bytes ab dem
Dateianfang geschrieben. Alternativ besteht die Möglichkeit, den Schreib-/Lesezeiger
mittels der Funktion 42H (Move File R/W Pointer) neu zu positionieren. Anschließend
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
238
wird die Funktion 40H mit CX = 0 (Zahl der Bytes = 0) aufgerufen. Dies hat den Effekt,
daß die Datei hinter dem Schreib-/Lesezeiger abgeschnitten wird. Die Dateilänge ist damit
begrenzt. Wird der Schreibzeiger auf den Anfang der Datei positioniert, läßt sich mit
obiger Methode die Datei löschen. Befindet sich der Schreibzeiger hinter dem Dateiende
(z.B. per Funktion 42H), verlängert DOS die Datei und füllt den Zwischenraum zwischen
EOF und der aktuellen Position mit undefinierten Zeichen.
Bei Zugriffen auf Geräteeinheiten unterscheidet DOS über das Bit 5 im Geräte-Attribut, ob
der Zugriff im raw- oder cooked-Mode erfolgt. Im raw-Mode erfolgt keine Interpretation
der Zeichen. Bei Ausgaben auf Druckern kann die Interpretation der Zeichen störend sein,
zum Beispiel wenn das Zeichen EOF (26H) bei der Ausgabe von Graphikdaten
herausgefiltert wird. Die Treiber für AUX: und PRN: arbeiten standardmäßig im cookedMode.
Falls die Datei nur das Read-Attribut besitzt, werden alle Schreibzugriffe abgewiesen.
Innerhalb eines Netzwerkes benötigt der rufende Prozeß das Write-Zugriffsrecht. Bei
Zugriffen auf gesperrte Dateien oder Bereiche in Netzwerken mit geladenem SHAREProgramm hängt die Reaktion des Betriebssystemes vom Dateimode ab. Wird die Datei im
Compatibility Mode eröffnet und an einen Subprozess vererbt, dann löst DOS einen INT 24
aus. Wurde die Datei als shared eröffnet, dann bricht DOS mit einem Fehlercode AX=0005
ab, falls auf einen gesperrten Bereich zugegriffen wird.
4.62 Delete (Unlink) Directory Entry (Funktion 41H, DOS 2.0 6.x)
Mit der Funktion läßt sich eine Datei löschen, wobei folgende Aufrufparameter definiert
sind.
Ö--------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
41H
°
° DS:DX Zeiger auf ASCIIZ-String°
°
mit dem Pfadnamen
°
û--------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
°
kein Fehler
°
Û--------------------------------ì
Es wird allerdings nur der Eintrag im Inhaltsverzeichnis gelöscht (Unlink), die Datei bleibt
weiter erhalten. Konkret wird das erste Zeichen des Filenamens in der FAT auf den Wert
E5H gesetzt. Tools wie UNDELETE versuchen diesen Wert auf ein gültiges Zeichen zu
setzen um so die gelöschte Datei wieder herzustellen. Im Registerpaar DS:DX findet sich
ein Zeiger auf einen ASCIIZ-String mit dem Pfadnamen, der letztlich auch den
Dateinamen enthält. Innerhalb des Dateinamens sind keine Wildcardzeichen (*) erlaubt.
Der ASCIIZ-String ist mit einem Nullbyte abzuschließen.
Falls die Datei existiert und nicht als Read Only markiert ist, wird sie gelöscht. Tritt ein
Fehler auf, wird das Carry-Flag gesetzt. Im AX-Register findet sich ein Fehlercode:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
2
5
239
Pfad oder Dateiname existiert nicht
Der Pfad bezieht sich auf ein Unterverzeichnis
oder einen Read-Only-File.
Wichtig ist, daß die Datei vor Aufruf der Funktion geschlossen wird. Andernfalls besteht
die Möglichkeit, daß DOS in eine nicht mehr existierende Datei Daten auslagert.
Um einen Read-Only-File zu löschen, muß erst das Attribut mittels der Funktion 43H
umgesetzt werden. Die erweiterten Fehlercodes lassen sich mit der Funktion 59H abfragen.
Innerhalb eines Netzwerkes benötigt der Prozeß das Create-Access-Zugriffsrecht, um die
Datei zu löschen. Ab DOS 3.1 kann die Funktion indirekt über die (undokumentierte)
INT 21-Funktion 5D00H aktiviert werden, wobei dann auch Wildcards (*,?) im Filenamen
auftreten dürfen.
4.63 Move File Pointer (Funktion 42H, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich der Schreib-/Lesezeiger innerhalb der Datei positionieren.
Dies ist beim Zugriff über Filehandles notwendig.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
42H
°
° AL:
Methode der Bewegung
°
° BX:
Handle
°
° CX:DX Distanz in Bytes
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° DX:AX neue Zeigerposition
°
Û-------------------------------ì
Die Handlenummer wird per Register BX übergeben. Das Registerpaar CX:DX enthält
einen 32-Bit-Offsetwert, um den der Schreib-/Lesezeiger verschoben werden soll.
Der Code in AL spezifiziert die Positionierungsart:
0
1
2
° Positioniere ab dem Fileanfang um den Offset
°
° Positioniere ab der aktuellen Position um den Offset
°
° Positioniere ab dem Dateiende um den Offset
Falls ein Fehler auftritt, wird das Carry-Flag gesetzt. In AX steht ein Fehlercode:
1
6
AL war nicht 0, 1 oder 2
Der Handle war nicht geöffnet.
Die erweiterten Fehlercodes (Extended Errorcodes) lassen sich mittels der Funktion 59H
abfragen.
Im fehlerfreien Fall findet sich im Registerpaar DX:AX die neue Position des Schreib-/
Lesezeigers. Mit dem Steuercode AL = 2 (positioniere ab dem Dateiende um den Offset)
und CX:DX = 0 (Offset = 0) läßt sich die aktuelle Dateilänge abfragen. Dies ist möglich,
da mit dem Offset 0 der Zeiger nicht positioniert wird, die Funktion aber anschließend im
Registerpaar DX:AX den Offsetwert relativ zum Dateianfang zurückgibt, was ja der
Dateilänge in Byte entspricht. Der Positionszeiger läßt sich auch über das Dateiende hinaus
positionieren, was bei Schreiboperationen zu undefinierten Daten in der Datei führt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
240
Bei Dateien innerhalb von Netzwerken gelten verschiedene Bedingungen hinsichtlich der
Positionierung des Schreib-/Lesezeigers. Falls die Datei als Shared mit den Modes Deny
Read oder Deny None eröffnet wurde, wird der Zeiger auf dem Rechner mit der
physikalischen Datei positioniert. Bei allen anderen Modes wird die Information lediglich
im Netzwerk gehalten.
4.64 Get/Set File Attributes (Funktion 43H, DOS 2.0 - 6.x)
Mit dieser Funktion lassen sich die Dateiattribute lesen und verändern. Es gelten folgende
Übergabeparameter.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
43H
°
° AL:
0 = Get 1 = Set
°
° CX:
Attribut bei Set
°
° DS:DX Zeiger auf ASCIIZ °
°
String mit dem Pfad
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° CX:
Attributbyte falls
°
°
AL = 0
°
Û-------------------------------ì
Im Registerpaar DS:DX findet sich ein Zeiger auf einen ASCIIZ-String mit dem
Pfadnamen, der auch die Dateibezeichnung enthält. Wildcards (*,?) sind hier nicht erlaubt.
Das Register AL spezifiziert, ob ein Attribut gelesen (AL = 0) oder geschrieben (AL = 1)
wird. Falls ein Schreibauftrag vorliegt, muß der Attributcode im Register CX übergeben
werden.
Die Kodierung der Attribute erfolgt gemäß folgender Tabelle:
7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙÚÙÚÙÚÙÚÙÚÙÚÙÚì
° ° ° ° ° ° ° Û° ° ° ° ° ° Û--° ° ° ° ° Û----° ° ° ° Û------° ° ° Û--------° ° Û----------° Û------------Û---------------
Read Only
Hidden File
System File
Volume Label
Subdirectory
Archive Bit
-----
Bild 4.7: Kodierung der Dateiattribute
Eine detailliertere Diskussion ist in dem Kapitel über die Dateiverwaltung enthalten. Es ist
aber zu beachten, daß sich die Attribute Volume Label und Subdirectory nicht durch die
Funktion ändern lassen. Diese Bits müssen beim Aufruf auf 0 gesetzt werden, sonst erfolgt
eine Fehlermeldung.
Bei Zugriffen innerhalb eines Netzwerkes muß für das Verändern des Archive Bits keine
besondere Zugriffsberechtigung vorliegen, während alle anderen Bits nur bei Vorliegen des
Create-Access-Privilegs geändert werden können.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
241
Tritt während des Funktionsaufrufes ein Fehler auf, wird das Carry-Flag gesetzt und im
Register AX findet sich ein Fehlercode:
Code ° Bemerkung
------é----------------------------------------------------1
° AL ist nicht 0 (Get) oder 1 (Set)
°
2
° Datei nicht gefunden
°
3
° Der Pfad ist ungültig oder die Datei existiert nicht
°
5
° Das Attributbyte läßt sich nicht beschreiben, da der
° Name
° ein Unterverzeichnis oder ein Volume ID bezeichnet.
Falls das Carry-Flag nicht gesetzt ist und im Register AL der Wert 0 steht, wurde die
Operation fehlerfrei ausgeführt. Beim Aufruf Get-Attribute findet sich dieses anschließend
im Register CX.
4.65 IOCTL Data (Funktion 44H, DOS 2.0 - 6.x)
Diese DOS Funktion ermöglicht es, Informationen über die geöffnete Einheit abzufragen
oder Kontrollinformationen zum Treiber zu senden. Die Funktion 44H unterstützt
verschiedene Unterfunktionen, die mit dem Code 00H bis 11H durch das Register AL
selektiert werden. Die folgende Tabelle gibt einen kurzen Überblick über diese
Unterfunktionen sowie die DOS-Version, ab der eine Unterstützung erfolgt.
Ö------Ú---------Ú------------------------------------------Ì
° Code ° Version ° Subfunktion
°
û------é---------é------------------------------------------À
° 00 °
2.0
° Get Device Information
°
° 01 °
2.0
° Set Device Information
°
° 02 °
2.0
° Read from a Character Device
°
° 03 °
2.0
° Write to a Character Device
°
° 04 °
2.0
° Read from a Block Device
°
° 05 °
2.0
° Write to a Block Device
°
° 06 °
2.0
° Get Input Status
°
° 07 °
2.0
° Get Output Status
°
° 08 °
3.0
° Is a particular Block Device changeable? °
° 09 °
3.1
° Is a logical Device local or remote?
°
° 0A °
3.1
° Is a Handle local or remote?
°
° 0B °
3.0
° Change Sharing Retry Code
°
° 0C °
3.3
° Generic IOCTL Handle request
°
° 0D °
3.2
° Block Device Generic IOCTL request
°
° 0E °
3.2
° Get logical Drive
°
° 0F °
3.2
° Set logical Drive
°
° 10 °
5.0
° Query Support (Handle)
°
° 11 °
5.0
° Query Support (Block)
°
Û------Ù---------Ù------------------------------------------ì
Tabelle 4.14: IOCTL-(Funktion-44H)-Subfunktionen
Die Subfunktionen 00H-08H werden nicht innerhalb eines Netzwerkes unterstützt. Vor
Aufruf der Subfunktion 0BH muß das File-Sharing-Kommando (SHARE) geladen werden.
Die IOCTL-Funktionen tauschen in der Regel lediglich Informationen mit den
Einheitentreibern aus. Es besteht zusätzlich die Möglichkeit, Aufrufe direkt auf Dateien zu
beziehen. Dies ist aber auf die Codes 00H, 06H und 07H beschränkt. Andere Codes
resultieren in einer Invalid-Function-Fehlermeldung.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
242
4.65.1 IOCTL Data (Funktion 44H, Code 0 und 1, DOS 2.0 - 6.x)
Diese Unterfunktion erlaubt es, die interne MS-DOS Dateitabelle zur Devicekontrolle zu
lesen oder zu verändern. Es gelten folgende Aufrufkonventionen.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
0 Get Device Data
°
°
1 Set Device Data
°
° BX:
Handle
°
° DX:
Device Daten
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° DX:
Device Daten
°
Û-------------------------------ì
DX ist vor dem Aufruf nur zu setzen, falls AL = 1 ist.
Mit AL = 0 werden die Daten gelesen. Bei einem fehlerfreien Ablauf finden sie sich im
Register DX. Im Register BX muß der Handle der Datei übergeben werden. Falls AL = 1
ist, werden die Daten aus dem Register DX in die interne DOS-Tabelle übertragen. Beim
Schreiben muß das Register DH = 0 sein.
Die Kodierung der Devicedaten wurde im Laufe der verschiedenen DOS-Versionen
erweitert. Als Einheiten werden Laufwerke (blockorientierte Einheiten) und Geräte wie
LPT:, CON: etc. (zeichenorientierte Einheiten) unterschieden. Demnach hängt die
Kodierung der Devicedaten von der Einheit ab. Bit 7 des Device-Words im Treiberkopf
signalisiert, ob eine zeichenorientierte Einheit (Bit 7 = 1) oder einen blockorientierte
Einheit (Bit 7 = 0) vorliegt.
Die in DX zurückgegebenen Devicedaten haben bei gesetztem Bit 7 folgendes Format:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
243
Ö-----Ú------Ú---------------------------------------------Ì
° Bit ° Wert ° Bemerkung
°
û-----é------é---------------------------------------------À
° 15 ° x
° reserviert (wie Bit 7)
°
û-----é------é---------------------------------------------À
° 14 ° 1
° Das Device kann Kontroll-Zeichen bearbei°
°
°
° ten, die mit der Funktion 44H Code 2 und 3 °
°
°
° gesendet wurden. Das Bit kann nur gelesen
°
°
°
° aber nicht gesetzt werden.
°
û-----é------é---------------------------------------------À
° 13 ° x
° reserviert
°
° 12 ° x
° reserviert
°
û-----é------é---------------------------------------------À
° 11 ° 1
° Media not removable
°
û-----é------é---------------------------------------------À
° 10 ° x
° reserviert
°
° . ° .
°
.
°
° 8 ° x
° reserviert
°
û-----é------é---------------------------------------------À
° 7 ° 1
° Deviceflag = Gerät
°
û-----é------é---------------------------------------------À
° 6 ° 0
° End of File bei Input
°
û-----é------é---------------------------------------------À
° 5 ° 1
° keine Prüfung auf Kontroll-Zeichen (raw)
°
°
° 0
° Prüfung auf Kontroll-Zeichen (cooked)
°
û-----é------é---------------------------------------------À
° 4 ° 1
° Device nutzt INT 29H
°
û-----é------é---------------------------------------------À
° 3 ° 1
° Clock Device vorhanden
°
û-----é------é---------------------------------------------À
° 2 ° 1
° Null Device vorhanden
°
û-----é------é---------------------------------------------À
° 1 ° 1
° Console Output Device
°
û-----é------é---------------------------------------------À
° 0 ° 1
° Console Input Device
°
Û-----Ù------Ù---------------------------------------------ì
Tabelle 4.15: Kodierung der Device-Daten; bei zeichenorientierten Einheiten
Die Bits 8 bis 15 sind direkt aus dem Kopf des jeweiligen Gerätetreibers entnommen. Bit
15 hat in der Regel den gleichen Wert wie Bit 7. In einigen DOS-Versionen wird das Bit
als reserviert markiert.
Bit 14 zeigt an, ob die Einheit Kontrollinformationen verarbeiten kann. Bit 14 = 0 bedeutet,
die Einheit kann keine per Subfunktion AL = 02, 03, 04 oder AL = 05 übergebene
Kontrollinformation bearbeiten. Ist das Bit gesetzt, dann lassen sich über die Aufrufe
4402H und 4403H Kontrollinformationen absetzen, die dann vom Treiber interpretiert
werden. Das Bit läßt sich allerdings durch den Aufruf 4400H nicht setzen, da die
Bearbeitung der Kontrollinformationen treiberspezifisch implementiert wird.
Die Bits 8 bis 13 sind bei vielen DOS-Versionen als reserviert markiert und werden
ebenfalls aus dem Kopf des Treibers gelesen. Bit 13 = 1 bedeutet, daß der Treiber die
Funktion 4410H unterstützt. Dies ist in MS-DOS 5.0/6.0 nur bei HIMEM.SYS und
PRINTER.SYS der Fall.
Bit 12 ist seit DOS 3.1 definiert und markiert, daß das Gerät im Netzwerk betrieben wird
(Bit 12 = 1), also nicht lokal ist.
Bit 11 = 1 bedeutet, daß der Treiber die Open- (440DH) und Close-(440EH) Funktionen
unterstützt.
DIe Bits 9-10 sind meines Wissens unbenutzt (0). Bit 8 wird bei der Abfrage des Handles
Nr. 1 benutzt, die Funktion ist aber unbekannt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
244
Bit 7 stammt aus dem Kopf des Treibers und selektiert zeichen- oder blockorientierte
Einheiten. Falls Bit 7 gesetzt (1) ist, bezieht sich der Aufruf auf eine logische Einheit
(Printer, Tastatur, etc.). Diese Einheit ist dem entsprechenden Handle zugeordnet. Für die
Bits 0 - 6 gilt dann folgende Kodierung:
Bit 6 = 0
1
Bit 5 = 0
1
Bit
Bit
Bit
Bit
3
2
1
0
=
=
=
=
1
1
1
1
Die Einheit unterstützt die End-of-File Kennung
beim Einlesen von Daten
Es wird kein EOF unterstützt
Die Daten werden im ASCII-Mode transferiert, d.h.
der String wird auf Steuerzeichen (CTRL-S, CTRL-P,
CTRL-Z, CTRL-C) untersucht (cooked)
Die Daten werden im Binär-Mode transferiert, d.h.
es werden keine Steuerzeichen erkannt (raw). Der
CTRL-C-Check muß zusätzlich auf OFF geschaltet
sein (siehe INT 21, Funktion 33H)
CLOCK$ Einheit
NULL Einheit
Standard Ausgabe Einheit
Standard Eingabe Einheit
Bit 6 signalisiert im gelöschten Zustand, daß der Treiber bei Leseversuchen nur EOF
zurückgibt (z.B. der Versuch von LPT: zu lesen). Bei gesetztem Bit kann die Einheit Daten
zurückgeben.
Bit 5 definiert, ob der Treiber Steuerzeichen verarbeiten (cooked mode) oder ignorieren
(raw mode) soll. Bei blockorientierten Einheiten ist immer der raw mode eingestellt. Bei
zeichenorientierten Einheit ist der cooked mode vordefiniert.
Ist Bit 4 gesetzt, gibt der Treiber einzelne Zeichen über den INT 29 aus. Dies kann nur bei
zeichenorientierten Geräten der Fall sein. In vielen DOS-Versionen ist dieses Bit als
reserviert markiert.
Die Bits 0 bis 3 markieren, ob es sich bei dem Gerät um einen der DOS-Standardtreiber
(CLOCK$, NUL, CON) handelt. Hier werden wieder die Bits des Treiberkopfes
übernommen.
Falls Bit 7 = 0 ist, bezieht sich das Handle auf eine Datei und die restlichen Bits besitzen
folgende Bedeutung:
Ö-----Ú------Ú---------------------------------------------Ì
° Bit ° Wert ° Bemerkung
°
û-----é------é---------------------------------------------À
° 15 ° x
° reserviert (Datei remote DOS 3.x)
°
û-----é------é---------------------------------------------À
° 14 ° 0
° Datum/Zeit nicht setzen (DOS 3.x)
°
û-----é------é---------------------------------------------À
° 13 ° x
° reserviert
°
° 12 ° x
° reserviert
°
û-----é------é---------------------------------------------À
° 11 ° 1
° Medium nicht wechselbar
°
û-----é------é---------------------------------------------À
° 10 ° x
° reserviert
°
° . ° .
°
.
°
° 8 ° x
° reserviert
°
û-----é------é---------------------------------------------À
° 7 ° 0
° Dateibit
°
û-----é------é---------------------------------------------À
° 6 ° 0
° Die Datei wurde nicht beschrieben
°
û-----é------é---------------------------------------------À
° 5 ° x
° Laufwerknummer (0 = A:, 1 = B:, ...)
°
° . ° .
°
.
°
° 0 ° x
°
.
°
Û-----Ù------Ù---------------------------------------------ì
Tabelle 4.16: Kodierung der Device-Daten bei Dateien (Bit 7 = 0)
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
245
Die Bits 0-5 geben die Laufwerksnummer (0 = A:, 1 = B:, etc.), auf welches sich die Datei
bezieht, an. Bit 6 wird durch Schreibzugriffe nach einem Open Aufruf gelöscht. Ist das Bit
6 = 0, wurde die Datei seit dem Öffnen der Datei noch nicht beschrieben. Die praktische
Nutzung ist m.E. allerdings eingeschränkt. Die Bits 8-15 sind nach der DOSDokumentation als reserviert gekennzeichnet und werden aus dem Kopf des Treibers
gelesen. Inoffiziell gilt aber folgende Belegung: Ein gesetztes Bit 11 signalisiert, daß das
Medium nicht wechselbar ist. Bit 14 = 1 definiert, daß der Treiber beim Close einer Datei
Datum und Uhrzeit nicht verändern soll. Bit 15 signalisiert ab DOS 3.0, daß die Datei im
Netzwerk vorliegt (remote).
In der Praxis lassen sich die Funktionen 4400H und 4401H kaum nutzen. Über Bit 5 ist
definierbar, ob die Daten vom Treiber im raw mode oder im cooked mode bearbeitet
werden. Im raw mode werden Steuerzeichen ignoriert. Im cooked mode werden Zeichen
wie Ctrl+A (Code 26H) als EOF interpretiert und ausgefiltert. Dies kann bei
Graphikausgaben auf einen Drucker zu Problemen führen. Ein Programm könnte Bit 7
abfragen um festzustellen, ob die Ein- und Ausgaben der Standardeinheit von einem
zeichenorientierten Treiber (CON) kommen, oder ob eine I/O-Umleitung zu Dateien
vorliegt. Bit 2 erlaubt die Prüfung, ob ein Programm mit der Nulleinheit verbunden ist.
Dies ist bei TSR-Programmen relevant, da hier die Standard-I/O-Handles oft unbenutzt
bleiben und somit an DOS zurückgegeben werden können. Mit Bit 14 läßt sich bei Geräten
testen, ob spezielle Treiber (PRINTER.SYS) geladen wurden.
Tritt bei der Operation ein Fehler auf, wird das Carry-Flag gesetzt und im Register AX
findet sich ein Fehlercode:
Code ° Bemerkung
-----é------------------------------------------------------1
° AL ist nicht 0 oder 1, oder DH ist nicht 0 bei AL = 1
6
° Der Handle in BX ist ungültig oder nicht geöffnet
15
° ungültige Daten
Tritt kein Fehler auf, ist das Carry-Flag gelöscht. Erweiterte Fehlercodes lassen sich mit
der Funktion 59H abfragen.
4.65.2 IOCTL Character (Funktion 44H, Code 2 und 3, DOS 2.0 - 6.x)
Diese Unterfunktionen erlauben es, Kontrollzeichen an eine zeichenorientierte Einheit
(character device) zu senden oder zu empfangen. Es gelten folgende Aufrufkonventionen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
2 Read CTRL- Character °
°
3 Write CTRL - Charact.°
° CX:
Zahl der transferierten°
°
Bytes
°
° BX:
Handle
°
° DS:DX Zeiger auf Puffer
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° AX:
Bytes transferiert
°
Û-------------------------------ì
Mit AL = 2 werden die Daten von der Einheit in den Puffer gelesen, mit AL = 3 werden sie
zu der Einheit geschrieben. Im Registerpaar DS:DX findet sich ein Zeiger auf den
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
246
Datenpuffer. Im Register BX muß der Handle einer zeichenorientierten Einheit übergeben
werden. Das Register CX gibt an, wieviele Bytes gelesen oder gesendet werden sollen.
Nach einem fehlerfreien Ablauf, daß Carry-Flag ist nicht gesetzt, enthält AX die Zahl der
transferierten Zeichen. Falls ein Fehler auftritt wird das Carry-Flag gesetzt und in AX
findet sich ein Fehlercode.
Code ° Bemerkung
-----é------------------------------------------------------1
° AL ist nicht 2 oder 3, oder die Einheit kann nicht die
° aufgerufene Funktion ausführen.
6
° Der Handle in BX ist ungültig oder nicht geöffnet
13
° Daten ungültig
Der Einheitentreiber muß so geschrieben sein, daß er IOCTL-Daten verarbeiten kann,
andernfalls erfolgt eine Fehlermeldung.
4.65.3 IOCTL Block (Funktion 44H, Code 4 und 5, DOS 2.0 - 6.x)
Diese Unterfunktionen erlauben es, Kontrollzeichen an ein Blockdevice zu senden oder zu
empfangen. Es gelten folgende Aufrufkonventionen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
4 Read CTRL-Charact.
°
°
5 Send CTRL-Charact.
°
° BL:
Laufwerksnummer
°
° CX:
Bytes zu transferie°
°
ren
°
° DS:DX Zeiger auf Puffer
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° AX:
Bytes transferiert
°
°
°
Û-------------------------------ì
Kontrollzeichen senden
Kontrollzeichen empfangen
Mit AL = 4 werden die Daten gelesen, mit AL = 5 werden sie gesendet. Im Registerpaar
DS:DX findet sich der Zeiger auf den Zeichenpuffer. Im Register BL muß die
Laufwerksnummer (0 = Default, 1 = A:, 2 = B:, etc.) angegeben werden. Das Register CX
gibt an, wie viele Bytes gelesen oder gesendet werden sollen. Nach einem fehlerfreien
Ablauf, daß Carry-Flag ist nicht gesetzt, enthält AX die Zahl der transferierten Zeichen.
Falls ein Fehler auftritt, wird das Carry-Flag gesetzt und in AX findet sich ein Fehlercode.
Code ° Bemerkung
-----é------------------------------------------------------1
° AL ist nicht 4 oder 5, oder die Einheit kann nicht die
° aufgerufene Funktion ausführen.
5
° Der Wert in BL spezifiziert keine gültige
° Laufwerksnummer
13
° Daten ungültig
Der Device-Treiber muß so geschrieben sein, daß er IOCTL-Daten verarbeiten kann.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
247
4.65.4 IOCTL Status (Funktion 44H, Code 6 und 7, DOS 2.0 - 6.x)
Diese Unterfunktion prüft, ob die per Handle selektierte Datei oder Treiber für eine
Ausgabe bereit ist.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
6 Check Input Status
°
°
7 Check Output Status °
° BX:
Handle
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° AL:
Statusbyte (00 oder FF)°
Û-------------------------------ì
Mit AL = 6 wird der Eingabestatus einer Einheit oder einer Datei abgefragt. Mit AL = 7
wird der Ausgabestatus des Device-Treibers geprüft. In BX muß die Handle-Nummer
stehen. Es wird vorausgesetzt, daß die Einheit vorher mit Open eröffnet wurde (von dort
wird der Handlecode übernommen).
Falls ein Fehler auftritt, ist anschließend das Carry-Flag gesetzt und im AX-Register findet
sich ein Fehlercode:
Code ° Bemerkung
-----é------------------------------------------------------1
° AL ist nicht 6 oder 7
5
° Zugriff abgewiesen
6
° Der angegebene Handle ist ungültig oder nicht eröffnet
13 ° ungültige Daten
Andernfalls ist das Carry-Flag gelöscht und im AL-Register findet sich ein Statusbyte mit
folgender Bedeutung:
Wert
Device
Input File
Outputfile
-------------------------------------------------------00H
Not ready
Pointer auf EOF
ready
FFH
ready
ready
ready
Ein Ausgabefile gibt, bis auf den Ausnahmefall Disk voll, immer den Wert ready zurück.
Wird die Subfunktion 06H in DOS 4.0 auf eine Datei angewendet, gibt sie so lange den
Wert F2H in AL zurück, bis das Dateiende (EOF) erreicht ist. Dann wird nur noch der
Wert 00H zurückgegeben, bis die aktuelle Position mittels der Funktion 42H geändert wird.
4.65.5 IOCTL is Changeable (Funktion 44H, Code 8, DOS 3.0 - 6.x)
Diese Unterfunktion prüft, ob ein blockorientierter Einheitentreiber austauschbare Medien
unterstützt. Es gelten die folgenden Übergabeparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
248
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
8 (Is Device Changable)°
° BL:
Laufwerksnummer
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° AX:
Statusbytes
°
Û-------------------------------ì
Im Register BL wird die Nummer des Laufwerks angegeben (0 = Default, 1 = A:, 2 = B:,
etc.).
Bei fehlerfreiem Aufruf, das Carry-Flag ist nicht gesetzt, enthält AX den Status :
0
1
Medium auswechselbar (Diskette oder Wechselplatte)
Medium fix (Festplatte)
Falls ein Fehler auftritt wird das Carry-Flag gesetzt und in AX findet sich ein Fehlercode.
Code ° Bemerkung
-----é-------------------------------------------------1 ° Der Treiber unterstützt diese Abfrage nicht
15 ° Der Wert in BL ist keine gültige Laufwerksnummer
Falls der Fehlercode 1 zurückgegeben wird, kann das rufende Programm davon ausgehen,
daß das Medium nicht wechselbar ist.
4.65.6 IOCTL is Redirected Block (Funktion 4409H, DOS 3.1 - 6.x)
Mit dieser Funktion läßt sich prüfen, ob ein angegebenes Laufwerk lokal zu einer
Arbeitsstation innerhalb des Netzwerkes zugeordnet ist, oder ob es sich um ein Laufwerk
eines Servers handelt, welches global verfügbar ist (remote).
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
9 (Device local)
°
° BL:
Laufwerksnummer
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° DX:
Device Attribute Bits °
°
°
Û-------------------------------ì
Im Register BL muß die Laufwerksnummer (0 = Default, 1 = A:, 2 = B:, etc.) übergeben
werden. Im DX-Register gibt die Funktion das Attributbyte der Einheit zurück. Dieses
Register besitzt folgende Kodierung:
·
Bei einer Remote-Einheit ist offiziell nur Bit 12 (1000H) benutzt, während die
restlichen Bits = 0 sind.
·
Bit 9 = 1 signalisiert in diesem Fall bei einigen DOS-Versionen, daß das Laufwerk von
mehreren Netzwerkstationen benutzt wird. Dies wird über den INT 2A ermittelt.
·
Bit 12 = 1 kennzeichnet ein Netzlaufwerk.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
·
249
Bit 15 = 1 bedeutet im Netzwerk, daß der Laufwerksbezeichner über SUBST erzeugt
wurde.
Falls Bit 12 = 0 (lokal) ist, besitzt das Register folgende Kodierung:
·
Bit 0 ist reserviert.
·
Bit 1 = 1 signalisiert ab DOS 4.0, daß der Treiber Sektornummern mit 32 Bit
unterstützt.
·
Bit 2 .. 5 sind reserviert und gelöscht.
·
Bit 6 = 1 definiert ab DOS 3.2, daß der Treiber die Funktionen 13H und 18H, b.z.w.
die INT 21-Funktionen 440DH, 440EH und 440FH unterstützt.
·
Bit 7 = 1 markiert ab DOS 5.0, daß der Treiber die Funktion 19H, b.z.w. die INT 21Funktion 4411H unterstützt.
·
Bit 8 wird von DIRVER.SYS benutzt, der Zweck ist aber unbekannt.
·
Bit 9 = 1 markiert ein lokales Laufwerk, welches von anderen Stationen mit benutzt
werden darf.
·
Bit 10 ist reserviert.
·
Bit 11 = 1 definiert ab DOS 3.0 das der Treiber die Funktionen 0DH und 0FH
unterstützt und damit die INT 21-Funktion 4408H supported.
·
Bit 12 = 0 kennzeichnet ein lokales Laufwerk.
·
Bit 13 = 1 bedeutet, der Treiber erwartet beim Aufruf der Funktion 02H (Build BPB)
ein neues Media-ID.
·
Bit 14 = 1 bedeutet, der Treiber definiert die Funktionen 03H und 0CH und unterstützt
damit die INT 21-Funktionen 4404H und 4405H.
·
Bit 15 = 1 bedeutet, daß der Laufwerksbezeichner über SUBST erzeugt wurde.
Die Informationen in DX sind nur gültig, falls das Carry-Flag nicht gesetzt ist. Für
Applikationsprogramme ist es gleich, ob ein Device local oder remote ist, da ein Zugriff
immer möglich ist.
Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt und in AX findet
sich der Fehlercode:
Code ° Bemerkung
------é----------------------------------------------------1 ° Filesharing muß erst geladen werden, bevor die
° Funktion
° aufgerufen werden kann.
15 ° In BL ist ein ungültiges Laufwerk angegeben.
Mit der Funktion 59H lassen sich die erweiterten Fehlercodes abfragen.
4.65.7 IOCTL is Redirected Handle (Funktion 440AH, DOS 3.1 - 6.x)
Mit dieser Funktion läßt sich prüfen, ob ein angegebener Handle sich auf eine lokale
Einheit (Datei oder Device) oder auf einen Server (remote) innerhalb eines Netzwerkes
bezieht.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
250
Ö-------------------------------Ì
°
°
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
0AH (Is Handle local) °
° BX:
Handle
°
û-------------------------------À
°
°
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° DX:
IOCTL Bit Feld
°
°
°
Û-------------------------------ì
Im Register BL muß die Laufwerksnummer (0 = Default, 1 = A:, 2 = B:, etc.) übergeben
werden. Der Handlecode wird vor dem Aufruf in BX gesetzt. Im DX-Register gibt die
Funktion das IOCTL-Bit-Feld zurück. Falls der Handle sich auf ein Remote-Device oder
Remote-File bezieht, ist Bit 15 gesetzt (8000H).
Die Entscheidung, ob es sich um ein Gerät oder eine Datei handelt, erfolgt wie bei
AX=4400H über Bit 7.
Die Informationen in DX sind nur gültig, falls das Carry-Flag nicht gesetzt ist. Für
Applikationsprogramme ist es gleich, ob ein Device local oder remote ist, da ein Zugriff
immer möglich ist.
Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt und in AX findet
sich der Fehlercode:
Code ° Bemerkung
------é-----------------------------------------------------------1 ° Das Netzwerk muß erst geladen werden, bevor die Funktion
° aufgerufen werden kann.
6 ° In BL ist ein ungültiger Handle angegeben, oder der Handle
° ist nicht geöffnet.
Mit der Funktion 59H lassen sich die erweiterten Fehlercodes abfragen. Bei Novell
Netware 2.0 wird die Nummer des Fileservers, auf den sich das Handle bezieht, in CX
zurückgegeben.
4.65.8 IOCTL Retry (Funktion 44H, Code 0BH, DOS 3.1 - 6.x)
Diese Funktion spezifiziert, wie oft MS-DOS eine Operation wie einen Diskzugriff
wiederholt, falls ein Fehler vorkommt. Ein solcher Fehler kann z.B. dadurch auftreten, daß
die Disk innerhalb des Netzwerkes bereits durch andere Teilnehmer belegt ist. Es gilt
folgende Parameterversorgung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
251
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
0BH (Retry)
°
° DX:
Zahl der Wiederholung. °
° CX:
Wartezeit
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° --kein Fehler
°
Û-------------------------------ì
Im Register DX muß die Zahl der Wiederholungen bei abgewiesenen Zugriffen stehen.
MS-DOS versucht standardmäßig dreimal einen Zugriff, wenn das Device oder die Datei
durch andere Netzwerkteilnehmer belegt sind (Share- oder Lock-Konflikt). Mit der
Funktion 440BH läßt sich die Zahl der Zugriffe ändern. Falls der Zugriff nach n Versuchen
nicht gelingt, gibt MS-DOS einen INT 24 aus, der von der Anwendersoftware abgefangen
werden kann.
In CX findet sich die Wartezeit zwischen zwei Zugriffen. Der Effekt, den der Wert in CX
auslöst, ist maschinenabhängig. Der Wert gibt nämlich an, wie oft eine Leerschleife auf der
jeweiligen Maschine auszuführen ist. Der Schleifenzähler wird durch DOS standardmäßig
auf den Wert 1 initialisiert. Daher variiert die Zeit, abhängig vom Prozessor und der
Taktfrequenz.
Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt und in AX findet
sich der Fehlercode:
Code ° Bemerkung
------é------------------------------------------1 ° Filesharing muß erst geladen werden, bevor
° die Funktion aufgerufen werden kann.
Mit der Funktion 59H lassen sich die erweiterten Fehlercodes abfragen.
4.65.9 Generic IOCTL Handle Request (Funktion 440CH, DOS 3.2 - 6.x)
Dieser Aufruf ist erst ab DOS 3.2 implementiert. Er erlaubt es, innerhalb eines
Einheitentreibers verschiedene Unterfunktionen zu aktivieren, die Umschaltungen
zwischen verschiedenen Zeichensätzen (Code Pages) unterstützen. Es gilt folgende
Aufrufkonvention:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
0CH (Generic IOCTL)
°
° BX:
Handle Nummer
°
° CH:
Hauptcode (Device)
°
° CL:
Untercode (Funktion)
°
° DS:DX Zeiger auf Parameter
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX: Fehlercode
°
° Carry: clear -> kein Fehler
°
° DS:DX Iteration Count
°
Û-------------------------------ì
Ab MS-DOS 3.2 lassen sich bis zu 12 verschiedene Zeichensätze (Fonts) für die
Ausgabetreiber verwenden. Mit dem Befehl DEVICE = COMMAND ... wird beim
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
252
Systemstart in CONFIG.SYS festgelegt, wieviele Fonts unterstützt werden. Durch die
Aufrufe der Code-Page-Funktion lassen sich dann diese Zeichensätze installieren und
aktivieren. Auch der INT 21 wurde mit einem Funktionsaufruf zur Installation und
Aktivierung der Fonts ausgestattet.
Mit dem Aufruf 440CH wird diese Funktion aktiviert. Im Register BX wird der
Handlecode einer geöffneten Einheit übergeben, auf die sich die folgenden
Steueranweisungen beziehen. An Hand des Registers CX wird dann die gewünschte Aktion
selektiert. Im CH-Teil findet sich der Hinweis auf die Art der jeweils angesprochenen
Einheit (CON, COM, LPT). Es werden also nur zeichenorientierte Ausgabeeinheiten
angesprochen, da nur hier die verschiedenen Zeichentypen Sinn ergeben. Der Registerteil
CL spezifiziert, welche Unterfunktion ausgeführt werden soll. Es gilt dabei folgende
Kodierung:
CH ° Einheit
-----é---------00 ° ungültig
01 ° COM x
03 ° CON
05 ° LPT x
CL ° Unterfunktion
-----é--------------------------4CH ° Prepare Start
4DH ° Prepare End
4AH ° Select
6AH ° Query selected
6BH ° Query prepare list
45H ° Set Iteration Count
65H ° Get Iteration Count
5FH ° Set Display Inform. (DOS 4.0)
6FH ° Get Display Inform. (DOS 4.0)
Tabelle 4.17: Kodierung der Code-Page-Unterfunktionen
Der Zeiger im Registerpaar DS:DX spezifiziert eine Tabelle, in der je nach Unterfunktion
bestimmte Daten übergeben werden. Nachfolgend sollen nun die mit CL selektierten
Unterfunktionen besprochen werden.
Set Iteration Count (CL = 45H)
Mit diesem Aufruf läßt sich dem Treiber der Wiederholungsfaktor übergeben. Dieser Wert
spezifiziert, wie oft ein Treiber versucht, an die Einheit Daten zu senden, bis er den
Zustand device busy annimmt. Der Parameterblock besitzt beim Aufruf folgenden Aufbau:
Ö-------Ú------Ú-------------------------------------Ì
°Offset ° Byte ° Bedeutung
°
û-------é------é-------------------------------------À
° 00H °
2 ° Wiederholungszähler für Ausgabe bei °
°
°
° belegten Geräten
°
Û-------Ù------Ù-------------------------------------ì
Die Funktion gibt folgende Fehlercodes zurück:
Code
1
5
6
Fehler
ungültige Subfunktion
Zugriff verweigert
Handle nicht definiert
Die Unterfunktion ist nach meinen Informationen nicht durch Microsoft dokumentiert.
Get Iteration Count (CL = 65H)
Mit diesem Aufruf läßt sich der Wiederholungsfaktor abfragen. Dieser Wert spezifiziert,
wie oft ein Treiber versucht, an die Einheit Daten zu senden, bis er den Zustand device
busy annimmt. Der Parameterblock besitzt beim Aufruf folgenden Aufbau:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
253
Ö-------Ú------Ú-------------------------------------Ì
°Offset ° Byte ° Bedeutung
°
û-------é------é-------------------------------------À
° 00H °
2 ° Wiederholungszähler für Ausgabe bei °
°
°
° belegten Geräten
°
Û-------Ù------Ù-------------------------------------ì
Die Funktion gibt folgende Fehlercodes zurück:
Code
1
5
6
Fehler
ungültige Subfunktion
Zugriff verweigert
Handle nicht definiert
Die Unterfunktion ist nach meinen Informationen nicht offiziell durch Microsoft
dokumentiert.
Prepare Start (CL = 4CH)
Mit diesem Aufruf wird der Treiber für n Zeichenfonts initialisiert. Die Zahl der
Zeichenfonts wurde bereits beim Systemstart (CONFIG.SYS) spezifiziert und ist auf den
Maximalwert von 12 begrenzt. Die durch das Registerpaar DS:DX adressierte Tabelle
besteht aus mehreren Worten, die bei Prepare Start folgende Struktur besitzt:
Ö------Ú-----------------------------------------------Ì
° Wert ° Bedeutung
°
û------é-----------------------------------------------À
° 0
° Flagregister
°
° x
° Länge in Bytes der folgenden Felder (n+1)*2 °
° n
° Zahl der reservierten »Code Pages° -1
° Code Page Nummer 1
°
° .
°
.
°
° -1
° Code Page Nummer n
°
Û------Ù-----------------------------------------------ì
Tabelle 4.17: Datenstruktur bei CL = 4CH
Das Wort für die Flags ist beim Download mit dem Wert 0 zu initialisieren. Falls die
verschiedenen Fonts hardwaremäßig (z.B. durch Cartridge-Kassetten) implementiert sind,
ist der Wert 1 zu setzen. Die Zahl der zu installierenden Code Pages wird im dritten Wort
spezifiziert (Maximalwert 12). Für jeden Zeichensatz schließt sich anschließend ein
Statuswort an, welches mit dem Wert -1 zu initialisieren ist. Mit dem Wert -1 wird dem
Einheitentreiber mitgeteilt, daß der eventuell bereits an dieser Position geladene Font nicht
verändert wird. Soll ein anderer Font vorbereitet werden, muß an Stelle der -1 der jeweilige
Code eingetragen werden. Da die Länge der Tabelle nicht implizit bekannt ist, wird im
zweiten Wort die Zahl der Bytes, je zwei Byte pro Code Page und 2 Byte für die CodePage-Zahl, übergeben. Bei 3 Code Pages steht hier also der Wert 8 (n+1)*2.
Um die zuletzt geladenen Fonts aufzufrischen, muß die Funktion 4CH mit den Werten -1
für alle Code Pages aufgerufen werden. Dies ist z.B. sofort nach dem Aufruf Prepare End
erforderlich.
Tritt bei der Operation ein Fehler auf, wird bei der Rückkehr das Carry-Flag gesetzt.
Mittels der Funktion 59H läßt sich dann der erweiterte Fehlercode abfragen. Es sind beim
Aufruf Prepare Start folgende Fehlercodes implementiert:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
254
Code ° Bedeutung
-----é--------------------------------------------------------01 ° ungültige Funktionsnummer
22 ° unbekanntes Kommando
27 ° die angegebene Code Page ist durch die Tastatur belegt
° oder es existiert kein File mit der entsprechenden Code
° Page
29 ° Fehler in der Einheit
31 ° Device Treiber besitzt keinen Font zum laden oder es
° wurde kein File mit dem Code Page gefunden (DOS 4.x)
Nur wenn das Carry-Flag nicht gesetzt ist, konnte die Funktion erfolgreich ausgeführt
werden.
Refresh FontUm den Treiber dazu zu veranlassen, die aktuellen Fonts an das unterlagerte
Gerät zu senden, ist die Prepare-Start-Funktion ebenfalls zu benutzen. Beim Aufruf muß
jeder Code-Page-Eintrag in der Tabelle mit dem Wert -1 versehen werden. Dies ist z.B.
sofort nach dem Aufruf Prepare End erforderlich.
Tritt bei der Operation ein Fehler auf, wird bei der Rückkehr das Carry-Flag gesetzt.
Mittels der Funktion 59H läßt sich dann der erweiterte Fehlercode abfragen. Es sind beim
Aufruf Prepare Start folgende Fehlercodes denkbar:
Code ° Bedeutung
-----é--------------------------------------------27 ° Tastatur oder Code-Page-Konflikt
29 ° Fehler in der Einheit
31 ° Der Einheitentreiber besitzt keine Fontdaten
° die in die Einheit geladen werden können
Nur wenn das Carry-Flag nicht gesetzt ist, kann die Funktion erfolgreich ausgeführt
werden.
Fonts laden
Nachdem die Funktion Prepare Start ausgeführt wurde, müssen die jeweiligen Fonts zum
Einheitentreiber übertragen werden. Hierfür ist die bereits oben beschriebene Funktion
4403H (IOCTL Character) zu benutzen. Diese ermöglicht es, Kontrollzeichen an einen
Treiber zu übergeben. Die Daten werden nun in den Treiber geladen, wobei das Format
spezifisch für jede Einheit festgelegt ist. Die Übertragung ist mit dem weiter unten
beschriebenen Aufruf Prepare End zu beenden.
Falls keine Daten übertragen werden, nimmt der Treiber an, daß die Fonts hardwaremäßig
vorliegen. Dies ermöglicht es z.B., auswechselbare Zeichenfonts für Drucker mittels
Cartridge-Kassetten zu unterstützen. Falls die Fonts hardwaremäßig fest vorgegeben sind,
ist keine Prepare-Operation erforderlich.
Tritt bei der Operation ein Fehler auf, wird bei der Rückkehr das Carry-Flag gesetzt.
Mittels der Funktion 59H läßt sich dann der erweiterte Fehlercode abfragen. Es sind beim
Aufruf Prepare Start folgende Fehlercodes denkbar:
Code ° Bedeutung
------é-----------------------------------------------------27 ° Einheitencode in der Fontdatei nicht gefunden, oder
° die Code-Page-Daten sind in der Datei nicht vorhanden
29 ° Fehler in der Einheit
31 ° Die Datei besitzt keine Fontdaten oder die Struktur
° der Datei ist zerstört
Nur wenn das Carry-Flag nicht gesetzt ist, kann die Funktion erfolgreich ausgeführt
werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
255
Prepare End (CL = 4DH)
Dieser Aufruf wird benutzt, um nach einem Prepare Start mit anschließendem Laden der
Fontdaten über die Funktion 4403H dem Treiber zu signalisieren, daß die Initialisierung
beendet ist. Der Aufruf erfolgt in der oben bereits beschriebenen Art mit der gleichen
Registerstruktur. Lediglich der Zeiger DS:DX wird nicht mehr an den Anfang der Tabelle,
sondern auf das Feld mit der Zahl der Code Pages positioniert. Damit hat die Tabelle nur
noch folgenden Aufbau:
Byte ° Bedeutung
-------é---------------------------------2
° Länge des Datenbereichs in Bytes
2
° Code Page ID
Tabelle 4.18: Datenstruktur bei CL = 4DH, 4AH, 6AH
Tritt bei der Operation ein Fehler auf, wird bei der Rückkehr das Carry-Flag gesetzt.
Mittels der Funktion 59H läßt sich dann der erweiterte Fehlercode abfragen. Es werden
beim Aufruf Prepare End folgende Fehlercodes zurückgegeben:
Code ° Bedeutung
-----é---------------------------------------1 ° Funktion unbekannt
6 ° Handle nicht definiert
19 ° Falsche Daten aus der Fontdatei gelesen
31 ° Kein Prepare Start ausgeführt
Nur wenn das Carry-Flag nicht gesetzt ist, konnte die Funktion erfolgreich ausgeführt
werden.
Select (CL = 4AH)
Dieser Aufruf wird benutzt, um nach einem Prepare Start mit anschließendem Laden der
Fontdaten über 4403H die Code Pages zu selektieren. Der Aufruf erfolgt in der bereits
beschriebenen Weise mit der Ausnahme das der Zeiger DS:DX auf das Feld mit der Zahl
der Code Pages positioniert wird. Damit hat die Tabelle folgenden Aufbau:
Byte ° Bedeutung
-------é--------------------------------------2
° Länge des Datenbereiches in Byte
2
° Code Page ID
2n
° DBCS lead byte range (DOS 4.0)
2
° 0000H Abschluß Datenbereich (DOS 4.0)
Tabelle 4.19: Datenstruktur bei CL = 4AH, 6AH
Hinter der Code Page ID findet sich ein Feld mit n Worten, in dem der Wertebereich für
das erste Byte der DBCS (Double Byte Character Set) spezifiziert wird. Diese DBCS
werden zum Beispiel zur Darstellung von Kanji-Schriftzeichen benutzt. Deshalb
unterstützen nur Treiber mit der asiatischen Version von DOS 4.x diesen Aufruf.
Tritt bei der Operation ein Fehler auf, wird bei der Rückkehr das Carry-Flag gesetzt.
Mittels der Funktion 59H läßt sich dann der erweiterte Fehlercode abfragen. Es sind beim
Aufruf select folgende Fehlercodes belegt:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
256
Code ° Bedeutung
-----é-------------------------------------------------1 ° Funktion unbekannt
6 ° Handle nicht definiert
26 ° Die Code Pages sind nicht initialisiert
27 ° Der selektierte Tastaturtreiber unterstützt diese
° Code Page nicht
29 ° Fehler in der Einheit
65 ° Gerät läßt sich nicht auf die angegebene Codeseite umschalten
Nur wenn das Carry-Flag nicht gesetzt ist, kann die Funktion erfolgreich ausgeführt
werden.
Query Selected (CL = 6AH)
Mit diesem Aufruf lassen sich die selektierten Code Pages abfragen. Der Aufruf erfolgt in
der bereits beschriebenen Weise mit der Ausnahme, daß der Zeiger DS:DX auf das Feld
mit der Zahl der Code Pages positioniert wird. Damit hat die Tabelle folgenden Aufbau:
Byte ° Bedeutung
-------é--------------------------------------2
° Länge des Datenbereiches in Byte
2
° Code Page ID
2n
° DBCS lead byte range (DOS 4.0)
2
° 0000H Abschluß Datenbereich (DOS 4.0)
Tabelle 4.20: Datenstruktur bei CL = 6AH
Tritt bei der Operation ein Fehler auf, wird bei der Rückkehr das Carry-Flag gesetzt.
Mittels der Funktion 59H läßt sich dann der erweiterte Fehlercode abfragen. Es sind beim
Aufruf Query Selected folgende Fehlercodes denkbar:
Code ° Bedeutung
-----é----------------------1 ° Funktion unbekannt
6 ° Handle nicht definiert
26 ° Keine Page selektiert
27 ° Device-Fehler
Nur wenn das Carry-Flag nicht gesetzt ist, konnte die Funktion erfolgreich ausgeführt
werden.
Query Prepare List (CL = 6BH)
Mit diesem Aufruf lassen sich die eingestellten Code Pages abfragen. Der Aufruf erfolgt in
der oben beschriebenen Weise. Allerdings muß die im Registerpaar DS:DX adressierte
Tabelle eine erweiterte Struktur besitzen. Neben den maximal 12 ladbaren Fonts kann das
System bis zu 12 weitere Hardwarefonts unterstützen. Die Tabelle muß so bemessen sein,
daß sie maximal alle Daten (27 Wörter) aufnehmen kann. Diese Daten besitzen folgende
Struktur:
Wert ° Bedeutung
-------é----------------------------------------------------x ° Länge in Bytes der folgenden Felder ((n+1)+(m+1))*2
n ° Zahl der Hardware Code Pages (max. 12)
-1 ° Hardware »Code PageFehler! Verweisquelle konnte nicht gefunden werden. . ° .
-1 ° Hardware »Code PageFehler! Verweisquelle konnte nicht gefunden werden. m ° Zahl der ladbaren
Code Pages (max. 12)
-1 ° geladene »Code PageFehler! Verweisquelle konnte nicht gefunden werden. . ° .
-1 ° geladene »Code PageFehler! Verweisquelle konnte nicht gefunden werden.Tabelle 4.21: Datenstruktur
bei CL = 6BH
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
257
Tritt bei der Operation ein Fehler auf, wird bei der Rückkehr das Carry-Flag gesetzt.
Mittels der Funktion 59H läßt sich dann der erweiterte Fehlercode abfragen. Es sind beim
Aufruf Query Prepare List folgende Fehlercodes denkbar:
Code ° Bedeutung
------é-----------------------------1 ° Funktion unbekannt
6 ° Handle nicht definiert
26 ° Keine Code Pages selektiert
29 ° Fehler in der Einheit
Nur wenn das Carry-Flag nicht gesetzt ist, kann die Funktion erfolgreich ausgeführt
werden.
Get/Set Display Informationen (CL=5FH oder 7FH)
Ab DOS 4.0 wurde der Aufruf AX=440CH um zwei weitere Funktionen erweitert. Die in
Tabelle 4.17 angegebenen Code-Page-Unterfunktionen (CL) sind nur für die LPT-Einheit
(CH = 5) gültig. Ab DOS 4.0 wurden für die CON-Einheit (CH = 3) zwei weitere
Subfunktionen eingeführt.
Ö----------------------------------------------------Ì
° CH ° Einheit
CL ° Unterfunktion
°
° ---é-----------é-------------------------°
°
3 ° CON
5FH ° Set display information
°
°
7FH ° Get display information
°
Û----------------------------------------------------ì
Die beiden Aufrufe lesen oder setzen die Display-Informationen der StandardAusgabeeinheit. Das Registerpaar DS:DX zeigt dabei auf einen Parameterblock mit
folgender Struktur:
Ö--------Ú-------Ú---------------------------------------Ì
° Offset ° Byte ° Feld
°
û--------é-------é---------------------------------------À
°
00
°
1 ° Info Level (immer 0)
°
û--------é-------é---------------------------------------À
°
01
°
1 ° reserviert (immer 0)
°
û--------é-------é---------------------------------------À
°
02
°
2 ° Restlänge Parameterblock (14)
°
û--------é-------é---------------------------------------À
°
04
°
2 ° Control-Flag
°
°
°
° Bit 0 = 0 Vordergrundfarbe
°
°
°
°
1 Blinken
°
û--------é-------é---------------------------------------À
°
06
°
1 ° Video Mode 1=Text Mode, 2 APA-Mode
°
û--------é-------é---------------------------------------À
°
07
°
1 ° reserviert (immer 0)
°
û--------é-------é---------------------------------------À
°
08
°
2 ° Zahl der Farben (Mono = 0)
°
Û--------Ù-------Ù---------------------------------------ì
Ö--------Ú-------Ú---------------------------------------Ì
° Offset ° Byte ° Feld
°
û--------é-------é---------------------------------------À
°
0A
°
2 ° Display-Höhe in Pixeln (APA-Mode)
°
û--------é-------é---------------------------------------À
°
0C
°
2 ° Display-Breite in Pixeln (APA-Mode)
°
û--------é-------é---------------------------------------À
°
0E
°
2 ° Display-Höhe in Zeichen
°
û--------é-------é---------------------------------------À
°
10
°
2 ° Display-Breite in Zeichen
°
Û--------Ù-------Ù---------------------------------------ì
Die Informationen in diesem Parameterblock beeinflussen die Darstellung der StandardAusgabeeinheit. Bei der Leseoperation muß im Anwenderprogramm ein genügend großer
Buffer zur Aufnahme des Parameterblocks reserviert werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
258
4.65.10 Generic IOCTL Request (Funktion 44H, Code 0DH, DOS 3.2 6.x)
Dieser Aufruf ist erst ab DOS 3.2 implementiert. Er erlaubt es, innerhalb eines
blockorientierten Einheitentreibers verschiedene Unterfunktionen zu aktivieren. Der Aufruf
erfolgt mit folgenden Registerwerten:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
0DH (Generic IOCTL)
°
° BL:
Laufwerknummer
°
° CH:
Hauptcode immer 08H
°
° CL:
Untercode (Funktion)
°
° DS:DX Zeiger auf Parameter- °
°
block
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
°
clear -> kein Fehler
°
Û-------------------------------ì
Im Register AX steht immer der Wert 440DH. Das logische Laufwerk wird in BL
spezifiziert (0 = Default, 1 = A:, 2 = B:, etc.). Das Register CX enthält den Steuercode für
die jeweilige Unterfunktion. Das Register CH wird bei allen Aufrufen einheitlich mit dem
Wert 08H initialisiert. Im Register CL findet sich dann ein Untercode, der die jeweilige
Teilfunktion spezifiziert. In Abhängigkeit von der DOS-Version werden folgende
Funktionen unterstützt:
Code ° Funktion
-----é-------------------------------------------40H ° Set Device Parameters
60H ° Get Device Parameter
41H ° Write Track on a logical Device
61H ° Read Track on a logical Device
42H ° Format and Verify Track on a logical Device
62H ° Verify Track on a logical Device
47H ° Set Access Flag (DOS 4.0)
67H ° Get Access Flag (DOS 4.0)
46H ° Set Media ID (DOS 4.0)
66H ° Get Media ID (DOS 4.0)
68H ° Sense Media Type (DOS 5.0)
Das Registerpaar DS:DX enthält einen Zeiger auf einen Parameterblock. Dessen Struktur
ist abhängig von der selektierten Unterfunktion.
Get / Set Device Parameters (CL = 60H / 40H)
Mit diesen Unterfunktionen lassen sich die Parameter einer Einheit lesen oder setzen. Bei
Get (CL = 60H) und Set (CL = 40H) gilt der gleiche Aufbau des Parameterblocks:
Bytes ° Bedeutung
-------é------------------------------1
° Bitfeld für Spezialfunktionen
1
° Einheitentyp
1
° Attribute des Treibers
2
° Zahl der Zylinder (Platte)
1
° Typ des Speichermediums
x
° Parameterblock der Einheit
x
° Spuraufbau der Einheit
Tabelle 4.22: Aufbau des Parameterblocks bei 440DH (CL = 40H oder 60H)
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
259
Die Datenfelder Parameterblock der Einheit und Spuraufbau der Einheit werden
nachfolgend aufgeschlüsselt.
Bitfeld für Spezialfunktionen
Mit dem ersten Byte (Spezialfunktionen) lassen sich die Get- und Set-Funktionen steuern.
Es gelten folgende Bedingungen:
Bei der Get-Operation (CL = 60H) ist nur Bit 0 definiert, alle anderen Bits sind beim
Aufruf zu löschen. Mittels des Bits wird der zurückgegebene BIOS-Parameter-Block
(BPB) selektiert:
Bit 0 :
1:
Es wird der Build-BIOS-Parameter-Block zurückgegeben
0:
Der Standard-BIOS-Parameter-Block wird zurückgegeben
Bei der Set-Operation (CL = 40H) sind die Bits 0, 1 und 2 belegt. Es gelten folgende
Bedingungen:
Bit 0 :
1:
Alle nachfolgenden Abfragen des Build BPB geben den Device BPB zurück. Wird
ein weiteres Set Device Parameter mit Bit 0 = 0 abgesetzt, dann ist bei der BuildBPB-Kommando-Abfrage das aktuelle Medium BPB zurückzugeben.
0:
Das Device-BPB-Feld enthält eine neue Standard Einstellung für die Einheit. Falls
ein vorhergehender Set-Aufruf das Bit gesetzt hatte, wird die aktuelle Einstellung
des Media BPB zurückgegeben. Andernfalls wird die Standard-BPB-Einstellung
des Treibers bei der Build-BPB-Abfrage zurückgegeben.
Bit 1 :
1:
Alle Felder des Parameterblocks, bis auf das Feld Spuraufbau der Einheit, sind zu
ignorieren.
0:
Alle Felder des Parameterblocks sind auszuwerten.
Bit 2 :
1:
Alle Sektoren einer Spur besitzen die gleiche Länge. Weiterhin liegen alle
Sektornummern zwischen 1 und n.
0:
Die Sektoren einer Spur besitzen unterschiedliche Längen.
Die Bits 0 und 1 schließen sich gegenseitig aus, d.h., sie können nicht gleichzeitig gesetzt
werden. Bei einem Set-Aufruf sollte Bit 2 immer gesetzt werden, da dann das Formatieren
einer Spur wesentlich schneller erfolgen kann.
Einheitentyp
Das zweite Byte beschreibt die Art der physikalisch angeschlossenen Einheit. Es gilt
folgende Kodierung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
260
Wert ° Einheitentyp
-----é--------------------------------0 ° 320/360 Kbyte 51/4-Zoll-Diskette
1 ° 1,2 Mbyte 51/4-Zoll-Diskette
2 ° 720 Kbyte 31/2-Zoll-Diskette
3 ° 8 Zoll einfache Dichte
4 ° 8 Zoll doppelte Dichte
5 ° Festplatte
6 ° Bandlaufwerk
7 ° 1,44 Mbyte-Laufwerk
8 ° 2,88 Mbyte-Laufwerk
9 ° Anderes Speichermedium
Tabelle 4.23: Kodierung der Speichermedien
Diese Daten lassen sich lediglich über die Get-Funktion abfragen.
Attribute des Treibers
Dieses Feld umfaßt ein Byte, welches die Attribute der Einheit spezifiziert:
Bit 0:
1:
Das Speichermedium ist nicht wechselbar.
0:
Das Speichermedium ist auswechselbar.
Bit 1:
1:
Ein Diskettenwechsel wird vom Treiber unterstützt.
0:
Ein Diskettenwechsel wird nicht unterstützt.
Die Attribute lassen sich nicht setzen, da sie im Treiber definiert sind. Die restlichen Bits
sind nicht definiert.
Zahl der Zylinder
In diesem Feld wird die maximale Zahl der durch den Treiber unterstützten Zylinder
angegeben. Insbesondere bei Festplatten ist die Speicheroberfläche in mehrere Zylinder mit
getrennten Schreib-Lese-Köpfen unterteilt. Der Wert in dem Feld ist unabhängig vom
Speichermedium. Die Informationen lassen sich lediglich abfragen, da innerhalb des
Treibers die Zahl der unterstützten Zylinder fest implementiert ist.
Typ des Speichermediums
Dieses Feld ist zur Unterstützung von Diskettenlaufwerken erforderlich. Spätestens seit der
Einführung der 1,2-Mbyte-Disketten unterstützen die Laufwerke mehrere Formate. In dem
Feld wird daher angegeben, ob eine 1,2-Mbyte- oder 360-Kbyte-Diskette im 51/4-ZollLaufwerk eingelegt ist. Es gilt folgende Kodierung:
0:
Quad density (96 tpi) Disk mit 1,2 Mbyte
1:
Double density (48 tpi) Disk mit 320/360 Kbyte
Als Standardeinstellung für diese Laufwerke wird eine 1,2-Mbyte-Diskette angenommen.
Das Feld wird allerdings nur benutzt, wenn das aktuelle Speichermedium innerhalb des
Laufwerkes nicht anders bestimmt werden kann.
Parameterblock der Einheit
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
261
Hier handelt es sich um eine komplette Datenstruktur, die alle Informationen über den Typ
des Speichermediums sowie seine logische Aufteilung für MS-DOS enthält. Die Struktur
besitzt folgenden Aufbau:
Bytes° Bedeutung
-----é---------------------------------------2 ° Bytes pro Sektor
1 ° Sektoren pro Cluster
2 ° Zahl der reservierten Sektoren
1 ° Zahl der File-Allocation-Tabellen (FAT)
2 ° Zahl der Einträge im Hauptverzeichnis
2 ° Gesamtzahl aller Directory-Einträge
1 ° Type des Speichermediums
2 ° Sektoren pro FAT
2 ° Sektoren pro Spur
2 ° Zahl der Köpfe
4 ° Zahl der unsichtbaren (hidden) Sektoren
4 ° reserviert 1
6 ° reserviert 2
Tabelle 4.24: Aufbau des Device-BIOS-Parameter-Blocks (BPB)
Abhängig vom Bit 0 im Spezialfunktionsfeld wird der BPB oder der Build BPB
zurückgegeben. Die Bedingungen wurden in dem entsprechenden Absatz erläutert.
Spuraufbau der Einheit
Bei diesem Feld handelt es sich um eine Tabelle mit variabler Länge, die den Spuraufbau
innerhalb des Speichermediums angibt. MS-DOS besitzt nur eine globale
Beschreibungstabelle für alle Laufwerke. Falls sich die Attribute eines Mediums ändern,
muß mit dem Set-Parameter-Befehl diese Tabelle aktualisiert werden. Die Tabelle wird
unabhängig von der Spezifikation des Spezialfunktionsfeldes gesetzt. Beim Aufruf Get
Parameter wird das Feld nicht benutzt.
Lediglich die Schreib-Lese-, Format- und Verify-Aufrufe benutzen diese Tabelle. Diese
besteht aus n Worten und besitzt folgenden logischen Aufbau:
Wert ° Bedeutung
-----é--------------------------------n
° Zahl der Sektoren in der Tabelle
1
° Sektor Nummer 1
200H ° Sektorlänge in Bytes
.
° .
n
° Sektor Nummer n
200H ° Sektorlänge in Bytes
Tabelle 4.25: Aufbau des Track-Layout-Feldes
Für jeden Sektor einer Spur werden 2 Wörter in der Tabelle reserviert. Im ersten findet sich
die Nummer des Sektors, während das zweite Wort die Sektorlänge angibt. Standardmäßig
setzt MS-DOS die Länge auf 512 Byte (200H) pro Sektor. Die Zahl der Sektoren innerhalb
der Tabelle wird im ersten Wort angegeben. Die Einträge für die Sektornummer dürfen
demnach nicht größer als die Zahl der Sektoren in der Tabelle sein. Falls im
Spezialfunktionsfeld das Bit 2 gesetzt ist, müssen die Werte für die Sektorlänge gleich sein.
Generell sollten die Einstellwerte für den Laufwerkstyp, die Attribute der Einheit und die
Zahl der Köpfe nur dann geändert werden, wenn das physikalische Laufwerk gewechselt
wurde.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
262
Die Funktion besitzt folgende Fehlercodes:
Code Fehler
1 Funktion nicht definiert
15 Laufwerk existiert nicht
Read / Write Track; on Logical Device (440DH CL = 41H und CL = 61H)
Mit diesen beiden Unterfunktionen lassen sich ganze Spuren einer logischen Einheit lesen
oder schreiben. Die Unterfunktion wird durch den Wert in CL gesteuert:
CL = 61H Lese Spur
CL = 41H Schreibe Spur
Der Aufruf der Funktion erfolgt mit den gleichen Parametern wie bereits oben beschrieben
wurde. Lediglich der Wert für das Register CL muß angepaßt werden. Außerdem besitzt
der durch das Registerpaar DS:DX adressierte Parameterblock den folgenden Aufbau:
Bytes ° Bedeutung
------é-----------------------------1
° Bitfeld für Spezialfunktionen
2
° Kopfnummer
2
° Zylindernummer
2
° Erster Sektor
2
° Zahl der Sektoren
4
° Zeiger auf den Transferpuffer
Tabelle 4.26: Aufbau des Parameterblocks bei 440DH CL = 41H oder 61H
Das erste Byte muß auf den Wert 0 (Reset Bits) gesetzt werden. Der Kopf gibt an, auf
welcher Oberfläche die Schreib-Lese-Operation stattfinden soll. Der Wert des Zylinders
wird von 0 gezählt, d.h. für den zweiten Zylinder muß eine 1 eingetragen werden. Der erste
Sektor, ab dem geschrieben werden soll, wird in dem Wort erster Sektor spezifiziert. Der
Wert wird ebenfalls von 0 an gezählt. Das nächste Feld gibt an, wie viele Sektoren
insgesamt zu schreiben oder zu lesen sind. Der Block wird abgeschlossen mit einem Zeiger
auf den Schreib-Lese-Puffer (DTA). Der Puffer muß im rufenden Prozeß reserviert werden.
Ein Schreib-Lese-Zugriff über die 64-Kbyte-Grenze ist nicht möglich. Es kann auch nur
eine komplette Spur gelesen oder geschrieben werden.
Falls während der Operation Fehler auftreten, Carry-Flag gesetzt, lassen sich diese über die
Funktion 59H abfragen. Hierbei sind folgende Fehler definiert:
Code Fehler
1 Funktion nicht definiert
15 Laufwerk existiert nicht
Format / Verify Track on Logical Device (440DH CL = 42H und CL = 62H)
Mit dieser Unterfunktion lassen sich einzelne Spuren formatieren oder verifizieren. Die
Aktion wird über den Wert des CL Registers gesteuert:
CL = 42H Formatiere und verifiziere die Spur
CL = 62H Verifiziere die Spur
Es gelten die gleichen Aufrufparameter wie bei den anderen Unterfunktionen. Der Wert für
CL ist anzupassen und der durch DS:DX adressierte Parameterblock besitzt folgenden
Aufbau:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
263
Bytes ° Bedeutung
------é------------------------------1
° Bitfeld für Spezialfunktionen
2
° Kopfnummer
2
° Zylindernummer
Tabelle 4.27: Aufbau des Parameterblocks bei 440DH CL = 42H/62H
Beim Aufruf wird Bit 0 des Spezialfunktionsfeldes ausgewertet. Es gilt folgende
Nomenklatur:
Bit 0:
1
= Format-Status-Check
0
= Format/Verify-Start
Mit der Abfrage des Format-Status läßt sich prüfen, ob eine Kombination Spuren und
Sektoren pro Spur bei der Format- und Verify-Operation unterstützt wird. Hierzu ist vorher
ein Set-Device-Parameter-Aufruf mit einem korrekten BPB abzusetzen. Der Treiber gibt
dann bei der Abfrage des Format-Status im Spezialfunktionsfeld zurück:
Bit
0:
Die Funktion wird durch das ROM-BIOS unterstützt. Der Zugriff auf einzelne
Spuren und die Angabe Sektoren pro Spur ist für Diskettenlaufwerke erlaubt.
1:
Die Funktion wird nicht durch das ROM-BIOS unterstützt.
2:
Die Funktion wird durch das ROM-BIOS unterstützt. Ein Zugriff über Spuren und
Sektoren pro Spur ist bei Diskettenlaufwerken nicht erlaubt.
3:
Die Funktion wird durch das ROM-BIOS unterstützt, aber der Treiber kann die
Zahl der Spuren und die Zahl der Sektoren pro Spur nicht ermitteln, da das
Diskettenlaufwerk leer ist.
Um eine Spur zu formatieren, sind folgende Schritte notwendig:
·
Aufruf der Set-Parameter-Funktion, um die Formatparameter zu übergeben.
·
Aufruf des Format-Status-Check, um die Zahl der Spuren des Laufwerks und die Zahl
der Sektoren pro Spur zu überprüfen.
·
Aufruf der Format- und Verify-Funktion mit Bit 0 im Spezialfunktionsfeld = 0, um die
einzelnen Spuren zu bearbeiten.
Ab DOS 4.0 gibt der Aufruf folgende Informationen im Parameterblock zurück:
Bit 0:
1:
2:
3:
Word:
Word:
1 falls die spezifizierte Spur unterstützt wird
1 keine BIOS-Unterstützung
1 Spur, Sektor/Spur wird nicht unterstützt
1 keine Disk im Laufwerk
Zahl der Köpfe
Zahl der Zylinder
Die Informationen im Byte 0 (Flags) stimmen mit den Daten von DOS 3.x überein.
Get/Set Access Flag Status (440DH, CL = 67H und CL = 47H)
Diese Unterfunktion ist erst ab DOS 4.0 implementiert. Mit dem Wert in CL wird die
jeweilige Funktion selektiert:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
264
CL = 67H: Get Access Flag Status
CL = 47H: Set Access Flag Status
Über den Zeiger DS:DX wird ein Parameterblock mit folgender Struktur adressiert:
Ö------Ú----------------------------------Ì
° Byte ° Feld
°
û------é----------------------------------À
°
0 ° Spezialfunktionsfeld
°
û------é----------------------------------À
°
1 ° Disk Access Flag
°
Û------Ù----------------------------------ì
Solange ein Medium nicht formatiert wurde oder einen ungültigen Bootrecord enthält,
sperrt das System jeden Zugriff per I/O-Funktion. Das Disk-Access-Flag weist dann den
Wert 0 auf. Der Formataufruf über die Funktion CL = 47H setzt den Wert des Flags
ungleich 0, sobald das Medium erfolgreich formatiert wurde. Im Fehlerfall bleibt das Flag
= 0, um weitere Zugriffe zu blockieren. Dadurch läßt sich die Datenintegrität einer Platte
leicht gewährleisten. Die Funktion definiert folgende Fehlercodes:
Code
1
5
15
Fehler
Funktion nicht definiert
Zugriff verweigert
Laufwerk existiert nicht
Get/Set Media ID (440DH, CL = 66H und CL = 46H)
Diese Unterfunktionen sind erst ab DOS 4.0 implementiert. Sie erlauben es, die
Seriennummer, den Typ des Dateisystems, sowie das Volumelabel im Boot-Record des
Speichermediums zu setzen oder abzufragen. Mit dem Wert in CL wird die jeweilige
Funktion selektiert:
CL = 66H: Get Media ID
CL = 46H: Set Media ID
Über den Zeiger DS:DX wird ein Parameterblock mit folgender Struktur adressiert:
Ö------Ú----------------------------------Ì
° Byte ° Feld
°
û------é----------------------------------À
°
2 ° Info-Level (immer 0)
°
û------é----------------------------------À
°
4 ° Seriennummer
°
û------é----------------------------------À
° 11 ° Media Namen
°
û------é----------------------------------À
°
8 ° Typ des Dateisystems
°
Û------Ù----------------------------------ì
Das erste Word sollte immer mit dem Wert 0 belegt werden. Ab Offset 02H folgt eine 4Byte-Konstante mit der Seriennummer des Datenträgers. Daran schließt sich ein Feld mit
11 Zeichen an, welches den im Bootrecord einzutragenden Medium Namen enthält.
Abgeschlossen wird die Struktur durch ein 8 Byte langes Feld mit dem Namen des
Dateisystems (z.B. 'FAT12 ', 'FAT16 '). Fehlende Zeichen sind mit Blanks aufzufüllen.
Beim Get-Aufruf werden die Daten aus dem Boot-Record des Mediums gelesen und in
obiger Datenstruktur zurückgegeben. Beim Set-Aufruf sind die Daten in obiger Struktur zu
definieren. Sie werden anschließend in den Boot-Record ausgelagert.
Die Funktion definiert folgende Fehlercodes:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Code
1
5
15
265
Fehler
Funktion nicht definiert
Zugriff verweigert
Laufwerk existiert nicht
Sense Media Type (440DH, CL = 68H)
Diese Unterfunktionen sind erst ab DOS 5.0 implementiert. Sie ermittelt, welches Format
ein Speichermedium hat. Mit dem Wert CL = 68H wird die Funktion selektiert. Über den
Zeiger DS:DX wird ein Parameterblock mit folgender Struktur adressiert:
Ö------Ú----------------------------------Ì
° Byte ° Feld
°
û------é----------------------------------À
°
1 ° Format Type
°
û------é----------------------------------À
°
1 ° Size Type
°
Û------Ù----------------------------------ì
Das erste Byte gibt an, ob es sich um ein Standard-DOS-Format (Wert = 0) oder um ein
nicht standardisiertes Format (Wert = 1) handelt. Im folgenden Byte findet sich dann eine
Information über die Kapazität des Speichermediums. Hierbei gilt folgende Kodierung:
Code
02H
07H
09H
Kapazität
720 Kbyte
1,44 Mbyte
2,88 Mbyte
Die Funktion ist durch Microsoft nicht komplett dokumentiert, dürfte aber folgende
Fehlercodes zurückgeben:
Code
1
5
15
Fehler
Funktion nicht definiert
Zugriff verweigert
Laufwerk existiert nicht
4.65.11 I/O Control for Device (Funktion 440EH, DOS 3.2 - 6.x)
Dieser Aufruf ist erst ab DOS 3.2 implementiert. Er prüft, ob eine logische Einheit einer
blockorientierten Einheit zugeordnet ist. Es gelten nebenstehende Übergabeparameter.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
0EH (I/O Control)
°
° BL:
Laufwerknummer
°
û-------------------------------À
°
°
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: clear -> kein Fehler
°
° AL:
Laufwerke
°
°
°
Û-------------------------------ì
Im Register BL wird die Nummer des gewünschten Laufwerkes angegeben (0 = Default, 1
= A:, 2 = B:, etc.). Falls kein Fehler auftritt, das Carry-Flag ist nach dem Aufruf gelöscht,
enthält das Register AL die Nummer des letzten zugeordneten logischen Laufwerkes (1 =
A:, 2 = B:, etc.). Falls nur eine Einheit zugeordnet ist, enthält AL den Wert 0.
Bei Systemen mit einem Diskettenlaufwerk sind diesem z.B. in der Regel die logischen
Laufwerkskennbuchstaben A: und B: zugeordnet. Beim Aufruf wird deshalb das AL-
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
266
Register mit dem Wert des ersten Laufwerks belegt (1 = A:). Bei der Rückkehr enthält AL
den Wert der letzten zugeordneten Einheit (2 = B:), d.h., dem Laufwerk sind die logischen
Einheiten A: bis B: zugeordnet.
Tritt während des Aufrufes ein Fehler auf, ist das Carry-Flag gesetzt. Im Register AX wird
dann ein Fehlercode mit folgender Bedeutung zurückgegeben.
Code
1
15
Fehler
Funktion nicht definiert
Laufwerk existiert nicht
Die Fehlerursache ist bei den Extended-DOS-Errors beschrieben und läßt sich auch durch
die Funktion 59H abfragen.
4.65.12 Set Logical Drive (Funktion 440FH, DOS 3.2 - 6.x)
Auch dieser Aufruf ist erst ab DOS 3.2 implementiert. Er erlaubt es, einer blockorientierten
Einheit den nächsten logischen Laufwerksbuchstaben zuzuordnen. Es gelten folgende
Aufrufkonventionen:
Laufwerksbuchstaben zuordnen;
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
0FH
°
° BL:
Laufwerknummer
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: clear -> kein Fehler
°
° AL:
Laufwerke
°
Û-------------------------------ì
Im Register BL wird die Nummer des gewünschten Laufwerkes angegeben (0 = Default, 1
= A:, 2 = B:, etc.). Beim Aufruf wird dann der nächste logische Laufwerksname
zugeordnet. Falls kein Fehler auftritt, das Carry-Flag ist nach dem Aufruf gelöscht, enthält
das Register AL die Nummer des nun zugeordnetenen logischen Laufwerkes (1 = A:, 2 =
B:, etc.).
Mit der Funktion 440EH läßt sich prüfen, ob mehrere logische Einheiten zugeordnet sind.
Jeder Aufruf schaltet demnach die Laufwerks-Kennung um einen Buchstaben weiter,
wobei die Reihenfolge zirkular ist. Falls nur eine Einheit zugeordnet ist, enthält AL den
Wert 0.
Dieser Aufruf wird z.B. bei Systemen mit einem Diskettenlaufwerk benutzt. Soll z.B. eine
Diskette kopiert werden, gibt DOS die Meldung:
Insert diskette for drive A: and strike any key when ready
aus. Anschließend kommt die gleiche Meldung mit der Laufwerksbezeichnung B:, usw.
Um diesen Wechsel zu unterstützten, läßt sich obige Funktion nutzen. Zuerst wird der
Laufwerksname A: eingestellt. Nach der Leseoperation stellt ein Aufruf der Funktion
440FH das Diskettenlaufwerk auf die logische Einheit B: um und veranlaßt die DOSAbfrage. Ein weiterer Aufruf schaltet die Einheit wieder auf A: zurück.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
267
Tritt während des Aufrufes ein Fehler auf, ist das Carry-Flag gesetzt. Im Register AX wird
dann ein Fehlercode mit folgender Belegung zurückgegeben.
Code
1
15
Fehler
Funktion nicht definiert
Laufwerk existiert nicht
Die Fehlerursache ist bei den Extended-DOS-Errors beschrieben und läßt sich auch durch
die Funktion 59H abfragen.
4.65.13 Query Support (Handle) (Funktion 4410H, DOS 6.x)
Dieser Aufruf ist erst ab DOS 5.0 implementiert und ermittelt, ob ein Funktionsaufruf per
440CH vom entsprechenden Treiber unterstützt wird. Es gelten folgende
Aufrufkonventionen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
10H
°
° BX:
Handle
°
° CH:
Hauptcode (Gerät)
°
° CL:
Subcode (Operation)
°
° DS:DX Adresse Parameterblock °
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: clear -> kein Fehler
°
Û-------------------------------ì
Im Register BX ist der Handle des Gerätes zu übergeben. In CH findet sich der Hauptcode
des Gerätes, welches überprüft werden soll. Es sind die Werte der Funktion 440CH als
Hauptcode erlaubt. In CL ist der Code für die Unterfunktion einzutragen. Auch hier gilt die
Codierung der Funktion 440CH.
In DS:DX ist die Adresse eines Parameterblocks zu übergeben. Für den Parameterblock
gilt die gleiche Kodierung wie bei der betreffenden Subfunktion des Aufrufes 440CH.
Beim Aufruf prüft DOS, ob die Funktion 440CH die entsprechende Subfunktion
unterstützt. Falls dies der Falls ist, ist das Carry-Flag nach dem Aufruf gelöscht und AX
enthält den Wert 0. Im Fehlerfall setzt DOS das Carry-Flag und in AX befindet sich der
Fehlercode:
Code
1
Fehler
Funktion nicht unterstützt.
Die Ursache kann allerdings mehrdeutig sein (Funktion nicht unterstützt, DOS-Version
falsch, Treiber unterstützt die Funktion 19H nicht).
4.65.14 Query Support (Block) (Funktion 4411H, DOS 6.x)
Auch dieser Aufruf ist erst ab DOS 5.0 implementiert und ermittelt, ob ein Funktionsaufruf
per 440DH vom entsprechenden Treiber unterstützt wird. Es gelten folgende
Aufrufkonventionen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
268
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
44H
°
° AL:
11H
°
° BL:
Laufwerk
°
° CH:
Hauptcode (Gerät = 08) °
° CL:
Subcode (Operation)
°
° DS:DX Adresse Parameterblock °
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: clear -> kein Fehler
°
Û-------------------------------ì
Im Register BL ist der Code für das betreffende Laufwerk (0 = default, 1 = A:, 2 = B:, etc.)
zu übergeben. CH enthält beim Aufruf immer den Wert 08H. In CL ist der Code für die
entsprechende Subfunktion der INT 21-Funktion 440DH zu übergeben. In DS:DX ist die
Adresse eines Parameterblocks zu übergeben.
Für den Parameterblock gilt die gleiche Kodierung wie bei der betreffenden Subfunktion
des Aufrufes 440DH.
Beim Aufruf prüft DOS, ob die Funktion 440DH die entsprechende Subfunktion
unterstützt. Falls dies der Fall ist, ist das Carry-Flag nach dem Aufruf gelöscht und AX
enthält den Wert 0. Im Fehlerfall setzt DOS das Carry-Flag und in AX befindet sich der
Fehlercode:
Code
1
Fehler
Funktion nicht unterstützt.
Die Ursache kann allerdings mehrdeutig sein (Funktion nicht unterstützt, DOS-Version
falsch, Treiber unterstützt nicht die Funktion 19H).
Einige Zusatzprogramme unterstützen weitere Subfunktionen des INT 21, Funktion 44.
4.66 Duplicate File Handle (Funktion 45H, DOS 2.0 - 6.x)
Diese Funktion erzeugt ein zusätzliches Handle für eine Datei. Im Register BX muß das
Handle einer geöffneten Datei angegeben werden. Es gelten folgende Aufrufkonventionen:
Ö-------------------------------Ì
°
CALL:
INT 21
°
°
°
° AH:
45H
°
° BX:
Handle
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° AX:
neues Handle
°
Û-------------------------------ì
Falls kein Fehler auftritt, das Carry-Flag ist nicht gesetzt, gibt die Funktion den neuen
Handle im AX-Register zurück. Mit diesem Code kann sich anschließend ein Prozeß auf
die gleiche Datei beziehen. Selbst die internen Zeiger innerhalb der Datei werden
übernommen. Eine Veränderung der Schreib-Lese-Zeiger wirkt sich auf beide Handles aus.
Normalerweise wird diese Funktion benutzt, um die Standard I/O-Devices umzuleiten.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
269
Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt und in AX findet
sich der Fehlercode:
Code ° Bemerkung
-------é-----------------------------------------------4
° Zu viele offene Dateien, kein Handle mehr frei
6
° Der Handle ist nicht eröffnet oder ungültig
Die Extended DOS Errors Codes lassen sich mit der Funktion 59H abfragen. Mit dem
Aufruf 45H des INT 21 läßt sich die erst ab DOS 3.3 implementierte Funktion Commit File
in früheren DOS-Versionen nachbilden.
4.67 Force Duplicate File Handle (Funktion 46H, DOS 2.0 6.x)
Diese Funktion übernimmt das spezifizierte Handle, um auf die gleiche Datei zu zeigen,
die bereits durch ein anderes Handle belegt ist.
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
46H
°
° BX:
Handle 1
°
° CX:
Handle 2
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° --kein Fehler
°
Û-------------------------------ì
Falls kein Fehler auftritt, das Carry-Flag ist nicht gesetzt, hat die Funktion den neuen
Handle der im CX-Register steht, der geöffneten Datei zugewiesen. Falls die durch CX
adressierte Datei geöffnet war, wird sie beim Aufruf geschlossen.
Nach diesem Aufruf werden die Schreib-Lese-Zeiger der beiden Handles auf gleichen
Werten gehalten. Normalerweise wird diese Funktion benutzt, um die Standard-I/OAusgaben umzuleiten.
Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt und in AX findet
sich der Fehlercode:
Code ° Bemerkung
-------é-----------------------------------------------4
° Zu viele offene Dateien, kein Handle mehr frei
6
° Der Handle ist nicht eröffnet oder ungültig
Mit der Funktion 46H lassen sich die erweiterten DOS-Fehlercodes abfragen. In DOS 3.3
kommt es zu einem Systemabsturz, falls CX = BX gesetzt wird.
4.68 Get Current Directory (Funktion 47H, DOS 2.0 - 6.x)
Diese Funktion gibt den Pfadnamen des aktuellen Directory zurück. Es gelten folgende
Aufrufkonventionen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
270
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
47H
°
° DL:
Drive Nummer
°
° DS:SI Zeiger auf einen Puffer°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° --kein Fehler
°
Û-------------------------------ì
In DL muß eine gültige Laufwerksnummer (0 = Default, 1 = A:, 2 = B:, etc.) stehen. Das
Registerpaar DS:SI muß auf einen mindestens 64 Byte großen Puffer zeigen, in dem der
Pfad abgelegt werden kann. Der Pfadname wird als ASCIIZ-String, der den Weg vom
Hauptverzeichnis bis zum aktuellen Unterverzeichnis angibt, zurückgegeben. Der String
enthält allerdings keine Laufwerksbezeichnung und beginnt nicht mit dem Zeichen \ .
Er wird als ASCIIZ-String mit einem Nullbyte (00H) abgeschlossen.
Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt und in AX findet
sich der Fehlercode:
Code ° Bemerkung
-------é----------------------------------------------15
° Das in DL angegebene Laufwerk in nicht gültig
Mittels der Funktion 59H lassen sich die erweiterten DOS-Fehlercodes abfragen. Die
Funktion gibt bei einem erfolgreichen Aufruf AX = 0100H zurück, was aber nicht
dokumentiert wurde. Viele von Microsoft entwickelte Windows-Programme nutzen aber
diese undokumentierte Eigenschaft.
4.69 Allocate Memory (Funktion 48H, DOS 2.0 - 6.x)
Diese Funktion versucht, den angeforderten Speicherbereich zu reservieren. Es gelten
folgende Aufrufkonventionen:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
48H
°
° BX:
Zahl der Paragraphen
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° AX:
Segment Adresse
°
° BX:
freie Paragraphen
°
Û-------------------------------ì
Mit dem Wert im Register BX wird vor dem Aufruf die Zahl der zu reservierenden
Paragraphen (16-Byte-Blöcke) spezifiziert. Falls kein Fehler auftritt, das Carry-Flag ist
nicht gesetzt, reserviert die Funktion den angeforderten Speicherbereich. Im Register AX
wird die Segmentadresse des Speicherbereiches zurückgegeben. Die erste freie Adresse des
Speicherblocks findet sich somit bei AX:0000H.
Das Register BX enthält nach dem Aufruf die Zahl der noch freien Paragraphen (16-ByteBlöcke) des größten freien Speicherbereiches.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
271
Um festzustellen, wieviel Speicher noch frei ist, kann folgender Trick angewandt werden:
Die Funktion wird aufgerufen, wobei die Zahl der angeforderten Paragraphen auf FFFFH
gesetzt wird. Dies bedeutet eine Anforderung von 1 Mbyte Speicher, was durch DOS nie
erfüllt werden kann, d.h. es wird kein Speicher reserviert. Anschließend gibt die Funktion
im Register BX die Zahl der noch freien Paragraphen zurück. Der angegebene Wert
spezifiziert allerdings nur die Summe der Paragraphen im größten freien Speicherblock.
Dies sagt aber nichts über die Lage und Größe der freien Bereiche aus. Die Lage ist
abhängig von der in DOS eingestellten Freispeicherverwaltungsstrategie. Im Kapitel über
den DOS-Memory-Manager finden sich weitere Informationen.
Tritt während des Aufrufs ein Fehler auf, wird das Carry-Flag gesetzt und in AX findet sich
der Fehlercode:
Code ° Bemerkung
-------é---------------------------------------------7
° Die Memory Control Blocks (MCB) sind zerstört
8
° Nicht genügend freier Speicherbereich um die
° angeforderte Menge zu reservieren.
Der Fehlercode 7 kann normalerweise nur vorkommen, wenn Anwenderprogramme sich
nicht an die Konventionen halten und selbst Speicherblöcke belegen. Mittels der Funktion
59H lassen sich auch die erweiterten DOS-Fehlercodes abfragen. Die Zuordnung der
MCB's zu einzelnen Programmen erfolgt über einen Zeiger im MCB-Kopf, der auf den
zugehörigen PSP des Programmes verweist. Ab DOS 3.3 werden bei der Suche nach
freiem Speicher (zur Zuweisung an COM-Programme) nebeneinander liegende freie
Blöcke zusammengefaßt.
4.70 Free Allocated Memory (Funktion 49H, DOS 2.0 - 6.x)
Diese Funktion gibt den angegebenen Speicherbereich wiede frei. Es gelten folgende
Aufrufkonventionen:Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
49H
°
° ES:
Segmentadr. Speicher
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° --kein Fehler
°
Û-------------------------------ì
Falls kein Fehler auftritt, das Carry-Flag ist nicht gesetzt, wird der reservierte Block,
dessen Adresse durch das ES-Register spezifiziert wurde, an den Speicherpool freigegeben.
Es genügt die Segmentadresse zu übergeben, da ja der Offset implizit 0000H ist. Die Länge
des Speicherbereiches ist intern im MCB vermerkt.
Nebeneinander liegende freie Blöcke werden allerdings nicht zusammengefaßt. Dies ist in
DOS 3.3 nur bei den Funktionen 48H und 4AH der Fall.
Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt und in AX findet
sich der Fehlercode:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
272
Code ° Bemerkung
-------é-----------------------------------------------------------7
° Die Memory Control Blocks (MCB) sind zerstört
9
° An der angegebenen Adresse findet sich kein Speicherblock,
° der durch die Funktion 48H reserviert wurde
Mit der Funktion 59H lassen sich die erweiterten DOS-Fehlercodes abfragen.
4.71 Set Block (Funktion 4AH, DOS 2.0 - 4.x)
Diese Funktion verändert die Größe des reservierten Speicherblocks. Es gelten folgende
Aufrufkonventionen:Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
4AH
°
° BX:
Zahl der Paragraphen
°
° ES:
Segmentadresse Block
°
û-------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° BX:
freie Paragraphen
°
° Carry: nicht gesetzt
°
° -kein Fehler
°
Û-------------------------------ì
Im Register ES wird die Segmentadresse des zu verändernden Speicherblocks angegeben.
BX enthält die gewünschte Speichergröße in Paragraphen (16-Byte-Blöcke). Falls kein
Fehler auftritt, das Carry-Flag ist nicht gesetzt, reserviert die Funktion den angeforderten
Speicherbereich. Falls dies nicht möglich ist (z.B. bei Vergrößerungen), gibt das Register
BX die Zahl der Paragraphen des größten freien Blocks zurück.
Bei Vergößerungen muß hinter dem Block ein freier MCB liegen. Ab DOS 3.3 faßt das
Betriebssystem nebeneinander liegende freie Blöcke bei der Suche nach freiem Speicher
zusammen.
Im Fehlerfall wird das Carry-Flag gesetzt und im AX-Register findet sich ein Fehlercode.
Code ° Bemerkung
-------é----------------------------------------------------------------7
° Die Memory-Control-Blocks (MCB) sind zerstört
8
° Nicht genügend freier Speicherbereich, um die angeforderte Menge
° zu reservieren
9
° Falsche Adresse in ES, gibt keinen Speicherblock an
Mit der Funktion 59H lassen sich die erweiterten Fehlercodes abfragen.
4.72 Load or Execute a Program (Funktion 4BH, DOS 2.0 6.x)
Mit der (EXEC) Funktion lassen sich unter DOS »Child Processe.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
273
4.72.1 Load and Execute (AL = 0)
Dieser Aufruf ist in allen DOS-Versionen vorhanden und lädt ein ausführbares Programm
(COM oder EXE) in den freien Speicher und startet dieses Programm als Subprozeß (Child
Process). Der Vaterprozeß (Parent Process) ist während der Laufzeit suspendiert. Es gilt
folgende Parameterübergabe:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
4BH
°
° AL:
00H (Load and Execute)
°
° DS:DX Zeiger auf einen ASCIIZ -°
°
String mit dem Pfadnamen °
° ES:BX Zeiger auf einen
°
°
Parameterblock
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
Û---------------------------------ì
Das Register AL wird mit dem Steuercode 0 besetzt. Das Registerpaar DS:DX zeigt auf
einen ASCIIZ-String, der Laufwerksbezeichnung, Pfad- und Dateiname des
auszuführenden Programmes beinhaltet. Beim Laden des neuen Programmes wird automatisch ein eigenes Programm Segment Prefix (PSP) angelegt. Um dieses Segment zu
initialisieren, benötigt der Lader allerdings verschiedene Informationen.
Diese müssen in einem Parameterblock abgelegt werden, der durch das Registerpaar ES:BX
adressiert wird. Er besitzt folgenden Aufbau:
Ö--------Ú-------Ú-----------------------------------------------Ì
° Offset ° Bytes ° Bedeutung
°
û--------é-------é-----------------------------------------------À
°
00H °
2
° Segmentadresse des Environment String
°
°
°
° 00 -> kopiere das »Parent
Environment«»û--------é-------é-----------------------------------------------À
°
02H °
4
° Zeiger (Segment:Offset) auf einen String mit °
°
°
° einer Kommandozeile, die ab Offset 80H im
°
°
°
° neuen PSP abgelegt wird. Die Zeile darf nicht °
°
°
° länger als 128 Byte sein
°
û--------é-------é-----------------------------------------------À
°
06H °
4
° Zeiger auf einen File Control Block, der ab
°
°
°
° Offset 5CH (FCB1) im neuen PSP abgelegt wird °
û--------é-------é-----------------------------------------------À
°
0AH °
4
° Zeiger auf einen File Control Block, der ab
°
°
°
° Offset 6CH (FCB2) im neuen PSP abgelegt wird °
Û--------Ù-------Ù-----------------------------------------------ì
Tabelle 4.28: Die Struktur der EXEC-Parametertabelle
DOS legt für den Subprozeß alle Informationen des Hauptprozesses offen, bzw. diese
Informationen werden kopiert. So wird für den »Child Processe beginnen. Falls das zu
ladende Programm im aktuellen Unterverzeichnis abgelegt ist, findet sich im Environment
der Pfad zu diesem Programm. Im ersten Wort des durch ES:BX adressierten Parameterblocks ist die Lage des Environmentbereiches abgelegt. Falls der Wert = 0 ist, dann
wird das Environment des »Parent ProcessesFehler! Verweisquelle konnte nicht
gefunden werden.Weiterhin sind auch alle geöffneten Dateien dem Subprozeß bekannt, es
sei denn, daß »Inherit BitH im »Parent ProcessFehler! Verweisquelle konnte nicht
gefunden werden.Child ProcessesFehler! Verweisquelle konnte nicht gefunden
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
274
werden.Parent ProcessesFehler! Verweisquelle konnte nicht gefunden werden.Um
einen Subprozeß laden zu können, muß genügend Speicher frei sein. Da normalerweise ein
Anwenderprogramm beim Laden den gesamten freien Speicher erhält, muß ein Teil mit der
Funktion 4AH freigegeben werden.
Die Funktion 4BH benutzt den Lader des Kommandointerpreters COMMAN.COM. Dieser
Lader befindet sich im transienten Bereich von COMMAND und wird vom Anwenderprogramm überschrieben. Ist nicht genügend Speicher vorhanden, um diesen Teil nachzuladen, dann bricht die Funktion mit einer Fehlermeldung ab. In diesem Fall ist das CarryFlag gesetzt und im AX-Register findet sich ein Fehlercode:
Code ° Fehler
--------é---------------------------------------------------1
° Subfunktion nicht unterstützt
2
° Die Programmdatei wurde nicht gefunden, oder
° der Pfad ist ungültig
3
° Suchweg nicht gefunden
4
° keine freien Handles
8
° Nicht genügend Speicher, um das Programm zu laden
11
° Die Programmdatei ist vom Typ EXE und enthält
° inkonsistente Informationen
Mittels der Funktion 59H lassen sich die erweiterten DOS-Fehlercodes abfragen.
Um das Programm zu laden und auszuführen, kann die reine EXEC-Funktion benutzt
werden. Dann muß das rufende Programm allerdings dafür sorgen, daß der richtige
Zugriffspfad eingestellt ist, daß keine EXE-Dateien zu bearbeiten sind, etc. Deshalb ist es
in der Regel einfacher, den Kommandoprozessor COMMAND.COM für diese Aufgabe zu
nutzen. DOS erlaubt es, eine zweite Kopie des Kommandoprozessors zu laden. Als Name
des auszuführenden Programms wird COMMAND.COM angegeben. Notfalls ist noch der
Pfad zur dieser Datei anzugeben. Im Parameterblock wird unter Offsetadresse 2 ein Zeiger
auf einen Kommandostring abgespeichert. Dieser muß das Format:
Länge /C Kommando 0DH
besitzen, damit der Kommandointerpreter den Reststring als ausführbare Anweisung interpretiert. Wegen der Komplexität wird das Thema in einem eigenen Abschnitt mit Hilfe von
Beispielprogrammen erläutert.
Achtung: Bei allen DOS-Versionen unter 3.0 werden die Register, einschließlich Stackpointer und Stacksegment, zerstört.
4.72.2 Load (AL = 1 undokumentiert)
Diese Funktion ist in allen DOS-Versionen ab 2.0 vorhanden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
275
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
4BH
°
° AL:
01H (Load)
°
° DS:DX Zeiger auf einen ASCIIZ- °
°
String mit dem Pfadnamen °
° ES:BX Zeiger auf einen
°
°
Parameterblock
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
Û---------------------------------ì
Dieser undokumentierte Aufruf entspricht im wesentlichen der Unterfunktion 4B00H,
wobei allerdings das Programm nur geladen und nicht gestartet wird. Es gelten die
Aufrufparameter der nebenstehenden Abbildung.
Der durch ES:BX adressierte Parameterblock besitzt folgenden Aufbau:
Ö--------Ú-------Ú-----------------------------------------------Ì
° Offset ° Bytes ° Bedeutung
°
û--------é-------é-----------------------------------------------À
00H °
2
° Segmentadresse des Environment Strings
°
°
°
°
° 00 -> kopiere das »Parent
Environment«»û--------é-------é-----------------------------------------------À
°
02H °
4
° Zeiger (Segment:Offset) auf einen String mit °
°
°
° einer Kommandozeile, die ab Offset 80H im
°
°
°
° neuen PSP abgelegt wird. Die Zeile darf nicht °
°
°
° länger als 128 Byte sein
°
û--------é-------é-----------------------------------------------À
°
06H °
4
° Zeiger auf einen File-Control-Block, der ab
°
°
°
° Offset 5CH (FCB1) im neuen PSP abgelegt wird °
û--------é-------é-----------------------------------------------À
°
0AH °
4
° Zeiger auf einen File-Control-Block, der ab
°
°
°
° Offset 6CH (FCB2) im neuen PSP abgelegt wird °
û--------é-------é-----------------------------------------------À
°
0EH °
4
° enthält nach dem Aufruf die Adresse des Stacks°
°
°
° SS:SP
°
û--------é-------é-----------------------------------------------À
°
12H °
4
° enthält nach dem Aufruf die Anfangsadresse
°
°
°
° CS:IP des neuen Prozesses
°
Û--------Ù-------Ù-----------------------------------------------ì
Die beiden letzten Einträge im Parameterblock sind vor dem Aufruf unbelegt. Die Funktion
speichert hier dann die Anfangsadresse des neuen Prozesses und die erste Stackadresse ab.
Nach dem Aufruf wird wieder zu aufrufenden Prozeß zurückgekehrt. Eine Verwendung ist
nur in wenigen Fällen möglich, zum Beispiel in Verbindung mit einer Betriebssystemerweiterung, die mehrere Programme im Speicher hält und abwechselnd aktiviert. Weitere
Einsatzbeispiele sind Debugger, die genau obige Funktionalität benötigen.
Bei einem fehlerhaften Aufruf ist das Carry-Flag gesetzt und im AX-Register findet sich ein
Fehlercode:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
276
Code ° Fehler
--------é-------------------------------------------------------1
° Subfunktion nicht unterstützt
2
° Die Programmdatei wurde nicht gefunden, oder
° der Pfad ist ungültig
3
° Suchweg nicht gefunden
4
° keine freien Handles
8
° Nicht genügend Speicher, um das Programm zu laden
10
° ungültiges Environment
11
° ungültiges Format im Parameterblock (ES:BX)
Der Fehler 4 tritt auf, falls zu viele Dateien geöffnet sind. Da DOS bei jedem zu startenden
Prozess standardmäßig 5 Handles belegt, kann bei einem Überlauf der System File Table
(SFT) kein neuer Prozess mehr gestartet werden. Der Fehler 10 kann nur auftreten, falls ein
selbst definiertes Environment übergeben wird. Mittels der Funktion 59H lassen sich die
erweiterten Fehlercodes bestimmen.
4.72.3 Load Overlay (AL = 3)
Diese Funktion ist ebenfalls ab DOS 2.0 vorhanden.
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
4BH
°
° AL:
03H (Load Overlay)
°
° DS:DX Zeiger auf einen ASCIIZ- °
°
String mit dem Pfadnamen °
° ES:BX Zeiger auf einen
°
°
Parameterblock
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
Û---------------------------------ì
Mit diesem Aufruf (AL = 3) lädt die Funktion 4BH eine Datei als Overlay in den freien
Speicher. Es sind nebenstehende Parameter zu setzen.
MS-DOS nimmt an, daß das Overlayprogramm in den Adreßbereich des laufenden
Prozesses geladen werden soll. Deshalb wird auch kein zusätzlicher Speicher benötigt und
es werden auch keine PSP und Environmentbereiche angelegt. Daher unterscheidet sich der
Aufbau des Parameterblocks von der oben diskutierten Form.
Ö--------Ú-------Ú-----------------------------------------------Ì
° Offset ° Bytes ° Bedeutung
°
û--------é-------é-----------------------------------------------À
°
00H °
2
° Segmentadresse, ab der das Overlayprogramm zu °
°
°
° laden ist
°
û--------é-------é-----------------------------------------------À
°
02H °
2
° Informationen für die Relokation einer EXE°
°
°
° Datei (Relocations Faktor)
°
Û--------Ù-------Ù-----------------------------------------------ì
Tabelle 4.29: Die Struktur der Load-Overlay-Tabelle
Tritt während des Aufrufs ein Fehler auf, wird das Carry-Flag gesetzt und im AX-Register
findet sich ein Fehlercode.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
277
Code ° Fehler
--------é-----------------------------------------------------1
° Der Wert in AL ist nicht 0, 1 oder 3
2
° Die Programmdatei wurde nicht gefunden,
° oder der Pfad ist ungültig
3
° Suchweg nicht gefunden
4
° keine freien Handles
8
° Nicht genügend Speicher um das Programm zu laden
Mittels der Funktion 59H lassen sich die erweiterten DOS-Fehlercodes abfragen.
Ein Aufruf der Subfunktion 4B04H besitzt keine Wirkung, obwohl Microsoft C diesen
Aufruf ab DOS 4.0 benutzt. Vielleicht existiert eine DOS-Version als OEM-Variante, die
hier etwas mit anfangen kann.
4.72.4 EXEC: Enter EXEC-State (AL = 5)
Diese Funktion ist erst ab DOS 5.0 vorhanden.
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
4BH
°
° AL:
05H (Enter Exec State)
°
° DS:DX Zeiger auf einen Parame- °
°
terblock
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt -> ok
°
Û---------------------------------ì
Mit diesem Aufruf (AL = 5) erlaubt die Funktion 4BH einem Prozess ein Programm selbst
zu laden und als Subprozess unter Umgehung von DOS zu starten. Die Subfunktion
verändert einige intere Einstellungen in den DOS-Datentabellen. Damit kann ein
Programm die COM- und EXE-Dateien selbst laden und starten.
In DS:DX ist die Adresse eines Parameterblocks mit folgendem Aufbau zu übergeben.
Ö--------Ú-------Ú-----------------------------------------------Ì
° Offset ° Bytes ° Bedeutung
°
û--------é-------é-----------------------------------------------À
°
00H °
2
° reserviert (immer 0)
°
û--------é-------é-----------------------------------------------À
°
02H °
2
° Flags (Bit 0 = 1 : EXE-File)
°
°
°
° (Bit 1 = 1 : Overlay File)
°
û--------é-------é-----------------------------------------------À
°
04H °
4
° Adresse ASCIIZ-String mit dem
°
°
°
° Programmnamen
°
û--------é-------é-----------------------------------------------À
°
08H °
2
° PSP-Segment des neuen Programmes
°
û--------é-------é-----------------------------------------------À
°
0AH °
2
° IP Wert beim Start von DOS
°
û--------é-------é-----------------------------------------------À
°
0CH °
2
° CS Wert beim Start von DOS
°
û--------é-------é-----------------------------------------------À
°
0EH °
4
° Programmgröße in Byte
°
Û--------Ù-------Ù-----------------------------------------------ì
Tabelle 4.29.1: Die Struktur der Enter EXEC-State-Tabelle
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
278
Ab Offset 04H ist die Adresse auf einen ASCIIZ-String einzutragen. Dieser String besitzt
maximal 64-Byte-Länge und enthält den Programmnamen, sowie optional das Laufwerk
und den Pfad. Ab Offset 0AH werden zwei Worte angelegt, in denen der von DOS zu
setzende Startwert für CS:IP hinterlegt wird. Der letzte Eintrag enthält die Programmlänge,
einschließlich PSP in Byte.
Nach dem Aufruf führt die Funktion folgende Aktionen durch:
· Prüft den Filenamen und emuliert gegebenfalls die per SETVER definierte DOSVersionsnummer.
· Modifiziert interne DOS Datentabellen, falls das Programm in den untersten 64 Kbyte des
Speichers geladen wird.
· Weiterhin können programmspezifische Patches erfolgen.
Das rufende Programm kann anschließend die Kontrolle an den Subprozess übergeben.
Während des Zeitraumes nach der Rückkehr vom Aufruf 4B05H und dem Transfer zum
Subprozess darf kein BIOS- oder DOS-Aufruf erfolgen. Interrupts dürfen auch keine
ausgelöst werden.
Ist der DOS-Kern im HMA geladen, wird beim Aufruf der Funktion 4B05H die A20Adressleitung deaktiviert (A20 = 0). Damit ist der DOS-Kern für den Parent Prozess nicht
mehr verfügbar. Der nächste Aufruf einer INT 21-Funktion schaltet die A20-Adressleitung
wieder ein. Dies sollte nur durch den Subprozess erfolgen, da im Hauptprogramm ein INT
21-Aufruf die Funktionen des Aufrufes 4B05H aufheben würde.
Ein Programm, welches die Subfunktion benutzt, muß folgende Schritte ausführen:
· Reservieren eines Speicherbereiches für das Programm, Definition eines PSP und
Erzeugung der Environmenttabelle.
· Laden der Datei in den reservierten Bereich. Bei EXE-Files müssen die Adressbezüge
zusätzlich reloziert werden.
· Einsetzen der Rücksprungadresse in das PSP. Hier kann die Adresse des Parent Prozesses
stehen.
· Aufruf der Funktion 4B05H um das Betriebssystem abzuschalten. Es dürfen dann keine
DOS- oder BIOS-Aufrufe mehr folgen, da sonst Nebeneffekte auftreten. Die Funktion
4B05H setzt zum Beispiel das neue PSP als aktives PSP.
· Setzen der Segmentregister und Verzweigung zum Startpunkt im Subprozess. Der erste
INT 21-Aufruf im Subprozess gibt dann die A20-Adressleitung wieder frei. Damit
steht der DOS-Kern wieder zu Verfügung und der neue PSP ist aktiv.
· Nach Beendigung des Subprozesses wird zur Rückkehradresse verzweigt (Definition im
PSP).
· Freigabe des Speichers durch den Parent Prozess.
Tritt während des Aufrufs ein Fehler auf, wird das Carry-Flag gesetzt und im AX-Register
findet sich ein Fehlercode.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
279
Code ° Fehler
--------é------------------------------------------------------1
° Der Wert in AL ist nicht 0, 1 oder 3
2
° Die Programmdatei wurde nicht gefunden, oder der
° Pfad ist ungültig
3
° Suchweg nicht gefunden
4
° keine freien Handles
8
° Nicht genügend Speicher um das Programm zu laden
Mittels der Funktion 59H lassen sich die erweiterten DOS-Fehlercodes abfragen. Zur Zeit
fehlen mir allerdings noch Informationen über die praktische Anwendung der Funktion.
Weiterhin wird die Funktion 4BH von einigen Virenprogrammen abgefangen. Die genauen
Aufrufspezifikationen möchte ich an dieser Stelle (aus verschiedenen Gründen) nicht
erläutern.
4.73 Terminate a Process (Funktion 4CH, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich ein laufender Prozeß beenden. Es gelten folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
4CH
°
° AL:
Returncode
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Im Register AL kann ein Returncode an den »Parent ProcessFehler! Verweisquelle konnte
nicht gefunden werden.Die Rückkehradresse ist im PSP (INT 22) definiert.
Gleichzeitig mit dem Programmabbruch werden alle durch den Subprozeß neu geöffneten
Dateien geschlossen. Die vom Parent Prozess geerbten offenen Dateien bleiben allerdings
weiterhin offen. Weiterhin gibt DOS den belegten Speicher des Subprozesses frei.
4.74 Get Returncode (Funktion 4DH, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich der Returncode eines Subprozesses lesen. Es gelten folgende
Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
4DH
°
û---------------------------------À
°
RETURN
°
° AH:
Terminatorcode
°
° AL:
Returncode
°
Û---------------------------------ì
Der Fehlercode kann nur einmal gelesen werden. Er wird im AX-Register zurückgegeben,
wobei das AL Register den von der Funktion 4CH eingetragenen Wert enthält. Wird ein
Programm über den INT 27 resident installiert, ist der EXIT-Code allerdings immer 0.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
280
Der Fehlercode läßt sich über die DOS-Funktion ERRORLEVEL beliebig häufig abfragen.
Im AH-Register finden sich Informationen über die Ursache des Programmabbruchs:
Code ° Bemerkung
------é------------------------------------------0 ° normales Programmende
1 ° Abbruch durch Control-C
2 ° Abbruch als Ergebnis eines Critical Errors
3 ° Abbruch durch Funktion 31H
Mit der Funktion 59H lassen sich die erweiterten DOS-Fehlercodes abfragen.
4.75 Find First Matching File (Funktion 4EH, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich prüfen, ob eine Datei mit dem angegebenen Namen im
Inhaltsverzeichnis abgelegt wurde. Es gelten folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
4EH
°
° DS:DX Zeiger auf ASCIIZ°
°
String mit dem Pfadnamen °
° CX:
Attribute der Datei
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
Û---------------------------------ì
Der Zeiger im Registerpaar DS:DX adressiert einen ASCIIZ-String mit dem Pfadnamen,
der auch die Dateibezeichnung enthält. Der Filename kann auch Wildcards (*,?) enthalten,
hierbei darf es sich aber nicht um eine Datei innerhalb eines Netzwerkes handeln. CX gibt
die Dateiattribute an, die bei der Suche zu berücksichtigen sind (normal, hidden, etc.). Wird
eines der Attribute »Hidden« »SystemFehler! Verweisquelle konnte nicht gefunden
werden.DirectoryFehler! Verweisquelle konnte nicht gefunden werden.Eine exclusive
Suche (z.B. nach hidden Files) ist also nicht möglich.
Falls eine Datei mit dem spezifizierten Namen gefunden wurde, kopiert die Funktion die
Daten in die Disk-Transfer-Area (DTA). Dieser Bereich befindet sich standardmäßig im
PSP ab Adresse 80H. Bei der Funktion 4EH besitzt der Bereich folgende Struktur:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
281
Ö--------Ú-------Ú-----------------------------------------------Ì
° Offset ° Bytes ° Bedeutung
°
û--------é-------é-----------------------------------------------À
° 00H
° 21
° reserviert für die Funktion 4FH (Find Next)
°
û--------é-------é-----------------------------------------------À
° 15H
°
1
° Attributbyte der gefundenenen Datei
°
û--------é-------é-----------------------------------------------À
° 16H
°
2
° Eintragzeit des letzten Schreibzugriffs
°
û--------é-------é-----------------------------------------------À
° 18H
°
2
° Eintragdatum des letzten Schreibzugriffs
°
û--------é-------é-----------------------------------------------À
° 1AH
°
2
° Low Word Dateigröße
°
û--------é-------é-----------------------------------------------À
° 1CH
°
2
° High Word Dateigröße
°
û--------é-------é-----------------------------------------------À
° 1EH
° 13
° Name und Extension der Datei als ASCIIZ-String°
Û--------Ù-------Ù-----------------------------------------------ì
Tabelle 4.30: Kodierung des Dateinamen bei Find-Aufrufen
Die Werte im ersten Feld (21 Byte) variieren in Abhängigkeit von der DOS-Version und
werden durch die Funktion 4FH ausgewertet.
Der zurückgegebene Dateiname wird mit einem Nullbyte abgeschlossen. Zwischen Name
und Extension findet sich ein Punkt. Aus dem String sind eventuelle Blanks bereits entfernt.
Bei Attributen = 08H werden unter DOS 2.x auch andere Filenamen mit zurückgegeben,
während DOS 3.x nur Volume Label Namen zurückgibt. Wird ein Gerät (keine Wildcards
erlaubt) spezifiziert, gibt DOS 2.x das Attribut = 00, die Dateigröße = 0000 und das
aktuelle Datum / Uhrzeit zurück.
Falls ein Fehler auftritt, wird das Carry-Flag gesetzt. Im Register AX findet sich ein Fehlercode:
Code ° Fehler
-----é----------------------------------------------------2
° Datei nicht vorhanden
3
° Der angegebene Pfad existiert nicht oder ist ungültig
18
° Kein Dateieintrag gefunden
Mit der Funktion 59H lassen sich die erweiterten DOS-Fehlercodes abfragen. In DOS 3.x
und 4.x versagt die Funktion wegen eines Bugs. Wird sie mehrfach hintereinander mit
Gerätenamen aktiviert, ohne daß zwischenzeitlich DOS-Calls oder eine Directory Suche
(ohne Volume Label Attribut) erfolgten, gibt die Funktion fehlerhafte Ergebnisse zurück
(falls Attribut = 08H). Hier sollte ein Aufruf der INT 21-Funktionen 3CH, 3DH, 41H oder
46H eingeschoben werden.
4.76 Find Next File (Funktion 4FH, DOS 2.0 - 6.x)
Mit diesem Aufruf läßt sich ein Inhaltsverzeichnis nach dem nächst gültigen Dateinamen
durchsuchen.
Es
gelten
folgende
Aufrufparameter:Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
4FH
°
û---------------------------------À
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
282
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
Û---------------------------------ì
Die DTA muß die Information enthalten, die durch die Funktion 4EH erzeugt wurden.
Sonst sind keine weiteren Angaben erforderlich. Die Ergebnisse werden in den ersten 13
Byte abgelegt. Wird keine weitere Datei gefunden, erscheint der Fehler 18 (dezimal) im
AX-Register.
Falls ein Fehler auftritt, wird das Carry-Flag gesetzt. Im Register AX findet sich ein
lercode:
Code ° Fehler
-----é------------------------------------------------------2
° Der angegebene Pfad existiert nicht oder ist ungültig
18
° Kein Dateieintrag gefunden
Mit der Funktion 59H lassen sich die erweiterten DOS-Fehlercodes abfragen.
4.77 Set Active PSP (Funktion 50, DOS 2.0 - 6.x)
Hier handelt es sich um eine interne DOS-Funktion die durch Microsoft erst ab DOS 5.0
offiziell publiziert wurde. Es gelten folgende Aufrufkonventionen:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
50H
°
° BX:
Segmentadresse des neuen °
°
PSP
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
Û---------------------------------ì
Die Funktion übernimmt im Register BX die Segmentadresse des neuen ProgrammSegment-Prefix. Der Offsetwert wird implizit zu 0000H angenommen. DOS übernimmt
das PSP als aktives PSP. Vor einem Aufruf der Funktion ist das alte PSP zu retten. Mit
dieser Funktion läßt sich ein neues PSP generieren oder von anderen Prozessen
übernehmen.
Diese Funktion speichert die in BX angegebenen Segmentadresse in einer internen
Datenstruktur. Damit greift DOS anschließend auf das gesetzte neue PSP-Segment zu. Dies
bei TSR-Programmen hilfreich (s. entsprechendes Kapitel), da hier normalerweise das PSP
des Vordergrundprogrammes aktiv ist. Für Fileoperationen benötigt das TSR-Programm
aber die eigene PSP.
In DOS 2.x darf die Funktion nicht aus dem INT 28H heraus
aufgerufen werden, falls nicht vorher das Critical-ErrorFlag gesetzt wurde (Funktion AH = 5D06H). Dann benutzt
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
283
die Funktion den »critcal error stack4.78 Get Active PSP
(Funktion 51, DOS 2.0 - 6.x)
Auch hier handelt es sich um eine interne DOS-Funktion, die durch Microsoft erst ab DOS
5.0 offiziell publiziert wurde. Die Funktion existiert aber bereits seit DOS 2.0 und in OS/2.
Es gelten folgende Aufrufkonventionen:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
51H
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° BX:
Segmentadresse des
°
°
aktuellen PSP
°
Û---------------------------------ì
Die Funktion ermittelt die Lage des aktuellen PSP und gibt die Segmentadresse im BXRegister zurück.
Die Funktion erlaubt es also, aus einem laufenden Prozeß heraus festzustellen, wo sich der
Kopf des Programmes befindet. Bei COM-Dateien ist dies trivial, da diese ja nicht über
Segmentgrenzen hinausreichen, aber bei EXE-Programmen leistet die Funktion gute
Dienste.
Falls ein Fehler auftritt, wird das Carry-Flag gesetzt. Im Register AX findet sich ein Fehlercode. Dieser entspricht den mit der Funktion 59H abfragbaren erweiterten Fehlercodes.
Im Hinblick auf die Aufwärtskompatibilität der Software empfiehlt es sich aber, ab DOS
3.0 bis 4.01 die offizielle Funktion 62H (Get PSP Address) zu verwenden, da diese das
gleiche leistet.
In DOS 2.x darf die Funktion nicht aus dem INT 28H heraus
aufgerufen werden, falls nicht vorher das Critical-ErrorFlag gesetzt wurde (Funktion AH = 5D06H). Dann benutzt
die Funktion den »critcal error stack4.79 Get DOS List of
Lists (Funktion 52,
DOS 2.0 - 6.x, undokumentiert)
Auch hier handelt es sich um eine interne DOS-Funktion, die durch Microsoft nicht
offiziell dokumentiert wurde. Es gelten die folgenden Aufrufkonventionen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
284
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
52H
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° ES:BX Zeiger auf den DOS
°
°
Datenblock
°
Û---------------------------------ì
Die Funktion gibt die Lage des internen DOS-Datenblocks zurück. (Genauer: ab DOS 3.0
handelt es sich um 3 aufeinanderfolgende Speicherblöcke). Der Zeiger findet sich im
Register ES:BX. Im Datenblock finden sich die Zeiger zur Speicherverwaltung des
Memory-Managers.Über diese Zeiger führt DOS die Zugriffe auf die einzelnen Speichersegmente aus.
Falls ein Fehler auftritt, wird das Carry-Flag gesetzt. Im Register AX findet sich ein Fehlercode. Dieser entspricht den mit der Funktion 59H abfragbaren erweiterten Fehlercodes.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Ö--------Ú-------Ú-----------------------------------------------Ì
° Offset ° Bytes ° Feld
°
û--------é-------é-----------------------------------------------À
° -0CH ° 2 ° SHARE-Wiederholungszähler (DOS 3.1 - DOS 3.3) °
°
°
° läßt per sich INT 21-Funktion 440B setzen °
û--------é-------é-----------------------------------------------À
° -0AH ° 2 ° SHARE-Verzögerungszähler (DOS 3.1 - DOS 3.3) °
°
°
° läßt per sich INT 21-Funktion 440B setzen °
û--------é-------é-----------------------------------------------À
° -08H ° 4 ° Zeiger auf aktuellen Diskpuffer
°
°
°
° erst ab DOS 3.0 definiert
°
û--------é-------é-----------------------------------------------À
° -04H ° 2 ° (ab DOS 3.0) Index auf den Puffer mit den °
°
°
° ungelesenen Eingaben der CON-Einheit
°
°
°
° der Wert 0000 bedeutet keine Eingaben
°
û--------é-------é-----------------------------------------------À
° -02H ° 2 ° Zeiger auf ersten Memory-Control-Block (MCB) °
û--------é-------é-----------------------------------------------À
° 00H ° 4 ° Zeiger auf den DOS-Disk-Parameter-Block (DPB) °
û--------é-------é-----------------------------------------------À
° 04H ° 4 ° Adresse der DOS System File Table
°
û--------é-------é-----------------------------------------------À
° 08H ° 4 ° Zeiger auf den Kopf des CLOCK$-Treibers
°
û--------é-------é-----------------------------------------------À
° 0CH ° 4 ° Zeiger auf den Kopf des Consol-Treibers
°
û--------é-------é-----------------------------------------------À
° --- ° - ° DOS 2.x Datenstruktur
°
û--------é-------é-----------------------------------------------À
° 10H ° 1 ° Anzahl log. Laufwerke im System
°
û--------é-------é-----------------------------------------------À
° 11H ° 2 ° max. Byte/Block der Block Treiber
°
û--------é-------é-----------------------------------------------À
° 13H ° 4 ° Zeiger auf den ersten Sektorpuffer
°
û--------é-------é-----------------------------------------------À
° 17H ° 18 ° Begin des NUL-Device Headers
°
û--------é-------é-----------------------------------------------À
° --- ° - ° DOS 3.0 Datenstruktur
°
û--------é-------é-----------------------------------------------À
° 10H ° 1 ° Zahl der Blockeinheiten
°
û--------é-------é-----------------------------------------------À
° 11H ° 2 ° max. Blockgröße für alle Blocktreiber
°
û--------é-------é-----------------------------------------------À
° 13H ° 4 ° Zeiger auf den ersten Diskpuffer
°
û--------é-------é-----------------------------------------------À
° 17H ° 4 ° Zeiger auf ein Feld mit den aktuellen
°
°
°
° Directory Strukturen (CDS)
°
û--------é-------é-----------------------------------------------À
° 1BH ° 1 ° LASTDRIVE Wert (meist 5)
°
û--------é-------é-----------------------------------------------À
° 1CH ° 4 ° Zeiger auf den STRING= Arbeitsbereich
°
û--------é-------é-----------------------------------------------À
° 20H ° 2 ° Wert x von STRING = X aus CONFIG.SYS
°
û--------é-------é-----------------------------------------------À
° 22H ° 4 ° Zeiger auf die FCB Tabelle
°
û--------é-------é-----------------------------------------------À
° 26H ° 2 ° Wert y aus FCBS = x,y in CONFIG.SYS
°
û--------é-------é-----------------------------------------------À
° 28H ° 18 ° Kopf des NUL-Einheitentreibers
°
û--------é-------é-----------------------------------------------À
° --- ° - ° DOS 3.1 - 3.3 Datenstruktur
°
û--------é-------é-----------------------------------------------À
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
285
DOS Programmierhandbuch
° 10H ° 2 ° max. Blockgröße (Byte / Sektor) für alle
°
°
°
° Blocktreiber
°
û--------é-------é-----------------------------------------------À
° 12H ° 4 ° Zeiger auf den ersten Diskpuffer in der
°
°
°
° Kette
°
û--------é-------é-----------------------------------------------À
° 16H ° 4 ° Zeiger auf ein Feld mit den aktuellen
°
°
°
° Directory Strukturen (CDS)
°
û--------é-------é-----------------------------------------------À
° 1AH ° 4 ° Zeiger auf die FCB Tabellen
°
û--------é-------é-----------------------------------------------À
° 1EH ° 2 ° Anzahl der geschützten FCB's (FCBS=x,y)
°
û--------é-------é-----------------------------------------------À
° 20H ° 1 ° Anzahl der installierten Bockeinheiten
°
û--------é-------é-----------------------------------------------À
° 21H ° 1 ° Anzahl der Laufwerksbuchstaben
°
û--------é-------é-----------------------------------------------À
° 22H ° 18 ° Kopf des NUL-Einheitentreibers
°
û--------é-------é-----------------------------------------------À
° 34H ° 1 ° Zahl der mit JOIN umgeleiteten Drives
°
û--------é-------é-----------------------------------------------À
° --- ° - ° DOS 4.x Datenstruktur
°
û--------é-------é-----------------------------------------------À
° 10H ° 2 ° max. Byte / Sektor der Blocktreiber
°
û--------é-------é-----------------------------------------------À
° 12H ° 4 ° Zeiger auf den Diskpuffer Info Record
°
û--------é-------é-----------------------------------------------À
° 16H ° 4 ° Zeiger auf ein Feld mit den aktuellen
°
°
°
° Directory Strukturen (CDA)
°
û--------é-------é-----------------------------------------------À
° 1AH ° 4 ° Zeiger auf die FCB Tabellen
°
û--------é-------é-----------------------------------------------À
° 1EH ° 2 ° Anzahl der geschützten FCB's (y, FCBS=X,Y) °
û--------é-------é-----------------------------------------------À
° 20H ° 1 ° Anzahl der installierten Blockeinheiten
°
û--------é-------é-----------------------------------------------À
° 21H ° 1 ° LASTDRIVE Wert (meist 5)
°
û--------é-------é-----------------------------------------------À
° 22H ° 18 ° Kopf des NUL-Einheitentreibers
°
û--------é-------é-----------------------------------------------À
° 34H ° 1 ° Zahl der mit JOIN umgeleiteten Drives
°
û--------é-------é-----------------------------------------------À
° 35H ° 2 ° Zeiger auf das IBMDOS Codesegment mit
°
°
°
° der Liste der Programmnamen/ -versionen
°
û--------é-------é-----------------------------------------------À
° 37H ° 4 ° Zeiger auf eine FAR-Routine mit dem resi- °
°
°
° denten IFS-Funktionen, werden von IFS-Funk- °
°
°
° tionen aktiviert, die die Funktionen 20H, 24H-°
°
°
° 28H nicht unterstützen.
°
û--------é-------é-----------------------------------------------À
° 3BH ° 4 ° Zeiger auf die Kette der IFS-Treiber
°
û--------é-------é-----------------------------------------------À
° 3FH ° 2 ° x-Wert von BUFFERS x,y wird auf ein mehrfach- °
°
°
° es von 30 gerundet, falls der Buffer im EMS- °
°
°
° liegt.
°
û--------é-------é-----------------------------------------------À
° 41H ° 2 ° y-Wert von BUFFERS x,y
°
û--------é-------é-----------------------------------------------À
° 43H ° 1 ° Boot Laufwerk (1=A:)
°
û--------é-------é-----------------------------------------------À
° 44H ° 1 ° CPU-Flag (01H 80386+)
°
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
286
DOS Programmierhandbuch
287
û--------é-------é-----------------------------------------------À
° 45H ° 2 ° XMS-Größe in Kbyte
°
û--------é-------é-----------------------------------------------À
° --- ° - ° DOS 5.x Datenstruktur
°
û--------é-------é-----------------------------------------------À
° 10H ° 2 ° max. Byte / Sektor der Blocktreiber
°
û--------é-------é-----------------------------------------------À
° 12H ° 4 ° Zeiger auf den Diskpuffer Info Record
°
û--------é-------é-----------------------------------------------À
° 16H ° 4 ° Zeiger auf ein Feld mit den aktuellen
°
°
°
° Directory Strukturen (CDA)
°
û--------é-------é-----------------------------------------------À
° 1AH ° 4 ° Zeiger auf die FCB Tabelle
°
û--------é-------é-----------------------------------------------À
° 1EH ° 2 ° 0000H
°
û--------é-------é-----------------------------------------------À
° 20H ° 1 ° Anzahl der installierten Blockeinheiten
°
û--------é-------é-----------------------------------------------À
° 21H ° 1 ° LASTDRIVE Wert (meist 5)
°
û--------é-------é-----------------------------------------------À
° 22H ° 18 ° Kopf des NUL-Einheitentreibers
°
û--------é-------é-----------------------------------------------À
° 34H ° 1 ° Zahl der mit JOIN umgeleiteten Drives
°
û--------é-------é-----------------------------------------------À
° 35H ° 2 ° 0000H
°
û--------é-------é-----------------------------------------------À
° 37H ° 4 ° Zeiger auf die SETVER-Tabelle (oder 0:0)
°
û--------é-------é-----------------------------------------------À
° 3BH ° 2 ° unbekannt
°
û--------é-------é-----------------------------------------------À
° 3DH ° 2 ° unbekannt
°
û--------é-------é-----------------------------------------------À
° 3FH ° 2 ° x-Wert von BUFFERS x,y
°
û--------é-------é-----------------------------------------------À
° 41H ° 2 ° y-Wert von BUFFERS x,y
°
û--------é-------é-----------------------------------------------À
° 43H ° 1 ° Boot Laufwerk (1=A:)
°
û--------é-------é-----------------------------------------------À
° 44H ° 1 ° CPU-Flag (01H 80386+)
°
û--------é-------é-----------------------------------------------À
° 45H ° 2 ° XMS-Größe in Kbyte
°
Û--------Ù-------Ù-----------------------------------------------ì
Tabelle 4.31: Aufbau des DOS-Control-Blocks
Der Aufbau der Tabelle ist abhängig von der DOS-Version. Der Aufbau der internen DOSTabellen wird im Kapitel über den DOS-Memory-Manager detailliert diskutiert.
4.80 Translate BIOS Parameter Block (Funktion 53, DOS 2.0
- 6.x, undokumentiert)
Auch hier handelt es sich um eine interne DOS-Funktion die durch Microsoft nicht offiziell
publiziert wurde. Es gelten folgende Aufrufkonventionen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
288
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
53H
°
° ES:BP Zeiger auf den aufzubau- °
°
enden Parameterblock
°
° DS:SI Zeiger auf den BIOS°
°
Parameter-Block
°
û---------------------------------À
°
RETURN
°
° AX:
---°
Û---------------------------------ì
Der Zeiger ES:BP ist auf die neu zu initialisierende Tabelle zu setzen, während in DS:SI
die Adresse der Tabelle mit den Initialisierungswerten der BIOS-Parameter-Blocks steht.
Die Funktion baut nun die neue Tabelle mit diesen Werten aus dem BIOS-Parameter-Block
(BPB) auf. Diese Technik wird von DOS verwendet, um auch noch zur Laufzeit Informationen über die Einheit auszuwerten und die Einheit anzupassen.
Die Funktion führt offenbar keine Fehlerprüfung statt, d.h. das AX-Register ist nach dem
Aufruf undefiniert.
Der BIOS-Parameter-Block besitzt, in Abhängigkeit von der DOS-Version, folgende
Struktur:
Ö--------Ú------Ú--------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é--------------------------------------------------À
°
00
°
2 ° Bytes pro Sektor
°
û--------é------é--------------------------------------------------À
°
02
°
1 ° Sektor pro Cluster - 1
°
û--------é------é--------------------------------------------------À
°
03
°
2 ° Zahl der reservierten Boot-Sektoren
°
û--------é------é--------------------------------------------------À
°
05
°
1 ° Zahl der FATs
°
û--------é------é--------------------------------------------------À
°
06
°
2 ° Zahl der Einträge im Hauptverzeichnis
°
û--------é------é--------------------------------------------------À
°
08
°
2 ° maximale Clusternummer (0 ab DOS 4.0 , > 32 MB) °
û--------é------é--------------------------------------------------À
°
0A
°
1 ° Media ID
°
û--------é------é--------------------------------------------------À
°
0B
°
2 ° Sektoren pro FAT
°
û--------é------é--------------------------------------------------À
° ---- ° --- ° --- Aufbau für DOS 3.x --°
û--------é------é--------------------------------------------------À
°
0D
°
2 ° Zahl der Sektoren pro Spur
°
û--------é------é--------------------------------------------------À
°
0F
°
2 ° Anzahl Schreib/Leseköpfe
°
û--------é------é--------------------------------------------------À
°
11
°
4 ° Anzahl reservierter Sektoren (hidden sectors)
°
û--------é------é--------------------------------------------------À
°
15
° 11 ° reserviert
°
û--------é------é--------------------------------------------------À
° ---- ° --- ° --- Aufbau für DOS 4.x --°
û--------é------é--------------------------------------------------À
°
15
°
4 ° Gesamtzahl der Sektoren für Speichermedien mit
°
°
°
° mehr als 32 Mbyte Kapazität
°
û--------é------é--------------------------------------------------À
°
19
°
6 ° reserviert
°
û--------é------é--------------------------------------------------À
°
1F
°
2 ° Anzahl der Zylinder
°
û--------é------é--------------------------------------------------À
°
21
°
1 ° Geräte Typ
°
û--------é------é--------------------------------------------------À
°
22
°
2 ° Geräte Attribut
°
Û--------Ù------Ù--------------------------------------------------ì
Tabelle 4.32: Der Aufbau des BIOS-Parameter-Blocks (BPB)
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
289
Der Aufbau des Disk-Parameter-Block (DPB) wurde bereits detailliert bei der Funktion
32H (Get DPB) besprochen. Die Kodierung des Media-ID-Byte ist bei der INT 21Funktion 1BH beschrieben.
4.81 Get Verify State (Funktion 54H, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich der Zustand des Verify-Flags abfragen. Es gelten folgende
Aufrufparameter:Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
54H
°
û---------------------------------À
°
RETURN
°
° AL: Status des Verify Flags
°
°
00H -> Verify OFF
°
°
01H -> Verify ON
°
Û---------------------------------ì
Nach dem Aufruf enthält das AL-Register den Zustand des Verify-Flags. Mit AL = 0 ist
Verify bei Disketten-Schreiboperationen ausgeschaltet, während mit AL = 1 die Option
eingeschaltet ist. Der Schalter läßt sich aus der Kommandoebene mit:
Verify = ON
/
OFF
beeinflussen. Die Funktion 2EH ermöglicht es ebenfalls den Wert des Verify-Flags zu verändern.
4.82 Install New Process (Funktion 55H,
DOS 2.0 - 6.x, undokumentiert)
Die Funktion 55 wird intern durch DOS benutzt und ist nicht dokumentiert. Mit dieser
Funktion läßt sich ein PSP-Bereich für einen neuen Prozeß anlegen. Es gelten folgende
Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
55H (Install new process)°
° DX:
Segmentadresse new PSP
°
° SI:
Size field
°
û---------------------------------À
°
RETURN
°
° CY: 0-> ok
°
Û---------------------------------ì
Im Register DX ist die Segmentadresse, ab der der neue PSP abzulegen ist, zu übergeben.
Die Funktion kopiert in DOS 2.x den Inhalt des bestehenden PSP in den angegebenen
Bereich und modifiziert die Eintragungen dann nach den Anforderungen des Prozesses. Ab
DOS 3.0 ist in SI der Wert für das »size field« welches sich ab DX:02 findet,
einzutragen.»Dieser Aufruf wird durch die Funktion 4BH abgedeckt, die aus Sicht des
Anwenderprogrammierers zu bevorzugen ist. Die Funktion gibt keine Fehlercodes
zurückzugeben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
290
4.83 Rename File (Funktion 56H, DOS 2.0 - 6.x)
Mit dieser Funktion läßt sich der Name einer Datei ändern. Es gelten folgende Aufrufparameter:Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
56H
°
° DS:DX Zeiger auf einen ASCIIZ- °
°
String mit altem Pfad
°
° ES:DI Zeiger auf einen ASCIIZ- °
°
String mit neuem Pfad
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
Û---------------------------------ì
Das Registerpaar DS:DX zeigt auf einen ASCIIZ-String mit dem Pfad- und Dateinamen der
Datei, die umbenannt werden soll. Im ES:DI ist ein Zeiger auf einen zweiten ASCIIZString mit dem neuen Pfad und Dateinamen enthalten. Falls in diesem String ein Laufwerksname auftritt, muß er mit dem ursprünglich angegebenen Laufwerk übereinstimmen.
Der Name des Unterverzeichnisses muß nicht übereinstimmen, wodurch eine Datei in ein
anderes Unterverzeichnis kopiert werden kann.
Das Archive-Attribut wird dabei nicht gesetzt. Ab DOS 3.3 lassen sich mit der Funktion
auch Unterverzeichnisse umbenennen. Ab DOS 3.1 läßt sich die Funktion über die
undokumentierte Funktion 5D00H aktivieren, wobei dann Wildcardzeichen (*,?) in
beschränktem Umfang im Filenamen auftreten dürfen. Bei erfolgreichem Aufruf wird der
Fehlercode 18 (dezimal) »no more filesTritt ein Fehler auf, wird das Carry-Flag gesetzt und
im AX-Register findet sich ein Fehlercode:
Code ° Bemerkung
------é--------------------------------------------------------------------2
° Einer der Pfadnamen ist ungültig oder nicht zugreifbar
3
° Suchweg nicht gefunden
5
° Der erste Pfadname spezifiziert ein Inhaltsverzeichnis,
° der zweite Pfadname eine Datei, oder die zweite Datei kann nicht
° geöffnet werden
17
° Die zwei Dateien befinden sich nicht auf der gleichen Einheit
° (Laufwerk)
Mittels der Funktion 59H lassen sich die erweiterten Fehlercodes abfragen.
4.84 Get/Set File Date and Time (Funktion 57H, DOS 2.0 6.x)
Mit dieser Funktion lassen sich Datum und Zeit einer Datei lesen und bedingt ändern.
Diese Parameter werden normalerweise bei jedem Schreibvorgang auf die Datei durch
DOS aktualisiert. Es gelten folgende Aufrufparameter.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
291
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
57H
°
° AL:
00H (Get Date and Time) °
°
01H (Set Date and Time) °
° BX:
Filehandle
°
° CX:
Zeit bei AL = 01
°
° DX:
Datum bei AL = 01
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° CX:
Zeit bei AL = 00
°
° DX:
Datum bei AL = 00
°
Û---------------------------------ì
Der Inhalt des Registers AL steuert die Aktion (AL = 0 Get Data, AL = 1 Set Data). Im
Register BX wird der Filehandle übergeben. Im Register DX findet sich das Datum und im
Register CX die Zeit. Das Format entspricht dem Eintrag innerhalb des Inhaltsverzeichnisses. Es wird im Kapitel über den Dateiaufbau beschrieben.
Falls ein Fehler auftritt, wird das Carry-Flag gesetzt und im Register AX findet sich ein
Fehlercode:
Code ° Bemerkung
-------é---------------------------1
° ungültiger Funktionsaufruf
6
° ungültiger Handle
Mittels der Funktion 59H lassen sich die erweiterten DOS-Fehlercodes abfragen.
Die Funktion 5101H erlaubt es nicht, direkt das Datum und die Zeit einer Datei zu setzen.
Vielmehr werden die neuen Werte in der internen System-File-Table (SFT) der Datei
zugewiesen. Erst ein Close-Aufruf überträgt die Daten auf das Medium.
Geräte besitzen ebenfalls einen Eintrag in der SFT, dessen Datum/Zeit beim Programmstart
gesetzt wird. Damit läßt sich nachträglich die Startzeit eines Programmes abfragen.
4.85 Get/Set Allocation Strategie (Funktion 58H, DOS 2.0 6.x)
Diese Funktion erlaubt es, die Strategie des DOS-Memory-Managers zu lesen und zu verändern. Die Funktion wird für DOS interne Zwecke benutzt und ist selten beschrieben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
292
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
58H
°
° AL:
00H (Get Strategie)
°
°
01H (Set Strategie)
°
°
02H (Get UMB link status)°
°
03H (Set UMB link status)°
° BX:
Strategiecode (bei Set) °
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: nicht gesetzt
°
° AX:
Strategiecode (bei Get) °
Û---------------------------------ì
Es ist davon auszugehen, daß es sich ebenfalls um eine undokumentierte Funktion handelt.
Es gelten die nebenstehenden Aufrufparameter.
Das Register AL bestimmt, ob die Einstellung (AL = 00) verändert (AL = 01) werden soll.
Ab DOS 5.0 sind zusätzlich die Subcodes AL= 02H (Get UMB link state) und AL=03H
(Set UMB link state) implementiert. Bei der Set Operation (AL=01H) ist im Register BX
ein Code zur Einstellung der Verwaltungsstrategie zu übergeben. Bei der Get-Operation
(AL = 00H) wird die aktuelle Einstellung im Register AX zurückgegeben.
Hierbei gilt folgende Kodierung:
AX = Code ° Strategie
----------é----------00H
° Low Memory First fit
01H
° Low Memory Best fit
02H
° Low Memory Last fit
----° ab DOS 5.0
40H
° High Memory First fit
41H
° High Memory Best fit
42H
° High Memory Last fit
80H
° First fit, High/Low
81H
° Best fit, High/Low
82H
° Last fit, Hight/Low
Die drei Strategien bestimmen, wie eine Speicherplatzanforderung zu bearbeiten ist. Bei
der »first fit«Methode beginnt DOS mit der Suche nach einem freien Block am unteren
Speicherende. Der erste freie Block mit der entsprechenden Größe wird zugeordnet. Bei
der »best fit«Methode wird der gesamte Speicher durchsucht und der Block der am besten
von der Größe her paßt wird zugeordnet. Bei der »last fit«Strategie beginnt die Suche im
oberen Bereich und der erste passende Block wird zugewiesen.»Ab DOS 5.0 wird
weiterhin unterschieden, ob der konventionelle Speicher bis 640 Kbyte, oder Upper
Memory bis 1 Mbyte zu benutzen ist. Ein Code von 80H bis 82H bewirkt, daß DOS zuerst
eine Speicherreservierung im High Memory versucht. Mißlingt dies, wird der Speicher im
Low Memory (bis 640 Kbyte) reserviert.
Normalerweise ist in MS-DOS die »first fit«Strategie eingestellt. Eine genaue
Beschrei_bung der Strategien sowie der Konsequenzen findet sich im Kapitel über den
DOS-Memory-Manager.»Mit der Subfunktion AL = 02H läßt sich ab DOS 5.0 abfragen,
ob UMB benutzt wird. Das Ergebnis findet sich im Register AL:
AL = 00H UMB nicht Teil der DOS-Speicherkette
01H UMB ist Teil der DOS-Speicherkette
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
293
Mit der Subfunktion AL = 03 läßt sich ab DOS 5.0 definieren, ob UMB benutzt werden
sollen. Die Strategie ist in BX zu übergeben:
BX = 0000H UMB aus DOS-Speicherkette entfernen
0001H UMB in DOS-Speicherkette aufnehmen
Tritt während der Operation ein Fehler auf, wird das Carry-Flag gesetzt und im AXRegister findet sich ein Fehlercode:
1
Ungültiger Funktionsaufruf
Die erweiterten DOS-Fehlercodes lassen sich mit der Funktion 59H abfragen.
4.86 Get Extended Error (Funktion 59H, DOS 3.0 - 6.x)
Normalerweise übergibt DOS die Fehlercodes im Register AX und setzt das Carry-Flag.
Ab Version 3.0 existiert die Möglichkeit, erweiterte Fehlercodes abzufragen, die auf die
älteren Codes abgebildet wurden. Hierfür steht die Funktion 59 mit folgender Parameterschnittstelle zur Verfügung:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
59H
°
° BX:
0 (DOS 3.0 - 6.x)
°
û---------------------------------À
°
RETURN
°
° AX:
erweiterter Fehlercode
°
° BH:
Fehlerklasse
°
° BL:
vorgeschlagene Aktion
°
° CH:
Fehlerhinweis
°
Û---------------------------------ì
Der Fehlercode kann nur einmal abgefragt werden. Bei der Abfrage werden die Register
CL, DX, SI, DI, BP, DS, ES zerstört, daß Anwenderprogramm muß also diese Register vor
dem Aufruf retten. In jeder neuen DOS-Version werden weitere Fehlercodes implementiert. Ein bereits bestehendes Programm kann auch mit neueren DOS-Versionen arbeiten,
da die alten Fehlermeldungen erhalten bleiben.
Um eine zukünftige Erweiterung der Funktionalität zu ermöglichen, wird beim Aufruf im
Register BX ein Versionscode übergeben. In den DOS-Versionen 3.0 bis 6.x ist der Wert
immer Null.
In den Registern AX, BX und CX wird dann ein erweiterter Fehlercode zurückgegeben, der
genauere Hinweise auf die Fehlerursache und deren Beseitigung gibt. Im Register AX
findet sich ein erweiterter Fehlercode. Die Funktion versucht hier die Fehlermeldungen
älterer DOS-Versionen abzubilden. Der übergebene Wert entspricht den üblicherweise im
Register AL übergebenen Fehlercodes. Falls dieser Code nicht mehr existiert, wird die am
besten passende Fehlernummer zugeordnet. Eine Beschreibung der Fehlercodes in AX
findet sich im Kapitel »Fehlerbehandlung in DOS«»Im Register BH findet sich ein Code,
der die Fehlerklasse beschreibt. Es gilt folgende Nomenklatur:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
294
Code ° Fehlerklasse
------é------------------------------------------------------------------01 ° Fehlende Resourcen (z.B. kein Speicher mehr frei, oder alle
° Kanäle belegt)
02 ° Hierbei handelt sich sich nicht um einen Fehler, sondern um
° eine temporäre
° Situation, die einen einwandfreien Ablauf verhindert (z.B.
° Zugriffsversuch auf einen »locked 03 ° Fehlende oder falsche
Autorisierung (z.B. kein »Create
° AccessFehler! Verweisquelle konnte nicht gefunden werden. 04 °
Fehlerursache in der internen Systemsoftware
05 ° Hardwarefehler
06 ° Fehler in der Systemsoftware, der nicht durch den laufenden
° Prozeß bewirkt wurde (z.B. fehlende oder falsche Konfigurations° dateien)
07 ° Fehler im Anwendungsprogramm
08 ° Datei oder Einheit nicht gefunden
09 ° Datei oder Einheit besitzen ein falsches Format oder Typ
0A ° Datei oder Einheit blockiert (locked)
0B ° Falsche Diskette im Laufwerk, oder die Diskette ist beschädigt,
° oder sonstige Probleme mit dem Speichermedium
0C ° Spezifizierter Name existiert bereits (z.B. Versuch einen Namen
° innerhalb eines Netzwerkes mehrfach zu vergeben)
0D ° andere Fehlerursache
Diese Hinweise lassen sich dann in eine entsprechende Fehlermeldung umsetzen.
Als weitere Hilfestellung liefert die Funktion einen Code im Register BL, der Hinweise zur
weiteren Vorgehensweise enthält. Es gilt folgende Kodierung:
Code ° Aktion
------é-----------------------------------------------------------01 ° Wiederhole Versuch und gebe dann einen Hinweis an den Benutzer
02 ° Wiederhole den Versuch nach einer Pause
03 ° Falls der Anwender Datei-, Pfad- oder Laufwerksnamen eingegeben
° hat, wiederhole die Abfrage
04 ° Setze die benutzten Resourcen zurück und beende das Programm
° (z.B. Dateien schließen)
05 ° Das System ist so stark gestört, daß das Programm sofort zu
° beenden ist (Dateien sollten nicht mehr geschlossen werden)
06 ° Der gemeldete Fehler dient nur zur Information
07 ° Fehlermeldung mit Abfrage an den Benutzer (z.B. Disketten
° einlegen), dann wiederhole den Versuch noch einmal
Als weitere Information findet sich im Register CH ein Hinweis zur Lokalisierung des
Fehlers. Es gelten folgende Konventionen:
Code ° Bemerkung
------é------------------------------------------------------------01 ° unbekannt
02 ° Der Fehler trat bei einem wahlfreien Zugriff auf eine
° blockorientierte Einheit (z.B. Diskette) auf
03 ° Der Fehler trat im Netzwerk auf
04 ° Der Fehler trat bei einem sequentiellen Zugriff auf
° eine zeichenorientierte Einheit auf (z.B. Printer
° nicht bereit)
05 ° Der Fehler trat bei einem Zugriff auf den RAM-Speicher auf
Die erweiterten Fehlercodes sollten nur innerhalb folgender Konstellationen benutzt
werden:
·
Innerhalb eines INT 24-Handlers, um auch Netzwerkfehler abzufangen
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
295
·
Bei Verwendung von INT 21-Funktionsaufrufen, falls das Carry-Flag gesetzt ist und
der Fehlercode im Register AX zurückgegeben wird.
·
Bei FCB-Funktionsaufrufen, die als Fehler den Wert FFH im AL-Register zurückgeben.
An Hand der zurückgegebenen Werte, insbesondere im BL-Register, läßt sich dann die
weitere Vorgehensweise bestimmen.
4.87 Create Temporary File (Funktion 5AH, DOS 3.0 - 6.x)
Dieser Aufruf legt eine temporäre Datei im angegebenen Verzeichnis an. Es gelten
folgende Aufrufparameter: Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5AH
°
° DS:DX Zeiger auf einen ASCIIZ- °
°
String mit dem Pfad
°
° CX:
Dateiattribute
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° DS:DX Zeiger auf einen ASCIIZ- °
°
String mit dem Pfad
°
Û---------------------------------ì
Bei Aufruf der Funktion zeigt das Registerpaar DS:DX auf einen ASCIIZ-String mit dem
Pfadnamen. Dieser Pfad darf keinen Dateinamen enthalten und muß mit einem Backslash \
enden. Fehlt der Suchweg, legt DOS die Datei nicht im aktuellen, sondern im
Stammverzeichnis an. Weiterhin sind in diesem String 13 Byte für den später zugeordneten
Namen der temporären Datei zu reservieren. Im Register CX wird das Attributbyte der
neuen Datei angegeben. Die Kodierung ist im Kapitel über die DOS-Dateistrukturen
angegeben.
Die Funktion erzeugt nun einen Dateinamen und versucht die Datei anzulegen. Existiert
bereits eine Datei des gleichen Namens, wird so lange ein neuer Name generiert, bis dieser
nicht mehr im System vorkommt. Dann wird die Datei geöffnet. Der Name wird
vermutlich aus Datum und Uhrzeit abgeleitet.
Nach dem fehlerfreien Aufruf enthält der Pfad den Namen der temporären Datei. Es ist
aber zu beachten, daß die temporäre Datei nicht automatisch beim Programmende gelöscht
werden.
Tritt während des Aufrufes ein Fehler auf, dann wird das Carry-Flag gesetzt und im
Register AX findet sich ein Fehler.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
296
Code ° Fehler
-------é-----------------------------------03 ° Pfad nicht gefunden
04 ° zuviele offene Dateien
05 ° Zugriff auf die Einheit abgewiesen
80 ° Datei existiert bereits
Um in einem Netzwerk eine temporäre Datei anzulegen,
benötigt der rufende Prozeß das »Create
Access«Privileg. Andernfalls kann z.B. der Fehler 5
auftreten. Die erweiterten Fehlercodes lassen sich mit
der Funktion 59H abfragen.»4.88 Create New File
(Funktion 5BH, DOS 3.0 - 6.x)
Mit dieser Funktion läßt sich eine neue Datei erzeugen. Er ist identisch zur älteren DOSFunktion 3CH mit der Ausnahme, daß keine Datei angelegt wird, falls der Name bereits
existiert. Es gelten folgende Aufrufparameter:Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5BH
°
° DS:DX Zeiger auf einen ASCIIZ- °
°
String mit dem Pfad
°
° CX:
Dateiattribute
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° AX:
Filehandle
°
Û---------------------------------ì
Während die Funktion 3CH eine bestehende Datei auf die Länge 0 setzt und damit neu
anlegt, wird der Aufruf 4BH abgewiesen, falls der angegebene Name bereits existiert.
Damit ist sichergestellt, daß keine Datei versehentlich überschrieben wird. Im Registerpaar
DS:DX wird ein Zeiger auf einen ASCIIZ-String übergeben. Dieser String enthält den
Pfadnamen, einschließlich Laufwerks- und Dateibezeichnung. Der String ist mit einem
Nullbyte abzuschließen.
Im Register CX können die Dateiattribute übergeben werden (siehe Kapitel über den DOSDateiaufbau).
Die neue Datei wird im »Compatibility«Modus angelegt, d.h. die Datei kann gelesen und
beschrieben werden. Der Schreib-Lese-Zeiger wird auf das erste Byte positioniert.
Inner_halb eines Netz_werkes ist das »Create Access«Privileg für die Funktion
er_for_der_lich. Ab DOS 4.0 existiert die Funktion 6CH um eine Datei mit SHARE-Flags
zu öffnen.»Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt. Im AXRegister findet sich ein Fehlercode:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
297
Code ° Fehler
-------é----------------------------3
° Ungültiger Pfad
4
° Zu viele offene Dateien
5
° Zugriff abgewiesen
80
° Die Datei existiert bereits
Die erweiterten Fehlercodes lassen sich mit der Funktion 59H abfragen. Falls das CarryFlag nicht gesetzt ist, wird im AX-Register der Filehandle zurückgegeben.
4.89 Lock/Unlock File Access (Funktion 5CH, DOS 3.0 - 6.x)
Mit Hilfe dieser Funktionen lassen sich bestimmte Sätze einer Datei für den Zugriff
anderer Prozesse sperren und auch wieder freigeben. Dies ist insbesondere in Netzwerken
notwendig, um zu vermeiden, daß zwei Prozesse die Daten gleichzeitig manipulieren und
somit
falsche
Ergebnisse
auftreten.
Es
gelten
folgende
Aufrufparameter:Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5CH
°
° AL:
00H (Lock Datei)
°
°
01H (Unlock Datei)
°
° BX:
Filehandle
°
° CX:
Offset Highbyte
°
° DX:
Offset Lowbyte
°
° SI:
Länge Highbyte
°
° DI:
Länge Lowbyte
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
Û---------------------------------ì
Im Register BX muß der Handlecode der jeweiligen Datei übergeben werden. Dieser Code
wird beim Öffnen der Datei zurückgegeben. Der interessierende Bereich innerhalb der
Datei wird mit den Registern CX, DX, SI, DI markiert. In CX:DX findet sich ein 4-ByteZeiger auf den Beginn des zu sperrenden/ freizugebenden Bereichs. Die Länge dieses
Bereichs (Bytes) findet sich in SI:DI.
Der Wert im Register AL gibt an, ob der Dateibereich gesperrt oder freigegeben werden
soll.
Die Funktion ist nur gültig, falls ein Netzwerktreiber, oder das DOS-Programm SHARE
geladen ist.
Lock (AL = 00)
Mit dieser Unterfunktion läßt sich ein Dateibereich exclusiv für den Zugriff des gerade laufenden Prozesses reservieren, d.h. kein anderer Prozeß kann diese Daten lesen oder schreiben. Falls dies doch versucht wird, wird der Zugriff abgewiesen. Nach einigen Wiederholungen wird an diesen Prozeß eine Fehlermeldung abgesetzt. Die Zahl der Wiederholungen ist abhängig von der Systemeinstellung (siehe auch Funktion 440BH). In diesem
Fehlerfall kann der abgewiesene Prozeß die erweiterten Fehlercodes über die Funktion 59H
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
298
abfragen.Es kann jeder beliebige Bereich innerhalb der Datei für Zugriffe anderer Prozesse
gesperrt werden. Eine Sperre über das Dateiende hinaus wird nicht als Fehler betrachtet.
Die Sperre sollte durch den Prozeß nur für die Dauer des Zugriffs gesetzt werden, da dann
alle anderen Prozesse vom Zugriff ausgeschlossen werden. Falls ein Prozeß mit geöffneten
Dateien abgebrochen wird, treten undefinierte Resultate auf, wenn die Zugriffssperre vorher nicht aufgehoben wird. Dies ist insbesondere bei der Erstellung von Control-C und
Critical-Error-Handlern zu beachten.
Wird ein Handle dupliziert, ist der gesperrte Bereich auch beim zweiten Filehandle
bekannt. Wird ein Subprozeß mittels der EXEC-Funktion erzeugt, bleibt auch dieser
Subprozeß vom Zugriff auf die gesperrten Daten ausgeschlossen.
Die Prüfung auf Zugriffsmöglichkeiten bei gesperrten Dateibereichen sollte über die Funktion 5CH erfolgen. Ist der Bereich bereits gesperrt, wird das Carry-Flag gesetzt und im
Register AX findet sich ein Fehlercode:
Code ° Fehler
-------é---------------------------------------------1 ° Das DOS-Share-Kommando ist nicht geladen
6 ° Der Handle ist ungültig oder nicht geöffnet
33 ° Der Bereich ist ganz oder teilweise gesperrt
Über die Funktion 59H lassen sich die erweiterten Fehlercodes abfragen. Die Funktion sollte nur auf Dateien angewandt werden, die mit
dem »deny readFehler! Verweisquelle konnte nicht gefunden
werden.deny noneFehler! Verweisquelle konnte nicht gefunden
werden.Unlock (AL = 01)
Hier handelt es sich um die Gegenfunktion, die einen gesperrten Bereich wieder freigibt.
Der Bereich muß exakt mit den gleichen Parametern wie im Lock-Befehl spezifiziert
werden. Ursache ist die Speicherung der gesperrten Bereich durch SHARE in internen
Tabellen, die nur bei Übereinstimmung Einträge findet und löscht. Vor einem Programmabbruch muß die Unlockfunktion auf geöffnete Dateien ausgeführt werden, da sonst
undefinierte Resultate auftreten. Dies ist insbesondere bei INT 23-und INT 24-Handlern zu
beachten.
Wird ein Handle dupliziert, ist der freigegebene Bereich auch beim zweiten Filehandle
bekannt.
Tritt ein Fehler auf, wird das Carry-Flag gesetzt und im Register AX findet sich der Fehlercode:
Code ° Fehler
-------é----------------------------------------------1 ° Das DOS-Share-Kommando ist nicht geladen
6 ° Der Handle ist ungültig oder nicht geöffnet
33 ° Der Bereich ist ganz oder teilweise durch den
° aktiven Prozeß gesperrt
Die Fehlermeldung 33 tritt auf, falls mit einem zweiten LOCK-Aufruf geprüft wird, ob der
spezifizierte Bereich noch gesperrt ist. Sperren auf Geräte werden ignoriert, führen aber zu
keiner Fehlermeldung.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
299
Über die Funktion 59H lassen sich die erweiterten
Fehlercodes abfragen. Die Funktion sollte nur auf
Dateien angewandt werden, die mit dem »deny
readFehler! Verweisquelle konnte nicht gefunden
werden.deny noneFehler! Verweisquelle konnte nicht
gefunden werden.4.90 Interne Funktion (Funktion 5DH,
DOS 3.1 -6.x)
Diese Funktion ist nicht dokumentiert und wird intern ab DOS 3.1 benutzt. Die Funktion
erlaubt verschiedene indirekte Aufrufe der INT 21-Funktionen (Server Calls). Es sind die
Codes AL= 00H - 0FH belegt.
4.90.1 Indirect Function Call (AX = 5D00H)
Mit diesem Aufruf lassen sich ab DOS 3.1 interne Funktionen aktivieren. Es gilt folgende
Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 5DH (Internal)
°
° AL: 00H (indirect CALL)
°
° DS:DX Bufferadresse
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
In DS:DX ist eine Adresse auf eine Parameterliste zu übergeben. Diese besitzt folgenden
Aufbau:
Ö-------Ú------Ú---------------------------------------Ì
° Offs. ° Byte ° Feld
°
û-------é------é---------------------------------------À
° 00H ° 2 ° AX
°
° 02H ° 2 ° BX
°
° 04H ° 2 ° CX
°
° 06H ° 2 ° DX
°
° 08H ° 2 ° SI
°
° 0AH ° 2 ° DI
°
° 0CH ° 2 ° DS
°
° 0EH ° 2 ° ES
°
° 10H ° 6 ° reserviert
°
° 16H ° 2 ° ID der Maschine (0 = eigen)
°
° 18H ° 2 ° Prozess-ID (PSP-Seg. rufend. Prozess) °
Û-------Ù------Ù---------------------------------------ì
Diese Funktion erlaubt einen Server Call durch andere Maschinen, mit dem sich DOS-INT
21-Funktionen indirekt aufrufen lassen. Im vorletzten Wort der Parameterliste steht z.B. die
ID der rufenden Maschine. Beim Wert 0 wurde der Aufruf durch die eigene Maschine
abgesetzt. Die ersten Worte enthalten die Daten für die Registerbelegung. Die Funktion
lädt die betreffenden Register mit den Werten und ruft die gewünschte INT 21-Funktion
auf. Bei der Rückkehr sind die Register gemäß der aktivierten INT 21-Funktion gesetzt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
300
Enthält AX vor dem Aufruf ungültige Werte, stürzt das System ab. Die Funktion erlaubt
zum Beispiel den Aufruf der INT 21-Funktionen 41H (Delete) und 56H (Rename) mit
Wildcardzeichen im Dateinamen. Funktionen, die Filenamen benutzen, benötigen ein
Format wie es die INT 21-Funktion 60H liefert. Weiterhin bleiben die durch SHARE
gesetzten Wiederholungszeiten ungültig.
4.90.2 Commit all Files (AX = 5D01H)
Mit diesem Aufruf lassen sich ab DOS 3.1 alle Dateien für eine definierte Maschine oder
einen Prozess aktualisieren (commit). Es gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 5DH (Internal)
°
° AL: 01H (Commit Files)
°
° DS:DX Bufferadresse
°
û---------------------------------À
°
RETURN
°
° CY: 1 : Fehler
°
° AX: Fehlercode
°
° CY: 0 : ok
°
Û---------------------------------ì
In DS:DX ist eine Adresse auf eine Parameterliste zu übergeben. Diese besitzt eine
Struktur wie bei der Funktion 5D00H, wobei allerdings nur die beiden letzten Einträge ID
und Prozess ID benutzt werden.
Wird diese Funktion aufgerufen, lagert DOS alle Puffer in die Dateien aus und aktualisiert
Datum und Uhrzeit. Nach dem Aufruf signalisiert ein gesetztes Carry-Flag, daß ein Fehler
aufgetreten ist. Der Fehlercode findet sich dann in AX, die Codierung entspricht der INT
21-Funktion 59H.
4.90.3 SHARE Close all Files by Name (AX = 5D02H)
Mit diesem Aufruf lassen sich ab DOS 3.1 Dateien die mit SHARE geöffnet wurden über
ihren Namen schließen. Es gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 5DH (Internal)
°
° AL: 02H (Close Files)
°
° DS:DX Bufferadresse
°
û---------------------------------À
°
RETURN
°
° CY: 1 : Fehler
°
° AX: Fehlercode
°
° CY: 0 : ok
°
Û---------------------------------ì
In DS:DX ist eine Adresse auf eine Parameterliste zu übergeben. Diese besitzt eine
Struktur wie bei der Funktion 5D00H, wobei allerdings nur die beiden letzten Einträge ID
und Prozess ID, sowie die Registerwerte DS und DX benutzt werden. In dem durch DS:DX
adressierten Puffer ist in den Einträgen für die Register DS:DX die Adresse auf den Namen
der zu schließenden Datei zu übergeben. Der Dateiname ist als ASCIIZ-String in
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
301
kanonischer Form abzulegen. Diese Form wird durch die Funktion AH = 60H des INT 21
erzeugt.
Falls SHARE nicht geladen ist, gibt die Funktion einen Fehlercode (Carry-Flag gesetzt)
zurück. Der Fehlercode findet sich dann in AX, die Codierung ist der Funktion 59H des
INT 21 zu entnehmen.
4.90.4 SHARE Close all Files for a Computer (AX = 5D03H)
Mit diesem Aufruf lassen sich ab DOS 3.1 alle Dateien einer angegebenen Station über
SHARE schließen. Es gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 5DH (Internal)
°
° AL: 03H (Close all Files)
°
° DS:DX Bufferadresse
°
û---------------------------------À
°
RETURN
°
° CY: 1 : Fehler
°
° AX: Fehlercode
°
° CY: 0 : ok
°
Û---------------------------------ì
In DS:DX ist eine Adresse auf eine Parameterliste zu übergeben. Diese besitzt eine
Struktur wie bei der Funktion 5D00H, wobei allerdings nur der ID-Eintrag benutzt wird.
Bei erfolgreichem Aufruf werden alle Dateien einer Station geschlossen.
Falls SHARE nicht geladen ist, gibt die Funktion einen Fehlercode (Carry-Flag gesetzt)
zurück. Der Fehlercode findet sich dann in AX, die Codierung ist der Funktion 59H des
INT 21 zu entnehmen.
4.90.5 SHARE Close all Files for a Process (AX = 5D04H)
Mit diesem Aufruf lassen sich ab DOS 3.1 alle Dateien eines angegebenen Prozesses über
SHARE schließen. Es gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 5DH (Internal)
°
° AL: 04H (Close all Files)
°
° DS:DX Bufferadresse
°
û---------------------------------À
°
RETURN
°
° CY: 1 : Fehler
°
° AX: Fehlercode
°
° CY: 0 : ok
°
Û---------------------------------ì
In DS:DX ist eine Adresse auf eine Parameterliste zu übergeben. Diese besitzt eine
Struktur wie bei der Funktion 5D00H, wobei allerdings nur die Einträge Prozess-ID und ID
benutzt werden. Bei erfolgreichem Aufruf werden alle Dateien eines Prozesses geschlossen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
302
Falls SHARE nicht geladen ist, gibt die Funktion einen Fehlercode (Carry-Flag gesetzt)
zurück. Der Fehlercode findet sich dann in AX, die Codierung ist der Funktion 59H des
INT 21 zu entnehmen.
4.90.6 SHARE Get Open File List Entry (AX = 5D05H)
Mit diesem Aufruf läßt sich ab DOS 3.1 die Liste der offenen Dateien ermitteln. Es gilt
folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 5DH (Internal)
°
° AL: 05H (Get File List)
°
° DS:DX Bufferadresse
°
û---------------------------------À
°
RETURN
°
° CY: 1 : Fehler
°
° AX: Fehlercode
°
° CY: 0 : ok
°
° BX: Netzwerk ID
°
° CX: Lock Zahl
°
° ES:DI ASCIIZ Filename
°
Û---------------------------------ì
In DS:DX ist eine Adresse auf eine Parameterliste zu übergeben. Diese besitzt eine
Struktur wie bei der Funktion 5D00H, wobei allerdings nur einige Felder belegt sind. Im
Feld BX des Puffers ist ein Index in den Sharing Record (siehe Funktion 52H) einzutragen.
CX (im Puffer) enthält einen Index der SFT in die Sharing Record SFT Liste.
Falls SHARE nicht geladen ist, gibt die Funktion einen Fehlercode (Carry-Flag gesetzt)
zurück. Der Fehlercode findet sich dann in AX, die Codierung ist der Funktion 59H des
INT 21 zu entnehmen. Falls der übergebene Index ungültig ist, gibt die Funktion den
Fehlercode 18 (no more files) zurück.
Bei erfolgreichem Aufruf ist das Carry-Flag gelöscht und BX enthält die Nummer der
Maschine im Netzwerk, welche die SFT besitzt. CX enthält die Zahl der Sperren (Locks)
die der Besitzer in der SFT eingetragen hat. In ES:DI findet sich ein Zeiger auf den
Filenamen, der als ASCIIZ-String abgelegt wurde.
4.90.7 Get Address of DOS Swappable Data Area (AX = 5D06H)
Dieser Aufruf liefert die Adresse und die Adresse des DOS-Datenbereiches zurück. Es gilt
folgende Aufrufschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
303
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 5DH (Internal)
°
° AL: 06H (Get DOS Data Adr.)
°
û---------------------------------À
°
RETURN
°
° CY: 1 -> Fehler
°
° AX: Fehlercode
°
° CY: 0 -> ok
°
° DS:SI Adresse DOS Datenbereich °
° CX: Größe Bereich 1
°
° DX: Größe Bereich 2
°
Û---------------------------------ì
Der Aufruf wird ab DOS 3.1 unterstützt. Er gibt die Adresse des internen DOSDatenbereiches an. Dieser Datenbereich enthält alle internen DOS-Daten und kann bei
Benutzung reentranter Programme ausgetauscht werden. Nach dem Aufruf enthält DS:SI
die Adresse des Bereiches. CX gibt die Größe des auszutauschenden Datenbereiches an,
der während einer kritschen DOS-Phase (INDOS-Flag <> 0) auszutauschen ist. In DX
steht die Größe des unbedingt auszutauschenden Datenbereiches.
Der DOS-Datenbereich besitzt folgenden Aufbau:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Offset Bytes
00H 1
Bedeutung
Critical Error Flag, besitzt den Wert 00
falls DOS gerade über den INT 24 aufgerufen wurde.
01H 1
InDOS-Flag, hat während der Aktivitäten
in DOS den Wert 1, während des Aufrufes
von Routinen aus dem INT 28 den Wert 2
der Wert 0 zeigt an, daß DOS nicht aktiv ist.
02H 1
Laufwerk auf dem der Fehler aufgetreten
ist, oder FFH.
03H 1
Ort des zuletzt aufgetretenen Fehlers
(s. Funktion 59H)
04H 2
Extended Error Code (letzter Fehler)
06H 1
vorgeschlagene Aktion für den Fehler
07H 1
Fehlerklasse letzter Fehler
08H 4
wird von der Funktion 59H in ES:DI zurückgeliefert
(Zeiger auf den letzten Fehler)
0CH 4
Adresse aktuelle DTA
10H 2
Segment aktuelles PSP
12H 2
Zwischenspeicher für SP beim INT 23
14H 2
Exitcode des zuletzt beendeten Prozesses
16H 1
Kennung aktuelles Laufwerk (0=A:,etc.)
17H 1
Extended Break Flag (0 Prüfung nur bei I/O-Operat.
1 Prüfung bei jedem DOS-Aufruf)
--- Datenblock 2 --18H 2
Wert von AX beim INT 21 Aufruf
1AH 2
PSP-Segment beim Sharing/Netzwerk Aufruf
1CH 2
Maschinen Nummer im Netzwerk
1EH 2
First usable memory block
bei Speicherallocierung
20H 2
Best usable memory block
bei Speicherallocierung
22H 2
Last usable memory block
bei Speicherallocierung
24H 2
Speichergröße in Paragraphen (nur beim Init)
26H 2
reserviert
28H 1
Fehler beim INT 24 Aufruf
29H 1
Bit Flag Aktionen beim INT 24
2AH 1
unbekannt
2BH 1
FFH Abbruch mit Ctrl-C, sonst 0
2CH 2
unbekannt
2EH 1
Tag
2FH 1
Monat
30H 1
Jahr (ab 1980)
32H 2
Zahl der Tage seit dem 1.1.1980
34H 1
Wochentag (0=Sonntag)
35H 1
SFT Zeiger (?)
36H 1
Flag <> 0: sicher um INT 28 aufzurufen
37H 1
Flag <> 0: INT 24 Abortabfrage wurde mit Fail
quittiert
38H 26
Device Treiber Request Header
52H 4
Zeiger auf Device Treiber Entry Point
56H 22
Device Treiber Request Header
6CH 22
Device Treiber Request Header
82H 1
Typ der PSP-Kopie (00H= einfache Kopie
FFH= make child)
83H 1
unbekannt
84H 3
24-Bit-User-Nummer
87H 1
OEM-Versionsnummer
88H 2
unbekannt
8AH 6
CLOCK$-Transfer-Record
90H 2
unbekannt
92H 128
Buffer für Filenamen
112H 128
Buffer für Filenamen
192H 21
Find first/ find next search Datenblock
1A7H 32
Directory Eintrag für gefundene Files
1C7H 81
Kopie der aktuellen Directory Struktur (CDS)
218H 11
FCB-Format Filename
223H 1
unbekannt
224H 11
Wildcard Zielname für Rename über FCB-Format
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
304
DOS Programmierhandbuch
22FH
238H
239H
23AH
23BH
23FH
305
9
1
1
1
4
1
unbekannt
Attribute Extended FCB
Typ des FCB (0 regulär, FF extended)
Attribute Directory Suche
unbekannt
Flag: signalisiert wie DOS aufgerufen
wurde (00: direkt per INT 21, FF: Server Call (AX=5D00H)
240H 2
unbekannt
242H 1
Flag 0:read 1:write
243H 3
unbekannt
246H 1
Flag: insert mode line edit
247H 1
Flag = FFH -> canonischer Filename bezieht sich
auf einen existierenden File
248H 1
unbekannt
249H 1
Typ der Prozess Termination (00 - 03H)
24AH 1
unbekannt
24BH 1
Wert der als 1. Zeichen in den Namen gelöschter
Dateien eingetragen wird (5EH)
24CH
4
Zeiger auf den Drive Parameter Block für
Aufrufe während eines kritischen Fehlers
250H
4
Zeiger auf den Stackbereich, welcher beim
INT 21-Aufruf die User-Register enthält
254H
2
SP-Inhalt beim INT 24-Aufruf
256H
4
unbekannt
25AH
8
unbekannt
262H
1
Media ID-Byte, welches per INT 21, Funktion
1BH oder 1CH zurückgegeben wird
263H
1
unbekannt
264H
4
Zeiger auf den Device Header
268H
4
Zeiger auf die aktuelle SFT
26CH
4
Zeiger auf die aktuelle Directorystruktur
270H
4
Zeiger auf den FCB des rufenden Prozesses
274H
2
Zahl der SFT auf die sich eine offene Datei bezieht
276H
2
temporärer Speicher für File Handles
278H
4
Zeiger auf den Beginn der JFT der Handle Tabelle
des Prozesses
27CH
2
Offset im DOS Datensegment zum 1. Argument des
Filenamens
27EH
2
Offset im DOS Datensegment zum 2. Argument des
Filenamens
280H
2
Offset der letzten Komponente im Pfadnamen
(oder FFFFH)
282H
14
unbekannt
292H
4
aktueller Offset in der Datei
296H
12
unbekannt
2A2H
4
Zahl der Bytes, die an die Datei angefügt werden
2A6H
4
unbekannt
2AAH
4
Zeiger auf die bearbeitete SFT
2AEH
2
INT 21 BX-Inhalt
2B0H
2
INT 21 DS-Inhalt
2B2H
2
temporäre Speicherzelle
2B4H
4
Zeiger auf vorhergehenden Call Frame,
wird auch beim INT 24 aufgerufen
2B8H
21
FindFirst Suchpuffer
2CDH
32
Directory Eintrag für Filenamen, die umbenannt werden
2EDH
331
DOS Stack 1 für Critical Error Aufrufe
403H
35
Scratch SFT
438H
384
DOS Stack 2 Disk INT 21-Funktionen > 0CH, INT 25, INT 26
5B8H
384
DOS Stack 3 Character INT 21-Funktionen 01H bis 0CH
---- DOS 3.2 - 3.3 ----738H
1
Device Treiber »lookahead«Flag»739H 3
unbekannt
Diese Daten können durch TSR-Programme komplett umkopiert werden, so daß eine
Reetrance Fähigkeit erreicht werden kann.
Teil 2 des Datenbereiches ist nur dann von TSR-Programmen zu sichern, falls DOS gerade
aktiv ist.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
306
4.90.8 Get Redirected Printer Mode (AX = 5D07H)
Dieser Aufruf ist erst ab DOS 3.1 in Netzwerkumgebungen implementiert.
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 5DH (Internal)
°
° AL: 07H (Get Printer Mode)
°
û---------------------------------À
°
RETURN
°
° DL: Mode
°
Û---------------------------------ì
Mit diesem Aufruf läßt sich in einem Netzwerk der Mode eines umgeleiteten Druckers
abfragen.
Im Register DL steht nach dem Aufruf der Mode:
DL: 00H
01H
redirected output is combined
redirected output in separate print jobs
Die Funktion gibt keinen Fehlerstatus zurück.
4.90.9 Set Redirected Printer Mode (AX = 5D08H)
Dieser Aufruf ist erst ab DOS 3.1 in Netzwerkumgebungen implementiert.
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 5DH (Internal)
°
° AL: 08H (Set Printer Mode)
°
° DL: Mode
°
û---------------------------------À
°
RETURN
°
° ---°
Û---------------------------------ì
Mit diesem Aufruf läßt sich in einem Netzwerk der Mode eines umgeleiteten Druckers
setzen.
Im Register DL wird vor dem Aufruf der Mode:
DL: 00H
01H
redirected output is combined
redirected output in separate
print jobs, start new job
übergeben. Die Funktion gibt keinen Fehlerstatus zurück.
4.90.10 Flush Redirected Printer Output (AX = 5D09H)
Dieser Aufruf ist erst ab DOS 3.1 in Netzwerkumgebungen implementiert.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
307
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 5DH (Internal)
°
° AL: 09H (Flush Printer Output) °
û---------------------------------À
°
RETURN
°
° ---°
Û---------------------------------ì
Mit diesem Aufruf läßt sich in einem Netzwerk die Ausgabe des Puffers an den Drucker
erzwingen.
Anschließend wird ein neuer Druckjob aufgesetzt. Die Funktion gibt keinen Fehlerstatus
zurück.
4.90.11 Set Extended Error Info (AX = 5D0AH)
Der Aufruf ist ab DOS 3.1 vorhanden, ist aber erst ab DOS 5.0 offiziell dokumentiert.
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 5DH (Internal)
°
° AL: 0AH (Extended Error)
°
° DS:DX Bufferadresse
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Mit diesem Aufruf setzt DOS 3.1 die internen Extended Error Codes.
Im Registerpaar DS:DX wird die Adresse des folgenden Puffer übergeben.
Ö-------Ú------Ú---------------------------------------Ì
° Offs. ° Byte ° Feld
°
û-------é------é---------------------------------------À
° 00H ° 2 ° Wert für AX für Funktion 59H
°
° 02H ° 2 ° Wert für BX für Funktion 59H
°
° 04H ° 2 ° CX
°
° 06H ° 2 ° DX
°
° 08H ° 2 ° SI
°
° 0AH ° 2 ° DI
°
° 0CH ° 2 ° DS
°
° 0EH ° 2 ° ES
°
° 10H ° 6 ° reserviert
°
Û-------Ù------Ù---------------------------------------ì
In den beiden ersten Worten werden die Codes übergeben, die anschließend bei der
Abfrage der Funktion 59H in AX und BX zurückgegeben werden.
4.90.12 Get DOS Swappable Data Areas (AX = 5D0BH)
Dieser Aufruf ist erst ab DOS 4.x implementiert.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
308
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 5DH (Internal)
°
° AL: 0BH (Get SWAP Areas)
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° DS:SI Adresse
°
Û---------------------------------ì
Mit diesem Aufruf läßt sich analog zum Aufruf AX=5D06H die Adresse des internen
DOS-Datenbereiches ermitteln.
Tritt beim Aufruf ein Fehler auf, wird das Carry-Flag gesetzt. Der Fehlercode findet sich
im Register AX. Bei gelöschtem Carry-Flag befindet sich im Registerpaar DS:SI ein Zeiger
auf ein DOS-Datenliste (swappable-data-area-list) mit folgendem Format:
Ö-------Ú------Ú---------------------------------------Ì
° Offs. ° Byte ° Feld
°
û-------é------é---------------------------------------À
° 00H ° 2 ° Zahl der Datenbereiche
°
û-------é------é---------------------------------------À
° ---- ° ---- ° für jeden Datenbereich
°
° xxH ° 4 ° Adresse des Datenbereiches
°
° xxH ° 2 ° Länge und Typ des Datenbereiches
°
°
° ° Bit 15 = 1: Daten immer swappen
°
°
° °
0: Daten nur per DOS swappen °
°
° ° Bit 0-14: Länge in Byte
°
Û-------Ù------Ù---------------------------------------ì
Der Speicher enthält im ersten Wort einen Zähler, der die Zahl der DOS-Datenbereich
definiert. Bisher sind in DOS 4.0 3 Datenbereiche vorhanden. Für jeden der Datenbereiche
findet sich in der Tabelle dann eine 6-Byte-Datenstruktur. Die ersten 4 Byte enthalten den
Adressvektor auf den Beginn der Datenstruktur. Daran schließt sich ein Flag (Word) mit
Informationen über den Datenbereich an.
In DOS 4.0 bis 6.x hat der DOS-Datenbereich selbst folgendes Format:
Offset Bytes
00H
1
01H
1
02H
1
03H
1
04H
06H
07H
08H
2
1
1
4
0CH
10H
12H
14H
16H
4
2
2
2
1
Bedeutung
Critical Error Flag, besitzt den Wert 00
falls DOS gerade über den INT 24 aufgerufen wurde.
InDOS-Flag, hat während der Aktivitäten
in DOS den Wert 1, während des Aufrufes
von Routinen aus dem INT 28 den Wert 2
der Wert 0 zeigt an, daß DOS nicht aktiv ist.
Laufwerk auf dem der Fehler aufgetreten
ist, oder FFH.
Ort des zuletzt aufgetretenen Fehlers
(s. Funktion 59H)
Extended Error Code (letzter Fehler)
vorgeschlagene Aktion Fehler
Fehlerklasse letzter Fehler
wird von der Funktion 59H in ES:DI zurückgeliefert
(Zeiger auf den letzten Fehler)
Adresse aktuelle DTA
Segment aktuelles PSP
Zwischenspeicher für SP beim INT 23
RETURN-Code des zuletzt beendeten Prozesses
Kennung aktuelles Laufwerk (0=A:,etc.)
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
17H
1
Extended Break Flag (0 Prüfung nur bei I/O-Operat.
1 Prüfung bei jedem DOS-Aufruf)
18H 2
reserviert
--- Datenblock 2, nur swappen, falls in DOS --1AH 2
Wert von AX beim INT 21 Aufruf
1CH 2
PSP-Segment beim Sharing/Netzwerk Aufruf
1EH 2
Maschinen Nummer im Netzwerk
20H 2
First usable memory block
bei Speicherallocierung
22H 2
Best usable memory block
bei Speicherallocierung
24H 2
Last usable memory block
bei Speicherallocierung
26H 2
Speichergröße in Paragraphen (nur beim Init)
26H 8
reserviert
30H 1
Tag
31H 1
Monat
32H 1
Jahr (ab 1980)
34H 2
Zahl der Tage seit dem 1.1.1980
36H 1
Wochentag (0=Sonntag)
37H 3
unbekannt
38H 30
Device Treiber Request Header
58H 4
Zeiger auf Device Treiber Entry Point
5CH 22
Device Treiber Request Header
72H 30
Device Treiber Request Header
90H 6
unbekannt
96H 6
CLOCK$-Transfer-Record
9CH 2
unbekannt
9EH 128
Buffer für Filenamen
11EH 128
Buffer für Filenamen
19EH 21
Find first/ find next search Datenblock
1B3H 32
Directory Eintrag für gefundene Files
1D3H 88
Kopie der aktuellen Directory Struktur
22BH 11
FCB-Format Filename
236H 1
unbekannt
237H 11
Wildcard Zielname für Rename über FCB-Format
242H 9
unbekannt
24BH 1
Attribute Extended FCB
24CH 1
Typ des FCB (0 regulär, FF extended)
24DH 1
Attribute Directory Suche
24EH 1
File Open Mode
24FH 3
unbekannt
252H 1
Flag: signalisiert wie DOS aufgerufen
wurde (00: direkt per INT 21, FF: Server Call (AX=5D00H)
253H 7
unbekannt
25AH 1
Flag = FFH -> canonischer Filename bezieht sich
auf einen existierenden File
25BH 1
unbekannt
25CH 1
Typ der Prozess Termination (00 - 03H)
25DH 3
unbekannt
260H 4
Zeiger auf den Drive Parameter Block für
Aufrufe während eines kritischen Fehlers
264H 4
Zeiger auf den Stackbereich, welcher beim
INT 21-Aufruf die User-Register enthält
268H 6
unbekannt
26EH 2
Segment Disk-Puffer
270H 8
unbekannt
278H 1
Media ID-Byte, welches per INT 21, Funktion
1BH oder 1CH zurückgegeben wird
279H 5
unbekannt
27EH 4
Zeiger auf die aktuelle SFT
282H 4
Zeiger auf die aktuelle Directorystruktur
286H 4
Zeiger auf den FCB des rufenden Prozesses
28AH 2
Zahl der SFT auf die sich eine offene Datei bezieht
28CH 2
temporärer Speicher für File Handles
28EH 4
Zeiger auf den Beginn der JFT der Handle Tabelle
des Prozesses
292H 2
Offset im DOS Datensegment zum 1. Argument des
Filenamens
294H 2
Offset im DOS Datensegment zum 2. Argument des
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
309
DOS Programmierhandbuch
296H
2B4H
2B6H
2B8H
2BEH
2C2H
2AAH
2CAH
2CCH
2CEH
2D0H
30
2
2
6
4
8
4
2
2
2
4
2D4H
2D6H
2D9H
2DDH
2DFH
2E1H
2E3H
2E7H
2ECH
2EEH
2F3H
2F7H
2FBH
2FFH
300H
315H
334H
480H
600H
780H
2
3
4
2
2
2
4
5
2
5
4
4
4
1
21
32
331
384
384
1
310
Filenamens
unbekannt
Zahl der Byte im partiellen Sektor
Zahl der Sektoren
unbekannt
Zahl der Bytes, die an die Datei angefügt werden
unbekannt
Zeiger auf die bearbeitete SFT
INT 21 BX-Inhalt
INT 21 DS-Inhalt
temporäre Speicherzelle
Zeiger auf vorhergehenden Call Frame,
wird auch beim INT 24 aufgerufen
Open Mode (INT 21,AX=6C00H)
unbekannt
Speicher für ES:DI bei INT 21, AX=6C00H
Extended File Open Action Code (AX=6C00H)
Extended File Open Attribute (AX=6C00H)
Extended File Open File Mode (AX=6C00H)
Zeiger auf Filenamen (AX=6C00H)
unbekannt
speichert DS zeitweise (Funkt. 52H)
unbekannt
Zeiger Anwender-Filename
unbekannt
SS:SP temporär (Funkt. 52H)
Flag <> 0, falls Stack umgeschaltet (Funkt. 52H)
Puffer für FindFirst Daten
Directory Eintrag für Rename Files
Critical Error Stack
DOS Stack 2 Disk INT 21-Funktionen > 0CH, INT 25, INT 26
DOS Stack 3 Character INT 21-Funktionen 01H bis 0CH
Device Treiber »lookahead«Flag» 781H 15
unbekannt
Eine Sicherung dieser Daten erlaubt einen Aufruf von DOS-Routinen durch TSRProgramme, sofern nicht gerade ein INT 2A ausgeführt wird.
4.91 Get Machine Name (Funktion 5EH, Code 00H,
DOS 3.1 - 6.x)
Die Funktion 5EH bezieht sich auf die Netzwerkfunktionen, die erst ab DOS 3.1 implementiert wurden. Mit dem Aufruf 5E00H läßt sich der Name einer Maschine innerhalb des
Netzwerkes ermitteln. Es gelten folgende Parameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5EH
°
° AL:
00H
°
° DS:DX Zeiger auf einen Puffer °
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° CH:
Flag
°
° CL:
Nummer
°
Û---------------------------------ì
Das AL-Register selektiert mit dem Wert 00H die Subfunktion »Get Maschine Name« Das
Register_paar DS:DX enthält eine Pufferadresse, in dem der ASCIIZ-String mit dem
Namen der Maschine zu_rückge_ge_ben wird. Hierbei handelt es sich um einen String der
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
311
Länge 15 (Byte), der mit einem Nullbyte abgeschlossen wird. Falls der Name der
Mas»hine keine 15 Zeichen umfaßt, wird der restliche Bereich mit Blanks gefüllt. Im
Register CH wird ein Flag zurückgegeben.
Ist der Name der Maschine nicht definiert, wird der Wert 00H eingetragen. Dann ist die in
CL befindliche Nummer ungültig. Andernfalls findet sich hier die NetBIOS-Nummer der
Maschine.
Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt und in AX findet
sich der Fehlercode:
Code ° Fehler
--------é----------------------------------------1 ° Die Netzwerksoftware ist nicht geladen
Allerdings prüfen die meisten DOS-Versionen den Netzwerktreiber nicht ab, so daß der
Fehler kaum auftritt. Die erweiterten Fehlercodes lassen sich durch die Funktion 59H
abfragen. Es ist zu beachten, daß vor Aufruf der Funktion auch auf der lokalen Station die
Netzwerksoftware geladen ist, da sonst die Resultate undefiniert sind.
2.92 Set Machine Name (Funktion 5EH, Code 01H,
DOS 3.1 - 6.x)
Mit dem Aufruf 5E01H läßt sich der Name einer Maschine innerhalb des Netzwerkes
setzen. Es gelten folgende Parameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5EH
°
° AL:
01H
°
° CH:
Flag
°
° CL:
Nummer
°
° DS:DX Zeiger auf einen Puffer °
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Das CL-Register enthält beim Aufruf die Nummer der Maschine. In CH ist ein Flag zu
übergeben, welches den Aufruf steuert. Mit CH=00 wird der aktuell eingestellt Name als
ungültig markiert. Mit CH <> 00 wird der neue Name gesetzt. Dieser Name muß in einem
15 (Byte) langen Puffers stehen, der mit einem Nullbyte abgeschlossen wird.
Falls der Name der Maschine keine 15 Zeichen umfaßt, wird der restliche Bereich mit
Blanks gefüllt. Im Registerpaar DS:SI ist die Adresse des Puffers zu übergeben.
Die Funktion gibt offenbar keine Fehlercodes zurück.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
312
4.93 Set Printer Setup (Funktion 5EH, Code 02H, DOS 3.1 6.x)
Mit dem Aufruf 5E02H läßt sich ein Initialisierungsstring für den Netzwerk-Drucker
definieren. Dieser String wird dann vor jeder Ausgabe an den Drucker des Netzwerkes
ausgegeben. Es gelten folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5EH
°
° AL:
02H
°
° BX:
Zuordnungsliste
°
° CX:
Stringlänge (bis 64 Byte)°
° DS:SI Zeiger auf einen Puffer °
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
Û---------------------------------ì
Im Register BX wird ein Zuordnungsindex für die Netzwerkeinheit übergeben. Der Wert
kann durch den Funktionsaufruf 5F02H (Get Redirection List) ermittelt werden. Das
Registerpaar DS:SI enthält die Anfangsadresse eines Pufferbereiches, in dem der Initialisierungsstring abgelegt ist. Die Länge dieses Strings wird im Register CX übergeben,
wobei die maximale Länge 64 Byte umfaßt.
Tritt während des Funktionsaufrufes ein Fehler auf, ist nach der Rückkehr das Carry-Flag
gesetzt. Im Register AX findet sich folgender Fehlercode:
Code ° Fehler
-------é----------------------------------------1
° Die Netzwerksoftware ist nicht geladen
87
° ungültiger Parameter
Tritt der Fehler 87 (dezimal) auf, wurde in BX ein ungültiger Index in die Zuordnungsliste
übergeben. Vor einem Aufruf der Funktion ist die Netzwerksoftware der Maschine zu
laden. Die erweiterten DOS-Fehlercodes lassen sich mittels der Funktion 59H abfragen.
Es ist zu beachten, daß der Zuordnungsindex für die Einheit bei jedem Aufruf der Funktion
5F03H (Redirect Device) und bei Funktion 5F04H (Cancel Redirection) geändert wird.
Daher sollte die Set-Funktion sofort nach dem Aufruf Get Printer Setup abgesetzt werden.
Mit der Set-Funktion ist es möglich, daß mehrere Benutzer einen Drucker gleichzeitig
benutzen. Da vor Ausgabe einer jeden Datei auf diesen Drucker ein Initialisierungsstring
vorgeschaltet wird, läßt sich das Gerät individuell nach den Bedürfnissen eines jeden Benutzers einstellen.
4.94 Get Printer Setup (Funktion 5EH, Code 03H, DOS 3.1 6.x)
Mit dem Aufruf 5E03H läßt sich der Initialisierungsstring für den Drucker abfragen. Dieser
String wird vor jeder Ausgabe an den Drucker des Netzwerkes ausgegeben. Es gelten folgende Übergabeparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
313
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5EH
°
° AL:
03H
°
° BX:
Zuordnungsliste
°
° ES:DI Zeiger auf einen Puffer °
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° CX:
Stringlänge (bis 64 Byte)°
Û---------------------------------ì
Im Register BX wird ein Zuordnungsindex für die Netzwerkeinheit übergeben. Der Wert
kann durch den Funktionsaufruf 5F02H (Get Redirection List Entry) ermittelt werden. Das
Registerpaar ES:DI enthält die Anfangsadresse eines Pufferbereiches, in dem der
Initialisierungsstring zurückgegeben wird. Die Länge dieses Strings findet sich dann im
Register CX, wobei die maximale Länge 64 Byte umfaßt.
Tritt während des Funktionsaufrufes ein Fehler auf, ist nach der Rückkehr das Carry-Flag
gesetzt. Im Register AX findet sich folgender Fehlercode:
Code ° Fehler
-------é----------------------------------------1
° Die Netzwerksoftware ist nicht geladen
87
° ungültiger Parameter
Vor einem Aufruf der Funktion 5E03H ist die Netzwerksoftware auf der Maschine zu
laden. Die erweiterten DOS-Fehlercodes lassen sich durch die Funktion 59H abfragen.
Es ist zu beachten, daß der Zuordnungsindex für die
Einheit bei jedem Aufruf der Funktion 5F03H (Redirect
Device) und bei Funktion 5F04H (Cancel Redirection)
geändert wird. Daher sollte die Set-Funktion sofort nach
dem Aufruf »Get Printer SetupFehler! Verweisquelle
konnte nicht gefunden werden.4.95Set Printer Mode
(Funktion 5EH, Code 04H, DOS 3.1 - 6.x)
Mit dem Aufruf 5E04H läßt sich der Mode für den Netzwerk-Drucker definieren. Es gelten
folgende Übergabeparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
314
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5EH
°
° AL:
04H
°
° BX:
Redirection Index
°
° DX:
Printer Mode
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
Û---------------------------------ì
Im Register BX wird ein Zuordnungsindex für die Redirectionsliste übergeben. In DX ist
der Mode zu setzen. Hierbei gilt:
DX
Bit 0 = 1: Binärmode
0: Textmode
Im Textmode werden Tabulatoren in Leerzeichen gewandelt.
Tritt während des Funktionsaufrufes ein Fehler auf, ist nach der Rückkehr das Carry-Flag
gesetzt. Im Register AX findet sich ein Fehlercode, dessen Bedeutung beim INT 21-Aufruf
Funktion 59H beschrieben wurde.
4.96Get Printer Mode (Funktion 5EH, Code 05H, DOS 3.1 6.x)
Mit dem Aufruf 5E05H läßt sich der Mode für den Netzwerk-Drucker abfragen. Es gelten
folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5EH
°
° AL:
05H
°
° BX:
Redirection Index
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° DX:
Printer Mode
°
Û---------------------------------ì
Im Register BX wird ein Zuordnungsindex für die Redirectionsliste übergeben. Dieser
Index läßt sich über die Funktion 5F02H ermitteln.
Nach einem fehlerfreien Aufruf enthält DX den Mode:
DX
Bit 0 = 1: Binärmode
0: Textmode
Im Textmode werden Tabulatoren in Leerzeichen gewandelt.
Tritt während des Funktionsaufrufes ein Fehler auf, ist nach der Rückkehr das Carry-Flag
gesetzt. Im Register AX findet sich ein Fehlercode, dessen Bedeutung beim INT 21-Aufruf
Funktion 59H beschrieben wurde.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
315
4.97 Get Redirection Mode (Funktion 5FH, Code 00H,
DOS 3.1 - 6.x)
Innerhalb eines Netzwerkes lassen sich bestimmte Einheiten (Drucker etc.) auf andere
Rechnerknoten umleiten. Mit dem Aufruf läßt sich der Mode eines umgeleiteten Gerätes
ermitteln. Es gelten folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5FH
°
° AL:
00H
°
° BL:
Umleitungstyp
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° BH:
Umleitungsstatus
°
Û---------------------------------ì
Das AL-Register enthält den Subcode 00H, während das Register BL den Typ des Gerätes
enthält. Für die Einträge in BL gilt dabei: 03H = Drucker, 04H = Disk Laufwerk.
Falls der Aufruf ohne Fehler ausgeführt wurde, das Carry-Flag ist gelöscht, enthält das
Register BH nach dem Aufruf den Status (00 = OFF, 01H = ON).
Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt und in AX findet
sich der Fehlercode der bei der Funktion 59H beschrieben wurde.
4.98 Set Redirection Mode (Funktion 5FH, Code 01H,
DOS 3.1 - 6.x)
Mit dem Aufruf läßt sich der Mode eines umgeleiteten Gerätes setzen. Es gelten folgende
Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5FH
°
° AL:
01H
°
° BL:
Umleitungstyp
°
° BH:
Umleitungsmode
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
Û---------------------------------ì
Das AL-Register enthält den Subcode 01H, während das Register BL den Typ des Gerätes
enthält. Für die Einträge in BL gilt dabei: 03H = Drucker, 04H = Disk Laufwerk. In BH ist
der Status für die Umleitung zu übergeben. Hierbei gilt:
BH = 00: Off
01: ON
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
316
Falls der Aufruf ohne Fehler ausgeführt wurde, ist das Carry-Flag gelöscht. Anernfalls
enthält AX einen Fehlercode, der gemäß den Konventionen der Funktion 59H kodiert ist.
4.99 Get Redirection List Entry (Funktion 5FH, Code 02H,
DOS 3.1 - 6.x)
Innerhalb eines Netzwerkes lassen sich bestimmte Einheiten (Drucker etc.) auf andere
Rechnerknoten umleiten. Die Zuordnung zwischen logischen Gerätenamen und dem
Kommunikationskanal erfolgt über eine Zuordnungsliste. Mit dem Aufruf läßt sich die
Zuordnungsliste lesen. Die Umleitungsparameter werden zum Beispiel innerhalb Funktion
5EH benutzt. Es gelten folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5FH
°
° AL:
02H
°
° BX:
Zuordnungsliste
°
° DS:SI Zeiger auf Puffer mit dem°
°
lokalen Einheitennamen
°
° ES:DI Zeiger auf Puffer mit dem°
°
Netzwerknamen
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° BH:
Status der Einheit
°
° BL:
Typ der Einheit
°
° CX:
Parameterwert
°
Û---------------------------------ì
Das AL-Register enthält den Subcode 02H, während das Register BX einen Indexwert in
die Umleitungstabelle übergibt. Dieser Index spezifiziert, welcher Eintrag zu lesen ist (0 =
erster Eintrag).
Als weiteres sind zwei Adreßzeiger für Puffer zu definieren. Der erste Puffer von 16-ByteLänge dient zur Aufnahme des Namens der lokalen Einheit, die auf einen Netzwerkknoten
umgeleitet wurde. Der Vektor wird im Registerpaar DS:DI (Segment:Offset) übergeben.
Das Registerpaar ES:DI enthält die Adresse des zweiten 128-Byte-Puffers, in dem der
Name der Netzwerkeinheit abgelegt wird.
Die Listen sind beim Aufruf leer. MS-DOS ermittelt die Namen an Hand der internen
Umleitungstabelle, der Eintrag wird durch den Index in BX selektiert, und speichert sie in
die Puffer als ASCII-Strings um. Pro Aufruf kann nur ein Eintrag der Umleitungstabelle
gelesen werden. Diese Einträge sind vorher durch die Funktion 5F03H zu setzen. Soll die
gesamte Liste abgefragt werden, ist der Index (beginnend bei 0) nach jedem Aufruf um den
Wert 1 zu erhöhen. Beim Erreichen des Listenendes gibt die Funktion die Fehlermeldung
18 zurück.
Falls der Aufruf ohne Fehler ausgeführt wurde, das Carry-Flag ist gelöscht, enthält das
Register CX einen gespeicherten Wert, der bei der Definition der Tabelle durch den
Benutzer vergeben werden kann. DOS verwaltet dann diesen Code und gibt ihn bei der
Abfrage mit aus.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
317
Im Register BH findet sich ein Statuswort mit folgender Kodierung:
Bit 0:
0
1
Bit 1-7:
die abgefragte Einheit ist gültig
die Einheit ist nicht definiert
reserviert
Im Register BL findet sich ein Code zur Kennzeichnung des Typs der lokalen Einheit. Es
gilt folgende Zuordnung:
CL ° Typ der Einheit
----é----------------3 ° Drucker
4 ° Laufwerk
Die Register DX und BP werden beim Aufruf der Funktion 5F02H zerstört.
Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt und in AX findet
sich der Fehlercode:
Code ° Fehler
-----é---------------------------------------1 ° Die Netzwerksoftware ist nicht geladen
18 ° Keine weiteren Einträge in der Tabelle
Die erweiterten Fehlercodes lassen sich durch die Funktion 59H abfragen.
Es ist zu beachten, daß vor Aufruf der Funktion auch auf der lokalen Station die Netzwerksoftware geladen ist, da sonst der Fehler 1 auftritt.
4.100Redirect Device (Funktion 5FH, Code 03H, DOS 3.1 6.x)
Mit dem Aufruf 5F03H läßt sich eine neue Zuordnung innerhalb des Netzwerkes aufbauen.
Dies bezieht sich sowohl auf die Zuordnung einzelner Inhaltsverzeichnisse im Netzwerk
als auch auf die Zuordnung der Netzwerkdrucker. Es gelten folgende Übergabeparameter.
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5FH
°
° AL:
03H
°
° BL:
Einheitentyp
°
° CX:
Anwendercode
°
° DS:SI Zeiger auf einen Puffer °
°
mit den Einheitennamen
°
° ES:DI Zeiger auf einen Puffer °
°
mit Pfad und Password
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
Û---------------------------------ì
Im Register AL wird der Subcode 03H abgelegt. Im Registerpaar DS:SI findet sich die
Anfangsadresse eines ASCIIZ-Strings (16 Byte) mit dem Namen der umzuleitenden
Einheit.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
318
In ES:DI wird der Zeiger auf den ASCIIZ-String übergeben, der den Pfad innerhalb des
Netzwerkes spezifiziert. Alle Ein-/Ausgaben zu der Quelleinheit werden dann von DOS zur
Zieleinheit im Netzwerk umgeleitet. Der Pfad innerhalb des Netzwerkes muß in der
Notation:
<Maschinenname><Pfadname><00H><Password><00H>
übergeben werden.
Das Register BL spezifiziert, um welchen Einheitentyp (03H = Printer, 04H = Disk) es sich
handelt. Der Quellstring darf eine maximale Länge von 128 Byte nicht überschreiten.
Printer (BL = 03)
In diesem Fall wird ein Druckerausgang auf eine Einheit innerhalb des Netzwerkes umgeleitet. Im Register CX kann ein Anwendercode übergeben werden, den DOS verwaltet.
Innerhalb eines IBM-Netzwerkes sollte dieser Wert aus Kompatibilitätsgründen auf Null
gesetzt werden. Alle anderen Werte sind für das IBM-Netzwerkprogramm reserviert. Der
Wert wird beim Aufruf der Funktion 5F02H zurückgegeben. Alle Druckerausgaben
werden gepuffert und zum Netzwerkprinter umgeleitet. Die Funktion bezieht sich dabei auf
alle Ausgaben über den BIOS-INT 17, die durch die Einheitennamen PRN:, LPT1:, LPT2:,
LPT3: spezifiziert werden. Die ASCIIZ-Strings, die die Druckereinheiten spezifizieren,
sind mit einem Nullbyte abzuschließen. Der ASCIIZ-String mit der Zieleinheit muß ein
Paßwort der Länge 1 bis 8 Zeichen enthalten.
Laufwerk (BL = 04)
Mit BL = 04 wird ein Laufwerk innerhalb des Netzwerkes umdirigiert. Im Quellstring ist
der Laufwerksname, gefolgt von einem Doppelpunkt und einem Nullbyte, abzulegen. Der
ASCIIZ-String mit der Zieleinheit enthält einen Zugriffspfad zum Netzwerk und endet mit
einem Nullbyte. Im Register CX läßt sich (wie bei BL = 03) ein anwenderspezifischer Code
angeben. Wird ein Leerstring als Name des Quellaufwerkes angegeben, bleibt die Umleitung wirkungslos. Bei gültigen Laufwerksnamen werden alle Ein-/Ausgaben zum Netzwerk umgeleitet.
Tritt während des Aufrufes ein Fehler auf, wird das Carry-Flag gesetzt. Im Register AX
findet sich ein Fehlercode:
Code ° Fehler
------é-----------------------------------------------1
° Falscher Funktionscode (BL nicht 1 .. 4), oder
° die Netzwerksoftware ist nicht geladen
3
° Zugriffspfad nicht vorhanden
5
° Zugriff abgewiesen
8
° Nicht genügend Speicher vorhanden
Die erweiterten DOS-Fehlercodes lassen sich mittels der Funktion 59H abfragen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
319
4.101 Cancel Redirection (Funktion 5FH, Code 04H, DOS 3.1
- 6.x)
Mit dem Aufruf 5F04H läßt sich eine Zuordnung innerhalb des Netzwerkes rückgängig
machen. Dies bezieht sich sowohl auf die Zuordnung einzelner Inhaltsverzeichnisse im
Netzwerk, als auch auf die Zuordnung der Netzwerkdrucker. Es gelten folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5FH
°
° AL:
04H
°
° DS:SI Zeiger auf einen Puffer °
°
mit den Einheitennamen
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
Û---------------------------------ì
Im Register AL wird mit dem Subcode 04H belegt, während das Registerpaar DS:SI auf
einen ASCIIZ-String mit dem Einheitennamen (max. 128 Byte) zeigt. Handelt es sich bei
der Einheit um ein Laufwerk, nimmt DOS die Umleitung zurück und setzt sie auf die
physikalische Einheit um. Druckerumleitungen werden ebenfalls vom Netzwerk auf den
lokalen Druckerausgang zurückgeschaltet.
Der Versuch, eine Umleitung zurückzunehmen, während die Druckerausgabe noch läuft,
oder falls der Zugriff auf den Netzwerkknoten abgeschaltet ist, wird abgewiesen.
Im Fehlerfall wird das Carry-Flag gesetzt und im Register AX findet sich ein Fehlercode:
Code ° Fehler
------é--------------------------------1
° Falscher Funktionscode
15
° Umleitung zur Zeit unterbrochen
Die erweiterten DOS-Fehlercodes lassen sich über die Funktion 59H abfragen.
4.102 Get Redirection List Extended Entry (Funktion 5FH,
Code 05H, DOS 4.x - 6.x)
Mit dem Aufruf 5F05H läßt sich die Liste mit den erweiterten Einträgen abfragen. Diese
Funktion ist erst ab MS-DOS 4.X in Zusammenarbeit mit dem Microsoft Netzwerk
definiert. Es gelten folgende Übergabeparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
320
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5FH
°
° AL:
05H
°
° BX:
Redirection List Entry
°
° DS:SI Zeiger auf Quell-Puffer °
° ES:DI Zeiger auf Ziel-Puffer
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° BH:
Device Status Flag
°
° BL:
Device Typ
°
° CX:
Parameter Wert
°
° BP:
NetBIOS Session Nummer
°
Û---------------------------------ì
Im Register AL wird mit dem Subcode 05H belegt, während das Registerpaar DS:SI auf
einen ASCIIZ-String mit dem Namen der Quelleinheit zeigt. In ES:DI ist ein Zeiger auf
den Puffer einzurichten, der den ASCIIZ-String mit dem Netzwerkpfad aufnimmt.
Nach einem fehlerfreien Aufruf (Carry-Flag gelöscht), findet sich im Register BH das
Geräte-Statusflag mit folgender Kodierung:
BH Bit 0: 0 das Gerät (Device) ist gültig
In BL steht dann der Type des Gerätes:
BL : 03H Printer
04H Disklaufwerk
CX enthält den gespeicherten Parameterwert (user data). In BP steht die lokale NetBIOS
Sessionsnummer.
Im Fehlerfall wird das Carry-Flag gesetzt und im Register AX findet sich ein Fehlercode
gemäß der Kodierung der Funktion 59H.
4.103 Enable Drive (Funktion 5FH, Code 07H, DOS 6.x)
Mit dem undokumentierten Aufruf 5F06H läßt sich in DOS 5.0 ein Laufwerk freigeben. Es
gelten folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5FH
°
° AL:
07H
°
° DL:
Laufwerk (0=A:, etc.)
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
Û---------------------------------ì
Im Register AL wird mit dem Subcode 06H belegt, während das Register DL den
Laufwerkscode aufnimmt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
321
Tritt beim Aufruf ein Fehler auf, wird bei der Rückkehr das Carry-Flag gesetzt. In AX
findet sich dann ein Fehlercode, dessen Bedeutung der Nomenklatur der Funktion 59H
entspricht.
4.104 Disable Drive (Funktion 5FH, Code 08H, DOS 6.x)
Mit dem undokumentierten Aufruf 5F06H läßt sich ab DOS 5.0 ein Laufwerk sperren. Es
gelten folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
5FH
°
° AL:
08H
°
° DL:
Laufwerk (0=A:, etc.)
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
Û---------------------------------ì
Im Register AL wird mit dem Subcode 08H belegt, während das Register DL den
Laufwerkscode aufnimmt. Bei erfolgreichem Aufruf ist dann das Laufwerk für Zugriffe
gesperrt.
Tritt beim Aufruf ein Fehler auf, wird bei der Rückkehr das Carry-Flag gesetzt. In AX
findet sich dann ein Fehlercode, dessen Bedeutung der Nomenklatur der Funktion 59H
entspricht.
Die restlichen Subcodes der Funktion 5F sind von Netzwerktreibern anderer Hersteller
(z.B. Starlite) oder Microsofts LAN-Manager belegt. Die Kodierung wird hier jedoch
weggelassen, da sie nicht genau bekannt ist.
4.105 Expand Filename (Funktion 60H, DOS 3.0 - 6.x,
undokumentiert)
Der Aufruf 60H gehört ebenfalls zu den undokumentierten MS-DOS-Funktionen. Er dient
dazu, zu einer Datei den vollständigen Pfadnamen (kanonischer Filename) zu ermitteln. Es
gelten folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
60H
°
° DS:SI ASCIIZ - Filename
°
° ES:DI Adresse Ergebnispuffer
°
û---------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AX:
Fehlercode
°
Û---------------------------------ì
Im Register DS:SI wird die Anfangsadresse des ASCIIZ-Strings mit dem unvollständigen
Dateinamen übergeben. Weiterhin ist ein zweiter Puffer mit mindestens 128-Byte-Länge zu
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
322
reservieren. Die Funktion ermittelt den vollständigen Pfadnamen, einschließlich Laufwerks
und Filename und gibt das Ergebnis als ASCIIZ-String im Puffer zurück. Dabei werden
auch Umleitungen mit JOIN, SUBST oder APPEND oder Netzwerktreiber berücksichtigt.
Die Funktion ist immer dann hilfreich, wenn ein Dateiname nur unvollständig vorliegt. Der
angegebene Pfad im Filenamen muß nicht unbedingt vorhanden sein. Die Funktion
konvertiert alle Zeichen in Großbuchstaben, alle »/«Zeichen werden in Backslash (
umgesetzt. Wird ein »*.Fehler! Verweisquelle konnte nicht gefunden werden...Fehler!
Verweisquelle konnte nicht gefunden werden.D:Fehler! Verweisquelle konnte nicht
gefunden werden.\\Fehler! Verweisquelle konnte nicht gefunden werden.In DOS 3.3
bis 6.0 wird der Name eines Gerätes in einer besonderen Notation zurückgegeben, falls der
Name nicht implizit ein Unterverzeichnis oder die Angabe /DEV enthält. Der
zurückgegebene String enthält den unveränderten Gerätenamen, dem die Extension
»x:/Fehler! Verweisquelle konnte nicht gefunden werden.xDer Aufruf zerstört den
Inhalt des AL-Registers. Der Ausgabepuffer enthält dann den Filenamen in der Form:
D:\PFAD\FILE.EXT
oder
\\MASCHINE\PFAD\FILE.EXT
Tritt ein Fehler beim Aufruf auf, wird das Carry-Flag gesetzt. In AX findet sich dann ein
Fehlercode:
Code │ Fehler
──────┼──────────────────────────────────
02H │ ungültige Angabe im Verzeichnispfad oder
│ Laufwerksbuchstaben
03H │ falsch aufgebaute Pfad- oder
│ Laufwerksangabe
Die Funktion 61H ist für MS-DOS reserviert aber nicht implementiert.
4.106 Get Program Segment Prefix Address
(Funkt. 62H, DOS 3.0 - 6.x)
Ab DOS 3.0 existiert neben dem internen Funktionsaufruf (51H) die offizielle Funktion
62H zur Ermittlung der Adresse des Program Segment Prefix (PSP). In DOS 5.0 wurde
dann die Funktion 51H offiziell dokumentiert, während die Funktion 62H ab DOS 5.0 als
undokumentiert gilt. Es gelten folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 62H
°
û---------------------------------À
°
RETURN
°
° BX: Segmentadresse der
°
aktiven Prozesses
°
Û---------------------------------ì
°
Die Funktion gibt im Register BX die Segmentadresse des aktuellen PSP zurück. Der
Offsetwert ist implizit 0, während der Codebereich des laufenden Prozesses ab Offset 100H
beginnt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
323
Die Funktion benutzt ab DOS 3.0 keine internen Stacks und ist damit reentrant. Ab DOS
5.0 sollte allerdings die Funktion 51H benutzt werden.
4.107 DCBS-Support (Funktion 63H, undokumentiert)
Diese Funktion ist nicht dokumentiert und wird von verschiedenen DOS-Versionen benutzt,
um Kanji-Zeichen zu bearbeiten.
4.107.1 Get Lead Byte Table (AL = 00H)
Mit diesem Aufruf liest die asisatische Version von DOS 2.25 das »Lead Byte Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 63H (DBCS)
°
° AL: 00H (Get DBCS Table)
°
û---------------------------------À
°
RETURN
°
° AL=00: ok
°
° DS:SI Bufferadresse
°
° AL=FF: nicht unterstützt
°
Û---------------------------------ì
Die Adresse der Tabelle wird nach dem Aufruf in DS:SI zurückgegeben. Bei DOS 2.25
finden sich hier die »Lead BytesFehler! Verweisquelle konnte nicht gefunden
werden.Offset Bytes Bedeutung
00H
2
low/high ends des »Leading Byte«
Bereichs des betreffenden Zeichens
02H
2
low/high ends des »Leading Byte«
Bereichs des betreffenden Zeichens
....
xxH
2
Ende Flag (ist immer 0000H)
Mit den DBCS-Zeichen werden zum Beispiel Kanji-Zeichen ausgegeben. Die Tabelle
enthält dabei die Konstruktionsvorschriften für diese komplexen Zeichen. Die Generierung
der Zeichen erfolgt durch eigene Routinen, die aktiv werden, sobald ein Startzeichen
(interim character) erkannt wird.
Falls die Funktion nicht unterstützt wird, enthält das Register AL nach dem Aufruf den
Wert FFH. Bei erfolgreichem Aufruf ist AL = 00 ab DOS 3.2. In DOS 2.25 wird ein
Fehlerstatus wie bei den anderen DOS-Funktionen über das Carry-Flag zurückgegeben.
Hier findet sich bei gesetztem Carry-Flag ein Fehlercode in AX. Die Kodierung entspricht
der Belegung in der Funktion 59H.
4.107.2 Set/Clear Interim Console Flag (AL = 01H)
Diese Funktion ist ebenfalls nur in verschiedenen asiatischen DOS-Versionen
implementiert. Sie unterstützt die Eingabe von koreanischen Hongeul Zeichen. Es gilt
folgende Aufrufschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
324
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 63H (DBCS)
°
° AL: 01H (Set/Clear Flag)
°
° DL: 00 Set Flag
°
°
01 Clear Flag
°
û---------------------------------À
°
RETURN
°
° AL: 00 ok
°
° AL: FF ungültiger Mode
°
Û---------------------------------ì
Mit diesem Aufruf setzen oder löschen die asiatischen Versionen von DOS 2.25 und ab
DOS 3.2 das Interim-Zeichen-Flag. Diese Eigenschaft wird zum Beispiel benötigt, um
koreanische Zeichen des Hongeul Alphabeths einzulesen.
Der Wert in DL bestimmt, ob das Flag gesetzt oder gelöscht wird.
DL = 0:
1:
nur komplette Zeichen zurückgeben
einzelne Bytes eines Zeichens
zurückgeben
Die Belegung ist für alle asiatischen DOS-Versionen gleich. Auch die Fehlercodes werden
nicht über das Carry-Flag zurückgegeben, sondern AL wird zur Statusanzeige genutzt.
Der Aufruf zerstört alle Register bis auf SS:SP.
4.107.3 Get Interim Console Flag (AL = 02H)
Auch dieser Aufruf ist nur in asiatischen Versionen des Betriebssystems implementiert.
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 63H (DBCS)
°
° AL: 02H (Get Interim Flag)
°
û---------------------------------À
°
RETURN
°
° AL: FF Fehler
°
° AL: 00 ok
°
° DL: Flag
°
Û---------------------------------ì
Mit diesem Aufruf liest DOS 2.25 und ab DOS 3.2 das Interim-Zeichen-Flag. Nach einem
Aufruf findet sich in DL der Zustand des Flags, falls der Inhalt von AL auf 00 gesetzt war.
Bei AL = FFH wird die Funktion nicht unterstützt. Für DL gilt folgende Belegung:
DL = 0:
1:
nur komplette Zeichen zurückgeben
einzelne Bytes eines Zeichens
zurückgeben
Der Aufruf zerstört alle Register bis auf SS:SP.
4.108 Set Device Driver Lookahead Flag (Funktion 64H,
DOS 3.2 - 6.x)
Diese Funktion wird ab DOS 3.2 intern von DOS benutzt. Es gelten folgende
Aufrufparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
325
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
64H
°
° AL:
Flag
°
û---------------------------------À
°
RETURN
°
° ---°
Û---------------------------------ì
Die Funktion definiert ob ein Einheitentreiber vor dem Aufruf der INT 21-Funktionen 01H,
08H und 0AH mit der Treiberfunktion 05 (non destructive read) aufgerufen wird. Die
Einstellung erfolgt über den Wert in AL:
AL =
0: Aufruf der Treiberfunktion 05 vor den
INT 21-Funktionsaufrufen 01H, 08H und
0AH.
<>0: kein Aufruf der Treiberfunktion 5
Die Funktion benutzt keinen der internen DOS-Stacks, ist also reentrant. Die Funktion wird
ab DOS 3.3 durch PRINT.COM aufgerufen.
4.109 Get Extended Country Information (Funktion 65H,
DOS 3.3 - 6.x)
In DOS 3.3 lassen sich mit dieser Funktion die erweiterten Landesinformationen abrufen.
Es gelten folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
65H
°
° AL:
Subcode (1,2,4,5,6,7)
°
° BX:
Code Page Flag
°
° DX:
Landeskennzahl
°
° CX:
Zahl der zu lesenden
°
°
Daten
°
° ES:DI Vektor auf einen Puffer °
°
für die Daten
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° ES:DI Datenpuffer mit den
°
°
Informationen
°
Û---------------------------------ì
Die Funktion erlaubt es, verschiedene Parametersets zu lesen. Die Selektion dieser Sets
erfolgt über das Register AL. Im Register DX wird die Landeskennzahl angegeben, auf die
sich der Aufruf bezieht. Diese Kennzahlen wurden bereits bei der Funktion 38H besprochen. Der Wert -1 spezifiziert den gerade eingestellten Landescode.
Das Register BX spezifiziert den Code für den gewünschten Zeichenfont (Code Page). Ein
Wert = -1 bezieht die Anfrage auf den globalen Zeichenfont (der CON-Einheit).
Die Daten werden in einem Puffer zurückgegeben. Dieser Bereich ist vom rufenden Prozeß
einzurichten. Der Wert im Registerpaar ES:DI spezifiziert einen Adreßvektor auf den
Pufferanfang.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
326
Das Register CX enthält einen Wert, der die Zahl der zurückgelesenen Bytes angibt. Es
sind mindestens 5 Byte zu lesen.
Landesinformationen (AL = 01H)
Wird der Wert 01 im Register AL übergeben, liest die Funktion bestimmte Informationen
über landesspezifische Formate. Die nachfolgende Tabelle gibt die Belegung des Ergebnisbuffers (ES:DI) wieder.
Ö-------Ú----------------------------------------------Ì
° Bytes ° Landesinformation
°
û-------é----------------------------------------------À
° 1
° Identifikationscode Funktion = 01H
°
û-------é----------------------------------------------À
° 2
° Pufferlänge
°
û-------é----------------------------------------------À
° 2
° Landesidentifikationscode
°
û-------é----------------------------------------------À
° 2
° Code Page
°
û-------é----------------------------------------------À
° 2
° Datumsformat
°
û-------é----------------------------------------------À
° 5
° Währungssymbol
°
û-------é----------------------------------------------À
° 2
° Tausenderseparator
°
û-------é----------------------------------------------À
° 2
° Dezimalzeichen
°
û-------é----------------------------------------------À
° 2
° Datumsseparator
°
û-------é----------------------------------------------À
° 2
° Zeitseparator
°
û-------é----------------------------------------------À
° 1
° Währungsformatflag
°
û-------é----------------------------------------------À
° 1
° Nachkommastellen im Währungsformat
°
û-------é----------------------------------------------À
° 1
° Zeitformat
°
û-------é----------------------------------------------À
° 4
° Einsprungadresse »Mono CaseFehler! Verweisquelle konnte nicht gefunden
werden.û-------é----------------------------------------------À
° 2
° Separator der Datenliste
°
û-------é----------------------------------------------À
° 10
° Nullbytes (00H)
°
Û-------Ù----------------------------------------------ì
Tabelle 4.34: Landesinformationen bei der Funktion 65H (Ende)
Die Bedeutung dieser Datenstruktur (z.B. Währungssymbol) wurde bereits im Rahmen der
Funktion 38H besprochen.
Codierungstabelle Großbuchstaben (AL = 02H)
Auf der Benutzerebene lassen sich Datei- und Einheitennamen sowohl in Klein- als auch in
Großbuchstaben eingeben. Zur Umsetzung von Klein- auf Großbuchstaben bietet DOS 3.3
eine Umsetztabelle. Die Adresse dieser Tabelle läßt sich mittels AL = 02H ermitteln.
Ö-------Ú----------------------------------------------Ì
° Bytes ° Landesinformation
°
û-------é----------------------------------------------À
° 1
° Identifikationscode Funktion = 02H
°
û-------é----------------------------------------------À
° 4
° Adreßvektor der Tabelle
°
Û-------Ù----------------------------------------------ì
Tabelle 4.35: Kodierungstabelle Großbuchstaben bei der Funktion 65H
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
327
Die 5 Byte werden in den durch das Registerpaar ES:DI adressierten Puffer zurückgegeben. Das erste Byte enthält den im Register AL übergebenen Subcode. Der nachfolgende
Adreßvektor zeigt auf die Tabelle mit den Großbuchstaben. Im ersten Wort der Tabelle
steht deren Länge in Byte. Daran schließen sich 128-ASCII-Zeichen an. Insgesamt umfaßt
die Tabelle somit 130 Byte.
Kodierungstabelle Filenamen (AL = 04H)
Ähnlich der Umsetztabelle für Großbuchstaben existiert eine zweite Tabelle für die Umsetzung von Dateinamen in Großbuchstaben. Sie läßt sich mittels der Unterfunktion AL =
04H abfragen. Im Register ES:DI findet sich die Pufferadresse, in dem die Daten abgelegt
wurden.
Ö-------Ú----------------------------------------------Ì
° Bytes ° Landesinformation
°
û-------é----------------------------------------------À
° 1 ° Identifikationscode Funktion = 04H
°
û-------é----------------------------------------------À
° 4 ° Adreßvektor der Tabelle
°
Û-------Ù----------------------------------------------ì
Tabelle 4.36: Kodierungstabelle Filenamen bei der Funktion 65H
Der Puffer enthält wieder den Identifikationscode sowie den Adreßvektor auf die
Umkodierungstabelle. Im ersten Wort der Tabelle steht wieder deren Länge in Byte. Diese
ist auf 128 Byte begrenzt, so daß die Datenstruktur ebenfalls 130 Byte belegt.
Kodierungstabelle Filename-Terminator (AL = 05)
Diese Funktion wurde ab DOS 5.0 dokumentiert, ist aber in den früheren Versionen ab 3.3
undokumentiert. Die Funktion gibt die gleichen Informationen für alle Länder und
Codepageeinstellungen zurück.
In ES:DI findet sich die Pufferadresse, in dem die Daten abgelegt wurden.
Ö-------Ú----------------------------------------------Ì
° Bytes ° Landesinformation
°
û-------é----------------------------------------------À
° 1 ° Wert 05H als Markierung für die ausgeführte °
°
° Funktion
°
û-------é----------------------------------------------À
° 4 ° Adreßvektor der Tabelle mit unzulässigen °
°
° Zeichen
°
Û-------Ù----------------------------------------------ì
Tabelle 4.37: Kodierungstabelle unerlaubte Zeichen im Filenamen bei der Funktion 6505H
Die Tabelle besitzt folgenden Aufbau:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
328
Ö-------Ú----------------------------------------------Ì
° Bytes ° Bedeutung
°
û-------é----------------------------------------------À
° 2 ° Länge
°
û-------é----------------------------------------------À
° 1 ° --°
û-------é----------------------------------------------À
° 1 ° niedrigster Zeichencode Filename
°
û-------é----------------------------------------------À
° 1 ° höchster Zeichencode Filename
°
û-------é----------------------------------------------À
° 1 ° --°
û-------é----------------------------------------------À
° 1 ° erstes ungültiges Zeichen
°
û-------é----------------------------------------------À
° 1 ° letztes ungültiges Zeichen
°
û-------é----------------------------------------------À
° 1 ° --°
û-------é----------------------------------------------À
° 1 ° Zahl der Terminatorzeichen
°
û-------é----------------------------------------------À
° n ° Tabelle mit Zeichen für Ende Filenamen
°
°
°
° . " / [ ] : | < > + = ....
Û-------Ù----------------------------------------------ì
Bei fehlerfreiem Aufruf ist das Carry-Flag gelöscht und der Puffer enthält wieder den
Identifikationscode sowie den Adreßvektor auf die Tabelle. Im ersten Wort der Tabelle
steht wieder deren Länge in Byte. Daran schließen sich die Bytes mit den unerlaubten
Zeichen im Filenamen an (z.B. /, [, ], etc.). Bei einem Fehler ist nach dem Aufruf das
Carry-Flag gesetzt. AX enthält dann einen Fehlercode:
AX = 01: ungültige Funktion
02: Datei nicht gefunden
Um die Funktion anzuwenden muß vorher das Programm NLSFUNC unter Angabe des
vollständigen Namens der Datei COUNTRY.SYS geladen werden.
Collate Size (AL = 06H)
Mittels des Subcodes AL = 06H läßt sich die Adresse der »Collate SequenzTritt während
des Funktionsaufrufes ein Fehler auf, wird das Carry-Flag gesetzt und im Register AX
findet sich der Fehlercode.
Code
°
Fehlerart
-------é------------------------------------------------------------1
°
Der
Wert
von
CX
ist
kleiner
als
5
2 ° Die Werte für den Landescode oder »Code PageFehler! Verweisquelle konnte nicht gefunden werden.In
diesem Fall werden keine gültigen Daten zurückgegeben.
DBCS-Vektor (AL = 07H)
Ab DOS 4.0 ist bei der Funktion 65H eine weitere Unterfunktion hinzugekommen. Mit
dem Wert AL = 07H wird die Adresse der DBCS-Tabelle abgerufen. Diese besitzt eine
variable Länge und weist folgende Struktur auf:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
329
Ö-------Ú---------------------------------------Ì
° Bytes ° Bedeutung
°
û-------é---------------------------------------À
° 2 ° Tabellenlänge in Worten
°
û-------é---------------------------------------À
° 1 ° DBCS Vektor 1
°
û-------é---------------------------------------À
° 1 ° DBCS Vektor 2
°
û-------é---------------------------------------À
° 1 ° ...
°
û-------é---------------------------------------À
° 1 ° DBCS Vektor n
°
û-------é---------------------------------------À
° 2 ° Endemarkierung 0,0
°
Û-------Ù---------------------------------------ì
Die Bedeutung dieser Tabelle ist mir allerdings nicht ganz klar.
Country dependent Character Capitalization (AL = 20H, 21H, 22H)
Ab DOS 4.0 sind bei der Funktion 65H weitere undokumentierte Unterfunktionen
hinzugekommen, die ab DOS 5.0 dokumentiert wurden. Die Funktionen besitzen folgende
Belegung:
Convert Character (Funktion 6520H)
Die Funktion wandelt ein Zeichen unter Zuhilfenahme einer Tabelle in einen
Großbuchstaben um. Es gelten folgende Registerbelegungen:
Ö---------------------------------Ì
°
°
°
CALL: INT 21
°
°
°
° AH:
65H
°
° AL:
20H (Convert Character) °
° DL:
Zeichen
°
û---------------------------------À
°
°
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° DL:
Zeichen
°
Û---------------------------------ì
Mit Hilfe der Funktion lassen sich landesspezifische Zeichen wie Umlaute in
Großbuchstaben wandeln. Bei fehlerhafter Ausführung wird das Carry-Flag gesetzt. In AX
findet sich dann der Fehlercode:
AX = 01: Funktion nicht unterstützt.
Dann ist der zurückgegebene Wert in DL ungültig.
Convert String (Funktion 6521H)
Die Funktion wandelt einen String unter Zuhilfenahme einer Tabelle in Großbuchstaben
um. Es gelten folgende Registerbelegungen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
330
Ö---------------------------------Ì
°
°
°
CALL: INT 21
°
°
°
° AH:
65H
°
° AL:
21H (Convert Character) °
° DS:DX Adresse String
°
° CX
Länge String
°
û---------------------------------À
°
°
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° DS:DX Adresse String
°
Û---------------------------------ì
Mit Hilfe der Funktion lassen sich landesspezifische Zeichen wie Umlaute in Stringketten
in Großbuchstaben wandeln. Die Länge des Strings ist in CX zu übergeben. Bei fehlerhafter Ausführung wird das Carry-Flag gesetzt. In AX findet sich dann der Fehlercode:
AX = 01: Funktion nicht unterstützt.
Dann wurde der String nicht konvertiert. Andernfalls wurde der String im Puffer
konvertiert.
Convert ASCIIZ-String (Funktion 6522H)
Die Funktion wandelt einen ASCIIZ-String unter Zuhilfenahme einer Tabelle in
Großbuchstaben um. Es gelten folgende Registerbelegungen:
Ö---------------------------------Ì
°
°
°
CALL: INT 21
°
°
°
° AH:
65H
°
° AL:
22H (Convert Character) °
° DS:DX Adresse String
°
û---------------------------------À
°
°
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° DS:DX Adresse String
°
Û---------------------------------ì
Mit Hilfe der Funktion lassen sich landesspezifische Zeichen wie Umlaute in Stringketten
in Großbuchstaben wandeln. Im Gegensatz zur Funktion 21H muß der String mit einem
Nullbyte (00H) abgeschlossen sein. Dadurch kann die Angabe der Länge entfallen.
Dateinamen werden häufig als ASCIIZ-String gespeichert und lassen sich so leicht in
Großbuchstaben konvertieren.
Bei fehlerhafter Ausführung wird das Carry-Flag gesetzt. In AX findet sich dann der
Fehlercode:
AX = 01: Funktion nicht unterstützt.
Dann wurde der String nicht konvertiert. Die Funktion wird nur intern durch DOS genutzt.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
331
YES/NO Character Check (Funktion 6523H)
Die Funktion ist erst ab DOS 4.0 vorhanden und wurde bisher nicht dokumentiert. Sie prüft
ob ein eingegebenes Zeichen einer Ja/Nein-Abfrage gültig ist. Diese Zeichen können
landesspezifisch verschieden sein (z.B. Y(ES)/N(O), J(A)/NEIN), O(UI)/N(ON), etc.). Es
gelten folgende Registerbelegungen:
Ö---------------------------------Ì
°
°
°
CALL: INT 21
°
°
°
° AH:
65H
°
° AL:
23H (Check Character)
°
° DX
Zeichen
°
û---------------------------------À
°
°
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° AX:
Typ
°
Û---------------------------------ì
In DX wird das zu untersuchende Zeichen übergeben. Bei 1-Byte-Zeichen (z.B: J/N)
befindet sich das Zeichen in DL und DH ist 00H zu setzen. Bei DBCS-Zeichen befindet
sich im Register DH das zweite DCBS-Zeichen, sofern vorhanden.
Bei fehlerhafter Ausführung wird das Carry-Flag gesetzt. In AX findet sich dann der
Fehlercode:
AX = 01: Funktion nicht unterstützt.
Dann wurde der String nicht konvertiert. Andernfalls wird im Register AX der Status des
Tests zurückgegeben:
AX = 00H: Eingabe entspricht YES
01H: Eingabe entspricht NO
02H. Eingabe weder YES noch NO
Damit kann ein Programm unabhängig von der Landessprache Ja/Nein-Abfragen
formulieren.
Convert Country Dependent Filenames (Funktionen AX = 65A0H,
65A1H, 65A2H)
Die Funktionen sind erst ab DOS 4.0 vorhanden und wurden bisher nicht dokumentiert. Sie
wandeln Filenamen in Großbuchstaben um. Es gilt die gleiche Aufrufschnittstelle wie bei
den Funktionen AX=6520H bis 6522H. Der Aufruf funktioniert aber wegen eines Bugs in
den DOS-Versionen 4.0 bis 5.0 nicht.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
332
4.110 Get Global Code Page (Funktion 6601H, DOS 3.3 - 6.x)
Ab DOS 3.3 läßt sich mit dieser Funktion die »Code
PageÖ---------------------------------Ì
°
°
°
CALL: INT 21
°
°
°
° AH:
66H
°
° AL:
01H (Get Code Page)
°
û---------------------------------À
°
°
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° BX:
Aktive Code Page
°
° DX:
System Code Page
°
°
°
Û---------------------------------ì
Mit dem Wert 01H im Register AL wird die gerade aktive
»Code Page«Einstellung abgefragt. Im Feh_lerfall ist
nach dem Aufruf das Carry-Flag gesetzt. Nur falls das
Carry-Flag gelöscht ist, finden sich in den Registern BX
und DX Informationen über die Ein_stel_lung.»Das
Register BX enthält den Wert des aktuell eingestellten
»Code Page«Sets, während in DX der »Code PageCode
PageFehler! Verweisquelle konnte nicht gefunden
werden.4.111 Set Global Code Page (Funktion 6602H,
DOS 3.3 - 6.x)
Mit diesem Aufruf läßt sich die aktive Code Page Seite setzen. Es gilt folgende
Aufrufschnittstelle.
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH:
66H
°
° AL:
02H (Set Code Page)
°
° BX:
Aktive Code Page
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° BX:
Aktive Code Page
°
° DX:
System Code Page
°
Û---------------------------------ì
Ab DOS 3.3 läßt sich mit dieser Funktion die »Code Page«Ein_stel_lung des aktuellen
Landes verändern. Es gelten nebenstehende Über_gabe_parameter.»Mit dem Wert 02H im
Register AL wird der global gültige »Code PageFehler! Verweisquelle konnte nicht
gefunden werden.Code PageFehler! Verweisquelle konnte nicht gefunden
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
333
werden.Code PageFehler! Verweisquelle konnte nicht gefunden werden.Der Wert in
BX bestimmt dabei die gewünschte Code Page Seite. Hierbei gilt folgende Kodierung:
Code
437
850
852
860
861
863
865
Bedeutung
US
Multilingual
slavische Sprachen
Portugal
Island
Kanada (französischer Teil)
Norwegen / Dänemark
Falls eine Einheit nicht umgeschaltet werden kann, wird das Carry-Flag gesetzt und im
Register AX findet sich ein Fehlercode:
Code ° Fehlerart
------é-----------------------------------------------------02 ° »Code PageFehler! Verweisquelle konnte nicht gefunden werden. 65
Einheit kann nicht auf neuen »Code PageFehler! Verweisquelle konnte nicht
gefunden werden.
° werden
°
Der »Code PageFehler! Verweisquelle konnte nicht gefunden
werden.Code Page«Datei durch DOS ladbar sein.
An_dern__falls erfolgt eine Fehlermeldung (02H).»Um
die »Code Page«Einstellung der aktuellen
Landeseinstellung zu verändern, besteht nur der Weg,
die Einträge in CONFIG.SYS zu än_dern und das System
neu zu starten.»Um diesen Funktionsaufruf zu nutzen,
muß das Programm NLSFUNC vorher von der
Kommandoebene aus gestartet worden sein. Weiterhin
müssen die Einheiten in der Lage sein, verschiedene
»Code PagesFehler! Verweisquelle konnte nicht gefunden
werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
334
4.112Set Handle Count (Funktion 67H, DOS 3.3 - 6.x)
Ab DOS 3.3 lassen sich mehr als 20 offene Dateien pro Prozeß verwalten. Mit dieser
Funktion kann die Einstellung der maximal gleichzeitig zu öffnenden Dateien verändert
werden (max. 65 534). Es gelten folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 21
°
° AH:
67H
°
° BX:
Zahl der offenen Handles °
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
Û---------------------------------ì
Im Register BX wird die Größe der Handletabelle angegeben. Falls dieser Wert kleiner als
die Zahl der eröffneten Handles ist, wird der neue Wert erst dann eingestellt, wenn die Zahl
der geöffneten Handles unter die spezifizierte Grenze gesunken ist. Ein Wert kleiner als 20
wird nicht angenommen, sondern es werden immer 20 geöffnete Handles vorgesehen.
Im File CONFIG.SYS läßt sich die Zahl der geöffneten Handles nur zwischen 20 und 255
einstellen, obwohl die Funktion 67H insgesamt bis zu 64 Kbyte für die Handles reserviert.
Falls die Handletabelle größer als 20 ist, gibt DOS 3.3 die reservierten Speicherbereiche für
die Handletabellen nicht wieder frei. Dies kann bei mehrfachem Aufruf zu einer
Fragmentierung des Speichers führen. Weiterhin werden bei DOS 3.3 nur die ersten 20
Handles an einen Tochterprozess vererbt. In DOS 3.3 wurde auf Grund eines Bugs die
Handletabelle mit 64 Kbyte reserviert, sofern die Zahl der benötigten Handles gerade war.
Da DOS die Handletabelle außerhalb des PSP anlegt (sofern mehr als 20 Handles gefordert
werden), muß der rufende Prozeß sicherstellen, daß freier Speicher hierfür vorhanden ist.
Die Funktion prüft nicht, ob DOS genügend Einträge in der internen System-File-Table
(SFT) besitzt um die reservierten Handles auch zu verwalten. Ist die SFT zu klein, wird
beim Öffnen der n.-ten Einheit eine Fehlermeldung ausgelöst. Gegebenenfalls muß die SFT
mit dem Eintrag FILES=xx in CONFIG.SYS vergrößert werden.
4.113 Commit File (Funktion 68H, DOS 3.3 - 6.x)
Mit dieser Funktion läßt sich ab DOS 3.3 erzwingen, daß alle Zwischenpuffer mit Daten
auf die jeweiligen Dateien geschrieben werden. Es gelten folgende Übergabeparameter.
Ö---------------------------------Ì
°
CALL: INT 21
°
° AH:
68H
°
° BX:
Handle
°
û---------------------------------À
°
RETURN
°
° Carry: gesetzt -> Fehler
°
° AX:
Fehlercode
°
° Carry: gelöscht -> ok
°
° BX:
File Handle
°
Û---------------------------------ì
Mit diesem Aufruf läßt sich eine effizientere Dateiverwaltung, insbesondere bei
Netzwerkapplikationen erreichen. Normalerweise kann nur durch eine Close-Anweisung
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
335
ein Auslagern der Puffer erzwungen werden. Falls die Datei aber weiterhin benötigt wird,
muß anschließend ein Open-Aufruf erfolgen. Dies ist ein sehr zeitintensives Unternehmen.
Mit der Funktion 68H (Commit File) kann das Problem auf elegante Weise umgangen werden, da beim Aufruf die modifizierten Puffer auf das Medium ausgelagert werden, ohne die
Datei zu schließen. Zusätzlich besteht in einer Netzwerkumgebung die Sicherheit, daß die
Datei für den aktiven Prozeß mit allen Zugriffsrechten erhalten bleibt, während dies bei der
Close/Open-Sequenz nicht immer der Fall ist. Erlangt zum Beispiel ein zweiter Prozeß die
Kontrolle über die Datei, nachdem der aktive Prozeß gerade die »Close«Anweisung
aus_geführt hat, dann resultiert der anschließende »Open«Aufruf in einer Fehlermeldung.
Alle Versuche, die Datei zu öffnen, werden so lange zurückgewiesen, bis der zweite Prozeß
die Datei wieder freigibt. Beim Aufruf ist in BX der Handle einer offenen Datei zu
übergeben. Der Fehlerstatus wird im Carry-Flag zur»ckgegeben. Bei einem gelöschten
Carry-Flag wurden alle Daten des Puffers auf das Medium ausgelagert. Bei gesetztem
Carry-Flag findet sich in AX ein Fehlercode, dessen Bedeutung der Funktion 59H
entspricht.
4.114 Get/Set Disk Serial Number (Funktion 69H, DOS 4.0 6.x)
Diese Funktion ist nicht dokumentiert und wird ab DOS 4.0 benutzt. Es gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 69H (Serial Number)
°
° AL: 00H (Get serial number)
°
°
01H (Set serial number)
°
° BL: Drive
°
° DS:DX Adresse Disk Infoblock
°
û---------------------------------À
°
RETURN
°
° CF: 1 Fehler
°
° AX: Fehlercode
°
° CF: 0 ok
°
° AX: Status
°
Û---------------------------------ì
Mit diesem Aufruf schreibt oder liest DOS eine zufällige Disketten-Seriennummer. Damit
wird ein Diskettenwechsel zuverlässiger erkannt. Der Code in AL bestimmt, ob die
Nummer gelesen (AL = 0) oder geschrieben (AL = 1) werden soll. In BL ist das Laufwerk
(0 = default, 1 = A, etc.) zu übergeben. In DS:DX ist die Adresse eines Datenblocks mit
folgendem Aufbau zu setzen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
336
Ö-------Ú-------Ú-----------------------------------Ì
° Offs. ° Bytes ° Bedeutung
°
û-------é-------é-----------------------------------À
° 0H ° 2 ° Info Level (0000)
°
û-------é-------é-----------------------------------À
° 2H ° 4 ° Serien-Nummer (binär)
°
° 6H ° 11 ° Volume Label
°
° 11H ° 8 ° FAT-Typ String
°
Û-------Ù-------Ù-----------------------------------ì
Die 11 Byte des Volume Labels enthalten normalerweise den Text des Disketten Labels. Ist
dieser nicht bekannt, steht im Feld der Text "NO NAME
". Im Feld mit dem FAT-Typ
steht der Text "FAT12 " oder "FAT16 ". Die Funktion gibt den Fehlerstatus über das
Carry-Flag zurück. Bei gesetztem Flag enthält AX den Fehlercode. Es wird kein kritscher
Fehler ausgelöst, falls zum Beispiel kein Medium im Laufwerk vorliegt. Bei gelöschtem
Carry-Flag ist der Inhalt von AX zerstört. In Abhängigkeit vom Wert in AL beim Aufruf
wird der Inhalt des Puffers (DS:DX) entweder vom Medium gelesen oder zum Medium
geschrieben.
Die Funktionen 6AH und 6BH werden ab DOS 4.0 zwar benutzt, ihre Belegung ist aber
nicht bekannt.
4.115 Extended Open/Create (Funktion 6CH, DOS 4.0 - 6.x)
Diese Funktion steht erst ab DOS 4.0 zur Verfügung und bildet eine Kombination der
Funktionen 3CH (Create File with Handle), 3DH (Open File with Handle), 5BH (Create
New File) und 68H (Commit File). Sie sollte bei neuen Porgrammentwicklungen für DOS
4.x und höher verwendet werden, da sie prüft, ob eine Datei bereits existiert. Es gilt
folgende Aufrufschnittstelle:
Ö-------------------------------Ì
°
CALL: INT 21
°
°
°
° AH: 6CH (Extended Open/Create)°
° AL: 00H reserviert
°
° BX:
Open Mode
°
° CX:
Attribut
°
° DX:
Format
°
° DS:SI
Filename (ASCIIZ)
°
û-------------------------------À
°
RETURN
°
° CY: 1 Fehler
°
° AX:
Fehlercode
°
° CY: 0 ok
°
° AX:
Handle
°
° CX:
Statuscode
°
Û-------------------------------ì
Das Register AL ist beim Aufruf immer auf 0 zusetzen. In BX wird ein 16-Bit-Flag mit
dem Open-Mode übergeben. Dieses Flag besitzt folgende Codierung:
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
°0°W°F°0°0°0°0°0°I°0°S°S°S°0°A°A°A°
Û-ÙÚÙÚÙ-Ù-Ù-Ù-Ù-ÙÚÙ-ÙÚÙ-ÙÚÙ-ÙÚÙ-ÙÚì
°°
° Û-Ú-ì Û-Ú-ì Access Code
°°
° °
Û- 0 - Read
°°
° °
1 - Write
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
337
°°
° °
2 - Read/Write
°°
° ° Sharing Mode
°°
° Û---- 0 - Compatibility
°°
°
1 - Deny Read/Write
°°
°
2 - Deny Write
°°
°
3 - Deny Read
°°
°
4 - Deny None
°°
Û- 0 Pass Handle
°°
1 No Inherit
° Û- 0 INT 24
° 1 Return Error
Û- 0 No Commit
1 Auto Commit on Write
Bild 4.8: Kodierung des Open-Mode
Mit dem W-Bit läßt sich festlegen, ob nach jedem Schreibzugriff ein COMMIT (Update
des Directory-Eintrages) erfolgt. Das F-Bit selektiert die Art der Fehlerbehandlung. Ist es
gesetzt, gibt die Funktion die Fehlercodes im Register AX zurück. Der INT 24-CriticalError-Handler ist damit gesperrt. Mit einem F-Bit = 0 fängt der INT 24 kritische Fehler ab.
Im Register CX wird das »Create AttributIn DX läßt sich ein Flag übergeben, welches das
Verhalten von DOS spezifiziert, falls die Datei existiert/nicht existiert. Das Flag besitzt
folgendes Format:
Ö-Ú-Ú-Ú-Ì Ö-Ú-Ú-Ú-Ì
Û-Ù-Ù-Ù-ì Û-Ù-Ù-Ù-ì Datei existiert nicht
Û--Ú--ì Û--Ú--ì 0 -> mit Fehlermeldung abbrechen
°
Û- 1 -> File creieren
° Datei existiert bereits
° 0 -> mit Fehlermeldung abbrechen
Û- 1 -> Datei öffnen
2 -> Replace mit Open File
Bild 4.9: Kodierung des Open-Flags
Die vier unteren Bits spezifizieren die Aktionen von DOS, falls die Datei nicht existiert. Ist
der Wert = 0, bricht die Funktion mit einer Fehlermeldung ab. Beim Wert = 1 wird die
Datei kreiert. Das gleiche Prinzip gilt für die folgenden vier Bit, die für vorhandene
Dateien ausgewertet werden.
Nach dem Aufruf zeigt das Carry-Flag den Fehlerstatus an. Ein gesetztes Flag deutet auf
Fehler hin, deren Code in AX übergeben wird. Bei CY = 0 enthält AX den Handle des
geöffneten Files. Im Register CX gibt die Funktion den Statuscode der Datei zurück. Es gilt
folgende Codierung:
CX = 0 File open
1 File create / open
2 File replace / open
Durch Abfrage des Registerinhaltes läßt sich also feststellen, ob eine Datei neu angelegt
oder geöffnet wurde.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
338
Die restlichen Codes des INT 21 sind in DOS unbenutzt. Es gibt aber eine Reihe von
Programmen, die Subfunktionen des INT 21 abfangen und mit eigenen Funktionen
belegen. So benutzt Novells NetWare die Subfunktionen AX=BxxxH bis FFxxH.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
339
5 Der DOS-Multiplexerinterrupt INT 2F
Dies ist ein intern durch MS-DOS benutzter Interrupt, der in MS-DOS 2.X überhaupt nicht
und in den anderen DOS-Versionen nur teilweise offiziell dokumentiert ist. Der Interrupt
erlaubt die Kommunikation zwischen zwei laufenden Prozessen. In DOS 2.X muß ein
Prozeß vor einer Benutzung prüfen, ob der Vektor bereits initialisiert wurde. Ab DOS 3.0
übernimmt das Betriebssystem die Initialisierung.
Der INT 2F besitzt, ähnlich dem INT 21, einen Funktionsdispatcher, der über den Inhalt
des Registers AH die jeweilige Unterfunktion aufruft. Jeder dieser Unterfunktionen wird
eine eigene Codenummer zugeordnet. Weitere Parameter lassen sich mittels der restlichen
Register übergeben. Leider existieren keine festgelegten Mechanismen zur Vergabe dieser
Codenummern, so daß der Softwareentwickler darauf zu achten hat, daß eine Nummer
nicht durch zwei Applikationen belegt wird. In diesem Fall muß eine der Applikationen mit
einer anderen Codenummer versehen werden. Zur groben Orientierung sei folgende
Tabelle angegeben:
Ö----------Ú-------------------------------------------Ì
° Code
° Bemerkung
°
û----------é-------------------------------------------À
° 00 - 7F ° reserviert für MS-DOS-Zwecke
°
û----------é-------------------------------------------À
° 80 - BF ° reserviert für zukünftige Erweiterungen
°
û----------é-------------------------------------------À
° C0 - FF ° frei für Anwenderprogramme
°
Û----------Ù-------------------------------------------ì
Tabelle 5.1: Zuordnung der Codenummern des INT 2F
Ab DOS 4.0 sind die Codes 00H bis BFH für das Betriebssystem reserviert.
Der dokumentierte Teil des Multiplexerinterrupt 2FH wird zur Zeit im wesentlichen zur
Kommunikation mit DOS-Utilities wie PRINT, SHARE, etc. genutzt.
Falls ein Anwenderprogramm sich in den INT 2FH einhängen möchte, muß es bestimmte
Konventionen beachten.
·
Als erstes ist zu prüfen, ob der INT 2F-Vektor durch das Betriebssystem unterstützt
wird. Dies ist bei allen DOS-Versionen oberhalb 2.X der Fall.
·
Dann ist der Vektor des INT 2F mittels den INT 21-Funktion 35H zu lesen und intern
zu speichern.
·
Nun kann die Adresse des eigenen INT 2F-Handlers in der Vektortabelle eingetragen
werden. Hierzu ist die INT 21-Funktion 25H zu benutzen.
·
Wird ein Programm durch den INT 2F aktiviert, muß es den Wert in AH überprüfen.
Besitzt das Programm den Code, muß es anschließend den Subcode in AL testen.
Stimmt dieser Code mit den vereinbarten Werten überein, ist die Funktion
auszuführen. Der Fehlerstatus ist über das Carry-Flag zurückzugeben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
340
·
Stimmt der Identifikationscode in AH überein und ist AL = 0, dann muß der Handler
entweder den Wert 01H oder FFH in AL an die rufende Routine zurückgeben (siehe
unten). Das Programm sollte mit einem IRET-Befehl (oder RETF 2) terminieren.
·
Falls der Wert in AH nicht mit der Identifikationsnummer des Programmes
übereinstimmt, ist der folgende Treiber aufzurufen. Dessen Adresse muß beim Eintrag
des eigenen Interruptvektors gesichert werden. DOS hat als letzten Treiber einen
eigenen Handler in die Kette eingetragen. Wird dieser Handler erreicht, gibt er den
Wert AL = 00H an den rufenden Prozess zurück.
Get Installationsstatus (AL = 0)
Um zu überprüfen ob ein Prozess unter dem INT 2F installiert ist, ist der betreffende
Identifikationscode in AH zu setzen. Weiterhin muß in AL der Wert 00H eingetragen
werden. Ein Aufruf mit diesen Parametern gilt vereinbarungsgemäß als Überprüfung des
Installationsstatus.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: xxH
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Der zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Treibers.
·
Falls AL = 0 ist, dann ist der residente Teil des Handlers nicht vorhanden und kann
installiert werden.
·
Falls AL = 1 ist, dann ist der residente Teil der Handlers nicht vorhanden, er läßt sich
aber auch nicht installieren.
·
Falls AL = FFH ist, dann ist der residente Teil des Handlers bereits installiert.
Die Funktion AL = 00H (Get Installationsstatus) sollte bei jedem residenten Programm
implementiert werden, welches den Interrupt 2FH nutzt. Denn nur so läßt sich prüfen, ob
der Handler bereits installiert ist.
Nachfolgend werden die einzelnen dokumentierten und undokumentierten Funktionen des
INT 2F vorgestellt.
5.1 PRINT-Time-Slice (AX = 0080H, DOS 3.1 - 6.x)
Dieser undokumentierte Aufruf wird durch PRINT abgefangen. DOS aktiviert die
Subfunktion um PRINT Rechenzeit zuzuteilen. Es gilt folgende Aufrufkonvention:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
341
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 00H (PRINT)
°
° AL: 80H
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
PRINT gibt nach dem Aufruf die Kontrolle an den rufenden Prozess zurück.
5.2 Kommunikation with PRINT (AH = 01H, DOS 3.0 - 6.x)
Mit dem Code AH = 01 erlaubt der INT 2F die Kommunikation mit dem residenten Teil
des Programmes PRINT.COM. Der Aufruf ist zwar bereits ab DOS 2.x vorhanden, die
Schnittstellenbelegung ist aber erst ab DOS 3.0 definiert. Es gelten folgende
Parameterübergaben:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 01H (PRINT)
°
° AL: Unterfunktion
°
û---------------------------------À
°
RETURN
°
° --- s. Funktion
°
Û---------------------------------ì
Der Wert in AL selektiert die Unterfunktion des INT 2F-Handlers.
Für das Programm PRINT gelten folgende Konventionen:
Ö-----Ú-----------------------------Ì
° AL ° Bemerkungen
°
û-----é-----------------------------À
° 00 ° Get Installationsstatus
°
û-----é-----------------------------À
° 01 ° Datei in Liste einfügen
°
û-----é-----------------------------À
° 02 ° Datei aus Liste entfernen
°
û-----é-----------------------------À
° 03 ° Liste komplett löschen
°
û-----é-----------------------------À
° 04 ° Status lesen
°
û-----é-----------------------------À
° 05 ° Ende der Statusabfrage
°
û-----é-----------------------------À
° 06 ° Check Error (ab DOS 3.3)
°
Û-----Ù-----------------------------ì
Tabelle 5.2: Unterfunktionen der PRINT-Utility;
Die Funktionscodes AL = F8H bis FFH sind beim PRINT-Aufruf (AH=01H) für DOS
reserviert und werden durch den INT 2F abgefangen.
Tritt ein Fehler auf, wird dies durch ein gesetztes Carry-Flag dem Anwenderprozeß
signalisiert. In diesem Fall gibt der jeweils über das Register AL angesprochene
Funktionsteil einen Fehlercode in AL zurück. Die nachfolgende Tabelle enthält die
Belegung der Fehlercodes (dezimal) für die PRINT-Utility.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
342
Ö-----Ú-----------------------------Ì
° AL ° Bemerkungen
°
û-----é-----------------------------À
° 00 ° kein Fehler
°
û-----é-----------------------------À
° 01 ° fehlerhafter Funktionsaufr. °
û-----é-----------------------------À
° 02 ° Datei nicht gefunden
°
û-----é-----------------------------À
° 03 ° Pfad nicht gefunden
°
û-----é-----------------------------À
° 04 ° zu viele offene Dateien
°
û-----é-----------------------------À
° 05 ° Zugriff abgewiesen
°
û-----é-----------------------------À
° 08 ° Liste voll
°
û-----é-----------------------------À
° 09 ° Treiber Busy
°
û-----é-----------------------------À
° 12 ° Dateiname zu lang
°
û-----é-----------------------------À
° 15 ° falsches Laufwerk
°
Û-----Ù-----------------------------ì
Tabelle 5.3: Fehlercodes der PRINT-Utility
5.2.1 Get Installationsstatus (AL = 00H, DOS 3.0 - 6.x)
Mit dieser Unterfunktion kann überprüft werden, ob der residente Teil von PRINT
installiert ist. Es gelten folgende Aufrufkonventionen:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 01H (PRINT)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Der zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Treibers.
·
Falls AL = 0 ist, dann ist der residente Teil von PRINT nicht vorhanden und kann
installiert werden.
·
Falls AL = 1 ist, dann ist der residente Teil von PRINT nicht vorhanden, er läßt sich
aber auch nicht installieren.
·
Falls AL = FFH ist, dann ist der residente Teil von PRINT bereits installiert.
Die Funktion AL = 00H (Get Installationsstatus) sollte bei jedem residenten Programm
implementiert werden, welches den Interrupt 2FH nutzt. Denn nur so läßt sich prüfen, ob
der Handler bereits installiert ist.
5.2.2 Datei in Liste einfügen (AL = 01H, DOS 3.0 - 6.x)
Mit diesem Aufruf läßt sich eine Datei in die PRINT-Ausgabeliste einfügen. Es gelten
folgende Übergabeparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
343
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 01H (PRINT)
°
° AL: 01H Datei in Liste einfügen °
° DS:DX Zeiger auf Submit-Tabelle °
û---------------------------------À
°
RETURN
°
° CY: 0 -> kein Fehler
°
° AL: Submitcode
°
° CY: 1 -> Fehler beim Aufruf
°
° AL: Fehlercode
°
Û---------------------------------ì
Der Dateiname muß als ASCII-String mit Laufwerksbezeichnung und Pfadname
angegeben werden. Der Zeiger im Registerpaar DS:DX zeigt auf eine Datenstruktur
(Submit Paket) mit folgendem Aufbau:
Ö----------Ú-------------------------------------------Ì
° Bytes
° Feld
°
û----------é-------------------------------------------À
°
1
° Levelcode
°
û----------é-------------------------------------------À
°
4
° Zeiger auf den ASCIIZ-String mit dem
°
°
° Dateinamen
°
Û----------Ù-------------------------------------------ì
Tabelle 5.4: Aufbau der Submit-Tabelle für PRINT
Der Levelcode ist in den Versionen 3.0 bis 6.0 immer mit dem Wert 0 versehen.
Vermutlich ist mit dem Levelcode eine Priorisierung der PRINT-Aufträge für spätere
DOS-Versionen vorgesehen. Der Zeiger wird in der Segment:Offset-Notation verwendet.
Der ASCIIZ-String muß das Laufwerk, den Pfad und den Dateinamen enthalten. Innerhalb
des Dateinamens dürfen keine Wildcards (*) auftreten. Ist das Carry-Flag nach dem Aufruf
gesetzt, deutet dies auf einen Fehler hin. Der Fehlercode findet sich dann im Register AL
und ist gemäß Tabelle 5.3 kodiert. Bei gelöschtem Carry-Flag enthält AL einen Status, der
folgende Kodierung aufweist:
AL = 01H Filename in Warteschlange eingetragen
9EH Datei wird gedruckt
Damit kann festgestellt werden, ob die Warteschlange beim Aufruf leer war.
5.2.3 Datei aus Liste entfernen (AL = 02H, DOS 3.0 - 6.x)
Mit diesem Aufruf läßt sich eine Datei aus der PRINT-Ausgabeliste entfernen. Es gelten
folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 01H (PRINT)
°
° AL: 02H Datei aus Liste löschen °
° DS:DX Zeiger auf Dateiname
°
û---------------------------------À
°
RETURN
°
° CY: 0 -> kein Fehler
°
° CY: 1 -> Fehler beim Aufruf
°
° AL: Fehlercode
°
Û---------------------------------ì
Dies ist die komplementäre Funktion zu AL = 01H, mit der man eine Datei aus der PRINTAusgabeliste entfernen kann. Der Zeiger im Registerpaar DS:DX zeigt allerdings direkt auf
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
344
den ASCIIZ-String mit dem Dateinamen. Dieser Dateiname darf auch Wildcardzeichen (*)
enthalten. Ein gefundener Name wird aus der Liste ausgetragen. Ist das Carry-Flag nach
dem Aufruf gesetzt, liegt ein Fehler vor. Die Funktion gibt dann den Status im Register AL
zurück. Es gelten die in Tabelle 5.3 beschriebenen Fehlercodes.
5.2.4 Lösche Liste (AL = 03H, DOS 3.0 - 6.x)
Dieser Aufruf löscht alle Einträge aus der PRINT-Ausgabeliste. Es gelten folgende
Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 01H (PRINT)
°
° AL: 03H Liste löschen
°
û---------------------------------À
°
RETURN
°
° CY: 0 -> kein Fehler
°
° CY: 1 -> Fehler beim Aufruf
°
° AL: Fehlercode
°
Û---------------------------------ì
Der Aufruf benötigt keinen Dateinamen, da hier alle Einträge aus der Liste entfernt
werden. Bei einem Fehler ist anschließend das Carry-Flag gesetzt und AL enthält einen
Fehlercode gemäß Tabelle 5.3.
5.2.5 Lese Status (AL = 04H, DOS 3.0 - 6.x)
Mit diesem Aufruf wird die Ausgabe innerhalb des Modules PRINT unterbrochen, so daß
die Ausgabeliste untersucht werden kann. Es gelten folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 01H (PRINT)
°
° AL: 04H lese Status
°
û---------------------------------À
°
RETURN
°
° CY: 1 -> kein Fehler
°
° AX: Fehlercode
°
° CY: 0 -> kein Fehler
°
° DX: Fehlerzähler
°
° DS:SI Zeiger auf Ausgabeliste
°
Û---------------------------------ì
Im Register DX wird ein Wert zurückgegeben, der die Zahl der Fehlversuche bei der
Ausgabe des letzten Zeichens spezifiziert. Dies tritt zum Beispiel auf, falls der Drucker
ausgeschaltet ist. Treten keine Fehler auf, wird das Register DX vor der Rückkehr auf den
Wert 0 gesetzt.
Im Registerpaar DS:SI befindet sich ein Zeiger auf die interne Ausgabeliste, welche für
jeden Namen einen Puffer von 64 Byte enthält. Der Name der gerade auszugebenden Datei
steht am Anfang dieser Liste. Ein Eintrag mit dem Wert 00 im ersten Byte zeigt das Ende
der belegten Liste an.
Der nächste Aufruf der Funktion AH = 01H mit dem Subcode AL = 05H gibt die PRINTAusgabe wieder frei.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
345
5.2.6 Ende Statusabfrage (AL = 05H, DOS 3.0 - 6.x)
Der Aufruf gibt explizit die PRINT-Ausgabe frei, falls sie durch AH = 04H blockiert war.
Es gelten folgende Parameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 01H (PRINT)
°
° AL: 05H Ende Statusabfrage
°
û---------------------------------À
°
RETURN
°
° CY: 0 -> kein Fehler
°
° CY: 1 -> Fehler beim Aufruf
°
° AL: Fehlercode
°
Û---------------------------------ì
Im Register AL findet sich der oben beschriebene Fehlercode, falls das Carry-Flag gesetzt
ist.
5.2.7 Get Printer Device (AL = 06H, DOS 3.3 - 6.x)
Der Aufruf AH = 06H ist erst ab DOS 5.0 dokumentiert und wird durch PRINT.COM
benutzt, um zu prüfen, ob die Warteschlange der Ausgabeeinheit voll ist.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 01H (PRINT)
°
° AL: 06H Get Device
°
û---------------------------------À
°
RETURN
°
° CY: 0 -> kein Fehler
°
° CY: 1 -> Fehler beim Aufruf
°
° AL: Fehlercode 08H
°
° DS:SI Adresse Device Treiber
°
Û---------------------------------ì
Falls dies zutrifft, ist das Carry-Flag gesetzt und in AX steht der Fehlercode 08H (queue
full).
Weiterhin gibt die Funktion nach dem Aufruf in DS:SI die Adresse des Treiberkopfes der
Ausgabeeinheit zurück. So läßt sich prüfen, auf welches Gerät PRINT seine Ausgaben
umleitet.
Bei der INT 2F-Funktion AH = 01H sind alle Unterfunktionscodes von AL = F8H bis FFH
für zukünftige DOS-Erweiterungen reserviert.
5.3 Kommunikation with PC LAN Programm
REDIR/REDIRIFS (AH = 02H)
Dieser Aufruf wird durch das PC-Lan-Programm REDIR/REDIRIFS für interne Zwecke
benutzt und belegt den Code AH = 02H. Die Schnittstelle ist nicht dokumentiert.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
346
Ö----Ú------------------------------------------Ì
° AL ° Aufruf
°
û----é------------------------------------------À
° 00 ° Installations Check
°
°
° Return: AL = FFH -> installiert
°
Û----Ù------------------------------------------ì
Nach dem Aufruf zeigt der Wert AL=FFH, daß die Treiber installiert sind.
Das Programm benutzt weiterhin die Untercodes AL = 01, 02, 03 und 04. Die Funktionen
und Registerbelegungen sind allerdings nicht bekannt.
5.4 DOS 3.X Critical-Error-Handler (AH = 05H, DOS 3.0 - 6.x)
Der Code AH = 05H ist ab DOS 3.0 durch das Betriebssystem belegt. Über diesen Interrupt
wird die Kommunikation mit dem Critical-Error-Handler abgewickelt. Die Schnittstelle
wurde durch Microsoft nicht offiziell dokumentiert.
5.4.1 Get Installationsstatus (AL = 0)
Mit dieser Unterfunktion kann überprüft werden, ob der DOS 3.X Critical-Error-Handler
installiert ist. Unter diesem Interrupt kann ein Anwenderprozeß unter Umständen eine
eigene Fehlerbehandlungsroutine ablegen. Es gelten folgende Aufrufkonventionen:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 05H (Critical-Error-Handler)°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Der zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Handlers.
·
Falls AL = 0 ist, dann ist der Handler nicht vorhanden und kann installiert werden.
·
Falls AL = 1 ist, dann ist der Handler nicht installiert, er läßt sich aber auch nicht
installieren.
·
Falls AL = FFH ist, dann ist der Handler installiert.
Die Funktion AL = 00H (Get Installationsstatus) sollte vor Aufruf der folgenden
Unterfunktion oder vor der Installation eines eigenen Fehlerhandlers benutzt werden, um
zu prüfen, ob bereits ein Handler installiert ist.
5.4.2 Handle Error (AL = XXH)
Dieser Aufruf wird beim Auftreten eines Fehlers durch COMMAND.COM aktiviert. Ein
Anwenderprogramm kann dann unter dem INT 2F, AH = 05H einen eigenen Handler
installieren. Von COMMAND werden in DOS 3.x folgende Parameter übergeben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
347
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 05H (Critical-Error-Handler)°
° AL: Extended Error Code <> 0
°
û---------------------------------À
°
RETURN
°
° CY: 0 -> kein Fehler
°
° ES:DI Adresse Fehlertext
°
° CY: 1 -> benutze intern. Handler°
Û---------------------------------ì
Im Register AL übergibt DOS 3.x den Extended-Error-Code mit der Fehlerursache. Bei
einem gelöschten Carry-Flag muß der Fehler-Handler in ES:DI die Adresse auf einen
ASCIIZ-String mit dem Fehlertext zurückgeben. Diese wird dann durch DOS auf der
Konsole ausgegeben. Setzt die anwenderspezifische Critical-Error-Routine das Carry-Flag
vor dem Rücksprung zu DOS, dann benutzt COMMAND den internen Critical-ErrorHandler.
Ab DOS 4.0 gelten etwas andere Aufrufkonventionen:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 05H (Critical-Error-Handler)°
° AL: 1 -> Extend. Error Code<>0 °
°
2 -> Parameter Error
°
° BX:-> Error Code <> 0
°
û---------------------------------À
°
RETURN
°
° CY: 0 -> kein Fehler
°
° ES:DI Adresse Fehlertext
°
° CY: 1 -> benutze intern. Handler°
Û---------------------------------ì
Im Register AL übergibt DOS einen Statuscode. Ist dieser = 1, dann enthält BX den
erweiterten Fehlercode. Mit AL = 2 findet sich in BX der Parameter Errorcode. Nach dem
Aufruf ist vom Fehler-Handler in ES:DI die Adresse des Fehlerstrings zurückzugeben.
Dieser wird dann durch DOS auf der Konsole ausgegeben. Setzt die anwenderspezifische
Critical-Error-Routine das Carry-Flag vor dem Rücksprung zu DOS, dann benutzt
COMMAND den internen Critical-Error-Handler. Die Subfunktion 02H wird durch viele
externe DOS-Programme aufgerufen.
5.5 Kommunikation with ASSIGN (AH = 06H, DOS 3.0 -6.x)
Ähnlich der Kommunikation mit PRINT läßt sich über die Funktion AH = 06H mit dem
residenten Teil von ASSIGN kommunizieren. Dieser Aufruf wurde von Microsoft
dokumentiert.
5.5.1 Get Installation Status (AL = 00H)
Zur Überprüfung des Installationsstatus gelten folgende Übergabeparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
348
DOS Programmierhandbuch
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 06H (ASSIGN)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Der zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Treibers.
·
Falls AL = 0 ist, dann ist der residente Teil von ASSIGN nicht vorhanden und kann
installiert werden.
·
Falls AL = 1 ist, dann ist der residente Teil von ASSIGN nicht vorhanden, er läßt sich
aber auch nicht installieren.
·
Falls AL = FFH ist, dann ist der residente Teil von ASSIGN installiert.
ASSIGN erlaubt die Umleitung einzelner
physikalische Laufwerkseinheiten.
Laufwerksbezeichnungen auf andere
5.5.2 Get ASSIGN Memory Segment (AL = 01H)
Mit dieser Unterfunktion läßt sich das Segment mit dem ASSIGN-Arbeitsbereich ermitteln.
Es gelten folgende Aufrufkonventionen:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 06H (ASSIGN)
°
° AL: 01H Get Memory Segment
°
û---------------------------------À
°
RETURN
°
° ES: Memory Segment
°
Û---------------------------------ì
Der zurückgegebene Wert im Register ES enthält die Adresse des ASSIGNArbeitsbereiches mit den Zuweisungen. Ab DOS 3.3 findet sich ab Offset ES:103 eine 26
Byte lange Tabelle mit den Codes der Laufwerke. Die Tabelle wird mit den Werten 0
(=A:), 1 (=B:), etc. initialisiert. Bei einer Umleitung (z.B. durch ASSIGN A=B) wird an
der betreffenden Stelle einfach der neue Laufwerkscode eingetragen.
Beachten Sie, daß ab DOS 5.0 das Programm ASSIGN nicht mehr als TSR-Programm
installiert wird. Vielmehr wird beim Aufruf von ASSIGN intern der SUBST-Befehl
eingesetzt. Ab DOS 6.0 entfällt ASSIGN komplett.
5.6 Kommunikation with DRIVER.SYS (AH = 08H, DOS 3.0 6.x)
Diese Funktion ist für DOS reserviert und übernimmt die Kommunikation mit dem
Programm DRIVER.SYS.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
349
5.6.1 Get Installation Status (AL = 00H)
Zur Überprüfung des Installationsstatus gelten folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 08H (DRIVER.SYS)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Der zurückgegebene Wert im Register AL enthält Hinweise über den Status.
·
Falls AL = 0 ist, dann ist der DRIVER.SYS nicht vorhanden und kann installiert
werden.
·
Falls AL = 1 ist, dann ist DRIVER.SYS nicht vorhanden, läßt sich aber auch nicht
installieren.
·
Falls AL = FFH ist, dann ist DRIVER.SYS installiert.
Der Treiber ermöglicht die Installation neuer Block-Devices.
5.6.2 Add New Block Device (AL = 01H)
Mit dieser Unterfunktion läßt sich ein blockorientierter Device-Treiber installieren.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 08H (DRIVER.SYS)
°
° AL: 01H Add new Block Device
°
° DS:DI Device Driver Header
°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Im Registerpaar DS:DI ist die Adresse der Drive-Data-Table zu übergeben. Die Funktion
durchsucht die installierte Treiberliste, modifiziert das Wort ab Offset 29H und hängt die
neuen Daten an die Treiberkette an. Die Struktur der Drive-Data-Table wird bei der
Subfunktion 03H beschrieben.
5.6.3 Execute Device Driver Request (AL = 02H)
Mit dieser Unterfunktion läßt sich der Header eines blockorientierten Einheitentreibers
modifizieren.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 08H (DRIVER.SYS)
°
° AL: 02H Execute Device Request °
° ES:BX Device Driver Header
°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Im Registerpaar ES:BX ist die Adresse des Device Treiber Request Headers zu übergeben.
Dieser Header besitzt folgendes Format:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Ö-------------------------------------------------------Ì
°
Format des Device Driver Request Header:
°
°
°
° Offs. Byte Beschreibung
°
°
°
° 00H
1 Länge des Request Headers
°
° 01H
1 Subunit im Device Driver
°
° 02H
1 Kommando Code
°
°
00H INIT
°
°
01H MEDIA CHECK (Block Devices)
°
°
02H BUILD BPB (Block Devices)
°
°
03H IOCTL INPUT
°
°
04H INPUT
°
°
05H NONDESTRUCTIVE INPUT, NO WAIT (char dev) °
°
06H INPUT STATUS
°
°
07H INPUT FLUSH
(char dev)
°
°
08H OUTPUT
°
°
09H OUTPUT WITH VERIFY
°
°
0AH OUTPUT STATUS (char dev)
°
°
0BH OUTPUT FLUSH
(char dev)
°
°
0CH IOCTL OUTPUT
°
°
0DH (DOS 3.x) DEVICE OPEN
°
°
0EH (DOS 3.x) DEVICE CLOSE
°
°
0FH (DOS 3.x) REMOVABLE MEDIA (block devices)°
°
10H (DOS 3.x) OUTPUT UNTIL BUSY (char dev) °
°
11H - 12H reserviert
°
°
13H (ab DOS 3.2) GENERIC IOCTL
°
°
14H - 16H reserviert
°
°
17H (DOS 3.2+) GET LOGICAL DEVICE
°
°
18H (DOS 3.2+) SET LOGICAL DEVICE
°
°
19H (DOS 5.0+) CHECK GENERIC IOCTL SUPPORT
°
°
80H - 88H CD-ROM-Support
°
° 03H
2 Status Wort
°
°
Bit 15
: Error
°
°
10-14: reserviert
°
°
9: Busy
°
°
8: Done
°
°
0- 7: Fehlercode falls Bit 15=1
°
° 05H
8 reserviert
°
° --- Kommandocode 00H --°
° 0DH
1 Zahl der Einheiten (vom Treiber gesetzt)
°
° 0EH
4 Adresse 1. freies Byte hinter dem Trei°
°
ber (vom Treiber gesetzt)
°
° 12H
4 Zeiger auf BPB Array (wird nur bei
°
°
Blocktreibern gesetzt)
°
° 16H
4 Laufwerksnummer der 1. Unit bei Block°
°
treibern (0=A:, ab DOS 3.0)
°
° --- Kommandocode 01H --°
° 0DH
1 Media Descriptor Byte
°
° 0EH
1 zurückgegebener Status
°
°
00H Medium unbekannt
°
°
01H Medium nicht gewechselt
°
°
FFH Medium gewechselt
°
° 0FH
4 Zeiger auf vorhergehendes Volume ID falls °
°
das OPEN/CLOSE/RM-Bit im Treiberkopf ge°
°
setzt ist und das Medium gewechselt wurde
°
°
(wird vom Treiber gesetzt)
°
° --- Kommandocode 02H --°
° 0DH
1 Media Descriptor Byte
°
° 0EH
4 Transferadresse (scratch Sektor im
°
°
NON-IBM-Format
°
°
FAT-Sektor sonst)
°
° 12H
4 Zeiger auf BPB (wird vom Treiber gesetzt) °
° --- Kommandocode 03H, 0CH --°
° 0DH
1 Media Descriptor Byte
°
° 0EH
4 Transferadresse
°
° 12H
2 Bytezähler (character device)
°
°
Sektorzähler (block device)
°
° 14H
2 Nummer Startsektor (block device)
°
° 16H
4 Zeiger auf Volume Label, falls der Error- °
°
code 0FH vom Treiber gesetzt (DOS 3.0+)
°
° --- Kommandocode 04H, 08H, 09H --°
° 0DH
1 Media Descriptor Byte
°
°
(nur block devices)
°
° 0EH
4 Transferadresse
°
° 12H
2 Bytezähler (character device)
°
°
Sektorzähler (block device)
°
° 14H
2 Nummer Startsektor (block device)
°
° 16H
4 Zeiger auf Volume Label, falls der Error- °
°
code 0FH vom Treiber gesetzt (DOS 3.0+)
°
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
350
DOS Programmierhandbuch
351
° 1AH
4 32-Bit-Startsektor (ab DOS 4.0) falls Bit 1°
°
im Device-Attribut gesetzt ist
°
° --- Kommandocode 05H --°
° 0DH
1 von Einheit gelesenes Byte, falls das
°
°
BUSY-Bit bei Rückkehr gelöscht ist
°
° --- Kommandocode 06H,07H,0AH,0BH,0DH,0EH,0FH,85H,88H--°
° --- unbelegt
°
° --- Kommandocode 10H --°
° 0DH
1 unbelegt
°
° 0EH
4 Transferadresse
°
° 12H
2 Bytezähler
°
° --- Kommandocode 13H, 19H --°
° 0DH
1 Category Code
°
°
00 unbekannt
°
°
01 COMn:
°
°
03 CON
°
°
05 LPTn:
°
°
08 Disk
°
° 0EH
1 Funktionscode
°
° 0FH
2 Kopie des DS beim IOCTL-Aufruf
°
° 11H
2 Offset Treiberheader
°
° 13H
4 Zeiger auf Parameterblock INT 21 Aufruf
°
°
440CH, 440DH
°
Û-------------------------------------------------------ì
Es werden noch die Funktionscodes 80H-88H unterstützt. Weitere Informationen über das
Format des Header für diese Codes finden sich beim INT 2FH, Funktion 1510H. Der
Aufruf erlaubt zum Beispiel die Einbindung von CD-ROM's.
5.6.4 Get Drive Data Table (AL = 03H)
Mit dieser Unterfunktion läßt sich die Adresse einer Tabelle mit den Daten des Laufwerkes
ermitteln.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 08H (DRIVER.SYS)
°
° AL: 03H Get Data Table
°
û---------------------------------À
°
RETURN
°
° DS:DI resse Tabelle
°
Û---------------------------------ì
Im Registerpaar DS:DI wird die Adresse der Tabelle zurückgegeben. Diese Tabelle besitzt
in Abhängigkeit von der DOS-Version folgenden Aufbau:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Ö-------------------------------------------------------Ì
° Offs. Byte Beschreibung
°
° --- DOS 3.30 Drive Data Table
°
° 00H
4 Zeiger auf Folgetabelle
°
° 04H
1 physikalische Unit Nummer (INT 13)
°
° 05H
1 logische Drive Nummer
°
° 06H
19 BIOS Parameter Block
°
°
2 Byte pro Sektor
°
°
1 Sektor pro Cluster (FFH unbekannt)
°
°
2 Zahl der reserv. Sektoren
°
°
1 Zahl der FAT's
°
°
2 Zahl der Stammverzeichniseinträge
°
°
2 Gesamtzahl der Sektoren
°
°
1 Media Descriptor (00H unbekannt)
°
°
2 Sektoren pro FAT
°
°
2 Sektoren pro Track
°
°
2 Zahl der Köpfe
°
°
2 Zahl der hidden Sektoren
°
° 19H
1 Flags (Bit 6: 1 = 16-Bit-FAT
°
°
0 = 12-Bit-FAT
°
° 1AH
2 Zahl der DEVICE OPEN-Calls ohne
°
°
DEVICE CLOSE-Calls
°
° 1CH
11 Volume Label oder "NO NAME
"
°
° 27H
1 00H
°
° 28H
1 Device Typ (siehe INT 21,440DH)
°
° 29H
2 Flags:
°
°
Bit 0: Fixed Media
°
°
1: Door Lock Support
°
°
2: --°
°
3: Sektoren der Spur haben gleiche Größe
°
°
4: physikal. Einheit ist in mehrere log.
°
°
Einheiten aufgeteilt
°
°
5: aktuelle log. Einheit als phys. Einheit °
°
6-8: --°
° 2BH
2 Zahl der Zylinder
°
° 2DH
19 BPB für höchste unterstützte Kapazität
°
° 40H
3 --°
° 43H
9 --°
° 4CH
1 LSB letzter aktiver Zylinder
°
° 4DH
4 -- removable media --°
°
Zeit letzter Zugriff in Clock Ticks
°
°
(FFFFFFFFH = nie zugegriffen)
°
° 4DH
-- fixed media --°
°
2 Partition (FFFFH = primär, 0001 = extended)°
°
2 absolute Zylinder Nummer Beginn der
°
°
Partition im physikal. Laufwerk (immer
°
°
0001H bei primären Partitionen)
°
°-------------------------------------------------------°
° --- COMPAC DOS 3.31 Drive Data Table
°
° 00H
4 Zeiger auf Folgetabelle
°
° 04H
1 physikalische Unit Nummer (INT 13)
°
° 05H
1 logische Drive Nummer
°
° 046
25 BIOS Parameter Block (wie DOS 4.01)
°
° 1FH
6 ----°
° 25H
1 Flags (Bit 6: 1 = 16-Bit-FAT
°
°
0 = 12-Bit-FAT
°
° 26H
2 ----°
° 28H
11
Volume Label oder "NO NAME
"
°
° 33H
1 00H Abschluß Name
°
° 34H
1 Device Typ (siehe INT 21,440DH)
°
° 35H
2 Flags:
°
°
Bit 0: Fixed Media
°
°
1: Door Lock Support
°
°
2: --°
°
3: Sektoren der Spur haben gleiche Größe
°
°
4: physikal. Einheit ist in mehrere log.
°
°
Einheiten aufgeteilt
°
°
5: aktuelle log. Einheit als phys. Einheit °
°
6-8: --°
° 37H
2 Zahl der Zylinder
°
° 39H
19 BPB für höchste unterstützte Kapazität
°
° 52H
6 --°
° 58H
1 LSB letzter aktiver Zylinder
°
° 59H
4 -- removable media --°
°
Zeit letzter Zugriff in Clock Ticks
°
°
(FFFFFFFFH = nie zugegriffen)
°
° 59H
-- fixed media --°
°
2 Partition (FFFFH = primär, 0001 = extended)°
°
2 absolute Zylinder Nummer Beginn der
°
°
Partition im physikal. Laufwerk (immer
°
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
352
DOS Programmierhandbuch
353
°
0001H bei primären Partitionen)
°
°-------------------------------------------------------°
° --- DOS 4.0 - 6.0 Drive Data Table
°
° 00H
4 Zeiger auf Folgetabelle
°
° 04H
1 physikalische Unit Nummer (INT 13)
°
° 05H
1 logische Drive Nummer
°
° 06H
25 BIOS Parameter Block
°
°
2 Byte pro Sektor
°
°
1 Sektor pro Cluster (FFH unbekannt)
°
°
2 Zahl der reserv. Sektoren
°
°
1 Zahl der FAT's
°
°
2 Zahl der Stammverzeichniseinträge
°
°
2 Gesamtzahl Sektoren (siehe letztes DWORD) °
°
1 Media Descriptor (00H unbekannt)
°
°
2 Sektoren pro FAT
°
°
2 Sektoren pro Track
°
°
2 Zahl der Köpfe
°
°
4 Zahl der hidden Sektoren
°
°
4 Zahl Sektoren, falls WORD ab Offset 08 = 0)°
° 1FH
1 Flags (Bit 6: 1 = 16-Bit-FAT
°
°
0 = 12-Bit-FAT
°
° 20H
2 --°
° 22H
1 Device Typ (siehe INT 21,440DH)
°
° 23H
2 Flags:
°
°
Bit 0: Fixed Media
°
°
1: Door Lock Support
°
°
2: --°
°
3: Sektoren der Spur haben gleiche Größe
°
°
4: physikal. Einheit ist in mehrere log.
°
°
Einheiten aufgeteilt
°
°
5: aktuelle log. Einheit als phys. Einheit °
°
6-8: --°
° 25H
2 Zahl der Zylinder
°
° 27H
25 BPB für höchste unterstützte Kapazität
°
° 40H
7 --°
° 47H
4 -- removable media --°
°
Zeit letzter Zugriff in Clock Ticks
°
°
(FFFFFFFFH = nie zugegriffen)
°
° 47H
-- fixed media DOS 4.x --°
°
2 Partition (FFFFH = primär, 0001 = extended)°
°
2 absolute Zylinder Nummer Beginn der
°
°
Partition im physikal. Laufwerk (immer
°
°
FFFFH bei primären Partitionen)
°
° 47H
-- fixed media DOS 5.0 --°
°
2 immer 0001
°
°
2 absolute Zylinder Nummer Beginn der
°
°
Partition im physikal. Laufwerk
°
° ------------------------------------------------------°
° 4BH
11 Volume Label oder "NO NAME
"
°
° 56H
1 --°
° 57H
4 Seriennummer Medium
°
° 5BH
8 Typ Filesystem "FAT 12
" "FAT 16
"
°
° 63H
1 --°
Û-------------------------------------------------------ì
Durch die unterschiedliche Größe der unterstützten Speichermedien mußte die Tabelle in
den verschiedenen DOS-Versionen mehrfach modifiziert werden. Der Funktionsaufruf
wird erst ab DOS 3.3 unterstützt.
5.7 Kommunikation with SHARE (DOS 3.0 - 5.0, AH = 10H)
Diese Aufrufe erlauben eine Kommunikation mit dem Programm SHARE. Einige Aufrufe
stehen nicht in allen DOS-Versionen zur Verfügung.
5.7.1 SHARE Installation Check (AX = 1000H)
Dieser Aufruf steht in allen DOS-Versionen oberhalb 3.0 zur Verfügung.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
354
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 10H (Share)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Mit dieser Funktion läßt sich der residente Teil von SHARE auf den Installationsstatus
abfragen.
Es ist nur die Unterfunktion AL = 00 (Get Installationsstatus) implementiert. Aufrufe mit
AL > 00H führen in DOS 3.x wegen eines Fehlers zu einer Endlosschleife. Der
zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Treibers.
·
Falls AL = 0 ist, dann ist der residente Teil von SHARE nicht vorhanden und kann
installiert werden.
·
Falls AL = 1 ist, dann ist der residente Teil von SHARE nicht vorhanden, er läßt sich
aber auch nicht installieren.
·
Falls AL = FFH ist, dann ist der residente Teil von SHARE installiert.
SHARE erlaubt innerhalb von Netzwerkanwendungen den Zugriff mehrerer Prozesse auf
einzelne Dateien.
5.7.2 SHARE Turn ON File Sharing Checks (AX = 1080H)
Dieser Aufruf steht nur in DOS 4.x zur Verfügung. Es gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 10H (Share)
°
° AL: 80H Sharing Check ON
°
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Mit dieser Funktion läßt sich der SHARE-Funktionalität einschalten.
In DOS 4.x hat SHARE zwei Funktionen. Einmal werden FCB's für Medien größer als 32
Mbyte unterstützt. Weiterhin übernimmt SHARE die Prüfung gemeinsam geöffneter
Dateien. Mittels des undokumentierten Kommandozeilenparameters /NC kann die Prüfung
abgeschaltet werden.
In AL wird nach dem Rücksprung ein Statuscode übergeben:
AL = F0H SHARING erfolgreich eingeschaltet.
FFH SHARING-Check war bereits eingeschaltet.
Die Prüfung läßt sich mit der folgenden Funktion auch wieder abschalten.
5.7.3 SHARE Turn OFF File Sharing Checks (AX = 1081H)
Dieser Aufruf steht nur in DOS 4.x zur Verfügung. Es gilt folgende Aufrufschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
355
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 10H (Share)
°
° AL: 81H Sharing Check OFF
°
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Mit dieser Funktion läßt sich der SHARE-Funktionalität abschalten. In AL wird nach dem
Rücksprung ein Statuscode übergeben:
AL = F0H SHARING erfolgreich eingeschaltet.
FFH SHARING-Check war bereits eingeschaltet.
Die Funktion AX = 1040H wird von SHARE ebenfalls benutzt, genaue Informationen über
die Schnittstelle sind aber nicht bekannt. Die Funktionen AX=10xxH werden nur intern
von DOS benutzt und dürften in der Regel für Anwendungsprogramme nicht von Interesse
sein.
5.8 Kommunikation with Network Redirector (AH = 11H,
DOS 3.1 - 5.0)
Mit dieser Funktion des INT 2F wird die Netzwerkumleitung in DOS unterstützt.
Weiterhin dürfte DOS bereits einige Grundfunktionen eines installierbaren Filesystems zu
beinhalten. Die Kommunikation mit diesen Routinen erfolgt über die Funktion AH=11H
des INT 2F. In DOS 3.1 bis 3.3 sind die Aufruf des INT 2F im Kern implementiert. In
DOS 4.x muß vorher das Programm IFSFUNC.EXE geladen werden, da die Funktionen
dort erst installiert werden. Ab DOS 5.0 finden sich die Funktionen wieder im Kern. Es
sind folgende Unterfunktionen implementiert.
5.8.1 Get Installation Status (AL = 00H)
Die Unterfunktion erlaubt eine Überprüfung, ob das Programm zur Netzwerkumleitung
vorhanden ist.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 11H (Network Redirector)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Der zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Treibers.
·
Falls AL = 0 ist, dann ist der Redirector nicht vorhanden und kann installiert werden.
·
Falls AL = 1 ist, dann ist der Redirector nicht vorhanden, er läßt sich aber auch nicht
installieren.
·
Falls AL = FFH ist, dann ist der Redirector vorhanden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
356
5.8.2 Unterfunktionen Network Redirector
Die nachfolgende Tabelle gibt einen groben Überblick über die weiteren Funktionen des
INT 2F mit AX = 11xxH. Für Anwendungsprogramme dürfte die praktische
Verwertbarkeit der Aufrufe allerdings sehr begrenzt sein.
Ö-------------------------------------------------------------Ì
°
AH = 11H (Netzwerk Umleitung)
°
Û-------------------------------------------------------------ì
Ö-------------------------------------------------------------Ì
° AL = 00H Installation check
°
û-------------------------------------------------------------À
° AL = 01H Remove Remote Directory
°
° AL = 02H Remove Remote Directory (nur DOS 4.X)
°
° AL = 03H Make Remote Directory
°
° AL = 04H Make Remote Directory (nur DOS 4.X)
°
° AL = 05H CHDIR
°
° AL = 06H Close Remote File
°
° AL = 07H Commit Remote File
°
° AL = 08H Read from Remote File
°
° AL = 09H Write to Remote File
°
° AL = 0AH Lock Region of File
°
° AL = 0BH Unlock Region of File (nur DOS 3.X)
°
° AL = 0CH Get Disk Space (ab DOS 3.1)
°
° AL = 0DH unbekannt
°
° AL = 0EH Set Remote File Attribut
°
° AL = 0FH Get Remote File Attribut
°
° AL = 10H unbekannt
°
° AL = 11H Rename Remote File
°
° AL = 12H unbekannt
°
° AL = 13H Delete Remote File
°
° AL = 14H unbekannt
°
° AL = 15H unbekannt
°
° AL = 16H Open Existing Remote File
°
° AL = 17H Create/Trancate Remote File
°
° AL = 18H Create/Truncate File Without CDS
°
° AL = 19H Find First File Without CDS
°
° AL = 1AH unbekannt
°
° AL = 1BH FindFirst
°
° AL = 1CH FindNext
°
° AL = 1DH Close All Remote Files for Process
°
° AL = 1EH Do Redirection (siehe INT 21, AX=5Fxx)
°
° AL = 1FH Set Printer Setup (siehe INT 21, AX=5Exx)
°
° AL = 20H Flush All DIsk Buffers
°
° AL = 21H Seek From End Of Remote File
°
° AL = 22H Process Termination Hook
°
° AL = 23H Qualify Remote Filename
°
° AL = 24H unbekannt
°
° AL = 25H Redirected Printer Mode
°
° AL = 26H unbekannt
°
° AL = 27H unbenutzt
°
° AL = 28H unbenutzt
°
° AL = 29H unbenutzt
°
° AL = 2AH unbekannt
°
° AL = 2BH unbekannt
°
° AL = 2CH unbekannt
°
° AL = 2DH unkannt
°
° AL = 2EH Extended Open/Create File (DOS 4.x+)
°
° AL = 2FH unbekannt
°
° AL = 30H unbekannt
°
Û-------------------------------------------------------------ì
Die genaue Aufrufschnittstelle (soweit bekannt) läßt sich /3,5/ entnehmen.
5.9 Kommunikation with DOS 3.x internal Funktions (AH =
12H)
Über diese Funktion des INT 2F wickelt DOS ab der Version 3.x viele seiner internen
Funktionsaufrufe ab. Nachfolgend werden die wichtigsten Unterfunktionen beschrieben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
357
5.9.1 Get Installationsstatus (AL = 00H)
Mit dieser Unterfunktion läßt sich der Installationsstatus abfragen.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 12H (DOS 3.x)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Die Funktion gibt den Wert FFH zurück, um mit den Konventionen des INT 2F kompatibel
zu bleiben.
Es sind weitere Unterfunktionen mit verschiedenen Codes belegt. Die folgende Tabelle gibt
einen groben Überblick über die wichtigsten Funktionsaufrufe. Viele dieser Aufruf stehen
nur intern für DOS zur Verfügung.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Ö----------------------------------------------------------Ì
°
AH = 12H (DOS 3.x Funktionen)
°
Û----------------------------------------------------------ì
Ö----------------------------------------------------------Ì
° AL = 00H Installation Check
°
û----------------------------------------------------------À
° AL = 01H Close Current File
°
û----------------------------------------------------------À
° AL = 02H Get Interrupt Address
°
°
Stack: Wort mit der Vektor Nummer
°
°
°
°
Return: ES:BX Zeiger auf den Interrupt Vektor
°
°
Stack unchanged
°
Û----------------------------------------------------------ì
Ö----------------------------------------------------------Ì
° AL = 03H Get DOS Data Segment
°
°
Return: DS Segment of IBMDOS,MSDOS
°
û----------------------------------------------------------À
° AL = 04H Normalize Path Separator
°
°
Stack: Wort mit Zeichen zum Normalisieren
°
°
Return: AL = normalisiertes Zeichen
°
°
(forward slash wird zu backslash)
°
°
Stack unchanged
°
û----------------------------------------------------------À
° AL = 05H Output Character
°
°
Stack: Wort mit auszugebendem Zeichen
°
°
Return: Stack unchanged (nur intern in DOS benutzbar)°
û----------------------------------------------------------À
° AL = 06H Invoke Critical Error
°
°
DI: Fehlercode
°
°
DS:DI Adresse Device Driver Header
°
°
SS: DOS Datensegment
°
°
STACK: Wort welches in AX zum INT 24 übergeben wird °
°
Return: AL = 0-3 für Abort, Retry, Ignore, Fail
°
°
(Stack unchanged)
°
û----------------------------------------------------------À
° AL = 07H Make Disk Buffer most-recently used
°
°
DS:DI -> Disk Buffer
°
°
Return: -°
° Der angegebene Buffer wird an das Ende der Pufferliste
°
° verschoben. Der »least-recently used bufferFehler! Verweisquelle konnte nicht
gefunden werden.° Anfang der Pufferliste. (nur intern in DOS benutzbar)
°
û----------------------------------------------------------À
° AL = 08H Decrement SFT Reference Count
°
°
ES:DI -> Adresse SFT
°
°
Return: AX = neuer Wert des Wortes
°
°
Erniedrigt die Zahl der Handles, (FFFFH = leer,
°
°
0000H = SFT unbenutzt)
°
û----------------------------------------------------------À
° AL = 09H Flush and Free Disk Buffer
°
°
DS:DI -> Disk Buffer
°
°
Return: --°
° Der Inhalt des Puffers wird auf die Disk ausgelagert und °
° der Puffer wird als unbenutzt markiert. (nur intern in
°
° DOS benutzbar)
°
û----------------------------------------------------------À
° AL = 0AH Perform Critical Error Interrupt
°
°
DS = SS = DOS DS
°
°
STACK: Extended Error Code
°
°
Return: AL: User Response (0=ignore,
°
°
1=retry & CF = 0, 2=abort, 3=fail)
°
° (nur intern in DOS benutzbar)
°
û----------------------------------------------------------À
° AL = 0BH Signal Sharing Violation to User
°
° (nur intern in DOS benutzbar)
°
û----------------------------------------------------------À
° AL = 0CH unbekannt
°
û----------------------------------------------------------À
° AL = 0DH Get Date and Time
°
°
SS = DOS DS
°
°
Return: AX = aktuelles Datum in gepackter Form
°
°
DX = aktuelle Zeit in gepackter Form
°
° Das Zeit- und Datumsformat entspricht dem Eintrag in dem °
° Directory (siehe auch INT 21, AX=5700H) (nur intern in
°
° DOS benutzbar)
°
û----------------------------------------------------------À
° AL = 0EH Free all Disk Buffers
°
°
Return: DS:DI -> Adresse des ersten Puffers
°
° (nur intern in DOS benutzbar)
°
û----------------------------------------------------------À
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
358
DOS Programmierhandbuch
° AL = 0FH Make Buffer most-recently used
°
°
DS:DI -> Adresse Disk Puffer
°
°
Return: DS:DI -> Adresse nächster Puffer in der
°
°
Pufferliste. (nur intern in DOS benutzbar) °
û----------------------------------------------------------À
° AL = 10H Find free Disk Buffer
°
°
DS:DI -> Adresse 1. zu prüfender Disk Buffer
°
°
Return: DS:DI -> 1. verfügbarer Disk Buffer
°
°
ZF = 0 freier Buffer gefunden
°
°
1 kein freier Buffer gefunden
°
Û----------------------------------------------------------ì
Ö----------------------------------------------------------Ì
° AL = 11H Normalize ASCIIZ Filename
°
°
DS:SI -> ASCIIZ-Filename zum Normalisieren
°
°
ES:DI -> Buffer für den normalisierten Filenamen
°
°
Return: -°
° Im Zielpuffer wird der Filename in Großbuchstaben ge°
° speichert. Slash wird in Backslash konvertiert.
°
û----------------------------------------------------------À
° AL = 12H Get Length of ASCIIZ-String
°
°
ES:DI -> Adresse des ASCIIZ-String
°
°
Return: CX = Länge des Strings
°
û----------------------------------------------------------À
° AL = 13H Uppercase Character
°
°
STACK: Wort mit dem zu konvertierenden Zeichen
°
°
Return: AL = Zeichen als Großbuchstabe
°
°
Stack unchanged
°
û----------------------------------------------------------À
° AL = 14H Compare FAR Pointers
°
°
DS:SI = erster Zeiger
°
°
ES:DI = zweiter Zeiger
°
°
Return: ZF = 1 Zeiger sind gleich
°
°
0 Zeiger sind ungleich
°
û----------------------------------------------------------À
° AL = 15H Flush Buffer
°
°
DS:DI -> Adresse Disk Buffer
°
°
STACK: Wort mit der Drive Nummer für den der Buffer °
°
Return: --°
°
Stack unchanged
°
°
°
° Auf dem Stack wird ein Wort mit den Drive Nummern über- °
° geben, deren Buffer übersprungen werden soll. Der Puffer °
° wird ignoriert, falls die Drive Nummer zu einem anderen °
° Puffer gehört. (nur intern in DOS benutzbar)
°
û----------------------------------------------------------À
° AL = 16H Get Address of System File Table (SFT)
°
°
BX = System File Table Entry Nummer
°
°
Return: CF: 0 -> ok
°
°
ES:DI -> Adresse System File Table Entry
°
°
CF: 1 -> Wert in BX war größer als in
°
°
FILES= erlaubt
°
û----------------------------------------------------------À
° AL = 17H Get Current Directory Structure
°
°
STACK: Wort mit Drive (0 = A:, 1 = B:, etc)
°
°
Return: CF = 1 Fehler (Drive > Lastdrive
°
°
= 0 o.k.
°
°
DS:SI -> Directory Struktur für das spezifierte Drive°
°
Stack unchanged (nur intern in DOS benutzbar)
°
û----------------------------------------------------------À
° AL = 18H Get Caller's Registers
°
°
Return: DS:SI -> Stackadresse in dem die Register
°
°
AX,BX,CX,DX,SI,DI,BP,DS,ES gesichert wurden.
°
°
(nur gültig bei Aufrufen innerhalb DOS)
°
û----------------------------------------------------------À
° AL = 19H unbekannt
°
û----------------------------------------------------------À
° AL = 1AH Get Files Drive
°
°
DS:SI -> Adresse Filename
°
°
Return: AL = Drive (0 = default, 1 = A:, etc,
°
°
FFh = invalid)
°
û----------------------------------------------------------À
° AL = 1BH Set Year/Length of February
°
°
CL = Jahr - 1980
°
°
Return: AL = Tage im Februar
°
° DS muß auf das DOS-Codesegment gesetzt sein.
°
Û----------------------------------------------------------ì
Ö----------------------------------------------------------Ì
° AL = 1CH Checksum Memory
°
°
DS:SI -> Startadresse Checksumberechnung
°
°
CX = Zahl der Bytes
°
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
359
DOS Programmierhandbuch
°
DX = Checksumregister mit Startwert
°
°
Return: DX = Checksumme (nur intern in DOS nutzbar) °
û----------------------------------------------------------À
° AL = 1DH Sum Memory
°
°
DS:SI -> zu summierende Speicheradresse
°
°
CX = 0000H
°
°
DX = Limit
°
°
Return: AL = Byte welches Limit überschreitet
°
°
CX = Bytes vor Erreichen des Limits
°
°
DX = Rest nach Addition des 1. Bytes in CX °
û----------------------------------------------------------À
° AL = 1EH Compare Filenames
°
°
DS:SI -> first ASCIIZ-Filename
°
°
ES:DI -> second ASCIIZ-Filename
°
°
Return: ZF = 1 Filenamen equivalent
°
°
0 Filenamen ungleich
°
û----------------------------------------------------------À
° AL = 1FH Build Current Directory Strukture
°
°
STACK: Wort mit dem Drive Buchstaben
°
°
Return: ES:DI -> Adresse Drive-Info-Block
°
°
Stack unchanged (nur intern in DOS benutzbar)
°
û----------------------------------------------------------À
° AL = 20H Get Job File Table Number Entry
°
°
BX = File Handle
°
°
Return: CF = 1 Fehler
°
°
AL = 6 (invalid File Handle)
°
°
CF = 0 o.k.
°
°
BYTE ES:DI = Job-File-Table-Entry-Number für
°
°
den übergebenen File Handle (FFH unbenutzt)
°
û----------------------------------------------------------À
° AL = 21H Canonicalize Filen Name
°
°
DS:SI File Name zum expandieren
°
°
ES:DI 128-Byte Ergebnisbuffer
°
°
Return: ---°
°
identisch zur Funktion 60H des INT 21
°
û----------------------------------------------------------À
° AL = 22H Set Extended Error Info
°
°
nur intern durch DOS nutzbar
°
û----------------------------------------------------------À
° AL = 23H Check if Character Device
°
°
nur intern durch DOS nutzbar
°
û----------------------------------------------------------À
° AL = 24H Delay
°
°
Verzögerungsschleife, intern in DOS nutzbar
°
û----------------------------------------------------------À
° AL = 25H Get Length of ASCIIZ-String
°
°
DS:SI -> Adresse ASCIIZ-String
°
°
Return: CX = Stringlänge
°
û----------------------------------------------------------À
° AL = 26H Open File (ab DOS 3.3 intern)
°
° AL = 27H Close File (ab DOS 3.3 intern)
°
° AL = 28H Move File Pointer (ab DOS 3.3 intern)
°
° AL = 29H Read From File (ab DOS 3.3 intern)
°
û----------------------------------------------------------À
° AL = 2AH Set Fastopen Entry Point
°
°
BX = (DOS 4.x) Entry Point to set (0001H or 0002H) °
°
DS:SI -> FASTOPEN Entry Point
°
°
Return: CF = 1 Entry Point bereits gesetzt
°
û----------------------------------------------------------À
° AL = 2BH IOCTL (ab DOS 3.3 intern)
°
° wirkt wie INT 21, Funktion 44H, läßt sich aber nur
°
° intern in DOS aufrufen.
°
û----------------------------------------------------------À
° AL = 2CH Get Device Chain
°
°
Return: BX:AX -> Header des 2. Device Driver in der °
°
Treiber Kette (NUL ist der 1. Treiber)
°
û----------------------------------------------------------À
° AL = 2DH Get Extended Error Code (ab DOS 3.3)
°
°
Return: AX -> Extended Error Code
°
û----------------------------------------------------------À
° AL = 2EH Get/Set Error Table Adresses (ab DOS 4.0)
°
°
DL: Subfunktion
°
°
00H Get DOS Error Table
°
°
01H Set DOS Error Table
°
°
02H Get Parameter Error Table
°
°
03H Set Parameter Error Table
°
°
04H Get Critical Error Table
°
°
05H Set Critical Error Table
°
°
06H Get unknown Error Table
°
°
07H Set unknown Error Table
°
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
360
DOS Programmierhandbuch
361
°
08H Get Error Meesage Retriever
°
°
09H Set unknown Error Table
°
°
Die genaue Belegung ist allerdings nicht bekannt
°
û----------------------------------------------------------À
° AL = 2FH Set DOS Version Number to Return (ab DOS 4.0)
°
°
DX: DOS Versions Nummer (0000H = Original DOS°
°
Version zurückgeben)
°
Û----------------------------------------------------------ì
Die Unterfunktionen 2EH und 2FH sind erst ab DOS 4.x vorhanden. Mit der Funktion 2FH
läßt sich offenbar bereits ab DOS 4.0 festlegen, welche Versionsnummer das
Betriebssystem zurückgibt.
5.10 Set Disk Interrupt Handler (AH = 13H, ab DOS 3.3)
Das Programm IO.SYS fängt den INT 13 des BIOS ab und setzt einige Filterfunktionen ein
(z.B. Überwachung auf Diskettenwechsel, Aufzeichnung der Formataufrufe, BIOSBugfixes, etc.).
Mit dieser Unterfunktion läßt sich der Vektor des INT 13 abfangen. In DS:DX ist die
Adresse des neuen Handlers für den INT 13 zu übergeben. In ES:BX wird die Adresse des
Vektors übergeben, die das System beim Warmstart wieder einsetzen muß.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 13H (Set DISK Int-Handler
°
° DS:DX Adresse Handler
°
° ES:BX Adresse Buffer
°
û---------------------------------À
°
RETURN
°
° ---°
Û---------------------------------ì
Nach dem Aufruf enthalten DS:DX und ES:BX die Werte, die beim vorherigen Aufruf
gesetzt wurden. Dies ist eine recht gefährliche Sicherheitslücke in DOS, da einige Viren
sich dadurch die Original ROM-Einsprungpunkte des INT 13 abrufen können und dadurch
Schutzsoftware umgehen.
5.11 Kommunikation with NLSFUNC.COM (AH = 14H)
Mit dem Aufruf läßt sich mit dem Programm NLSFUNC.COM ab DOS 3.3
kommunizieren.
5.11.1 Get Installation Status (AL = 00H)
Mit dieser Unterfunktion läßt sich feststellen, ob NLSFUNC resident geladen ist.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
362
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 14H (NLSFUNC)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Der zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Programmes.
·
Falls AL = 0 ist, dann ist der residente Teil von NLSFUNC nicht vorhanden und kann
installiert werden.
·
Falls AL = 1 ist, dann ist der residente Teil von NLSFUNC nicht vorhanden, er läßt
sich aber auch nicht installieren.
·
Falls AL = FFH ist, dann ist der residente Teil von NLSFUNC installiert.
NLSFUNC übernimmt ab DOS 3.3 die länderspezifische Anpassung. Die folgende Tabelle
gibt einen groben Überblick über die wichtigsten Funktionsaufrufe. Viele dieser Aufruf
stehen nur intern für DOS zur Verfügung.
Ö----------------------------------------------------------Ì
°
AH = 14H (NLSFUNC.COM)
°
Û----------------------------------------------------------ì
Ö----------------------------------------------------------Ì
° AL = 00H Installation Check
°
û----------------------------------------------------------À
° AL = 01H Change Code Page
°
° AL = 02H Get Country Info
°
° AL = 03H Set Country Info
°
° AL = 04H Get Country Info
°
°
BX: Code Page
°
°
DX: Country Code
°
°
DS:SI Adresse Code Page Struktur
°
°
ES:DI Adresse User Puffer (nur AL = 02,04)
°
°
BP:
Subcode wie INT 21, AH=65H (nur AL=02)
°
°
Return: AL: Status (00 = ok, sonst Errorcode)
°
Û----------------------------------------------------------ì
Die Struktur des Code-Page-Puffers ist versionsabhängig und wird hier nicht aufgeführt, da
die Funktion für Anwendungsprogramme nicht relevant ist.
5.12 Kommunikation with CD-ROM/Graphics (AH = 15H)
Über diese INT 2F-Funktion wird die Kommunikation mit dem CD-ROM-Treiber und in
DOS 4.0 mit dem Programm GRAHICS.COM abgewickelt.
5.12.1 GRAPHICS Get Installation Status (AL = 00H)
Bis DOS 3.31 besaß das Programm GRAPHICS keine Überprüfung des Installationsstatus.
Deshalb konnte der Code mehrfach geladen werden. In DOS 4.0 wurde der
Installationscheck für GRAPHICS.COM auf den INT 2F mit der Funktion 1500H gelegt.
Damit wird diese Unterfunktion doppelt benutzt, da auch die CD-ROM-Extension mit
dieser Funktion arbeitet (siehe unten). Die Installationsabfrage erfolgt mit folgenden
Parametern.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
363
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 15H (GRAPHICS)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AX: FFFFH
°
Û---------------------------------ì
Der Aufruf gerät mit dem Installationscheck der CD-ROM-Erweiterung in Konflikt.
Deshalb wurde die Statusabfrage des GRAPHICS-Treibers ab der DOS-Version 4.01 auf
die Funktion AC00H des INT 2F verlegt.
5.12.2 Kommunikation with CD-ROM (AL = 00H)
Über diese Gruppe von Funktionen wird ebenfalls die Kommunikation mit dem MicrosoftCD-ROM-Treiber abgewickelt. Für den Installationscheck besitzt der Treiber folgende
Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 15H (CD-ROM)
°
° AL: 00H Get Installationsstatus °
° BX: 0000H
°
û---------------------------------À
°
RETURN
°
° BX: Zahl der CD-ROM Drives
°
° CX: Starting Driveletter
°
Û---------------------------------ì
Der Aufruf folgt nicht den üblichen DOS-INT-2F-Konventionen. Im Register BX wird die
Zahl der benutzten CD-ROM-Laufwerke zurückgegeben. CX hält das Zeichen für das
Laufwerk, von dem gestartet wurde (0 = A:).
Die CD-ROM-Treiber bieten weitere Unterfunktionen, die kurz in folgender Tabelle
aufgeführt sind.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Ö-------------------------------------------------------Ì
°
AH = 15H CD-ROM-Treiber
°
Û-------------------------------------------------------ì
Ö-------------------------------------------------------Ì
° AL = 0 Get Installation Status
°
û-------------------------------------------------------À
° AL = 01H CD-ROM Get Drive-Device-List
°
°
ES:BX -> Buffer für die Drive Letter Liste
°
°
Return: Buffer mit den Daten
°
° Für jedes Laufwerk sind 5 Byte in der Liste erforder- °
° lich (1 Byte : Subunit Nummer im Treiber, 1 DWORD
°
° Adresse Device Driver Header)
°
û-------------------------------------------------------À
° AL = 02H CD-ROM Get Copyright File Name
°
°
ES:BX -> 38-Byte Buffer (Name Copyright File)
°
°
CX = Drive Nummer (0=A:)
°
°
Return: CF = 1 Drive kein CR-ROM
°
°
AX = 15 (invalid Drive)
°
û-------------------------------------------------------À
° AL = 03H CD-ROM Get abstract File Name
°
°
ES:BX -> 38-Byte Buffer (abstract File Name)
°
°
CX = Drive Nummer (0=A:)
°
°
Return: CF = 1 Drive kein CR-ROM
°
°
AX = 15 (invalid Drive)
°
û-------------------------------------------------------À
° AL = 04H CD-ROM Get bibliographic Doc File Name
°
°
ES:BX -> 38-Byte Buffer (bibl. Doc File Name)
°
°
CX = Drive Nummer (0=A:)
°
°
Return: CF = 1 Drive kein CR-ROM
°
°
AX = 15 (invalid Drive)
°
û-------------------------------------------------------À
° AL = 05H CD-ROM Read VTOC
°
°
ES:BX -> 2048-Byte Buffer
°
°
CX = Drive Nummer (0=A:)
°
°
DX = Sektor Index (0 first vol descriptor, 1=..) °
°
Return: CF = 1 Drive kein CR-ROM
°
°
AX = 15 (invalid Drive)
°
°
AX = 21 (Drive not ready)
°
°
CF = 0 ok
°
°
AX = Volume descriptor (1=Standard,
°
°
FFH=Standard,00=other)
°
û-------------------------------------------------------À
° AL = 06H CD-ROM Turn Debugging ON
°
°
BX = Debug enable
°
° (reserviert für Entwicklungszwecke)
°
û-------------------------------------------------------À
° AL = 07H CD-ROM Turn Debugging OFF
°
°
BX = Debug disable
°
° (reserviert für Entwicklungszwecke)
°
û-------------------------------------------------------À
° AL = 08H CD-ROM Absolute Disk Read
°
°
ES:BX -> Buffer
°
°
CX = Drive Nummer (0=A:)
°
°
SI:DI = Start Sector Nummer
°
°
DX = Sektor Zahl zu lesen
°
°
Return: CF = 1 Fehler
°
°
AX = 15 (invalid Drive)
°
°
AX = 21 (Drive not ready)
°
Û-------------------------------------------------------ì
Ö-------------------------------------------------------Ì
° AL = 09H CD-ROM Absolute Disk Write
°
°
ES:BX -> Buffer
°
°
CX = Drive Nummer (0=A:)
°
°
SI:DI = Start Sector Nummer
°
°
DX = Sektor Zahl zu schreiben
°
°
Return: CF = 1 Fehler
°
°
AX = 15 (invalid Drive)
°
°
AX = 21 (Drive not ready)
°
û-------------------------------------------------------À
° AL = 0AH reserviert
°
û-------------------------------------------------------À
° AL = 0BH CD-ROM (2.0) Drive Check
°
°
CX = Drive Nummer (0=A:)
°
°
Return: BX = ADADH falls MSCDEX.EXE geladen
°
°
AX = 0000H Drive nicht supported
°
°
AX = <> 0 Drive supported
°
û-------------------------------------------------------À
° AL = 0CH CD-ROM (2.0) MSCDEX Version
°
°
Return: BH = Hauptversion
°
°
BL = Unterversion
°
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
364
DOS Programmierhandbuch
° MSCDEX Versionen vor 1.02 geben BX=0 zurück
°
û-------------------------------------------------------À
° AL = 0DH CD-ROM (2.0) Get Drive Letters
°
°
ES:BX -> Buffer für Drive Letter List
°
°
Return: --°
° In der Liste wird für jedes Drive ein Byte eingetra- °
° gen (0 = A:, etc.)
°
û-------------------------------------------------------À
° AL = 0EH CD-ROM Get/Set Volume Descriptor Preference °
°
CX = Drive Nummer
(2.0)
°
°
BX = Subfunktion
°
°
00H Get Preference
°
°
DX = 00H
°
°
Return: DX = Preference Settings
°
°
01H Set Preference
°
°
DH =
Volume Descriptor Preference
°
°
01H = Primary Volume Descriptor
°
°
02H = Supplementary Volume Descriptor
°
°
DL = Supplementary Volume Descript. Preference °
°
01H = shift-Kanji
°
°
01H = Primary Volume Descriptor
°
°
Return: CF = 1 Fehler
°
°
AX = (15=invalid Drive,1=invalid Function)
°
û-------------------------------------------------------À
° AL = 0FH CD-ROM (2.0) Directory Entry
°
°
CX = Drive Number (0=A:)
°
°
ES:BX -> ASCIIZ-Path-Name
°
°
SI:DI -> 255-Byte Buffer for Directory Entry
°
°
Return: CF = 1 Fehler
°
°
AX = Fehlercode
°
°
CF = 0 ok
°
°
AX = Disk Format
°
°
(0=High Sierra, 1=ISO 9669)
°
û - - - - - -- - - - - - - - - - - - - - - - - - - - -- À
°
Format der Directory Einträge:
°
°
°
° Offs. Byte
Bedeutung
°
° 00H
1
Länge des Directory Eintrags
°
° 01H
1
Länge des XAR in LBN's (?)
°
° 02H
4
LBN of data, Intel (little-endian) Format °
° 06H
4
LBN of data, Motorola (big-endian) Format °
° 0AH
4
Filelänge im Intel Format
°
° 0EH
4
Filelänge im Motorola Format
°
°
°
Û-------------------------------------------------------ì
Ö-------------------------------------------------------Ì
°
---High Sierra--°
°
°
° 12H
6
Datum und Zeit
°
° 18H
1
Bit Flags
°
° 19H
1
reserviert
°
°
°
°
---ISO 9660--°
°
°
° 12H
7
Datum und Zeit
°
° 19H
1
Bit Flags
°
°
°
°
---beide Formate--°
°
°
° 1AH
1
Interleave Faktor
°
° 1BH
1
Interleave skip Faktor
°
° 1CH
2
Volume set sequence number, Intel Format
°
° 1EH
2
Volume set sequence number, Motorola Format°
° 20H
1
Länge des Filenamens
°
° 21H
N
Bytes Filename
°
°
1
(optional) padding if Filename odd Length °
°
N
Bytes System Data
°
°
°
û-------------------------------------------------------À
° AL = 10H CD-ROM (2.0) Send Device Driver Request
°
°
CX = CD-ROM Drive Letter (0 = A, 1 = B, etc)
°
°
ES:BX -> CD-ROM Device Driver Request Header
°
°
Return : --°
°
°
°
Format des Device Driver Request Header:
°
°
°
° Offs. Byte Beschreibung
°
°
°
° 00H
1 Länge des Request Headers
°
° 01H
1 Subunit within Device Driver
°
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
365
DOS Programmierhandbuch
366
° 02H
1 Kommando Code
°
°
00H INIT
°
°
01H MEDIA CHECK (Block Devices)
°
°
02H BUILD BPB (Block Devices)
°
°
03H IOCTL INPUT
°
°
04H INPUT
°
°
05H NONDESTRUCTIVE INPUT, NO WAIT
°
°
06H INPUT STATUS
°
°
07H INPUT FLUSH
°
°
08H OUTPUT
°
°
09H OUTPUT WITH VERIFY
°
°
0AH OUTPUT STATUS
°
°
0BH OUTPUT FLUSH
°
°
0CH IOCTL OUTPUT
°
°
0DH (DOS 3.x) DEVICE OPEN
°
°
0EH (DOS 3.x) DEVICE CLOSE
°
°
0FH (DOS 3.x) REMOVABLE MEDIA (block devices)°
°
10H (DOS 3.x) OUTPUT UNTIL BUSY
°
°
11H - 12H reserviert
°
°
13H (ab DOS 3.2) GENERIC IOCTL
°
°
14H - 16H reserviert
°
°
17H (DOS 3.2+) GET LOGICAL DEVICE
°
°
18H (DOS 3.2+) SET LOGICAL DEVICE
°
°
80H (CD-ROM) READ LONG
°
°
81H (CD-ROM) reserved
°
°
82H (CD-ROM) READ LONG PREFETCH
°
°
83H (CD-ROM) SEEK
°
°
84H (CD-ROM) PLAY AUDIO
°
°
85H (CD-ROM) STOP AUDIO
°
Û-------------------------------------------------------ì
Ö-------------------------------------------------------Ì
°
86H (CD-ROM) WRITE LONG
°
°
87H (CD-ROM) WRITE LONG VERIFY
°
°
88H (CD-ROM) RESUME AUDIO
°
°
°
° 03H
1 Status (gesetzt durch Device Driver)
°
°
Bit 15: Error
°
°
Bit 9: Busy
°
°
Bit 8: Done
°
°
Bits 7-0: Error Code falls Bit 15 = 1
°
°
00H Write-Protect violation
°
°
01H unbekannte Unit
°
°
02H Drive not ready
°
°
03H unbekanntes Kommando
°
°
04H CRC-Error
°
°
05H bad Drive Request Struktur Länge
°
°
06H Seek-Error
°
°
07H unbekanntes Media
°
°
08H Sektor nicht gefunden
°
°
09H Printer out of Paper
°
°
0AH Write fault
°
°
0BH Read fault
°
°
0CH General failure
°
°
0DH reserved
°
°
0EH reserved
°
°
0FH invalid Disk change
°
° 05H
8 reserviert
°
° 0DH
Zusatzinformationen beginnen hier
°
Û-------------------------------------------------------ì
5.13 Kommunikation with WINDOWS, DOS, DPMI (AH =
16H)
Die Funktion 16xxH des INT 2F wird von mehreren Programmen belegt. Einmal wickelt
WINDOWS einige Kommunikationsfunktionen über diese Multiplexerfunktion ab.
Weiterhin belegt das DOS-Protected-Mode-Interface (DPMI) Subfunktionen des INT 2F
mit dem Code 16XXH. Zuletzt wurde mit DOS 5.0 die Kommunikation mit dem
TaskSwitcher auf diese Funktion gelegt. Nachfolgend möchte ich auf die einzelnen
Schnittstellen eingehen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
367
5.13.1 WINDOWS Enhanced Mode Install Check (AX = 1600H)
Über diesen Funktionsaufruf läßt sich in Windows von DOS-Applikationen prüfen,
welcher Mode eingeschaltet ist. Es gilt dabei folgende Schnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (WINDOWS)
°
° AL: 00H Get Mode
°
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Nach dem Aufruf enthält das Register AL einen Statuscode, der den Windows-Mode
spezifiziert. Hierfür gilt folgende Kodierung:
AL
AL
AL
AL
AL
=
=
=
=
=
00H WINDOWS 3.x Enhanced Mode oder Windows/386 läuft nicht
80H WINDOWS 3.x Enhanced Mode oder Windows/386 läuft nicht
01H WINDOWS/386 2.x läuft
FFH WINDOWS/386 2.x läuft
sonst ->
AL WINDOWS Hauptversion (>= 3)
AH WINDOWS Unterversion
Mit diesem API-Aufruf kann aus einem DOS-Programm heraus ermittelt werden, in
welchem Mode WINDOWS arbeitet. Der Aufruf ist auch im WINDOWS 286-DOSExtender implementiert.
5.13.2 WINDOWS/386 2.x Get API Entry Point (AX = 1602H)
Über diesen Funktionsaufruf läßt sich in Windows/386 2.x der Eintrittspunkt für das API
ermitteln. Es gilt dabei folgende Schnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (WINDOWS)
°
° AL: 02H Get API Entry
°
û---------------------------------À
°
RETURN
°
° ES:DI Entry Point
°
Û---------------------------------ì
Nach dem Aufruf enthält das Registerpaar ES:DI die Adresse der API-Eintrittsroutine. Der
Aufruf wird in Windows 3.x aus Kompatibilitätsgründen noch unterstützt. Wird zu der
Adresse in ES:DI mit AX = 0000 und ES:DI = RETURN-Adresse per JMP FAR verzweigt,
enthält BX nach dem Aufruf die ID-Nummer der aktuellen virtuellen Maschine.
5.13.3 WINDOWS Enhanced Mode Broadcast (AX = 1605H)
Über diesen Funktionsaufruf wird beim Eintritt in den WINDOWS 3.0 Enhanced Mode
oder beim Start des Microsoft DOS 286-Extenders ein Broadcast an alle TSR-Programme
und DOS-Treiber abgesetzt. Es gilt dabei folgende Schnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
368
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (WINDOWS)
°
° AL: 05H (Broadcast)
°
° CX: 0000H
°
° DX: Flags
°
° ES:BX 0000:0000
°
° DS:SI 0000:0000
°
° DI: Versionsnummer
°
û---------------------------------À
°
RETURN
°
° CX: 0 ok to load
°
°
<> 0 not load
°
Û---------------------------------ì
Vor dem Aufruf sind die Register ES:BX, DS:SI und CX mit den Werten 0000H zu laden.
In DI wird die Versionsnummer (Hauptversion im oberen Byte, Unterversion im unteren
Byte) übergeben. Das Register DX fungiert als Flag, welches signalisiert, ob der Aufruf
durch WINDOWS oder den DOS-Extender ausgelöst wurde. DX besitzt dabei folgende
Kodierung:
DX Bit 0: 1 MS-286-DOS-Extender Initialisierung
0 MS-WINDOWS Enhanced-Mode Initialisierung
Bit 1-15: reserviert
Der WINDOWS Enhanced-Mode-Lader, sowie der MS-DOS-286-Extender aktivieren bei
der Initialisierung die Funktion 1605H des INT 2F. Auch der DOS 5.0 TaskSwitcher führt
einen solchen Aufruf aus. DOS-Einheitentreiber oder TSR-Programme können den
Funktionsaufruf überwachen und gegebenenfalls geeignete Werte an den rufenden Prozess
zurückgeben. Das Register CX dient dabei als Flag. Wird ein Wert CX <> 0
zurückgegeben, signalisiert dies dem rufenden Prozess, daß WINDOWS nicht im
Enhanced Mode geladen werden kann. Es ist dann Aufgabe des jeweiligen Treibers eine
geeignete Fehlermeldung auszugeben, die erklärt, warum WINDOWS nicht geladen
werden kann. Wird dagegen CX=0 zurückgegeben, kann sich Windows installieren. Jeder
Handler in der Kette der INT 2F Funktion 1605H muß nach dem Aufruf sofort die
Kontrolle an den nächsten Handler in der Kette übergeben. Die Register dürfen dabei nicht
verändert werden. Erst nachdem der Handler die Kontrolle zurückerlangt, kann er Werte an
den rufenden Prozess zurückgeben. Benötigt der Handler lokale Daten auf einer VM-Basis,
muß dies dem rufenden Prozess mitgeteilt werden. Hierzu dienen die beiden Zeiger ES:BX
und DS:SI. In ES:BX wird die Adresse einer Startup-Info-Struktur geführt. Diese Struktur
besitzt folgenden Aufbau.
Offset Bytes Bemerkung
00H
2
Haupt- und Unterversion der Info-Struktur
02H
4
Zeiger auf Next-Startup-Info-Struktur
oder der Wert 0000:0000
06H
4
Zeiger auf den ASCIIZ-Namen des Virtual Device
File oder 0000:0000
0AH
4
Adresse Virtual-Device-Reference Data
0EH
4
Zeiger auf den Instance-Data-Record oder
0000:0000
Für jeden Eintrag im Instance Data Record ist folgende Struktur vorzusehen:
Offset Bytes Bemerkung
00
4
Zeiger auf die eigentlichen Instance Daten (oder 0:0)
04
2
Länge des Instance Datenbereiches
Benötigt ein Handler lokale Daten, muß er den vom vorhergehenden Handler in ES:BX
übergebenen Vektor in der eigenen Startup Info Struktur im Feld Next-Startup-Info-
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
369
Strukture ablegen. Dann wird in ES:BX die Adresse der eigenen Startup-Info-Struktur
eingetragen.
In DS:SI kann die Adresse der Virtual86-Mode enable/disable Callback-Funktion
hinterlegt werden. Ein residentes Programm kann den V86-Mode enable/disable Vektor in
DS:SI mit einem Wert belegen. Dann ist in CX ein Wert <> 0 zurückzugeben, damit die
Installation von WINDOWS oder des Extenders abgebrochen wird.
Die V86-Mode enable/disable Prozedur wird mit folgenden Parametern aufgerufen:
AX= 0000H disable V86-Mode
0001H enable V86-Mode
Weiterhin ist beim Aufruf das Interruptsystem gesperrt. Bei einem Fehler ist nach dem
Aufruf das Carry-Flag gesetzt.
5.13.4 WINDOWS Enhanced Mode und 286-DOS-Extender Exit
Broadcast (AX = 1606H)
Über diesen Funktionsaufruf wird beim Eintritt in den WINDOWS 3.0 Enhanced Mode
oder beim Start des Microsoft DOS-286-Extenders ein Broadcast beendet, falls der Aufruf
1605H mit CX <> 0 quittiert wird.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (WINDOWS)
°
° AL: 06H (Exit Broadcast)
°
° DX: Flags
°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Für das Flag in DX gilt die gleiche Kodierung wie bei der Funktion 1605H.
Dieser Aufruf wird noch im Real-Mode ausgeführt. Das System schaltet dann nicht in den
Enhanced- oder Extendermode um.
5.13.5 WINDOWS Virtual Device Call out API (AX = 1607H)
Dieser Funktionsaufruf bietet einen Mechanismus für virtuelle Geräte im WINDOWS
Enhanced Mode mit DOS Einheitentreibern zu kommunizieren.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (WINDOWS)
°
° AL: 07H (VD Call out API)
°
° BX: Virtual Device ID
°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Beim Aufruf ist in BX die ID-Nummer der virtuellen Einheit zu übergeben (siehe Funktion
1684H).
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
370
5.13.6 WINDOWS Enhanced Mode Init complete Broadcast (AX =
1608H)
Dieser Funktionsaufruf wird aktiviert, nachdem alle installierbaren Einheiten initialisiert
wurden.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (WINDOWS)
°
° AL: 08H (Complete Braoadcast)
°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Real-Mode Software kann nur zwischen dem Aufruf AX = 1605H und dem Aufruf AX =
1608H aktiviert werden. Treiber müssen bei der Initialisierung den Aufruf AX = 1608H
überwachen.
5.13.7 WINDOWS Enhanced Mode Begin Exit Broadcast (AX = 1609H)
Dieser Funktionsaufruf wird aktiviert, sobald der WINDOWS Enhanced Mode verlassen
werden soll.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (WINDOWS)
°
° AL: 09H (Exit Braoadcast)
°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Der Aufruf wird nur beim Beginn einer normalen Exit-Sequenz aktiviert. Bei einem
Fehler-Exit unterbleibt dieser Aufruf.
5.13.8 Idle Call / Release Current VM Time Slice (AX = 1680H)
Dieser Funktionsaufruf wird von WINDOWS 3.x, von DOS 5.0, von DPMI 1.0 und von
OS/2 2.0 unterstützt. Hauptaufgabe ist es, dem Betriebssystem mitzuteilen, daß der aktuelle
Prozeß keine Rechenzeit mehr benötigt. Hierbei gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (Idle Call)
°
° AL: 80H
°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Ab MS-DOS 5.0 wird der Aufruf beim Warten auf Zeicheneingaben permanent ausgelöst.
Dadurch können TSR-Programme die Funktion abfangen und so feststellen, wann DOS
nicht beschäftigt ist. Microsoft empfiehlt, diesen Funktionaufruf als Ersatz für den INT 28
zu nutzen.
Unter WINDOWS 3.x kann ein Programm diesen Aufruf benutzen, um die Kontrolle
wieder an das Betriebssystem zurückzugeben. Ein Aufruf blockiert dabei das Programm
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
371
nicht. Vielmehr wird der Rest der Zeitscheibe an das Betriebssystem zurückgegeben und
kann anderen Prozessen zugeteilt werden.
5.13.9 WINDOWS 3.x Begin Critical Section (AX = 1681H)
Dieser Funktionsaufruf wird von WINDOWS 3.x unterstützt. Hauptaufgabe ist es, dem
Betriebssystem mitzuteilen, daß der aktuelle Prozeß in eine kritische Phase eintritt und
nicht unterbrochen werden kann. Hierbei gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (WINDOWS)
°
° AL: 81H (Begin Critical Section)°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Nach dieser Funktion sollte so schnell als möglich die Funktion AX = 1602H abgesetzt
werden, da sonst das Betriebssystem blockiert werden kann.
Die Funktion erhöht vermutlich das InDOS-Flag um 1 und wird erst ab WINDOWS 3.0
unterstützt.
5.13.10 WINDOWS 3.x End Critical Section (AX = 1682H)
Dieser Funktionsaufruf wird von WINDOWS 3.x unterstützt. Hauptaufgabe ist es, dem
Betriebssystem mitzuteilen, daß der aktuelle Prozeß die kritische Phase beendet hat und
wieder unterbrochen werden kann. Hierbei gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (WINDOWS)
°
° AL: 82H (End Critical Section) °
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Mit dieser Funktion wird vermutlich das InDOS-Flag um 1 erniedrigt. Der Aufruf wird erst
ab WINDOWS 3.0 unterstützt.
5.13.11 WINDOWS 3.x Get Current Virtual Maschine ID (AX = 1683H)
Dieser Funktionsaufruf wird von WINDOWS 3.x unterstützt. Hauptaufgabe ist es, die IDNummer der aktuellen virtuellen Maschine abzufragen. Hierbei gilt folgende
Aufrufschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
372
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (WINDOWS)
°
° AL: 83H (Get VM ID)
°
û---------------------------------À
°
RETURN
°
° BX: VM ID
°
Û---------------------------------ì
WINDOWS selbst läuft in der VM 1. Eine VM 0 wird nicht zurückgegeben. Die
Bedeutung der Nummern für die virtuellen Maschinen ist der folgenden Funktion zu
entnehmen.
5.13.12 WINDOWS 3.x Get Device API Entry Point (AX = 1684H)
Dieser Funktionsaufruf wird von WINDOWS 3.x unterstützt. Hauptaufgabe ist es, die
Einsprungpunkte der aktuellen virtuellen Maschine abzufragen. Hierbei gilt folgende
Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (WINDOWS)
°
° AL: 84H (Get VM Entry Point)
°
° BX: VM ID
°
° ES:DI Entry Point
°
û---------------------------------À
°
RETURN
°
Û---------------------------------ì
Nach dem Aufruf findet sich im Registerpaar ES:DI die Adresse der entsprechenden
Routine für die Einheit. Der Wert 0000:0000 signalisiert, daß die betreffende Einheit kein
API unterstützt. Nur einige der WINDOWS Enhanced Mode Virtual Devices unterstützen
solche API's.
Für die Virtual Device ID (VxD) gelten folgende Codes:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Code
01H
02H
03H
04H
05H
06H
07H
08H
09H
0AH
0BH
0CH
0DH
0EH
0FH
10H
11H
12H
13H
14H
15H
16H
17H
18H
19H
1AH
1BH
1CH
1DH
1EH
373
VxD Einheit
VMM
Virtual Machine Manager
Debug
VPICD
Virtual Prog. Interrupt Controller
Device
VDMAD
Virtual DMA Device
VTD
Virtual Timer Device
V86MMGR
Virtual 8086 Mode Device
PAGESWAP
Paging Device
Parity
Reboot
VDD
Virtual Display Device (Grabber)
VSD
Virtual Sound Device
VMD
Virtual Mouse Device
VKD
Virtual Keyboard Device
VCD
Virtual COMM Device
VPD
Virtual Printer Device
VHD
Virtual Hard Disk Device
VMCPD
EBIOS
Erweitertes BIOS (PS/2)
BIOSXLAT
Map ROM BIOS API (V86 -> Prot. Mode)
VNETBIOS
Virtual NetBIOS Device
DOSMMGR
WINLOAD
SHELL
VMPoll
VPROD
DOSNET
VFD
Virtual Floppy Device
VDD2
2. Display Adapter
WINDEBUG
TSRLOAD
Die VxD ID-Codes sind dabei nach dem folgenden Schema angelegt: Das oberste Bit ist
reserviert. Die folgenden 10 Bit bilden die (von Microsoft vergebenen) OEM-Nummer.
Lediglich die unteren 5 Bit erlauben 32 unterschiedliche Einheiten zu adressieren.
5.13.13 WINDOWS Switch VM and Callback (AX = 1685H)
Dieser Funktionsaufruf wird von WINDOWS unterstützt um einzelnen DOS-Einheiten den
Aufruf von Funktionen in einzelnen VM-Einheiten zu ermöglichen. Es gilt folgende
Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (WINDOWS)
°
° AL: 85H (Switch VM an Callback) °
° BX: VM ID
°
° CX: Flags
°
° DX:SI Priorität
°
° ES:DI FAR Callback Proc.
°
û---------------------------------À
°
RETURN
°
° CY: 1 -> Fehler
°
° AX: Fehlercode
°
° CF: 0 -> ok
°
Û---------------------------------ì
Einige DOS-Einheiten, z.B. Netzwerktreiber, müssen Funktionen in spezifischen virtuellen
Maschinen aufrufen. Dies erfolgt über diese Funktion den INT 2FH.
Beim Aufruf ist in BX die ID-Nummer der virtuellen Maschine zu übergeben, zu der
geschaltet werden soll. In CX wird ein Flag mit folgender Kodierung übergeben:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
374
CX : Bit 0 : Wait until Interrupts enabled
1 : Wait until critical Section unowned
2-15 : reserviert
Im Registerpaar DX:SI ist die Priorität (priority boost) zu übergeben. ES:DI enthält einen
Zeiger auf die FAR Callback Prozedur.
Ist nach dem Aufruf das Carry-Flag gesetzt, liegt ein Fehler vor. AX enthält folgende
Fehlercodes:
AX = 01H invalid VM ID
02H invalid priority boost
03H invalid Flags
Bei gelöschtem Carry-Flag wurde der Aufruf erfolgreich ausgeführt. Die Call-BackFunktion muß alle Register sichern und mit IRET beendet werden.
5.13.14 DOS-DPMI Detect Mode (AX = 1686H)
Dieser Funktionsaufruf wird vom DOS-Protected-Mode-Interface (DPMI) zur Abfrage des
Modes zur Verfügung gestellt. Es gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (DPMI)
°
° AL: 86H (Detect Mode)
°
û---------------------------------À
°
RETURN
°
° AX: Mode
°
Û---------------------------------ì
Ein Programm kann die Funktion aufrufen. Nach dem Aufruf enthält das Register AX den
Status des Prozessors:
AX = 0000H die CPU arbeitet im Protected Mode und
die DPMI-Funktionen stehen unter dem
INT 31 zur Verfügung.
<> 0
die CPU befindet sich im REAL- oder im
V86-Mode, b.z.w. der INT 31 ist nicht
verfügbar.
Ergänzend ist die nachfolgend beschriebene Funktion AX = 1687H zur Abfrage des DPMIStatus zu nutzen.
5.13.15 DOS-DPMI Installation Check (AX = 1687H)
Dieser Funktionsaufruf wird vom DOS-Protected-Mode-Interface (DPMI) zur Abfrage des
Installationstatus zur Verfügung gestellt. Es gilt folgende Aufrufschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
375
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (DPMI)
°
° AL: 87H (Installation Check)
°
û---------------------------------À
°
RETURN
°
° AX: Status
°
° BX: Flags
°
° CL: Prozessor
°
° DH: DPMI-Hauptversion
°
° DL: DPMI-Unterversion
°
° SI: Datengröße
°
° ES:DI DPMI Entry Point
°
Û---------------------------------ì
Ein Programm kann über die Funktion prüfen, ob der DPMI-Treiber installiert wurde. Nur
falls AX = 0000H zurückgegeben wird, ist das DPMI aktiv. Dann enthalten die restlichen
Register zusätzliche Informationen.
In BX wird ein Flag zurückgegeben, welches signalisiert, ob das DPMI 32-Bit-Mode
Programme unterstützt.
BX: Bit 0: 1 = 32-Bit-Mode Programme werden unterstützt
Das Register CL enthält einen Wert, der den Typ des Prozessors decodiert:
CL: 02H = 80286
03H = 80386
04H = 80486
Das Register DX enthält die Versionsnummer des DPMI-Treibers. Zur Zeit existieren nur
die Versionen 0.9 und 1.0. In DL wird die Unterversion mit 2 Ziffern angegeben. SI enthält
die Zahl der Paragraphen (16-Byte-Blöcke), die der DOS-Extender als privater
Datenbereich reserviert hat. Im Registerpaar ES:DI wird die Einsprungadresse für den
DPMI Mode-Switch übergeben.
Mit einem Aufruf dieser Routine läßt sich der Prozessor in den Protected Mode schalten.
Hierfür gilt folgende Aufrufschnittstelle:
Ö------------------------------------------------------Ì
° AX = Flags
°
°
Bit 0 : 1 -> 32-Bit-Programm
°
° ES = Real Mode Segment in dem der Puffer für die
°
°
privaten Daten des DPMI abgelegt werden. Wird °
°
ignoriert, falls SI = 0 war.
°
°
°
° RETURN
°
°
°
° CY : 1 -> Error, Programm noch im Real-Mode
°
° AX: Fehlercode (DPMI 1.0)
°
°
8011H Zuweisung der Descriptoren nicht möglich °
°
8021H 32-Bit-Programm angegeben, aber der DPMI- °
°
Server unterstützt nur 16 Bit
°
° CY : 0 -> ok, Programm im Protected Mode
°
°
CS = 16-Bit-Selector des Real-Mode CS
°
°
SS = Selector des Real-Mode SS
°
°
DS = Selector des Real-Mode DS
°
°
ES = Selector zum PSP (100H Byte Limit)
°
°
FS = GS = 0, ESP High Word = 0 -> 32-Bit-Programm °
Û------------------------------------------------------ì
Nach einem erfolgreichen Aufruf ist die CPU im Protected Mode. Der Aufruf ist jeweils
nur einmal erforderlich.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
376
5.13.16 DOS-DPMI Get Vendor specific API Entry Point (AX = 168AH)
Dieser Funktionsaufruf wird vom DOS-Protected-Mode-Interface (DPMI) ab der Version
0.9 unterstützt und ist nur im Protected Mode verfügbar. Es gilt folgende
Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 16H (DPMI)
°
° AL: 8AH (Get Entry Point)
°
° DS:ESI Adresse Name
°
û---------------------------------À
°
RETURN
°
° AL: Status
°
°
00H -> OK
°
°
DS:ESI Entry Point
°
°
8AH -> Fehler
°
Û---------------------------------ì
Beim Aufruf ist in DS:SI (oder im 32-Bit-Mode in ESI) die Adresse auf den ASCIIZString mit dem Namen des Herstellers anzugeben. Nach dem Aufruf findet sich in AL der
Statuscode. Mit dem Wert 8AH wird ein Fehler beim Aufruf signalisiert.
Mit AL = 0 war der Aufruf erfolgreich und in ES:DI (oder EDI im 32-Bit-Mode) findet
sich die Adresse des Einsprungpunktes zu den erweiterten API-Routinen. Über den Namen
läßt sich der Einsprungpunkt selektieren. Dieser Aufruf ist ab DPMI 0.9 vorhanden, wurde
aber nicht dokumentiert, da herstellerspezifische Erweiterungen des DPMI-Handlers nicht
offengelegt werden. Eine ausführliche Beschreibung der DPMI-Schnittstelle findet sich im
Kapitel über die DOS-Speicherverwaltung.
5.14 WINDOWS WinOldAp-Schnittstelle (AH=17H)
Diese Gruppe von Funktionen wurde unter Windows 3.0 eingeführt um Applikationen zu
unterstützen, die nicht für die Version 3.0 geschrieben wurden. WinOldAp unterstützt alte
zeichenorientierte Applikationen, die DDE und Clipboard benutzen. Es existieren
verschiedene Subfunktionen, die nachfolgend beschrieben werden.
5.14.1 WinOldAp Identify WinOldAp Version (AX = 1700H)
Mit diesem Aufruf läßt sich prüfen, ob die Funktion unter dem INT 2F zur Verfügung
steht. Die Schnittstelle entspricht jedoch nicht den Konventionen des INT 2F.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 17H (WinOldAp)
°
° AL: 00H (Get Version)
°
û---------------------------------À
°
RETURN
°
° AX: Status
°
Û---------------------------------ì
Das Register AX enthält nach dem Aufruf den Status. Wird als Wert AX = 1700H
zurückgegeben, steht WinOldAP nicht zur Verfügung.
Enthält AX einen Wert ungleich 1700H ist dieser als Versionsnummer zu interpretieren:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
377
AL: WinOldAP Hauptversion (z.B. 02)
AH: WinOldAP Unterversion (z.B. 00)
Falls diese Funktion vorhanden ist, lassen sich auch die folgenden Subfunktionen aus einer
Applikation heraus aufrufen.
5.14.2 WinOldAp Open Clipboard (AX = 1701H)
Mit diesem Aufruf läßt das Clipboard öffnen.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 17H (WinOldAp)
°
° AL: 01H (Open Clipboard)
°
û---------------------------------À
°
RETURN
°
° AX: Status
°
Û---------------------------------ì
Das Register AX enthält nach dem Aufruf den Status. Wird als Wert AX = 0000H
zurückgegeben, ist das Clipboard bereits offen. Alle Werte ungleich 0 signalisieren, daß
der Aufruf erfolgreich war.
5.14.3 WinOldAp Empty Clipboard (AX = 1702H)
Mit diesem Aufruf läßt der Inhalt des Clipboards leeren.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 17H (WinOldAp)
°
° AL: 02H (Empty Clipboard)
°
û---------------------------------À
°
RETURN
°
° AX: Status
°
Û---------------------------------ì
Das Register AX enthält nach dem Aufruf den Status. Wird als Wert AX = 0000H
zurückgegeben, ist ein Fehler aufgetreten und das Clipboard wurde nicht gelöscht. Alle
Werte ungleich 0 signalisieren, daß der Aufruf erfolgreich war und die Daten im Clipboard
gelöscht wurden.
5.14.4 WinOldAp Set Clipboard Data (AX = 1703H)
Diese Funktion übergibt Daten von der Applikation an das Clipboard. Es gilt folgende
Schnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
378
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 17H (WinOldAp)
°
° AL: 03H (Empty Clipboard)
°
° DX: Format
°
° ES:BX Datenpuffer
°
° SI:CX Datengröße
°
û---------------------------------À
°
RETURN
°
° AX: Status
°
Û---------------------------------ì
Im Register DX ist ein Wert zwischen 1 und 7 einzugeben, der die Clipboard-Kodierung
der Daten spezifiziert. Für diesen Wert gilt:
Kodierung des Clipboard-Formates
DX = 01H:
02H:
03H:
04H:
05H:
06H:
07H:
Text
Bitmap
Metafile Picture
SYLK
DIF
TIFF
OEM-Text
Bei diesen Formaten handelt es sich um die Standard Clipboard-Formate von Windows.
Der Aufbau der Formate ist in /6,7/ beschrieben.
Die Daten müssen von der Applikation in der gesetzten Kodierung in einem Puffer
abgelegt werden. Die Adresse des Datenbereiches ist im Registerpaar ES:BX beim Aufruf
zu übergeben. Das Registerpaar SI:CX spezifiziert dabei die Länge des Datenbereiches in
Byte.
Das Register AX enthält nach dem Aufruf den Status. Wird als Wert AX = 0000H
zurückgegeben, ist ein Fehler aufgetreten und die Daten wurden nicht übertragen. Bei
einem Wert von AX <> 0 wurden die Daten aus dem Puffer in das Clipboard kopiert.
5.14.5 WinOldAp Get Clipboard Data Size (AX = 1704H)
Mit dieser Funktion kann eine Applikation ermitteln, ob Daten im Clipboard vorliegen.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 17H (WinOldAp)
°
° AL: 04H (Data Size)
°
° DX: Clipboard Format
°
û---------------------------------À
°
RETURN
°
° DX:AX Datengröße
°
Û---------------------------------ì
Im Register DX ist ein Wert zwischen 1 und 7 einzugeben, der die Clipboard-Kodierung
der Daten spezifiziert. Für diesen Wert gilt die bei AX = 1703H besprochene Kodierung.
Im Registerpaar DX:AX findet sich nach dem Aufruf die Länge des Datenbereiches des
Clipboards in Byte. Diese Länge umfaßt sowohl den Header als auch die Nutzdaten. Ist
DX:AX = 0, dann liegen keine Daten im angegebenen Format im Clipboard vor.
5.14.6 WinOldAp Get Clipboard Data (AX = 1705H)
Mit dieser Funktion kann eine Applikation Daten aus dem Clipboard abrufen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
379
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 17H (WinOldAp)
°
° AL: 05H (Get Data)
°
° DX: Clipboard Format
°
° ES:BX Datenpuffer
°
û---------------------------------À
°
RETURN
°
° AX: Status
°
Û---------------------------------ì
Im Register DX ist ein Wert zwischen 1 und 7 einzugeben, der die Clipboard-Kodierung
der Daten spezifiziert. Für diesen Wert gilt die bei AX = 1703H besprochene Kodierung.
Im Registerpaar ES:BX findet sich die Adresse des Puffers, in den die Funktion die Daten
des Clipboards kopieren soll. Dieser Puffer muß vom Anwenderprogramm angelegt
werden. Die Puffergröße läßt sich mit der Funktion 1704H ermitteln.
In AX wird nach dem Aufruf der Statuscode zurückgegeben:
AX = 0: Fehler beim Aufruf, keine Daten
<>0: Aufruf erfolgreich
Ist der Wert von AX ungleich 0, dann liegen im Puffer die Daten in der Formatierung des
Clipboards vor.
5.14.7 WinOldAp Close Clipboard (AX = 1708H)
Mit dieser Funktion kann eine Applikation das Clipboard schließen.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 17H (WinOldAp)
°
° AL: 08H (Close Clipboard)
°
û---------------------------------À
°
RETURN
°
° AX: Status
°
Û---------------------------------ì
In AX wird nach dem Aufruf der Statuscode zurückgegeben:
AX = 0: Fehler beim Aufruf, keine Daten
<>0: Clipboard geschlossen
Ist der Wert von AX ungleich 0, dann wurde das Clipboard geschlossen.
5.14.8 WinOldAp Compact Clipboard (AX = 1709H)
Mit dieser Funktion kann eine Applikation Daten aus dem Clipboard verdichten.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
380
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 17H (WinOldAp)
°
° AL: 09H (Compact Data)
°
° SI:CX Datenlänge
°
û---------------------------------À
°
RETURN
°
° DX:AX Länge
°
Û---------------------------------ì
Im Register SI:CX ist anzugeben, auf welche Größe das Clipboard zu verkleinern ist. Nach
dem Aufruf findet sich im Registerpaar DX:AX die Zahl der Bytes des größten freien
Speicherblocks.
5.14.9 WinOldAp Get Device Capabilities (AX = 170AH)
Mit dieser Funktion kann eine Applikation Daten über das Graphic Device Interface (GDI)
abfragen.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 17H (WinOldAp)
°
° AL: 0AH (Get Info)
°
° DX: GDI-Index
°
û---------------------------------À
°
RETURN
°
° AX: Flag
°
Û---------------------------------ì
Im Register DX ist ein Index für die gewünschte GDI-Information zu übergeben. Hierfüg
gilt folgende Kodierung:
DX =
00H
02H
04H
06H
08H
0AH
0CH
0EH
10H
12H
14H
16H
18H
1AH
1CH
1EH
20H
22H
24H
26H
28H
2AH
2CH
58H
5AH
GDI-Index
Device Driver Version
Device Classification
Width in mm
Height in mm
Width in Pixel
Height in Pixel
Bits per Pixel
Number of Bitplanes
Number of Brushes supported by Device
Number of Pens supported by Device
Number of Markers supported by Device
Number of Fonts supported by Device
Number of Colors
Size required for device descriptor
Curve Capabilities
Line Capabilities
Polygon Capabilities
Text Capabilities
Clipping Capabilities
BitBld Capabilities
X Aspect
Y Aspect
Length of Hypotenouse of Aspect
Logical Pixel per Inch of Widht
Logical Pixel per Inch of Height
Über den GDI-Index ermittelt die Funktion dann die Möglichkeiten und gibt den
betreffenden Wert im Register AX zurück. Der Wert in AX wird dabei teilweise als Bitflag
interpretiert. Es gilt folgende Kodierung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
381
AX bei Device Classification
00H Vector Plotter
01H Raster Display
02H Raster Printer
03H Raster Kamera
04H Character Stream
05H Metafile (VDM)
06H Display File
AX bei Curve
Bit 0: Circles
1: Pie
2: Arcs
3: Ellipses
4: Wide Lines
5: Styled Lines
6: Wide Styled Lines
7: Interiors
AX bei Line
Bit 1: Polylines
2: Markers
3: Polymarkers
4: Wide Lines
5: Styled Lines
6: Wide Styled Lines
7: Interiors
AX bei Polygon
Bit 0: Polygons
1: Rectangles
2: Trapezoides
3: Scanlines
4: Wide Boarders
5: Styled Boarders
6: Wide Styled Boarders
7: Interiors
AX bei Text
Bit 0: Output Precision Character
1: Output Precision Stroke
2: Clipping Precision Stroke
3: 90-Degree Char. Rotation
4: Arbitrary Char. Rotation
5: Indep. X and Y Scaling
6: Double Size
7: Integer Scaling
8: Continouous Scaling
9: Bold
10: Italic
11: Underline
12: Strikeout
13: Raster Font
14: Vector Font
15: reserviert
AX bei Clipping
00H: kein Clipping
01H: Clipping to Rectangle
AX bei Raster
Bit 0: Simple BitBLT
1: Device Requires Banding Support
2: Device Requires Scaling Support
3: Supports Bitmap > 64 Kbyte
Damit kann die Applikation auf die entsprechenden Möglichkeiten der Einheit reagieren.
5.15 Kommunikation with SHELL (AH = 19H)
Diese Funktion ist nur in DOS 4.X vorhanden und dient der Kommunikation mit der DOSShell. Es sind folgende Aufrufe bekannt:
5.15.1 Get Installation Status (AL = 00H)
Mit dieser Unterfunktion läßt sich feststellen, ob die Funktion SHELLB.COM resident
geladen ist.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
382
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 19H (SHELLB.COM)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Der zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Programmes.
·
Falls AL = 0 ist, dann ist der residente Teil von SHELLB nicht vorhanden und kann
installiert werden.
·
Falls AL = FFH ist, dann ist der residente Teil von SHELLB installiert.
SHELLB.COM ist ein Bestandteil der DOS 4.x Shell.
5.15.2 SHELLB.COM - SHELLC.EXE Interface (AL = 01H)
Auch diese Unterfunktion ist nur in DOS 4.x vorhanden. Es gilt folgende
Aufrufschnittstelle.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 19H (SHELLB.COM)
°
° AL: 01H SHELLB-SHELLC Interface °
° BL: 00H falls SHELLC transient °
°
01H falls SHELLC resident
°
° DS:DX FAR CALL Adresse SHELLC
°
û---------------------------------À
°
RETURN
°
° ES:DI Arbeitsbereich
°
Û---------------------------------ì
SHELLC.EXE läßt sich resident oder transient laden. Im Register BL ist ein
entsprechender Code zu übergeben, der zwischen den beiden Varianten unterscheidet. Im
Registerpaar DS:DX erwartet die Unterfunktion die Adresse des Eintrittspunktes (als FAR
CALL) für das Programm SHELLC.EXE. Nach dem Aufruf enthält das Registerpaar
ES:DI einen Zeiger auf den gemeinsamen Arbeitsbereich zwischen SHELLB.COM und
SHELLC.EXE.
5.15.3 SHELLB.COM - COMMAND.COM Interface (AL = 02H)
Es gilt folgende Aufrufschnittstelle.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 19H (SHELLB.COM)
°
° AL: 02H SHELLB-COMMAND Interface°
° ES:DI ASCIIZ-Batchfilename
°
° DS:DX Buffer für Ergebnisse
°
û---------------------------------À
°
RETURN
°
° AL = 00 Fehler
°
°
FF ok
°
Û---------------------------------ì
SHELLC ist die neue Benutzeroberfläche von DOS 4.x, die über SHELLB mit dem
Kommandoprozessor COMMAND.COM kommuniziert. SHELLC ersetzt dann den Teil
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
383
des Userinterfaces von COMMAND.COM. Zur Aktivierung von SHELLC legt
COMMAND.COM intern eine Pseudo-Batchdatei an, die die entsprechenden Befehle
enthält.
Diese Unterfunktion wird dann von COMMAND.COM aufgerufen, um mit SHELLB zu
kommunizieren. In ES:DI ist der volle Name des eröffneten aktuellen Batchfiles als
ASCIIZ-String zu übergeben. Das Registerpaar DS:DX enthält einen Zeiger auf einen
Puffer, in dem SHELLB Programm-Start-Kommandos (PSC) zurückgeben kann.
COMMAND.COM liest diese Kommandos (PSC) und führt diese wie Befehle aus einer
Batchdatei aus. Nach Ausführung eines Kommandos wird solange in der aktuellen Zeile
der Batchdatei gewartet, bis SHELLB keine Kommandos (PSC) mehr im SHELLBArbeitsbereich zurückgibt. Die Kommandos (PSC) werden von SHELLC (dem
Benutzerinterface) in den Arbeitsbereich von SHELLB geschrieben. Der Befehl GOTO
COMMON schließt eine Kommandosequenz (PSC) ab. Dies führt dann dazu, daß
COMMAND.COM wieder an den Anfang des Batchfiles geht und mit der Abarbeitung des
Befehls beginnt. Da hier aber ein Aufruf von SHELLC steht, wird die SHELL erneut
aktiviert. Die Prüfung des Batchfilenamens erlaubt den PSC's den Aufruf (CALL) von
geschachtelten Batchdateien, so daß noch nicht ausgeführte PSC's für eine spätere
Bearbeitung gestapelt werden.
Nach dem Aufruf gibt der Wert in AL Hinweise, ob der Aufruf korrekt ausgeführt wurde.
Ist AL = 00, dann trat ein Fehler bei der Auswertung der Übergabeparameter auf. Dies ist
zum Beispiel der Fall, wenn der in ES:DI übergebene Filename nicht mit der von SHELLB
erwarteten Schreibweise übereinstimmt. Der Wert 00H wird auch zurückgegeben, falls
keine Programm-Start-Commands mehr vorhanden sind.
Bei erfolgreichem Aufruf findet sich in AL der Wert FFH. In dem durch das Registerpaar
DS:DX adressierten Puffer finden sich dann die Programm-Start-Commands (PSC's). Der
Puffer besitzt folgende Struktur:
Ö-----Ú------Ú--------------------------------------------Ì
° Adr ° Byte ° Feld
°
û-----é------é--------------------------------------------À
° DX+1°
1 ° Zahl der Bytes des folgenden PSC
°
û-----é------é--------------------------------------------À
° DX+2°
n ° Programm Start Command Text mit 0DH abge- °
°
°
° schlossen
°
Û-----Ù------Ù--------------------------------------------ì
Von der DOS-SHELLC werden also die DOS-Kommandos in den Arbeitsbereich von
SHELLB abgelegt. Diese PSC's haben das gleiche Textformat wie Anweisungen in
Batchdateien. COMMAND.COM liest über den obigen Aufruf diese Kommandos und
behandelt diese wie Batchdateien.
5.15.4 SHELLB.COM - COMMAND.COM Interface II (AL = 03H)
Es gilt folgende Aufrufschnittstelle.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
384
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 19H (SHELLB.COM)
°
° AL: 03H SHELLB-COMMAND Interface°
° ES:DI ASCIIZ-Batchfilename
°
û---------------------------------À
°
RETURN
°
° AL = 00 Fehler
°
°
FF ok
°
Û---------------------------------ì
Bei AL = 00 stimmt der durch ES:DI angegebene Batchfilename nicht mit dem letzten in
SHELLB gespeicherten Parameter überein.
5.15.5 SHELLB.COM - SHELLB.COM transient TSR Interface (AL =
04H)
Diese Funktion erlaubt die Kommunikation zwischen dem transienten und residenten Teil
der SHELLB. Es gilt folgende Aufrufschnittstelle.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 19H (SHELLB.COM)
°
° AL: 04H SHELLB-TSR Interface
°
û---------------------------------À
°
RETURN
°
° ES:DI ASCIIZ-Batchfilename
°
Û---------------------------------ì
Im Register ES:DI wird der Name des aktuellen SHELL-Batchfiles zurückgegeben. Dabei
gilt folgendes Format:
1
n
WORD Zahl der Folgebytes
BYTEs Name des Shell Batchfiles in Großbuchstaben
Der Name darf maximal 8 Zeichen lang sein.
5.16 Kommunikation with DOS-ANSI.SYS (AH = 1AH)
Mit diesem Aufruf läßt sich ab DOS 4.0 mit dem Programm ANSI.SYS kommunizieren.
5.16.1 Get Installation Status (AX = 1A00H)
Der Aufruf wurde ab DOS 5.0 offiziell dokumentiert. Die Unterfunktion erlaubt die
Prüfung, ob ANSI.SYS installiert ist.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 1AH (ANSI.SYS)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Der zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Programmes.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
385
·
Falls AL = 0 ist, dann ist ANSI.SYS nicht vorhanden und kann installiert werden.
·
Falls AL = FFH ist, dann ist ANSI.SYS installiert.
5.16.2 DOS 4.x ANSI.SYS Get/Set Display Informations (AX = 1A01H)
Mit dieser Unterfunktion werden die Display-Informationen des INT 21-Aufrufes 440CH
mit CX = 037FH und 035FH gesetzt oder gelesen. Es gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 1AH (ANSI.SYS)
°
° AL: 01H Get/Set Display Info
°
° CL: 7FH für Get Info
°
°
5FH für Set Info
°
° DS:DX Aresse Parameterblock
°
û---------------------------------À
°
RETURN
°
° CF: 1 Fehler
°
° AX: Fehlercodes
°
Û---------------------------------ì
Die Unterfunktion bildet das Interface zwischen dem DOS-INT 21-Aufruf 44H (IOCTL)
und dem ANSI.SYS-Treiber. Die Register DS:DX enthalten die Adresse eines
Parameterblocks mit den Steuerzeichen. Dieser wird beim INT 21, Funktion 440CH
aufgebaut.
5.16.3 DOS 4.x ANSI.SYS-Misc Requests (AX = 1A02H)
Der Aufruf ist erst ab DOS 4.0 vorhanden und es gelten folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 1AH (ANSI.SYS)
°
° AL: 02H Misc Requests
°
° DS:DX Adresse Parameterblock
°
û---------------------------------À
°
RETURN
°
° -°
Û---------------------------------ì
Die Register DS:DX enthalten die Adresse eines Parameterblocks mit den Steuerzeichen.
Dieser Parameterblock besitzt folgenden Aufbau:
Ö-------Ú------------------------------------------Ì
° Offs ° Funktion
°
û-------é------------------------------------------À
°
00H ° 00H Set / Reset Interlock
°
°
° 01H Get /L Flag
°
°
01H ° Interlock Status
°
°
° 00H: Reset 01H: Set
°
°
02H ° 00: /L aktiv 01: /L aus
°
Û-------Ù------------------------------------------
Der Set-Interlock-Befehl verhindert, daß ANSI.SYS die Ausgaben über den INT 10 nicht
mehr bearbeitet. Vor dem Aufruf muß das 1. Byte mit dem Code 00H oder 01H besetzt
werden. Die beiden folgenden Bytes werden dann von ANSI.SYS zurückgegeben. DOS 5.0
verzweigt zum vorhergehenden Treiber der Kette, falls AL > 02H beim Aufruf ist.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
386
5.17 DOS 4.0 Kommunikation with XMA2EMS.SYS (AH =
1BH)
Dies ist das Interface zum DOS-4.x-EMS-Treiber, der bestimmte Funktionen unterstützt.
5.17.1 Get Installation Status (AL = 00H)
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 1BH (XMA2EMS.SYS)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Die Unterfunktion erlaubt die Prüfung, ob XMA2EMS.SYS installiert ist.
Der zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Programmes.
·
Falls AL = 0 ist, dann ist der Treiber nicht vorhanden und kann installiert werden.
·
Falls AL = FFH ist, dann ist der Treiber installiert.
Der XMA2EMS.SYS wird nur installiert, falls das System mit EMS ausgestattet ist und
DOS freie page frames im EMS erhält.
5.17.2 XMA2EMS.SYS Get hidden frame Info (AL = 01H)
Dieser Aufruf ist ab DOS 4.0 vorhanden.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 1BH (XMA2EMS.SYS)
°
° AL: 01H Get hidden frame Info
°
° DI: hidden page number
°
û---------------------------------À
°
RETURN
°
° AX: FFFFH no hidden page
°
°
0000H ok
°
° ES: Segment page frame
°
° DI: physikal. page number
°
Û---------------------------------ì
Diese Funktion liest Daten über den INT 67, Funktion 58H. Nach dem Aufruf zeigt der
Inhalt des Registers AX, ob eine hidden page frame vorhanden ist. In ES steht die
Segmentadresse, in der das EMS-Fenster eingeblendet wird. DI enthält die physikalische
Seitennummer.
5.18 OS/2 Compatibility-Box (AH = 40H)
Diese Funktion wird von der OS/2-Kompatibilitästsbox benutzt um DOS in den Vorderund Hintergrund zu stellen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
387
5.18.1 Switch DOS to Background (AL = 01H)
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 40H (OS/2)
°
° AL: 01H Switch DOS to Background°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Dieser Aufruf wird von OS/2 verwendet um die DOS-Kompatibilitätsbox in den
Hintergrund zu schalten. Der Aufruf steht in DOS nicht zur Verfügung.
5.18.2 Switch DOS to Foreground (AL = 02H)
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 40H (OS/2)
°
° AL: 02H Switch DOS to Foreground°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Dieser Aufruf wird von OS/2 verwendet um die DOS-Kompatibilitätsbox in den
Vordergrund zu schalten. Der Aufruf steht in DOS nicht zur Verfügung.
Der Funktionsaufrufe AX = 41xxH und AX = 42xxH werden vom Microsoft LANManager 2.0 benutzt. Die Aufrufschnittstelle ist aber nicht genau bekannt.
5.19 Kommunikation with XMS (AH = 43H)
Ab DOS 4.01 unterstützt Microsoft das Extended Memory mit einem neuen Treiber. Die
genaue Funktionsweise ist im Kapitel über die Speichererweiterungen (Expanded Memory,
Extended Memory) zu finden. Über den Interrupt 2FH läßt sich der XMS-Treiber
ansprechen.
5.19.1 XMS Get Installation Status (AL = 00H)
Mit diesem Aufruf läßt sich prüfen, ob der Treiber installiert ist.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 43H (XMS)
°
° AL: 00H Get Installation Status °
û---------------------------------À
°
RETURN
°
° AL: 80H Driver installed
°
Û---------------------------------ì
Der XMS-Treiber hält sich nicht an die üblichen Konventionen des Multiplexer Interrupts.
Wird nach dem Aufruf der Wert 80H zurückgegeben, dann ist der Treiber installiert. Alle
anderen Werte sind so zu interpretieren, daß der Treiber nicht vorhanden ist.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
388
5.19.2 XMS Get Driver Address (AL = 10H)
Mit diesem Aufruf läßt sich die Adresse des Funktionsdispatchers ermitteln. Es gelten
folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 43H (XMS)
°
° AL: Get Dispatcher Address
°
û---------------------------------À
°
RETURN
°
° ES:BX Adresse
°
Û---------------------------------ì
Im Register AL ist der Unterfunktionscode 10H zu übergeben. Nach dem Aufruf findet
sich im Registerpaar ES:BX die Adresse des XMS-Dispatchers. Die Funktionen des XMSTreibers lassen sich dann über FAR CALL's zu dieser Adresse ansprechen. Eine
Beschreibung der Funktionen und deren Schnittstellen ist im Kapitel über die
Speichererweiterung zu finden.
5.20 DOS 5.0 Kommunikation (AH = 46H)
Ab der Version 5.0 des Betriebssystems wird die Funktion AX=46xxH durch den DOSKern und die Shell belegt.
Der DOS-Kern benutzt die Subfunktionen AX=4601H und 4602H, die Belegung und
Bedeutung ist aber bisher nicht genau bekannt.
5.20.1 WINDOWS 3.0 Installation Check (AX = 4680H)
Diese Subfunktion ist nicht offiziell dokumentiert, wird aber zukünftig durch Microsoft
unterstützt.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 46H (WINDOWS 3.x)
°
° AL: 80H
°
û---------------------------------À
°
RETURN
°
° AX: Status
°
Û---------------------------------ì
Nach dem Aufruf findet sich im Register AX der Status, der folgende Kodierung aufweist:
·
AX = 0000H WINDOWS 3.0 arbeitet im Real- (/R) oder Standardmode (/S).
·
AX <> 0000H WINDOWS 3.0 ist nicht installiert, oder es arbeitet im Enhanced Mode
/3), oder es ist eine Version kleiner 3.0 installiert.
Der Funktionsaufruf wird unter anderem von der DOS 5.0/6.0-Shell aktiviert.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
389
5.21 DOSKEY Funktionen (AX = 48, DOS 5.0-6.0)
Diese Funktionen stehen erst ab DOS 5.0 zur Verfügung und werden durch das Programm
DOSKEY benutzt.
5.21.1 DOSKEY Installation Check (AX = 4800H)
Mit diesem Aufruf prüft DOSKEY, ob der residente Teil bereits installiert wurde.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 48H (DOSKEY)
°
° AL: 00H (Installation Check)
°
û---------------------------------À
°
RETURN
°
° AX: Status
°
Û---------------------------------ì
Nach dem Aufruf findet sich im Register AX der Status des Programmes. Der Wert AX <>
0 signalisiert, daß der residente Teil von DOSKEY bereits installiert ist.
5.21.2 DOSKEY Read Input Line from Console (AX = 4810H)
Über diese Funktion läßt sich der Kommandozeileneditor von DOSKEY aufrufen. Die
Funktion wird ab DOS 5.0 durch COMMAND.COM benutzt.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 48H (DOSKEY)
°
° AL: 10H (Read Input Line)
°
° DS:DX Adresse Zeilenpuffer
°
û---------------------------------À
°
RETURN
°
° AX: Status
°
Û---------------------------------ì
Die Funktion erwartet in DS:DX die Adresse eines Puffers, der genau die Struktur wie
beim Aufruf der INT 21-Funktion 0AH haben muß:
Ö------Ú-----Ú----------------------------Ì
°Offset° Byte° Bedeutung
°
û------é-----é----------------------------À
° 00
° 1
° Länge (muß immer 80H sein) °
° 01
° 1
° Zahl der gelesenen Byte
°
° 02
° n
° Datenbytes
°
Û------Ù-----Ù----------------------------ì
Wichtig ist, daß die Länge des Puffers auf 80H gesetzt wird, da sonst DOSKEY zur
nächsten Funktion in der Kette des INT 2F verzweigt. Ist nach dem Aufruf der Wert AX =
0000H vorhanden, dann wurde die Funktion erfolgreich ausgeführt. Wird vom Benutzer
ein Macroname eingegeben, legt die Funktion keinen Text im Puffer ab. Dann muß die
Funktion ein weiteres Mal aktiviert werden, um den expandierten Macrotext abzufragen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
390
5.22 DOS 5.0/6.0 HMA-SPACE (AH = 4AH)
Ab DOS 5.0 wird der HMA-Bereich durch das Betriebssystem verwaltet. Die Funktion AX
= 4AxxH des INT 2F dient hier zur Kommunikation mit dem HMA-Treiber.
5.22.1 DOS 5.0/6.0 Query Free HMA-Space (AX = 4A01H)
Mit dieser Unterfunktion läßt sich prüfen, ob DOS HMA-Speicher benutzt. Es gilt folgende
Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 4AH (DOS 5.0/6.0)
°
° AL: 01H (Query Free HMA-Space) °
û---------------------------------À
°
RETURN
°
° BX: freier HMA-Speicher
°
° ES:DI Anfang HMA-Bereich
°
Û---------------------------------ì
Die Funktion gibt in ES:DI die Anfangsadresse des HMA-Bereiches an. Steht in diesem
Registerpaar der Wert FFFF:FFFFH, dann wird kein HMA-Speicher benutzt. Das Register
BX enthält nach dem Aufruf die Zahl der freien Byte im HMA-Bereich. Der Wert 0000H
signalisiert, daß der HMA-Bereich unbenutzt ist.
5.22.2 DOS 5.0/6.0 Allocate HMA-Space (AX = 4A02H)
Mit dieser Unterfunktion läßt sich unter DOS ein freier HMA-Speicherbereich reservieren.
Es gilt folgende Aufrufschnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 4AH (DOS 5.0/6.0)
°
° AL: 02H (Allocate HMA-Space)
°
° BX: Zahl der Bytes
°
û---------------------------------À
°
RETURN
°
° ES:DI Anfang HMA-Block
°
Û---------------------------------ì
Die Funktion erwartet in BX die Größe des zu reservierenden Blockes in Byte. Nach dem
Aufruf ist der Inhalt des Registers BX zerstört. In ES:DI steht nach dem Aufruf die
Anfangsadresse des reservierten Speicherblockes im HMA-Bereich. Der Aufruf dieser
Subfunktion ist nur gültig, falls Teile des DOS-Kerns im HMA-Bereich geladen sind.
Normale Anwenderprogramme sollten diesen Aufruf zur Zuweisung von HMA-Speicher
nicht benutzen. Hierfür stehen die Funktionen des XMA-Managers (siehe entsprechendes
Kapitel) zur Verfügung.
Die Unterfunktion AX = 4A05H ist vermutlich durch die DOSSHELL belegt. Genaue
Informationen über die Aufrufschnittstelle liegen allerdings nicht vor.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
391
DOS Programmierhandbuch
5.23 DOS 5.0/6.0 TaskSwitcher Interface (AH = 4BH)
Ab DOS 5.0 wird die Unterfunktion 4BH des INT 2F durch den TaskSwitcher belegt.
Unter diesem Funktionscode wird ein API-Interface (API = Application Programm
Interface) für zukünftige DOS- und WINDOWS-Versionen definiert. Bestimmte
Programme (z.B. 3270 Emulatoren, Netzwerktreiber, etc.) dürfen nicht ohne weiteres durch
den TaskSwitcher unterbrochen werden. Bei einer 3270 Emulation geht zum Beispiel bei
einer Unterbrechung die Verbindung zum Hostrechner verloren. Die Funktionen des INT
2F mit dem Code 4BH ermöglichen nun eine Kommunikation zwischen TaskSwitcher und
den aktiven Tasks. Bei Bedarf kann dann ein Programm, welches die Konventionen des
API einhält, einen Taskwechsel verhindern oder verzögern. Laut Microsoft sollen
zukünftige Versionen von WINDOWS dieses API im Real- und Standardmode
unterstützen. WINDOWS 3.0 besitzt dagegegen im 386-Mode eine eigene API für die
Prozeßkoordination.
Zum Verständnis der nachfolgenden Beschreibung möchte ich kurz die Abläufe beim
Taskwechsel skizzieren. Initiiert der Benutzer über die Tastatur einen Taskwechsel, löst der
Switcher über den INT 2F eine globale Botschaft zur Taskunterbrechung aus. Jeder
geladene Prozess kann nun auf diese Botschaft auf folgende Arten reagieren:
·
Er signalisiert dem Switcher, daß eine Unterbrechung nicht zulässig ist. Dann bricht
der Switcher den Taskwechsel ab.
·
Er gibt die Kontrolle sofort an den Switcher zurück und signalisiert so, daß ein
Wechsel möglich ist.
·
Er bringt sich in einen sicheren Zustand und gibt dann die Kontrolle an den Switcher
zurück.
Die per Switcher geladenen Tasks werden durch eine eindeutige Task ID Nummer
unterschieden. Über diese Nummer lassen sich auch Informationen über den Status eines
Tasks abfragen.
In DOS löst der Switcher folgende Aktionen aus, sobald ein Taskwechsel ansteht:
1)
Aufbau der Call-Out chain per INT 2F, AX=4B01H
2)
Aufruf der Query Supend Funktion
3)
Sperre der Interrupts
4)
Aufruf der Suspend Session Funktion
5)
Sicherung der aktuellen Interruptvektor-Tabelle und der Instance Daten des
aktuellen Prozesses
6)
Restaurierung der Interruptvektor-Tabelle
Vorgängerprozesses
7)
Freigabe der Interrupts
8)
Erzeugung die lokalen Daten der Zieltask
9)
Sperre der Interrupts
10)
Sichere die globale Interruptvektor-Tabelle und die Instance Daten.
11)
Restauriere die Interruptvektor-Tabelle der Applikation und die Instance Daten
und
der
Instance
Daten
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
des
DOS Programmierhandbuch
12)
Aufruf der Resume Session Funktion
13)
Freigabe der Interrupts
14)
Aufruf der Session Active Funktion
15)
Ausführung der neuen Applikation
392
Programme können nun diese API-Schnittstelle unterstützen. Hierzu müssen sie zwei
Einsprungpunkte aufweisen:
Den Handler für den INT 2F-Service
Den Handler für die Call-Out-API-Funktion
Jedes Programm muß sich in den INT 2F einhängen, um bestimmte Aufrufe des Switcher
zu erkennen. Der Switcher löst zum Beispiel den INT 2F mit der Funktion AX = 4B01H
aus. Erhält der Handler die Kontrolle vom INT 2F, muß er das AX-Register auswerten,
ohne die anderen Register zu verändern. Handelt es sich nicht um einen Switcher-APIAufruf, ist die Kontrolle sofort per JMP FAR an die nächste Routine des INT 2F zu
übergeben. Die Adresse muß der Handler bei der Installation ermitteln (alter INT 2FVektor) und speichern. Falls in AX ein gültiger Code des Switchers steht, ist ein PUSHF
auszuführen und die nächste Routine des INT 2F per CALL FAR aufzurufen. Dadurch
werden erst die Programme in der INT 2F-Kette ausgeführt. Anschließend erhält der
Prozess die Kontrolle wieder zurück. Dabei steht in ES:BX ein Zeiger, welcher auf eine
Datenstruktur des vorhergehenden Prozesses zeigt. Diese als Switcher Callback Info
Structure (SCBI) bezeichnete Datenstruktur enthält Informationen über den Prozess und ist
über Zeiger verkettet (siehe Funktion 4B01H). Ein Wert von 0:0 in ES:BX signalisiert, daß
kein Folgehandler existiert, der den TaskSwitcher; unterstüzt. Der Handler muß nun selbst
eine SCBI-Datenstruktur anlegen und den Zeiger auf den SCBI des Vorgängers aus ES:BX
in diese Datenstruktur übertragen. Anschließend wird die Adresse auf den eigenen SCBI in
ES:BX eingetragen. So erhält der folgende Handler die Adresse und es wird eine verkettete
Liste aufgebaut. Der Handler gibt die Kontrolle per IRET-Anweisung an den folgenden
Prozess weiter.
Als weiteres muß der Handler einen Einsprungpunkt für die Call-Out-API-Funktionen des
Switchers aufweisen. Die Adresse dieses Einsprungpunktes wird in der SCBIDatenstruktur vermerkt. Der Switcher benutzt zum Beispiel diese Call-Out-Aufrufe um
Nachrichten an die einzelnen Prozesse abzusetzen. Jeder Handler muß einen
entsprechenden Vorrat an API-Funktionen bereitstellen (siehe Funktion 4B01H).
Der Switcher seinerseits besitzt ebenfalls eine Reihe von API-Funktionen (Call-InFunktionen), die über eine eigene Einsprungadresse zu aktivieren sind. Die Adresse läßt
sich zum Beispiel per INT 2F, Funktion 4B02H ermitteln. (Beachten Sie, daß sich die
Adresse des Einsprungpunktes während der Laufzeit ändern kann).
Für die Kommunikation mit dem DOS-Switcher gibt es ab DOS 5.0 folgenden Funktionen.
5.23.1 Build Call Out Chain (AX = 4B01H)
Mit dieser Unterfunktion baut der Switcher eine Kommunikationskette zwischen den
Prozessen auf. Es gilt folgende Aufrufschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
393
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 4BH (DOS 5.0 TaskSwitcher) °
° AL: 01H (Build Call Out Chain) °
° CX:DX Switcher Entry Point
°
° ES:BX 0000:0000H
°
û---------------------------------À
°
RETURN
°
° ES:BX Call Back Infostruktur
°
Û---------------------------------ì
Die Funktion wird durch den TaskSwitcher aufgerufen. Anwendungsprozesse (Clients)
können sich in die INT 2F-Aufrufkette einhängen. Dadurch erhalten sie Informationen
über die Aktivitäten des TaskSwitchers. In CX:DX wird die Eintrittadresse (Call-In-APIEinspungpunkt) des TaskSwitchers übergeben. Beim Aufruf des INT 2F-Handlers muß das
Programm zuerst die Kontrolle an folgenden Prozess in den INT 2F-Kette
weitergegebenen. Dabei dürfen keine Register verändert werden. Sobald der Client die
Kontrolle wieder zurückerhält, muß er eine Callback Info Structur im Speicher aufbauen.
Der vom vorhergehenden Prozess in ES:BX zurückgegebene Adresswert ist dann in das
next field der SCBI-Struktur zu kopieren. Der aktive Prozess trägt nun seinerseits die
Adresse auf die eigene Callback Info Structur in ES:BX ein und beendet den Aufruf mit
IRET.
Ein Client muß sich selbst bei der Installation in die INT 2F-Kette einhängen. Vor der
Beendigung muß der Client vom TaskSwitcher mit dem INT 2F-Aufruf AX=4B02H und
der Call-In-Unterfunktion AX = 0005H abmelden. Die bei der Aktivierung der
Unterfunktion AX = 4B01H in CX:DX vom Switcher übergebene Einsprungadresse für
Call-In-Funktionen sollte von den Programmen nicht gespeichert werden, da sich die
Adresse durchaus ändern kann. Die Adresse läßt sich über AX = 4B02H jederzeit neu
ermitteln.
Die Callback Info Structur besitzt folgende Struktur:
Offset Bytes
00H
4
04H
08H
0CH
4
4
Bemerkung
next-field-Zeiger auf die Adresse
der nächsten Callback Info Struktur
Zeiger auf die Adresse der Behandlungsroutine (Call Out API)
reserviert
Adresse API Info Struktur
Der Zeiger auf das Call-Out-API des Handlers dient dem Switcher zur Kommunikation mit
den Tasks. Deshalb muß der Handler hier die Adresse der eigenen API-Routinen eintragen.
Die API-Info-Struktur ist eine Liste, die mit 00H abgeschlossen wird (siehe AX = 4B02H).
Der Switcher übergibt beim Aufruf des INT 2F in CX:DX die Adresse des Call-In-API.
Die Call-Out-API-Funktionen
Jeder Handler muß einen Set an Call-Out-Funktionen zur Verfügung stellen. Die Call-OutFunktionen werden vom Switcher per CALL FAR aktiviert. Der Wert in AX steuert dabei
die Art der Funktionen. Hierbei gelten folgende Registerbelegungen:
INIT-Switcher (AX=0000H)
Jede Applikation, die das API unterstützt, kann bei der Initialisierung über die Adressen in
der SCBI-Struktur die Call-Out-Funktion der geladenen Prozesse aktivieren. Hierbei gilt
folgende Übergabeschnittstelle:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
394
┌──────────────────────────────────┐
│ CALL FAR xxx
│
│
│
│ AX = 0000H Init Switcher
│
│ ES:DI Switcher Call-In Adresse
│
│ Interrupts enabled
│
│ DOS Aufrufe enabled
│
│
│
│ RETURN
│
│
│
│ AX = 0 ok
│
│ AX <> 0 Fehler
│
└──────────────────────────────────┘
Mit AX = 0000H wird die Funktion switcher initialisation aktiviert. Das aktivierte
Programm kann dann prüfen, ob es eventuell zusätzliche Aktivitäten ausführen muß, um
zum Beispiel mit dem Switcher zu kommunizieren. Die DOS 5.0/6.0-Shell führt zum
Beispiel bei der Installation diesen Aufruf aus. Enthält AX nach dem Aufruf den Wert
0000H, dann darf der Switcher/ Prozeß geladen werden. Andernfalls sollte der Prozeß
beendet werden. Alle geladenen Prozesse werden dann vom Switcher mit der Funktion
Switcher Exit aktiviert. Der Aufruf kann aber ignoriert werden.
Query Suspend (AX = 0001H)
Mit AX = 0001H wird die Funktion query suspend ausgeführt.
Ö-----------------------------------Ì
° CALL FAR xxx
°
°
°
° AX = 0001H Query Suspend
°
° BX = Current Session ID
°
° ES:DI Switcher Call-In Adresse
°
° Interrupts enabled
°
° DOS Aufrufe enabled
°
°
°
° RETURN
°
°
°
° AX = 0 ok suspend
°
° AX <> 0 no suspend
°
Û-----------------------------------ì
In BX ist die session ID mit zu übergeben. Enthält AX nach dem Aufruf den Wert 0000H,
dann darf zum nächsten Prozess umgeschaltet werden. Mit AX = 0001H signalisiert ein
Task in der Kette, daß keine Umschaltung erlaubt ist. Der Switcher löst dann einen Aufruf
Session Active aus. Gegebenenfalls kann der aktive Task per Test Memory Region prüfen,
ob eigene Code- und Datenbereiche durch die Umschaltung betroffen sind.
Suspend Session (AX = 0002H)
Falls beim Aufruf der Call-Out-Funktion Query Suspend kein Prozess den Wert AX<>0
zurückgibt, darf der Switcher einen Taskwechsel ausführen. Hierzu wird mit dem Wert AX
= 0002H die Funktion suspend sessio aktiviert. Vorher müssen alle Interrupts gesperrt und
in BX die session ID übergeben werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
395
Ö----------------------------------Ì
° CALL FAR xxx
°
°
°
° AX = 0002H Suspend Session
°
° BX = Current Session ID
°
° ES:DI Switcher Call-In Adresse
°
° Interrupts disabled
°
° DOS Aufrufe disabled
°
°
°
° RETURN
°
°
°
° AX = 0 ok suspend noe
°
° AX <> 0 cannot suspend now
°
Û----------------------------------ì
Nach dem Aufruf enthält AX den Statuscode. Enthält AX nach dem Aufruf den Wert
0000H, dann darf zum nächsten Prozess umgeschaltet werden. Bei der Umschaltung wird
die komplette Interruptvektor-Tabelle gesichert, b.z.w. durch die Vektoren vor Aktivierung
des Tasks ersetzt. Deshalb muß auch das Interruptsystem gesperrt werden. Durch die
Restaurierung werden alle lokal vom aktiven Task installierten Interrupt-Handler
suspendiert.
Mit AX = 0001H ist keine Umschaltung erlaubt, d.h. ein Prozess verhindet die
Umschaltung. Dann löst der Switcher für alle aktiven Prozesse die Funktion Session Active
aus.
Resume Session (AX = 0003H)
Mit dem Wert AX = 0003H wird die Funktion activate session aktiviert. Vorher muß in
BX die session ID übergeben werden. In CX ist das session status flag zu setzen. In diesem
Flag ist nur Bit 0 belegt, alle anderen Bits sind reserviert und zu 0 zu setzen. Bit 0 = 1
bedeutet, die Session wird zum ersten mal aktiviert. Weiterhin muß vor dem Aufruf das
Interruptsystem gesperrt werden.
Ö----------------------------------------Ì
° CALL FAR xxx
°
°
°
° AX = 0003H Resume Session
°
° BX = Current Session ID
°
° ES:DI Switcher Call-In Adresse
°
° CX = Flags
°
° Interrupts disabled
°
° DOS Aufrufe disabled
°
°
°
° RETURN
°
°
°
° AX = 0 (für zukünftige Kompatibilität) °
Û----------------------------------------ì
Nach dem Aufruf enthält AX den Wert 0000H. Wird ein neu aktivierter Task zum ersten
mal unterbrochen, dann geht ein Create-Session-Aufruf voran.
Session Active (AX = 0004H)
Mit dem Wert AX = 0004H wird die Funktion session active aktiviert. Dies ist der Fall,
nachdem ein vorher unterbrochener Prozeß wieder geladen wurde. Beim Aufruf muß in BX
die session ID übergeben werden. In CX ist das session status flag zu setzen. In diesem
Flag ist nur Bit 0 belegt, alle anderen Bits sind reserviert und zu 0 zu setzen. Bit 0 = 1
bedeutet, die Session wird zum ersten mal aktiviert.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
396
Ö------------------------------------------Ì
° CALL FAR xxx
°
°
°
° AX = 0004H Session Active
°
° BX = Current Session ID
°
° ES:DI Switcher Call-In Adresse
°
° CX = Flags
°
° Interrupts enabled
°
° DOS Aufrufe enabled
°
°
°
° RETURN
°
°
°
° AX = 0 (für zukünftige Kompatibilität) °
Û------------------------------------------ì
Nach dem Aufruf enthält AX den Wert 0000H. Die Funktion wird auch aktiviert, falls
beim Query Suspend oder bei Suspend Session ein Prozeß einen Taskwechsel blockiert.
Hierdurch kann ein aktiver Task eine solche Nachricht erhalten, die dann aber zu
ignorieren ist.
Create Session (AX = 0005H)
Mit dem Wert AX = 0005H wird die Funktion create session aktiviert. Vorher muß in BX
die session ID übergeben werden.
Ö------------------------------------Ì
° CALL FAR xxx
°
°
°
° AX = 0005H Create Session
°
° BX = Session ID created Task
°
° ES:DI Switcher Call-In Adresse
°
° Interrupts enabled
°
° DOS Aufrufe enabled
°
°
°
° RETURN
°
°
°
° AX = 0 ok create session
°
°
<> 0 no create sessuib
°
Û------------------------------------ì
Enthält AX nach dem Aufruf den Wert 0000H, dann darf die Session erzeugt werden. Mit
AX = 0001H ist keine Erzeugung erlaubt. Dann wird vom Switcher die Funktion Destry
Session aktiviert.
Destroy Session (AX = 0006H)
Mit dem Wert AX = 0006H wird die Funktion destroy session aktiviert. Dies ist zum
Beispiel der Fall, falls eine Applikation beendet wird. Vorher muß in BX die session ID
übergeben werden. Dann beendet der Switcher die entsprechende Session.
Ö--------------------------------------Ì
° CALL FAR xxx
°
°
°
° AX = 0006H Destroy Session
°
° BX = Session ID to destroy
°
° ES:DI Switcher Call-In Adresse
°
° Interrupts enabled
°
° DOS Aufrufe enabled
°
°
°
° RETURN
°
°
°
° AX = 0 (zukünftige Kompatibilität) °
Û--------------------------------------ì
Nach dem Aufruf enthält AX den Wert 0000H. Der Aufruf wird auch ausgelöst, falls ein
Create- Session-Aufruf nicht akzeptiert wird.
Switcher Exit (AX = 0007H)
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
397
Sobald der TaskSwitcher beendet wird, ist dies den globalen Handlern mitzuteilen. Mit
dem Wert AX = 0007H wird dann die Funktion switcher exit aktiviert. Vorher muß in BX
das Flagregister übergeben werden. Dieses benutzt nur Bit 0, während die restlichen Bits
reserviert und auf 0 zu setzen sind. Ist Bit 0 gesetzt, daß ist nur der Switcher geladen.
Ö---------------------------------------Ì
° CALL FAR xxx
°
°
°
° AX = 0007H Switcher Exit
°
° BX = Flags
°
° ES:DI Switcher Call-In Adresse
°
° Interrupts enabled
°
° DOS Aufrufe enabled
°
°
°
° RETURN
°
°
°
° AX = 0 (zukünftige Kompatibilität)
°
Û---------------------------------------ì
Nach dem Aufruf enthält AX den Wert 0000H. Die Funktion wird von dem Programm
aufgerufen, welches den Switcher installiert hat (z.B. DOS-Shell). Dann darf die Call-InAdresse in ES:DI auch 0:0 sein.
Allgemeine Bemerkungen
Die Call-Out-Funktion 0000H wird von dem Programm aufgerufen, welches den Switcher
überwacht oder aktiviert. Der Aufruf erfolgt nicht durch den Taskswitcher selbst. Die in
ES:DI übergebene Adresse ist nicht notwendigerweise die Einsprungadresse des
TaskSwitchers und kann durchaus 0000:0000H sein. Sobald ein Client signalisiert, daß ein
Ladevorgang nicht möglich ist, wird dies über die Funktion 0007H an alle Clients
weitergegeben. Die Handler in der Call-Out-Kette dürfen, mit Ausnahme der Funktionen
0002H und 0003H, mit freigegebenem Interruptsystem die Funktionen aufrufen. Weiterhin
dürfen alle INT 21-Funktionen aufgerufen werden.
5.23.2 Installation Check (AX = 4B02H)
Mit dieser Unterfunktion des INT 2F läßt sich von einem Programm aus prüfen, ob der
TaskSwitcher installiert ist. Weiterhin wird der Aufruf zur Ermittlung der Call-In-Adresse
des Switchers verwendet. Es gelten folgende Aufrufkonventionen:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 4BH (DOS 5.0/6.0 TaskSwitch)°
° AL: 02H (Installation Check)
°
° BX: 0000H
°
° ES:DI 0000:0000H
°
û---------------------------------À
°
RETURN
°
° ES:DI Switcher Entry Point
°
Û---------------------------------ì
Die Funktion muß mit BX = 0000H und ES:DI = 0000:0000H aufgerufen werden. Ist kein
TaskSwitcher installiert, enthält das Registerpaar ES:DI nach dem Aufruf unverändert den
Wert 0000:0000H. Bei geladenem Switcher findet sich in ES:DI die Einsprungadresse in
den TaskSwitcher (Call-In-API).
Die Call In-Funktionen des TaskSwitchers
Der TaskSwitcher stellt für die Clients eine Reihe von Funktionen (Call In Funktionen) zur
Verfügung. Der Einsprungpunkt für die Funktionen wird zum Beispiel bei obiger Funktion
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
398
in ES:DI zurückgegeben. Die Funktionen des TaskSwitcher API sind per CALL FAR mit
verschiedenen Parametern in AX aufzurufen. Alle Aufrufe werden mit gelöschten CarryFlag beendet. Ist dies nicht der Fall, wird das API nicht unterstützt. Der Switcher bietet
dabei folgende Funktionen:
Get Version (AX = 0000H)
Mit AX = 0000H wird die Funktion get version aktiviert. Dies kann zur Identifikation des
Switchers genutzt werden. Es gilt folgende Aufrufstruktur:
Ö-------------------------------------Ì
° CALL FAR xxxx
°
°
°
° AX = 0000H Get Version
°
° Interrupt disabled
°
° DOS disabled
°
°
°
° EXIT
°
° CY 0 -> Aufruf unterstützt
°
° ES:BX Adresse Switcher Datenblock
°
Û-------------------------------------ì
Ein gesetzes Carry-Flag nach der Rückkehr signalisiert: der Aufruf wird nicht unterstützt.
Nach einem erfolgreichen Aufruf ist das Carry-Flag gelöscht. AX ist unverändert, aber in
ES:BX wird die Adresse auf einen Puffer mit den Versionsdaten zurückgegeben. Dieser
Puffer besitzt folgende Struktur:
Offset
00H
02H
04H
06H
08H
0AH
0CH
10H
Byte
2
2
2
2
2
2
4
4
Bedeutung
Hauptversion des Protokolls
Unterversion des Protokolls
Hauptversion TaskSwitcher
Unterversion TaskSwitcher
TaskSwitcher ID
Operation Flag:
Bit 0: 1 = TaskSwitcher aus
Bit 1-15: ---Zeiger auf den Namen des Switchers
Zeiger auf den Einsprungpunkt des
vorhergehenden TaskSwitchers
Als Name des Switchers wird zur Zeit der Text MS-DOS Shell Task Switcher
zurückgegeben. Der Zeiger ab Offset 10H enthält die Adresse des Einsprungpunktes in den
voher geladenen TaskSwitcher. War kein Switcher geladen, ist die Adresse = 0000:0000H.
Test Memory Region (AX = 0001H)
Mit AX = 0001H wird die Call-In-Funktion test memory region ausgeführt. In CX ist die
Größe des zu testenden Bereiches zu übergeben. ES:DI enthält die Adresse des ersten zu
testenden Bytes.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
399
Ö------------------------------------------Ì
° CALL FAR xxxx
°
°
°
° AX = 0001H Test Memory Region
°
° CX = Puffergröße (0-64 Kbyte)
°
° ES:DI Startadresse Puffer
°
° Interrupt disabled
°
° DOS disabled
°
°
°
° EXIT
°
° CY 0 -> Aufruf unterstützt
°
° AX = 0 Puffer ist im globalen Speicher
°
°
1 Puffer ist teilweise lokal
°
°
2 Puffer ist komplett lokal
°
Û------------------------------------------ì
Nach dem Aufruf zeigt ein gesetztes Carry-Flag an, daß die Funktion nicht unterstützt
wird. Bei gelöschtem Carry-Flag enthält AX eine Information über die Lage des des
getesteten Bereiches.
Damit läßt sich von einem Prozeß prüfen, ob ein Taskwechsel Daten aus dem lokalen
Speicher beeinflußt. Dann kann der Prozeß geeignet reagieren.
Suspend Switcher (AX = 0002H)
Mit AX = 0002H wird die Funktion suspend switcher ausgeführt. Hierdurch läßt sich ein
neuer TaskSwitcher installieren. In ES:DI ist die Adresse des neuen TaskSwitcher
Eintrittspunktes anzugeben.
Ö-----------------------------------------------Ì
° CALL FAR xxxx
°
°
°
° AX = 0002H Suspend Switcher
°
° ES:DI neue Switcher Adresse
°
° Interrupt enabled
°
° DOS enabled
°
°
°
° EXIT
°
° CY 0 -> Aufruf unterstützt
°
°
AX = 0000H Switcher suspendiert
°
°
0001H Switcher nicht suspendiert,
°
°
neuen Switcher beenden
°
°
0002H Switch nicht suspendiert,
°
°
neuer Switcher trotzdem aktiv
°
Û-----------------------------------------------ì
Nach dem Aufruf zeigt ein gesetztes Carry-Flag, daß die Funktion nicht unterstützt wird.
Bei gelöschtem Carry-Flag enthält AX eine Information über den Status des Switchers.
Mit diesem Aufruf läßt sich die Einsprungadresse für das API auf neue Routinen umleiten.
Resume Switcher (AX = 0003H)
Mit dem Wert AX = 0003H wird die Funktion resume switcher aktiviert. Vorher muß in
ES:DI die Adresse des neuen Switcher entry points übergeben werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
400
Ö-----------------------------------------------Ì
° CALL FAR xxxx
°
°
°
° AX = 0003H Resume Switcher
°
° ES:DI Call In Adresse
°
° Interrupt enabled
°
° DOS enabled
°
°
°
° EXIT
°
° CY 0 -> Aufruf unterstützt
°
°
AX = 0000H (für zukünftige Erweiterungen)
°
Û-----------------------------------------------ì
Bei glöschtem Carry-Flag war der Aufruf erfolgreich, andernfalls konnte er nicht
ausgeführt werden. In ES:DI ist die Call-In-Adresse des zu beendenden Switchers zu
übergeben.
Hook Notification Chain (AX = 0004H)
Mit dem Wert AX = 0004H wird die Funktion hook notification chain aktiviert. Damit läßt
sich von einem laufenden Prozeß eine neue callback info structure in die Kette einsetzen.
Die Adresse dieser Struktur ist beim Aufruf in ES:DI zu übergeben.
Ö------------------------------------------------Ì
° CALL FAR xxxx
°
°
°
° AX = 0004H Hook Call Out Chain
°
° ES:DI SCBI-Adresse
°
° Interrupt enabled
°
° DOS enabled
°
°
°
° EXIT
°
° CY 0 -> Aufruf unterstützt
°
°
AX = 0000H (für zukünftige Erweiterungen)
°
Û------------------------------------------------ì
Ein gelöschtes Carry-Flag zeigt nach dem Aufruf den Erfolg der Aktion an. Nach dem
Aufruf enthält AX den Wert 0000H.
Unhook Notification Chain (AX = 0005H)
Mit dem Wert AX = 0005H wird die Funktion unhook notification chain aktiviert. Diese
trägt den Handler des rufenden Prozesses aus der Call-Out-Kette aus. Hierzu wird die in
ES:DI übergebene Adresse der callback info structure aus der Kette ausgetragen.
Ö-----------------------------------------------Ì
° CALL FAR xxxx
°
°
°
° AX = 0005H Unhook Call Out Chain
°
° ES:DI SCBI-Adresse
°
° Interrupt enabled
°
° DOS enabled
°
°
°
° EXIT
°
° CY 0 -> Aufruf unterstützt
°
°
AX = 0000H (für zukünftige Erweiterungen)
°
Û-----------------------------------------------ì
Ein gelöschtes Carry-Flag zeigt nach dem Aufruf den Erfolg an.
Query API Support (AX = 0006H)
Mit dem Wert AX = 0006H wird die Funktion query API support aktiviert. Wird eine
Funktion (z.B. ein Netzwerktreiber) von zwei Handlern mit unterschiedlichen
Versionsständen abgewickelt, läßt sich der API-Level abfragen. Vorher muß in BX eine
Identifikationsnummer für asynchrone API-Aufrufe übergeben werden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
401
Ö------------------------------------------------Ì
°CALL FAR xxxx
°
°
°
° AX = 0006H Query API Support
°
° BX = API Code
°
° Interrupt disabled
°
° DOS enabled
°
°
°
° EXIT
°
° CY 0 -> Aufruf unterstützt
°
°
AX = 0000H (für zukünftige Erweiterungen)
°
°
ES:BX Adresse der API-Info-Struktur
°
Û------------------------------------------------ì
Ein gelöschtes Carry-Flag zeugt von einem erfolgreichen Aufruf und in ES:BX findet sich
die Adresse der API-Infostruktur. Diese besitzt folgenden Aufbau:
Offset Byte Bemerkung
00H 2
Länge der Struktur (0AH)
02H 2
API Identifikationscode
0001H NetBIOS
0002H 802.2
0003H TCP/IP
0004H LAN Manager named pipes
0005H Novell Netware IPX
04H 2
Hauptversionsnummer
06H 2
Unterversionsnummer
08H 2
Support Level
0001H minimale Unterstützung
0002H API-Level Support
0003H Switcher Kompatibilität
0004H volle Kompatibilität
Die genaue Bedeutung dieser Aufruf ist mir allerdings nicht klar.
5.23.3 Allocate Switcher ID (AX = 4B03H)
Diese Unterfunktion wird ausschließlich durch den TaskSwitcher ausgeführt, um eine
Identifikationsnummer zuweisen.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 4BH (DOS 5.0/6.0 TaskSwitch)°
° AL: 03H (Allocate Switcher ID) °
° BX: 0000H
°
° ES:DI Entry Point
°
û---------------------------------À
°
RETURN
°
° BX: Switcher ID
°
Û---------------------------------ì
Die Funktion muß vom ersten TaskSwitcher aufgerufen werden, damit ihm eine
Identifikationsnummer zugewiesen wird. In ES:DI steht die Adresse des TaskSwitcher
Entry Points. Nach dem Aufruf enthält AX = 0000H und in BX findet sich die Switcher ID.
Diese setzt sich aus 4 Bit Switcher ID und einer 12-Bit-Tasknummer zusammen. Es dürfen
15 Switcher mit je 4096-Tasks geladen werden. (Anmerkung: die DOS 5.0-Shell
unterstützt jedoch nur 16 Tasks). Der Wert BX = 0000H bedeutet, daß keine ID-Nummer
mehr frei ist. Nummern für die Switcher ID liegen zwischen 0 und 15. Genauere
Informationen über diesen Aufruf sind mir allerdings nicht bekannt.
5.23.4 Free Switcher ID (AX = 4B04H)
Diese Unterfunktion ist aufzurufen, falls der Switcher terminiert.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
402
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 4BH (DOS 5.0/6.0 TaskSwitch)°
° AL: 04H (Free Switcher)
°
° BX: Switcher ID
°
° ES:DI Entry Point
°
û---------------------------------À
°
RETURN
°
° BX: Status
°
Û---------------------------------ì
Die Funktion muß mit der freizugebenden ID-Nummer in BX und dem TaskSwitcher-CallIn-Entry-Point in ES:DI aufgerufen werden. Nach dem Aufruf ist AX = 0000H und BX
enthält einen Status (0000H Aufruf erfolgreich, sonst war die ID ungültig oder nicht
erlaubt).
5.23.5 Identify Instance Data (AX = 4B05H)
Diese Unterfunktion wird durch den TaskSwitcher selbst aufgerufen. Es gilt folgende
Schnittstelle:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 4BH (DOS 5.0/6.0 TaskSwitch)°
° AL: 05H (Instance Data)
°
° ES:BX 0000:0000H
°
° CX:DX Call In Entry Point
°
û---------------------------------À
°
RETURN
°
° ES:BX Startup Info Structure
°
Û---------------------------------ì
In CX:DX wird die Adresse des Switcher-Call-InEntry-Points übergeben. Nach dem
Aufruf steht in ES:BX die Adresse auf eine WIN 386 Startup Info Structure mit folgendem
Aufbau:
Offset
00H
02H
08H
0AH
0EH
Byte
2
4
4
4
4
Bedeutung
Version Info Struktur
Zeiger auf nächste Startup Info Struktur
0000:00000
reserviert
Zeiger auf den Instance Data Record
Offset Byte Bedeutung Instance Data Record
00H
4
Adresse
Instance Data
04H
2
Länge
Bereich Instance Data
Client-Programme mit Instance Daten müssen diesen Aufruf abfangen und ohne
Veränderung der Register an den vorhergehenden Treiber weiterleiten. Nach der Rückkehr
muß der Client obige Startup-Info-Struktur anlegen, die in ES:BX übergebene Adresse in
der Struktur ab Offset 02H speichern und die Adresse der eigenen Struktur in ES:BX
zurückgeben. Eine genauere Bedeutung des Aufrufes ist allerdings nicht bekannt.
Damit möchte ich die Beschreibung des TaskSwitcher API beenden.
Die Unterfunktion 5453H wird durch das TesSeRact-Interface belegt. Hierbei handelt es
sich um eine Vereinbarung zur Koordinierung residenter Programme. Einzelheiten finden
sich im Anhang.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
403
5.24 DOS 5.0/6.0 COMMAND.COM Interface (AX = 5500H)
Diese Unterfunktion existiert erst ab DOS 5.0 und dient intern zur Kommunikation
zwischen transientem und residentem Teil von COMMAND.COM. Die Schnittstelle wird
benötigt, falls der DOS-Kern im HMA-Bereich liegt.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 55H (DOS 5.0/6.0)
°
° AL: 00H (COMMAND.COM)
°
û---------------------------------À
°
RETURN
°
° AX: 0000H
°
° DS:SI Einspungadresse
°
Û---------------------------------ì
Die Funktion wird vom residenten Teil von COMMAND.COM aktiviert, welche den
gemeinsam nutzbaren (shareable) Teil von COMMAND nutzen möchte. Die genaue
Aufrufstruktur zur Aktivierung von DOS-Funktionen über die via DS:SI zurückgegebene
Adresse ist aber nicht bekannt.
Die Funktion AX = 62XXH des INT 2F wird durch PC_Tools V 7.0 belegt. Genaue
Aufrufkonventionen sind aber nicht bekannt.
5.25 Novell NetWare IPX Installation Check (AH = 7AH)
Mit diesem Aufruf läßt sich prüfen, ob der residente Teil der Novell NetWare (Low Level
IPX API) installiert ist. Es gelten folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: 7AH (NetWare)
°
° AL: 00H Get Installation Status °
û---------------------------------À
°
RETURN
°
° AL: Installation Status
°
° ES:DI FAR CALL Entry Point
°
Û---------------------------------ì
Die Funktion gibt nach dem Aufruf im Register AL den Installationsstatus zurück. Mit AL
= 00H ist NetWare nicht installiert und kann installiert werden. Mit AL = FFH ist der
Treiber resident geladen. Dann enthält das Registerpaar ES:DI die Adresse des CALLFAR-Einsprungpunktes für den Funktionsdispatcher. Es besteht aber auch die Möglichkeit,
den Treiber über die INT 2A-Funktionen anzusprechen.
Weiterhin benutzt die NetWare-Shell (3.01d) noch die Funktionen AX = 7A8xH und AX =
7FxxH des INT 2F. Die genaue Aufrufschnittstelle ist aber nicht bekannt.
5.26 ERGO-DOS-Extender Installation Check (AH = A1H)
Die ERGO-DOS-Extender benutzen den Aufruf zur Installationsprüfung. Es gelten
folgende Aufrufparameter:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
404
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: A1H (ERGO Extender)
°
° AL: 00H Extender Code
°
° BX: 0081H
°
° ES:DI 16-Byte-Puffer
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Im Register AX ist vor dem Aufruf eine Kennung des Extendertyps zu übergeben:
AL = FEH
FFH
OS=A/286 oder OS/386
HummingBoard DOS Extender
In ES:DI wird eine Adresse auf einen 16 Byte langen Puffer zurückgegeben, der bei
installiertem Extender die Zeichen "IABH" enthält.
5.27 GRAPHICS.COM Installation Check (AX = AC00H)
Dieser Aufruf existiert erst ab DOS 4.01 und wurde eingeführt, damit GRAPHICS.COM
nicht den gleichen Code wie die CD-ROM zur Installationsprüfung benutzt. Es gelten
folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: C0H (GRAPHICS.COM)
°
° AL: 00H Installation Status
°
û---------------------------------À
°
RETURN
°
° AX: Installation Status
°
Û---------------------------------ì
Das Register AX enthält nach dem Aufruf eine Kennung. Mit AX = FFFFH ist der Treiber
installiert.
5.28 Kommunikation with DISPLAY.SYS (AH = ADH)
Ab DOS 3.3 wird der Treiber DISPLAY.SYS zur Ausgabe verschiedener Zeichenfonts
verwendet. Der INT 2F bietet über die Funktion ADH die Möglichkeit zur Kommunikation
mit dem Treiber.
5.28.1 Get Installation Status (AL = 00H)
Mit diesem Aufruf läßt sich prüfen, ob der Treiber resident installiert ist.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
405
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: ADH (DISPLAY)
°
° AL: 00H Get Installation Status °
û---------------------------------À
°
RETURN
°
° AL: Installation Status
°
Û---------------------------------ì
Die Funktion gibt nach dem Aufruf im Register AL den Installationsstatus zurück. Mit AL
= 00H ist DISPLAY nicht installiert und kann installiert werden. Mit AL = FFH ist der
Treiber resident geladen.
Der Treiber belegt die Unterfunktionen AL = 00H, 01H, 02H, 03H und ab DOS 4.0 die
Codes 10H, 40H. Die Aufrufschnittstelle ist allerdings nicht bekannt.
5.29 DOS 3.3 -Kommunikation mit KEYB.COM (AX =
AD8XH)
Der Treiber KEYB.COM benutzt ebenfalls einige Unterfunktion des INT 2F mit dem Code
AH = ADH.
5.29.1 KEYB.COM Get Installation Status (AX = AD80H)
Als weitere Besonderheit wird ab DOS 3.3 über den INT 2F mit AH = ADH der
Installationsstatus des Treibers KEYB.COM geprüft. In AL ist der Wert 80H zu übergeben.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: ADH (KEYB.COM)
°
° AL: 80H Get Installation Status °
û---------------------------------À
°
RETURN
°
° AL: Installation Status
°
° BX: Versionsnummer
°
° ES:DI interne Daten
°
Û---------------------------------ì
Die Funktion gibt nach dem Aufruf im Register AL den Installationsstatus zurück. Mit AL
= 00H ist KEYB nicht installiert und kann installiert werden. Mit AL = FFH ist der Treiber
resident geladen. Dann findet sich in ES:DI ein Zeiger auf einen internen Datenbereich.
Die Belegung ist allerdings nicht vollständig bekannt. Die in BX zurückgegebene
Versionsnummer ist bis zur Version DOS 5.0/6.0 immer 1.0.
5.29.2 KEYB.COM Set Keyboard Code Page (AX = AD81H)
Mit diesem Aufruf läßt sich ab DOS 3.3 die Codepage für die Tastatur setzen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
406
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: ADH (KEYB.COM)
°
° AL: 81H Set Code Page
°
° BX: Code Page
°
û---------------------------------À
°
RETURN
°
° CF: 1 Fehler
°
° AX: 0001H (Code Page fehlt)
°
° CF: 0 ok.
°
Û---------------------------------ì
Der Aufruf wurde erst ab DOS 5.0 dokumentiert, steht aber bereits ab DOS 3.3 zur
Verfügung. Die Funktion wird durch DISPLAY.SYS aufgerufen.
5.29.3 KEYB.COM Set Keyboard Mapping (AX = AD82H)
Mit diesem Aufruf läßt sich ab DOS 3.3 die Einstellung der Tastatur verändern.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: ADH (KEYB.COM)
°
° AL: 82H Set Keyboard Mapping
°
° BL: Mode
°
û---------------------------------À
°
RETURN
°
° CF: 1 Fehler
°
° CF: 0 ok.
°
Û---------------------------------ì
Der Aufruf wurde erst ab DOS 5.0 dokumentiert, steht aber bereits ab DOS 3.3 zur
Verfügung. In BL wird der neue Tastaturmode übergeben. Hierbei gilt:
BL = 00: US-Keyboard
FF: Foreign Keyboard
Mit FFH läßt sich damit auf die landessprachliche Tastatur umschalten. Auf der Tastatur
kann die Funktion über Ctrl+Alt+F1 und Ctrl+Alt+F2 ebenfalls erreicht werden.
5.29.4 KEYB.COM Get Keyboard Mapping (AX = AD83H)
Mit diesem Aufruf läßt sich ab DOS 3.3 die Einstellung der Tastatur abfragen.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: ADH (KEYB.COM)
°
° AL: 83H Get Keyboard Mapping
°
û---------------------------------À
°
RETURN
°
° BL: Mode
°
Û---------------------------------ì
Der Aufruf wurde erst ab DOS 5.0 eingeführt und gibt in BL den eingestellten
Tastaturmode zurück. Hierbei gilt:
BL = 00:
FF:
US-Keyboard
Foreign Keyboard
Über die Funktion AX = AD82H läßt sich der Mode umschalten.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
407
5.30 DOS Installable Command (AH = AEH)
Ab DOS 3.3 besteht die Möglichkeit zur nachträglichen Installation residenter Kommandos
im Kommandointerpreter. Diese müssen lediglich die Funktion AEH des INT 2F abfangen.
Bei jeder unbekannten Kommandoeingabe aktiviert COMMAND.COM dann die Routinen
in dieser Funktion. Dadurch lassen sich nachträglich neue DOS-Befehle installieren.
5.30.1 Installable Command Install Check (AX = AE00H)
Dieser Aufruf wird durch COMMAND.COM aktiviert, sobald ein Kommando in DOS
eingegeben wurde. Dabei werden folgende Parameter übergeben:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: AEH (Installable Command)
°
° AL: 00H Install Check
°
° DX: FFFFH
°
° DS:BX Kommandozeile
°
û---------------------------------À
°
RETURN
°
° AL: Status
°
Û---------------------------------ì
Der Aufruf steht erst ab DOS 3.3 zur Verfügung. In DS:BX wird von COMMAND.COM
die Adresse auf den Puffer mit der Kommandozeile übergeben. Ein eventuell resident
installiertes Programm kann dann die Kommandozeile auswerten. Im Register AL muß das
Programm dann einen Status an COMMANDO.COM zurückgeben:
AL = 00:
FF:
Kommandozeile wie normal ausführen
Kommando ist eine Erweiterung von
DOS und wird durch TSR-Programm ausgeführt.
Das Programm APPEND benutzt diesen Aufruf um sich als internes Kommando zu
installieren. Die Kommandozeile ist in einem Buffer gespeichert, der folgende Struktur
besitzt:
Byte
1
1
n
Bemerkung
Länge Puffer
Zeichenzahl im Puffer
Zeichen im Puffer
Das aktivierte Programm kann dann den Text im Puffer analysieren und gegebenenfalls als
Kommando ausführen. Dann ist der Wert FFH in AL zurückzugeben, damit
COMMAND.COM das Kommando nicht selbst ausführt.
5.30.2 Installable Command Execute Command (AX = AE01H)
Dieser Aufruf wird durch COMMAND.COM aktiviert, sobald ein Kommando in DOS
eingegeben wurde und bekannt ist, daß eine residente Erweiterung vorliegt. Dabei werden
folgende Parameter übergeben:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
408
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: AEH (Installable Command)
°
° AL: 01H Execute Command
°
° DX: FFFFH
°
° DS:SI Puffer
°
û---------------------------------À
°
RETURN
°
° DS:SI Puffer
°
Û---------------------------------ì
Der Aufruf steht erst ab DOS 3.3 zur Verfügung. Die Funktion wird ausgeführt, falls beim
Aufruf von AX = AE00H das TSR-Programm den Wert AL = FFH zurückgegeben hat. In
DS:SI wird die Adresse auf den Puffer übergeben. Nach dem Aufruf steht in Puffer im
ersten Byte die Länge des Kommandos. Dahinter folgt das Kommando in Großbuchstaben
(falls Länge <> 0). Falls das gerufende Programm den String nicht löscht, versucht
COMMAND.COM dann das Kommando als internen Befehl auszuführen. APPEND nutzt
z.B. diesen Mechanismus.
5.31 DOS 3.3 GRAFTABL.COM INSTALLATION CHECK (AH
= B0H)
Die Unterfunktion ist ab DOS 5.0 dokumentiert und erlaubt ab DOS 3.3 die Prüfung, ob
GRAFTABL.COM installiert ist.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: B0H (GRAFTABL)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Der zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Programmes.
·
Falls AL = 0 ist, dann ist der Treiber nicht vorhanden und kann installiert werden.
·
Mit AL = 1 ist der Treiber nicht vorhanden, kann aber auch nicht neu installiert
werden.
·
Falls AL = FFH ist, dann ist der Treiber installiert.
GRAFTABL nutzt weiterhin den Code 01H als Unterfunktion um eine Tabelle mit den
Graphik Fonts zu laden. Die Adresse der Tabelle ist in DS:BX zu übergeben. Die
Bedeutung der Aufrufes ist allerdings nicht klar.
Die INT 2F-Funktion B4xxH wird durch den IBM 3270-Emulator belegt. Genaue
Spezifikationen liegen jedoch nicht vor.
5.32 Kommunikation with APPEND (AH = B7H)
Der Aufruf steht ab DOS 3.3 zur Verfügung.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
409
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: B7H (APPEND)
°
° AL: Unterfunktionscode
°
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Mit diesem Aufruf läßt sich mit dem residenten Programm APPEND kommunizieren. Es
gelten folgende Übergabeparameter:
Im Register AL wird der Code der Unterfunktion angegeben.
5.32.1 Get Installationsstatus (AX = B700H)
In DOS 3.3 ist nur die Unterfunktion AL = 00 (Get Installationsstatus) implementiert. Mit
diesem Aufruf läßt sich der Status des residenten Programmes APPEND prüfen. Es gelten
folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: B7H (APPEND)
°
° AL: 00H Get Installationsstatus °
û---------------------------------À
°
RETURN
°
° AL: Statusbyte
°
Û---------------------------------ì
Der zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Treibers.
·
Falls AL = 0 ist, dann ist der residente Teil von APPEND nicht vorhanden und kann
installiert werden.
·
Falls AL = FFH ist, dann ist der residente Teil von APPEND installiert.
Mit dem APPEND-Kommando lassen sich in DOS Suchpfade für verschiedene
Verzeichnisse angeben. Diese Einheiten werden durchsucht, falls eine Datei nicht im
Standardverzeichnis gefunden wird. Der Aufruf ist in DOS 3.x und DOS 4.x implementiert.
Der Aufruf AX = B701H ist durch APPEND belegt, aber die Schnittstelle ist nicht bekannt.
5.32.2 Get APPEND Version (AX = B702H)
Dieser Aufruf ist erst ab DOS 4.0 implementiert und ermöglicht die Abfrage der APPENDVersion. Er gelten folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: B7H (APPEND)
°
° AL: 02H Get Version
°
û---------------------------------À
°
RETURN
°
° AX: Version
°
Û---------------------------------ì
Der Aufruf ermöglicht eine Prüfung, ob die Netzwerkversion oder die DOS-Version des
APPEND-Befehls geladen ist.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
410
Enthält das Register AX nach dem Aufruf den Wert FFFFH, dann ist weder die DOS-4.0
noch die 5.0 Version des Befehls APPEND installiert.
Bei DOS 4.0-6.0 enthält AL die Hauptversionsnummer und AH die Unterversionsnummer.
5.32.3 APPEND Hook INT 21 (AX = B703H)
Dieser Aufruf steht in DOS 3.3 und 5.0 zur Verfügung. Er fängt den INT 21-Interrupt ab.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: B7H (APPEND)
°
° AL: 03H Hook INT 21
°
° ES:DI Adresse
°
û---------------------------------À
°
RETURN
°
° ES:DI Adresse
°
Û---------------------------------ì
Mit diesem Aufruf hängt sich APPEND in den INT 21-Vektor ein. Bei den folgenden
Aufrufen wird über ein Flag entschieden, ob der APPEND-Handler, oder der INT 21Handler aktiviert wird.
5.32.4 Get APPEND Path Pointer (AL = 04H)
Auch dieser Aufruf ist erst ab DOS 4.0 implementiert und ermöglicht die Abfrage des
APPEND-Zeigers auf den APPEND-Pfad. Es gelten folgende Übergabeparameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: B7H (APPEND)
°
° AL: 04H Get APPEND Path Pointer °
û---------------------------------À
°
RETURN
°
° ES:DI Zeiger auf Path
°
Û---------------------------------ì
Der Aufruf gibt im Registerpaar ES:DI einen 32-Bit-Zeiger auf den gerade aktiven
APPEND-Pfad zurück. Dieser Aufruf ist allerdings nur bei der DOS-Version 4.0 des
APPEND-Befehls implementiert.
5.32.5 Get APPEND Function State (AL = 06H)
Dieser Aufruf ist nur in der DOS-4.0-Version von APPEND implementiert und ermöglicht
die Abfrage des Funktionsstatus. Es gelten folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: B7H (APPEND)
°
° AL: 06H Get Function State
°
û---------------------------------À
°
RETURN
°
° BX: Function State
°
Û---------------------------------ì
Im Register BX wird ein 16-Bit-Statuswort zurückgegeben, welches Aufschluß über den
aktuellen Zustand von APPEND gibt. Bei gesetzten Bits gelten folgende Bedingungen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Bit
0
12
13
14
15
:
:
:
:
:
411
APPEND ist aktiv
Directory Search (DOS 5.0)
/PATH Option ist gesetzt
/E Option ist gesetzt
/X Option ist gesetzt
Diese Optionen lassen sich in der DOS-4.0-Version von APPEND setzen oder löschen. Die
vorliegende Funktion erlaubt nur die Abfrage der gesetzten Optionen.
5.32.6 Set APPEND Function State (AL = 07H)
Dieser Aufruf ist ab der DOS-4.0-Version von APPEND implementiert und ermöglicht die
Modifizierung des Funktionsstatus. Es gelten folgende Aufrufparameter:
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: B7H (APPEND)
°
° AL: 07H Set Append State
°
° BX: Append State
°
û---------------------------------À
°
RETURN
°
° --°
Û---------------------------------ì
Im Register BX wird ein 16-Bit-Statuswort übergeben, welches den Status der APPENDFunktion modifiziert. Dabei gilt die Kodierung der einzelnen Bits gemäß Funktion AX =
B706H.
Ein gesetztes Bit (1) aktiviert die entsprechende Option, während ein gelöschtes Bit die
Option deaktiviert. Diese Optionen lassen sich nur in der DOS-4.0-Version von APPEND
setzen oder löschen.
5.32.7 Get Version Info (AL = 10H)
Der Aufruf ist erst ab DOS 3.3 verfügbar und wird mit AX = B710H aktiviert. Nach dem
Aufruf enthält DL die Hauptversionsnummer und DH die Unterversionsnummer.
5.32.8 Set Return Found Name (AL = 11H)
Dieser Aufruf ist erst ab der DOS-4.0-Version von APPEND implementiert und setzt das
Return-Found-Name-Flag. Es werden keine Parameter übergeben. Ist dieses Flag gesetzt,
gibt APPEND beim nächsten INT 21-Funktionsaufruf 3DH (Open Handle), 43H (Get/Set
File Attribut) oder 6CH (Extended Open/Create) den Namen des Zugriffspfades in den
ASCIIZ-Buffer des Anwenderprozesses zurück. Es ist darauf zu achten, daß in diesem
Buffer genügend Platz zur Aufnahme des ASCIIZ-Strings mit dem Pfadnamen vorhanden
ist. Nach Ausführung des INT 21 wird das Return-Found-Name-Flag durch APPEND
wieder zurückgesetzt. Mit diesem Funktionsaufruf läßt sich demnach der Name des
Zugriffspfades für Daten ermitteln.
5.33 Kommunikation with Network (AH = B8H)
Über diesen Aufruf des Interrupt 2F lassen sich verschiedene Netzwerkfunktionen
ansprechen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
412
5.33.1 Netzwerk Installation Check (AL = 00H)
Die Unterfunktion prüft, ob die Kommunikation mit den Netzwerkfunktionen möglich ist.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: B8H (Netzwerk)
°
° AL: 00H Installation Check
°
û---------------------------------À
°
RETURN
°
° AL: 0 not installed
°
°
> 0 installed
°
° BX: Komponent Flag
°
Û---------------------------------ì
Die Funktion gibt im Register AL den Installationsstatus zurück. Alle Werte ungleich 0
signalisieren, daß der Treiber installiert ist. Im Register BX finden sich dann einige Flags,
die auf die Art des Netzwerkknotens hinweisen.
BX = installierte Komponenten
Bit 6
server
Bit 2
messenger
Bit 7
receiver
Bit 3
redirector
Die Funktion benutzt noch die Unterfunktion 03H, um die Power-On-Restart-Adresse zu
ermitteln. Diese wird in ES:BX zurückgegeben. Mit der Unterfunktion 04H läßt sich in
ES:BX die Adresse einer neuen POST-Routine übergeben. Mit AX = B807H wird die
NetBIOS-Adresse der Maschine abgefragt und in CH zurückgegeben. Der Code AX =
B808H ist benutzt, die Belegung ist aber nicht bekannt.
Die Funktion AX = B9xxH wird ebenfalls vom Netzwerk-Redirector RECEIVER.COM
belegt. Die Funktionen:
AL = 00H:
01H:
03H:
04H:
05H:
06H:
08H:
Installationsprüfung
GET RECEIVER.COM INT 2F Handler Adr.
Get RECEIVER.COM POST Adr.
Set RECEIVER.COM POST Adr.
Get Filename
Set Filename
Unlink Keyboard Handler
Da RECEIVER.COM nur selten benutzt wird, möchte ich auf die Wiedergabe der
Aufrufschnittstelle an dieser Stelle verzichten.
5.34 DOS/WINDOWS EGA.SYS Check (AH = BCH)
Dieser Aufruf ist ab DOS 5.0 und ab WINDOWS 3.0 implementiert, sobald der Treiber
EGA.SYS installiert wurde. Dieser Treiber soll den Zustand der EGA-Register für externe
Programme speichern.
5.34.1 EGA.SYS Installation Check (AX = BC00H)
Mit diesem Aufruf läßt sich prüfen, ob der Treiber installiert wurde.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
413
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: BCH (EGA.SYS)
°
° AL: 00H Installation Check
°
û---------------------------------À
°
RETURN
°
° AL: Status
°
Û---------------------------------ì
Der zurückgegebene Wert im Register AL gibt Hinweise über den Status des installierten
Treibers.
·
Falls AL = 0 ist, dann ist der residente Teil von EGA.SYS vorhanden und kann
installiert werden.
·
Falls AL = 1 ist, dann ist der residente Teil von EGA.SYS nicht vorhanden, er läßt sich
aber auch nicht installieren.
·
Falls AL = FFH ist, dann ist EGA.SYS installiert.
In BX wird bei installiertem Treiber der Wert 5456H (TV) zurückgegeben.
5.34.2 EGA.SYS Get Version Info (AX = BC06H)
Mit diesem Aufruf läßt sich die Versionnummer abfragen.
Ö---------------------------------Ì
°
CALL: INT 2F
°
°
°
° AH: BCH (EGA.SYS)
°
° AL: 06H Get Version Info
°
û---------------------------------À
°
RETURN
°
° BX: 5456H ("TV")
°
° CX: Version
°
° DL: Revision
°
Û---------------------------------ì
Der zurückgegebene Wert im Register CX gibt die Version (CH = Hauptversionsnummer)
des Treibers an. In DL findet sich eine Revisionsnummer.
5.35 REDIRIFS.EXE Interface (AX = BFXXH)
Der INT 2F mit dem Code BFH ist für die Kommunikation mit dem PC-LAN-Programm
REDIRIFS.EXE reserviert. Mit AL = 00H läßt sich der Installationsstatus abfragen. Mit
der Unterfunktion BF80H läßt sich die Adresse des internen Arbeitsspeichers abfragen. In
ES:DI ist vor dem Aufruf der FAR Entry Point des IFS Handlers in REDIRIFS zu
übergeben. Nach dem Aufruf zeigt ES:DI auf einen internen Arbeitsspeicher. Die genaue
Bedeutung des Aufrufes ist mir allerdings nicht bekannt.
Der Code AX = C000H ist durch den Novell ODI Link Support Layer belegt, der hier den
Installationscheck abwickelt. Bei installiertem Treiber wird AL = FFH zurückgegeben.
Die Funktion AX = D2xxH wird durch Quarterdecks QEMM 5.0 belegt, der hier die
Installationsprüfung abwickelt. (BX = QD, CX = ME und DX = M0). Nach dem Aufruf ist
AL =FFH falls der Treiber vorhanden ist. DESKVIEW belegt die Funktion AX = DExxH.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
414
PharLap belegt mit dem DOS-Extender den Code AX = ED00H zur Installationsprüfung.
In BL ist beim Aufruf die Versionsnummer des Extenders zu übergeben. Der Status wird in
AL zurückgegeben. Borland benutzt dagegen für ihren DPMI-Lader und den DOSExtender den Code FBXXH. Auf eine detaillierte Beschreibung wird an dieser Stelle
verzichtet, da die Schnittstellen teilweise nicht bekannt sind und der Stoff den Umfang des
Buches sprengen würde.
Damit ist die Beschreibung des INT 2FH abgeschlossen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
415
6 Die Fehlerbehandlung in DOS
Beim Aufruf der DOS-Funktionen und innerhalb der Interrupt-Service-Routinen können
Fehler auftreten. MS-DOS kennt nun verschiedene Möglichkeiten, diese Fehler zu
behandeln. Diese verschiedenen Modi sind etwas abhängig von der Version des
Betriebssystems und sollen nachfolgend beschrieben werden.
6.1 Funktionen ohne Fehlermeldung
Es existieren einige DOS-Funktionsaufrufe, wo Fehler nicht bemerkt werden können. In
diesen Fällen werden überhaupt keine Fehlermeldungen zurückgegeben. Nachfolgende
Tabelle enthält eine Aufstellung dieser Funktionen.
Ö------Ú---------------------------------------------------------Ì
° Code ° Funktion
°
û------é---------------------------------------------------------À
° 00 ° Terminate Programm
°
û------é---------------------------------------------------------À
° 01 ° Read Keyboard And Echo
°
û------é---------------------------------------------------------À
° 02 ° Display Character
°
û------é---------------------------------------------------------À
° 03 ° Auxiliary Input
°
û------é---------------------------------------------------------À
° 04 ° Auxiliary Output
°
û------é---------------------------------------------------------À
° 05 ° Print Character
°
û------é---------------------------------------------------------À
° 06 ° Direct Console I/o
°
û------é---------------------------------------------------------À
° 07 ° Direct Console Input
°
û------é---------------------------------------------------------À
° 08 ° Read Keyboard
°
û------é---------------------------------------------------------À
° 09 ° Display String
°
Û------Ù---------------------------------------------------------ì
Tabelle 6.1: Funktionen ohne Fehlermeldung
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
416
Ö------Ú---------------------------------------------------------Ì
° Code ° Funktion
°
û------é---------------------------------------------------------À
° 0a ° Buffered Keyboard Input
°
û------é---------------------------------------------------------À
° 0b ° Check Keyboard Status
°
û------é---------------------------------------------------------À
° 0d ° Reset Disk
°
û------é---------------------------------------------------------À
° 0e ° Select Disk
°
û------é---------------------------------------------------------À
° 19 ° Get Current Disk
°
û------é---------------------------------------------------------À
° 1a ° Set Disk Transfer Address
°
û------é---------------------------------------------------------À
° 1b ° Allocation Table Information
°
û------é---------------------------------------------------------À
° 1c ° Allocation Table Information For Spezific Device
°
û------é---------------------------------------------------------À
° 24 ° Set Relative Record Field
°
û------é---------------------------------------------------------À
° 25 ° Set Interrupt Vektor
°
û------é---------------------------------------------------------À
° 26 ° Create New Psp
°
û------é---------------------------------------------------------À
° 2a ° Get Date
°
û------é---------------------------------------------------------À
° 2c ° Get Time
°
û------é---------------------------------------------------------À
° 2e ° Set/reset Verify Switch
°
û------é---------------------------------------------------------À
° 2f ° Get Disk Transfer Address
°
û------é---------------------------------------------------------À
° 30 ° Get Dos Version Number
°
û------é---------------------------------------------------------À
° 31 ° Terminate Process And Remain Resident
°
û------é---------------------------------------------------------À
° 35 ° Set Interrupt Vektor
°
û------é---------------------------------------------------------À
° 36 ° Get Disk Free Space
°
û------é---------------------------------------------------------À
° 4c ° Terminate A Process
°
û------é---------------------------------------------------------À
° 54 ° Get Verify State
°
û------é---------------------------------------------------------À
° 62 ° Get Psp Address
°
Û------Ù---------------------------------------------------------ì
Tabelle 6.1: Funktionen ohne Fehlermeldung (Ende)
Nun kann es aber vorkommen, daß eine dieser Funktionen versucht, auf eine nicht
existierende Einheit zuzugreifen. In diesen Fällen tritt ein Fehler auf, der durch das System
abzufangen ist. Wie diese Fehler behandelt werden, wird nachfolgend beschrieben.
6.2 Critical-Error-Handler
Wie bereits oben beschrieben, gibt es in DOS Fehlersituationen, die eine sofortige
Benachrichtigung des Benutzers verlangen. Hierzu gehören insbesondere Zugriffe auf
gestörte oder nicht vorhandene Einheiten, wie zum Beispiel:
·
Zugriff auf ein Diskettenlaufwerk, welches keine Diskette enthält
·
Zugriff auf einen Drucker, der gestört ist (Offline)
·
Zugriff auf eine gesperrte Datei innerhalb eines Netzwerkes
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
417
In diesen oder ähnlichen Fällen wird ein INT 24 ausgelöst, der mit einer Fehlermeldung auf
der Konsole reagiert. Meist wird dann die Abfrage:
Abort, Retry, or Ignore?
erscheinen. Durch eine entsprechende Antwort läßt sich die Reaktion auf diese
Fehlermeldung steuern. Falls sich der Fehler nicht beheben läßt, wird die Funktion
abgebrochen, um den DOS-Kommandointerpreter zu aktivieren.
6.3 Die FCB-orientierten Fehlermeldungen
Aus Gründen der Aufwärtskompatibilität zu den Versionen 1.x fallen einige ältere
Funktionsaufrufe bei der Fehlerbehandlung aus der Reihe. Sie benutzen das AL-Register
zur Fehler- und Statusanzeige. Beim Aufruf der CP/M-orientierten Funktionen wird noch
mit File Control Blocks (FCB) gearbeitet. Die folgende Tabelle enthält eine
Zusammenfassung der betroffenen Funktionen:
Ö------Ú--------------------------------------------------------Ì
° Code ° Funktion
°
û------é--------------------------------------------------------À
° 0f ° Open File
°
û------é--------------------------------------------------------À
° 10 ° Close File
°
û------é--------------------------------------------------------À
° 11 ° Search For First Entry
°
û------é--------------------------------------------------------À
° 12 ° Search For Next Entry
°
û------é--------------------------------------------------------À
° 13 ° Delete File
°
û------é--------------------------------------------------------À
° 16 ° Create File
°
û------é--------------------------------------------------------À
° 17 ° Rename File
°
û------é--------------------------------------------------------À
° 22 ° File Size
°
û------é--------------------------------------------------------À
° 2b ° Set Date (Nicht Über Fcb)
°
û------é--------------------------------------------------------À
° 2d ° Set Time (Nicht Über Fcb)
°
û------é--------------------------------------------------------À
° 33 ° Control-c Check (Nicht Über Fcb)
°
Û------Ù--------------------------------------------------------ì
Tabelle 6.2: Funktionen mit Fehlermeldungen im AL-Register
Tritt ein Fehler auf, wird im Register AL der Wert 0FFH zurückgegeben. Andernfalls ist
das Register AL gelöscht.
6.4 Die handleorientierten Fehlermeldungen
Ab DOS 2.x wurde eine einheitliche Fehlerbehandlung und Signalisierung für die
Funktionsaufrufe eingeführt. Sie betrifft im wesentlichen die ab DOS 2.x neu eingeführten
handleorientierten Aufrufe. Ausgenommen bleiben die bereits oben aufgeführten
Funktionen, die aus Kompatibilitätsgründen eine eigene Fehlerbehandlung durchführen.
Tritt bei den neuen Funktionen ein Fehler auf, wird dies durch ein gesetztes Carry-Flag
signalisiert. Im Register AX findet sich dann der entsprechende Fehlercode, der Hinweise
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
418
auf die Fehlerursache gibt. Die nachfolgende Tabelle gibt die in DOS implementierten
Fehlercodes wieder. Die Fehlercodes sind als Dezimalwerte aufgeführt.
Code ° Fehlerart
------é----------------------------------------------------1
° Ungültige Funktionsnummer
2
° Datei nicht gefunden
3
° Pfad nicht gefunden
4
° Zu viele offene Dateien (keine freien Handles)
5
° Zugriff abgewiesen
6
° Ungültiger Handle
7
° Memory Control Blocks zerstört
8
° Nicht genügend Speicher frei
9
° Ungültige Speicherblockadresse (Segment)
10
° Ungültiges Environment
11
° Ungültiges Format der Parameterblocks
12
° Ungültiger Zugriffscode
13
° Ungültige Daten
14
° Reserviert
15
° Ungültige Laufwerksangabe (nicht vorhanden)
16
° Versuch, das aktuelle Inhaltsverzeichnis zu löschen
17
° Nicht die gleiche Einheit (Rename)
18
° Keine weiteren Dateien
--- ° Ab Dos 3.0 --19
° Schreibversuch auf eine schreibgeschützte Diskette
20
° Unbekannte Einheit
21
° Laufwerk/gerät nicht bereit
22
° Unbekanntes Kommando
23
° Datenfehler (Crc-fehler)
24
° Fehlerhafte Länge der Aufrufstruktur (Sektorlänge)
25
° Seek-fehler (Spur nicht gefunden)
26
° Unbekannter Typ des Speichermediums
27
° Sektor nicht gefunden
28
° Papierendemeldung vom Drucker
29
° Schreibfehler
30
° Lesefehler
31
° Allgemeiner Fehler
32
° Verletzung des Zugriffsrechts bei File Sharing (File Lock)
33
° Verletzung des Zugriffsrechts bei File Lock (Record Lock)
34
° Wechsel des Laufwerks nicht zulässig
35
° Keine Fcb Verfügbar
36
° Überlauf des Sharing-puffers
37
° Code Page Mismatch (ab DOS 4.0)
38
° Dateiende erreicht (ab DOS 4.0)
39
° Speichermedium voll (ab DOS 4.0)
40
° Reserviert
.
° .
49
° .
50
° Funktion wird durch den Netzwerkdienst nicht unterstützt
51
° Netzwerkknoten (Remote) empfängt keine Nachrichten
Tabelle 6.3: MS-DOS-Fehlercodes
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
419
Code ° Fehlerart
------é------------------------------------------------------52
° Name innerhalb des Netzwerkes mehrfach vorhanden
53
° Name innerhalb des Netzwerkes nicht gefunden
54
° Netzwerk belegt
55
° Netzwerkeinheit existiert nicht mehr
56
° BIOS-Aufruf Parameterzahl im Netzwerk überschritten
57
° Hardwarefehler im Netzwerkadapter
58
° Unkorrekte Antwort des Netzwerkes
59
° Unbekannter Netzwerkfehler
60
° Unkompatibler (remote) Adapter im Netzwerk
61
° Ausgabequeue Printer voll
62
° Nicht genügend Speicher für die Print-Datei
63
° Print-Datei ist gelöscht/abgebrochen
64
° Netzwerkname ist gelöscht
65
° Zugriff abgewiesen
66
° Type der Netzwerkeinheit ungültig
67
° Netzwerkname nicht gefunden
68
° Netzwerkname zu lang
69
° BIOS-Grenzwert für die Sessionzahl überschritten
70
° SHARE: Einheit befindet sich temporär im Pause-Mode
71
° Netzwerkaufruf nicht akzeptiert
72
° Printer- oder Diskumleitung im Pause-Mode
73
° reserviert
.
°
.
79
°
.
80
° Datei existiert bereits
81
° FCB existiert bereits
82
° Eintrag im Inhaltsverzeichnis nicht möglich
83
° Fehler innerhalb des INT 24
84
° Zu viele Umleitungen (ab DOS 3.3)
85
° Mehrfachumleitungen auf diese Einheit (ab DOS 3.3)
86
° Ungültiges Paßwort (ab DOS 3.3)
87
° Ungültiger Parameter (ab DOS 3.3)
88
° Netzwerk-Schreibfehler (ab DOS 3.3)
89
° Funktion wird nicht im Netzwerk unterstützt (DOS 4.0)
90
° Benötigte Systemkomponente nicht installiert (DOS 4.0)
Tabelle 6.3: MS-DOS-Fehlercodes (Ende)
Die DOS-Version 2.x unterstützt nur die Fehlercodes 1 bis 18, während handleorientierte
Aufrufe innerhalb des INT 24-Handlers nur die Codes 1 bis 12 liefern. Um die Codes in
der Tabelle zu identifizieren, ist der Wert 18 zu addieren, da der INT 24 die Fehlercodes 1
bis 12 auf die DOS-Fehlercodes 19 bis 31 abbildet. Ab DOS 3.x sind dann alle die oben
aufgeführten Codes implementiert. Im Rahmen der Beschreibung der INT 21Funktionsaufrufe ist meist auch angegeben, welche Fehlercodes zurückgegeben werden.
Allerdings sind diese Angaben nicht immer vollständig, so daß in der Praxis bei
unterschiedlichen DOS-Versionen weitere Fehlercodes auftreten können.
6.5 Erweiterte Fehlercodes
Ab Version 3.x bietet DOS die Möglichkeit, erweiterte Fehlercodes mittels der INT 21Funktion 59H (Get Extended Error Code) abzufragen. Sobald das Carry-Flag gesetzt ist,
bietet diese Funktion weitere Informationen hinsichtlich der Fehlerart. Die erweiterten
Fehlercodes wurden eingeführt, um eine einheitliche Fehlerbehandlung zu ermöglichen.
Die erweiterten Fehlercodes lassen sich nur einmalig abfragen. In jeder neuen DOSVersion werden weitere Fehlercodes implementiert. Ein bereits bestehendes Programm
kann auch mit neueren DOS-Versionen arbeiten, da die alten Fehlermeldungen erhalten
bleiben. Um eine zukünftige Erweiterung der Funktionalität zu ermöglichen, wird beim
Aufruf im Register BX ein Versionscode übergeben. In den DOS-Versionen 3.0 bis 3.3 ist
der Wert immer null.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
420
In den Registern AX, BX und CX wird dann ein erweiterter Fehlercode zurückgegeben,
der genauere Hinweise auf die Fehlerursache und deren Beseitigung gibt.
Im Register AX findet sich ein erweiterter Fehlercode. Die Funktion versucht hier die
Fehlermeldungen der handleorientierten DOS-Versionen abzubilden. Der übergebene Wert
entspricht den üblicherweise im Register AL übergebenen Fehlercodes. Falls dieser Code
nicht mehr existiert, wird die am besten passende Fehlernummer zugeordnet.
Im Register BH findet sich ein Code, der die Fehlerklasse beschreibt. Es gilt folgende
Nomenklatur:
Code ° Fehlerklasse
------é------------------------------------------------------------------01 ° Fehlende Resourcen (z.B. kein Speicher mehr frei, oder alle Kanäle belegt)
02 ° Hierbei handelt sich sich nicht um einen Fehler, sondern um eine temporäre
° Situation, die einen einwandfreien Ablauf verhindert (z.B. Zugriffsversuch
° auf einen Locked-Bereich einer Netzwerkdatei)
03 ° Fehlende oder falsche Autorisierung (z.B. kein Create Access,
° um eine Datei zu löschen)
04 ° Fehlerursache in der internen Systemsoftware (Plausibilität verletzt)
05 ° Hardwarefehler
06 ° Fehler in der Systemsoftware, der nicht durch den laufenden Prozeß
° bewirkt wurde (z.B. fehlende oder falsche Konfigurationsdateien)
07 ° Fehler im Anwendungsprogramm
08 ° Datei oder Einheit nicht gefunden
09 ° Datei oder Einheit besitzen ein falsches Format oder Typ
10 ° Datei oder Einheit blockiert (locked)
11 ° Falsche Diskette im Laufwerk, oder die Diskette ist beschädigt, oder
° sonstige Probleme mit dem Speichermedium
12 ° Spezifizierter Name existiert bereits (z.B. Versuch, einen Namen innerhalb
° eines Netzwerkes mehrfach zu vergeben)
13 ° Fehlerursache kann nicht entschlüsselt werden
14 ° Operation läßt sich nicht ausführen (ab DOS 5.0)
15 ° Time Out (ab DOS 5.0)
Diese Hinweise lassen sich dann in eine entsprechende Fehlermeldung umsetzen. Als
weitere Hilfestellung liefert die Funktion einen Code im Register BL, der Hinweise zur
weiteren Vorgehensweise enthält. Es gilt folgende Kodierung:
Code ° Aktion
------é-----------------------------------------------------------------------01 ° Wiederhole Versuch und gebe dann einen Hinweis an den Benutzer
02 ° Wiederhole den Versuch nach einer Pause
03 ° Falls der Anwender Datei-, Pfad- oder Laufwerksnamen eingegeben hat,
° wiederhole die Abfrage
04 ° Setze die benutzten Resourcen zurück und beende das Programm
° (z.B. Dateien schließen)
05 ° Das System ist so stark gestört, daß das Programm sofort zu beenden ist
° (Dateien sollten nicht mehr geschlossen werden)
06 ° Der gemeldete Fehler dient nur zur Information
07 ° Fehlermeldung mit Abfrage an den Benutzer (z.B. Disketten einlegen),
° dann wiederhole den Versuch noch einmal
Als weitere Information findet sich im Register CH ein Hinweis zur Lokalisierung des
Fehlers. Es gelten folgende Konventionen:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
421
Code ° Bemerkung
------é--------------------------------------------------------------------------01 ° unbekannt
02 ° Der Fehler trat bei einem wahlfreien Zugriff auf eine blockorientierte
° Einheit (z.B. Diskette) auf
03 ° Der Fehler trat im Netzwerk auf
04 ° Der Fehler trat bei einem sequentiellen Zugriff auf eine zeichenorientierte
° Einheit auf (z.B. Printer nicht bereit)
05 ° Der Fehler trat bei einem Zugriff auf den RAM-Speicher auf
Die erweiterten Fehlercodes sollten nur innerhalb folgender Konstellationen benutzt
werden:

Innerhalb eines INT 24-Handlers, um auch Netzwerkfehler abzufangen.
·
Bei Verwendung von INT 21-Funktionsaufrufen, falls das Carry-Flag gesetzt ist und
der Fehlercode im Register AX zurückgegeben wird.
·
Bei FCB-Funktionsaufrufen, die als Fehler den Wert FFH im AL-Register
zurückgeben.
An Hand der zurückgegebenen Werte, insbesondere im BL-Register, läßt sich dann die
weitere Vorgehensweise bestimmen.
6.6 Funktionen mit abweichenden Fehlercodes
Bei einigen INT 21-Funktionen weichen die zurückgegebenen Fehlercodes von der
allgemeinen Fehlerdefinition ab. Die nachfolgende Tabelle enthält eine Aufstellung dieser
Funktionen:
Ö------Ú---------------------------------------------------------Ì
° Code ° Funktion
°
û------é---------------------------------------------------------À
° 14 ° Sequential Read
°
û------é---------------------------------------------------------À
° 15 ° Sequential Write
°
û------é---------------------------------------------------------À
° 21 ° Random Read
°
û------é---------------------------------------------------------À
° 22 ° Random Write
°
û------é---------------------------------------------------------À
° 27 ° Random Block Read
°
û------é---------------------------------------------------------À
° 28 ° Random Block Write
°
û------é---------------------------------------------------------À
° 29 ° Parse Filename
°
Û------Ù---------------------------------------------------------ì
Tabelle 6.4: Funktionen mit abweichenden Fehlercodes
Nähere Informationen sind den jeweiligen Funktionsbeschreibungen zu entnehmen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
422
7 DOS-Memory-Manager und DOSDatenstrukturen
Im Kapitel über die MS-DOS-Speicheraufteilung wurde das Speicherabbild des 640Kbyte-RAM-Bereiches vorgestellt. Die relative Lage einzelner Bereiche (Puffer,
Einheitentreiber, Kommandointerpreter, Anwenderprogramme) zueinander ist zwar
bekannt, nicht aber ihre absoluten Anfangsadressen. DOS nimmt erst zur Laufzeit die
Aufteilung des RAM-Bereiches vor. Dies hat natürlich Konsequenzen hinsichtlich
Speicherverwaltung und Programmablauf. Da zum Beispiel der residente Teil des
Kommandointerpreters (COMMAND.COM) oberhalb des DOS-Pufferbereiches liegt, sind
Lage und Größe der Puffer bereits beim Systemstart festzulegen. Dies erfolgt mittels der
Steuerdatei CONFIG.SYS, die einmalig durch das Programm IO.SYS (IBMBIO.COM)
ausgeführt wird.
Nun muß DOS aber auch für eigene Bedürfnisse in der Lage sein, die Adressen einzelner
Bereiche festzustellen. Für diesen Zweck besitzt MS-DOS einen eigenen Speichermanager
(Memory-Manager) zur dynamischen Verwaltung. Prozesse können ihren aktuellen
Speicherbedarf dem Memory-Manager über folgende INT 21-Aufrufe mitteilen:
48h
49h
4ah
Allocate Memory
Free Allocated Memory
Modify Allocated Memory
Bei anderen Systemaufrufen (z.B. 4BH Load and Execute a Programm) werden die
Speicheranforderungen implizit durch die Funktion aktiviert. Der Memory-Manager
versucht die jeweilige Anforderung zu befriedigen, wobei der Speicher in Blöcke zu je 16
Byte (Paragraphen) unterteilt wird, d.h. es kann immer nur ein Block, oder ein Vielfaches
davon, angefordert oder freigegeben werden.
7.1 Die Speicherverwaltungsstrategie des MemoryManagers
Werden von Programmen und Treibern dynamische Speicherblöcke angefordert und
wieder freigegeben (z.B. Laden von Subprozessen und residenten Programmen, Freigabe
des PSP und Environmentsegments etc.), dann führt dies mit der Zeit zu einer
Fragmentierung des Speicherbereiches (Bild 7.1). Die freien Blöcke sind in BIld 7.1 mit
Zahlen belegt, während der Rest bereits verfügt ist.
Ö-------Ú---Ú-Ú--------Ú--------Ú-Ú------Ú-Ú-------Ú-------°
10 °###°1°########°
10
°#° 10 °#°
50 °#####...
Û-------Ù---Ù-Ù--------Ù--------Ù-Ù------Ù-Ù-------Ù--------
Bild 7.1: Fragmentierung des DOS-Speicherbereiches
Nun kann es vorkommen, daß eine Speicheranforderung von FFFH Blöcken (64 Kbyte)
zurückgewiesen wird, obwohl vielleicht insgesamt noch 96 Kbyte Speicher frei sind. Dies
liegt daran, daß einem Prozeß nur zusammenhängende Blöcke zugewiesen werden können.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
423
Falls nun der größte zusammenhängende Block 7FFH Paragraphen (32 Kbyte) enthält,
wird die Anforderung zurückgewiesen (Bild 7.2)
Ö-----Ú------Ú-----Ú------Ú------Ú------Ú-------°#####° 7FFH °#####° 7FFH °######° 7FFH °######...
Û-----Ù------Ù-----Ù------Ù------Ù------Ù--------->
Bild 7.2: Abweisung einer Speicheranforderung
Die einzige Lösung bestände darin, die belegten Speicherbereiche zusammenzuschieben,
um so einen größeren freien Block zu erhalten. Dies wird aber durch DOS nicht unterstützt.
Es sind aus der Theorie aber verschiedene Strategien (first fit, best fit, last fit) zur
optimaleren Freispeicherverwaltung bekannt. Diese sollen nachfolgend kurz beschrieben
werden.
first fit
Es wird angenommen, daß ein fragmentierter Speicher mit folgender Struktur vorliegt:
Ö-------Ú-Ú----------Ú---Ú-------Ú--Ú----Ú-------°
10 °#°
40
°###° 30
°##° 15 °#####...
Û-------Ù-Ù----------Ù---Ù-------Ù--Ù----Ù---------->
Bild 7.3: Speicherabbild vor einer Speicheranforderung (first fit)
Nun wird ein Speicherbereich von 15 Blöcken angefordert. Der Memory-Manager
durchsucht den Speicher nach dem ersten zusammenhängenden Bereich, der mindestens
der angeforderten Blockgröße entspricht. Der erste freie Bereich (10 Blöcke) ist zu klein,
aber der nächste Freispeicher (40 Blöcke) reicht aus. Es ergibt sich anschließend folgendes
Bild:
Ö-------Ú-Ú---Ú------Ú---Ú-------Ú--Ú----Ú-------°
10 °#°###° 25 °###° 30
°##° 15 °#####...
Û-------Ù-Ù---Ù------Ù---Ù-------Ù--Ù----Ù---------->
Bild 7.4: Speicherabbild nach einer Speicheranforderung (first fit)
Von den 40 freien Blöcken wurden 15 Blöcke neu belegt. Eine weitere Anforderung von
40 Blöcken kann nun nicht mehr befriedigt werden, obwohl insgesamt noch 80 Blöcke frei
sind. Offensichtlich hat in diesem Fall die Strategie versagt, da der Speicher bei
Verwendung des letzten freien Bereiches (15 Blöcke) besser ausgenutzt würde. Die Firstfit-Methode besitzt den Vorteil, daß ein Speicherblock im Mittel recht schnell zugeordnet
wird, da nicht der gesamte Speicherraum durchsucht werden muß. Die Methode empfiehlt
sich, wenn die freien Speicherbereiche annähernd gleiche Größen besitzen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
424
best fit
Bei oben diskutierter Strategie trat der Fall auf, daß große freie Speicherbereiche durch die
Anforderungen nur teilweise belegt werden. Dies führte dazu, daß letztlich zwar in der
Summe ein großer freier Speicherbereich vorlag, dieser aber in viele kleine Teile
fraktioniert wurde. Damit ist das System nach einer gewissen Zeit nicht mehr in der Lage,
größere Speicherplatzanforderungen zu erfüllen. Die Anfragen müssen also abgewiesen
werden, obwohl die Summe der freien Bereiche die angeforderte Größe vielleicht
übersteigt. Naheliegend ist daher die Überlegung, den angeforderten Bereich nicht in das
erste passende Segment zu legen, sondern ein optimales freies Segment auszuwählen. Bei
der Best-fit-Strategie wird dieser Ansatz benutzt. Es sei zum Beispiel folgende
Konfigurierung gegeben.
Ö-------Ú-Ú----------Ú---Ú-------Ú--Ú----Ú-------°
10 °#°
40
°###° 30
°##° 15 °#####...
Û-------Ù-Ù----------Ù---Ù-------Ù--Ù----Ù---------->
Bild 7.5: Speicherabbild vor einer Speicheranforderung (best fit)
Nun wird ein Speicherbereich von 14 Blöcken angefordert. Anschließend liegt folgende
Verteilung vor.
Ö-------Ú-Ú----------Ú---Ú-------Ú--Ú--Ú-Ú-------°
10 °#°
40
°###° 30
°##°##°1°#####...
Û-------Ù-Ù----------Ù---Ù-------Ù--Ù--Ù-Ù---------->
Bild 7.6: Speicherabbild nach einer Speicheranforderung (best fit)
Die Darstellung zeigt, daß bei der Anforderung der am besten passende Bereich belegt
wurde. Es wird lediglich 1 Block »verschenkt« Die Best-fit-Strategie stellt also sicher, daß
keine großen zusammenhängenden Bereiche fragmentiert werden, solange noch passende
kleinere Lücken vorliegen. Die .i.Speicherausnutzung; ist also ökonomischer. Dies wird
allerdings mit dem Nachteil erkauft,»daß der gesamte Speicher nach freien Lücken
durchsucht werden muß. Nur wenn eine Lücke gefunden wird, deren Größe mit der
angeforderten Speichergröße übereinstimmt, kann die Suche vorher abgebrochen werden,
da dann das Optimum bereits erreicht wurde. Weiterhin sind die freibleibenden
Restsegmente sehr klein, so daß eine Belegung durch andere Programme kaum möglich
wird. Dies kann bei bestimmten Applikationen durchaus unerwünscht sein, so daß eine
andere Strategie günstiger ist.
last fit
Als letzte Strategie soll die Last-fit-Methode besprochen werden. Hier wird versucht, den
letzten passenden Speicherbereich zu belegen. Es sei zum Beispiel folgende Konfiguration
gegeben.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
425
Ö-------Ú-Ú----------Ú---Ú-------Ú--Ú----Ú--Ú--Ú---°
10 °#°
40
°###° 30
°##° 15 °##° 9°##..
Û-------Ù-Ù----------Ù---Ù-------Ù--Ù----Ù--Ù--Ù------>
Bild 7.7: Speicherabbild vor einer Speicheranforderung (last fit)
Eine Speicheranforderung von 10 Blöcken ergibt dann folgendes Bild:
Ö-------Ú-Ú----------Ú---Ú-------Ú--Ú--Ú-Ú--Ú--Ú---°
10 °#°
40
°###° 30
°##°##°5°##° 9°#...
Û-------Ù-Ù----------Ù---Ù-------Ù--Ù--Ù-Ù--Ù--Ù------>
Bild 7.8: Speicherabbild nach einer Speicheranforderung (last fit)
In diesem Fall wurde zwar nicht die optimale Belegung gefunden, da ja der erste freie
Bereich genau 10 Blöcke enthält. Aber das Ziel dieser Strategie ist es ja, zuerst den oberen
Speicherbereich zu belegen. Dies kann zum Beispiel erwünscht sein, wenn
Anwenderprogramme geladen werden, die sich oberhalb des residenten Teils des DOSKommandointerpreters
(COMMAND.COM)
befinden
sollen,
während
die
Systemprogramme und Treiber im unteren Speicherbereich liegen. Als Nachteil wirkt sich
einmal die Tatsache aus, daß der gesamte freie Speicher durchsucht werden muß, es sei
denn, es liegt eine doppelt verkettete Liste der freien Blöcke vor. Dann kann die Analyse
mit dem letzten Block beginnen. MS-DOS unterstützt diese doppelt verketteten Listen
allerdings nicht, so daß die Suche nur von der unteren Speichergrenze beginnt. Weiterhin
ist wie bei der First-fit-Methode keine optimale Speicherverwaltung gewährleistet.
Ab DOS 5.0 sind weitere Strategien zur Zuweisung des Speichers implementiert. Auf
80386-Systemen kann der Bereich zwischen 640 Kbyte und 1 Mbyte mit Adaptern und
RAM-Speicher belegt werden. Diese als Upper Memory Blocks bezeichneten Bereiche
lassen sich für Programme nutzen. Die Strategien wurden deshalb ab DOS 5.0 auf die
Suche in diesen Blöcken ausgeweitet (first fit UMB first, best fit UMB first, last fit UMB
first). Erst wenn kein freier Speicher im UMB gefunden wird, sucht DOS den 640-KbyteBereich durch.
Im DOS-Memory-Manager sind alle beschriebenen Freispeicherverwaltungsmodelle
implementiert. Standardmäßig wird die First-fit-Methode eingestellt. Mittels der
undokumentierten INT 21-Funktion 5800H (Get-Allocation-Strategie) läßt sich der
eingestellte Mode abfragen. Im AX-Register wird die Kodierung:
0
1
2
First fit
Best fit
Last fit
zurückgegeben. Der Funktionsaufruf 5801H (Set-Allocation-Strategie) erlaubt die
Modifizierung dieser Einstellung über einen entsprechenden Codewert im BX-Register.
Der Systemaufruf wird genauer im Kapitel über die INT 21-Funktionen besprochen.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
426
7.2 Die Memory-Control-Blocks (MCB)
Da der interne Arbeitsspeicher von DOS in Blöcke zu je 16 Byte aufgeteilt wird, muß eine
Verwaltung dieses Speichers durch den DOS-Memory-Manager erfolgen. Woran erkennt
dieser nun, welche Blöcke belegt sind und welche Informationen dort abgelegt wurden. Die
einfachste Möglichkeit bestände darin, eine Tabelle mit je einem Eintrag für jeden
Paragraphen (16 Byte) im Speicher anzulegen. Bei einem Speicher von 1 Mbyte bedeutet
dies aber, daß alleine die Tabelle bereits 8 Kbyte (1 Bit pro Paragraph) oder mindestens 64
Kbyte (1 Byte pro Paragraph) belegt. Dort sind dann noch keine Informationen über die Art
der Daten im belegten Block vorhanden.
DOS geht daher einen anderen Weg, indem es über Zeigerstrukturen und verkettete Listen
die jeweiligen Blöcke markiert. Hierzu wird vor jedem belegten oder freien
Speicherbereich eine 16 Byte großen Datenstruktur (1 Paragraph) generiert. Diese wird als
Memory-Control-Block (MCB) bezeichnet und enthält Informationen über die Zahl der
belegten Paragraphen, der Lage des folgenden MCB, dem Eigentümer des Blocks, etc. Der
Aufbau des MCB ist folgender Tabelle zu entnehmen (erst ab DOS 5.0 dokumentiert).
Ö--------Ú-------Ú-----------------------------------------------Ì
° Offset ° Bytes ° Feld
°
û--------é-------é-----------------------------------------------À
°
00
°
1
° Identifikationszeichen ('M'oder 'Z')
°
°
01
°
2
° Segmentadresse des nächsten PSP
°
°
03
°
2
° Zahl der belegten Paragraphen
°
°
05
° 11
° reserviert für künftige Erweiterungen
°
Û--------Ù-------Ù-----------------------------------------------ì
Tabelle 7.1: Aufbau des Memory-Control-Blocks (MCB).
Im ersten Byte finden sich die Zeichen 'M' (4DH) und 'Z' (5AH). Sie dienen zur Prüfung,
ob es sich wirklich um einen MCB handelt. Beginnend vom ersten MCB bis zum
vorletzten MCB wird das Zeichen 'M' eingetragen. Das Zeichen 'Z' markiert den letzten
MCB in der Kette. Die Buchstaben entsprechen den Initialen des DOS-Entwicklers Mark
Zbikovski, der sich hier ein heimliches Denkmal gesetzt hat.
Das übernächste Wort (Offset 03H) enthält die Zahl der durch den Block belegten
Paragraphen. Hierzu zählt auch der Paragraph (16 Byte) des MCB. Wird zu diesem Wert
eine 1 addiert, ist dies die Segmentadresse des folgenden MCB. Da die MCB's immer an
Segmentgrenzen liegen, ist der Offset gleich null.
Im ersten Wort (Offset 01H) findet sich ein Zeiger (Segmentadresse) auf das zugeordnete
Program-Segment-Prefix (PSP). Dieser Speicherbereich bildet den Vorspann zu einem
ausführbaren Programm und wird auf den nachfolgenden Seiten näher beschrieben. Es
kann vorkommen, daß mehrere MCB's einen Zeiger auf das gleiche PSP enthalten. Dies ist
erklärbar, da die DOS-EXEC-Funktion beim Erzeugen eines Subprozesses sowohl einen
Programmlaufbereich mit vorgeschaltetem PSP reserviert als auch einen
Environmentbereich. Jedem dieser Bereiche wird ein MCB vorangestellt, der einen Zeiger
auf dieses PSP enthält.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
427
DCB
Ö------Ì
û------À-+ Ö------Ì
Ö------Ì
Ö------Ì
Ö------Ì
û------À ! ° 'M' °
° 'M' °
° 'M' °
° 'Z' °
û------À ! û------À
û------À
û------À
û------À
Û------ì +>° MCB 1°--->° MCB 2°--->° . . .°--->° MCB n°
û------À
û------À
û------À
û------À
Û------ì
Û------ì
Û------ì
Û------ì
Bild 7.9: Die DOS-Memory-Control-Block-Kette
Zur Verwaltung des Speichers bietet DOS die drei INT 21-Funktionen:
48H
49H
4AH
Allocate Memory
Free Allocated Memory
Set Block
Alle diese Aufrufe verändern den Speicher in seiner Struktur. Wird zum Beispiel ein
Bereich mit 48H reserviert, legt DOS einen MCB an, der diesen Block markiert. Wird ein
bestehender Block durch die Funktion Set Block (4AH) verkleinert, dann legt DOS einen
zweiten MCB für den freien Block an. Die Informationen im MCB des belegten Blocks
werden entsprechend justiert. Freie und belegte MCB's werden ab Offset 01H mit der PSPAdresse markiert. Wird ein Block durch den Memory-Manager freigegeben, setzt er diesen
Eintrag auf den Wert 0000H zurück. Die Länge des freien Bereiches (in Paragraphen) wird
ab Offset 03H vermerkt. Die Umrechnung in Byte erfolgt mit der Formel:
Länge in Byte = (Länge in Paragraphen -1) * 16
Alle Einträge ungleich 0000H ab Offset 01H signalisieren, daß der Block belegt ist. Bei
einzelnen MCB's findet sich dort aber der Wert 0008H. Es ist aber unwahrscheinlich, daß
auf Adresse 0008:0000 ein MCB liegt, da dieser Bereich für die Interruptvektor-Tabelle
reserviert wurde. Der Wert 0008H ab Offset 01H signalisiert deshalb, daß der MCB durch
das System belegt wurde. Dieses benötigt ja auch Speicherplatz für seine internen Tabellen,
Buffer und Treiber etc. Alle diese Bereiche besitzen aber kein PSP-Segment, so daß DOS
die Blöcke mit 0008H markiert.
Die restlichen Byte ab Offset 05H bis Offset 0FH im Kopf des MCB bleiben bis DOS 3.3
unbelegt und sind für zukünftige Erweiterungen reserviert.
Ab DOS 3.1 enthält der erste MCB das DOS-Datensegment mit den Treibern, Puffern, etc.
Der erste MCB wird in allen DOS-Versionen über einen Zeiger aus dem DOS-ControlBlock (DCB) adressiert (siehe folgender Abschnitt).
Änderungen ab DOS 4.0
Ab der Version 4.0 wurden einige nicht dokumentierte Änderungen an der Struktur der
MCB vorgenommen. Der Kopf besteht nach wie vor aus einer 16 Byte (1 Paragraph)
langen Tabelle mit folgender Struktur:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
428
DOS Programmierhandbuch
Ö--------Ú-------Ú-----------------------------------------------Ì
° Offset ° Bytes ° Feld
°
û--------é-------é-----------------------------------------------À
°
00
°
1
° Identifikationszeichen ('M'oder 'Z')
°
°
01
°
2
° Segmentadresse des nächsten PSP
°
°
03
°
2
° Zahl der belegten Paragraphen
°
°
05
°
3
° reserviert für künftige Erweiterungen
°
°
08
°
8
° ASCIIZ-String mit dem Namen des Owners
°
Û--------Ù-------Ù-----------------------------------------------ì
Tabelle 7.2: Aufbau des Memory-Control-Blocks (MCB) ab DOS 4.0
Die Einträge ab Offset 0 bis Offset 07H bleiben gegenüber den älteren Versionen gleich.
Die MCB-Kette wird nach wie vor mit den Zeichen 'M' und 'Z' signiert. Die drei Byte
zwischen Offset 05H und 07H bleiben unbelegt.
Ab Offset 08H legt DOS den Namen des zugehörigen Prozesses als ASCIIZ-String ab.
Dieser Name wird aus den ersten 8 Buchstaben des Filenamens gebildet, aus dem der
Prozeß geladen wurde. Falls der Name kürzer als 8 Zeichen ist, endet er mit einem
Nullbyte (ASCII-Zero-String).
Eine weitere Änderung ergibt sich ab DOS 4.0 bei der Belegung der System-MCBBereiche. Bis zur Version 3.3 legte DOS nur einen MCB für das System an und
kombinierte alle Treiber, Puffer und Tabellen zusammen in diesem Block. Ab der Version
4.0 wird der reservierte MCB-Bereich nochmals in einzelne Unterblöcke unterteilt, in
denen dann jeweils ein Treiber, ein Buffer, ein Stack, etc. untergebracht wird. Das Feld ab
Offset 01H im MCB wird dann mit dem Wert 0008H signiert (Systemblock). An den MCB
schließt sich dann eine 16 Byte lange Datenstruktur (Sub-Control-Block) an, die den
folgenden Unterblock beschreibt. Jeder Teilblock ist mit einem Sub-Control-Block SBC
markiert. Damit ergibt sich innerhalb des System-MCB eine Struktur gemäß folgendem
Bild.
00
01
03
05 08
0F
Ö---Ú-----Ú-----Ú---Ú---------------------------Ì
° M °0008 ° Len °---° Name als ASCIIZ-String
°<û---é-----é-----é---é---------------------------À
°Typ°Block° Len °---° Treibername (ASCIIZ)
°<û---Ù-----Ù-----Ù---Ù---------------------------À
° Speicherbereich des 1. Unterblocks
°
°
°
û---Ú-----Ú-----Ú---Ú---------------------------À
°Typ°Block° Len °---° Treibername (ASCIIZ)
°<û---Ù-----Ù-----Ù---Ù---------------------------À
° Speicherbereich des 2. Unterblocks
°
°
°
...
û---Ú-----Ú-----Ú---Ú---------------------------À
°Typ°Block° Len °---° Treibername (ASCIIZ)
°<û---Ù-----Ù-----Ù---Ù---------------------------À
° Speicherbereich des n. Unterblocks
°
°
°
û---Ú-----Ú-----Ú---Ú---------------------------À
° M °xxxx ° Len °---° Name als ASCIIZ-String
°<û---Ù-----Ù-----Ù---Ù---------------------------À
° ...
°
MCB System
SBC1
SBC2
SBCn
nächster MCB
Bild 7.10: Struktur eines System-Memory-Control-Blocks mit Sub-Control-Blocks
ab DOS 4.0.
Mit dem MCB wird vom System ein genügend großer Speicherbereich reserviert. Dann
teilt DOS diesen Bereich durch die SBC's in einzelne Teile, die jeweils die Treiber, Puffer,
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
429
Stacks etc. aufnehmen. Jeder SBC beginnt mit einem eigenen Kennbuchstaben, der den
Typ des Unterblocks festlegt. Die folgende Tabelle enthält die Kodierung der einzelnen
Typen.
Ö------Ú-----Ú-------------------------------------------Ì
°Offset°Bytes° Feld
°
û------é-----é-------------------------------------------À
° 00 ° 1 ° Typ des SBC's
°
°
°
° 42H = B Buffer für DISK-I/O (BUFFERS=XX) °
°
°
° 43H = C BUFFERS EMS-Arbeitsbereich
°
°
°
° 44H = D Gerätetreiber
(DEVICE=XX) °
°
°
° 45H = E Device Treiber Anhang
°
°
°
° 46H = F Handle Tabelle
(FILES=XX)
°
°
°
° 49H = I IFS-Treiber
°
°
°
° 4CH = L Laufwerksumleitung (SUBST/JOIN) °
°
°
° 4DH = M nächster MCB -> Ende SBC
°
°
°
° 53H = S Stack
(STACKS=XX) °
°
°
° 54H = T INSTALL = transienter Codebereich°
°
°
° 58H = X FCB-Tabelle
(FCBS=XX)
°
°
°
° 5AH = Z letzter MCB -> Ende SBC
°
û------é-----é-------------------------------------------À
° 01 ° 2 ° Zeiger auf Segment Unterblock (Owner)
°
û------é-----é-------------------------------------------À
° 03 ° 2 ° Länge des SBC in Paragraphen
°
û------é-----é-------------------------------------------À
° 05 ° 3 ° reserviert
°
û------é-----é-------------------------------------------À
° 08 ° 8 ° Treibername des Unterblocks für D oder I °
Û------Ù-----Ù-------------------------------------------ì
Tabelle 7.3 Struktur eines SBC-Blocks (DOS 4.x)
Die Struktur lehnt sich stark an den Aufbau der MCB's an. Das erste Byte enthält einen
Buchstaben, der den Typ des Sub-Control-Blocks spezifiziert. 'B' steht dabei zum Beispiel
für die DOS-Disk-Buffer, über die die Daten-Ein-/Ausgabe abgewickelt wird. Die Größe
des Bufferbereiches läßt sich durch die Anweisung:
BUFFERS;=xx
in der Datei CONFIG.SYS einstellen. Der Aufbau des Bufferbereichs wird in einem
eigenen Abschnitt beschrieben. Mit dem Buchstaben 'D' wird ein Codebereich mit einem
DOS-Treiber markiert. Diese Treiber lassen sich in CONFIG.SYS mit der Anweisung:
DEVICE=...
installieren. Bei Gerätetreibern wird gleichzeitig der Dateiname ab Offset 08H im SBC
abgelegt. Fehlende Zeichen werden durch Nullbytes (00H) ersetzt. Die Handle-Tabelle läßt
sich in ihrer Größe durch die Anweisung:
FILES=xx
in CONFIG.SYS beeinflussen. Der dazugehörige SBC enthält den Buchstaben 'F' im
Typfeld. Die Tabelle mit den Laufwerksumleitungen wird durch ein 'L' im SBC markiert.
Die Einträge werden durch die Befehle SUBST und JOIN verwaltet. DOS legt für die
Bearbeitung der Hardwareinterrupts eigene Stackbereiche an. Deren Zahl läßt sich in
CONFIG.SYS durch die Anweisung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
430
STACKS=xx
einstellen. Im SBC erscheint der Kennbuchstabe 'S' für den Unterblock. Das Zeichen 'X'
markiert den Bereich mit den File-Control-Blocks (FCB). Die Tabellen werden aber nur
angelegt, falls in CONFIG.SYS die Anweisung:
FCBS=xx
steht. 'I' steht als Markierung für Daten eines installierbaren Dateisystems (IFS). Mit 'T'
wird ein Daten-/Codebereich markiert, in dem transiente Teile eines Treibers mit
INSTALL = geladen wurden. In DOS 4.x lassen sich Daten für den EMS-Puffer mit 'C'
markieren.
Das Ende des Systembereiches mit den SBC's wird durch den nächsten regulären MCB
markiert. Im Feld mit dem Typ des Blocks tauchen dann die Zeichen 'M'oder 'Z' auf.
Ab Offset 01H enthält der SBC einen 16-Bit-Zeiger auf das Anfangssegment des
zugehörigen Unterblocks. Hierbei handelt es sich in der Regel immer um den folgenden
Unterblock, der im nächsten Paragraphen beginnt.
Der 16 Bit Wert ab Offset 03H gibt die Länge des SBC's in Paragraphen an. Hier sind auch
die 16 Byte des SBC-Kopfes mit einzurechnen. Der Bereich ab Offset 05H bis
einschließlich 07H ist für zukünftige Erweiterungen reserviert. Das gleiche gilt für die 8
Byte ab Offset 08H, falls dort kein Treibername eingetragen ist.
Änderungen ab DOS 5.0
In DOS 5.0 wurde die Struktur für die Systemblöcke aus DOS 4.x übernommen. Trotzdem
ergeben sich einige Änderungen.
Gehört ein MCB zu DOS, wird im MCB in den Bytes ab Offset 08H eine Signatur an
Stelle des Treibernamens eingetragen. SC steht dabei für Bereiche mit Systemcode oder
belegte UMB's (z.B. ROM). SD markiert Systemdaten oder Einheitentreiber.
Weiterhin kann der UMB-Adressbereich durch DOS verwaltet werden. Hier nutzt DOS
ebenfalls MCB's zur Markierung. Der erste Block kann auf Adresse A000:0000H liegen
(EGA-Video-RAM-Bereich). Soll der UMB mit genutzt werden, wird im letzten MCB im
konventionellen 640-Kbyte-Bereich der Buchstabe »ZFehler! Verweisquelle konnte nicht
gefunden werden.MÖ--------Ú-------Ú-----------------------------------------------Ì
° Offset ° Bytes ° Feld
°
û--------é-------é-----------------------------------------------À
°
00
°
1
° Identifikationszeichen ('M'oder 'Z')
°
°
01
°
2
° Segment PSP (0000 frei, 0008 DOS Block)
°
°
03
°
2
° Zahl der belegten Paragraphen
°
°
05
°
3
° reserviert für künftige Erweiterungen
°
°
08
°
8
° Text 'UMB' 1. UMB-Block, 'SM' letzter UMB-Blck°
Û--------Ù-------Ù-----------------------------------------------ì
Tabelle 7.4: Aufbau des UMB-Memory-Control-Blocks (MCB) ab DOS 5.0
Die Belegung des UMB erfolgt jedoch nur, falls in CONFIG.SYS die Anweisung
DOS=UMB vorhanden ist. Der Zugriff auf den 1. MCB im Speicher erfolgt über die
nachfolgend beschriebene Speicherstruktur.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
431
7.3 Struktur und Aufbau des DOS-Control-Blocks (DCB)
Der DOS-Memory-Manager verwaltet einen internen Datenbereich mit Zeigern auf die
MCB-Kette und andere Listen und kann damit alle Informationen über den internen
Speicheraufbau rekonstruieren. Da jede Liste einen Eingangszeiger auf den Listenkopf
benötigt, besitzt MS-DOS eine undokumentierte interne Tabelle, in der die Zeiger auf die
jeweiligen Listenköpfe abgespeichert sind. Diese Datenstruktur wird nachfolgend als DOSControl-Block (DCB) bezeichnet. Eine andere häufig gebrauchte Bezeichnung lautet List of
Lists. Über den undokumentierten INT 21-Funktionsaufruf 52H läßt sich die Lage des
DCB ermitteln (Beschreibung im Kapitel über die INT 21-Funktionen). Im Registerpaar
ES:BX wird ein Zeiger auf diesen internen Datenbereich zurückgegeben. Der Aufbau
dieser Datenstruktur ist ebenfalls undokumentiert und variiert in Abhängigkeit von der
DOS-Version. Für die DOS-Versionen ab 2.x gilt folgende Belegung:
Ö--------Ú-------Ú-----------------------------------------------Ì
° Offset ° Bytes ° Feld
°
û--------é-------é-----------------------------------------------À
° -02H
°
2
° Zeiger auf ersten Memory-Control-Block (MCB) °
û--------é-------é-----------------------------------------------À
° 00H
°
4
° Zeiger auf den Disk-Parameter-Blocks (DPB)
°
û--------é-------é-----------------------------------------------À
° 04H
°
4
° Zeiger auf die Open-File-Tabelle
°
û--------é-------é-----------------------------------------------À
° 08H
°
4
° Zeiger auf den Kopf des CLOCK$-Treibers
°
û--------é-------é-----------------------------------------------À
° 0CH
°
4
° Zeiger auf den Kopf des Consol-Treibers
°
û--------é-------é-----------------------------------------------À
° 10H
°
1
° Zahl der logischen Drives im System
°
û--------é-------é-----------------------------------------------À
° 11H
°
2
° Bytes pro Sektor (Maximalwert)
°
û--------é-------é-----------------------------------------------À
° 13H
°
4
° Zeiger auf den ersten DOS-Puffer
°
Û--------Ù-------Ù-----------------------------------------------ì
Tabelle 7.5: Aufbau des DOS-Control-Blocks (DCB) in DOS 2.x
Die Tabelle enthält mehrere 4-Byte-Zeiger auf verschiedene DOS-Strukturen. Ab Offset 02H ist zum Beispiel der Zeiger auf den ersten MCB-Block abgelegt. Ab Offset 00H ein
32-Bit-Zeiger (Segment:Offset) auf den DOS-Disk-Parameter-Block (DPB) gespeichert.
Daran schließt sich der Zeiger auf die Liste mit den offenen Files an. Die Struktur der
Open File-Tabelle ist in einem eigenen Abschnitt beschrieben. Ab Offset 8 finden sich
zwei 4-Byte-Zeiger auf die CLOCK$- und CON-Treiber. Im Byte ab Offset 10H steht die
Zahl der logischen Laufwerke, die durch das System unterstützt werden. Ab Offset 11H
steht die maximal mögliche Sektorgröße (in Byte) des Systems als 16-Bit-Wert. Daran
schließt sich ein 4-Byte-Zeiger auf den ersten logischen DOS-Disk-Buffer an. Diese Buffer
lassen sich durch den Befehl:
BUFFERS=xx
in der Datei CONFIG.SYS zur Bootzeit installieren. Der DCB endet in DOS 2.x ab Offset
17H, da sich ab dieser Adresse der Code des ersten (NUL) Device-Treibers anschließt.
In verschiedenen DOS-Versionen wurde der Aufbau der Tabelle stark variiert, lediglich der
oben beschriebene Kern blieb erhalten. Nachfolgende Tabelle enthält den Aufbau des
DOS-Control-Blocks der Versionen 2.0 bis 6.0.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Ö--------Ú-------Ú-----------------------------------------------Ì
° Offset ° Bytes ° Feld
°
û--------é-------é-----------------------------------------------À
° -0CH
°
2
° SHARE-Wiederholungszähler (DOS 3.1 - DOS 3.3) °
°
°
° läßt per INT 21-Funktion 440B setzen
°
û--------é-------é-----------------------------------------------À
° -0AH
°
2
° SHARE-Verzögerungszähler (DOS 3.1 - DOS 3.3) °
°
°
° läßt per INT 21-Funktion 440B setzen
°
û--------é-------é-----------------------------------------------À
° -08H
°
4
° Zeiger auf aktuellen Diskpuffer
°
°
°
° erst ab DOS 3.0 definiert
°
û--------é-------é-----------------------------------------------À
° -04H
°
2
° (ab DOS 3.0) Index auf den Puffer mit den
°
°
°
° ungelesenen Eingaben der CON-Einheit
°
°
°
° der Wert 0000 bedeutet keine Eingaben
°
û--------é-------é-----------------------------------------------À
° -02H
°
2
° Zeiger auf ersten Memory-Control-Block (MCB) °
û--------é-------é-----------------------------------------------À
° 00H
°
4
° Zeiger auf den DOS-Disk-Parameter-Block (DPB) °
û--------é-------é-----------------------------------------------À
° 04H
°
4
° Adresse der DOS System File Table
°
û--------é-------é-----------------------------------------------À
° 08H
°
4
° Zeiger auf den Kopf des CLOCK$-Treibers
°
û--------é-------é-----------------------------------------------À
° 0CH
°
4
° Zeiger auf den Kopf des Consol-Treibers
°
û--------é-------é-----------------------------------------------À
° --°
° DOS 2.x Datenstruktur
°
û--------é-------é-----------------------------------------------À
° 10H
°
1
° Anzahl log. Laufwerke im System
°
û--------é-------é-----------------------------------------------À
° 11H
°
2
° max. Byte/Block der Block Treiber
°
û--------é-------é-----------------------------------------------À
° 13H
°
4
° Zeiger auf den ersten Sektorpuffer
°
û--------é-------é-----------------------------------------------À
° 17H
° 18
° Begin des NUL-Device Headers
°
û--------é-------é-----------------------------------------------À
° --°
° DOS 3.0 Datenstruktur
°
û--------é-------é-----------------------------------------------À
° 10H
°
1
° Zahl der Blockeinheiten
°
û--------é-------é-----------------------------------------------À
° 11H
°
2
° max. Blockgröße für alle Blocktreiber
°
û--------é-------é-----------------------------------------------À
° 13H
°
4
° Zeiger auf den ersten Diskpuffer
°
û--------é-------é-----------------------------------------------À
° 17H
°
4
° Zeiger auf ein Feld mit den aktuellen
°
°
°
° Directory Strukturen (CDS)
°
û--------é-------é-----------------------------------------------À
° 1BH
°
1
° LASTDRIVE Wert (meist 5)
°
û--------é-------é-----------------------------------------------À
° 1CH
°
4
° Zeiger auf den STRING= Arbeitsbereich
°
û--------é-------é-----------------------------------------------À
° 20H
°
2
° Wert x von STRING = X aus CONFIG.SYS
°
û--------é-------é-----------------------------------------------À
° 22H
°
4
° Zeiger auf die FCB Tabelle
°
û--------é-------é-----------------------------------------------À
° 26H
°
2
° Wert y aus FCBS = x,y in CONFIG.SYS
°
û--------é-------é-----------------------------------------------À
° 28H
° 18
° Kopf des NUL-Einheitentreibers
°
û--------é-------é-----------------------------------------------À
° --°
° DOS 3.1 - 3.3 Datenstruktur
°
û--------é-------é-----------------------------------------------À
° 10H
°
2
° max. Blockgröße (Byte / Sektor) für alle
°
°
°
° Blocktreiber
°
û--------é-------é-----------------------------------------------À
° 12H
°
4
° Zeiger auf den ersten Diskpuffer in der
°
°
°
° Kette
°
û--------é-------é-----------------------------------------------À
° 16H
°
4
° Zeiger auf ein Feld mit den aktuellen
°
°
°
° Directory Strukturen (CDS)
°
û--------é-------é-----------------------------------------------À
° 1AH
°
4
° Zeiger auf die FCB Tabellen
°
û--------é-------é-----------------------------------------------À
° 1EH
°
2
° Anzahl der geschützten FCB's (FCBS=x,y)
°
û--------é-------é-----------------------------------------------À
° 20H
°
1
° Anzahl der installierten Bockeinheiten
°
û--------é-------é-----------------------------------------------À
° 21H
°
1
° Anzahl der Laufwerksbuchstaben
°
û--------é-------é-----------------------------------------------À
° 22H
° 18
° Kopf des NUL-Einheitentreibers
°
û--------é-------é-----------------------------------------------À
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
432
DOS Programmierhandbuch
° --°
° DOS 4.x Datenstruktur
°
û--------é-------é-----------------------------------------------À
° 10H
°
2
° max. Byte / Sektor der Blocktreiber
°
û--------é-------é-----------------------------------------------À
° 12H
°
4
° Zeiger auf den Diskpuffer Info Record
°
û--------é-------é-----------------------------------------------À
° 16H
°
4
° Zeiger auf die ein Feld mit den aktuellen
°
°
°
° Directory Strukturen
°
û--------é-------é-----------------------------------------------À
° 1AH
°
4
° Zeiger auf die FCB Tabellen
°
û--------é-------é-----------------------------------------------À
° 1EH
°
2
° Anzahl der geschützten FCB's
°
û--------é-------é-----------------------------------------------À
° 20H
°
1
° Anzahl der installierten Blockeinheiten
°
û--------é-------é-----------------------------------------------À
° 21H
°
1
° LASTDRIVE Wert (meist 5)
°
û--------é-------é-----------------------------------------------À
° 22H
° 18
° Kopf des NUL-Einheitentreibers
°
û--------é-------é-----------------------------------------------À
° 34H
°
1
° Zahl der mit JOIN umgeleiteten Drives
°
û--------é-------é-----------------------------------------------À
° 35H
°
2
° Zeiger auf das IBMDOS Codesegment mit
°
°
°
° der Liste der Programmnamen/ -versionen
°
û--------é-------é-----------------------------------------------À
° 37H
°
4
° Zeiger auf eine FAR-Routine mit dem resi°
°
°
° denten IFS-Funktionen, werden von IFS-Funk°
°
°
° tionen aktiviert, die die Funktionen 20H, 24H-°
°
°
° 28H nicht unterstützen.
°
û--------é-------é-----------------------------------------------À
° 3BH
°
4
° Zeiger auf die Kette der IFS-Treiber
°
û--------é-------é-----------------------------------------------À
° 3FH
°
2
° x-Wert von BUFFERS x,y wird auf ein mehrfach- °
°
°
° es von 30 gerundet, falls der Buffer im EMS- °
°
°
° liegt.
°
û--------é-------é-----------------------------------------------À
° 41H
°
2
° y-Wert von BUFFERS x,y
°
û--------é-------é-----------------------------------------------À
° 43H
°
1
° Boot Laufwerk (1=A:)
°
û--------é-------é-----------------------------------------------À
° 44H
°
1
° CPU-Flag (01H 80386+)
°
û--------é-------é-----------------------------------------------À
° 45H
°
2
° EMS-Größe in Kbyte
°
û--------é-------é-----------------------------------------------À
° --°
° DOS 5.0/6.0 Datenstruktur
°
û--------é-------é-----------------------------------------------À
° 10H
°
2
° max. Byte/Sektor der Blocktreiber
°
û--------é-------é-----------------------------------------------À
° 12H
°
4
° Zeiger auf den Diskpuffer Info Record
°
û--------é-------é-----------------------------------------------À
° 16H
°
4
° Zeiger auf die ein Feld mit den aktuellen
°
°
°
° Directory Strukturen
°
û--------é-------é-----------------------------------------------À
° 1AH
°
4
° Zeiger auf die FCB Tabelle
°
û--------é-------é-----------------------------------------------À
° 1EH
°
2
° Anzahl der geschützten FCB's
°
û--------é-------é-----------------------------------------------À
° 20H
°
1
° Anzahl der installierten Blockeinheiten
°
û--------é-------é-----------------------------------------------À
° 21H
°
1
° LASTDRIVE Wert (meist 5)
°
û--------é-------é-----------------------------------------------À
° 22H
° 18
° Kopf des NUL-Einheitentreibers
°
û--------é-------é-----------------------------------------------À
° 34H
°
1
° Zahl der mit JOIN umgeleiteten Drives
°
û--------é-------é-----------------------------------------------À
° 35H
°
2
° 0000H
°
û--------é-------é-----------------------------------------------À
° 37H
°
4
° Zeiger auf die SETVER-Tabelle
°
û--------é-------é-----------------------------------------------À
° 3BH
°
2
° unbekannt
°
û--------é-------é-----------------------------------------------À
° 3DH
°
2
° unbekannt
°
û--------é-------é-----------------------------------------------À
° 3FH
°
2
° x-Wert von BUFFERS x,y
°
û--------é-------é-----------------------------------------------À
° 41H
°
2
° y-Wert von BUFFERS x,y
°
û--------é-------é-----------------------------------------------À
° 43H
°
1
° Boot Laufwerk (1=A:)
°
û--------é-------é-----------------------------------------------À
° 44H
°
1
° CPU-Flag (01H 80386+)
°
û--------é-------é-----------------------------------------------À
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
433
DOS Programmierhandbuch
434
° 45H
°
2
° EMS-Größe in Kbyte
°
Û--------Ù-------Ù-----------------------------------------------ì
Tabelle 7.6: Aufbau des DOS-Control-Blocks
Vor der Tabelle steht immer ab Offset ES:BX-2 die Segmentadresse des ersten MemoryControl-Blocks (MCB). Ab Offset ES:BX-4 findet sich ab DOS 3.0 ein Zeiger auf das
DOS-Codesegment mit dem ungelesenen CON-Input. Der Zeiger ist nur dann gültig, wenn
die Eingaben per Handle gelesen werden. Ein Wert 0000H signalisiert, daß keine
ungelesenen Daten vorliegen. Ab DOS 3.0 wurde die Struktur des DOS-Control-Blocks
(DCB) erweitert. Die Einträge im Bereich ES:BX-4 bis ES:BX+0FH sind bei allen DOSVersionen von 2.0 bis 4.01 gleich. Ab Offset 10H ergibt sich aber ab DOS 3.0 eine
Änderung. Hier wurden Informationen über die internen DOS-Puffer eingefügt.
Einschränkend gilt auch, daß das Tabellenende ab Offset 12H bei PC-DOS erst ab Version
3.2 und bei MS-DOS ab Version 3.1 definiert ist.
Ab Offset 04H steht ein 4-Byte-Zeiger auf die interne DOS-Tabelle mit den offenen
Dateien. Die Tabellenstruktur wird in einem eigenen Abschnitt behandelt.
Die Adressen der CLOCK$- und CON-Treiber finden sich wieder ab Offset 08H und 0CH.
Die Zahl der maximal unterstützten logischen Laufwerke wurde gegenüber der Version 2.0
auf Offset 20H verschoben. Daran schließt sich ab Offset 21H ein Byte an, welches die
Zahl der aktuell eingestellten logischen Laufwerke enthält. Dieser Wert läßt sich in
CONFIG.SYS durch den Befehl:
LASTDRIVE=xx
beeinflussen. Standardmäßig trägt DOS hier den Wert 5 ein.
Im Bereich zwischen Offset 10H und 20H befinden sich einige Informationen über die
DOS-Disk-I/O-Operationen. Ab Offset 10H steht ab DOS 3.0 die maximale Größe eines
durch das System unterstützten logischen Disksektors. Hierbei handelt es sich um einen 16Bit-Wert, der durch DOS standardmäßig auf 512 Byte gesetzt wird. Einige Hersteller (z.B.
COMPAC) haben diesen Wert jedoch erhöht, um in DOS 3.x mehr als 32 Mbyte pro Platte
verwalten zu können. Der 4-Byte-Zeiger ab Offset 12H enthält die Adresse des ersten
logischen DOS-Sektor-Buffers für den Zugriff auf logische Diskeinheiten. Die Zahl der
Buffer läßt sich beim Systemstart durch den Befehl:
BUFFERS=xx
in der Datei CONFIG.SYS festlegen. Der Aufbau dieser Buffer ist in einem eigenen
Abschnitt beschrieben.
Der nächste 4-Byte-Zeiger ab Offset 16H bezieht sich auf eine interne DOS-Tabelle mit
den Informationen bezüglich der Zugriffspfade und SEEK-Operationen. Hier werden zum
Beispiel die DOS-I/O-Umleitungen gespeichert.
Der folgende 4-Byte-Vektor (Offset 1AH) zeigt auf den internen DOS-Datenbereich mit
den FCB-Einträgen. Der Bereich ist jedoch nur belegt, falls in der Datei CONFIG.SYS die
Anweisung:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
435
FCBS=xx
steht. In diesem Fall findet sich im DCB ab Offset 1EH ein 16-Bit-Wert mit der Größe
dieser FCBS-Tabelle.
Der DCB endet ab DOS 3.x bei der Offsetadresse 21H, da sich ab Offset 22H der erste
(Nul) Device-Treiber anschließt.
Einige DOS-Versionen verwalten weitere Vektoren in der Umgebung des DCB. Die
genaue Belegung der Funktionen ist allerdings undokumentiert.
7.4 Die Disk-Parameter-Blocks (DPB)
Die INT 21-Funktion 52H gibt die Adresse des DOS-Control-Blocks zurück. In dieser
Datenstruktur findet sich ab Offset 00H ein 4-Byte-Zeiger auf die Anfangsadresse des
ersten Disk-Parameter-Blocks (DPB). Hierbei handelt es sich um eine (undokumentierte)
Tabelle, die vom Treiber zur Verwaltung der jeweiligen blockorientierten Einheit angelegt
wird. Hier finden sich zum Beispiel Informationen über den Aufbau des Speichermediums.
Der Inhalt läßt alternativ über die INT 21-Funktionsaufrufe 1FH und 32H abfragen. Der
DCB besitzt folgende Struktur:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
Ö--------Ú------Ú--------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é--------------------------------------------------À
°
00
°
1 ° Drive-Nummer (Nummer des Treibers)
°
û--------é------é--------------------------------------------------À
°
01
°
1 ° Einheiten-Nummer (Subunit im DPB)
°
û--------é------é--------------------------------------------------À
°
02
°
2 ° Bytes pro Sektor
°
û--------é------é--------------------------------------------------À
°
04
°
1 ° Sektor pro Cluster - 1
°
û--------é------é--------------------------------------------------À
°
05
°
1 ° Cluster to Sektor shift
°
û--------é------é--------------------------------------------------À
°
06
°
2 ° Zahl der reservierten Bootsektoren
°
û--------é------é--------------------------------------------------À
°
08
°
1 ° Zahl der FAT's
°
û--------é------é--------------------------------------------------À
°
09
°
2 ° Zahl der Einträge im Hauptverzeichnis
°
û--------é------é--------------------------------------------------À
°
0B
°
2 ° Sektornummer des ersten Datenclusters
°
û--------é------é--------------------------------------------------À
°
0D
°
2 ° letzter belegter Sektor
°
û--------é------é--------------------------------------------------À
° ---- ° --- ° --- Aufbau für DOS 2.x --°
û--------é------é--------------------------------------------------À
°
0F
°
1 ° Zahl der Sektoren für eine FAT
°
û--------é------é--------------------------------------------------À
°
10
°
2 ° Start-Sektor des Root Directory
°
Û--------Ù------Ù--------------------------------------------------ì
Ö--------Ú------Ú--------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é--------------------------------------------------À
°
12
°
4 ° Zeiger auf den Device Header des Laufwerks
°
û--------é------é--------------------------------------------------À
°
16
°
1 ° Media Descriptor Byte
°
û--------é------é--------------------------------------------------À
°
17
°
1 ° Zugriffsbyte (0 = Disk Access, FFH rebuild Block)°
û--------é------é--------------------------------------------------À
°
18
°
4 ° Zeiger auf den folgenden DPB (FFFFH = last Block)°
û--------é------é--------------------------------------------------À
°
1C
°
2 ° Start Cluster current Directory (0 = Root)
°
û--------é------é--------------------------------------------------À
°
1E
° 64 ° ASCIIZ-String aktueller Directory Pfad
°
û--------é------é--------------------------------------------------À
° ---- ° --- ° --- Aufbau für DOS 3.x --°
û--------é------é--------------------------------------------------À
°
0F
°
1 ° Zahl der Sektoren für eine FAT
°
û--------é------é--------------------------------------------------À
°
10
°
2 ° Start Sektor des Root Directory
°
û--------é------é--------------------------------------------------À
°
12
°
4 ° Zeiger auf den Device Header des Laufwerks
°
û--------é------é--------------------------------------------------À
°
16
°
1 ° Media Descriptor Byte
°
û--------é------é--------------------------------------------------À
°
17
°
1 ° Zugriffsbyte (0 = Disk Access, FFH rebuild Block)°
û--------é------é--------------------------------------------------À
°
18
°
4 ° Zeiger auf den folgenden DPB (FFFFH = last Block)°
û--------é------é--------------------------------------------------À
°
1C
°
2 ° Startcluster für die Suche nach »free
space«»û--------é------é--------------------------------------------------À
°
1E
°
2 ° Zahl der freien Cluster (FFFFH = unbekannt)
°
û--------é------é--------------------------------------------------À
° ---- ° --- ° --- Aufbau für DOS 4.x - 6.0 --°
û--------é------é--------------------------------------------------À
°
0F
°
2 ° Zahl der Sektoren für die FAT's
°
û--------é------é--------------------------------------------------À
°
11
°
2 ° Start Sektor des Root Directory
°
û--------é------é--------------------------------------------------À
°
13
°
4 ° Zeiger auf den Device Header
°
û--------é------é--------------------------------------------------À
°
17
°
1 ° Media Descriptor Byte
°
û--------é------é--------------------------------------------------À
°
18
°
1 ° Zugriffsbyte (0 = Disk Access, FFH rebuild Block)°
û--------é------é--------------------------------------------------À
°
19
°
4 ° Zeiger auf den folgenden DPB (FFFFH = last Block)°
û--------é------é--------------------------------------------------À
°
1D
°
2 ° letzter geschriebener Cluster
°
û--------é------é--------------------------------------------------À
°
1F
°
2 ° Zahl der freien Cluster (FFFFH = unbekannt)
°
Û--------Ù------Ù--------------------------------------------------ì
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
436
DOS Programmierhandbuch
437
Tabelle 7.7: Der Aufbau des Disk-Parameter-Blocks (DPB)
Im ersten Byte steht die Nummer des Treibers, die mit der Laufwerksnummer
übereinstimmt (0 = A:, 1 = B:, 2 = C: etc.). Diese Nummer wird bei der Installation
(SYSINIT) eingetragen. Im zweiten Byte findet sich der Code der Untereinheit, falls der
Treiber mehrere Einheiten unterstützt. Enthält der Eintrag ab Offset 00H den Wert
FFFFH:FFFFH, dann ist das Ende der Liste erreicht.
Ab Offset 02 findet sich die Zahl der Byte pro Sektor. MS-DOS speichert standardmäßig
512 Byte (200H) pro Sektor ab. Die Verwaltung des Speichers erfolgt in Clustern
(Segmenten aus mehreren aufeinanderfolgenden Sektoren). Die Zahl der Sektoren pro
Cluster findet sich ab Offset 04H. Es ist aber zu beachten, daß die Zählweise ab null
beginnt, d.h. der Wert 3 bedeutet 4 Sektoren pro Cluster. Die Zahl der Sektoren pro Cluster
muß zu 2 ** n (N=1,2,..) festgelegt werden.
Offset 06H enthält ein Wort, in dem die Zahl der reservierten Sektoren gespeichert ist. In
diesen Sektoren finden sich z.B. die Boot-Programme.
Das folgende Byte (Offset 08H) spezifiziert die Zahl der File-Allocation-Tables (FAT).
DOS trägt hier standardmäßig den Wert 2 ein.
Eine wichtige Größe ist auch die Zahl der Einträge im Hauptverzeichnis (Offset 09H). Bei
360-Kbyte-Disketten findet sich hier der Wert 112 (70H), während er bei 20-Mbyte-Platten
bis auf die Zahl 512 reichen kann.
Die Sektornummern des ersten und letzten Datenclusters finden sich in zwei Worten ab
Offset 0BH. Daran schließt sich ein Byte an, in dem die Zahl der Sektoren für die FAT
steht. Offset 10H spezifiziert den Startsektor für das Hauptinhaltsverzeichnis. Das Wort ab
Offset 0DH enthält die Nummer des letzten Clusters+1 des Datenbereiches. Ist der Wert
kleiner als 0FF6H, benutzt DOS eine 12-Bit-FAT für das Medium. Andernfalls wird eine
16-Bit-FAT angelegt.
Interessant ist der 4-Byte-Zeiger ab Offset 12H. Er spezifiziert die Adresse des Device
Headers des Einheitentreibers (s. entsprechendes Kapitel). Damit kann zumindest der
Einstieg in die Treiberkette gefunden werden.
Das Media-Descriptor-Byte (Offset 16H) gibt an, um welchen Speichertyp es sich handelt
(s. Kapitel über das DOS-Dateisystem). Das folgende Byte dient als Flag, mit dem ein
Zugriff auf das Medium angezeigt wird. Ist der Wert des Flags=0, wurde auf das Medium
zugegriffen. Wird das Flag auf -1 gesetzt (oder ist es -1), dann aktualisiert DOS die
internen Datenstrukturen für das Laufwerk vor dem nächsten Zugriff auf das Medium neu.
Das letzte Feld (Offset 18H) enthält einen 4-Byte-Zeiger auf den nächsten Disk-ParameterBlock (DPB). Der letzte Eintrag der Liste wird mit dem Wert FFFF:FFFFH markiert.
Ab DOS 4.0 ergibt sich eine Erweiterung des DPB um ein Byte.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
438
Ö--------Ú------Ú--------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é--------------------------------------------------À
°
00
°
1 ° Drive-Nummer (Nummer des Treibers)
°
û--------é------é--------------------------------------------------À
°
01
°
1 ° Einheiten-Nummer (Subunit im DPB)
°
û--------é------é--------------------------------------------------À
°
02
°
2 ° Bytes pro Sektor
°
û--------é------é--------------------------------------------------À
°
04
°
1 ° Sektor pro Cluster - 1
°
û--------é------é--------------------------------------------------À
°
05
°
1 ° Cluster to Sektor shift
°
Û--------Ù------Ù--------------------------------------------------ì
Ö--------Ú------Ú--------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é--------------------------------------------------À
°
06
°
2 ° Zahl der reservierten Bootsektoren
°
û--------é------é--------------------------------------------------À
°
08
°
1 ° Zahl der FAT's
°
û--------é------é--------------------------------------------------À
°
09
°
2 ° Zahl der Einträge im Hauptverzeichnis
°
û--------é------é--------------------------------------------------À
°
0B
°
2 ° Sektornummer des ersten Datenclusters
°
û--------é------é--------------------------------------------------À
°
0D
°
2 ° letzter belegter Sektor
°
û--------é------é--------------------------------------------------À
°
0F
°
2 ° Zahl der Sektoren für die FAT's
°
û--------é------é--------------------------------------------------À
°
11
°
2 ° Start-Sektor des Root Directory
°
û--------é------é--------------------------------------------------À
°
13
°
4 ° Zeiger auf den Device Header
°
û--------é------é--------------------------------------------------À
°
17
°
1 ° Media Descriptor Byte
°
û--------é------é--------------------------------------------------À
°
18
°
1 ° Zugriffsbyte (0 = Disk Access, FFH rebuild Block)°
û--------é------é--------------------------------------------------À
°
19
°
4 ° Zeiger auf den folgenden DPB (FFFFH = last Block)°
û--------é------é--------------------------------------------------À
°
1D
°
2 ° letzter geschriebener Cluster
°
û--------é------é--------------------------------------------------À
°
1F
°
2 ° Zahl der freien Cluster (FFFFH = unbekannt)
°
Û--------Ù------Ù--------------------------------------------------ì
Tabelle 7.8: Der Aufbau des Disk-Parameter-Blocks (DPB) ab DOS 4.0
Da DOS 4.x Festplatten mit mehr als 32 Mbyte Kapazität verwaltet, reicht ein Byte (Offset
0FH) nicht aus. Die Clusternummer wird deshalb auf 2 Byte erweitert. Die Länge des DPB
erweitert sich von DOS 3.3 von 32 Byte ab DOS 4.0 auf 33 Byte.
Weiterhin unterscheiden sich die die DOS-Versionen auch in der Belegung freier Cluster.
In DOS 2.0 beginnt die Suche nach einem freien Cluster immer vom Beginn des
Datenträgers und der erste freie Bereich wird belegt. Ab DOS 3.0 merkt sich das
Betriebssystem die Nummer des zuletzt geschriebenen Sektors. Die Belegung neuer
Sektoren beginnt dann immer ab diesem Startpunkt. Nur beim Systemstart wird der
Startpunkt auf 0 gesetzt. Durch diese Technik wird die Fraktionierung der Platte/Diskette
zumindest verzögert.
7.5 Die Device-Treiberkette
Beim Systemstart lädt das Programm SYSINIT (aus IO.SYS) die Treiber aus der Datei
CONFIG.SYS und aus dem residenten Teil von IO.SYS. Der erste geladene Treiber ist der
NUL-Treiber. An diesen schließt sich eine Kette weiterer Treiber an.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
439
Im Kopf eines jeden Treibers findet sich eine Datenstruktur, die als erstes einen 4-ByteVektor enthält. Dieser Vektor spezifiziert die Anfangsadresse des nachfolgenden Treibers.
Der letzte Treiber in dieser Kette enthält den Wert -1,-1 (FFFF:FFFFH). Ab Offset 04H
steht das Device-Attribut-Wort. Die Belegung ist in Tabelle 8.2 aufgeführt. Interessant ist
Bit 4, da die offizielle Dokumentation angibt, daß das Bit = 0 gesetzt werden muß. Dieses
Bit wird von speziellen Treibern genutzt, um über den undokumentierten INT 29 Zeichen
auszugeben. Bei Block-Einheiten werden die Bits 8 und 9 vermutlich von DRIVER.SYS
benutzt. Die weitere Struktur des Kopfes ist in Tabelle 8.1 aufgeführt. Bei CD-ROM's wird
die Tabelle um 10 Byte erweitert. Das folgende Bild zeigt den Aufbau dieser einseitig
verketteten Treiberliste.
DCB
DPB
Ö------Ì
Ö------Ì
û------À
û------À
┌──û------À
û------À─┐
│ Û------ì─┐
Û------ì │
│
│
│
Ö------Ì
Ö------Ì │ Ö------Ì │ Ö------Ì
Ö------Ì
Ö------Ì
-->°
°--->°
°-└─>°
°-└─>°
°--->°
°--->° -1,-1°
û------À
û------À
û------À
û------À
û------À
û------À
°
°
°
°
°
°
°
°
°Block-°
°
°
° NUL °
° ... °
° CON °
°CLOCK$°
°dev. °
° ... °
Û------ì
Û------ì
Û------ì
Û------ì
Û------ì
Û------ì
Bild 7.11: Der Aufbau der Treiberkette
Es stellt sich die Frage, wie man nun an die Adressen dieser Treiber kommt?
Sobald ein Adreßvektor bekannt ist, lassen sich die nachfolgenden Treiber über die
Linkliste erreichen. Die Adresse der Standard-Ein-/Ausgabeeinheit (CON) findet sich ab
Offset 0CH im DOS-Control-Block (DCB). Auch die Adresse der CLOCK$-Einheit läßt
sich über den 4-Byte-Vektor ab Offset 08H im DOS-Control-Block erreichen.
Um die Adressen der blockorientierten Einheiten zu ermitteln, besteht einerseits die
Möglichkeit, die Treiberkette nach einem entsprechenden Namen zu durchsuchen.
Andererseits findet sich die Adresse ab Offset 12H im Disk-Parameter-Block (DPB).
Dies ist aber nicht ganz befriedigend, da gemäß obigem Bild die Kette mit dem NULTreiber beginnt. Sobald diese Adresse bekannt ist, läßt sich die gesamte Treiberkette
erreichen. Aber wo ist dieser Vektor gespeichert?
DOS muß ja irgendwie diesen Anfang der Kette ermitteln. In DOS 1.x und 2.x wurde der
Vektor nach einem INT 21-OPEN-Funktionsaufruf im reservierten Teil des FCB
zurückgegeben. Diese undokumentierte Möglichkeit besteht aber ab DOS 3.x nicht mehr.
Da IO.SYS die Treiber irgendwo im Speicher ab Adresse 0600:0000 speichert, besteht die
Möglichkeit, im Speicher nach dem Text »NULlgetreibers ab Offset -0AH vor dem
Namen. Mit dieser Methode läßt sich die Adresse des NUL-Device meist finden.
Während der Entstehung dieses Buches wurde jedoch eine wesentlich einfachere Lösung
gefunden. Die Verwaltung des Speichers übernimmt während des Systemstarts das
Programm SYSINIT (aus IO.SYS). Dieses installiert auch die MS-DOS-Anwendertreiber.
Weiterhin baut es die internen DOS-Tabellen auf. Nun kommt eine Eigenart von DOS zum
Tragen, daß die Systemtreiber (aus IO.SYS) zuletzt installiert werden. Dies bedeutet, daß
andere Systemtreiber und Datenbereiche vor dem NUL-Treiber liegen. In der MS-DOSVersion 2.x und 3.x liegt das NUL-Device hinter dem DOS-Control-Block. Daher braucht
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
440
DOS auch keinen Zeiger auf diesen Treiber zu speichern, da sich die Adresse aus der
Anfangsadresse des DCB ermitteln läßt. Die INT 21-Funktion 52H gibt den Vektor auf
diesen Block zurück (s. Abschnitt Struktur und Aufbau des DCB). Zwischen DCB und
Kopf des NUL-Device findet sich allerdings noch ein 4-Byte Zwischenraum.
Bei MS-DOS 2.x ist zur Anfangsadresse des DCB ein Offset von 17H zu addieren, um die
Anfangsadresse des NUL-Device zu erhalten.
Ab MS-DOS (PC-DOS) 3.1 ist der Offsetwert auf 22H zu erhöhen. Zur Kontrolle kann der
Name des Treibers geprüft werden. Bei Fehlern ist die Lage des Treibers experimentell zu
bestimmen, da die beschriebenen Zusammenhänge bisher von Microsoft nicht
dokumentiert wurden.
7.6 Die DOS-Puffer
DOS wickelt den Datentransfer zwischen den Anwenderprozessen und den physikalischen
Einheiten über die Einheitentreiber ab. Bei blockorientierten Einheiten (Diskette/Platte) ist
nur ein Zugriff auf die Daten eines kompletten Sektors möglich, d.h. es kann nur ein
kompletter Sektor gelesen oder geschrieben werden. In vielen Fällen umfaßt die
Transferanweisung des Anwenderprozesses aber weniger Bytes, womit DOS eine
Zwischenspeicherung der Daten vornehmen muß. Möchte ein Prozeß z.B. 80 Byte aus
einer Datei lesen, ist DOS gezwungen, den gesamten Sektor (512 Byte) in den Speicher zu
transferieren. Dort werden die 80 Byte dann an den Prozeß weitergereicht. Das gleiche Bild
ergibt sich, falls ein Prozeß Daten in einer Datei speichern möchte. Solange die Satzlänge
kleiner als die Sektorlänge des Mediums ist, werden die Daten im Speicher gehalten. Erst
eine Close-Anweisung oder ein Erreichen der Sektorgröße sorgt für den Transfer zum
Medium. Weiterhin müssen die Informationen zur Dateiverwaltung (FAT) im Speicher
gehalten werden. Hierfür reserviert DOS bestimmte Bereiche im Speicher für diesen
Zweck, die als Puffer bezeichnet werden.
Standardmäßig werden beim Systemstart (IO.SYS) zwei Puffer angelegt, die zur
Blockierung/Deblockierung der zu transferierenden Daten und zur Aufnahme der FAT
dienen.
Da aber alle Schreib-/Leseaufrufe über Puffer abgewickelt werden, prüft DOS vor jedem
Transfer, ob die Daten nicht bereits im Puffer stehen. In diesem Fall findet nur ein Transfer
zwischen Puffer und dem Prozeß statt. Dies spart Zeit, da Zugriffe auf das Speichermedium
vermieden werden. Allerdings tritt schnell die Situation auf, daß die zwei Puffer nicht
ausreichen und immer durch andere Daten überschrieben werden. Damit geht der
erreichbare Geschwindigkeitsgewinn wieder verloren. Aus diesem Grunde besteht ab DOS
2.0 die Möglichkeit, die Zahl der Puffer zwischen 1 und 99 einzustellen. Hierzu ist in der
Datei CONFIG.SYS die Anweisung:
BUFFERS = xx
einzutragen. Beim Systemstart wird dann die angegebene Zahl von Puffern installiert. Jeder
Puffer belegt einen Speicherbereich von 528 Byte (16-Byte-Kopf, 512-Byte-Datenbereich).
Die Zahl der Puffer, die zur optimalen Systemeinstellung notwendig ist, wird üblicherweise
experimentell ermittelt. Systeme mit Festplatten sollten mindestens 3 Puffer enthalten.
Datenbankanwendungen erfordern meist zwischen 10 und 20 Puffern. Eine möglichst
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
441
große Pufferzahl ist andererseits auch zu vermeiden, da erstens entsprechend Speicherplatz
belegt wird. Andererseits muß DOS jeweils alle Puffer absuchen, um zu prüfen, ob die
Daten nicht schon vorliegen. Bei vielen Puffern kann dies viel Zeit benötigen, so daß der
Zeitvorteil gegenüber dem Diskzugriff verschwindet.
Der Aufbau eines DOS-Puffers wurde von Microsoft nicht dokumentiert, das Format
variiert zwischen den verschiedenen Versionen. An den Kopf schließt sich der
Datenbereich mit 512 Byte an. Der Kopf besitzt folgende Struktur:
Ö--------Ú------Ú-----------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é-----------------------------------------------------À
°
--- ° -- °
--- DOS 2.x --°
û--------é------é-----------------------------------------------------À
°
00
°
4 ° Zeiger auf den nächsten Puffer (FFFFH = last)
°
û--------é------é-----------------------------------------------------À
°
04
°
1 ° Laufwerksnummer (0 = A, 1 = B, .., FF = unbelegt)
°
û--------é------é-----------------------------------------------------À
°
05
°
3 ° unbelegt (00 00 01)
°
û--------é------é-----------------------------------------------------À
°
08
°
2 ° logische Sektornummer
°
û--------é------é-----------------------------------------------------À
°
0A
°
1 ° Zahl der Schreibkopien (1 für nicht FAT-Sektoren)
°
û--------é------é-----------------------------------------------------À
°
OB
°
1 ° Sektor Offset bei mehreren Schreibkopien
°
û--------é------é-----------------------------------------------------À
°
0C
°
4 ° Zeiger zum DOS-Parameter-Block (DPB)
°
û--------é------é-----------------------------------------------------À
°
10
° 512 ° Puffer von 512 Byte
°
û--------é------é-----------------------------------------------------À
°
--- ° -- °
--- DOS 3.x --°
û--------é------é-----------------------------------------------------À
°
00
°
4 ° Zeiger auf den nächsten Puffer (FFFFH = last)
°
û--------é------é-----------------------------------------------------À
°
04
°
1 ° Laufwerksnummer (0 = A, 1 = B, .., FF = unbelegt)
°
û--------é------é-----------------------------------------------------À
°
05
°
1 ° Benutzungskennummer
°
û--------é------é-----------------------------------------------------À
°
06
°
2 ° logische Sektornummer
°
û--------é------é-----------------------------------------------------À
°
08
°
1 ° Zahl der Schreibkopien (1 für nicht FAT-Sektoren)
°
û--------é------é-----------------------------------------------------À
°
09
°
1 ° Sektor Offset bei mehreren Schreibkopien
°
û--------é------é-----------------------------------------------------À
°
0A
°
4 ° Zeiger zum DOS-Parameter-Block (DPB)
°
û--------é------é-----------------------------------------------------À
°
0E
°
2 ° unbenutzt
°
û--------é------é-----------------------------------------------------À
°
10
° 512 ° Puffer von 512 Byte
°
Û--------Ù------Ù-----------------------------------------------------ì
Tabelle 7.9: Der Aufbau der DOS-Puffer bis DOS 3.3
Der Kopf enthält einen 4-Byte-Vektor, der auf die Anfangsadresse des nächsten Puffers
zeigt. Der letzte Puffer enthält als Endemarkierung den Wert FFFF:FFFFH im Vektor.
Weiterhin findet sich ab Offset 0AH ein 4-Byte-Vektor auf die Anfangsadresse des DiskParameter-Blocks (DPB) des zugeordneten Treibers, der den Puffer belegt hat.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
442
DCB
Ö------Ì
û------À
Puffer
û------À
Ö------Ì
Ö------Ì
Ö------Ì
Ö------Ì
Û------ì-->°
°--->°
°--->°
°--->° -1,-1°
û------À
û------À
û------À
û------À
°
°
°
°
°
°
°
°
°
°-+ °
°-+ °
°-+ °
°-+
Û------ì ! Û------ì ! Û------ì ! Û------ì !
V
V
V
V
Ö------Ì
Ö------Ì
Ö------Ì
Ö------Ì
û------À
û------À
û------À
û------À
û------À
û------À
û------À
û------À
Û------ì
Û------ì
Û------ì
Û------ì
DPB
DPB
DPB
DPB
Bild 7.12: Die DOS-Pufferkette
Die Anfangsadresse dieser Pufferkette findet sich im DOS-Control-Block (DCB) ab Offset
12H. Ein Zugriff auf die Einzelpuffer kann dann über die verkettete Liste erfolgen. Bei
einer großen Anzahl von Puffern ist es natürlich klar, daß die Zugriffe länger dauern, da ja
im ungünstigsten Fall die gesamte Kette durchsucht werden muß.
Der eigentliche Puffer von 512 Byte beginnt ab Offset 10H. Im Feld ab Offset 04H findet
sich ein Byte, in welchem die Kennung des aktuell zugeordneten Laufwerkes steht (1 = A:,
2 = B: etc.). Bei einem Wechsel des Laufwerkes wird dieser Code modifiziert. Wurde der
Puffer noch nicht benutzt, enthält das Feld den Wert 0FFH.
Die Benutzungskennummer (Byte ab Offset 05H) gibt einen Hinweis auf den Typ der
benutzten Daten. Hier geben verschiedene Bits an, mit welchen Daten der Puffer belegt ist.
Bit 7 6 5 4 3 2 1 0
Ö-Ú-Ú-Ú-Ú-Ú-Ú-Ú-Ì
ÛÚÙÚÙÚÙÚÙÚÙÚÙÚÙÚì
° ° ° ° ° ° ° Û° ° ° ° ° ° Û--° ° ° ° ° Û----° ° ° ° Û------° ° ° Û--------° ° Û----------° Û------------Û---------------
reserviert
File Allocation Table Data
Directory oder Subdirectory Data
File Data
(?)
Puffer belegt
Pufferdaten ungültig (dirthy)
(?)
Bild 7.13: Kodierung der Benutzungskennummer
Ist Bit 1 gesetzt, befindet sich ein Sektor aus der FAT des Laufwerkes im Puffer. Mit Bit 2
markiert DOS alle Sektoren, die zwischen Puffer und Directory-Sektoren transferiert
werden. Nur wenn Bit 3 gesetzt ist, handelt es sich um Daten aus dem Datenfilebereich.
Ab Offset 08H merkt sich DOS eine Zugriffsnummer auf den Puffer, deren genaue
Bedeutung aber nicht bekannt ist. Das Wort ab Offset 0EH ist zur Zeit noch unbenutzt.
Änderungen in DOS 4.X
Ab DOS 4.0 wurde die Verwaltung der Diskpuffer komplett umgestellt. Hier lassen sich
zum Beispiel einige Daten in den EMS-Bereich auslagern. Der Zeiger aus dem DOSControl-Block zeigt auf die Anfangsadresse des Disk-Buffer-Infoblocks. Dieser enthält
eine Reihe von globalen Informationen für die Verwaltung der Diskpuffer und besitzt
folgenden Aufbau:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
443
Ö--------Ú------Ú-----------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é-----------------------------------------------------À
°
00H °
4 ° Zeiger auf die Kette mit den Puffer Headern (NDBCH) °
û--------é------é-----------------------------------------------------À
°
04H °
2 ° Zahl der Diskpuffer (NDBCH) in der Kette
°
û--------é------é-----------------------------------------------------À
°
06H °
4 ° Zeiger auf den »lookahead
bufferû--------é------é-----------------------------------------------------À
°
0AH °
2 ° Zahl der »lookahead
buffer«»û--------é------é-----------------------------------------------------À
°
0CH °
1 ° 00H Buffer in EMS (/X-Option), FFH kein EMS benutzt °
û--------é------é-----------------------------------------------------À
°
0DH °
2 ° EMS-Handle für die Puffer, 0 -> kein EMS
°
û--------é------é-----------------------------------------------------À
°
0FH °
2 ° EMS-physical-Page Number für die Puffer (meist FFH) °
û--------é------é-----------------------------------------------------À
°
11H °
2 ° unbelegt (0001H)
°
û--------é------é-----------------------------------------------------À
°
13H °
2 ° Segment des EMS-physical Page-Frame
°
û--------é------é-----------------------------------------------------À
°
15H °
2 ° unbelegt (0000H)
°
û--------é------é-----------------------------------------------------À
°
17H °
8 ° 4 Worte mit EMS-Informationen (?)
°
û--------é------é-----------------------------------------------------À
° ---° ---- ° Struktur in DOS 4.01
°
û--------é------é-----------------------------------------------------À
°
00H °
4 ° Zeiger auf die Kette mit den Puffer Headern (NDBCH) °
û--------é------é-----------------------------------------------------À
°
04H °
2 ° Zahl der Diskpuffer (NDBCH) in der Kette
°
û--------é------é-----------------------------------------------------À
°
06H °
4 ° Zeiger auf den »lookahead
bufferû--------é------é-----------------------------------------------------À
°
0AH °
2 ° Zahl der »lookahead
buffer«»û--------é------é-----------------------------------------------------À
°
0CH °
1 ° 01H Markierung für DOS 4.01 Buffer
°
û--------é------é-----------------------------------------------------À
°
0DH °
9 ° EMS-Daten Belegung nicht bekannt
°
û--------é------é-----------------------------------------------------À
°
16H °
2 ° Segment des Arbeitspuffers im Hauptspeicher (/XS/XD)°
û--------é------é-----------------------------------------------------À
°
18H °
2 ° EMS-Handle für die Puffer, 00H kein EMS
°
û--------é------é-----------------------------------------------------À
°
1AH °
2 ° EMS physikal. Seitennummer des Puffers (meist FFH) °
û--------é------é-----------------------------------------------------À
°
1CH °
2 ° unbelegt (0000H)
°
û--------é------é-----------------------------------------------------À
°
1EH °
2 ° Segment EMS Seite (page frame)
°
û--------é------é-----------------------------------------------------À
°
20H °
2 ° unbelegt (000H)
°
û--------é------é-----------------------------------------------------À
°
22H °
2 ° 00H bei /XS, 01H bei /XD, FFH Puffer nicht im EMS
°
Û--------Ù------Ù-----------------------------------------------------ì
Tabelle 7.11: Der Aufbau des DOS-Disk-Puffer-Infoblocks (DOS 4.x)
Der erste Eintrag zeigt auf eine Kette mit den Köpfen des Diskpuffers (disk buffer hash
chain), während die Zahl der Einträge in der Kette ein Byte später gespeichert ist. DOS 4.x
besitzt die Möglichkeit die Informationen über FAT's und Unterverzeichnisse im Speicher
zu halten. Deshalb läßt sich ein »lookahead«Buffer anlegen. Ab 06H findet sich der Zeiger
auf diesen Bereich. Bei fehlendem Buffer ist der Wert auf 0 gesetzt. Ab 0AH steht die Zahl
der Sektoren, die im lookahead-Buffer stehen. Fehlt der Buffer, ist das Byte mit 0 belegt,
sonst nimmt es den Wert y »n, der sich mit der CONFIG.SYS-Anweisung:
BUFFERS=x,y
setzen läßt. Da DOS 4.x einen Teil der Puffer im EMS halten kann, verwaltet es die
Informationen über den EMS-Bereich ebenfalls im Infoblock.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
444
Leider wurde auf Grund zahlreicher Fehler der Aufbau des DOS-Disk-Puffer-Info-Blocks
beim Übergang zur Version 4.01 verändert (siehe obige Tabelle). In Byte 0CH findet sich
der Wert 01H als Markierung für die Version 4.01. Die Einträge ab dem Offset 0DH bis
15H beziehen sich auf EMS-Parameter. Die Belegung ist aber nicht bekannt.
Die Kette mit den DOS-Disk-Puffer-Headern ist in DOS 4.x gleich und besitzt folgendes
Format:
Ö--------Ú------Ú-----------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é-----------------------------------------------------À
°
00H °
2 ° EMS logical Page Number (-1 not in EMS)
°
û--------é------é-----------------------------------------------------À
°
02H °
4 ° Zeiger auf den »least recently usedFehler! Verweisquelle konnte nicht
gefunden werden.û--------é------é-----------------------------------------------------À
°
06H °
2 ° reserviert (0000H)
°
Û--------Ù------Ù-----------------------------------------------------ì
Tabelle 7.12: Der Aufbau des DOS-Disk-Puffer-Headers (DOS 4.x)
Für jeden Puffer ist ein eigener Eintrag vorhanden. Das erste Wort enthält die logische
EMS-Seitennummer, in der die Pufferkette resident gespeichert ist. Falls kein EMSBereich existiert, ist der Eintrag nicht belegt. Dann findet sich der Puffer im DOS-640Kbyte-Bereich. Alle Puffer liegen im gleichen Segment. Im folgenden Feld findet sich ein
Zeiger auf den Header des least recently used-Puffers. DOS merkt sich, welche Puffer
benutzt werden und markiert den Puffer, auf den am wenigsten zugegriffen wird. Sind alle
Puffer belegt, nutzt DOS den least recently used-Puffer für die Einlagerung neuer Daten.
Ein gepufferter Disk-Sektor wird in den Puffer mit der Nummer:
Sektoradresse Modulo (NDBCH)
gespeichert (0 <= N <= NDCBH-1). NDCBH ist der N-te Disk-Chain-Block-Header. Jede
Teilkette wird nach Möglichkeit resident in eine EMS-Page gelegt, falls EMS vorhanden
ist.
An den Kopf schließt sich dann der eigentliche Puffer mit folgendem Format an.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
445
Ö--------Ú------Ú-----------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é-----------------------------------------------------À
°
00
°
2 ° Zeiger (Offset) next least-recently-used-buffer
°
°
°
° Zeiger in eine vorwärts verkettete Liste
°
û--------é------é-----------------------------------------------------À
°
02
°
2 ° Zeiger (Offset) auf den vorhergehenden Puffer
°
°
°
° Zeiger in eine rückwärts verkettete Liste
°
û--------é------é-----------------------------------------------------À
°
04
°
1 ° Drive (0 = A, 1 = B, ... FFH = unbelegt)
°
û--------é------é-----------------------------------------------------À
°
05
°
1 ° Benutzungskennummer
°
û--------é------é-----------------------------------------------------À
°
06
°
4 ° logische Sektornummer
°
û--------é------é-----------------------------------------------------À
°
0A
°
1 ° Zahl der Schreibkopien (1 für nicht FAT-Sektoren)
°
û--------é------é-----------------------------------------------------À
°
OB
°
2 ° Sektor Offset bei mehreren Schreibkopien
°
û--------é------é-----------------------------------------------------À
°
0D
°
4 ° Zeiger zum DOS-Parameter-Block (DPB)
°
û--------é------é-----------------------------------------------------À
°
11
°
2 ° Buffer Count (bei remote, siehe Benutzerkennummer) °
û--------é------é-----------------------------------------------------À
°
13
°
1 ° unbelegt
°
û--------é------é-----------------------------------------------------À
°
14
° 512 ° Puffer von 512 Bytes
°
Û--------Ù------Ù-----------------------------------------------------ì
Tabelle 7.13 Der Aufbau der DOS-Puffer ab DOS 4.0
Ab DOS 4.0 ist die Kette mit den Puffern als doppelt verkettete Liste ausgeführt. Alle
Puffer mit der gleichen Adresse modulo NDBCH finden sich in der gleichen verketteten
Liste. Die Zeiger werden als Offset angegeben, da sich alle Angaben innerhalb einer Kette
auf das gleiche Segment beziehen. Ab Offset 0AH steht die Zahl der zu schreibenden
Kopien eines Buffers. Bei FAT-Puffern findet sich hier die Zahl der FAT's. Bei Daten wird
der Puffer nur einmal geschrieben. Ab Offset 0BH findet sich dann der Offset zwischen
zwei FAT's.
Die Informationen über den Pufferaufbau sind nicht durch Microsoft dokumentiert.
Änderungen ab DOS 5.0
Ab DOS 5.0 wurde die Verwaltung der Diskpuffer, insbesondere was die EMS-Verwaltung
betrifft, wieder komplett umgestellt. Der Zeiger aus dem DOS-Control-Block zeigt auf die
Anfangsadresse des Disk-Buffer-Infoblocks. Dieser enthält eine Reihe von globalen
Informationen für die Verwaltung der Diskpuffer und besitzt folgenden Aufbau:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
446
Ö--------Ú------Ú-----------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é-----------------------------------------------------À
°
00H °
4 ° Zeiger auf die Kette mit den Puffer Headern (NDBCH) °
û--------é------é-----------------------------------------------------À
°
04H °
2 ° 0000H (DOS besitzt keine Hash Puffer)
°
û--------é------é-----------------------------------------------------À
°
06H °
4 ° Zeiger auf den »lookahead
bufferû--------é------é-----------------------------------------------------À
°
0AH °
2 ° Zahl der »lookahead
sektorenû--------é------é-----------------------------------------------------À
°
0CH °
1 ° Buffer Location (00H Base Memory, no workspace)
°
°
°
°
(01H HMA, workspace in Base Mem)
°
û--------é------é-----------------------------------------------------À
°
0DH °
4 ° Zeiger auf 1 Segment Workspace Buffer im Base Mem
°
û--------é------é-----------------------------------------------------À
°
11H °
3 ° unbelegt
°
û--------é------é-----------------------------------------------------À
°
14H °
8 ° unbekannte Belegung
°
û--------é------é-----------------------------------------------------À
°
1CH °
1 ° Bit 0 = 1, falls UMB MCB mit normalen MCB verkettet °
û--------é------é-----------------------------------------------------À
°
1DH °
2 ° unbekannt
°
û--------é------é-----------------------------------------------------À
°
1FH °
2 ° Segment 1. MCB im UMB oder FFFFH.
°
û--------é------é-----------------------------------------------------À
°
21H °
2 ° Startadresse (Paragraph) Suche MCB-Kette
°
Û--------Ù------Ù-----------------------------------------------------ì
Tabelle 7.14: Der Aufbau des DOS-Disk-Puffer-Infoblocks (DOS 5.0)
Der erste Eintrag zeigt auf die Adresse des zuletzt benutzten Puffers. DOS 5.0 benutzt
keine Hash-Puffer, weshalb das folgende Wort unbenutzt ist. Weitere Einträge der Tabelle
beziehen sich auf die Verwaltung des UMB. So findet sich die erste UMB-MCB meist ab
Adresse 9FFF:0000H. Hier wird das Video-RAM von DOS als Block reserviert.
Der eigentliche Puffer besitzt ab DOS 5.0 folgendes Format.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
447
Ö--------Ú------Ú-----------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é-----------------------------------------------------À
°
00
°
2 ° Zeiger (Offset) next least-recently-used-buffer
°
°
°
° Zeiger in eine vorwärts verkettete Liste
°
û--------é------é-----------------------------------------------------À
°
02
°
2 ° Zeiger (Offset) auf den vorhergehenden Puffer
°
°
°
° Zeiger in eine rückwärts verkettete Liste
°
û--------é------é-----------------------------------------------------À
°
04
°
1 ° Drive (0 = A, 1 = B, ... FFH = unbelegt)
°
û--------é------é-----------------------------------------------------À
°
05
°
1 ° Benutzungskennummer
°
°
°
° Bit 7: remote Buffer
°
°
°
° Bit 6: Buffer dirthy
°
°
°
° Bit 5: Buffer benutzt (referenced)
°
°
°
° Bit 4: Search Data Buffer
°
°
°
° Bit 3: Sektor im Datenbereich
°
°
°
° Bit 2: Sektor in Directory
°
°
°
° Bit 1: Sektor in FAT
°
°
°
° Bit 0: reserviert
°
û--------é------é-----------------------------------------------------À
°
06
°
4 ° logische Sektornummer
°
û--------é------é-----------------------------------------------------À
°
0A
°
1 ° Zahl der Schreibkopien (1 für nicht FAT-Sektoren)
°
û--------é------é-----------------------------------------------------À
°
OB
°
2 ° Sektor Offset bei mehreren Schreibkopien
°
û--------é------é-----------------------------------------------------À
°
0D
°
4 ° Zeiger zum DOS-Drive-Parameter-Block (DPB)
°
û--------é------é-----------------------------------------------------À
°
11
°
2 ° Buffer Count (bei remote, siehe Benutzerkennummer) °
û--------é------é-----------------------------------------------------À
°
13
°
1 ° unbelegt
°
û--------é------é-----------------------------------------------------À
°
14
° 512 ° Puffer von 512 Bytes
°
Û--------Ù------Ù-----------------------------------------------------ì
Tabelle 7.15 Der Aufbau der DOS-Puffer ab DOS 5.0
In DOS 5.0 ist die Kette mit den Puffern als doppelt verkettete Liste ausgeführt. Ab Offset
0AH steht die Zahl der zu schreibenden Kopien eines Buffers. Bei FAT-Puffern findet sich
hier die Zahl der FAT's. Bei Daten wird der Puffer nur einmal geschrieben. Ab Offset 0BH
findet sich dann der Offset zwischen zwei FAT's.
Die Informationen über den Pufferaufbau sind nicht offiziell durch Microsoft
dokumentiert. Die Angaben über die DOS-5.x-Pufferverwaltung sind deshalb mit Vorsicht
zu betrachten.
7.7 Die DOS-Stackverwaltung
Bis zur Version 3.1 besitzt DOS drei interne Stacks zur Abwicklung interner Interrupts.
Das BIOS benutzt dagegen die Stacks der Anwenderprogramme. Ab DOS 3.2 wurde eine
erweiterte Stackverwaltung implementiert, die beim Systemstart durch den Befehl:
STACKS= m,n
in CONFIG.SYS eingebunden wird. Der Wert m legt dabei die Zahl der Stacks fest,
während n die Größe eines Stacks in Byte bestimmt. Die Werte dürfen dabei in folgenden
Grenzen variieren:
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
448
m = 8 .. 64 Stacks
n = 32 .. 512 Byte
Standardmäßig reserviert DOS beim Start neun Stacks mit je 128 Byte Größe. Die
Anweisung:
STACKS=0,0
schaltet die Stackverwaltung unter DOS jedoch ab.
Der Handler belegt einen Codebereich von 2064 Byte und wird beim Systemstart geladen.
Bei PC-DOS setzt der Treiber dann die Vektoren der Interrupts 2, 8, 9 und 70 auf eine
eigene Routine um, so daß nach einem Interrupt zuerst die Stackverwaltung aktiviert wird.
Ein Interrupt veranlaßt dann folgende Sequenz:
·
Es wird die Stackverwaltung über den INT x aktiviert.
·
Der Stackmanager sucht einen freien Stack und sichert den Zustand der Register
SS:SP in lokalen Variablen.
·
Die Register SS:SP werden auf den neuen Stack gesetzt.
·
Dann wird die Original-Interruptroutine aktiviert.
Nach der Abarbeitung der ISR durchläuft DOS die obige Sequenz in umgekehrter
Reihenfolge. Problematisch wird der Ablauf immer dann, wenn der Stackmanager nach
einer Aktivierung keinen freien Stack mehr findet. Dann sperrt er alle Interrupts und
verzweigt zu einer Endlosschleife. Das System ist abgestürzt und muß neu gebootet
werden.
Die Stackverwaltung benutzt einen internen Datenbereich (Stackverwaltungsrecord) mit
folgender Struktur zur Ablage der Daten:
Ö-------Ú--------------------------------------------------Ì
° Bytes ° Feld
°
û-------é--------------------------------------------------À
°
2
° Status des Stacks
°
°
° 0 -> frei, 1 -> belegt, 3 -> gesperrt
°
û-------é--------------------------------------------------À
°
1
° unbelegt
°
û-------é--------------------------------------------------À
°
4
° Speicherstelle in der SS:SP des unterbrochenen
°
°
° Programmes gesichert wird
°
û-------é--------------------------------------------------À
°
2
° Offset auf das oberste Wort des zugehörigen
°
°
° Stacks
°
Û-------Ù--------------------------------------------------ì
Tabelle 7.16: Stack-Datenbereich
Im ersten Wort steht eine Markierung, ob der Stack frei oder belegt ist. Mit dem Wert 3
läßt sich ein Stack für weitere Zugriffe sperren. Dies ist zum Beispiel erforderlich, falls ein
darüberliegender Stackbereich überläuft und Daten im nachfolgenden Stackbereich
abgelegt werden.
Im nächsten Doppelwort speichert der Manager den Inhalt der Register SS:SP ab, bevor er
den neuen DOS-Stack setzt. Durch das Statuswort läßt sich ein mehrfacher Zugriff auf ein
belegtes Segment vermeiden.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
449
Das letzte Wort enthält den Offset auf das oberste Wort des zugehörigen Stackbereiches.
Die Segmentadresse des Stacks ist identisch mit dem Codesegment des Treibers, da Daten
und Code innerhalb von 64 Kbyte liegen.
Für jeden definierten Stack legt DOS die obige Struktur an. Weiterhin existieren noch die
m Stackbereiche mit einer Länge von n-Byte. Diese Bereiche liegen hintereinander im
Speicher. Im obersten Wort eines jeden Stacks findet sich wieder der Offset auf den
zugehörigen Stapelverwaltungsrecord. Der Manager nutzt diesen Eintrag zur
Konsistenzprüfung des Stackbereiches. Falls der darüberliegende Stack überläuft, wird das
oberste Wort des folgenden Stacks mit überschrieben. Der Offset ist damit verloren, und
der Manager sperrt den Stack für weitere Zugriffe bis zum nächsten Systemstart. Bei einem
Interrupt durchsucht der Manager die Stacks von »obenFehler! Verweisquelle konnte
nicht gefunden werden.untenFehler! Verweisquelle konnte nicht gefunden werden.Der
Treiber zur Stackverwaltung befindet sich hinter der DOS-Umleitungstabelle, deren
Anfangsadresse per INT 21, Funktion 52H abfragbar ist. Pro Laufwerk sind dort 81 Byte
reserviert. Alternativ läßt sich die Segmentadresse des Treibers über einen Interruptvektor
(z.B. INT 2 oder INT 0E) abfragen. Dieser Vektor darf allerdings nicht durch ein anderes
Programm umdefiniert worden sein. Der Treiber enthält ab Offset 0 eine Datenstruktur mit
folgendem Aufbau:
Ö-------Ú--------------------------------------------------Ì
° Bytes ° Feld
°
û-------é--------------------------------------------------À
°
2
° Kennung
°
û-------é--------------------------------------------------À
°
2
° Stackanzahl (x aus STACKS=x,y)
°
û-------é--------------------------------------------------À
°
2
° Größe Stack-Control-Block (8*x)
°
û-------é--------------------------------------------------À
°
2
° Größe jedes Einzelstacks (y aus STACKS=x,y)
°
û-------é--------------------------------------------------À
°
4
° Zeiger auf den Bereich mit den Stacks
°
û-------é--------------------------------------------------À
°
2
° unterster Rahmen
°
û-------é--------------------------------------------------À
°
2
° oberster Rahmen
°
û-------é--------------------------------------------------À
°
2
° nächster freien Rahmen
°
Û-------Ù--------------------------------------------------ì
Tabelle 7.17: Aufbau Stack-Verwaltungsrecord
An den Kopf schließt sich dann der erste Handler für den ersten abgefangenen Interrupt an.
Bei PC-DOS verwaltet der Handler zusätzlich die Interrupts 0A, 0B, 0C, 0D, 0E, 72, 73,
74, 76 und 77, sofern die folgenden Bedingungen erfüllt sind:
·
Der Vektor muß auf eine gültige ISR zeigen, d.h., der Vektor wird auf 0 überprüft.
Außerdem darf er nicht auf eine IRET- Anweisung zeigen.
·
Die ISR muß ab Offset 06H die Kennung »KBFehler! Verweisquelle konnte nicht
gefunden werden.· Fehlt die Kennung, muß das Segment ungleich F000H sein.
·
ISR-Handler mit der Segmentadresse F000H werden nur dann nicht verwaltet, wenn
ab Offset 1FFH der Offset der ISR steht.
Für jeden verwalteten Interrupt wird im Speicher ein eigener Handler mit zirka 90 Byte
Speicherbedarf angelegt. Hinzu kommen noch die Datenbereiche für die Stacks.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
450
7.8 Die Current Directory Structure (CDS)
Im DOS-Control-Block (DCB) findet sich ab Offset 16H (17H in DOS 3.0) ein 4-ByteVektor auf eine weitere undokumentierte interne Datentabelle (Current Directory
Structure). Diese enthält alle Angaben über die Device Umleitungen. Hier werden zum
Beispiel die Pfadangaben jedes Laufwerkes abgespeichert. Damit kann DOS feststellen,
welcher Pfad gerade in diesem Laufwerk aktuell eingestellt ist. Für jedes Laufwerk ist eine
Tabelle mit folgendem Aufbau vorhanden:
Ö--------Ú------Ú-----------------------------------------------------Ì
° Offset ° Bytes°
Funktion
°
û--------é------é-----------------------------------------------------À
° 00H
° 65 ° Laufwerksbezeichnung (z.B. A:\) und Pfad als ASCIIZ-°
°
°
° String mit einer Länge von maximal 64 Zeichen
°
û--------é------é-----------------------------------------------------À
° 40H
°
3 ° reserviert (00 00 00)
°
û--------é------é-----------------------------------------------------À
° 43H
°
2 ° Used Flag
°
û--------é------é-----------------------------------------------------À
° 45H
°
4 ° Zeiger auf den Disk-Parameter-Block (DPB)
°
û--------é------é-----------------------------------------------------À
° --° --- ° --- lokale Laufwerke --°
û--------é------é-----------------------------------------------------À
° 49H
°
2 ° Startcluster aktuelles Directory (0000H = root)
°
°
°
° (FFFFH Cluster nicht benutzt)
°
û--------é------é-----------------------------------------------------À
° 4BH
°
4 ° Marke FFFFH (Zweck unbekannt)
°
û--------é------é-----------------------------------------------------À
° --° --- ° --- Netzwerk Drives --°
û--------é------é-----------------------------------------------------À
° 49H
°
4 ° Zeiger auf den Redirector, oder auf den REDIRIFS
°
°
°
° Record, oder FFFF:FFFFH
°
û--------é------é-----------------------------------------------------À
° 4DH
°
2 ° User Daten vom INT 21/AX=5F03H (?)
°
û--------é------é-----------------------------------------------------À
° --° --- ° --- beide Versionen --°
û--------é------é-----------------------------------------------------À
° 4FH
°
2 ° Offset in den aktuellen Pfad bezogen auf \
°
û--------é------é-----------------------------------------------------À
° --° --- ° --- DOS 4.x - DOS 6.0 --°
û--------é------é-----------------------------------------------------À
° 51H
°
1 ° unbekannt
°
û--------é------é-----------------------------------------------------À
° 52H
°
4 ° Zeiger auf IFS-Treiber
°
û--------é------é-----------------------------------------------------À
° 56H
°
2 ° unbekannt
°
Û--------Ù------Ù-----------------------------------------------------ì
Tabelle 7.18: Aufbau der Current Directory Structure (CDS)
Die ersten drei Byte enthalten die Laufwerksbezeichnung (z.B. A:\). Die Bytes gehören zu
dem Pfadnamen, der als ASCIIZ-String abgespeichert wird. Dieser Pfad spezifiziert den
Zugriff auf die Daten. In DOS darf ein Pfadname deshalb lediglich 64 Byte umfassen, da
das Nullbyte noch mit im Puffer zu speichern ist. Bei Netzwerken wird der
Maschinenname (z.B. \\MASCHINE\PFAD) angegeben.
Das Flag ab Offset 43H definiert die Attribute des Laufwerkes und besitzt folgende
Kodierung:
Bit 15:
14:
13:
12:
Netzwerk Laufwerk
physikalisches Laufwerk
Laufwerk mit JOIN umgeleitet
Laufwerk mit SUBST umgeleitet
Ist weder Bit 14 noch Bit 15 gesetzt, existiert das Laufwerk nicht.
Das MS-DOS Programmierhandbuch - by Günter Born www.borncity.de
DOS Programmierhandbuch
451
Ab Offset 45H findet sich ein 4-Byte-Zeiger auf dem Disk-Parameter-Block des Treibers,
der dieses Laufwerk verwaltet.
Die Daten ab Offset 49H variieren etwas zwischen lokalen Laufwerken und
Netzwerkdrives. Bei lokalen Laufwerken findet sich ab Offset 49H