home *** CD-ROM | disk | FTP | other *** search
- .MODEL TPASCAL
- .DATA
- EXTRN PrefixSeg : WORD ; PSP-Segment
- .CODE
- EnvString PROC FAR EnvVar:DWORD RETURNS EnvWert:DWORD
- PUBLIC EnvString
- cld ; String-Operationen nach oben
- mov es,[PrefixSeg] ; PSP-Segment laden
- mov es,es:[2Ch] ; Environment laden
- xor di,di
- mov bp,sp ; Zeiger auf Parameter,
- lds si,EnvVar ; die hinter der Return-Adresse stehen
- ASSUME DS:NOTHING
- lodsb ; Länge ermitteln
- or al,al ; Null?
- jz RetNull ; Falls Null, Rücksprung!
- mov ah,al ; Sonst in AH speichern
- mov dx,si ; DS:DX zeigt auf 1. Parameterzeichen
- xor al,al ; Null!
- Vergleich:
- mov ch,al ; CH soll Null sein
- mov si,dx ; Zeiger auf String
- mov cl,ah ; Länge des Strings
- repe cmpsb ; Bytes vergleichen
- jne Sprung ; Nächsten String suchen
- cmp BYTE PTR es:[di],'=' ; Gefunden, Nächstes Zeichen '='?
- jne NichtGefunden ; Nein, nicht gefunden
- Gefunden:
- mov ax,es ; DS:SI als Zeiger zum String
- mov ds,ax
- mov si,di
- inc si ; hinter dem '='-Zeichen
- les bx,EnvWert ; Adresse des Funktionsergebnisses
- mov di,bx ; in ES:DI ablegen
- inc di ; Byte mit Länge überspringen
- mov cl,255 ; Maximale Länge vorgeben
- KopierSchleife:
- lodsb ; Byte holen
- or al,al ; Mit Null vergleichen
- jz Fertig ; Falls Null, dann sind wir fertig!
- stosb ; Ins Ergebnis schreiben
- loop KopierSchleife ; Bis zu 255 Mal wiederholen
- Fertig:
- not cl ; Da wir 255 dekrementierten, enthält
- ; das Komplement von CL die Länge
- mov es:[bx],cl ; Länge speichern
- mov ax,SEG DATA
- mov ds,ax ; DS wiederherstellen
- ASSUME ds:DATA
- ret
- ASSUME ds:NOTHING
- Sprung:
- dec di ; Ab hier Null suchen
- NichtGefunden:
- mov cx,07FFFh ; Falls notwendig, lange suchen
- sub cx,di ; Environment immer kleiner als 32K
- jbe RetNull ; Falls dahinter, verlassen
- repne scasb ; Letzte Null suchen
- jcxz RetNull ; Verlassen, falls nicht gefunden
- cmp es:[di],al ; zweite Null in Folge?
- jne Vergleich ; Falls nicht, nochmal versuchen
- RetNull:
- les di,EnvWert ; Adresse des Ergebnisses
- stosb ; Null zurückgeben
- mov ax,SEG DATA
- mov ds,ax ; DS wiederherstellen
- ASSUME ds:DATA
- ret
- EnvString ENDP
- END
-