home *** CD-ROM | disk | FTP | other *** search
- PAGE 58,132
- ; FILE: GETENV.ASM
- ;
- ; THIS ROUTINE FINDS THE SYSTEM WIDE ENVIRONMENT STRING
- ; AND RETURNS A POINTER TO IT. GETVAR WAS WRITTEN TO BE CALLED
- ; FROM C, AND REQUIRES THE LARGE MEMORY MODEL SINCE THE SYSTEM
- ; ENVIRONMENT STRING LIVES OFF IN NEVER NEVER LAND.
- ;
-
- PSPSEG SEGMENT PARA AT 0
- ;DEFINE SOME SYMBOLS IN THE PSP
- ORG 014H
- ERRSEG DW ?
-
- PSPSEG ENDS
-
- INCLUDE MODEL.H
- INCLUDE PROLOGUE.H
-
- PUBLIC GETENV ;(&PNTER) RETURNS LENGTH IN FUNCVAL
- GETENV PROC FAR
- PUSH BP ;DO THE STACK FRAMING STUFF SO
- MOV BP,SP ;YOU CAN GET ARGUMENT POINTER
- ARG=6
- MOV AX,_PSPSEG+2 ;GET THE PSP SEGMENT SAVED BY C86
- MOV ES,AX ;PUT IN ES FOR GRABBING INFO
- ASSUME ES:PSPSEG ;LET THE ASSEMBLER KNOW THIS...
- MOV DX,ERRSEG ;GET THE CALLING PROGRAMS SEG FROM
- ;THE ERROR VECTOR.
- MOV ES,DX ;PUT IT IN ES
- MOV BX,WORD PTR ES:[002CH] ;GET THE CALLERS ENVIRONMENT STRING
- CMP BX,0 ;IF IT IS ZERO,
- JNZ RET_ADDRESS
- MOV BX,DX ;THEN ASSUME THE ENVIRONMENT STRING
- DEC BX ;FOLLOWS THIS PROGRAM. POINT ES AT
- MOV ES,BX ;THE SEGMENT ALLOCATION INFO, AND
- ADD BX,WORD PTR ES:[0003] ;SKIP FORWARD TO NEXT ALLOC SEGMENT.
- ADD BX,2 ;MUST ADD 2 PARAS TO GET OVER INFO.
- RET_ADDRESS:
- LES DI,ARG[BP] ;GET ADDRESS OF ARGUMENT POINTER
- XOR AX,AX ;CREATE A ZERO OFFSET
- STOS WORD PTR ES:[DI] ;AND STORE THAT IN FIRS WORD
- MOV ES:[DI],BX ;RETURN ENVIRONMENT SEGMENT AFTER THAT
- DEC BX ;BACKUP 16 BYTES FROM ENVIRONMENT TO
- MOV ES,BX ;GET THE SEGMENT ALLOCATION INFO
- MOV AX,WORD PTR ES:[0003] ;FETCH SIZE OF ENVIRONMENT SEGMENT
- SHL AX,1 ;MULTIPLY THAT BY 16
- SHL AX,1 ;TO GET THE ENVIRONMENT STRING SIZE.
- SHL AX,1
- SHL AX,1
- POP BP
- RET
- GETENV ENDP
-
- INCLUDE EPILOGUE.H
-
- @DATAC SEGMENT BYTE PUBLIC 'DATAC'
-
- EXTRN _PSPSEG:WORD ;C86 STORES THE PSP SEGMENT ADDRESS HERE
-
- @DATAC ENDS
-
- END