|
|
1.1 root 1: TITLE stdalloc - OS/2 routine to get memory from heap or stack
2: ;***
3: ;5stdallo.asm - OS/2 routine to get memory from heap or stack
4: ;
5: ; Copyright (c) 1986-1987, Microsoft Corporation. All rights reserved.
6: ;
7: ;Purpose:
8: ; This routine returns memory from the heap or stack.
9: ;
10: ;*******************************************************************************
11:
12:
13: include version.inc
14: .xlist
15: include cmacros.inc
16: include msdos.inc
17: include brkctl.inc
18: .list
19:
20:
21: sBegin data
22: assumes ds,data
23:
24: extrn _end:word ; stack bottom
25:
26: externW _asizds ; limit of data segment
27: externW _abrktb ; heap structure
28:
29: extrn STKHQQ:word ; limit for stack growth
30:
31: sEnd data
32:
33: extrn DOSREALLOCSEG:far ; DOS Function Call
34:
35: sBegin code
36: assumes ds,data
37: assumes cs,code
38:
39: page
40: ;***
41: ;_stdalloc - try to steal memory from heap or stack
42: ;
43: ;Purpose:
44: ; This routine returns memory from the heap or stack.
45: ;
46: ; First the heap is examined to see if it is big enough.
47: ; If it is not, this routine attempts to lengthen the
48: ; Global Data Segment in order to enlarge the heap.
49: ; If this is not possible or is unsuccessful, this
50: ; code will examine the amount of unused stack space
51: ; to see if it can accommodate the allocation request.
52: ;
53: ; If carry is clear on return, then the allocation was
54: ; successful and DS:AX points to the allocated memory.
55: ; Carry set on return indicates allocation failure.
56: ;
57: ; NOTE: This routine DEPENDS on the fact that DS=SS=DGROUP
58: ;
59: ; This is always a near routine since it is only called by the C run-time
60: ;
61: ;Entry:
62: ; AX = number of bytes requested
63: ;
64: ;Exit:
65: ; Carry Clear (no error):
66: ; DS:AX = address of allocated memory
67: ; Carry Set:
68: ; Error - unable to allocate
69: ;
70: ;Uses: BX, CX, DX are destroyed
71: ; SP will be altered if the memory came from the stack
72: ;
73: ;Exceptions:
74: ;
75: ;*******************************************************************************
76:
77: labelNP <PUBLIC,_stdalloc>
78:
79: pop dx ; get return offset
80: ;
81: ; See if there is space in the heap
82: ; If not, see if the heap can be increased by enlarging the Data Segment
83: ;
84: mov bx,[_abrktb].sz ; get current start of heap
85: add bx,ax
86: jc try_stack ; not enough room in DS after heap
87: cmp bx,[_asizds]
88: jc heap_success ; Yes! Enough Room in Heap
89:
90: mov cx,bx
91: dec cx
92: or cl,0FH
93: inc cx ; Round up to a multiple of 16 bytes
94:
95: push ax ; ****** save a copy of AX around call
96:
97: push cx
98: push ds
99: call DOSREALLOCSEG ; Try to enlarge the Data Segment
100:
101: test ax,ax
102: pop ax ; ****** restore copy of AX after call
103: jnz try_stack ; Cannot enlarge Data Segment
104:
105: dec cx
106: mov [_asizds],cx ; set size of enlarged Data Segment
107: heap_success:
108: xchg bx,[_abrktb].sz ; set new top of heap and
109: clc ; get start of allocated memory
110: jmp short return
111: ;
112: ; See if there is enough space on the stack
113: ;
114: try_stack:
115: mov bx,sp
116: sub bx,ax ; new position
117: jb return ; error - out of memory
118: cmp bx,[STKHQQ] ; SP - AX : STKHQQ (for heap/stack)
119: jb return ; error - out of memory
120: ; carry is clear!
121: mov sp,bx ; set new stack pointer
122: return:
123: ;
124: ; Return the address in BX if Carry Clear
125: ; Return value is garbage if Carry Set
126: ;
127: mov ax,bx
128: jmp dx ; return to cx
129:
130: sEnd code
131:
132: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.