Rev 365 | Rev 380 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 365 | Rev 369 | ||
---|---|---|---|
Line 144... | Line 144... | ||
144 | mov [free_blocks], 4095 |
144 | mov [free_blocks], 4095 |
145 | ret |
145 | ret |
146 | endp |
146 | endp |
147 | 147 | ||
Line 148... | Line 148... | ||
148 | align 4 |
148 | ; param |
- | 149 | ; eax= required size |
|
- | 150 | ; |
|
- | 151 | ; retval |
|
- | 152 | ; edi= memory block descriptor |
|
149 | proc get_block stdcall, index:dword |
153 | ; ebx= descriptor index |
Line 150... | Line -... | ||
150 | - | ||
151 | mov eax, 63 |
- | |
152 | mov ecx, [index] |
- | |
153 | cmp ecx, eax |
154 | |
154 | jna @f |
155 | align 4 |
155 | ;cmova ecx, eax |
156 | get_block: |
- | 157 | mov ecx, eax |
|
- | 158 | shr ecx, 12 |
|
- | 159 | dec ecx |
|
- | 160 | cmp ecx, 63 |
|
- | 161 | jle .get_index |
|
156 | mov ecx, eax |
162 | mov ecx, 63 |
157 | @@: |
163 | .get_index: |
158 | xor esi, esi |
164 | lea esi, [mem_block_mask] |
159 | xor ebx, ebx |
165 | xor ebx, ebx |
160 | xor edx, edx |
- | |
Line 161... | Line 166... | ||
161 | not edx |
166 | or edx, -1 |
162 | 167 | ||
Line 163... | Line 168... | ||
163 | cmp ecx, 32 |
168 | cmp ecx, 32 |
164 | jb .bit_test |
169 | jb .bit_test |
165 | 170 | ||
166 | sub ecx, 32 |
- | |
167 | add ebx, 32 |
171 | sub ecx, 32 |
168 | add esi, 4 |
172 | add ebx, 32 |
169 | 173 | add esi, 4 |
|
- | 174 | .bit_test: |
|
- | 175 | shl edx, cl |
|
170 | .bit_test: |
176 | and edx, [esi] |
171 | shl edx, cl |
177 | .find: |
172 | and edx, [mem_block_mask+esi] |
178 | bsf edi, edx |
- | 179 | jz .high_mask |
|
173 | jz .high_mask |
180 | add ebx, edi |
- | 181 | mov edi, [mem_block_list+ebx*4] |
|
174 | bsf eax, edx |
182 | .check_size: |
Line 175... | Line 183... | ||
175 | add ebx, eax |
183 | cmp eax, [edi+block_size] |
176 | mov eax, [mem_block_list+ebx*4] |
- | |
177 | ret |
184 | ja .next |
- | 185 | ret |
|
- | 186 | ||
178 | 187 | .high_mask: |
|
179 | .high_mask: |
188 | add esi, 4 |
180 | 189 | cmp esi, mem_block_mask+8 |
|
181 | add esi, 4 |
- | |
182 | add ebx, 32 |
190 | jae .err |
183 | test esi, 0xFFFFFFF8 |
191 | add ebx, 32 |
184 | jnz .big_error |
192 | mov edx, [esi] |
185 | mov edx, [mem_block_mask+esi] |
193 | jmp .find |
186 | and edx, edx |
- | |
187 | jz .high_mask |
- | |
188 | bsf eax, edx |
- | |
189 | add ebx, eax |
194 | .next: |
190 | mov eax, [mem_block_list+ebx*4] |
195 | mov edi, [edi+list_fd] |
191 | ret |
196 | test edi, edi |
192 | - | ||
Line 193... | Line 197... | ||
193 | .big_error: |
197 | jnz .check_size |
194 | xor eax, eax |
198 | .err: |
Line 195... | Line 199... | ||
195 | ret |
199 | xor edi, edi |
Line 264... | Line 268... | ||
264 | 268 | ||
Line 265... | Line 269... | ||
265 | cmp eax, [heap_free] |
269 | cmp eax, [heap_free] |
266 | ja .error |
270 | ja .error |
Line 267... | Line -... | ||
267 | - | ||
268 | shr eax, 12 |
- | |
269 | sub eax, 1 |
- | |
270 | - | ||
271 | mov [block_ind], eax |
- | |
272 | 271 | ||
273 | stdcall get_block, eax |
272 | call get_block ; eax |
274 | test eax, eax |
273 | test edi, edi |
Line 275... | Line -... | ||
275 | jz .error |
- | |
276 | - | ||
277 | mov edi, eax ;edi - pBlock |
274 | jz .error |
278 | 275 | ||
Line 279... | Line 276... | ||
279 | cmp [edi+block_flags], FREE_BLOCK |
276 | cmp [edi+block_flags], FREE_BLOCK |