;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; ;; Distributed under terms of the GNU General Public License ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; $Revision$ ;----------------------------------------------------------------------------- pusha mov eax, [pg_data.pages_free] ; 1/32 shr eax, 5 ; round off up to 8 pages shr eax, 3 shl eax, 3 ; translate pages in butes *4096 shl eax, 12 ; check a upper size of the cache, no more than 1 Mb on the physical device cmp eax, 1024*1024 jbe @f mov eax, 1024*1024 jmp .continue ;-------------------------------------- @@: ; check a lower size of the cache, not less than 128 Kb on the physical device cmp eax, 128*1024 jae .continue mov eax, 128*1024 ;-------------------------------------- .continue: push ecx mov ecx, 12 mov esi, cache_ide0+IDE_CACHE.size cld @@: mov [esi], eax add esi, sizeof.IDE_CACHE loop @b pop ecx xor eax, eax mov [hdd_appl_data], 1 ;al mov [cd_appl_data], 1 ;-------------------------------------- test byte [DRIVE_DATA+1], 0x80 je @f mov esi, cache_ide0 call get_cache_ide ;-------------------------------------- @@: test byte [DRIVE_DATA+1], 0x20 je @f mov esi, cache_ide1 call get_cache_ide ;-------------------------------------- @@: test byte [DRIVE_DATA+1], 8 je @f mov esi, cache_ide2 call get_cache_ide ;-------------------------------------- @@: test byte [DRIVE_DATA+1], 2 je @f mov esi, cache_ide3 call get_cache_ide ;-------------------------------------- @@: test byte [DRIVE_DATA+6], 0x80 je @f mov esi, cache_ide4 call get_cache_ide ;-------------------------------------- @@: test byte [DRIVE_DATA+6], 0x20 je @f mov esi, cache_ide5 call get_cache_ide ;-------------------------------------- @@: test byte [DRIVE_DATA+6], 8 je @f mov esi, cache_ide6 call get_cache_ide ;-------------------------------------- @@: test byte [DRIVE_DATA+6], 2 je @f mov esi, cache_ide7 call get_cache_ide ;-------------------------------------- @@: test byte [DRIVE_DATA+11], 0x80 je @f mov esi, cache_ide8 call get_cache_ide ;-------------------------------------- @@: test byte [DRIVE_DATA+11], 0x20 je @f mov esi, cache_ide9 call get_cache_ide ;-------------------------------------- @@: test byte [DRIVE_DATA+11], 8 je @f mov esi, cache_ide10 call get_cache_ide ;-------------------------------------- @@: test byte [DRIVE_DATA+11], 2 je end_get_cache mov esi, cache_ide11 call get_cache_ide jmp end_get_cache ;----------------------------------------------------------------------------- get_cache_ide: and [esi+IDE_CACHE.search_start], 0 and [esi+IDE_CACHE.appl_search_start], 0 push ecx ; DEBUGF 1, "K : IDE_CACHE.size %x\n", [esi+IDE_CACHE.size] stdcall kernel_alloc, [esi+IDE_CACHE.size] mov [esi+IDE_CACHE.pointer], eax pop ecx mov edx, eax mov eax, [esi+IDE_CACHE.size] shr eax, 3 ; DEBUGF 1, "K : IDE_CACHE.system_data_size %x\n", eax mov [esi+IDE_CACHE.system_data_size], eax mov ebx, eax imul eax, 7 ; DEBUGF 1, "K : IDE_CACHE.appl_data_size %x\n", eax mov [esi+IDE_CACHE.appl_data_size], eax add ebx, edx mov [esi+IDE_CACHE.data_pointer], ebx .cd: push ecx mov eax, [esi+IDE_CACHE.system_data_size] call calculate_for_cd add eax, [esi+IDE_CACHE.pointer] mov [esi+IDE_CACHE.system_data], eax mov [esi+IDE_CACHE.system_sad_size], ecx push edi mov edi, [esi+IDE_CACHE.pointer] call clear_ide_cache pop edi mov eax, [esi+IDE_CACHE.appl_data_size] call calculate_for_cd add eax, [esi+IDE_CACHE.data_pointer] mov [esi+IDE_CACHE.appl_data], eax mov [esi+IDE_CACHE.appl_sad_size], ecx push edi mov edi, [esi+IDE_CACHE.data_pointer] call clear_ide_cache pop edi pop ecx ret ;----------------------------------------------------------------------------- calculate_for_cd: push eax mov ebx, eax shr eax, 11 shl eax, 3 sub ebx, eax shr ebx, 11 mov ecx, ebx shl ebx, 11 pop eax sub eax, ebx dec ecx ret ;----------------------------------------------------------------------------- clear_ide_cache: push eax shl ecx, 1 xor eax, eax cld rep stosd pop eax ret ;----------------------------------------------------------------------------- end_get_cache: popa