home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
lib4a86
/
doc
/
int24.doc
< prev
next >
Wrap
Text File
|
1992-02-03
|
6KB
|
145 lines
─────────────────────────────────────────────────────────────────────────────
Dokumentation zur Datei: INT24.INC
─────────────────────────────────────────────────────────────────────────────
INT24.INC - Routinen zur Behandlung des Interrupt 24h
(für den Assembler A86)
(c) Bernd Schemmer 1990 - 1992
Letzter Update: 02.02.1992
■ Variablen des neuen Int-24h-Handlers:
---------------------------------------
Int24ErrorSelect - Byte, enthält die Art des Fehlers
(1 = Char-Device-Fehler,
2 = Block-Device-Fehler,
0 = kein Fehler)
Int24Error - Byte, enthält die Fehlernummer des Int 24h
(aus dem Register AH)
Int24DeviceError - Byte, enthält die Fehlernummer des Treibers
(aus dem Lowbyte des Registers DI)
Int24DriveNumber - Byte, enthält die Laufwerksnummer
(aus dem Register AL)
Alle Variablen sollten nach einem Hardware-Fehler auf 0 zurück
gesetzt werden.
■ Routinen:
-----------
SetInt24h - Setzt den Interrupt 24h auf den neuen Handler
GetSetInt24hRoutine - Setzen oder Ermitteln der Routine, die vom
neuen Handler für den Interrupt 24h nach der
Fehlerbehandlung ausgeführt werden soll.
ResetInt24hVars - Zurücksetzen der Variablen des neuen Handlers
(Int24h - neue Routine für den Interrupt 24h)
----------------------------
ResetInt24hErrorVars
Funktion: Macro zum Zurücksetzen aller Fehlervariablen des neuen
Handlers für den Interrupt 24h
Aufruf: ResetInt24hErrorVars
Ausgabe: AL = Fehlernummer des Treibers oder 0
ZF = 1 ->> kein Hardware-Fehler aufgetreten
ZF = 0 ->> Hardware-Fehler aufgetreten
----------------------------
ResetInt24hVars
Funktion: Zurücksetzen der Variablen des Handlers
Ausgabe: AL = Fehlernummer des Treibers oder 0
ZF = 1 ->> kein Hardware-Fehler aufgetreten
ZF = 0 ->> Hardware-Fehler aufgetreten
----------------------------
SetInt24h
Funktion: Setzt den neuen Handler für den Interrupt 24h ein.
(Voraussetzung für die Benutzung aller Variablen
und Routinen dieser Datei!)
Ausgabe: DX:AX = Adresse der alten Routine für den Interrupt 24h
Dies Adresse wird normalerweise nicht gebraucht,
da der Interrupt von DOS vor dem Programmende
automatisch zurückgesetzt wird - also nicht vom
Programm zurückgesetzt werden muß.
----------------------------
Int24h
Funktion: Neuer Handler für den Interrupt 24h
Ausgabe: Die Routine führt, falls ein Laufwerksfehler auftrat,
für alle Laufwerke eine Reset durch.
Die Fehlervariablen werden besetzt.
Danach wird eine eventuell (durch GetSetInt24hRoutine)
installierte Benutzer-Routine per CALL FAR aufgerufen.
Außerdem wird der Code für 'Funktion abbrechen' an die
den Fehler auslösende Routine zurückgegeben (in AL).
----------------------------
GetSetInt24hRoutine
Funktion: Ermitteln oder Setzen der Adresse der Routine, die
nach der Fehlerbehandlung vom neuen Handler ausgeführt
werden soll.
Eingabe: AL = 0 ->> Ermitteln der Adresse der Routine
Ausgabe: CF = 0 ->> DX:BX = Adresse der Routine
CF = 1 ->> keine Routine installiert
AL = 1 ->> Setzen der Adresse der Routine
Eingabe: DX:BX = Adresse der neuen Routine
AL = 2 ->> Löschen der Zuordnung
(->> Handler soll keine Routine aufrufen)
Ausgabe: CF = 1 und AL = 0FFh ->> Falsche Funktionsnummer angegeben
oder bei SET
Segment der angegebenen Routine ist 0
Bes.: Für die zu installierende Routine gilt:
Die Routine wird über CALL FAR aufgerufen (muß also mit
RETF enden falls sie zurückkehren soll).
Die Fehlervariablen des neuen Handler sind schon gesetzt.
Die Routine muß alle Arbeits-Register retten, falls sie
über einen RETF-Befehl endet.
Der Inhalt der Register (bes. DS, ES und SS) ist nicht
vorhersehbar.
Der Stack sieht bei Eintritt in die Routine folgendermaßen
aus:
├─────────────────────────────────────┤
SP ---> │ IP │\
├─────────────────────────────────────┤ Ret-Adresse des
│ CS │/ CALL-Far-Aufrufs
├─────────────────────────────────────┤
│ IP │\
├─────────────────────────────────────┤ \
│ CS │ Ret-Adresse und Flags
├─────────────────────────────────────┤ des Int 24h-Aufrufs
│ Flags │/
├─────────────────────────────────────┤
│ IP │\
├─────────────────────────────────────┤ Ret-Adresse und Flags
│ CS │ des Int 21h-Aufrufs der
├─────────────────────────────────────┤ den Fehler auslöste
│ Flags │/
├─────────────────────────────────────┤
Die Routine muß Rekursion durch mehrmaligen Aufruf
verhindern.
Im Normalfall sollte die Routine mit einem RETF-Befehl
in den neuen Hander zurückkehren.