home *** CD-ROM | disk | FTP | other *** search
- DATA SEGMENT PUBLIC
- EXTRN PrefixSeg : WORD ; PSP-Segment
- DATA ENDS
- CODE SEGMENT PUBLIC
- ASSUME CS:CODE,DS:DATA
-
- EnvString PROC FAR
- PUBLIC EnvString
- push bp
- 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,ss:[bp+6] ; 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 enthält erstes 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],'=' ; ok, Nächstes Zeichen '='?
- jne NichtGefunden ; Nein, nicht gefunden
- Gefunden:
- mov ax,es ; DS:SI als Zeiger auf den gefundenen String
- mov ds,ax
- mov si,di
- inc si ; hinter dem '='-Zeicehn
- les bx,ss:[bp+10] ; 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 255 dekrementiert wurde, 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
- pop bp
- ret 4
- ASSUME ds:NOTHING
- Sprung:
- dec di ; Ab hier die 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,ss:[bp+10] ; Adresse des Ergebnisses
- stosb ; Null zurückgeben
- mov ax,SEG DATA
- mov ds,ax ; DS wiederherstellen
- ASSUME ds:DATA
- pop bp
- ret 4
- EnvString ENDP
- CODE ENDS
- END
-