home *** CD-ROM | disk | FTP | other *** search
- ; ----------------------------
- ; ENV.DEM - Demoprogramm für die Routinen aus ENV.LIB
- ; (für den A86)
- ;
- ; (c) Bernd Schemmer 1990 - 1992
- ; Letzter Update: 15.02.1992
- ;
- ; Übersetzen:
- ; A86 ENV.DEM DEMOS.INC TO ENV.COM
- ;
- ; Hinweis: Die Environment-Variable 'A86' muß den Dateinamen 'MACROS.MAC'
- ; enthalten und die .LIB-Dateien müssen über die Datei A86.LIB
- ; erreichbar sein.
- ;
- ; ---------------------------
- jmp start ; Daten überspringen
-
- ; ---------------------------
- ; Meldungen
- ;
- logo db CR,LF
- db 'ENV.DEM - Demoprogramm für die Routinen aus ENV.LIB'
- db CR,LF
- db '---------------------------------------------------'
- db CR,LF,CR,LF
- GETLENGTH logo
-
- ; Meldung, falls das Programm vom COMMAND.COM
- ; aufgerufen wurde
- MakeMsg1 _CommandMsg, '(Kommando-Interpreter)'
-
- MakeMsg _ReleaseEnv, CR,LF, 'Gebe lokales Environment frei.'
- MakeMsg _ComspecMSG, CR,LF, 'Ermittle den Wert von COMSPEC im akt. Environment'
-
- ; ---------------------------
- ; Maske für die Daten des lokalen Environments
- ;
- _LokalEnvMSG db 'Daten des lokalen Environments:'
- db CR,LF
- db '-------------------------------'
- db CR,LF
- db '(Segment-Adresse: '
- _LokalEnvSeg db '????h, Länge: '
- _LokalEnvLength db '?????, Belegt: '
- _LokalEnvUsed db '?????, Frei: '
- _LokalEnvFree db '?????)'
- db CR,LF
- db '---- Der Programm-Name ist: '
- _ProgName db 65 dup ' '
- db CR,LF
- db '---- Anzahl Einträge im Environment: '
- _LokalEnvCount db '???'
- db CR,LF
- db '---- Einträge: '
- db CR,LF
- GETLENGTH _LokalEnvMSG
-
- ; ---------------------------
- ; Maske für die Daten des Environments des aufrufenden Programmes
- ;
- _CallerEnvMSG db CR,LF
- db 'Daten des Environments des aufrufenden Programmes:'
- db CR,LF
- db '--------------------------------------------------'
- db CR,LF
- db '(Segment-Adresse: '
- _CallerEnvSeg db '????h, Länge: '
- _CallerEnvLength db '?????, Belegt: '
- _CallerEnvUsed db '?????, Frei: '
- _CallerEnvFree db '?????)'
- db CR,LF
- db '---- Der Name des aufrufenden Programmes ist: '
- _CallerName db 80 dup ' '
- db CR,LF
- db '---- Anzahl Einträge im Environment: '
- _CallerEnvCount db '???'
- db CR,LF
- db '---- Einträge: '
- db CR,LF
- GETLENGTH _CallerEnvMSG
-
- ; ---------------------------
- ; Maske für die Daten des Master-Environments des COMMAND.COM
- ;
- _CommandEnvMSG db CR,LF
- db 'Daten des Master-Environments des Kommando-Interpreters:'
- db CR,LF
- db '--------------------------------------------------------'
- db CR,LF
- db '(Segment-Adresse: '
- _CommandEnvSeg db '????h, Länge: '
- _CommandEnvLength db '?????, Belegt: '
- _CommandEnvUsed db '?????, Frei: '
- _CommandEnvFree db '?????)'
- db CR,LF
- db '---- Anzahl Einträge im Environment: '
- _CommandEnvCount db '???'
- db CR,LF
- db '---- Einträge: '
- db CR,LF
- GETLENGTH _CommandEnvMSG
-
- ; ---------------------------
- ; Fehlermeldungen
- ;
- MakeMsg _LokalError, 'Fehler: Daten des lokalen Environments nicht ermittelbar!'
- MakeMsg _CallerError, 'Fehler: Daten des Environments des Aufrufers nicht ermittelbar!'
- MakeMsg _CommandError, 'Fehler: Daten des Master-Environments des COMMAND.COM nicht ermittelbar!'
- MakeMsg _ReleaseError, 'Fehler: Lokales Environment konnte nicht freigegeben werden!'
- MakeMsg _ComspecError, 'Fehler: Inhalt von COMSPEC nicht ermittelbar!'
-
- ; ---------------------------
- ; Variablen
-
- _Comspec db 7,'COMSPEC' ; Name der Variable
- db ' = ' ; (für die Ausgabe)
- _ComspecPuffer db 65 dup ' ' ; Puffer für den Inhalt der Variable
-
- enventry db 256 dup 0 ; Puffer für einen Eintrag aus dem Environment
-
- ; ----------------------------
- start:
- call ShowLogo ; Logo ausgeben und Speicherblock verkleinern
-
- TestDOSVersion 3,0 ; DOS-Version überprüfen
-
- call EnvCount ; Routinen und Tabellen initialisieren
-
- call ShowLokalEnvironment
- call ShowPause
- jc >l9
-
- call ShowCallerEnvironment
- call ShowPause
- jc >l9
-
- call ShowCommandEnvironment
- call ShowPause
- jc >l9
-
- call CheckSetRoutine
- jc >l9
- call ShowPause
- jc >l9
-
- call ReleaseLokalEnv
-
- l9:
- EndProcess 0
-
- ; ------------------
- ; CheckSetRoutine
- ;
- ; Funktion: Demonstriert die Routine SetEnvVar
- ;
- OldVar db 7,'COMSPEC' ; Name der Variable die gelöscht wird
- LeerString db 0 ; Dummystring zum Löschen einer Variable
-
- ChangeVar db 4,'PATH' ; Name der Variablen die geändert wird
- NewPath db 8,'Testpfad' ; Neuer Inhalt für die geänderte Variable
-
- NewVar1 db 4,'TEST' ; Name der Variable die erstellt werden soll
- NewVarInh1 db 12,'abcdefghijkl'; Inhalt der neuen Variable
-
- NewVar2 db 5,'Test1' ; Name der neuen Variable
- NewVarInh2 db 4,'abcd' ; Inhalt der neuen Variable
-
-
- CheckMSG0 db CR,LF
- db 'Erstelle die Variable "TEST" im lokalen Environment mit dem '
- db 'Inhalt abcdefghijkl'
- db CR,LF
- db '(Sollte eigentlich nicht gehen, da der Eintrag mehr als 16 Byte lang ist!)'
- db CR,LF
- GETLENGTH CheckMSG0
-
- MakeMsg CheckMSG1, CR,LF, 'Lösche die Variable "COMSPEC" im lokalen Environment'
-
- CheckMSG2 db CR,LF
- db 'Erstelle die Variable "TEST1" im lokalen Environment mit dem '
- db 'Inhalt abcd'
- db CR,LF
- db '(muß nun möglich sein!)'
- db CR,LF
- db CR,LF
- GETLENGTH CheckMSG2
-
- MakeMsg CheckMSG3, CR,LF, 'Setze die Variable "PATH" im lokalen Environment auf "Testpfad"'
- MakeMsg CheckError1, 'Fehler: Variable "TEST" konnte nicht erstellt werden!'
- MakeMsg CheckError2, 'Fehler: Variable "COMSPEC" konnte nicht gelöscht werden!'
- MakeMsg CheckError3, 'Fehler: Variable "TEST1" konnte nicht erstellt werden!'
- MakeMsg CheckError4, 'Fehler: Variable "PATH" kann nicht geändert werden!'
-
- CheckSetRoutine:
- mov al,0 ; auf lokales Environment umschalten
- call UseOtherEnv
- jnc >l1
- ; Fehler: lokales Environment nicht nutzbar
- WRITE_STRING _lokalError
- ret
-
- l1:
- WRITE_STRING CheckMSG0
-
- ; Erstellen der Variable TEST
- mov si,offset NewVar1
- mov di,offset NewVarInh1
- call SetEnvVar
- jnc >l1
- ; Fehler beim Erstellen
- WRITE_STRING CheckError1
-
- l1:
- WRITE_STRING CheckMSG1
- ; Löschen der Variable COMSPEC
- mov si,offset OldVar
- mov di,offset LeerString
- call SetEnvVar
- jnc >l1
- ; Fehler beim Löschen
- WRITE_STRING CheckError2
-
- l1:
- WRITE_STRING CheckMsg3
- ; Ändern der Variable PATH
- mov si,offset ChangeVar
- mov di,offset NewPath
- call SetEnvVar
- jnc >l1
- ; Fehler beim Ändern der Variable
- WRITE_STRING CheckError4
- l1:
- WRITE_STRING CheckMSG2
- ; Erstellen der Variable TEST1
- mov si,offset NewVar2
- mov di,offset NewVarInh2
- call SetEnvVar
- jnc >l1
- ; Fehler beim Erstellen
- WRITE_STRING CheckError3
- l1:
- call ShowPause
- jc >l9
- ; und nochmal das lokale Environment anzeigen
- call ShowLokalEnvironment
- clc
- l9:
- ret
-
- ; ------------------
- ; RelelaseLokalEnv
- ;
- ; Funktion: Freigabe des lokalen Environments
- ;
- ReleaseLokalEnv: ; lokales Environment freigeben
- WRITE_STRING _releaseEnv
- call FreeLokalEnv
- jnc >l1
- ; Fehler: Environment konnte nicht freigegeben
- ; werden
- WRITE_STRING _releaseError
- l1:
- ret
-
- ; ----------------------------
- ; ShowLokalEnvironment
- ;
- ; Funktion: Ausgabe der Daten des lokalen Environments
- ;
- ShowLokalEnvironment:
- mov al,0 ; auf lokales Environment umschalten
- call UseOtherEnv
- jnc >l1
- ; Fehler: lokales Environment nicht nutzbar
- WRITE_STRING _lokalError
- jmp ret
-
- l1: ; Daten des lokalen Environments ausgeben
-
- call EnvCount ; Anzahl Einträge eintragen
- mov di,offset _lokalEnvCount
- call Konvert_AL_To_Dezstring
-
- ; Segment-Adresse eintragen
- mov di,offset _LokalEnvSeg
- mov ax,w LokalEnvSeg
- call Konvert_AX_To_Hexstring
-
- ; Daten eintragen
- call GetEnvData
- jc >l1
-
- push bx
- push cx
- mov di,offset _LokalEnvLength
- call Konvert_AX_To_Dezstring
- pop ax
- mov di,offset _LokalEnvFree
- call Konvert_AX_To_Dezstring
- pop ax
- mov di,offset _LokalEnvUsed
- call Konvert_AX_To_Dezstring
- l1:
- ; Programm-Name ermitteln
- mov di,offset _progname-1
- push w[di]
- call GetProgName
- pop ax
- mov [di],al
-
- ; Statistik ausgeben
- WRITE_STRING _LokalEnvMSG
-
- call ShowEntrys ; Einträge ausgeben
-
- call ShowCOMSPEC ; Ausgabe des Inhaltes von COMSPEC in diesem
- ; Environment
- l9:
- ret
-
- ; ----------------------------
- ; ShowCallerEnvironment
- ;
- ; Funktion: Ausgabe der Daten des Environments des Aufrufers
- ;
- ShowCallerEnvironment:
- mov al,1 ; auf Environment des Aufrufers umschalten
- call UseOtherEnv
- jnc >l1
- ; Fehler: Environment nicht nutzbar
- WRITE_STRING _callerError
- jmp >l9
-
- l1: ; Daten des Environments ausgeben
-
- call EnvCount ; Anzahl Einträge eintragen
- mov di,offset _callerEnvCount
- call Konvert_AL_To_Dezstring
-
- ; Segment-Adresse eintragen
- mov di,offset _callerEnvSeg
- mov ax,w CallerEnvSeg
- call Konvert_AX_To_Hexstring
-
- ; Daten eintragen
- call GetEnvData
- jc >l1
- push bx
- push cx
- mov di,offset _CallerEnvLength
- call Konvert_AX_To_Dezstring
- pop ax
- mov di,offset _CallerEnvFree
- call Konvert_AX_To_Dezstring
- pop ax
- mov di,offset _CallerEnvUsed
- call Konvert_AX_To_Dezstring
- l1:
- ; Name des Aufrufers ermitteln
- mov di,offset _callerName-1
-
- mov al,[di] ; Längenzähler wird hier nicht gebraucht
- push ax
- call GetCallerName
- pop ax
- mov [di],al
- jc >l1 ; Fehler
- jnz >l1 ; Name eingetragen, okay
- ; Name nicht ermittelbar
- inc di
- mov si,offset _CommandMSG
- mov cx,_CommandMSG_LENGTH
- cld
- rep movsb
-
- l1: ; Statistik ausgeben
- WRITE_STRING _callerEnvMSG
-
- call ShowEntrys ; Einträge ausgeben
- call ShowCOMSPEC ; Ausgabe des Inhaltes von COMSPEC in diesem
- ; Environment
- l9:
- ret
-
- ; ----------------------------
- ; ShowCommandEnvironment
- ;
- ; Funktion: Ausgabe der Daten des Environment des COMMAND.COM
- ;
- ShowCommandEnvironment:
- mov al,2 ; auf Environment des COMMAND.COM umschalten
- call UseOtherEnv
- jnc >l1
- ; Fehler: Environment nicht nutzbar
- WRITE_STRING _commandError
- jmp >l9
-
- l1: ; Daten des Environments ausgeben
-
- call EnvCount ; Anzahl Einträge eintragen
- mov di,offset _commandEnvCount
- call Konvert_AL_To_Dezstring
-
- ; Segment-Adresse eintragen
- mov di,offset _commandEnvSeg
- mov ax,w CommandEnvSeg
- call Konvert_AX_To_Hexstring
-
- ; Daten eintragen
- call GetEnvData
- jc >l1
-
- push bx
- push cx
- mov di,offset _CommandEnvLength
- call Konvert_AX_To_Dezstring
- pop ax
- mov di,offset _CommandEnvFree
- call Konvert_AX_To_Dezstring
- pop ax
- mov di,offset _CommandEnvUsed
- call Konvert_AX_To_Dezstring
- l1:
- ; Statistik ausgeben
- WRITE_STRING _commandEnvMSG
-
- call ShowEntrys ; Einträge ausgeben
-
- call ShowCOMSPEC ; Ausgabe des Inhaltes von COMSPEC in diesem
- ; Environment
- l9:
- ret
-
- ; ----------------------------
- ; ShowComspec
- ;
- ; Funktion: Ausgabe des Inhaltes von COMSPEC im akt. Environment
- ;
- ShowComspec:
- WRITE_STRING _ComspecMSG
-
- mov si,offset _Comspec
- mov di,offset _ComspecPuffer-1
-
- mov cl,[di] ; Längenbyte wird nur temporär benötigt
- call SearchEnvStr
- xchg cl,[di] ; CL = Länge des Inhaltes von COMSPEC
-
- jnc >l1
- or cl,cl
- jnz >l1
- ; Fehler: Inhalt der Variablen nicht ermittelbar
- WRITE_STRING _ComspecError
- jmp >l9
-
- l1:
- mov dx,offset _Comspec+1
- add cl,[_comspec]
- add cl,3
- xor ch,ch ; CX = Länge des gesamten Eintrages
- mov bx,01h
- mov ah,40h
- int 021h
-
- call ShowCR_LF
- l9:
- ret
-
- ; ----------------------------
- ; ShowEntrys
- ;
- ; Funktion: Ausgabe aller Einträge des akt. Environemnts
- ;
- ShowEntrys:
- call EnvCount
- xor ah,ah ; AX = Anzahl der Einträge
- mov cx,ax ; CX = Anzahl der Einträge
- mov al,1 ; AX = Nummer des akt. Eintrages
- l0:
- push ax,cx
-
- mov di,offset enventry
- call EnvStr ; Eintrag ermitteln
-
- mov dx,di ; (= String mit Längenzähler!)
- inc dx
- mov cl,[di]
- xor ch,ch
- mov ah,040h
- mov bx,01h
- int 021h
- call ShowCR_LF
- pop cx,ax
- inc ax
- cmp ax,cx
- IF be jmp l0
-
- ret
-
-