home *** CD-ROM | disk | FTP | other *** search
- ; ----------------------------
- ; CheckMD
- ;
- ; Funktion: Testen, ob MDEBUG installiert ist (für TP 5.xx)
- ;
- ; Pascal-Deklaration: {$F+} FUNCTION CheckMD:BYTE; EXTERNAL; {$F-}
- ;
- ; Eingabe: -
- ;
- ; Ausgabe: -1 - MDEBUG nicht installiert
- ; 0 - MDEBUG ohne Userint installiert
- ; sonst - Nummer des Userints
- ;
- ; Übersetzen: A86 CHECKMD.A86 to CHECKMD.OBJ
- ; ----------------------------
-
- PUBLIC CheckMD
-
- CODE SEGMENT BYTE PUBLIC
- ASSUME CS:CODE
-
- ; ----------------------------
-
- v3 db 'MDEBUG ' ; Kennung im MCB vom MDEBUG
- v3_LENGTH EQU $ - Offset v3
-
- v5 db 'USERINT' ; Kennung vor der Einsprung-Adresse des Userints
-
- CheckMD PROC FAR
- push si
- push ds
- push di
- push es
-
- mov ah,052h ; Adresse des DOS-Info-Blocks ermitteln
- int 021h
-
- mov es,es:[bx-2]
- xor bx,bx ; ES:BX -> 1. MCB
-
- push cs
- pop ds ; DS = CS
-
- Test_Mcbs:
- mov di,bx
- add di,8 ; ES:DI -> 'Namen-Feld' im MCB
- mov si,offset v3
- mov cx,4
- cmcb1:
- repe cmpsw ; Kennung vorhanden ?
- je cmcb10 ; Name gefunden
-
- cmcb2:
- cmp byte ptr es:[bx],'Z'
- ; 'Z' -> letzter MCB
- mov al,0FFh
- je cmcbende ; MDEBUG nicht gefunden
-
- mov ax,es ; Nächsten MCB ermitteln
- add ax,es:[bx+3]
- inc ax
- mov es,ax
- xor bx,bx
- jmp Test_MCBs
-
- cmcb10:
- ; Eintrag gefunden, Version testen
- mov dx,es
- inc dx ; DX = PSP von MDEBUG
- mov al,05Fh ; erster möglicher Interrupt ist der Int 60h
- mov cx,8xD ; 8 mögliche Interrupts
- mov ah,035h ; Funktion: Ermittle Int-Adresse
- mov si,offset v5 ; SI -> Kennstring für den Userint
-
- cmcb11:
- push es
- inc al ; Interrupt-Nummer korrigieren
- int 021h
- mov di,bx
-
- push cx,si
- mov cx,7xD
- sub di,7xD ; USERINT-Kennung vorhanden ?
- repe cmpsb
- pop si,cx
- pop es
- loopne cmcb11
- je cmcbEnde ; AL = Nummer des Userints
-
- mov al,0 ; MDEBUG noch nicht installiert oder kein Userint
-
- cmcbende:
- pop es
- pop di
- pop ds
- pop si
- retf
-
- CODE ENDS
-
- ; ----------------------------
-
-