|
|
1.1 ! root 1: TITLE stdenvp - standard _setenvp routine ! 2: ;*** ! 3: ;stdenvp.asm - standard _setenvp routine ! 4: ; ! 5: ; Copyright (c) 1985-1987, Microsoft Corporation. All rights reserved. ! 6: ; ! 7: ;Purpose: ! 8: ; Standard _setenvp routine. ! 9: ; ! 10: ;******************************************************************************* ! 11: ! 12: ! 13: include version.inc ! 14: .xlist ! 15: include cmacros.inc ! 16: include msdos.inc ! 17: .list ! 18: ! 19: ! 20: sBegin data ! 21: assumes ds,data ! 22: externW _psp ; PSP segment # ! 23: externDP environ ; environment pointer ! 24: ! 25: sEnd data ! 26: ! 27: sBegin code ! 28: assumes ds,data ! 29: assumes cs,code ! 30: ! 31: externNP _myalloc ; allocation routine for arguments ! 32: ! 33: page ! 34: ;*** ! 35: ;_setenvp - standard routine to set envp for C programs. ! 36: ; ! 37: ;Purpose: ! 38: ; Reads the environment and build the envp array. ! 39: ; ! 40: ;Entry: ! 41: ; ! 42: ;Exit: ! 43: ; ! 44: ;Uses: ! 45: ; ! 46: ;Exceptions: ! 47: ; ! 48: ;******************************************************************************* ! 49: ! 50: cProc _setenvp,<PUBLIC>,<> ! 51: ! 52: cBegin ! 53: push bp ! 54: mov ds,[_psp] ; get psp segment ! 55: ! 56: assumes ds,nothing ! 57: ! 58: ; setup envp vector and move environment to heap ! 59: ! 60: ; DS = PSP, SS = DGROUP ! 61: ! 62: xor cx,cx ; cx = 0 ! 63: mov ax,cx ; ax = 0 (search byte) ! 64: mov bp,cx ; bp = 0 (envp count) ! 65: mov di,cx ; di = 0 (initial offset) ! 66: dec cx ; cx = ffff (inifinite count) ! 67: ! 68: mov si,word ptr DS:[DOS_ENVP] ! 69: or si,si ; test for null envp ! 70: ! 71: jz noenv ; none ! 72: mov es,si ; es:di = environment table ! 73: scanenv: ! 74: repnz scasb ! 75: inc bp ; bp = envp count ! 76: scasb ! 77: jnz scanenv ! 78: ! 79: noenv: ! 80: inc bp ; bp = envp count + 1 ! 81: xchg ax,di ; ax = envlen ! 82: inc ax ! 83: and al,not 1 ; round up to even ! 84: mov di,bp ; di = argument count ! 85: shl bp,1 ; argument count*2 ! 86: if sizeD ! 87: shl bp,1 ; argument count*2 ! 88: endif ! 89: add ax,bp ; ax = space to allocate ! 90: push ss ! 91: pop ds ; restore DS ! 92: ! 93: assumes ds,data ! 94: ! 95: ; Make sure there is enough memory for the environment. ! 96: ; If there is not enough, try to get some from the OS if possible. ! 97: ; Register usage at this point: ! 98: ; ax = total # bytes needed for environment ptr table and strings ! 99: ; di = # of entries in env ptr table = # of env args + 1 ! 100: ; bp = # bytes required to store env ptr table ! 101: ; ss = ds = DGROUP ! 102: ; es = PSP segment ! 103: ! 104: push di ; save # of env args + 1 ! 105: mov di,9 ; error message in case of death. ! 106: call _myalloc ; takes bp = # bytes for ptr table ax = total # ! 107: ; bytes ! 108: pop di ; recover # of env args + 1 ! 109: ! 110: ! 111: ; Now there is enough memory for the environment, so copy it in. ! 112: ; Register usage at this point: ! 113: ; dx = size of environment in bytes ! 114: ; di = # of entries in env ptr table = # of env args + 1 ! 115: ; bp points to env table ! 116: ; ax is size of env table in bytes. ! 117: ; ss = ds = DGROUP ! 118: ; es = PSP segment ! 119: ! 120: ! 121: mov cx,di ; cx = envcnt ! 122: mov di,bp ! 123: add di,ax ; di points past env ptr table ! 124: ; store strings there ! 125: mov word ptr [environ],bp ; save envp[] ! 126: if sizeD ! 127: mov word ptr [environ+2],ds ; segment address for large model ! 128: endif ! 129: ! 130: push ds ! 131: pop es ; es:di = env dest ! 132: mov ds,si ; ds:0 = env table ! 133: xor si,si ! 134: ! 135: ; SS = ES = DGROUP ! 136: ; DS = PSP segment ! 137: ! 138: assumes es,data ! 139: assumes ds,nothing ! 140: ! 141: dec cx ; adjust for the last entry of 0000 ! 142: jcxz envdone ; done - no environment ! 143: ! 144: envloop: ! 145: cmp word ptr [si],';'+'C'*100h ; test if starts with ';C' ! 146: je envstr ; don't save pointer if ';C' ! 147: ! 148: mov [bp],di ; save pointer to start of string ! 149: if sizeD ! 150: mov [bp+2],es ; segment address for large model ! 151: add bp,4 ! 152: else ! 153: inc bp ! 154: inc bp ! 155: endif ! 156: ! 157: envstr: ! 158: lodsb ! 159: stosb ! 160: or al,al ! 161: jnz envstr ; keep copying string ! 162: loop envloop ; more strings to copy ! 163: ! 164: envdone: ! 165: mov [bp],cx ; zero terminate envp table ! 166: if sizeD ! 167: mov [bp+2],cx ; extra zero for large model ! 168: endif ! 169: push ss ; DS = DGROUP ! 170: pop ds ! 171: pop bp ! 172: cEnd ! 173: ! 174: sEnd code ! 175: ! 176: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.