Subversion Repositories Kolibri OS

Rev

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