Subversion Repositories Kolibri OS

Rev

Rev 2434 | Rev 3725 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 2465 $
  9.  
  10.         pusha
  11.  
  12.         mov     eax, [pg_data.pages_free]
  13. ;   1/32
  14.         shr     eax, 5
  15. ;   round off up to 8 pages
  16.         shr     eax, 3
  17.         shl     eax, 3
  18. ;   translate pages in butes *4096
  19.         shl     eax, 12
  20. ;       check a upper size of the cache, no more than 1 Mb on the physical device
  21.         cmp     eax, 1024*1024
  22.         jbe     @f
  23.         mov     eax, 1024*1024
  24.         jmp     .continue
  25. @@:
  26. ;       check a lower size of the cache, not less than 128 Kb on the physical device
  27.         cmp     eax, 128*1024
  28.         jae     @f
  29.         mov     eax, 128*1024
  30. @@:
  31. .continue:
  32.         mov     [cache_ide0_size], eax
  33.         mov     [cache_ide1_size], eax
  34.         mov     [cache_ide2_size], eax
  35.         mov     [cache_ide3_size], eax
  36.         xor     eax, eax
  37.         mov     [hdd_appl_data], 1;al
  38.         mov     [cd_appl_data], 1
  39.    
  40.         mov     ch, [DRIVE_DATA+1]
  41.         mov     cl, ch
  42.         and     cl, 11b
  43.         je      .ide2
  44.         mov     esi, cache_ide3
  45.         call    get_cache_ide
  46. .ide2:
  47.         mov     cl, ch
  48.         shr     cl, 2
  49.         and     cl, 11b
  50.         je      .ide1
  51.         mov     esi, cache_ide2
  52.         call    get_cache_ide
  53. .ide1:
  54.         mov     cl, ch
  55.         shr     cl, 4
  56.         and     cl, 11b
  57.         je      .ide0
  58.         mov     esi, cache_ide1
  59.         call    get_cache_ide
  60. .ide0:
  61.         mov     cl, ch
  62.         shr     cl, 6
  63.         and     cl, 11b
  64.         je      @f
  65.         mov     esi, cache_ide0
  66.         call    get_cache_ide
  67. @@:
  68.         xor     ecx, ecx
  69.         cmp     [NumBiosDisks], ecx
  70.         jz      .endbd
  71.         mov     esi, BiosDiskCaches
  72. .loopbd:
  73.         push    ecx
  74.         movsx   ecx, byte [BiosDisksData+ecx*4+2]
  75.         inc     ecx
  76.         jz      .getbd
  77.         add     ecx, ecx
  78.         movzx   eax, byte [DRIVE_DATA+1]
  79.         shl     eax, cl
  80.         and     ah, 3
  81.         cmp     ah, 1
  82.         jz      .contbd
  83.         pop     ecx
  84.         mov     byte [BiosDisksData+ecx*4+2], -1
  85.         push    ecx
  86. .getbd:
  87.         mov     eax, [cache_ide0_size]
  88.         mov     [esi+cache_ide0_size-cache_ide0], eax
  89.         mov     cl, 1
  90.         call    get_cache_ide
  91. .contbd:
  92.         pop     ecx
  93.         add     esi, cache_ide1-cache_ide0
  94.         inc     ecx
  95.         cmp     ecx, [NumBiosDisks]
  96.         jb      .loopbd
  97. .endbd:
  98.         jmp     end_get_cache
  99.  
  100. get_cache_ide:
  101.         and     [esi+cache_ide0_search_start-cache_ide0], 0
  102.         and     [esi+cache_ide0_appl_search_start-cache_ide0], 0
  103.         push    ecx
  104.         stdcall kernel_alloc, [esi+cache_ide0_size-cache_ide0]
  105.         mov     [esi+cache_ide0_pointer-cache_ide0], eax
  106.         pop     ecx
  107.         mov     edx, eax
  108.         mov     eax, [esi+cache_ide0_size-cache_ide0]
  109.         shr     eax, 3
  110.         mov     [esi+cache_ide0_system_data_size-cache_ide0], eax
  111.         mov     ebx, eax
  112.         imul    eax, 7
  113.         mov     [esi+cache_ide0_appl_data_size-cache_ide0], eax
  114.         add     ebx, edx
  115.         mov     [esi+cache_ide0_data_pointer-cache_ide0], ebx
  116.  
  117.         cmp     cl, 10b
  118.         je      .cd
  119.         push    ecx
  120.         mov     eax, [esi+cache_ide0_system_data_size-cache_ide0]
  121.         call    calculate_for_hd
  122.         add     eax, [esi+cache_ide0_pointer-cache_ide0]
  123.         mov     [esi+cache_ide0_system_data-cache_ide0], eax
  124.         mov     [esi+cache_ide0_system_sad_size-cache_ide0], ecx
  125.  
  126.         push    edi
  127.         mov     edi, [esi+cache_ide0_pointer-cache_ide0]
  128.         call    clear_ide_cache
  129.         pop     edi
  130.  
  131.         mov     eax, [esi+cache_ide0_appl_data_size-cache_ide0]
  132.         call    calculate_for_hd
  133.         add     eax, [esi+cache_ide0_data_pointer-cache_ide0]
  134.         mov     [esi+cache_ide0_appl_data-cache_ide0], eax
  135.         mov     [esi+cache_ide0_appl_sad_size-cache_ide0], ecx
  136.  
  137.         push    edi
  138.         mov     edi, [esi+cache_ide0_data_pointer-cache_ide0]
  139.         call    clear_ide_cache
  140.         pop     edi
  141.  
  142.         pop     ecx
  143.         ret
  144. .cd:
  145.         push    ecx
  146.         mov     eax, [esi+cache_ide0_system_data_size-cache_ide0]
  147.         call    calculate_for_cd
  148.         add     eax, [esi+cache_ide0_pointer-cache_ide0]
  149.         mov     [esi+cache_ide0_system_data-cache_ide0], eax
  150.         mov     [esi+cache_ide0_system_sad_size-cache_ide0], ecx
  151.  
  152.         push    edi
  153.         mov     edi, [esi+cache_ide0_pointer-cache_ide0]
  154.         call    clear_ide_cache
  155.         pop     edi
  156.  
  157.         mov     eax, [esi+cache_ide0_appl_data_size-cache_ide0]
  158.         call    calculate_for_cd
  159.         add     eax, [esi+cache_ide0_data_pointer-cache_ide0]
  160.         mov     [esi+cache_ide0_appl_data-cache_ide0], eax
  161.         mov     [esi+cache_ide0_appl_sad_size-cache_ide0], ecx
  162.  
  163.         push    edi
  164.         mov     edi, [esi+cache_ide0_data_pointer-cache_ide0]
  165.         call    clear_ide_cache
  166.         pop     edi
  167.  
  168.         pop     ecx
  169.         ret
  170.  
  171. calculate_for_hd:
  172.         push    eax
  173.         mov     ebx, eax
  174.         shr     eax, 9
  175.         shl     eax, 3
  176.         sub     ebx, eax
  177.         shr     ebx, 9
  178.         mov     ecx, ebx
  179.         shl     ebx, 9
  180.         pop     eax
  181.         sub     eax, ebx
  182.         dec     ecx
  183.         ret
  184.  
  185. calculate_for_cd:
  186.         push    eax
  187.         mov     ebx, eax
  188.         shr     eax, 11
  189.         shl     eax, 3
  190.         sub     ebx, eax
  191.         shr     ebx, 11
  192.         mov     ecx, ebx
  193.         shl     ebx, 11
  194.         pop     eax
  195.         sub     eax, ebx
  196.         dec     ecx
  197.         ret
  198.  
  199. clear_ide_cache:
  200.         push    eax
  201.         shl     ecx, 1
  202.         xor     eax, eax
  203.         cld
  204.         rep stosd
  205.         pop     eax
  206.         ret
  207.  
  208. end_get_cache:
  209. ;    mov  [cache_ide0_pointer],HD_CACHE
  210. ;    mov  [cache_ide0_system_data],HD_CACHE+65536
  211. ;    mov  [cache_ide0_system_sad_size],1919
  212.         popa
  213.